Merge pull request #10305 from MathiasVP/ql-workaround-for-missing-decl-entries

C++: Synthesize `DeclarationEntry`s for IR construction
This commit is contained in:
Robert Marsh
2022-09-07 11:34:28 -04:00
committed by GitHub
9 changed files with 608 additions and 104 deletions

View File

@@ -13,8 +13,8 @@ private import TranslatedInitialization
* Gets the `TranslatedDeclarationEntry` that represents the declaration
* `entry`.
*/
TranslatedDeclarationEntry getTranslatedDeclarationEntry(DeclarationEntry entry) {
result.getAst() = entry
TranslatedDeclarationEntry getTranslatedDeclarationEntry(IRDeclarationEntry entry) {
result.getIRDeclarationEntry() = entry
}
/**
@@ -24,20 +24,22 @@ TranslatedDeclarationEntry getTranslatedDeclarationEntry(DeclarationEntry entry)
* functions do not have a `TranslatedDeclarationEntry`.
*/
abstract class TranslatedDeclarationEntry extends TranslatedElement, TTranslatedDeclarationEntry {
DeclarationEntry entry;
IRDeclarationEntry entry;
TranslatedDeclarationEntry() { this = TTranslatedDeclarationEntry(entry) }
final override Function getFunction() {
exists(DeclStmt stmt |
stmt.getADeclarationEntry() = entry and
stmt = entry.getStmt() and
result = stmt.getEnclosingFunction()
)
}
IRDeclarationEntry getIRDeclarationEntry() { result = entry }
final override string toString() { result = entry.toString() }
final override Locatable getAst() { result = entry }
final override Locatable getAst() { result = entry.getAst() }
/** DEPRECATED: Alias for getAst */
deprecated override Locatable getAST() { result = getAst() }
@@ -216,7 +218,7 @@ class TranslatedStaticLocalVariableDeclarationEntry extends TranslatedDeclaratio
*/
class TranslatedStaticLocalVariableInitialization extends TranslatedElement,
TranslatedLocalVariableDeclaration, TTranslatedStaticLocalVariableInitialization {
VariableDeclarationEntry entry;
IRVariableDeclarationEntry entry;
StaticLocalVariable var;
TranslatedStaticLocalVariableInitialization() {
@@ -226,7 +228,7 @@ class TranslatedStaticLocalVariableInitialization extends TranslatedElement,
final override string toString() { result = "init: " + entry.toString() }
final override Locatable getAst() { result = entry }
final override Locatable getAst() { result = entry.getAst() }
/** DEPRECATED: Alias for getAst */
deprecated override Locatable getAST() { result = getAst() }
@@ -236,40 +238,6 @@ class TranslatedStaticLocalVariableInitialization extends TranslatedElement,
final override Function getFunction() { result = var.getFunction() }
}
/**
* Gets the `TranslatedRangeBasedForVariableDeclaration` that represents the declaration of
* `var`.
*/
TranslatedRangeBasedForVariableDeclaration getTranslatedRangeBasedForVariableDeclaration(
LocalVariable var
) {
result.getVariable() = var
}
/**
* Represents the IR translation of a compiler-generated variable in a range-based `for` loop.
*/
class TranslatedRangeBasedForVariableDeclaration extends TranslatedLocalVariableDeclaration,
TTranslatedRangeBasedForVariableDeclaration {
RangeBasedForStmt forStmt;
LocalVariable var;
TranslatedRangeBasedForVariableDeclaration() {
this = TTranslatedRangeBasedForVariableDeclaration(forStmt, var)
}
override string toString() { result = var.toString() }
override Locatable getAst() { result = var }
/** DEPRECATED: Alias for getAst */
deprecated override Locatable getAST() { result = getAst() }
override Function getFunction() { result = forStmt.getEnclosingFunction() }
override LocalVariable getVariable() { result = var }
}
TranslatedConditionDecl getTranslatedConditionDecl(ConditionDeclExpr expr) {
result.getAst() = expr
}

View File

@@ -443,10 +443,10 @@ predicate hasTranslatedSyntheticTemporaryObject(Expr expr) {
* necessary for automatic local variables, or for static local variables with dynamic
* initialization.
*/
private predicate translateDeclarationEntry(DeclarationEntry entry) {
private predicate translateDeclarationEntry(IRDeclarationEntry entry) {
exists(DeclStmt declStmt, LocalVariable var |
translateStmt(declStmt) and
declStmt.getADeclarationEntry() = entry and
declStmt = entry.getStmt() and
// Only declarations of local variables need to be translated to IR.
var = entry.getDeclaration() and
(
@@ -458,6 +458,102 @@ private predicate translateDeclarationEntry(DeclarationEntry entry) {
)
}
private module IRDeclarationEntries {
private newtype TIRDeclarationEntry =
TPresentDeclarationEntry(DeclarationEntry entry) or
TMissingDeclarationEntry(DeclStmt stmt, Declaration d, int index) {
not exists(stmt.getDeclarationEntry(index)) and
stmt.getDeclaration(index) = d
}
/**
* An entity that represents a declaration entry in the database.
*
* This class exists to work around the fact that `DeclStmt`s in some cases
* do not have `DeclarationEntry`s. Currently, this is the case for:
* - `DeclStmt`s in template instantiations.
* - `DeclStmt`s that are generated by the desugaring of range-based for-loops.
*
* So instead, the IR works with `IRDeclarationEntry`s that synthesize missing
* `DeclarationEntry`s when there is no result for `DeclStmt::getDeclarationEntry`.
*/
abstract class IRDeclarationEntry extends TIRDeclarationEntry {
/** Gets a string representation of this `IRDeclarationEntry`. */
abstract string toString();
/** Gets the `DeclStmt` that this `IRDeclarationEntry` belongs to. */
abstract DeclStmt getStmt();
/** Gets the `Declaration` declared by this `IRDeclarationEntry`. */
abstract Declaration getDeclaration();
/** Gets the AST represented by this `IRDeclarationEntry`. */
abstract Locatable getAst();
/**
* Holds if this `IRDeclarationEntry` is the `index`'th entry
* declared by the enclosing `DeclStmt`.
*/
abstract predicate hasIndex(int index);
}
/** A `IRDeclarationEntry` for an existing `DeclarationEntry`. */
private class PresentDeclarationEntry extends IRDeclarationEntry, TPresentDeclarationEntry {
DeclarationEntry entry;
PresentDeclarationEntry() { this = TPresentDeclarationEntry(entry) }
override string toString() { result = entry.toString() }
override DeclStmt getStmt() { result.getADeclarationEntry() = entry }
override Declaration getDeclaration() { result = entry.getDeclaration() }
override Locatable getAst() { result = entry }
override predicate hasIndex(int index) { this.getStmt().getDeclarationEntry(index) = entry }
}
/**
* A synthesized `DeclarationEntry` that is created when a `DeclStmt` is missing a
* result for `DeclStmt::getDeclarationEntry`
*/
private class MissingDeclarationEntry extends IRDeclarationEntry, TMissingDeclarationEntry {
DeclStmt stmt;
Declaration d;
int index;
MissingDeclarationEntry() { this = TMissingDeclarationEntry(stmt, d, index) }
override string toString() { result = "missing declaration of " + d.getName() }
override DeclStmt getStmt() { result = stmt }
override Declaration getDeclaration() { result = d }
override Locatable getAst() { result = stmt }
override predicate hasIndex(int idx) { idx = index }
}
/** A `IRDeclarationEntry` that represents an entry for a `Variable`. */
class IRVariableDeclarationEntry instanceof IRDeclarationEntry {
Variable v;
IRVariableDeclarationEntry() { super.getDeclaration() = v }
Variable getDeclaration() { result = v }
string toString() { result = super.toString() }
Locatable getAst() { result = super.getAst() }
DeclStmt getStmt() { result = super.getStmt() }
}
}
import IRDeclarationEntries
newtype TTranslatedElement =
// An expression that is not being consumed as a condition
TTranslatedValueExpr(Expr expr) {
@@ -613,23 +709,13 @@ newtype TTranslatedElement =
)
} or
// A local declaration
TTranslatedDeclarationEntry(DeclarationEntry entry) { translateDeclarationEntry(entry) } or
TTranslatedDeclarationEntry(IRDeclarationEntry entry) { translateDeclarationEntry(entry) } or
// The dynamic initialization of a static local variable. This is a separate object from the
// declaration entry.
TTranslatedStaticLocalVariableInitialization(DeclarationEntry entry) {
TTranslatedStaticLocalVariableInitialization(IRDeclarationEntry entry) {
translateDeclarationEntry(entry) and
entry.getDeclaration() instanceof StaticLocalVariable
} or
// A compiler-generated variable to implement a range-based for loop. These don't have a
// `DeclarationEntry` in the database, so we have to go by the `Variable` itself.
TTranslatedRangeBasedForVariableDeclaration(RangeBasedForStmt forStmt, LocalVariable var) {
translateStmt(forStmt) and
(
var = forStmt.getRangeVariable() or
var = forStmt.getBeginEndDeclaration().getADeclaration() or
var = forStmt.getVariable()
)
} or
// An allocator call in a `new` or `new[]` expression
TTranslatedAllocatorCall(NewOrNewArrayExpr newExpr) { not ignoreExpr(newExpr) } or
// An allocation size for a `new` or `new[]` expression

View File

@@ -76,6 +76,13 @@ class TranslatedDeclStmt extends TranslatedStmt {
private int getChildCount() { result = count(getDeclarationEntry(_)) }
IRDeclarationEntry getIRDeclarationEntry(int index) {
result.hasIndex(index) and
result.getStmt() = stmt
}
IRDeclarationEntry getAnIRDeclarationEntry() { result = this.getIRDeclarationEntry(_) }
/**
* Gets the `TranslatedDeclarationEntry` child at zero-based index `index`. Since not all
* `DeclarationEntry` objects have a `TranslatedDeclarationEntry` (e.g. extern functions), we map
@@ -85,7 +92,7 @@ class TranslatedDeclStmt extends TranslatedStmt {
private TranslatedDeclarationEntry getDeclarationEntry(int index) {
result =
rank[index + 1](TranslatedDeclarationEntry entry, int originalIndex |
entry = getTranslatedDeclarationEntry(stmt.getDeclarationEntry(originalIndex))
entry = getTranslatedDeclarationEntry(this.getIRDeclarationEntry(originalIndex))
|
entry order by originalIndex
)
@@ -597,36 +604,32 @@ class TranslatedRangeBasedForStmt extends TranslatedStmt, ConditionContext {
override RangeBasedForStmt stmt;
override TranslatedElement getChild(int id) {
id = 0 and result = getRangeVariableDeclaration()
id = 0 and result = getRangeVariableDeclStmt()
or
id = 1 and result = getBeginVariableDeclaration()
// Note: `__begin` and `__end` are declared by the same `DeclStmt`
id = 1 and result = getBeginEndVariableDeclStmt()
or
id = 2 and result = getEndVariableDeclaration()
id = 2 and result = getCondition()
or
id = 3 and result = getCondition()
id = 3 and result = getUpdate()
or
id = 4 and result = getUpdate()
id = 4 and result = getVariableDeclStmt()
or
id = 5 and result = getVariableDeclaration()
or
id = 6 and result = getBody()
id = 5 and result = getBody()
}
override Instruction getFirstInstruction() {
result = getRangeVariableDeclaration().getFirstInstruction()
result = getRangeVariableDeclStmt().getFirstInstruction()
}
override Instruction getChildSuccessor(TranslatedElement child) {
child = getRangeVariableDeclaration() and
result = getBeginVariableDeclaration().getFirstInstruction()
child = getRangeVariableDeclStmt() and
result = getBeginEndVariableDeclStmt().getFirstInstruction()
or
child = getBeginVariableDeclaration() and
result = getEndVariableDeclaration().getFirstInstruction()
or
child = getEndVariableDeclaration() and
child = getBeginEndVariableDeclStmt() and
result = getCondition().getFirstInstruction()
or
child = getVariableDeclaration() and
child = getVariableDeclStmt() and
result = getBody().getFirstInstruction()
or
child = getBody() and
@@ -643,23 +646,25 @@ class TranslatedRangeBasedForStmt extends TranslatedStmt, ConditionContext {
override Instruction getInstructionSuccessor(InstructionTag tag, EdgeKind kind) { none() }
override Instruction getChildTrueSuccessor(TranslatedCondition child) {
child = getCondition() and result = getVariableDeclaration().getFirstInstruction()
child = getCondition() and result = getVariableDeclStmt().getFirstInstruction()
}
override Instruction getChildFalseSuccessor(TranslatedCondition child) {
child = getCondition() and result = getParent().getChildSuccessor(this)
}
private TranslatedRangeBasedForVariableDeclaration getRangeVariableDeclaration() {
result = getTranslatedRangeBasedForVariableDeclaration(stmt.getRangeVariable())
private TranslatedDeclStmt getRangeVariableDeclStmt() {
exists(IRVariableDeclarationEntry entry |
entry.getDeclaration() = stmt.getRangeVariable() and
result.getAnIRDeclarationEntry() = entry
)
}
private TranslatedRangeBasedForVariableDeclaration getBeginVariableDeclaration() {
result = getTranslatedRangeBasedForVariableDeclaration(stmt.getBeginVariable())
}
private TranslatedRangeBasedForVariableDeclaration getEndVariableDeclaration() {
result = getTranslatedRangeBasedForVariableDeclaration(stmt.getEndVariable())
private TranslatedDeclStmt getBeginEndVariableDeclStmt() {
exists(IRVariableDeclarationEntry entry |
entry.getStmt() = stmt.getBeginEndDeclaration() and
result.getAnIRDeclarationEntry() = entry
)
}
// Public for getInstructionBackEdgeSuccessor
@@ -672,8 +677,11 @@ class TranslatedRangeBasedForStmt extends TranslatedStmt, ConditionContext {
result = getTranslatedExpr(stmt.getUpdate().getFullyConverted())
}
private TranslatedRangeBasedForVariableDeclaration getVariableDeclaration() {
result = getTranslatedRangeBasedForVariableDeclaration(stmt.getVariable())
private TranslatedDeclStmt getVariableDeclStmt() {
exists(IRVariableDeclarationEntry entry |
entry.getDeclaration() = stmt.getVariable() and
result.getAnIRDeclarationEntry() = entry
)
}
private TranslatedStmt getBody() { result = getTranslatedStmt(stmt.getStmt()) }

View File

@@ -14161,6 +14161,221 @@ ir.cpp:
# 1851| Type = [PointerType] const char *
# 1851| ValueCategory = prvalue
# 1852| getStmt(2): [ReturnStmt] return ...
# 1855| [CopyAssignmentOperator] missing_declaration_entries::S& missing_declaration_entries::S::operator=(missing_declaration_entries::S const&)
# 1855| <params>:
#-----| getParameter(0): [Parameter] (unnamed parameter 0)
#-----| Type = [LValueReferenceType] const S &
# 1855| [MoveAssignmentOperator] missing_declaration_entries::S& missing_declaration_entries::S::operator=(missing_declaration_entries::S&&)
# 1855| <params>:
#-----| getParameter(0): [Parameter] (unnamed parameter 0)
#-----| Type = [RValueReferenceType] S &&
# 1859| [CopyAssignmentOperator] missing_declaration_entries::Bar1<int>& missing_declaration_entries::Bar1<int>::operator=(missing_declaration_entries::Bar1<int> const&)
# 1859| <params>:
#-----| getParameter(0): [Parameter] (unnamed parameter 0)
#-----| Type = [LValueReferenceType] const Bar1<int> &
# 1859| [MoveAssignmentOperator] missing_declaration_entries::Bar1<int>& missing_declaration_entries::Bar1<int>::operator=(missing_declaration_entries::Bar1<int>&&)
# 1859| <params>:
#-----| getParameter(0): [Parameter] (unnamed parameter 0)
#-----| Type = [RValueReferenceType] Bar1<int> &&
# 1862| [MemberFunction] void* missing_declaration_entries::Bar1<T>::missing_type_decl_entry(missing_declaration_entries::Bar1<T>::pointer)
# 1862| <params>:
# 1862| getParameter(0): [Parameter] p
# 1862| Type = [CTypedefType,NestedTypedefType] pointer
# 1862| getEntryPoint(): [BlockStmt] { ... }
# 1863| getStmt(0): [DeclStmt] declaration
# 1863| getDeclarationEntry(0): [TypeDeclarationEntry] declaration of _Res
# 1863| Type = [CTypedefType,LocalTypedefType] _Res
# 1864| getStmt(1): [ReturnStmt] return ...
# 1864| getExpr(): [VariableAccess] p
# 1864| Type = [CTypedefType,NestedTypedefType] pointer
# 1864| ValueCategory = prvalue(load)
# 1864| getExpr().getFullyConverted(): [CStyleCast] (void *)...
# 1864| Conversion = [PointerConversion] pointer conversion
# 1864| Type = [VoidPointerType] void *
# 1864| ValueCategory = prvalue
# 1862| [MemberFunction] void* missing_declaration_entries::Bar1<int>::missing_type_decl_entry(missing_declaration_entries::Bar1<int>::pointer)
# 1862| <params>:
# 1862| getParameter(0): [Parameter] p
# 1862| Type = [CTypedefType,NestedTypedefType] pointer
# 1862| getEntryPoint(): [BlockStmt] { ... }
# 1863| getStmt(0): [DeclStmt] declaration
# 1864| getStmt(1): [ReturnStmt] return ...
# 1864| getExpr(): [VariableAccess] p
# 1864| Type = [CTypedefType,NestedTypedefType] pointer
# 1864| ValueCategory = prvalue(load)
# 1864| getExpr().getFullyConverted(): [CStyleCast] (void *)...
# 1864| Conversion = [PointerConversion] pointer conversion
# 1864| Type = [VoidPointerType] void *
# 1864| ValueCategory = prvalue
# 1868| [TopLevelFunction] void missing_declaration_entries::test1()
# 1868| <params>:
# 1868| getEntryPoint(): [BlockStmt] { ... }
# 1869| getStmt(0): [DeclStmt] declaration
# 1869| getDeclarationEntry(0): [VariableDeclarationEntry] definition of b
# 1869| Type = [ClassTemplateInstantiation,Struct] Bar1<int>
# 1870| getStmt(1): [ExprStmt] ExprStmt
# 1870| getExpr(): [FunctionCall] call to missing_type_decl_entry
# 1870| Type = [VoidPointerType] void *
# 1870| ValueCategory = prvalue
# 1870| getQualifier(): [VariableAccess] b
# 1870| Type = [ClassTemplateInstantiation,Struct] Bar1<int>
# 1870| ValueCategory = lvalue
# 1870| getArgument(0): [Literal] 0
# 1870| Type = [NullPointerType] decltype(nullptr)
# 1870| Value = [Literal] 0
# 1870| ValueCategory = prvalue
# 1870| getArgument(0).getFullyConverted(): [CStyleCast] (pointer)...
# 1870| Conversion = [PointerConversion] pointer conversion
# 1870| Type = [CTypedefType,NestedTypedefType] pointer
# 1870| Value = [CStyleCast] 0
# 1870| ValueCategory = prvalue
# 1871| getStmt(2): [ReturnStmt] return ...
# 1873| [CopyAssignmentOperator] missing_declaration_entries::Bar2<int>& missing_declaration_entries::Bar2<int>::operator=(missing_declaration_entries::Bar2<int> const&)
# 1873| <params>:
#-----| getParameter(0): [Parameter] (unnamed parameter 0)
#-----| Type = [LValueReferenceType] const Bar2<int> &
# 1873| [MoveAssignmentOperator] missing_declaration_entries::Bar2<int>& missing_declaration_entries::Bar2<int>::operator=(missing_declaration_entries::Bar2<int>&&)
# 1873| <params>:
#-----| getParameter(0): [Parameter] (unnamed parameter 0)
#-----| Type = [RValueReferenceType] Bar2<int> &&
# 1875| [MemberFunction] int missing_declaration_entries::Bar2<T>::two_missing_variable_declaration_entries()
# 1875| <params>:
# 1875| getEntryPoint(): [BlockStmt] { ... }
# 1876| getStmt(0): [DeclStmt] declaration
# 1876| getDeclarationEntry(0): [VariableDeclarationEntry] definition of x
# 1876| Type = [ArrayType] int[10]
# 1876| getDeclarationEntry(1): [VariableDeclarationEntry] definition of y
# 1876| Type = [ArrayType] int[10]
# 1877| getStmt(1): [ExprStmt] ExprStmt
# 1877| getExpr(): [AssignExpr] ... = ...
# 1877| Type = [IntType] int
# 1877| ValueCategory = lvalue
# 1877| getLValue(): [PointerDereferenceExpr] * ...
# 1877| Type = [IntType] int
# 1877| ValueCategory = lvalue
# 1877| getOperand(): [VariableAccess] x
# 1877| Type = [ArrayType] int[10]
# 1877| ValueCategory = lvalue
# 1877| getOperand().getFullyConverted(): [ArrayToPointerConversion] array to pointer conversion
# 1877| Type = [IntPointerType] int *
# 1877| ValueCategory = prvalue
# 1877| getRValue(): [Literal] 10
# 1877| Type = [IntType] int
# 1877| Value = [Literal] 10
# 1877| ValueCategory = prvalue
# 1878| getStmt(2): [ExprStmt] ExprStmt
# 1878| getExpr(): [AssignExpr] ... = ...
# 1878| Type = [IntType] int
# 1878| ValueCategory = lvalue
# 1878| getLValue(): [PointerDereferenceExpr] * ...
# 1878| Type = [IntType] int
# 1878| ValueCategory = lvalue
# 1878| getOperand(): [VariableAccess] y
# 1878| Type = [ArrayType] int[10]
# 1878| ValueCategory = lvalue
# 1878| getOperand().getFullyConverted(): [ArrayToPointerConversion] array to pointer conversion
# 1878| Type = [IntPointerType] int *
# 1878| ValueCategory = prvalue
# 1878| getRValue(): [Literal] 10
# 1878| Type = [IntType] int
# 1878| Value = [Literal] 10
# 1878| ValueCategory = prvalue
# 1879| getStmt(3): [ReturnStmt] return ...
# 1879| getExpr(): [AddExpr] ... + ...
# 1879| Type = [IntType] int
# 1879| ValueCategory = prvalue
# 1879| getLeftOperand(): [PointerDereferenceExpr] * ...
# 1879| Type = [IntType] int
# 1879| ValueCategory = prvalue(load)
# 1879| getOperand(): [VariableAccess] x
# 1879| Type = [ArrayType] int[10]
# 1879| ValueCategory = lvalue
# 1879| getOperand().getFullyConverted(): [ArrayToPointerConversion] array to pointer conversion
# 1879| Type = [IntPointerType] int *
# 1879| ValueCategory = prvalue
# 1879| getRightOperand(): [PointerDereferenceExpr] * ...
# 1879| Type = [IntType] int
# 1879| ValueCategory = prvalue(load)
# 1879| getOperand(): [VariableAccess] y
# 1879| Type = [ArrayType] int[10]
# 1879| ValueCategory = lvalue
# 1879| getOperand().getFullyConverted(): [ArrayToPointerConversion] array to pointer conversion
# 1879| Type = [IntPointerType] int *
# 1879| ValueCategory = prvalue
# 1875| [MemberFunction] int missing_declaration_entries::Bar2<int>::two_missing_variable_declaration_entries()
# 1875| <params>:
# 1875| getEntryPoint(): [BlockStmt] { ... }
# 1876| getStmt(0): [DeclStmt] declaration
# 1877| getStmt(1): [ExprStmt] ExprStmt
# 1877| getExpr(): [AssignExpr] ... = ...
# 1877| Type = [IntType] int
# 1877| ValueCategory = lvalue
# 1877| getLValue(): [PointerDereferenceExpr] * ...
# 1877| Type = [IntType] int
# 1877| ValueCategory = lvalue
# 1877| getOperand(): [VariableAccess] x
# 1877| Type = [ArrayType] int[10]
# 1877| ValueCategory = lvalue
# 1877| getOperand().getFullyConverted(): [ArrayToPointerConversion] array to pointer conversion
# 1877| Type = [IntPointerType] int *
# 1877| ValueCategory = prvalue
# 1877| getRValue(): [Literal] 10
# 1877| Type = [IntType] int
# 1877| Value = [Literal] 10
# 1877| ValueCategory = prvalue
# 1878| getStmt(2): [ExprStmt] ExprStmt
# 1878| getExpr(): [AssignExpr] ... = ...
# 1878| Type = [IntType] int
# 1878| ValueCategory = lvalue
# 1878| getLValue(): [PointerDereferenceExpr] * ...
# 1878| Type = [IntType] int
# 1878| ValueCategory = lvalue
# 1878| getOperand(): [VariableAccess] y
# 1878| Type = [ArrayType] int[10]
# 1878| ValueCategory = lvalue
# 1878| getOperand().getFullyConverted(): [ArrayToPointerConversion] array to pointer conversion
# 1878| Type = [IntPointerType] int *
# 1878| ValueCategory = prvalue
# 1878| getRValue(): [Literal] 10
# 1878| Type = [IntType] int
# 1878| Value = [Literal] 10
# 1878| ValueCategory = prvalue
# 1879| getStmt(3): [ReturnStmt] return ...
# 1879| getExpr(): [AddExpr] ... + ...
# 1879| Type = [IntType] int
# 1879| ValueCategory = prvalue
# 1879| getLeftOperand(): [PointerDereferenceExpr] * ...
# 1879| Type = [IntType] int
# 1879| ValueCategory = prvalue(load)
# 1879| getOperand(): [VariableAccess] x
# 1879| Type = [ArrayType] int[10]
# 1879| ValueCategory = lvalue
# 1879| getOperand().getFullyConverted(): [ArrayToPointerConversion] array to pointer conversion
# 1879| Type = [IntPointerType] int *
# 1879| ValueCategory = prvalue
# 1879| getRightOperand(): [PointerDereferenceExpr] * ...
# 1879| Type = [IntType] int
# 1879| ValueCategory = prvalue(load)
# 1879| getOperand(): [VariableAccess] y
# 1879| Type = [ArrayType] int[10]
# 1879| ValueCategory = lvalue
# 1879| getOperand().getFullyConverted(): [ArrayToPointerConversion] array to pointer conversion
# 1879| Type = [IntPointerType] int *
# 1879| ValueCategory = prvalue
# 1883| [TopLevelFunction] void missing_declaration_entries::test2()
# 1883| <params>:
# 1883| getEntryPoint(): [BlockStmt] { ... }
# 1884| getStmt(0): [DeclStmt] declaration
# 1884| getDeclarationEntry(0): [VariableDeclarationEntry] definition of b
# 1884| Type = [ClassTemplateInstantiation,Struct] Bar2<int>
# 1885| getStmt(1): [ExprStmt] ExprStmt
# 1885| getExpr(): [FunctionCall] call to two_missing_variable_declaration_entries
# 1885| Type = [IntType] int
# 1885| ValueCategory = prvalue
# 1885| getQualifier(): [VariableAccess] b
# 1885| Type = [ClassTemplateInstantiation,Struct] Bar2<int>
# 1885| ValueCategory = lvalue
# 1886| getStmt(2): [ReturnStmt] return ...
perf-regression.cpp:
# 4| [CopyAssignmentOperator] Big& Big::operator=(Big const&)
# 4| <params>:

View File

@@ -1851,4 +1851,39 @@ void magicvars() {
const char *strfunc = __func__;
}
namespace missing_declaration_entries {
struct S {};
template<typename A, typename B> struct pair{};
template<typename T> struct Bar1 {
typedef S* pointer;
void* missing_type_decl_entry(pointer p) {
typedef pair<pointer, bool> _Res;
return p;
}
};
void test1() {
Bar1<int> b;
b.missing_type_decl_entry(nullptr);
}
template<typename T> struct Bar2 {
int two_missing_variable_declaration_entries() {
int x[10], y[10];
*x = 10;
*y = 10;
return *x + *y;
}
};
void test2() {
Bar2<int> b;
b.two_missing_variable_declaration_entries();
}
}
// semmle-extractor-options: -std=c++17 --clang

View File

@@ -5303,10 +5303,10 @@
| ir.cpp:1077:39:1077:39 | Address | &:r1077_7 |
| ir.cpp:1077:39:1077:39 | Load | m1077_6 |
| ir.cpp:1077:39:1077:39 | SideEffect | m1077_8 |
| ir.cpp:1078:5:1078:5 | Address | &:r1078_1 |
| ir.cpp:1078:5:1078:5 | Address | &:r1078_7 |
| ir.cpp:1078:5:1078:5 | Address | &:r1078_15 |
| ir.cpp:1078:14:1078:14 | Address | &:r1078_33 |
| ir.cpp:1078:5:1082:5 | Address | &:r1078_1 |
| ir.cpp:1078:5:1082:5 | Address | &:r1078_7 |
| ir.cpp:1078:5:1082:5 | Address | &:r1078_15 |
| ir.cpp:1078:5:1082:5 | Address | &:r1078_33 |
| ir.cpp:1078:18:1078:18 | Address | &:r1078_2 |
| ir.cpp:1078:18:1078:18 | Address | &:r1078_8 |
| ir.cpp:1078:18:1078:18 | Address | &:r1078_16 |
@@ -5369,10 +5369,10 @@
| ir.cpp:1079:13:1079:13 | Load | m1078_40 |
| ir.cpp:1079:13:1079:17 | Condition | r1079_4 |
| ir.cpp:1079:17:1079:17 | Right | r1079_3 |
| ir.cpp:1084:5:1084:5 | Address | &:r1084_1 |
| ir.cpp:1084:5:1084:5 | Address | &:r1084_7 |
| ir.cpp:1084:5:1084:5 | Address | &:r1084_15 |
| ir.cpp:1084:21:1084:21 | Address | &:r1084_42 |
| ir.cpp:1084:5:1088:5 | Address | &:r1084_1 |
| ir.cpp:1084:5:1088:5 | Address | &:r1084_7 |
| ir.cpp:1084:5:1088:5 | Address | &:r1084_15 |
| ir.cpp:1084:5:1088:5 | Address | &:r1084_42 |
| ir.cpp:1084:25:1084:25 | Address | &:r1084_2 |
| ir.cpp:1084:25:1084:25 | Address | &:r1084_8 |
| ir.cpp:1084:25:1084:25 | Address | &:r1084_16 |
@@ -8650,6 +8650,97 @@
| ir.cpp:1851:17:1851:23 | Address | &:r1851_1 |
| ir.cpp:1851:27:1851:34 | StoreValue | r1851_3 |
| ir.cpp:1851:27:1851:34 | Unary | r1851_2 |
| ir.cpp:1862:15:1862:15 | Address | &:r1862_5 |
| ir.cpp:1862:15:1862:15 | Address | &:r1862_5 |
| ir.cpp:1862:15:1862:15 | Address | &:r1862_7 |
| ir.cpp:1862:15:1862:15 | Address | &:r1862_7 |
| ir.cpp:1862:15:1862:15 | Address | &:r1862_15 |
| ir.cpp:1862:15:1862:15 | ChiPartial | partial:m1862_3 |
| ir.cpp:1862:15:1862:15 | ChiTotal | total:m1862_2 |
| ir.cpp:1862:15:1862:15 | Load | m1862_6 |
| ir.cpp:1862:15:1862:15 | Load | m1864_5 |
| ir.cpp:1862:15:1862:15 | SideEffect | m1862_3 |
| ir.cpp:1862:15:1862:15 | SideEffect | m1862_8 |
| ir.cpp:1862:47:1862:47 | Address | &:r1862_9 |
| ir.cpp:1862:47:1862:47 | Address | &:r1862_9 |
| ir.cpp:1862:47:1862:47 | Address | &:r1862_11 |
| ir.cpp:1862:47:1862:47 | Address | &:r1862_11 |
| ir.cpp:1862:47:1862:47 | Load | m1862_10 |
| ir.cpp:1862:47:1862:47 | SideEffect | m1862_12 |
| ir.cpp:1864:13:1864:21 | Address | &:r1864_1 |
| ir.cpp:1864:20:1864:20 | Address | &:r1864_2 |
| ir.cpp:1864:20:1864:20 | Load | m1862_10 |
| ir.cpp:1864:20:1864:20 | StoreValue | r1864_4 |
| ir.cpp:1864:20:1864:20 | Unary | r1864_3 |
| ir.cpp:1868:10:1868:14 | ChiPartial | partial:m1868_3 |
| ir.cpp:1868:10:1868:14 | ChiTotal | total:m1868_2 |
| ir.cpp:1868:10:1868:14 | SideEffect | ~m1870_12 |
| ir.cpp:1869:19:1869:19 | Address | &:r1869_1 |
| ir.cpp:1870:9:1870:9 | Address | &:r1870_1 |
| ir.cpp:1870:9:1870:9 | Address | &:r1870_1 |
| ir.cpp:1870:9:1870:9 | Arg(this) | this:r1870_1 |
| ir.cpp:1870:9:1870:9 | ChiPartial | partial:m1870_9 |
| ir.cpp:1870:9:1870:9 | ChiTotal | total:m1869_2 |
| ir.cpp:1870:9:1870:9 | SideEffect | m1869_2 |
| ir.cpp:1870:11:1870:33 | CallTarget | func:r1870_2 |
| ir.cpp:1870:11:1870:33 | ChiPartial | partial:m1870_5 |
| ir.cpp:1870:11:1870:33 | ChiTotal | total:m1868_4 |
| ir.cpp:1870:11:1870:33 | SideEffect | ~m1868_4 |
| ir.cpp:1870:35:1870:41 | Address | &:r1870_3 |
| ir.cpp:1870:35:1870:41 | Address | &:r1870_3 |
| ir.cpp:1870:35:1870:41 | Arg(0) | 0:r1870_3 |
| ir.cpp:1870:35:1870:41 | ChiPartial | partial:m1870_11 |
| ir.cpp:1870:35:1870:41 | ChiTotal | total:m1870_6 |
| ir.cpp:1870:35:1870:41 | SideEffect | ~m1870_6 |
| ir.cpp:1875:13:1875:13 | Address | &:r1875_5 |
| ir.cpp:1875:13:1875:13 | Address | &:r1875_5 |
| ir.cpp:1875:13:1875:13 | Address | &:r1875_7 |
| ir.cpp:1875:13:1875:13 | Address | &:r1875_7 |
| ir.cpp:1875:13:1875:13 | Address | &:r1875_10 |
| ir.cpp:1875:13:1875:13 | ChiPartial | partial:m1875_3 |
| ir.cpp:1875:13:1875:13 | ChiTotal | total:m1875_2 |
| ir.cpp:1875:13:1875:13 | Load | m1875_6 |
| ir.cpp:1875:13:1875:13 | Load | m1879_9 |
| ir.cpp:1875:13:1875:13 | SideEffect | m1875_3 |
| ir.cpp:1875:13:1875:13 | SideEffect | m1875_8 |
| ir.cpp:1876:13:1876:29 | Address | &:r1876_1 |
| ir.cpp:1876:13:1876:29 | Address | &:r1876_3 |
| ir.cpp:1877:13:1877:14 | Address | &:r1877_4 |
| ir.cpp:1877:13:1877:19 | ChiPartial | partial:m1877_5 |
| ir.cpp:1877:13:1877:19 | ChiTotal | total:m1876_2 |
| ir.cpp:1877:14:1877:14 | Unary | r1877_2 |
| ir.cpp:1877:14:1877:14 | Unary | r1877_3 |
| ir.cpp:1877:18:1877:19 | StoreValue | r1877_1 |
| ir.cpp:1878:13:1878:14 | Address | &:r1878_4 |
| ir.cpp:1878:13:1878:19 | ChiPartial | partial:m1878_5 |
| ir.cpp:1878:13:1878:19 | ChiTotal | total:m1876_4 |
| ir.cpp:1878:14:1878:14 | Unary | r1878_2 |
| ir.cpp:1878:14:1878:14 | Unary | r1878_3 |
| ir.cpp:1878:18:1878:19 | StoreValue | r1878_1 |
| ir.cpp:1879:13:1879:27 | Address | &:r1879_1 |
| ir.cpp:1879:20:1879:21 | Left | r1879_4 |
| ir.cpp:1879:20:1879:21 | Load | m1877_5 |
| ir.cpp:1879:20:1879:26 | StoreValue | r1879_8 |
| ir.cpp:1879:21:1879:21 | Address | &:r1879_3 |
| ir.cpp:1879:21:1879:21 | Unary | r1879_2 |
| ir.cpp:1879:25:1879:26 | Load | m1878_5 |
| ir.cpp:1879:25:1879:26 | Right | r1879_7 |
| ir.cpp:1879:26:1879:26 | Address | &:r1879_6 |
| ir.cpp:1879:26:1879:26 | Unary | r1879_5 |
| ir.cpp:1883:10:1883:14 | ChiPartial | partial:m1883_3 |
| ir.cpp:1883:10:1883:14 | ChiTotal | total:m1883_2 |
| ir.cpp:1883:10:1883:14 | SideEffect | ~m1885_5 |
| ir.cpp:1884:19:1884:19 | Address | &:r1884_1 |
| ir.cpp:1885:9:1885:9 | Address | &:r1885_1 |
| ir.cpp:1885:9:1885:9 | Address | &:r1885_1 |
| ir.cpp:1885:9:1885:9 | Arg(this) | this:r1885_1 |
| ir.cpp:1885:9:1885:9 | ChiPartial | partial:m1885_7 |
| ir.cpp:1885:9:1885:9 | ChiTotal | total:m1884_2 |
| ir.cpp:1885:9:1885:9 | SideEffect | m1884_2 |
| ir.cpp:1885:11:1885:50 | CallTarget | func:r1885_2 |
| ir.cpp:1885:11:1885:50 | ChiPartial | partial:m1885_4 |
| ir.cpp:1885:11:1885:50 | ChiTotal | total:m1883_4 |
| ir.cpp:1885:11:1885:50 | SideEffect | ~m1883_4 |
| perf-regression.cpp:6:3:6:5 | Address | &:r6_5 |
| perf-regression.cpp:6:3:6:5 | Address | &:r6_5 |
| perf-regression.cpp:6:3:6:5 | Address | &:r6_7 |

View File

@@ -6,7 +6,6 @@ missingOperandType
duplicateChiOperand
sideEffectWithoutPrimary
instructionWithoutSuccessor
| ../../../include/memory.h:68:25:68:33 | CopyValue: (reference to) | Instruction 'CopyValue: (reference to)' has no successors in function '$@'. | ../../../include/memory.h:67:5:67:5 | void std::unique_ptr<int, std::default_delete<int>>::~unique_ptr() | void std::unique_ptr<int, std::default_delete<int>>::~unique_ptr() |
ambiguousSuccessors
unexplainedLoop
unnecessaryPhiInstruction

View File

@@ -9932,6 +9932,108 @@ ir.cpp:
# 1849| v1849_5(void) = AliasedUse : ~m?
# 1849| v1849_6(void) = ExitFunction :
# 1862| void* missing_declaration_entries::Bar1<int>::missing_type_decl_entry(missing_declaration_entries::Bar1<int>::pointer)
# 1862| Block 0
# 1862| v1862_1(void) = EnterFunction :
# 1862| mu1862_2(unknown) = AliasedDefinition :
# 1862| mu1862_3(unknown) = InitializeNonLocal :
# 1862| r1862_4(glval<unknown>) = VariableAddress[#this] :
# 1862| mu1862_5(glval<Bar1<int>>) = InitializeParameter[#this] : &:r1862_4
# 1862| r1862_6(glval<Bar1<int>>) = Load[#this] : &:r1862_4, ~m?
# 1862| mu1862_7(Bar1<int>) = InitializeIndirection[#this] : &:r1862_6
# 1862| r1862_8(glval<S *>) = VariableAddress[p] :
# 1862| mu1862_9(S *) = InitializeParameter[p] : &:r1862_8
# 1862| r1862_10(S *) = Load[p] : &:r1862_8, ~m?
# 1862| mu1862_11(unknown) = InitializeIndirection[p] : &:r1862_10
# 1864| r1864_1(glval<void *>) = VariableAddress[#return] :
# 1864| r1864_2(glval<S *>) = VariableAddress[p] :
# 1864| r1864_3(S *) = Load[p] : &:r1864_2, ~m?
# 1864| r1864_4(void *) = Convert : r1864_3
# 1864| mu1864_5(void *) = Store[#return] : &:r1864_1, r1864_4
# 1862| v1862_12(void) = ReturnIndirection[#this] : &:r1862_6, ~m?
# 1862| v1862_13(void) = ReturnIndirection[p] : &:r1862_10, ~m?
# 1862| r1862_14(glval<void *>) = VariableAddress[#return] :
# 1862| v1862_15(void) = ReturnValue : &:r1862_14, ~m?
# 1862| v1862_16(void) = AliasedUse : ~m?
# 1862| v1862_17(void) = ExitFunction :
# 1868| void missing_declaration_entries::test1()
# 1868| Block 0
# 1868| v1868_1(void) = EnterFunction :
# 1868| mu1868_2(unknown) = AliasedDefinition :
# 1868| mu1868_3(unknown) = InitializeNonLocal :
# 1869| r1869_1(glval<Bar1<int>>) = VariableAddress[b] :
# 1869| mu1869_2(Bar1<int>) = Uninitialized[b] : &:r1869_1
# 1870| r1870_1(glval<Bar1<int>>) = VariableAddress[b] :
# 1870| r1870_2(glval<unknown>) = FunctionAddress[missing_type_decl_entry] :
# 1870| r1870_3(S *) = Constant[0] :
# 1870| r1870_4(void *) = Call[missing_type_decl_entry] : func:r1870_2, this:r1870_1, 0:r1870_3
# 1870| mu1870_5(unknown) = ^CallSideEffect : ~m?
# 1870| v1870_6(void) = ^IndirectReadSideEffect[-1] : &:r1870_1, ~m?
# 1870| v1870_7(void) = ^BufferReadSideEffect[0] : &:r1870_3, ~m?
# 1870| mu1870_8(Bar1<int>) = ^IndirectMayWriteSideEffect[-1] : &:r1870_1
# 1870| mu1870_9(unknown) = ^BufferMayWriteSideEffect[0] : &:r1870_3
# 1871| v1871_1(void) = NoOp :
# 1868| v1868_4(void) = ReturnVoid :
# 1868| v1868_5(void) = AliasedUse : ~m?
# 1868| v1868_6(void) = ExitFunction :
# 1875| int missing_declaration_entries::Bar2<int>::two_missing_variable_declaration_entries()
# 1875| Block 0
# 1875| v1875_1(void) = EnterFunction :
# 1875| mu1875_2(unknown) = AliasedDefinition :
# 1875| mu1875_3(unknown) = InitializeNonLocal :
# 1875| r1875_4(glval<unknown>) = VariableAddress[#this] :
# 1875| mu1875_5(glval<Bar2<int>>) = InitializeParameter[#this] : &:r1875_4
# 1875| r1875_6(glval<Bar2<int>>) = Load[#this] : &:r1875_4, ~m?
# 1875| mu1875_7(Bar2<int>) = InitializeIndirection[#this] : &:r1875_6
# 1876| r1876_1(glval<int[10]>) = VariableAddress[x] :
# 1876| mu1876_2(int[10]) = Uninitialized[x] : &:r1876_1
# 1876| r1876_3(glval<int[10]>) = VariableAddress[y] :
# 1876| mu1876_4(int[10]) = Uninitialized[y] : &:r1876_3
# 1877| r1877_1(int) = Constant[10] :
# 1877| r1877_2(glval<int[10]>) = VariableAddress[x] :
# 1877| r1877_3(int *) = Convert : r1877_2
# 1877| r1877_4(glval<int>) = CopyValue : r1877_3
# 1877| mu1877_5(int) = Store[?] : &:r1877_4, r1877_1
# 1878| r1878_1(int) = Constant[10] :
# 1878| r1878_2(glval<int[10]>) = VariableAddress[y] :
# 1878| r1878_3(int *) = Convert : r1878_2
# 1878| r1878_4(glval<int>) = CopyValue : r1878_3
# 1878| mu1878_5(int) = Store[?] : &:r1878_4, r1878_1
# 1879| r1879_1(glval<int>) = VariableAddress[#return] :
# 1879| r1879_2(glval<int[10]>) = VariableAddress[x] :
# 1879| r1879_3(int *) = Convert : r1879_2
# 1879| r1879_4(int) = Load[?] : &:r1879_3, ~m?
# 1879| r1879_5(glval<int[10]>) = VariableAddress[y] :
# 1879| r1879_6(int *) = Convert : r1879_5
# 1879| r1879_7(int) = Load[?] : &:r1879_6, ~m?
# 1879| r1879_8(int) = Add : r1879_4, r1879_7
# 1879| mu1879_9(int) = Store[#return] : &:r1879_1, r1879_8
# 1875| v1875_8(void) = ReturnIndirection[#this] : &:r1875_6, ~m?
# 1875| r1875_9(glval<int>) = VariableAddress[#return] :
# 1875| v1875_10(void) = ReturnValue : &:r1875_9, ~m?
# 1875| v1875_11(void) = AliasedUse : ~m?
# 1875| v1875_12(void) = ExitFunction :
# 1883| void missing_declaration_entries::test2()
# 1883| Block 0
# 1883| v1883_1(void) = EnterFunction :
# 1883| mu1883_2(unknown) = AliasedDefinition :
# 1883| mu1883_3(unknown) = InitializeNonLocal :
# 1884| r1884_1(glval<Bar2<int>>) = VariableAddress[b] :
# 1884| mu1884_2(Bar2<int>) = Uninitialized[b] : &:r1884_1
# 1885| r1885_1(glval<Bar2<int>>) = VariableAddress[b] :
# 1885| r1885_2(glval<unknown>) = FunctionAddress[two_missing_variable_declaration_entries] :
# 1885| r1885_3(int) = Call[two_missing_variable_declaration_entries] : func:r1885_2, this:r1885_1
# 1885| mu1885_4(unknown) = ^CallSideEffect : ~m?
# 1885| v1885_5(void) = ^IndirectReadSideEffect[-1] : &:r1885_1, ~m?
# 1885| mu1885_6(Bar2<int>) = ^IndirectMayWriteSideEffect[-1] : &:r1885_1
# 1886| v1886_1(void) = NoOp :
# 1883| v1883_4(void) = ReturnVoid :
# 1883| v1883_5(void) = AliasedUse : ~m?
# 1883| v1883_6(void) = ExitFunction :
perf-regression.cpp:
# 6| void Big::Big()
# 6| Block 0

View File

@@ -1598,17 +1598,17 @@ postWithInFlow
| constmemberaccess.cpp:9:2:9:2 | i [post update] | PostUpdateNode should not be the target of local flow. |
| constructorinitializer.cpp:8:4:8:4 | Argument this [post update] | PostUpdateNode should not be the target of local flow. |
| constructorinitializer.cpp:8:4:8:4 | VariableAddress [post update] | PostUpdateNode should not be the target of local flow. |
| cpp11.cpp:6:5:6:5 | VariableAddress [post update] | PostUpdateNode should not be the target of local flow. |
| cpp11.cpp:6:5:6:5 | VariableAddress [post update] | PostUpdateNode should not be the target of local flow. |
| cpp11.cpp:6:5:6:5 | VariableAddress [post update] | PostUpdateNode should not be the target of local flow. |
| cpp11.cpp:6:16:6:17 | VariableAddress [post update] | PostUpdateNode should not be the target of local flow. |
| cpp11.cpp:6:5:8:5 | VariableAddress [post update] | PostUpdateNode should not be the target of local flow. |
| cpp11.cpp:6:5:8:5 | VariableAddress [post update] | PostUpdateNode should not be the target of local flow. |
| cpp11.cpp:6:5:8:5 | VariableAddress [post update] | PostUpdateNode should not be the target of local flow. |
| cpp11.cpp:6:5:8:5 | VariableAddress [post update] | PostUpdateNode should not be the target of local flow. |
| cpp11.cpp:7:7:7:8 | (reference dereference) [post update] | PostUpdateNode should not be the target of local flow. |
| cpp11.cpp:7:7:7:8 | VariableAddress [post update] | PostUpdateNode should not be the target of local flow. |
| cpp11.cpp:7:7:7:8 | el [post update] | PostUpdateNode should not be the target of local flow. |
| cpp11.cpp:28:5:28:5 | VariableAddress [post update] | PostUpdateNode should not be the target of local flow. |
| cpp11.cpp:28:5:28:5 | VariableAddress [post update] | PostUpdateNode should not be the target of local flow. |
| cpp11.cpp:28:5:28:5 | VariableAddress [post update] | PostUpdateNode should not be the target of local flow. |
| cpp11.cpp:28:16:28:17 | VariableAddress [post update] | PostUpdateNode should not be the target of local flow. |
| cpp11.cpp:28:5:30:5 | VariableAddress [post update] | PostUpdateNode should not be the target of local flow. |
| cpp11.cpp:28:5:30:5 | VariableAddress [post update] | PostUpdateNode should not be the target of local flow. |
| cpp11.cpp:28:5:30:5 | VariableAddress [post update] | PostUpdateNode should not be the target of local flow. |
| cpp11.cpp:28:5:30:5 | VariableAddress [post update] | PostUpdateNode should not be the target of local flow. |
| cpp11.cpp:28:21:28:21 | (__begin) [post update] | PostUpdateNode should not be the target of local flow. |
| cpp11.cpp:28:21:28:21 | (__begin) [post update] | PostUpdateNode should not be the target of local flow. |
| cpp11.cpp:28:21:28:21 | (__begin) [post update] | PostUpdateNode should not be the target of local flow. |
@@ -2644,10 +2644,10 @@ postWithInFlow
| stmt_expr.cpp:27:5:27:7 | ptr [post update] | PostUpdateNode should not be the target of local flow. |
| stream_it.cpp:4:16:4:30 | VariableAddress [post update] | PostUpdateNode should not be the target of local flow. |
| stream_it.cpp:5:14:5:28 | VariableAddress [post update] | PostUpdateNode should not be the target of local flow. |
| stream_it.cpp:11:3:11:3 | VariableAddress [post update] | PostUpdateNode should not be the target of local flow. |
| stream_it.cpp:11:3:11:3 | VariableAddress [post update] | PostUpdateNode should not be the target of local flow. |
| stream_it.cpp:11:3:11:3 | VariableAddress [post update] | PostUpdateNode should not be the target of local flow. |
| stream_it.cpp:11:10:11:12 | VariableAddress [post update] | PostUpdateNode should not be the target of local flow. |
| stream_it.cpp:11:3:13:3 | VariableAddress [post update] | PostUpdateNode should not be the target of local flow. |
| stream_it.cpp:11:3:13:3 | VariableAddress [post update] | PostUpdateNode should not be the target of local flow. |
| stream_it.cpp:11:3:13:3 | VariableAddress [post update] | PostUpdateNode should not be the target of local flow. |
| stream_it.cpp:11:3:13:3 | VariableAddress [post update] | PostUpdateNode should not be the target of local flow. |
| stream_it.cpp:11:16:11:16 | (__range) [post update] | PostUpdateNode should not be the target of local flow. |
| stream_it.cpp:11:16:11:16 | (__range) [post update] | PostUpdateNode should not be the target of local flow. |
| stream_it.cpp:11:16:11:16 | (__range) [post update] | PostUpdateNode should not be the target of local flow. |