mirror of
https://github.com/github/codeql.git
synced 2026-05-30 02:51:24 +02:00
Compare commits
3 Commits
dependabot
...
post-relea
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
cea19c4d1b | ||
|
|
89ac7a5440 | ||
|
|
febeb66f7b |
3
.gitattributes
vendored
3
.gitattributes
vendored
@@ -71,6 +71,3 @@ go/extractor/opencsv/CSVReader.java -text
|
||||
# `javascript/ql/experimental/adaptivethreatmodeling/test/update_endpoint_test_files.py`.
|
||||
javascript/ql/experimental/adaptivethreatmodeling/test/endpoint_large_scale/autogenerated/**/*.js linguist-generated=true -merge
|
||||
javascript/ql/experimental/adaptivethreatmodeling/test/endpoint_large_scale/autogenerated/**/*.ts linguist-generated=true -merge
|
||||
|
||||
# Auto-generated modeling for Python
|
||||
python/ql/lib/semmle/python/frameworks/data/internal/subclass-capture/*.yml linguist-generated=true
|
||||
|
||||
12
.github/workflows/mad_modelDiff.yml
vendored
12
.github/workflows/mad_modelDiff.yml
vendored
@@ -12,7 +12,6 @@ on:
|
||||
- main
|
||||
paths:
|
||||
- "java/ql/src/utils/modelgenerator/**/*.*"
|
||||
- "misc/scripts/models-as-data/*.*"
|
||||
- ".github/workflows/mad_modelDiff.yml"
|
||||
|
||||
permissions:
|
||||
@@ -62,9 +61,8 @@ jobs:
|
||||
DATABASE=$2
|
||||
cd codeql-$QL_VARIANT
|
||||
SHORTNAME=`basename $DATABASE`
|
||||
python java/ql/src/utils/modelgenerator/GenerateFlowModel.py --with-summaries --with-sinks $DATABASE $SHORTNAME/$QL_VARIANT
|
||||
mkdir -p $MODELS/$SHORTNAME
|
||||
mv java/ql/lib/ext/generated/$SHORTNAME/$QL_VARIANT $MODELS/$SHORTNAME
|
||||
python java/ql/src/utils/modelgenerator/GenerateFlowModel.py --with-summaries --with-sinks $DATABASE ${SHORTNAME}.temp.model.yml
|
||||
mv java/ql/lib/ext/generated/${SHORTNAME}.temp.model.yml $MODELS/${SHORTNAME}Generated_${QL_VARIANT}.model.yml
|
||||
cd ..
|
||||
}
|
||||
|
||||
@@ -87,16 +85,16 @@ jobs:
|
||||
set -x
|
||||
MODELS=`pwd`/tmp-models
|
||||
ls -1 tmp-models/
|
||||
for m in $MODELS/*/main/*.model.yml ; do
|
||||
for m in $MODELS/*_main.model.yml ; do
|
||||
t="${m/main/"pr"}"
|
||||
basename=`basename $m`
|
||||
name="diff_${basename/.model.yml/""}"
|
||||
name="diff_${basename/_main.model.yml/""}"
|
||||
(diff -w -u $m $t | diff2html -i stdin -F $MODELS/$name.html) || true
|
||||
done
|
||||
- uses: actions/upload-artifact@v3
|
||||
with:
|
||||
name: models
|
||||
path: tmp-models/**/**/*.model.yml
|
||||
path: tmp-models/*.model.yml
|
||||
retention-days: 20
|
||||
- uses: actions/upload-artifact@v3
|
||||
with:
|
||||
|
||||
4
.github/workflows/ql-for-ql-build.yml
vendored
4
.github/workflows/ql-for-ql-build.yml
vendored
@@ -27,7 +27,7 @@ jobs:
|
||||
### Build the extractor ###
|
||||
- name: Cache entire extractor
|
||||
id: cache-extractor
|
||||
uses: actions/cache@v4
|
||||
uses: actions/cache@v3
|
||||
with:
|
||||
path: |
|
||||
ql/extractor-pack/
|
||||
@@ -35,7 +35,7 @@ jobs:
|
||||
key: ${{ runner.os }}-${{ steps.os_version.outputs.version }}-extractor-${{ hashFiles('ql/**/Cargo.lock') }}-${{ hashFiles('shared/tree-sitter-extractor') }}-${{ hashFiles('ql/**/*.rs') }}
|
||||
- name: Cache cargo
|
||||
if: steps.cache-extractor.outputs.cache-hit != 'true'
|
||||
uses: actions/cache@v4
|
||||
uses: actions/cache@v3
|
||||
with:
|
||||
path: |
|
||||
~/.cargo/registry
|
||||
|
||||
@@ -30,7 +30,7 @@ jobs:
|
||||
languages: javascript # does not matter
|
||||
- uses: ./.github/actions/os-version
|
||||
id: os_version
|
||||
- uses: actions/cache@v4
|
||||
- uses: actions/cache@v3
|
||||
with:
|
||||
path: |
|
||||
~/.cargo/registry
|
||||
|
||||
4
.github/workflows/ql-for-ql-tests.yml
vendored
4
.github/workflows/ql-for-ql-tests.yml
vendored
@@ -29,7 +29,7 @@ jobs:
|
||||
languages: javascript # does not matter
|
||||
- uses: ./.github/actions/os-version
|
||||
id: os_version
|
||||
- uses: actions/cache@v4
|
||||
- uses: actions/cache@v3
|
||||
with:
|
||||
path: |
|
||||
~/.cargo/registry
|
||||
@@ -74,7 +74,7 @@ jobs:
|
||||
languages: javascript # does not matter
|
||||
- uses: ./.github/actions/os-version
|
||||
id: os_version
|
||||
- uses: actions/cache@v4
|
||||
- uses: actions/cache@v3
|
||||
with:
|
||||
path: |
|
||||
~/.cargo/registry
|
||||
|
||||
4
.github/workflows/ruby-build.yml
vendored
4
.github/workflows/ruby-build.yml
vendored
@@ -54,7 +54,7 @@ jobs:
|
||||
- uses: ./.github/actions/os-version
|
||||
id: os_version
|
||||
- name: Cache entire extractor
|
||||
uses: actions/cache@v4
|
||||
uses: actions/cache@v3
|
||||
id: cache-extractor
|
||||
with:
|
||||
path: |
|
||||
@@ -62,7 +62,7 @@ jobs:
|
||||
ruby/extractor/target/release/codeql-extractor-ruby.exe
|
||||
ruby/extractor/ql/lib/codeql/ruby/ast/internal/TreeSitter.qll
|
||||
key: ${{ runner.os }}-${{ steps.os_version.outputs.version }}-ruby-extractor-${{ hashFiles('ruby/extractor/rust-toolchain.toml', 'ruby/extractor/Cargo.lock') }}-${{ hashFiles('shared/tree-sitter-extractor') }}-${{ hashFiles('ruby/extractor/**/*.rs') }}
|
||||
- uses: actions/cache@v4
|
||||
- uses: actions/cache@v3
|
||||
if: steps.cache-extractor.outputs.cache-hit != 'true'
|
||||
with:
|
||||
path: |
|
||||
|
||||
@@ -454,6 +454,10 @@
|
||||
"ruby/ql/lib/codeql/ruby/security/internal/SensitiveDataHeuristics.qll",
|
||||
"swift/ql/lib/codeql/swift/security/internal/SensitiveDataHeuristics.qll"
|
||||
],
|
||||
"SummaryTypeTracker": [
|
||||
"python/ql/lib/semmle/python/dataflow/new/internal/SummaryTypeTracker.qll",
|
||||
"ruby/ql/lib/codeql/ruby/typetracking/internal/SummaryTypeTracker.qll"
|
||||
],
|
||||
"IncompleteUrlSubstringSanitization": [
|
||||
"javascript/ql/src/Security/CWE-020/IncompleteUrlSubstringSanitization.qll",
|
||||
"ruby/ql/src/queries/security/cwe-020/IncompleteUrlSubstringSanitization.qll"
|
||||
|
||||
@@ -1,9 +0,0 @@
|
||||
class Function extends @function {
|
||||
string toString() { none() }
|
||||
}
|
||||
|
||||
from Function fun, string name, int kind, int kind_new
|
||||
where
|
||||
functions(fun, name, kind) and
|
||||
if kind = 7 or kind = 8 then kind_new = 0 else kind_new = kind
|
||||
select fun, name, kind_new
|
||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@@ -1,3 +0,0 @@
|
||||
description: Support more function types
|
||||
compatibility: full
|
||||
functions.rel: run functions.qlo
|
||||
@@ -1,6 +1,5 @@
|
||||
description: Support C++17 if and switch initializers
|
||||
compatibility: partial
|
||||
constexpr_if_initialization.rel: delete
|
||||
if_initialization.rel: delete
|
||||
switch_initialization.rel: delete
|
||||
exprparents.rel: run exprparents.qlo
|
||||
|
||||
@@ -1,17 +0,0 @@
|
||||
class AttributeArg extends @attribute_arg {
|
||||
string toString() { none() }
|
||||
}
|
||||
|
||||
class Attribute extends @attribute {
|
||||
string toString() { none() }
|
||||
}
|
||||
|
||||
class Location extends @location_default {
|
||||
string toString() { none() }
|
||||
}
|
||||
|
||||
from AttributeArg arg, int kind, int kind_new, Attribute attr, int index, Location location
|
||||
where
|
||||
attribute_args(arg, kind, attr, index, location) and
|
||||
if arg instanceof @attribute_arg_expr then kind_new = 0 else kind_new = kind
|
||||
select arg, kind_new, attr, index, location
|
||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@@ -1,4 +0,0 @@
|
||||
description: Support expression attribute arguments
|
||||
compatibility: partial
|
||||
attribute_arg_expr.rel: delete
|
||||
attribute_args.rel: run attribute_args.qlo
|
||||
@@ -1,13 +1,9 @@
|
||||
## 0.12.3
|
||||
## 0.12.2
|
||||
|
||||
### Deprecated APIs
|
||||
|
||||
* The `isUserInput`, `userInputArgument`, and `userInputReturned` predicates from `SecurityOptions` have been deprecated. Use `FlowSource` instead.
|
||||
|
||||
### New Features
|
||||
|
||||
* `UserDefineLiteral` and `DeductionGuide` classes have been added, representing C++11 user defined literals and C++17 deduction guides.
|
||||
|
||||
### Minor Analysis Improvements
|
||||
|
||||
* Changed the output of `Node.toString` to better reflect how many indirections a given dataflow node has.
|
||||
@@ -15,14 +11,6 @@
|
||||
* The deprecated `DefaultTaintTracking` library has been removed.
|
||||
* The `Guards` library has been replaced with the API-compatible `IRGuards` implementation, which has better precision in some cases.
|
||||
|
||||
### Bug Fixes
|
||||
|
||||
* Under certain circumstances a function declaration that is not also a definition could be associated with a `Function` that did not have the definition as a `FunctionDeclarationEntry`. This is now fixed when only one definition exists, and a unique `Function` will exist that has both the declaration and the definition as a `FunctionDeclarationEntry`.
|
||||
|
||||
## 0.12.2
|
||||
|
||||
No user-facing changes.
|
||||
|
||||
## 0.12.1
|
||||
|
||||
### New Features
|
||||
|
||||
@@ -1,3 +1,12 @@
|
||||
## 0.12.2
|
||||
|
||||
No user-facing changes.
|
||||
### Deprecated APIs
|
||||
|
||||
* The `isUserInput`, `userInputArgument`, and `userInputReturned` predicates from `SecurityOptions` have been deprecated. Use `FlowSource` instead.
|
||||
|
||||
### Minor Analysis Improvements
|
||||
|
||||
* Changed the output of `Node.toString` to better reflect how many indirections a given dataflow node has.
|
||||
* Added a new predicate `Node.asDefinition` on `DataFlow::Node`s for selecting the dataflow node corresponding to a particular definition.
|
||||
* The deprecated `DefaultTaintTracking` library has been removed.
|
||||
* The `Guards` library has been replaced with the API-compatible `IRGuards` implementation, which has better precision in some cases.
|
||||
|
||||
@@ -1,20 +0,0 @@
|
||||
## 0.12.3
|
||||
|
||||
### Deprecated APIs
|
||||
|
||||
* The `isUserInput`, `userInputArgument`, and `userInputReturned` predicates from `SecurityOptions` have been deprecated. Use `FlowSource` instead.
|
||||
|
||||
### New Features
|
||||
|
||||
* `UserDefineLiteral` and `DeductionGuide` classes have been added, representing C++11 user defined literals and C++17 deduction guides.
|
||||
|
||||
### Minor Analysis Improvements
|
||||
|
||||
* Changed the output of `Node.toString` to better reflect how many indirections a given dataflow node has.
|
||||
* Added a new predicate `Node.asDefinition` on `DataFlow::Node`s for selecting the dataflow node corresponding to a particular definition.
|
||||
* The deprecated `DefaultTaintTracking` library has been removed.
|
||||
* The `Guards` library has been replaced with the API-compatible `IRGuards` implementation, which has better precision in some cases.
|
||||
|
||||
### Bug Fixes
|
||||
|
||||
* Under certain circumstances a function declaration that is not also a definition could be associated with a `Function` that did not have the definition as a `FunctionDeclarationEntry`. This is now fixed when only one definition exists, and a unique `Function` will exist that has both the declaration and the definition as a `FunctionDeclarationEntry`.
|
||||
@@ -1,2 +1,2 @@
|
||||
---
|
||||
lastReleaseVersion: 0.12.3
|
||||
lastReleaseVersion: 0.12.2
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
name: codeql/cpp-all
|
||||
version: 0.12.4-dev
|
||||
version: 0.12.3-dev
|
||||
groups: cpp
|
||||
dbscheme: semmlecode.cpp.dbscheme
|
||||
extractor: cpp
|
||||
|
||||
@@ -882,17 +882,3 @@ class BuiltInFunction extends Function {
|
||||
}
|
||||
|
||||
private predicate suppressUnusedThis(Function f) { any() }
|
||||
|
||||
/**
|
||||
* A C++ user-defined literal [N4140 13.5.8].
|
||||
*/
|
||||
class UserDefinedLiteral extends Function {
|
||||
UserDefinedLiteral() { functions(underlyingElement(this), _, 7) }
|
||||
}
|
||||
|
||||
/**
|
||||
* A C++ deduction guide [N4659 17.9].
|
||||
*/
|
||||
class DeductionGuide extends Function {
|
||||
DeductionGuide() { functions(underlyingElement(this), _, 8) }
|
||||
}
|
||||
|
||||
@@ -281,11 +281,6 @@ class AttributeArgument extends Element, @attribute_arg {
|
||||
attribute_arg_constant(underlyingElement(this), unresolveElement(result))
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the value of this argument, if its value is an expression.
|
||||
*/
|
||||
Expr getValueExpr() { attribute_arg_expr(underlyingElement(this), unresolveElement(result)) }
|
||||
|
||||
/**
|
||||
* Gets the attribute to which this is an argument.
|
||||
*/
|
||||
@@ -313,10 +308,7 @@ class AttributeArgument extends Element, @attribute_arg {
|
||||
else
|
||||
if underlyingElement(this) instanceof @attribute_arg_constant_expr
|
||||
then tail = this.getValueConstant().toString()
|
||||
else
|
||||
if underlyingElement(this) instanceof @attribute_arg_expr
|
||||
then tail = this.getValueExpr().toString()
|
||||
else tail = this.getValueText()
|
||||
else tail = this.getValueText()
|
||||
) and
|
||||
result = prefix + tail
|
||||
)
|
||||
|
||||
@@ -1,101 +0,0 @@
|
||||
/**
|
||||
* A library for detecting general string concatenations.
|
||||
*/
|
||||
|
||||
import cpp
|
||||
import semmle.code.cpp.models.implementations.Strcat
|
||||
import semmle.code.cpp.models.interfaces.FormattingFunction
|
||||
private import semmle.code.cpp.dataflow.new.DataFlow
|
||||
|
||||
/**
|
||||
* A call that performs a string concatenation. A string can be either a C
|
||||
* string (i.e., a value of type `char*`), or a C++ string (i.e., a value of
|
||||
* type `std::string`).
|
||||
*/
|
||||
class StringConcatenation extends Call {
|
||||
StringConcatenation() {
|
||||
// sprintf-like functions, i.e., concat through formatting
|
||||
this instanceof FormattingFunctionCall
|
||||
or
|
||||
this.getTarget() instanceof StrcatFunction
|
||||
or
|
||||
this.getTarget() instanceof StrlcatFunction
|
||||
or
|
||||
// operator+ and ostream (<<) concat
|
||||
exists(Call call, Operator op |
|
||||
call.getTarget() = op and
|
||||
op.hasQualifiedName(["std", "bsl"], ["operator+", "operator<<"]) and
|
||||
op.getType()
|
||||
.stripType()
|
||||
.(UserType)
|
||||
.hasQualifiedName(["std", "bsl"], ["basic_string", "basic_ostream"]) and
|
||||
this = call
|
||||
)
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets an operand of this concatenation (one of the string operands being
|
||||
* concatenated).
|
||||
* Will not return out param for sprintf-like functions, but will consider the format string
|
||||
* to be part of the operands.
|
||||
*/
|
||||
Expr getAnOperand() {
|
||||
// The result is an argument of 'this' (a call)
|
||||
result = this.getAnArgument() and
|
||||
// addresses odd behavior with overloaded operators
|
||||
// i.e., "call to operator+" appearing as an operand
|
||||
// occurs in cases like `string s = s1 + s2 + s3`, which is represented as
|
||||
// `string s = (s1.operator+(s2)).operator+(s3);`
|
||||
// By limiting to non-calls we get the leaf operands (the variables or raw strings)
|
||||
// also, by not enumerating allowed types (variables and strings) we avoid issues
|
||||
// with missed corner cases or extensions/changes to CodeQL in the future which might
|
||||
// invalidate that approach.
|
||||
not result instanceof Call and
|
||||
// Limit the result type to string
|
||||
(
|
||||
result.getUnderlyingType().stripType().getName() = "char"
|
||||
or
|
||||
result
|
||||
.getType()
|
||||
.getUnspecifiedType()
|
||||
.(UserType)
|
||||
.hasQualifiedName(["std", "bsl"], "basic_string")
|
||||
) and
|
||||
// when 'this' is a `FormattingFunctionCall` the result must be the format string argument
|
||||
// or one of the formatting arguments
|
||||
(
|
||||
this instanceof FormattingFunctionCall
|
||||
implies
|
||||
(
|
||||
result = this.(FormattingFunctionCall).getFormat()
|
||||
or
|
||||
exists(int n |
|
||||
result = this.getArgument(n) and
|
||||
n >= this.(FormattingFunctionCall).getTarget().getFirstFormatArgumentIndex()
|
||||
)
|
||||
)
|
||||
)
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the data flow node representing the concatenation result.
|
||||
*/
|
||||
DataFlow::Node getResultNode() {
|
||||
if this.getTarget() instanceof StrcatFunction
|
||||
then
|
||||
result.asDefiningArgument() =
|
||||
this.getArgument(this.getTarget().(StrcatFunction).getParamDest())
|
||||
or
|
||||
// Hardcoding it is also the return
|
||||
result.asExpr() = this.(Call)
|
||||
else
|
||||
if this.getTarget() instanceof StrlcatFunction
|
||||
then (
|
||||
result.asDefiningArgument() =
|
||||
this.getArgument(this.getTarget().(StrlcatFunction).getParamDest())
|
||||
) else
|
||||
if this instanceof FormattingFunctionCall
|
||||
then result.asDefiningArgument() = this.(FormattingFunctionCall).getOutputArgument(_)
|
||||
else result.asExpr() = this.(Call)
|
||||
}
|
||||
}
|
||||
@@ -110,8 +110,8 @@ private predicate loopConditionAlwaysUponEntry(ControlFlowNode loop, Expr condit
|
||||
* should be in this relation.
|
||||
*/
|
||||
pragma[noinline]
|
||||
private predicate isFunction(@element el) {
|
||||
el instanceof @function
|
||||
private predicate isFunction(Element el) {
|
||||
el instanceof Function
|
||||
or
|
||||
el.(Expr).getParent() = el
|
||||
}
|
||||
@@ -122,7 +122,7 @@ private predicate isFunction(@element el) {
|
||||
*/
|
||||
pragma[noopt]
|
||||
private predicate callHasNoTarget(@funbindexpr fc) {
|
||||
exists(@function f |
|
||||
exists(Function f |
|
||||
funbind(fc, f) and
|
||||
not isFunction(f)
|
||||
)
|
||||
|
||||
@@ -54,6 +54,18 @@ private predicate functionSignature(Function f, string qualifiedName, int nparam
|
||||
not f.isStatic()
|
||||
}
|
||||
|
||||
/**
|
||||
* Holds if the set of viable implementations that can be called by `call`
|
||||
* might be improved by knowing the call context.
|
||||
*/
|
||||
predicate mayBenefitFromCallContext(DataFlowCall call, Function f) { none() }
|
||||
|
||||
/**
|
||||
* Gets a viable dispatch target of `call` in the context `ctx`. This is
|
||||
* restricted to those `call`s for which a context might make a difference.
|
||||
*/
|
||||
Function viableImplInCallContext(DataFlowCall call, DataFlowCall ctx) { none() }
|
||||
|
||||
/** A parameter position represented by an integer. */
|
||||
class ParameterPosition extends int {
|
||||
ParameterPosition() { any(ParameterNode p).isParameterOf(_, this) }
|
||||
|
||||
@@ -24,8 +24,8 @@ private predicate isGlobalWithMangledNameAndWithoutDefinition(@mangledname name,
|
||||
* a unique global variable `complete` with the same name that does have a definition.
|
||||
*/
|
||||
private predicate hasTwinWithDefinition(@globalvariable incomplete, @globalvariable complete) {
|
||||
not variable_instantiation(incomplete, complete) and
|
||||
exists(@mangledname name |
|
||||
not variable_instantiation(incomplete, complete) and
|
||||
isGlobalWithMangledNameAndWithoutDefinition(name, incomplete) and
|
||||
isGlobalWithMangledNameAndWithDefinition(name, complete)
|
||||
)
|
||||
|
||||
@@ -249,7 +249,9 @@ private predicate functionSignature(Function f, string qualifiedName, int nparam
|
||||
* Holds if the set of viable implementations that can be called by `call`
|
||||
* might be improved by knowing the call context.
|
||||
*/
|
||||
predicate mayBenefitFromCallContext(DataFlowCall call) { mayBenefitFromCallContext(call, _, _) }
|
||||
predicate mayBenefitFromCallContext(DataFlowCall call, DataFlowCallable f) {
|
||||
mayBenefitFromCallContext(call, f, _)
|
||||
}
|
||||
|
||||
/**
|
||||
* Holds if `call` is a call through a function pointer, and the pointer
|
||||
|
||||
@@ -22,8 +22,4 @@ module CppDataFlow implements InputSig {
|
||||
predicate getAdditionalFlowIntoCallNodeTerm = Private::getAdditionalFlowIntoCallNodeTerm/2;
|
||||
|
||||
predicate validParameterAliasStep = Private::validParameterAliasStep/2;
|
||||
|
||||
predicate mayBenefitFromCallContext = Private::mayBenefitFromCallContext/1;
|
||||
|
||||
predicate viableImplInCallContext = Private::viableImplInCallContext/2;
|
||||
}
|
||||
|
||||
@@ -59,41 +59,6 @@ private module Cached {
|
||||
import Cached
|
||||
private import Nodes0
|
||||
|
||||
/**
|
||||
* A module for calculating the number of stars (i.e., `*`s) needed for various
|
||||
* dataflow node `toString` predicates.
|
||||
*/
|
||||
module NodeStars {
|
||||
private int getNumberOfIndirections(Node n) {
|
||||
result = n.(RawIndirectOperand).getIndirectionIndex()
|
||||
or
|
||||
result = n.(RawIndirectInstruction).getIndirectionIndex()
|
||||
or
|
||||
result = n.(VariableNode).getIndirectionIndex()
|
||||
or
|
||||
result = n.(PostUpdateNodeImpl).getIndirectionIndex()
|
||||
or
|
||||
result = n.(FinalParameterNode).getIndirectionIndex()
|
||||
}
|
||||
|
||||
private int maxNumberOfIndirections() { result = max(getNumberOfIndirections(_)) }
|
||||
|
||||
private string repeatStars(int n) {
|
||||
n = 0 and result = ""
|
||||
or
|
||||
n = [1 .. maxNumberOfIndirections()] and
|
||||
result = "*" + repeatStars(n - 1)
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the number of stars (i.e., `*`s) needed to produce the `toString`
|
||||
* output for `n`.
|
||||
*/
|
||||
string stars(Node n) { result = repeatStars(getNumberOfIndirections(n)) }
|
||||
}
|
||||
|
||||
import NodeStars
|
||||
|
||||
class Node0Impl extends TIRDataFlowNode0 {
|
||||
/**
|
||||
* INTERNAL: Do not use.
|
||||
|
||||
@@ -486,6 +486,47 @@ class Node extends TIRDataFlowNode {
|
||||
}
|
||||
}
|
||||
|
||||
private string toExprString(Node n) {
|
||||
not isDebugMode() and
|
||||
(
|
||||
result = n.asExpr(0).toString()
|
||||
or
|
||||
not exists(n.asExpr()) and
|
||||
result = stars(n) + n.asIndirectExpr(0, 1).toString()
|
||||
)
|
||||
}
|
||||
|
||||
private module NodeStars {
|
||||
private int getNumberOfIndirections(Node n) {
|
||||
result = n.(RawIndirectOperand).getIndirectionIndex()
|
||||
or
|
||||
result = n.(RawIndirectInstruction).getIndirectionIndex()
|
||||
or
|
||||
result = n.(VariableNode).getIndirectionIndex()
|
||||
or
|
||||
result = n.(PostUpdateNodeImpl).getIndirectionIndex()
|
||||
or
|
||||
result = n.(FinalParameterNode).getIndirectionIndex()
|
||||
}
|
||||
|
||||
private int maxNumberOfIndirections() { result = max(getNumberOfIndirections(_)) }
|
||||
|
||||
private string repeatStars(int n) {
|
||||
n = 0 and result = ""
|
||||
or
|
||||
n = [1 .. maxNumberOfIndirections()] and
|
||||
result = "*" + repeatStars(n - 1)
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the number of stars (i.e., `*`s) needed to produce the `toString`
|
||||
* output for `n`.
|
||||
*/
|
||||
string stars(Node n) { result = repeatStars(getNumberOfIndirections(n)) }
|
||||
}
|
||||
|
||||
private import NodeStars
|
||||
|
||||
/**
|
||||
* A class that lifts pre-SSA dataflow nodes to regular dataflow nodes.
|
||||
*/
|
||||
@@ -548,10 +589,7 @@ Type stripPointer(Type t) {
|
||||
result = t.(FunctionPointerIshType).getBaseType()
|
||||
}
|
||||
|
||||
/**
|
||||
* INTERNAL: Do not use.
|
||||
*/
|
||||
class PostUpdateNodeImpl extends PartialDefinitionNode, TPostUpdateNodeImpl {
|
||||
private class PostUpdateNodeImpl extends PartialDefinitionNode, TPostUpdateNodeImpl {
|
||||
int indirectionIndex;
|
||||
Operand operand;
|
||||
|
||||
|
||||
@@ -1,24 +1,9 @@
|
||||
/**
|
||||
* This file contains the class that implements the _debug_ version of
|
||||
* `toString` for `Instruction` and `Operand` dataflow nodes.
|
||||
* This file activates debugging mode for dataflow node printing.
|
||||
*/
|
||||
|
||||
private import semmle.code.cpp.ir.IR
|
||||
private import codeql.util.Unit
|
||||
private import Node0ToString
|
||||
private import DataFlowUtil
|
||||
|
||||
private class DebugNode0ToString extends Node0ToString {
|
||||
DebugNode0ToString() {
|
||||
// Silence warning about `this` not being bound.
|
||||
exists(this)
|
||||
}
|
||||
|
||||
override string instructionToString(Instruction i) { result = i.getDumpString() }
|
||||
|
||||
override string operandToString(Operand op) {
|
||||
result = op.getDumpString() + " @ " + op.getUse().getResultId()
|
||||
}
|
||||
|
||||
override string toExprString(Node n) { none() }
|
||||
final override predicate isDebugMode() { any() }
|
||||
}
|
||||
|
||||
@@ -1,53 +1,75 @@
|
||||
/**
|
||||
* This file imports the class that is used to construct the strings used by
|
||||
* `Node.ToString`.
|
||||
* This file contains the abstract class that serves as the base class for
|
||||
* dataflow node printing.
|
||||
*
|
||||
* Normally, this file should just import `NormalNode0ToString` to compute the
|
||||
* efficient `toString`, but for debugging purposes one can import
|
||||
* `DebugPrinting.qll` to better correlate the dataflow nodes with their
|
||||
* underlying instructions and operands.
|
||||
* By default, a non-debug string is produced. However, a debug-friendly
|
||||
* string can be produced by importing `DebugPrinting.qll`.
|
||||
*/
|
||||
|
||||
private import semmle.code.cpp.ir.IR
|
||||
private import codeql.util.Unit
|
||||
private import DataFlowUtil
|
||||
import NormalNode0ToString // Change this import to control which version should be used.
|
||||
|
||||
/** An abstract class to control the behavior of `Node.toString`. */
|
||||
abstract class Node0ToString extends Unit {
|
||||
/**
|
||||
* Gets the string that should be used by `OperandNode.toString` to print the
|
||||
* dataflow node whose underlying operand is `op.`
|
||||
*/
|
||||
abstract string operandToString(Operand op);
|
||||
/**
|
||||
* A class to control whether a debugging version of instructions and operands
|
||||
* should be printed as part of the `toString` output of dataflow nodes.
|
||||
*
|
||||
* To enable debug printing import the `DebugPrinting.ql` file. By default,
|
||||
* non-debug output will be used.
|
||||
*/
|
||||
class Node0ToString extends Unit {
|
||||
abstract predicate isDebugMode();
|
||||
|
||||
private string normalInstructionToString(Instruction i) {
|
||||
not this.isDebugMode() and
|
||||
if i.(InitializeParameterInstruction).getIRVariable() instanceof IRThisVariable
|
||||
then result = "this"
|
||||
else result = i.getAst().toString()
|
||||
}
|
||||
|
||||
private string normalOperandToString(Operand op) {
|
||||
not this.isDebugMode() and
|
||||
if op.getDef().(InitializeParameterInstruction).getIRVariable() instanceof IRThisVariable
|
||||
then result = "this"
|
||||
else result = op.getDef().getAst().toString()
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the string that should be used by `InstructionNode.toString` to print
|
||||
* the dataflow node whose underlying instruction is `instr`.
|
||||
* Gets the string that should be used by `InstructionNode.toString`
|
||||
*/
|
||||
abstract string instructionToString(Instruction i);
|
||||
string instructionToString(Instruction i) {
|
||||
if this.isDebugMode()
|
||||
then result = i.getDumpString()
|
||||
else result = this.normalInstructionToString(i)
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the string representation of the `Expr` associated with `n`, if any.
|
||||
* Gets the string that should be used by `OperandNode.toString`.
|
||||
*/
|
||||
abstract string toExprString(Node n);
|
||||
string operandToString(Operand op) {
|
||||
if this.isDebugMode()
|
||||
then result = op.getDumpString() + " @ " + op.getUse().getResultId()
|
||||
else result = this.normalOperandToString(op)
|
||||
}
|
||||
}
|
||||
|
||||
private class NoDebugNode0ToString extends Node0ToString {
|
||||
final override predicate isDebugMode() { none() }
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the string that should be used by `OperandNode.toString` to print the
|
||||
* dataflow node whose underlying operand is `op.`
|
||||
* Gets the string that should be used by `OperandNode.toString`.
|
||||
*/
|
||||
string operandToString(Operand op) { result = any(Node0ToString s).operandToString(op) }
|
||||
string operandToString(Operand op) { result = any(Node0ToString nts).operandToString(op) }
|
||||
|
||||
/**
|
||||
* Gets the string that should be used by `InstructionNode.toString` to print
|
||||
* the dataflow node whose underlying instruction is `instr`.
|
||||
* Gets the string that should be used by `InstructionNode.toString`
|
||||
*/
|
||||
string instructionToString(Instruction instr) {
|
||||
result = any(Node0ToString s).instructionToString(instr)
|
||||
}
|
||||
string instructionToString(Instruction i) { result = any(Node0ToString nts).instructionToString(i) }
|
||||
|
||||
/**
|
||||
* Gets the string representation of the `Expr` associated with `n`, if any.
|
||||
* Holds if debugging mode is enabled.
|
||||
*
|
||||
* In debug mode the `toString` on dataflow nodes is more expensive to compute,
|
||||
* but gives more precise information about the different dataflow nodes.
|
||||
*/
|
||||
string toExprString(Node n) { result = any(Node0ToString s).toExprString(n) }
|
||||
predicate isDebugMode() { any(Node0ToString nts).isDebugMode() }
|
||||
|
||||
@@ -1,36 +0,0 @@
|
||||
/**
|
||||
* This file contains the class that implements the non-debug version of
|
||||
* `toString` for `Instruction` and `Operand` dataflow nodes.
|
||||
*/
|
||||
|
||||
private import semmle.code.cpp.ir.IR
|
||||
private import codeql.util.Unit
|
||||
private import Node0ToString
|
||||
private import DataFlowUtil
|
||||
private import DataFlowPrivate
|
||||
|
||||
private class NormalNode0ToString extends Node0ToString {
|
||||
NormalNode0ToString() {
|
||||
// Silence warning about `this` not being bound.
|
||||
exists(this)
|
||||
}
|
||||
|
||||
override string instructionToString(Instruction i) {
|
||||
if i.(InitializeParameterInstruction).getIRVariable() instanceof IRThisVariable
|
||||
then result = "this"
|
||||
else result = i.getAst().toString()
|
||||
}
|
||||
|
||||
override string operandToString(Operand op) {
|
||||
if op.getDef().(InitializeParameterInstruction).getIRVariable() instanceof IRThisVariable
|
||||
then result = "this"
|
||||
else result = op.getDef().getAst().toString()
|
||||
}
|
||||
|
||||
override string toExprString(Node n) {
|
||||
result = n.asExpr(0).toString()
|
||||
or
|
||||
not exists(n.asExpr()) and
|
||||
result = stars(n) + n.asIndirectExpr(0, 1).toString()
|
||||
}
|
||||
}
|
||||
@@ -1,7 +1,6 @@
|
||||
private import cpp
|
||||
private import semmle.code.cpp.ir.IR
|
||||
private import semmle.code.cpp.ir.dataflow.internal.DataFlowUtil
|
||||
private import semmle.code.cpp.ir.dataflow.internal.DataFlowPrivate
|
||||
private import SsaInternals as Ssa
|
||||
private import PrintIRUtilities
|
||||
|
||||
@@ -34,9 +33,9 @@ private string getNodeProperty(Node node, string key) {
|
||||
key = "flow" and
|
||||
result =
|
||||
strictconcat(string flow, boolean to, int order1, int order2 |
|
||||
flow = getFromFlow(node, order1, order2) + "->" + stars(node) + "@" and to = false
|
||||
flow = getFromFlow(node, order1, order2) + "->" + starsForNode(node) + "@" and to = false
|
||||
or
|
||||
flow = stars(node) + "@->" + getToFlow(node, order1, order2) and to = true
|
||||
flow = starsForNode(node) + "@->" + getToFlow(node, order1, order2) and to = true
|
||||
|
|
||||
flow, ", " order by to, order1, order2, flow
|
||||
)
|
||||
|
||||
@@ -7,14 +7,37 @@ private import semmle.code.cpp.ir.IR
|
||||
private import semmle.code.cpp.ir.dataflow.internal.DataFlowUtil
|
||||
private import semmle.code.cpp.ir.dataflow.internal.DataFlowPrivate
|
||||
|
||||
private string stars(int k) {
|
||||
k =
|
||||
[0 .. max([
|
||||
any(RawIndirectInstruction n).getIndirectionIndex(),
|
||||
any(RawIndirectOperand n).getIndirectionIndex()
|
||||
]
|
||||
)] and
|
||||
(if k = 0 then result = "" else result = "*" + stars(k - 1))
|
||||
}
|
||||
|
||||
string starsForNode(Node node) {
|
||||
exists(int indirectionIndex |
|
||||
node.(IndirectInstruction).hasInstructionAndIndirectionIndex(_, indirectionIndex) or
|
||||
node.(IndirectOperand).hasOperandAndIndirectionIndex(_, indirectionIndex)
|
||||
|
|
||||
result = stars(indirectionIndex)
|
||||
)
|
||||
or
|
||||
not node instanceof IndirectInstruction and
|
||||
not node instanceof IndirectOperand and
|
||||
result = ""
|
||||
}
|
||||
|
||||
private Instruction getInstruction(Node n, string stars) {
|
||||
result = [n.asInstruction(), n.(RawIndirectInstruction).getInstruction()] and
|
||||
stars = stars(n)
|
||||
stars = starsForNode(n)
|
||||
}
|
||||
|
||||
private Operand getOperand(Node n, string stars) {
|
||||
result = [n.asOperand(), n.(RawIndirectOperand).getOperand()] and
|
||||
stars = stars(n)
|
||||
stars = starsForNode(n)
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -16,15 +16,6 @@ private module SourceVariables {
|
||||
ind = [0 .. countIndirectionsForCppType(base.getLanguageType()) + 1]
|
||||
}
|
||||
|
||||
private int maxNumberOfIndirections() { result = max(SourceVariable sv | | sv.getIndirection()) }
|
||||
|
||||
private string repeatStars(int n) {
|
||||
n = 0 and result = ""
|
||||
or
|
||||
n = [1 .. maxNumberOfIndirections()] and
|
||||
result = "*" + repeatStars(n - 1)
|
||||
}
|
||||
|
||||
class SourceVariable extends TSourceVariable {
|
||||
SsaInternals0::SourceVariable base;
|
||||
int ind;
|
||||
@@ -41,7 +32,13 @@ private module SourceVariables {
|
||||
SsaInternals0::SourceVariable getBaseVariable() { result = base }
|
||||
|
||||
/** Gets a textual representation of this element. */
|
||||
string toString() { result = repeatStars(this.getIndirection()) + base.toString() }
|
||||
string toString() {
|
||||
ind = 0 and
|
||||
result = this.getBaseVariable().toString()
|
||||
or
|
||||
ind > 0 and
|
||||
result = this.getBaseVariable().toString() + " indirection"
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the number of loads performed on the base source variable
|
||||
@@ -149,16 +146,11 @@ private newtype TDefOrUseImpl =
|
||||
private predicate isGlobalUse(
|
||||
GlobalLikeVariable v, IRFunction f, int indirection, int indirectionIndex
|
||||
) {
|
||||
// Generate a "global use" at the end of the function body if there's a
|
||||
// direct definition somewhere in the body of the function
|
||||
indirection =
|
||||
min(int cand, VariableAddressInstruction vai |
|
||||
vai.getEnclosingIRFunction() = f and
|
||||
vai.getAstVariable() = v and
|
||||
isDef(_, _, _, vai, cand, indirectionIndex)
|
||||
|
|
||||
cand
|
||||
)
|
||||
exists(VariableAddressInstruction vai |
|
||||
vai.getEnclosingIRFunction() = f and
|
||||
vai.getAstVariable() = v and
|
||||
isDef(_, _, _, vai, indirection, indirectionIndex)
|
||||
)
|
||||
}
|
||||
|
||||
private predicate isGlobalDefImpl(
|
||||
@@ -452,57 +444,6 @@ class FinalParameterUse extends UseImpl, TFinalParameterUse {
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* A use that models a synthetic "last use" of a global variable just before a
|
||||
* function returns.
|
||||
*
|
||||
* We model global variable flow by:
|
||||
* - Inserting a last use of any global variable that's modified by a function
|
||||
* - Flowing from the last use to the `VariableNode` that represents the global
|
||||
* variable.
|
||||
* - Flowing from the `VariableNode` to an "initial def" of the global variable
|
||||
* in any function that may read the global variable.
|
||||
* - Flowing from the initial definition to any subsequent uses of the global
|
||||
* variable in the function body.
|
||||
*
|
||||
* For example, consider the following pair of functions:
|
||||
* ```cpp
|
||||
* int global;
|
||||
* int source();
|
||||
* void sink(int);
|
||||
*
|
||||
* void set_global() {
|
||||
* global = source();
|
||||
* }
|
||||
*
|
||||
* void read_global() {
|
||||
* sink(global);
|
||||
* }
|
||||
* ```
|
||||
* we insert global uses and defs so that (from the point-of-view of dataflow)
|
||||
* the above scenario looks like:
|
||||
* ```cpp
|
||||
* int global; // (1)
|
||||
* int source();
|
||||
* void sink(int);
|
||||
*
|
||||
* void set_global() {
|
||||
* global = source();
|
||||
* __global_use(global); // (2)
|
||||
* }
|
||||
*
|
||||
* void read_global() {
|
||||
* global = __global_def; // (3)
|
||||
* sink(global); // (4)
|
||||
* }
|
||||
* ```
|
||||
* and flow from `source()` to the argument of `sink` is then modeled as
|
||||
* follows:
|
||||
* 1. Flow from `source()` to `(2)` (via SSA).
|
||||
* 2. Flow from `(2)` to `(1)` (via a `jumpStep`).
|
||||
* 3. Flow from `(1)` to `(3)` (via a `jumpStep`).
|
||||
* 4. Flow from `(3)` to `(4)` (via SSA).
|
||||
*/
|
||||
class GlobalUse extends UseImpl, TGlobalUse {
|
||||
GlobalLikeVariable global;
|
||||
IRFunction f;
|
||||
@@ -550,12 +491,6 @@ class GlobalUse extends UseImpl, TGlobalUse {
|
||||
override BaseSourceVariableInstruction getBase() { none() }
|
||||
}
|
||||
|
||||
/**
|
||||
* A definition that models a synthetic "initial definition" of a global
|
||||
* variable just after the function entry point.
|
||||
*
|
||||
* See the QLDoc for `GlobalUse` for how this is used.
|
||||
*/
|
||||
class GlobalDefImpl extends DefOrUseImpl, TGlobalDefImpl {
|
||||
GlobalLikeVariable global;
|
||||
IRFunction f;
|
||||
|
||||
@@ -355,13 +355,13 @@ private predicate linearAccessImpl(Expr expr, VariableAccess v, float p, float q
|
||||
* `cmpWithLinearBound(guard, v, Greater(), true)` and
|
||||
* `cmpWithLinearBound(guard, v, Lesser(), false)` hold.
|
||||
* If `guard` is `4 - v > 5` then
|
||||
* `cmpWithLinearBound(guard, v, Lesser(), true)` and
|
||||
* `cmpWithLinearBound(guard, v, Greater(), false)` hold.
|
||||
* `cmpWithLinearBound(guard, v, Lesser(), false)` and
|
||||
* `cmpWithLinearBound(guard, v, Greater(), true)` hold.
|
||||
*
|
||||
* If an actual bound for `v` is needed, use `upperBound` or `lowerBound`.
|
||||
* This predicate can be used if you just want to check whether a variable
|
||||
* is bounded, or to restrict a more expensive analysis to just guards that
|
||||
* bound a variable.
|
||||
* A more sophisticated predicate, such as `boundFromGuard`, is needed
|
||||
* to compute an actual bound for `v`. This predicate can be used if
|
||||
* you just want to check whether a variable is bounded, or to restrict
|
||||
* a more expensive analysis to just guards that bound a variable.
|
||||
*/
|
||||
predicate cmpWithLinearBound(
|
||||
ComparisonOperation guard, VariableAccess v,
|
||||
|
||||
@@ -356,8 +356,6 @@ case @function.kind of
|
||||
| 4 = @conversion_function
|
||||
| 5 = @operator
|
||||
| 6 = @builtin_function // GCC built-in functions, e.g. __builtin___memcpy_chk
|
||||
| 7 = @user_defined_literal
|
||||
| 8 = @deduction_guide
|
||||
;
|
||||
*/
|
||||
|
||||
@@ -939,7 +937,6 @@ case @attribute_arg.kind of
|
||||
| 2 = @attribute_arg_constant
|
||||
| 3 = @attribute_arg_type
|
||||
| 4 = @attribute_arg_constant_expr
|
||||
| 5 = @attribute_arg_expr
|
||||
;
|
||||
|
||||
attribute_arg_value(
|
||||
@@ -954,10 +951,6 @@ attribute_arg_constant(
|
||||
unique int arg: @attribute_arg ref,
|
||||
int constant: @expr ref
|
||||
)
|
||||
attribute_arg_expr(
|
||||
unique int arg: @attribute_arg ref,
|
||||
int expr: @expr ref
|
||||
)
|
||||
attribute_arg_name(
|
||||
unique int arg: @attribute_arg ref,
|
||||
string name: string ref
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -1,6 +1,3 @@
|
||||
description: Remove the old CFG tables
|
||||
compatibility: full
|
||||
|
||||
falsecond.rel: delete
|
||||
successors.rel: delete
|
||||
truecond.rel: delete
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@@ -1,2 +0,0 @@
|
||||
description: Support more function types
|
||||
compatibility: backwards
|
||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@@ -1,2 +0,0 @@
|
||||
description: Support expression attribute arguments
|
||||
compatibility: backwards
|
||||
@@ -1,18 +1,13 @@
|
||||
## 0.9.2
|
||||
## 0.9.1
|
||||
|
||||
### New Queries
|
||||
|
||||
* Added a new query, `cpp/use-of-unique-pointer-after-lifetime-ends`, to detect uses of the contents unique pointers that will be destroyed immediately.
|
||||
* The `cpp/incorrectly-checked-scanf` query has been added. This finds results where the return value of scanf is not checked correctly. Some of these were previously found by `cpp/missing-check-scanf` and will no longer be reported there.
|
||||
|
||||
### Minor Analysis Improvements
|
||||
|
||||
* The `cpp/badly-bounded-write` query could report false positives when a pointer was first initialized with a literal and later assigned a dynamically allocated array. These false positives now no longer occur.
|
||||
|
||||
## 0.9.1
|
||||
|
||||
No user-facing changes.
|
||||
|
||||
## 0.9.0
|
||||
|
||||
### Breaking Changes
|
||||
|
||||
@@ -101,43 +101,35 @@ module ParameterSinks {
|
||||
)
|
||||
}
|
||||
|
||||
private CallInstruction getAnAlwaysReachedCallInstruction() {
|
||||
exists(IRFunction f | result.getBlock().postDominates(f.getEntryBlock()))
|
||||
private CallInstruction getAnAlwaysReachedCallInstruction(IRFunction f) {
|
||||
result.getBlock().postDominates(f.getEntryBlock())
|
||||
}
|
||||
|
||||
pragma[nomagic]
|
||||
private predicate callHasTargetAndArgument(Function f, int i, Instruction argument) {
|
||||
exists(CallInstruction call |
|
||||
call.getStaticCallTarget() = f and
|
||||
call.getArgument(i) = argument and
|
||||
call = getAnAlwaysReachedCallInstruction()
|
||||
)
|
||||
predicate callHasTargetAndArgument(Function f, int i, CallInstruction call, Instruction argument) {
|
||||
call.getStaticCallTarget() = f and
|
||||
call.getArgument(i) = argument
|
||||
}
|
||||
|
||||
pragma[nomagic]
|
||||
private predicate initializeParameterInFunction(Function f, int i) {
|
||||
exists(InitializeParameterInstruction init |
|
||||
pragma[only_bind_out](init.getEnclosingFunction()) = f and
|
||||
init.hasIndex(i) and
|
||||
init = getAnAlwaysDereferencedParameter()
|
||||
)
|
||||
}
|
||||
|
||||
pragma[nomagic]
|
||||
private predicate alwaysDereferencedArgumentHasValueNumber(ValueNumber vn) {
|
||||
exists(int i, Function f, Instruction argument |
|
||||
callHasTargetAndArgument(f, i, argument) and
|
||||
initializeParameterInFunction(pragma[only_bind_into](f), pragma[only_bind_into](i)) and
|
||||
vn.getAnInstruction() = argument
|
||||
)
|
||||
predicate initializeParameterInFunction(Function f, int i, InitializeParameterInstruction init) {
|
||||
pragma[only_bind_out](init.getEnclosingFunction()) = f and
|
||||
init.hasIndex(i)
|
||||
}
|
||||
|
||||
InitializeParameterInstruction getAnAlwaysDereferencedParameter() {
|
||||
result = getAnAlwaysDereferencedParameter0()
|
||||
or
|
||||
exists(ValueNumber vn |
|
||||
alwaysDereferencedArgumentHasValueNumber(vn) and
|
||||
vn.getAnInstruction() = result
|
||||
exists(
|
||||
CallInstruction call, int i, InitializeParameterInstruction p, Instruction argument,
|
||||
Function f
|
||||
|
|
||||
callHasTargetAndArgument(f, i, call, argument) and
|
||||
initializeParameterInFunction(f, i, p) and
|
||||
p = getAnAlwaysDereferencedParameter() and
|
||||
result =
|
||||
pragma[only_bind_out](pragma[only_bind_into](valueNumber(argument)).getAnInstruction()) and
|
||||
call = getAnAlwaysReachedCallInstruction(_)
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,98 +0,0 @@
|
||||
import cpp
|
||||
import semmle.code.cpp.models.implementations.StdContainer
|
||||
|
||||
/**
|
||||
* Holds if `e` will be consumed by its parent as a glvalue and does not have
|
||||
* an lvalue-to-rvalue conversion. This means that it will be materialized into
|
||||
* a temporary object.
|
||||
*/
|
||||
predicate isTemporary(Expr e) {
|
||||
e instanceof TemporaryObjectExpr
|
||||
or
|
||||
e.isPRValueCategory() and
|
||||
e.getUnspecifiedType() instanceof Class and
|
||||
not e.hasLValueToRValueConversion()
|
||||
}
|
||||
|
||||
/** Holds if `e` is written to a container. */
|
||||
predicate isStoredInContainer(Expr e) {
|
||||
exists(StdSequenceContainerInsert insert, Call call, int index |
|
||||
call = insert.getACallToThisFunction() and
|
||||
index = insert.getAValueTypeParameterIndex() and
|
||||
call.getArgument(index) = e
|
||||
)
|
||||
or
|
||||
exists(StdSequenceContainerPush push, Call call, int index |
|
||||
call = push.getACallToThisFunction() and
|
||||
index = push.getAValueTypeParameterIndex() and
|
||||
call.getArgument(index) = e
|
||||
)
|
||||
or
|
||||
exists(StdSequenceEmplace emplace, Call call, int index |
|
||||
call = emplace.getACallToThisFunction() and
|
||||
index = emplace.getAValueTypeParameterIndex() and
|
||||
call.getArgument(index) = e
|
||||
)
|
||||
or
|
||||
exists(StdSequenceEmplaceBack emplaceBack, Call call, int index |
|
||||
call = emplaceBack.getACallToThisFunction() and
|
||||
index = emplaceBack.getAValueTypeParameterIndex() and
|
||||
call.getArgument(index) = e
|
||||
)
|
||||
}
|
||||
|
||||
/**
|
||||
* Holds if `e` or a conversion of `e` has an lvalue-to-rvalue conversion.
|
||||
*/
|
||||
private predicate hasLValueToRValueConversion(Expr e) {
|
||||
e.getConversion*().hasLValueToRValueConversion() and
|
||||
not e instanceof ConditionalExpr // ConditionalExpr may be spuriously reported as having an lvalue-to-rvalue conversion
|
||||
}
|
||||
|
||||
/**
|
||||
* Holds if the value of `e` outlives the enclosing full expression. For
|
||||
* example, because the value is stored in a local variable.
|
||||
*/
|
||||
predicate outlivesFullExpr(Expr e) {
|
||||
not hasLValueToRValueConversion(e) and
|
||||
(
|
||||
any(Assignment assign).getRValue() = e
|
||||
or
|
||||
any(Variable v).getInitializer().getExpr() = e
|
||||
or
|
||||
any(ReturnStmt ret).getExpr() = e
|
||||
or
|
||||
exists(ConditionalExpr cond |
|
||||
outlivesFullExpr(cond) and
|
||||
[cond.getThen(), cond.getElse()] = e
|
||||
)
|
||||
or
|
||||
exists(BinaryOperation bin |
|
||||
outlivesFullExpr(bin) and
|
||||
bin.getAnOperand() = e and
|
||||
not bin instanceof ComparisonOperation
|
||||
)
|
||||
or
|
||||
exists(PointerFieldAccess fa |
|
||||
outlivesFullExpr(fa) and
|
||||
fa.getQualifier() = e
|
||||
)
|
||||
or
|
||||
exists(AddressOfExpr ao |
|
||||
outlivesFullExpr(ao) and
|
||||
ao.getOperand() = e
|
||||
)
|
||||
or
|
||||
exists(ClassAggregateLiteral aggr |
|
||||
outlivesFullExpr(aggr) and
|
||||
aggr.getAFieldExpr(_) = e
|
||||
)
|
||||
or
|
||||
exists(ArrayAggregateLiteral aggr |
|
||||
outlivesFullExpr(aggr) and
|
||||
aggr.getAnElementExpr(_) = e
|
||||
)
|
||||
or
|
||||
isStoredInContainer(e)
|
||||
)
|
||||
}
|
||||
@@ -14,7 +14,81 @@
|
||||
|
||||
import cpp
|
||||
import semmle.code.cpp.models.implementations.StdString
|
||||
import Temporaries
|
||||
import semmle.code.cpp.models.implementations.StdContainer
|
||||
|
||||
/**
|
||||
* Holds if `e` will be consumed by its parent as a glvalue and does not have
|
||||
* an lvalue-to-rvalue conversion. This means that it will be materialized into
|
||||
* a temporary object.
|
||||
*/
|
||||
predicate isTemporary(Expr e) {
|
||||
e instanceof TemporaryObjectExpr
|
||||
or
|
||||
e.isPRValueCategory() and
|
||||
e.getUnspecifiedType() instanceof Class and
|
||||
not e.hasLValueToRValueConversion()
|
||||
}
|
||||
|
||||
/** Holds if `e` is written to a container. */
|
||||
predicate isStoredInContainer(Expr e) {
|
||||
exists(StdSequenceContainerInsert insert, Call call, int index |
|
||||
call = insert.getACallToThisFunction() and
|
||||
index = insert.getAValueTypeParameterIndex() and
|
||||
call.getArgument(index) = e
|
||||
)
|
||||
or
|
||||
exists(StdSequenceContainerPush push, Call call, int index |
|
||||
call = push.getACallToThisFunction() and
|
||||
index = push.getAValueTypeParameterIndex() and
|
||||
call.getArgument(index) = e
|
||||
)
|
||||
or
|
||||
exists(StdSequenceEmplace emplace, Call call, int index |
|
||||
call = emplace.getACallToThisFunction() and
|
||||
index = emplace.getAValueTypeParameterIndex() and
|
||||
call.getArgument(index) = e
|
||||
)
|
||||
or
|
||||
exists(StdSequenceEmplaceBack emplaceBack, Call call, int index |
|
||||
call = emplaceBack.getACallToThisFunction() and
|
||||
index = emplaceBack.getAValueTypeParameterIndex() and
|
||||
call.getArgument(index) = e
|
||||
)
|
||||
}
|
||||
|
||||
/**
|
||||
* Holds if the value of `e` outlives the enclosing full expression. For
|
||||
* example, because the value is stored in a local variable.
|
||||
*/
|
||||
predicate outlivesFullExpr(Expr e) {
|
||||
any(Assignment assign).getRValue() = e
|
||||
or
|
||||
any(Variable v).getInitializer().getExpr() = e
|
||||
or
|
||||
any(ReturnStmt ret).getExpr() = e
|
||||
or
|
||||
exists(ConditionalExpr cond |
|
||||
outlivesFullExpr(cond) and
|
||||
[cond.getThen(), cond.getElse()] = e
|
||||
)
|
||||
or
|
||||
exists(BinaryOperation bin |
|
||||
outlivesFullExpr(bin) and
|
||||
bin.getAnOperand() = e
|
||||
)
|
||||
or
|
||||
exists(ClassAggregateLiteral aggr |
|
||||
outlivesFullExpr(aggr) and
|
||||
aggr.getAFieldExpr(_) = e
|
||||
)
|
||||
or
|
||||
exists(ArrayAggregateLiteral aggr |
|
||||
outlivesFullExpr(aggr) and
|
||||
aggr.getAnElementExpr(_) = e
|
||||
)
|
||||
or
|
||||
isStoredInContainer(e)
|
||||
}
|
||||
|
||||
from Call c
|
||||
where
|
||||
|
||||
@@ -1,44 +0,0 @@
|
||||
<!DOCTYPE qhelp PUBLIC
|
||||
"-//Semmle//qhelp//EN"
|
||||
"qhelp.dtd">
|
||||
<qhelp>
|
||||
|
||||
<overview>
|
||||
<p>Calling <code>get</code> on a <code>std::unique_ptr</code> object returns a pointer to the underlying allocations.
|
||||
When the <code>std::unique_ptr</code> object is destroyed, the pointer returned by <code>get</code> is no
|
||||
longer valid. If the pointer is used after the <code>std::unique_ptr</code> object is destroyed, then the behavior is undefined.
|
||||
</p>
|
||||
</overview>
|
||||
|
||||
<recommendation>
|
||||
<p>
|
||||
Ensure that the pointer returned by <code>get</code> does not outlive the underlying <code>std::unique_ptr</code> object.
|
||||
</p>
|
||||
</recommendation>
|
||||
|
||||
<example>
|
||||
<p>
|
||||
The following example gets a <code>std::unique_ptr</code> object, and then converts the resulting unique pointer to a
|
||||
pointer using <code>get</code> so that it can be passed to the <code>work</code> function.
|
||||
|
||||
However, the <code>std::unique_ptr</code> object is destroyed as soon as the call
|
||||
to <code>get</code> returns. This means that <code>work</code> is given a pointer to invalid memory.
|
||||
</p>
|
||||
|
||||
<sample src="UseOfUniquePointerAfterLifetimeEndsBad.cpp" />
|
||||
|
||||
<p>
|
||||
The following example fixes the above code by ensuring that the pointer returned by the call to <code>get</code> does
|
||||
not outlive the underlying <code>std::unique_ptr</code> objects. This ensures that the pointer passed to <code>work</code>
|
||||
points to valid memory.
|
||||
</p>
|
||||
|
||||
<sample src="UseOfUniquePointerAfterLifetimeEndsGood.cpp" />
|
||||
|
||||
</example>
|
||||
<references>
|
||||
|
||||
<li><a href="https://wiki.sei.cmu.edu/confluence/display/cplusplus/MEM50-CPP.+Do+not+access+freed+memory">MEM50-CPP. Do not access freed memory</a>.</li>
|
||||
|
||||
</references>
|
||||
</qhelp>
|
||||
@@ -1,36 +0,0 @@
|
||||
/**
|
||||
* @name Use of unique pointer after lifetime ends
|
||||
* @description Referencing the contents of a unique pointer after the underlying object has expired may lead to unexpected behavior.
|
||||
* @kind problem
|
||||
* @precision high
|
||||
* @id cpp/use-of-unique-pointer-after-lifetime-ends
|
||||
* @problem.severity warning
|
||||
* @security-severity 8.8
|
||||
* @tags reliability
|
||||
* security
|
||||
* external/cwe/cwe-416
|
||||
* external/cwe/cwe-664
|
||||
*/
|
||||
|
||||
import cpp
|
||||
import semmle.code.cpp.models.interfaces.PointerWrapper
|
||||
import Temporaries
|
||||
|
||||
predicate isUniquePointerDerefFunction(Function f) {
|
||||
exists(PointerWrapper wrapper |
|
||||
f = wrapper.getAnUnwrapperFunction() and
|
||||
// We only want unique pointers as the memory behind share pointers may still be
|
||||
// alive after the shared pointer is destroyed.
|
||||
wrapper.(Class).hasQualifiedName(["std", "bsl"], "unique_ptr")
|
||||
)
|
||||
}
|
||||
|
||||
from Call c
|
||||
where
|
||||
outlivesFullExpr(c) and
|
||||
not c.isFromUninstantiatedTemplate(_) and
|
||||
isUniquePointerDerefFunction(c.getTarget()) and
|
||||
isTemporary(c.getQualifier().getFullyConverted())
|
||||
select c,
|
||||
"The underlying unique pointer object is destroyed after the call to '" + c.getTarget() +
|
||||
"' returns."
|
||||
@@ -1,10 +0,0 @@
|
||||
#include <memory>
|
||||
std::unique_ptr<T> getUniquePointer();
|
||||
void work(const T*);
|
||||
|
||||
// BAD: the unique pointer is deallocated when `get` returns. So `work`
|
||||
// is given a pointer to invalid memory.
|
||||
void work_with_unique_ptr_bad() {
|
||||
const T* combined_string = getUniquePointer().get();
|
||||
work(combined_string);
|
||||
}
|
||||
@@ -1,10 +0,0 @@
|
||||
#include <memory>
|
||||
std::unique_ptr<T> getUniquePointer();
|
||||
void work(const T*);
|
||||
|
||||
// GOOD: the unique pointer outlives the call to `work`. So the pointer
|
||||
// obtainted from `get` is valid.
|
||||
void work_with_unique_ptr_good() {
|
||||
auto combined_string = getUniquePointer();
|
||||
work(combined_string.get());
|
||||
}
|
||||
@@ -1,4 +0,0 @@
|
||||
---
|
||||
category: minorAnalysis
|
||||
---
|
||||
* The `cpp/include-non-header` style query will now ignore the `.def` extension for textual header inclusions.
|
||||
@@ -1,3 +1,9 @@
|
||||
## 0.9.1
|
||||
|
||||
No user-facing changes.
|
||||
### New Queries
|
||||
|
||||
* The `cpp/incorrectly-checked-scanf` query has been added. This finds results where the return value of scanf is not checked correctly. Some of these were previously found by `cpp/missing-check-scanf` and will no longer be reported there.
|
||||
|
||||
### Minor Analysis Improvements
|
||||
|
||||
* The `cpp/badly-bounded-write` query could report false positives when a pointer was first initialized with a literal and later assigned a dynamically allocated array. These false positives now no longer occur.
|
||||
|
||||
@@ -1,10 +0,0 @@
|
||||
## 0.9.2
|
||||
|
||||
### New Queries
|
||||
|
||||
* Added a new query, `cpp/use-of-unique-pointer-after-lifetime-ends`, to detect uses of the contents unique pointers that will be destroyed immediately.
|
||||
* The `cpp/incorrectly-checked-scanf` query has been added. This finds results where the return value of scanf is not checked correctly. Some of these were previously found by `cpp/missing-check-scanf` and will no longer be reported there.
|
||||
|
||||
### Minor Analysis Improvements
|
||||
|
||||
* The `cpp/badly-bounded-write` query could report false positives when a pointer was first initialized with a literal and later assigned a dynamically allocated array. These false positives now no longer occur.
|
||||
@@ -1,2 +1,2 @@
|
||||
---
|
||||
lastReleaseVersion: 0.9.2
|
||||
lastReleaseVersion: 0.9.1
|
||||
|
||||
@@ -60,7 +60,7 @@ predicate computeHeuristicType(Type t) {
|
||||
|
||||
/**
|
||||
* Holds if `e` is an operation that is common in encryption-like computations.
|
||||
* Looking for clusters of these tends to find things like encryption,
|
||||
* Looking for clusters of these tends to find things like encrpytion,
|
||||
* compression, random number generation, graphics processing and other compute
|
||||
* heavy algorithms.
|
||||
*/
|
||||
|
||||
@@ -18,7 +18,6 @@ from Include i, File f, string extension
|
||||
where
|
||||
f = i.getIncludedFile() and
|
||||
extension = f.getExtension().toLowerCase() and
|
||||
extension != "def" and
|
||||
extension != "inc" and
|
||||
extension != "inl" and
|
||||
extension != "tcc" and
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
name: codeql/cpp-queries
|
||||
version: 0.9.3-dev
|
||||
version: 0.9.2-dev
|
||||
groups:
|
||||
- cpp
|
||||
- queries
|
||||
|
||||
@@ -1,7 +1,6 @@
|
||||
| b.c:5:3:5:34 | return ... | 10 |
|
||||
| c.c:2:3:2:20 | return ... | 5 |
|
||||
| e.c:2:3:2:19 | return ... | 17 |
|
||||
| g.c:3:3:3:12 | return ... | 20 |
|
||||
| i.c:3:3:3:12 | return ... | 30 |
|
||||
| i.c:8:3:8:12 | return ... | 31 |
|
||||
| i.c:13:3:13:12 | return ... | 32 |
|
||||
|
||||
@@ -3,4 +3,4 @@ static int g() {
|
||||
return 20;
|
||||
}
|
||||
#endif
|
||||
// semmle-extractor-options: --clang -include-pch ${testdir}/clang-pch.testproj/f.pch
|
||||
// semmle-extractor-options: --clang -include-pch ${testdir}/clang-pch.testproj/f.pch --expect_errors
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
#ifdef SEEN_H
|
||||
static int h() {
|
||||
return 30;
|
||||
return 30; // [FALSE POSITIVE] (#pragma hdrstop bug, SEEN_H should not be defined in the precompiled header)
|
||||
}
|
||||
#endif
|
||||
#ifdef H1
|
||||
@@ -10,7 +10,7 @@ static int h1() {
|
||||
#endif
|
||||
#ifdef H2
|
||||
static int h2() {
|
||||
return 32;
|
||||
return 32; // [FALSE POSITIVE] (#pragma hdrstop bug, H2 should not be defined in the precompiled header)
|
||||
}
|
||||
#endif
|
||||
// semmle-extractor-options: --clang -include-pch ${testdir}/clang-pch.testproj/h.pch
|
||||
|
||||
@@ -0,0 +1,2 @@
|
||||
__builtin_foobar(i)i
|
||||
__builtin_malloc(i,i,i,f*)f
|
||||
@@ -0,0 +1,4 @@
|
||||
| file://:0:0:0:0 | __builtin_add_overflow | true | 0 | file://:0:0:0:0 | bool |
|
||||
| file://:0:0:0:0 | __builtin_foobar | true | 1 | file://:0:0:0:0 | int |
|
||||
| file://:0:0:0:0 | __builtin_malloc | true | 4 | file://:0:0:0:0 | float |
|
||||
| test.c:1:6:1:6 | f | false | 3 | file://:0:0:0:0 | long |
|
||||
@@ -0,0 +1,5 @@
|
||||
import cpp
|
||||
|
||||
from Function f, boolean isBuiltin
|
||||
where if f instanceof BuiltInFunction then isBuiltin = true else isBuiltin = false
|
||||
select f, isBuiltin, f.getNumberOfParameters(), f.getType()
|
||||
20
cpp/ql/test/library-tests/builtins/functions_file/test.c
Normal file
20
cpp/ql/test/library-tests/builtins/functions_file/test.c
Normal file
@@ -0,0 +1,20 @@
|
||||
long f(int a, int b, int c) {
|
||||
// A builtin from the builtin_functions_file.
|
||||
int i1 = __builtin_foobar(a);
|
||||
|
||||
// A builtin that's not in the file, but the extractor should handle, given the
|
||||
// --gnu_version flag we pass in.
|
||||
int i2;
|
||||
__builtin_add_overflow(a, b, &i2);
|
||||
|
||||
// A builtin that would normally be defined by the extractor with a type
|
||||
// expecting it to be called like this:
|
||||
//void* x = __builtin_malloc(a);
|
||||
// But we override the type in the builtin_functions_file so it's called like
|
||||
// this:
|
||||
float f1, f2;
|
||||
f1 = __builtin_malloc(a, b, c, &f2);
|
||||
|
||||
return 42;
|
||||
}
|
||||
// semmle-extractor-options: --gnu_version 50100 --edg --builtin_functions_file --edg ${testdir}/builtins.txt
|
||||
@@ -1,388 +1,384 @@
|
||||
| C::C | false | 499 | 499 | C |
|
||||
| C::C | false | 690 | 690 | C |
|
||||
| C::operator= | false | 681 | 681 | operator= |
|
||||
| C::~C | false | 647 | 647 | ~C |
|
||||
| Error::Error | false | 205 | 205 | Error |
|
||||
| Error::Error | false | 219 | 219 | Error |
|
||||
| Error::Error | false | 224 | 224 | return ... |
|
||||
| Error::Error | false | 226 | 226 | { ... } |
|
||||
| Error::Error | true | 224 | 219 | |
|
||||
| Error::Error | true | 226 | 224 | |
|
||||
| Error::operator= | false | 197 | 197 | operator= |
|
||||
| Error::~Error | false | 209 | 209 | ~Error |
|
||||
| Error::~Error | false | 215 | 215 | return ... |
|
||||
| Error::~Error | false | 217 | 217 | { ... } |
|
||||
| Error::~Error | true | 215 | 209 | |
|
||||
| Error::~Error | true | 217 | 215 | |
|
||||
| __va_list_tag::operator= | false | 66 | 66 | operator= |
|
||||
| __va_list_tag::operator= | false | 72 | 72 | operator= |
|
||||
| f | false | 483 | 483 | f |
|
||||
| f | false | 494 | 494 | declaration |
|
||||
| f | false | 497 | 497 | call to C |
|
||||
| f | false | 502 | 502 | 101 |
|
||||
| f | false | 503 | 503 | initializer for c101 |
|
||||
| f | false | 506 | 506 | __try { ... } __except( ... ) { ... } |
|
||||
| f | false | 509 | 509 | call to C |
|
||||
| f | false | 513 | 513 | 102 |
|
||||
| f | false | 514 | 514 | initializer for c102 |
|
||||
| f | false | 518 | 518 | call to C |
|
||||
| f | false | 522 | 522 | 103 |
|
||||
| f | false | 523 | 523 | initializer for c103 |
|
||||
| f | false | 526 | 526 | declaration |
|
||||
| f | false | 528 | 528 | if (...) ... |
|
||||
| f | false | 530 | 530 | b1 |
|
||||
| f | false | 532 | 532 | (bool)... |
|
||||
| f | false | 533 | 533 | ExprStmt |
|
||||
| f | false | 537 | 537 | 1 |
|
||||
| f | false | 538 | 538 | throw ... |
|
||||
| f | false | 540 | 540 | { ... } |
|
||||
| f | false | 542 | 542 | declaration |
|
||||
| f | false | 544 | 544 | { ... } |
|
||||
| f | false | 551 | 551 | 1 |
|
||||
| C::C | false | 493 | 493 | C |
|
||||
| C::C | false | 682 | 682 | C |
|
||||
| C::operator= | false | 675 | 675 | operator= |
|
||||
| C::~C | false | 614 | 614 | ~C |
|
||||
| Error::Error | false | 259 | 259 | Error |
|
||||
| Error::Error | false | 272 | 272 | Error |
|
||||
| Error::Error | false | 277 | 277 | return ... |
|
||||
| Error::Error | false | 279 | 279 | { ... } |
|
||||
| Error::Error | true | 277 | 272 | |
|
||||
| Error::Error | true | 279 | 277 | |
|
||||
| Error::operator= | false | 253 | 253 | operator= |
|
||||
| Error::~Error | false | 263 | 263 | ~Error |
|
||||
| Error::~Error | false | 268 | 268 | return ... |
|
||||
| Error::~Error | false | 270 | 270 | { ... } |
|
||||
| Error::~Error | true | 268 | 263 | |
|
||||
| Error::~Error | true | 270 | 268 | |
|
||||
| __va_list_tag::operator= | false | 140 | 140 | operator= |
|
||||
| __va_list_tag::operator= | false | 147 | 147 | operator= |
|
||||
| f | false | 477 | 477 | f |
|
||||
| f | false | 488 | 488 | declaration |
|
||||
| f | false | 491 | 491 | call to C |
|
||||
| f | false | 496 | 496 | 102 |
|
||||
| f | false | 497 | 497 | initializer for c102 |
|
||||
| f | false | 501 | 501 | call to C |
|
||||
| f | false | 505 | 505 | 103 |
|
||||
| f | false | 506 | 506 | initializer for c103 |
|
||||
| f | false | 509 | 509 | declaration |
|
||||
| f | false | 511 | 511 | b1 |
|
||||
| f | false | 513 | 513 | (bool)... |
|
||||
| f | false | 516 | 516 | 1 |
|
||||
| f | false | 517 | 517 | throw ... |
|
||||
| f | false | 519 | 519 | ExprStmt |
|
||||
| f | false | 521 | 521 | { ... } |
|
||||
| f | false | 523 | 523 | if (...) ... |
|
||||
| f | false | 525 | 525 | declaration |
|
||||
| f | false | 527 | 527 | { ... } |
|
||||
| f | false | 534 | 534 | 1 |
|
||||
| f | false | 536 | 536 | call to C |
|
||||
| f | false | 540 | 540 | 104 |
|
||||
| f | false | 541 | 541 | initializer for c104 |
|
||||
| f | false | 544 | 544 | declaration |
|
||||
| f | false | 546 | 546 | { ... } |
|
||||
| f | false | 548 | 548 | __try { ... } __except( ... ) { ... } |
|
||||
| f | false | 550 | 550 | declaration |
|
||||
| f | false | 553 | 553 | call to C |
|
||||
| f | false | 557 | 557 | 104 |
|
||||
| f | false | 558 | 558 | initializer for c104 |
|
||||
| f | false | 561 | 561 | declaration |
|
||||
| f | false | 563 | 563 | { ... } |
|
||||
| f | false | 565 | 565 | declaration |
|
||||
| f | false | 568 | 568 | call to C |
|
||||
| f | false | 572 | 572 | 105 |
|
||||
| f | false | 573 | 573 | initializer for c105 |
|
||||
| f | false | 576 | 576 | __try { ... } __finally { ... } |
|
||||
| f | false | 579 | 579 | call to C |
|
||||
| f | false | 583 | 583 | 106 |
|
||||
| f | false | 584 | 584 | initializer for c106 |
|
||||
| f | false | 588 | 588 | call to C |
|
||||
| f | false | 592 | 592 | 107 |
|
||||
| f | false | 593 | 593 | initializer for c107 |
|
||||
| f | false | 596 | 596 | declaration |
|
||||
| f | false | 598 | 598 | if (...) ... |
|
||||
| f | false | 600 | 600 | b2 |
|
||||
| f | false | 602 | 602 | (bool)... |
|
||||
| f | false | 603 | 603 | ExprStmt |
|
||||
| f | false | 607 | 607 | 2 |
|
||||
| f | false | 608 | 608 | throw ... |
|
||||
| f | false | 610 | 610 | { ... } |
|
||||
| f | false | 612 | 612 | declaration |
|
||||
| f | false | 614 | 614 | { ... } |
|
||||
| f | false | 617 | 617 | call to C |
|
||||
| f | false | 621 | 621 | 108 |
|
||||
| f | false | 622 | 622 | initializer for c108 |
|
||||
| f | false | 625 | 625 | declaration |
|
||||
| f | false | 627 | 627 | { ... } |
|
||||
| f | false | 629 | 629 | declaration |
|
||||
| f | false | 632 | 632 | call to C |
|
||||
| f | false | 636 | 636 | 109 |
|
||||
| f | false | 637 | 637 | initializer for c109 |
|
||||
| f | false | 640 | 640 | return ... |
|
||||
| f | false | 642 | 642 | { ... } |
|
||||
| f | false | 644 | 644 | c104 |
|
||||
| f | false | 646 | 646 | call to c104.~C |
|
||||
| f | false | 648 | 648 | c101 |
|
||||
| f | false | 650 | 650 | call to c101.~C |
|
||||
| f | false | 651 | 651 | c102 |
|
||||
| f | false | 653 | 653 | call to c102.~C |
|
||||
| f | false | 654 | 654 | c103 |
|
||||
| f | false | 655 | 655 | call to c103.~C |
|
||||
| f | false | 656 | 656 | c102 |
|
||||
| f | false | 657 | 657 | call to c102.~C |
|
||||
| f | false | 658 | 658 | c101 |
|
||||
| f | false | 659 | 659 | call to c101.~C |
|
||||
| f | false | 660 | 660 | c105 |
|
||||
| f | false | 661 | 661 | call to c105.~C |
|
||||
| f | false | 662 | 662 | c108 |
|
||||
| f | false | 664 | 664 | call to c108.~C |
|
||||
| f | false | 665 | 665 | c106 |
|
||||
| f | false | 667 | 667 | call to c106.~C |
|
||||
| f | false | 668 | 668 | c107 |
|
||||
| f | false | 669 | 669 | call to c107.~C |
|
||||
| f | false | 670 | 670 | c106 |
|
||||
| f | false | 671 | 671 | call to c106.~C |
|
||||
| f | false | 672 | 672 | c101 |
|
||||
| f | false | 673 | 673 | call to c101.~C |
|
||||
| f | false | 674 | 674 | c105 |
|
||||
| f | false | 675 | 675 | call to c105.~C |
|
||||
| f | false | 676 | 676 | c109 |
|
||||
| f | false | 677 | 677 | call to c109.~C |
|
||||
| f | true | 494 | 503 | |
|
||||
| f | true | 497 | 506 | |
|
||||
| f | true | 502 | 497 | |
|
||||
| f | true | 503 | 502 | |
|
||||
| f | true | 506 | 544 | |
|
||||
| f | true | 509 | 528 | |
|
||||
| f | true | 513 | 509 | |
|
||||
| f | true | 514 | 513 | |
|
||||
| f | true | 518 | 654 | |
|
||||
| f | true | 522 | 518 | |
|
||||
| f | true | 523 | 522 | |
|
||||
| f | true | 526 | 514 | |
|
||||
| f | true | 528 | 530 | |
|
||||
| f | true | 530 | 540 | T |
|
||||
| f | true | 530 | 542 | F |
|
||||
| f | true | 533 | 537 | |
|
||||
| f | true | 537 | 538 | |
|
||||
| f | true | 538 | 656 | |
|
||||
| f | true | 540 | 533 | |
|
||||
| f | true | 542 | 523 | |
|
||||
| f | true | 544 | 526 | |
|
||||
| f | true | 551 | 563 | T |
|
||||
| f | true | 553 | 644 | |
|
||||
| f | false | 557 | 557 | 106 |
|
||||
| f | false | 558 | 558 | initializer for c106 |
|
||||
| f | false | 562 | 562 | call to C |
|
||||
| f | false | 566 | 566 | 107 |
|
||||
| f | false | 567 | 567 | initializer for c107 |
|
||||
| f | false | 570 | 570 | declaration |
|
||||
| f | false | 572 | 572 | b2 |
|
||||
| f | false | 574 | 574 | (bool)... |
|
||||
| f | false | 577 | 577 | 2 |
|
||||
| f | false | 578 | 578 | throw ... |
|
||||
| f | false | 580 | 580 | ExprStmt |
|
||||
| f | false | 582 | 582 | { ... } |
|
||||
| f | false | 584 | 584 | if (...) ... |
|
||||
| f | false | 586 | 586 | declaration |
|
||||
| f | false | 588 | 588 | { ... } |
|
||||
| f | false | 591 | 591 | call to C |
|
||||
| f | false | 595 | 595 | 108 |
|
||||
| f | false | 596 | 596 | initializer for c108 |
|
||||
| f | false | 599 | 599 | declaration |
|
||||
| f | false | 601 | 601 | { ... } |
|
||||
| f | false | 603 | 603 | __try { ... } __finally { ... } |
|
||||
| f | false | 605 | 605 | declaration |
|
||||
| f | false | 607 | 607 | return ... |
|
||||
| f | false | 609 | 609 | { ... } |
|
||||
| f | false | 611 | 611 | c101 |
|
||||
| f | false | 613 | 613 | call to c101.~C |
|
||||
| f | false | 615 | 615 | c105 |
|
||||
| f | false | 616 | 616 | call to c105.~C |
|
||||
| f | false | 617 | 617 | c109 |
|
||||
| f | false | 618 | 618 | call to c109.~C |
|
||||
| f | false | 619 | 619 | c101 |
|
||||
| f | false | 620 | 620 | call to c101.~C |
|
||||
| f | false | 621 | 621 | c105 |
|
||||
| f | false | 622 | 622 | call to c105.~C |
|
||||
| f | false | 623 | 623 | c108 |
|
||||
| f | false | 625 | 625 | call to c108.~C |
|
||||
| f | false | 626 | 626 | c106 |
|
||||
| f | false | 628 | 628 | call to c106.~C |
|
||||
| f | false | 629 | 629 | c107 |
|
||||
| f | false | 630 | 630 | call to c107.~C |
|
||||
| f | false | 631 | 631 | c106 |
|
||||
| f | false | 632 | 632 | call to c106.~C |
|
||||
| f | false | 633 | 633 | c104 |
|
||||
| f | false | 635 | 635 | call to c104.~C |
|
||||
| f | false | 636 | 636 | c102 |
|
||||
| f | false | 638 | 638 | call to c102.~C |
|
||||
| f | false | 639 | 639 | c103 |
|
||||
| f | false | 640 | 640 | call to c103.~C |
|
||||
| f | false | 641 | 641 | c102 |
|
||||
| f | false | 642 | 642 | call to c102.~C |
|
||||
| f | false | 644 | 644 | call to C |
|
||||
| f | false | 648 | 648 | 101 |
|
||||
| f | false | 649 | 649 | initializer for c101 |
|
||||
| f | false | 653 | 653 | call to C |
|
||||
| f | false | 657 | 657 | 105 |
|
||||
| f | false | 658 | 658 | initializer for c105 |
|
||||
| f | false | 662 | 662 | call to C |
|
||||
| f | false | 666 | 666 | 109 |
|
||||
| f | false | 667 | 667 | initializer for c109 |
|
||||
| f | true | 488 | 649 | |
|
||||
| f | true | 491 | 523 | |
|
||||
| f | true | 496 | 491 | |
|
||||
| f | true | 497 | 496 | |
|
||||
| f | true | 501 | 639 | |
|
||||
| f | true | 505 | 501 | |
|
||||
| f | true | 506 | 505 | |
|
||||
| f | true | 509 | 497 | |
|
||||
| f | true | 511 | 521 | T |
|
||||
| f | true | 511 | 525 | F |
|
||||
| f | true | 516 | 517 | |
|
||||
| f | true | 517 | 641 | |
|
||||
| f | true | 519 | 516 | |
|
||||
| f | true | 521 | 519 | |
|
||||
| f | true | 523 | 511 | |
|
||||
| f | true | 525 | 506 | |
|
||||
| f | true | 527 | 509 | |
|
||||
| f | true | 534 | 546 | T |
|
||||
| f | true | 536 | 633 | |
|
||||
| f | true | 540 | 536 | |
|
||||
| f | true | 541 | 540 | |
|
||||
| f | true | 544 | 541 | |
|
||||
| f | true | 546 | 544 | |
|
||||
| f | true | 548 | 527 | |
|
||||
| f | true | 550 | 658 | |
|
||||
| f | true | 553 | 584 | |
|
||||
| f | true | 557 | 553 | |
|
||||
| f | true | 558 | 557 | |
|
||||
| f | true | 561 | 558 | |
|
||||
| f | true | 563 | 561 | |
|
||||
| f | true | 565 | 573 | |
|
||||
| f | true | 568 | 576 | |
|
||||
| f | true | 572 | 568 | |
|
||||
| f | true | 573 | 572 | |
|
||||
| f | true | 576 | 614 | |
|
||||
| f | true | 579 | 598 | |
|
||||
| f | true | 583 | 579 | |
|
||||
| f | true | 584 | 583 | |
|
||||
| f | true | 588 | 668 | |
|
||||
| f | true | 592 | 588 | |
|
||||
| f | true | 593 | 592 | |
|
||||
| f | true | 596 | 584 | |
|
||||
| f | true | 598 | 600 | |
|
||||
| f | true | 600 | 610 | T |
|
||||
| f | true | 600 | 612 | F |
|
||||
| f | true | 603 | 607 | |
|
||||
| f | true | 607 | 608 | |
|
||||
| f | true | 608 | 670 | |
|
||||
| f | true | 610 | 603 | |
|
||||
| f | true | 612 | 593 | |
|
||||
| f | true | 614 | 596 | |
|
||||
| f | true | 617 | 662 | |
|
||||
| f | true | 621 | 617 | |
|
||||
| f | true | 622 | 621 | |
|
||||
| f | true | 625 | 622 | |
|
||||
| f | true | 627 | 625 | |
|
||||
| f | true | 629 | 637 | |
|
||||
| f | true | 632 | 640 | |
|
||||
| f | true | 636 | 632 | |
|
||||
| f | true | 637 | 636 | |
|
||||
| f | true | 640 | 676 | |
|
||||
| f | true | 642 | 494 | |
|
||||
| f | true | 644 | 646 | |
|
||||
| f | true | 646 | 565 | |
|
||||
| f | true | 648 | 650 | |
|
||||
| f | true | 650 | 483 | |
|
||||
| f | true | 651 | 653 | |
|
||||
| f | true | 653 | 565 | |
|
||||
| f | true | 654 | 655 | |
|
||||
| f | true | 655 | 651 | |
|
||||
| f | true | 656 | 657 | |
|
||||
| f | true | 657 | 551 | |
|
||||
| f | true | 658 | 659 | |
|
||||
| f | true | 659 | 483 | |
|
||||
| f | true | 660 | 661 | |
|
||||
| f | true | 661 | 658 | |
|
||||
| f | true | 662 | 664 | |
|
||||
| f | true | 664 | 629 | |
|
||||
| f | true | 664 | 660 | |
|
||||
| f | true | 665 | 667 | |
|
||||
| f | true | 667 | 627 | |
|
||||
| f | true | 668 | 669 | |
|
||||
| f | true | 669 | 665 | |
|
||||
| f | true | 670 | 671 | |
|
||||
| f | true | 671 | 627 | |
|
||||
| f | true | 672 | 673 | |
|
||||
| f | true | 673 | 483 | |
|
||||
| f | true | 674 | 675 | |
|
||||
| f | true | 675 | 672 | |
|
||||
| f | true | 676 | 677 | |
|
||||
| f | true | 677 | 674 | |
|
||||
| f1 | false | 287 | 287 | f1 |
|
||||
| f2 | false | 294 | 294 | f2 |
|
||||
| f3 | false | 299 | 299 | f3 |
|
||||
| f4 | false | 304 | 304 | f4 |
|
||||
| f4 | false | 422 | 422 | return ... |
|
||||
| f4 | false | 424 | 424 | { ... } |
|
||||
| f4 | true | 422 | 304 | |
|
||||
| f4 | true | 424 | 422 | |
|
||||
| f5 | false | 309 | 309 | f5 |
|
||||
| f5 | false | 409 | 409 | ExprStmt |
|
||||
| f5 | false | 413 | 413 | 3 |
|
||||
| f5 | false | 414 | 414 | throw ... |
|
||||
| f5 | false | 416 | 416 | { ... } |
|
||||
| f5 | true | 409 | 413 | |
|
||||
| f5 | true | 413 | 414 | |
|
||||
| f5 | true | 414 | 309 | |
|
||||
| f5 | true | 416 | 409 | |
|
||||
| fun | false | 276 | 276 | fun |
|
||||
| fun | false | 281 | 281 | try { ... } |
|
||||
| fun | false | 283 | 283 | try { ... } |
|
||||
| fun | false | 285 | 285 | ExprStmt |
|
||||
| fun | false | 290 | 290 | call to f1 |
|
||||
| fun | false | 292 | 292 | ExprStmt |
|
||||
| fun | false | 295 | 295 | call to f2 |
|
||||
| f | true | 562 | 629 | |
|
||||
| f | true | 566 | 562 | |
|
||||
| f | true | 567 | 566 | |
|
||||
| f | true | 570 | 558 | |
|
||||
| f | true | 572 | 582 | T |
|
||||
| f | true | 572 | 586 | F |
|
||||
| f | true | 577 | 578 | |
|
||||
| f | true | 578 | 631 | |
|
||||
| f | true | 580 | 577 | |
|
||||
| f | true | 582 | 580 | |
|
||||
| f | true | 584 | 572 | |
|
||||
| f | true | 586 | 567 | |
|
||||
| f | true | 588 | 570 | |
|
||||
| f | true | 591 | 623 | |
|
||||
| f | true | 595 | 591 | |
|
||||
| f | true | 596 | 595 | |
|
||||
| f | true | 599 | 596 | |
|
||||
| f | true | 601 | 599 | |
|
||||
| f | true | 603 | 588 | |
|
||||
| f | true | 605 | 667 | |
|
||||
| f | true | 607 | 617 | |
|
||||
| f | true | 609 | 488 | |
|
||||
| f | true | 611 | 613 | |
|
||||
| f | true | 613 | 477 | |
|
||||
| f | true | 615 | 616 | |
|
||||
| f | true | 616 | 611 | |
|
||||
| f | true | 617 | 618 | |
|
||||
| f | true | 618 | 615 | |
|
||||
| f | true | 619 | 620 | |
|
||||
| f | true | 620 | 477 | |
|
||||
| f | true | 621 | 622 | |
|
||||
| f | true | 622 | 619 | |
|
||||
| f | true | 623 | 625 | |
|
||||
| f | true | 625 | 605 | |
|
||||
| f | true | 625 | 621 | |
|
||||
| f | true | 626 | 628 | |
|
||||
| f | true | 628 | 601 | |
|
||||
| f | true | 629 | 630 | |
|
||||
| f | true | 630 | 626 | |
|
||||
| f | true | 631 | 632 | |
|
||||
| f | true | 632 | 601 | |
|
||||
| f | true | 633 | 635 | |
|
||||
| f | true | 635 | 550 | |
|
||||
| f | true | 636 | 638 | |
|
||||
| f | true | 638 | 550 | |
|
||||
| f | true | 639 | 640 | |
|
||||
| f | true | 640 | 636 | |
|
||||
| f | true | 641 | 642 | |
|
||||
| f | true | 642 | 534 | |
|
||||
| f | true | 644 | 548 | |
|
||||
| f | true | 648 | 644 | |
|
||||
| f | true | 649 | 648 | |
|
||||
| f | true | 653 | 603 | |
|
||||
| f | true | 657 | 653 | |
|
||||
| f | true | 658 | 657 | |
|
||||
| f | true | 662 | 607 | |
|
||||
| f | true | 666 | 662 | |
|
||||
| f | true | 667 | 666 | |
|
||||
| f1 | false | 292 | 292 | f1 |
|
||||
| f2 | false | 299 | 299 | f2 |
|
||||
| f3 | false | 304 | 304 | f3 |
|
||||
| f4 | false | 309 | 309 | f4 |
|
||||
| f4 | false | 433 | 433 | return ... |
|
||||
| f4 | false | 435 | 435 | { ... } |
|
||||
| f4 | true | 433 | 309 | |
|
||||
| f4 | true | 435 | 433 | |
|
||||
| f5 | false | 314 | 314 | f5 |
|
||||
| f5 | false | 422 | 422 | 3 |
|
||||
| f5 | false | 423 | 423 | throw ... |
|
||||
| f5 | false | 425 | 425 | ExprStmt |
|
||||
| f5 | false | 427 | 427 | { ... } |
|
||||
| f5 | true | 422 | 423 | |
|
||||
| f5 | true | 423 | 314 | |
|
||||
| f5 | true | 425 | 422 | |
|
||||
| f5 | true | 427 | 425 | |
|
||||
| fun | false | 287 | 287 | fun |
|
||||
| fun | false | 295 | 295 | call to f1 |
|
||||
| fun | false | 297 | 297 | ExprStmt |
|
||||
| fun | false | 300 | 300 | call to f3 |
|
||||
| fun | false | 300 | 300 | call to f2 |
|
||||
| fun | false | 302 | 302 | ExprStmt |
|
||||
| fun | false | 305 | 305 | call to f4 |
|
||||
| fun | false | 305 | 305 | call to f3 |
|
||||
| fun | false | 307 | 307 | ExprStmt |
|
||||
| fun | false | 310 | 310 | call to f5 |
|
||||
| fun | false | 310 | 310 | call to f4 |
|
||||
| fun | false | 312 | 312 | ExprStmt |
|
||||
| fun | false | 316 | 316 | 5 |
|
||||
| fun | false | 317 | 317 | throw ... |
|
||||
| fun | false | 319 | 319 | ExprStmt |
|
||||
| fun | false | 322 | 322 | call to g |
|
||||
| fun | false | 324 | 324 | { ... } |
|
||||
| fun | false | 315 | 315 | call to f5 |
|
||||
| fun | false | 317 | 317 | ExprStmt |
|
||||
| fun | false | 321 | 321 | 5 |
|
||||
| fun | false | 322 | 322 | throw ... |
|
||||
| fun | false | 324 | 324 | ExprStmt |
|
||||
| fun | false | 327 | 327 | call to g |
|
||||
| fun | false | 329 | 329 | ExprStmt |
|
||||
| fun | false | 332 | 332 | call to h |
|
||||
| fun | false | 334 | 334 | { ... } |
|
||||
| fun | false | 336 | 336 | <handler> |
|
||||
| fun | false | 337 | 337 | { ... } |
|
||||
| fun | false | 342 | 342 | ExprStmt |
|
||||
| fun | false | 345 | 345 | call to i |
|
||||
| fun | false | 347 | 347 | { ... } |
|
||||
| fun | false | 352 | 352 | ExprStmt |
|
||||
| fun | false | 355 | 355 | call to j |
|
||||
| fun | false | 357 | 357 | { ... } |
|
||||
| fun | false | 359 | 359 | <handler> |
|
||||
| fun | false | 360 | 360 | <handler> |
|
||||
| fun | false | 361 | 361 | ExprStmt |
|
||||
| fun | false | 364 | 364 | call to k |
|
||||
| fun | false | 366 | 366 | try { ... } |
|
||||
| fun | false | 368 | 368 | ExprStmt |
|
||||
| fun | false | 372 | 372 | 7 |
|
||||
| fun | false | 373 | 373 | throw ... |
|
||||
| fun | false | 375 | 375 | { ... } |
|
||||
| fun | false | 380 | 380 | ExprStmt |
|
||||
| fun | false | 383 | 383 | call to l |
|
||||
| fun | false | 385 | 385 | { ... } |
|
||||
| fun | false | 387 | 387 | ExprStmt |
|
||||
| fun | false | 390 | 390 | call to m |
|
||||
| fun | false | 392 | 392 | { ... } |
|
||||
| fun | false | 394 | 394 | <handler> |
|
||||
| fun | false | 395 | 395 | <handler> |
|
||||
| fun | false | 396 | 396 | ExprStmt |
|
||||
| fun | false | 399 | 399 | call to n |
|
||||
| fun | false | 401 | 401 | return ... |
|
||||
| fun | false | 403 | 403 | { ... } |
|
||||
| fun | true | 281 | 337 | |
|
||||
| fun | true | 283 | 324 | |
|
||||
| fun | true | 285 | 290 | |
|
||||
| fun | true | 290 | 292 | |
|
||||
| fun | true | 292 | 295 | |
|
||||
| fun | true | 295 | 297 | |
|
||||
| fun | true | 297 | 300 | |
|
||||
| fun | true | 300 | 302 | |
|
||||
| fun | true | 302 | 305 | |
|
||||
| fun | true | 305 | 307 | |
|
||||
| fun | true | 307 | 310 | |
|
||||
| fun | true | 312 | 316 | |
|
||||
| fun | true | 316 | 317 | |
|
||||
| fun | true | 317 | 336 | |
|
||||
| fun | true | 319 | 322 | |
|
||||
| fun | true | 322 | 361 | |
|
||||
| fun | true | 324 | 285 | |
|
||||
| fun | true | 329 | 332 | |
|
||||
| fun | true | 332 | 361 | |
|
||||
| fun | true | 334 | 329 | |
|
||||
| fun | true | 336 | 334 | |
|
||||
| fun | true | 336 | 359 | |
|
||||
| fun | true | 337 | 283 | |
|
||||
| fun | true | 342 | 345 | |
|
||||
| fun | true | 345 | 361 | |
|
||||
| fun | true | 347 | 342 | |
|
||||
| fun | true | 352 | 355 | |
|
||||
| fun | true | 355 | 361 | |
|
||||
| fun | true | 357 | 352 | |
|
||||
| fun | true | 359 | 347 | |
|
||||
| fun | true | 359 | 360 | |
|
||||
| fun | true | 360 | 276 | |
|
||||
| fun | true | 360 | 357 | |
|
||||
| fun | true | 361 | 364 | |
|
||||
| fun | true | 364 | 366 | |
|
||||
| fun | true | 366 | 375 | |
|
||||
| fun | true | 368 | 372 | |
|
||||
| fun | true | 372 | 373 | |
|
||||
| fun | true | 373 | 394 | |
|
||||
| fun | true | 375 | 368 | |
|
||||
| fun | true | 380 | 383 | |
|
||||
| fun | true | 383 | 396 | |
|
||||
| fun | true | 385 | 380 | |
|
||||
| fun | true | 387 | 390 | |
|
||||
| fun | true | 390 | 396 | |
|
||||
| fun | true | 392 | 387 | |
|
||||
| fun | true | 394 | 385 | |
|
||||
| fun | true | 394 | 395 | |
|
||||
| fun | true | 395 | 392 | |
|
||||
| fun | true | 396 | 399 | |
|
||||
| fun | true | 399 | 401 | |
|
||||
| fun | true | 401 | 276 | |
|
||||
| fun | true | 403 | 281 | |
|
||||
| fun2 | false | 149 | 149 | fun2 |
|
||||
| fun2 | false | 159 | 159 | fun2 |
|
||||
| fun2 | false | 162 | 162 | try { ... } |
|
||||
| fun2 | false | 164 | 164 | { ... } |
|
||||
| fun2 | false | 172 | 172 | ExprStmt |
|
||||
| fun2 | false | 174 | 174 | re-throw exception |
|
||||
| fun2 | false | 176 | 176 | { ... } |
|
||||
| fun2 | false | 178 | 178 | return ... |
|
||||
| fun2 | false | 182 | 182 | 1 |
|
||||
| fun2 | false | 183 | 183 | { ... } |
|
||||
| fun2 | false | 185 | 185 | <handler> |
|
||||
| fun2 | false | 186 | 186 | <handler> |
|
||||
| fun2 | false | 187 | 187 | return ... |
|
||||
| fun2 | false | 191 | 191 | 0 |
|
||||
| fun2 | false | 192 | 192 | { ... } |
|
||||
| fun2 | false | 257 | 257 | try { ... } |
|
||||
| fun2 | false | 258 | 258 | { ... } |
|
||||
| fun2 | false | 261 | 261 | ExprStmt |
|
||||
| fun2 | false | 262 | 262 | re-throw exception |
|
||||
| fun2 | false | 263 | 263 | { ... } |
|
||||
| fun2 | false | 264 | 264 | return ... |
|
||||
| fun2 | false | 266 | 266 | 1 |
|
||||
| fun2 | false | 267 | 267 | { ... } |
|
||||
| fun2 | false | 268 | 268 | <handler> |
|
||||
| fun2 | false | 269 | 269 | <handler> |
|
||||
| fun2 | false | 270 | 270 | return ... |
|
||||
| fun2 | false | 272 | 272 | 0 |
|
||||
| fun2 | false | 273 | 273 | { ... } |
|
||||
| fun2 | true | 162 | 164 | |
|
||||
| fun2 | true | 164 | 187 | |
|
||||
| fun2 | true | 172 | 174 | |
|
||||
| fun2 | true | 174 | 159 | |
|
||||
| fun2 | true | 176 | 172 | |
|
||||
| fun2 | true | 178 | 182 | |
|
||||
| fun2 | true | 182 | 159 | |
|
||||
| fun2 | true | 183 | 178 | |
|
||||
| fun2 | true | 185 | 176 | |
|
||||
| fun2 | true | 185 | 186 | |
|
||||
| fun2 | true | 186 | 183 | |
|
||||
| fun2 | true | 187 | 191 | |
|
||||
| fun2 | true | 191 | 159 | |
|
||||
| fun2 | true | 192 | 162 | |
|
||||
| fun2 | true | 257 | 258 | |
|
||||
| fun2 | true | 258 | 270 | |
|
||||
| fun2 | true | 261 | 262 | |
|
||||
| fun2 | true | 262 | 149 | |
|
||||
| fun2 | true | 263 | 261 | |
|
||||
| fun2 | true | 264 | 266 | |
|
||||
| fun2 | true | 266 | 149 | |
|
||||
| fun2 | true | 267 | 264 | |
|
||||
| fun2 | true | 268 | 263 | |
|
||||
| fun2 | true | 268 | 269 | |
|
||||
| fun2 | true | 269 | 267 | |
|
||||
| fun2 | true | 270 | 272 | |
|
||||
| fun2 | true | 272 | 149 | |
|
||||
| fun2 | true | 273 | 257 | |
|
||||
| g | false | 321 | 321 | g |
|
||||
| h | false | 331 | 331 | h |
|
||||
| i | false | 344 | 344 | i |
|
||||
| j | false | 354 | 354 | j |
|
||||
| k | false | 363 | 363 | k |
|
||||
| l | false | 382 | 382 | l |
|
||||
| m | false | 389 | 389 | m |
|
||||
| n | false | 398 | 398 | n |
|
||||
| run_fun2 | false | 142 | 142 | run_fun2 |
|
||||
| run_fun2 | false | 147 | 147 | ExprStmt |
|
||||
| run_fun2 | false | 152 | 152 | call to fun2 |
|
||||
| run_fun2 | false | 154 | 154 | return ... |
|
||||
| run_fun2 | false | 156 | 156 | { ... } |
|
||||
| run_fun2 | true | 147 | 152 | |
|
||||
| run_fun2 | true | 152 | 154 | |
|
||||
| run_fun2 | true | 154 | 142 | |
|
||||
| run_fun2 | true | 156 | 147 | |
|
||||
| fun | false | 331 | 331 | { ... } |
|
||||
| fun | false | 337 | 337 | call to h |
|
||||
| fun | false | 339 | 339 | ExprStmt |
|
||||
| fun | false | 341 | 341 | { ... } |
|
||||
| fun | false | 343 | 343 | <handler> |
|
||||
| fun | false | 344 | 344 | try { ... } |
|
||||
| fun | false | 346 | 346 | { ... } |
|
||||
| fun | false | 352 | 352 | call to i |
|
||||
| fun | false | 354 | 354 | ExprStmt |
|
||||
| fun | false | 356 | 356 | { ... } |
|
||||
| fun | false | 362 | 362 | call to j |
|
||||
| fun | false | 364 | 364 | ExprStmt |
|
||||
| fun | false | 366 | 366 | { ... } |
|
||||
| fun | false | 368 | 368 | <handler> |
|
||||
| fun | false | 369 | 369 | <handler> |
|
||||
| fun | false | 370 | 370 | try { ... } |
|
||||
| fun | false | 373 | 373 | call to k |
|
||||
| fun | false | 375 | 375 | ExprStmt |
|
||||
| fun | false | 379 | 379 | 7 |
|
||||
| fun | false | 380 | 380 | throw ... |
|
||||
| fun | false | 382 | 382 | ExprStmt |
|
||||
| fun | false | 384 | 384 | { ... } |
|
||||
| fun | false | 390 | 390 | call to l |
|
||||
| fun | false | 392 | 392 | ExprStmt |
|
||||
| fun | false | 394 | 394 | { ... } |
|
||||
| fun | false | 397 | 397 | call to m |
|
||||
| fun | false | 399 | 399 | ExprStmt |
|
||||
| fun | false | 401 | 401 | { ... } |
|
||||
| fun | false | 403 | 403 | <handler> |
|
||||
| fun | false | 404 | 404 | <handler> |
|
||||
| fun | false | 405 | 405 | try { ... } |
|
||||
| fun | false | 408 | 408 | call to n |
|
||||
| fun | false | 410 | 410 | ExprStmt |
|
||||
| fun | false | 412 | 412 | return ... |
|
||||
| fun | false | 414 | 414 | { ... } |
|
||||
| fun | true | 295 | 302 | |
|
||||
| fun | true | 297 | 295 | |
|
||||
| fun | true | 300 | 307 | |
|
||||
| fun | true | 302 | 300 | |
|
||||
| fun | true | 305 | 312 | |
|
||||
| fun | true | 307 | 305 | |
|
||||
| fun | true | 310 | 317 | |
|
||||
| fun | true | 312 | 310 | |
|
||||
| fun | true | 317 | 315 | |
|
||||
| fun | true | 321 | 322 | |
|
||||
| fun | true | 322 | 343 | |
|
||||
| fun | true | 324 | 321 | |
|
||||
| fun | true | 327 | 375 | |
|
||||
| fun | true | 329 | 327 | |
|
||||
| fun | true | 331 | 297 | |
|
||||
| fun | true | 337 | 375 | |
|
||||
| fun | true | 339 | 337 | |
|
||||
| fun | true | 341 | 339 | |
|
||||
| fun | true | 343 | 341 | |
|
||||
| fun | true | 343 | 368 | |
|
||||
| fun | true | 344 | 331 | |
|
||||
| fun | true | 346 | 344 | |
|
||||
| fun | true | 352 | 375 | |
|
||||
| fun | true | 354 | 352 | |
|
||||
| fun | true | 356 | 354 | |
|
||||
| fun | true | 362 | 375 | |
|
||||
| fun | true | 364 | 362 | |
|
||||
| fun | true | 366 | 364 | |
|
||||
| fun | true | 368 | 356 | |
|
||||
| fun | true | 368 | 369 | |
|
||||
| fun | true | 369 | 287 | |
|
||||
| fun | true | 369 | 366 | |
|
||||
| fun | true | 370 | 346 | |
|
||||
| fun | true | 373 | 405 | |
|
||||
| fun | true | 375 | 373 | |
|
||||
| fun | true | 379 | 380 | |
|
||||
| fun | true | 380 | 403 | |
|
||||
| fun | true | 382 | 379 | |
|
||||
| fun | true | 384 | 382 | |
|
||||
| fun | true | 390 | 410 | |
|
||||
| fun | true | 392 | 390 | |
|
||||
| fun | true | 394 | 392 | |
|
||||
| fun | true | 397 | 410 | |
|
||||
| fun | true | 399 | 397 | |
|
||||
| fun | true | 401 | 399 | |
|
||||
| fun | true | 403 | 394 | |
|
||||
| fun | true | 403 | 404 | |
|
||||
| fun | true | 404 | 401 | |
|
||||
| fun | true | 405 | 384 | |
|
||||
| fun | true | 408 | 412 | |
|
||||
| fun | true | 410 | 408 | |
|
||||
| fun | true | 412 | 287 | |
|
||||
| fun | true | 414 | 370 | |
|
||||
| fun2 | false | 204 | 204 | fun2 |
|
||||
| fun2 | false | 215 | 215 | fun2 |
|
||||
| fun2 | false | 218 | 218 | { ... } |
|
||||
| fun2 | false | 223 | 223 | re-throw exception |
|
||||
| fun2 | false | 225 | 225 | ExprStmt |
|
||||
| fun2 | false | 227 | 227 | { ... } |
|
||||
| fun2 | false | 231 | 231 | 1 |
|
||||
| fun2 | false | 232 | 232 | return ... |
|
||||
| fun2 | false | 234 | 234 | { ... } |
|
||||
| fun2 | false | 236 | 236 | <handler> |
|
||||
| fun2 | false | 237 | 237 | <handler> |
|
||||
| fun2 | false | 238 | 238 | try { ... } |
|
||||
| fun2 | false | 242 | 242 | 0 |
|
||||
| fun2 | false | 243 | 243 | return ... |
|
||||
| fun2 | false | 245 | 245 | { ... } |
|
||||
| fun2 | false | 702 | 702 | { ... } |
|
||||
| fun2 | false | 707 | 707 | re-throw exception |
|
||||
| fun2 | false | 708 | 708 | ExprStmt |
|
||||
| fun2 | false | 709 | 709 | { ... } |
|
||||
| fun2 | false | 711 | 711 | 1 |
|
||||
| fun2 | false | 712 | 712 | return ... |
|
||||
| fun2 | false | 713 | 713 | { ... } |
|
||||
| fun2 | false | 714 | 714 | <handler> |
|
||||
| fun2 | false | 715 | 715 | <handler> |
|
||||
| fun2 | false | 716 | 716 | try { ... } |
|
||||
| fun2 | false | 718 | 718 | 0 |
|
||||
| fun2 | false | 719 | 719 | return ... |
|
||||
| fun2 | false | 720 | 720 | { ... } |
|
||||
| fun2 | true | 218 | 243 | |
|
||||
| fun2 | true | 223 | 215 | |
|
||||
| fun2 | true | 225 | 223 | |
|
||||
| fun2 | true | 227 | 225 | |
|
||||
| fun2 | true | 231 | 215 | |
|
||||
| fun2 | true | 232 | 231 | |
|
||||
| fun2 | true | 234 | 232 | |
|
||||
| fun2 | true | 236 | 227 | |
|
||||
| fun2 | true | 236 | 237 | |
|
||||
| fun2 | true | 237 | 234 | |
|
||||
| fun2 | true | 238 | 218 | |
|
||||
| fun2 | true | 242 | 215 | |
|
||||
| fun2 | true | 243 | 242 | |
|
||||
| fun2 | true | 245 | 238 | |
|
||||
| fun2 | true | 702 | 719 | |
|
||||
| fun2 | true | 707 | 204 | |
|
||||
| fun2 | true | 708 | 707 | |
|
||||
| fun2 | true | 709 | 708 | |
|
||||
| fun2 | true | 711 | 204 | |
|
||||
| fun2 | true | 712 | 711 | |
|
||||
| fun2 | true | 713 | 712 | |
|
||||
| fun2 | true | 714 | 709 | |
|
||||
| fun2 | true | 714 | 715 | |
|
||||
| fun2 | true | 715 | 713 | |
|
||||
| fun2 | true | 716 | 702 | |
|
||||
| fun2 | true | 718 | 204 | |
|
||||
| fun2 | true | 719 | 718 | |
|
||||
| fun2 | true | 720 | 716 | |
|
||||
| g | false | 326 | 326 | g |
|
||||
| h | false | 336 | 336 | h |
|
||||
| i | false | 351 | 351 | i |
|
||||
| j | false | 361 | 361 | j |
|
||||
| k | false | 372 | 372 | k |
|
||||
| l | false | 389 | 389 | l |
|
||||
| m | false | 396 | 396 | m |
|
||||
| n | false | 407 | 407 | n |
|
||||
| run_fun2 | false | 199 | 199 | run_fun2 |
|
||||
| run_fun2 | false | 207 | 207 | call to fun2 |
|
||||
| run_fun2 | false | 209 | 209 | ExprStmt |
|
||||
| run_fun2 | false | 211 | 211 | return ... |
|
||||
| run_fun2 | false | 213 | 213 | { ... } |
|
||||
| run_fun2 | true | 207 | 211 | |
|
||||
| run_fun2 | true | 209 | 207 | |
|
||||
| run_fun2 | true | 211 | 199 | |
|
||||
| run_fun2 | true | 213 | 209 | |
|
||||
|
||||
@@ -1,3 +1,2 @@
|
||||
| exceptions.cpp:25:13:25:19 | ExprStmt |
|
||||
| exceptions.cpp:26:13:26:13 | ExprStmt |
|
||||
| ms.cpp:38:1:38:1 | c101 |
|
||||
|
||||
@@ -159,9 +159,6 @@ postWithInFlow
|
||||
| test.cpp:808:5:808:21 | * ... [post update] | PostUpdateNode should not be the target of local flow. |
|
||||
| test.cpp:808:6:808:21 | global_indirect1 [inner post update] | PostUpdateNode should not be the target of local flow. |
|
||||
| test.cpp:832:5:832:17 | global_direct [post update] | PostUpdateNode should not be the target of local flow. |
|
||||
| test.cpp:931:5:931:18 | global_pointer [post update] | PostUpdateNode should not be the target of local flow. |
|
||||
| test.cpp:932:5:932:19 | * ... [post update] | PostUpdateNode should not be the target of local flow. |
|
||||
| test.cpp:932:6:932:19 | global_pointer [inner post update] | PostUpdateNode should not be the target of local flow. |
|
||||
viableImplInCallContextTooLarge
|
||||
uniqueParameterNodeAtPosition
|
||||
uniqueParameterNodePosition
|
||||
@@ -169,4 +166,3 @@ uniqueContentApprox
|
||||
identityLocalStep
|
||||
missingArgumentCall
|
||||
multipleArgumentCall
|
||||
lambdaCallEnclosingCallableMismatch
|
||||
|
||||
@@ -31,4 +31,3 @@ uniqueContentApprox
|
||||
identityLocalStep
|
||||
missingArgumentCall
|
||||
multipleArgumentCall
|
||||
lambdaCallEnclosingCallableMismatch
|
||||
|
||||
@@ -300,7 +300,6 @@ irFlow
|
||||
| test.cpp:902:56:902:75 | *indirect_source(2) | test.cpp:911:19:911:48 | *global_array_static_indirect_2 |
|
||||
| test.cpp:914:46:914:53 | source | test.cpp:919:10:919:30 | global_pointer_static |
|
||||
| test.cpp:915:57:915:76 | *indirect_source(1) | test.cpp:921:19:921:50 | *global_pointer_static_indirect_1 |
|
||||
| test.cpp:932:23:932:28 | call to source | test.cpp:937:10:937:24 | * ... |
|
||||
| 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 |
|
||||
|
||||
@@ -922,18 +922,4 @@ namespace GlobalArrays {
|
||||
sink(global_pointer_static_indirect_2); // clean: global_pointer_static_indirect_2 does not have 2 indirections
|
||||
indirect_sink(global_pointer_static_indirect_2); // clean: global_pointer_static_indirect_2 does not have 2 indirections
|
||||
}
|
||||
}
|
||||
|
||||
namespace global_variable_conflation_test {
|
||||
int* global_pointer;
|
||||
|
||||
void def() {
|
||||
global_pointer = nullptr;
|
||||
*global_pointer = source();
|
||||
}
|
||||
|
||||
void use() {
|
||||
sink(global_pointer); // clean
|
||||
sink(*global_pointer); // $ ir MISSING: ast
|
||||
}
|
||||
}
|
||||
@@ -193,4 +193,3 @@ uniqueContentApprox
|
||||
identityLocalStep
|
||||
missingArgumentCall
|
||||
multipleArgumentCall
|
||||
lambdaCallEnclosingCallableMismatch
|
||||
|
||||
@@ -27,4 +27,3 @@ uniqueContentApprox
|
||||
identityLocalStep
|
||||
missingArgumentCall
|
||||
multipleArgumentCall
|
||||
lambdaCallEnclosingCallableMismatch
|
||||
|
||||
@@ -1,263 +1,255 @@
|
||||
| C::C | false | 181 | 181 | C |
|
||||
| C::C | false | 384 | 384 | C |
|
||||
| C::operator= | false | 375 | 375 | operator= |
|
||||
| C::~C | false | 333 | 333 | ~C |
|
||||
| C::C | false | 197 | 197 | C |
|
||||
| C::C | false | 398 | 398 | C |
|
||||
| C::operator= | false | 391 | 391 | operator= |
|
||||
| C::~C | false | 331 | 331 | ~C |
|
||||
| Class2::Class2 | false | 538 | 538 | Class2 |
|
||||
| Class2::Class2 | false | 544 | 544 | return ... |
|
||||
| Class2::Class2 | false | 546 | 546 | { ... } |
|
||||
| Class2::Class2 | false | 547 | 547 | Class2 |
|
||||
| Class2::Class2 | false | 554 | 554 | return ... |
|
||||
| Class2::Class2 | false | 556 | 556 | { ... } |
|
||||
| Class2::Class2 | false | 557 | 557 | Class2 |
|
||||
| Class2::Class2 | true | 554 | 547 | |
|
||||
| Class2::Class2 | true | 556 | 554 | |
|
||||
| Class2::operator= | false | 541 | 541 | operator= |
|
||||
| Class2::~Class2 | false | 499 | 499 | ~Class2 |
|
||||
| Outer::Inner::Inner | false | 481 | 481 | Inner |
|
||||
| Outer::Inner::Inner | false | 517 | 517 | Inner |
|
||||
| Outer::Inner::Inner | false | 537 | 537 | return ... |
|
||||
| Outer::Inner::Inner | false | 539 | 539 | { ... } |
|
||||
| Outer::Inner::Inner | true | 537 | 481 | |
|
||||
| Outer::Inner::Inner | true | 539 | 537 | |
|
||||
| Outer::Inner::operator= | false | 508 | 508 | operator= |
|
||||
| Outer::Inner::~Inner | false | 504 | 504 | ~Inner |
|
||||
| Outer::Inner::~Inner | false | 526 | 526 | return ... |
|
||||
| Outer::Inner::~Inner | false | 528 | 528 | { ... } |
|
||||
| Outer::Inner::~Inner | true | 526 | 504 | |
|
||||
| Outer::Inner::~Inner | true | 528 | 526 | |
|
||||
| Outer::f2 | false | 444 | 444 | f2 |
|
||||
| Outer::f2 | false | 453 | 453 | declaration |
|
||||
| Outer::f2 | false | 458 | 458 | call to getClass2 |
|
||||
| Outer::f2 | false | 460 | 460 | initializer for c |
|
||||
| Outer::f2 | false | 464 | 464 | if (...) ... |
|
||||
| Outer::f2 | false | 466 | 466 | i |
|
||||
| Outer::f2 | false | 468 | 468 | (bool)... |
|
||||
| Outer::f2 | false | 469 | 469 | return ... |
|
||||
| Outer::f2 | false | 471 | 471 | { ... } |
|
||||
| Outer::f2 | false | 473 | 473 | declaration |
|
||||
| Outer::f2 | false | 476 | 476 | call to Inner |
|
||||
| Outer::f2 | false | 482 | 482 | c |
|
||||
| Outer::f2 | false | 485 | 485 | (const Class2)... |
|
||||
| Outer::f2 | false | 488 | 488 | (reference to) |
|
||||
| Outer::f2 | false | 489 | 489 | initializer for inner |
|
||||
| Outer::f2 | false | 492 | 492 | return ... |
|
||||
| Outer::f2 | false | 494 | 494 | { ... } |
|
||||
| Outer::f2 | false | 496 | 496 | c |
|
||||
| Outer::f2 | false | 498 | 498 | call to c.~Class2 |
|
||||
| Outer::f2 | false | 500 | 500 | c |
|
||||
| Outer::f2 | false | 501 | 501 | call to c.~Class2 |
|
||||
| Outer::f2 | false | 502 | 502 | inner |
|
||||
| Outer::f2 | false | 503 | 503 | call to inner.~Inner |
|
||||
| Outer::f2 | true | 453 | 460 | |
|
||||
| Outer::f2 | true | 458 | 464 | |
|
||||
| Outer::f2 | true | 460 | 458 | |
|
||||
| Class2::Class2 | true | 544 | 538 | |
|
||||
| Class2::Class2 | true | 546 | 544 | |
|
||||
| Class2::operator= | false | 532 | 532 | operator= |
|
||||
| Class2::~Class2 | false | 467 | 467 | ~Class2 |
|
||||
| Outer::Inner::Inner | false | 488 | 488 | Inner |
|
||||
| Outer::Inner::Inner | false | 509 | 509 | Inner |
|
||||
| Outer::Inner::Inner | false | 528 | 528 | return ... |
|
||||
| Outer::Inner::Inner | false | 530 | 530 | { ... } |
|
||||
| Outer::Inner::Inner | true | 528 | 488 | |
|
||||
| Outer::Inner::Inner | true | 530 | 528 | |
|
||||
| Outer::Inner::operator= | false | 502 | 502 | operator= |
|
||||
| Outer::Inner::~Inner | false | 470 | 470 | ~Inner |
|
||||
| Outer::Inner::~Inner | false | 517 | 517 | return ... |
|
||||
| Outer::Inner::~Inner | false | 519 | 519 | { ... } |
|
||||
| Outer::Inner::~Inner | true | 517 | 470 | |
|
||||
| Outer::Inner::~Inner | true | 519 | 517 | |
|
||||
| Outer::f2 | false | 439 | 439 | f2 |
|
||||
| Outer::f2 | false | 447 | 447 | declaration |
|
||||
| Outer::f2 | false | 449 | 449 | i |
|
||||
| Outer::f2 | false | 451 | 451 | (bool)... |
|
||||
| Outer::f2 | false | 452 | 452 | return ... |
|
||||
| Outer::f2 | false | 454 | 454 | { ... } |
|
||||
| Outer::f2 | false | 456 | 456 | if (...) ... |
|
||||
| Outer::f2 | false | 458 | 458 | declaration |
|
||||
| Outer::f2 | false | 460 | 460 | return ... |
|
||||
| Outer::f2 | false | 462 | 462 | { ... } |
|
||||
| Outer::f2 | false | 464 | 464 | c |
|
||||
| Outer::f2 | false | 466 | 466 | call to c.~Class2 |
|
||||
| Outer::f2 | false | 468 | 468 | inner |
|
||||
| Outer::f2 | false | 469 | 469 | call to inner.~Inner |
|
||||
| Outer::f2 | false | 474 | 474 | call to getClass2 |
|
||||
| Outer::f2 | false | 476 | 476 | initializer for c |
|
||||
| Outer::f2 | false | 481 | 481 | call to Inner |
|
||||
| Outer::f2 | false | 490 | 490 | c |
|
||||
| Outer::f2 | false | 492 | 492 | (const Class2)... |
|
||||
| Outer::f2 | false | 493 | 493 | (reference to) |
|
||||
| Outer::f2 | false | 494 | 494 | initializer for inner |
|
||||
| Outer::f2 | true | 447 | 476 | |
|
||||
| Outer::f2 | true | 449 | 454 | T |
|
||||
| Outer::f2 | true | 449 | 458 | F |
|
||||
| Outer::f2 | true | 452 | 464 | |
|
||||
| Outer::f2 | true | 454 | 452 | |
|
||||
| Outer::f2 | true | 456 | 449 | |
|
||||
| Outer::f2 | true | 458 | 494 | |
|
||||
| Outer::f2 | true | 460 | 468 | |
|
||||
| Outer::f2 | true | 462 | 447 | |
|
||||
| Outer::f2 | true | 464 | 466 | |
|
||||
| Outer::f2 | true | 466 | 471 | T |
|
||||
| Outer::f2 | true | 466 | 473 | F |
|
||||
| Outer::f2 | true | 469 | 496 | |
|
||||
| Outer::f2 | true | 471 | 469 | |
|
||||
| Outer::f2 | true | 473 | 489 | |
|
||||
| Outer::f2 | true | 476 | 492 | |
|
||||
| Outer::f2 | true | 482 | 476 | |
|
||||
| Outer::f2 | true | 489 | 482 | |
|
||||
| Outer::f2 | true | 492 | 502 | |
|
||||
| Outer::f2 | true | 494 | 453 | |
|
||||
| Outer::f2 | true | 496 | 498 | |
|
||||
| Outer::f2 | true | 498 | 444 | |
|
||||
| Outer::f2 | true | 500 | 501 | |
|
||||
| Outer::f2 | true | 501 | 444 | |
|
||||
| Outer::f2 | true | 502 | 503 | |
|
||||
| Outer::f2 | true | 503 | 500 | |
|
||||
| Outer::operator= | false | 428 | 428 | operator= |
|
||||
| Outer::operator= | false | 438 | 438 | operator= |
|
||||
| __va_list_tag::operator= | false | 66 | 66 | operator= |
|
||||
| __va_list_tag::operator= | false | 72 | 72 | operator= |
|
||||
| f | false | 165 | 165 | f |
|
||||
| f | false | 176 | 176 | declaration |
|
||||
| f | false | 179 | 179 | call to C |
|
||||
| f | false | 184 | 184 | 110 |
|
||||
| f | false | 185 | 185 | initializer for c10 |
|
||||
| f | false | 189 | 189 | call to C |
|
||||
| f | false | 193 | 193 | 120 |
|
||||
| f | false | 194 | 194 | initializer for c20 |
|
||||
| f | false | 198 | 198 | call to C |
|
||||
| f | false | 202 | 202 | 121 |
|
||||
| f | false | 203 | 203 | initializer for c21 |
|
||||
| f | false | 206 | 206 | declaration |
|
||||
| f | false | 209 | 209 | call to C |
|
||||
| f | false | 213 | 213 | 130 |
|
||||
| f | false | 214 | 214 | initializer for c30 |
|
||||
| f | false | 217 | 217 | declaration |
|
||||
| f | false | 219 | 219 | { ... } |
|
||||
| f | false | 222 | 222 | call to C |
|
||||
| f | false | 226 | 226 | 131 |
|
||||
| f | false | 227 | 227 | initializer for c31 |
|
||||
| f | false | 231 | 231 | call to C |
|
||||
| f | false | 235 | 235 | 132 |
|
||||
| f | false | 236 | 236 | initializer for c32 |
|
||||
| f | false | 240 | 240 | call to C |
|
||||
| f | false | 244 | 244 | 133 |
|
||||
| f | false | 245 | 245 | initializer for c33 |
|
||||
| f | false | 248 | 248 | declaration |
|
||||
| f | false | 250 | 250 | if (...) ... |
|
||||
| f | false | 252 | 252 | b1 |
|
||||
| f | false | 254 | 254 | (bool)... |
|
||||
| f | false | 255 | 255 | goto ... |
|
||||
| f | false | 257 | 257 | declaration |
|
||||
| f | false | 259 | 259 | if (...) ... |
|
||||
| f | false | 261 | 261 | b2 |
|
||||
| f | false | 263 | 263 | (bool)... |
|
||||
| f | false | 264 | 264 | return ... |
|
||||
| f | false | 266 | 266 | declaration |
|
||||
| f | false | 268 | 268 | { ... } |
|
||||
| f | false | 271 | 271 | call to C |
|
||||
| f | false | 275 | 275 | 134 |
|
||||
| f | false | 276 | 276 | initializer for c34 |
|
||||
| f | false | 279 | 279 | declaration |
|
||||
| f | false | 281 | 281 | { ... } |
|
||||
| f | false | 283 | 283 | declaration |
|
||||
| f | false | 285 | 285 | { ... } |
|
||||
| f | false | 288 | 288 | call to C |
|
||||
| f | false | 292 | 292 | 122 |
|
||||
| f | false | 293 | 293 | initializer for c22 |
|
||||
| f | false | 296 | 296 | declaration |
|
||||
| f | false | 298 | 298 | { ... } |
|
||||
| f | false | 301 | 301 | call to C |
|
||||
| f | false | 305 | 305 | 123 |
|
||||
| f | false | 306 | 306 | initializer for c23 |
|
||||
| f | false | 309 | 309 | label ...: |
|
||||
| f | false | 311 | 311 | declaration |
|
||||
| f | false | 313 | 313 | { ... } |
|
||||
| f | false | 315 | 315 | declaration |
|
||||
| f | false | 318 | 318 | call to C |
|
||||
| f | false | 322 | 322 | 111 |
|
||||
| f | false | 323 | 323 | initializer for c11 |
|
||||
| f | false | 326 | 326 | return ... |
|
||||
| f | false | 328 | 328 | { ... } |
|
||||
| f | false | 330 | 330 | c20 |
|
||||
| f | false | 332 | 332 | call to c20.~C |
|
||||
| f | false | 334 | 334 | c21 |
|
||||
| f | false | 335 | 335 | call to c21.~C |
|
||||
| f | false | 336 | 336 | c30 |
|
||||
| f | false | 338 | 338 | call to c30.~C |
|
||||
| f | false | 339 | 339 | c31 |
|
||||
| f | false | 341 | 341 | call to c31.~C |
|
||||
| f | false | 342 | 342 | c32 |
|
||||
| f | false | 343 | 343 | call to c32.~C |
|
||||
| f | false | 344 | 344 | c33 |
|
||||
| f | false | 345 | 345 | call to c33.~C |
|
||||
| f | false | 346 | 346 | c20 |
|
||||
| f | false | 347 | 347 | call to c20.~C |
|
||||
| Outer::f2 | true | 466 | 439 | |
|
||||
| Outer::f2 | true | 468 | 469 | |
|
||||
| Outer::f2 | true | 469 | 464 | |
|
||||
| Outer::f2 | true | 474 | 456 | |
|
||||
| Outer::f2 | true | 476 | 474 | |
|
||||
| Outer::f2 | true | 481 | 460 | |
|
||||
| Outer::f2 | true | 490 | 481 | |
|
||||
| Outer::f2 | true | 494 | 490 | |
|
||||
| Outer::operator= | false | 424 | 424 | operator= |
|
||||
| Outer::operator= | false | 435 | 435 | operator= |
|
||||
| __va_list_tag::operator= | false | 93 | 93 | operator= |
|
||||
| __va_list_tag::operator= | false | 100 | 100 | operator= |
|
||||
| f | false | 181 | 181 | f |
|
||||
| f | false | 192 | 192 | declaration |
|
||||
| f | false | 195 | 195 | call to C |
|
||||
| f | false | 200 | 200 | 120 |
|
||||
| f | false | 201 | 201 | initializer for c20 |
|
||||
| f | false | 205 | 205 | call to C |
|
||||
| f | false | 209 | 209 | 121 |
|
||||
| f | false | 210 | 210 | initializer for c21 |
|
||||
| f | false | 213 | 213 | declaration |
|
||||
| f | false | 216 | 216 | call to C |
|
||||
| f | false | 220 | 220 | 130 |
|
||||
| f | false | 221 | 221 | initializer for c30 |
|
||||
| f | false | 224 | 224 | declaration |
|
||||
| f | false | 226 | 226 | { ... } |
|
||||
| f | false | 229 | 229 | call to C |
|
||||
| f | false | 233 | 233 | 131 |
|
||||
| f | false | 234 | 234 | initializer for c31 |
|
||||
| f | false | 238 | 238 | call to C |
|
||||
| f | false | 242 | 242 | 132 |
|
||||
| f | false | 243 | 243 | initializer for c32 |
|
||||
| f | false | 247 | 247 | call to C |
|
||||
| f | false | 251 | 251 | 133 |
|
||||
| f | false | 252 | 252 | initializer for c33 |
|
||||
| f | false | 255 | 255 | declaration |
|
||||
| f | false | 257 | 257 | b1 |
|
||||
| f | false | 259 | 259 | (bool)... |
|
||||
| f | false | 260 | 260 | goto ... |
|
||||
| f | false | 262 | 262 | if (...) ... |
|
||||
| f | false | 264 | 264 | declaration |
|
||||
| f | false | 266 | 266 | b2 |
|
||||
| f | false | 268 | 268 | (bool)... |
|
||||
| f | false | 269 | 269 | return ... |
|
||||
| f | false | 271 | 271 | if (...) ... |
|
||||
| f | false | 273 | 273 | declaration |
|
||||
| f | false | 275 | 275 | { ... } |
|
||||
| f | false | 278 | 278 | call to C |
|
||||
| f | false | 282 | 282 | 134 |
|
||||
| f | false | 283 | 283 | initializer for c34 |
|
||||
| f | false | 286 | 286 | declaration |
|
||||
| f | false | 288 | 288 | { ... } |
|
||||
| f | false | 290 | 290 | declaration |
|
||||
| f | false | 292 | 292 | { ... } |
|
||||
| f | false | 295 | 295 | call to C |
|
||||
| f | false | 299 | 299 | 122 |
|
||||
| f | false | 300 | 300 | initializer for c22 |
|
||||
| f | false | 303 | 303 | declaration |
|
||||
| f | false | 305 | 305 | { ... } |
|
||||
| f | false | 308 | 308 | call to C |
|
||||
| f | false | 312 | 312 | 123 |
|
||||
| f | false | 313 | 313 | initializer for c23 |
|
||||
| f | false | 316 | 316 | label ...: |
|
||||
| f | false | 318 | 318 | declaration |
|
||||
| f | false | 320 | 320 | { ... } |
|
||||
| f | false | 322 | 322 | declaration |
|
||||
| f | false | 324 | 324 | return ... |
|
||||
| f | false | 326 | 326 | { ... } |
|
||||
| f | false | 328 | 328 | c10 |
|
||||
| f | false | 330 | 330 | call to c10.~C |
|
||||
| f | false | 332 | 332 | c11 |
|
||||
| f | false | 333 | 333 | call to c11.~C |
|
||||
| f | false | 334 | 334 | c23 |
|
||||
| f | false | 336 | 336 | call to c23.~C |
|
||||
| f | false | 337 | 337 | c22 |
|
||||
| f | false | 339 | 339 | call to c22.~C |
|
||||
| f | false | 340 | 340 | c20 |
|
||||
| f | false | 342 | 342 | call to c20.~C |
|
||||
| f | false | 343 | 343 | c21 |
|
||||
| f | false | 344 | 344 | call to c21.~C |
|
||||
| f | false | 345 | 345 | c34 |
|
||||
| f | false | 347 | 347 | call to c34.~C |
|
||||
| f | false | 348 | 348 | c31 |
|
||||
| f | false | 349 | 349 | call to c31.~C |
|
||||
| f | false | 350 | 350 | c10 |
|
||||
| f | false | 352 | 352 | call to c10.~C |
|
||||
| f | false | 353 | 353 | c20 |
|
||||
| f | false | 354 | 354 | call to c20.~C |
|
||||
| f | false | 355 | 355 | c31 |
|
||||
| f | false | 356 | 356 | call to c31.~C |
|
||||
| f | false | 357 | 357 | c32 |
|
||||
| f | false | 358 | 358 | call to c32.~C |
|
||||
| f | false | 359 | 359 | c34 |
|
||||
| f | false | 361 | 361 | call to c34.~C |
|
||||
| f | false | 362 | 362 | c22 |
|
||||
| f | false | 364 | 364 | call to c22.~C |
|
||||
| f | false | 365 | 365 | c23 |
|
||||
| f | false | 367 | 367 | call to c23.~C |
|
||||
| f | false | 368 | 368 | c10 |
|
||||
| f | false | 369 | 369 | call to c10.~C |
|
||||
| f | false | 370 | 370 | c11 |
|
||||
| f | false | 371 | 371 | call to c11.~C |
|
||||
| f | true | 176 | 185 | |
|
||||
| f | true | 179 | 285 | |
|
||||
| f | true | 184 | 179 | |
|
||||
| f | true | 185 | 184 | |
|
||||
| f | true | 189 | 219 | |
|
||||
| f | true | 193 | 189 | |
|
||||
| f | true | 194 | 193 | |
|
||||
| f | true | 198 | 334 | |
|
||||
| f | true | 202 | 198 | |
|
||||
| f | true | 203 | 202 | |
|
||||
| f | true | 206 | 194 | |
|
||||
| f | true | 209 | 336 | |
|
||||
| f | true | 213 | 209 | |
|
||||
| f | true | 214 | 213 | |
|
||||
| f | true | 217 | 214 | |
|
||||
| f | true | 219 | 217 | |
|
||||
| f | true | 222 | 250 | |
|
||||
| f | true | 226 | 222 | |
|
||||
| f | true | 227 | 226 | |
|
||||
| f | true | 231 | 259 | |
|
||||
| f | true | 235 | 231 | |
|
||||
| f | true | 236 | 235 | |
|
||||
| f | true | 240 | 344 | |
|
||||
| f | true | 244 | 240 | |
|
||||
| f | true | 245 | 244 | |
|
||||
| f | true | 248 | 227 | |
|
||||
| f | true | 250 | 252 | |
|
||||
| f | true | 252 | 255 | T |
|
||||
| f | true | 252 | 257 | F |
|
||||
| f | true | 255 | 348 | |
|
||||
| f | true | 257 | 236 | |
|
||||
| f | true | 259 | 261 | |
|
||||
| f | true | 261 | 264 | T |
|
||||
| f | true | 261 | 266 | F |
|
||||
| f | true | 264 | 357 | |
|
||||
| f | true | 266 | 245 | |
|
||||
| f | true | 268 | 248 | |
|
||||
| f | true | 271 | 359 | |
|
||||
| f | true | 275 | 271 | |
|
||||
| f | true | 276 | 275 | |
|
||||
| f | true | 279 | 276 | |
|
||||
| f | true | 281 | 279 | |
|
||||
| f | true | 283 | 203 | |
|
||||
| f | true | 285 | 206 | |
|
||||
| f | true | 288 | 362 | |
|
||||
| f | true | 292 | 288 | |
|
||||
| f | true | 293 | 292 | |
|
||||
| f | true | 296 | 293 | |
|
||||
| f | true | 298 | 296 | |
|
||||
| f | true | 301 | 365 | |
|
||||
| f | true | 305 | 301 | |
|
||||
| f | true | 306 | 305 | |
|
||||
| f | true | 309 | 311 | |
|
||||
| f | true | 311 | 306 | |
|
||||
| f | true | 313 | 309 | |
|
||||
| f | true | 315 | 323 | |
|
||||
| f | true | 318 | 326 | |
|
||||
| f | true | 322 | 318 | |
|
||||
| f | true | 323 | 322 | |
|
||||
| f | true | 326 | 370 | |
|
||||
| f | true | 328 | 176 | |
|
||||
| f | true | 330 | 332 | |
|
||||
| f | true | 332 | 298 | |
|
||||
| f | true | 334 | 335 | |
|
||||
| f | true | 335 | 330 | |
|
||||
| f | true | 336 | 338 | |
|
||||
| f | true | 338 | 268 | |
|
||||
| f | true | 339 | 341 | |
|
||||
| f | true | 341 | 281 | |
|
||||
| f | true | 342 | 343 | |
|
||||
| f | true | 343 | 339 | |
|
||||
| f | true | 344 | 345 | |
|
||||
| f | true | 345 | 342 | |
|
||||
| f | true | 346 | 347 | |
|
||||
| f | true | 347 | 309 | |
|
||||
| f | true | 348 | 349 | |
|
||||
| f | true | 349 | 346 | |
|
||||
| f | true | 350 | 352 | |
|
||||
| f | true | 352 | 165 | |
|
||||
| f | false | 350 | 350 | call to c31.~C |
|
||||
| f | false | 351 | 351 | c32 |
|
||||
| f | false | 352 | 352 | call to c32.~C |
|
||||
| f | false | 353 | 353 | c33 |
|
||||
| f | false | 354 | 354 | call to c33.~C |
|
||||
| f | false | 355 | 355 | c20 |
|
||||
| f | false | 356 | 356 | call to c20.~C |
|
||||
| f | false | 357 | 357 | c31 |
|
||||
| f | false | 358 | 358 | call to c31.~C |
|
||||
| f | false | 359 | 359 | c32 |
|
||||
| f | false | 360 | 360 | call to c32.~C |
|
||||
| f | false | 361 | 361 | c20 |
|
||||
| f | false | 362 | 362 | call to c20.~C |
|
||||
| f | false | 363 | 363 | c31 |
|
||||
| f | false | 364 | 364 | call to c31.~C |
|
||||
| f | false | 365 | 365 | c30 |
|
||||
| f | false | 367 | 367 | call to c30.~C |
|
||||
| f | false | 369 | 369 | call to C |
|
||||
| f | false | 373 | 373 | 110 |
|
||||
| f | false | 374 | 374 | initializer for c10 |
|
||||
| f | false | 378 | 378 | call to C |
|
||||
| f | false | 382 | 382 | 111 |
|
||||
| f | false | 383 | 383 | initializer for c11 |
|
||||
| f | true | 192 | 374 | |
|
||||
| f | true | 195 | 226 | |
|
||||
| f | true | 200 | 195 | |
|
||||
| f | true | 201 | 200 | |
|
||||
| f | true | 205 | 343 | |
|
||||
| f | true | 209 | 205 | |
|
||||
| f | true | 210 | 209 | |
|
||||
| f | true | 213 | 201 | |
|
||||
| f | true | 216 | 365 | |
|
||||
| f | true | 220 | 216 | |
|
||||
| f | true | 221 | 220 | |
|
||||
| f | true | 224 | 221 | |
|
||||
| f | true | 226 | 224 | |
|
||||
| f | true | 229 | 262 | |
|
||||
| f | true | 233 | 229 | |
|
||||
| f | true | 234 | 233 | |
|
||||
| f | true | 238 | 271 | |
|
||||
| f | true | 242 | 238 | |
|
||||
| f | true | 243 | 242 | |
|
||||
| f | true | 247 | 353 | |
|
||||
| f | true | 251 | 247 | |
|
||||
| f | true | 252 | 251 | |
|
||||
| f | true | 255 | 234 | |
|
||||
| f | true | 257 | 260 | T |
|
||||
| f | true | 257 | 264 | F |
|
||||
| f | true | 260 | 363 | |
|
||||
| f | true | 262 | 257 | |
|
||||
| f | true | 264 | 243 | |
|
||||
| f | true | 266 | 269 | T |
|
||||
| f | true | 266 | 273 | F |
|
||||
| f | true | 269 | 359 | |
|
||||
| f | true | 271 | 266 | |
|
||||
| f | true | 273 | 252 | |
|
||||
| f | true | 275 | 255 | |
|
||||
| f | true | 278 | 345 | |
|
||||
| f | true | 282 | 278 | |
|
||||
| f | true | 283 | 282 | |
|
||||
| f | true | 286 | 283 | |
|
||||
| f | true | 288 | 286 | |
|
||||
| f | true | 290 | 210 | |
|
||||
| f | true | 292 | 213 | |
|
||||
| f | true | 295 | 337 | |
|
||||
| f | true | 299 | 295 | |
|
||||
| f | true | 300 | 299 | |
|
||||
| f | true | 303 | 300 | |
|
||||
| f | true | 305 | 303 | |
|
||||
| f | true | 308 | 334 | |
|
||||
| f | true | 312 | 308 | |
|
||||
| f | true | 313 | 312 | |
|
||||
| f | true | 316 | 318 | |
|
||||
| f | true | 318 | 313 | |
|
||||
| f | true | 320 | 316 | |
|
||||
| f | true | 322 | 383 | |
|
||||
| f | true | 324 | 332 | |
|
||||
| f | true | 326 | 192 | |
|
||||
| f | true | 328 | 330 | |
|
||||
| f | true | 330 | 181 | |
|
||||
| f | true | 332 | 333 | |
|
||||
| f | true | 333 | 328 | |
|
||||
| f | true | 334 | 336 | |
|
||||
| f | true | 336 | 322 | |
|
||||
| f | true | 337 | 339 | |
|
||||
| f | true | 339 | 320 | |
|
||||
| f | true | 340 | 342 | |
|
||||
| f | true | 342 | 305 | |
|
||||
| f | true | 343 | 344 | |
|
||||
| f | true | 344 | 340 | |
|
||||
| f | true | 345 | 347 | |
|
||||
| f | true | 347 | 290 | |
|
||||
| f | true | 348 | 350 | |
|
||||
| f | true | 350 | 288 | |
|
||||
| f | true | 351 | 352 | |
|
||||
| f | true | 352 | 348 | |
|
||||
| f | true | 353 | 354 | |
|
||||
| f | true | 354 | 350 | |
|
||||
| f | true | 354 | 351 | |
|
||||
| f | true | 355 | 356 | |
|
||||
| f | true | 356 | 353 | |
|
||||
| f | true | 356 | 328 | |
|
||||
| f | true | 357 | 358 | |
|
||||
| f | true | 358 | 355 | |
|
||||
| f | true | 359 | 361 | |
|
||||
| f | true | 361 | 283 | |
|
||||
| f | true | 362 | 364 | |
|
||||
| f | true | 364 | 313 | |
|
||||
| f | true | 359 | 360 | |
|
||||
| f | true | 360 | 357 | |
|
||||
| f | true | 361 | 362 | |
|
||||
| f | true | 362 | 316 | |
|
||||
| f | true | 363 | 364 | |
|
||||
| f | true | 364 | 361 | |
|
||||
| f | true | 365 | 367 | |
|
||||
| f | true | 367 | 315 | |
|
||||
| f | true | 368 | 369 | |
|
||||
| f | true | 369 | 165 | |
|
||||
| f | true | 370 | 371 | |
|
||||
| f | true | 371 | 368 | |
|
||||
| getClass2 | false | 425 | 425 | getClass2 |
|
||||
| f | true | 367 | 275 | |
|
||||
| f | true | 369 | 292 | |
|
||||
| f | true | 373 | 369 | |
|
||||
| f | true | 374 | 373 | |
|
||||
| f | true | 378 | 324 | |
|
||||
| f | true | 382 | 378 | |
|
||||
| f | true | 383 | 382 | |
|
||||
| getClass2 | false | 420 | 420 | getClass2 |
|
||||
|
||||
@@ -1,14 +1,14 @@
|
||||
| destructors2.cpp:5:7:5:7 | Class2 | 5 | return ... | 3 | 5 | Class2 |
|
||||
| destructors2.cpp:17:9:17:13 | Inner | 17 | return ... | 3 | 17 | Inner |
|
||||
| destructors2.cpp:18:9:18:14 | ~Inner | 18 | return ... | 3 | 18 | ~Inner |
|
||||
| destructors2.cpp:21:10:21:11 | f2 | 24 | return ... | 9 | 27 | c |
|
||||
| destructors2.cpp:21:10:21:11 | f2 | 24 | return ... | 10 | 27 | call to ~Class2 |
|
||||
| destructors2.cpp:21:10:21:11 | f2 | 24 | return ... | 20 | 21 | f2 |
|
||||
| destructors2.cpp:21:10:21:11 | f2 | 24 | return ... | 16 | 27 | c |
|
||||
| destructors2.cpp:21:10:21:11 | f2 | 24 | return ... | 17 | 27 | call to ~Class2 |
|
||||
| destructors2.cpp:21:10:21:11 | f2 | 24 | return ... | 18 | 21 | f2 |
|
||||
| destructors2.cpp:21:10:21:11 | f2 | 27 | return ... | 12 | 27 | inner |
|
||||
| destructors2.cpp:21:10:21:11 | f2 | 27 | return ... | 13 | 27 | call to ~Inner |
|
||||
| destructors2.cpp:21:10:21:11 | f2 | 27 | return ... | 14 | 27 | c |
|
||||
| destructors2.cpp:21:10:21:11 | f2 | 27 | return ... | 15 | 27 | call to ~Class2 |
|
||||
| destructors2.cpp:21:10:21:11 | f2 | 27 | return ... | 20 | 21 | f2 |
|
||||
| destructors2.cpp:21:10:21:11 | f2 | 27 | return ... | 16 | 27 | c |
|
||||
| destructors2.cpp:21:10:21:11 | f2 | 27 | return ... | 17 | 27 | call to ~Class2 |
|
||||
| destructors2.cpp:21:10:21:11 | f2 | 27 | return ... | 18 | 21 | f2 |
|
||||
| destructors.cpp:8:6:8:6 | f | 17 | goto ... | 26 | 21 | c31 |
|
||||
| destructors.cpp:8:6:8:6 | f | 17 | goto ... | 27 | 21 | call to ~C |
|
||||
| destructors.cpp:8:6:8:6 | f | 17 | goto ... | 28 | 26 | c20 |
|
||||
@@ -19,11 +19,11 @@
|
||||
| destructors.cpp:8:6:8:6 | f | 19 | return ... | 35 | 21 | call to ~C |
|
||||
| destructors.cpp:8:6:8:6 | f | 19 | return ... | 36 | 26 | c20 |
|
||||
| destructors.cpp:8:6:8:6 | f | 19 | return ... | 37 | 26 | call to ~C |
|
||||
| destructors.cpp:8:6:8:6 | f | 19 | return ... | 38 | 35 | c10 |
|
||||
| destructors.cpp:8:6:8:6 | f | 19 | return ... | 39 | 35 | call to ~C |
|
||||
| destructors.cpp:8:6:8:6 | f | 19 | return ... | 94 | 8 | f |
|
||||
| destructors.cpp:8:6:8:6 | f | 19 | return ... | 90 | 35 | c10 |
|
||||
| destructors.cpp:8:6:8:6 | f | 19 | return ... | 91 | 35 | call to ~C |
|
||||
| destructors.cpp:8:6:8:6 | f | 19 | return ... | 92 | 8 | f |
|
||||
| destructors.cpp:8:6:8:6 | f | 35 | return ... | 81 | 35 | c11 |
|
||||
| destructors.cpp:8:6:8:6 | f | 35 | return ... | 82 | 35 | call to ~C |
|
||||
| destructors.cpp:8:6:8:6 | f | 35 | return ... | 83 | 35 | c10 |
|
||||
| destructors.cpp:8:6:8:6 | f | 35 | return ... | 84 | 35 | call to ~C |
|
||||
| destructors.cpp:8:6:8:6 | f | 35 | return ... | 94 | 8 | f |
|
||||
| destructors.cpp:8:6:8:6 | f | 35 | return ... | 90 | 35 | c10 |
|
||||
| destructors.cpp:8:6:8:6 | f | 35 | return ... | 91 | 35 | call to ~C |
|
||||
| destructors.cpp:8:6:8:6 | f | 35 | return ... | 92 | 8 | f |
|
||||
|
||||
@@ -17,9 +17,4 @@ void GetUUID() {
|
||||
uuid = __uuidof(s);
|
||||
uuid = __uuidof(0);
|
||||
}
|
||||
|
||||
template <typename Placeholder, typename ...>
|
||||
auto Wrapper = __uuidof(Placeholder);
|
||||
auto inst = Wrapper<S>;
|
||||
|
||||
// semmle-extractor-options: --microsoft
|
||||
|
||||
@@ -12,5 +12,3 @@ uuidofOperators
|
||||
| uuidof.cpp:15:12:15:29 | __uuidof(S) | const _GUID | 01234567-89ab-cdef-0123-456789abcdef |
|
||||
| uuidof.cpp:17:12:17:22 | __uuidof(S) | const _GUID | 01234567-89ab-cdef-0123-456789abcdef |
|
||||
| uuidof.cpp:18:12:18:22 | __uuidof(0) | const _GUID | 00000000-0000-0000-0000-000000000000 |
|
||||
| uuidof.cpp:22:16:22:36 | __uuidof(Placeholder) | const _GUID | |
|
||||
| uuidof.cpp:22:16:22:36 | __uuidof(S) | const _GUID | 01234567-89ab-cdef-0123-456789abcdef |
|
||||
|
||||
@@ -5,6 +5,6 @@ query predicate classUuids(Class cls, string uuid) {
|
||||
}
|
||||
|
||||
query predicate uuidofOperators(UuidofOperator op, string type, string uuid) {
|
||||
(if exists(op.getValue()) then uuid = op.getValue() else uuid = "") and
|
||||
uuid = op.getValue() and
|
||||
type = op.getType().toString()
|
||||
}
|
||||
|
||||
@@ -1,94 +1,94 @@
|
||||
| copy.cpp:5:5:5:5 | C | void protected_cc::C::C(protected_cc::C const&) | | defaulted |
|
||||
| copy.cpp:6:8:6:16 | operator= | protected_cc::C& protected_cc::C::operator=(protected_cc::C const&) | | defaulted |
|
||||
| copy.cpp:9:9:9:9 | Sub1 | void protected_cc::Sub1::Sub1() | deleted | |
|
||||
| copy.cpp:9:9:9:9 | Sub1 | void protected_cc::Sub1::Sub1(protected_cc::Sub1 const&) | | |
|
||||
| copy.cpp:9:9:9:9 | Sub1 | void protected_cc::Sub1::Sub1(protected_cc::Sub1&&) | | |
|
||||
| copy.cpp:9:9:9:9 | operator= | protected_cc::Sub1& protected_cc::Sub1::operator=(protected_cc::Sub1 const&) | | |
|
||||
| copy.cpp:9:9:9:9 | operator= | protected_cc::Sub1& protected_cc::Sub1::operator=(protected_cc::Sub1&&) | | |
|
||||
| copy.cpp:13:9:13:9 | Sub2 | void protected_cc::Sub2::Sub2() | deleted | |
|
||||
| copy.cpp:13:9:13:9 | Sub2 | void protected_cc::Sub2::Sub2(protected_cc::Sub2 const&) | | |
|
||||
| copy.cpp:13:9:13:9 | Sub2 | void protected_cc::Sub2::Sub2(protected_cc::Sub2&&) | | |
|
||||
| copy.cpp:13:9:13:9 | operator= | protected_cc::Sub2& protected_cc::Sub2::operator=(protected_cc::Sub2 const&) | | |
|
||||
| copy.cpp:13:9:13:9 | operator= | protected_cc::Sub2& protected_cc::Sub2::operator=(protected_cc::Sub2&&) | | |
|
||||
| copy.cpp:17:9:17:9 | HasMember | void protected_cc::HasMember::HasMember() | deleted | |
|
||||
| copy.cpp:17:9:17:9 | HasMember | void protected_cc::HasMember::HasMember(protected_cc::HasMember const&) | | |
|
||||
| copy.cpp:17:9:17:9 | HasMember | void protected_cc::HasMember::HasMember(protected_cc::HasMember&&) | | |
|
||||
| copy.cpp:17:9:17:9 | operator= | protected_cc::HasMember& protected_cc::HasMember::operator=(protected_cc::HasMember const&) | | |
|
||||
| copy.cpp:17:9:17:9 | operator= | protected_cc::HasMember& protected_cc::HasMember::operator=(protected_cc::HasMember&&) | | |
|
||||
| copy.cpp:25:5:25:5 | C | void deleted_cc::C::C(deleted_cc::C const&) | deleted | |
|
||||
| copy.cpp:26:8:26:16 | operator= | deleted_cc::C& deleted_cc::C::operator=(deleted_cc::C const&) | deleted | |
|
||||
| copy.cpp:29:9:29:9 | Sub | void deleted_cc::Sub::Sub() | deleted | |
|
||||
| copy.cpp:29:9:29:9 | Sub | void deleted_cc::Sub::Sub(deleted_cc::Sub const&) | deleted | |
|
||||
| copy.cpp:29:9:29:9 | operator= | deleted_cc::Sub& deleted_cc::Sub::operator=(deleted_cc::Sub const&) | deleted | |
|
||||
| copy.cpp:37:5:37:5 | C | void private_cc::C::C(private_cc::C&) | | defaulted |
|
||||
| copy.cpp:38:8:38:16 | operator= | private_cc::C& private_cc::C::operator=(private_cc::C const&) | | defaulted |
|
||||
| copy.cpp:41:9:41:9 | operator= | private_cc::Sub& private_cc::Sub::operator=(private_cc::Sub const&) | | |
|
||||
| copy.cpp:46:5:46:7 | Sub | void private_cc::Sub::Sub(private_cc::Sub&) | deleted | defaulted |
|
||||
| copy.cpp:49:9:49:9 | HasPointer | void private_cc::HasPointer::HasPointer() | | |
|
||||
| copy.cpp:49:9:49:9 | operator= | private_cc::HasPointer& private_cc::HasPointer::operator=(private_cc::HasPointer const&) | | |
|
||||
| copy.cpp:49:9:49:9 | operator= | private_cc::HasPointer& private_cc::HasPointer::operator=(private_cc::HasPointer&&) | | |
|
||||
| copy.cpp:54:9:54:9 | HasArray | void private_cc::HasArray::HasArray() | deleted | |
|
||||
| copy.cpp:54:9:54:9 | HasArray | void private_cc::HasArray::HasArray(private_cc::HasArray&) | deleted | |
|
||||
| copy.cpp:54:9:54:9 | operator= | private_cc::HasArray& private_cc::HasArray::operator=(private_cc::HasArray const&) | | |
|
||||
| copy.cpp:54:9:54:9 | operator= | private_cc::HasArray& private_cc::HasArray::operator=(private_cc::HasArray&&) | | |
|
||||
| copy.cpp:59:9:59:9 | HasArray2D | void private_cc::HasArray2D::HasArray2D() | deleted | |
|
||||
| copy.cpp:59:9:59:9 | HasArray2D | void private_cc::HasArray2D::HasArray2D(private_cc::HasArray2D&) | deleted | |
|
||||
| copy.cpp:59:9:59:9 | operator= | private_cc::HasArray2D& private_cc::HasArray2D::operator=(private_cc::HasArray2D const&) | | |
|
||||
| copy.cpp:59:9:59:9 | operator= | private_cc::HasArray2D& private_cc::HasArray2D::operator=(private_cc::HasArray2D&&) | | |
|
||||
| copy.cpp:67:9:67:9 | Wrapper | void container::Wrapper<container::Copyable>::Wrapper() | | |
|
||||
| copy.cpp:67:9:67:9 | Wrapper | void container::Wrapper<container::NotCopyable>::Wrapper() | deleted | |
|
||||
| copy.cpp:67:9:67:9 | Wrapper | void container::Wrapper<container::NotCopyable>::Wrapper(container::Wrapper<container::NotCopyable> const&) | deleted | |
|
||||
| copy.cpp:67:9:67:9 | Wrapper | void container::Wrapper<container::NotCopyable>::Wrapper(container::Wrapper<container::NotCopyable>&&) | | |
|
||||
| copy.cpp:67:9:67:9 | operator= | container::Wrapper<container::Copyable>& container::Wrapper<container::Copyable>::operator=(container::Wrapper<container::Copyable> const&) | | |
|
||||
| copy.cpp:67:9:67:9 | operator= | container::Wrapper<container::Copyable>& container::Wrapper<container::Copyable>::operator=(container::Wrapper<container::Copyable>&&) | | |
|
||||
| copy.cpp:67:9:67:9 | operator= | container::Wrapper<container::NotCopyable>& container::Wrapper<container::NotCopyable>::operator=(container::Wrapper<container::NotCopyable> const&) | deleted | |
|
||||
| copy.cpp:71:9:71:9 | operator= | container::Copyable& container::Copyable::operator=(container::Copyable const&) | | |
|
||||
| copy.cpp:71:9:71:9 | operator= | container::Copyable& container::Copyable::operator=(container::Copyable&&) | | |
|
||||
| copy.cpp:72:9:72:9 | NotCopyable | void container::NotCopyable::NotCopyable() | deleted | |
|
||||
| copy.cpp:72:9:72:9 | NotCopyable | void container::NotCopyable::NotCopyable(container::NotCopyable const&) | deleted | |
|
||||
| copy.cpp:72:9:72:9 | NotCopyable | void container::NotCopyable::NotCopyable(container::NotCopyable&&) | | |
|
||||
| copy.cpp:72:9:72:9 | operator= | container::NotCopyable& container::NotCopyable::operator=(container::NotCopyable const&) | deleted | |
|
||||
| copy.cpp:76:9:76:9 | CopyableComposition | void container::CopyableComposition::CopyableComposition() | | |
|
||||
| copy.cpp:76:9:76:9 | operator= | container::CopyableComposition& container::CopyableComposition::operator=(container::CopyableComposition const&) | | |
|
||||
| copy.cpp:76:9:76:9 | operator= | container::CopyableComposition& container::CopyableComposition::operator=(container::CopyableComposition&&) | | |
|
||||
| copy.cpp:80:9:80:9 | NotCopyableComposition | void container::NotCopyableComposition::NotCopyableComposition() | deleted | |
|
||||
| copy.cpp:80:9:80:9 | NotCopyableComposition | void container::NotCopyableComposition::NotCopyableComposition(container::NotCopyableComposition const&) | deleted | |
|
||||
| copy.cpp:80:9:80:9 | NotCopyableComposition | void container::NotCopyableComposition::NotCopyableComposition(container::NotCopyableComposition&&) | | |
|
||||
| copy.cpp:80:9:80:9 | operator= | container::NotCopyableComposition& container::NotCopyableComposition::operator=(container::NotCopyableComposition const&) | deleted | |
|
||||
| copy.cpp:84:9:84:9 | CopyableInheritance | void container::CopyableInheritance::CopyableInheritance() | | |
|
||||
| copy.cpp:84:9:84:9 | operator= | container::CopyableInheritance& container::CopyableInheritance::operator=(container::CopyableInheritance const&) | | |
|
||||
| copy.cpp:84:9:84:9 | operator= | container::CopyableInheritance& container::CopyableInheritance::operator=(container::CopyableInheritance&&) | | |
|
||||
| copy.cpp:86:9:86:9 | NotCopyableInheritance | void container::NotCopyableInheritance::NotCopyableInheritance() | deleted | |
|
||||
| copy.cpp:86:9:86:9 | NotCopyableInheritance | void container::NotCopyableInheritance::NotCopyableInheritance(container::NotCopyableInheritance const&) | deleted | |
|
||||
| copy.cpp:86:9:86:9 | NotCopyableInheritance | void container::NotCopyableInheritance::NotCopyableInheritance(container::NotCopyableInheritance&&) | | |
|
||||
| copy.cpp:86:9:86:9 | operator= | container::NotCopyableInheritance& container::NotCopyableInheritance::operator=(container::NotCopyableInheritance const&) | deleted | |
|
||||
| copy.cpp:90:9:90:9 | operator= | typedefs::A& typedefs::A::operator=(typedefs::A const&) | | |
|
||||
| copy.cpp:90:9:90:9 | operator= | typedefs::A& typedefs::A::operator=(typedefs::A&&) | | |
|
||||
| copy.cpp:91:11:91:11 | operator= | typedefs::A::B& typedefs::A::B::operator=(typedefs::A::B const private&) | | |
|
||||
| copy.cpp:91:11:91:11 | operator= | typedefs::A::B& typedefs::A::B::operator=(typedefs::A::B&&) | | |
|
||||
| copy.cpp:95:9:95:9 | operator= | typedefs::C& typedefs::C::operator=(typedefs::C const&) | | |
|
||||
| copy.cpp:95:9:95:9 | operator= | typedefs::C& typedefs::C::operator=(typedefs::C&&) | | |
|
||||
| copy.cpp:100:9:100:9 | Derived | void typedefs::Derived::Derived() | | |
|
||||
| copy.cpp:100:9:100:9 | operator= | typedefs::Derived& typedefs::Derived::operator=(typedefs::Derived const&) | | |
|
||||
| copy.cpp:100:9:100:9 | operator= | typedefs::Derived& typedefs::Derived::operator=(typedefs::Derived&&) | | |
|
||||
| copy.cpp:106:9:106:9 | MoveCtor | void moves::MoveCtor::MoveCtor(moves::MoveCtor const&) | deleted | |
|
||||
| copy.cpp:106:9:106:9 | operator= | moves::MoveCtor& moves::MoveCtor::operator=(moves::MoveCtor const&) | deleted | |
|
||||
| copy.cpp:108:5:108:12 | MoveCtor | void moves::MoveCtor::MoveCtor(moves::MoveCtor&&) | | |
|
||||
| copy.cpp:111:9:111:9 | MoveAssign | void moves::MoveAssign::MoveAssign() | | |
|
||||
| copy.cpp:111:9:111:9 | MoveAssign | void moves::MoveAssign::MoveAssign(moves::MoveAssign const&) | deleted | |
|
||||
| copy.cpp:111:9:111:9 | operator= | moves::MoveAssign& moves::MoveAssign::operator=(moves::MoveAssign const&) | deleted | |
|
||||
| copy.cpp:113:17:113:25 | operator= | moves::MoveAssign& moves::MoveAssign::operator=(moves::MoveAssign&&) | | |
|
||||
| copy.cpp:120:9:120:9 | OnlyCtor | void difference::OnlyCtor::OnlyCtor() | deleted | |
|
||||
| copy.cpp:120:9:120:9 | operator= | difference::OnlyCtor& difference::OnlyCtor::operator=(difference::OnlyCtor const&) | deleted | |
|
||||
| copy.cpp:126:11:126:19 | operator= | difference::Base& difference::Base::operator=(difference::Base const&) | | |
|
||||
| copy.cpp:128:5:128:8 | Base | void difference::Base::Base(difference::Base const&) | | |
|
||||
| copy.cpp:131:9:131:9 | OnlyAssign | void difference::OnlyAssign::OnlyAssign() | deleted | |
|
||||
| copy.cpp:131:9:131:9 | OnlyAssign | void difference::OnlyAssign::OnlyAssign(difference::OnlyAssign const&) | deleted | |
|
||||
| copy.cpp:131:9:131:9 | operator= | difference::OnlyAssign& difference::OnlyAssign::operator=(difference::OnlyAssign const&) | | |
|
||||
| copy.cpp:131:9:131:9 | operator= | difference::OnlyAssign& difference::OnlyAssign::operator=(difference::OnlyAssign&&) | | |
|
||||
| copy.cpp:137:9:137:9 | operator= | instantiated_explicit_ctor::Wrapper<int>& instantiated_explicit_ctor::Wrapper<int>::operator=(instantiated_explicit_ctor::Wrapper<int> const&) | | |
|
||||
| copy.cpp:139:5:139:11 | Wrapper | void instantiated_explicit_ctor::Wrapper<T>::Wrapper(instantiated_explicit_ctor::Wrapper<T>&) | | |
|
||||
| copy.cpp:143:5:143:5 | Wrapper | void instantiated_explicit_ctor::Wrapper<int>::Wrapper() | | |
|
||||
| copy.cpp:143:5:143:11 | Wrapper | void instantiated_explicit_ctor::Wrapper<T>::Wrapper() | | |
|
||||
| file://:0:0:0:0 | operator= | __va_list_tag& __va_list_tag::operator=(__va_list_tag const&) | | |
|
||||
| file://:0:0:0:0 | operator= | __va_list_tag& __va_list_tag::operator=(__va_list_tag&&) | | |
|
||||
| copy.cpp:5:5:5:5 | C | | defaulted |
|
||||
| copy.cpp:6:8:6:16 | operator= | | defaulted |
|
||||
| copy.cpp:9:9:9:9 | Sub1 | | |
|
||||
| copy.cpp:9:9:9:9 | Sub1 | | |
|
||||
| copy.cpp:9:9:9:9 | Sub1 | deleted | |
|
||||
| copy.cpp:9:9:9:9 | operator= | | |
|
||||
| copy.cpp:9:9:9:9 | operator= | | |
|
||||
| copy.cpp:13:9:13:9 | Sub2 | | |
|
||||
| copy.cpp:13:9:13:9 | Sub2 | | |
|
||||
| copy.cpp:13:9:13:9 | Sub2 | deleted | |
|
||||
| copy.cpp:13:9:13:9 | operator= | | |
|
||||
| copy.cpp:13:9:13:9 | operator= | | |
|
||||
| copy.cpp:17:9:17:9 | HasMember | | |
|
||||
| copy.cpp:17:9:17:9 | HasMember | | |
|
||||
| copy.cpp:17:9:17:9 | HasMember | deleted | |
|
||||
| copy.cpp:17:9:17:9 | operator= | | |
|
||||
| copy.cpp:17:9:17:9 | operator= | | |
|
||||
| copy.cpp:25:5:25:5 | C | deleted | |
|
||||
| copy.cpp:26:8:26:16 | operator= | deleted | |
|
||||
| copy.cpp:29:9:29:9 | Sub | deleted | |
|
||||
| copy.cpp:29:9:29:9 | Sub | deleted | |
|
||||
| copy.cpp:29:9:29:9 | operator= | deleted | |
|
||||
| copy.cpp:37:5:37:5 | C | | defaulted |
|
||||
| copy.cpp:38:8:38:16 | operator= | | defaulted |
|
||||
| copy.cpp:41:9:41:9 | operator= | | |
|
||||
| copy.cpp:46:5:46:7 | Sub | deleted | defaulted |
|
||||
| copy.cpp:49:9:49:9 | HasPointer | | |
|
||||
| copy.cpp:49:9:49:9 | operator= | | |
|
||||
| copy.cpp:49:9:49:9 | operator= | | |
|
||||
| copy.cpp:54:9:54:9 | HasArray | deleted | |
|
||||
| copy.cpp:54:9:54:9 | HasArray | deleted | |
|
||||
| copy.cpp:54:9:54:9 | operator= | | |
|
||||
| copy.cpp:54:9:54:9 | operator= | | |
|
||||
| copy.cpp:59:9:59:9 | HasArray2D | deleted | |
|
||||
| copy.cpp:59:9:59:9 | HasArray2D | deleted | |
|
||||
| copy.cpp:59:9:59:9 | operator= | | |
|
||||
| copy.cpp:59:9:59:9 | operator= | | |
|
||||
| copy.cpp:67:9:67:9 | Wrapper | | |
|
||||
| copy.cpp:67:9:67:9 | Wrapper | | |
|
||||
| copy.cpp:67:9:67:9 | Wrapper | deleted | |
|
||||
| copy.cpp:67:9:67:9 | Wrapper | deleted | |
|
||||
| copy.cpp:67:9:67:9 | operator= | | |
|
||||
| copy.cpp:67:9:67:9 | operator= | | |
|
||||
| copy.cpp:67:9:67:9 | operator= | deleted | |
|
||||
| copy.cpp:71:9:71:9 | operator= | | |
|
||||
| copy.cpp:71:9:71:9 | operator= | | |
|
||||
| copy.cpp:72:9:72:9 | NotCopyable | | |
|
||||
| copy.cpp:72:9:72:9 | NotCopyable | deleted | |
|
||||
| copy.cpp:72:9:72:9 | NotCopyable | deleted | |
|
||||
| copy.cpp:72:9:72:9 | operator= | deleted | |
|
||||
| copy.cpp:76:9:76:9 | CopyableComposition | | |
|
||||
| copy.cpp:76:9:76:9 | operator= | | |
|
||||
| copy.cpp:76:9:76:9 | operator= | | |
|
||||
| copy.cpp:80:9:80:9 | NotCopyableComposition | | |
|
||||
| copy.cpp:80:9:80:9 | NotCopyableComposition | deleted | |
|
||||
| copy.cpp:80:9:80:9 | NotCopyableComposition | deleted | |
|
||||
| copy.cpp:80:9:80:9 | operator= | deleted | |
|
||||
| copy.cpp:84:9:84:9 | CopyableInheritance | | |
|
||||
| copy.cpp:84:9:84:9 | operator= | | |
|
||||
| copy.cpp:84:9:84:9 | operator= | | |
|
||||
| copy.cpp:86:9:86:9 | NotCopyableInheritance | | |
|
||||
| copy.cpp:86:9:86:9 | NotCopyableInheritance | deleted | |
|
||||
| copy.cpp:86:9:86:9 | NotCopyableInheritance | deleted | |
|
||||
| copy.cpp:86:9:86:9 | operator= | deleted | |
|
||||
| copy.cpp:90:9:90:9 | operator= | | |
|
||||
| copy.cpp:90:9:90:9 | operator= | | |
|
||||
| copy.cpp:91:11:91:11 | operator= | | |
|
||||
| copy.cpp:91:11:91:11 | operator= | | |
|
||||
| copy.cpp:95:9:95:9 | operator= | | |
|
||||
| copy.cpp:95:9:95:9 | operator= | | |
|
||||
| copy.cpp:100:9:100:9 | Derived | | |
|
||||
| copy.cpp:100:9:100:9 | operator= | | |
|
||||
| copy.cpp:100:9:100:9 | operator= | | |
|
||||
| copy.cpp:106:9:106:9 | MoveCtor | deleted | |
|
||||
| copy.cpp:106:9:106:9 | operator= | deleted | |
|
||||
| copy.cpp:108:5:108:12 | MoveCtor | | |
|
||||
| copy.cpp:111:9:111:9 | MoveAssign | | |
|
||||
| copy.cpp:111:9:111:9 | MoveAssign | deleted | |
|
||||
| copy.cpp:111:9:111:9 | operator= | deleted | |
|
||||
| copy.cpp:113:17:113:25 | operator= | | |
|
||||
| copy.cpp:120:9:120:9 | OnlyCtor | deleted | |
|
||||
| copy.cpp:120:9:120:9 | operator= | deleted | |
|
||||
| copy.cpp:126:11:126:19 | operator= | | |
|
||||
| copy.cpp:128:5:128:8 | Base | | |
|
||||
| copy.cpp:131:9:131:9 | OnlyAssign | deleted | |
|
||||
| copy.cpp:131:9:131:9 | OnlyAssign | deleted | |
|
||||
| copy.cpp:131:9:131:9 | operator= | | |
|
||||
| copy.cpp:131:9:131:9 | operator= | | |
|
||||
| copy.cpp:137:9:137:9 | operator= | | |
|
||||
| copy.cpp:139:5:139:11 | Wrapper | | |
|
||||
| copy.cpp:143:5:143:5 | Wrapper | | |
|
||||
| copy.cpp:143:5:143:11 | Wrapper | | |
|
||||
| file://:0:0:0:0 | operator= | | |
|
||||
| file://:0:0:0:0 | operator= | | |
|
||||
|
||||
@@ -1,8 +1,7 @@
|
||||
import cpp
|
||||
import semmle.code.cpp.Print
|
||||
|
||||
from Function f, string deleted, string defaulted
|
||||
where
|
||||
(if f.isDeleted() then deleted = "deleted" else deleted = "") and
|
||||
if f.isDefaulted() then defaulted = "defaulted" else defaulted = ""
|
||||
select f, getIdentityString(f), deleted, defaulted
|
||||
select f, deleted, defaulted
|
||||
|
||||
@@ -1,62 +0,0 @@
|
||||
// #include <iostream>
|
||||
// #include <string>
|
||||
// #include <stdio.h>
|
||||
// #include <string.h>
|
||||
// #include <sstream>
|
||||
#include "stl.h"
|
||||
|
||||
int sprintf(char *s, const char *format, ...);
|
||||
char *strcat(char * s1, const char * s2);
|
||||
|
||||
using namespace std;
|
||||
|
||||
|
||||
void test1(){
|
||||
string str1 = "Hello";
|
||||
string str2 = "World";
|
||||
string str3 = "!";
|
||||
string str4 = "Concatenation";
|
||||
string str5 = "is";
|
||||
string str6 = "fun";
|
||||
|
||||
// Using the + operator
|
||||
string result1 = str1 + " " + str2 + str3;
|
||||
|
||||
// Using the append() function
|
||||
//----TODO: currently not modeled----
|
||||
// string result2 = str4.append(" ") + str5.append(" ") + str6;
|
||||
|
||||
// Using the insert() function
|
||||
//----TODO: currently not modeled----
|
||||
// string result3 = str1.insert(5, " ") + str2.insert(5, "! ");
|
||||
|
||||
// Using the replace() function
|
||||
//----TODO: currently not modeled----
|
||||
// string result4 = str1.replace(0, 5, "Hi") + str2.replace(0, 5, "There");
|
||||
|
||||
// Using the push_back() function
|
||||
//----TODO: currently not modeled----
|
||||
// string result5;
|
||||
// for (char c : str1) {
|
||||
// result5.push_back(c);
|
||||
// }
|
||||
|
||||
// Using the stream operator
|
||||
string result6;
|
||||
std::stringstream ss;
|
||||
ss << str1 << " " << str2 << str3;
|
||||
}
|
||||
|
||||
|
||||
void test2(char* ucstr) {
|
||||
char str1[20] = "Hello";
|
||||
char str2[20] = "World";
|
||||
char result[40];
|
||||
char *result2;
|
||||
|
||||
// Using sprintf
|
||||
sprintf(result, "%s %s %s", str1, str2, ucstr);
|
||||
|
||||
// Using strcat
|
||||
strcat(str1, ucstr);
|
||||
}
|
||||
@@ -1,644 +0,0 @@
|
||||
|
||||
typedef unsigned long size_t;
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
#include "type_traits.h"
|
||||
|
||||
namespace std
|
||||
{
|
||||
template<class T> constexpr T&& forward(remove_reference_t<T>& t) noexcept;
|
||||
template<class T> constexpr T&& forward(remove_reference_t<T>&& t) noexcept;
|
||||
}
|
||||
|
||||
// --- iterator ---
|
||||
|
||||
namespace std {
|
||||
struct ptrdiff_t;
|
||||
|
||||
template<class I> struct iterator_traits;
|
||||
|
||||
template <class Category,
|
||||
class value_type,
|
||||
class difference_type = ptrdiff_t,
|
||||
class pointer_type = value_type*,
|
||||
class reference_type = value_type&>
|
||||
struct iterator {
|
||||
typedef Category iterator_category;
|
||||
|
||||
iterator();
|
||||
iterator(iterator<Category, remove_const_t<value_type> > const &other); // non-const -> const conversion constructor
|
||||
|
||||
iterator &operator++();
|
||||
iterator operator++(int);
|
||||
iterator &operator--();
|
||||
iterator operator--(int);
|
||||
bool operator==(iterator other) const;
|
||||
bool operator!=(iterator other) const;
|
||||
reference_type operator*() const;
|
||||
pointer_type operator->() const;
|
||||
iterator operator+(int);
|
||||
iterator operator-(int);
|
||||
iterator &operator+=(int);
|
||||
iterator &operator-=(int);
|
||||
int operator-(iterator);
|
||||
reference_type operator[](int);
|
||||
};
|
||||
|
||||
struct input_iterator_tag {};
|
||||
struct forward_iterator_tag : public input_iterator_tag {};
|
||||
struct bidirectional_iterator_tag : public forward_iterator_tag {};
|
||||
struct random_access_iterator_tag : public bidirectional_iterator_tag {};
|
||||
|
||||
struct output_iterator_tag {};
|
||||
|
||||
template<class Container>
|
||||
class back_insert_iterator {
|
||||
protected:
|
||||
Container* container = nullptr;
|
||||
public:
|
||||
using iterator_category = output_iterator_tag;
|
||||
using value_type = void;
|
||||
using difference_type = ptrdiff_t;
|
||||
using pointer = void;
|
||||
using reference = void;
|
||||
using container_type = Container;
|
||||
constexpr back_insert_iterator() noexcept = default;
|
||||
constexpr explicit back_insert_iterator(Container& x);
|
||||
back_insert_iterator& operator=(const typename Container::value_type& value);
|
||||
back_insert_iterator& operator=(typename Container::value_type&& value);
|
||||
back_insert_iterator& operator*();
|
||||
back_insert_iterator& operator++();
|
||||
back_insert_iterator operator++(int);
|
||||
};
|
||||
|
||||
template<class Container>
|
||||
constexpr back_insert_iterator<Container> back_inserter(Container& x) {
|
||||
return back_insert_iterator<Container>(x);
|
||||
}
|
||||
|
||||
template<class Container>
|
||||
class front_insert_iterator {
|
||||
protected:
|
||||
Container* container = nullptr;
|
||||
public:
|
||||
using iterator_category = output_iterator_tag;
|
||||
using value_type = void;
|
||||
using difference_type = ptrdiff_t;
|
||||
using pointer = void;
|
||||
using reference = void;
|
||||
using container_type = Container;
|
||||
constexpr front_insert_iterator() noexcept = default;
|
||||
constexpr explicit front_insert_iterator(Container& x);
|
||||
constexpr front_insert_iterator& operator=(const typename Container::value_type& value);
|
||||
constexpr front_insert_iterator& operator=(typename Container::value_type&& value);
|
||||
constexpr front_insert_iterator& operator*();
|
||||
constexpr front_insert_iterator& operator++();
|
||||
constexpr front_insert_iterator operator++(int);
|
||||
};
|
||||
template<class Container>
|
||||
constexpr front_insert_iterator<Container> front_inserter(Container& x) {
|
||||
return front_insert_iterator<Container>(x);
|
||||
}
|
||||
}
|
||||
|
||||
// --- string ---
|
||||
|
||||
namespace std
|
||||
{
|
||||
template<class charT> struct char_traits;
|
||||
|
||||
typedef size_t streamsize;
|
||||
|
||||
template <class T> class allocator {
|
||||
public:
|
||||
allocator() throw();
|
||||
typedef size_t size_type;
|
||||
};
|
||||
|
||||
template<class charT, class traits = char_traits<charT>, class Allocator = allocator<charT> >
|
||||
class basic_string {
|
||||
public:
|
||||
using value_type = charT;
|
||||
using reference = value_type&;
|
||||
using const_reference = const value_type&;
|
||||
typedef typename Allocator::size_type size_type;
|
||||
static const size_type npos = -1;
|
||||
|
||||
explicit basic_string(const Allocator& a = Allocator());
|
||||
basic_string(const charT* s, const Allocator& a = Allocator());
|
||||
template<class InputIterator> basic_string(InputIterator begin, InputIterator end, const Allocator& a = Allocator());
|
||||
|
||||
const charT* c_str() const;
|
||||
charT* data() noexcept;
|
||||
size_t length() const;
|
||||
|
||||
typedef std::iterator<random_access_iterator_tag, charT> iterator;
|
||||
typedef std::iterator<random_access_iterator_tag, const charT> const_iterator;
|
||||
|
||||
iterator begin();
|
||||
iterator end();
|
||||
const_iterator begin() const;
|
||||
const_iterator end() const;
|
||||
const_iterator cbegin() const;
|
||||
const_iterator cend() const;
|
||||
|
||||
void push_back(charT c);
|
||||
|
||||
const charT& front() const;
|
||||
charT& front();
|
||||
const charT& back() const;
|
||||
charT& back();
|
||||
|
||||
const_reference operator[](size_type pos) const;
|
||||
reference operator[](size_type pos);
|
||||
const_reference at(size_type n) const;
|
||||
reference at(size_type n);
|
||||
template<class T> basic_string& operator+=(const T& t);
|
||||
basic_string& operator+=(const charT* s);
|
||||
basic_string& append(const basic_string& str);
|
||||
basic_string& append(const charT* s);
|
||||
basic_string& append(size_type n, charT c);
|
||||
template<class InputIterator> basic_string& append(InputIterator first, InputIterator last);
|
||||
basic_string& assign(const basic_string& str);
|
||||
basic_string& assign(size_type n, charT c);
|
||||
template<class InputIterator> basic_string& assign(InputIterator first, InputIterator last);
|
||||
basic_string& insert(size_type pos, const basic_string& str);
|
||||
basic_string& insert(size_type pos, size_type n, charT c);
|
||||
basic_string& insert(size_type pos, const charT* s);
|
||||
iterator insert(const_iterator p, size_type n, charT c);
|
||||
template<class InputIterator> iterator insert(const_iterator p, InputIterator first, InputIterator last);
|
||||
basic_string& replace(size_type pos1, size_type n1, const basic_string& str);
|
||||
basic_string& replace(size_type pos1, size_type n1, size_type n2, charT c);
|
||||
size_type copy(charT* s, size_type n, size_type pos = 0) const;
|
||||
void clear() noexcept;
|
||||
basic_string substr(size_type pos = 0, size_type n = npos) const;
|
||||
void swap(basic_string& s) noexcept/*(allocator_traits<Allocator>::propagate_on_container_swap::value || allocator_traits<Allocator>::is_always_equal::value)*/;
|
||||
};
|
||||
|
||||
template<class charT, class traits, class Allocator> basic_string<charT, traits, Allocator> operator+(const basic_string<charT, traits, Allocator>& lhs, const basic_string<charT, traits, Allocator>& rhs);
|
||||
template<class charT, class traits, class Allocator> basic_string<charT, traits, Allocator> operator+(const basic_string<charT, traits, Allocator>& lhs, const charT* rhs);
|
||||
|
||||
typedef basic_string<char> string;
|
||||
}
|
||||
|
||||
// --- istring / ostream / stringstream ---
|
||||
|
||||
namespace std
|
||||
{
|
||||
template <class charT, class traits = char_traits<charT> >
|
||||
class basic_istream /*: virtual public basic_ios<charT,traits> - not needed for this test */ {
|
||||
public:
|
||||
using char_type = charT;
|
||||
using int_type = int; //typename traits::int_type;
|
||||
|
||||
basic_istream<charT, traits>& operator>>(int& n);
|
||||
|
||||
int_type get();
|
||||
basic_istream<charT, traits>& get(char_type& c);
|
||||
basic_istream<charT, traits>& get(char_type* s, streamsize n);
|
||||
int_type peek();
|
||||
basic_istream<charT, traits>& read (char_type* s, streamsize n);
|
||||
streamsize readsome(char_type* s, streamsize n);
|
||||
basic_istream<charT, traits>& putback(char_type c);
|
||||
basic_istream<charT,traits>& unget();
|
||||
|
||||
basic_istream<charT,traits>& getline(char_type* s, streamsize n);
|
||||
basic_istream<charT,traits>& getline(char_type* s, streamsize n, char_type delim);
|
||||
};
|
||||
|
||||
template<class charT, class traits> basic_istream<charT, traits>& operator>>(basic_istream<charT, traits>&, charT*);
|
||||
template<class charT, class traits, class Allocator> basic_istream<charT, traits>& operator>>(basic_istream<charT, traits>& is, basic_string<charT, traits, Allocator>& str);
|
||||
|
||||
template<class charT, class traits, class Allocator> basic_istream<charT,traits>& getline(basic_istream<charT,traits>& is, basic_string<charT,traits,Allocator>& str, charT delim);
|
||||
template<class charT, class traits, class Allocator> basic_istream<charT,traits>& getline(basic_istream<charT,traits>& is, basic_string<charT,traits,Allocator>& str);
|
||||
|
||||
template <class charT, class traits = char_traits<charT> >
|
||||
class basic_ostream /*: virtual public basic_ios<charT,traits> - not needed for this test */ {
|
||||
public:
|
||||
typedef charT char_type;
|
||||
|
||||
basic_ostream<charT, traits>& operator<<(int n);
|
||||
|
||||
basic_ostream<charT, traits>& put(char_type c);
|
||||
basic_ostream<charT, traits>& write(const char_type* s, streamsize n);
|
||||
basic_ostream<charT,traits>& flush();
|
||||
};
|
||||
|
||||
template<class charT, class traits> basic_ostream<charT,traits>& operator<<(basic_ostream<charT,traits>&, const charT*);
|
||||
template<class charT, class traits, class Allocator> basic_ostream<charT, traits>& operator<<(basic_ostream<charT, traits>& os, const basic_string<charT, traits, Allocator>& str);
|
||||
|
||||
template<class charT, class traits = char_traits<charT>>
|
||||
class basic_iostream : public basic_istream<charT, traits>, public basic_ostream<charT, traits> {
|
||||
public:
|
||||
};
|
||||
|
||||
template<class charT, class traits = char_traits<charT>, class Allocator = allocator<charT>>
|
||||
class basic_stringstream : public basic_iostream<charT, traits> {
|
||||
public:
|
||||
explicit basic_stringstream(/*ios_base::openmode which = ios_base::out|ios_base::in - not needed for this test*/);
|
||||
explicit basic_stringstream( const basic_string<charT, traits, Allocator>& str/*, ios_base::openmode which = ios_base::out | ios_base::in*/);
|
||||
basic_stringstream(const basic_stringstream& rhs) = delete;
|
||||
basic_stringstream(basic_stringstream&& rhs);
|
||||
basic_stringstream& operator=(const basic_stringstream& rhs) = delete;
|
||||
basic_stringstream& operator=(basic_stringstream&& rhs);
|
||||
|
||||
void swap(basic_stringstream& rhs);
|
||||
|
||||
basic_string<charT, traits, Allocator> str() const;
|
||||
void str(const basic_string<charT, traits, Allocator>& str);
|
||||
};
|
||||
|
||||
typedef basic_istream<char> istream;
|
||||
typedef basic_ostream<char> ostream;
|
||||
extern istream cin;
|
||||
extern ostream cout;
|
||||
|
||||
using stringstream = basic_stringstream<char>;
|
||||
}
|
||||
|
||||
// --- vector ---
|
||||
|
||||
namespace std {
|
||||
template<class T, class Allocator = allocator<T>>
|
||||
class vector {
|
||||
public:
|
||||
using value_type = T;
|
||||
using reference = value_type&;
|
||||
using const_reference = const value_type&;
|
||||
using size_type = unsigned int;
|
||||
using iterator = std::iterator<random_access_iterator_tag, T>;
|
||||
using const_iterator = std::iterator<random_access_iterator_tag, const T>;
|
||||
|
||||
vector() noexcept(noexcept(Allocator())) : vector(Allocator()) { }
|
||||
explicit vector(const Allocator&) noexcept;
|
||||
explicit vector(size_type n, const Allocator& = Allocator());
|
||||
vector(size_type n, const T& value, const Allocator& = Allocator());
|
||||
template<class InputIterator, class IteratorCategory = typename InputIterator::iterator_category> vector(InputIterator first, InputIterator last, const Allocator& = Allocator());
|
||||
// use of `iterator_category` makes sure InputIterator is (probably) an iterator, and not an `int` or
|
||||
// similar that should match a different overload (SFINAE).
|
||||
~vector();
|
||||
|
||||
vector& operator=(const vector& x);
|
||||
vector& operator=(vector&& x) noexcept/*(allocator_traits<Allocator>::propagate_on_container_move_assignment::value || allocator_traits<Allocator>::is_always_equal::value)*/;
|
||||
template<class InputIterator, class IteratorCategory = typename InputIterator::iterator_category> void assign(InputIterator first, InputIterator last);
|
||||
// use of `iterator_category` makes sure InputIterator is (probably) an iterator, and not an `int` or
|
||||
// similar that should match a different overload (SFINAE).
|
||||
void assign(size_type n, const T& u);
|
||||
|
||||
iterator begin() noexcept;
|
||||
const_iterator begin() const noexcept;
|
||||
iterator end() noexcept;
|
||||
const_iterator end() const noexcept;
|
||||
|
||||
size_type size() const noexcept;
|
||||
|
||||
reference operator[](size_type n);
|
||||
const_reference operator[](size_type n) const;
|
||||
const_reference at(size_type n) const;
|
||||
reference at(size_type n);
|
||||
reference front();
|
||||
const_reference front() const;
|
||||
reference back();
|
||||
const_reference back() const;
|
||||
|
||||
T* data() noexcept;
|
||||
const T* data() const noexcept;
|
||||
|
||||
void push_back(const T& x);
|
||||
void push_back(T&& x);
|
||||
|
||||
iterator insert(const_iterator position, const T& x);
|
||||
iterator insert(const_iterator position, T&& x);
|
||||
iterator insert(const_iterator position, size_type n, const T& x);
|
||||
template<class InputIterator> iterator insert(const_iterator position, InputIterator first, InputIterator last);
|
||||
|
||||
template <class... Args> iterator emplace (const_iterator position, Args&&... args);
|
||||
template <class... Args> void emplace_back (Args&&... args);
|
||||
|
||||
void swap(vector&) noexcept/*(allocator_traits<Allocator>::propagate_on_container_swap::value || allocator_traits<Allocator>::is_always_equal::value)*/;
|
||||
|
||||
void clear() noexcept;
|
||||
};
|
||||
}
|
||||
|
||||
// --- make_shared / make_unique ---
|
||||
|
||||
namespace std {
|
||||
template<typename T>
|
||||
class shared_ptr {
|
||||
public:
|
||||
shared_ptr() noexcept;
|
||||
explicit shared_ptr(T*);
|
||||
shared_ptr(const shared_ptr&) noexcept;
|
||||
template<class U> shared_ptr(const shared_ptr<U>&) noexcept;
|
||||
template<class U> shared_ptr(shared_ptr<U>&&) noexcept;
|
||||
|
||||
shared_ptr<T>& operator=(const shared_ptr<T>&) noexcept;
|
||||
shared_ptr<T>& operator=(shared_ptr<T>&&) noexcept;
|
||||
|
||||
T& operator*() const noexcept;
|
||||
T* operator->() const noexcept;
|
||||
|
||||
T* get() const noexcept;
|
||||
};
|
||||
|
||||
template<typename T>
|
||||
class unique_ptr {
|
||||
public:
|
||||
constexpr unique_ptr() noexcept;
|
||||
explicit unique_ptr(T*) noexcept;
|
||||
unique_ptr(unique_ptr<T>&&) noexcept;
|
||||
|
||||
unique_ptr<T>& operator=(unique_ptr<T>&&) noexcept;
|
||||
|
||||
T& operator*() const;
|
||||
T* operator->() const noexcept;
|
||||
|
||||
T* get() const noexcept;
|
||||
};
|
||||
|
||||
template<typename T, class... Args> unique_ptr<T> make_unique(Args&&...);
|
||||
|
||||
template<typename T, class... Args> shared_ptr<T> make_shared(Args&&...);
|
||||
}
|
||||
|
||||
// --- pair ---
|
||||
|
||||
namespace std {
|
||||
template <class T1, class T2>
|
||||
struct pair {
|
||||
typedef T1 first_type;
|
||||
typedef T2 second_type;
|
||||
|
||||
T1 first;
|
||||
T2 second;
|
||||
pair();
|
||||
pair(const T1& x, const T2& y) : first(x), second(y) {};
|
||||
template<class U, class V> pair(const pair<U, V> &p);
|
||||
|
||||
void swap(pair& p) /*noexcept(...)*/;
|
||||
};
|
||||
|
||||
template<class T1, class T2> constexpr pair<decay_t<T1>, decay_t<T2>> make_pair(T1&& x, T2&& y) {
|
||||
return pair<decay_t<T1>, decay_t<T2>>(std::forward<T1>(x), std::forward<T2>(y));
|
||||
}
|
||||
}
|
||||
|
||||
// --- map ---
|
||||
|
||||
namespace std {
|
||||
template<class T = void> struct less;
|
||||
|
||||
template<class Key, class T, class Compare = less<Key>, class Allocator = allocator<pair<const Key, T>>>
|
||||
class map {
|
||||
public:
|
||||
using key_type = Key;
|
||||
using mapped_type = T;
|
||||
using value_type = pair<const Key, T>;
|
||||
using iterator = std::iterator<random_access_iterator_tag, value_type >;
|
||||
using const_iterator = std::iterator<random_access_iterator_tag, const value_type >;
|
||||
|
||||
map() /*: map(Compare()) { }*/;
|
||||
map(const map& x);
|
||||
map(map&& x);
|
||||
~map();
|
||||
|
||||
map& operator=(const map& x);
|
||||
map& operator=(map&& x) /*noexcept(allocator_traits<Allocator>::is_always_equal::value && is_nothrow_move_assignable_v<Compare>)*/;
|
||||
|
||||
iterator begin() noexcept;
|
||||
const_iterator begin() const noexcept;
|
||||
iterator end() noexcept;
|
||||
const_iterator end() const noexcept;
|
||||
|
||||
T& operator[](const key_type& x);
|
||||
T& operator[](key_type&& x);
|
||||
T& at(const key_type& x);
|
||||
const T& at(const key_type& x) const;
|
||||
|
||||
template<class... Args> pair<iterator, bool> emplace(Args&&... args);
|
||||
template<class... Args> iterator emplace_hint(const_iterator position, Args&&... args);
|
||||
|
||||
pair<iterator, bool> insert(const value_type& x);
|
||||
pair<iterator, bool> insert(value_type&& x);
|
||||
iterator insert(const_iterator position, const value_type& x);
|
||||
iterator insert(const_iterator position, value_type&& x);
|
||||
|
||||
template<class... Args> pair<iterator, bool> try_emplace(const key_type& k, Args&&... args);
|
||||
template<class... Args> pair<iterator, bool> try_emplace(key_type&& k, Args&&... args);
|
||||
template<class... Args> iterator try_emplace(const_iterator hint, const key_type& k, Args&&... args);
|
||||
template<class... Args> iterator try_emplace(const_iterator hint, key_type&& k, Args&&... args);
|
||||
template<class M> pair<iterator, bool> insert_or_assign(const key_type& k, M&& obj);
|
||||
template<class M> pair<iterator, bool> insert_or_assign(key_type&& k, M&& obj);
|
||||
template<class M> iterator insert_or_assign(const_iterator hint, const key_type& k, M&& obj);
|
||||
template<class M> iterator insert_or_assign(const_iterator hint, key_type&& k, M&& obj);
|
||||
|
||||
iterator erase(iterator position);
|
||||
iterator erase(const_iterator position);
|
||||
iterator erase(const_iterator first, const_iterator last);
|
||||
void swap(map&) /*noexcept(/*==allocator_traits<Allocator>::is_always_equal::value && is_nothrow_swappable_v<Compare>)*/;
|
||||
void clear() noexcept;
|
||||
|
||||
template<class C2> void merge(map<Key, T, C2, Allocator>& source);
|
||||
template<class C2> void merge(map<Key, T, C2, Allocator>&& source);
|
||||
|
||||
iterator find(const key_type& x);
|
||||
const_iterator find(const key_type& x) const;
|
||||
|
||||
iterator lower_bound(const key_type& x);
|
||||
const_iterator lower_bound(const key_type& x) const;
|
||||
iterator upper_bound(const key_type& x);
|
||||
const_iterator upper_bound(const key_type& x) const;
|
||||
|
||||
pair<iterator, iterator> equal_range(const key_type& x);
|
||||
pair<const_iterator, const_iterator> equal_range(const key_type& x) const;
|
||||
};
|
||||
|
||||
template<class T> struct hash;
|
||||
template<class T = void> struct equal_to;
|
||||
|
||||
template<class Key, class T, class Hash = hash<Key>, class Pred = equal_to<Key>, class Allocator = allocator<pair<const Key, T>>>
|
||||
class unordered_map {
|
||||
public:
|
||||
using key_type = Key;
|
||||
using mapped_type = T;
|
||||
using value_type = pair<const Key, T>;
|
||||
using iterator = std::iterator<random_access_iterator_tag, value_type >;
|
||||
using const_iterator = std::iterator<random_access_iterator_tag, const value_type >;
|
||||
|
||||
unordered_map();
|
||||
unordered_map(const unordered_map&);
|
||||
unordered_map(unordered_map&&);
|
||||
~unordered_map();
|
||||
|
||||
unordered_map& operator=(const unordered_map&);
|
||||
unordered_map& operator=(unordered_map&&) /*noexcept(allocator_traits<Allocator>::is_always_equal::value && is_nothrow_move_assignable_v<Hash> && is_nothrow_move_assignable_v<Pred>)*/;
|
||||
|
||||
iterator begin() noexcept;
|
||||
const_iterator begin() const noexcept;
|
||||
iterator end() noexcept;
|
||||
const_iterator end() const noexcept;
|
||||
|
||||
mapped_type& operator[](const key_type& k);
|
||||
mapped_type& operator[](key_type&& k);
|
||||
mapped_type& at(const key_type& k);
|
||||
const mapped_type& at(const key_type& k) const;
|
||||
|
||||
template<class... Args> pair<iterator, bool> emplace(Args&&... args);
|
||||
template<class... Args> iterator emplace_hint(const_iterator position, Args&&... args);
|
||||
|
||||
pair<iterator, bool> insert(const value_type& obj);
|
||||
pair<iterator, bool> insert(value_type&& obj);
|
||||
iterator insert(const_iterator hint, const value_type& obj);
|
||||
iterator insert(const_iterator hint, value_type&& obj);
|
||||
|
||||
template<class... Args> pair<iterator, bool> try_emplace(const key_type& k, Args&&... args);
|
||||
template<class... Args> pair<iterator, bool> try_emplace(key_type&& k, Args&&... args);
|
||||
template<class... Args> iterator try_emplace(const_iterator hint, const key_type& k, Args&&... args);
|
||||
template<class... Args> iterator try_emplace(const_iterator hint, key_type&& k, Args&&... args);
|
||||
template<class M> pair<iterator, bool> insert_or_assign(const key_type& k, M&& obj);
|
||||
template<class M> pair<iterator, bool> insert_or_assign(key_type&& k, M&& obj);
|
||||
template<class M> iterator insert_or_assign(const_iterator hint, const key_type& k, M&& obj);
|
||||
template<class M> iterator insert_or_assign(const_iterator hint, key_type&& k, M&& obj);
|
||||
|
||||
iterator erase(iterator position);
|
||||
iterator erase(const_iterator position);
|
||||
iterator erase(const_iterator first, const_iterator last);
|
||||
void swap(unordered_map&) /*noexcept(allocator_traits<Allocator>::is_always_equal::value && is_nothrow_swappable_v<Hash> && is_nothrow_swappable_v<Pred>)*/;
|
||||
void clear() noexcept;
|
||||
|
||||
template<class H2, class P2> void merge(unordered_map<Key, T, H2, P2, Allocator>& source);
|
||||
template<class H2, class P2> void merge(unordered_map<Key, T, H2, P2, Allocator>&& source);
|
||||
|
||||
iterator find(const key_type& k);
|
||||
const_iterator find(const key_type& k) const;
|
||||
|
||||
pair<iterator, iterator> equal_range(const key_type& k);
|
||||
pair<const_iterator, const_iterator> equal_range(const key_type& k) const;
|
||||
};
|
||||
};
|
||||
|
||||
// --- set ---
|
||||
|
||||
namespace std {
|
||||
template<class Key, class Compare = less<Key>, class Allocator = allocator<Key>>
|
||||
class set {
|
||||
public:
|
||||
using key_type = Key;
|
||||
using value_type = Key;
|
||||
using size_type = size_t;
|
||||
using allocator_type = Allocator;
|
||||
using iterator = std::iterator<random_access_iterator_tag, value_type >;
|
||||
using const_iterator = std::iterator<random_access_iterator_tag, const value_type >;
|
||||
|
||||
set() /*: set(Compare())*/ { }
|
||||
set(const set& x);
|
||||
set(set&& x);
|
||||
template<class InputIterator> set(InputIterator first, InputIterator last/*, const Compare& comp = Compare(), const Allocator& = Allocator()*/);
|
||||
~set();
|
||||
|
||||
set& operator=(const set& x);
|
||||
set& operator=(set&& x) noexcept/*(allocator_traits<Allocator>::is_always_equal::value && is_nothrow_move_assignable_v<Compare>)*/;
|
||||
|
||||
iterator begin() noexcept;
|
||||
const_iterator begin() const noexcept;
|
||||
iterator end() noexcept;
|
||||
const_iterator end() const noexcept;
|
||||
|
||||
template<class... Args> pair<iterator, bool> emplace(Args&&... args);
|
||||
template<class... Args> iterator emplace_hint(const_iterator position, Args&&... args);
|
||||
pair<iterator,bool> insert(const value_type& x);
|
||||
pair<iterator,bool> insert(value_type&& x);
|
||||
iterator insert(const_iterator position, const value_type& x);
|
||||
iterator insert(const_iterator position, value_type&& x);
|
||||
template<class InputIterator> void insert(InputIterator first, InputIterator last);
|
||||
|
||||
iterator erase(iterator position);
|
||||
iterator erase(const_iterator position);
|
||||
iterator erase(const_iterator first, const_iterator last);
|
||||
void swap(set&) noexcept/*(allocator_traits<Allocator>::is_always_equal::value && is_nothrow_swappable_v<Compare>)*/;
|
||||
void clear() noexcept;
|
||||
|
||||
template<class C2> void merge(set<Key, C2, Allocator>& source);
|
||||
template<class C2> void merge(set<Key, C2, Allocator>&& source);
|
||||
|
||||
iterator find(const key_type& x);
|
||||
const_iterator find(const key_type& x) const;
|
||||
|
||||
iterator lower_bound(const key_type& x);
|
||||
const_iterator lower_bound(const key_type& x) const;
|
||||
iterator upper_bound(const key_type& x);
|
||||
const_iterator upper_bound(const key_type& x) const;
|
||||
pair<iterator, iterator> equal_range(const key_type& x);
|
||||
pair<const_iterator, const_iterator> equal_range(const key_type& x) const;
|
||||
};
|
||||
|
||||
template<class Key, class Hash = hash<Key>, class Pred = equal_to<Key>, class Allocator = allocator<Key>>
|
||||
class unordered_set {
|
||||
public:
|
||||
using key_type = Key;
|
||||
using value_type = Key;
|
||||
using hasher = Hash;
|
||||
using key_equal = Pred;
|
||||
using allocator_type = Allocator;
|
||||
using size_type = size_t;
|
||||
using iterator = std::iterator<random_access_iterator_tag, value_type >;
|
||||
using const_iterator = std::iterator<random_access_iterator_tag, const value_type >;
|
||||
|
||||
unordered_set();
|
||||
unordered_set(const unordered_set&);
|
||||
unordered_set(unordered_set&&);
|
||||
template<class InputIterator> unordered_set(InputIterator f, InputIterator l, size_type n = 0/*, const hasher& hf = hasher(), const key_equal& eql = key_equal(), const allocator_type& a = allocator_type()*/);
|
||||
~unordered_set();
|
||||
|
||||
unordered_set& operator=(const unordered_set&);
|
||||
unordered_set& operator=(unordered_set&&) noexcept/*(allocator_traits<Allocator>::is_always_equal::value && is_nothrow_move_assignable_v<Hash> && is_nothrow_move_assignable_v<Pred>)*/;
|
||||
|
||||
iterator begin() noexcept;
|
||||
const_iterator begin() const noexcept;
|
||||
iterator end() noexcept;
|
||||
const_iterator end() const noexcept;
|
||||
|
||||
template<class... Args> pair<iterator, bool> emplace(Args&&... args);
|
||||
template<class... Args> iterator emplace_hint(const_iterator position, Args&&... args);
|
||||
pair<iterator, bool> insert(const value_type& obj);
|
||||
pair<iterator, bool> insert(value_type&& obj);
|
||||
iterator insert(const_iterator hint, const value_type& obj);
|
||||
iterator insert(const_iterator hint, value_type&& obj);
|
||||
template<class InputIterator> void insert(InputIterator first, InputIterator last);
|
||||
|
||||
iterator erase(iterator position);
|
||||
iterator erase(const_iterator position);
|
||||
iterator erase(const_iterator first, const_iterator last);
|
||||
void swap(unordered_set&) noexcept/*(allocator_traits<Allocator>::is_always_equal::value && is_nothrow_swappable_v<Hash> && is_nothrow_swappable_v<Pred>)*/;
|
||||
void clear() noexcept;
|
||||
|
||||
template<class H2, class P2> void merge(unordered_set<Key, H2, P2, Allocator>& source);
|
||||
template<class H2, class P2> void merge(unordered_set<Key, H2, P2, Allocator>&& source);
|
||||
|
||||
iterator find(const key_type& k);
|
||||
const_iterator find(const key_type& k) const;
|
||||
pair<iterator, iterator> equal_range(const key_type& k);
|
||||
pair<const_iterator, const_iterator> equal_range(const key_type& k) const;
|
||||
};
|
||||
}
|
||||
@@ -1,22 +0,0 @@
|
||||
| concat.cpp:23:27:23:27 | call to operator+ | concat.cpp:23:22:23:25 | str1 | concat.cpp:23:22:23:31 | call to operator+ |
|
||||
| concat.cpp:23:27:23:27 | call to operator+ | concat.cpp:23:22:23:25 | str1 | concat.cpp:23:22:23:31 | call to operator+ |
|
||||
| concat.cpp:23:27:23:27 | call to operator+ | concat.cpp:23:22:23:25 | str1 | concat.cpp:23:27:23:27 | call to operator+ |
|
||||
| concat.cpp:23:27:23:27 | call to operator+ | concat.cpp:23:29:23:31 | | concat.cpp:23:22:23:31 | call to operator+ |
|
||||
| concat.cpp:23:27:23:27 | call to operator+ | concat.cpp:23:29:23:31 | | concat.cpp:23:22:23:31 | call to operator+ |
|
||||
| concat.cpp:23:27:23:27 | call to operator+ | concat.cpp:23:29:23:31 | | concat.cpp:23:27:23:27 | call to operator+ |
|
||||
| concat.cpp:23:33:23:33 | call to operator+ | concat.cpp:23:35:23:38 | str2 | concat.cpp:23:22:23:38 | call to operator+ |
|
||||
| concat.cpp:23:33:23:33 | call to operator+ | concat.cpp:23:35:23:38 | str2 | concat.cpp:23:22:23:38 | call to operator+ |
|
||||
| concat.cpp:23:33:23:33 | call to operator+ | concat.cpp:23:35:23:38 | str2 | concat.cpp:23:33:23:33 | call to operator+ |
|
||||
| concat.cpp:23:40:23:40 | call to operator+ | concat.cpp:23:42:23:45 | str3 | concat.cpp:23:40:23:40 | call to operator+ |
|
||||
| concat.cpp:47:8:47:8 | call to operator<< | concat.cpp:47:11:47:14 | str1 | concat.cpp:47:8:47:17 | call to operator<< |
|
||||
| concat.cpp:47:16:47:16 | call to operator<< | concat.cpp:47:19:47:21 | | concat.cpp:47:16:47:24 | call to operator<< |
|
||||
| concat.cpp:47:23:47:23 | call to operator<< | concat.cpp:47:26:47:29 | str2 | concat.cpp:47:23:47:32 | call to operator<< |
|
||||
| concat.cpp:47:31:47:31 | call to operator<< | concat.cpp:47:34:47:37 | str3 | concat.cpp:47:31:47:38 | call to operator<< |
|
||||
| concat.cpp:58:5:58:11 | call to sprintf | concat.cpp:58:21:58:30 | %s %s %s | concat.cpp:58:13:58:18 | sprintf output argument |
|
||||
| concat.cpp:58:5:58:11 | call to sprintf | concat.cpp:58:33:58:36 | str1 | concat.cpp:58:13:58:18 | sprintf output argument |
|
||||
| concat.cpp:58:5:58:11 | call to sprintf | concat.cpp:58:39:58:42 | str2 | concat.cpp:58:13:58:18 | sprintf output argument |
|
||||
| concat.cpp:58:5:58:11 | call to sprintf | concat.cpp:58:45:58:49 | ucstr | concat.cpp:58:13:58:18 | sprintf output argument |
|
||||
| concat.cpp:61:5:61:10 | call to strcat | concat.cpp:61:12:61:15 | str1 | concat.cpp:61:5:61:10 | call to strcat |
|
||||
| concat.cpp:61:5:61:10 | call to strcat | concat.cpp:61:12:61:15 | str1 | concat.cpp:61:12:61:15 | strcat output argument |
|
||||
| concat.cpp:61:5:61:10 | call to strcat | concat.cpp:61:18:61:22 | ucstr | concat.cpp:61:5:61:10 | call to strcat |
|
||||
| concat.cpp:61:5:61:10 | call to strcat | concat.cpp:61:18:61:22 | ucstr | concat.cpp:61:12:61:15 | strcat output argument |
|
||||
@@ -1,10 +0,0 @@
|
||||
import cpp
|
||||
import semmle.code.cpp.commons.StringConcatenation
|
||||
import semmle.code.cpp.dataflow.new.DataFlow
|
||||
|
||||
from StringConcatenation s, Expr op, DataFlow::Node res
|
||||
where
|
||||
s.getLocation().getFile().getBaseName() = "concat.cpp" and
|
||||
op = s.getAnOperand() and
|
||||
res = s.getResultNode()
|
||||
select s, op, res
|
||||
@@ -1,35 +0,0 @@
|
||||
template<class T>
|
||||
struct remove_const { typedef T type; };
|
||||
|
||||
template<class T>
|
||||
struct remove_const<const T> { typedef T type; };
|
||||
|
||||
// `remove_const_t<T>` removes any `const` specifier from `T`
|
||||
template<class T>
|
||||
using remove_const_t = typename remove_const<T>::type;
|
||||
|
||||
template<class T>
|
||||
struct remove_reference { typedef T type; };
|
||||
|
||||
template<class T>
|
||||
struct remove_reference<T &> { typedef T type; };
|
||||
|
||||
template<class T>
|
||||
struct remove_reference<T &&> { typedef T type; };
|
||||
|
||||
// `remove_reference_t<T>` removes any `&` from `T`
|
||||
template<class T>
|
||||
using remove_reference_t = typename remove_reference<T>::type;
|
||||
|
||||
template<class T>
|
||||
struct decay_impl {
|
||||
typedef T type;
|
||||
};
|
||||
|
||||
template<class T, size_t t_size>
|
||||
struct decay_impl<T[t_size]> {
|
||||
typedef T* type;
|
||||
};
|
||||
|
||||
template<class T>
|
||||
using decay_t = typename decay_impl<remove_reference_t<T>>::type;
|
||||
@@ -99,4 +99,3 @@ uniqueContentApprox
|
||||
identityLocalStep
|
||||
missingArgumentCall
|
||||
multipleArgumentCall
|
||||
lambdaCallEnclosingCallableMismatch
|
||||
|
||||
@@ -42,4 +42,3 @@ uniqueContentApprox
|
||||
identityLocalStep
|
||||
missingArgumentCall
|
||||
multipleArgumentCall
|
||||
lambdaCallEnclosingCallableMismatch
|
||||
|
||||
@@ -9,5 +9,4 @@
|
||||
| test.cpp:188:39:188:42 | call to data | The underlying string object is destroyed after the call to 'data' returns. |
|
||||
| test.cpp:189:44:189:47 | call to data | The underlying string object is destroyed after the call to 'data' returns. |
|
||||
| test.cpp:191:29:191:32 | call to data | The underlying string object is destroyed after the call to 'data' returns. |
|
||||
| test.cpp:193:47:193:51 | call to c_str | The underlying string object is destroyed after the call to 'c_str' returns. |
|
||||
| test.cpp:195:31:195:35 | call to c_str | The underlying string object is destroyed after the call to 'c_str' returns. |
|
||||
| test.cpp:193:31:193:35 | call to c_str | The underlying string object is destroyed after the call to 'c_str' returns. |
|
||||
|
||||
@@ -190,8 +190,6 @@ const char* test1(bool b1, bool b2) {
|
||||
char* s9;
|
||||
s9 = std::string("hello").data(); // BAD
|
||||
|
||||
const char* s13 = b1 ? std::string("hello").c_str() : s1; // BAD
|
||||
|
||||
return std::string("hello").c_str(); // BAD
|
||||
}
|
||||
|
||||
|
||||
@@ -1,11 +0,0 @@
|
||||
| test.cpp:156:15:156:15 | call to operator* | The underlying unique pointer object is destroyed after the call to 'operator*' returns. |
|
||||
| test.cpp:157:31:157:33 | call to get | The underlying unique pointer object is destroyed after the call to 'get' returns. |
|
||||
| test.cpp:159:32:159:32 | call to operator-> | The underlying unique pointer object is destroyed after the call to 'operator->' returns. |
|
||||
| test.cpp:160:35:160:37 | call to get | The underlying unique pointer object is destroyed after the call to 'get' returns. |
|
||||
| test.cpp:161:44:161:46 | call to get | The underlying unique pointer object is destroyed after the call to 'get' returns. |
|
||||
| test.cpp:163:25:163:27 | call to get | The underlying unique pointer object is destroyed after the call to 'get' returns. |
|
||||
| test.cpp:172:33:172:35 | call to get | The underlying unique pointer object is destroyed after the call to 'get' returns. |
|
||||
| test.cpp:174:32:174:34 | call to get | The underlying unique pointer object is destroyed after the call to 'get' returns. |
|
||||
| test.cpp:177:16:177:16 | call to operator* | The underlying unique pointer object is destroyed after the call to 'operator*' returns. |
|
||||
| test.cpp:177:36:177:36 | call to operator* | The underlying unique pointer object is destroyed after the call to 'operator*' returns. |
|
||||
| test.cpp:179:11:179:11 | call to operator* | The underlying unique pointer object is destroyed after the call to 'operator*' returns. |
|
||||
@@ -1 +0,0 @@
|
||||
Security/CWE/CWE-416/UseOfUniquePointerAfterLifetimeEnds.ql
|
||||
@@ -1,206 +0,0 @@
|
||||
typedef unsigned long size_t;
|
||||
|
||||
namespace std {
|
||||
template<class T> struct remove_reference { typedef T type; };
|
||||
|
||||
template<class T> struct remove_reference<T &> { typedef T type; };
|
||||
|
||||
template<class T> struct remove_reference<T &&> { typedef T type; };
|
||||
|
||||
template<class T> using remove_reference_t = typename remove_reference<T>::type;
|
||||
|
||||
template< class T > std::remove_reference_t<T>&& move( T&& t );
|
||||
|
||||
template< class T > struct default_delete;
|
||||
|
||||
template<class T> struct add_lvalue_reference { typedef T& type; };
|
||||
}
|
||||
|
||||
// --- iterator ---
|
||||
|
||||
namespace std {
|
||||
template<class T> struct remove_const { typedef T type; };
|
||||
|
||||
template<class T> struct remove_const<const T> { typedef T type; };
|
||||
|
||||
// `remove_const_t<T>` removes any `const` specifier from `T`
|
||||
template<class T> using remove_const_t = typename remove_const<T>::type;
|
||||
|
||||
struct ptrdiff_t;
|
||||
|
||||
template<class I> struct iterator_traits;
|
||||
|
||||
template <class Category,
|
||||
class value_type,
|
||||
class difference_type = ptrdiff_t,
|
||||
class pointer_type = value_type*,
|
||||
class reference_type = value_type&>
|
||||
struct iterator {
|
||||
typedef Category iterator_category;
|
||||
|
||||
iterator();
|
||||
iterator(iterator<Category, remove_const_t<value_type> > const &other); // non-const -> const conversion constructor
|
||||
|
||||
iterator &operator++();
|
||||
iterator operator++(int);
|
||||
iterator &operator--();
|
||||
iterator operator--(int);
|
||||
bool operator==(iterator other) const;
|
||||
bool operator!=(iterator other) const;
|
||||
reference_type operator*() const;
|
||||
pointer_type operator->() const;
|
||||
iterator operator+(int);
|
||||
iterator operator-(int);
|
||||
iterator &operator+=(int);
|
||||
iterator &operator-=(int);
|
||||
int operator-(iterator);
|
||||
reference_type operator[](int);
|
||||
};
|
||||
|
||||
struct input_iterator_tag {};
|
||||
struct forward_iterator_tag : public input_iterator_tag {};
|
||||
struct bidirectional_iterator_tag : public forward_iterator_tag {};
|
||||
struct random_access_iterator_tag : public bidirectional_iterator_tag {};
|
||||
}
|
||||
|
||||
// --- string ---
|
||||
|
||||
namespace std
|
||||
{
|
||||
|
||||
using nullptr_t = decltype(nullptr);
|
||||
|
||||
template<class T, class Deleter = std::default_delete<T>> class unique_ptr {
|
||||
public:
|
||||
using pointer = T*;
|
||||
using element_type = T;
|
||||
using deleter_type = Deleter;
|
||||
|
||||
constexpr unique_ptr() noexcept;
|
||||
constexpr unique_ptr(nullptr_t) noexcept;
|
||||
explicit unique_ptr(pointer p) noexcept;
|
||||
unique_ptr(unique_ptr&& u) noexcept;
|
||||
template<class U, class E> unique_ptr(unique_ptr<U, E>&& u) noexcept;
|
||||
unique_ptr(const unique_ptr&) = delete;
|
||||
|
||||
unique_ptr& operator=(unique_ptr&& u) noexcept;
|
||||
unique_ptr& operator=(std::nullptr_t) noexcept;
|
||||
template<class U, class E> unique_ptr& operator=(unique_ptr<U, E>&& u) noexcept;
|
||||
|
||||
~unique_ptr();
|
||||
|
||||
pointer get() const noexcept;
|
||||
deleter_type& get_deleter() noexcept;
|
||||
const deleter_type& get_deleter() const noexcept;
|
||||
explicit operator bool() const noexcept;
|
||||
typename std::add_lvalue_reference<T>::type operator*() const;
|
||||
pointer operator->() const noexcept;
|
||||
pointer release() noexcept;
|
||||
void reset(pointer p = pointer()) noexcept;
|
||||
void swap(unique_ptr& u) noexcept;
|
||||
};
|
||||
}
|
||||
|
||||
// --- vector ---
|
||||
|
||||
namespace std {
|
||||
template <class T> class allocator {
|
||||
public:
|
||||
allocator() throw();
|
||||
typedef size_t size_type;
|
||||
};
|
||||
|
||||
template<class T, class Allocator = allocator<T>>
|
||||
class vector {
|
||||
public:
|
||||
using value_type = T;
|
||||
using reference = value_type&;
|
||||
using const_reference = const value_type&;
|
||||
using size_type = unsigned int;
|
||||
using iterator = std::iterator<random_access_iterator_tag, T>;
|
||||
using const_iterator = std::iterator<random_access_iterator_tag, const T>;
|
||||
|
||||
vector() noexcept(noexcept(Allocator()));
|
||||
explicit vector(const Allocator&) noexcept;
|
||||
explicit vector(size_type n, const Allocator& = Allocator());
|
||||
vector(size_type n, const T& value, const Allocator& = Allocator());
|
||||
template<class InputIterator, class IteratorCategory = typename InputIterator::iterator_category> vector(InputIterator first, InputIterator last, const Allocator& = Allocator());
|
||||
~vector();
|
||||
|
||||
void push_back(const T& x);
|
||||
void push_back(T&& x);
|
||||
|
||||
iterator insert(const_iterator position, const T& x);
|
||||
iterator insert(const_iterator position, T&& x);
|
||||
iterator insert(const_iterator position, size_type n, const T& x);
|
||||
template<class InputIterator> iterator insert(const_iterator position, InputIterator first, InputIterator last);
|
||||
|
||||
template <class... Args> iterator emplace (const_iterator position, Args&&... args);
|
||||
template <class... Args> void emplace_back (Args&&... args);
|
||||
};
|
||||
}
|
||||
|
||||
struct S {
|
||||
const char* s;
|
||||
};
|
||||
|
||||
void call(S*);
|
||||
|
||||
void call_by_value(S);
|
||||
void call_by_ref(S&);
|
||||
|
||||
std::unique_ptr<S> get_unique_ptr();
|
||||
|
||||
const S* test1(bool b1, bool b2) {
|
||||
auto s1 = *get_unique_ptr(); // GOOD
|
||||
auto s1a = &*get_unique_ptr(); // BAD
|
||||
auto s1b = get_unique_ptr().get(); // BAD
|
||||
auto s1c = get_unique_ptr()->s; // GOOD
|
||||
auto s1d = &(get_unique_ptr()->s); // BAD
|
||||
auto s2 = b1 ? get_unique_ptr().get() : nullptr; // BAD
|
||||
auto s3 = b2 ? nullptr :get_unique_ptr().get(); // BAD
|
||||
const S* s4;
|
||||
s4 = get_unique_ptr().get(); // BAD
|
||||
|
||||
call(get_unique_ptr().get()); // GOOD
|
||||
call(b1 ? get_unique_ptr().get() : nullptr); // GOOD
|
||||
call(b1 ? (b2 ? nullptr : get_unique_ptr().get()) : nullptr); // GOOD
|
||||
call_by_value(*get_unique_ptr()); // GOOD
|
||||
call_by_ref(*get_unique_ptr()); // GOOD
|
||||
|
||||
std::vector<S*> v1;
|
||||
v1.push_back(get_unique_ptr().get()); // BAD
|
||||
|
||||
S* s5[] = { get_unique_ptr().get() }; // BAD
|
||||
|
||||
S s6 = b1 ? *get_unique_ptr() : *get_unique_ptr(); // GOOD
|
||||
S& s7 = b1 ? *get_unique_ptr() : *get_unique_ptr(); // BAD
|
||||
|
||||
return &*get_unique_ptr(); // BAD
|
||||
}
|
||||
|
||||
void test2(bool b1, bool b2) {
|
||||
|
||||
std::unique_ptr<S> s = get_unique_ptr();
|
||||
auto s1 = s.get(); // GOOD
|
||||
auto s2 = b1 ? s.get() : nullptr; // GOOD
|
||||
auto s3 = b2 ? nullptr : s.get(); // GOOD
|
||||
const S* s4;
|
||||
s4 = s.get(); // GOOD
|
||||
|
||||
std::unique_ptr<S>& sRef = s;
|
||||
|
||||
auto s5 = sRef.get(); // GOOD
|
||||
auto s6 = b1 ? sRef.get() : nullptr; // GOOD
|
||||
auto s7 = b2 ? nullptr : sRef.get(); // GOOD
|
||||
const S* s8;
|
||||
s8 = sRef.get(); // GOOD
|
||||
|
||||
std::unique_ptr<S>&& sRefRef = get_unique_ptr();
|
||||
|
||||
auto s9 = sRefRef.get(); // GOOD
|
||||
auto s10 = b1 ? sRefRef.get() : nullptr; // GOOD
|
||||
auto s11 = b2 ? nullptr : sRefRef.get(); // GOOD
|
||||
const S* s12;
|
||||
s12 = sRefRef.get(); // GOOD
|
||||
}
|
||||
@@ -1,4 +1,3 @@
|
||||
#include "test.H" // GOOD
|
||||
#include "test.xpm" // GOOD
|
||||
#include "test2.c" // BAD
|
||||
#include "test.def" // GOOD
|
||||
#include "test.H"
|
||||
#include "test.xpm"
|
||||
#include "test2.c"
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -936,8 +936,9 @@ namespace Semmle.Autobuild.CSharp.Tests
|
||||
{
|
||||
actions.RunProcess["dotnet --list-sdks"] = 0;
|
||||
actions.RunProcessOut["dotnet --list-sdks"] = "2.1.2 [C:\\Program Files\\dotnet\\sdks]\n2.1.4 [C:\\Program Files\\dotnet\\sdks]";
|
||||
actions.RunProcess[@"chmod u+x scratch/.dotnet/dotnet-install.sh"] = 0;
|
||||
actions.RunProcess[@"scratch/.dotnet/dotnet-install.sh --channel release --version 2.1.3 --install-dir scratch/.dotnet"] = 0;
|
||||
actions.RunProcess[@"chmod u+x dotnet-install.sh"] = 0;
|
||||
actions.RunProcess[@"./dotnet-install.sh --channel release --version 2.1.3 --install-dir scratch/.dotnet"] = 0;
|
||||
actions.RunProcess[@"rm dotnet-install.sh"] = 0;
|
||||
actions.RunProcess[@"scratch/.dotnet/dotnet --info"] = 0;
|
||||
actions.RunProcess[@"scratch/.dotnet/dotnet clean C:\Project/test.csproj"] = 0;
|
||||
actions.RunProcess[@"scratch/.dotnet/dotnet restore C:\Project/test.csproj"] = 0;
|
||||
@@ -959,11 +960,10 @@ namespace Semmle.Autobuild.CSharp.Tests
|
||||
|
||||
</Project>");
|
||||
actions.LoadXml[@"C:\Project/test.csproj"] = xml;
|
||||
actions.DownloadFiles.Add(("https://dot.net/v1/dotnet-install.sh", "scratch/.dotnet/dotnet-install.sh"));
|
||||
actions.CreateDirectories.Add(@"scratch/.dotnet");
|
||||
actions.DownloadFiles.Add(("https://dot.net/v1/dotnet-install.sh", "dotnet-install.sh"));
|
||||
|
||||
var autobuilder = CreateAutoBuilder(false, dotnetVersion: "2.1.3");
|
||||
TestAutobuilderScript(autobuilder, 0, 7);
|
||||
TestAutobuilderScript(autobuilder, 0, 8);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
@@ -972,8 +972,9 @@ namespace Semmle.Autobuild.CSharp.Tests
|
||||
actions.RunProcess["dotnet --list-sdks"] = 0;
|
||||
actions.RunProcessOut["dotnet --list-sdks"] = @"2.1.3 [C:\Program Files\dotnet\sdks]
|
||||
2.1.4 [C:\Program Files\dotnet\sdks]";
|
||||
actions.RunProcess[@"chmod u+x scratch/.dotnet/dotnet-install.sh"] = 0;
|
||||
actions.RunProcess[@"scratch/.dotnet/dotnet-install.sh --channel release --version 2.1.3 --install-dir scratch/.dotnet"] = 0;
|
||||
actions.RunProcess[@"chmod u+x dotnet-install.sh"] = 0;
|
||||
actions.RunProcess[@"./dotnet-install.sh --channel release --version 2.1.3 --install-dir scratch/.dotnet"] = 0;
|
||||
actions.RunProcess[@"rm dotnet-install.sh"] = 0;
|
||||
actions.RunProcess[@"scratch/.dotnet/dotnet --info"] = 0;
|
||||
actions.RunProcess[@"scratch/.dotnet/dotnet clean C:\Project/test.csproj"] = 0;
|
||||
actions.RunProcess[@"scratch/.dotnet/dotnet restore C:\Project/test.csproj"] = 0;
|
||||
@@ -995,11 +996,10 @@ namespace Semmle.Autobuild.CSharp.Tests
|
||||
|
||||
</Project>");
|
||||
actions.LoadXml[@"C:\Project/test.csproj"] = xml;
|
||||
actions.DownloadFiles.Add(("https://dot.net/v1/dotnet-install.sh", "scratch/.dotnet/dotnet-install.sh"));
|
||||
actions.CreateDirectories.Add(@"scratch/.dotnet");
|
||||
actions.DownloadFiles.Add(("https://dot.net/v1/dotnet-install.sh", "dotnet-install.sh"));
|
||||
|
||||
var autobuilder = CreateAutoBuilder(false, dotnetVersion: "2.1.3");
|
||||
TestAutobuilderScript(autobuilder, 0, 7);
|
||||
TestAutobuilderScript(autobuilder, 0, 8);
|
||||
}
|
||||
|
||||
private void TestDotnetVersionWindows(Action action, int commandsRun)
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user