Compare commits

..

10 Commits

Author SHA1 Message Date
Max Schaefer
c63f328278 Revert "JS: Recognize DomSanitizer from @angular/core"
This reverts commit ff1d0cc4c7.
2022-04-01 11:53:50 +00:00
Henry Mercer
c1f76cc328 Remove NoSQL sinks since September 2018 2022-04-01 11:53:50 +00:00
Esben Sparre Andreasen
3a1dd0b0f8 Remove additional Xss sinks 2022-04-01 11:53:50 +00:00
Esben Sparre Andreasen
79cbaa52c1 Remove additional SQL sinks 2022-04-01 11:53:49 +00:00
Esben Sparre Andreasen
a9608976ba Remove additional path-injection sinks 2022-04-01 11:53:49 +00:00
Esben Sparre Andreasen
c333c9413e Add benjamin-button.md 2022-04-01 11:53:49 +00:00
Esben Sparre Andreasen
4b4e85920b Remove pseudo-properties 2022-04-01 11:53:49 +00:00
Esben Sparre Andreasen
b595d67129 Remove 2020 sinks from SqlInjection.ql 2022-04-01 11:53:49 +00:00
Esben Sparre Andreasen
f46d77b2b3 Remove 2020 sinks from Xss.ql 2022-04-01 11:53:49 +00:00
Esben Sparre Andreasen
1904e89bff Remove 2020 sinks from TaintedPath.ql 2022-04-01 11:53:49 +00:00
500 changed files with 3079 additions and 9701 deletions

View File

@@ -1,3 +0,0 @@
build --copt="-std=c++17"
try-import %workspace%/local.bazelrc

View File

@@ -1 +0,0 @@
5.0.0

View File

@@ -37,9 +37,6 @@ jobs:
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"

10
.gitignore vendored
View File

@@ -17,7 +17,7 @@
# Byte-compiled python files
*.pyc
# python virtual environment folder
# python virtual environment folder
.venv/
# It's useful (though not required) to be able to unpack codeql in the ql checkout itself
@@ -29,10 +29,4 @@ csharp/extractor/Semmle.Extraction.CSharp.Driver/Properties/launchSettings.json
.codeql
# Compiled class file
*.class
# links created by bazel
/bazel-*
# CLion project files
/.clwb
*.class

View File

View File

@@ -5,6 +5,14 @@
/python/ @github/codeql-python
/ruby/ @github/codeql-ruby
# Make @xcorail (GitHub Security Lab) a code owner for experimental queries so he gets pinged when we promote a query out of experimental
/cpp/**/experimental/**/* @github/codeql-c-analysis @xcorail
/csharp/**/experimental/**/* @github/codeql-csharp @xcorail
/java/**/experimental/**/* @github/codeql-java @xcorail
/javascript/**/experimental/**/* @github/codeql-javascript @xcorail
/python/**/experimental/**/* @github/codeql-python @xcorail
/ruby/**/experimental/**/* @github/codeql-ruby @xcorail
# ML-powered queries
/javascript/ql/experimental/adaptivethreatmodeling/ @github/codeql-ml-powered-queries-reviewers
@@ -23,7 +31,3 @@
# QL for QL reviewers
/ql/ @github/codeql-ql-for-ql-reviewers
# Bazel
**/*.bazel @github/codeql-ci-reviewers
**/*.bzl @github/codeql-ci-reviewers

View File

@@ -70,7 +70,3 @@ After the experimental query is merged, we welcome pull requests to improve it.
If you contribute to this project, we will record your name and email address (as provided by you with your contributions) as part of the code repositories, which are public. We might also use this information to contact you in relation to your contributions, as well as in the normal course of software development. We also store records of CLA agreements signed in the past, but no longer require contributors to sign a CLA. Under GDPR legislation, we do this on the basis of our legitimate interest in creating the CodeQL product.
Please do get in touch (privacy@github.com) if you have any questions about this or our data protection policies.
## Bazel
Please notice that any bazel targets and definitions in this repository are currently experimental
and for internal use only.

View File

@@ -1,12 +0,0 @@
# Please notice that any bazel targets and definitions in this repository are currently experimental
# and for internal use only.
workspace(name = "ql")
load("//misc/bazel:workspace.bzl", "ql_workspace")
ql_workspace()
load("//misc/bazel:workspace_deps.bzl", "ql_workspace_deps")
ql_workspace_deps()

51
benjamin-button.md Normal file
View File

@@ -0,0 +1,51 @@
# benjamin-buttons.md
This file describes the changes that have been applied to
the library to make it behave as if it was younger.
## TaintedPath.ql
Sinks added between 2020-01-01 and 2020-10-06 have been removed. Found by looking at:
- the commit titles of https://github.com/github/codeql/commits/main/javascript/ql/test/query-tests/Security/CWE-022/TaintedPath/TaintedPath.expected
- the PR titles of https://github.com/github/codeql/pulls?page=2&q=is%3Apr+label%3AJS+is%3Aclosed+sink
Sinks added between 2018-08-02 and 2020-01-01 have been removed. Found by looking at:
- the commit titles of https://github.com/github/codeql/commits/main/javascript/ql/test/query-tests/Security/CWE-022/TaintedPath/TaintedPath.expected
- the PR titles of https://github.com/github/codeql/pulls?page=2&q=is%3Apr+label%3AJS+is%3Aclosed+sink
- the PR titles of https://github.com/github/codeql/pulls?page=2&q=is%3Apr+label%3AJS+is%3Aclosed+pathinjection
- the PR titles of https://github.com/github/codeql/pulls?page=2&q=is%3Apr+label%3AJS+is%3Aclosed+tainted-path
Sinks from the "graceful-fs" and "fs-extra" (added before the open-sourcing squash).
## Xss.ql
Sinks added between 2020-01-01 and 2020-10-06 have been removed. Found by looking at:
- the commit titles of https://github.com/github/codeql/commits/main/javascript/ql/test/query-tests/Security/CWE-079/Xss.expected
- the PR titles of https://github.com/github/codeql/pulls?page=2&q=is%3Apr+label%3AJS+is%3Aclosed+sink
- recursive type tracking for `jQuery::dollar`, `DOM::domValueRef`.
## SqlInjection.ql
Sinks added between 2020-01-01 and 2020-10-06 have been removed. Found by looking at:
- the commit titles of https://github.com/github/codeql/commits/main/javascript/ql/test/query-tests/Security/CWE-089
- the PR titles of https://github.com/github/codeql/pulls?page=2&q=is%3Apr+label%3AJS+is%3Aclosed+sink
Sinks added between 2018-08-02 and 2020-01-01 have been removed. Found by looking at:
- the commit titles of https://github.com/github/codeql/commits/main/javascript/ql/test/query-tests/Security/CWE-089
- the PR titles of https://github.com/github/codeql/pulls?page=2&q=is%3Apr+label%3AJS+is%3Aclosed+sink
- the PR titles of https://github.com/github/codeql/pulls?page=2&q=is%3Apr+label%3AJS+is%3Aclosed+sql
TypeTracking in SQL.qll (added before the open-sourcing squash)
The model of `mssql` and `sequelize` (added before the open-sourcing squash)
## PseudoProperties
Pseudo-properties (`$name$`) used in type-tracking and global dataflow configurations have been disabled.
Found by searching for `"\$.*\$"`.

View File

@@ -515,10 +515,6 @@
"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",

View File

@@ -1,17 +0,0 @@
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",
],
)

View File

@@ -1,12 +0,0 @@
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__"],
)

View File

@@ -1,15 +0,0 @@
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",
)

View File

@@ -1,26 +1,3 @@
## 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

View File

@@ -0,0 +1,4 @@
---
category: minorAnalysis
---
* All deprecated predicates/classes/modules that have been deprecated for over a year have been deleted.

View File

@@ -0,0 +1,5 @@
---
category: deprecated
---
* 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.

View File

@@ -0,0 +1,4 @@
---
category: minorAnalysis
---
* `hasImplicitCopyConstructor` and `hasImplicitCopyAssignmentOperator` now correctly handle implicitly-deleted operators in templates.

View File

@@ -0,0 +1,4 @@
---
category: minorAnalysis
---
* `DefaultOptions::exits` now holds for C11 functions with the `_Noreturn` or `noreturn` specifier.

View File

@@ -0,0 +1,4 @@
---
category: feature
---
* 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.

View File

@@ -0,0 +1,4 @@
---
category: breaking
---
* 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.

View File

@@ -1,4 +0,0 @@
---
category: feature
---
* 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.

View File

@@ -1,4 +0,0 @@
---
category: minorAnalysis
---
* The `semmle.code.cpp.security.SensitiveExprs` library has been enhanced with some additional rules for detecting credentials.

View File

@@ -1,20 +0,0 @@
## 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.

View File

@@ -1 +0,0 @@
## 0.0.13

View File

@@ -1,2 +1,2 @@
---
lastReleaseVersion: 0.0.13
lastReleaseVersion: 0.0.11

View File

@@ -4,7 +4,7 @@
import cpp
import semmle.code.cpp.dataflow.TaintTracking
import semmle.code.cpp.security.PrivateData
import experimental.semmle.code.cpp.security.PrivateData
import semmle.code.cpp.security.FileWrite
import semmle.code.cpp.security.BufferWrite

View File

@@ -0,0 +1,52 @@
/**
* 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()))
}
}

View File

@@ -1,5 +1,5 @@
name: codeql/cpp-all
version: 0.1.0-dev
version: 0.0.12-dev
groups: cpp
dbscheme: semmlecode.cpp.dbscheme
extractor: cpp

View File

@@ -80,11 +80,7 @@ abstract class StackVariableReachability extends string {
j > i and
sink = bb.getNode(j) and
this.isSink(sink, v) and
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]
)
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

View File

@@ -112,13 +112,15 @@ abstract class Configuration extends string {
predicate isBarrierGuard(BarrierGuard guard, FlowState state) { none() }
/**
* Holds if data may flow from `node1` to `node2` in addition to the normal data-flow steps.
* 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 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`.
* 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`.
*/
predicate isAdditionalFlowStep(Node node1, FlowState state1, Node node2, FlowState state2) {
none()
@@ -1158,8 +1160,8 @@ private module Stage2 {
if reducedViableImplInReturn(c, call) then result = TReturn(c, call) else result = ccNone()
}
bindingset[node, cc]
private LocalCc getLocalCc(NodeEx node, Cc cc) { any() }
bindingset[node, cc, config]
private LocalCc getLocalCc(NodeEx node, Cc cc, Configuration config) { any() }
bindingset[node1, state1, config]
bindingset[node2, state2, config]
@@ -1246,7 +1248,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)
localCc = getLocalCc(mid, cc, config)
|
localStep(mid, state0, node, state, true, _, config, localCc) and
ap = ap0
@@ -1951,8 +1953,8 @@ private module Stage3 {
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() }
bindingset[node, cc, config]
private LocalCc getLocalCc(NodeEx node, Cc cc, Configuration config) { any() }
private predicate localStep(
NodeEx node1, FlowState state1, NodeEx node2, FlowState state2, boolean preservesValue,
@@ -2035,7 +2037,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)
localCc = getLocalCc(mid, cc, config)
|
localStep(mid, state0, node, state, true, _, config, localCc) and
ap = ap0
@@ -2765,11 +2767,12 @@ private module Stage4 {
if reducedViableImplInReturn(c, call) then result = TReturn(c, call) else result = ccNone()
}
bindingset[node, cc]
private LocalCc getLocalCc(NodeEx node, Cc cc) {
bindingset[node, cc, config]
private LocalCc getLocalCc(NodeEx node, Cc cc, Configuration config) {
result =
getLocalCallContext(pragma[only_bind_into](pragma[only_bind_out](cc)),
node.getEnclosingCallable())
node.getEnclosingCallable()) and
exists(config)
}
private predicate localStep(
@@ -2862,7 +2865,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)
localCc = getLocalCc(mid, cc, config)
|
localStep(mid, state0, node, state, true, _, config, localCc) and
ap = ap0

View File

@@ -112,13 +112,15 @@ abstract class Configuration extends string {
predicate isBarrierGuard(BarrierGuard guard, FlowState state) { none() }
/**
* Holds if data may flow from `node1` to `node2` in addition to the normal data-flow steps.
* 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 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`.
* 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`.
*/
predicate isAdditionalFlowStep(Node node1, FlowState state1, Node node2, FlowState state2) {
none()
@@ -1158,8 +1160,8 @@ private module Stage2 {
if reducedViableImplInReturn(c, call) then result = TReturn(c, call) else result = ccNone()
}
bindingset[node, cc]
private LocalCc getLocalCc(NodeEx node, Cc cc) { any() }
bindingset[node, cc, config]
private LocalCc getLocalCc(NodeEx node, Cc cc, Configuration config) { any() }
bindingset[node1, state1, config]
bindingset[node2, state2, config]
@@ -1246,7 +1248,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)
localCc = getLocalCc(mid, cc, config)
|
localStep(mid, state0, node, state, true, _, config, localCc) and
ap = ap0
@@ -1951,8 +1953,8 @@ private module Stage3 {
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() }
bindingset[node, cc, config]
private LocalCc getLocalCc(NodeEx node, Cc cc, Configuration config) { any() }
private predicate localStep(
NodeEx node1, FlowState state1, NodeEx node2, FlowState state2, boolean preservesValue,
@@ -2035,7 +2037,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)
localCc = getLocalCc(mid, cc, config)
|
localStep(mid, state0, node, state, true, _, config, localCc) and
ap = ap0
@@ -2765,11 +2767,12 @@ private module Stage4 {
if reducedViableImplInReturn(c, call) then result = TReturn(c, call) else result = ccNone()
}
bindingset[node, cc]
private LocalCc getLocalCc(NodeEx node, Cc cc) {
bindingset[node, cc, config]
private LocalCc getLocalCc(NodeEx node, Cc cc, Configuration config) {
result =
getLocalCallContext(pragma[only_bind_into](pragma[only_bind_out](cc)),
node.getEnclosingCallable())
node.getEnclosingCallable()) and
exists(config)
}
private predicate localStep(
@@ -2862,7 +2865,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)
localCc = getLocalCc(mid, cc, config)
|
localStep(mid, state0, node, state, true, _, config, localCc) and
ap = ap0

View File

@@ -112,13 +112,15 @@ abstract class Configuration extends string {
predicate isBarrierGuard(BarrierGuard guard, FlowState state) { none() }
/**
* Holds if data may flow from `node1` to `node2` in addition to the normal data-flow steps.
* 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 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`.
* 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`.
*/
predicate isAdditionalFlowStep(Node node1, FlowState state1, Node node2, FlowState state2) {
none()
@@ -1158,8 +1160,8 @@ private module Stage2 {
if reducedViableImplInReturn(c, call) then result = TReturn(c, call) else result = ccNone()
}
bindingset[node, cc]
private LocalCc getLocalCc(NodeEx node, Cc cc) { any() }
bindingset[node, cc, config]
private LocalCc getLocalCc(NodeEx node, Cc cc, Configuration config) { any() }
bindingset[node1, state1, config]
bindingset[node2, state2, config]
@@ -1246,7 +1248,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)
localCc = getLocalCc(mid, cc, config)
|
localStep(mid, state0, node, state, true, _, config, localCc) and
ap = ap0
@@ -1951,8 +1953,8 @@ private module Stage3 {
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() }
bindingset[node, cc, config]
private LocalCc getLocalCc(NodeEx node, Cc cc, Configuration config) { any() }
private predicate localStep(
NodeEx node1, FlowState state1, NodeEx node2, FlowState state2, boolean preservesValue,
@@ -2035,7 +2037,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)
localCc = getLocalCc(mid, cc, config)
|
localStep(mid, state0, node, state, true, _, config, localCc) and
ap = ap0
@@ -2765,11 +2767,12 @@ private module Stage4 {
if reducedViableImplInReturn(c, call) then result = TReturn(c, call) else result = ccNone()
}
bindingset[node, cc]
private LocalCc getLocalCc(NodeEx node, Cc cc) {
bindingset[node, cc, config]
private LocalCc getLocalCc(NodeEx node, Cc cc, Configuration config) {
result =
getLocalCallContext(pragma[only_bind_into](pragma[only_bind_out](cc)),
node.getEnclosingCallable())
node.getEnclosingCallable()) and
exists(config)
}
private predicate localStep(
@@ -2862,7 +2865,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)
localCc = getLocalCc(mid, cc, config)
|
localStep(mid, state0, node, state, true, _, config, localCc) and
ap = ap0

View File

@@ -112,13 +112,15 @@ abstract class Configuration extends string {
predicate isBarrierGuard(BarrierGuard guard, FlowState state) { none() }
/**
* Holds if data may flow from `node1` to `node2` in addition to the normal data-flow steps.
* 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 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`.
* 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`.
*/
predicate isAdditionalFlowStep(Node node1, FlowState state1, Node node2, FlowState state2) {
none()
@@ -1158,8 +1160,8 @@ private module Stage2 {
if reducedViableImplInReturn(c, call) then result = TReturn(c, call) else result = ccNone()
}
bindingset[node, cc]
private LocalCc getLocalCc(NodeEx node, Cc cc) { any() }
bindingset[node, cc, config]
private LocalCc getLocalCc(NodeEx node, Cc cc, Configuration config) { any() }
bindingset[node1, state1, config]
bindingset[node2, state2, config]
@@ -1246,7 +1248,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)
localCc = getLocalCc(mid, cc, config)
|
localStep(mid, state0, node, state, true, _, config, localCc) and
ap = ap0
@@ -1951,8 +1953,8 @@ private module Stage3 {
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() }
bindingset[node, cc, config]
private LocalCc getLocalCc(NodeEx node, Cc cc, Configuration config) { any() }
private predicate localStep(
NodeEx node1, FlowState state1, NodeEx node2, FlowState state2, boolean preservesValue,
@@ -2035,7 +2037,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)
localCc = getLocalCc(mid, cc, config)
|
localStep(mid, state0, node, state, true, _, config, localCc) and
ap = ap0
@@ -2765,11 +2767,12 @@ private module Stage4 {
if reducedViableImplInReturn(c, call) then result = TReturn(c, call) else result = ccNone()
}
bindingset[node, cc]
private LocalCc getLocalCc(NodeEx node, Cc cc) {
bindingset[node, cc, config]
private LocalCc getLocalCc(NodeEx node, Cc cc, Configuration config) {
result =
getLocalCallContext(pragma[only_bind_into](pragma[only_bind_out](cc)),
node.getEnclosingCallable())
node.getEnclosingCallable()) and
exists(config)
}
private predicate localStep(
@@ -2862,7 +2865,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)
localCc = getLocalCc(mid, cc, config)
|
localStep(mid, state0, node, state, true, _, config, localCc) and
ap = ap0

View File

@@ -112,13 +112,15 @@ abstract class Configuration extends string {
predicate isBarrierGuard(BarrierGuard guard, FlowState state) { none() }
/**
* Holds if data may flow from `node1` to `node2` in addition to the normal data-flow steps.
* 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 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`.
* 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`.
*/
predicate isAdditionalFlowStep(Node node1, FlowState state1, Node node2, FlowState state2) {
none()
@@ -1158,8 +1160,8 @@ private module Stage2 {
if reducedViableImplInReturn(c, call) then result = TReturn(c, call) else result = ccNone()
}
bindingset[node, cc]
private LocalCc getLocalCc(NodeEx node, Cc cc) { any() }
bindingset[node, cc, config]
private LocalCc getLocalCc(NodeEx node, Cc cc, Configuration config) { any() }
bindingset[node1, state1, config]
bindingset[node2, state2, config]
@@ -1246,7 +1248,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)
localCc = getLocalCc(mid, cc, config)
|
localStep(mid, state0, node, state, true, _, config, localCc) and
ap = ap0
@@ -1951,8 +1953,8 @@ private module Stage3 {
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() }
bindingset[node, cc, config]
private LocalCc getLocalCc(NodeEx node, Cc cc, Configuration config) { any() }
private predicate localStep(
NodeEx node1, FlowState state1, NodeEx node2, FlowState state2, boolean preservesValue,
@@ -2035,7 +2037,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)
localCc = getLocalCc(mid, cc, config)
|
localStep(mid, state0, node, state, true, _, config, localCc) and
ap = ap0
@@ -2765,11 +2767,12 @@ private module Stage4 {
if reducedViableImplInReturn(c, call) then result = TReturn(c, call) else result = ccNone()
}
bindingset[node, cc]
private LocalCc getLocalCc(NodeEx node, Cc cc) {
bindingset[node, cc, config]
private LocalCc getLocalCc(NodeEx node, Cc cc, Configuration config) {
result =
getLocalCallContext(pragma[only_bind_into](pragma[only_bind_out](cc)),
node.getEnclosingCallable())
node.getEnclosingCallable()) and
exists(config)
}
private predicate localStep(
@@ -2862,7 +2865,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)
localCc = getLocalCc(mid, cc, config)
|
localStep(mid, state0, node, state, true, _, config, localCc) and
ap = ap0

View File

@@ -154,7 +154,8 @@ abstract class Configuration extends DataFlow::Configuration {
}
/**
* Holds if taint may propagate from `node1` to `node2` in addition to the normal data-flow and taint steps.
* 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() }
@@ -164,8 +165,9 @@ abstract class Configuration extends DataFlow::Configuration {
}
/**
* 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`.
* Holds if the additional taint propagation 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`.
*/
predicate isAdditionalTaintStep(
DataFlow::Node node1, DataFlow::FlowState state1, DataFlow::Node node2,

View File

@@ -154,7 +154,8 @@ abstract class Configuration extends DataFlow::Configuration {
}
/**
* Holds if taint may propagate from `node1` to `node2` in addition to the normal data-flow and taint steps.
* 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() }
@@ -164,8 +165,9 @@ abstract class Configuration extends DataFlow::Configuration {
}
/**
* 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`.
* Holds if the additional taint propagation 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`.
*/
predicate isAdditionalTaintStep(
DataFlow::Node node1, DataFlow::FlowState state1, DataFlow::Node node2,

View File

@@ -112,13 +112,15 @@ abstract class Configuration extends string {
predicate isBarrierGuard(BarrierGuard guard, FlowState state) { none() }
/**
* Holds if data may flow from `node1` to `node2` in addition to the normal data-flow steps.
* 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 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`.
* 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`.
*/
predicate isAdditionalFlowStep(Node node1, FlowState state1, Node node2, FlowState state2) {
none()
@@ -1158,8 +1160,8 @@ private module Stage2 {
if reducedViableImplInReturn(c, call) then result = TReturn(c, call) else result = ccNone()
}
bindingset[node, cc]
private LocalCc getLocalCc(NodeEx node, Cc cc) { any() }
bindingset[node, cc, config]
private LocalCc getLocalCc(NodeEx node, Cc cc, Configuration config) { any() }
bindingset[node1, state1, config]
bindingset[node2, state2, config]
@@ -1246,7 +1248,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)
localCc = getLocalCc(mid, cc, config)
|
localStep(mid, state0, node, state, true, _, config, localCc) and
ap = ap0
@@ -1951,8 +1953,8 @@ private module Stage3 {
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() }
bindingset[node, cc, config]
private LocalCc getLocalCc(NodeEx node, Cc cc, Configuration config) { any() }
private predicate localStep(
NodeEx node1, FlowState state1, NodeEx node2, FlowState state2, boolean preservesValue,
@@ -2035,7 +2037,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)
localCc = getLocalCc(mid, cc, config)
|
localStep(mid, state0, node, state, true, _, config, localCc) and
ap = ap0
@@ -2765,11 +2767,12 @@ private module Stage4 {
if reducedViableImplInReturn(c, call) then result = TReturn(c, call) else result = ccNone()
}
bindingset[node, cc]
private LocalCc getLocalCc(NodeEx node, Cc cc) {
bindingset[node, cc, config]
private LocalCc getLocalCc(NodeEx node, Cc cc, Configuration config) {
result =
getLocalCallContext(pragma[only_bind_into](pragma[only_bind_out](cc)),
node.getEnclosingCallable())
node.getEnclosingCallable()) and
exists(config)
}
private predicate localStep(
@@ -2862,7 +2865,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)
localCc = getLocalCc(mid, cc, config)
|
localStep(mid, state0, node, state, true, _, config, localCc) and
ap = ap0

View File

@@ -112,13 +112,15 @@ abstract class Configuration extends string {
predicate isBarrierGuard(BarrierGuard guard, FlowState state) { none() }
/**
* Holds if data may flow from `node1` to `node2` in addition to the normal data-flow steps.
* 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 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`.
* 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`.
*/
predicate isAdditionalFlowStep(Node node1, FlowState state1, Node node2, FlowState state2) {
none()
@@ -1158,8 +1160,8 @@ private module Stage2 {
if reducedViableImplInReturn(c, call) then result = TReturn(c, call) else result = ccNone()
}
bindingset[node, cc]
private LocalCc getLocalCc(NodeEx node, Cc cc) { any() }
bindingset[node, cc, config]
private LocalCc getLocalCc(NodeEx node, Cc cc, Configuration config) { any() }
bindingset[node1, state1, config]
bindingset[node2, state2, config]
@@ -1246,7 +1248,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)
localCc = getLocalCc(mid, cc, config)
|
localStep(mid, state0, node, state, true, _, config, localCc) and
ap = ap0
@@ -1951,8 +1953,8 @@ private module Stage3 {
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() }
bindingset[node, cc, config]
private LocalCc getLocalCc(NodeEx node, Cc cc, Configuration config) { any() }
private predicate localStep(
NodeEx node1, FlowState state1, NodeEx node2, FlowState state2, boolean preservesValue,
@@ -2035,7 +2037,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)
localCc = getLocalCc(mid, cc, config)
|
localStep(mid, state0, node, state, true, _, config, localCc) and
ap = ap0
@@ -2765,11 +2767,12 @@ private module Stage4 {
if reducedViableImplInReturn(c, call) then result = TReturn(c, call) else result = ccNone()
}
bindingset[node, cc]
private LocalCc getLocalCc(NodeEx node, Cc cc) {
bindingset[node, cc, config]
private LocalCc getLocalCc(NodeEx node, Cc cc, Configuration config) {
result =
getLocalCallContext(pragma[only_bind_into](pragma[only_bind_out](cc)),
node.getEnclosingCallable())
node.getEnclosingCallable()) and
exists(config)
}
private predicate localStep(
@@ -2862,7 +2865,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)
localCc = getLocalCc(mid, cc, config)
|
localStep(mid, state0, node, state, true, _, config, localCc) and
ap = ap0

View File

@@ -112,13 +112,15 @@ abstract class Configuration extends string {
predicate isBarrierGuard(BarrierGuard guard, FlowState state) { none() }
/**
* Holds if data may flow from `node1` to `node2` in addition to the normal data-flow steps.
* 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 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`.
* 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`.
*/
predicate isAdditionalFlowStep(Node node1, FlowState state1, Node node2, FlowState state2) {
none()
@@ -1158,8 +1160,8 @@ private module Stage2 {
if reducedViableImplInReturn(c, call) then result = TReturn(c, call) else result = ccNone()
}
bindingset[node, cc]
private LocalCc getLocalCc(NodeEx node, Cc cc) { any() }
bindingset[node, cc, config]
private LocalCc getLocalCc(NodeEx node, Cc cc, Configuration config) { any() }
bindingset[node1, state1, config]
bindingset[node2, state2, config]
@@ -1246,7 +1248,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)
localCc = getLocalCc(mid, cc, config)
|
localStep(mid, state0, node, state, true, _, config, localCc) and
ap = ap0
@@ -1951,8 +1953,8 @@ private module Stage3 {
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() }
bindingset[node, cc, config]
private LocalCc getLocalCc(NodeEx node, Cc cc, Configuration config) { any() }
private predicate localStep(
NodeEx node1, FlowState state1, NodeEx node2, FlowState state2, boolean preservesValue,
@@ -2035,7 +2037,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)
localCc = getLocalCc(mid, cc, config)
|
localStep(mid, state0, node, state, true, _, config, localCc) and
ap = ap0
@@ -2765,11 +2767,12 @@ private module Stage4 {
if reducedViableImplInReturn(c, call) then result = TReturn(c, call) else result = ccNone()
}
bindingset[node, cc]
private LocalCc getLocalCc(NodeEx node, Cc cc) {
bindingset[node, cc, config]
private LocalCc getLocalCc(NodeEx node, Cc cc, Configuration config) {
result =
getLocalCallContext(pragma[only_bind_into](pragma[only_bind_out](cc)),
node.getEnclosingCallable())
node.getEnclosingCallable()) and
exists(config)
}
private predicate localStep(
@@ -2862,7 +2865,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)
localCc = getLocalCc(mid, cc, config)
|
localStep(mid, state0, node, state, true, _, config, localCc) and
ap = ap0

View File

@@ -112,13 +112,15 @@ abstract class Configuration extends string {
predicate isBarrierGuard(BarrierGuard guard, FlowState state) { none() }
/**
* Holds if data may flow from `node1` to `node2` in addition to the normal data-flow steps.
* 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 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`.
* 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`.
*/
predicate isAdditionalFlowStep(Node node1, FlowState state1, Node node2, FlowState state2) {
none()
@@ -1158,8 +1160,8 @@ private module Stage2 {
if reducedViableImplInReturn(c, call) then result = TReturn(c, call) else result = ccNone()
}
bindingset[node, cc]
private LocalCc getLocalCc(NodeEx node, Cc cc) { any() }
bindingset[node, cc, config]
private LocalCc getLocalCc(NodeEx node, Cc cc, Configuration config) { any() }
bindingset[node1, state1, config]
bindingset[node2, state2, config]
@@ -1246,7 +1248,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)
localCc = getLocalCc(mid, cc, config)
|
localStep(mid, state0, node, state, true, _, config, localCc) and
ap = ap0
@@ -1951,8 +1953,8 @@ private module Stage3 {
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() }
bindingset[node, cc, config]
private LocalCc getLocalCc(NodeEx node, Cc cc, Configuration config) { any() }
private predicate localStep(
NodeEx node1, FlowState state1, NodeEx node2, FlowState state2, boolean preservesValue,
@@ -2035,7 +2037,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)
localCc = getLocalCc(mid, cc, config)
|
localStep(mid, state0, node, state, true, _, config, localCc) and
ap = ap0
@@ -2765,11 +2767,12 @@ private module Stage4 {
if reducedViableImplInReturn(c, call) then result = TReturn(c, call) else result = ccNone()
}
bindingset[node, cc]
private LocalCc getLocalCc(NodeEx node, Cc cc) {
bindingset[node, cc, config]
private LocalCc getLocalCc(NodeEx node, Cc cc, Configuration config) {
result =
getLocalCallContext(pragma[only_bind_into](pragma[only_bind_out](cc)),
node.getEnclosingCallable())
node.getEnclosingCallable()) and
exists(config)
}
private predicate localStep(
@@ -2862,7 +2865,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)
localCc = getLocalCc(mid, cc, config)
|
localStep(mid, state0, node, state, true, _, config, localCc) and
ap = ap0

View File

@@ -154,7 +154,8 @@ abstract class Configuration extends DataFlow::Configuration {
}
/**
* Holds if taint may propagate from `node1` to `node2` in addition to the normal data-flow and taint steps.
* 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() }
@@ -164,8 +165,9 @@ abstract class Configuration extends DataFlow::Configuration {
}
/**
* 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`.
* Holds if the additional taint propagation 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`.
*/
predicate isAdditionalTaintStep(
DataFlow::Node node1, DataFlow::FlowState state1, DataFlow::Node node2,

View File

@@ -154,7 +154,8 @@ abstract class Configuration extends DataFlow::Configuration {
}
/**
* Holds if taint may propagate from `node1` to `node2` in addition to the normal data-flow and taint steps.
* 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() }
@@ -164,8 +165,9 @@ abstract class Configuration extends DataFlow::Configuration {
}
/**
* 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`.
* Holds if the additional taint propagation 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`.
*/
predicate isAdditionalTaintStep(
DataFlow::Node node1, DataFlow::FlowState state1, DataFlow::Node node2,

View File

@@ -154,7 +154,8 @@ abstract class Configuration extends DataFlow::Configuration {
}
/**
* Holds if taint may propagate from `node1` to `node2` in addition to the normal data-flow and taint steps.
* 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() }
@@ -164,8 +165,9 @@ abstract class Configuration extends DataFlow::Configuration {
}
/**
* 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`.
* Holds if the additional taint propagation 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`.
*/
predicate isAdditionalTaintStep(
DataFlow::Node node1, DataFlow::FlowState state1, DataFlow::Node node2,

View File

@@ -25,7 +25,6 @@ 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
@@ -36,7 +35,6 @@ 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

View File

@@ -1,71 +0,0 @@
/**
* 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
}
}

View File

@@ -1,25 +1,22 @@
/**
* Provides classes for heuristically identifying variables and functions that
* 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.
* might contain or return a password or other sensitive information.
*/
import cpp
/**
* Holds if the name `s` suggests something might contain or return a password
* or other credential.
* or other sensitive information.
*/
bindingset[s]
private predicate suspicious(string s) {
s.regexpMatch(".*(password|passwd|accountid|account.?key|accnt.?key|license.?key|trusted).*") and
not s.matches(["%hash%", "%crypt%", "%file%", "%path%", "%invalid%"])
s.matches(["%password%", "%passwd%", "%trusted%"]) and
not s.matches(["%hash%", "%crypt%", "%file%", "%path%"])
}
/**
* A variable that might contain a password or other credential.
* A variable that might contain a password or other sensitive information.
*/
class SensitiveVariable extends Variable {
SensitiveVariable() {
@@ -29,7 +26,7 @@ class SensitiveVariable extends Variable {
}
/**
* A function that might return a password or other credential.
* A function that might return a password or other sensitive information.
*/
class SensitiveFunction extends Function {
SensitiveFunction() {
@@ -39,7 +36,7 @@ class SensitiveFunction extends Function {
}
/**
* An expression whose value might be a password or other credential.
* An expression whose value might be a password or other sensitive information.
*/
class SensitiveExpr extends Expr {
SensitiveExpr() {

View File

@@ -58,5 +58,11 @@ where
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 any(ConditionDeclExpr cde).getEnclosingFunction() = f // this case can be removed when the `if (a = b; a)` and `switch (a = b; a)` test cases don't depend on this exclusion
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
select v, "Variable " + v.getName() + " is not used"

View File

@@ -1,12 +1,3 @@
## 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

View File

@@ -116,8 +116,8 @@ class ExecTaintConfiguration extends TaintTracking::Configuration {
state instanceof ConcatState
}
override predicate isSanitizerOut(DataFlow::Node node) {
isSink(node, _) // Prevent duplicates along a call chain, since `shellCommand` will include wrappers
override predicate isSanitizerOut(DataFlow::Node node, DataFlow::FlowState state) {
isSink(node, state) // Prevent duplicates along a call chain, since `shellCommand` will include wrappers
}
}

View File

@@ -9,43 +9,28 @@
* @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 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
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
}
}
@@ -222,7 +207,7 @@ class Encrypted extends Expr {
class FromSensitiveConfiguration extends TaintTracking::Configuration {
FromSensitiveConfiguration() { this = "FromSensitiveConfiguration" }
override predicate isSource(DataFlow::Node source) { source instanceof SourceNode }
override predicate isSource(DataFlow::Node source) { source instanceof SensitiveNode }
override predicate isSink(DataFlow::Node sink) {
sink.asExpr() = any(NetworkSendRecv nsr).getDataExpr()

View File

@@ -0,0 +1,4 @@
---
category: minorAnalysis
---
* The `cpp/system-data-exposure` query has been increased from `medium` to `high` precision, following a number of improvements to the query logic.

View File

@@ -1,6 +1,4 @@
## 0.0.12
### Minor Analysis Improvements
---
category: minorAnalysis
---
* 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.

View File

@@ -1,4 +0,0 @@
---
category: minorAnalysis
---
* The `cpp/unused-local-variable` no longer ignores functions that include lambda expressions capturing trivially copyable objects.

View File

@@ -1,4 +0,0 @@
---
category: minorAnalysis
---
* The `cpp/cleartext-transmission` query now recognizes additional sources, for sensitive private data such as e-mail addresses and credit card numbers.

View File

@@ -1 +0,0 @@
## 0.0.13

View File

@@ -1,2 +1,2 @@
---
lastReleaseVersion: 0.0.13
lastReleaseVersion: 0.0.11

View File

@@ -21,7 +21,7 @@ class WriteAccessCheckMacro extends Macro {
VariableAccess va;
WriteAccessCheckMacro() {
this.getName() = ["user_write_access_begin", "user_access_begin", "access_ok"] and
this.getName() = ["user_write_access_begin", "user_access_begin"] and
va.getEnclosingElement() = this.getAnInvocation().getAnExpandedElement()
}
@@ -37,8 +37,7 @@ class UnSafePutUserMacro extends Macro {
}
Expr getUserModePtr() {
result = writeUserPtr.getOperand().(AddressOfExpr).getOperand().(FieldAccess).getQualifier() or
result = writeUserPtr.getOperand()
result = writeUserPtr.getOperand().(AddressOfExpr).getOperand().(FieldAccess).getQualifier()
}
}
@@ -47,13 +46,11 @@ class ExploitableUserModePtrParam extends Parameter {
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
from ExploitableUserModePtrParam p, UnSafePutUserMacro unsafePutUser
where
DataFlow::localFlow(DataFlow::parameterNode(p), DataFlow::exprNode(unsafePutUser.getUserModePtr()))
select p, "unsafe_put_user write user-mode pointer $@ without check.", p, p.toString()

View File

@@ -1,5 +1,5 @@
name: codeql/cpp-queries
version: 0.1.0-dev
version: 0.0.12-dev
groups:
- cpp
- queries

View File

@@ -155,27 +155,21 @@ bad_asts.cpp:
# 19| getInitializer(0): [ConstructorFieldInit] constructor init of field x
# 19| Type = [IntType] int
# 19| ValueCategory = prvalue
# 19| getExpr(): [ReferenceFieldAccess] x
# 19| getExpr(): [FieldAccess] x
# 19| Type = [IntType] int
# 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(): [ReferenceFieldAccess] y
# 19| getExpr(): [FieldAccess] y
# 19| Type = [IntType] int
# 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&&)
@@ -11657,99 +11651,75 @@ ir.cpp:
# 1486| getInitializer(0): [ConstructorFieldInit] constructor init of field i
# 1486| Type = [IntType] int
# 1486| ValueCategory = prvalue
# 1486| getExpr(): [ReferenceFieldAccess] i
# 1486| getExpr(): [FieldAccess] 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| getExpr(): [FieldAccess] 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| getExpr(): [FieldAccess] 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| getExpr(): [FieldAccess] 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| getExpr(): [FieldAccess] 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| getExpr(): [FieldAccess] 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| getExpr(): [FieldAccess] 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| getExpr(): [FieldAccess] 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&&)
@@ -12126,39 +12096,30 @@ ir.cpp:
# 1539| getInitializer(0): [ConstructorFieldInit] constructor init of field i
# 1539| Type = [IntType] int
# 1539| ValueCategory = prvalue
# 1539| getExpr(): [ReferenceFieldAccess] i
# 1539| getExpr(): [FieldAccess] 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| getExpr(): [FieldAccess] 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| getExpr(): [FieldAccess] 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&&)
@@ -13020,12 +12981,12 @@ ir.cpp:
# 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| getFieldExpr(obj1): [Literal] Unknown literal
# 1688| Type = [SpecifiedType] const CapturedLambdaMyObj
# 1688| ValueCategory = prvalue
# 1688| getFieldExpr(obj2): [Literal] Unknown literal
# 1688| Type = [Class] CapturedLambdaMyObj
# 1688| ValueCategory = prvalue(load)
# 1688| ValueCategory = prvalue
# 1688| getFieldExpr(x): [VariableAccess] x
# 1688| Type = [IntType] int
# 1688| ValueCategory = prvalue(load)
@@ -13035,9 +12996,6 @@ ir.cpp:
# 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)
@@ -13072,18 +13030,12 @@ ir.cpp:
# 1689| getInitializer(): [ClassAggregateLiteral] {...}
# 1689| Type = [Closure,LocalClass] decltype([...](...){...})
# 1689| ValueCategory = prvalue
# 1689| getFieldExpr(obj1): [PointerFieldAccess] obj1
# 1689| getFieldExpr(obj1): [Literal] Unknown literal
# 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| ValueCategory = prvalue
# 1689| getFieldExpr(obj2): [Literal] Unknown literal
# 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| ValueCategory = prvalue
# 1689| getFieldExpr(x): [PointerFieldAccess] x
# 1689| Type = [IntType] int
# 1689| ValueCategory = prvalue(load)
@@ -13139,426 +13091,6 @@ ir.cpp:
# 1696| getExpr(): [VariableAccess] x
# 1696| Type = [IntType] int
# 1696| ValueCategory = prvalue(load)
# 1699| [CopyAssignmentOperator] TrivialLambdaClass& TrivialLambdaClass::operator=(TrivialLambdaClass const&)
# 1699| <params>:
#-----| getParameter(0): [Parameter] (unnamed parameter 0)
#-----| Type = [LValueReferenceType] const TrivialLambdaClass &
# 1699| [MoveAssignmentOperator] TrivialLambdaClass& TrivialLambdaClass::operator=(TrivialLambdaClass&&)
# 1699| <params>:
#-----| getParameter(0): [Parameter] (unnamed parameter 0)
#-----| Type = [RValueReferenceType] TrivialLambdaClass &&
# 1701| [ConstMemberFunction] void TrivialLambdaClass::m() const
# 1701| <params>:
# 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| <params>:
#-----| 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| <params>:
#-----| 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| <params>:
#-----| 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| <params>:
# 1702| [ConstMemberFunction] void (void TrivialLambdaClass::m() const)::(lambda [] type at line 1702, col. 26)::operator()() const
# 1702| <params>:
# 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| <params>:
#-----| 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| <params>:
#-----| 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| <params>:
#-----| 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| <params>:
# 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| <params>:
# 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| <params>:
# 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| <params>:
#-----| 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| <params>:
#-----| 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| <params>:
#-----| 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| <params>:
# 1716| [ConstMemberFunction] void (void captured_lambda2(TrivialLambdaClass, TrivialLambdaClass&, TrivialLambdaClass&&))::(lambda [] type at line 1716, col. 21)::operator()() const
# 1716| <params>:
# 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| <params>:
#-----| 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| <params>:
#-----| 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| <params>:
#-----| 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| <params>:
# 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| <params>:
# 1717| getEntryPoint(): [BlockStmt] { ... }
# 1717| getStmt(0): [ReturnStmt] return ...
# 1721| [CopyAssignmentOperator] CopyConstructorWithImplicitArgumentClass& CopyConstructorWithImplicitArgumentClass::operator=(CopyConstructorWithImplicitArgumentClass const&)
# 1721| <params>:
#-----| getParameter(0): [Parameter] (unnamed parameter 0)
#-----| Type = [LValueReferenceType] const CopyConstructorWithImplicitArgumentClass &
# 1724| [Constructor] void CopyConstructorWithImplicitArgumentClass::CopyConstructorWithImplicitArgumentClass()
# 1724| <params>:
# 1724| <initializations>:
# 1724| getEntryPoint(): [BlockStmt] { ... }
# 1724| getStmt(0): [ReturnStmt] return ...
# 1725| [CopyConstructor] void CopyConstructorWithImplicitArgumentClass::CopyConstructorWithImplicitArgumentClass(CopyConstructorWithImplicitArgumentClass const&)
# 1725| <params>:
# 1725| getParameter(0): [Parameter] c
# 1725| Type = [LValueReferenceType] const CopyConstructorWithImplicitArgumentClass &
# 1725| <initializations>:
# 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| <params>:
#-----| getParameter(0): [Parameter] (unnamed parameter 0)
#-----| Type = [LValueReferenceType] const CopyConstructorWithBitwiseCopyClass &
# 1730| [MoveAssignmentOperator] CopyConstructorWithBitwiseCopyClass& CopyConstructorWithBitwiseCopyClass::operator=(CopyConstructorWithBitwiseCopyClass&&)
# 1730| <params>:
#-----| getParameter(0): [Parameter] (unnamed parameter 0)
#-----| Type = [RValueReferenceType] CopyConstructorWithBitwiseCopyClass &&
# 1730| [CopyConstructor] void CopyConstructorWithBitwiseCopyClass::CopyConstructorWithBitwiseCopyClass(CopyConstructorWithBitwiseCopyClass const&)
# 1730| <params>:
#-----| getParameter(0): [Parameter] (unnamed parameter 0)
#-----| Type = [LValueReferenceType] const CopyConstructorWithBitwiseCopyClass &
# 1730| [MoveConstructor] void CopyConstructorWithBitwiseCopyClass::CopyConstructorWithBitwiseCopyClass(CopyConstructorWithBitwiseCopyClass&&)
# 1730| <params>:
#-----| getParameter(0): [Parameter] (unnamed parameter 0)
#-----| Type = [RValueReferenceType] CopyConstructorWithBitwiseCopyClass &&
# 1733| [Constructor] void CopyConstructorWithBitwiseCopyClass::CopyConstructorWithBitwiseCopyClass()
# 1733| <params>:
# 1733| <initializations>:
# 1733| getEntryPoint(): [BlockStmt] { ... }
# 1733| getStmt(0): [ReturnStmt] return ...
# 1736| [CopyAssignmentOperator] CopyConstructorTestNonVirtualClass& CopyConstructorTestNonVirtualClass::operator=(CopyConstructorTestNonVirtualClass const&)
# 1736| <params>:
#-----| getParameter(0): [Parameter] (unnamed parameter 0)
#-----| Type = [LValueReferenceType] const CopyConstructorTestNonVirtualClass &
# 1736| [MoveAssignmentOperator] CopyConstructorTestNonVirtualClass& CopyConstructorTestNonVirtualClass::operator=(CopyConstructorTestNonVirtualClass&&)
# 1736| <params>:
#-----| getParameter(0): [Parameter] (unnamed parameter 0)
#-----| Type = [RValueReferenceType] CopyConstructorTestNonVirtualClass &&
# 1736| [CopyConstructor] void CopyConstructorTestNonVirtualClass::CopyConstructorTestNonVirtualClass(CopyConstructorTestNonVirtualClass const&)
# 1736| <params>:
#-----| getParameter(0): [Parameter] (unnamed parameter 0)
#-----| Type = [LValueReferenceType] const CopyConstructorTestNonVirtualClass &
# 1736| <initializations>:
# 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| <params>:
#-----| getParameter(0): [Parameter] (unnamed parameter 0)
#-----| Type = [RValueReferenceType] CopyConstructorTestNonVirtualClass &&
# 1740| [Constructor] void CopyConstructorTestNonVirtualClass::CopyConstructorTestNonVirtualClass()
# 1740| <params>:
# 1740| <initializations>:
# 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| <params>:
#-----| getParameter(0): [Parameter] (unnamed parameter 0)
#-----| Type = [LValueReferenceType] const CopyConstructorTestVirtualClass &
# 1743| [MoveAssignmentOperator] CopyConstructorTestVirtualClass& CopyConstructorTestVirtualClass::operator=(CopyConstructorTestVirtualClass&&)
# 1743| <params>:
#-----| getParameter(0): [Parameter] (unnamed parameter 0)
#-----| Type = [RValueReferenceType] CopyConstructorTestVirtualClass &&
# 1743| [CopyConstructor] void CopyConstructorTestVirtualClass::CopyConstructorTestVirtualClass(CopyConstructorTestVirtualClass const&)
# 1743| <params>:
#-----| getParameter(0): [Parameter] (unnamed parameter 0)
#-----| Type = [LValueReferenceType] const CopyConstructorTestVirtualClass &
# 1743| <initializations>:
# 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| <params>:
#-----| getParameter(0): [Parameter] (unnamed parameter 0)
#-----| Type = [RValueReferenceType] CopyConstructorTestVirtualClass &&
# 1747| [Constructor] void CopyConstructorTestVirtualClass::CopyConstructorTestVirtualClass()
# 1747| <params>:
# 1747| <initializations>:
# 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| <params>:
# 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 ...
perf-regression.cpp:
# 4| [CopyAssignmentOperator] Big& Big::operator=(Big const&)
# 4| <params>:

View File

@@ -6,6 +6,8 @@ missingOperandType
duplicateChiOperand
sideEffectWithoutPrimary
instructionWithoutSuccessor
| ir.cpp:1688:24:1690:5 | FieldAddress: {...} | Instruction 'FieldAddress: {...}' has no successors in function '$@'. | ir.cpp:1683:6:1683:20 | void captured_lambda(int, int&, int&&) | void captured_lambda(int, int&, int&&) |
| ir.cpp:1689:28:1689:54 | FieldAddress: {...} | Instruction 'FieldAddress: {...}' has no successors in function '$@'. | ir.cpp:1688:46:1688:46 | void (void captured_lambda(int, int&, int&&))::(lambda [] type at line 1688, col. 25)::operator()() const | void (void captured_lambda(int, int&, int&&))::(lambda [] type at line 1688, col. 25)::operator()() const |
ambiguousSuccessors
unexplainedLoop
unnecessaryPhiInstruction

View File

@@ -6,6 +6,8 @@ missingOperandType
duplicateChiOperand
sideEffectWithoutPrimary
instructionWithoutSuccessor
| ir.cpp:1688:24:1690:5 | FieldAddress: {...} | Instruction 'FieldAddress: {...}' has no successors in function '$@'. | ir.cpp:1683:6:1683:20 | void captured_lambda(int, int&, int&&) | void captured_lambda(int, int&, int&&) |
| ir.cpp:1689:28:1689:54 | FieldAddress: {...} | Instruction 'FieldAddress: {...}' has no successors in function '$@'. | ir.cpp:1688:46:1688:46 | void (void captured_lambda(int, int&, int&&))::(lambda [] type at line 1688, col. 25)::operator()() const | void (void captured_lambda(int, int&, int&&))::(lambda [] type at line 1688, col. 25)::operator()() const |
ambiguousSuccessors
unexplainedLoop
unnecessaryPhiInstruction

View File

@@ -1696,62 +1696,4 @@ int goto_on_same_line() {
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;
}
// semmle-extractor-options: -std=c++17 --clang

View File

@@ -47,31 +47,29 @@
| 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_12 |
| bad_asts.cpp:19:10:19:10 | Address | &:r19_16 |
| 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 | Address | &:r19_19 |
| 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 | ChiPartial | partial:m19_14 |
| bad_asts.cpp:19:10:19:10 | ChiPartial | partial:m19_21 |
| 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 | ChiTotal | total:m19_15 |
| 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 | SideEffect | m19_22 |
| bad_asts.cpp:19:10:19:10 | StoreValue | r19_13 |
| bad_asts.cpp:19:10:19:10 | StoreValue | r19_20 |
| 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:19:10:19:10 | Unary | r19_18 |
| 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 |
@@ -670,10 +668,6 @@
| 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 |
@@ -690,10 +684,6 @@
| 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 |
@@ -726,23 +716,15 @@
| file://:0:0:0:0 | Arg(0) | 0:r0_15 |
| file://:0:0:0:0 | CallTarget | func:r0_1 |
| file://:0:0:0:0 | 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 |
@@ -754,18 +736,12 @@
| 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 |
@@ -777,8 +753,6 @@
| 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 |
@@ -802,13 +776,9 @@
| 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 |
@@ -6854,48 +6824,48 @@
| 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_12 |
| ir.cpp:1486:8:1486:8 | Address | &:r1486_16 |
| 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_19 |
| ir.cpp:1486:8:1486:8 | Address | &:r1486_23 |
| ir.cpp:1486:8:1486:8 | Address | &:r1486_24 |
| 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_30 |
| ir.cpp:1486:8:1486:8 | Address | &:r1486_31 |
| 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_38 |
| ir.cpp:1486:8:1486:8 | Address | &:r1486_40 |
| ir.cpp:1486:8:1486:8 | Address | &:r1486_44 |
| 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_47 |
| ir.cpp:1486:8:1486:8 | Address | &:r1486_51 |
| ir.cpp:1486:8:1486:8 | Address | &:r1486_52 |
| ir.cpp:1486:8:1486:8 | Address | &:r1486_54 |
| ir.cpp:1486:8:1486:8 | Address | &:r1486_58 |
| ir.cpp:1486:8:1486:8 | Address | &:r1486_59 |
| 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_14 |
| ir.cpp:1486:8:1486:8 | ChiPartial | partial:m1486_21 |
| ir.cpp:1486:8:1486:8 | ChiPartial | partial:m1486_28 |
| ir.cpp:1486:8:1486:8 | ChiPartial | partial:m1486_35 |
| ir.cpp:1486:8:1486:8 | ChiPartial | partial:m1486_42 |
| ir.cpp:1486:8:1486:8 | ChiPartial | partial:m1486_49 |
| ir.cpp:1486:8:1486:8 | ChiPartial | partial:m1486_56 |
| 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 | ChiTotal | total:m1486_15 |
| ir.cpp:1486:8:1486:8 | ChiTotal | total:m1486_22 |
| ir.cpp:1486:8:1486:8 | ChiTotal | total:m1486_29 |
| ir.cpp:1486:8:1486:8 | ChiTotal | total:m1486_36 |
| ir.cpp:1486:8:1486:8 | ChiTotal | total:m1486_43 |
| ir.cpp:1486:8:1486:8 | ChiTotal | total:m1486_50 |
| ir.cpp:1486:8:1486:8 | ChiTotal | total:m1486_57 |
| 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 |
@@ -6917,15 +6887,15 @@
| 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 | SideEffect | m1486_64 |
| ir.cpp:1486:8:1486:8 | StoreValue | r1486_13 |
| ir.cpp:1486:8:1486:8 | StoreValue | r1486_20 |
| ir.cpp:1486:8:1486:8 | StoreValue | r1486_27 |
| ir.cpp:1486:8:1486:8 | StoreValue | r1486_34 |
| ir.cpp:1486:8:1486:8 | StoreValue | r1486_41 |
| ir.cpp:1486:8:1486:8 | StoreValue | r1486_48 |
| ir.cpp:1486:8:1486:8 | StoreValue | r1486_55 |
| 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 |
@@ -6935,21 +6905,13 @@
| 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_18 |
| ir.cpp:1486:8:1486:8 | Unary | r1486_25 |
| ir.cpp:1486:8:1486:8 | Unary | r1486_32 |
| ir.cpp:1486:8:1486:8 | Unary | r1486_39 |
| ir.cpp:1486:8:1486:8 | Unary | r1486_46 |
| ir.cpp:1486:8:1486:8 | Unary | r1486_53 |
| 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 |
@@ -7130,23 +7092,23 @@
| 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_12 |
| ir.cpp:1539:8:1539:8 | Address | &:r1539_16 |
| 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_19 |
| ir.cpp:1539:8:1539:8 | Address | &:r1539_23 |
| ir.cpp:1539:8:1539:8 | Address | &:r1539_24 |
| 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 | ChiPartial | partial:m1539_14 |
| ir.cpp:1539:8:1539:8 | ChiPartial | partial:m1539_21 |
| ir.cpp:1539:8:1539:8 | ChiPartial | partial:m1539_28 |
| 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 | ChiTotal | total:m1539_15 |
| ir.cpp:1539:8:1539:8 | ChiTotal | total:m1539_22 |
| 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 |
@@ -7158,19 +7120,16 @@
| 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 | SideEffect | m1539_29 |
| ir.cpp:1539:8:1539:8 | StoreValue | r1539_13 |
| ir.cpp:1539:8:1539:8 | StoreValue | r1539_20 |
| ir.cpp:1539:8:1539:8 | StoreValue | r1539_27 |
| 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:1539:8:1539:8 | Unary | r1539_18 |
| ir.cpp:1539:8:1539:8 | Unary | r1539_25 |
| 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 |
@@ -7693,20 +7652,15 @@
| 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 |
@@ -7729,104 +7683,16 @@
| 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 |
@@ -7836,14 +7702,6 @@
| 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 |
@@ -7855,366 +7713,6 @@
| 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 |
| 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 |

View File

@@ -1,4 +1,8 @@
missingOperand
| ir.cpp:1688:24:1690:5 | Store: Unknown literal | Instruction 'Store' is missing an expected operand with tag 'StoreValue' in function '$@'. | ir.cpp:1683:6:1683:20 | void captured_lambda(int, int&, int&&) | void captured_lambda(int, int&, int&&) |
| ir.cpp:1688:24:1690:5 | Store: Unknown literal | Instruction 'Store' is missing an expected operand with tag 'StoreValue' in function '$@'. | ir.cpp:1683:6:1683:20 | void captured_lambda(int, int&, int&&) | void captured_lambda(int, int&, int&&) |
| ir.cpp:1689:28:1689:54 | Store: Unknown literal | Instruction 'Store' is missing an expected operand with tag 'StoreValue' in function '$@'. | ir.cpp:1688:46:1688:46 | void (void captured_lambda(int, int&, int&&))::(lambda [] type at line 1688, col. 25)::operator()() const | void (void captured_lambda(int, int&, int&&))::(lambda [] type at line 1688, col. 25)::operator()() const |
| ir.cpp:1689:28:1689:54 | Store: Unknown literal | Instruction 'Store' is missing an expected operand with tag 'StoreValue' in function '$@'. | ir.cpp:1688:46:1688:46 | void (void captured_lambda(int, int&, int&&))::(lambda [] type at line 1688, col. 25)::operator()() const | void (void captured_lambda(int, int&, int&&))::(lambda [] type at line 1688, col. 25)::operator()() const |
unexpectedOperand
duplicateOperand
missingPhiOperand
@@ -7,6 +11,10 @@ duplicateChiOperand
sideEffectWithoutPrimary
instructionWithoutSuccessor
| ../../../include/memory.h:68:25:68:33 | CopyValue: (reference to) | Instruction 'CopyValue: (reference to)' has no successors in function '$@'. | ../../../include/memory.h:67:5:67:5 | void std::unique_ptr<int, std::default_delete<int>>::~unique_ptr() | void std::unique_ptr<int, std::default_delete<int>>::~unique_ptr() |
| ir.cpp:1688:24:1690:5 | FieldAddress: {...} | Instruction 'FieldAddress: {...}' has no successors in function '$@'. | ir.cpp:1683:6:1683:20 | void captured_lambda(int, int&, int&&) | void captured_lambda(int, int&, int&&) |
| ir.cpp:1688:24:1690:5 | FieldAddress: {...} | Instruction 'FieldAddress: {...}' has no successors in function '$@'. | ir.cpp:1683:6:1683:20 | void captured_lambda(int, int&, int&&) | void captured_lambda(int, int&, int&&) |
| ir.cpp:1689:28:1689:54 | FieldAddress: {...} | Instruction 'FieldAddress: {...}' has no successors in function '$@'. | ir.cpp:1688:46:1688:46 | void (void captured_lambda(int, int&, int&&))::(lambda [] type at line 1688, col. 25)::operator()() const | void (void captured_lambda(int, int&, int&&))::(lambda [] type at line 1688, col. 25)::operator()() const |
| ir.cpp:1689:28:1689:54 | FieldAddress: {...} | Instruction 'FieldAddress: {...}' has no successors in function '$@'. | ir.cpp:1688:46:1688:46 | void (void captured_lambda(int, int&, int&&))::(lambda [] type at line 1688, col. 25)::operator()() const | void (void captured_lambda(int, int&, int&&))::(lambda [] type at line 1688, col. 25)::operator()() const |
ambiguousSuccessors
unexplainedLoop
unnecessaryPhiInstruction
@@ -18,8 +26,25 @@ 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&) |
| ir.cpp:1683:34:1683:34 | Address | Operand 'Address' is not dominated by its definition in function '$@'. | ir.cpp:1683:6:1683:20 | void captured_lambda(int, int&, int&&) | void captured_lambda(int, int&, int&&) |
| ir.cpp:1683:43:1683:43 | Address | Operand 'Address' is not dominated by its definition in function '$@'. | ir.cpp:1683:6:1683:20 | void captured_lambda(int, int&, int&&) | void captured_lambda(int, int&, int&&) |
| ir.cpp:1688:10:1688:21 | Address | Operand 'Address' is not dominated by its definition in function '$@'. | ir.cpp:1683:6:1683:20 | void captured_lambda(int, int&, int&&) | void captured_lambda(int, int&, int&&) |
| ir.cpp:1688:24:1690:5 | Address | Operand 'Address' is not dominated by its definition in function '$@'. | ir.cpp:1683:6:1683:20 | void captured_lambda(int, int&, int&&) | void captured_lambda(int, int&, int&&) |
| ir.cpp:1688:24:1690:5 | Address | Operand 'Address' is not dominated by its definition in function '$@'. | ir.cpp:1683:6:1683:20 | void captured_lambda(int, int&, int&&) | void captured_lambda(int, int&, int&&) |
| ir.cpp:1688:24:1690:5 | Address | Operand 'Address' is not dominated by its definition in function '$@'. | ir.cpp:1683:6:1683:20 | void captured_lambda(int, int&, int&&) | void captured_lambda(int, int&, int&&) |
| ir.cpp:1688:24:1690:5 | Unary | Operand 'Unary' is not dominated by its definition in function '$@'. | ir.cpp:1683:6:1683:20 | void captured_lambda(int, int&, int&&) | void captured_lambda(int, int&, int&&) |
| ir.cpp:1688:24:1690:5 | Unary | Operand 'Unary' is not dominated by its definition in function '$@'. | ir.cpp:1683:6:1683:20 | void captured_lambda(int, int&, int&&) | void captured_lambda(int, int&, int&&) |
| ir.cpp:1688:24:1690:5 | Unary | Operand 'Unary' is not dominated by its definition in function '$@'. | ir.cpp:1683:6:1683:20 | void captured_lambda(int, int&, int&&) | void captured_lambda(int, int&, int&&) |
| ir.cpp:1688:24:1690:5 | Unary | Operand 'Unary' is not dominated by its definition in function '$@'. | ir.cpp:1683:6:1683:20 | void captured_lambda(int, int&, int&&) | void captured_lambda(int, int&, int&&) |
| ir.cpp:1688:46:1688:46 | Address | Operand 'Address' is not dominated by its definition in function '$@'. | ir.cpp:1688:46:1688:46 | void (void captured_lambda(int, int&, int&&))::(lambda [] type at line 1688, col. 25)::operator()() const | void (void captured_lambda(int, int&, int&&))::(lambda [] type at line 1688, col. 25)::operator()() const |
| ir.cpp:1689:14:1689:25 | Address | Operand 'Address' is not dominated by its definition in function '$@'. | ir.cpp:1688:46:1688:46 | void (void captured_lambda(int, int&, int&&))::(lambda [] type at line 1688, col. 25)::operator()() const | void (void captured_lambda(int, int&, int&&))::(lambda [] type at line 1688, col. 25)::operator()() const |
| ir.cpp:1689:28:1689:54 | Address | Operand 'Address' is not dominated by its definition in function '$@'. | ir.cpp:1688:46:1688:46 | void (void captured_lambda(int, int&, int&&))::(lambda [] type at line 1688, col. 25)::operator()() const | void (void captured_lambda(int, int&, int&&))::(lambda [] type at line 1688, col. 25)::operator()() const |
| ir.cpp:1689:28:1689:54 | Address | Operand 'Address' is not dominated by its definition in function '$@'. | ir.cpp:1688:46:1688:46 | void (void captured_lambda(int, int&, int&&))::(lambda [] type at line 1688, col. 25)::operator()() const | void (void captured_lambda(int, int&, int&&))::(lambda [] type at line 1688, col. 25)::operator()() const |
| ir.cpp:1689:28:1689:54 | Address | Operand 'Address' is not dominated by its definition in function '$@'. | ir.cpp:1688:46:1688:46 | void (void captured_lambda(int, int&, int&&))::(lambda [] type at line 1688, col. 25)::operator()() const | void (void captured_lambda(int, int&, int&&))::(lambda [] type at line 1688, col. 25)::operator()() const |
| ir.cpp:1689:28:1689:54 | Unary | Operand 'Unary' is not dominated by its definition in function '$@'. | ir.cpp:1688:46:1688:46 | void (void captured_lambda(int, int&, int&&))::(lambda [] type at line 1688, col. 25)::operator()() const | void (void captured_lambda(int, int&, int&&))::(lambda [] type at line 1688, col. 25)::operator()() const |
| ir.cpp:1689:28:1689:54 | Unary | Operand 'Unary' is not dominated by its definition in function '$@'. | ir.cpp:1688:46:1688:46 | void (void captured_lambda(int, int&, int&&))::(lambda [] type at line 1688, col. 25)::operator()() const | void (void captured_lambda(int, int&, int&&))::(lambda [] type at line 1688, col. 25)::operator()() const |
| ir.cpp:1689:28:1689:54 | Unary | Operand 'Unary' is not dominated by its definition in function '$@'. | ir.cpp:1688:46:1688:46 | void (void captured_lambda(int, int&, int&&))::(lambda [] type at line 1688, col. 25)::operator()() const | void (void captured_lambda(int, int&, int&&))::(lambda [] type at line 1688, col. 25)::operator()() const |
| ir.cpp:1689:28:1689:54 | Unary | Operand 'Unary' is not dominated by its definition in function '$@'. | ir.cpp:1688:46:1688:46 | void (void captured_lambda(int, int&, int&&))::(lambda [] type at line 1688, col. 25)::operator()() const | void (void captured_lambda(int, int&, int&&))::(lambda [] type at line 1688, col. 25)::operator()() const |
switchInstructionWithoutDefaultEdge
notMarkedAsConflated
wronglyMarkedAsConflated

View File

@@ -65,23 +65,21 @@ bad_asts.cpp:
# 19| r19_8(glval<int>) = FieldAddress[x] : mu19_5
# 19| r19_9(glval<Point &>) = VariableAddress[(unnamed parameter 0)] :
# 19| r19_10(Point &) = Load[(unnamed parameter 0)] : &:r19_9, ~m?
# 19| r19_11(glval<Point>) = CopyValue : r19_10
# 19| r19_12(glval<int>) = 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<int>) = FieldAddress[y] : mu19_5
# 19| r19_16(glval<Point &>) = VariableAddress[(unnamed parameter 0)] :
# 19| r19_17(Point &) = Load[(unnamed parameter 0)] : &:r19_16, ~m?
# 19| r19_18(glval<Point>) = CopyValue : r19_17
# 19| r19_19(glval<int>) = 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?
# 19| r19_11(glval<int>) = FieldAddress[x] : r19_10
# 19| r19_12(int) = Load[?] : &:r19_11, ~m?
# 19| mu19_13(int) = Store[?] : &:r19_8, r19_12
# 19| r19_14(glval<int>) = FieldAddress[y] : mu19_5
# 19| r19_15(glval<Point &>) = VariableAddress[(unnamed parameter 0)] :
# 19| r19_16(Point &) = Load[(unnamed parameter 0)] : &:r19_15, ~m?
# 19| r19_17(glval<int>) = FieldAddress[y] : r19_16
# 19| r19_18(int) = Load[?] : &:r19_17, ~m?
# 19| mu19_19(int) = Store[?] : &:r19_14, r19_18
# 19| v19_20(void) = NoOp :
# 19| v19_21(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 :
# 19| v19_22(void) = ReturnVoid :
# 19| v19_23(void) = AliasedUse : ~m?
# 19| v19_24(void) = ExitFunction :
# 22| void Bad::Point::Point()
# 22| Block 0
@@ -8079,65 +8077,57 @@ ir.cpp:
# 1486| r1486_8(glval<int>) = FieldAddress[i] : mu1486_5
# 1486| r1486_9(glval<StructuredBindingDataMemberStruct &>) = VariableAddress[(unnamed parameter 0)] :
# 1486| r1486_10(StructuredBindingDataMemberStruct &) = Load[(unnamed parameter 0)] : &:r1486_9, ~m?
# 1486| r1486_11(glval<StructuredBindingDataMemberStruct>) = CopyValue : r1486_10
# 1486| r1486_12(glval<int>) = 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<double>) = FieldAddress[d] : mu1486_5
# 1486| r1486_16(glval<StructuredBindingDataMemberStruct &>) = VariableAddress[(unnamed parameter 0)] :
# 1486| r1486_17(StructuredBindingDataMemberStruct &) = Load[(unnamed parameter 0)] : &:r1486_16, ~m?
# 1486| r1486_18(glval<StructuredBindingDataMemberStruct>) = CopyValue : r1486_17
# 1486| r1486_19(glval<double>) = 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<unsigned int>) = FieldAddress[b] : mu1486_5
# 1486| r1486_23(glval<StructuredBindingDataMemberStruct &>) = VariableAddress[(unnamed parameter 0)] :
# 1486| r1486_24(StructuredBindingDataMemberStruct &) = Load[(unnamed parameter 0)] : &:r1486_23, ~m?
# 1486| r1486_25(glval<StructuredBindingDataMemberStruct>) = CopyValue : r1486_24
# 1486| r1486_26(glval<unsigned int>) = 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<int &>) = FieldAddress[r] : mu1486_5
# 1486| r1486_30(glval<StructuredBindingDataMemberStruct &>) = VariableAddress[(unnamed parameter 0)] :
# 1486| r1486_31(StructuredBindingDataMemberStruct &) = Load[(unnamed parameter 0)] : &:r1486_30, ~m?
# 1486| r1486_32(glval<StructuredBindingDataMemberStruct>) = CopyValue : r1486_31
# 1486| r1486_33(glval<int &>) = 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<int *>) = FieldAddress[p] : mu1486_5
# 1486| r1486_37(glval<StructuredBindingDataMemberStruct &>) = VariableAddress[(unnamed parameter 0)] :
# 1486| r1486_38(StructuredBindingDataMemberStruct &) = Load[(unnamed parameter 0)] : &:r1486_37, ~m?
# 1486| r1486_39(glval<StructuredBindingDataMemberStruct>) = CopyValue : r1486_38
# 1486| r1486_40(glval<int *>) = 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<int[2]>) = FieldAddress[xs] : mu1486_5
# 1486| r1486_44(glval<StructuredBindingDataMemberStruct &>) = VariableAddress[(unnamed parameter 0)] :
# 1486| r1486_45(StructuredBindingDataMemberStruct &) = Load[(unnamed parameter 0)] : &:r1486_44, ~m?
# 1486| r1486_46(glval<StructuredBindingDataMemberStruct>) = CopyValue : r1486_45
# 1486| r1486_47(glval<int[2]>) = 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<int &>) = FieldAddress[r_alt] : mu1486_5
# 1486| r1486_11(glval<int>) = FieldAddress[i] : r1486_10
# 1486| r1486_12(int) = Load[?] : &:r1486_11, ~m?
# 1486| mu1486_13(int) = Store[?] : &:r1486_8, r1486_12
# 1486| r1486_14(glval<double>) = FieldAddress[d] : mu1486_5
# 1486| r1486_15(glval<StructuredBindingDataMemberStruct &>) = VariableAddress[(unnamed parameter 0)] :
# 1486| r1486_16(StructuredBindingDataMemberStruct &) = Load[(unnamed parameter 0)] : &:r1486_15, ~m?
# 1486| r1486_17(glval<double>) = FieldAddress[d] : r1486_16
# 1486| r1486_18(double) = Load[?] : &:r1486_17, ~m?
# 1486| mu1486_19(double) = Store[?] : &:r1486_14, r1486_18
# 1486| r1486_20(glval<unsigned int>) = FieldAddress[b] : mu1486_5
# 1486| r1486_21(glval<StructuredBindingDataMemberStruct &>) = VariableAddress[(unnamed parameter 0)] :
# 1486| r1486_22(StructuredBindingDataMemberStruct &) = Load[(unnamed parameter 0)] : &:r1486_21, ~m?
# 1486| r1486_23(glval<unsigned int>) = FieldAddress[b] : r1486_22
# 1486| r1486_24(unsigned int) = Load[?] : &:r1486_23, ~m?
# 1486| mu1486_25(unsigned int) = Store[?] : &:r1486_20, r1486_24
# 1486| r1486_26(glval<int &>) = FieldAddress[r] : mu1486_5
# 1486| r1486_27(glval<StructuredBindingDataMemberStruct &>) = VariableAddress[(unnamed parameter 0)] :
# 1486| r1486_28(StructuredBindingDataMemberStruct &) = Load[(unnamed parameter 0)] : &:r1486_27, ~m?
# 1486| r1486_29(glval<int &>) = FieldAddress[r] : r1486_28
# 1486| r1486_30(int &) = Load[?] : &:r1486_29, ~m?
# 1486| mu1486_31(int &) = Store[?] : &:r1486_26, r1486_30
# 1486| r1486_32(glval<int *>) = FieldAddress[p] : mu1486_5
# 1486| r1486_33(glval<StructuredBindingDataMemberStruct &>) = VariableAddress[(unnamed parameter 0)] :
# 1486| r1486_34(StructuredBindingDataMemberStruct &) = Load[(unnamed parameter 0)] : &:r1486_33, ~m?
# 1486| r1486_35(glval<int *>) = FieldAddress[p] : r1486_34
# 1486| r1486_36(int *) = Load[?] : &:r1486_35, ~m?
# 1486| mu1486_37(int *) = Store[?] : &:r1486_32, r1486_36
# 1486| r1486_38(glval<int[2]>) = FieldAddress[xs] : mu1486_5
# 1486| r1486_39(glval<StructuredBindingDataMemberStruct &>) = VariableAddress[(unnamed parameter 0)] :
# 1486| r1486_40(StructuredBindingDataMemberStruct &) = Load[(unnamed parameter 0)] : &:r1486_39, ~m?
# 1486| r1486_41(glval<int[2]>) = FieldAddress[xs] : r1486_40
# 1486| r1486_42(int[2]) = Load[?] : &:r1486_41, ~m?
# 1486| mu1486_43(int[2]) = Store[?] : &:r1486_38, r1486_42
# 1486| r1486_44(glval<int &>) = FieldAddress[r_alt] : mu1486_5
# 1486| r1486_45(glval<StructuredBindingDataMemberStruct &>) = VariableAddress[(unnamed parameter 0)] :
# 1486| r1486_46(StructuredBindingDataMemberStruct &) = Load[(unnamed parameter 0)] : &:r1486_45, ~m?
# 1486| r1486_47(glval<int &>) = FieldAddress[r_alt] : r1486_46
# 1486| r1486_48(int &) = Load[?] : &:r1486_47, ~m?
# 1486| mu1486_49(int &) = Store[?] : &:r1486_44, r1486_48
# 1486| r1486_50(glval<StructuredBindingDataMemberMemberStruct>) = FieldAddress[m] : mu1486_5
# 1486| r1486_51(glval<StructuredBindingDataMemberStruct &>) = VariableAddress[(unnamed parameter 0)] :
# 1486| r1486_52(StructuredBindingDataMemberStruct &) = Load[(unnamed parameter 0)] : &:r1486_51, ~m?
# 1486| r1486_53(glval<StructuredBindingDataMemberStruct>) = CopyValue : r1486_52
# 1486| r1486_54(glval<int &>) = 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<StructuredBindingDataMemberMemberStruct>) = FieldAddress[m] : mu1486_5
# 1486| r1486_58(glval<StructuredBindingDataMemberStruct &>) = VariableAddress[(unnamed parameter 0)] :
# 1486| r1486_59(StructuredBindingDataMemberStruct &) = Load[(unnamed parameter 0)] : &:r1486_58, ~m?
# 1486| r1486_60(glval<StructuredBindingDataMemberStruct>) = CopyValue : r1486_59
# 1486| r1486_61(glval<StructuredBindingDataMemberMemberStruct>) = 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?
# 1486| r1486_53(glval<StructuredBindingDataMemberMemberStruct>) = FieldAddress[m] : r1486_52
# 1486| r1486_54(StructuredBindingDataMemberMemberStruct) = Load[?] : &:r1486_53, ~m?
# 1486| mu1486_55(StructuredBindingDataMemberMemberStruct) = Store[?] : &:r1486_50, r1486_54
# 1486| v1486_56(void) = NoOp :
# 1486| v1486_57(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 :
# 1486| v1486_58(void) = ReturnVoid :
# 1486| v1486_59(void) = AliasedUse : ~m?
# 1486| v1486_60(void) = ExitFunction :
# 1499| void data_member_structured_binding()
# 1499| Block 0
@@ -8335,30 +8325,27 @@ ir.cpp:
# 1539| r1539_8(glval<int>) = FieldAddress[i] : mu1539_5
# 1539| r1539_9(glval<StructuredBindingTupleRefGet &>) = VariableAddress[(unnamed parameter 0)] :
# 1539| r1539_10(StructuredBindingTupleRefGet &) = Load[(unnamed parameter 0)] : &:r1539_9, ~m?
# 1539| r1539_11(glval<StructuredBindingTupleRefGet>) = CopyValue : r1539_10
# 1539| r1539_12(glval<int>) = 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<double>) = FieldAddress[d] : mu1539_5
# 1539| r1539_16(glval<StructuredBindingTupleRefGet &>) = VariableAddress[(unnamed parameter 0)] :
# 1539| r1539_17(StructuredBindingTupleRefGet &) = Load[(unnamed parameter 0)] : &:r1539_16, ~m?
# 1539| r1539_18(glval<StructuredBindingTupleRefGet>) = CopyValue : r1539_17
# 1539| r1539_19(glval<double>) = 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<int &>) = FieldAddress[r] : mu1539_5
# 1539| r1539_23(glval<StructuredBindingTupleRefGet &>) = VariableAddress[(unnamed parameter 0)] :
# 1539| r1539_24(StructuredBindingTupleRefGet &) = Load[(unnamed parameter 0)] : &:r1539_23, ~m?
# 1539| r1539_25(glval<StructuredBindingTupleRefGet>) = CopyValue : r1539_24
# 1539| r1539_26(glval<int &>) = 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?
# 1539| r1539_11(glval<int>) = FieldAddress[i] : r1539_10
# 1539| r1539_12(int) = Load[?] : &:r1539_11, ~m?
# 1539| mu1539_13(int) = Store[?] : &:r1539_8, r1539_12
# 1539| r1539_14(glval<double>) = FieldAddress[d] : mu1539_5
# 1539| r1539_15(glval<StructuredBindingTupleRefGet &>) = VariableAddress[(unnamed parameter 0)] :
# 1539| r1539_16(StructuredBindingTupleRefGet &) = Load[(unnamed parameter 0)] : &:r1539_15, ~m?
# 1539| r1539_17(glval<double>) = FieldAddress[d] : r1539_16
# 1539| r1539_18(double) = Load[?] : &:r1539_17, ~m?
# 1539| mu1539_19(double) = Store[?] : &:r1539_14, r1539_18
# 1539| r1539_20(glval<int &>) = FieldAddress[r] : mu1539_5
# 1539| r1539_21(glval<StructuredBindingTupleRefGet &>) = VariableAddress[(unnamed parameter 0)] :
# 1539| r1539_22(StructuredBindingTupleRefGet &) = Load[(unnamed parameter 0)] : &:r1539_21, ~m?
# 1539| r1539_23(glval<int &>) = FieldAddress[r] : r1539_22
# 1539| r1539_24(int &) = Load[?] : &:r1539_23, ~m?
# 1539| mu1539_25(int &) = Store[?] : &:r1539_20, r1539_24
# 1539| v1539_26(void) = NoOp :
# 1539| v1539_27(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 :
# 1539| v1539_28(void) = ReturnVoid :
# 1539| v1539_29(void) = AliasedUse : ~m?
# 1539| v1539_30(void) = ExitFunction :
# 1567| std::tuple_element<int 0, StructuredBindingTupleRefGet>::type& StructuredBindingTupleRefGet::get<int 0>()
# 1567| Block 0
@@ -8901,86 +8888,81 @@ ir.cpp:
# 1688| r1688_2(glval<decltype([...](...){...})>) = VariableAddress[#temp1688:24] :
# 1688| mu1688_3(decltype([...](...){...})) = Uninitialized[#temp1688:24] : &:r1688_2
# 1688| r1688_4(glval<CapturedLambdaMyObj>) = FieldAddress[obj1] : r1688_2
# 1688| r1688_5(glval<CapturedLambdaMyObj &>) = 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<CapturedLambdaMyObj>) = FieldAddress[obj2] : r1688_2
# 1688| r1688_8(glval<CapturedLambdaMyObj>) = VariableAddress[obj2] :
# 1688| r1688_9(CapturedLambdaMyObj) = Load[obj2] : &:r1688_8, ~m?
# 1688| mu1688_10(CapturedLambdaMyObj) = Store[?] : &:r1688_7, r1688_9
# 1688| r1688_11(glval<int>) = FieldAddress[x] : r1688_2
# 1688| r1688_12(glval<int>) = VariableAddress[x] :
# 1688| r1688_13(int) = Load[x] : &:r1688_12, ~m?
# 1688| mu1688_14(int) = Store[?] : &:r1688_11, r1688_13
# 1688| r1688_15(glval<int>) = FieldAddress[y] : r1688_2
# 1688| r1688_16(glval<int &>) = 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<int>) = FieldAddress[z] : r1688_2
# 1688| r1688_19(glval<int &&>) = 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| Block 1
# 1688| mu1688_5(CapturedLambdaMyObj) = Store[?] : &:r1688_4
# 1688| r1688_6(glval<CapturedLambdaMyObj>) = FieldAddress[obj2] : r1688_2
# 1688| Block 2
# 1688| mu1688_7(CapturedLambdaMyObj) = Store[?] : &:r1688_6
# 1688| r1688_8(glval<int>) = FieldAddress[x] : r1688_2
# 1688| r1688_9(glval<int>) = VariableAddress[x] :
# 1688| r1688_10(int) = Load[x] : &:r1688_9, ~m?
# 1688| mu1688_11(int) = Store[?] : &:r1688_8, r1688_10
# 1688| r1688_12(glval<int>) = FieldAddress[y] : r1688_2
# 1688| r1688_13(glval<int &>) = VariableAddress[y] :
# 1688| r1688_14(int &) = Load[y] : &:r1688_13, ~m?
# 1690| r1690_1(int) = Load[?] : &:r1688_14, ~m?
# 1690| mu1690_2(int) = Store[?] : &:r1688_12, r1690_1
# 1688| r1688_15(glval<int>) = FieldAddress[z] : r1688_2
# 1688| r1688_16(glval<int &&>) = VariableAddress[z] :
# 1688| r1688_17(int &&) = Load[z] : &:r1688_16, ~m?
# 1690| r1690_3(int) = Load[?] : &:r1688_17, ~m?
# 1690| mu1690_4(int) = Store[?] : &:r1688_15, r1690_3
# 1688| r1688_18(decltype([...](...){...})) = Load[#temp1688:24] : &:r1688_2, ~m?
# 1688| mu1688_19(decltype([...](...){...})) = Store[lambda_outer] : &:r1688_1, r1688_18
# 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<unknown>) = VariableAddress[#this] :
# 1688| mu1688_5(glval<decltype([...](...){...})>) = InitializeParameter[#this] : &:r1688_4
# 1688| r1688_6(glval<decltype([...](...){...})>) = Load[#this] : &:r1688_4, ~m?
# 1688| mu1688_7(decltype([...](...){...})) = InitializeIndirection[#this] : &:r1688_6
# 1689| r1689_1(glval<decltype([...](...){...})>) = VariableAddress[lambda_inner] :
# 1689| r1689_2(glval<decltype([...](...){...})>) = VariableAddress[#temp1689:28] :
# 1689| mu1689_3(decltype([...](...){...})) = Uninitialized[#temp1689:28] : &:r1689_2
# 1689| r1689_4(glval<CapturedLambdaMyObj>) = FieldAddress[obj1] : r1689_2
# 1689| r1689_5(glval<unknown>) = VariableAddress[#this] :
# 1689| r1689_6(lambda [] type at line 1689, col. 29 *) = Load[#this] : &:r1689_5, ~m?
# 1689| r1689_7(glval<CapturedLambdaMyObj>) = 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<CapturedLambdaMyObj>) = FieldAddress[obj2] : r1689_2
# 1689| r1689_11(glval<unknown>) = VariableAddress[#this] :
# 1689| r1689_12(lambda [] type at line 1689, col. 29 *) = Load[#this] : &:r1689_11, ~m?
# 1689| r1689_13(glval<CapturedLambdaMyObj>) = 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<int>) = FieldAddress[x] : r1689_2
# 1689| r1689_17(glval<unknown>) = VariableAddress[#this] :
# 1689| r1689_18(lambda [] type at line 1688, col. 25 *) = Load[#this] : &:r1689_17, ~m?
# 1689| r1689_19(glval<int>) = 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<int>) = FieldAddress[y] : r1689_2
# 1689| r1689_23(glval<unknown>) = VariableAddress[#this] :
# 1689| r1689_24(lambda [] type at line 1688, col. 25 *) = Load[#this] : &:r1689_23, ~m?
# 1689| r1689_25(glval<int>) = 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<int>) = FieldAddress[z] : r1689_2
# 1689| r1689_29(glval<unknown>) = VariableAddress[#this] :
# 1689| r1689_30(lambda [] type at line 1688, col. 25 *) = Load[#this] : &:r1689_29, ~m?
# 1689| r1689_31(glval<int>) = 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 :
# 1688| v1688_1(void) = EnterFunction :
# 1688| mu1688_2(unknown) = AliasedDefinition :
# 1688| mu1688_3(unknown) = InitializeNonLocal :
# 1688| r1688_4(glval<unknown>) = VariableAddress[#this] :
# 1688| mu1688_5(glval<decltype([...](...){...})>) = InitializeParameter[#this] : &:r1688_4
# 1688| r1688_6(glval<decltype([...](...){...})>) = Load[#this] : &:r1688_4, ~m?
# 1688| mu1688_7(decltype([...](...){...})) = InitializeIndirection[#this] : &:r1688_6
# 1689| r1689_1(glval<decltype([...](...){...})>) = VariableAddress[lambda_inner] :
# 1689| r1689_2(glval<decltype([...](...){...})>) = VariableAddress[#temp1689:28] :
# 1689| mu1689_3(decltype([...](...){...})) = Uninitialized[#temp1689:28] : &:r1689_2
# 1689| r1689_4(glval<CapturedLambdaMyObj>) = FieldAddress[obj1] : r1689_2
# 1689| Block 1
# 1689| mu1689_5(CapturedLambdaMyObj) = Store[?] : &:r1689_4
# 1689| r1689_6(glval<CapturedLambdaMyObj>) = FieldAddress[obj2] : r1689_2
# 1689| Block 2
# 1689| mu1689_7(CapturedLambdaMyObj) = Store[?] : &:r1689_6
# 1689| r1689_8(glval<int>) = FieldAddress[x] : r1689_2
# 1689| r1689_9(glval<unknown>) = VariableAddress[#this] :
# 1689| r1689_10(lambda [] type at line 1688, col. 25 *) = Load[#this] : &:r1689_9, ~m?
# 1689| r1689_11(glval<int>) = FieldAddress[x] : r1689_10
# 1689| r1689_12(int) = Load[?] : &:r1689_11, ~m?
# 1689| mu1689_13(int) = Store[?] : &:r1689_8, r1689_12
# 1689| r1689_14(glval<int>) = FieldAddress[y] : r1689_2
# 1689| r1689_15(glval<unknown>) = VariableAddress[#this] :
# 1689| r1689_16(lambda [] type at line 1688, col. 25 *) = Load[#this] : &:r1689_15, ~m?
# 1689| r1689_17(glval<int>) = FieldAddress[y] : r1689_16
# 1689| r1689_18(int) = Load[?] : &:r1689_17, ~m?
# 1689| mu1689_19(int) = Store[?] : &:r1689_14, r1689_18
# 1689| r1689_20(glval<int>) = FieldAddress[z] : r1689_2
# 1689| r1689_21(glval<unknown>) = VariableAddress[#this] :
# 1689| r1689_22(lambda [] type at line 1688, col. 25 *) = Load[#this] : &:r1689_21, ~m?
# 1689| r1689_23(glval<int>) = FieldAddress[z] : r1689_22
# 1689| r1689_24(int) = Load[?] : &:r1689_23, ~m?
# 1689| mu1689_25(int) = Store[?] : &:r1689_20, r1689_24
# 1689| r1689_26(decltype([...](...){...})) = Load[#temp1689:28] : &:r1689_2, ~m?
# 1689| mu1689_27(decltype([...](...){...})) = Store[lambda_inner] : &:r1689_1, r1689_26
# 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
@@ -9017,407 +8999,6 @@ ir.cpp:
# 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<unknown>) = VariableAddress[#this] :
# 1701| mu1701_5(glval<TrivialLambdaClass>) = InitializeParameter[#this] : &:r1701_4
# 1701| r1701_6(glval<TrivialLambdaClass>) = Load[#this] : &:r1701_4, ~m?
# 1701| mu1701_7(TrivialLambdaClass) = InitializeIndirection[#this] : &:r1701_6
# 1702| r1702_1(glval<decltype([...](...){...})>) = VariableAddress[l_m_outer] :
# 1702| r1702_2(glval<decltype([...](...){...})>) = VariableAddress[#temp1702:25] :
# 1702| mu1702_3(decltype([...](...){...})) = Uninitialized[#temp1702:25] : &:r1702_2
# 1702| r1702_4(glval<TrivialLambdaClass>) = FieldAddress[(captured this)] : r1702_2
# 1702| r1702_5(glval<unknown>) = 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<unknown>) = VariableAddress[#this] :
# 1702| mu1702_5(glval<decltype([...](...){...})>) = InitializeParameter[#this] : &:r1702_4
# 1702| r1702_6(glval<decltype([...](...){...})>) = Load[#this] : &:r1702_4, ~m?
# 1702| mu1702_7(decltype([...](...){...})) = InitializeIndirection[#this] : &:r1702_6
# 1703| r1703_1(glval<unknown>) = VariableAddress[#this] :
# 1703| r1703_2(lambda [] type at line 1702, col. 26 *) = Load[#this] : &:r1703_1, ~m?
# 1703| r1703_3(glval<TrivialLambdaClass>) = FieldAddress[(captured this)] : r1703_2
# 1703| r1703_4(TrivialLambdaClass *) = CopyValue : r1703_3
# 1703| r1703_5(glval<unknown>) = 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<decltype([...](...){...})>) = VariableAddress[l_m_inner] :
# 1705| r1705_2(glval<decltype([...](...){...})>) = VariableAddress[#temp1705:29] :
# 1705| mu1705_3(decltype([...](...){...})) = Uninitialized[#temp1705:29] : &:r1705_2
# 1705| r1705_4(glval<TrivialLambdaClass>) = FieldAddress[(captured this)] : r1705_2
# 1705| r1705_5(glval<unknown>) = VariableAddress[#this] :
# 1705| r1705_6(lambda [] type at line 1705, col. 30 *) = Load[#this] : &:r1705_5, ~m?
# 1705| r1705_7(glval<TrivialLambdaClass>) = 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<unknown>) = VariableAddress[#this] :
# 1705| mu1705_5(glval<decltype([...](...){...})>) = InitializeParameter[#this] : &:r1705_4
# 1705| r1705_6(glval<decltype([...](...){...})>) = Load[#this] : &:r1705_4, ~m?
# 1705| mu1705_7(decltype([...](...){...})) = InitializeIndirection[#this] : &:r1705_6
# 1706| r1706_1(glval<unknown>) = VariableAddress[#this] :
# 1706| r1706_2(lambda [] type at line 1705, col. 30 *) = Load[#this] : &:r1706_1, ~m?
# 1706| r1706_3(glval<TrivialLambdaClass>) = FieldAddress[(captured this)] : r1706_2
# 1706| r1706_4(TrivialLambdaClass *) = CopyValue : r1706_3
# 1706| r1706_5(glval<unknown>) = 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<TrivialLambdaClass>) = VariableAddress[p1] :
# 1712| mu1712_5(TrivialLambdaClass) = InitializeParameter[p1] : &:r1712_4
# 1712| r1712_6(glval<TrivialLambdaClass &>) = 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<TrivialLambdaClass &&>) = 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<TrivialLambdaClass>) = VariableAddress[l1] :
# 1713| mu1713_2(TrivialLambdaClass) = Uninitialized[l1] : &:r1713_1
# 1714| r1714_1(glval<TrivialLambdaClass &>) = VariableAddress[l2] :
# 1714| r1714_2(glval<TrivialLambdaClass>) = VariableAddress[#temp1714:36] :
# 1714| r1714_3(glval<TrivialLambdaClass>) = 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<TrivialLambdaClass>) = Convert : r1714_2
# 1714| r1714_9(TrivialLambdaClass &) = CopyValue : r1714_8
# 1714| mu1714_10(TrivialLambdaClass &) = Store[l2] : &:r1714_1, r1714_9
# 1716| r1716_1(glval<decltype([...](...){...})>) = VariableAddress[l_outer1] :
# 1716| r1716_2(glval<decltype([...](...){...})>) = VariableAddress[#temp1716:20] :
# 1716| mu1716_3(decltype([...](...){...})) = Uninitialized[#temp1716:20] : &:r1716_2
# 1716| r1716_4(glval<TrivialLambdaClass>) = FieldAddress[p1] : r1716_2
# 1716| r1716_5(glval<TrivialLambdaClass>) = VariableAddress[p1] :
# 1716| r1716_6(TrivialLambdaClass) = Load[p1] : &:r1716_5, ~m?
# 1716| mu1716_7(TrivialLambdaClass) = Store[?] : &:r1716_4, r1716_6
# 1716| r1716_8(glval<TrivialLambdaClass>) = FieldAddress[p2] : r1716_2
# 1716| r1716_9(glval<TrivialLambdaClass &>) = 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<TrivialLambdaClass>) = FieldAddress[p3] : r1716_2
# 1716| r1716_12(glval<TrivialLambdaClass &&>) = 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<TrivialLambdaClass>) = FieldAddress[l1] : r1716_2
# 1716| r1716_15(glval<TrivialLambdaClass>) = VariableAddress[l1] :
# 1716| r1716_16(TrivialLambdaClass) = Load[l1] : &:r1716_15, ~m?
# 1716| mu1716_17(TrivialLambdaClass) = Store[?] : &:r1716_14, r1716_16
# 1716| r1716_18(glval<TrivialLambdaClass>) = FieldAddress[l2] : r1716_2
# 1716| r1716_19(glval<TrivialLambdaClass &>) = 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<unknown>) = VariableAddress[#this] :
# 1716| mu1716_5(glval<decltype([...](...){...})>) = InitializeParameter[#this] : &:r1716_4
# 1716| r1716_6(glval<decltype([...](...){...})>) = Load[#this] : &:r1716_4, ~m?
# 1716| mu1716_7(decltype([...](...){...})) = InitializeIndirection[#this] : &:r1716_6
# 1717| r1717_1(glval<decltype([...](...){...})>) = VariableAddress[l_inner1] :
# 1717| r1717_2(glval<decltype([...](...){...})>) = VariableAddress[#temp1717:24] :
# 1717| mu1717_3(decltype([...](...){...})) = Uninitialized[#temp1717:24] : &:r1717_2
# 1717| r1717_4(glval<TrivialLambdaClass>) = FieldAddress[p1] : r1717_2
# 1717| r1717_5(glval<unknown>) = VariableAddress[#this] :
# 1717| r1717_6(lambda [] type at line 1717, col. 25 *) = Load[#this] : &:r1717_5, ~m?
# 1717| r1717_7(glval<TrivialLambdaClass>) = 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<unknown>) = VariableAddress[#this] :
# 1717| mu1717_5(glval<decltype([...](...){...})>) = InitializeParameter[#this] : &:r1717_4
# 1717| r1717_6(glval<decltype([...](...){...})>) = 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<unknown>) = VariableAddress[#this] :
# 1724| mu1724_5(glval<CopyConstructorWithImplicitArgumentClass>) = InitializeParameter[#this] : &:r1724_4
# 1724| r1724_6(glval<CopyConstructorWithImplicitArgumentClass>) = 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<unknown>) = VariableAddress[#this] :
# 1725| mu1725_5(glval<CopyConstructorWithImplicitArgumentClass>) = InitializeParameter[#this] : &:r1725_4
# 1725| r1725_6(glval<CopyConstructorWithImplicitArgumentClass>) = Load[#this] : &:r1725_4, ~m?
# 1725| mu1725_7(CopyConstructorWithImplicitArgumentClass) = InitializeIndirection[#this] : &:r1725_6
# 1725| r1725_8(glval<CopyConstructorWithImplicitArgumentClass &>) = 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<CopyConstructorWithImplicitArgumentClass &>) = VariableAddress[c] :
# 1726| r1726_2(CopyConstructorWithImplicitArgumentClass &) = Load[c] : &:r1726_1, ~m?
# 1726| r1726_3(glval<CopyConstructorWithImplicitArgumentClass>) = CopyValue : r1726_2
# 1726| r1726_4(glval<int>) = FieldAddress[x] : r1726_3
# 1726| r1726_5(int) = Load[?] : &:r1726_4, ~m?
# 1726| r1726_6(glval<unknown>) = VariableAddress[#this] :
# 1726| r1726_7(CopyConstructorWithImplicitArgumentClass *) = Load[#this] : &:r1726_6, ~m?
# 1726| r1726_8(glval<int>) = 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<unknown>) = VariableAddress[#this] :
# 1733| mu1733_5(glval<CopyConstructorWithBitwiseCopyClass>) = InitializeParameter[#this] : &:r1733_4
# 1733| r1733_6(glval<CopyConstructorWithBitwiseCopyClass>) = 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<unknown>) = VariableAddress[#this] :
# 1736| mu1736_5(glval<CopyConstructorTestNonVirtualClass>) = InitializeParameter[#this] : &:r1736_4
# 1736| r1736_6(glval<CopyConstructorTestNonVirtualClass>) = Load[#this] : &:r1736_4, ~m?
# 1736| mu1736_7(CopyConstructorTestNonVirtualClass) = InitializeIndirection[#this] : &:r1736_6
#-----| r0_1(glval<CopyConstructorTestNonVirtualClass &>) = 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<CopyConstructorWithImplicitArgumentClass>) = ConvertToNonVirtualBase[CopyConstructorTestNonVirtualClass : CopyConstructorWithImplicitArgumentClass] : mu1736_5
# 1736| r1736_9(glval<unknown>) = FunctionAddress[CopyConstructorWithImplicitArgumentClass] :
# 1736| r1736_10(glval<CopyConstructorTestNonVirtualClass &>) = VariableAddress[(unnamed parameter 0)] :
# 1736| r1736_11(CopyConstructorTestNonVirtualClass &) = Load[(unnamed parameter 0)] : &:r1736_10, ~m?
# 1736| r1736_12(glval<CopyConstructorTestNonVirtualClass>) = CopyValue : r1736_11
# 1736| r1736_13(glval<CopyConstructorWithImplicitArgumentClass>) = 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<unknown>) = VariableAddress[#this] :
# 1740| mu1740_5(glval<CopyConstructorTestNonVirtualClass>) = InitializeParameter[#this] : &:r1740_4
# 1740| r1740_6(glval<CopyConstructorTestNonVirtualClass>) = Load[#this] : &:r1740_4, ~m?
# 1740| mu1740_7(CopyConstructorTestNonVirtualClass) = InitializeIndirection[#this] : &:r1740_6
# 1740| r1740_8(glval<CopyConstructorWithImplicitArgumentClass>) = ConvertToNonVirtualBase[CopyConstructorTestNonVirtualClass : CopyConstructorWithImplicitArgumentClass] : mu1740_5
# 1740| r1740_9(glval<unknown>) = 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<CopyConstructorWithBitwiseCopyClass>) = ConvertToNonVirtualBase[CopyConstructorTestNonVirtualClass : CopyConstructorWithBitwiseCopyClass] : mu1740_5
# 1740| r1740_14(glval<unknown>) = 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<unknown>) = VariableAddress[#this] :
# 1743| mu1743_5(glval<CopyConstructorTestVirtualClass>) = InitializeParameter[#this] : &:r1743_4
# 1743| r1743_6(glval<CopyConstructorTestVirtualClass>) = Load[#this] : &:r1743_4, ~m?
# 1743| mu1743_7(CopyConstructorTestVirtualClass) = InitializeIndirection[#this] : &:r1743_6
#-----| r0_1(glval<CopyConstructorTestVirtualClass &>) = 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<CopyConstructorWithImplicitArgumentClass>) = ConvertToNonVirtualBase[CopyConstructorTestVirtualClass : CopyConstructorWithImplicitArgumentClass] : mu1743_5
# 1743| r1743_9(glval<unknown>) = FunctionAddress[CopyConstructorWithImplicitArgumentClass] :
# 1743| r1743_10(glval<CopyConstructorTestVirtualClass &>) = VariableAddress[(unnamed parameter 0)] :
# 1743| r1743_11(CopyConstructorTestVirtualClass &) = Load[(unnamed parameter 0)] : &:r1743_10, ~m?
# 1743| r1743_12(glval<CopyConstructorTestVirtualClass>) = CopyValue : r1743_11
# 1743| r1743_13(glval<CopyConstructorWithImplicitArgumentClass>) = 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<unknown>) = VariableAddress[#this] :
# 1747| mu1747_5(glval<CopyConstructorTestVirtualClass>) = InitializeParameter[#this] : &:r1747_4
# 1747| r1747_6(glval<CopyConstructorTestVirtualClass>) = Load[#this] : &:r1747_4, ~m?
# 1747| mu1747_7(CopyConstructorTestVirtualClass) = InitializeIndirection[#this] : &:r1747_6
# 1747| r1747_8(glval<CopyConstructorWithImplicitArgumentClass>) = ConvertToNonVirtualBase[CopyConstructorTestVirtualClass : CopyConstructorWithImplicitArgumentClass] : mu1747_5
# 1747| r1747_9(glval<unknown>) = 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<CopyConstructorWithBitwiseCopyClass>) = ConvertToNonVirtualBase[CopyConstructorTestVirtualClass : CopyConstructorWithBitwiseCopyClass] : mu1747_5
# 1747| r1747_14(glval<unknown>) = 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<CopyConstructorTestNonVirtualClass &>) = 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<CopyConstructorTestVirtualClass &>) = 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<CopyConstructorTestNonVirtualClass>) = VariableAddress[cx] :
# 1753| mu1753_2(CopyConstructorTestNonVirtualClass) = Uninitialized[cx] : &:r1753_1
# 1753| r1753_3(glval<unknown>) = FunctionAddress[CopyConstructorTestNonVirtualClass] :
# 1753| r1753_4(glval<CopyConstructorTestNonVirtualClass &>) = VariableAddress[x] :
# 1753| r1753_5(CopyConstructorTestNonVirtualClass &) = Load[x] : &:r1753_4, ~m?
# 1753| r1753_6(glval<CopyConstructorTestNonVirtualClass>) = 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<CopyConstructorTestVirtualClass>) = VariableAddress[cy] :
# 1754| mu1754_2(CopyConstructorTestVirtualClass) = Uninitialized[cy] : &:r1754_1
# 1754| r1754_3(glval<unknown>) = FunctionAddress[CopyConstructorTestVirtualClass] :
# 1754| r1754_4(glval<CopyConstructorTestVirtualClass &>) = VariableAddress[y] :
# 1754| r1754_5(CopyConstructorTestVirtualClass &) = Load[y] : &:r1754_4, ~m?
# 1754| r1754_6(glval<CopyConstructorTestVirtualClass>) = 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<int>) = VariableAddress[#return] :
# 1750| v1750_5(void) = ReturnValue : &:r1750_4, ~m?
# 1750| v1750_6(void) = AliasedUse : ~m?
# 1750| v1750_7(void) = ExitFunction :
perf-regression.cpp:
# 6| void Big::Big()
# 6| Block 0

View File

@@ -6,6 +6,8 @@ missingOperandType
duplicateChiOperand
sideEffectWithoutPrimary
instructionWithoutSuccessor
| ir.cpp:1688:24:1690:5 | FieldAddress: {...} | Instruction 'FieldAddress: {...}' has no successors in function '$@'. | ir.cpp:1683:6:1683:20 | void captured_lambda(int, int&, int&&) | void captured_lambda(int, int&, int&&) |
| ir.cpp:1689:28:1689:54 | FieldAddress: {...} | Instruction 'FieldAddress: {...}' has no successors in function '$@'. | ir.cpp:1688:46:1688:46 | void (void captured_lambda(int, int&, int&&))::(lambda [] type at line 1688, col. 25)::operator()() const | void (void captured_lambda(int, int&, int&&))::(lambda [] type at line 1688, col. 25)::operator()() const |
ambiguousSuccessors
unexplainedLoop
unnecessaryPhiInstruction

View File

@@ -6,6 +6,8 @@ missingOperandType
duplicateChiOperand
sideEffectWithoutPrimary
instructionWithoutSuccessor
| ir.cpp:1688:24:1690:5 | FieldAddress: {...} | Instruction 'FieldAddress: {...}' has no successors in function '$@'. | ir.cpp:1683:6:1683:20 | void captured_lambda(int, int&, int&&) | void captured_lambda(int, int&, int&&) |
| ir.cpp:1689:28:1689:54 | FieldAddress: {...} | Instruction 'FieldAddress: {...}' has no successors in function '$@'. | ir.cpp:1688:46:1688:46 | void (void captured_lambda(int, int&, int&&))::(lambda [] type at line 1688, col. 25)::operator()() const | void (void captured_lambda(int, int&, int&&))::(lambda [] type at line 1688, col. 25)::operator()() const |
ambiguousSuccessors
unexplainedLoop
unnecessaryPhiInstruction

View File

@@ -122,8 +122,6 @@
| 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) |
@@ -186,7 +184,6 @@
| 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) |

View File

@@ -123,4 +123,3 @@ 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. |

View File

@@ -163,16 +163,3 @@ 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:
// ...
}
}

View File

@@ -7,7 +7,6 @@ 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 |
@@ -30,7 +29,6 @@ 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. |

View File

@@ -92,12 +92,6 @@ 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 |
@@ -227,30 +221,6 @@ 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 |
@@ -284,21 +254,3 @@ 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 |

View File

@@ -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); // BAD
fprintf(log, "accountkey = %s\n", s.accountkey); // DUBIOUS [NOT REPORTED]
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
}
}
}

View File

@@ -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,106 +474,3 @@ 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
}

View File

@@ -1,5 +1,5 @@
name: codeql/csharp-downgrades
groups: csharp
version: 0.1.0-dev
version: 0.0.6-dev
downgrades: .
library: true

View File

@@ -1,7 +1,3 @@
## 1.0.7
## 1.0.6
## 1.0.5
## 1.0.4

View File

@@ -1,2 +1,2 @@
---
lastReleaseVersion: 1.0.7
lastReleaseVersion: 1.0.5

View File

@@ -1,8 +1,8 @@
name: codeql/csharp-solorigate-all
version: 1.1.0-dev
version: 1.0.6-dev
groups:
- csharp
- solorigate
library: true
dependencies:
codeql/csharp-all: "*"
codeql/csharp-all: ~0.0.3

View File

@@ -1,7 +1,3 @@
## 1.0.7
## 1.0.6
## 1.0.5
## 1.0.4

View File

@@ -1,2 +1,2 @@
---
lastReleaseVersion: 1.0.7
lastReleaseVersion: 1.0.5

View File

@@ -1,9 +1,9 @@
name: codeql/csharp-solorigate-queries
version: 1.1.0-dev
version: 1.0.6-dev
groups:
- csharp
- solorigate
defaultSuiteFile: codeql-suites/solorigate.qls
dependencies:
codeql/csharp-all: "*"
codeql/csharp-solorigate-all: "*"
codeql/csharp-all: ~0.0.3
codeql/csharp-solorigate-all: ^1.0

View File

@@ -1,24 +1,3 @@
## 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

View File

@@ -0,0 +1,4 @@
---
category: minorAnalysis
---
* All deprecated predicates/classes/modules that have been deprecated for over a year have been deleted.

View File

@@ -0,0 +1,5 @@
---
category: deprecated
---
* 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.

View File

@@ -0,0 +1,4 @@
---
category: feature
---
* 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.

View File

@@ -0,0 +1,4 @@
---
category: breaking
---
* 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.

View File

@@ -1,18 +0,0 @@
## 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.

View File

@@ -1 +0,0 @@
## 0.0.13

View File

@@ -1,2 +1,2 @@
---
lastReleaseVersion: 0.0.13
lastReleaseVersion: 0.0.11

View File

@@ -1,5 +1,5 @@
name: codeql/csharp-all
version: 0.1.0-dev
version: 0.0.12-dev
groups: csharp
dbscheme: semmlecode.csharp.dbscheme
extractor: csharp

View File

@@ -460,11 +460,6 @@ 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. */

View File

@@ -162,17 +162,10 @@ 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, boolean generated
string output, string kind
) {
exists(string row |
sourceModel(row) and
@@ -184,14 +177,14 @@ predicate sourceModel(
row.splitAt(";", 4) = signature and
row.splitAt(";", 5) = ext and
row.splitAt(";", 6) = output and
exists(string k | row.splitAt(";", 7) = k and getKind(k, kind, generated))
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, boolean generated
string input, string kind
) {
exists(string row |
sinkModel(row) and
@@ -203,14 +196,14 @@ predicate sinkModel(
row.splitAt(";", 4) = signature and
row.splitAt(";", 5) = ext and
row.splitAt(";", 6) = input and
exists(string k | row.splitAt(";", 7) = k and getKind(k, kind, generated))
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, boolean generated
string input, string output, string kind
) {
exists(string row |
summaryModel(row) and
@@ -223,14 +216,14 @@ predicate summaryModel(
row.splitAt(";", 5) = ext and
row.splitAt(";", 6) = input and
row.splitAt(";", 7) = output and
exists(string k | row.splitAt(";", 8) = k and getKind(k, kind, generated))
row.splitAt(";", 8) = kind
)
}
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) {
@@ -258,25 +251,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, boolean generated |
string ext, string output |
canonicalNamespaceLink(namespace, subns) and
sourceModel(subns, type, subtypes, name, signature, ext, output, kind, generated)
sourceModel(subns, type, subtypes, name, signature, ext, output, kind)
)
or
part = "sink" and
n =
strictcount(string subns, string type, boolean subtypes, string name, string signature,
string ext, string input, boolean generated |
string ext, string input |
canonicalNamespaceLink(namespace, subns) and
sinkModel(subns, type, subtypes, name, signature, ext, input, kind, generated)
sinkModel(subns, type, subtypes, name, signature, ext, input, kind)
)
or
part = "summary" and
n =
strictcount(string subns, string type, boolean subtypes, string name, string signature,
string ext, string input, string output, boolean generated |
string ext, string input, string output |
canonicalNamespaceLink(namespace, subns) and
summaryModel(subns, type, subtypes, name, signature, ext, input, output, kind, generated)
summaryModel(subns, type, subtypes, name, signature, ext, input, output, kind)
)
)
}
@@ -286,11 +279,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."
@@ -309,9 +302,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
@@ -326,9 +319,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
@@ -358,23 +351,20 @@ module CsvValidation {
)
)
or
exists(string row, string k, string kind | summaryModel(row) |
k = row.splitAt(";", 8) and
getKind(k, kind, _) and
exists(string row, string kind | summaryModel(row) |
kind = row.splitAt(";", 8) and
not kind = ["taint", "value"] and
msg = "Invalid kind \"" + kind + "\" in summary model."
)
or
exists(string row, string k, string kind | sinkModel(row) |
k = row.splitAt(";", 7) and
getKind(k, kind, _) and
exists(string row, string kind | sinkModel(row) |
kind = row.splitAt(";", 7) and
not kind = ["code", "sql", "xss", "remote", "html"] and
msg = "Invalid kind \"" + kind + "\" in sink model."
)
or
exists(string row, string k, string kind | sourceModel(row) |
k = row.splitAt(";", 7) and
getKind(k, kind, _) and
exists(string row, string kind | sourceModel(row) |
kind = row.splitAt(";", 7) and
not kind = "local" and
msg = "Invalid kind \"" + kind + "\" in source model."
)
@@ -384,9 +374,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(
@@ -512,13 +502,6 @@ Element interpretElement(
)
}
/**
* Holds if `c` has a `generated` summary.
*/
predicate hasSummary(DataFlowCallable c, boolean generated) {
summaryElement(c, _, _, _, generated)
}
cached
private module Cached {
/**

View File

@@ -112,13 +112,15 @@ abstract class Configuration extends string {
predicate isBarrierGuard(BarrierGuard guard, FlowState state) { none() }
/**
* Holds if data may flow from `node1` to `node2` in addition to the normal data-flow steps.
* 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 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`.
* 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`.
*/
predicate isAdditionalFlowStep(Node node1, FlowState state1, Node node2, FlowState state2) {
none()
@@ -1158,8 +1160,8 @@ private module Stage2 {
if reducedViableImplInReturn(c, call) then result = TReturn(c, call) else result = ccNone()
}
bindingset[node, cc]
private LocalCc getLocalCc(NodeEx node, Cc cc) { any() }
bindingset[node, cc, config]
private LocalCc getLocalCc(NodeEx node, Cc cc, Configuration config) { any() }
bindingset[node1, state1, config]
bindingset[node2, state2, config]
@@ -1246,7 +1248,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)
localCc = getLocalCc(mid, cc, config)
|
localStep(mid, state0, node, state, true, _, config, localCc) and
ap = ap0
@@ -1951,8 +1953,8 @@ private module Stage3 {
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() }
bindingset[node, cc, config]
private LocalCc getLocalCc(NodeEx node, Cc cc, Configuration config) { any() }
private predicate localStep(
NodeEx node1, FlowState state1, NodeEx node2, FlowState state2, boolean preservesValue,
@@ -2035,7 +2037,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)
localCc = getLocalCc(mid, cc, config)
|
localStep(mid, state0, node, state, true, _, config, localCc) and
ap = ap0
@@ -2765,11 +2767,12 @@ private module Stage4 {
if reducedViableImplInReturn(c, call) then result = TReturn(c, call) else result = ccNone()
}
bindingset[node, cc]
private LocalCc getLocalCc(NodeEx node, Cc cc) {
bindingset[node, cc, config]
private LocalCc getLocalCc(NodeEx node, Cc cc, Configuration config) {
result =
getLocalCallContext(pragma[only_bind_into](pragma[only_bind_out](cc)),
node.getEnclosingCallable())
node.getEnclosingCallable()) and
exists(config)
}
private predicate localStep(
@@ -2862,7 +2865,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)
localCc = getLocalCc(mid, cc, config)
|
localStep(mid, state0, node, state, true, _, config, localCc) and
ap = ap0

View File

@@ -112,13 +112,15 @@ abstract class Configuration extends string {
predicate isBarrierGuard(BarrierGuard guard, FlowState state) { none() }
/**
* Holds if data may flow from `node1` to `node2` in addition to the normal data-flow steps.
* 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 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`.
* 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`.
*/
predicate isAdditionalFlowStep(Node node1, FlowState state1, Node node2, FlowState state2) {
none()
@@ -1158,8 +1160,8 @@ private module Stage2 {
if reducedViableImplInReturn(c, call) then result = TReturn(c, call) else result = ccNone()
}
bindingset[node, cc]
private LocalCc getLocalCc(NodeEx node, Cc cc) { any() }
bindingset[node, cc, config]
private LocalCc getLocalCc(NodeEx node, Cc cc, Configuration config) { any() }
bindingset[node1, state1, config]
bindingset[node2, state2, config]
@@ -1246,7 +1248,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)
localCc = getLocalCc(mid, cc, config)
|
localStep(mid, state0, node, state, true, _, config, localCc) and
ap = ap0
@@ -1951,8 +1953,8 @@ private module Stage3 {
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() }
bindingset[node, cc, config]
private LocalCc getLocalCc(NodeEx node, Cc cc, Configuration config) { any() }
private predicate localStep(
NodeEx node1, FlowState state1, NodeEx node2, FlowState state2, boolean preservesValue,
@@ -2035,7 +2037,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)
localCc = getLocalCc(mid, cc, config)
|
localStep(mid, state0, node, state, true, _, config, localCc) and
ap = ap0
@@ -2765,11 +2767,12 @@ private module Stage4 {
if reducedViableImplInReturn(c, call) then result = TReturn(c, call) else result = ccNone()
}
bindingset[node, cc]
private LocalCc getLocalCc(NodeEx node, Cc cc) {
bindingset[node, cc, config]
private LocalCc getLocalCc(NodeEx node, Cc cc, Configuration config) {
result =
getLocalCallContext(pragma[only_bind_into](pragma[only_bind_out](cc)),
node.getEnclosingCallable())
node.getEnclosingCallable()) and
exists(config)
}
private predicate localStep(
@@ -2862,7 +2865,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)
localCc = getLocalCc(mid, cc, config)
|
localStep(mid, state0, node, state, true, _, config, localCc) and
ap = ap0

View File

@@ -112,13 +112,15 @@ abstract class Configuration extends string {
predicate isBarrierGuard(BarrierGuard guard, FlowState state) { none() }
/**
* Holds if data may flow from `node1` to `node2` in addition to the normal data-flow steps.
* 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 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`.
* 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`.
*/
predicate isAdditionalFlowStep(Node node1, FlowState state1, Node node2, FlowState state2) {
none()
@@ -1158,8 +1160,8 @@ private module Stage2 {
if reducedViableImplInReturn(c, call) then result = TReturn(c, call) else result = ccNone()
}
bindingset[node, cc]
private LocalCc getLocalCc(NodeEx node, Cc cc) { any() }
bindingset[node, cc, config]
private LocalCc getLocalCc(NodeEx node, Cc cc, Configuration config) { any() }
bindingset[node1, state1, config]
bindingset[node2, state2, config]
@@ -1246,7 +1248,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)
localCc = getLocalCc(mid, cc, config)
|
localStep(mid, state0, node, state, true, _, config, localCc) and
ap = ap0
@@ -1951,8 +1953,8 @@ private module Stage3 {
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() }
bindingset[node, cc, config]
private LocalCc getLocalCc(NodeEx node, Cc cc, Configuration config) { any() }
private predicate localStep(
NodeEx node1, FlowState state1, NodeEx node2, FlowState state2, boolean preservesValue,
@@ -2035,7 +2037,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)
localCc = getLocalCc(mid, cc, config)
|
localStep(mid, state0, node, state, true, _, config, localCc) and
ap = ap0
@@ -2765,11 +2767,12 @@ private module Stage4 {
if reducedViableImplInReturn(c, call) then result = TReturn(c, call) else result = ccNone()
}
bindingset[node, cc]
private LocalCc getLocalCc(NodeEx node, Cc cc) {
bindingset[node, cc, config]
private LocalCc getLocalCc(NodeEx node, Cc cc, Configuration config) {
result =
getLocalCallContext(pragma[only_bind_into](pragma[only_bind_out](cc)),
node.getEnclosingCallable())
node.getEnclosingCallable()) and
exists(config)
}
private predicate localStep(
@@ -2862,7 +2865,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)
localCc = getLocalCc(mid, cc, config)
|
localStep(mid, state0, node, state, true, _, config, localCc) and
ap = ap0

View File

@@ -112,13 +112,15 @@ abstract class Configuration extends string {
predicate isBarrierGuard(BarrierGuard guard, FlowState state) { none() }
/**
* Holds if data may flow from `node1` to `node2` in addition to the normal data-flow steps.
* 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 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`.
* 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`.
*/
predicate isAdditionalFlowStep(Node node1, FlowState state1, Node node2, FlowState state2) {
none()
@@ -1158,8 +1160,8 @@ private module Stage2 {
if reducedViableImplInReturn(c, call) then result = TReturn(c, call) else result = ccNone()
}
bindingset[node, cc]
private LocalCc getLocalCc(NodeEx node, Cc cc) { any() }
bindingset[node, cc, config]
private LocalCc getLocalCc(NodeEx node, Cc cc, Configuration config) { any() }
bindingset[node1, state1, config]
bindingset[node2, state2, config]
@@ -1246,7 +1248,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)
localCc = getLocalCc(mid, cc, config)
|
localStep(mid, state0, node, state, true, _, config, localCc) and
ap = ap0
@@ -1951,8 +1953,8 @@ private module Stage3 {
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() }
bindingset[node, cc, config]
private LocalCc getLocalCc(NodeEx node, Cc cc, Configuration config) { any() }
private predicate localStep(
NodeEx node1, FlowState state1, NodeEx node2, FlowState state2, boolean preservesValue,
@@ -2035,7 +2037,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)
localCc = getLocalCc(mid, cc, config)
|
localStep(mid, state0, node, state, true, _, config, localCc) and
ap = ap0
@@ -2765,11 +2767,12 @@ private module Stage4 {
if reducedViableImplInReturn(c, call) then result = TReturn(c, call) else result = ccNone()
}
bindingset[node, cc]
private LocalCc getLocalCc(NodeEx node, Cc cc) {
bindingset[node, cc, config]
private LocalCc getLocalCc(NodeEx node, Cc cc, Configuration config) {
result =
getLocalCallContext(pragma[only_bind_into](pragma[only_bind_out](cc)),
node.getEnclosingCallable())
node.getEnclosingCallable()) and
exists(config)
}
private predicate localStep(
@@ -2862,7 +2865,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)
localCc = getLocalCc(mid, cc, config)
|
localStep(mid, state0, node, state, true, _, config, localCc) and
ap = ap0

Some files were not shown because too many files have changed in this diff Show More