зеркало из https://github.com/github/codeql.git
Merge branch 'main' into rust-experiment
This commit is contained in:
Коммит
b23e482ed2
|
@ -0,0 +1,13 @@
|
|||
### Pull Request checklist
|
||||
|
||||
#### All query authors
|
||||
|
||||
- [ ] A change note is added if necessary. See [the documentation](https://github.com/github/codeql/blob/main/docs/change-notes.md) in this repository.
|
||||
- [ ] All new queries have appropriate `.qhelp`. See [the documentation](https://github.com/github/codeql/blob/main/docs/query-help-style-guide.md) in this repository.
|
||||
- [ ] QL tests are added if necessary. See [Testing custom queries](https://docs.github.com/en/code-security/codeql-cli/using-the-advanced-functionality-of-the-codeql-cli/testing-custom-queries) in the GitHub documentation.
|
||||
- [ ] New and changed queries have correct query metadata. See [the documentation](https://github.com/github/codeql/blob/main/docs/query-metadata-style-guide.md) in this repository.
|
||||
|
||||
#### Internal query authors only
|
||||
|
||||
- [ ] Autofixes generated based on these changes are valid, only needed if this PR makes significant changes to `.ql`, `.qll`, or `.qhelp` files. See [the documentation](https://github.com/github/codeql-team/blob/main/docs/best-practices/validating-autofix-for-query-changes.md) (internal access required).
|
||||
- [ ] Changes are validated [at scale](https://github.com/github/codeql-dca/) (internal access required).
|
|
@ -29,45 +29,6 @@ permissions:
|
|||
contents: read
|
||||
|
||||
jobs:
|
||||
qlupgrade:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
- uses: ./.github/actions/fetch-codeql
|
||||
- name: Check DB upgrade scripts
|
||||
run: |
|
||||
echo >empty.trap
|
||||
codeql dataset import -S ql/lib/upgrades/initial/semmlecode.csharp.dbscheme testdb empty.trap
|
||||
codeql dataset upgrade testdb --additional-packs ql/lib
|
||||
diff -q testdb/semmlecode.csharp.dbscheme ql/lib/semmlecode.csharp.dbscheme
|
||||
- name: Check DB downgrade scripts
|
||||
run: |
|
||||
echo >empty.trap
|
||||
rm -rf testdb; codeql dataset import -S ql/lib/semmlecode.csharp.dbscheme testdb empty.trap
|
||||
codeql resolve upgrades --format=lines --allow-downgrades --additional-packs downgrades \
|
||||
--dbscheme=ql/lib/semmlecode.csharp.dbscheme --target-dbscheme=downgrades/initial/semmlecode.csharp.dbscheme |
|
||||
xargs codeql execute upgrades testdb
|
||||
diff -q testdb/semmlecode.csharp.dbscheme downgrades/initial/semmlecode.csharp.dbscheme
|
||||
qltest:
|
||||
if: github.repository_owner == 'github'
|
||||
runs-on: ubuntu-latest-xl
|
||||
strategy:
|
||||
fail-fast: false
|
||||
matrix:
|
||||
slice: ["1/2", "2/2"]
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
- uses: ./csharp/actions/create-extractor-pack
|
||||
- name: Cache compilation cache
|
||||
id: query-cache
|
||||
uses: ./.github/actions/cache-query-compilation
|
||||
with:
|
||||
key: csharp-qltest-${{ matrix.slice }}
|
||||
- name: Run QL tests
|
||||
run: |
|
||||
codeql test run --threads=0 --ram 50000 --slice ${{ matrix.slice }} --search-path "${{ github.workspace }}" --check-databases --check-undefined-labels --check-repeated-labels --check-redefined-labels --consistency-queries ql/consistency-queries ql/test --compilation-cache "${{ steps.query-cache.outputs.cache-dir }}"
|
||||
env:
|
||||
GITHUB_TOKEN: ${{ github.token }}
|
||||
unit-tests:
|
||||
strategy:
|
||||
matrix:
|
||||
|
|
|
@ -140,6 +140,7 @@ jobs:
|
|||
path: |
|
||||
${{ runner.temp }}/query-packs/*
|
||||
retention-days: 1
|
||||
include-hidden-files: true
|
||||
|
||||
package:
|
||||
runs-on: ubuntu-latest
|
||||
|
@ -176,6 +177,7 @@ jobs:
|
|||
name: codeql-ruby-pack
|
||||
path: ruby/codeql-ruby.zip
|
||||
retention-days: 1
|
||||
include-hidden-files: true
|
||||
- uses: actions/download-artifact@v3
|
||||
with:
|
||||
name: codeql-ruby-queries
|
||||
|
@ -193,6 +195,7 @@ jobs:
|
|||
name: codeql-ruby-bundle
|
||||
path: ruby/codeql-ruby-bundle.zip
|
||||
retention-days: 1
|
||||
include-hidden-files: true
|
||||
|
||||
test:
|
||||
defaults:
|
||||
|
|
|
@ -15,7 +15,7 @@ local_path_override(
|
|||
# see https://registry.bazel.build/ for a list of available packages
|
||||
|
||||
bazel_dep(name = "platforms", version = "0.0.10")
|
||||
bazel_dep(name = "rules_go", version = "0.49.0")
|
||||
bazel_dep(name = "rules_go", version = "0.50.0")
|
||||
bazel_dep(name = "rules_pkg", version = "0.10.1")
|
||||
bazel_dep(name = "rules_nodejs", version = "6.2.0-codeql.1")
|
||||
bazel_dep(name = "rules_python", version = "0.32.2")
|
||||
|
|
|
@ -0,0 +1,32 @@
|
|||
/*
|
||||
* Approach: replace conversion expressions of kind 389 (= @c11_generic) by
|
||||
* conversion expressions of kind 12 (= @parexpr), i.e., a `ParenthesisExpr`,
|
||||
* and drop the relation which its child expressions, which are just syntactic
|
||||
* sugar. Parenthesis expressions are equally benign as C11 _Generic expressions,
|
||||
* and behave similarly in the context of the IR.
|
||||
*/
|
||||
|
||||
class Expr extends @expr {
|
||||
string toString() { none() }
|
||||
}
|
||||
|
||||
class Location extends @location {
|
||||
string toString() { none() }
|
||||
}
|
||||
|
||||
class ExprParent extends @exprparent {
|
||||
string toString() { none() }
|
||||
}
|
||||
|
||||
query predicate new_exprs(Expr expr, int new_kind, Location loc) {
|
||||
exists(int kind | exprs(expr, kind, loc) | if kind = 389 then new_kind = 12 else new_kind = kind)
|
||||
}
|
||||
|
||||
query predicate new_exprparents(Expr expr, int index, ExprParent expr_parent) {
|
||||
exprparents(expr, index, expr_parent) and
|
||||
(
|
||||
not expr_parent instanceof @expr
|
||||
or
|
||||
exists(int kind | exprs(expr_parent.(Expr), kind, _) | kind != 389)
|
||||
)
|
||||
}
|
Разница между файлами не показана из-за своего большого размера
Загрузить разницу
Разница между файлами не показана из-за своего большого размера
Загрузить разницу
|
@ -0,0 +1,4 @@
|
|||
description: Expose C11 _Generics
|
||||
compatibility: partial
|
||||
exprs.rel: run downgrades.ql new_exprs
|
||||
exprparents.rel: run downgrades.ql new_exprparents
|
|
@ -0,0 +1,18 @@
|
|||
class Function extends @function {
|
||||
string toString() { none() }
|
||||
}
|
||||
|
||||
class Type extends @type {
|
||||
string toString() { none() }
|
||||
}
|
||||
|
||||
class Variable extends @variable {
|
||||
string toString() { none() }
|
||||
}
|
||||
|
||||
from Function func, Type traits, Variable handle, Variable promise
|
||||
where
|
||||
coroutine(func, traits) and
|
||||
coroutine_placeholder_variable(handle, 1, func) and
|
||||
coroutine_placeholder_variable(promise, 2, func)
|
||||
select func, traits, handle, promise
|
Разница между файлами не показана из-за своего большого размера
Загрузить разницу
Разница между файлами не показана из-за своего большого размера
Загрузить разницу
|
@ -0,0 +1,4 @@
|
|||
description: Improve handling of coroutine placeholder variables
|
||||
compatibility: full
|
||||
coroutine.rel: run coroutine.qlo
|
||||
coroutine_placeholder_variable.rel: delete
|
|
@ -1,3 +1,7 @@
|
|||
## 1.4.1
|
||||
|
||||
No user-facing changes.
|
||||
|
||||
## 1.4.0
|
||||
|
||||
### New Features
|
||||
|
|
|
@ -0,0 +1,4 @@
|
|||
---
|
||||
category: feature
|
||||
---
|
||||
* Added a class `C11GenericExpr` to represent C11 generic selection expressions. The generic selection is represented as a `Conversion` on the expression that will be selected.
|
|
@ -0,0 +1,11 @@
|
|||
---
|
||||
category: breaking
|
||||
---
|
||||
* Deleted many deprecated taint-tracking configurations based on `TaintTracking::Configuration`.
|
||||
* Deleted many deprecated dataflow configurations based on `DataFlow::Configuration`.
|
||||
* Deleted the deprecated `hasQualifiedName` and `isDefined` predicates from the `Declaration` class, use `hasGlobalName` and `hasDefinition` respectively instead.
|
||||
* Deleted the `getFullSignature` predicate from the `Function` class, use `getIdentityString(Declaration)` from `semmle.code.cpp.Print` instead.
|
||||
* Deleted the deprecated `freeCall` predicate from `Alloc.qll`. Use `DeallocationExpr` instead.
|
||||
* Deleted the deprecated `explorationLimit` predicate from `DataFlow::Configuration`, use `FlowExploration<explorationLimit>` instead.
|
||||
* Deleted the deprecated `getFieldExpr` predicate from `ClassAggregateLiteral`, use `getAFieldExpr` instead.
|
||||
* Deleted the deprecated `getElementExpr` predicate from `ArrayOrVectorAggregateLiteral`, use `getAnElementExpr` instead.
|
|
@ -0,0 +1,4 @@
|
|||
---
|
||||
category: minorAnalysis
|
||||
---
|
||||
* Added a data flow model for `realloc`-like functions, which were previously modeled as a taint tracking functions. This change improves the precision of queries where flow through `realloc`-like functions might affect the results.
|
|
@ -0,0 +1,4 @@
|
|||
---
|
||||
category: minorAnalysis
|
||||
---
|
||||
* Added a data flow model for `swap` member functions, which were previously modeled as taint tracking functions. This change improves the precision of queries where flow through `swap` member functions might affect the results.
|
|
@ -0,0 +1,3 @@
|
|||
## 1.4.1
|
||||
|
||||
No user-facing changes.
|
|
@ -1,2 +1,2 @@
|
|||
---
|
||||
lastReleaseVersion: 1.4.0
|
||||
lastReleaseVersion: 1.4.1
|
||||
|
|
|
@ -36,16 +36,6 @@ module PrivateCleartextWrite {
|
|||
}
|
||||
}
|
||||
|
||||
deprecated class WriteConfig extends TaintTracking::Configuration {
|
||||
WriteConfig() { this = "Write configuration" }
|
||||
|
||||
override predicate isSource(DataFlow::Node source) { source instanceof Source }
|
||||
|
||||
override predicate isSink(DataFlow::Node sink) { sink instanceof Sink }
|
||||
|
||||
override predicate isSanitizer(DataFlow::Node node) { node instanceof Sanitizer }
|
||||
}
|
||||
|
||||
private module WriteConfig implements DataFlow::ConfigSig {
|
||||
predicate isSource(DataFlow::Node source) { source instanceof Source }
|
||||
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
name: codeql/cpp-all
|
||||
version: 1.4.1-dev
|
||||
version: 1.4.2-dev
|
||||
groups: cpp
|
||||
dbscheme: semmlecode.cpp.dbscheme
|
||||
extractor: cpp
|
||||
|
|
|
@ -60,18 +60,6 @@ class Declaration extends Locatable, @declaration {
|
|||
*/
|
||||
string getQualifiedName() { result = underlyingElement(this).(Q::Declaration).getQualifiedName() }
|
||||
|
||||
/**
|
||||
* DEPRECATED: Prefer `hasGlobalName` or the 2-argument or 3-argument
|
||||
* `hasQualifiedName` predicates. To get the exact same results as this
|
||||
* predicate in all edge cases, use `getQualifiedName()`.
|
||||
*
|
||||
* Holds if this declaration has the fully-qualified name `qualifiedName`.
|
||||
* See `getQualifiedName`.
|
||||
*/
|
||||
deprecated predicate hasQualifiedName(string qualifiedName) {
|
||||
this.getQualifiedName() = qualifiedName
|
||||
}
|
||||
|
||||
/**
|
||||
* Holds if this declaration has a fully-qualified name with a name-space
|
||||
* component of `namespaceQualifier`, a declaring type of `typeQualifier`,
|
||||
|
@ -185,9 +173,6 @@ class Declaration extends Locatable, @declaration {
|
|||
/** Holds if the declaration has a definition. */
|
||||
predicate hasDefinition() { exists(this.getDefinition()) }
|
||||
|
||||
/** DEPRECATED: Use `hasDefinition` instead. */
|
||||
deprecated predicate isDefined() { this.hasDefinition() }
|
||||
|
||||
/** Gets the preferred location of this declaration, if any. */
|
||||
override Location getLocation() { none() }
|
||||
|
||||
|
|
|
@ -30,46 +30,6 @@ class Function extends Declaration, ControlFlowNode, AccessHolder, @function {
|
|||
|
||||
override string getName() { functions(underlyingElement(this), result, _) }
|
||||
|
||||
/**
|
||||
* DEPRECATED: Use `getIdentityString(Declaration)` from `semmle.code.cpp.Print` instead.
|
||||
* Gets the full signature of this function, including return type, parameter
|
||||
* types, and template arguments.
|
||||
*
|
||||
* For example, in the following code:
|
||||
* ```
|
||||
* template<typename T> T min(T x, T y);
|
||||
* int z = min(5, 7);
|
||||
* ```
|
||||
* The full signature of the function called on the last line would be
|
||||
* `min<int>(int, int) -> int`, and the full signature of the uninstantiated
|
||||
* template on the first line would be `min<T>(T, T) -> T`.
|
||||
*/
|
||||
deprecated string getFullSignature() {
|
||||
exists(string name, string templateArgs, string args |
|
||||
result = name + templateArgs + args + " -> " + this.getType().toString() and
|
||||
name = this.getQualifiedName() and
|
||||
(
|
||||
if exists(this.getATemplateArgument())
|
||||
then
|
||||
templateArgs =
|
||||
"<" +
|
||||
concat(int i |
|
||||
exists(this.getTemplateArgument(i))
|
||||
|
|
||||
this.getTemplateArgument(i).toString(), ", " order by i
|
||||
) + ">"
|
||||
else templateArgs = ""
|
||||
) and
|
||||
args =
|
||||
"(" +
|
||||
concat(int i |
|
||||
exists(this.getParameter(i))
|
||||
|
|
||||
this.getParameter(i).getType().toString(), ", " order by i
|
||||
) + ")"
|
||||
)
|
||||
}
|
||||
|
||||
/** Gets a specifier of this function. */
|
||||
override Specifier getASpecifier() {
|
||||
funspecifiers(underlyingElement(this), unresolveElement(result)) or
|
||||
|
|
|
@ -286,9 +286,6 @@ abstract class BaseAstNode extends PrintAstNode {
|
|||
* Gets the AST represented by this node.
|
||||
*/
|
||||
final Locatable getAst() { result = ast }
|
||||
|
||||
/** DEPRECATED: Alias for getAst */
|
||||
deprecated Locatable getAST() { result = this.getAst() }
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -385,6 +382,21 @@ class CastNode extends ConversionNode {
|
|||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* A node representing a `C11GenericExpr`.
|
||||
*/
|
||||
class C11GenericNode extends ConversionNode {
|
||||
C11GenericExpr generic;
|
||||
|
||||
C11GenericNode() { generic = conv }
|
||||
|
||||
override AstNode getChildInternal(int childIndex) {
|
||||
result = super.getChildInternal(childIndex - count(generic.getAChild()))
|
||||
or
|
||||
result.getAst() = generic.getChild(childIndex)
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* A node representing a `StmtExpr`.
|
||||
*/
|
||||
|
@ -860,6 +872,15 @@ private predicate namedExprChildPredicates(Expr expr, Element ele, string pred)
|
|||
or
|
||||
expr.(BuiltInVarArgsStart).getLastNamedParameter() = ele and pred = "getLastNamedParameter()"
|
||||
or
|
||||
expr.(C11GenericExpr).getControllingExpr() = ele and pred = "getControllingExpr()"
|
||||
or
|
||||
exists(int n |
|
||||
expr.(C11GenericExpr).getAssociationType(n) = ele.(TypeName).getType() and
|
||||
pred = "getAssociationType(" + n + ")"
|
||||
or
|
||||
expr.(C11GenericExpr).getAssociationExpr(n) = ele and pred = "getAssociationExpr(" + n + ")"
|
||||
)
|
||||
or
|
||||
expr.(Call).getQualifier() = ele and pred = "getQualifier()"
|
||||
or
|
||||
exists(int n | expr.(Call).getArgument(n) = ele and pred = "getArgument(" + n.toString() + ")")
|
||||
|
|
|
@ -409,11 +409,18 @@ class LocalVariable extends LocalScopeVariable, @localvariable {
|
|||
exists(ConditionDeclExpr e | e.getVariable() = this and e.getEnclosingFunction() = result)
|
||||
or
|
||||
orphaned_variables(underlyingElement(this), unresolveElement(result))
|
||||
or
|
||||
coroutine_placeholder_variable(underlyingElement(this), _, unresolveElement(result))
|
||||
}
|
||||
|
||||
override predicate isStatic() {
|
||||
super.isStatic() or orphaned_variables(underlyingElement(this), _)
|
||||
}
|
||||
|
||||
override predicate isCompilerGenerated() {
|
||||
super.isCompilerGenerated() or
|
||||
coroutine_placeholder_variable(underlyingElement(this), _, _)
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
|
@ -7,15 +7,6 @@ import semmle.code.cpp.models.interfaces.Deallocation
|
|||
*/
|
||||
predicate freeFunction(Function f, int argNum) { argNum = f.(DeallocationFunction).getFreedArg() }
|
||||
|
||||
/**
|
||||
* A call to a library routine that frees memory.
|
||||
*
|
||||
* DEPRECATED: Use `DeallocationExpr` instead (this also includes `delete` expressions).
|
||||
*/
|
||||
deprecated predicate freeCall(FunctionCall fc, Expr arg) {
|
||||
arg = fc.(DeallocationExpr).getFreedExpr()
|
||||
}
|
||||
|
||||
/**
|
||||
* Is e some kind of allocation or deallocation (`new`, `alloc`, `realloc`, `delete`, `free` etc)?
|
||||
*/
|
||||
|
|
|
@ -168,14 +168,6 @@ abstract deprecated class Configuration extends string {
|
|||
*/
|
||||
predicate hasFlowToExpr(DataFlowExpr sink) { this.hasFlowTo(exprNode(sink)) }
|
||||
|
||||
/**
|
||||
* DEPRECATED: Use `FlowExploration<explorationLimit>` instead.
|
||||
*
|
||||
* Gets the exploration limit for `hasPartialFlow` and `hasPartialFlowRev`
|
||||
* measured in approximate number of interprocedural steps.
|
||||
*/
|
||||
deprecated int explorationLimit() { none() }
|
||||
|
||||
/**
|
||||
* Holds if hidden nodes should be included in the data flow graph.
|
||||
*
|
||||
|
|
|
@ -168,14 +168,6 @@ abstract deprecated class Configuration extends string {
|
|||
*/
|
||||
predicate hasFlowToExpr(DataFlowExpr sink) { this.hasFlowTo(exprNode(sink)) }
|
||||
|
||||
/**
|
||||
* DEPRECATED: Use `FlowExploration<explorationLimit>` instead.
|
||||
*
|
||||
* Gets the exploration limit for `hasPartialFlow` and `hasPartialFlowRev`
|
||||
* measured in approximate number of interprocedural steps.
|
||||
*/
|
||||
deprecated int explorationLimit() { none() }
|
||||
|
||||
/**
|
||||
* Holds if hidden nodes should be included in the data flow graph.
|
||||
*
|
||||
|
|
|
@ -168,14 +168,6 @@ abstract deprecated class Configuration extends string {
|
|||
*/
|
||||
predicate hasFlowToExpr(DataFlowExpr sink) { this.hasFlowTo(exprNode(sink)) }
|
||||
|
||||
/**
|
||||
* DEPRECATED: Use `FlowExploration<explorationLimit>` instead.
|
||||
*
|
||||
* Gets the exploration limit for `hasPartialFlow` and `hasPartialFlowRev`
|
||||
* measured in approximate number of interprocedural steps.
|
||||
*/
|
||||
deprecated int explorationLimit() { none() }
|
||||
|
||||
/**
|
||||
* Holds if hidden nodes should be included in the data flow graph.
|
||||
*
|
||||
|
|
|
@ -168,14 +168,6 @@ abstract deprecated class Configuration extends string {
|
|||
*/
|
||||
predicate hasFlowToExpr(DataFlowExpr sink) { this.hasFlowTo(exprNode(sink)) }
|
||||
|
||||
/**
|
||||
* DEPRECATED: Use `FlowExploration<explorationLimit>` instead.
|
||||
*
|
||||
* Gets the exploration limit for `hasPartialFlow` and `hasPartialFlowRev`
|
||||
* measured in approximate number of interprocedural steps.
|
||||
*/
|
||||
deprecated int explorationLimit() { none() }
|
||||
|
||||
/**
|
||||
* Holds if hidden nodes should be included in the data flow graph.
|
||||
*
|
||||
|
|
|
@ -168,14 +168,6 @@ abstract deprecated class Configuration extends string {
|
|||
*/
|
||||
predicate hasFlowToExpr(DataFlowExpr sink) { this.hasFlowTo(exprNode(sink)) }
|
||||
|
||||
/**
|
||||
* DEPRECATED: Use `FlowExploration<explorationLimit>` instead.
|
||||
*
|
||||
* Gets the exploration limit for `hasPartialFlow` and `hasPartialFlowRev`
|
||||
* measured in approximate number of interprocedural steps.
|
||||
*/
|
||||
deprecated int explorationLimit() { none() }
|
||||
|
||||
/**
|
||||
* Holds if hidden nodes should be included in the data flow graph.
|
||||
*
|
||||
|
|
|
@ -632,6 +632,106 @@ class ParenthesisExpr extends Conversion, @parexpr {
|
|||
override string getAPrimaryQlClass() { result = "ParenthesisExpr" }
|
||||
}
|
||||
|
||||
/**
|
||||
* A node representing a C11 `_Generic` selection expression.
|
||||
*
|
||||
* For example:
|
||||
* ```
|
||||
* _Generic(e, int: "int", default: "unknown")
|
||||
* ```
|
||||
*/
|
||||
class C11GenericExpr extends Conversion, @c11_generic {
|
||||
int associationCount;
|
||||
|
||||
C11GenericExpr() { associationCount = (count(this.getAChild()) - 1) / 2 }
|
||||
|
||||
override string toString() { result = "_Generic" }
|
||||
|
||||
override string getAPrimaryQlClass() { result = "C11GenericExpr" }
|
||||
|
||||
/**
|
||||
* Gets the controlling expression of the generic selection.
|
||||
*
|
||||
* For example, for
|
||||
* ```
|
||||
* _Generic(e, int: "a", default: "b")
|
||||
* ```
|
||||
* the result is `e`.
|
||||
*/
|
||||
Expr getControllingExpr() { result = this.getChild(0) }
|
||||
|
||||
/**
|
||||
* Gets the type of the `n`th element in the association list of the generic selection.
|
||||
*
|
||||
* For example, for
|
||||
* ```
|
||||
* _Generic(e, int: "a", default: "b")
|
||||
* ```
|
||||
* the type of the 0th element is `int`. In the case of the default element the
|
||||
* type will an instance of `VoidType`.
|
||||
*/
|
||||
Type getAssociationType(int n) {
|
||||
n in [0 .. associationCount - 1] and
|
||||
result = this.getChild(n * 2 + 1).(TypeName).getType()
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the type of an element in the association list of the generic selection.
|
||||
*/
|
||||
Type getAnAssociationType() { result = this.getAssociationType(_) }
|
||||
|
||||
/**
|
||||
* Gets the expression of the `n`th element in the association list of
|
||||
* the generic selection.
|
||||
*
|
||||
* For example, for
|
||||
* ```
|
||||
* _Generic(e, int: "a", default: "b")
|
||||
* ```
|
||||
* the expression for 0th element is `"a"`, and the expression for the
|
||||
* 1st element is `"b"`. For the selected expression, this predicate
|
||||
* will yield a `ReuseExpr`, such that
|
||||
* ```
|
||||
* this.getAssociationExpr(n).(ReuseExpr).getReusedExpr() = this.getExpr()
|
||||
* ```
|
||||
*/
|
||||
Expr getAssociationExpr(int n) {
|
||||
n in [0 .. associationCount - 1] and
|
||||
result = this.getChild(n * 2 + 2)
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the expression of an element in the association list of the generic selection.
|
||||
*/
|
||||
Expr getAnAssociationExpr() { result = this.getAssociationExpr(_) }
|
||||
|
||||
/**
|
||||
* Holds if the `n`th element of the association list of the generic selection is the
|
||||
* default element.
|
||||
*
|
||||
* For example, for
|
||||
* ```
|
||||
* _Generic(e, int: "a", default: "b")
|
||||
* ```
|
||||
* this holds for 1.
|
||||
*/
|
||||
predicate isDefaultAssociation(int n) { this.getAssociationType(n) instanceof VoidType }
|
||||
|
||||
/**
|
||||
* Holds if the `n`th element of the association list of the generic selection is the
|
||||
* one whose expression was selected.
|
||||
*
|
||||
* For example, with `e` of type `int` and
|
||||
* ```
|
||||
* _Generic(e, int: "a", default: "b")
|
||||
* ```
|
||||
* this holds for 0.
|
||||
*/
|
||||
predicate isSelectedAssociation(int n) {
|
||||
this.getAssociationExpr(n).(ReuseExpr).getReusedExpr() = this.getExpr()
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* A C/C++ expression that could not be resolved, or that can no longer be
|
||||
* represented due to a database upgrade or downgrade.
|
||||
|
@ -668,6 +768,8 @@ class AssumeExpr extends Expr, @assume {
|
|||
|
||||
/**
|
||||
* A C/C++ comma expression.
|
||||
*
|
||||
* For example:
|
||||
* ```
|
||||
* int c = compute1(), compute2(), resulting_value;
|
||||
* ```
|
||||
|
|
|
@ -195,17 +195,6 @@ class ClassAggregateLiteral extends AggregateLiteral {
|
|||
*/
|
||||
Expr getAFieldExpr(Field field) { result = this.getFieldExpr(field, _) }
|
||||
|
||||
/**
|
||||
* DEPRECATED: Use `getAFieldExpr` instead.
|
||||
*
|
||||
* Gets the expression within the aggregate literal that is used to initialize
|
||||
* field `field`, if present.
|
||||
*
|
||||
* This predicate may have multiple results since a field can be initialized
|
||||
* multiple times in the same initializer.
|
||||
*/
|
||||
deprecated Expr getFieldExpr(Field field) { result = this.getFieldExpr(field, _) }
|
||||
|
||||
/**
|
||||
* Gets the expression within the aggregate literal that is used to initialize
|
||||
* field `field`, if present. The expression is the `position`'th entry in the
|
||||
|
@ -300,17 +289,6 @@ class ArrayOrVectorAggregateLiteral extends AggregateLiteral {
|
|||
*/
|
||||
Expr getAnElementExpr(int elementIndex) { result = this.getElementExpr(elementIndex, _) }
|
||||
|
||||
/**
|
||||
* DEPRECATED: Use `getAnElementExpr` instead.
|
||||
*
|
||||
* Gets the expression within the aggregate literal that is used to initialize
|
||||
* element `elementIndex`, if present.
|
||||
*
|
||||
* This predicate may have multiple results since an element can be initialized
|
||||
* multiple times in the same initializer.
|
||||
*/
|
||||
deprecated Expr getElementExpr(int elementIndex) { result = this.getElementExpr(elementIndex, _) }
|
||||
|
||||
/**
|
||||
* Gets the expression within the aggregate literal that is used to initialize
|
||||
* element `elementIndex`, if present. The expression is the `position`'th entry
|
||||
|
|
|
@ -168,14 +168,6 @@ abstract deprecated class Configuration extends string {
|
|||
*/
|
||||
predicate hasFlowToExpr(DataFlowExpr sink) { this.hasFlowTo(exprNode(sink)) }
|
||||
|
||||
/**
|
||||
* DEPRECATED: Use `FlowExploration<explorationLimit>` instead.
|
||||
*
|
||||
* Gets the exploration limit for `hasPartialFlow` and `hasPartialFlowRev`
|
||||
* measured in approximate number of interprocedural steps.
|
||||
*/
|
||||
deprecated int explorationLimit() { none() }
|
||||
|
||||
/**
|
||||
* Holds if hidden nodes should be included in the data flow graph.
|
||||
*
|
||||
|
|
|
@ -168,14 +168,6 @@ abstract deprecated class Configuration extends string {
|
|||
*/
|
||||
predicate hasFlowToExpr(DataFlowExpr sink) { this.hasFlowTo(exprNode(sink)) }
|
||||
|
||||
/**
|
||||
* DEPRECATED: Use `FlowExploration<explorationLimit>` instead.
|
||||
*
|
||||
* Gets the exploration limit for `hasPartialFlow` and `hasPartialFlowRev`
|
||||
* measured in approximate number of interprocedural steps.
|
||||
*/
|
||||
deprecated int explorationLimit() { none() }
|
||||
|
||||
/**
|
||||
* Holds if hidden nodes should be included in the data flow graph.
|
||||
*
|
||||
|
|
|
@ -168,14 +168,6 @@ abstract deprecated class Configuration extends string {
|
|||
*/
|
||||
predicate hasFlowToExpr(DataFlowExpr sink) { this.hasFlowTo(exprNode(sink)) }
|
||||
|
||||
/**
|
||||
* DEPRECATED: Use `FlowExploration<explorationLimit>` instead.
|
||||
*
|
||||
* Gets the exploration limit for `hasPartialFlow` and `hasPartialFlowRev`
|
||||
* measured in approximate number of interprocedural steps.
|
||||
*/
|
||||
deprecated int explorationLimit() { none() }
|
||||
|
||||
/**
|
||||
* Holds if hidden nodes should be included in the data flow graph.
|
||||
*
|
||||
|
|
|
@ -168,14 +168,6 @@ abstract deprecated class Configuration extends string {
|
|||
*/
|
||||
predicate hasFlowToExpr(DataFlowExpr sink) { this.hasFlowTo(exprNode(sink)) }
|
||||
|
||||
/**
|
||||
* DEPRECATED: Use `FlowExploration<explorationLimit>` instead.
|
||||
*
|
||||
* Gets the exploration limit for `hasPartialFlow` and `hasPartialFlowRev`
|
||||
* measured in approximate number of interprocedural steps.
|
||||
*/
|
||||
deprecated int explorationLimit() { none() }
|
||||
|
||||
/**
|
||||
* Holds if hidden nodes should be included in the data flow graph.
|
||||
*
|
||||
|
|
|
@ -50,9 +50,6 @@ abstract private class AbstractIRVariable extends TIRVariable {
|
|||
*/
|
||||
abstract Language::AST getAst();
|
||||
|
||||
/** DEPRECATED: Alias for getAst */
|
||||
deprecated Language::AST getAST() { result = this.getAst() }
|
||||
|
||||
/**
|
||||
* Gets an identifier string for the variable. This identifier is unique
|
||||
* within the function.
|
||||
|
@ -96,9 +93,6 @@ class IRUserVariable extends AbstractIRVariable, TIRUserVariable {
|
|||
|
||||
final override Language::AST getAst() { result = var }
|
||||
|
||||
/** DEPRECATED: Alias for getAst */
|
||||
deprecated override Language::AST getAST() { result = this.getAst() }
|
||||
|
||||
final override string getUniqueId() {
|
||||
result = this.getVariable().toString() + " " + this.getVariable().getLocation().toString()
|
||||
}
|
||||
|
@ -163,9 +157,6 @@ abstract private class AbstractIRGeneratedVariable extends AbstractIRVariable {
|
|||
|
||||
final override Language::AST getAst() { result = ast }
|
||||
|
||||
/** DEPRECATED: Alias for getAst */
|
||||
deprecated override Language::AST getAST() { result = this.getAst() }
|
||||
|
||||
override string toString() { result = this.getBaseString() + this.getLocationString() }
|
||||
|
||||
override string getUniqueId() { none() }
|
||||
|
|
|
@ -285,9 +285,6 @@ abstract private class MemoryLocation0 extends TMemoryLocation {
|
|||
predicate isAlwaysAllocatedOnStack() { none() }
|
||||
|
||||
final predicate canReuseSsa() { none() }
|
||||
|
||||
/** DEPRECATED: Alias for canReuseSsa */
|
||||
deprecated predicate canReuseSSA() { this.canReuseSsa() }
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
|
@ -50,9 +50,6 @@ abstract private class AbstractIRVariable extends TIRVariable {
|
|||
*/
|
||||
abstract Language::AST getAst();
|
||||
|
||||
/** DEPRECATED: Alias for getAst */
|
||||
deprecated Language::AST getAST() { result = this.getAst() }
|
||||
|
||||
/**
|
||||
* Gets an identifier string for the variable. This identifier is unique
|
||||
* within the function.
|
||||
|
@ -96,9 +93,6 @@ class IRUserVariable extends AbstractIRVariable, TIRUserVariable {
|
|||
|
||||
final override Language::AST getAst() { result = var }
|
||||
|
||||
/** DEPRECATED: Alias for getAst */
|
||||
deprecated override Language::AST getAST() { result = this.getAst() }
|
||||
|
||||
final override string getUniqueId() {
|
||||
result = this.getVariable().toString() + " " + this.getVariable().getLocation().toString()
|
||||
}
|
||||
|
@ -163,9 +157,6 @@ abstract private class AbstractIRGeneratedVariable extends AbstractIRVariable {
|
|||
|
||||
final override Language::AST getAst() { result = ast }
|
||||
|
||||
/** DEPRECATED: Alias for getAst */
|
||||
deprecated override Language::AST getAST() { result = this.getAst() }
|
||||
|
||||
override string toString() { result = this.getBaseString() + this.getLocationString() }
|
||||
|
||||
override string getUniqueId() { none() }
|
||||
|
|
|
@ -216,9 +216,6 @@ abstract class TranslatedSideEffects extends TranslatedElement {
|
|||
|
||||
final override Locatable getAst() { result = this.getExpr() }
|
||||
|
||||
/** DEPRECATED: Alias for getAst */
|
||||
deprecated override Locatable getAST() { result = this.getAst() }
|
||||
|
||||
final override Declaration getFunction() { result = getEnclosingDeclaration(this.getExpr()) }
|
||||
|
||||
final override TranslatedElement getChild(int i) {
|
||||
|
@ -616,9 +613,6 @@ class TranslatedArgumentExprSideEffect extends TranslatedArgumentSideEffect,
|
|||
|
||||
final override Locatable getAst() { result = arg }
|
||||
|
||||
/** DEPRECATED: Alias for getAst */
|
||||
deprecated override Locatable getAST() { result = this.getAst() }
|
||||
|
||||
final override Type getIndirectionType() {
|
||||
result = arg.getUnspecifiedType().(DerivedType).getBaseType()
|
||||
or
|
||||
|
@ -651,9 +645,6 @@ class TranslatedStructorQualifierSideEffect extends TranslatedArgumentSideEffect
|
|||
|
||||
final override Locatable getAst() { result = call }
|
||||
|
||||
/** DEPRECATED: Alias for getAst */
|
||||
deprecated override Locatable getAST() { result = this.getAst() }
|
||||
|
||||
final override Type getIndirectionType() { result = call.getTarget().getDeclaringType() }
|
||||
|
||||
final override string getArgString() { result = "this" }
|
||||
|
@ -675,9 +666,6 @@ class TranslatedCallSideEffect extends TranslatedSideEffect, TTranslatedCallSide
|
|||
|
||||
override Locatable getAst() { result = expr }
|
||||
|
||||
/** DEPRECATED: Alias for getAst */
|
||||
deprecated override Locatable getAST() { result = this.getAst() }
|
||||
|
||||
override Expr getPrimaryExpr() { result = expr }
|
||||
|
||||
override predicate sortOrder(int group, int indexInGroup) {
|
||||
|
@ -716,9 +704,6 @@ class TranslatedAllocationSideEffect extends TranslatedSideEffect, TTranslatedAl
|
|||
|
||||
override Locatable getAst() { result = expr }
|
||||
|
||||
/** DEPRECATED: Alias for getAst */
|
||||
deprecated override Locatable getAST() { result = this.getAst() }
|
||||
|
||||
override Expr getPrimaryExpr() { result = expr }
|
||||
|
||||
override predicate sortOrder(int group, int indexInGroup) {
|
||||
|
|
|
@ -29,9 +29,6 @@ abstract class TranslatedCondition extends TranslatedElement {
|
|||
|
||||
final override Locatable getAst() { result = expr }
|
||||
|
||||
/** DEPRECATED: Alias for getAst */
|
||||
deprecated override Locatable getAST() { result = this.getAst() }
|
||||
|
||||
final ConditionContext getConditionContext() { result = this.getParent() }
|
||||
|
||||
final Expr getExpr() { result = expr }
|
||||
|
|
|
@ -45,9 +45,6 @@ abstract class TranslatedDeclarationEntry extends TranslatedElement, TTranslated
|
|||
final override string toString() { result = entry.toString() }
|
||||
|
||||
final override Locatable getAst() { result = entry.getAst() }
|
||||
|
||||
/** DEPRECATED: Alias for getAst */
|
||||
deprecated override Locatable getAST() { result = this.getAst() }
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -248,9 +245,6 @@ class TranslatedStaticLocalVariableInitialization extends TranslatedElement,
|
|||
|
||||
final override Locatable getAst() { result = entry.getAst() }
|
||||
|
||||
/** DEPRECATED: Alias for getAst */
|
||||
deprecated override Locatable getAST() { result = this.getAst() }
|
||||
|
||||
final override LocalVariable getVariable() { result = var }
|
||||
|
||||
final override Declaration getFunction() { result = var.getFunction() }
|
||||
|
@ -277,9 +271,6 @@ class TranslatedConditionDecl extends TranslatedLocalVariableDeclaration, TTrans
|
|||
|
||||
override Locatable getAst() { result = conditionDeclExpr }
|
||||
|
||||
/** DEPRECATED: Alias for getAst */
|
||||
deprecated override Locatable getAST() { result = this.getAst() }
|
||||
|
||||
override Declaration getFunction() { result = getEnclosingFunction(conditionDeclExpr) }
|
||||
|
||||
override LocalVariable getVariable() { result = conditionDeclExpr.getVariable() }
|
||||
|
|
|
@ -128,6 +128,9 @@ private predicate ignoreExprAndDescendants(Expr expr) {
|
|||
vaStartExpr.getLastNamedParameter().getFullyConverted() = expr
|
||||
)
|
||||
or
|
||||
// The children of C11 _Generic expressions are just surface syntax.
|
||||
exists(C11GenericExpr generic | generic.getAChild() = expr)
|
||||
or
|
||||
// Do not translate implicit destructor calls for unnamed temporary variables that are
|
||||
// conditionally constructed (until we have a mechanism for calling these only when the
|
||||
// temporary's constructor was run)
|
||||
|
@ -432,6 +435,9 @@ predicate ignoreLoad(Expr expr) {
|
|||
// The load is duplicated from the right operand.
|
||||
isExtractorFrontendVersion65OrHigher() and expr instanceof CommaExpr
|
||||
or
|
||||
// The load is duplicated from the chosen expression.
|
||||
expr instanceof C11GenericExpr
|
||||
or
|
||||
expr.(PointerDereferenceExpr).getOperand().getFullyConverted().getType().getUnspecifiedType()
|
||||
instanceof FunctionPointerType
|
||||
or
|
||||
|
@ -920,9 +926,6 @@ abstract class TranslatedElement extends TTranslatedElement {
|
|||
*/
|
||||
abstract Locatable getAst();
|
||||
|
||||
/** DEPRECATED: Alias for getAst */
|
||||
deprecated Locatable getAST() { result = this.getAst() }
|
||||
|
||||
/** Gets the location of this element. */
|
||||
Location getLocation() { result = this.getAst().getLocation() }
|
||||
|
||||
|
|
|
@ -893,7 +893,8 @@ class TranslatedTransparentConversion extends TranslatedTransparentExpr {
|
|||
(
|
||||
expr instanceof ParenthesisExpr or
|
||||
expr instanceof ReferenceDereferenceExpr or
|
||||
expr instanceof ReferenceToExpr
|
||||
expr instanceof ReferenceToExpr or
|
||||
expr instanceof C11GenericExpr
|
||||
)
|
||||
}
|
||||
|
||||
|
|
|
@ -67,9 +67,6 @@ class TranslatedFunction extends TranslatedRootElement, TTranslatedFunction {
|
|||
|
||||
final override Locatable getAst() { result = func }
|
||||
|
||||
/** DEPRECATED: Alias for getAst */
|
||||
deprecated override Locatable getAST() { result = this.getAst() }
|
||||
|
||||
/**
|
||||
* Gets the function being translated.
|
||||
*/
|
||||
|
@ -483,9 +480,6 @@ class TranslatedThisParameter extends TranslatedParameter, TTranslatedThisParame
|
|||
|
||||
final override Locatable getAst() { result = func }
|
||||
|
||||
/** DEPRECATED: Alias for getAst */
|
||||
deprecated override Locatable getAST() { result = this.getAst() }
|
||||
|
||||
final override Function getFunction() { result = func }
|
||||
|
||||
final override predicate hasIndirection() { any() }
|
||||
|
@ -518,9 +512,6 @@ class TranslatedPositionalParameter extends TranslatedParameter, TTranslatedPara
|
|||
|
||||
final override Locatable getAst() { result = param }
|
||||
|
||||
/** DEPRECATED: Alias for getAst */
|
||||
deprecated override Locatable getAST() { result = this.getAst() }
|
||||
|
||||
final override Function getFunction() {
|
||||
result = param.getFunction() or
|
||||
result = param.getCatchBlock().getEnclosingFunction()
|
||||
|
@ -558,9 +549,6 @@ class TranslatedEllipsisParameter extends TranslatedParameter, TTranslatedEllips
|
|||
|
||||
final override Locatable getAst() { result = func }
|
||||
|
||||
/** DEPRECATED: Alias for getAst */
|
||||
deprecated override Locatable getAST() { result = this.getAst() }
|
||||
|
||||
final override Function getFunction() { result = func }
|
||||
|
||||
final override predicate hasIndirection() { any() }
|
||||
|
@ -597,9 +585,6 @@ class TranslatedConstructorInitList extends TranslatedElement, InitializationCon
|
|||
|
||||
override Locatable getAst() { result = func }
|
||||
|
||||
/** DEPRECATED: Alias for getAst */
|
||||
deprecated override Locatable getAST() { result = this.getAst() }
|
||||
|
||||
override TranslatedElement getChild(int id) {
|
||||
exists(ConstructorFieldInit fieldInit |
|
||||
fieldInit = func.(Constructor).getInitializer(id) and
|
||||
|
@ -677,9 +662,6 @@ class TranslatedDestructorDestructionList extends TranslatedElement,
|
|||
|
||||
override Locatable getAst() { result = func }
|
||||
|
||||
/** DEPRECATED: Alias for getAst */
|
||||
deprecated override Locatable getAST() { result = this.getAst() }
|
||||
|
||||
override TranslatedElement getChild(int id) {
|
||||
exists(DestructorFieldDestruction fieldDestruction |
|
||||
fieldDestruction = func.(Destructor).getDestruction(id) and
|
||||
|
@ -733,9 +715,6 @@ class TranslatedReadEffects extends TranslatedElement, TTranslatedReadEffects {
|
|||
|
||||
override Locatable getAst() { result = func }
|
||||
|
||||
/** DEPRECATED: Alias for getAst */
|
||||
deprecated override Locatable getAST() { result = this.getAst() }
|
||||
|
||||
override Function getFunction() { result = func }
|
||||
|
||||
override string toString() { result = "read effects: " + func.toString() }
|
||||
|
@ -839,9 +818,6 @@ class TranslatedThisReadEffect extends TranslatedReadEffect, TTranslatedThisRead
|
|||
|
||||
override Locatable getAst() { result = func }
|
||||
|
||||
/** DEPRECATED: Alias for getAst */
|
||||
deprecated override Locatable getAST() { result = this.getAst() }
|
||||
|
||||
override Function getFunction() { result = func }
|
||||
|
||||
override string toString() { result = "read effect: this" }
|
||||
|
@ -865,9 +841,6 @@ class TranslatedParameterReadEffect extends TranslatedReadEffect, TTranslatedPar
|
|||
|
||||
override Locatable getAst() { result = param }
|
||||
|
||||
/** DEPRECATED: Alias for getAst */
|
||||
deprecated override Locatable getAST() { result = this.getAst() }
|
||||
|
||||
override string toString() { result = "read effect: " + param.toString() }
|
||||
|
||||
override Function getFunction() { result = param.getFunction() }
|
||||
|
|
|
@ -153,9 +153,6 @@ abstract class TranslatedInitialization extends TranslatedElement, TTranslatedIn
|
|||
|
||||
final override Locatable getAst() { result = expr }
|
||||
|
||||
/** DEPRECATED: Alias for getAst */
|
||||
deprecated override Locatable getAST() { result = this.getAst() }
|
||||
|
||||
/**
|
||||
* Gets the expression that is doing the initialization.
|
||||
*/
|
||||
|
@ -528,9 +525,6 @@ abstract class TranslatedFieldInitialization extends TranslatedElement {
|
|||
|
||||
final override Locatable getAst() { result = ast }
|
||||
|
||||
/** DEPRECATED: Alias for getAst */
|
||||
deprecated override Locatable getAST() { result = this.getAst() }
|
||||
|
||||
final override Declaration getFunction() {
|
||||
result = getEnclosingFunction(ast) or
|
||||
result = getEnclosingVariable(ast).(GlobalOrNamespaceVariable) or
|
||||
|
@ -701,9 +695,6 @@ abstract class TranslatedElementInitialization extends TranslatedElement {
|
|||
|
||||
final override Locatable getAst() { result = initList }
|
||||
|
||||
/** DEPRECATED: Alias for getAst */
|
||||
deprecated override Locatable getAST() { result = this.getAst() }
|
||||
|
||||
final override Declaration getFunction() {
|
||||
result = getEnclosingFunction(initList)
|
||||
or
|
||||
|
@ -912,9 +903,6 @@ abstract class TranslatedStructorCallFromStructor extends TranslatedElement, Str
|
|||
|
||||
final override Locatable getAst() { result = call }
|
||||
|
||||
/** DEPRECATED: Alias for getAst */
|
||||
deprecated override Locatable getAST() { result = this.getAst() }
|
||||
|
||||
final override TranslatedElement getChild(int id) {
|
||||
id = 0 and
|
||||
result = this.getStructorCall()
|
||||
|
@ -1058,9 +1046,6 @@ class TranslatedConstructorBareInit extends TranslatedElement, TTranslatedConstr
|
|||
|
||||
override Locatable getAst() { result = init }
|
||||
|
||||
/** DEPRECATED: Alias for getAst */
|
||||
deprecated override Locatable getAST() { result = this.getAst() }
|
||||
|
||||
final override string toString() { result = "construct base (no constructor)" }
|
||||
|
||||
override Instruction getFirstInstruction(EdgeKind kind) {
|
||||
|
|
|
@ -268,9 +268,6 @@ abstract class TranslatedStmt extends TranslatedElement, TTranslatedStmt {
|
|||
|
||||
final override Locatable getAst() { result = stmt }
|
||||
|
||||
/** DEPRECATED: Alias for getAst */
|
||||
deprecated override Locatable getAST() { result = this.getAst() }
|
||||
|
||||
final override Function getFunction() { result = stmt.getEnclosingFunction() }
|
||||
}
|
||||
|
||||
|
|
|
@ -50,9 +50,6 @@ abstract private class AbstractIRVariable extends TIRVariable {
|
|||
*/
|
||||
abstract Language::AST getAst();
|
||||
|
||||
/** DEPRECATED: Alias for getAst */
|
||||
deprecated Language::AST getAST() { result = this.getAst() }
|
||||
|
||||
/**
|
||||
* Gets an identifier string for the variable. This identifier is unique
|
||||
* within the function.
|
||||
|
@ -96,9 +93,6 @@ class IRUserVariable extends AbstractIRVariable, TIRUserVariable {
|
|||
|
||||
final override Language::AST getAst() { result = var }
|
||||
|
||||
/** DEPRECATED: Alias for getAst */
|
||||
deprecated override Language::AST getAST() { result = this.getAst() }
|
||||
|
||||
final override string getUniqueId() {
|
||||
result = this.getVariable().toString() + " " + this.getVariable().getLocation().toString()
|
||||
}
|
||||
|
@ -163,9 +157,6 @@ abstract private class AbstractIRGeneratedVariable extends AbstractIRVariable {
|
|||
|
||||
final override Language::AST getAst() { result = ast }
|
||||
|
||||
/** DEPRECATED: Alias for getAst */
|
||||
deprecated override Language::AST getAST() { result = this.getAst() }
|
||||
|
||||
override string toString() { result = this.getBaseString() + this.getLocationString() }
|
||||
|
||||
override string getUniqueId() { none() }
|
||||
|
|
|
@ -71,9 +71,6 @@ class MemoryLocation extends TMemoryLocation {
|
|||
final string getUniqueId() { result = var.getUniqueId() }
|
||||
|
||||
final predicate canReuseSsa() { canReuseSsaForVariable(var) }
|
||||
|
||||
/** DEPRECATED: Alias for canReuseSsa */
|
||||
deprecated predicate canReuseSSA() { this.canReuseSsa() }
|
||||
}
|
||||
|
||||
predicate canReuseSsaForOldResult(Instruction instr) { none() }
|
||||
|
|
|
@ -5,13 +5,13 @@
|
|||
*/
|
||||
|
||||
import semmle.code.cpp.models.interfaces.Allocation
|
||||
import semmle.code.cpp.models.interfaces.Taint
|
||||
import semmle.code.cpp.models.interfaces.DataFlow
|
||||
|
||||
/**
|
||||
* An allocation function (such as `realloc`) that has an argument for the size
|
||||
* in bytes, and an argument for an existing pointer that is to be reallocated.
|
||||
*/
|
||||
private class ReallocAllocationFunction extends AllocationFunction, TaintFunction {
|
||||
private class ReallocAllocationFunction extends AllocationFunction, DataFlowFunction {
|
||||
int sizeArg;
|
||||
int reallocArg;
|
||||
|
||||
|
@ -44,7 +44,7 @@ private class ReallocAllocationFunction extends AllocationFunction, TaintFunctio
|
|||
|
||||
override int getReallocPtrArg() { result = reallocArg }
|
||||
|
||||
override predicate hasTaintFlow(FunctionInput input, FunctionOutput output) {
|
||||
override predicate hasDataFlow(FunctionInput input, FunctionOutput output) {
|
||||
input.isParameterDeref(this.getReallocPtrArg()) and output.isReturnValueDeref()
|
||||
}
|
||||
}
|
||||
|
|
|
@ -26,7 +26,7 @@ private class Swap extends DataFlowFunction {
|
|||
* obj1.swap(obj2)
|
||||
* ```
|
||||
*/
|
||||
private class MemberSwap extends TaintFunction, MemberFunction, AliasFunction {
|
||||
private class MemberSwap extends DataFlowFunction, MemberFunction, AliasFunction {
|
||||
MemberSwap() {
|
||||
this.hasName("swap") and
|
||||
this.getNumberOfParameters() = 1 and
|
||||
|
@ -34,7 +34,7 @@ private class MemberSwap extends TaintFunction, MemberFunction, AliasFunction {
|
|||
this.getDeclaringType()
|
||||
}
|
||||
|
||||
override predicate hasTaintFlow(FunctionInput input, FunctionOutput output) {
|
||||
override predicate hasDataFlow(FunctionInput input, FunctionOutput output) {
|
||||
input.isQualifierObject() and
|
||||
output.isParameterDeref(0)
|
||||
or
|
||||
|
|
|
@ -353,22 +353,6 @@ module BoostorgAsio {
|
|||
}
|
||||
|
||||
//////////////////////// Dataflow /////////////////////
|
||||
/**
|
||||
* Abstract class for flows of protocol values to the first argument of a context
|
||||
* constructor.
|
||||
*/
|
||||
abstract deprecated class SslContextCallAbstractConfig extends DataFlow::Configuration {
|
||||
bindingset[this]
|
||||
SslContextCallAbstractConfig() { any() }
|
||||
|
||||
override predicate isSink(DataFlow::Node sink) {
|
||||
exists(ConstructorCall cc, SslContextClass c, Expr e | e = sink.asExpr() |
|
||||
c.getAContructorCall() = cc and
|
||||
cc.getArgument(0) = e
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Signature for flows of protocol values to the first argument of a context
|
||||
* constructor.
|
||||
|
@ -402,20 +386,6 @@ module BoostorgAsio {
|
|||
import DataFlow::Global<C>
|
||||
}
|
||||
|
||||
/**
|
||||
* Any protocol value that flows to the first argument of a context constructor.
|
||||
*/
|
||||
deprecated class SslContextCallConfig extends SslContextCallAbstractConfig {
|
||||
SslContextCallConfig() { this = "SslContextCallConfig" }
|
||||
|
||||
override predicate isSource(DataFlow::Node source) {
|
||||
exists(Expr e | e = source.asExpr() |
|
||||
e.fromSource() and
|
||||
not e.getLocation().getFile().toString().matches("%/boost/asio/%")
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Any protocol value that flows to the first argument of a context constructor.
|
||||
*/
|
||||
|
@ -430,21 +400,6 @@ module BoostorgAsio {
|
|||
|
||||
module SslContextCallFlow = SslContextCallGlobal<SslContextCallConfig>;
|
||||
|
||||
/**
|
||||
* A banned protocol value that flows to the first argument of a context constructor.
|
||||
*/
|
||||
deprecated class SslContextCallBannedProtocolConfig extends SslContextCallAbstractConfig {
|
||||
SslContextCallBannedProtocolConfig() { this = "SslContextCallBannedProtocolConfig" }
|
||||
|
||||
override predicate isSource(DataFlow::Node source) {
|
||||
exists(Expr e | e = source.asExpr() |
|
||||
e.fromSource() and
|
||||
not e.getLocation().getFile().toString().matches("%/boost/asio/%") and
|
||||
isExprBannedBoostProtocol(e)
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* A banned protocol value that flows to the first argument of a context constructor.
|
||||
*/
|
||||
|
@ -461,21 +416,6 @@ module BoostorgAsio {
|
|||
module SslContextCallBannedProtocolFlow =
|
||||
SslContextCallGlobal<SslContextCallBannedProtocolConfig>;
|
||||
|
||||
/**
|
||||
* A TLS 1.2 protocol value that flows to the first argument of a context constructor.
|
||||
*/
|
||||
deprecated class SslContextCallTls12ProtocolConfig extends SslContextCallAbstractConfig {
|
||||
SslContextCallTls12ProtocolConfig() { this = "SslContextCallTls12ProtocolConfig" }
|
||||
|
||||
override predicate isSource(DataFlow::Node source) {
|
||||
exists(Expr e | e = source.asExpr() |
|
||||
e.fromSource() and
|
||||
not e.getLocation().getFile().toString().matches("%/boost/asio/%") and
|
||||
isExprTls12BoostProtocol(e)
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* A TLS 1.2 protocol value that flows to the first argument of a context constructor.
|
||||
*/
|
||||
|
@ -491,21 +431,6 @@ module BoostorgAsio {
|
|||
|
||||
module SslContextCallTls12ProtocolFlow = SslContextCallGlobal<SslContextCallTls12ProtocolConfig>;
|
||||
|
||||
/**
|
||||
* A TLS 1.3 protocol value that flows to the first argument of a context constructor.
|
||||
*/
|
||||
deprecated class SslContextCallTls13ProtocolConfig extends SslContextCallAbstractConfig {
|
||||
SslContextCallTls13ProtocolConfig() { this = "SslContextCallTls12ProtocolConfig" }
|
||||
|
||||
override predicate isSource(DataFlow::Node source) {
|
||||
exists(Expr e | e = source.asExpr() |
|
||||
e.fromSource() and
|
||||
not e.getLocation().getFile().toString().matches("%/boost/asio/%") and
|
||||
isExprTls13BoostProtocol(e)
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* A TLS 1.3 protocol value that flows to the first argument of a context constructor.
|
||||
*/
|
||||
|
@ -521,21 +446,6 @@ module BoostorgAsio {
|
|||
|
||||
module SslContextCallTls13ProtocolFlow = SslContextCallGlobal<SslContextCallTls13ProtocolConfig>;
|
||||
|
||||
/**
|
||||
* A generic TLS protocol value that flows to the first argument of a context constructor.
|
||||
*/
|
||||
deprecated class SslContextCallTlsProtocolConfig extends SslContextCallAbstractConfig {
|
||||
SslContextCallTlsProtocolConfig() { this = "SslContextCallTlsProtocolConfig" }
|
||||
|
||||
override predicate isSource(DataFlow::Node source) {
|
||||
exists(Expr e | e = source.asExpr() |
|
||||
e.fromSource() and
|
||||
not e.getLocation().getFile().toString().matches("%/boost/asio/%") and
|
||||
isExprTlsBoostProtocol(e)
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* A generic TLS protocol value that flows to the first argument of a context constructor.
|
||||
*/
|
||||
|
@ -551,30 +461,6 @@ module BoostorgAsio {
|
|||
|
||||
module SslContextCallTlsProtocolFlow = SslContextCallGlobal<SslContextCallTlsProtocolConfig>;
|
||||
|
||||
/**
|
||||
* A context constructor call that flows to a call to `SetOptions()`.
|
||||
*/
|
||||
deprecated class SslContextFlowsToSetOptionConfig extends DataFlow::Configuration {
|
||||
SslContextFlowsToSetOptionConfig() { this = "SslContextFlowsToSetOptionConfig" }
|
||||
|
||||
override predicate isSource(DataFlow::Node source) {
|
||||
exists(SslContextClass c, ConstructorCall cc |
|
||||
cc = source.asExpr() and
|
||||
c.getAContructorCall() = cc
|
||||
)
|
||||
}
|
||||
|
||||
override predicate isSink(DataFlow::Node sink) {
|
||||
exists(FunctionCall fc, SslSetOptionsFunction f, Variable v, VariableAccess va |
|
||||
va = sink.asExpr()
|
||||
|
|
||||
f.getACallToThisFunction() = fc and
|
||||
v.getAnAccess() = va and
|
||||
va = fc.getQualifier()
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* A context constructor call that flows to a call to `SetOptions()`.
|
||||
*/
|
||||
|
@ -599,28 +485,6 @@ module BoostorgAsio {
|
|||
|
||||
module SslContextFlowsToSetOptionFlow = DataFlow::Global<SslContextFlowsToSetOptionConfig>;
|
||||
|
||||
/**
|
||||
* An option value that flows to the first parameter of a call to `SetOptions()`.
|
||||
*/
|
||||
deprecated class SslOptionConfig extends DataFlow::Configuration {
|
||||
SslOptionConfig() { this = "SslOptionConfig" }
|
||||
|
||||
override predicate isSource(DataFlow::Node source) {
|
||||
exists(Expr e | e = source.asExpr() |
|
||||
e.fromSource() and
|
||||
not e.getLocation().getFile().toString().matches("%/boost/asio/%")
|
||||
)
|
||||
}
|
||||
|
||||
override predicate isSink(DataFlow::Node sink) {
|
||||
exists(SslSetOptionsFunction f, FunctionCall call |
|
||||
sink.asExpr() = call.getArgument(0) and
|
||||
f.getACallToThisFunction() = call and
|
||||
not sink.getLocation().getFile().toString().matches("%/boost/asio/%")
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* An option value that flows to the first parameter of a call to `SetOptions()`.
|
||||
*/
|
||||
|
|
|
@ -384,11 +384,23 @@ function_return_type(
|
|||
*/
|
||||
coroutine(
|
||||
unique int function: @function ref,
|
||||
int traits: @type ref,
|
||||
int handle: @variable ref,
|
||||
int promise: @variable ref
|
||||
int traits: @type ref
|
||||
);
|
||||
|
||||
/*
|
||||
case @coroutine_placeholder_variable.kind of
|
||||
1 = @handle
|
||||
| 2 = @promise
|
||||
| 3 = @init_await_resume
|
||||
;
|
||||
*/
|
||||
|
||||
coroutine_placeholder_variable(
|
||||
unique int placeholder_variable: @variable ref,
|
||||
int kind: int ref,
|
||||
int function: @function ref
|
||||
)
|
||||
|
||||
/** The `new` function used for allocating the coroutine state, if any. */
|
||||
coroutine_new(
|
||||
unique int function: @function ref,
|
||||
|
@ -829,22 +841,6 @@ variable_template_argument_value(
|
|||
int arg_value: @expr ref
|
||||
);
|
||||
|
||||
/*
|
||||
Fixed point types
|
||||
precision(1) = short, precision(2) = default, precision(3) = long
|
||||
is_unsigned(1) = unsigned is_unsigned(2) = signed
|
||||
is_fract_type(1) = declared with _Fract
|
||||
saturating(1) = declared with _Sat
|
||||
*/
|
||||
/* TODO
|
||||
fixedpointtypes(
|
||||
unique int id: @fixedpointtype,
|
||||
int precision: int ref,
|
||||
int is_unsigned: int ref,
|
||||
int is_fract_type: int ref,
|
||||
int saturating: int ref);
|
||||
*/
|
||||
|
||||
routinetypes(
|
||||
unique int id: @routinetype,
|
||||
int return_type: @type ref
|
||||
|
@ -1210,6 +1206,7 @@ conversionkinds(
|
|||
| @reference_to
|
||||
| @ref_indirect
|
||||
| @temp_init
|
||||
| @c11_generic
|
||||
;
|
||||
|
||||
/*
|
||||
|
@ -1792,6 +1789,7 @@ case @expr.kind of
|
|||
| 386 = @isscopedenum
|
||||
| 387 = @istriviallyrelocatable
|
||||
| 388 = @datasizeof
|
||||
| 389 = @c11_generic
|
||||
;
|
||||
|
||||
@var_args_expr = @vastartexpr
|
||||
|
|
Разница между файлами не показана из-за своего большого размера
Загрузить разницу
Разница между файлами не показана из-за своего большого размера
Загрузить разницу
Разница между файлами не показана из-за своего большого размера
Загрузить разницу
|
@ -0,0 +1,2 @@
|
|||
description: Expose C11 _Generics
|
||||
compatibility: backwards
|
Разница между файлами не показана из-за своего большого размера
Загрузить разницу
Разница между файлами не показана из-за своего большого размера
Загрузить разницу
|
@ -0,0 +1,4 @@
|
|||
description: Improve handling of coroutine placeholder variables
|
||||
compatibility: partial
|
||||
coroutine.rel: run upgrades.qlo new_coroutine
|
||||
coroutine_placeholder_variable.rel: run upgrades.qlo new_coroutine_placeholder_variable
|
|
@ -0,0 +1,19 @@
|
|||
class Function extends @function {
|
||||
string toString() { none() }
|
||||
}
|
||||
|
||||
class Type extends @type {
|
||||
string toString() { none() }
|
||||
}
|
||||
|
||||
class Variable extends @variable {
|
||||
string toString() { none() }
|
||||
}
|
||||
|
||||
query predicate new_coroutine(Function func, Type traits) { coroutine(func, traits, _, _) }
|
||||
|
||||
query predicate new_coroutine_placeholder_variable(Variable var, int kind, Function func) {
|
||||
coroutine(func, _, var, _) and kind = 1
|
||||
or
|
||||
coroutine(func, _, _, var) and kind = 2
|
||||
}
|
|
@ -1,3 +1,9 @@
|
|||
## 1.2.1
|
||||
|
||||
### Minor Analysis Improvements
|
||||
|
||||
* The `cpp/uncontrolled-allocation-size` ("Uncontrolled allocation size") query now considers arithmetic operations that might reduce the size of user input as a barrier. The query therefore produces fewer false positive results.
|
||||
|
||||
## 1.2.0
|
||||
|
||||
### Query Metadata Changes
|
||||
|
|
|
@ -205,20 +205,6 @@ class ChecksForLeapYearFunctionCall extends FunctionCall {
|
|||
ChecksForLeapYearFunctionCall() { this.getTarget() instanceof ChecksForLeapYearFunction }
|
||||
}
|
||||
|
||||
/**
|
||||
* Data flow configuration for finding a variable access that would flow into
|
||||
* a function call that includes an operation to check for leap year.
|
||||
*/
|
||||
deprecated class LeapYearCheckConfiguration extends DataFlow::Configuration {
|
||||
LeapYearCheckConfiguration() { this = "LeapYearCheckConfiguration" }
|
||||
|
||||
override predicate isSource(DataFlow::Node source) { source.asExpr() instanceof VariableAccess }
|
||||
|
||||
override predicate isSink(DataFlow::Node sink) {
|
||||
exists(ChecksForLeapYearFunctionCall fc | sink.asExpr() = fc.getAnArgument())
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Data flow configuration for finding a variable access that would flow into
|
||||
* a function call that includes an operation to check for leap year.
|
||||
|
@ -233,33 +219,6 @@ private module LeapYearCheckConfig implements DataFlow::ConfigSig {
|
|||
|
||||
module LeapYearCheckFlow = DataFlow::Global<LeapYearCheckConfig>;
|
||||
|
||||
/**
|
||||
* Data flow configuration for finding an operation with hardcoded 365 that will flow into
|
||||
* a `FILEINFO` field.
|
||||
*/
|
||||
deprecated class FiletimeYearArithmeticOperationCheckConfiguration extends DataFlow::Configuration {
|
||||
FiletimeYearArithmeticOperationCheckConfiguration() {
|
||||
this = "FiletimeYearArithmeticOperationCheckConfiguration"
|
||||
}
|
||||
|
||||
override predicate isSource(DataFlow::Node source) {
|
||||
exists(Expr e, Operation op | e = source.asExpr() |
|
||||
op.getAChild*().getValue().toInt() = 365 and
|
||||
op.getAChild*() = e
|
||||
)
|
||||
}
|
||||
|
||||
override predicate isSink(DataFlow::Node sink) {
|
||||
exists(StructLikeClass dds, FieldAccess fa, AssignExpr aexpr, Expr e | e = sink.asExpr() |
|
||||
dds instanceof PackedTimeType and
|
||||
fa.getQualifier().getUnderlyingType() = dds and
|
||||
fa.isModified() and
|
||||
aexpr.getAChild() = fa and
|
||||
aexpr.getChild(1).getAChild*() = e
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Data flow configuration for finding an operation with hardcoded 365 that will flow into
|
||||
* a `FILEINFO` field.
|
||||
|
@ -286,51 +245,6 @@ private module FiletimeYearArithmeticOperationCheckConfig implements DataFlow::C
|
|||
module FiletimeYearArithmeticOperationCheckFlow =
|
||||
DataFlow::Global<FiletimeYearArithmeticOperationCheckConfig>;
|
||||
|
||||
/**
|
||||
* Taint configuration for finding an operation with hardcoded 365 that will flow into any known date/time field.
|
||||
*/
|
||||
deprecated class PossibleYearArithmeticOperationCheckConfiguration extends TaintTracking::Configuration
|
||||
{
|
||||
PossibleYearArithmeticOperationCheckConfiguration() {
|
||||
this = "PossibleYearArithmeticOperationCheckConfiguration"
|
||||
}
|
||||
|
||||
override predicate isSource(DataFlow::Node source) {
|
||||
exists(Operation op | op = source.asExpr() |
|
||||
op.getAChild*().getValue().toInt() = 365 and
|
||||
(
|
||||
not op.getParent() instanceof Expr or
|
||||
op.getParent() instanceof Assignment
|
||||
)
|
||||
)
|
||||
}
|
||||
|
||||
override predicate isAdditionalTaintStep(DataFlow::Node node1, DataFlow::Node node2) {
|
||||
// flow from anything on the RHS of an assignment to a time/date structure to that
|
||||
// assignment.
|
||||
exists(StructLikeClass dds, FieldAccess fa, Assignment aexpr, Expr e |
|
||||
e = node1.asExpr() and
|
||||
fa = node2.asExpr()
|
||||
|
|
||||
(dds instanceof PackedTimeType or dds instanceof UnpackedTimeType) and
|
||||
fa.getQualifier().getUnderlyingType() = dds and
|
||||
aexpr.getLValue() = fa and
|
||||
aexpr.getRValue().getAChild*() = e
|
||||
)
|
||||
}
|
||||
|
||||
override predicate isSink(DataFlow::Node sink) {
|
||||
exists(StructLikeClass dds, FieldAccess fa, AssignExpr aexpr |
|
||||
aexpr.getRValue() = sink.asExpr()
|
||||
|
|
||||
(dds instanceof PackedTimeType or dds instanceof UnpackedTimeType) and
|
||||
fa.getQualifier().getUnderlyingType() = dds and
|
||||
fa.isModified() and
|
||||
aexpr.getLValue() = fa
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Taint configuration for finding an operation with hardcoded 365 that will flow into any known date/time field.
|
||||
*/
|
||||
|
|
|
@ -129,24 +129,6 @@ class NetworkFunctionCall extends FunctionCall {
|
|||
NetworkFunctionCall() { this.getTarget().hasName(["ntohd", "ntohf", "ntohl", "ntohll", "ntohs"]) }
|
||||
}
|
||||
|
||||
deprecated class NetworkToBufferSizeConfiguration extends DataFlow::Configuration {
|
||||
NetworkToBufferSizeConfiguration() { this = "NetworkToBufferSizeConfiguration" }
|
||||
|
||||
override predicate isSource(DataFlow::Node node) { node.asExpr() instanceof NetworkFunctionCall }
|
||||
|
||||
override predicate isSink(DataFlow::Node node) {
|
||||
node.asExpr() = any(BufferAccess ba).getAccessedLength()
|
||||
}
|
||||
|
||||
override predicate isBarrier(DataFlow::Node node) {
|
||||
exists(GuardCondition gc, GVN gvn |
|
||||
gc.getAChild*() = gvn.getAnExpr() and
|
||||
globalValueNumber(node.asExpr()) = gvn and
|
||||
gc.controls(node.asExpr().getBasicBlock(), _)
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
private module NetworkToBufferSizeConfig implements DataFlow::ConfigSig {
|
||||
predicate isSource(DataFlow::Node node) { node.asExpr() instanceof NetworkFunctionCall }
|
||||
|
||||
|
|
|
@ -41,20 +41,6 @@ class ExternalApiDataNode extends DataFlow::Node {
|
|||
string getFunctionDescription() { result = this.getExternalFunction().toString() }
|
||||
}
|
||||
|
||||
/** A configuration for tracking flow from `RemoteFlowSource`s to `ExternalApiDataNode`s. */
|
||||
deprecated class UntrustedDataToExternalApiConfig extends TaintTracking::Configuration {
|
||||
UntrustedDataToExternalApiConfig() { this = "UntrustedDataToExternalAPIConfig" }
|
||||
|
||||
override predicate isSource(DataFlow::Node source) {
|
||||
exists(RemoteFlowSourceFunction remoteFlow |
|
||||
remoteFlow = source.asExpr().(Call).getTarget() and
|
||||
remoteFlow.hasRemoteFlowSource(_, _)
|
||||
)
|
||||
}
|
||||
|
||||
override predicate isSink(DataFlow::Node sink) { sink instanceof ExternalApiDataNode }
|
||||
}
|
||||
|
||||
/** A configuration for tracking flow from `RemoteFlowSource`s to `ExternalApiDataNode`s. */
|
||||
private module UntrustedDataToExternalApiConfig implements DataFlow::ConfigSig {
|
||||
predicate isSource(DataFlow::Node source) {
|
||||
|
|
|
@ -41,15 +41,6 @@ class ExternalApiDataNode extends DataFlow::Node {
|
|||
string getFunctionDescription() { result = this.getExternalFunction().toString() }
|
||||
}
|
||||
|
||||
/** A configuration for tracking flow from `RemoteFlowSource`s to `ExternalApiDataNode`s. */
|
||||
deprecated class UntrustedDataToExternalApiConfig extends TaintTracking::Configuration {
|
||||
UntrustedDataToExternalApiConfig() { this = "UntrustedDataToExternalAPIConfigIR" }
|
||||
|
||||
override predicate isSource(DataFlow::Node source) { source instanceof RemoteFlowSource }
|
||||
|
||||
override predicate isSink(DataFlow::Node sink) { sink instanceof ExternalApiDataNode }
|
||||
}
|
||||
|
||||
/** A configuration for tracking flow from `RemoteFlowSource`s to `ExternalApiDataNode`s. */
|
||||
private module UntrustedDataToExternalApiConfig implements DataFlow::ConfigSig {
|
||||
predicate isSource(DataFlow::Node source) { source instanceof RemoteFlowSource }
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
/**
|
||||
* This file provides the `bounded` predicate that is used in both `cpp/uncontrolled-arithmetic`
|
||||
* and `cpp/tainted-arithmetic`.
|
||||
* This file provides the `bounded` predicate that is used in `cpp/uncontrolled-arithmetic`,
|
||||
* `cpp/tainted-arithmetic` and `cpp/uncontrolled-allocation-size`.
|
||||
*/
|
||||
|
||||
private import cpp
|
||||
|
@ -8,20 +8,18 @@ private import semmle.code.cpp.rangeanalysis.SimpleRangeAnalysis
|
|||
private import semmle.code.cpp.rangeanalysis.RangeAnalysisUtils
|
||||
|
||||
/**
|
||||
* An operand `e` of a bitwise and expression `andExpr` (i.e., `andExpr` is either an `BitwiseAndExpr`
|
||||
* or an `AssignAndExpr`) with operands `operand1` and `operand2` is the operand that is not `e` is upper
|
||||
* bounded by some number that is less than the maximum integer allowed by the result type of `andExpr`.
|
||||
* An operand `operand` of a bitwise and expression `andExpr` (i.e., `andExpr` is either a
|
||||
* `BitwiseAndExpr` or an `AssignAndExpr`) is upper bounded by some number that is less than the
|
||||
* maximum integer allowed by the result type of `andExpr`.
|
||||
*/
|
||||
pragma[inline]
|
||||
private predicate boundedBitwiseAnd(Expr e, Expr andExpr, Expr operand1, Expr operand2) {
|
||||
operand1 != operand2 and
|
||||
e = operand1 and
|
||||
upperBound(operand2.getFullyConverted()) < exprMaxVal(andExpr.getFullyConverted())
|
||||
private predicate boundedBitwiseAnd(Expr operand, Expr andExpr) {
|
||||
upperBound(operand.getFullyConverted()) < exprMaxVal(andExpr.getFullyConverted())
|
||||
}
|
||||
|
||||
/**
|
||||
* Holds if `e` is an arithmetic expression that cannot overflow, or if `e` is an operand of an
|
||||
* operation that may greatly reduce the range of possible values.
|
||||
* Holds if `e` is an arithmetic expression that cannot overflow, or if `e` is an operation that
|
||||
* may greatly reduce the range of possible values.
|
||||
*/
|
||||
predicate bounded(Expr e) {
|
||||
// There can be two separate reasons for `convertedExprMightOverflow` not holding:
|
||||
|
@ -35,25 +33,25 @@ predicate bounded(Expr e) {
|
|||
) and
|
||||
not convertedExprMightOverflow(e)
|
||||
or
|
||||
// Optimistically assume that a remainder expression always yields a much smaller value.
|
||||
e = any(RemExpr rem).getLeftOperand()
|
||||
// Optimistically assume that the following operations always yields a much smaller value.
|
||||
e instanceof RemExpr
|
||||
or
|
||||
e = any(AssignRemExpr rem).getLValue()
|
||||
e instanceof DivExpr
|
||||
or
|
||||
e instanceof RShiftExpr
|
||||
or
|
||||
exists(BitwiseAndExpr andExpr |
|
||||
boundedBitwiseAnd(e, andExpr, andExpr.getAnOperand(), andExpr.getAnOperand())
|
||||
e = andExpr and boundedBitwiseAnd(andExpr.getAnOperand(), andExpr)
|
||||
)
|
||||
or
|
||||
exists(AssignAndExpr andExpr |
|
||||
boundedBitwiseAnd(e, andExpr, andExpr.getAnOperand(), andExpr.getAnOperand())
|
||||
)
|
||||
or
|
||||
// Optimistically assume that a division always yields a much smaller value.
|
||||
e = any(DivExpr div).getLeftOperand()
|
||||
// For the assignment variant of the operations we place the barrier on the assigned lvalue.
|
||||
e = any(AssignRemExpr rem).getLValue()
|
||||
or
|
||||
e = any(AssignDivExpr div).getLValue()
|
||||
or
|
||||
e = any(RShiftExpr shift).getLeftOperand()
|
||||
or
|
||||
e = any(AssignRShiftExpr div).getLValue()
|
||||
or
|
||||
exists(AssignAndExpr andExpr |
|
||||
e = andExpr.getLValue() and boundedBitwiseAnd(andExpr.getRValue(), andExpr)
|
||||
)
|
||||
}
|
||||
|
|
|
@ -1,4 +1,5 @@
|
|||
---
|
||||
category: minorAnalysis
|
||||
---
|
||||
* The `cpp/uncontrolled-allocation-size` ("Uncontrolled allocation size") query now considers arithmetic operations that might reduce the size of user input as a barrier. The query therefore produces fewer false positive results.
|
||||
## 1.2.1
|
||||
|
||||
### Minor Analysis Improvements
|
||||
|
||||
* The `cpp/uncontrolled-allocation-size` ("Uncontrolled allocation size") query now considers arithmetic operations that might reduce the size of user input as a barrier. The query therefore produces fewer false positive results.
|
|
@ -1,2 +1,2 @@
|
|||
---
|
||||
lastReleaseVersion: 1.2.0
|
||||
lastReleaseVersion: 1.2.1
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
name: codeql/cpp-queries
|
||||
version: 1.2.1-dev
|
||||
version: 1.2.2-dev
|
||||
groups:
|
||||
- cpp
|
||||
- queries
|
||||
|
|
|
@ -0,0 +1,458 @@
|
|||
#-----| [CopyAssignmentOperator] __va_list_tag& __va_list_tag::operator=(__va_list_tag const&)
|
||||
#-----| <params>:
|
||||
#-----| getParameter(0): [Parameter] (unnamed parameter 0)
|
||||
#-----| Type = [LValueReferenceType] const __va_list_tag &
|
||||
#-----| [MoveAssignmentOperator] __va_list_tag& __va_list_tag::operator=(__va_list_tag&&)
|
||||
#-----| <params>:
|
||||
#-----| getParameter(0): [Parameter] (unnamed parameter 0)
|
||||
#-----| Type = [RValueReferenceType] __va_list_tag &&
|
||||
generic.c:
|
||||
# 3| [FormattingFunction,TopLevelFunction] int printf(char const*)
|
||||
# 3| <params>:
|
||||
# 3| getParameter(0): [Parameter] format
|
||||
# 3| Type = [PointerType] const char *
|
||||
# 14| [TopLevelFunction] int main()
|
||||
# 14| <params>:
|
||||
# 15| getEntryPoint(): [BlockStmt] { ... }
|
||||
# 16| getStmt(0): [DeclStmt] declaration
|
||||
# 16| getDeclarationEntry(0): [VariableDeclarationEntry] definition of i
|
||||
# 16| Type = [IntType] int
|
||||
# 17| getStmt(1): [DeclStmt] declaration
|
||||
# 17| getDeclarationEntry(0): [VariableDeclarationEntry] definition of m
|
||||
# 17| Type = [CTypedefType] MYINT
|
||||
# 18| getStmt(2): [DeclStmt] declaration
|
||||
# 18| getDeclarationEntry(0): [VariableDeclarationEntry] definition of s
|
||||
# 18| Type = [PointerType] const char *
|
||||
# 19| getStmt(3): [DeclStmt] declaration
|
||||
# 19| getDeclarationEntry(0): [VariableDeclarationEntry] definition of f
|
||||
# 19| Type = [PointerType] float ***
|
||||
# 21| getStmt(4): [ExprStmt] ExprStmt
|
||||
# 21| getExpr(): [FormattingFunctionCall,FunctionCall] call to printf
|
||||
# 21| Type = [IntType] int
|
||||
# 21| ValueCategory = prvalue
|
||||
# 21| getArgument(0): i is %s\n
|
||||
# 21| Type = [ArrayType] char[9]
|
||||
# 21| Value = [StringLiteral] "i is %s\n"
|
||||
# 21| ValueCategory = lvalue
|
||||
# 21| getArgument(1): int
|
||||
# 21| Type = [ArrayType] char[4]
|
||||
# 21| Value = [StringLiteral] "int"
|
||||
# 21| ValueCategory = lvalue
|
||||
# 21| getArgument(0).getFullyConverted(): [CStyleCast] (const char *)...
|
||||
# 21| Conversion = [PointerConversion] pointer conversion
|
||||
# 21| Type = [PointerType] const char *
|
||||
# 21| ValueCategory = prvalue
|
||||
# 21| getExpr(): [ArrayToPointerConversion] array to pointer conversion
|
||||
# 21| Type = [CharPointerType] char *
|
||||
# 21| ValueCategory = prvalue
|
||||
# 21| getArgument(1).getFullyConverted(): [ArrayToPointerConversion] array to pointer conversion
|
||||
# 21| Type = [CharPointerType] char *
|
||||
# 21| ValueCategory = prvalue
|
||||
# 21| getExpr(): [C11GenericExpr] _Generic
|
||||
# 21| Type = [ArrayType] char[4]
|
||||
# 21| Value = [C11GenericExpr] int
|
||||
# 21| ValueCategory = lvalue
|
||||
# 21| getControllingExpr(): [VariableAccess] i
|
||||
# 21| Type = [IntType] int
|
||||
# 21| ValueCategory = prvalue(load)
|
||||
# 21| getAssociationType(0): [TypeName] int
|
||||
# 21| Type = [IntType] int
|
||||
# 21| ValueCategory = prvalue
|
||||
# 21| getAssociationExpr(0): [ReuseExpr] reuse of int
|
||||
# 21| Type = [ArrayType] char[4]
|
||||
# 21| ValueCategory = lvalue
|
||||
# 21| getAssociationType(1): [TypeName] const char *
|
||||
# 21| Type = [PointerType] const char *
|
||||
# 21| ValueCategory = prvalue
|
||||
# 21| getAssociationExpr(1): string
|
||||
# 21| Type = [ArrayType] char[7]
|
||||
# 21| Value = [StringLiteral] "string"
|
||||
# 21| ValueCategory = lvalue
|
||||
# 21| getAssociationType(2): [TypeName] void
|
||||
# 21| Type = [VoidType] void
|
||||
# 21| ValueCategory = prvalue
|
||||
# 21| getAssociationExpr(2): unknown
|
||||
# 21| Type = [ArrayType] char[8]
|
||||
# 21| Value = [StringLiteral] "unknown"
|
||||
# 21| ValueCategory = lvalue
|
||||
# 21| getControllingExpr().getFullyConverted(): [ParenthesisExpr] (...)
|
||||
# 21| Type = [IntType] int
|
||||
# 21| ValueCategory = prvalue(load)
|
||||
# 22| getStmt(5): [ExprStmt] ExprStmt
|
||||
# 22| getExpr(): [FormattingFunctionCall,FunctionCall] call to printf
|
||||
# 22| Type = [IntType] int
|
||||
# 22| ValueCategory = prvalue
|
||||
# 22| getArgument(0): c is %s\n
|
||||
# 22| Type = [ArrayType] char[9]
|
||||
# 22| Value = [StringLiteral] "c is %s\n"
|
||||
# 22| ValueCategory = lvalue
|
||||
# 22| getArgument(1): int
|
||||
# 22| Type = [ArrayType] char[4]
|
||||
# 22| Value = [StringLiteral] "int"
|
||||
# 22| ValueCategory = lvalue
|
||||
# 22| getArgument(0).getFullyConverted(): [CStyleCast] (const char *)...
|
||||
# 22| Conversion = [PointerConversion] pointer conversion
|
||||
# 22| Type = [PointerType] const char *
|
||||
# 22| ValueCategory = prvalue
|
||||
# 22| getExpr(): [ArrayToPointerConversion] array to pointer conversion
|
||||
# 22| Type = [CharPointerType] char *
|
||||
# 22| ValueCategory = prvalue
|
||||
# 22| getArgument(1).getFullyConverted(): [ArrayToPointerConversion] array to pointer conversion
|
||||
# 22| Type = [CharPointerType] char *
|
||||
# 22| ValueCategory = prvalue
|
||||
# 22| getExpr(): [C11GenericExpr] _Generic
|
||||
# 22| Type = [ArrayType] char[4]
|
||||
# 22| Value = [C11GenericExpr] int
|
||||
# 22| ValueCategory = lvalue
|
||||
# 22| getControllingExpr(): [VariableAccess] m
|
||||
# 22| Type = [CTypedefType] MYINT
|
||||
# 22| ValueCategory = prvalue(load)
|
||||
# 22| getAssociationType(0): [TypeName] int
|
||||
# 22| Type = [IntType] int
|
||||
# 22| ValueCategory = prvalue
|
||||
# 22| getAssociationExpr(0): [ReuseExpr] reuse of int
|
||||
# 22| Type = [ArrayType] char[4]
|
||||
# 22| ValueCategory = lvalue
|
||||
# 22| getAssociationType(1): [TypeName] const char *
|
||||
# 22| Type = [PointerType] const char *
|
||||
# 22| ValueCategory = prvalue
|
||||
# 22| getAssociationExpr(1): string
|
||||
# 22| Type = [ArrayType] char[7]
|
||||
# 22| Value = [StringLiteral] "string"
|
||||
# 22| ValueCategory = lvalue
|
||||
# 22| getAssociationType(2): [TypeName] void
|
||||
# 22| Type = [VoidType] void
|
||||
# 22| ValueCategory = prvalue
|
||||
# 22| getAssociationExpr(2): unknown
|
||||
# 22| Type = [ArrayType] char[8]
|
||||
# 22| Value = [StringLiteral] "unknown"
|
||||
# 22| ValueCategory = lvalue
|
||||
# 22| getControllingExpr().getFullyConverted(): [ParenthesisExpr] (...)
|
||||
# 22| Type = [CTypedefType] MYINT
|
||||
# 22| ValueCategory = prvalue(load)
|
||||
# 23| getStmt(6): [ExprStmt] ExprStmt
|
||||
# 23| getExpr(): [FormattingFunctionCall,FunctionCall] call to printf
|
||||
# 23| Type = [IntType] int
|
||||
# 23| ValueCategory = prvalue
|
||||
# 23| getArgument(0): s is %s\n
|
||||
# 23| Type = [ArrayType] char[9]
|
||||
# 23| Value = [StringLiteral] "s is %s\n"
|
||||
# 23| ValueCategory = lvalue
|
||||
# 23| getArgument(1): string
|
||||
# 23| Type = [ArrayType] char[7]
|
||||
# 23| Value = [StringLiteral] "string"
|
||||
# 23| ValueCategory = lvalue
|
||||
# 23| getArgument(0).getFullyConverted(): [CStyleCast] (const char *)...
|
||||
# 23| Conversion = [PointerConversion] pointer conversion
|
||||
# 23| Type = [PointerType] const char *
|
||||
# 23| ValueCategory = prvalue
|
||||
# 23| getExpr(): [ArrayToPointerConversion] array to pointer conversion
|
||||
# 23| Type = [CharPointerType] char *
|
||||
# 23| ValueCategory = prvalue
|
||||
# 23| getArgument(1).getFullyConverted(): [ArrayToPointerConversion] array to pointer conversion
|
||||
# 23| Type = [CharPointerType] char *
|
||||
# 23| ValueCategory = prvalue
|
||||
# 23| getExpr(): [C11GenericExpr] _Generic
|
||||
# 23| Type = [ArrayType] char[7]
|
||||
# 23| Value = [C11GenericExpr] string
|
||||
# 23| ValueCategory = lvalue
|
||||
# 23| getControllingExpr(): [VariableAccess] s
|
||||
# 23| Type = [PointerType] const char *
|
||||
# 23| ValueCategory = prvalue(load)
|
||||
# 23| getAssociationType(0): [TypeName] int
|
||||
# 23| Type = [IntType] int
|
||||
# 23| ValueCategory = prvalue
|
||||
# 23| getAssociationExpr(0): int
|
||||
# 23| Type = [ArrayType] char[4]
|
||||
# 23| Value = [StringLiteral] "int"
|
||||
# 23| ValueCategory = lvalue
|
||||
# 23| getAssociationType(1): [TypeName] const char *
|
||||
# 23| Type = [PointerType] const char *
|
||||
# 23| ValueCategory = prvalue
|
||||
# 23| getAssociationExpr(1): [ReuseExpr] reuse of string
|
||||
# 23| Type = [ArrayType] char[7]
|
||||
# 23| ValueCategory = lvalue
|
||||
# 23| getAssociationType(2): [TypeName] void
|
||||
# 23| Type = [VoidType] void
|
||||
# 23| ValueCategory = prvalue
|
||||
# 23| getAssociationExpr(2): unknown
|
||||
# 23| Type = [ArrayType] char[8]
|
||||
# 23| Value = [StringLiteral] "unknown"
|
||||
# 23| ValueCategory = lvalue
|
||||
# 23| getControllingExpr().getFullyConverted(): [ParenthesisExpr] (...)
|
||||
# 23| Type = [PointerType] const char *
|
||||
# 23| ValueCategory = prvalue(load)
|
||||
# 24| getStmt(7): [ExprStmt] ExprStmt
|
||||
# 24| getExpr(): [FormattingFunctionCall,FunctionCall] call to printf
|
||||
# 24| Type = [IntType] int
|
||||
# 24| ValueCategory = prvalue
|
||||
# 24| getArgument(0): f is %s\n
|
||||
# 24| Type = [ArrayType] char[9]
|
||||
# 24| Value = [StringLiteral] "f is %s\n"
|
||||
# 24| ValueCategory = lvalue
|
||||
# 24| getArgument(1): unknown
|
||||
# 24| Type = [ArrayType] char[8]
|
||||
# 24| Value = [StringLiteral] "unknown"
|
||||
# 24| ValueCategory = lvalue
|
||||
# 24| getArgument(0).getFullyConverted(): [CStyleCast] (const char *)...
|
||||
# 24| Conversion = [PointerConversion] pointer conversion
|
||||
# 24| Type = [PointerType] const char *
|
||||
# 24| ValueCategory = prvalue
|
||||
# 24| getExpr(): [ArrayToPointerConversion] array to pointer conversion
|
||||
# 24| Type = [CharPointerType] char *
|
||||
# 24| ValueCategory = prvalue
|
||||
# 24| getArgument(1).getFullyConverted(): [ArrayToPointerConversion] array to pointer conversion
|
||||
# 24| Type = [CharPointerType] char *
|
||||
# 24| ValueCategory = prvalue
|
||||
# 24| getExpr(): [C11GenericExpr] _Generic
|
||||
# 24| Type = [ArrayType] char[8]
|
||||
# 24| Value = [C11GenericExpr] unknown
|
||||
# 24| ValueCategory = lvalue
|
||||
# 24| getControllingExpr(): [VariableAccess] f
|
||||
# 24| Type = [PointerType] float ***
|
||||
# 24| ValueCategory = prvalue(load)
|
||||
# 24| getAssociationType(0): [TypeName] int
|
||||
# 24| Type = [IntType] int
|
||||
# 24| ValueCategory = prvalue
|
||||
# 24| getAssociationExpr(0): int
|
||||
# 24| Type = [ArrayType] char[4]
|
||||
# 24| Value = [StringLiteral] "int"
|
||||
# 24| ValueCategory = lvalue
|
||||
# 24| getAssociationType(1): [TypeName] const char *
|
||||
# 24| Type = [PointerType] const char *
|
||||
# 24| ValueCategory = prvalue
|
||||
# 24| getAssociationExpr(1): string
|
||||
# 24| Type = [ArrayType] char[7]
|
||||
# 24| Value = [StringLiteral] "string"
|
||||
# 24| ValueCategory = lvalue
|
||||
# 24| getAssociationType(2): [TypeName] void
|
||||
# 24| Type = [VoidType] void
|
||||
# 24| ValueCategory = prvalue
|
||||
# 24| getAssociationExpr(2): [ReuseExpr] reuse of unknown
|
||||
# 24| Type = [ArrayType] char[8]
|
||||
# 24| ValueCategory = lvalue
|
||||
# 24| getControllingExpr().getFullyConverted(): [ParenthesisExpr] (...)
|
||||
# 24| Type = [PointerType] float ***
|
||||
# 24| ValueCategory = prvalue(load)
|
||||
# 25| getStmt(8): [ReturnStmt] return ...
|
||||
#-----| getExpr(): [Literal] 0
|
||||
#-----| Type = [IntType] int
|
||||
#-----| Value = [Literal] 0
|
||||
#-----| ValueCategory = prvalue
|
||||
generic.cpp:
|
||||
# 4| [FormattingFunction,TopLevelFunction] int printf(char const*)
|
||||
# 4| <params>:
|
||||
# 4| getParameter(0): [Parameter] format
|
||||
# 4| Type = [PointerType] const char *
|
||||
# 15| [TopLevelFunction] int main()
|
||||
# 15| <params>:
|
||||
# 16| getEntryPoint(): [BlockStmt] { ... }
|
||||
# 17| getStmt(0): [DeclStmt] declaration
|
||||
# 17| getDeclarationEntry(0): [VariableDeclarationEntry] definition of i
|
||||
# 17| Type = [IntType] int
|
||||
# 18| getStmt(1): [DeclStmt] declaration
|
||||
# 18| getDeclarationEntry(0): [VariableDeclarationEntry] definition of m
|
||||
# 18| Type = [CTypedefType] MYINT
|
||||
# 19| getStmt(2): [DeclStmt] declaration
|
||||
# 19| getDeclarationEntry(0): [VariableDeclarationEntry] definition of s
|
||||
# 19| Type = [PointerType] const char *
|
||||
# 20| getStmt(3): [DeclStmt] declaration
|
||||
# 20| getDeclarationEntry(0): [VariableDeclarationEntry] definition of f
|
||||
# 20| Type = [PointerType] float ***
|
||||
# 22| getStmt(4): [ExprStmt] ExprStmt
|
||||
# 22| getExpr(): [FormattingFunctionCall,FunctionCall] call to printf
|
||||
# 22| Type = [IntType] int
|
||||
# 22| ValueCategory = prvalue
|
||||
# 22| getArgument(0): i is %s\n
|
||||
# 22| Type = [ArrayType] const char[9]
|
||||
# 22| Value = [StringLiteral] "i is %s\n"
|
||||
# 22| ValueCategory = lvalue
|
||||
# 22| getArgument(1): int
|
||||
# 22| Type = [ArrayType] const char[4]
|
||||
# 22| Value = [StringLiteral] "int"
|
||||
# 22| ValueCategory = lvalue
|
||||
# 22| getArgument(0).getFullyConverted(): [ArrayToPointerConversion] array to pointer conversion
|
||||
# 22| Type = [PointerType] const char *
|
||||
# 22| ValueCategory = prvalue
|
||||
# 22| getArgument(1).getFullyConverted(): [ArrayToPointerConversion] array to pointer conversion
|
||||
# 22| Type = [PointerType] const char *
|
||||
# 22| ValueCategory = prvalue
|
||||
# 22| getExpr(): [C11GenericExpr] _Generic
|
||||
# 22| Type = [ArrayType] const char[4]
|
||||
# 22| Value = [C11GenericExpr] int
|
||||
# 22| ValueCategory = lvalue
|
||||
# 22| getControllingExpr(): [VariableAccess] i
|
||||
# 22| Type = [IntType] int
|
||||
# 22| ValueCategory = lvalue
|
||||
# 22| getAssociationType(0): [TypeName] int
|
||||
# 22| Type = [IntType] int
|
||||
# 22| ValueCategory = prvalue
|
||||
# 22| getAssociationExpr(0): [ReuseExpr] reuse of int
|
||||
# 22| Type = [ArrayType] const char[4]
|
||||
# 22| ValueCategory = lvalue
|
||||
# 22| getAssociationType(1): [TypeName] const char *
|
||||
# 22| Type = [PointerType] const char *
|
||||
# 22| ValueCategory = prvalue
|
||||
# 22| getAssociationExpr(1): string
|
||||
# 22| Type = [ArrayType] const char[7]
|
||||
# 22| Value = [StringLiteral] "string"
|
||||
# 22| ValueCategory = lvalue
|
||||
# 22| getAssociationType(2): [TypeName] void
|
||||
# 22| Type = [VoidType] void
|
||||
# 22| ValueCategory = prvalue
|
||||
# 22| getAssociationExpr(2): unknown
|
||||
# 22| Type = [ArrayType] const char[8]
|
||||
# 22| Value = [StringLiteral] "unknown"
|
||||
# 22| ValueCategory = lvalue
|
||||
# 22| getControllingExpr().getFullyConverted(): [ParenthesisExpr] (...)
|
||||
# 22| Type = [IntType] int
|
||||
# 22| ValueCategory = lvalue
|
||||
# 23| getStmt(5): [ExprStmt] ExprStmt
|
||||
# 23| getExpr(): [FormattingFunctionCall,FunctionCall] call to printf
|
||||
# 23| Type = [IntType] int
|
||||
# 23| ValueCategory = prvalue
|
||||
# 23| getArgument(0): c is %s\n
|
||||
# 23| Type = [ArrayType] const char[9]
|
||||
# 23| Value = [StringLiteral] "c is %s\n"
|
||||
# 23| ValueCategory = lvalue
|
||||
# 23| getArgument(1): int
|
||||
# 23| Type = [ArrayType] const char[4]
|
||||
# 23| Value = [StringLiteral] "int"
|
||||
# 23| ValueCategory = lvalue
|
||||
# 23| getArgument(0).getFullyConverted(): [ArrayToPointerConversion] array to pointer conversion
|
||||
# 23| Type = [PointerType] const char *
|
||||
# 23| ValueCategory = prvalue
|
||||
# 23| getArgument(1).getFullyConverted(): [ArrayToPointerConversion] array to pointer conversion
|
||||
# 23| Type = [PointerType] const char *
|
||||
# 23| ValueCategory = prvalue
|
||||
# 23| getExpr(): [C11GenericExpr] _Generic
|
||||
# 23| Type = [ArrayType] const char[4]
|
||||
# 23| Value = [C11GenericExpr] int
|
||||
# 23| ValueCategory = lvalue
|
||||
# 23| getControllingExpr(): [VariableAccess] m
|
||||
# 23| Type = [CTypedefType] MYINT
|
||||
# 23| ValueCategory = lvalue
|
||||
# 23| getAssociationType(0): [TypeName] int
|
||||
# 23| Type = [IntType] int
|
||||
# 23| ValueCategory = prvalue
|
||||
# 23| getAssociationExpr(0): [ReuseExpr] reuse of int
|
||||
# 23| Type = [ArrayType] const char[4]
|
||||
# 23| ValueCategory = lvalue
|
||||
# 23| getAssociationType(1): [TypeName] const char *
|
||||
# 23| Type = [PointerType] const char *
|
||||
# 23| ValueCategory = prvalue
|
||||
# 23| getAssociationExpr(1): string
|
||||
# 23| Type = [ArrayType] const char[7]
|
||||
# 23| Value = [StringLiteral] "string"
|
||||
# 23| ValueCategory = lvalue
|
||||
# 23| getAssociationType(2): [TypeName] void
|
||||
# 23| Type = [VoidType] void
|
||||
# 23| ValueCategory = prvalue
|
||||
# 23| getAssociationExpr(2): unknown
|
||||
# 23| Type = [ArrayType] const char[8]
|
||||
# 23| Value = [StringLiteral] "unknown"
|
||||
# 23| ValueCategory = lvalue
|
||||
# 23| getControllingExpr().getFullyConverted(): [ParenthesisExpr] (...)
|
||||
# 23| Type = [CTypedefType] MYINT
|
||||
# 23| ValueCategory = lvalue
|
||||
# 24| getStmt(6): [ExprStmt] ExprStmt
|
||||
# 24| getExpr(): [FormattingFunctionCall,FunctionCall] call to printf
|
||||
# 24| Type = [IntType] int
|
||||
# 24| ValueCategory = prvalue
|
||||
# 24| getArgument(0): s is %s\n
|
||||
# 24| Type = [ArrayType] const char[9]
|
||||
# 24| Value = [StringLiteral] "s is %s\n"
|
||||
# 24| ValueCategory = lvalue
|
||||
# 24| getArgument(1): string
|
||||
# 24| Type = [ArrayType] const char[7]
|
||||
# 24| Value = [StringLiteral] "string"
|
||||
# 24| ValueCategory = lvalue
|
||||
# 24| getArgument(0).getFullyConverted(): [ArrayToPointerConversion] array to pointer conversion
|
||||
# 24| Type = [PointerType] const char *
|
||||
# 24| ValueCategory = prvalue
|
||||
# 24| getArgument(1).getFullyConverted(): [ArrayToPointerConversion] array to pointer conversion
|
||||
# 24| Type = [PointerType] const char *
|
||||
# 24| ValueCategory = prvalue
|
||||
# 24| getExpr(): [C11GenericExpr] _Generic
|
||||
# 24| Type = [ArrayType] const char[7]
|
||||
# 24| Value = [C11GenericExpr] string
|
||||
# 24| ValueCategory = lvalue
|
||||
# 24| getControllingExpr(): [VariableAccess] s
|
||||
# 24| Type = [PointerType] const char *
|
||||
# 24| ValueCategory = lvalue
|
||||
# 24| getAssociationType(0): [TypeName] int
|
||||
# 24| Type = [IntType] int
|
||||
# 24| ValueCategory = prvalue
|
||||
# 24| getAssociationExpr(0): int
|
||||
# 24| Type = [ArrayType] const char[4]
|
||||
# 24| Value = [StringLiteral] "int"
|
||||
# 24| ValueCategory = lvalue
|
||||
# 24| getAssociationType(1): [TypeName] const char *
|
||||
# 24| Type = [PointerType] const char *
|
||||
# 24| ValueCategory = prvalue
|
||||
# 24| getAssociationExpr(1): [ReuseExpr] reuse of string
|
||||
# 24| Type = [ArrayType] const char[7]
|
||||
# 24| ValueCategory = lvalue
|
||||
# 24| getAssociationType(2): [TypeName] void
|
||||
# 24| Type = [VoidType] void
|
||||
# 24| ValueCategory = prvalue
|
||||
# 24| getAssociationExpr(2): unknown
|
||||
# 24| Type = [ArrayType] const char[8]
|
||||
# 24| Value = [StringLiteral] "unknown"
|
||||
# 24| ValueCategory = lvalue
|
||||
# 24| getControllingExpr().getFullyConverted(): [ParenthesisExpr] (...)
|
||||
# 24| Type = [PointerType] const char *
|
||||
# 24| ValueCategory = lvalue
|
||||
# 25| getStmt(7): [ExprStmt] ExprStmt
|
||||
# 25| getExpr(): [FormattingFunctionCall,FunctionCall] call to printf
|
||||
# 25| Type = [IntType] int
|
||||
# 25| ValueCategory = prvalue
|
||||
# 25| getArgument(0): f is %s\n
|
||||
# 25| Type = [ArrayType] const char[9]
|
||||
# 25| Value = [StringLiteral] "f is %s\n"
|
||||
# 25| ValueCategory = lvalue
|
||||
# 25| getArgument(1): unknown
|
||||
# 25| Type = [ArrayType] const char[8]
|
||||
# 25| Value = [StringLiteral] "unknown"
|
||||
# 25| ValueCategory = lvalue
|
||||
# 25| getArgument(0).getFullyConverted(): [ArrayToPointerConversion] array to pointer conversion
|
||||
# 25| Type = [PointerType] const char *
|
||||
# 25| ValueCategory = prvalue
|
||||
# 25| getArgument(1).getFullyConverted(): [ArrayToPointerConversion] array to pointer conversion
|
||||
# 25| Type = [PointerType] const char *
|
||||
# 25| ValueCategory = prvalue
|
||||
# 25| getExpr(): [C11GenericExpr] _Generic
|
||||
# 25| Type = [ArrayType] const char[8]
|
||||
# 25| Value = [C11GenericExpr] unknown
|
||||
# 25| ValueCategory = lvalue
|
||||
# 25| getControllingExpr(): [VariableAccess] f
|
||||
# 25| Type = [PointerType] float ***
|
||||
# 25| ValueCategory = lvalue
|
||||
# 25| getAssociationType(0): [TypeName] int
|
||||
# 25| Type = [IntType] int
|
||||
# 25| ValueCategory = prvalue
|
||||
# 25| getAssociationExpr(0): int
|
||||
# 25| Type = [ArrayType] const char[4]
|
||||
# 25| Value = [StringLiteral] "int"
|
||||
# 25| ValueCategory = lvalue
|
||||
# 25| getAssociationType(1): [TypeName] const char *
|
||||
# 25| Type = [PointerType] const char *
|
||||
# 25| ValueCategory = prvalue
|
||||
# 25| getAssociationExpr(1): string
|
||||
# 25| Type = [ArrayType] const char[7]
|
||||
# 25| Value = [StringLiteral] "string"
|
||||
# 25| ValueCategory = lvalue
|
||||
# 25| getAssociationType(2): [TypeName] void
|
||||
# 25| Type = [VoidType] void
|
||||
# 25| ValueCategory = prvalue
|
||||
# 25| getAssociationExpr(2): [ReuseExpr] reuse of unknown
|
||||
# 25| Type = [ArrayType] const char[8]
|
||||
# 25| ValueCategory = lvalue
|
||||
# 25| getControllingExpr().getFullyConverted(): [ParenthesisExpr] (...)
|
||||
# 25| Type = [PointerType] float ***
|
||||
# 25| ValueCategory = lvalue
|
||||
# 26| getStmt(8): [ReturnStmt] return ...
|
||||
#-----| getExpr(): [Literal] 0
|
||||
#-----| Type = [IntType] int
|
||||
#-----| Value = [Literal] 0
|
||||
#-----| ValueCategory = prvalue
|
|
@ -0,0 +1 @@
|
|||
semmle/code/cpp/PrintAST.ql
|
|
@ -0,0 +1,8 @@
|
|||
| generic.c:21:22:21:32 | _Generic | generic.c:21:22:21:32 | describe(val) |
|
||||
| generic.c:22:22:22:32 | _Generic | generic.c:22:22:22:32 | describe(val) |
|
||||
| generic.c:23:22:23:32 | _Generic | generic.c:23:22:23:32 | describe(val) |
|
||||
| generic.c:24:22:24:32 | _Generic | generic.c:24:22:24:32 | describe(val) |
|
||||
| generic.cpp:22:22:22:32 | _Generic | generic.cpp:22:22:22:32 | describe(val) |
|
||||
| generic.cpp:23:22:23:32 | _Generic | generic.cpp:23:22:23:32 | describe(val) |
|
||||
| generic.cpp:24:22:24:32 | _Generic | generic.cpp:24:22:24:32 | describe(val) |
|
||||
| generic.cpp:25:22:25:32 | _Generic | generic.cpp:25:22:25:32 | describe(val) |
|
|
@ -0,0 +1,5 @@
|
|||
import cpp
|
||||
|
||||
from C11GenericExpr g, MacroInvocation m
|
||||
where m.getAnExpandedElement() = g
|
||||
select g, m
|
|
@ -33,7 +33,7 @@ argHasPostUpdate
|
|||
| test.cpp:67:29:67:35 | source1 | ArgumentNode is missing PostUpdateNode. |
|
||||
| test.cpp:813:19:813:35 | * ... | ArgumentNode is missing PostUpdateNode. |
|
||||
| test.cpp:848:23:848:25 | rpx | ArgumentNode is missing PostUpdateNode. |
|
||||
| test.cpp:1057:19:1057:21 | * ... | ArgumentNode is missing PostUpdateNode. |
|
||||
| test.cpp:1093:19:1093:21 | * ... | ArgumentNode is missing PostUpdateNode. |
|
||||
postWithInFlow
|
||||
| BarrierGuard.cpp:49:6:49:6 | x [post update] | PostUpdateNode should not be the target of local flow. |
|
||||
| BarrierGuard.cpp:60:7:60:7 | x [post update] | PostUpdateNode should not be the target of local flow. |
|
||||
|
@ -167,15 +167,17 @@ postWithInFlow
|
|||
| test.cpp:932:5:932:19 | * ... [post update] | PostUpdateNode should not be the target of local flow. |
|
||||
| test.cpp:932:6:932:19 | global_pointer [inner post update] | PostUpdateNode should not be the target of local flow. |
|
||||
| test.cpp:1045:9:1045:11 | ref arg buf | PostUpdateNode should not be the target of local flow. |
|
||||
| test.cpp:1051:5:1051:11 | content [post update] | PostUpdateNode should not be the target of local flow. |
|
||||
| test.cpp:1052:9:1052:9 | a [inner post update] | PostUpdateNode should not be the target of local flow. |
|
||||
| test.cpp:1056:5:1056:7 | * ... [post update] | PostUpdateNode should not be the target of local flow. |
|
||||
| test.cpp:1056:6:1056:7 | pp [inner post update] | PostUpdateNode should not be the target of local flow. |
|
||||
| test.cpp:1062:53:1062:53 | p [inner post update] | PostUpdateNode should not be the target of local flow. |
|
||||
| test.cpp:1072:3:1072:4 | * ... [post update] | PostUpdateNode should not be the target of local flow. |
|
||||
| test.cpp:1072:4:1072:4 | p [inner post update] | PostUpdateNode should not be the target of local flow. |
|
||||
| test.cpp:1073:3:1073:4 | * ... [post update] | PostUpdateNode should not be the target of local flow. |
|
||||
| test.cpp:1073:4:1073:4 | p [inner post update] | PostUpdateNode should not be the target of local flow. |
|
||||
| test.cpp:1066:5:1066:5 | i [post update] | PostUpdateNode should not be the target of local flow. |
|
||||
| test.cpp:1069:5:1069:5 | i [post update] | PostUpdateNode should not be the target of local flow. |
|
||||
| test.cpp:1087:5:1087:11 | content [post update] | PostUpdateNode should not be the target of local flow. |
|
||||
| test.cpp:1088:9:1088:9 | a [inner post update] | PostUpdateNode should not be the target of local flow. |
|
||||
| test.cpp:1092:5:1092:7 | * ... [post update] | PostUpdateNode should not be the target of local flow. |
|
||||
| test.cpp:1092:6:1092:7 | pp [inner post update] | PostUpdateNode should not be the target of local flow. |
|
||||
| test.cpp:1098:53:1098:53 | p [inner post update] | PostUpdateNode should not be the target of local flow. |
|
||||
| test.cpp:1108:3:1108:4 | * ... [post update] | PostUpdateNode should not be the target of local flow. |
|
||||
| test.cpp:1108:4:1108:4 | p [inner post update] | PostUpdateNode should not be the target of local flow. |
|
||||
| test.cpp:1109:3:1109:4 | * ... [post update] | PostUpdateNode should not be the target of local flow. |
|
||||
| test.cpp:1109:4:1109:4 | p [inner post update] | PostUpdateNode should not be the target of local flow. |
|
||||
viableImplInCallContextTooLarge
|
||||
uniqueParameterNodeAtPosition
|
||||
uniqueParameterNodePosition
|
||||
|
|
|
@ -26,6 +26,10 @@ postWithInFlow
|
|||
| test.cpp:400:10:400:13 | memcpy output argument | PostUpdateNode should not be the target of local flow. |
|
||||
| test.cpp:407:10:407:13 | memcpy output argument | PostUpdateNode should not be the target of local flow. |
|
||||
| test.cpp:1045:9:1045:11 | memset output argument | PostUpdateNode should not be the target of local flow. |
|
||||
| test.cpp:1076:2:1076:3 | swap output argument | PostUpdateNode should not be the target of local flow. |
|
||||
| test.cpp:1076:10:1076:11 | swap output argument | PostUpdateNode should not be the target of local flow. |
|
||||
| test.cpp:1077:2:1077:3 | swap output argument | PostUpdateNode should not be the target of local flow. |
|
||||
| test.cpp:1077:10:1077:11 | swap output argument | PostUpdateNode should not be the target of local flow. |
|
||||
viableImplInCallContextTooLarge
|
||||
uniqueParameterNodeAtPosition
|
||||
uniqueParameterNodePosition
|
||||
|
|
|
@ -202,12 +202,12 @@
|
|||
| test.cpp:489:23:489:29 | *content | test.cpp:490:8:490:17 | * ... |
|
||||
| test.cpp:489:23:489:29 | content | test.cpp:489:23:489:29 | content |
|
||||
| test.cpp:489:23:489:29 | content | test.cpp:490:9:490:17 | p_content |
|
||||
| test.cpp:1050:12:1050:12 | definition of a | test.cpp:1051:3:1051:3 | *a |
|
||||
| test.cpp:1051:3:1051:3 | *a | test.cpp:1052:8:1052:9 | *& ... |
|
||||
| test.cpp:1051:3:1051:3 | *a [post update] | test.cpp:1052:8:1052:9 | *& ... |
|
||||
| test.cpp:1051:3:1051:3 | a | test.cpp:1052:8:1052:9 | & ... |
|
||||
| test.cpp:1051:3:1051:3 | a [post update] | test.cpp:1052:8:1052:9 | & ... |
|
||||
| test.cpp:1051:15:1051:21 | 0 | test.cpp:1051:3:1051:21 | ... = ... |
|
||||
| test.cpp:1051:15:1051:21 | *0 | test.cpp:1051:3:1051:21 | *... = ... |
|
||||
| test.cpp:1052:9:1052:9 | *a | test.cpp:1052:8:1052:9 | *& ... |
|
||||
| test.cpp:1052:9:1052:9 | a | test.cpp:1052:8:1052:9 | & ... |
|
||||
| test.cpp:1086:12:1086:12 | definition of a | test.cpp:1087:3:1087:3 | *a |
|
||||
| test.cpp:1087:3:1087:3 | *a | test.cpp:1088:8:1088:9 | *& ... |
|
||||
| test.cpp:1087:3:1087:3 | *a [post update] | test.cpp:1088:8:1088:9 | *& ... |
|
||||
| test.cpp:1087:3:1087:3 | a | test.cpp:1088:8:1088:9 | & ... |
|
||||
| test.cpp:1087:3:1087:3 | a [post update] | test.cpp:1088:8:1088:9 | & ... |
|
||||
| test.cpp:1087:15:1087:21 | 0 | test.cpp:1087:3:1087:21 | ... = ... |
|
||||
| test.cpp:1087:15:1087:21 | *0 | test.cpp:1087:3:1087:21 | *... = ... |
|
||||
| test.cpp:1088:9:1088:9 | *a | test.cpp:1088:8:1088:9 | *& ... |
|
||||
| test.cpp:1088:9:1088:9 | a | test.cpp:1088:8:1088:9 | & ... |
|
||||
|
|
|
@ -81,10 +81,10 @@ WARNING: module 'DataFlow' has been deprecated and may be removed in future (loc
|
|||
| test.cpp:488:21:488:21 | s [post update] | test.cpp:489:20:489:20 | s |
|
||||
| test.cpp:488:24:488:30 | ref arg content | test.cpp:489:23:489:29 | content |
|
||||
| test.cpp:489:23:489:29 | content | test.cpp:490:9:490:17 | p_content |
|
||||
| test.cpp:1050:12:1050:12 | a | test.cpp:1051:3:1051:3 | a |
|
||||
| test.cpp:1050:12:1050:12 | a | test.cpp:1052:9:1052:9 | a |
|
||||
| test.cpp:1051:3:1051:3 | a [post update] | test.cpp:1052:9:1052:9 | a |
|
||||
| test.cpp:1051:3:1051:21 | ... = ... | test.cpp:1051:5:1051:11 | content [post update] |
|
||||
| test.cpp:1051:15:1051:21 | 0 | test.cpp:1051:3:1051:21 | ... = ... |
|
||||
| test.cpp:1052:8:1052:9 | ref arg & ... | test.cpp:1052:9:1052:9 | a [inner post update] |
|
||||
| test.cpp:1052:9:1052:9 | a | test.cpp:1052:8:1052:9 | & ... |
|
||||
| test.cpp:1086:12:1086:12 | a | test.cpp:1087:3:1087:3 | a |
|
||||
| test.cpp:1086:12:1086:12 | a | test.cpp:1088:9:1088:9 | a |
|
||||
| test.cpp:1087:3:1087:3 | a [post update] | test.cpp:1088:9:1088:9 | a |
|
||||
| test.cpp:1087:3:1087:21 | ... = ... | test.cpp:1087:5:1087:11 | content [post update] |
|
||||
| test.cpp:1087:15:1087:21 | 0 | test.cpp:1087:3:1087:21 | ... = ... |
|
||||
| test.cpp:1088:8:1088:9 | ref arg & ... | test.cpp:1088:9:1088:9 | a [inner post update] |
|
||||
| test.cpp:1088:9:1088:9 | a | test.cpp:1088:8:1088:9 | & ... |
|
||||
|
|
|
@ -127,7 +127,11 @@ astFlow
|
|||
| test.cpp:842:11:842:16 | call to source | test.cpp:844:8:844:8 | y |
|
||||
| test.cpp:846:13:846:27 | call to indirect_source | test.cpp:848:23:848:25 | rpx |
|
||||
| test.cpp:860:54:860:59 | call to source | test.cpp:861:10:861:37 | static_local_pointer_dynamic |
|
||||
| test.cpp:1050:12:1050:12 | a | test.cpp:1052:8:1052:9 | & ... |
|
||||
| test.cpp:1066:9:1066:14 | call to source | test.cpp:1072:10:1072:10 | i |
|
||||
| test.cpp:1066:9:1066:14 | call to source | test.cpp:1080:10:1080:10 | i |
|
||||
| test.cpp:1069:9:1069:14 | call to source | test.cpp:1074:10:1074:10 | i |
|
||||
| test.cpp:1069:9:1069:14 | call to source | test.cpp:1082:10:1082:10 | i |
|
||||
| test.cpp:1086:12:1086:12 | a | test.cpp:1088:8:1088:9 | & ... |
|
||||
| true_upon_entry.cpp:17:11:17:16 | call to source | true_upon_entry.cpp:21:8:21:8 | x |
|
||||
| true_upon_entry.cpp:27:9:27:14 | call to source | true_upon_entry.cpp:29:8:29:8 | x |
|
||||
| true_upon_entry.cpp:33:11:33:16 | call to source | true_upon_entry.cpp:39:8:39:8 | x |
|
||||
|
@ -313,7 +317,12 @@ irFlow
|
|||
| test.cpp:1021:18:1021:32 | *call to indirect_source | test.cpp:1027:19:1027:28 | *translated |
|
||||
| test.cpp:1021:18:1021:32 | *call to indirect_source | test.cpp:1031:19:1031:28 | *translated |
|
||||
| test.cpp:1045:14:1045:19 | call to source | test.cpp:1046:7:1046:10 | * ... |
|
||||
| test.cpp:1081:27:1081:34 | call to source | test.cpp:1081:27:1081:34 | call to source |
|
||||
| test.cpp:1052:13:1052:27 | *call to indirect_source | test.cpp:1054:7:1054:11 | * ... |
|
||||
| test.cpp:1066:9:1066:14 | call to source | test.cpp:1072:10:1072:10 | i |
|
||||
| test.cpp:1066:9:1066:14 | call to source | test.cpp:1079:10:1079:10 | i |
|
||||
| test.cpp:1069:9:1069:14 | call to source | test.cpp:1074:10:1074:10 | i |
|
||||
| test.cpp:1069:9:1069:14 | call to source | test.cpp:1081:10:1081:10 | i |
|
||||
| test.cpp:1117:27:1117:34 | call to source | test.cpp:1117:27:1117:34 | call to source |
|
||||
| true_upon_entry.cpp:9:11:9:16 | call to source | true_upon_entry.cpp:13:8:13:8 | x |
|
||||
| true_upon_entry.cpp:17:11:17:16 | call to source | true_upon_entry.cpp:21:8:21:8 | x |
|
||||
| true_upon_entry.cpp:27:9:27:14 | call to source | true_upon_entry.cpp:29:8:29:8 | x |
|
||||
|
|
|
@ -1046,6 +1046,42 @@ void memset_test(char* buf) { // $ ast-def=buf ir-def=*buf
|
|||
sink(*buf); // $ ir MISSING: ast
|
||||
}
|
||||
|
||||
void *realloc(void *, size_t);
|
||||
|
||||
void test_realloc() {
|
||||
int *src = indirect_source();
|
||||
int *dest = (int*)realloc(src, sizeof(int));
|
||||
sink(*dest); // $ ir, MISSING: ast
|
||||
}
|
||||
|
||||
struct MyInt {
|
||||
int i;
|
||||
MyInt();
|
||||
void swap(MyInt &j);
|
||||
};
|
||||
|
||||
void test_member_swap() {
|
||||
MyInt s1;
|
||||
MyInt s2;
|
||||
s2.i = source();
|
||||
MyInt s3;
|
||||
MyInt s4;
|
||||
s4.i = source();
|
||||
|
||||
sink(s1.i);
|
||||
sink(s2.i); // $ ast,ir
|
||||
sink(s3.i);
|
||||
sink(s4.i); // $ ast,ir
|
||||
|
||||
s1.swap(s2);
|
||||
s4.swap(s3);
|
||||
|
||||
sink(s1.i); // $ ir
|
||||
sink(s2.i); // $ SPURIOUS: ast
|
||||
sink(s3.i); // $ ir
|
||||
sink(s4.i); // $ SPURIOUS: ast
|
||||
}
|
||||
|
||||
void flow_out_of_address_with_local_flow() {
|
||||
MyStruct a;
|
||||
a.content = nullptr;
|
||||
|
|
|
@ -51,5 +51,5 @@ incorrectBaseType
|
|||
| test.cpp:848:23:848:25 | rpx | Expected 'Node.getType()' to be int, but it was int * |
|
||||
| test.cpp:854:10:854:36 | * ... | Expected 'Node.getType()' to be const int, but it was int |
|
||||
| test.cpp:867:10:867:30 | * ... | Expected 'Node.getType()' to be const int, but it was int |
|
||||
| test.cpp:1062:52:1062:53 | *& ... | Expected 'Node.getType()' to be char, but it was char * |
|
||||
| test.cpp:1098:52:1098:53 | *& ... | Expected 'Node.getType()' to be char, but it was char * |
|
||||
failures
|
||||
|
|
|
@ -54,5 +54,5 @@
|
|||
| test.cpp:796:12:796:12 | a | test.cpp:797:20:797:20 | a |
|
||||
| test.cpp:796:12:796:12 | a | test.cpp:797:31:797:31 | a |
|
||||
| test.cpp:796:12:796:12 | a | test.cpp:798:17:798:17 | a |
|
||||
| test.cpp:1050:12:1050:12 | a | test.cpp:1051:3:1051:3 | a |
|
||||
| test.cpp:1050:12:1050:12 | a | test.cpp:1052:9:1052:9 | a |
|
||||
| test.cpp:1086:12:1086:12 | a | test.cpp:1087:3:1087:3 | a |
|
||||
| test.cpp:1086:12:1086:12 | a | test.cpp:1088:9:1088:9 | a |
|
||||
|
|
|
@ -13,9 +13,6 @@ class Node extends TNode {
|
|||
|
||||
AST::DataFlow::Node asAst() { none() }
|
||||
|
||||
/** DEPRECATED: Alias for asAst */
|
||||
deprecated AST::DataFlow::Node asAST() { result = this.asAst() }
|
||||
|
||||
Location getLocation() { none() }
|
||||
}
|
||||
|
||||
|
@ -28,9 +25,6 @@ class AstNode extends Node, TAstNode {
|
|||
|
||||
override AST::DataFlow::Node asAst() { result = n }
|
||||
|
||||
/** DEPRECATED: Alias for asAst */
|
||||
deprecated override AST::DataFlow::Node asAST() { result = this.asAst() }
|
||||
|
||||
override Location getLocation() { result = n.getLocation() }
|
||||
}
|
||||
|
||||
|
|
|
@ -554,19 +554,15 @@ WARNING: module 'TaintTracking' has been deprecated and may be removed in future
|
|||
| map.cpp:67:30:67:42 | call to pair | map.cpp:80:7:80:7 | l | |
|
||||
| map.cpp:67:30:67:42 | call to pair | map.cpp:81:7:81:7 | l | |
|
||||
| map.cpp:67:37:67:41 | 456 | map.cpp:67:30:67:42 | call to pair | TAINT |
|
||||
| map.cpp:68:3:68:3 | i | map.cpp:68:10:68:10 | ref arg j | TAINT |
|
||||
| map.cpp:68:3:68:3 | ref arg i | map.cpp:70:7:70:7 | i | |
|
||||
| map.cpp:68:3:68:3 | ref arg i | map.cpp:71:7:71:7 | i | |
|
||||
| map.cpp:68:3:68:3 | ref arg i | map.cpp:72:7:72:7 | i | |
|
||||
| map.cpp:68:10:68:10 | j | map.cpp:68:3:68:3 | ref arg i | TAINT |
|
||||
| map.cpp:68:10:68:10 | ref arg j | map.cpp:73:7:73:7 | j | |
|
||||
| map.cpp:68:10:68:10 | ref arg j | map.cpp:74:7:74:7 | j | |
|
||||
| map.cpp:68:10:68:10 | ref arg j | map.cpp:75:7:75:7 | j | |
|
||||
| map.cpp:69:2:69:2 | k | map.cpp:69:9:69:9 | ref arg l | TAINT |
|
||||
| map.cpp:69:2:69:2 | ref arg k | map.cpp:76:7:76:7 | k | |
|
||||
| map.cpp:69:2:69:2 | ref arg k | map.cpp:77:7:77:7 | k | |
|
||||
| map.cpp:69:2:69:2 | ref arg k | map.cpp:78:7:78:7 | k | |
|
||||
| map.cpp:69:9:69:9 | l | map.cpp:69:2:69:2 | ref arg k | TAINT |
|
||||
| map.cpp:69:9:69:9 | ref arg l | map.cpp:79:7:79:7 | l | |
|
||||
| map.cpp:69:9:69:9 | ref arg l | map.cpp:80:7:80:7 | l | |
|
||||
| map.cpp:69:9:69:9 | ref arg l | map.cpp:81:7:81:7 | l | |
|
||||
|
@ -1065,16 +1061,12 @@ WARNING: module 'TaintTracking' has been deprecated and may be removed in future
|
|||
| map.cpp:194:7:194:9 | m16 | map.cpp:194:7:194:9 | call to map | |
|
||||
| map.cpp:195:7:195:9 | m17 | map.cpp:195:7:195:9 | call to map | |
|
||||
| map.cpp:196:7:196:9 | m18 | map.cpp:196:7:196:9 | call to map | |
|
||||
| map.cpp:197:2:197:4 | m15 | map.cpp:197:11:197:13 | ref arg m16 | TAINT |
|
||||
| map.cpp:197:2:197:4 | ref arg m15 | map.cpp:199:7:199:9 | m15 | |
|
||||
| map.cpp:197:2:197:4 | ref arg m15 | map.cpp:252:1:252:1 | m15 | |
|
||||
| map.cpp:197:11:197:13 | m16 | map.cpp:197:2:197:4 | ref arg m15 | TAINT |
|
||||
| map.cpp:197:11:197:13 | ref arg m16 | map.cpp:200:7:200:9 | m16 | |
|
||||
| map.cpp:197:11:197:13 | ref arg m16 | map.cpp:252:1:252:1 | m16 | |
|
||||
| map.cpp:198:2:198:4 | m17 | map.cpp:198:11:198:13 | ref arg m18 | TAINT |
|
||||
| map.cpp:198:2:198:4 | ref arg m17 | map.cpp:201:7:201:9 | m17 | |
|
||||
| map.cpp:198:2:198:4 | ref arg m17 | map.cpp:252:1:252:1 | m17 | |
|
||||
| map.cpp:198:11:198:13 | m18 | map.cpp:198:2:198:4 | ref arg m17 | TAINT |
|
||||
| map.cpp:198:11:198:13 | ref arg m18 | map.cpp:202:7:202:9 | m18 | |
|
||||
| map.cpp:198:11:198:13 | ref arg m18 | map.cpp:252:1:252:1 | m18 | |
|
||||
| map.cpp:199:7:199:9 | m15 | map.cpp:199:7:199:9 | call to map | |
|
||||
|
@ -1747,16 +1739,12 @@ WARNING: module 'TaintTracking' has been deprecated and may be removed in future
|
|||
| map.cpp:343:7:343:9 | m16 | map.cpp:343:7:343:9 | call to unordered_map | |
|
||||
| map.cpp:344:7:344:9 | m17 | map.cpp:344:7:344:9 | call to unordered_map | |
|
||||
| map.cpp:345:7:345:9 | m18 | map.cpp:345:7:345:9 | call to unordered_map | |
|
||||
| map.cpp:346:2:346:4 | m15 | map.cpp:346:11:346:13 | ref arg m16 | TAINT |
|
||||
| map.cpp:346:2:346:4 | ref arg m15 | map.cpp:348:7:348:9 | m15 | |
|
||||
| map.cpp:346:2:346:4 | ref arg m15 | map.cpp:438:1:438:1 | m15 | |
|
||||
| map.cpp:346:11:346:13 | m16 | map.cpp:346:2:346:4 | ref arg m15 | TAINT |
|
||||
| map.cpp:346:11:346:13 | ref arg m16 | map.cpp:349:7:349:9 | m16 | |
|
||||
| map.cpp:346:11:346:13 | ref arg m16 | map.cpp:438:1:438:1 | m16 | |
|
||||
| map.cpp:347:2:347:4 | m17 | map.cpp:347:11:347:13 | ref arg m18 | TAINT |
|
||||
| map.cpp:347:2:347:4 | ref arg m17 | map.cpp:350:7:350:9 | m17 | |
|
||||
| map.cpp:347:2:347:4 | ref arg m17 | map.cpp:438:1:438:1 | m17 | |
|
||||
| map.cpp:347:11:347:13 | m18 | map.cpp:347:2:347:4 | ref arg m17 | TAINT |
|
||||
| map.cpp:347:11:347:13 | ref arg m18 | map.cpp:351:7:351:9 | m18 | |
|
||||
| map.cpp:347:11:347:13 | ref arg m18 | map.cpp:438:1:438:1 | m18 | |
|
||||
| map.cpp:348:7:348:9 | m15 | map.cpp:348:7:348:9 | call to unordered_map | |
|
||||
|
@ -2579,16 +2567,12 @@ WARNING: module 'TaintTracking' has been deprecated and may be removed in future
|
|||
| set.cpp:81:7:81:9 | s15 | set.cpp:81:7:81:9 | call to set | |
|
||||
| set.cpp:82:2:82:4 | ref arg s12 | set.cpp:84:7:84:9 | s12 | |
|
||||
| set.cpp:82:2:82:4 | ref arg s12 | set.cpp:126:1:126:1 | s12 | |
|
||||
| set.cpp:82:2:82:4 | s12 | set.cpp:82:11:82:13 | ref arg s13 | TAINT |
|
||||
| set.cpp:82:11:82:13 | ref arg s13 | set.cpp:85:7:85:9 | s13 | |
|
||||
| set.cpp:82:11:82:13 | ref arg s13 | set.cpp:126:1:126:1 | s13 | |
|
||||
| set.cpp:82:11:82:13 | s13 | set.cpp:82:2:82:4 | ref arg s12 | TAINT |
|
||||
| set.cpp:83:2:83:4 | ref arg s14 | set.cpp:86:7:86:9 | s14 | |
|
||||
| set.cpp:83:2:83:4 | ref arg s14 | set.cpp:126:1:126:1 | s14 | |
|
||||
| set.cpp:83:2:83:4 | s14 | set.cpp:83:11:83:13 | ref arg s15 | TAINT |
|
||||
| set.cpp:83:11:83:13 | ref arg s15 | set.cpp:87:7:87:9 | s15 | |
|
||||
| set.cpp:83:11:83:13 | ref arg s15 | set.cpp:126:1:126:1 | s15 | |
|
||||
| set.cpp:83:11:83:13 | s15 | set.cpp:83:2:83:4 | ref arg s14 | TAINT |
|
||||
| set.cpp:84:7:84:9 | s12 | set.cpp:84:7:84:9 | call to set | |
|
||||
| set.cpp:85:7:85:9 | s13 | set.cpp:85:7:85:9 | call to set | |
|
||||
| set.cpp:86:7:86:9 | s14 | set.cpp:86:7:86:9 | call to set | |
|
||||
|
@ -3066,16 +3050,12 @@ WARNING: module 'TaintTracking' has been deprecated and may be removed in future
|
|||
| set.cpp:193:7:193:9 | s15 | set.cpp:193:7:193:9 | call to unordered_set | |
|
||||
| set.cpp:194:2:194:4 | ref arg s12 | set.cpp:196:7:196:9 | s12 | |
|
||||
| set.cpp:194:2:194:4 | ref arg s12 | set.cpp:238:1:238:1 | s12 | |
|
||||
| set.cpp:194:2:194:4 | s12 | set.cpp:194:11:194:13 | ref arg s13 | TAINT |
|
||||
| set.cpp:194:11:194:13 | ref arg s13 | set.cpp:197:7:197:9 | s13 | |
|
||||
| set.cpp:194:11:194:13 | ref arg s13 | set.cpp:238:1:238:1 | s13 | |
|
||||
| set.cpp:194:11:194:13 | s13 | set.cpp:194:2:194:4 | ref arg s12 | TAINT |
|
||||
| set.cpp:195:2:195:4 | ref arg s14 | set.cpp:198:7:198:9 | s14 | |
|
||||
| set.cpp:195:2:195:4 | ref arg s14 | set.cpp:238:1:238:1 | s14 | |
|
||||
| set.cpp:195:2:195:4 | s14 | set.cpp:195:11:195:13 | ref arg s15 | TAINT |
|
||||
| set.cpp:195:11:195:13 | ref arg s15 | set.cpp:199:7:199:9 | s15 | |
|
||||
| set.cpp:195:11:195:13 | ref arg s15 | set.cpp:238:1:238:1 | s15 | |
|
||||
| set.cpp:195:11:195:13 | s15 | set.cpp:195:2:195:4 | ref arg s14 | TAINT |
|
||||
| set.cpp:196:7:196:9 | s12 | set.cpp:196:7:196:9 | call to unordered_set | |
|
||||
| set.cpp:197:7:197:9 | s13 | set.cpp:197:7:197:9 | call to unordered_set | |
|
||||
| set.cpp:198:7:198:9 | s14 | set.cpp:198:7:198:9 | call to unordered_set | |
|
||||
|
@ -4047,13 +4027,9 @@ WARNING: module 'TaintTracking' has been deprecated and may be removed in future
|
|||
| string.cpp:272:17:272:25 | call to basic_string | string.cpp:280:2:280:3 | s4 | |
|
||||
| string.cpp:272:17:272:25 | call to basic_string | string.cpp:285:7:285:8 | s4 | |
|
||||
| string.cpp:279:2:279:3 | ref arg s1 | string.cpp:282:7:282:8 | s1 | |
|
||||
| string.cpp:279:2:279:3 | s1 | string.cpp:279:10:279:11 | ref arg s2 | TAINT |
|
||||
| string.cpp:279:10:279:11 | ref arg s2 | string.cpp:283:7:283:8 | s2 | |
|
||||
| string.cpp:279:10:279:11 | s2 | string.cpp:279:2:279:3 | ref arg s1 | TAINT |
|
||||
| string.cpp:280:2:280:3 | ref arg s4 | string.cpp:285:7:285:8 | s4 | |
|
||||
| string.cpp:280:2:280:3 | s4 | string.cpp:280:10:280:11 | ref arg s3 | TAINT |
|
||||
| string.cpp:280:10:280:11 | ref arg s3 | string.cpp:284:7:284:8 | s3 | |
|
||||
| string.cpp:280:10:280:11 | s3 | string.cpp:280:2:280:3 | ref arg s4 | TAINT |
|
||||
| string.cpp:289:17:289:22 | call to source | string.cpp:289:17:289:25 | call to basic_string | TAINT |
|
||||
| string.cpp:289:17:289:25 | call to basic_string | string.cpp:293:7:293:8 | s1 | |
|
||||
| string.cpp:289:17:289:25 | call to basic_string | string.cpp:297:2:297:3 | s1 | |
|
||||
|
@ -4839,13 +4815,9 @@ WARNING: module 'TaintTracking' has been deprecated and may be removed in future
|
|||
| stringstream.cpp:115:24:115:32 | call to basic_stringstream | stringstream.cpp:118:2:118:4 | ss4 | |
|
||||
| stringstream.cpp:115:24:115:32 | call to basic_stringstream | stringstream.cpp:123:7:123:9 | ss4 | |
|
||||
| stringstream.cpp:117:2:117:4 | ref arg ss1 | stringstream.cpp:120:7:120:9 | ss1 | |
|
||||
| stringstream.cpp:117:2:117:4 | ss1 | stringstream.cpp:117:11:117:13 | ref arg ss2 | TAINT |
|
||||
| stringstream.cpp:117:11:117:13 | ref arg ss2 | stringstream.cpp:121:7:121:9 | ss2 | |
|
||||
| stringstream.cpp:117:11:117:13 | ss2 | stringstream.cpp:117:2:117:4 | ref arg ss1 | TAINT |
|
||||
| stringstream.cpp:118:2:118:4 | ref arg ss4 | stringstream.cpp:123:7:123:9 | ss4 | |
|
||||
| stringstream.cpp:118:2:118:4 | ss4 | stringstream.cpp:118:11:118:13 | ref arg ss3 | TAINT |
|
||||
| stringstream.cpp:118:11:118:13 | ref arg ss3 | stringstream.cpp:122:7:122:9 | ss3 | |
|
||||
| stringstream.cpp:118:11:118:13 | ss3 | stringstream.cpp:118:2:118:4 | ref arg ss4 | TAINT |
|
||||
| stringstream.cpp:128:20:128:22 | call to basic_stringstream | stringstream.cpp:142:7:142:9 | ss1 | |
|
||||
| stringstream.cpp:128:20:128:22 | call to basic_stringstream | stringstream.cpp:145:7:145:9 | ss1 | |
|
||||
| stringstream.cpp:128:20:128:22 | call to basic_stringstream | stringstream.cpp:153:7:153:9 | ss1 | |
|
||||
|
@ -5413,9 +5385,7 @@ WARNING: module 'TaintTracking' has been deprecated and may be removed in future
|
|||
| swap1.cpp:24:9:24:13 | this | swap1.cpp:24:31:24:34 | this | |
|
||||
| swap1.cpp:24:23:24:26 | that | swap1.cpp:24:23:24:26 | that | |
|
||||
| swap1.cpp:24:23:24:26 | that | swap1.cpp:24:36:24:39 | that | |
|
||||
| swap1.cpp:24:31:24:34 | this | swap1.cpp:24:36:24:39 | ref arg that | TAINT |
|
||||
| swap1.cpp:24:36:24:39 | ref arg that | swap1.cpp:24:23:24:26 | that | |
|
||||
| swap1.cpp:24:36:24:39 | that | swap1.cpp:24:31:24:34 | ref arg this | TAINT |
|
||||
| swap1.cpp:25:9:25:13 | this | swap1.cpp:25:36:25:52 | constructor init of field data1 [pre-this] | |
|
||||
| swap1.cpp:25:28:25:31 | that | swap1.cpp:25:42:25:45 | that | |
|
||||
| swap1.cpp:25:47:25:51 | data1 | swap1.cpp:25:36:25:52 | constructor init of field data1 | TAINT |
|
||||
|
@ -5425,36 +5395,28 @@ WARNING: module 'TaintTracking' has been deprecated and may be removed in future
|
|||
| swap1.cpp:29:23:29:27 | call to Class | swap1.cpp:30:18:30:20 | tmp | |
|
||||
| swap1.cpp:29:24:29:27 | that | swap1.cpp:29:23:29:27 | call to Class | |
|
||||
| swap1.cpp:30:13:30:16 | ref arg this | swap1.cpp:31:21:31:24 | this | |
|
||||
| swap1.cpp:30:13:30:16 | this | swap1.cpp:30:18:30:20 | ref arg tmp | TAINT |
|
||||
| swap1.cpp:30:13:30:16 | this | swap1.cpp:31:21:31:24 | this | |
|
||||
| swap1.cpp:30:18:30:20 | tmp | swap1.cpp:30:13:30:16 | ref arg this | TAINT |
|
||||
| swap1.cpp:31:21:31:24 | this | swap1.cpp:31:20:31:24 | * ... | TAINT |
|
||||
| swap1.cpp:34:16:34:24 | this | swap1.cpp:36:13:36:16 | this | |
|
||||
| swap1.cpp:34:34:34:37 | that | swap1.cpp:34:34:34:37 | that | |
|
||||
| swap1.cpp:34:34:34:37 | that | swap1.cpp:36:18:36:21 | that | |
|
||||
| swap1.cpp:36:13:36:16 | ref arg this | swap1.cpp:37:21:37:24 | this | |
|
||||
| swap1.cpp:36:13:36:16 | this | swap1.cpp:36:18:36:21 | ref arg that | TAINT |
|
||||
| swap1.cpp:36:13:36:16 | this | swap1.cpp:37:21:37:24 | this | |
|
||||
| swap1.cpp:36:18:36:21 | ref arg that | swap1.cpp:34:34:34:37 | that | |
|
||||
| swap1.cpp:36:18:36:21 | that | swap1.cpp:36:13:36:16 | ref arg this | TAINT |
|
||||
| swap1.cpp:37:21:37:24 | this | swap1.cpp:37:20:37:24 | * ... | TAINT |
|
||||
| swap1.cpp:40:16:40:26 | this | swap1.cpp:43:13:43:16 | this | |
|
||||
| swap1.cpp:40:41:40:44 | that | swap1.cpp:42:24:42:27 | that | |
|
||||
| swap1.cpp:42:23:42:27 | call to Class | swap1.cpp:43:18:43:20 | tmp | |
|
||||
| swap1.cpp:42:24:42:27 | that | swap1.cpp:42:23:42:27 | call to Class | |
|
||||
| swap1.cpp:43:13:43:16 | ref arg this | swap1.cpp:44:21:44:24 | this | |
|
||||
| swap1.cpp:43:13:43:16 | this | swap1.cpp:43:18:43:20 | ref arg tmp | TAINT |
|
||||
| swap1.cpp:43:13:43:16 | this | swap1.cpp:44:21:44:24 | this | |
|
||||
| swap1.cpp:43:18:43:20 | tmp | swap1.cpp:43:13:43:16 | ref arg this | TAINT |
|
||||
| swap1.cpp:44:21:44:24 | this | swap1.cpp:44:20:44:24 | * ... | TAINT |
|
||||
| swap1.cpp:47:16:47:26 | this | swap1.cpp:49:13:49:16 | this | |
|
||||
| swap1.cpp:47:36:47:39 | that | swap1.cpp:47:36:47:39 | that | |
|
||||
| swap1.cpp:47:36:47:39 | that | swap1.cpp:49:18:49:21 | that | |
|
||||
| swap1.cpp:49:13:49:16 | ref arg this | swap1.cpp:50:21:50:24 | this | |
|
||||
| swap1.cpp:49:13:49:16 | this | swap1.cpp:49:18:49:21 | ref arg that | TAINT |
|
||||
| swap1.cpp:49:13:49:16 | this | swap1.cpp:50:21:50:24 | this | |
|
||||
| swap1.cpp:49:18:49:21 | ref arg that | swap1.cpp:47:36:47:39 | that | |
|
||||
| swap1.cpp:49:18:49:21 | that | swap1.cpp:49:13:49:16 | ref arg this | TAINT |
|
||||
| swap1.cpp:50:21:50:24 | this | swap1.cpp:50:20:50:24 | * ... | TAINT |
|
||||
| swap1.cpp:53:14:53:17 | this | swap1.cpp:56:18:56:22 | this | |
|
||||
| swap1.cpp:53:26:53:29 | that | swap1.cpp:53:26:53:29 | that | |
|
||||
|
@ -5468,9 +5430,7 @@ WARNING: module 'TaintTracking' has been deprecated and may be removed in future
|
|||
| swap1.cpp:61:32:61:32 | y | swap1.cpp:61:32:61:32 | y | |
|
||||
| swap1.cpp:61:32:61:32 | y | swap1.cpp:63:16:63:16 | y | |
|
||||
| swap1.cpp:63:9:63:9 | ref arg x | swap1.cpp:61:22:61:22 | x | |
|
||||
| swap1.cpp:63:9:63:9 | x | swap1.cpp:63:16:63:16 | ref arg y | TAINT |
|
||||
| swap1.cpp:63:16:63:16 | ref arg y | swap1.cpp:61:32:61:32 | y | |
|
||||
| swap1.cpp:63:16:63:16 | y | swap1.cpp:63:9:63:9 | ref arg x | TAINT |
|
||||
| swap1.cpp:69:23:69:23 | x | swap1.cpp:71:5:71:5 | x | |
|
||||
| swap1.cpp:69:23:69:23 | x | swap1.cpp:73:10:73:10 | x | |
|
||||
| swap1.cpp:69:23:69:23 | x | swap1.cpp:76:9:76:9 | x | |
|
||||
|
@ -5579,9 +5539,7 @@ WARNING: module 'TaintTracking' has been deprecated and may be removed in future
|
|||
| swap2.cpp:24:9:24:13 | this | swap2.cpp:24:31:24:34 | this | |
|
||||
| swap2.cpp:24:23:24:26 | that | swap2.cpp:24:23:24:26 | that | |
|
||||
| swap2.cpp:24:23:24:26 | that | swap2.cpp:24:36:24:39 | that | |
|
||||
| swap2.cpp:24:31:24:34 | this | swap2.cpp:24:36:24:39 | ref arg that | TAINT |
|
||||
| swap2.cpp:24:36:24:39 | ref arg that | swap2.cpp:24:23:24:26 | that | |
|
||||
| swap2.cpp:24:36:24:39 | that | swap2.cpp:24:31:24:34 | ref arg this | TAINT |
|
||||
| swap2.cpp:25:9:25:13 | this | swap2.cpp:25:36:25:52 | constructor init of field data1 [pre-this] | |
|
||||
| swap2.cpp:25:28:25:31 | that | swap2.cpp:25:42:25:45 | that | |
|
||||
| swap2.cpp:25:28:25:31 | that | swap2.cpp:25:61:25:64 | that | |
|
||||
|
@ -5596,36 +5554,28 @@ WARNING: module 'TaintTracking' has been deprecated and may be removed in future
|
|||
| swap2.cpp:29:23:29:27 | call to Class | swap2.cpp:30:18:30:20 | tmp | |
|
||||
| swap2.cpp:29:24:29:27 | that | swap2.cpp:29:23:29:27 | call to Class | |
|
||||
| swap2.cpp:30:13:30:16 | ref arg this | swap2.cpp:31:21:31:24 | this | |
|
||||
| swap2.cpp:30:13:30:16 | this | swap2.cpp:30:18:30:20 | ref arg tmp | TAINT |
|
||||
| swap2.cpp:30:13:30:16 | this | swap2.cpp:31:21:31:24 | this | |
|
||||
| swap2.cpp:30:18:30:20 | tmp | swap2.cpp:30:13:30:16 | ref arg this | TAINT |
|
||||
| swap2.cpp:31:21:31:24 | this | swap2.cpp:31:20:31:24 | * ... | TAINT |
|
||||
| swap2.cpp:34:16:34:24 | this | swap2.cpp:36:13:36:16 | this | |
|
||||
| swap2.cpp:34:34:34:37 | that | swap2.cpp:34:34:34:37 | that | |
|
||||
| swap2.cpp:34:34:34:37 | that | swap2.cpp:36:18:36:21 | that | |
|
||||
| swap2.cpp:36:13:36:16 | ref arg this | swap2.cpp:37:21:37:24 | this | |
|
||||
| swap2.cpp:36:13:36:16 | this | swap2.cpp:36:18:36:21 | ref arg that | TAINT |
|
||||
| swap2.cpp:36:13:36:16 | this | swap2.cpp:37:21:37:24 | this | |
|
||||
| swap2.cpp:36:18:36:21 | ref arg that | swap2.cpp:34:34:34:37 | that | |
|
||||
| swap2.cpp:36:18:36:21 | that | swap2.cpp:36:13:36:16 | ref arg this | TAINT |
|
||||
| swap2.cpp:37:21:37:24 | this | swap2.cpp:37:20:37:24 | * ... | TAINT |
|
||||
| swap2.cpp:40:16:40:26 | this | swap2.cpp:43:13:43:16 | this | |
|
||||
| swap2.cpp:40:41:40:44 | that | swap2.cpp:42:24:42:27 | that | |
|
||||
| swap2.cpp:42:23:42:27 | call to Class | swap2.cpp:43:18:43:20 | tmp | |
|
||||
| swap2.cpp:42:24:42:27 | that | swap2.cpp:42:23:42:27 | call to Class | |
|
||||
| swap2.cpp:43:13:43:16 | ref arg this | swap2.cpp:44:21:44:24 | this | |
|
||||
| swap2.cpp:43:13:43:16 | this | swap2.cpp:43:18:43:20 | ref arg tmp | TAINT |
|
||||
| swap2.cpp:43:13:43:16 | this | swap2.cpp:44:21:44:24 | this | |
|
||||
| swap2.cpp:43:18:43:20 | tmp | swap2.cpp:43:13:43:16 | ref arg this | TAINT |
|
||||
| swap2.cpp:44:21:44:24 | this | swap2.cpp:44:20:44:24 | * ... | TAINT |
|
||||
| swap2.cpp:47:16:47:26 | this | swap2.cpp:49:13:49:16 | this | |
|
||||
| swap2.cpp:47:36:47:39 | that | swap2.cpp:47:36:47:39 | that | |
|
||||
| swap2.cpp:47:36:47:39 | that | swap2.cpp:49:18:49:21 | that | |
|
||||
| swap2.cpp:49:13:49:16 | ref arg this | swap2.cpp:50:21:50:24 | this | |
|
||||
| swap2.cpp:49:13:49:16 | this | swap2.cpp:49:18:49:21 | ref arg that | TAINT |
|
||||
| swap2.cpp:49:13:49:16 | this | swap2.cpp:50:21:50:24 | this | |
|
||||
| swap2.cpp:49:18:49:21 | ref arg that | swap2.cpp:47:36:47:39 | that | |
|
||||
| swap2.cpp:49:18:49:21 | that | swap2.cpp:49:13:49:16 | ref arg this | TAINT |
|
||||
| swap2.cpp:50:21:50:24 | this | swap2.cpp:50:20:50:24 | * ... | TAINT |
|
||||
| swap2.cpp:53:14:53:17 | this | swap2.cpp:56:18:56:22 | this | |
|
||||
| swap2.cpp:53:26:53:29 | that | swap2.cpp:53:26:53:29 | that | |
|
||||
|
@ -5647,9 +5597,7 @@ WARNING: module 'TaintTracking' has been deprecated and may be removed in future
|
|||
| swap2.cpp:61:32:61:32 | y | swap2.cpp:61:32:61:32 | y | |
|
||||
| swap2.cpp:61:32:61:32 | y | swap2.cpp:63:16:63:16 | y | |
|
||||
| swap2.cpp:63:9:63:9 | ref arg x | swap2.cpp:61:22:61:22 | x | |
|
||||
| swap2.cpp:63:9:63:9 | x | swap2.cpp:63:16:63:16 | ref arg y | TAINT |
|
||||
| swap2.cpp:63:16:63:16 | ref arg y | swap2.cpp:61:32:61:32 | y | |
|
||||
| swap2.cpp:63:16:63:16 | y | swap2.cpp:63:9:63:9 | ref arg x | TAINT |
|
||||
| swap2.cpp:69:23:69:23 | x | swap2.cpp:71:5:71:5 | x | |
|
||||
| swap2.cpp:69:23:69:23 | x | swap2.cpp:73:10:73:10 | x | |
|
||||
| swap2.cpp:69:23:69:23 | x | swap2.cpp:76:9:76:9 | x | |
|
||||
|
@ -6597,38 +6545,45 @@ WARNING: module 'TaintTracking' has been deprecated and may be removed in future
|
|||
| taint.cpp:729:27:729:32 | endptr | taint.cpp:729:26:729:32 | & ... | |
|
||||
| taint.cpp:731:7:731:12 | ref arg endptr | taint.cpp:732:8:732:13 | endptr | |
|
||||
| taint.cpp:732:8:732:13 | endptr | taint.cpp:732:7:732:13 | * ... | TAINT |
|
||||
| taint.cpp:738:17:738:31 | call to indirect_source | taint.cpp:739:30:739:35 | source | |
|
||||
| taint.cpp:739:22:739:28 | call to realloc | taint.cpp:740:7:740:10 | dest | |
|
||||
| taint.cpp:739:30:739:35 | source | taint.cpp:739:22:739:28 | call to realloc | TAINT |
|
||||
| taint.cpp:743:40:743:45 | buffer | taint.cpp:744:5:744:10 | buffer | |
|
||||
| taint.cpp:743:40:743:45 | buffer | taint.cpp:745:27:745:32 | buffer | |
|
||||
| taint.cpp:744:4:744:10 | * ... | taint.cpp:744:3:744:10 | * ... | TAINT |
|
||||
| taint.cpp:744:5:744:10 | buffer | taint.cpp:744:4:744:10 | * ... | TAINT |
|
||||
| taint.cpp:744:14:744:19 | call to source | taint.cpp:744:3:744:21 | ... = ... | |
|
||||
| taint.cpp:745:19:745:25 | call to realloc | taint.cpp:743:40:743:45 | buffer | |
|
||||
| taint.cpp:745:19:745:25 | call to realloc | taint.cpp:745:3:745:37 | ... = ... | |
|
||||
| taint.cpp:745:19:745:25 | call to realloc | taint.cpp:746:10:746:15 | buffer | |
|
||||
| taint.cpp:745:27:745:32 | buffer | taint.cpp:745:19:745:25 | call to realloc | TAINT |
|
||||
| taint.cpp:746:9:746:15 | * ... | taint.cpp:746:8:746:15 | * ... | TAINT |
|
||||
| taint.cpp:746:10:746:15 | buffer | taint.cpp:746:9:746:15 | * ... | TAINT |
|
||||
| taint.cpp:751:31:751:34 | path | taint.cpp:751:31:751:34 | path | |
|
||||
| taint.cpp:751:31:751:34 | path | taint.cpp:752:10:752:13 | path | |
|
||||
| taint.cpp:751:31:751:34 | path | taint.cpp:753:10:753:13 | path | |
|
||||
| taint.cpp:751:43:751:46 | data | taint.cpp:751:43:751:46 | data | |
|
||||
| taint.cpp:751:43:751:46 | data | taint.cpp:753:22:753:25 | data | |
|
||||
| taint.cpp:752:10:752:13 | ref arg path | taint.cpp:751:31:751:34 | path | |
|
||||
| taint.cpp:752:10:752:13 | ref arg path | taint.cpp:753:10:753:13 | path | |
|
||||
| taint.cpp:752:16:752:19 | %s | taint.cpp:752:10:752:13 | ref arg path | TAINT |
|
||||
| taint.cpp:752:22:752:26 | abc | taint.cpp:752:10:752:13 | ref arg path | TAINT |
|
||||
| taint.cpp:753:10:753:13 | ref arg path | taint.cpp:751:31:751:34 | path | |
|
||||
| taint.cpp:753:16:753:19 | %s | taint.cpp:753:10:753:13 | ref arg path | TAINT |
|
||||
| taint.cpp:753:22:753:25 | data | taint.cpp:753:10:753:13 | ref arg path | TAINT |
|
||||
| taint.cpp:753:22:753:25 | ref arg data | taint.cpp:751:43:751:46 | data | |
|
||||
| taint.cpp:757:7:757:10 | path | taint.cpp:758:21:758:24 | path | |
|
||||
| taint.cpp:757:7:757:10 | path | taint.cpp:759:8:759:11 | path | |
|
||||
| taint.cpp:758:21:758:24 | ref arg path | taint.cpp:759:8:759:11 | path | |
|
||||
| taint.cpp:759:8:759:11 | path | taint.cpp:759:7:759:11 | * ... | |
|
||||
| taint.cpp:769:37:769:42 | call to source | taint.cpp:770:7:770:9 | obj | |
|
||||
| taint.cpp:739:17:739:31 | call to indirect_source | taint.cpp:740:30:740:35 | source | |
|
||||
| taint.cpp:740:22:740:28 | call to realloc | taint.cpp:741:7:741:10 | dest | |
|
||||
| taint.cpp:740:30:740:35 | source | taint.cpp:740:22:740:28 | call to realloc | TAINT |
|
||||
| taint.cpp:744:40:744:45 | buffer | taint.cpp:745:5:745:10 | buffer | |
|
||||
| taint.cpp:744:40:744:45 | buffer | taint.cpp:746:27:746:32 | buffer | |
|
||||
| taint.cpp:745:4:745:10 | * ... | taint.cpp:745:3:745:10 | * ... | TAINT |
|
||||
| taint.cpp:745:5:745:10 | buffer | taint.cpp:745:4:745:10 | * ... | TAINT |
|
||||
| taint.cpp:745:14:745:19 | call to source | taint.cpp:745:3:745:21 | ... = ... | |
|
||||
| taint.cpp:746:19:746:25 | call to realloc | taint.cpp:744:40:744:45 | buffer | |
|
||||
| taint.cpp:746:19:746:25 | call to realloc | taint.cpp:746:3:746:37 | ... = ... | |
|
||||
| taint.cpp:746:19:746:25 | call to realloc | taint.cpp:747:10:747:15 | buffer | |
|
||||
| taint.cpp:746:27:746:32 | buffer | taint.cpp:746:19:746:25 | call to realloc | TAINT |
|
||||
| taint.cpp:747:9:747:15 | * ... | taint.cpp:747:8:747:15 | * ... | TAINT |
|
||||
| taint.cpp:747:10:747:15 | buffer | taint.cpp:747:9:747:15 | * ... | TAINT |
|
||||
| taint.cpp:752:13:752:18 | call to malloc | taint.cpp:753:2:753:2 | a | |
|
||||
| taint.cpp:752:13:752:18 | call to malloc | taint.cpp:754:22:754:22 | a | |
|
||||
| taint.cpp:753:2:753:2 | a [post update] | taint.cpp:754:22:754:22 | a | |
|
||||
| taint.cpp:753:2:753:16 | ... = ... | taint.cpp:753:5:753:5 | x [post update] | |
|
||||
| taint.cpp:753:9:753:14 | call to source | taint.cpp:753:2:753:16 | ... = ... | |
|
||||
| taint.cpp:754:14:754:20 | call to realloc | taint.cpp:755:7:755:8 | a2 | |
|
||||
| taint.cpp:754:22:754:22 | a | taint.cpp:754:14:754:20 | call to realloc | TAINT |
|
||||
| taint.cpp:760:31:760:34 | path | taint.cpp:760:31:760:34 | path | |
|
||||
| taint.cpp:760:31:760:34 | path | taint.cpp:761:10:761:13 | path | |
|
||||
| taint.cpp:760:31:760:34 | path | taint.cpp:762:10:762:13 | path | |
|
||||
| taint.cpp:760:43:760:46 | data | taint.cpp:760:43:760:46 | data | |
|
||||
| taint.cpp:760:43:760:46 | data | taint.cpp:762:22:762:25 | data | |
|
||||
| taint.cpp:761:10:761:13 | ref arg path | taint.cpp:760:31:760:34 | path | |
|
||||
| taint.cpp:761:10:761:13 | ref arg path | taint.cpp:762:10:762:13 | path | |
|
||||
| taint.cpp:761:16:761:19 | %s | taint.cpp:761:10:761:13 | ref arg path | TAINT |
|
||||
| taint.cpp:761:22:761:26 | abc | taint.cpp:761:10:761:13 | ref arg path | TAINT |
|
||||
| taint.cpp:762:10:762:13 | ref arg path | taint.cpp:760:31:760:34 | path | |
|
||||
| taint.cpp:762:16:762:19 | %s | taint.cpp:762:10:762:13 | ref arg path | TAINT |
|
||||
| taint.cpp:762:22:762:25 | data | taint.cpp:762:10:762:13 | ref arg path | TAINT |
|
||||
| taint.cpp:762:22:762:25 | ref arg data | taint.cpp:760:43:760:46 | data | |
|
||||
| taint.cpp:766:7:766:10 | path | taint.cpp:767:21:767:24 | path | |
|
||||
| taint.cpp:766:7:766:10 | path | taint.cpp:768:8:768:11 | path | |
|
||||
| taint.cpp:767:21:767:24 | ref arg path | taint.cpp:768:8:768:11 | path | |
|
||||
| taint.cpp:768:8:768:11 | path | taint.cpp:768:7:768:11 | * ... | |
|
||||
| taint.cpp:778:37:778:42 | call to source | taint.cpp:779:7:779:9 | obj | |
|
||||
| vector.cpp:16:43:16:49 | source1 | vector.cpp:17:26:17:32 | source1 | |
|
||||
| vector.cpp:16:43:16:49 | source1 | vector.cpp:31:38:31:44 | source1 | |
|
||||
| vector.cpp:17:21:17:33 | call to vector | vector.cpp:19:14:19:14 | v | |
|
||||
|
@ -7005,16 +6960,12 @@ WARNING: module 'TaintTracking' has been deprecated and may be removed in future
|
|||
| vector.cpp:112:7:112:8 | ref arg v4 | vector.cpp:121:1:121:1 | v4 | |
|
||||
| vector.cpp:114:2:114:3 | ref arg v1 | vector.cpp:117:7:117:8 | v1 | |
|
||||
| vector.cpp:114:2:114:3 | ref arg v1 | vector.cpp:121:1:121:1 | v1 | |
|
||||
| vector.cpp:114:2:114:3 | v1 | vector.cpp:114:10:114:11 | ref arg v2 | TAINT |
|
||||
| vector.cpp:114:10:114:11 | ref arg v2 | vector.cpp:118:7:118:8 | v2 | |
|
||||
| vector.cpp:114:10:114:11 | ref arg v2 | vector.cpp:121:1:121:1 | v2 | |
|
||||
| vector.cpp:114:10:114:11 | v2 | vector.cpp:114:2:114:3 | ref arg v1 | TAINT |
|
||||
| vector.cpp:115:2:115:3 | ref arg v3 | vector.cpp:119:7:119:8 | v3 | |
|
||||
| vector.cpp:115:2:115:3 | ref arg v3 | vector.cpp:121:1:121:1 | v3 | |
|
||||
| vector.cpp:115:2:115:3 | v3 | vector.cpp:115:10:115:11 | ref arg v4 | TAINT |
|
||||
| vector.cpp:115:10:115:11 | ref arg v4 | vector.cpp:120:7:120:8 | v4 | |
|
||||
| vector.cpp:115:10:115:11 | ref arg v4 | vector.cpp:121:1:121:1 | v4 | |
|
||||
| vector.cpp:115:10:115:11 | v4 | vector.cpp:115:2:115:3 | ref arg v3 | TAINT |
|
||||
| vector.cpp:117:7:117:8 | ref arg v1 | vector.cpp:121:1:121:1 | v1 | |
|
||||
| vector.cpp:118:7:118:8 | ref arg v2 | vector.cpp:121:1:121:1 | v2 | |
|
||||
| vector.cpp:119:7:119:8 | ref arg v3 | vector.cpp:121:1:121:1 | v3 | |
|
||||
|
|
|
@ -68,8 +68,8 @@ void test_pair()
|
|||
i.swap(j);
|
||||
k.swap(l);
|
||||
sink(i.first);
|
||||
sink(i.second); // $ MISSING: ast,ir
|
||||
sink(i); // $ ast,ir
|
||||
sink(i.second); // $ ir, MISSING: ast
|
||||
sink(i); // $ ir
|
||||
sink(j.first);
|
||||
sink(j.second); // $ SPURIOUS: ast
|
||||
sink(j); // $ SPURIOUS: ast
|
||||
|
@ -77,8 +77,8 @@ void test_pair()
|
|||
sink(k.second); // $ SPURIOUS: ast
|
||||
sink(k); // $ SPURIOUS: ast
|
||||
sink(l.first);
|
||||
sink(l.second); // $ MISSING: ast,ir
|
||||
sink(l); // $ ast,ir
|
||||
sink(l.second); // $ ir, MISSING: ast
|
||||
sink(l); // $ ir
|
||||
|
||||
sink(make_pair("123", "456"));
|
||||
sink(make_pair("123", "456").first);
|
||||
|
@ -197,8 +197,8 @@ void test_map()
|
|||
m15.swap(m16);
|
||||
m17.swap(m18);
|
||||
sink(m15); // $ SPURIOUS: ast
|
||||
sink(m16); // $ ast,ir
|
||||
sink(m17); // $ ast,ir
|
||||
sink(m16); // $ ir
|
||||
sink(m17); // $ ir
|
||||
sink(m18); // $ SPURIOUS: ast
|
||||
|
||||
// merge
|
||||
|
@ -346,8 +346,8 @@ void test_unordered_map()
|
|||
m15.swap(m16);
|
||||
m17.swap(m18);
|
||||
sink(m15); // $ SPURIOUS: ast
|
||||
sink(m16); // $ ast,ir
|
||||
sink(m17); // $ ast,ir
|
||||
sink(m16); // $ ir
|
||||
sink(m17); // $ ir
|
||||
sink(m18); // $ SPURIOUS: ast
|
||||
|
||||
// merge
|
||||
|
|
|
@ -82,8 +82,8 @@ void test_set()
|
|||
s12.swap(s13);
|
||||
s14.swap(s15);
|
||||
sink(s12); // $ SPURIOUS: ast
|
||||
sink(s13); // $ ast,ir
|
||||
sink(s14); // $ ast,ir
|
||||
sink(s13); // $ ir
|
||||
sink(s14); // $ ir
|
||||
sink(s15); // $ SPURIOUS: ast
|
||||
|
||||
// merge
|
||||
|
@ -194,8 +194,8 @@ void test_unordered_set()
|
|||
s12.swap(s13);
|
||||
s14.swap(s15);
|
||||
sink(s12); // $ SPURIOUS: ast
|
||||
sink(s13); // $ ast,ir
|
||||
sink(s14); // $ ast,ir
|
||||
sink(s13); // $ ir
|
||||
sink(s14); // $ ir
|
||||
sink(s15); // $ SPURIOUS: ast
|
||||
|
||||
// merge
|
||||
|
|
|
@ -279,9 +279,9 @@ void test_string_swap() {
|
|||
s1.swap(s2);
|
||||
s4.swap(s3);
|
||||
|
||||
sink(s1); // $ ast,ir
|
||||
sink(s1); // $ ir
|
||||
sink(s2); // $ SPURIOUS: ast
|
||||
sink(s3); // $ ast,ir
|
||||
sink(s3); // $ ir
|
||||
sink(s4); // $ SPURIOUS: ast
|
||||
}
|
||||
|
||||
|
|
|
@ -117,9 +117,9 @@ void test_stringstream_swap()
|
|||
ss1.swap(ss2);
|
||||
ss4.swap(ss3);
|
||||
|
||||
sink(ss1); // $ ast,ir
|
||||
sink(ss1); // $ ir
|
||||
sink(ss2); // $ SPURIOUS: ast
|
||||
sink(ss3); // $ ast,ir
|
||||
sink(ss3); // $ ir
|
||||
sink(ss4); // $ SPURIOUS: ast
|
||||
}
|
||||
|
||||
|
|
|
@ -732,6 +732,7 @@ void test_strtol(char *source) {
|
|||
sink(*endptr); // $ ast,ir
|
||||
}
|
||||
|
||||
void *malloc(size_t);
|
||||
void *realloc(void *, size_t);
|
||||
|
||||
void test_realloc() {
|
||||
|
@ -746,6 +747,14 @@ void test_realloc_2_indirections(int **buffer) {
|
|||
sink(**buffer); // $ ir MISSING: ast
|
||||
}
|
||||
|
||||
void test_realloc_struct_field() {
|
||||
struct A { int x; };
|
||||
A* a = (A*)malloc(sizeof(A));
|
||||
a->x = source();
|
||||
A* a2 = (A*)realloc(a, sizeof(A));
|
||||
sink(a2->x); // $ ir MISSING: ast
|
||||
}
|
||||
|
||||
int sprintf(char *, const char *, ...);
|
||||
|
||||
void call_sprintf_twice(char* path, char* data) {
|
||||
|
|
|
@ -115,8 +115,8 @@ void test_vector_swap() {
|
|||
v3.swap(v4);
|
||||
|
||||
sink(v1);
|
||||
sink(v2); // $ MISSING:ir ast
|
||||
sink(v3); // $ MISSING:ir ast
|
||||
sink(v2); // $ ir MISSING: ast
|
||||
sink(v3); // $ ir MISSING: ast
|
||||
sink(v4);
|
||||
}
|
||||
|
||||
|
|
|
@ -4180,7 +4180,7 @@ destructors_for_temps.cpp:
|
|||
# 103| ValueCategory = prvalue
|
||||
# 104| getStmt(1): [ReturnStmt] return ...
|
||||
generic.c:
|
||||
# 1| [TopLevelFunction] void c11_generic_test(unsigned int, int)
|
||||
# 1| [TopLevelFunction] void c11_generic_test_with_load(unsigned int, int)
|
||||
# 1| <params>:
|
||||
# 1| getParameter(0): [Parameter] x
|
||||
# 1| Type = [IntType] unsigned int
|
||||
|
@ -4207,12 +4207,150 @@ generic.c:
|
|||
# 3| Type = [IntType] int
|
||||
# 3| Value = [Literal] 1
|
||||
# 3| ValueCategory = prvalue
|
||||
# 3| getLeftOperand().getFullyConverted(): [C11GenericExpr] _Generic
|
||||
# 3| Type = [IntType] unsigned int
|
||||
# 3| ValueCategory = prvalue(load)
|
||||
# 3| getControllingExpr(): [VariableAccess] r
|
||||
# 3| Type = [IntType] unsigned int
|
||||
# 3| ValueCategory = prvalue(load)
|
||||
# 3| getAssociationType(0): [TypeName] unsigned int
|
||||
# 3| Type = [IntType] unsigned int
|
||||
# 3| ValueCategory = prvalue
|
||||
# 3| getAssociationExpr(0): [ReuseExpr] reuse of x
|
||||
# 3| Type = [IntType] unsigned int
|
||||
# 3| ValueCategory = lvalue
|
||||
# 3| getAssociationType(1): [TypeName] int
|
||||
# 3| Type = [IntType] int
|
||||
# 3| ValueCategory = prvalue
|
||||
# 3| getAssociationExpr(1): [VariableAccess] y
|
||||
# 3| Type = [IntType] int
|
||||
# 3| ValueCategory = lvalue
|
||||
# 3| getRightOperand().getFullyConverted(): [CStyleCast] (unsigned int)...
|
||||
# 3| Conversion = [IntegralConversion] integral conversion
|
||||
# 3| Type = [IntType] unsigned int
|
||||
# 3| Value = [CStyleCast] 1
|
||||
# 3| ValueCategory = prvalue
|
||||
# 4| getStmt(2): [ReturnStmt] return ...
|
||||
# 12| [TopLevelFunction] char const* c11_generic_test_with_constant_and_macro()
|
||||
# 12| <params>:
|
||||
# 13| getEntryPoint(): [BlockStmt] { ... }
|
||||
# 14| getStmt(0): [DeclStmt] declaration
|
||||
# 14| getDeclarationEntry(0): [VariableDeclarationEntry] definition of i
|
||||
# 14| Type = [IntType] int
|
||||
# 16| getStmt(1): [ReturnStmt] return ...
|
||||
# 16| getExpr(): int
|
||||
# 16| Type = [ArrayType] char[4]
|
||||
# 16| Value = [StringLiteral] "int"
|
||||
# 16| ValueCategory = lvalue
|
||||
# 16| getExpr().getFullyConverted(): [CStyleCast] (const char *)...
|
||||
# 16| Conversion = [PointerConversion] pointer conversion
|
||||
# 16| Type = [PointerType] const char *
|
||||
# 16| ValueCategory = prvalue
|
||||
# 16| getExpr(): [ArrayToPointerConversion] array to pointer conversion
|
||||
# 16| Type = [CharPointerType] char *
|
||||
# 16| ValueCategory = prvalue
|
||||
# 16| getExpr(): [C11GenericExpr] _Generic
|
||||
# 16| Type = [ArrayType] char[4]
|
||||
# 16| Value = [C11GenericExpr] int
|
||||
# 16| ValueCategory = lvalue
|
||||
# 16| getControllingExpr(): [VariableAccess] i
|
||||
# 16| Type = [IntType] int
|
||||
# 16| ValueCategory = prvalue(load)
|
||||
# 16| getAssociationType(0): [TypeName] int
|
||||
# 16| Type = [IntType] int
|
||||
# 16| ValueCategory = prvalue
|
||||
# 16| getAssociationExpr(0): [ReuseExpr] reuse of int
|
||||
# 16| Type = [ArrayType] char[4]
|
||||
# 16| ValueCategory = lvalue
|
||||
# 16| getAssociationType(1): [TypeName] void
|
||||
# 16| Type = [VoidType] void
|
||||
# 16| ValueCategory = prvalue
|
||||
# 16| getAssociationExpr(1): unknown
|
||||
# 16| Type = [ArrayType] char[8]
|
||||
# 16| Value = [StringLiteral] "unknown"
|
||||
# 16| ValueCategory = lvalue
|
||||
# 16| getControllingExpr().getFullyConverted(): [ParenthesisExpr] (...)
|
||||
# 16| Type = [IntType] int
|
||||
# 16| ValueCategory = prvalue(load)
|
||||
# 19| [TopLevelFunction] char const* c11_generic_test_with_constant_and_no_macro()
|
||||
# 19| <params>:
|
||||
# 20| getEntryPoint(): [BlockStmt] { ... }
|
||||
# 21| getStmt(0): [DeclStmt] declaration
|
||||
# 21| getDeclarationEntry(0): [VariableDeclarationEntry] definition of i
|
||||
# 21| Type = [IntType] int
|
||||
# 23| getStmt(1): [ReturnStmt] return ...
|
||||
# 23| getExpr(): int
|
||||
# 23| Type = [ArrayType] char[4]
|
||||
# 23| Value = [StringLiteral] "int"
|
||||
# 23| ValueCategory = lvalue
|
||||
# 23| getExpr().getFullyConverted(): [CStyleCast] (const char *)...
|
||||
# 23| Conversion = [PointerConversion] pointer conversion
|
||||
# 23| Type = [PointerType] const char *
|
||||
# 23| ValueCategory = prvalue
|
||||
# 23| getExpr(): [ArrayToPointerConversion] array to pointer conversion
|
||||
# 23| Type = [CharPointerType] char *
|
||||
# 23| ValueCategory = prvalue
|
||||
# 23| getExpr(): [C11GenericExpr] _Generic
|
||||
# 23| Type = [ArrayType] char[4]
|
||||
# 23| Value = [C11GenericExpr] int
|
||||
# 23| ValueCategory = lvalue
|
||||
# 23| getControllingExpr(): [VariableAccess] i
|
||||
# 23| Type = [IntType] int
|
||||
# 23| ValueCategory = prvalue(load)
|
||||
# 23| getAssociationType(0): [TypeName] int
|
||||
# 23| Type = [IntType] int
|
||||
# 23| ValueCategory = prvalue
|
||||
# 23| getAssociationExpr(0): [ReuseExpr] reuse of int
|
||||
# 23| Type = [ArrayType] char[4]
|
||||
# 23| ValueCategory = lvalue
|
||||
# 23| getAssociationType(1): [TypeName] void
|
||||
# 23| Type = [VoidType] void
|
||||
# 23| ValueCategory = prvalue
|
||||
# 23| getAssociationExpr(1): unknown
|
||||
# 23| Type = [ArrayType] char[8]
|
||||
# 23| Value = [StringLiteral] "unknown"
|
||||
# 23| ValueCategory = lvalue
|
||||
# 26| [TopLevelFunction] void c11_generic_test_test_with_cast(int)
|
||||
# 26| <params>:
|
||||
# 26| getParameter(0): [Parameter] y
|
||||
# 26| Type = [IntType] int
|
||||
# 26| getEntryPoint(): [BlockStmt] { ... }
|
||||
# 27| getStmt(0): [DeclStmt] declaration
|
||||
# 27| getDeclarationEntry(0): [VariableDeclarationEntry] definition of r
|
||||
# 27| Type = [IntType] unsigned int
|
||||
# 28| getStmt(1): [ExprStmt] ExprStmt
|
||||
# 28| getExpr(): [AssignExpr] ... = ...
|
||||
# 28| Type = [IntType] unsigned int
|
||||
# 28| ValueCategory = prvalue
|
||||
# 28| getLValue(): [VariableAccess] r
|
||||
# 28| Type = [IntType] unsigned int
|
||||
# 28| ValueCategory = lvalue
|
||||
# 28| getRValue(): [VariableAccess] y
|
||||
# 28| Type = [IntType] int
|
||||
# 28| ValueCategory = prvalue(load)
|
||||
# 28| getRValue().getFullyConverted(): [C11GenericExpr] _Generic
|
||||
# 28| Type = [IntType] unsigned int
|
||||
# 28| ValueCategory = prvalue
|
||||
# 28| getControllingExpr(): [VariableAccess] r
|
||||
# 28| Type = [IntType] unsigned int
|
||||
# 28| ValueCategory = prvalue(load)
|
||||
# 28| getAssociationType(0): [TypeName] unsigned int
|
||||
# 28| Type = [IntType] unsigned int
|
||||
# 28| ValueCategory = prvalue
|
||||
# 28| getAssociationExpr(0): [ReuseExpr] reuse of y
|
||||
# 28| Type = [IntType] int
|
||||
# 28| ValueCategory = prvalue
|
||||
# 28| getAssociationType(1): [TypeName] int
|
||||
# 28| Type = [IntType] int
|
||||
# 28| ValueCategory = prvalue
|
||||
# 28| getAssociationExpr(1): [VariableAccess] y
|
||||
# 28| Type = [IntType] int
|
||||
# 28| ValueCategory = lvalue
|
||||
# 28| getExpr(): [CStyleCast] (unsigned int)...
|
||||
# 28| Conversion = [IntegralConversion] integral conversion
|
||||
# 28| Type = [IntType] unsigned int
|
||||
# 28| ValueCategory = prvalue
|
||||
# 29| getStmt(2): [ReturnStmt] return ...
|
||||
ir.c:
|
||||
# 5| [TopLevelFunction] int getX(MyCoords*)
|
||||
# 5| <params>:
|
||||
|
|
Разница между файлами не показана из-за своего большого размера
Загрузить разницу
|
@ -29,26 +29,4 @@ fieldAddressOnNonPointer
|
|||
thisArgumentIsNonPointer
|
||||
| ir.cpp:2546:34:2546:34 | Call: call to operator bool | Call instruction 'Call: call to operator bool' has a `this` argument operand that is not an address, in function '$@'. | ir.cpp:2545:6:2545:23 | void this_inconsistency(bool) | void this_inconsistency(bool) |
|
||||
nonUniqueIRVariable
|
||||
| coroutines.cpp:87:20:87:20 | VariableAddress: (unnamed local variable) | Variable address instruction 'VariableAddress: (unnamed local variable)' has no associated variable, in function '$@'. | coroutines.cpp:87:20:87:33 | co_returnable_void co_return_void() | co_returnable_void co_return_void() |
|
||||
| coroutines.cpp:87:20:87:20 | VariableAddress: (unnamed local variable) | Variable address instruction 'VariableAddress: (unnamed local variable)' has no associated variable, in function '$@'. | coroutines.cpp:87:20:87:33 | co_returnable_void co_return_void() | co_returnable_void co_return_void() |
|
||||
| coroutines.cpp:91:21:91:21 | VariableAddress: (unnamed local variable) | Variable address instruction 'VariableAddress: (unnamed local variable)' has no associated variable, in function '$@'. | coroutines.cpp:91:21:91:33 | co_returnable_value co_return_int(int) | co_returnable_value co_return_int(int) |
|
||||
| coroutines.cpp:91:21:91:21 | VariableAddress: (unnamed local variable) | Variable address instruction 'VariableAddress: (unnamed local variable)' has no associated variable, in function '$@'. | coroutines.cpp:91:21:91:33 | co_returnable_value co_return_int(int) | co_returnable_value co_return_int(int) |
|
||||
| coroutines.cpp:95:20:95:20 | VariableAddress: (unnamed local variable) | Variable address instruction 'VariableAddress: (unnamed local variable)' has no associated variable, in function '$@'. | coroutines.cpp:95:20:95:38 | co_returnable_void co_yield_value_void(int) | co_returnable_void co_yield_value_void(int) |
|
||||
| coroutines.cpp:95:20:95:20 | VariableAddress: (unnamed local variable) | Variable address instruction 'VariableAddress: (unnamed local variable)' has no associated variable, in function '$@'. | coroutines.cpp:95:20:95:38 | co_returnable_void co_yield_value_void(int) | co_returnable_void co_yield_value_void(int) |
|
||||
| coroutines.cpp:96:3:96:3 | VariableAddress: (unnamed local variable) | Variable address instruction 'VariableAddress: (unnamed local variable)' has no associated variable, in function '$@'. | coroutines.cpp:95:20:95:38 | co_returnable_void co_yield_value_void(int) | co_returnable_void co_yield_value_void(int) |
|
||||
| coroutines.cpp:99:21:99:21 | VariableAddress: (unnamed local variable) | Variable address instruction 'VariableAddress: (unnamed local variable)' has no associated variable, in function '$@'. | coroutines.cpp:99:21:99:40 | co_returnable_value co_yield_value_value(int) | co_returnable_value co_yield_value_value(int) |
|
||||
| coroutines.cpp:99:21:99:21 | VariableAddress: (unnamed local variable) | Variable address instruction 'VariableAddress: (unnamed local variable)' has no associated variable, in function '$@'. | coroutines.cpp:99:21:99:40 | co_returnable_value co_yield_value_value(int) | co_returnable_value co_yield_value_value(int) |
|
||||
| coroutines.cpp:100:3:100:3 | VariableAddress: (unnamed local variable) | Variable address instruction 'VariableAddress: (unnamed local variable)' has no associated variable, in function '$@'. | coroutines.cpp:99:21:99:40 | co_returnable_value co_yield_value_value(int) | co_returnable_value co_yield_value_value(int) |
|
||||
| coroutines.cpp:103:20:103:20 | VariableAddress: (unnamed local variable) | Variable address instruction 'VariableAddress: (unnamed local variable)' has no associated variable, in function '$@'. | coroutines.cpp:103:20:103:43 | co_returnable_void co_yield_and_return_void(int) | co_returnable_void co_yield_and_return_void(int) |
|
||||
| coroutines.cpp:103:20:103:20 | VariableAddress: (unnamed local variable) | Variable address instruction 'VariableAddress: (unnamed local variable)' has no associated variable, in function '$@'. | coroutines.cpp:103:20:103:43 | co_returnable_void co_yield_and_return_void(int) | co_returnable_void co_yield_and_return_void(int) |
|
||||
| coroutines.cpp:104:3:104:3 | VariableAddress: (unnamed local variable) | Variable address instruction 'VariableAddress: (unnamed local variable)' has no associated variable, in function '$@'. | coroutines.cpp:103:20:103:43 | co_returnable_void co_yield_and_return_void(int) | co_returnable_void co_yield_and_return_void(int) |
|
||||
| coroutines.cpp:108:21:108:21 | VariableAddress: (unnamed local variable) | Variable address instruction 'VariableAddress: (unnamed local variable)' has no associated variable, in function '$@'. | coroutines.cpp:108:21:108:45 | co_returnable_value co_yield_and_return_value(int) | co_returnable_value co_yield_and_return_value(int) |
|
||||
| coroutines.cpp:108:21:108:21 | VariableAddress: (unnamed local variable) | Variable address instruction 'VariableAddress: (unnamed local variable)' has no associated variable, in function '$@'. | coroutines.cpp:108:21:108:45 | co_returnable_value co_yield_and_return_value(int) | co_returnable_value co_yield_and_return_value(int) |
|
||||
| coroutines.cpp:109:3:109:3 | VariableAddress: (unnamed local variable) | Variable address instruction 'VariableAddress: (unnamed local variable)' has no associated variable, in function '$@'. | coroutines.cpp:108:21:108:45 | co_returnable_value co_yield_and_return_value(int) | co_returnable_value co_yield_and_return_value(int) |
|
||||
| file://:0:0:0:0 | VariableAddress: (unnamed local variable) | Variable address instruction 'VariableAddress: (unnamed local variable)' has no associated variable, in function '$@'. | coroutines.cpp:87:20:87:33 | co_returnable_void co_return_void() | co_returnable_void co_return_void() |
|
||||
| file://:0:0:0:0 | VariableAddress: (unnamed local variable) | Variable address instruction 'VariableAddress: (unnamed local variable)' has no associated variable, in function '$@'. | coroutines.cpp:91:21:91:33 | co_returnable_value co_return_int(int) | co_returnable_value co_return_int(int) |
|
||||
| file://:0:0:0:0 | VariableAddress: (unnamed local variable) | Variable address instruction 'VariableAddress: (unnamed local variable)' has no associated variable, in function '$@'. | coroutines.cpp:95:20:95:38 | co_returnable_void co_yield_value_void(int) | co_returnable_void co_yield_value_void(int) |
|
||||
| file://:0:0:0:0 | VariableAddress: (unnamed local variable) | Variable address instruction 'VariableAddress: (unnamed local variable)' has no associated variable, in function '$@'. | coroutines.cpp:99:21:99:40 | co_returnable_value co_yield_value_value(int) | co_returnable_value co_yield_value_value(int) |
|
||||
| file://:0:0:0:0 | VariableAddress: (unnamed local variable) | Variable address instruction 'VariableAddress: (unnamed local variable)' has no associated variable, in function '$@'. | coroutines.cpp:103:20:103:43 | co_returnable_void co_yield_and_return_void(int) | co_returnable_void co_yield_and_return_void(int) |
|
||||
| file://:0:0:0:0 | VariableAddress: (unnamed local variable) | Variable address instruction 'VariableAddress: (unnamed local variable)' has no associated variable, in function '$@'. | coroutines.cpp:108:21:108:45 | co_returnable_value co_yield_and_return_value(int) | co_returnable_value co_yield_and_return_value(int) |
|
||||
missingCppType
|
||||
|
|
|
@ -29,26 +29,4 @@ fieldAddressOnNonPointer
|
|||
thisArgumentIsNonPointer
|
||||
| ir.cpp:2546:34:2546:34 | Call: call to operator bool | Call instruction 'Call: call to operator bool' has a `this` argument operand that is not an address, in function '$@'. | ir.cpp:2545:6:2545:23 | void this_inconsistency(bool) | void this_inconsistency(bool) |
|
||||
nonUniqueIRVariable
|
||||
| coroutines.cpp:87:20:87:20 | VariableAddress: (unnamed local variable) | Variable address instruction 'VariableAddress: (unnamed local variable)' has no associated variable, in function '$@'. | coroutines.cpp:87:20:87:33 | co_returnable_void co_return_void() | co_returnable_void co_return_void() |
|
||||
| coroutines.cpp:87:20:87:20 | VariableAddress: (unnamed local variable) | Variable address instruction 'VariableAddress: (unnamed local variable)' has no associated variable, in function '$@'. | coroutines.cpp:87:20:87:33 | co_returnable_void co_return_void() | co_returnable_void co_return_void() |
|
||||
| coroutines.cpp:91:21:91:21 | VariableAddress: (unnamed local variable) | Variable address instruction 'VariableAddress: (unnamed local variable)' has no associated variable, in function '$@'. | coroutines.cpp:91:21:91:33 | co_returnable_value co_return_int(int) | co_returnable_value co_return_int(int) |
|
||||
| coroutines.cpp:91:21:91:21 | VariableAddress: (unnamed local variable) | Variable address instruction 'VariableAddress: (unnamed local variable)' has no associated variable, in function '$@'. | coroutines.cpp:91:21:91:33 | co_returnable_value co_return_int(int) | co_returnable_value co_return_int(int) |
|
||||
| coroutines.cpp:95:20:95:20 | VariableAddress: (unnamed local variable) | Variable address instruction 'VariableAddress: (unnamed local variable)' has no associated variable, in function '$@'. | coroutines.cpp:95:20:95:38 | co_returnable_void co_yield_value_void(int) | co_returnable_void co_yield_value_void(int) |
|
||||
| coroutines.cpp:95:20:95:20 | VariableAddress: (unnamed local variable) | Variable address instruction 'VariableAddress: (unnamed local variable)' has no associated variable, in function '$@'. | coroutines.cpp:95:20:95:38 | co_returnable_void co_yield_value_void(int) | co_returnable_void co_yield_value_void(int) |
|
||||
| coroutines.cpp:96:3:96:3 | VariableAddress: (unnamed local variable) | Variable address instruction 'VariableAddress: (unnamed local variable)' has no associated variable, in function '$@'. | coroutines.cpp:95:20:95:38 | co_returnable_void co_yield_value_void(int) | co_returnable_void co_yield_value_void(int) |
|
||||
| coroutines.cpp:99:21:99:21 | VariableAddress: (unnamed local variable) | Variable address instruction 'VariableAddress: (unnamed local variable)' has no associated variable, in function '$@'. | coroutines.cpp:99:21:99:40 | co_returnable_value co_yield_value_value(int) | co_returnable_value co_yield_value_value(int) |
|
||||
| coroutines.cpp:99:21:99:21 | VariableAddress: (unnamed local variable) | Variable address instruction 'VariableAddress: (unnamed local variable)' has no associated variable, in function '$@'. | coroutines.cpp:99:21:99:40 | co_returnable_value co_yield_value_value(int) | co_returnable_value co_yield_value_value(int) |
|
||||
| coroutines.cpp:100:3:100:3 | VariableAddress: (unnamed local variable) | Variable address instruction 'VariableAddress: (unnamed local variable)' has no associated variable, in function '$@'. | coroutines.cpp:99:21:99:40 | co_returnable_value co_yield_value_value(int) | co_returnable_value co_yield_value_value(int) |
|
||||
| coroutines.cpp:103:20:103:20 | VariableAddress: (unnamed local variable) | Variable address instruction 'VariableAddress: (unnamed local variable)' has no associated variable, in function '$@'. | coroutines.cpp:103:20:103:43 | co_returnable_void co_yield_and_return_void(int) | co_returnable_void co_yield_and_return_void(int) |
|
||||
| coroutines.cpp:103:20:103:20 | VariableAddress: (unnamed local variable) | Variable address instruction 'VariableAddress: (unnamed local variable)' has no associated variable, in function '$@'. | coroutines.cpp:103:20:103:43 | co_returnable_void co_yield_and_return_void(int) | co_returnable_void co_yield_and_return_void(int) |
|
||||
| coroutines.cpp:104:3:104:3 | VariableAddress: (unnamed local variable) | Variable address instruction 'VariableAddress: (unnamed local variable)' has no associated variable, in function '$@'. | coroutines.cpp:103:20:103:43 | co_returnable_void co_yield_and_return_void(int) | co_returnable_void co_yield_and_return_void(int) |
|
||||
| coroutines.cpp:108:21:108:21 | VariableAddress: (unnamed local variable) | Variable address instruction 'VariableAddress: (unnamed local variable)' has no associated variable, in function '$@'. | coroutines.cpp:108:21:108:45 | co_returnable_value co_yield_and_return_value(int) | co_returnable_value co_yield_and_return_value(int) |
|
||||
| coroutines.cpp:108:21:108:21 | VariableAddress: (unnamed local variable) | Variable address instruction 'VariableAddress: (unnamed local variable)' has no associated variable, in function '$@'. | coroutines.cpp:108:21:108:45 | co_returnable_value co_yield_and_return_value(int) | co_returnable_value co_yield_and_return_value(int) |
|
||||
| coroutines.cpp:109:3:109:3 | VariableAddress: (unnamed local variable) | Variable address instruction 'VariableAddress: (unnamed local variable)' has no associated variable, in function '$@'. | coroutines.cpp:108:21:108:45 | co_returnable_value co_yield_and_return_value(int) | co_returnable_value co_yield_and_return_value(int) |
|
||||
| file://:0:0:0:0 | VariableAddress: (unnamed local variable) | Variable address instruction 'VariableAddress: (unnamed local variable)' has no associated variable, in function '$@'. | coroutines.cpp:87:20:87:33 | co_returnable_void co_return_void() | co_returnable_void co_return_void() |
|
||||
| file://:0:0:0:0 | VariableAddress: (unnamed local variable) | Variable address instruction 'VariableAddress: (unnamed local variable)' has no associated variable, in function '$@'. | coroutines.cpp:91:21:91:33 | co_returnable_value co_return_int(int) | co_returnable_value co_return_int(int) |
|
||||
| file://:0:0:0:0 | VariableAddress: (unnamed local variable) | Variable address instruction 'VariableAddress: (unnamed local variable)' has no associated variable, in function '$@'. | coroutines.cpp:95:20:95:38 | co_returnable_void co_yield_value_void(int) | co_returnable_void co_yield_value_void(int) |
|
||||
| file://:0:0:0:0 | VariableAddress: (unnamed local variable) | Variable address instruction 'VariableAddress: (unnamed local variable)' has no associated variable, in function '$@'. | coroutines.cpp:99:21:99:40 | co_returnable_value co_yield_value_value(int) | co_returnable_value co_yield_value_value(int) |
|
||||
| file://:0:0:0:0 | VariableAddress: (unnamed local variable) | Variable address instruction 'VariableAddress: (unnamed local variable)' has no associated variable, in function '$@'. | coroutines.cpp:103:20:103:43 | co_returnable_void co_yield_and_return_void(int) | co_returnable_void co_yield_and_return_void(int) |
|
||||
| file://:0:0:0:0 | VariableAddress: (unnamed local variable) | Variable address instruction 'VariableAddress: (unnamed local variable)' has no associated variable, in function '$@'. | coroutines.cpp:108:21:108:45 | co_returnable_value co_yield_and_return_value(int) | co_returnable_value co_yield_and_return_value(int) |
|
||||
missingCppType
|
||||
|
|
|
@ -1,6 +1,31 @@
|
|||
void c11_generic_test(unsigned int x, int y) {
|
||||
void c11_generic_test_with_load(unsigned int x, int y) {
|
||||
unsigned int r;
|
||||
r = _Generic(r, unsigned int: x, int: y) + 1;
|
||||
}
|
||||
|
||||
// // semmle-extractor-options: -std=c11
|
||||
#define describe(val) \
|
||||
_Generic((val), \
|
||||
int: "int", \
|
||||
default: "unknown" \
|
||||
)
|
||||
|
||||
const char *c11_generic_test_with_constant_and_macro()
|
||||
{
|
||||
int i;
|
||||
|
||||
return describe(i);
|
||||
}
|
||||
|
||||
const char *c11_generic_test_with_constant_and_no_macro()
|
||||
{
|
||||
int i;
|
||||
|
||||
return _Generic(i, int: "int", default: "unknown");
|
||||
}
|
||||
|
||||
void c11_generic_test_test_with_cast(int y) {
|
||||
unsigned int r;
|
||||
r = _Generic(r, unsigned int: (unsigned int)y, int: y);
|
||||
}
|
||||
|
||||
// semmle-extractor-options: -std=c11
|
||||
|
|
|
@ -38,32 +38,4 @@ fieldAddressOnNonPointer
|
|||
thisArgumentIsNonPointer
|
||||
| ir.cpp:2546:34:2546:34 | Call: call to operator bool | Call instruction 'Call: call to operator bool' has a `this` argument operand that is not an address, in function '$@'. | ir.cpp:2545:6:2545:23 | void this_inconsistency(bool) | void this_inconsistency(bool) |
|
||||
nonUniqueIRVariable
|
||||
| coroutines.cpp:87:20:87:20 | VariableAddress: (unnamed local variable) | Variable address instruction 'VariableAddress: (unnamed local variable)' has no associated variable, in function '$@'. | coroutines.cpp:87:20:87:33 | co_returnable_void co_return_void() | co_returnable_void co_return_void() |
|
||||
| coroutines.cpp:87:20:87:20 | VariableAddress: (unnamed local variable) | Variable address instruction 'VariableAddress: (unnamed local variable)' has no associated variable, in function '$@'. | coroutines.cpp:87:20:87:33 | co_returnable_void co_return_void() | co_returnable_void co_return_void() |
|
||||
| coroutines.cpp:91:21:91:21 | VariableAddress: (unnamed local variable) | Variable address instruction 'VariableAddress: (unnamed local variable)' has no associated variable, in function '$@'. | coroutines.cpp:91:21:91:33 | co_returnable_value co_return_int(int) | co_returnable_value co_return_int(int) |
|
||||
| coroutines.cpp:91:21:91:21 | VariableAddress: (unnamed local variable) | Variable address instruction 'VariableAddress: (unnamed local variable)' has no associated variable, in function '$@'. | coroutines.cpp:91:21:91:33 | co_returnable_value co_return_int(int) | co_returnable_value co_return_int(int) |
|
||||
| coroutines.cpp:95:20:95:20 | VariableAddress: (unnamed local variable) | Variable address instruction 'VariableAddress: (unnamed local variable)' has no associated variable, in function '$@'. | coroutines.cpp:95:20:95:38 | co_returnable_void co_yield_value_void(int) | co_returnable_void co_yield_value_void(int) |
|
||||
| coroutines.cpp:95:20:95:20 | VariableAddress: (unnamed local variable) | Variable address instruction 'VariableAddress: (unnamed local variable)' has no associated variable, in function '$@'. | coroutines.cpp:95:20:95:38 | co_returnable_void co_yield_value_void(int) | co_returnable_void co_yield_value_void(int) |
|
||||
| coroutines.cpp:96:3:96:3 | VariableAddress: (unnamed local variable) | Variable address instruction 'VariableAddress: (unnamed local variable)' has no associated variable, in function '$@'. | coroutines.cpp:95:20:95:38 | co_returnable_void co_yield_value_void(int) | co_returnable_void co_yield_value_void(int) |
|
||||
| coroutines.cpp:99:21:99:21 | VariableAddress: (unnamed local variable) | Variable address instruction 'VariableAddress: (unnamed local variable)' has no associated variable, in function '$@'. | coroutines.cpp:99:21:99:40 | co_returnable_value co_yield_value_value(int) | co_returnable_value co_yield_value_value(int) |
|
||||
| coroutines.cpp:99:21:99:21 | VariableAddress: (unnamed local variable) | Variable address instruction 'VariableAddress: (unnamed local variable)' has no associated variable, in function '$@'. | coroutines.cpp:99:21:99:40 | co_returnable_value co_yield_value_value(int) | co_returnable_value co_yield_value_value(int) |
|
||||
| coroutines.cpp:100:3:100:3 | VariableAddress: (unnamed local variable) | Variable address instruction 'VariableAddress: (unnamed local variable)' has no associated variable, in function '$@'. | coroutines.cpp:99:21:99:40 | co_returnable_value co_yield_value_value(int) | co_returnable_value co_yield_value_value(int) |
|
||||
| coroutines.cpp:103:20:103:20 | VariableAddress: (unnamed local variable) | Variable address instruction 'VariableAddress: (unnamed local variable)' has no associated variable, in function '$@'. | coroutines.cpp:103:20:103:43 | co_returnable_void co_yield_and_return_void(int) | co_returnable_void co_yield_and_return_void(int) |
|
||||
| coroutines.cpp:103:20:103:20 | VariableAddress: (unnamed local variable) | Variable address instruction 'VariableAddress: (unnamed local variable)' has no associated variable, in function '$@'. | coroutines.cpp:103:20:103:43 | co_returnable_void co_yield_and_return_void(int) | co_returnable_void co_yield_and_return_void(int) |
|
||||
| coroutines.cpp:104:3:104:3 | VariableAddress: (unnamed local variable) | Variable address instruction 'VariableAddress: (unnamed local variable)' has no associated variable, in function '$@'. | coroutines.cpp:103:20:103:43 | co_returnable_void co_yield_and_return_void(int) | co_returnable_void co_yield_and_return_void(int) |
|
||||
| coroutines.cpp:108:21:108:21 | VariableAddress: (unnamed local variable) | Variable address instruction 'VariableAddress: (unnamed local variable)' has no associated variable, in function '$@'. | coroutines.cpp:108:21:108:45 | co_returnable_value co_yield_and_return_value(int) | co_returnable_value co_yield_and_return_value(int) |
|
||||
| coroutines.cpp:108:21:108:21 | VariableAddress: (unnamed local variable) | Variable address instruction 'VariableAddress: (unnamed local variable)' has no associated variable, in function '$@'. | coroutines.cpp:108:21:108:45 | co_returnable_value co_yield_and_return_value(int) | co_returnable_value co_yield_and_return_value(int) |
|
||||
| coroutines.cpp:109:3:109:3 | VariableAddress: (unnamed local variable) | Variable address instruction 'VariableAddress: (unnamed local variable)' has no associated variable, in function '$@'. | coroutines.cpp:108:21:108:45 | co_returnable_value co_yield_and_return_value(int) | co_returnable_value co_yield_and_return_value(int) |
|
||||
| file://:0:0:0:0 | VariableAddress: (unnamed local variable) | Variable address instruction 'VariableAddress: (unnamed local variable)' has no associated variable, in function '$@'. | coroutines.cpp:87:20:87:33 | co_returnable_void co_return_void() | co_returnable_void co_return_void() |
|
||||
| file://:0:0:0:0 | VariableAddress: (unnamed local variable) | Variable address instruction 'VariableAddress: (unnamed local variable)' has no associated variable, in function '$@'. | coroutines.cpp:87:20:87:33 | co_returnable_void co_return_void() | co_returnable_void co_return_void() |
|
||||
| file://:0:0:0:0 | VariableAddress: (unnamed local variable) | Variable address instruction 'VariableAddress: (unnamed local variable)' has no associated variable, in function '$@'. | coroutines.cpp:91:21:91:33 | co_returnable_value co_return_int(int) | co_returnable_value co_return_int(int) |
|
||||
| file://:0:0:0:0 | VariableAddress: (unnamed local variable) | Variable address instruction 'VariableAddress: (unnamed local variable)' has no associated variable, in function '$@'. | coroutines.cpp:91:21:91:33 | co_returnable_value co_return_int(int) | co_returnable_value co_return_int(int) |
|
||||
| file://:0:0:0:0 | VariableAddress: (unnamed local variable) | Variable address instruction 'VariableAddress: (unnamed local variable)' has no associated variable, in function '$@'. | coroutines.cpp:95:20:95:38 | co_returnable_void co_yield_value_void(int) | co_returnable_void co_yield_value_void(int) |
|
||||
| file://:0:0:0:0 | VariableAddress: (unnamed local variable) | Variable address instruction 'VariableAddress: (unnamed local variable)' has no associated variable, in function '$@'. | coroutines.cpp:95:20:95:38 | co_returnable_void co_yield_value_void(int) | co_returnable_void co_yield_value_void(int) |
|
||||
| file://:0:0:0:0 | VariableAddress: (unnamed local variable) | Variable address instruction 'VariableAddress: (unnamed local variable)' has no associated variable, in function '$@'. | coroutines.cpp:99:21:99:40 | co_returnable_value co_yield_value_value(int) | co_returnable_value co_yield_value_value(int) |
|
||||
| file://:0:0:0:0 | VariableAddress: (unnamed local variable) | Variable address instruction 'VariableAddress: (unnamed local variable)' has no associated variable, in function '$@'. | coroutines.cpp:99:21:99:40 | co_returnable_value co_yield_value_value(int) | co_returnable_value co_yield_value_value(int) |
|
||||
| file://:0:0:0:0 | VariableAddress: (unnamed local variable) | Variable address instruction 'VariableAddress: (unnamed local variable)' has no associated variable, in function '$@'. | coroutines.cpp:103:20:103:43 | co_returnable_void co_yield_and_return_void(int) | co_returnable_void co_yield_and_return_void(int) |
|
||||
| file://:0:0:0:0 | VariableAddress: (unnamed local variable) | Variable address instruction 'VariableAddress: (unnamed local variable)' has no associated variable, in function '$@'. | coroutines.cpp:103:20:103:43 | co_returnable_void co_yield_and_return_void(int) | co_returnable_void co_yield_and_return_void(int) |
|
||||
| file://:0:0:0:0 | VariableAddress: (unnamed local variable) | Variable address instruction 'VariableAddress: (unnamed local variable)' has no associated variable, in function '$@'. | coroutines.cpp:108:21:108:45 | co_returnable_value co_yield_and_return_value(int) | co_returnable_value co_yield_and_return_value(int) |
|
||||
| file://:0:0:0:0 | VariableAddress: (unnamed local variable) | Variable address instruction 'VariableAddress: (unnamed local variable)' has no associated variable, in function '$@'. | coroutines.cpp:108:21:108:45 | co_returnable_value co_yield_and_return_value(int) | co_returnable_value co_yield_and_return_value(int) |
|
||||
missingCppType
|
||||
|
|
|
@ -770,8 +770,8 @@ coroutines.cpp:
|
|||
|
||||
#-----| Block 3
|
||||
#-----| r0_4(bool) = Constant[1] :
|
||||
#-----| r0_5(glval<bool>) = VariableAddress :
|
||||
#-----| mu0_6(bool) = Store[?] : &:r0_5, r0_4
|
||||
#-----| r0_5(glval<bool>) = VariableAddress[(unnamed local variable)] :
|
||||
#-----| mu0_6(bool) = Store[(unnamed local variable)] : &:r0_5, r0_4
|
||||
# 87| r87_31(suspend_always *) = CopyValue : r87_20
|
||||
# 87| r87_32(glval<suspend_always>) = CopyValue : r87_31
|
||||
#-----| r0_7(glval<suspend_always>) = Convert : r87_32
|
||||
|
@ -791,32 +791,32 @@ coroutines.cpp:
|
|||
#-----| Goto (back edge) -> Block 8
|
||||
|
||||
# 87| Block 4
|
||||
# 87| r87_36(suspend_always *) = CopyValue : r87_20
|
||||
# 87| r87_37(glval<suspend_always>) = CopyValue : r87_36
|
||||
#-----| r0_17(glval<suspend_always>) = Convert : r87_37
|
||||
# 87| r87_38(glval<unknown>) = FunctionAddress[await_suspend] :
|
||||
# 87| r87_39(glval<coroutine_handle<promise_type>>) = VariableAddress[#temp87:20] :
|
||||
# 87| mu87_40(coroutine_handle<promise_type>) = Uninitialized[#temp87:20] : &:r87_39
|
||||
# 87| r87_41(glval<unknown>) = FunctionAddress[coroutine_handle] :
|
||||
# 87| r87_42(glval<coroutine_handle<promise_type>>) = VariableAddress :
|
||||
# 87| r87_43(glval<coroutine_handle<promise_type>>) = Convert : r87_42
|
||||
# 87| r87_44(coroutine_handle<promise_type> &) = CopyValue : r87_43
|
||||
# 87| v87_45(void) = Call[coroutine_handle] : func:r87_41, this:r87_39, 0:r87_44
|
||||
# 87| mu87_46(unknown) = ^CallSideEffect : ~m?
|
||||
# 87| v87_47(void) = ^BufferReadSideEffect[0] : &:r87_44, ~m?
|
||||
# 87| mu87_48(coroutine_handle<promise_type>) = ^IndirectMayWriteSideEffect[-1] : &:r87_39
|
||||
# 87| r87_49(coroutine_handle<promise_type>) = Load[#temp87:20] : &:r87_39, ~m?
|
||||
# 87| v87_50(void) = Call[await_suspend] : func:r87_38, this:r0_17, 0:r87_49
|
||||
# 87| mu87_51(unknown) = ^CallSideEffect : ~m?
|
||||
#-----| v0_18(void) = ^IndirectReadSideEffect[-1] : &:r0_17, ~m?
|
||||
# 87| r87_36(suspend_always *) = CopyValue : r87_20
|
||||
# 87| r87_37(glval<suspend_always>) = CopyValue : r87_36
|
||||
#-----| r0_17(glval<suspend_always>) = Convert : r87_37
|
||||
# 87| r87_38(glval<unknown>) = FunctionAddress[await_suspend] :
|
||||
# 87| r87_39(glval<coroutine_handle<promise_type>>) = VariableAddress[#temp87:20] :
|
||||
# 87| mu87_40(coroutine_handle<promise_type>) = Uninitialized[#temp87:20] : &:r87_39
|
||||
# 87| r87_41(glval<unknown>) = FunctionAddress[coroutine_handle] :
|
||||
# 87| r87_42(glval<coroutine_handle<promise_type>>) = VariableAddress[(unnamed local variable)] :
|
||||
# 87| r87_43(glval<coroutine_handle<promise_type>>) = Convert : r87_42
|
||||
# 87| r87_44(coroutine_handle<promise_type> &) = CopyValue : r87_43
|
||||
# 87| v87_45(void) = Call[coroutine_handle] : func:r87_41, this:r87_39, 0:r87_44
|
||||
# 87| mu87_46(unknown) = ^CallSideEffect : ~m?
|
||||
# 87| v87_47(void) = ^BufferReadSideEffect[0] : &:r87_44, ~m?
|
||||
# 87| mu87_48(coroutine_handle<promise_type>) = ^IndirectMayWriteSideEffect[-1] : &:r87_39
|
||||
# 87| r87_49(coroutine_handle<promise_type>) = Load[#temp87:20] : &:r87_39, ~m?
|
||||
# 87| v87_50(void) = Call[await_suspend] : func:r87_38, this:r0_17, 0:r87_49
|
||||
# 87| mu87_51(unknown) = ^CallSideEffect : ~m?
|
||||
#-----| v0_18(void) = ^IndirectReadSideEffect[-1] : &:r0_17, ~m?
|
||||
#-----| Goto -> Block 3
|
||||
|
||||
#-----| Block 5
|
||||
#-----| v0_19(void) = CatchAny :
|
||||
#-----| r0_20(glval<bool>) = VariableAddress :
|
||||
#-----| r0_21(bool) = Load[?] : &:r0_20, ~m?
|
||||
#-----| r0_22(bool) = LogicalNot : r0_21
|
||||
#-----| v0_23(void) = ConditionalBranch : r0_22
|
||||
#-----| v0_19(void) = CatchAny :
|
||||
#-----| r0_20(glval<bool>) = VariableAddress[(unnamed local variable)] :
|
||||
#-----| r0_21(bool) = Load[(unnamed local variable)] : &:r0_20, ~m?
|
||||
#-----| r0_22(bool) = LogicalNot : r0_21
|
||||
#-----| v0_23(void) = ConditionalBranch : r0_22
|
||||
#-----| False -> Block 7
|
||||
#-----| True -> Block 6
|
||||
|
||||
|
@ -876,24 +876,24 @@ coroutines.cpp:
|
|||
#-----| Goto -> Block 1
|
||||
|
||||
# 87| Block 10
|
||||
# 87| r87_87(suspend_always *) = CopyValue : r87_72
|
||||
# 87| r87_88(glval<suspend_always>) = CopyValue : r87_87
|
||||
#-----| r0_31(glval<suspend_always>) = Convert : r87_88
|
||||
# 87| r87_89(glval<unknown>) = FunctionAddress[await_suspend] :
|
||||
# 87| r87_90(glval<coroutine_handle<promise_type>>) = VariableAddress[#temp87:20] :
|
||||
# 87| mu87_91(coroutine_handle<promise_type>) = Uninitialized[#temp87:20] : &:r87_90
|
||||
# 87| r87_92(glval<unknown>) = FunctionAddress[coroutine_handle] :
|
||||
# 87| r87_93(glval<coroutine_handle<promise_type>>) = VariableAddress :
|
||||
# 87| r87_94(glval<coroutine_handle<promise_type>>) = Convert : r87_93
|
||||
# 87| r87_95(coroutine_handle<promise_type> &) = CopyValue : r87_94
|
||||
# 87| v87_96(void) = Call[coroutine_handle] : func:r87_92, this:r87_90, 0:r87_95
|
||||
# 87| mu87_97(unknown) = ^CallSideEffect : ~m?
|
||||
# 87| v87_98(void) = ^BufferReadSideEffect[0] : &:r87_95, ~m?
|
||||
# 87| mu87_99(coroutine_handle<promise_type>) = ^IndirectMayWriteSideEffect[-1] : &:r87_90
|
||||
# 87| r87_100(coroutine_handle<promise_type>) = Load[#temp87:20] : &:r87_90, ~m?
|
||||
# 87| v87_101(void) = Call[await_suspend] : func:r87_89, this:r0_31, 0:r87_100
|
||||
# 87| mu87_102(unknown) = ^CallSideEffect : ~m?
|
||||
#-----| v0_32(void) = ^IndirectReadSideEffect[-1] : &:r0_31, ~m?
|
||||
# 87| r87_87(suspend_always *) = CopyValue : r87_72
|
||||
# 87| r87_88(glval<suspend_always>) = CopyValue : r87_87
|
||||
#-----| r0_31(glval<suspend_always>) = Convert : r87_88
|
||||
# 87| r87_89(glval<unknown>) = FunctionAddress[await_suspend] :
|
||||
# 87| r87_90(glval<coroutine_handle<promise_type>>) = VariableAddress[#temp87:20] :
|
||||
# 87| mu87_91(coroutine_handle<promise_type>) = Uninitialized[#temp87:20] : &:r87_90
|
||||
# 87| r87_92(glval<unknown>) = FunctionAddress[coroutine_handle] :
|
||||
# 87| r87_93(glval<coroutine_handle<promise_type>>) = VariableAddress[(unnamed local variable)] :
|
||||
# 87| r87_94(glval<coroutine_handle<promise_type>>) = Convert : r87_93
|
||||
# 87| r87_95(coroutine_handle<promise_type> &) = CopyValue : r87_94
|
||||
# 87| v87_96(void) = Call[coroutine_handle] : func:r87_92, this:r87_90, 0:r87_95
|
||||
# 87| mu87_97(unknown) = ^CallSideEffect : ~m?
|
||||
# 87| v87_98(void) = ^BufferReadSideEffect[0] : &:r87_95, ~m?
|
||||
# 87| mu87_99(coroutine_handle<promise_type>) = ^IndirectMayWriteSideEffect[-1] : &:r87_90
|
||||
# 87| r87_100(coroutine_handle<promise_type>) = Load[#temp87:20] : &:r87_90, ~m?
|
||||
# 87| v87_101(void) = Call[await_suspend] : func:r87_89, this:r0_31, 0:r87_100
|
||||
# 87| mu87_102(unknown) = ^CallSideEffect : ~m?
|
||||
#-----| v0_32(void) = ^IndirectReadSideEffect[-1] : &:r0_31, ~m?
|
||||
#-----| Goto -> Block 9
|
||||
|
||||
# 91| co_returnable_value co_return_int(int)
|
||||
|
@ -947,8 +947,8 @@ coroutines.cpp:
|
|||
|
||||
#-----| Block 3
|
||||
#-----| r0_8(bool) = Constant[1] :
|
||||
#-----| r0_9(glval<bool>) = VariableAddress :
|
||||
#-----| mu0_10(bool) = Store[?] : &:r0_9, r0_8
|
||||
#-----| r0_9(glval<bool>) = VariableAddress[(unnamed local variable)] :
|
||||
#-----| mu0_10(bool) = Store[(unnamed local variable)] : &:r0_9, r0_8
|
||||
# 91| r91_33(suspend_always *) = CopyValue : r91_22
|
||||
# 91| r91_34(glval<suspend_always>) = CopyValue : r91_33
|
||||
#-----| r0_11(glval<suspend_always>) = Convert : r91_34
|
||||
|
@ -970,32 +970,32 @@ coroutines.cpp:
|
|||
#-----| Goto (back edge) -> Block 8
|
||||
|
||||
# 91| Block 4
|
||||
# 91| r91_38(suspend_always *) = CopyValue : r91_22
|
||||
# 91| r91_39(glval<suspend_always>) = CopyValue : r91_38
|
||||
#-----| r0_21(glval<suspend_always>) = Convert : r91_39
|
||||
# 91| r91_40(glval<unknown>) = FunctionAddress[await_suspend] :
|
||||
# 91| r91_41(glval<coroutine_handle<promise_type>>) = VariableAddress[#temp91:21] :
|
||||
# 91| mu91_42(coroutine_handle<promise_type>) = Uninitialized[#temp91:21] : &:r91_41
|
||||
# 91| r91_43(glval<unknown>) = FunctionAddress[coroutine_handle] :
|
||||
# 91| r91_44(glval<coroutine_handle<promise_type>>) = VariableAddress :
|
||||
# 91| r91_45(glval<coroutine_handle<promise_type>>) = Convert : r91_44
|
||||
# 91| r91_46(coroutine_handle<promise_type> &) = CopyValue : r91_45
|
||||
# 91| v91_47(void) = Call[coroutine_handle] : func:r91_43, this:r91_41, 0:r91_46
|
||||
# 91| mu91_48(unknown) = ^CallSideEffect : ~m?
|
||||
# 91| v91_49(void) = ^BufferReadSideEffect[0] : &:r91_46, ~m?
|
||||
# 91| mu91_50(coroutine_handle<promise_type>) = ^IndirectMayWriteSideEffect[-1] : &:r91_41
|
||||
# 91| r91_51(coroutine_handle<promise_type>) = Load[#temp91:21] : &:r91_41, ~m?
|
||||
# 91| v91_52(void) = Call[await_suspend] : func:r91_40, this:r0_21, 0:r91_51
|
||||
# 91| mu91_53(unknown) = ^CallSideEffect : ~m?
|
||||
#-----| v0_22(void) = ^IndirectReadSideEffect[-1] : &:r0_21, ~m?
|
||||
# 91| r91_38(suspend_always *) = CopyValue : r91_22
|
||||
# 91| r91_39(glval<suspend_always>) = CopyValue : r91_38
|
||||
#-----| r0_21(glval<suspend_always>) = Convert : r91_39
|
||||
# 91| r91_40(glval<unknown>) = FunctionAddress[await_suspend] :
|
||||
# 91| r91_41(glval<coroutine_handle<promise_type>>) = VariableAddress[#temp91:21] :
|
||||
# 91| mu91_42(coroutine_handle<promise_type>) = Uninitialized[#temp91:21] : &:r91_41
|
||||
# 91| r91_43(glval<unknown>) = FunctionAddress[coroutine_handle] :
|
||||
# 91| r91_44(glval<coroutine_handle<promise_type>>) = VariableAddress[(unnamed local variable)] :
|
||||
# 91| r91_45(glval<coroutine_handle<promise_type>>) = Convert : r91_44
|
||||
# 91| r91_46(coroutine_handle<promise_type> &) = CopyValue : r91_45
|
||||
# 91| v91_47(void) = Call[coroutine_handle] : func:r91_43, this:r91_41, 0:r91_46
|
||||
# 91| mu91_48(unknown) = ^CallSideEffect : ~m?
|
||||
# 91| v91_49(void) = ^BufferReadSideEffect[0] : &:r91_46, ~m?
|
||||
# 91| mu91_50(coroutine_handle<promise_type>) = ^IndirectMayWriteSideEffect[-1] : &:r91_41
|
||||
# 91| r91_51(coroutine_handle<promise_type>) = Load[#temp91:21] : &:r91_41, ~m?
|
||||
# 91| v91_52(void) = Call[await_suspend] : func:r91_40, this:r0_21, 0:r91_51
|
||||
# 91| mu91_53(unknown) = ^CallSideEffect : ~m?
|
||||
#-----| v0_22(void) = ^IndirectReadSideEffect[-1] : &:r0_21, ~m?
|
||||
#-----| Goto -> Block 3
|
||||
|
||||
#-----| Block 5
|
||||
#-----| v0_23(void) = CatchAny :
|
||||
#-----| r0_24(glval<bool>) = VariableAddress :
|
||||
#-----| r0_25(bool) = Load[?] : &:r0_24, ~m?
|
||||
#-----| r0_26(bool) = LogicalNot : r0_25
|
||||
#-----| v0_27(void) = ConditionalBranch : r0_26
|
||||
#-----| v0_23(void) = CatchAny :
|
||||
#-----| r0_24(glval<bool>) = VariableAddress[(unnamed local variable)] :
|
||||
#-----| r0_25(bool) = Load[(unnamed local variable)] : &:r0_24, ~m?
|
||||
#-----| r0_26(bool) = LogicalNot : r0_25
|
||||
#-----| v0_27(void) = ConditionalBranch : r0_26
|
||||
#-----| False -> Block 7
|
||||
#-----| True -> Block 6
|
||||
|
||||
|
@ -1055,24 +1055,24 @@ coroutines.cpp:
|
|||
#-----| Goto -> Block 1
|
||||
|
||||
# 91| Block 10
|
||||
# 91| r91_89(suspend_always *) = CopyValue : r91_74
|
||||
# 91| r91_90(glval<suspend_always>) = CopyValue : r91_89
|
||||
#-----| r0_35(glval<suspend_always>) = Convert : r91_90
|
||||
# 91| r91_91(glval<unknown>) = FunctionAddress[await_suspend] :
|
||||
# 91| r91_92(glval<coroutine_handle<promise_type>>) = VariableAddress[#temp91:21] :
|
||||
# 91| mu91_93(coroutine_handle<promise_type>) = Uninitialized[#temp91:21] : &:r91_92
|
||||
# 91| r91_94(glval<unknown>) = FunctionAddress[coroutine_handle] :
|
||||
# 91| r91_95(glval<coroutine_handle<promise_type>>) = VariableAddress :
|
||||
# 91| r91_96(glval<coroutine_handle<promise_type>>) = Convert : r91_95
|
||||
# 91| r91_97(coroutine_handle<promise_type> &) = CopyValue : r91_96
|
||||
# 91| v91_98(void) = Call[coroutine_handle] : func:r91_94, this:r91_92, 0:r91_97
|
||||
# 91| mu91_99(unknown) = ^CallSideEffect : ~m?
|
||||
# 91| v91_100(void) = ^BufferReadSideEffect[0] : &:r91_97, ~m?
|
||||
# 91| mu91_101(coroutine_handle<promise_type>) = ^IndirectMayWriteSideEffect[-1] : &:r91_92
|
||||
# 91| r91_102(coroutine_handle<promise_type>) = Load[#temp91:21] : &:r91_92, ~m?
|
||||
# 91| v91_103(void) = Call[await_suspend] : func:r91_91, this:r0_35, 0:r91_102
|
||||
# 91| mu91_104(unknown) = ^CallSideEffect : ~m?
|
||||
#-----| v0_36(void) = ^IndirectReadSideEffect[-1] : &:r0_35, ~m?
|
||||
# 91| r91_89(suspend_always *) = CopyValue : r91_74
|
||||
# 91| r91_90(glval<suspend_always>) = CopyValue : r91_89
|
||||
#-----| r0_35(glval<suspend_always>) = Convert : r91_90
|
||||
# 91| r91_91(glval<unknown>) = FunctionAddress[await_suspend] :
|
||||
# 91| r91_92(glval<coroutine_handle<promise_type>>) = VariableAddress[#temp91:21] :
|
||||
# 91| mu91_93(coroutine_handle<promise_type>) = Uninitialized[#temp91:21] : &:r91_92
|
||||
# 91| r91_94(glval<unknown>) = FunctionAddress[coroutine_handle] :
|
||||
# 91| r91_95(glval<coroutine_handle<promise_type>>) = VariableAddress[(unnamed local variable)] :
|
||||
# 91| r91_96(glval<coroutine_handle<promise_type>>) = Convert : r91_95
|
||||
# 91| r91_97(coroutine_handle<promise_type> &) = CopyValue : r91_96
|
||||
# 91| v91_98(void) = Call[coroutine_handle] : func:r91_94, this:r91_92, 0:r91_97
|
||||
# 91| mu91_99(unknown) = ^CallSideEffect : ~m?
|
||||
# 91| v91_100(void) = ^BufferReadSideEffect[0] : &:r91_97, ~m?
|
||||
# 91| mu91_101(coroutine_handle<promise_type>) = ^IndirectMayWriteSideEffect[-1] : &:r91_92
|
||||
# 91| r91_102(coroutine_handle<promise_type>) = Load[#temp91:21] : &:r91_92, ~m?
|
||||
# 91| v91_103(void) = Call[await_suspend] : func:r91_91, this:r0_35, 0:r91_102
|
||||
# 91| mu91_104(unknown) = ^CallSideEffect : ~m?
|
||||
#-----| v0_36(void) = ^IndirectReadSideEffect[-1] : &:r0_35, ~m?
|
||||
#-----| Goto -> Block 9
|
||||
|
||||
# 95| co_returnable_void co_yield_value_void(int)
|
||||
|
@ -1126,8 +1126,8 @@ coroutines.cpp:
|
|||
|
||||
#-----| Block 3
|
||||
#-----| r0_8(bool) = Constant[1] :
|
||||
#-----| r0_9(glval<bool>) = VariableAddress :
|
||||
#-----| mu0_10(bool) = Store[?] : &:r0_9, r0_8
|
||||
#-----| r0_9(glval<bool>) = VariableAddress[(unnamed local variable)] :
|
||||
#-----| mu0_10(bool) = Store[(unnamed local variable)] : &:r0_9, r0_8
|
||||
# 95| r95_33(suspend_always *) = CopyValue : r95_22
|
||||
# 95| r95_34(glval<suspend_always>) = CopyValue : r95_33
|
||||
#-----| r0_11(glval<suspend_always>) = Convert : r95_34
|
||||
|
@ -1169,24 +1169,24 @@ coroutines.cpp:
|
|||
#-----| True -> Block 5
|
||||
|
||||
# 95| Block 4
|
||||
# 95| r95_38(suspend_always *) = CopyValue : r95_22
|
||||
# 95| r95_39(glval<suspend_always>) = CopyValue : r95_38
|
||||
#-----| r0_16(glval<suspend_always>) = Convert : r95_39
|
||||
# 95| r95_40(glval<unknown>) = FunctionAddress[await_suspend] :
|
||||
# 95| r95_41(glval<coroutine_handle<promise_type>>) = VariableAddress[#temp95:20] :
|
||||
# 95| mu95_42(coroutine_handle<promise_type>) = Uninitialized[#temp95:20] : &:r95_41
|
||||
# 95| r95_43(glval<unknown>) = FunctionAddress[coroutine_handle] :
|
||||
# 95| r95_44(glval<coroutine_handle<promise_type>>) = VariableAddress :
|
||||
# 95| r95_45(glval<coroutine_handle<promise_type>>) = Convert : r95_44
|
||||
# 95| r95_46(coroutine_handle<promise_type> &) = CopyValue : r95_45
|
||||
# 95| v95_47(void) = Call[coroutine_handle] : func:r95_43, this:r95_41, 0:r95_46
|
||||
# 95| mu95_48(unknown) = ^CallSideEffect : ~m?
|
||||
# 95| v95_49(void) = ^BufferReadSideEffect[0] : &:r95_46, ~m?
|
||||
# 95| mu95_50(coroutine_handle<promise_type>) = ^IndirectMayWriteSideEffect[-1] : &:r95_41
|
||||
# 95| r95_51(coroutine_handle<promise_type>) = Load[#temp95:20] : &:r95_41, ~m?
|
||||
# 95| v95_52(void) = Call[await_suspend] : func:r95_40, this:r0_16, 0:r95_51
|
||||
# 95| mu95_53(unknown) = ^CallSideEffect : ~m?
|
||||
#-----| v0_17(void) = ^IndirectReadSideEffect[-1] : &:r0_16, ~m?
|
||||
# 95| r95_38(suspend_always *) = CopyValue : r95_22
|
||||
# 95| r95_39(glval<suspend_always>) = CopyValue : r95_38
|
||||
#-----| r0_16(glval<suspend_always>) = Convert : r95_39
|
||||
# 95| r95_40(glval<unknown>) = FunctionAddress[await_suspend] :
|
||||
# 95| r95_41(glval<coroutine_handle<promise_type>>) = VariableAddress[#temp95:20] :
|
||||
# 95| mu95_42(coroutine_handle<promise_type>) = Uninitialized[#temp95:20] : &:r95_41
|
||||
# 95| r95_43(glval<unknown>) = FunctionAddress[coroutine_handle] :
|
||||
# 95| r95_44(glval<coroutine_handle<promise_type>>) = VariableAddress[(unnamed local variable)] :
|
||||
# 95| r95_45(glval<coroutine_handle<promise_type>>) = Convert : r95_44
|
||||
# 95| r95_46(coroutine_handle<promise_type> &) = CopyValue : r95_45
|
||||
# 95| v95_47(void) = Call[coroutine_handle] : func:r95_43, this:r95_41, 0:r95_46
|
||||
# 95| mu95_48(unknown) = ^CallSideEffect : ~m?
|
||||
# 95| v95_49(void) = ^BufferReadSideEffect[0] : &:r95_46, ~m?
|
||||
# 95| mu95_50(coroutine_handle<promise_type>) = ^IndirectMayWriteSideEffect[-1] : &:r95_41
|
||||
# 95| r95_51(coroutine_handle<promise_type>) = Load[#temp95:20] : &:r95_41, ~m?
|
||||
# 95| v95_52(void) = Call[await_suspend] : func:r95_40, this:r0_16, 0:r95_51
|
||||
# 95| mu95_53(unknown) = ^CallSideEffect : ~m?
|
||||
#-----| v0_17(void) = ^IndirectReadSideEffect[-1] : &:r0_16, ~m?
|
||||
#-----| Goto -> Block 3
|
||||
|
||||
# 96| Block 5
|
||||
|
@ -1208,32 +1208,32 @@ coroutines.cpp:
|
|||
#-----| Goto (back edge) -> Block 10
|
||||
|
||||
# 96| Block 6
|
||||
# 96| r96_33(suspend_always *) = CopyValue : r96_19
|
||||
# 96| r96_34(glval<suspend_always>) = CopyValue : r96_33
|
||||
#-----| r0_27(glval<suspend_always>) = Convert : r96_34
|
||||
# 96| r96_35(glval<unknown>) = FunctionAddress[await_suspend] :
|
||||
# 96| r96_36(glval<coroutine_handle<promise_type>>) = VariableAddress[#temp96:3] :
|
||||
# 96| mu96_37(coroutine_handle<promise_type>) = Uninitialized[#temp96:3] : &:r96_36
|
||||
# 96| r96_38(glval<unknown>) = FunctionAddress[coroutine_handle] :
|
||||
# 96| r96_39(glval<coroutine_handle<promise_type>>) = VariableAddress :
|
||||
# 96| r96_40(glval<coroutine_handle<promise_type>>) = Convert : r96_39
|
||||
# 96| r96_41(coroutine_handle<promise_type> &) = CopyValue : r96_40
|
||||
# 96| v96_42(void) = Call[coroutine_handle] : func:r96_38, this:r96_36, 0:r96_41
|
||||
# 96| mu96_43(unknown) = ^CallSideEffect : ~m?
|
||||
# 96| v96_44(void) = ^BufferReadSideEffect[0] : &:r96_41, ~m?
|
||||
# 96| mu96_45(coroutine_handle<promise_type>) = ^IndirectMayWriteSideEffect[-1] : &:r96_36
|
||||
# 96| r96_46(coroutine_handle<promise_type>) = Load[#temp96:3] : &:r96_36, ~m?
|
||||
# 96| v96_47(void) = Call[await_suspend] : func:r96_35, this:r0_27, 0:r96_46
|
||||
# 96| mu96_48(unknown) = ^CallSideEffect : ~m?
|
||||
#-----| v0_28(void) = ^IndirectReadSideEffect[-1] : &:r0_27, ~m?
|
||||
# 96| r96_33(suspend_always *) = CopyValue : r96_19
|
||||
# 96| r96_34(glval<suspend_always>) = CopyValue : r96_33
|
||||
#-----| r0_27(glval<suspend_always>) = Convert : r96_34
|
||||
# 96| r96_35(glval<unknown>) = FunctionAddress[await_suspend] :
|
||||
# 96| r96_36(glval<coroutine_handle<promise_type>>) = VariableAddress[#temp96:3] :
|
||||
# 96| mu96_37(coroutine_handle<promise_type>) = Uninitialized[#temp96:3] : &:r96_36
|
||||
# 96| r96_38(glval<unknown>) = FunctionAddress[coroutine_handle] :
|
||||
# 96| r96_39(glval<coroutine_handle<promise_type>>) = VariableAddress[(unnamed local variable)] :
|
||||
# 96| r96_40(glval<coroutine_handle<promise_type>>) = Convert : r96_39
|
||||
# 96| r96_41(coroutine_handle<promise_type> &) = CopyValue : r96_40
|
||||
# 96| v96_42(void) = Call[coroutine_handle] : func:r96_38, this:r96_36, 0:r96_41
|
||||
# 96| mu96_43(unknown) = ^CallSideEffect : ~m?
|
||||
# 96| v96_44(void) = ^BufferReadSideEffect[0] : &:r96_41, ~m?
|
||||
# 96| mu96_45(coroutine_handle<promise_type>) = ^IndirectMayWriteSideEffect[-1] : &:r96_36
|
||||
# 96| r96_46(coroutine_handle<promise_type>) = Load[#temp96:3] : &:r96_36, ~m?
|
||||
# 96| v96_47(void) = Call[await_suspend] : func:r96_35, this:r0_27, 0:r96_46
|
||||
# 96| mu96_48(unknown) = ^CallSideEffect : ~m?
|
||||
#-----| v0_28(void) = ^IndirectReadSideEffect[-1] : &:r0_27, ~m?
|
||||
#-----| Goto -> Block 5
|
||||
|
||||
#-----| Block 7
|
||||
#-----| v0_29(void) = CatchAny :
|
||||
#-----| r0_30(glval<bool>) = VariableAddress :
|
||||
#-----| r0_31(bool) = Load[?] : &:r0_30, ~m?
|
||||
#-----| r0_32(bool) = LogicalNot : r0_31
|
||||
#-----| v0_33(void) = ConditionalBranch : r0_32
|
||||
#-----| v0_29(void) = CatchAny :
|
||||
#-----| r0_30(glval<bool>) = VariableAddress[(unnamed local variable)] :
|
||||
#-----| r0_31(bool) = Load[(unnamed local variable)] : &:r0_30, ~m?
|
||||
#-----| r0_32(bool) = LogicalNot : r0_31
|
||||
#-----| v0_33(void) = ConditionalBranch : r0_32
|
||||
#-----| False -> Block 9
|
||||
#-----| True -> Block 8
|
||||
|
||||
|
@ -1293,24 +1293,24 @@ coroutines.cpp:
|
|||
#-----| Goto -> Block 1
|
||||
|
||||
# 95| Block 12
|
||||
# 95| r95_89(suspend_always *) = CopyValue : r95_74
|
||||
# 95| r95_90(glval<suspend_always>) = CopyValue : r95_89
|
||||
#-----| r0_41(glval<suspend_always>) = Convert : r95_90
|
||||
# 95| r95_91(glval<unknown>) = FunctionAddress[await_suspend] :
|
||||
# 95| r95_92(glval<coroutine_handle<promise_type>>) = VariableAddress[#temp95:20] :
|
||||
# 95| mu95_93(coroutine_handle<promise_type>) = Uninitialized[#temp95:20] : &:r95_92
|
||||
# 95| r95_94(glval<unknown>) = FunctionAddress[coroutine_handle] :
|
||||
# 95| r95_95(glval<coroutine_handle<promise_type>>) = VariableAddress :
|
||||
# 95| r95_96(glval<coroutine_handle<promise_type>>) = Convert : r95_95
|
||||
# 95| r95_97(coroutine_handle<promise_type> &) = CopyValue : r95_96
|
||||
# 95| v95_98(void) = Call[coroutine_handle] : func:r95_94, this:r95_92, 0:r95_97
|
||||
# 95| mu95_99(unknown) = ^CallSideEffect : ~m?
|
||||
# 95| v95_100(void) = ^BufferReadSideEffect[0] : &:r95_97, ~m?
|
||||
# 95| mu95_101(coroutine_handle<promise_type>) = ^IndirectMayWriteSideEffect[-1] : &:r95_92
|
||||
# 95| r95_102(coroutine_handle<promise_type>) = Load[#temp95:20] : &:r95_92, ~m?
|
||||
# 95| v95_103(void) = Call[await_suspend] : func:r95_91, this:r0_41, 0:r95_102
|
||||
# 95| mu95_104(unknown) = ^CallSideEffect : ~m?
|
||||
#-----| v0_42(void) = ^IndirectReadSideEffect[-1] : &:r0_41, ~m?
|
||||
# 95| r95_89(suspend_always *) = CopyValue : r95_74
|
||||
# 95| r95_90(glval<suspend_always>) = CopyValue : r95_89
|
||||
#-----| r0_41(glval<suspend_always>) = Convert : r95_90
|
||||
# 95| r95_91(glval<unknown>) = FunctionAddress[await_suspend] :
|
||||
# 95| r95_92(glval<coroutine_handle<promise_type>>) = VariableAddress[#temp95:20] :
|
||||
# 95| mu95_93(coroutine_handle<promise_type>) = Uninitialized[#temp95:20] : &:r95_92
|
||||
# 95| r95_94(glval<unknown>) = FunctionAddress[coroutine_handle] :
|
||||
# 95| r95_95(glval<coroutine_handle<promise_type>>) = VariableAddress[(unnamed local variable)] :
|
||||
# 95| r95_96(glval<coroutine_handle<promise_type>>) = Convert : r95_95
|
||||
# 95| r95_97(coroutine_handle<promise_type> &) = CopyValue : r95_96
|
||||
# 95| v95_98(void) = Call[coroutine_handle] : func:r95_94, this:r95_92, 0:r95_97
|
||||
# 95| mu95_99(unknown) = ^CallSideEffect : ~m?
|
||||
# 95| v95_100(void) = ^BufferReadSideEffect[0] : &:r95_97, ~m?
|
||||
# 95| mu95_101(coroutine_handle<promise_type>) = ^IndirectMayWriteSideEffect[-1] : &:r95_92
|
||||
# 95| r95_102(coroutine_handle<promise_type>) = Load[#temp95:20] : &:r95_92, ~m?
|
||||
# 95| v95_103(void) = Call[await_suspend] : func:r95_91, this:r0_41, 0:r95_102
|
||||
# 95| mu95_104(unknown) = ^CallSideEffect : ~m?
|
||||
#-----| v0_42(void) = ^IndirectReadSideEffect[-1] : &:r0_41, ~m?
|
||||
#-----| Goto -> Block 11
|
||||
|
||||
# 99| co_returnable_value co_yield_value_value(int)
|
||||
|
@ -1364,8 +1364,8 @@ coroutines.cpp:
|
|||
|
||||
#-----| Block 3
|
||||
#-----| r0_8(bool) = Constant[1] :
|
||||
#-----| r0_9(glval<bool>) = VariableAddress :
|
||||
#-----| mu0_10(bool) = Store[?] : &:r0_9, r0_8
|
||||
#-----| r0_9(glval<bool>) = VariableAddress[(unnamed local variable)] :
|
||||
#-----| mu0_10(bool) = Store[(unnamed local variable)] : &:r0_9, r0_8
|
||||
# 99| r99_33(suspend_always *) = CopyValue : r99_22
|
||||
# 99| r99_34(glval<suspend_always>) = CopyValue : r99_33
|
||||
#-----| r0_11(glval<suspend_always>) = Convert : r99_34
|
||||
|
@ -1407,24 +1407,24 @@ coroutines.cpp:
|
|||
#-----| True -> Block 5
|
||||
|
||||
# 99| Block 4
|
||||
# 99| r99_38(suspend_always *) = CopyValue : r99_22
|
||||
# 99| r99_39(glval<suspend_always>) = CopyValue : r99_38
|
||||
#-----| r0_16(glval<suspend_always>) = Convert : r99_39
|
||||
# 99| r99_40(glval<unknown>) = FunctionAddress[await_suspend] :
|
||||
# 99| r99_41(glval<coroutine_handle<promise_type>>) = VariableAddress[#temp99:21] :
|
||||
# 99| mu99_42(coroutine_handle<promise_type>) = Uninitialized[#temp99:21] : &:r99_41
|
||||
# 99| r99_43(glval<unknown>) = FunctionAddress[coroutine_handle] :
|
||||
# 99| r99_44(glval<coroutine_handle<promise_type>>) = VariableAddress :
|
||||
# 99| r99_45(glval<coroutine_handle<promise_type>>) = Convert : r99_44
|
||||
# 99| r99_46(coroutine_handle<promise_type> &) = CopyValue : r99_45
|
||||
# 99| v99_47(void) = Call[coroutine_handle] : func:r99_43, this:r99_41, 0:r99_46
|
||||
# 99| mu99_48(unknown) = ^CallSideEffect : ~m?
|
||||
# 99| v99_49(void) = ^BufferReadSideEffect[0] : &:r99_46, ~m?
|
||||
# 99| mu99_50(coroutine_handle<promise_type>) = ^IndirectMayWriteSideEffect[-1] : &:r99_41
|
||||
# 99| r99_51(coroutine_handle<promise_type>) = Load[#temp99:21] : &:r99_41, ~m?
|
||||
# 99| v99_52(void) = Call[await_suspend] : func:r99_40, this:r0_16, 0:r99_51
|
||||
# 99| mu99_53(unknown) = ^CallSideEffect : ~m?
|
||||
#-----| v0_17(void) = ^IndirectReadSideEffect[-1] : &:r0_16, ~m?
|
||||
# 99| r99_38(suspend_always *) = CopyValue : r99_22
|
||||
# 99| r99_39(glval<suspend_always>) = CopyValue : r99_38
|
||||
#-----| r0_16(glval<suspend_always>) = Convert : r99_39
|
||||
# 99| r99_40(glval<unknown>) = FunctionAddress[await_suspend] :
|
||||
# 99| r99_41(glval<coroutine_handle<promise_type>>) = VariableAddress[#temp99:21] :
|
||||
# 99| mu99_42(coroutine_handle<promise_type>) = Uninitialized[#temp99:21] : &:r99_41
|
||||
# 99| r99_43(glval<unknown>) = FunctionAddress[coroutine_handle] :
|
||||
# 99| r99_44(glval<coroutine_handle<promise_type>>) = VariableAddress[(unnamed local variable)] :
|
||||
# 99| r99_45(glval<coroutine_handle<promise_type>>) = Convert : r99_44
|
||||
# 99| r99_46(coroutine_handle<promise_type> &) = CopyValue : r99_45
|
||||
# 99| v99_47(void) = Call[coroutine_handle] : func:r99_43, this:r99_41, 0:r99_46
|
||||
# 99| mu99_48(unknown) = ^CallSideEffect : ~m?
|
||||
# 99| v99_49(void) = ^BufferReadSideEffect[0] : &:r99_46, ~m?
|
||||
# 99| mu99_50(coroutine_handle<promise_type>) = ^IndirectMayWriteSideEffect[-1] : &:r99_41
|
||||
# 99| r99_51(coroutine_handle<promise_type>) = Load[#temp99:21] : &:r99_41, ~m?
|
||||
# 99| v99_52(void) = Call[await_suspend] : func:r99_40, this:r0_16, 0:r99_51
|
||||
# 99| mu99_53(unknown) = ^CallSideEffect : ~m?
|
||||
#-----| v0_17(void) = ^IndirectReadSideEffect[-1] : &:r0_16, ~m?
|
||||
#-----| Goto -> Block 3
|
||||
|
||||
# 100| Block 5
|
||||
|
@ -1438,32 +1438,32 @@ coroutines.cpp:
|
|||
#-----| Goto -> Block 10
|
||||
|
||||
# 100| Block 6
|
||||
# 100| r100_33(suspend_always *) = CopyValue : r100_19
|
||||
# 100| r100_34(glval<suspend_always>) = CopyValue : r100_33
|
||||
#-----| r0_20(glval<suspend_always>) = Convert : r100_34
|
||||
# 100| r100_35(glval<unknown>) = FunctionAddress[await_suspend] :
|
||||
# 100| r100_36(glval<coroutine_handle<promise_type>>) = VariableAddress[#temp100:3] :
|
||||
# 100| mu100_37(coroutine_handle<promise_type>) = Uninitialized[#temp100:3] : &:r100_36
|
||||
# 100| r100_38(glval<unknown>) = FunctionAddress[coroutine_handle] :
|
||||
# 100| r100_39(glval<coroutine_handle<promise_type>>) = VariableAddress :
|
||||
# 100| r100_40(glval<coroutine_handle<promise_type>>) = Convert : r100_39
|
||||
# 100| r100_41(coroutine_handle<promise_type> &) = CopyValue : r100_40
|
||||
# 100| v100_42(void) = Call[coroutine_handle] : func:r100_38, this:r100_36, 0:r100_41
|
||||
# 100| mu100_43(unknown) = ^CallSideEffect : ~m?
|
||||
# 100| v100_44(void) = ^BufferReadSideEffect[0] : &:r100_41, ~m?
|
||||
# 100| mu100_45(coroutine_handle<promise_type>) = ^IndirectMayWriteSideEffect[-1] : &:r100_36
|
||||
# 100| r100_46(coroutine_handle<promise_type>) = Load[#temp100:3] : &:r100_36, ~m?
|
||||
# 100| v100_47(void) = Call[await_suspend] : func:r100_35, this:r0_20, 0:r100_46
|
||||
# 100| mu100_48(unknown) = ^CallSideEffect : ~m?
|
||||
#-----| v0_21(void) = ^IndirectReadSideEffect[-1] : &:r0_20, ~m?
|
||||
# 100| r100_33(suspend_always *) = CopyValue : r100_19
|
||||
# 100| r100_34(glval<suspend_always>) = CopyValue : r100_33
|
||||
#-----| r0_20(glval<suspend_always>) = Convert : r100_34
|
||||
# 100| r100_35(glval<unknown>) = FunctionAddress[await_suspend] :
|
||||
# 100| r100_36(glval<coroutine_handle<promise_type>>) = VariableAddress[#temp100:3] :
|
||||
# 100| mu100_37(coroutine_handle<promise_type>) = Uninitialized[#temp100:3] : &:r100_36
|
||||
# 100| r100_38(glval<unknown>) = FunctionAddress[coroutine_handle] :
|
||||
# 100| r100_39(glval<coroutine_handle<promise_type>>) = VariableAddress[(unnamed local variable)] :
|
||||
# 100| r100_40(glval<coroutine_handle<promise_type>>) = Convert : r100_39
|
||||
# 100| r100_41(coroutine_handle<promise_type> &) = CopyValue : r100_40
|
||||
# 100| v100_42(void) = Call[coroutine_handle] : func:r100_38, this:r100_36, 0:r100_41
|
||||
# 100| mu100_43(unknown) = ^CallSideEffect : ~m?
|
||||
# 100| v100_44(void) = ^BufferReadSideEffect[0] : &:r100_41, ~m?
|
||||
# 100| mu100_45(coroutine_handle<promise_type>) = ^IndirectMayWriteSideEffect[-1] : &:r100_36
|
||||
# 100| r100_46(coroutine_handle<promise_type>) = Load[#temp100:3] : &:r100_36, ~m?
|
||||
# 100| v100_47(void) = Call[await_suspend] : func:r100_35, this:r0_20, 0:r100_46
|
||||
# 100| mu100_48(unknown) = ^CallSideEffect : ~m?
|
||||
#-----| v0_21(void) = ^IndirectReadSideEffect[-1] : &:r0_20, ~m?
|
||||
#-----| Goto -> Block 5
|
||||
|
||||
#-----| Block 7
|
||||
#-----| v0_22(void) = CatchAny :
|
||||
#-----| r0_23(glval<bool>) = VariableAddress :
|
||||
#-----| r0_24(bool) = Load[?] : &:r0_23, ~m?
|
||||
#-----| r0_25(bool) = LogicalNot : r0_24
|
||||
#-----| v0_26(void) = ConditionalBranch : r0_25
|
||||
#-----| v0_22(void) = CatchAny :
|
||||
#-----| r0_23(glval<bool>) = VariableAddress[(unnamed local variable)] :
|
||||
#-----| r0_24(bool) = Load[(unnamed local variable)] : &:r0_23, ~m?
|
||||
#-----| r0_25(bool) = LogicalNot : r0_24
|
||||
#-----| v0_26(void) = ConditionalBranch : r0_25
|
||||
#-----| False -> Block 9
|
||||
#-----| True -> Block 8
|
||||
|
||||
|
@ -1523,24 +1523,24 @@ coroutines.cpp:
|
|||
#-----| Goto -> Block 1
|
||||
|
||||
# 99| Block 12
|
||||
# 99| r99_89(suspend_always *) = CopyValue : r99_74
|
||||
# 99| r99_90(glval<suspend_always>) = CopyValue : r99_89
|
||||
#-----| r0_34(glval<suspend_always>) = Convert : r99_90
|
||||
# 99| r99_91(glval<unknown>) = FunctionAddress[await_suspend] :
|
||||
# 99| r99_92(glval<coroutine_handle<promise_type>>) = VariableAddress[#temp99:21] :
|
||||
# 99| mu99_93(coroutine_handle<promise_type>) = Uninitialized[#temp99:21] : &:r99_92
|
||||
# 99| r99_94(glval<unknown>) = FunctionAddress[coroutine_handle] :
|
||||
# 99| r99_95(glval<coroutine_handle<promise_type>>) = VariableAddress :
|
||||
# 99| r99_96(glval<coroutine_handle<promise_type>>) = Convert : r99_95
|
||||
# 99| r99_97(coroutine_handle<promise_type> &) = CopyValue : r99_96
|
||||
# 99| v99_98(void) = Call[coroutine_handle] : func:r99_94, this:r99_92, 0:r99_97
|
||||
# 99| mu99_99(unknown) = ^CallSideEffect : ~m?
|
||||
# 99| v99_100(void) = ^BufferReadSideEffect[0] : &:r99_97, ~m?
|
||||
# 99| mu99_101(coroutine_handle<promise_type>) = ^IndirectMayWriteSideEffect[-1] : &:r99_92
|
||||
# 99| r99_102(coroutine_handle<promise_type>) = Load[#temp99:21] : &:r99_92, ~m?
|
||||
# 99| v99_103(void) = Call[await_suspend] : func:r99_91, this:r0_34, 0:r99_102
|
||||
# 99| mu99_104(unknown) = ^CallSideEffect : ~m?
|
||||
#-----| v0_35(void) = ^IndirectReadSideEffect[-1] : &:r0_34, ~m?
|
||||
# 99| r99_89(suspend_always *) = CopyValue : r99_74
|
||||
# 99| r99_90(glval<suspend_always>) = CopyValue : r99_89
|
||||
#-----| r0_34(glval<suspend_always>) = Convert : r99_90
|
||||
# 99| r99_91(glval<unknown>) = FunctionAddress[await_suspend] :
|
||||
# 99| r99_92(glval<coroutine_handle<promise_type>>) = VariableAddress[#temp99:21] :
|
||||
# 99| mu99_93(coroutine_handle<promise_type>) = Uninitialized[#temp99:21] : &:r99_92
|
||||
# 99| r99_94(glval<unknown>) = FunctionAddress[coroutine_handle] :
|
||||
# 99| r99_95(glval<coroutine_handle<promise_type>>) = VariableAddress[(unnamed local variable)] :
|
||||
# 99| r99_96(glval<coroutine_handle<promise_type>>) = Convert : r99_95
|
||||
# 99| r99_97(coroutine_handle<promise_type> &) = CopyValue : r99_96
|
||||
# 99| v99_98(void) = Call[coroutine_handle] : func:r99_94, this:r99_92, 0:r99_97
|
||||
# 99| mu99_99(unknown) = ^CallSideEffect : ~m?
|
||||
# 99| v99_100(void) = ^BufferReadSideEffect[0] : &:r99_97, ~m?
|
||||
# 99| mu99_101(coroutine_handle<promise_type>) = ^IndirectMayWriteSideEffect[-1] : &:r99_92
|
||||
# 99| r99_102(coroutine_handle<promise_type>) = Load[#temp99:21] : &:r99_92, ~m?
|
||||
# 99| v99_103(void) = Call[await_suspend] : func:r99_91, this:r0_34, 0:r99_102
|
||||
# 99| mu99_104(unknown) = ^CallSideEffect : ~m?
|
||||
#-----| v0_35(void) = ^IndirectReadSideEffect[-1] : &:r0_34, ~m?
|
||||
#-----| Goto -> Block 11
|
||||
|
||||
# 103| co_returnable_void co_yield_and_return_void(int)
|
||||
|
@ -1594,8 +1594,8 @@ coroutines.cpp:
|
|||
|
||||
#-----| Block 3
|
||||
#-----| r0_8(bool) = Constant[1] :
|
||||
#-----| r0_9(glval<bool>) = VariableAddress :
|
||||
#-----| mu0_10(bool) = Store[?] : &:r0_9, r0_8
|
||||
#-----| r0_9(glval<bool>) = VariableAddress[(unnamed local variable)] :
|
||||
#-----| mu0_10(bool) = Store[(unnamed local variable)] : &:r0_9, r0_8
|
||||
# 103| r103_33(suspend_always *) = CopyValue : r103_22
|
||||
# 103| r103_34(glval<suspend_always>) = CopyValue : r103_33
|
||||
#-----| r0_11(glval<suspend_always>) = Convert : r103_34
|
||||
|
@ -1637,24 +1637,24 @@ coroutines.cpp:
|
|||
#-----| True -> Block 5
|
||||
|
||||
# 103| Block 4
|
||||
# 103| r103_38(suspend_always *) = CopyValue : r103_22
|
||||
# 103| r103_39(glval<suspend_always>) = CopyValue : r103_38
|
||||
#-----| r0_16(glval<suspend_always>) = Convert : r103_39
|
||||
# 103| r103_40(glval<unknown>) = FunctionAddress[await_suspend] :
|
||||
# 103| r103_41(glval<coroutine_handle<promise_type>>) = VariableAddress[#temp103:20] :
|
||||
# 103| mu103_42(coroutine_handle<promise_type>) = Uninitialized[#temp103:20] : &:r103_41
|
||||
# 103| r103_43(glval<unknown>) = FunctionAddress[coroutine_handle] :
|
||||
# 103| r103_44(glval<coroutine_handle<promise_type>>) = VariableAddress :
|
||||
# 103| r103_45(glval<coroutine_handle<promise_type>>) = Convert : r103_44
|
||||
# 103| r103_46(coroutine_handle<promise_type> &) = CopyValue : r103_45
|
||||
# 103| v103_47(void) = Call[coroutine_handle] : func:r103_43, this:r103_41, 0:r103_46
|
||||
# 103| mu103_48(unknown) = ^CallSideEffect : ~m?
|
||||
# 103| v103_49(void) = ^BufferReadSideEffect[0] : &:r103_46, ~m?
|
||||
# 103| mu103_50(coroutine_handle<promise_type>) = ^IndirectMayWriteSideEffect[-1] : &:r103_41
|
||||
# 103| r103_51(coroutine_handle<promise_type>) = Load[#temp103:20] : &:r103_41, ~m?
|
||||
# 103| v103_52(void) = Call[await_suspend] : func:r103_40, this:r0_16, 0:r103_51
|
||||
# 103| mu103_53(unknown) = ^CallSideEffect : ~m?
|
||||
#-----| v0_17(void) = ^IndirectReadSideEffect[-1] : &:r0_16, ~m?
|
||||
# 103| r103_38(suspend_always *) = CopyValue : r103_22
|
||||
# 103| r103_39(glval<suspend_always>) = CopyValue : r103_38
|
||||
#-----| r0_16(glval<suspend_always>) = Convert : r103_39
|
||||
# 103| r103_40(glval<unknown>) = FunctionAddress[await_suspend] :
|
||||
# 103| r103_41(glval<coroutine_handle<promise_type>>) = VariableAddress[#temp103:20] :
|
||||
# 103| mu103_42(coroutine_handle<promise_type>) = Uninitialized[#temp103:20] : &:r103_41
|
||||
# 103| r103_43(glval<unknown>) = FunctionAddress[coroutine_handle] :
|
||||
# 103| r103_44(glval<coroutine_handle<promise_type>>) = VariableAddress[(unnamed local variable)] :
|
||||
# 103| r103_45(glval<coroutine_handle<promise_type>>) = Convert : r103_44
|
||||
# 103| r103_46(coroutine_handle<promise_type> &) = CopyValue : r103_45
|
||||
# 103| v103_47(void) = Call[coroutine_handle] : func:r103_43, this:r103_41, 0:r103_46
|
||||
# 103| mu103_48(unknown) = ^CallSideEffect : ~m?
|
||||
# 103| v103_49(void) = ^BufferReadSideEffect[0] : &:r103_46, ~m?
|
||||
# 103| mu103_50(coroutine_handle<promise_type>) = ^IndirectMayWriteSideEffect[-1] : &:r103_41
|
||||
# 103| r103_51(coroutine_handle<promise_type>) = Load[#temp103:20] : &:r103_41, ~m?
|
||||
# 103| v103_52(void) = Call[await_suspend] : func:r103_40, this:r0_16, 0:r103_51
|
||||
# 103| mu103_53(unknown) = ^CallSideEffect : ~m?
|
||||
#-----| v0_17(void) = ^IndirectReadSideEffect[-1] : &:r0_16, ~m?
|
||||
#-----| Goto -> Block 3
|
||||
|
||||
# 104| Block 5
|
||||
|
@ -1676,32 +1676,32 @@ coroutines.cpp:
|
|||
#-----| Goto (back edge) -> Block 10
|
||||
|
||||
# 104| Block 6
|
||||
# 104| r104_33(suspend_always *) = CopyValue : r104_19
|
||||
# 104| r104_34(glval<suspend_always>) = CopyValue : r104_33
|
||||
#-----| r0_27(glval<suspend_always>) = Convert : r104_34
|
||||
# 104| r104_35(glval<unknown>) = FunctionAddress[await_suspend] :
|
||||
# 104| r104_36(glval<coroutine_handle<promise_type>>) = VariableAddress[#temp104:3] :
|
||||
# 104| mu104_37(coroutine_handle<promise_type>) = Uninitialized[#temp104:3] : &:r104_36
|
||||
# 104| r104_38(glval<unknown>) = FunctionAddress[coroutine_handle] :
|
||||
# 104| r104_39(glval<coroutine_handle<promise_type>>) = VariableAddress :
|
||||
# 104| r104_40(glval<coroutine_handle<promise_type>>) = Convert : r104_39
|
||||
# 104| r104_41(coroutine_handle<promise_type> &) = CopyValue : r104_40
|
||||
# 104| v104_42(void) = Call[coroutine_handle] : func:r104_38, this:r104_36, 0:r104_41
|
||||
# 104| mu104_43(unknown) = ^CallSideEffect : ~m?
|
||||
# 104| v104_44(void) = ^BufferReadSideEffect[0] : &:r104_41, ~m?
|
||||
# 104| mu104_45(coroutine_handle<promise_type>) = ^IndirectMayWriteSideEffect[-1] : &:r104_36
|
||||
# 104| r104_46(coroutine_handle<promise_type>) = Load[#temp104:3] : &:r104_36, ~m?
|
||||
# 104| v104_47(void) = Call[await_suspend] : func:r104_35, this:r0_27, 0:r104_46
|
||||
# 104| mu104_48(unknown) = ^CallSideEffect : ~m?
|
||||
#-----| v0_28(void) = ^IndirectReadSideEffect[-1] : &:r0_27, ~m?
|
||||
# 104| r104_33(suspend_always *) = CopyValue : r104_19
|
||||
# 104| r104_34(glval<suspend_always>) = CopyValue : r104_33
|
||||
#-----| r0_27(glval<suspend_always>) = Convert : r104_34
|
||||
# 104| r104_35(glval<unknown>) = FunctionAddress[await_suspend] :
|
||||
# 104| r104_36(glval<coroutine_handle<promise_type>>) = VariableAddress[#temp104:3] :
|
||||
# 104| mu104_37(coroutine_handle<promise_type>) = Uninitialized[#temp104:3] : &:r104_36
|
||||
# 104| r104_38(glval<unknown>) = FunctionAddress[coroutine_handle] :
|
||||
# 104| r104_39(glval<coroutine_handle<promise_type>>) = VariableAddress[(unnamed local variable)] :
|
||||
# 104| r104_40(glval<coroutine_handle<promise_type>>) = Convert : r104_39
|
||||
# 104| r104_41(coroutine_handle<promise_type> &) = CopyValue : r104_40
|
||||
# 104| v104_42(void) = Call[coroutine_handle] : func:r104_38, this:r104_36, 0:r104_41
|
||||
# 104| mu104_43(unknown) = ^CallSideEffect : ~m?
|
||||
# 104| v104_44(void) = ^BufferReadSideEffect[0] : &:r104_41, ~m?
|
||||
# 104| mu104_45(coroutine_handle<promise_type>) = ^IndirectMayWriteSideEffect[-1] : &:r104_36
|
||||
# 104| r104_46(coroutine_handle<promise_type>) = Load[#temp104:3] : &:r104_36, ~m?
|
||||
# 104| v104_47(void) = Call[await_suspend] : func:r104_35, this:r0_27, 0:r104_46
|
||||
# 104| mu104_48(unknown) = ^CallSideEffect : ~m?
|
||||
#-----| v0_28(void) = ^IndirectReadSideEffect[-1] : &:r0_27, ~m?
|
||||
#-----| Goto -> Block 5
|
||||
|
||||
#-----| Block 7
|
||||
#-----| v0_29(void) = CatchAny :
|
||||
#-----| r0_30(glval<bool>) = VariableAddress :
|
||||
#-----| r0_31(bool) = Load[?] : &:r0_30, ~m?
|
||||
#-----| r0_32(bool) = LogicalNot : r0_31
|
||||
#-----| v0_33(void) = ConditionalBranch : r0_32
|
||||
#-----| v0_29(void) = CatchAny :
|
||||
#-----| r0_30(glval<bool>) = VariableAddress[(unnamed local variable)] :
|
||||
#-----| r0_31(bool) = Load[(unnamed local variable)] : &:r0_30, ~m?
|
||||
#-----| r0_32(bool) = LogicalNot : r0_31
|
||||
#-----| v0_33(void) = ConditionalBranch : r0_32
|
||||
#-----| False -> Block 9
|
||||
#-----| True -> Block 8
|
||||
|
||||
|
@ -1761,24 +1761,24 @@ coroutines.cpp:
|
|||
#-----| Goto -> Block 1
|
||||
|
||||
# 103| Block 12
|
||||
# 103| r103_89(suspend_always *) = CopyValue : r103_74
|
||||
# 103| r103_90(glval<suspend_always>) = CopyValue : r103_89
|
||||
#-----| r0_41(glval<suspend_always>) = Convert : r103_90
|
||||
# 103| r103_91(glval<unknown>) = FunctionAddress[await_suspend] :
|
||||
# 103| r103_92(glval<coroutine_handle<promise_type>>) = VariableAddress[#temp103:20] :
|
||||
# 103| mu103_93(coroutine_handle<promise_type>) = Uninitialized[#temp103:20] : &:r103_92
|
||||
# 103| r103_94(glval<unknown>) = FunctionAddress[coroutine_handle] :
|
||||
# 103| r103_95(glval<coroutine_handle<promise_type>>) = VariableAddress :
|
||||
# 103| r103_96(glval<coroutine_handle<promise_type>>) = Convert : r103_95
|
||||
# 103| r103_97(coroutine_handle<promise_type> &) = CopyValue : r103_96
|
||||
# 103| v103_98(void) = Call[coroutine_handle] : func:r103_94, this:r103_92, 0:r103_97
|
||||
# 103| mu103_99(unknown) = ^CallSideEffect : ~m?
|
||||
# 103| v103_100(void) = ^BufferReadSideEffect[0] : &:r103_97, ~m?
|
||||
# 103| mu103_101(coroutine_handle<promise_type>) = ^IndirectMayWriteSideEffect[-1] : &:r103_92
|
||||
# 103| r103_102(coroutine_handle<promise_type>) = Load[#temp103:20] : &:r103_92, ~m?
|
||||
# 103| v103_103(void) = Call[await_suspend] : func:r103_91, this:r0_41, 0:r103_102
|
||||
# 103| mu103_104(unknown) = ^CallSideEffect : ~m?
|
||||
#-----| v0_42(void) = ^IndirectReadSideEffect[-1] : &:r0_41, ~m?
|
||||
# 103| r103_89(suspend_always *) = CopyValue : r103_74
|
||||
# 103| r103_90(glval<suspend_always>) = CopyValue : r103_89
|
||||
#-----| r0_41(glval<suspend_always>) = Convert : r103_90
|
||||
# 103| r103_91(glval<unknown>) = FunctionAddress[await_suspend] :
|
||||
# 103| r103_92(glval<coroutine_handle<promise_type>>) = VariableAddress[#temp103:20] :
|
||||
# 103| mu103_93(coroutine_handle<promise_type>) = Uninitialized[#temp103:20] : &:r103_92
|
||||
# 103| r103_94(glval<unknown>) = FunctionAddress[coroutine_handle] :
|
||||
# 103| r103_95(glval<coroutine_handle<promise_type>>) = VariableAddress[(unnamed local variable)] :
|
||||
# 103| r103_96(glval<coroutine_handle<promise_type>>) = Convert : r103_95
|
||||
# 103| r103_97(coroutine_handle<promise_type> &) = CopyValue : r103_96
|
||||
# 103| v103_98(void) = Call[coroutine_handle] : func:r103_94, this:r103_92, 0:r103_97
|
||||
# 103| mu103_99(unknown) = ^CallSideEffect : ~m?
|
||||
# 103| v103_100(void) = ^BufferReadSideEffect[0] : &:r103_97, ~m?
|
||||
# 103| mu103_101(coroutine_handle<promise_type>) = ^IndirectMayWriteSideEffect[-1] : &:r103_92
|
||||
# 103| r103_102(coroutine_handle<promise_type>) = Load[#temp103:20] : &:r103_92, ~m?
|
||||
# 103| v103_103(void) = Call[await_suspend] : func:r103_91, this:r0_41, 0:r103_102
|
||||
# 103| mu103_104(unknown) = ^CallSideEffect : ~m?
|
||||
#-----| v0_42(void) = ^IndirectReadSideEffect[-1] : &:r0_41, ~m?
|
||||
#-----| Goto -> Block 11
|
||||
|
||||
# 108| co_returnable_value co_yield_and_return_value(int)
|
||||
|
@ -1832,8 +1832,8 @@ coroutines.cpp:
|
|||
|
||||
#-----| Block 3
|
||||
#-----| r0_8(bool) = Constant[1] :
|
||||
#-----| r0_9(glval<bool>) = VariableAddress :
|
||||
#-----| mu0_10(bool) = Store[?] : &:r0_9, r0_8
|
||||
#-----| r0_9(glval<bool>) = VariableAddress[(unnamed local variable)] :
|
||||
#-----| mu0_10(bool) = Store[(unnamed local variable)] : &:r0_9, r0_8
|
||||
# 108| r108_33(suspend_always *) = CopyValue : r108_22
|
||||
# 108| r108_34(glval<suspend_always>) = CopyValue : r108_33
|
||||
#-----| r0_11(glval<suspend_always>) = Convert : r108_34
|
||||
|
@ -1875,24 +1875,24 @@ coroutines.cpp:
|
|||
#-----| True -> Block 5
|
||||
|
||||
# 108| Block 4
|
||||
# 108| r108_38(suspend_always *) = CopyValue : r108_22
|
||||
# 108| r108_39(glval<suspend_always>) = CopyValue : r108_38
|
||||
#-----| r0_16(glval<suspend_always>) = Convert : r108_39
|
||||
# 108| r108_40(glval<unknown>) = FunctionAddress[await_suspend] :
|
||||
# 108| r108_41(glval<coroutine_handle<promise_type>>) = VariableAddress[#temp108:21] :
|
||||
# 108| mu108_42(coroutine_handle<promise_type>) = Uninitialized[#temp108:21] : &:r108_41
|
||||
# 108| r108_43(glval<unknown>) = FunctionAddress[coroutine_handle] :
|
||||
# 108| r108_44(glval<coroutine_handle<promise_type>>) = VariableAddress :
|
||||
# 108| r108_45(glval<coroutine_handle<promise_type>>) = Convert : r108_44
|
||||
# 108| r108_46(coroutine_handle<promise_type> &) = CopyValue : r108_45
|
||||
# 108| v108_47(void) = Call[coroutine_handle] : func:r108_43, this:r108_41, 0:r108_46
|
||||
# 108| mu108_48(unknown) = ^CallSideEffect : ~m?
|
||||
# 108| v108_49(void) = ^BufferReadSideEffect[0] : &:r108_46, ~m?
|
||||
# 108| mu108_50(coroutine_handle<promise_type>) = ^IndirectMayWriteSideEffect[-1] : &:r108_41
|
||||
# 108| r108_51(coroutine_handle<promise_type>) = Load[#temp108:21] : &:r108_41, ~m?
|
||||
# 108| v108_52(void) = Call[await_suspend] : func:r108_40, this:r0_16, 0:r108_51
|
||||
# 108| mu108_53(unknown) = ^CallSideEffect : ~m?
|
||||
#-----| v0_17(void) = ^IndirectReadSideEffect[-1] : &:r0_16, ~m?
|
||||
# 108| r108_38(suspend_always *) = CopyValue : r108_22
|
||||
# 108| r108_39(glval<suspend_always>) = CopyValue : r108_38
|
||||
#-----| r0_16(glval<suspend_always>) = Convert : r108_39
|
||||
# 108| r108_40(glval<unknown>) = FunctionAddress[await_suspend] :
|
||||
# 108| r108_41(glval<coroutine_handle<promise_type>>) = VariableAddress[#temp108:21] :
|
||||
# 108| mu108_42(coroutine_handle<promise_type>) = Uninitialized[#temp108:21] : &:r108_41
|
||||
# 108| r108_43(glval<unknown>) = FunctionAddress[coroutine_handle] :
|
||||
# 108| r108_44(glval<coroutine_handle<promise_type>>) = VariableAddress[(unnamed local variable)] :
|
||||
# 108| r108_45(glval<coroutine_handle<promise_type>>) = Convert : r108_44
|
||||
# 108| r108_46(coroutine_handle<promise_type> &) = CopyValue : r108_45
|
||||
# 108| v108_47(void) = Call[coroutine_handle] : func:r108_43, this:r108_41, 0:r108_46
|
||||
# 108| mu108_48(unknown) = ^CallSideEffect : ~m?
|
||||
# 108| v108_49(void) = ^BufferReadSideEffect[0] : &:r108_46, ~m?
|
||||
# 108| mu108_50(coroutine_handle<promise_type>) = ^IndirectMayWriteSideEffect[-1] : &:r108_41
|
||||
# 108| r108_51(coroutine_handle<promise_type>) = Load[#temp108:21] : &:r108_41, ~m?
|
||||
# 108| v108_52(void) = Call[await_suspend] : func:r108_40, this:r0_16, 0:r108_51
|
||||
# 108| mu108_53(unknown) = ^CallSideEffect : ~m?
|
||||
#-----| v0_17(void) = ^IndirectReadSideEffect[-1] : &:r0_16, ~m?
|
||||
#-----| Goto -> Block 3
|
||||
|
||||
# 109| Block 5
|
||||
|
@ -1918,32 +1918,32 @@ coroutines.cpp:
|
|||
#-----| Goto (back edge) -> Block 10
|
||||
|
||||
# 109| Block 6
|
||||
# 109| r109_33(suspend_always *) = CopyValue : r109_19
|
||||
# 109| r109_34(glval<suspend_always>) = CopyValue : r109_33
|
||||
#-----| r0_27(glval<suspend_always>) = Convert : r109_34
|
||||
# 109| r109_35(glval<unknown>) = FunctionAddress[await_suspend] :
|
||||
# 109| r109_36(glval<coroutine_handle<promise_type>>) = VariableAddress[#temp109:3] :
|
||||
# 109| mu109_37(coroutine_handle<promise_type>) = Uninitialized[#temp109:3] : &:r109_36
|
||||
# 109| r109_38(glval<unknown>) = FunctionAddress[coroutine_handle] :
|
||||
# 109| r109_39(glval<coroutine_handle<promise_type>>) = VariableAddress :
|
||||
# 109| r109_40(glval<coroutine_handle<promise_type>>) = Convert : r109_39
|
||||
# 109| r109_41(coroutine_handle<promise_type> &) = CopyValue : r109_40
|
||||
# 109| v109_42(void) = Call[coroutine_handle] : func:r109_38, this:r109_36, 0:r109_41
|
||||
# 109| mu109_43(unknown) = ^CallSideEffect : ~m?
|
||||
# 109| v109_44(void) = ^BufferReadSideEffect[0] : &:r109_41, ~m?
|
||||
# 109| mu109_45(coroutine_handle<promise_type>) = ^IndirectMayWriteSideEffect[-1] : &:r109_36
|
||||
# 109| r109_46(coroutine_handle<promise_type>) = Load[#temp109:3] : &:r109_36, ~m?
|
||||
# 109| v109_47(void) = Call[await_suspend] : func:r109_35, this:r0_27, 0:r109_46
|
||||
# 109| mu109_48(unknown) = ^CallSideEffect : ~m?
|
||||
#-----| v0_28(void) = ^IndirectReadSideEffect[-1] : &:r0_27, ~m?
|
||||
# 109| r109_33(suspend_always *) = CopyValue : r109_19
|
||||
# 109| r109_34(glval<suspend_always>) = CopyValue : r109_33
|
||||
#-----| r0_27(glval<suspend_always>) = Convert : r109_34
|
||||
# 109| r109_35(glval<unknown>) = FunctionAddress[await_suspend] :
|
||||
# 109| r109_36(glval<coroutine_handle<promise_type>>) = VariableAddress[#temp109:3] :
|
||||
# 109| mu109_37(coroutine_handle<promise_type>) = Uninitialized[#temp109:3] : &:r109_36
|
||||
# 109| r109_38(glval<unknown>) = FunctionAddress[coroutine_handle] :
|
||||
# 109| r109_39(glval<coroutine_handle<promise_type>>) = VariableAddress[(unnamed local variable)] :
|
||||
# 109| r109_40(glval<coroutine_handle<promise_type>>) = Convert : r109_39
|
||||
# 109| r109_41(coroutine_handle<promise_type> &) = CopyValue : r109_40
|
||||
# 109| v109_42(void) = Call[coroutine_handle] : func:r109_38, this:r109_36, 0:r109_41
|
||||
# 109| mu109_43(unknown) = ^CallSideEffect : ~m?
|
||||
# 109| v109_44(void) = ^BufferReadSideEffect[0] : &:r109_41, ~m?
|
||||
# 109| mu109_45(coroutine_handle<promise_type>) = ^IndirectMayWriteSideEffect[-1] : &:r109_36
|
||||
# 109| r109_46(coroutine_handle<promise_type>) = Load[#temp109:3] : &:r109_36, ~m?
|
||||
# 109| v109_47(void) = Call[await_suspend] : func:r109_35, this:r0_27, 0:r109_46
|
||||
# 109| mu109_48(unknown) = ^CallSideEffect : ~m?
|
||||
#-----| v0_28(void) = ^IndirectReadSideEffect[-1] : &:r0_27, ~m?
|
||||
#-----| Goto -> Block 5
|
||||
|
||||
#-----| Block 7
|
||||
#-----| v0_29(void) = CatchAny :
|
||||
#-----| r0_30(glval<bool>) = VariableAddress :
|
||||
#-----| r0_31(bool) = Load[?] : &:r0_30, ~m?
|
||||
#-----| r0_32(bool) = LogicalNot : r0_31
|
||||
#-----| v0_33(void) = ConditionalBranch : r0_32
|
||||
#-----| v0_29(void) = CatchAny :
|
||||
#-----| r0_30(glval<bool>) = VariableAddress[(unnamed local variable)] :
|
||||
#-----| r0_31(bool) = Load[(unnamed local variable)] : &:r0_30, ~m?
|
||||
#-----| r0_32(bool) = LogicalNot : r0_31
|
||||
#-----| v0_33(void) = ConditionalBranch : r0_32
|
||||
#-----| False -> Block 9
|
||||
#-----| True -> Block 8
|
||||
|
||||
|
@ -2003,24 +2003,24 @@ coroutines.cpp:
|
|||
#-----| Goto -> Block 1
|
||||
|
||||
# 108| Block 12
|
||||
# 108| r108_89(suspend_always *) = CopyValue : r108_74
|
||||
# 108| r108_90(glval<suspend_always>) = CopyValue : r108_89
|
||||
#-----| r0_41(glval<suspend_always>) = Convert : r108_90
|
||||
# 108| r108_91(glval<unknown>) = FunctionAddress[await_suspend] :
|
||||
# 108| r108_92(glval<coroutine_handle<promise_type>>) = VariableAddress[#temp108:21] :
|
||||
# 108| mu108_93(coroutine_handle<promise_type>) = Uninitialized[#temp108:21] : &:r108_92
|
||||
# 108| r108_94(glval<unknown>) = FunctionAddress[coroutine_handle] :
|
||||
# 108| r108_95(glval<coroutine_handle<promise_type>>) = VariableAddress :
|
||||
# 108| r108_96(glval<coroutine_handle<promise_type>>) = Convert : r108_95
|
||||
# 108| r108_97(coroutine_handle<promise_type> &) = CopyValue : r108_96
|
||||
# 108| v108_98(void) = Call[coroutine_handle] : func:r108_94, this:r108_92, 0:r108_97
|
||||
# 108| mu108_99(unknown) = ^CallSideEffect : ~m?
|
||||
# 108| v108_100(void) = ^BufferReadSideEffect[0] : &:r108_97, ~m?
|
||||
# 108| mu108_101(coroutine_handle<promise_type>) = ^IndirectMayWriteSideEffect[-1] : &:r108_92
|
||||
# 108| r108_102(coroutine_handle<promise_type>) = Load[#temp108:21] : &:r108_92, ~m?
|
||||
# 108| v108_103(void) = Call[await_suspend] : func:r108_91, this:r0_41, 0:r108_102
|
||||
# 108| mu108_104(unknown) = ^CallSideEffect : ~m?
|
||||
#-----| v0_42(void) = ^IndirectReadSideEffect[-1] : &:r0_41, ~m?
|
||||
# 108| r108_89(suspend_always *) = CopyValue : r108_74
|
||||
# 108| r108_90(glval<suspend_always>) = CopyValue : r108_89
|
||||
#-----| r0_41(glval<suspend_always>) = Convert : r108_90
|
||||
# 108| r108_91(glval<unknown>) = FunctionAddress[await_suspend] :
|
||||
# 108| r108_92(glval<coroutine_handle<promise_type>>) = VariableAddress[#temp108:21] :
|
||||
# 108| mu108_93(coroutine_handle<promise_type>) = Uninitialized[#temp108:21] : &:r108_92
|
||||
# 108| r108_94(glval<unknown>) = FunctionAddress[coroutine_handle] :
|
||||
# 108| r108_95(glval<coroutine_handle<promise_type>>) = VariableAddress[(unnamed local variable)] :
|
||||
# 108| r108_96(glval<coroutine_handle<promise_type>>) = Convert : r108_95
|
||||
# 108| r108_97(coroutine_handle<promise_type> &) = CopyValue : r108_96
|
||||
# 108| v108_98(void) = Call[coroutine_handle] : func:r108_94, this:r108_92, 0:r108_97
|
||||
# 108| mu108_99(unknown) = ^CallSideEffect : ~m?
|
||||
# 108| v108_100(void) = ^BufferReadSideEffect[0] : &:r108_97, ~m?
|
||||
# 108| mu108_101(coroutine_handle<promise_type>) = ^IndirectMayWriteSideEffect[-1] : &:r108_92
|
||||
# 108| r108_102(coroutine_handle<promise_type>) = Load[#temp108:21] : &:r108_92, ~m?
|
||||
# 108| v108_103(void) = Call[await_suspend] : func:r108_91, this:r0_41, 0:r108_102
|
||||
# 108| mu108_104(unknown) = ^CallSideEffect : ~m?
|
||||
#-----| v0_42(void) = ^IndirectReadSideEffect[-1] : &:r0_41, ~m?
|
||||
#-----| Goto -> Block 11
|
||||
|
||||
destructors_for_temps.cpp:
|
||||
|
@ -2733,7 +2733,7 @@ destructors_for_temps.cpp:
|
|||
# 102| v102_8(void) = ExitFunction :
|
||||
|
||||
generic.c:
|
||||
# 1| void c11_generic_test(unsigned int, int)
|
||||
# 1| void c11_generic_test_with_load(unsigned int, int)
|
||||
# 1| Block 0
|
||||
# 1| v1_1(void) = EnterFunction :
|
||||
# 1| mu1_2(unknown) = AliasedDefinition :
|
||||
|
@ -2755,6 +2755,59 @@ generic.c:
|
|||
# 1| v1_9(void) = AliasedUse : ~m?
|
||||
# 1| v1_10(void) = ExitFunction :
|
||||
|
||||
# 12| char const* c11_generic_test_with_constant_and_macro()
|
||||
# 12| Block 0
|
||||
# 12| v12_1(void) = EnterFunction :
|
||||
# 12| mu12_2(unknown) = AliasedDefinition :
|
||||
# 12| mu12_3(unknown) = InitializeNonLocal :
|
||||
# 14| r14_1(glval<int>) = VariableAddress[i] :
|
||||
# 14| mu14_2(int) = Uninitialized[i] : &:r14_1
|
||||
# 16| r16_1(glval<char *>) = VariableAddress[#return] :
|
||||
# 16| r16_2(glval<char[4]>) = Constant[int] :
|
||||
# 16| r16_3(char *) = Convert : r16_2
|
||||
# 16| r16_4(char *) = Convert : r16_3
|
||||
# 16| mu16_5(char *) = Store[#return] : &:r16_1, r16_4
|
||||
# 12| r12_4(glval<char *>) = VariableAddress[#return] :
|
||||
# 12| v12_5(void) = ReturnValue : &:r12_4, ~m?
|
||||
# 12| v12_6(void) = AliasedUse : ~m?
|
||||
# 12| v12_7(void) = ExitFunction :
|
||||
|
||||
# 19| char const* c11_generic_test_with_constant_and_no_macro()
|
||||
# 19| Block 0
|
||||
# 19| v19_1(void) = EnterFunction :
|
||||
# 19| mu19_2(unknown) = AliasedDefinition :
|
||||
# 19| mu19_3(unknown) = InitializeNonLocal :
|
||||
# 21| r21_1(glval<int>) = VariableAddress[i] :
|
||||
# 21| mu21_2(int) = Uninitialized[i] : &:r21_1
|
||||
# 23| r23_1(glval<char *>) = VariableAddress[#return] :
|
||||
# 23| r23_2(glval<char[4]>) = Constant[int] :
|
||||
# 23| r23_3(char *) = Convert : r23_2
|
||||
# 23| r23_4(char *) = Convert : r23_3
|
||||
# 23| mu23_5(char *) = Store[#return] : &:r23_1, r23_4
|
||||
# 19| r19_4(glval<char *>) = VariableAddress[#return] :
|
||||
# 19| v19_5(void) = ReturnValue : &:r19_4, ~m?
|
||||
# 19| v19_6(void) = AliasedUse : ~m?
|
||||
# 19| v19_7(void) = ExitFunction :
|
||||
|
||||
# 26| void c11_generic_test_test_with_cast(int)
|
||||
# 26| Block 0
|
||||
# 26| v26_1(void) = EnterFunction :
|
||||
# 26| mu26_2(unknown) = AliasedDefinition :
|
||||
# 26| mu26_3(unknown) = InitializeNonLocal :
|
||||
# 26| r26_4(glval<int>) = VariableAddress[y] :
|
||||
# 26| mu26_5(int) = InitializeParameter[y] : &:r26_4
|
||||
# 27| r27_1(glval<unsigned int>) = VariableAddress[r] :
|
||||
# 27| mu27_2(unsigned int) = Uninitialized[r] : &:r27_1
|
||||
# 28| r28_1(glval<int>) = VariableAddress[y] :
|
||||
# 28| r28_2(int) = Load[y] : &:r28_1, ~m?
|
||||
# 28| r28_3(unsigned int) = Convert : r28_2
|
||||
# 28| r28_4(glval<unsigned int>) = VariableAddress[r] :
|
||||
# 28| mu28_5(unsigned int) = Store[r] : &:r28_4, r28_3
|
||||
# 29| v29_1(void) = NoOp :
|
||||
# 26| v26_6(void) = ReturnVoid :
|
||||
# 26| v26_7(void) = AliasedUse : ~m?
|
||||
# 26| v26_8(void) = ExitFunction :
|
||||
|
||||
ir.c:
|
||||
# 7| void MyCoordsTest(int)
|
||||
# 7| Block 0
|
||||
|
|
|
@ -29,26 +29,4 @@ fieldAddressOnNonPointer
|
|||
thisArgumentIsNonPointer
|
||||
| ir.cpp:2546:34:2546:34 | Call: call to operator bool | Call instruction 'Call: call to operator bool' has a `this` argument operand that is not an address, in function '$@'. | ir.cpp:2545:6:2545:23 | void this_inconsistency(bool) | void this_inconsistency(bool) |
|
||||
nonUniqueIRVariable
|
||||
| coroutines.cpp:87:20:87:20 | VariableAddress: (unnamed local variable) | Variable address instruction 'VariableAddress: (unnamed local variable)' has no associated variable, in function '$@'. | coroutines.cpp:87:20:87:33 | co_returnable_void co_return_void() | co_returnable_void co_return_void() |
|
||||
| coroutines.cpp:87:20:87:20 | VariableAddress: (unnamed local variable) | Variable address instruction 'VariableAddress: (unnamed local variable)' has no associated variable, in function '$@'. | coroutines.cpp:87:20:87:33 | co_returnable_void co_return_void() | co_returnable_void co_return_void() |
|
||||
| coroutines.cpp:91:21:91:21 | VariableAddress: (unnamed local variable) | Variable address instruction 'VariableAddress: (unnamed local variable)' has no associated variable, in function '$@'. | coroutines.cpp:91:21:91:33 | co_returnable_value co_return_int(int) | co_returnable_value co_return_int(int) |
|
||||
| coroutines.cpp:91:21:91:21 | VariableAddress: (unnamed local variable) | Variable address instruction 'VariableAddress: (unnamed local variable)' has no associated variable, in function '$@'. | coroutines.cpp:91:21:91:33 | co_returnable_value co_return_int(int) | co_returnable_value co_return_int(int) |
|
||||
| coroutines.cpp:95:20:95:20 | VariableAddress: (unnamed local variable) | Variable address instruction 'VariableAddress: (unnamed local variable)' has no associated variable, in function '$@'. | coroutines.cpp:95:20:95:38 | co_returnable_void co_yield_value_void(int) | co_returnable_void co_yield_value_void(int) |
|
||||
| coroutines.cpp:95:20:95:20 | VariableAddress: (unnamed local variable) | Variable address instruction 'VariableAddress: (unnamed local variable)' has no associated variable, in function '$@'. | coroutines.cpp:95:20:95:38 | co_returnable_void co_yield_value_void(int) | co_returnable_void co_yield_value_void(int) |
|
||||
| coroutines.cpp:96:3:96:3 | VariableAddress: (unnamed local variable) | Variable address instruction 'VariableAddress: (unnamed local variable)' has no associated variable, in function '$@'. | coroutines.cpp:95:20:95:38 | co_returnable_void co_yield_value_void(int) | co_returnable_void co_yield_value_void(int) |
|
||||
| coroutines.cpp:99:21:99:21 | VariableAddress: (unnamed local variable) | Variable address instruction 'VariableAddress: (unnamed local variable)' has no associated variable, in function '$@'. | coroutines.cpp:99:21:99:40 | co_returnable_value co_yield_value_value(int) | co_returnable_value co_yield_value_value(int) |
|
||||
| coroutines.cpp:99:21:99:21 | VariableAddress: (unnamed local variable) | Variable address instruction 'VariableAddress: (unnamed local variable)' has no associated variable, in function '$@'. | coroutines.cpp:99:21:99:40 | co_returnable_value co_yield_value_value(int) | co_returnable_value co_yield_value_value(int) |
|
||||
| coroutines.cpp:100:3:100:3 | VariableAddress: (unnamed local variable) | Variable address instruction 'VariableAddress: (unnamed local variable)' has no associated variable, in function '$@'. | coroutines.cpp:99:21:99:40 | co_returnable_value co_yield_value_value(int) | co_returnable_value co_yield_value_value(int) |
|
||||
| coroutines.cpp:103:20:103:20 | VariableAddress: (unnamed local variable) | Variable address instruction 'VariableAddress: (unnamed local variable)' has no associated variable, in function '$@'. | coroutines.cpp:103:20:103:43 | co_returnable_void co_yield_and_return_void(int) | co_returnable_void co_yield_and_return_void(int) |
|
||||
| coroutines.cpp:103:20:103:20 | VariableAddress: (unnamed local variable) | Variable address instruction 'VariableAddress: (unnamed local variable)' has no associated variable, in function '$@'. | coroutines.cpp:103:20:103:43 | co_returnable_void co_yield_and_return_void(int) | co_returnable_void co_yield_and_return_void(int) |
|
||||
| coroutines.cpp:104:3:104:3 | VariableAddress: (unnamed local variable) | Variable address instruction 'VariableAddress: (unnamed local variable)' has no associated variable, in function '$@'. | coroutines.cpp:103:20:103:43 | co_returnable_void co_yield_and_return_void(int) | co_returnable_void co_yield_and_return_void(int) |
|
||||
| coroutines.cpp:108:21:108:21 | VariableAddress: (unnamed local variable) | Variable address instruction 'VariableAddress: (unnamed local variable)' has no associated variable, in function '$@'. | coroutines.cpp:108:21:108:45 | co_returnable_value co_yield_and_return_value(int) | co_returnable_value co_yield_and_return_value(int) |
|
||||
| coroutines.cpp:108:21:108:21 | VariableAddress: (unnamed local variable) | Variable address instruction 'VariableAddress: (unnamed local variable)' has no associated variable, in function '$@'. | coroutines.cpp:108:21:108:45 | co_returnable_value co_yield_and_return_value(int) | co_returnable_value co_yield_and_return_value(int) |
|
||||
| coroutines.cpp:109:3:109:3 | VariableAddress: (unnamed local variable) | Variable address instruction 'VariableAddress: (unnamed local variable)' has no associated variable, in function '$@'. | coroutines.cpp:108:21:108:45 | co_returnable_value co_yield_and_return_value(int) | co_returnable_value co_yield_and_return_value(int) |
|
||||
| file://:0:0:0:0 | VariableAddress: (unnamed local variable) | Variable address instruction 'VariableAddress: (unnamed local variable)' has no associated variable, in function '$@'. | coroutines.cpp:87:20:87:33 | co_returnable_void co_return_void() | co_returnable_void co_return_void() |
|
||||
| file://:0:0:0:0 | VariableAddress: (unnamed local variable) | Variable address instruction 'VariableAddress: (unnamed local variable)' has no associated variable, in function '$@'. | coroutines.cpp:91:21:91:33 | co_returnable_value co_return_int(int) | co_returnable_value co_return_int(int) |
|
||||
| file://:0:0:0:0 | VariableAddress: (unnamed local variable) | Variable address instruction 'VariableAddress: (unnamed local variable)' has no associated variable, in function '$@'. | coroutines.cpp:95:20:95:38 | co_returnable_void co_yield_value_void(int) | co_returnable_void co_yield_value_void(int) |
|
||||
| file://:0:0:0:0 | VariableAddress: (unnamed local variable) | Variable address instruction 'VariableAddress: (unnamed local variable)' has no associated variable, in function '$@'. | coroutines.cpp:99:21:99:40 | co_returnable_value co_yield_value_value(int) | co_returnable_value co_yield_value_value(int) |
|
||||
| file://:0:0:0:0 | VariableAddress: (unnamed local variable) | Variable address instruction 'VariableAddress: (unnamed local variable)' has no associated variable, in function '$@'. | coroutines.cpp:103:20:103:43 | co_returnable_void co_yield_and_return_void(int) | co_returnable_void co_yield_and_return_void(int) |
|
||||
| file://:0:0:0:0 | VariableAddress: (unnamed local variable) | Variable address instruction 'VariableAddress: (unnamed local variable)' has no associated variable, in function '$@'. | coroutines.cpp:108:21:108:45 | co_returnable_value co_yield_and_return_value(int) | co_returnable_value co_yield_and_return_value(int) |
|
||||
missingCppType
|
||||
|
|
|
@ -29,26 +29,4 @@ fieldAddressOnNonPointer
|
|||
thisArgumentIsNonPointer
|
||||
| ir.cpp:2546:34:2546:34 | Call: call to operator bool | Call instruction 'Call: call to operator bool' has a `this` argument operand that is not an address, in function '$@'. | ir.cpp:2545:6:2545:23 | void this_inconsistency(bool) | void this_inconsistency(bool) |
|
||||
nonUniqueIRVariable
|
||||
| coroutines.cpp:87:20:87:20 | VariableAddress: (unnamed local variable) | Variable address instruction 'VariableAddress: (unnamed local variable)' has no associated variable, in function '$@'. | coroutines.cpp:87:20:87:33 | co_returnable_void co_return_void() | co_returnable_void co_return_void() |
|
||||
| coroutines.cpp:87:20:87:20 | VariableAddress: (unnamed local variable) | Variable address instruction 'VariableAddress: (unnamed local variable)' has no associated variable, in function '$@'. | coroutines.cpp:87:20:87:33 | co_returnable_void co_return_void() | co_returnable_void co_return_void() |
|
||||
| coroutines.cpp:91:21:91:21 | VariableAddress: (unnamed local variable) | Variable address instruction 'VariableAddress: (unnamed local variable)' has no associated variable, in function '$@'. | coroutines.cpp:91:21:91:33 | co_returnable_value co_return_int(int) | co_returnable_value co_return_int(int) |
|
||||
| coroutines.cpp:91:21:91:21 | VariableAddress: (unnamed local variable) | Variable address instruction 'VariableAddress: (unnamed local variable)' has no associated variable, in function '$@'. | coroutines.cpp:91:21:91:33 | co_returnable_value co_return_int(int) | co_returnable_value co_return_int(int) |
|
||||
| coroutines.cpp:95:20:95:20 | VariableAddress: (unnamed local variable) | Variable address instruction 'VariableAddress: (unnamed local variable)' has no associated variable, in function '$@'. | coroutines.cpp:95:20:95:38 | co_returnable_void co_yield_value_void(int) | co_returnable_void co_yield_value_void(int) |
|
||||
| coroutines.cpp:95:20:95:20 | VariableAddress: (unnamed local variable) | Variable address instruction 'VariableAddress: (unnamed local variable)' has no associated variable, in function '$@'. | coroutines.cpp:95:20:95:38 | co_returnable_void co_yield_value_void(int) | co_returnable_void co_yield_value_void(int) |
|
||||
| coroutines.cpp:96:3:96:3 | VariableAddress: (unnamed local variable) | Variable address instruction 'VariableAddress: (unnamed local variable)' has no associated variable, in function '$@'. | coroutines.cpp:95:20:95:38 | co_returnable_void co_yield_value_void(int) | co_returnable_void co_yield_value_void(int) |
|
||||
| coroutines.cpp:99:21:99:21 | VariableAddress: (unnamed local variable) | Variable address instruction 'VariableAddress: (unnamed local variable)' has no associated variable, in function '$@'. | coroutines.cpp:99:21:99:40 | co_returnable_value co_yield_value_value(int) | co_returnable_value co_yield_value_value(int) |
|
||||
| coroutines.cpp:99:21:99:21 | VariableAddress: (unnamed local variable) | Variable address instruction 'VariableAddress: (unnamed local variable)' has no associated variable, in function '$@'. | coroutines.cpp:99:21:99:40 | co_returnable_value co_yield_value_value(int) | co_returnable_value co_yield_value_value(int) |
|
||||
| coroutines.cpp:100:3:100:3 | VariableAddress: (unnamed local variable) | Variable address instruction 'VariableAddress: (unnamed local variable)' has no associated variable, in function '$@'. | coroutines.cpp:99:21:99:40 | co_returnable_value co_yield_value_value(int) | co_returnable_value co_yield_value_value(int) |
|
||||
| coroutines.cpp:103:20:103:20 | VariableAddress: (unnamed local variable) | Variable address instruction 'VariableAddress: (unnamed local variable)' has no associated variable, in function '$@'. | coroutines.cpp:103:20:103:43 | co_returnable_void co_yield_and_return_void(int) | co_returnable_void co_yield_and_return_void(int) |
|
||||
| coroutines.cpp:103:20:103:20 | VariableAddress: (unnamed local variable) | Variable address instruction 'VariableAddress: (unnamed local variable)' has no associated variable, in function '$@'. | coroutines.cpp:103:20:103:43 | co_returnable_void co_yield_and_return_void(int) | co_returnable_void co_yield_and_return_void(int) |
|
||||
| coroutines.cpp:104:3:104:3 | VariableAddress: (unnamed local variable) | Variable address instruction 'VariableAddress: (unnamed local variable)' has no associated variable, in function '$@'. | coroutines.cpp:103:20:103:43 | co_returnable_void co_yield_and_return_void(int) | co_returnable_void co_yield_and_return_void(int) |
|
||||
| coroutines.cpp:108:21:108:21 | VariableAddress: (unnamed local variable) | Variable address instruction 'VariableAddress: (unnamed local variable)' has no associated variable, in function '$@'. | coroutines.cpp:108:21:108:45 | co_returnable_value co_yield_and_return_value(int) | co_returnable_value co_yield_and_return_value(int) |
|
||||
| coroutines.cpp:108:21:108:21 | VariableAddress: (unnamed local variable) | Variable address instruction 'VariableAddress: (unnamed local variable)' has no associated variable, in function '$@'. | coroutines.cpp:108:21:108:45 | co_returnable_value co_yield_and_return_value(int) | co_returnable_value co_yield_and_return_value(int) |
|
||||
| coroutines.cpp:109:3:109:3 | VariableAddress: (unnamed local variable) | Variable address instruction 'VariableAddress: (unnamed local variable)' has no associated variable, in function '$@'. | coroutines.cpp:108:21:108:45 | co_returnable_value co_yield_and_return_value(int) | co_returnable_value co_yield_and_return_value(int) |
|
||||
| file://:0:0:0:0 | VariableAddress: (unnamed local variable) | Variable address instruction 'VariableAddress: (unnamed local variable)' has no associated variable, in function '$@'. | coroutines.cpp:87:20:87:33 | co_returnable_void co_return_void() | co_returnable_void co_return_void() |
|
||||
| file://:0:0:0:0 | VariableAddress: (unnamed local variable) | Variable address instruction 'VariableAddress: (unnamed local variable)' has no associated variable, in function '$@'. | coroutines.cpp:91:21:91:33 | co_returnable_value co_return_int(int) | co_returnable_value co_return_int(int) |
|
||||
| file://:0:0:0:0 | VariableAddress: (unnamed local variable) | Variable address instruction 'VariableAddress: (unnamed local variable)' has no associated variable, in function '$@'. | coroutines.cpp:95:20:95:38 | co_returnable_void co_yield_value_void(int) | co_returnable_void co_yield_value_void(int) |
|
||||
| file://:0:0:0:0 | VariableAddress: (unnamed local variable) | Variable address instruction 'VariableAddress: (unnamed local variable)' has no associated variable, in function '$@'. | coroutines.cpp:99:21:99:40 | co_returnable_value co_yield_value_value(int) | co_returnable_value co_yield_value_value(int) |
|
||||
| file://:0:0:0:0 | VariableAddress: (unnamed local variable) | Variable address instruction 'VariableAddress: (unnamed local variable)' has no associated variable, in function '$@'. | coroutines.cpp:103:20:103:43 | co_returnable_void co_yield_and_return_void(int) | co_returnable_void co_yield_and_return_void(int) |
|
||||
| file://:0:0:0:0 | VariableAddress: (unnamed local variable) | Variable address instruction 'VariableAddress: (unnamed local variable)' has no associated variable, in function '$@'. | coroutines.cpp:108:21:108:45 | co_returnable_value co_yield_and_return_value(int) | co_returnable_value co_yield_and_return_value(int) |
|
||||
missingCppType
|
||||
|
|
Некоторые файлы не были показаны из-за слишком большого количества измененных файлов Показать больше
Загрузка…
Ссылка в новой задаче