mirror of
https://github.com/github/codeql.git
synced 2025-12-16 16:53:25 +01:00
@@ -47,21 +47,16 @@ class SuppressionComment extends CppStyleComment {
|
||||
|
||||
/** Gets the scope of this suppression. */
|
||||
SuppressionScope getScope() {
|
||||
this = result.getSuppressionComment()
|
||||
result = this
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* The scope of an alert suppression comment.
|
||||
*/
|
||||
class SuppressionScope extends @comment {
|
||||
class SuppressionScope extends ElementBase {
|
||||
SuppressionScope() {
|
||||
mkElement(this) instanceof SuppressionComment
|
||||
}
|
||||
|
||||
/** Gets a suppression comment with this scope. */
|
||||
SuppressionComment getSuppressionComment() {
|
||||
result = mkElement(this)
|
||||
this instanceof SuppressionComment
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -72,12 +67,7 @@ class SuppressionScope extends @comment {
|
||||
* [LGTM locations](https://lgtm.com/help/ql/locations).
|
||||
*/
|
||||
predicate hasLocationInfo(string filepath, int startline, int startcolumn, int endline, int endcolumn) {
|
||||
mkElement(this).(SuppressionComment).covers(filepath, startline, startcolumn, endline, endcolumn)
|
||||
}
|
||||
|
||||
/** Gets a textual representation of this element. */
|
||||
string toString() {
|
||||
result = "suppression range"
|
||||
this.(SuppressionComment).covers(filepath, startline, startcolumn, endline, endcolumn)
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -46,40 +46,40 @@ predicate masterVde(VariableDeclarationEntry master, VariableDeclarationEntry vd
|
||||
exists(VariableDeclarationEntry previous | previousVde(previous, vde) and masterVde(master, previous))
|
||||
}
|
||||
|
||||
class VariableDeclarationGroup extends @var_decl {
|
||||
class VariableDeclarationGroup extends ElementBase {
|
||||
VariableDeclarationGroup() {
|
||||
not previousVde(_, mkElement(this))
|
||||
this instanceof VariableDeclarationEntry and
|
||||
not previousVde(_, this)
|
||||
}
|
||||
Class getClass() {
|
||||
vdeInfo(mkElement(this), result, _, _)
|
||||
vdeInfo(this, result, _, _)
|
||||
}
|
||||
|
||||
// pragma[noopt] since otherwise the two locationInfo relations get join-ordered
|
||||
// after each other
|
||||
pragma[noopt]
|
||||
predicate hasLocationInfo(string path, int startline, int startcol, int endline, int endcol) {
|
||||
exists(Element thisElement, VariableDeclarationEntry last, Location lstart, Location lend |
|
||||
thisElement = mkElement(this) and
|
||||
masterVde(thisElement, last) and
|
||||
exists(VariableDeclarationEntry last, Location lstart, Location lend |
|
||||
masterVde(this, last) and
|
||||
this instanceof VariableDeclarationGroup and
|
||||
not previousVde(last, _) and
|
||||
exists(VariableDeclarationEntry vde | vde=mkElement(this) and vde instanceof VariableDeclarationEntry and vde.getLocation() = lstart) and
|
||||
exists(VariableDeclarationEntry vde | vde=this and vde instanceof VariableDeclarationEntry and vde.getLocation() = lstart) and
|
||||
last.getLocation() = lend and
|
||||
lstart.hasLocationInfo(path, startline, startcol, _, _) and
|
||||
lend.hasLocationInfo(path, _, _, endline, endcol)
|
||||
)
|
||||
}
|
||||
|
||||
string toString() {
|
||||
if previousVde(mkElement(this), _) then
|
||||
string describeGroup() {
|
||||
if previousVde(this, _) then
|
||||
result = "group of "
|
||||
+ strictcount(string name
|
||||
| exists(VariableDeclarationEntry vde
|
||||
| masterVde(mkElement(this), vde) and
|
||||
| masterVde(this, vde) and
|
||||
name = vde.getName()))
|
||||
+ " fields here"
|
||||
else
|
||||
result = "declaration of " + mkElement(this).(VariableDeclarationEntry).getVariable().getName()
|
||||
result = "declaration of " + this.(VariableDeclarationEntry).getVariable().getName()
|
||||
}
|
||||
}
|
||||
|
||||
@@ -111,4 +111,4 @@ where n = strictcount(string fieldName
|
||||
c = vdg.getClass() and
|
||||
if c.hasOneVariableGroup() then suffix = "" else suffix = " - see $@"
|
||||
select c, kindstr(c) + " " + c.getName() + " has " + n + " fields, which is too many" + suffix + ".",
|
||||
vdg, vdg.toString()
|
||||
vdg, vdg.describeGroup()
|
||||
|
||||
@@ -77,11 +77,6 @@ class PythonClass extends Variable, CObject {
|
||||
/* This needs to be kept in sync with extractor-python/semmle/passes/type.py */
|
||||
result = "C_type$" + this.getTpName()
|
||||
}
|
||||
|
||||
/** Gets a textual representation of this element. */
|
||||
override string toString() {
|
||||
result = Variable.super.toString()
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -518,12 +513,6 @@ class PythonExtensionFunction extends Function {
|
||||
}
|
||||
|
||||
class TypedPythonExtensionProperty extends PythonGetSetTableEntry, CObject {
|
||||
|
||||
override
|
||||
string toString() {
|
||||
result = PythonGetSetTableEntry.super.toString()
|
||||
}
|
||||
|
||||
PythonClass getPropertyType() {
|
||||
result = py_return_type(this.getGetter())
|
||||
}
|
||||
|
||||
@@ -98,7 +98,7 @@ predicate flowsToDefImpl(
|
||||
or
|
||||
// `x++`
|
||||
exists (CrementOperation crem
|
||||
| mkElement(def) = crem and
|
||||
| def = crem and
|
||||
crem.getOperand() = v.getAnAccess() and
|
||||
flowsToExpr(source, crem.getOperand(), pathMightOverflow))
|
||||
or
|
||||
|
||||
@@ -27,7 +27,7 @@ predicate tryLockCondition(VariableAccess access,
|
||||
(cond = call.getParent*() and
|
||||
cond.isCondition() and
|
||||
failNode = cond.getASuccessor() and
|
||||
unresolveElement(failNode) instanceof BasicBlockWithReturn))
|
||||
failNode instanceof BasicBlockWithReturn))
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -29,7 +29,7 @@ predicate failedLock(MutexType t, BasicBlock lockblock, BasicBlock failblock) {
|
||||
exists (ControlFlowNode lock |
|
||||
lock = lockblock.getEnd() and
|
||||
lock = t.getLockAccess() and
|
||||
lock.getAFalseSuccessor() = mkElement(failblock)
|
||||
lock.getAFalseSuccessor() = failblock
|
||||
)
|
||||
}
|
||||
|
||||
|
||||
@@ -309,7 +309,7 @@ abstract class AccessHolder extends Declaration {
|
||||
isDirectPublicBaseOf*(base, derived)
|
||||
or
|
||||
exists(DirectAccessHolder n |
|
||||
this.getEnclosingAccessHolder*() = mkElement(n) and
|
||||
this.getEnclosingAccessHolder*() = n and
|
||||
// Derivations using (4.2) or (4.3) at least once.
|
||||
n.thisCanAccessClassTrans(base, derived)
|
||||
)
|
||||
@@ -379,7 +379,7 @@ abstract class AccessHolder extends Declaration {
|
||||
everyoneCouldAccessMember(memberClass, memberAccess, derived)
|
||||
or
|
||||
exists(DirectAccessHolder n |
|
||||
this.getEnclosingAccessHolder*() = mkElement(n) and
|
||||
this.getEnclosingAccessHolder*() = n and
|
||||
// Any other derivation.
|
||||
n.thisCouldAccessMember(memberClass, memberAccess, derived)
|
||||
)
|
||||
@@ -396,11 +396,11 @@ abstract class AccessHolder extends Declaration {
|
||||
* `DirectAccessHolder`s. If a `DirectAccessHolder` contains an `AccessHolder`,
|
||||
* then the contained `AccessHolder` inherits its access rights.
|
||||
*/
|
||||
private class DirectAccessHolder extends @declaration {
|
||||
private class DirectAccessHolder extends Element {
|
||||
DirectAccessHolder() {
|
||||
mkElement(this) instanceof Class
|
||||
this instanceof Class
|
||||
or
|
||||
exists(FriendDecl fd | fd.getFriend() = mkElement(this))
|
||||
exists(FriendDecl fd | fd.getFriend() = this)
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -486,7 +486,7 @@ private class DirectAccessHolder extends @declaration {
|
||||
)
|
||||
or
|
||||
// Rule (5.4) followed by Rule (5.2)
|
||||
exists(Class between | mkElement(this).(AccessHolder).canAccessClass(between, derived) |
|
||||
exists(Class between | this.(AccessHolder).canAccessClass(between, derived) |
|
||||
between.accessOfBaseMember(memberClass, memberAccess)
|
||||
.hasName("private") and
|
||||
this.isFriendOfOrEqualTo(between)
|
||||
@@ -539,12 +539,10 @@ private class DirectAccessHolder extends @declaration {
|
||||
}
|
||||
|
||||
private predicate isFriendOfOrEqualTo(Class c) {
|
||||
exists(FriendDecl fd | fd.getDeclaringClass() = c | mkElement(this) = fd.getFriend())
|
||||
exists(FriendDecl fd | fd.getDeclaringClass() = c | this = fd.getFriend())
|
||||
or
|
||||
mkElement(this) = c
|
||||
this = c
|
||||
}
|
||||
|
||||
string toString() { result = mkElement(this).(Declaration).toString() }
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -46,17 +46,26 @@ Element mkElement(@element e) {
|
||||
}
|
||||
|
||||
/**
|
||||
* A C/C++ element. This class is the base class for all C/C++
|
||||
* elements, such as functions, classes, expressions, and so on.
|
||||
* A C/C++ element with no member predicates other than `toString`. Not for
|
||||
* general use. This class does not define a location, so classes wanting to
|
||||
* change their location without affecting other classes can extend
|
||||
* `ElementBase` instead of `Element` to create a new rootdef for `getURL`,
|
||||
* `getLocation`, or `hasLocationInfo`.
|
||||
*/
|
||||
class Element extends @element {
|
||||
Element() {
|
||||
class ElementBase extends @element {
|
||||
ElementBase() {
|
||||
this = resolveElement(_)
|
||||
}
|
||||
|
||||
/** Gets a textual representation of this element. */
|
||||
string toString() { none() }
|
||||
}
|
||||
|
||||
/**
|
||||
* A C/C++ element. This class is the base class for all C/C++
|
||||
* elements, such as functions, classes, expressions, and so on.
|
||||
*/
|
||||
class Element extends ElementBase {
|
||||
/** Gets the primary file where this element occurs. */
|
||||
File getFile() { result = this.getLocation().getFile() }
|
||||
|
||||
|
||||
@@ -60,7 +60,7 @@ private cached module Cached {
|
||||
private predicate non_primitive_basic_block_entry_node(ControlFlowNode node) {
|
||||
not primitive_basic_block_entry_node(node) and
|
||||
not exists(node.getAPredecessor()) and
|
||||
successors_extended(unresolveElement(node), _)
|
||||
successors_extended(node, _)
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -80,7 +80,7 @@ private cached module Cached {
|
||||
* reuse predicates already computed for `PrimitiveBasicBlocks`.
|
||||
*/
|
||||
private predicate equalsPrimitiveBasicBlock(BasicBlock bb) {
|
||||
primitive_basic_block_entry_node(mkElement(bb))
|
||||
primitive_basic_block_entry_node(bb)
|
||||
and
|
||||
not exists(int i |
|
||||
i > 0 and
|
||||
@@ -96,11 +96,11 @@ private cached module Cached {
|
||||
}
|
||||
|
||||
private predicate non_primitive_basic_block_member(ControlFlowNode node, BasicBlock bb, int pos) {
|
||||
(not equalsPrimitiveBasicBlock(bb) and node = mkElement(bb) and pos = 0)
|
||||
(not equalsPrimitiveBasicBlock(bb) and node = bb and pos = 0)
|
||||
or
|
||||
(not (unresolveElement(node) instanceof BasicBlock) and
|
||||
(not (node instanceof BasicBlock) and
|
||||
exists (ControlFlowNode pred
|
||||
| successors_extended(unresolveElement(pred),unresolveElement(node))
|
||||
| successors_extended(pred, node)
|
||||
| non_primitive_basic_block_member(pred, bb, pos - 1)))
|
||||
}
|
||||
|
||||
@@ -117,7 +117,7 @@ private cached module Cached {
|
||||
predicate bb_successor_cached(BasicBlock pred, BasicBlock succ) {
|
||||
exists(ControlFlowNode last |
|
||||
basic_block_member(last, pred, bb_length(pred)-1) and
|
||||
last.getASuccessor() = mkElement(succ)
|
||||
last.getASuccessor() = succ
|
||||
)
|
||||
}
|
||||
}
|
||||
@@ -143,15 +143,10 @@ predicate bb_successor = bb_successor_cached/2;
|
||||
* A - B < C - D AB is a basic block and CD is a basic block (B has two outgoing edges)
|
||||
* ```
|
||||
*/
|
||||
class BasicBlock extends @cfgnode {
|
||||
class BasicBlock extends ControlFlowNodeBase {
|
||||
|
||||
BasicBlock() {
|
||||
basic_block_entry_node(mkElement(this))
|
||||
}
|
||||
|
||||
/** Gets a textual representation of this element. */
|
||||
string toString() {
|
||||
result = "BasicBlock"
|
||||
basic_block_entry_node(this)
|
||||
}
|
||||
|
||||
predicate contains(ControlFlowNode node) {
|
||||
@@ -187,7 +182,7 @@ class BasicBlock extends @cfgnode {
|
||||
}
|
||||
|
||||
ControlFlowNode getStart() {
|
||||
result = mkElement(this)
|
||||
result = this
|
||||
}
|
||||
|
||||
/** Gets the number of `ControlFlowNode`s in this basic block. */
|
||||
@@ -248,9 +243,9 @@ class BasicBlock extends @cfgnode {
|
||||
* point or a `catch` clause of a reachable `try` statement.
|
||||
*/
|
||||
predicate isReachable() {
|
||||
exists(Function f | f.getBlock() = mkElement(this))
|
||||
exists(Function f | f.getBlock() = this)
|
||||
or
|
||||
exists(TryStmt t, BasicBlock tryblock | mkElement(this) = t.getACatchClause() and tryblock.isReachable() and tryblock.contains(t))
|
||||
exists(TryStmt t, BasicBlock tryblock | this = t.getACatchClause() and tryblock.isReachable() and tryblock.contains(t))
|
||||
or
|
||||
exists(BasicBlock pred | pred.getASuccessor() = this and pred.isReachable())
|
||||
}
|
||||
@@ -272,7 +267,7 @@ predicate unreachable(ControlFlowNode n) {
|
||||
*/
|
||||
class EntryBasicBlock extends BasicBlock {
|
||||
EntryBasicBlock() {
|
||||
exists (Function f | mkElement(this) = f.getEntryPoint())
|
||||
exists (Function f | this = f.getEntryPoint())
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -27,17 +27,20 @@ private import semmle.code.cpp.controlflow.internal.ConstantExprs
|
||||
* function, or to the exit point of the function if there is no such
|
||||
* `Handler`. There are no edges from function calls to `Handler`s.
|
||||
*/
|
||||
class ControlFlowNode extends Locatable, @cfgnode {
|
||||
|
||||
ControlFlowNode getASuccessor() { successors_adapted(underlyingElement(this),unresolveElement(result)) }
|
||||
class ControlFlowNode extends Locatable, ControlFlowNodeBase {
|
||||
ControlFlowNode getASuccessor() { successors_adapted(this, result) }
|
||||
|
||||
ControlFlowNode getAPredecessor() { this = result.getASuccessor() }
|
||||
|
||||
/** Gets the function containing this control-flow node. */
|
||||
abstract Function getControlFlowScope();
|
||||
Function getControlFlowScope() {
|
||||
none() // overridden in subclasses
|
||||
}
|
||||
|
||||
/** Gets the smallest statement containing this control-flow node. */
|
||||
abstract Stmt getEnclosingStmt();
|
||||
Stmt getEnclosingStmt() {
|
||||
none() // overridden in subclasses
|
||||
}
|
||||
|
||||
/**
|
||||
* Holds if this node is the top-level expression of a conditional statement,
|
||||
@@ -54,7 +57,8 @@ class ControlFlowNode extends Locatable, @cfgnode {
|
||||
* taken when this expression is true.
|
||||
*/
|
||||
ControlFlowNode getATrueSuccessor() {
|
||||
truecond(underlyingElement(this),unresolveElement(result)) and result = getASuccessor()
|
||||
truecond_base(this, result) and
|
||||
result = getASuccessor()
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -62,7 +66,8 @@ class ControlFlowNode extends Locatable, @cfgnode {
|
||||
* taken when this expression is false.
|
||||
*/
|
||||
ControlFlowNode getAFalseSuccessor() {
|
||||
falsecond(underlyingElement(this),unresolveElement(result)) and result = getASuccessor()
|
||||
falsecond_base(this,result) and
|
||||
result = getASuccessor()
|
||||
}
|
||||
|
||||
BasicBlock getBasicBlock() {
|
||||
@@ -86,7 +91,7 @@ private cached module Cached {
|
||||
exists(Function f | f.getEntryPoint() = n)
|
||||
or
|
||||
// Okay to use successors_extended directly here
|
||||
(not successors_extended(_,unresolveElement(n)) and not successors_extended(unresolveElement(n),_))
|
||||
(not successors_extended(_,n) and not successors_extended(n,_))
|
||||
or
|
||||
reachable(n.getAPredecessor())
|
||||
or
|
||||
@@ -138,6 +143,25 @@ private predicate loopConditionAlwaysUponEntry(ControlFlowNode loop, Expr condit
|
||||
)
|
||||
}
|
||||
|
||||
/**
|
||||
* An element that is convertible to `ControlFlowNode`. This class is similar
|
||||
* to `ControlFlowNode` except that is has no member predicates apart from
|
||||
* `toString`.
|
||||
*
|
||||
* This class can be used as base class for classes that want to inherit the
|
||||
* extent of `ControlFlowNode` without inheriting its public member predicates.
|
||||
*/
|
||||
class ControlFlowNodeBase extends ElementBase, @cfgnode {
|
||||
}
|
||||
|
||||
predicate truecond_base(ControlFlowNodeBase n1, ControlFlowNodeBase n2) {
|
||||
truecond(unresolveElement(n1), unresolveElement(n2))
|
||||
}
|
||||
|
||||
predicate falsecond_base(ControlFlowNodeBase n1, ControlFlowNodeBase n2) {
|
||||
falsecond(unresolveElement(n1), unresolveElement(n2))
|
||||
}
|
||||
|
||||
/**
|
||||
* An abstract class that can be extended to add additional edges to the
|
||||
* control-flow graph. Instances of this class correspond to the source nodes
|
||||
@@ -154,11 +178,9 @@ private predicate loopConditionAlwaysUponEntry(ControlFlowNode loop, Expr condit
|
||||
* appear to be unreachable. See the documentation on `ControlFlowNode` for
|
||||
* more information about the control-flow graph.
|
||||
*/
|
||||
abstract class AdditionalControlFlowEdge extends @cfgnode {
|
||||
abstract class AdditionalControlFlowEdge extends ControlFlowNodeBase {
|
||||
/** Gets a target node of this edge, where the source node is `this`. */
|
||||
abstract ControlFlowNode getAnEdgeTarget();
|
||||
|
||||
string toString() { result = mkElement(this).(ControlFlowNode).toString() }
|
||||
abstract ControlFlowNodeBase getAnEdgeTarget();
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -166,8 +188,9 @@ abstract class AdditionalControlFlowEdge extends @cfgnode {
|
||||
* the extractor-generated control-flow graph or in a subclass of
|
||||
* `AdditionalControlFlowEdge`. Use this relation instead of `successors`.
|
||||
*/
|
||||
predicate successors_extended(@cfgnode source, @cfgnode target) {
|
||||
successors(source, target)
|
||||
predicate successors_extended(
|
||||
ControlFlowNodeBase source, ControlFlowNodeBase target) {
|
||||
successors(unresolveElement(source), unresolveElement(target))
|
||||
or
|
||||
source.(AdditionalControlFlowEdge).getAnEdgeTarget() = mkElement(target)
|
||||
source.(AdditionalControlFlowEdge).getAnEdgeTarget() = target
|
||||
}
|
||||
|
||||
@@ -11,9 +11,9 @@ private import semmle.code.cpp.dataflow.EscapesTree
|
||||
*/
|
||||
predicate definitionUsePair(SemanticStackVariable var, Expr def, Expr use) {
|
||||
exists(Use u |
|
||||
mkElement(u) = use
|
||||
u = use
|
||||
and
|
||||
unresolveElement(def).(Def).reaches(true, var, u)
|
||||
def.(Def).reaches(true, var, u)
|
||||
and
|
||||
u.getVariable(false) = var
|
||||
)
|
||||
@@ -24,7 +24,7 @@ predicate definitionUsePair(SemanticStackVariable var, Expr def, Expr use) {
|
||||
* is a definition or use, without crossing definitions of the same variable.
|
||||
*/
|
||||
predicate definitionReaches(Expr def, Expr node) {
|
||||
unresolveElement(def).(Def).reaches(true, _, (DefOrUse)unresolveElement(node))
|
||||
def.(Def).reaches(true, _, (DefOrUse)node)
|
||||
}
|
||||
|
||||
private predicate hasAddressOfAccess(SemanticStackVariable var) {
|
||||
@@ -61,9 +61,9 @@ predicate useUsePair(SemanticStackVariable var, Expr first, Expr second) {
|
||||
not definition(var, first)
|
||||
and
|
||||
exists(Use u |
|
||||
mkElement(u) = second
|
||||
u = second
|
||||
and
|
||||
unresolveElement(first).(Use).reaches(false, var, u)
|
||||
first.(Use).reaches(false, var, u)
|
||||
and
|
||||
u.getVariable(false) = var
|
||||
)
|
||||
@@ -76,19 +76,19 @@ predicate useUsePair(SemanticStackVariable var, Expr first, Expr second) {
|
||||
predicate parameterUsePair(Parameter p, VariableAccess va) {
|
||||
not parameterIsOverwritten(_, p) and va.getTarget() = p
|
||||
or
|
||||
exists(ParameterDef pd | pd.reaches(true, p, (Use)unresolveElement(va)))
|
||||
exists(ParameterDef pd | pd.reaches(true, p, (Use)va))
|
||||
}
|
||||
|
||||
/**
|
||||
* Utility class: A definition or use of a stack variable.
|
||||
*/
|
||||
library
|
||||
class DefOrUse extends @cfgnode {
|
||||
class DefOrUse extends ControlFlowNodeBase {
|
||||
DefOrUse() {
|
||||
// Uninstantiated templates are purely syntax, and only on instantiation
|
||||
// will they be complete with information about types, conversions, call
|
||||
// targets, etc.
|
||||
not mkElement(this).isFromUninstantiatedTemplate(_)
|
||||
not this.(ControlFlowNode).isFromUninstantiatedTemplate(_)
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -104,7 +104,7 @@ class DefOrUse extends @cfgnode {
|
||||
pragma[noinline]
|
||||
private predicate reaches_helper(boolean isDef, SemanticStackVariable v, BasicBlock bb, int i) {
|
||||
getVariable(isDef) = v and
|
||||
bb.getNode(i) = mkElement(this)
|
||||
bb.getNode(i) = this
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -140,24 +140,21 @@ class DefOrUse extends @cfgnode {
|
||||
exists(BasicBlock bb, int i |
|
||||
getVariable(isDef) = v
|
||||
and
|
||||
bb.getNode(i) = mkElement(this)
|
||||
bb.getNode(i) = this
|
||||
and
|
||||
j = min(int k | bbBarrierAt(bb, k, v, _) and k > i)
|
||||
)
|
||||
}
|
||||
|
||||
/** Gets a textual representation of this element. */
|
||||
string toString() { result = "DefOrUse" }
|
||||
}
|
||||
|
||||
library
|
||||
class Def extends DefOrUse {
|
||||
Def() {
|
||||
definition(_, mkElement(this))
|
||||
definition(_, this)
|
||||
}
|
||||
|
||||
override SemanticStackVariable getVariable(boolean isDef) {
|
||||
definition(result, mkElement(this)) and isDef = true
|
||||
definition(result, this) and isDef = true
|
||||
}
|
||||
}
|
||||
|
||||
@@ -172,11 +169,11 @@ class ParameterDef extends DefOrUse {
|
||||
ParameterDef() {
|
||||
// Optimization: parameters that are not overwritten do not require
|
||||
// reachability analysis
|
||||
exists(Function f | parameterIsOverwritten(f, _) | mkElement(this) = f.getEntryPoint())
|
||||
exists(Function f | parameterIsOverwritten(f, _) | this = f.getEntryPoint())
|
||||
}
|
||||
|
||||
override SemanticStackVariable getVariable(boolean isDef) {
|
||||
exists(Function f | parameterIsOverwritten(f, result) | mkElement(this) = f.getEntryPoint())
|
||||
exists(Function f | parameterIsOverwritten(f, result) | this = f.getEntryPoint())
|
||||
and
|
||||
isDef = true
|
||||
}
|
||||
@@ -185,22 +182,22 @@ class ParameterDef extends DefOrUse {
|
||||
library
|
||||
class Use extends DefOrUse {
|
||||
Use() {
|
||||
useOfVar(_, mkElement(this))
|
||||
useOfVar(_, this)
|
||||
}
|
||||
|
||||
override SemanticStackVariable getVariable(boolean isDef) {
|
||||
useOfVar(result, mkElement(this)) and isDef = false
|
||||
useOfVar(result, this) and isDef = false
|
||||
}
|
||||
}
|
||||
|
||||
private predicate bbUseAt(BasicBlock bb, int i, SemanticStackVariable v, Use use) {
|
||||
bb.getNode(i) = mkElement(use)
|
||||
bb.getNode(i) = use
|
||||
and
|
||||
use.getVariable(false) = v
|
||||
}
|
||||
|
||||
private predicate bbDefAt(BasicBlock bb, int i, SemanticStackVariable v, Def def) {
|
||||
bb.getNode(i) = mkElement(def)
|
||||
bb.getNode(i) = def
|
||||
and
|
||||
def.getVariable(true) = v
|
||||
}
|
||||
@@ -403,8 +400,8 @@ predicate useOfVarActual(SemanticStackVariable v, VariableAccess use) {
|
||||
private predicate excludeReachesFunction(Function f) {
|
||||
exists(int defOrUses |
|
||||
defOrUses =
|
||||
count(Def def | mkElement(def).(ControlFlowNode).getControlFlowScope() = f) +
|
||||
count(Use use | mkElement(use).(ControlFlowNode).getControlFlowScope() = f) and
|
||||
count(Def def | def.(ControlFlowNode).getControlFlowScope() = f) +
|
||||
count(Use use | use.(ControlFlowNode).getControlFlowScope() = f) and
|
||||
defOrUses >= 13000
|
||||
)
|
||||
}
|
||||
|
||||
@@ -28,11 +28,6 @@ predicate functionEntry(ControlFlowNode entry) {
|
||||
and not hasMultiScopeNode(function))
|
||||
}
|
||||
|
||||
/** Holds if `entry` is the entry point of a function. */
|
||||
predicate functionEntryBB(@cfgnode entry) {
|
||||
functionEntry(mkElement(entry))
|
||||
}
|
||||
|
||||
/**
|
||||
* Holds if `dest` is an immediate successor of `src` in the control-flow graph.
|
||||
*/
|
||||
@@ -70,7 +65,7 @@ predicate dominates(ControlFlowNode dominator, ControlFlowNode node) {
|
||||
* Holds if `dominator` is an immediate dominator of `node` in the control-flow
|
||||
* graph of basic blocks.
|
||||
*/
|
||||
predicate bbIDominates(BasicBlock dom, BasicBlock node) = idominance(functionEntryBB/1, bb_successor/2)(_, dom, node)
|
||||
predicate bbIDominates(BasicBlock dom, BasicBlock node) = idominance(functionEntry/1, bb_successor/2)(_, dom, node)
|
||||
|
||||
/**
|
||||
* Holds if `dominator` is a strict dominator of `node` in the control-flow
|
||||
|
||||
@@ -93,12 +93,12 @@ class GuardCondition extends Expr {
|
||||
exists(BasicBlock thisblock
|
||||
| thisblock.contains(this)
|
||||
| exists(BasicBlock succ
|
||||
| testIsTrue = true and mkElement(succ) = this.getATrueSuccessor() or
|
||||
testIsTrue = false and mkElement(succ) = this.getAFalseSuccessor()
|
||||
| testIsTrue = true and succ = this.getATrueSuccessor() or
|
||||
testIsTrue = false and succ = this.getAFalseSuccessor()
|
||||
| bbDominates(succ, controlled) and
|
||||
forall(BasicBlock pred
|
||||
| pred.getASuccessor() = succ
|
||||
| pred = thisblock or bbDominates(succ, pred) or not reachable(mkElement(pred)))))
|
||||
| pred = thisblock or bbDominates(succ, pred) or not reachable(pred))))
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -18,10 +18,10 @@ library class StandardSSA extends SSAHelper {
|
||||
* from analysis. `SsaDefinition`s are not generated in locations that are
|
||||
* statically seen to be unreachable.
|
||||
*/
|
||||
class SsaDefinition extends @cfgnode {
|
||||
class SsaDefinition extends ControlFlowNodeBase {
|
||||
|
||||
SsaDefinition() {
|
||||
exists(StandardSSA x | x.ssa_defn(_, (ControlFlowNode)mkElement(this), _, _))
|
||||
exists(StandardSSA x | x.ssa_defn(_, this, _, _))
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -29,12 +29,7 @@ class SsaDefinition extends @cfgnode {
|
||||
* this definition.
|
||||
*/
|
||||
LocalScopeVariable getAVariable() {
|
||||
exists(StandardSSA x | x.ssa_defn(result, (ControlFlowNode)mkElement(this), _, _))
|
||||
}
|
||||
|
||||
/** Gets a textual representation of this element. */
|
||||
string toString() {
|
||||
result = "SSA definition"
|
||||
exists(StandardSSA x | x.ssa_defn(result, this, _, _))
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -42,12 +37,12 @@ class SsaDefinition extends @cfgnode {
|
||||
* (this, v).
|
||||
*/
|
||||
string toString(LocalScopeVariable v) {
|
||||
exists(StandardSSA x | result = x.toString((ControlFlowNode)mkElement(this), v))
|
||||
exists(StandardSSA x | result = x.toString(this, v))
|
||||
}
|
||||
|
||||
/** Gets a use of the SSA variable represented by the pair (this, v). */
|
||||
VariableAccess getAUse(LocalScopeVariable v) {
|
||||
exists(StandardSSA x | result = x.getAUse((ControlFlowNode)mkElement(this), v))
|
||||
exists(StandardSSA x | result = x.getAUse(this, v))
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -63,7 +58,7 @@ class SsaDefinition extends @cfgnode {
|
||||
* the node where control flow is joined from multiple paths.
|
||||
*/
|
||||
ControlFlowNode getDefinition() {
|
||||
result = mkElement(this)
|
||||
result = this
|
||||
}
|
||||
|
||||
BasicBlock getBasicBlock() {
|
||||
@@ -76,12 +71,12 @@ class SsaDefinition extends @cfgnode {
|
||||
}
|
||||
|
||||
Location getLocation() {
|
||||
result = mkElement(this).(ControlFlowNode).getLocation()
|
||||
result = this.(ControlFlowNode).getLocation()
|
||||
}
|
||||
|
||||
/** Holds if the SSA variable `(this, p)` is defined by parameter `p`. */
|
||||
predicate definedByParameter(Parameter p) {
|
||||
mkElement(this) = p.getFunction().getEntryPoint()
|
||||
this = p.getFunction().getEntryPoint()
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -133,7 +128,7 @@ class SsaDefinition extends @cfgnode {
|
||||
|
||||
/** Holds if `(this, v)` reaches the end of basic block `b`. */
|
||||
predicate reachesEndOfBB(LocalScopeVariable v, BasicBlock b) {
|
||||
exists(StandardSSA x | x.ssaDefinitionReachesEndOfBB(v, (ControlFlowNode)mkElement(this), b))
|
||||
exists(StandardSSA x | x.ssaDefinitionReachesEndOfBB(v, this, b))
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -29,7 +29,7 @@ predicate var_definition(LocalScopeVariable v, ControlFlowNode node) {
|
||||
else definition(v, node))
|
||||
or
|
||||
v instanceof Parameter and exists(BasicBlock b | b.getStart() = node and not exists(b.getAPredecessor()) and
|
||||
mkElement(b) = v.(Parameter).getFunction().getEntryPoint())
|
||||
b = v.(Parameter).getFunction().getEntryPoint())
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -251,7 +251,7 @@ cached library class SSAHelper extends int {
|
||||
* `(node, v)`.
|
||||
*/
|
||||
cached string toString(ControlFlowNode node, LocalScopeVariable v) {
|
||||
if phi_node(v, (BasicBlock)unresolveElement(node)) then
|
||||
if phi_node(v, (BasicBlock)node) then
|
||||
result = "SSA phi(" + v.getName() + ")"
|
||||
else
|
||||
(ssa_defn(v, node, _, _) and result = "SSA def(" + v.getName() + ")")
|
||||
|
||||
@@ -17,14 +17,13 @@ import cpp
|
||||
* split in more places than either library expects, but nothing should break
|
||||
* as a direct result of that.
|
||||
*/
|
||||
abstract class SubBasicBlockCutNode extends @cfgnode {
|
||||
abstract class SubBasicBlockCutNode extends ControlFlowNode {
|
||||
SubBasicBlockCutNode() {
|
||||
// Some control-flow nodes are not in any basic block. This includes
|
||||
// `Conversion`s, expressions that are evaluated at compile time, default
|
||||
// arguments, and `Function`s without implementation.
|
||||
exists(mkElement(this).(ControlFlowNode).getBasicBlock())
|
||||
exists(this.getBasicBlock())
|
||||
}
|
||||
string toString() { result = "SubBasicBlockCutNode" }
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -36,7 +35,7 @@ abstract class SubBasicBlockCutNode extends @cfgnode {
|
||||
* therefore extend `SubBasicBlockCutNode` to direct where basic blocks will be
|
||||
* split up.
|
||||
*/
|
||||
class SubBasicBlock extends @cfgnode {
|
||||
class SubBasicBlock extends ControlFlowNodeBase {
|
||||
SubBasicBlock() {
|
||||
this instanceof BasicBlock
|
||||
or
|
||||
@@ -45,7 +44,7 @@ class SubBasicBlock extends @cfgnode {
|
||||
|
||||
/** Gets the basic block in which this `SubBasicBlock` is contained. */
|
||||
BasicBlock getBasicBlock() {
|
||||
result = mkElement(this).(ControlFlowNode).getBasicBlock()
|
||||
result = this.(ControlFlowNode).getBasicBlock()
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -73,9 +72,9 @@ class SubBasicBlock extends @cfgnode {
|
||||
*/
|
||||
int getPosInBasicBlock(BasicBlock bb) {
|
||||
exists(int nodePos, int rnk |
|
||||
bb = mkElement(this).(ControlFlowNode).getBasicBlock() and
|
||||
mkElement(this) = bb.getNode(nodePos) and
|
||||
nodePos = rank[rnk](int i | exists(SubBasicBlock n | mkElement(n) = bb.getNode(i))) and
|
||||
bb = this.(ControlFlowNode).getBasicBlock() and
|
||||
this = bb.getNode(nodePos) and
|
||||
nodePos = rank[rnk](int i | exists(SubBasicBlock n | n = bb.getNode(i))) and
|
||||
result = rnk - 1
|
||||
)
|
||||
}
|
||||
@@ -97,7 +96,7 @@ class SubBasicBlock extends @cfgnode {
|
||||
*/
|
||||
ControlFlowNode getNode(int pos) {
|
||||
exists(BasicBlock bb | bb = this.getBasicBlock() |
|
||||
exists(int thisPos | mkElement(this) = bb.getNode(thisPos) |
|
||||
exists(int thisPos | this = bb.getNode(thisPos) |
|
||||
result = bb.getNode(thisPos + pos) and
|
||||
pos >= 0 and
|
||||
pos < this.getNumberOfNodes()
|
||||
@@ -120,8 +119,6 @@ class SubBasicBlock extends @cfgnode {
|
||||
result.getASuccessor() = this
|
||||
}
|
||||
|
||||
string toString() { result = "SubBasicBlock" }
|
||||
|
||||
/**
|
||||
* Gets a node such that the control-flow edge `(this, result)` may be taken
|
||||
* when the final node of this `SubBasicBlock` is a conditional expression
|
||||
@@ -148,13 +145,13 @@ class SubBasicBlock extends @cfgnode {
|
||||
*/
|
||||
int getNumberOfNodes() {
|
||||
exists(BasicBlock bb | bb = this.getBasicBlock() |
|
||||
exists(int thisPos | mkElement(this) = bb.getNode(thisPos) |
|
||||
exists(int thisPos | this = bb.getNode(thisPos) |
|
||||
this.lastInBB() and
|
||||
result = bb.length() - thisPos
|
||||
or
|
||||
exists(SubBasicBlock succ, int succPos |
|
||||
succ.getPosInBasicBlock(bb) = this.getPosInBasicBlock(bb) + 1 and
|
||||
bb.getNode(succPos) = mkElement(succ) and
|
||||
bb.getNode(succPos) = succ and
|
||||
result = succPos - thisPos
|
||||
)
|
||||
)
|
||||
@@ -168,7 +165,7 @@ class SubBasicBlock extends @cfgnode {
|
||||
|
||||
/** Gets the first control-flow node in this `SubBasicBlock`. */
|
||||
ControlFlowNode getStart() {
|
||||
result = mkElement(this)
|
||||
result = this
|
||||
}
|
||||
|
||||
pragma[noinline]
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
import cpp
|
||||
private import PrimitiveBasicBlocks
|
||||
private class Node = ControlFlowNodeBase;
|
||||
|
||||
/** A call to a function known not to return. */
|
||||
predicate aborting(FunctionCall c) {
|
||||
@@ -61,19 +62,19 @@ private predicate nonAnalyzableFunction(Function f) {
|
||||
/**
|
||||
* If a condition is provably true, then control-flow edges to its false successors are impossible.
|
||||
*/
|
||||
private predicate impossibleFalseEdge(Expr condition, @cfgnode succ) {
|
||||
private predicate impossibleFalseEdge(Expr condition, Node succ) {
|
||||
conditionAlwaysTrue(condition)
|
||||
and falsecond(unresolveElement(condition),succ)
|
||||
and not truecond(unresolveElement(condition),succ)
|
||||
and falsecond_base(condition,succ)
|
||||
and not truecond_base(condition,succ)
|
||||
}
|
||||
|
||||
/**
|
||||
* If a condition is provably false, then control-flow edges to its true successors are impossible.
|
||||
*/
|
||||
private predicate impossibleTrueEdge(Expr condition, @cfgnode succ) {
|
||||
private predicate impossibleTrueEdge(Expr condition, Node succ) {
|
||||
conditionAlwaysFalse(condition)
|
||||
and truecond(unresolveElement(condition),succ)
|
||||
and not falsecond(unresolveElement(condition),succ)
|
||||
and truecond_base(condition,succ)
|
||||
and not falsecond_base(condition,succ)
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -91,9 +92,9 @@ private int switchCaseRangeEnd(SwitchCase sc) {
|
||||
* body `switchBlock`. There may be several such expressions: for example, if
|
||||
* the condition is `(x ? y : z)` then the result is {`y`, `z`}.
|
||||
*/
|
||||
private @cfgnode getASwitchExpr(SwitchStmt switch, Block switchBlock) {
|
||||
private Node getASwitchExpr(SwitchStmt switch, Block switchBlock) {
|
||||
switch.getStmt() = switchBlock and
|
||||
successors_extended(result, unresolveElement(switchBlock))
|
||||
successors_extended(result, switchBlock)
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -108,10 +109,10 @@ private predicate impossibleSwitchEdge(Block switchBlock, SwitchCase sc) {
|
||||
and switch.getStmt() = switchBlock
|
||||
// If all of the successors have known values, and none of those
|
||||
// values are in our range, then this edge is impossible.
|
||||
and forall(@cfgnode n |
|
||||
and forall(Node n |
|
||||
n = getASwitchExpr(switch, switchBlock) |
|
||||
exists(int switchValue |
|
||||
switchValue = getSwitchValue(mkElement(n))
|
||||
switchValue = getSwitchValue(n)
|
||||
and (switchValue < sc.getExpr().(CompileTimeConstantInt).getIntValue() or
|
||||
switchValue > switchCaseRangeEnd(sc)))))
|
||||
}
|
||||
@@ -126,11 +127,11 @@ private predicate impossibleDefaultSwitchEdge(Block switchBlock, DefaultCase dc)
|
||||
and switch.getStmt() = switchBlock
|
||||
// If all of the successors lead to other switch cases
|
||||
// then this edge is impossible.
|
||||
and forall(@cfgnode n |
|
||||
and forall(Node n |
|
||||
n = getASwitchExpr(switch, switchBlock) |
|
||||
exists(SwitchCase sc, int val |
|
||||
sc.getSwitchStmt() = switch and
|
||||
val = getSwitchValue(mkElement(n)) and
|
||||
val = getSwitchValue(n) and
|
||||
val >= sc.getExpr().(CompileTimeConstantInt).getIntValue() and
|
||||
val <= switchCaseRangeEnd(sc))))
|
||||
}
|
||||
@@ -139,10 +140,10 @@ private predicate impossibleDefaultSwitchEdge(Block switchBlock, DefaultCase dc)
|
||||
* If `pred` is a function call with (at least) one function target,
|
||||
* (at least) one such target must be potentially returning.
|
||||
*/
|
||||
private predicate possiblePredecessor(@cfgnode pred) {
|
||||
not exists(mkElement(pred).(FunctionCall).getTarget())
|
||||
private predicate possiblePredecessor(Node pred) {
|
||||
not exists(pred.(FunctionCall).getTarget())
|
||||
or
|
||||
potentiallyReturningFunctionCall(mkElement(pred))
|
||||
potentiallyReturningFunctionCall(pred)
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -150,14 +151,14 @@ private predicate possiblePredecessor(@cfgnode pred) {
|
||||
* impossible control-flow edges - flow will never occur along these
|
||||
* edges, so it is safe (and indeed sensible) to remove them.
|
||||
*/
|
||||
cached predicate successors_adapted(@cfgnode pred, @cfgnode succ) {
|
||||
cached predicate successors_adapted(Node pred, Node succ) {
|
||||
successors_extended(pred, succ)
|
||||
and possiblePredecessor(pred)
|
||||
and not impossibleFalseEdge(mkElement(pred), succ)
|
||||
and not impossibleTrueEdge(mkElement(pred), succ)
|
||||
and not impossibleSwitchEdge(mkElement(pred), mkElement(succ))
|
||||
and not impossibleDefaultSwitchEdge(mkElement(pred), mkElement(succ))
|
||||
and not getOptions().exprExits(mkElement(pred))
|
||||
and not impossibleFalseEdge(pred, succ)
|
||||
and not impossibleTrueEdge(pred, succ)
|
||||
and not impossibleSwitchEdge(pred, succ)
|
||||
and not impossibleDefaultSwitchEdge(pred, succ)
|
||||
and not getOptions().exprExits(pred)
|
||||
}
|
||||
|
||||
private predicate compileTimeConstantInt(Expr e, int val) {
|
||||
@@ -708,9 +709,9 @@ library class ConditionEvaluator extends ExprEvaluator {
|
||||
ConditionEvaluator() { this = 0 }
|
||||
|
||||
override predicate interesting(Expr e) {
|
||||
falsecond(unresolveElement(e), _)
|
||||
falsecond_base(e, _)
|
||||
or
|
||||
truecond(unresolveElement(e), _)
|
||||
truecond_base(e, _)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -719,7 +720,7 @@ library class SwitchEvaluator extends ExprEvaluator {
|
||||
SwitchEvaluator() { this = 1 }
|
||||
|
||||
override predicate interesting(Expr e) {
|
||||
e = mkElement(getASwitchExpr(_, _))
|
||||
e = getASwitchExpr(_, _)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -734,7 +735,7 @@ library class LoopEntryConditionEvaluator extends ExprEvaluator {
|
||||
abstract override predicate interesting(Expr e);
|
||||
|
||||
/** Holds if `cfn` is the entry point of the loop for which `e` is the condition. */
|
||||
abstract predicate isLoopEntry(Expr e, ControlFlowNode cfn);
|
||||
abstract predicate isLoopEntry(Expr e, Node cfn);
|
||||
|
||||
/** Holds if `s` is the loop body guarded by the condition `e`. */
|
||||
abstract predicate isLoopBody(Expr e, StmtParent s);
|
||||
@@ -798,7 +799,7 @@ library class LoopEntryConditionEvaluator extends ExprEvaluator {
|
||||
}
|
||||
|
||||
private predicate loopEntryAt(PrimitiveBasicBlock bb, int pos, Expr e) {
|
||||
exists(ControlFlowNode cfn |
|
||||
exists(Node cfn |
|
||||
bb.getNode(pos) = cfn and
|
||||
isLoopEntry(e, cfn)
|
||||
)
|
||||
@@ -912,7 +913,7 @@ library class WhileLoopEntryConditionEvaluator extends LoopEntryConditionEvaluat
|
||||
exists(WhileStmt while | e = while.getCondition())
|
||||
}
|
||||
|
||||
override predicate isLoopEntry(Expr e, ControlFlowNode cfn) {
|
||||
override predicate isLoopEntry(Expr e, Node cfn) {
|
||||
cfn.(WhileStmt).getCondition() = e
|
||||
}
|
||||
|
||||
@@ -932,7 +933,7 @@ library class ForLoopEntryConditionEvaluator extends LoopEntryConditionEvaluator
|
||||
exists(ForStmt for | e = for.getCondition())
|
||||
}
|
||||
|
||||
override predicate isLoopEntry(Expr e, ControlFlowNode cfn) {
|
||||
override predicate isLoopEntry(Expr e, Node cfn) {
|
||||
cfn.(ForStmt).getCondition() = e
|
||||
}
|
||||
|
||||
|
||||
@@ -17,12 +17,13 @@
|
||||
* will coincide with `PrimitiveBasicBlock`s.
|
||||
*/
|
||||
import cpp
|
||||
private class Node = ControlFlowNodeBase;
|
||||
|
||||
import Cached
|
||||
private cached module Cached {
|
||||
/** Holds if `node` is the entry node of a primitive basic block. */
|
||||
cached
|
||||
predicate primitive_basic_block_entry_node(ControlFlowNode node) {
|
||||
predicate primitive_basic_block_entry_node(Node node) {
|
||||
// The entry point of the CFG is the start of a BB.
|
||||
exists (Function f | f.getEntryPoint() = node)
|
||||
|
||||
@@ -30,8 +31,8 @@ private cached module Cached {
|
||||
// or the node's predecessor has more than one successor,
|
||||
// then the node is the start of a new primitive basic block.
|
||||
or
|
||||
strictcount (ControlFlowNode pred, ControlFlowNode other
|
||||
| successors_extended(unresolveElement(pred),unresolveElement(node)) and successors_extended(unresolveElement(pred),unresolveElement(other))) > 1
|
||||
strictcount (Node pred, Node other
|
||||
| successors_extended(pred,node) and successors_extended(pred,other)) > 1
|
||||
|
||||
// If the node has zero predecessors then it is the start of
|
||||
// a BB. However, the C++ AST contains many nodes with zero
|
||||
@@ -39,32 +40,32 @@ private cached module Cached {
|
||||
// the CFG. So we exclude all of those trivial BBs by requiring
|
||||
// that the node have at least one successor.
|
||||
or
|
||||
(not successors_extended(_, unresolveElement(node)) and successors_extended(unresolveElement(node), _))
|
||||
(not successors_extended(_, node) and successors_extended(node, _))
|
||||
}
|
||||
|
||||
/** Holds if `node` is the `pos`th control-flow node in primitive basic block `bb`. */
|
||||
cached
|
||||
predicate primitive_basic_block_member(ControlFlowNode node, PrimitiveBasicBlock bb, int pos) {
|
||||
(node = mkElement(bb) and pos = 0)
|
||||
predicate primitive_basic_block_member(Node node, PrimitiveBasicBlock bb, int pos) {
|
||||
(node = bb and pos = 0)
|
||||
or
|
||||
(not (unresolveElement(node) instanceof PrimitiveBasicBlock) and
|
||||
exists (ControlFlowNode pred
|
||||
| successors_extended(unresolveElement(pred),unresolveElement(node))
|
||||
(not (node instanceof PrimitiveBasicBlock) and
|
||||
exists (Node pred
|
||||
| successors_extended(pred, node)
|
||||
| primitive_basic_block_member(pred, bb, pos - 1)))
|
||||
}
|
||||
|
||||
/** Gets the number of control-flow nodes in the primitive basic block `bb`. */
|
||||
cached
|
||||
int primitive_bb_length(PrimitiveBasicBlock bb) {
|
||||
result = strictcount(ControlFlowNode node | primitive_basic_block_member(node, bb, _))
|
||||
result = strictcount(Node node | primitive_basic_block_member(node, bb, _))
|
||||
}
|
||||
|
||||
/** Successor relation for primitive basic blocks. */
|
||||
cached
|
||||
predicate primitive_bb_successor(PrimitiveBasicBlock pred, PrimitiveBasicBlock succ) {
|
||||
exists(ControlFlowNode last |
|
||||
exists(Node last |
|
||||
primitive_basic_block_member(last, pred, primitive_bb_length(pred)-1) and
|
||||
successors_extended(unresolveElement(last), succ)
|
||||
successors_extended(last, succ)
|
||||
)
|
||||
}
|
||||
}
|
||||
@@ -73,26 +74,21 @@ private cached module Cached {
|
||||
* A primitive basic block in the C/C++ control-flow graph constructed using
|
||||
* the primitive `successors_extended` relation only.
|
||||
*/
|
||||
class PrimitiveBasicBlock extends @cfgnode {
|
||||
class PrimitiveBasicBlock extends Node {
|
||||
|
||||
PrimitiveBasicBlock() {
|
||||
primitive_basic_block_entry_node(mkElement(this))
|
||||
primitive_basic_block_entry_node(this)
|
||||
}
|
||||
|
||||
/** Gets a textual representation of this element. */
|
||||
string toString() {
|
||||
result = "PrimitiveBasicBlock"
|
||||
}
|
||||
|
||||
predicate contains(ControlFlowNode node) {
|
||||
predicate contains(Node node) {
|
||||
primitive_basic_block_member(node, this, _)
|
||||
}
|
||||
|
||||
ControlFlowNode getNode(int pos) {
|
||||
Node getNode(int pos) {
|
||||
primitive_basic_block_member(result, this, pos)
|
||||
}
|
||||
|
||||
ControlFlowNode getANode() {
|
||||
Node getANode() {
|
||||
primitive_basic_block_member(result, this, _)
|
||||
}
|
||||
|
||||
|
||||
@@ -169,7 +169,7 @@ predicate stackPointerFlowsToDef(
|
||||
or
|
||||
// Increment/decrement operators.
|
||||
exists (VariableAccess access
|
||||
| access = mkElement(def).(CrementOperation).getOperand() and
|
||||
| access = def.(CrementOperation).getOperand() and
|
||||
var = access.getTarget() and
|
||||
stackPointerFlowsToUse(access, useType, source, isLocal))
|
||||
or
|
||||
@@ -205,7 +205,7 @@ predicate stackReferenceFlowsToDef_Impl(
|
||||
or
|
||||
// Increment/decrement operators.
|
||||
exists (VariableAccess access
|
||||
| access = mkElement(def).(CrementOperation).getOperand() and
|
||||
| access = def.(CrementOperation).getOperand() and
|
||||
var = access.getTarget() and
|
||||
stackReferenceFlowsToUse(access, useType, source, isLocal))
|
||||
or
|
||||
|
||||
@@ -114,7 +114,7 @@ module FlowVar_internal {
|
||||
predicate blockVarDefinedByVariable(
|
||||
SubBasicBlock sbb, LocalScopeVariable v)
|
||||
{
|
||||
mkElement(sbb) = v.(Parameter).getFunction().getEntryPoint()
|
||||
sbb = v.(Parameter).getFunction().getEntryPoint()
|
||||
or
|
||||
exists(DeclStmt declStmt |
|
||||
declStmt.getDeclaration(_) = v.(LocalVariable) and
|
||||
@@ -131,11 +131,11 @@ module FlowVar_internal {
|
||||
or
|
||||
TBlockVar(SubBasicBlock sbb, Variable v) {
|
||||
not fullySupportedSsaVariable(v) and
|
||||
reachable(mkElement(sbb)) and
|
||||
reachable(sbb) and
|
||||
(
|
||||
initializer(sbb.getANode(), v, _)
|
||||
or
|
||||
assignmentLikeOperation(mkElement(sbb), v, _)
|
||||
assignmentLikeOperation(sbb, v, _)
|
||||
or
|
||||
blockVarDefinedByVariable(sbb, v)
|
||||
)
|
||||
@@ -233,7 +233,7 @@ module FlowVar_internal {
|
||||
|
||||
override predicate definedByExpr(Expr e, ControlFlowNode node) {
|
||||
assignmentLikeOperation(node, v, e) and
|
||||
node = mkElement(sbb)
|
||||
node = sbb
|
||||
or
|
||||
initializer(node, v, e) and
|
||||
node = sbb.getANode()
|
||||
@@ -310,7 +310,7 @@ module FlowVar_internal {
|
||||
}
|
||||
|
||||
private predicate bbInLoop(BasicBlock bb) {
|
||||
bbDominates(unresolveElement(this.(Loop).getStmt()), bb)
|
||||
bbDominates(this.(Loop).getStmt(), bb)
|
||||
or
|
||||
bbInLoopCondition(bb)
|
||||
}
|
||||
@@ -328,7 +328,7 @@ module FlowVar_internal {
|
||||
(
|
||||
// For the type of loop we are interested in, the body is always a
|
||||
// basic block.
|
||||
mkElement(bb) = this.(Loop).getStmt() and
|
||||
bb = this.(Loop).getStmt() and
|
||||
v = this.getARelevantVariable()
|
||||
or
|
||||
reachesWithoutAssignment(bb.getAPredecessor(), v) and
|
||||
@@ -369,7 +369,7 @@ module FlowVar_internal {
|
||||
mid = getAReachedBlockVarSBB(start) and
|
||||
result = mid.getASuccessor() and
|
||||
not skipLoop(mid, result, sbbDef, v) and
|
||||
not assignmentLikeOperation(mkElement(result), v, _)
|
||||
not assignmentLikeOperation(result, v, _)
|
||||
)
|
||||
}
|
||||
|
||||
@@ -522,7 +522,7 @@ module FlowVar_internal {
|
||||
DataFlowSubBasicBlockCutNode() {
|
||||
exists(Variable v |
|
||||
not fullySupportedSsaVariable(v) and
|
||||
assignmentLikeOperation(mkElement(this), v, _)
|
||||
assignmentLikeOperation(this, v, _)
|
||||
// It is not necessary to cut the basic blocks at `Initializer` nodes
|
||||
// because the affected variable can have no _other_ value before its
|
||||
// initializer. It is not necessary to cut basic blocks at procedure
|
||||
|
||||
@@ -21,14 +21,13 @@ import cpp
|
||||
* split in more places than either library expects, but nothing should break
|
||||
* as a direct result of that.
|
||||
*/
|
||||
abstract class SubBasicBlockCutNode extends @cfgnode {
|
||||
abstract class SubBasicBlockCutNode extends ControlFlowNode {
|
||||
SubBasicBlockCutNode() {
|
||||
// Some control-flow nodes are not in any basic block. This includes
|
||||
// `Conversion`s, expressions that are evaluated at compile time, default
|
||||
// arguments, and `Function`s without implementation.
|
||||
exists(mkElement(this).(ControlFlowNode).getBasicBlock())
|
||||
exists(this.getBasicBlock())
|
||||
}
|
||||
string toString() { result = "SubBasicBlockCutNode" }
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -40,7 +39,7 @@ abstract class SubBasicBlockCutNode extends @cfgnode {
|
||||
* therefore extend `SubBasicBlockCutNode` to direct where basic blocks will be
|
||||
* split up.
|
||||
*/
|
||||
class SubBasicBlock extends @cfgnode {
|
||||
class SubBasicBlock extends ControlFlowNodeBase {
|
||||
SubBasicBlock() {
|
||||
this instanceof BasicBlock
|
||||
or
|
||||
@@ -49,7 +48,7 @@ class SubBasicBlock extends @cfgnode {
|
||||
|
||||
/** Gets the basic block in which this `SubBasicBlock` is contained. */
|
||||
BasicBlock getBasicBlock() {
|
||||
result = mkElement(this).(ControlFlowNode).getBasicBlock()
|
||||
result = this.(ControlFlowNode).getBasicBlock()
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -77,9 +76,9 @@ class SubBasicBlock extends @cfgnode {
|
||||
*/
|
||||
int getPosInBasicBlock(BasicBlock bb) {
|
||||
exists(int nodePos, int rnk |
|
||||
bb = mkElement(this).(ControlFlowNode).getBasicBlock() and
|
||||
mkElement(this) = bb.getNode(nodePos) and
|
||||
nodePos = rank[rnk](int i | exists(SubBasicBlock n | mkElement(n) = bb.getNode(i))) and
|
||||
bb = this.(ControlFlowNode).getBasicBlock() and
|
||||
this = bb.getNode(nodePos) and
|
||||
nodePos = rank[rnk](int i | exists(SubBasicBlock n | n = bb.getNode(i))) and
|
||||
result = rnk - 1
|
||||
)
|
||||
}
|
||||
@@ -101,7 +100,7 @@ class SubBasicBlock extends @cfgnode {
|
||||
*/
|
||||
ControlFlowNode getNode(int pos) {
|
||||
exists(BasicBlock bb | bb = this.getBasicBlock() |
|
||||
exists(int thisPos | mkElement(this) = bb.getNode(thisPos) |
|
||||
exists(int thisPos | this = bb.getNode(thisPos) |
|
||||
result = bb.getNode(thisPos + pos) and
|
||||
pos >= 0 and
|
||||
pos < this.getNumberOfNodes()
|
||||
@@ -124,8 +123,6 @@ class SubBasicBlock extends @cfgnode {
|
||||
result.getASuccessor() = this
|
||||
}
|
||||
|
||||
string toString() { result = "SubBasicBlock" }
|
||||
|
||||
/**
|
||||
* Gets a node such that the control-flow edge `(this, result)` may be taken
|
||||
* when the final node of this `SubBasicBlock` is a conditional expression
|
||||
@@ -152,13 +149,13 @@ class SubBasicBlock extends @cfgnode {
|
||||
*/
|
||||
int getNumberOfNodes() {
|
||||
exists(BasicBlock bb | bb = this.getBasicBlock() |
|
||||
exists(int thisPos | mkElement(this) = bb.getNode(thisPos) |
|
||||
exists(int thisPos | this = bb.getNode(thisPos) |
|
||||
this.lastInBB() and
|
||||
result = bb.length() - thisPos
|
||||
or
|
||||
exists(SubBasicBlock succ, int succPos |
|
||||
succ.getPosInBasicBlock(bb) = this.getPosInBasicBlock(bb) + 1 and
|
||||
bb.getNode(succPos) = mkElement(succ) and
|
||||
bb.getNode(succPos) = succ and
|
||||
result = succPos - thisPos
|
||||
)
|
||||
)
|
||||
@@ -172,7 +169,7 @@ class SubBasicBlock extends @cfgnode {
|
||||
|
||||
/** Gets the first control-flow node in this `SubBasicBlock`. */
|
||||
ControlFlowNode getStart() {
|
||||
result = mkElement(this)
|
||||
result = this
|
||||
}
|
||||
|
||||
pragma[noinline]
|
||||
|
||||
@@ -52,9 +52,9 @@ private predicate guardCondition(
|
||||
}
|
||||
|
||||
private predicate guardSuccessor(ComparisonOperation guard, boolean branch, BasicBlock succ) {
|
||||
(branch = true and mkElement(succ) = guard.getATrueSuccessor())
|
||||
(branch = true and succ = guard.getATrueSuccessor())
|
||||
or
|
||||
(branch = false and mkElement(succ) = guard.getAFalseSuccessor())
|
||||
(branch = false and succ = guard.getAFalseSuccessor())
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -64,10 +64,10 @@ private predicate guardSuccessor(ComparisonOperation guard, boolean branch, Basi
|
||||
* can be coincident, due to the presence of parameter definitions and phi
|
||||
* nodes.
|
||||
*/
|
||||
class RangeSsaDefinition extends @cfgnode {
|
||||
class RangeSsaDefinition extends ControlFlowNodeBase {
|
||||
|
||||
RangeSsaDefinition() {
|
||||
exists(RangeSSA x | x.ssa_defn(_, (ControlFlowNode)mkElement(this), _, _))
|
||||
exists(RangeSSA x | x.ssa_defn(_, this, _, _))
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -75,11 +75,7 @@ class RangeSsaDefinition extends @cfgnode {
|
||||
* this definition.
|
||||
*/
|
||||
LocalScopeVariable getAVariable() {
|
||||
exists(RangeSSA x | x.ssa_defn(result, (ControlFlowNode)mkElement(this), _, _))
|
||||
}
|
||||
|
||||
string toString() {
|
||||
result = "SSA definition"
|
||||
exists(RangeSSA x | x.ssa_defn(result, this, _, _))
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -87,17 +83,17 @@ class RangeSsaDefinition extends @cfgnode {
|
||||
* (this, v).
|
||||
*/
|
||||
string toString(LocalScopeVariable v) {
|
||||
exists(RangeSSA x | result = x.toString((ControlFlowNode)mkElement(this), v))
|
||||
exists(RangeSSA x | result = x.toString(this, v))
|
||||
}
|
||||
|
||||
/** Gets a use of the SSA variable represented by the pair (this, v) */
|
||||
VariableAccess getAUse(LocalScopeVariable v) {
|
||||
exists(RangeSSA x | result = x.getAUse((ControlFlowNode)mkElement(this), v))
|
||||
exists(RangeSSA x | result = x.getAUse(this, v))
|
||||
}
|
||||
|
||||
/** Gets the control flow node for this definition */
|
||||
ControlFlowNode getDefinition() {
|
||||
result = mkElement(this)
|
||||
result = this
|
||||
}
|
||||
|
||||
BasicBlock getBasicBlock() {
|
||||
@@ -118,12 +114,12 @@ class RangeSsaDefinition extends @cfgnode {
|
||||
}
|
||||
|
||||
Location getLocation() {
|
||||
result = mkElement(this).(ControlFlowNode).getLocation()
|
||||
result = this.(ControlFlowNode).getLocation()
|
||||
}
|
||||
|
||||
/** Whether this definition is from a parameter */
|
||||
predicate definedByParameter(Parameter p) {
|
||||
mkElement(this) = p.getFunction().getEntryPoint()
|
||||
this = p.getFunction().getEntryPoint()
|
||||
}
|
||||
|
||||
RangeSsaDefinition getAPhiInput(LocalScopeVariable v) {
|
||||
@@ -174,6 +170,6 @@ class RangeSsaDefinition extends @cfgnode {
|
||||
}
|
||||
|
||||
predicate reachesEndOfBB(LocalScopeVariable v, BasicBlock b) {
|
||||
exists(RangeSSA x | x.ssaDefinitionReachesEndOfBB(v, (ControlFlowNode)mkElement(this), b))
|
||||
exists(RangeSSA x | x.ssaDefinitionReachesEndOfBB(v, this, b))
|
||||
}
|
||||
}
|
||||
|
||||
@@ -144,20 +144,20 @@ predicate defDependsOnDef(
|
||||
or
|
||||
exists (
|
||||
AssignAddExpr assignAdd, RangeSsaDefinition nextDef
|
||||
| mkElement(def) = assignAdd and
|
||||
| def = assignAdd and
|
||||
assignAdd.getLValue() = nextDef.getAUse(v)
|
||||
| defDependsOnDef(nextDef, v, srcDef, srcVar) or
|
||||
exprDependsOnDef(assignAdd.getRValue(), srcDef, srcVar))
|
||||
or
|
||||
exists (
|
||||
AssignSubExpr assignSub, RangeSsaDefinition nextDef
|
||||
| mkElement(def) = assignSub and
|
||||
| def = assignSub and
|
||||
assignSub.getLValue() = nextDef.getAUse(v)
|
||||
| defDependsOnDef(nextDef, v, srcDef, srcVar) or
|
||||
exprDependsOnDef(assignSub.getRValue(), srcDef, srcVar))
|
||||
or
|
||||
exists (CrementOperation crem
|
||||
| mkElement(def) = crem and
|
||||
| def = crem and
|
||||
crem.getOperand() = v.getAnAccess() and
|
||||
exprDependsOnDef(crem.getOperand(), srcDef, srcVar))
|
||||
or
|
||||
@@ -278,10 +278,10 @@ private
|
||||
predicate assignmentDef(RangeSsaDefinition def, LocalScopeVariable v, Expr expr) {
|
||||
v.getType().getUnspecifiedType() instanceof ArithmeticType
|
||||
and
|
||||
((mkElement(def) = v.getInitializer().getExpr() and mkElement(def) = expr)
|
||||
((def = v.getInitializer().getExpr() and def = expr)
|
||||
or
|
||||
exists(AssignExpr assign
|
||||
| mkElement(def) = assign and
|
||||
| def = assign and
|
||||
assign.getLValue() = v.getAnAccess() and
|
||||
expr = assign.getRValue()))
|
||||
}
|
||||
@@ -845,7 +845,7 @@ float getDefLowerBoundsImpl(RangeSsaDefinition def, LocalScopeVariable v) {
|
||||
or
|
||||
exists (
|
||||
AssignAddExpr assignAdd, RangeSsaDefinition nextDef, float lhsLB, float rhsLB
|
||||
| mkElement(def) = assignAdd and
|
||||
| def = assignAdd and
|
||||
assignAdd.getLValue() = nextDef.getAUse(v) and
|
||||
lhsLB = getDefLowerBounds(nextDef, v) and
|
||||
rhsLB = getFullyConvertedLowerBounds(assignAdd.getRValue()) and
|
||||
@@ -853,20 +853,20 @@ float getDefLowerBoundsImpl(RangeSsaDefinition def, LocalScopeVariable v) {
|
||||
or
|
||||
exists (
|
||||
AssignSubExpr assignSub, RangeSsaDefinition nextDef, float lhsLB, float rhsUB
|
||||
| mkElement(def) = assignSub and
|
||||
| def = assignSub and
|
||||
assignSub.getLValue() = nextDef.getAUse(v) and
|
||||
lhsLB = getDefLowerBounds(nextDef, v) and
|
||||
rhsUB = getFullyConvertedUpperBounds(assignSub.getRValue()) and
|
||||
result = lhsLB - rhsUB)
|
||||
or
|
||||
exists (IncrementOperation incr, float newLB
|
||||
| mkElement(def) = incr and
|
||||
| def = incr and
|
||||
incr.getOperand() = v.getAnAccess() and
|
||||
newLB = getFullyConvertedLowerBounds(incr.getOperand()) and
|
||||
result = newLB+1)
|
||||
or
|
||||
exists (DecrementOperation decr, float newLB
|
||||
| mkElement(def) = decr and
|
||||
| def = decr and
|
||||
decr.getOperand() = v.getAnAccess() and
|
||||
newLB = getFullyConvertedLowerBounds(decr.getOperand()) and
|
||||
result = newLB-1)
|
||||
@@ -888,7 +888,7 @@ float getDefUpperBoundsImpl(RangeSsaDefinition def, LocalScopeVariable v) {
|
||||
or
|
||||
exists (
|
||||
AssignAddExpr assignAdd, RangeSsaDefinition nextDef, float lhsUB, float rhsUB
|
||||
| mkElement(def) = assignAdd and
|
||||
| def = assignAdd and
|
||||
assignAdd.getLValue() = nextDef.getAUse(v) and
|
||||
lhsUB = getDefUpperBounds(nextDef, v) and
|
||||
rhsUB = getFullyConvertedUpperBounds(assignAdd.getRValue()) and
|
||||
@@ -896,20 +896,20 @@ float getDefUpperBoundsImpl(RangeSsaDefinition def, LocalScopeVariable v) {
|
||||
or
|
||||
exists (
|
||||
AssignSubExpr assignSub, RangeSsaDefinition nextDef, float lhsUB, float rhsLB
|
||||
| mkElement(def) = assignSub and
|
||||
| def = assignSub and
|
||||
assignSub.getLValue() = nextDef.getAUse(v) and
|
||||
lhsUB = getDefUpperBounds(nextDef, v) and
|
||||
rhsLB = getFullyConvertedLowerBounds(assignSub.getRValue()) and
|
||||
result = lhsUB - rhsLB)
|
||||
or
|
||||
exists (IncrementOperation incr, float newUB
|
||||
| mkElement(def) = incr and
|
||||
| def = incr and
|
||||
incr.getOperand() = v.getAnAccess() and
|
||||
newUB = getFullyConvertedUpperBounds(incr.getOperand()) and
|
||||
result = newUB+1)
|
||||
or
|
||||
exists (DecrementOperation decr, float newUB
|
||||
| mkElement(def) = decr and
|
||||
| def = decr and
|
||||
decr.getOperand() = v.getAnAccess() and
|
||||
newUB = getFullyConvertedUpperBounds(decr.getOperand()) and
|
||||
result = newUB-1)
|
||||
|
||||
@@ -521,16 +521,15 @@ private predicate methodReturningReceiver(MemberFunction method) {
|
||||
Function resolveCall(Call call) {
|
||||
result = call.getTarget()
|
||||
or
|
||||
result = unresolveElement(call).(DataSensitiveCallExpr).resolve()
|
||||
result = call.(DataSensitiveCallExpr).resolve()
|
||||
}
|
||||
|
||||
/** A data sensitive call expression. */
|
||||
library abstract class DataSensitiveCallExpr extends @expr {
|
||||
DataSensitiveCallExpr() { not unreachable(mkElement(this)) }
|
||||
library abstract class DataSensitiveCallExpr extends Expr {
|
||||
DataSensitiveCallExpr() { not unreachable(this) }
|
||||
|
||||
abstract Expr getSrc();
|
||||
cached abstract Function resolve();
|
||||
abstract string toString();
|
||||
|
||||
/**
|
||||
* Whether `src` can flow to this call expression.
|
||||
@@ -556,27 +555,21 @@ library abstract class DataSensitiveCallExpr extends @expr {
|
||||
}
|
||||
|
||||
/** Call through a function pointer. */
|
||||
library class DataSensitiveExprCall extends DataSensitiveCallExpr {
|
||||
DataSensitiveExprCall() {
|
||||
mkElement(this) instanceof ExprCall
|
||||
}
|
||||
|
||||
override Expr getSrc() { result = mkElement(this).(ExprCall).getExpr() }
|
||||
library class DataSensitiveExprCall extends DataSensitiveCallExpr, ExprCall {
|
||||
override Expr getSrc() { result = getExpr() }
|
||||
|
||||
override Function resolve() {
|
||||
exists(FunctionAccess fa | flowsFrom(fa, true) | result = fa.getTarget())
|
||||
}
|
||||
|
||||
override string toString() { result = mkElement(this).toString() }
|
||||
}
|
||||
|
||||
/** Call to a virtual function. */
|
||||
library class DataSensitiveOverriddenFunctionCall extends DataSensitiveCallExpr {
|
||||
library class DataSensitiveOverriddenFunctionCall extends DataSensitiveCallExpr, FunctionCall {
|
||||
DataSensitiveOverriddenFunctionCall() {
|
||||
exists(mkElement(this).(FunctionCall).getTarget().(VirtualFunction).getAnOverridingFunction())
|
||||
exists(getTarget().(VirtualFunction).getAnOverridingFunction())
|
||||
}
|
||||
|
||||
override Expr getSrc() { result = mkElement(this).(FunctionCall).getQualifier() }
|
||||
override Expr getSrc() { result = getQualifier() }
|
||||
|
||||
override MemberFunction resolve() {
|
||||
exists(NewExpr new |
|
||||
@@ -584,11 +577,9 @@ library class DataSensitiveOverriddenFunctionCall extends DataSensitiveCallExpr
|
||||
and
|
||||
memberFunctionFromNewExpr(new, result)
|
||||
and
|
||||
result.overrides*(mkElement(this).(FunctionCall).getTarget().(VirtualFunction))
|
||||
result.overrides*(getTarget().(VirtualFunction))
|
||||
)
|
||||
}
|
||||
|
||||
override string toString() { result = mkElement(this).toString() }
|
||||
}
|
||||
|
||||
private predicate memberFunctionFromNewExpr(NewExpr new, MemberFunction f) {
|
||||
|
||||
@@ -61,12 +61,12 @@ private ControlFlowNode nodeWithPossibleSideEffect() {
|
||||
or
|
||||
// If the lhs of an assignment is not analyzable by SSA, then
|
||||
// we need to treat the assignment as having a possible side-effect.
|
||||
(result instanceof Assignment and not unresolveElement(result) instanceof SsaDefinition)
|
||||
(result instanceof Assignment and not result instanceof SsaDefinition)
|
||||
or
|
||||
(result instanceof CrementOperation and not unresolveElement(result) instanceof SsaDefinition)
|
||||
(result instanceof CrementOperation and not result instanceof SsaDefinition)
|
||||
or
|
||||
exists (LocalVariable v
|
||||
| result = v.getInitializer().getExpr() and not unresolveElement(result) instanceof SsaDefinition)
|
||||
| result = v.getInitializer().getExpr() and not result instanceof SsaDefinition)
|
||||
or
|
||||
result instanceof AsmStmt
|
||||
}
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
| ODASA-5692.cpp:11:18:13:3 | BasicBlock |
|
||||
| ODASA-5692.cpp:11:18:13:3 | BasicBlock |
|
||||
| ODASA-5692.cpp:14:15:15:12 | BasicBlock |
|
||||
| ODASA-5692.cpp:14:15:15:12 | BasicBlock |
|
||||
| exceptions.cpp:26:13:26:13 | BasicBlock |
|
||||
| ODASA-5692.cpp:11:18:13:3 | <handler> |
|
||||
| ODASA-5692.cpp:11:18:13:3 | <handler> |
|
||||
| ODASA-5692.cpp:14:15:15:12 | <handler> |
|
||||
| ODASA-5692.cpp:14:15:15:12 | <handler> |
|
||||
| exceptions.cpp:26:13:26:13 | ExprStmt |
|
||||
|
||||
@@ -1,128 +1,177 @@
|
||||
| conjugation.c:3:5:3:5 | x | AnalysedExpr |
|
||||
| conjugation.c:3:5:3:5 | x | CompileTimeVariableExpr |
|
||||
| conjugation.c:3:5:3:5 | x | DefOrUse |
|
||||
| conjugation.c:3:5:3:5 | x | VariableAccess |
|
||||
| conjugation.c:3:5:3:10 | ... = ... | AnalysedExpr |
|
||||
| conjugation.c:3:5:3:10 | ... = ... | AssignExpr |
|
||||
| conjugation.c:3:5:3:10 | ... = ... | CompileTimeVariableExpr |
|
||||
| conjugation.c:3:5:3:10 | ... = ... | Def |
|
||||
| conjugation.c:3:5:3:10 | ... = ... | ExprInVoidContext |
|
||||
| conjugation.c:3:5:3:10 | ... = ... | NameQualifiableElement |
|
||||
| conjugation.c:3:5:3:10 | ... = ... | RangeSsaDefinition |
|
||||
| conjugation.c:3:5:3:10 | ... = ... | SsaDefinition |
|
||||
| conjugation.c:3:9:3:10 | ~ ... | AnalysedExpr |
|
||||
| conjugation.c:3:9:3:10 | ~ ... | CompileTimeVariableExpr |
|
||||
| conjugation.c:3:9:3:10 | ~ ... | ConjugationExpr |
|
||||
| conjugation.c:3:9:3:10 | ~ ... | DefOrUse |
|
||||
| conjugation.c:3:9:3:10 | ~ ... | NameQualifiableElement |
|
||||
| conjugation.c:3:10:3:10 | x | AnalysedExpr |
|
||||
| conjugation.c:3:10:3:10 | x | CompileTimeVariableExpr |
|
||||
| conjugation.c:3:10:3:10 | x | Use |
|
||||
| conjugation.c:3:10:3:10 | x | VariableAccess |
|
||||
| test.c:5:5:5:5 | z | AnalysedExpr |
|
||||
| test.c:5:5:5:5 | z | CompileTimeVariableExpr |
|
||||
| test.c:5:5:5:5 | z | DefOrUse |
|
||||
| test.c:5:5:5:5 | z | VariableAccess |
|
||||
| test.c:5:5:5:13 | ... = ... | AnalysedExpr |
|
||||
| test.c:5:5:5:13 | ... = ... | AssignExpr |
|
||||
| test.c:5:5:5:13 | ... = ... | CompileTimeVariableExpr |
|
||||
| test.c:5:5:5:13 | ... = ... | Def |
|
||||
| test.c:5:5:5:13 | ... = ... | ExprInVoidContext |
|
||||
| test.c:5:5:5:13 | ... = ... | NameQualifiableElement |
|
||||
| test.c:5:5:5:13 | ... = ... | RangeSsaDefinition |
|
||||
| test.c:5:5:5:13 | ... = ... | SsaDefinition |
|
||||
| test.c:5:9:5:9 | x | AnalysedExpr |
|
||||
| test.c:5:9:5:9 | x | CompileTimeVariableExpr |
|
||||
| test.c:5:9:5:9 | x | Use |
|
||||
| test.c:5:9:5:9 | x | VariableAccess |
|
||||
| test.c:5:9:5:13 | ... * ... | AnalysedExpr |
|
||||
| test.c:5:9:5:13 | ... * ... | CompileTimeVariableExpr |
|
||||
| test.c:5:9:5:13 | ... * ... | DefOrUse |
|
||||
| test.c:5:9:5:13 | ... * ... | ImaginaryMulExpr |
|
||||
| test.c:5:9:5:13 | ... * ... | NameQualifiableElement |
|
||||
| test.c:5:13:5:13 | y | AnalysedExpr |
|
||||
| test.c:5:13:5:13 | y | CompileTimeVariableExpr |
|
||||
| test.c:5:13:5:13 | y | Use |
|
||||
| test.c:5:13:5:13 | y | VariableAccess |
|
||||
| test.c:6:5:6:5 | z | AnalysedExpr |
|
||||
| test.c:6:5:6:5 | z | CompileTimeVariableExpr |
|
||||
| test.c:6:5:6:5 | z | DefOrUse |
|
||||
| test.c:6:5:6:5 | z | VariableAccess |
|
||||
| test.c:6:5:6:13 | ... = ... | AnalysedExpr |
|
||||
| test.c:6:5:6:13 | ... = ... | AssignExpr |
|
||||
| test.c:6:5:6:13 | ... = ... | CompileTimeVariableExpr |
|
||||
| test.c:6:5:6:13 | ... = ... | Def |
|
||||
| test.c:6:5:6:13 | ... = ... | ExprInVoidContext |
|
||||
| test.c:6:5:6:13 | ... = ... | NameQualifiableElement |
|
||||
| test.c:6:5:6:13 | ... = ... | RangeSsaDefinition |
|
||||
| test.c:6:5:6:13 | ... = ... | SsaDefinition |
|
||||
| test.c:6:9:6:9 | z | AnalysedExpr |
|
||||
| test.c:6:9:6:9 | z | CompileTimeVariableExpr |
|
||||
| test.c:6:9:6:9 | z | Use |
|
||||
| test.c:6:9:6:9 | z | VariableAccess |
|
||||
| test.c:6:9:6:13 | (double)... | AnalysedExpr |
|
||||
| test.c:6:9:6:13 | (double)... | CStyleCast |
|
||||
| test.c:6:9:6:13 | (double)... | CompileTimeVariableExpr |
|
||||
| test.c:6:9:6:13 | (double)... | DefOrUse |
|
||||
| test.c:6:9:6:13 | (double)... | FloatingPointConversion |
|
||||
| test.c:6:9:6:13 | (double)... | NameQualifiableElement |
|
||||
| test.c:6:9:6:13 | ... / ... | AnalysedExpr |
|
||||
| test.c:6:9:6:13 | ... / ... | CompileTimeVariableExpr |
|
||||
| test.c:6:9:6:13 | ... / ... | DefOrUse |
|
||||
| test.c:6:9:6:13 | ... / ... | ImaginaryDivExpr |
|
||||
| test.c:6:9:6:13 | ... / ... | NameQualifiableElement |
|
||||
| test.c:6:13:6:13 | y | AnalysedExpr |
|
||||
| test.c:6:13:6:13 | y | CompileTimeVariableExpr |
|
||||
| test.c:6:13:6:13 | y | Use |
|
||||
| test.c:6:13:6:13 | y | VariableAccess |
|
||||
| test.c:7:5:7:5 | w | AnalysedExpr |
|
||||
| test.c:7:5:7:5 | w | CompileTimeVariableExpr |
|
||||
| test.c:7:5:7:5 | w | DefOrUse |
|
||||
| test.c:7:5:7:5 | w | VariableAccess |
|
||||
| test.c:7:5:7:13 | ... = ... | AnalysedExpr |
|
||||
| test.c:7:5:7:13 | ... = ... | AssignExpr |
|
||||
| test.c:7:5:7:13 | ... = ... | CompileTimeVariableExpr |
|
||||
| test.c:7:5:7:13 | ... = ... | Def |
|
||||
| test.c:7:5:7:13 | ... = ... | ExprInVoidContext |
|
||||
| test.c:7:5:7:13 | ... = ... | NameQualifiableElement |
|
||||
| test.c:7:5:7:13 | ... = ... | RangeSsaDefinition |
|
||||
| test.c:7:5:7:13 | ... = ... | SsaDefinition |
|
||||
| test.c:7:9:7:9 | z | AnalysedExpr |
|
||||
| test.c:7:9:7:9 | z | CompileTimeVariableExpr |
|
||||
| test.c:7:9:7:9 | z | Use |
|
||||
| test.c:7:9:7:9 | z | VariableAccess |
|
||||
| test.c:7:9:7:13 | ... + ... | AnalysedExpr |
|
||||
| test.c:7:9:7:13 | ... + ... | CompileTimeVariableExpr |
|
||||
| test.c:7:9:7:13 | ... + ... | DefOrUse |
|
||||
| test.c:7:9:7:13 | ... + ... | NameQualifiableElement |
|
||||
| test.c:7:9:7:13 | ... + ... | RealImaginaryAddExpr |
|
||||
| test.c:7:13:7:13 | x | AnalysedExpr |
|
||||
| test.c:7:13:7:13 | x | CompileTimeVariableExpr |
|
||||
| test.c:7:13:7:13 | x | Use |
|
||||
| test.c:7:13:7:13 | x | VariableAccess |
|
||||
| test.c:8:5:8:5 | w | AnalysedExpr |
|
||||
| test.c:8:5:8:5 | w | CompileTimeVariableExpr |
|
||||
| test.c:8:5:8:5 | w | DefOrUse |
|
||||
| test.c:8:5:8:5 | w | VariableAccess |
|
||||
| test.c:8:5:8:13 | ... = ... | AnalysedExpr |
|
||||
| test.c:8:5:8:13 | ... = ... | AssignExpr |
|
||||
| test.c:8:5:8:13 | ... = ... | CompileTimeVariableExpr |
|
||||
| test.c:8:5:8:13 | ... = ... | Def |
|
||||
| test.c:8:5:8:13 | ... = ... | ExprInVoidContext |
|
||||
| test.c:8:5:8:13 | ... = ... | NameQualifiableElement |
|
||||
| test.c:8:5:8:13 | ... = ... | RangeSsaDefinition |
|
||||
| test.c:8:5:8:13 | ... = ... | SsaDefinition |
|
||||
| test.c:8:9:8:9 | x | AnalysedExpr |
|
||||
| test.c:8:9:8:9 | x | CompileTimeVariableExpr |
|
||||
| test.c:8:9:8:9 | x | Use |
|
||||
| test.c:8:9:8:9 | x | VariableAccess |
|
||||
| test.c:8:9:8:13 | ... + ... | AnalysedExpr |
|
||||
| test.c:8:9:8:13 | ... + ... | CompileTimeVariableExpr |
|
||||
| test.c:8:9:8:13 | ... + ... | DefOrUse |
|
||||
| test.c:8:9:8:13 | ... + ... | ImaginaryRealAddExpr |
|
||||
| test.c:8:9:8:13 | ... + ... | NameQualifiableElement |
|
||||
| test.c:8:13:8:13 | z | AnalysedExpr |
|
||||
| test.c:8:13:8:13 | z | CompileTimeVariableExpr |
|
||||
| test.c:8:13:8:13 | z | Use |
|
||||
| test.c:8:13:8:13 | z | VariableAccess |
|
||||
| test.c:9:5:9:5 | w | AnalysedExpr |
|
||||
| test.c:9:5:9:5 | w | CompileTimeVariableExpr |
|
||||
| test.c:9:5:9:5 | w | DefOrUse |
|
||||
| test.c:9:5:9:5 | w | VariableAccess |
|
||||
| test.c:9:5:9:13 | ... = ... | AnalysedExpr |
|
||||
| test.c:9:5:9:13 | ... = ... | AssignExpr |
|
||||
| test.c:9:5:9:13 | ... = ... | CompileTimeVariableExpr |
|
||||
| test.c:9:5:9:13 | ... = ... | Def |
|
||||
| test.c:9:5:9:13 | ... = ... | ExprInVoidContext |
|
||||
| test.c:9:5:9:13 | ... = ... | NameQualifiableElement |
|
||||
| test.c:9:5:9:13 | ... = ... | RangeSsaDefinition |
|
||||
| test.c:9:5:9:13 | ... = ... | SsaDefinition |
|
||||
| test.c:9:9:9:9 | z | AnalysedExpr |
|
||||
| test.c:9:9:9:9 | z | CompileTimeVariableExpr |
|
||||
| test.c:9:9:9:9 | z | Use |
|
||||
| test.c:9:9:9:9 | z | VariableAccess |
|
||||
| test.c:9:9:9:13 | ... - ... | AnalysedExpr |
|
||||
| test.c:9:9:9:13 | ... - ... | CompileTimeVariableExpr |
|
||||
| test.c:9:9:9:13 | ... - ... | DefOrUse |
|
||||
| test.c:9:9:9:13 | ... - ... | NameQualifiableElement |
|
||||
| test.c:9:9:9:13 | ... - ... | RealImaginarySubExpr |
|
||||
| test.c:9:13:9:13 | x | AnalysedExpr |
|
||||
| test.c:9:13:9:13 | x | CompileTimeVariableExpr |
|
||||
| test.c:9:13:9:13 | x | Use |
|
||||
| test.c:9:13:9:13 | x | VariableAccess |
|
||||
| test.c:10:5:10:5 | w | AnalysedExpr |
|
||||
| test.c:10:5:10:5 | w | CompileTimeVariableExpr |
|
||||
| test.c:10:5:10:5 | w | DefOrUse |
|
||||
| test.c:10:5:10:5 | w | VariableAccess |
|
||||
| test.c:10:5:10:13 | ... = ... | AnalysedExpr |
|
||||
| test.c:10:5:10:13 | ... = ... | AssignExpr |
|
||||
| test.c:10:5:10:13 | ... = ... | CompileTimeVariableExpr |
|
||||
| test.c:10:5:10:13 | ... = ... | Def |
|
||||
| test.c:10:5:10:13 | ... = ... | ExprInVoidContext |
|
||||
| test.c:10:5:10:13 | ... = ... | NameQualifiableElement |
|
||||
| test.c:10:5:10:13 | ... = ... | RangeSsaDefinition |
|
||||
| test.c:10:5:10:13 | ... = ... | SsaDefinition |
|
||||
| test.c:10:9:10:9 | x | AnalysedExpr |
|
||||
| test.c:10:9:10:9 | x | CompileTimeVariableExpr |
|
||||
| test.c:10:9:10:9 | x | Use |
|
||||
| test.c:10:9:10:9 | x | VariableAccess |
|
||||
| test.c:10:9:10:13 | ... - ... | AnalysedExpr |
|
||||
| test.c:10:9:10:13 | ... - ... | CompileTimeVariableExpr |
|
||||
| test.c:10:9:10:13 | ... - ... | DefOrUse |
|
||||
| test.c:10:9:10:13 | ... - ... | ImaginaryRealSubExpr |
|
||||
| test.c:10:9:10:13 | ... - ... | NameQualifiableElement |
|
||||
| test.c:10:13:10:13 | z | AnalysedExpr |
|
||||
| test.c:10:13:10:13 | z | CompileTimeVariableExpr |
|
||||
| test.c:10:13:10:13 | z | Use |
|
||||
| test.c:10:13:10:13 | z | VariableAccess |
|
||||
|
||||
@@ -1,89 +1,89 @@
|
||||
| pass_by_ref.cpp:9:19:28:1 | SSA definition | SSA def(n) | pass_by_ref.cpp:18:12:18:12 | n |
|
||||
| pass_by_ref.cpp:9:19:28:1 | SSA definition | SSA def(n) | pass_by_ref.cpp:21:12:21:12 | n |
|
||||
| pass_by_ref.cpp:12:18:12:35 | SSA definition | SSA def(uninitializedArray) | pass_by_ref.cpp:13:20:13:37 | uninitializedArray |
|
||||
| pass_by_ref.cpp:13:20:13:37 | SSA definition | SSA def(uninitializedArray) | pass_by_ref.cpp:15:23:15:40 | uninitializedArray |
|
||||
| pass_by_ref.cpp:13:20:13:37 | SSA definition | SSA def(uninitializedArray) | pass_by_ref.cpp:16:25:16:42 | uninitializedArray |
|
||||
| pass_by_ref.cpp:13:20:13:37 | SSA definition | SSA def(uninitializedArray) | pass_by_ref.cpp:27:10:27:27 | uninitializedArray |
|
||||
| pass_by_ref.cpp:18:12:18:12 | SSA definition | SSA def(i1) | pass_by_ref.cpp:19:22:19:23 | i1 |
|
||||
| pass_by_ref.cpp:19:22:19:23 | SSA definition | SSA def(i1) | pass_by_ref.cpp:27:34:27:35 | i1 |
|
||||
| pass_by_ref.cpp:21:12:21:12 | SSA definition | SSA def(i2) | pass_by_ref.cpp:22:21:22:22 | i2 |
|
||||
| pass_by_ref.cpp:22:20:22:22 | SSA definition | SSA def(i2) | pass_by_ref.cpp:24:26:24:27 | i2 |
|
||||
| pass_by_ref.cpp:22:20:22:22 | SSA definition | SSA def(i2) | pass_by_ref.cpp:25:27:25:28 | i2 |
|
||||
| pass_by_ref.cpp:22:20:22:22 | SSA definition | SSA def(i2) | pass_by_ref.cpp:27:39:27:40 | i2 |
|
||||
| pass_by_ref.cpp:32:12:32:12 | SSA definition | SSA phi(arr) | pass_by_ref.cpp:33:20:33:22 | arr |
|
||||
| pass_by_ref.cpp:32:12:32:12 | SSA definition | SSA phi(n) | pass_by_ref.cpp:32:12:32:12 | n |
|
||||
| pass_by_ref.cpp:39:12:39:12 | SSA definition | SSA phi(arr) | pass_by_ref.cpp:40:22:40:24 | arr |
|
||||
| pass_by_ref.cpp:39:12:39:12 | SSA definition | SSA phi(n) | pass_by_ref.cpp:39:12:39:12 | n |
|
||||
| pass_by_ref.cpp:40:22:40:24 | SSA definition | SSA def(arr) | pass_by_ref.cpp:41:20:41:22 | arr |
|
||||
| pass_by_ref.cpp:45:20:55:1 | SSA definition | SSA def(n) | pass_by_ref.cpp:46:11:46:11 | n |
|
||||
| pass_by_ref.cpp:45:20:55:1 | SSA definition | SSA def(n) | pass_by_ref.cpp:48:7:48:7 | n |
|
||||
| pass_by_ref.cpp:46:11:46:11 | SSA definition | SSA def(i) | pass_by_ref.cpp:49:5:49:5 | i |
|
||||
| pass_by_ref.cpp:53:3:53:24 | SSA definition | SSA phi(i) | pass_by_ref.cpp:53:22:53:22 | i |
|
||||
| pass_by_ref.cpp:53:22:53:22 | SSA definition | SSA def(i) | pass_by_ref.cpp:54:10:54:10 | i |
|
||||
| test.c:2:31:72:1 | SSA definition | SSA def(x) | test.c:7:9:7:9 | x |
|
||||
| test.c:2:31:72:1 | SSA definition | SSA def(x) | test.c:14:9:14:9 | x |
|
||||
| test.c:2:31:72:1 | SSA definition | SSA def(x) | test.c:17:8:17:8 | x |
|
||||
| test.c:2:31:72:1 | SSA definition | SSA def(x) | test.c:26:9:26:9 | x |
|
||||
| test.c:2:31:72:1 | SSA definition | SSA def(x) | test.c:31:10:31:10 | x |
|
||||
| test.c:14:5:14:13 | SSA definition | SSA def(z) | test.c:20:16:20:16 | z |
|
||||
| test.c:14:5:14:14 | SSA definition | SSA phi(y) | test.c:14:13:14:13 | y |
|
||||
| test.c:31:5:31:10 | SSA definition | SSA def(z) | test.c:39:5:39:5 | z |
|
||||
| test.c:31:5:31:11 | SSA definition | SSA phi(z) | test.c:31:5:31:5 | z |
|
||||
| test.c:34:11:34:11 | SSA definition | SSA phi(x) | test.c:34:11:34:11 | x |
|
||||
| test.c:34:11:34:11 | SSA definition | SSA phi(x) | test.c:36:9:36:9 | x |
|
||||
| test.c:34:11:34:11 | SSA definition | SSA phi(y) | test.c:39:10:39:10 | y |
|
||||
| test.c:39:5:39:10 | SSA definition | SSA def(z) | test.c:47:5:47:5 | z |
|
||||
| test.c:42:16:42:16 | SSA definition | SSA phi(j) | test.c:42:16:42:16 | j |
|
||||
| test.c:42:16:42:16 | SSA definition | SSA phi(j) | test.c:42:24:42:24 | j |
|
||||
| test.c:42:16:42:16 | SSA definition | SSA phi(w) | test.c:47:10:47:10 | w |
|
||||
| test.c:47:5:47:10 | SSA definition | SSA def(z) | test.c:52:12:52:12 | z |
|
||||
| test.c:47:5:47:10 | SSA definition | SSA def(z) | test.c:66:5:66:5 | z |
|
||||
| test.c:50:16:50:16 | SSA definition | SSA phi(j) | test.c:50:16:50:16 | j |
|
||||
| test.c:50:16:50:16 | SSA definition | SSA phi(j) | test.c:50:24:50:24 | j |
|
||||
| test.c:50:16:50:16 | SSA definition | SSA phi(x) | test.c:66:10:66:10 | x |
|
||||
| test.c:51:9:51:14 | SSA definition | SSA def(y) | test.c:53:16:53:16 | y |
|
||||
| test.c:64:5:64:5 | SSA definition | SSA phi(w) | test.c:66:18:66:18 | w |
|
||||
| test.c:64:5:64:5 | SSA definition | SSA phi(y) | test.c:66:14:66:14 | y |
|
||||
| test.c:70:5:70:10 | SSA definition | SSA def(w) | test.c:71:12:71:12 | w |
|
||||
| test.c:74:19:89:1 | SSA definition | SSA def(a) | test.c:79:13:79:13 | a |
|
||||
| test.c:74:19:89:1 | SSA definition | SSA def(a) | test.c:83:13:83:13 | a |
|
||||
| test.c:74:19:89:1 | SSA definition | SSA def(a) | test.c:85:13:85:13 | a |
|
||||
| test.c:80:13:80:18 | SSA definition | SSA def(c) | test.c:81:17:81:17 | c |
|
||||
| test.c:83:9:84:18 | SSA definition | SSA phi(b) | test.c:88:12:88:12 | b |
|
||||
| test.c:83:9:84:18 | SSA definition | SSA phi(c) | test.c:86:20:86:20 | c |
|
||||
| test.c:91:33:97:1 | SSA definition | SSA def(cond) | test.c:93:9:93:12 | cond |
|
||||
| test.c:96:5:96:11 | SSA definition | SSA phi(x) | test.c:96:9:96:9 | x |
|
||||
| test.cpp:2:19:17:1 | SSA definition | SSA def(p) | test.cpp:3:11:3:11 | p |
|
||||
| test.cpp:2:19:17:1 | SSA definition | SSA def(p) | test.cpp:5:13:5:13 | p |
|
||||
| test.cpp:5:13:5:13 | SSA definition | SSA def(r0) | test.cpp:16:10:16:11 | r0 |
|
||||
| test.cpp:6:13:6:13 | SSA definition | SSA def(r1) | test.cpp:7:13:7:14 | r1 |
|
||||
| test.cpp:6:13:6:13 | SSA definition | SSA def(r1) | test.cpp:13:7:13:8 | r1 |
|
||||
| test.cpp:6:13:6:13 | SSA definition | SSA def(r1) | test.cpp:16:15:16:16 | r1 |
|
||||
| test.cpp:7:13:7:14 | SSA definition | SSA def(r2) | test.cpp:8:13:8:14 | r2 |
|
||||
| test.cpp:7:13:7:14 | SSA definition | SSA def(r2) | test.cpp:10:5:10:6 | r2 |
|
||||
| test.cpp:7:13:7:14 | SSA definition | SSA def(r2) | test.cpp:16:20:16:21 | r2 |
|
||||
| test.cpp:8:12:8:14 | SSA definition | SSA def(q) | test.cpp:11:6:11:6 | q |
|
||||
| test.cpp:8:12:8:14 | SSA definition | SSA def(q) | test.cpp:11:11:11:11 | q |
|
||||
| test.cpp:8:12:8:14 | SSA definition | SSA def(q) | test.cpp:16:26:16:26 | q |
|
||||
| test.cpp:9:19:9:19 | SSA definition | SSA phi(i) | test.cpp:9:19:9:19 | i |
|
||||
| test.cpp:9:19:9:19 | SSA definition | SSA phi(i) | test.cpp:9:27:9:27 | i |
|
||||
| test.cpp:9:19:9:19 | SSA definition | SSA phi(i) | test.cpp:12:9:12:9 | i |
|
||||
| test.cpp:19:27:21:1 | SSA definition | SSA def(x) | test.cpp:20:3:20:3 | x |
|
||||
| test.cpp:23:27:25:1 | SSA definition | SSA def(x) | test.cpp:24:5:24:5 | x |
|
||||
| test.cpp:33:10:33:11 | SSA definition | SSA def(x) | test.cpp:35:19:35:19 | x |
|
||||
| test.cpp:33:10:33:11 | SSA definition | SSA def(x) | test.cpp:36:19:36:19 | x |
|
||||
| test.cpp:33:10:33:11 | SSA definition | SSA def(x) | test.cpp:37:22:37:22 | x |
|
||||
| test.cpp:33:10:33:11 | SSA definition | SSA def(x) | test.cpp:41:16:41:16 | x |
|
||||
| test.cpp:34:10:34:11 | SSA definition | SSA def(y) | test.cpp:38:20:38:20 | y |
|
||||
| test.cpp:34:10:34:11 | SSA definition | SSA def(y) | test.cpp:39:20:39:20 | y |
|
||||
| test.cpp:34:10:34:11 | SSA definition | SSA def(y) | test.cpp:40:23:40:23 | y |
|
||||
| test.cpp:35:19:35:19 | SSA definition | SSA def(r1) | test.cpp:43:14:43:15 | r1 |
|
||||
| test.cpp:36:19:36:19 | SSA definition | SSA def(r2) | test.cpp:43:19:43:20 | r2 |
|
||||
| test.cpp:37:22:37:22 | SSA definition | SSA def(r3) | test.cpp:43:24:43:25 | r3 |
|
||||
| test.cpp:38:19:38:20 | SSA definition | SSA def(p1) | test.cpp:43:30:43:31 | p1 |
|
||||
| test.cpp:39:19:39:20 | SSA definition | SSA def(p2) | test.cpp:43:36:43:37 | p2 |
|
||||
| test.cpp:40:22:40:23 | SSA definition | SSA def(p3) | test.cpp:43:42:43:43 | p3 |
|
||||
| test.cpp:41:16:41:16 | SSA definition | SSA def(x) | test.cpp:42:17:42:17 | x |
|
||||
| test.cpp:42:16:42:17 | SSA definition | SSA def(x) | test.cpp:43:10:43:10 | x |
|
||||
| test.cpp:47:10:47:11 | SSA definition | SSA def(x) | test.cpp:48:27:48:27 | x |
|
||||
| test.cpp:47:10:47:11 | SSA definition | SSA def(x) | test.cpp:49:10:49:10 | x |
|
||||
| pass_by_ref.cpp:9:19:28:1 | { ... } | SSA def(n) | pass_by_ref.cpp:18:12:18:12 | n |
|
||||
| pass_by_ref.cpp:9:19:28:1 | { ... } | SSA def(n) | pass_by_ref.cpp:21:12:21:12 | n |
|
||||
| pass_by_ref.cpp:12:18:12:35 | uninitializedArray | SSA def(uninitializedArray) | pass_by_ref.cpp:13:20:13:37 | uninitializedArray |
|
||||
| pass_by_ref.cpp:13:20:13:37 | uninitializedArray | SSA def(uninitializedArray) | pass_by_ref.cpp:15:23:15:40 | uninitializedArray |
|
||||
| pass_by_ref.cpp:13:20:13:37 | uninitializedArray | SSA def(uninitializedArray) | pass_by_ref.cpp:16:25:16:42 | uninitializedArray |
|
||||
| pass_by_ref.cpp:13:20:13:37 | uninitializedArray | SSA def(uninitializedArray) | pass_by_ref.cpp:27:10:27:27 | uninitializedArray |
|
||||
| pass_by_ref.cpp:18:12:18:12 | n | SSA def(i1) | pass_by_ref.cpp:19:22:19:23 | i1 |
|
||||
| pass_by_ref.cpp:19:22:19:23 | i1 | SSA def(i1) | pass_by_ref.cpp:27:34:27:35 | i1 |
|
||||
| pass_by_ref.cpp:21:12:21:12 | n | SSA def(i2) | pass_by_ref.cpp:22:21:22:22 | i2 |
|
||||
| pass_by_ref.cpp:22:20:22:22 | & ... | SSA def(i2) | pass_by_ref.cpp:24:26:24:27 | i2 |
|
||||
| pass_by_ref.cpp:22:20:22:22 | & ... | SSA def(i2) | pass_by_ref.cpp:25:27:25:28 | i2 |
|
||||
| pass_by_ref.cpp:22:20:22:22 | & ... | SSA def(i2) | pass_by_ref.cpp:27:39:27:40 | i2 |
|
||||
| pass_by_ref.cpp:32:12:32:12 | n | SSA phi(arr) | pass_by_ref.cpp:33:20:33:22 | arr |
|
||||
| pass_by_ref.cpp:32:12:32:12 | n | SSA phi(n) | pass_by_ref.cpp:32:12:32:12 | n |
|
||||
| pass_by_ref.cpp:39:12:39:12 | n | SSA phi(arr) | pass_by_ref.cpp:40:22:40:24 | arr |
|
||||
| pass_by_ref.cpp:39:12:39:12 | n | SSA phi(n) | pass_by_ref.cpp:39:12:39:12 | n |
|
||||
| pass_by_ref.cpp:40:22:40:24 | arr | SSA def(arr) | pass_by_ref.cpp:41:20:41:22 | arr |
|
||||
| pass_by_ref.cpp:45:20:55:1 | { ... } | SSA def(n) | pass_by_ref.cpp:46:11:46:11 | n |
|
||||
| pass_by_ref.cpp:45:20:55:1 | { ... } | SSA def(n) | pass_by_ref.cpp:48:7:48:7 | n |
|
||||
| pass_by_ref.cpp:46:11:46:11 | n | SSA def(i) | pass_by_ref.cpp:49:5:49:5 | i |
|
||||
| pass_by_ref.cpp:53:3:53:24 | ExprStmt | SSA phi(i) | pass_by_ref.cpp:53:22:53:22 | i |
|
||||
| pass_by_ref.cpp:53:22:53:22 | i | SSA def(i) | pass_by_ref.cpp:54:10:54:10 | i |
|
||||
| test.c:2:31:72:1 | { ... } | SSA def(x) | test.c:7:9:7:9 | x |
|
||||
| test.c:2:31:72:1 | { ... } | SSA def(x) | test.c:14:9:14:9 | x |
|
||||
| test.c:2:31:72:1 | { ... } | SSA def(x) | test.c:17:8:17:8 | x |
|
||||
| test.c:2:31:72:1 | { ... } | SSA def(x) | test.c:26:9:26:9 | x |
|
||||
| test.c:2:31:72:1 | { ... } | SSA def(x) | test.c:31:10:31:10 | x |
|
||||
| test.c:14:5:14:13 | ... = ... | SSA def(z) | test.c:20:16:20:16 | z |
|
||||
| test.c:14:5:14:14 | ExprStmt | SSA phi(y) | test.c:14:13:14:13 | y |
|
||||
| test.c:31:5:31:10 | ... += ... | SSA def(z) | test.c:39:5:39:5 | z |
|
||||
| test.c:31:5:31:11 | ExprStmt | SSA phi(z) | test.c:31:5:31:5 | z |
|
||||
| test.c:34:11:34:11 | x | SSA phi(x) | test.c:34:11:34:11 | x |
|
||||
| test.c:34:11:34:11 | x | SSA phi(x) | test.c:36:9:36:9 | x |
|
||||
| test.c:34:11:34:11 | x | SSA phi(y) | test.c:39:10:39:10 | y |
|
||||
| test.c:39:5:39:10 | ... += ... | SSA def(z) | test.c:47:5:47:5 | z |
|
||||
| test.c:42:16:42:16 | j | SSA phi(j) | test.c:42:16:42:16 | j |
|
||||
| test.c:42:16:42:16 | j | SSA phi(j) | test.c:42:24:42:24 | j |
|
||||
| test.c:42:16:42:16 | j | SSA phi(w) | test.c:47:10:47:10 | w |
|
||||
| test.c:47:5:47:10 | ... += ... | SSA def(z) | test.c:52:12:52:12 | z |
|
||||
| test.c:47:5:47:10 | ... += ... | SSA def(z) | test.c:66:5:66:5 | z |
|
||||
| test.c:50:16:50:16 | j | SSA phi(j) | test.c:50:16:50:16 | j |
|
||||
| test.c:50:16:50:16 | j | SSA phi(j) | test.c:50:24:50:24 | j |
|
||||
| test.c:50:16:50:16 | j | SSA phi(x) | test.c:66:10:66:10 | x |
|
||||
| test.c:51:9:51:14 | ... = ... | SSA def(y) | test.c:53:16:53:16 | y |
|
||||
| test.c:64:5:64:5 | label ...: | SSA phi(w) | test.c:66:18:66:18 | w |
|
||||
| test.c:64:5:64:5 | label ...: | SSA phi(y) | test.c:66:14:66:14 | y |
|
||||
| test.c:70:5:70:10 | ... = ... | SSA def(w) | test.c:71:12:71:12 | w |
|
||||
| test.c:74:19:89:1 | { ... } | SSA def(a) | test.c:79:13:79:13 | a |
|
||||
| test.c:74:19:89:1 | { ... } | SSA def(a) | test.c:83:13:83:13 | a |
|
||||
| test.c:74:19:89:1 | { ... } | SSA def(a) | test.c:85:13:85:13 | a |
|
||||
| test.c:80:13:80:18 | ... = ... | SSA def(c) | test.c:81:17:81:17 | c |
|
||||
| test.c:83:9:84:18 | if (...) ... | SSA phi(b) | test.c:88:12:88:12 | b |
|
||||
| test.c:83:9:84:18 | if (...) ... | SSA phi(c) | test.c:86:20:86:20 | c |
|
||||
| test.c:91:33:97:1 | { ... } | SSA def(cond) | test.c:93:9:93:12 | cond |
|
||||
| test.c:96:5:96:11 | ExprStmt | SSA phi(x) | test.c:96:9:96:9 | x |
|
||||
| test.cpp:2:19:17:1 | { ... } | SSA def(p) | test.cpp:3:11:3:11 | p |
|
||||
| test.cpp:2:19:17:1 | { ... } | SSA def(p) | test.cpp:5:13:5:13 | p |
|
||||
| test.cpp:5:13:5:13 | p | SSA def(r0) | test.cpp:16:10:16:11 | r0 |
|
||||
| test.cpp:6:13:6:13 | x | SSA def(r1) | test.cpp:7:13:7:14 | r1 |
|
||||
| test.cpp:6:13:6:13 | x | SSA def(r1) | test.cpp:13:7:13:8 | r1 |
|
||||
| test.cpp:6:13:6:13 | x | SSA def(r1) | test.cpp:16:15:16:16 | r1 |
|
||||
| test.cpp:7:13:7:14 | r1 | SSA def(r2) | test.cpp:8:13:8:14 | r2 |
|
||||
| test.cpp:7:13:7:14 | r1 | SSA def(r2) | test.cpp:10:5:10:6 | r2 |
|
||||
| test.cpp:7:13:7:14 | r1 | SSA def(r2) | test.cpp:16:20:16:21 | r2 |
|
||||
| test.cpp:8:12:8:14 | & ... | SSA def(q) | test.cpp:11:6:11:6 | q |
|
||||
| test.cpp:8:12:8:14 | & ... | SSA def(q) | test.cpp:11:11:11:11 | q |
|
||||
| test.cpp:8:12:8:14 | & ... | SSA def(q) | test.cpp:16:26:16:26 | q |
|
||||
| test.cpp:9:19:9:19 | i | SSA phi(i) | test.cpp:9:19:9:19 | i |
|
||||
| test.cpp:9:19:9:19 | i | SSA phi(i) | test.cpp:9:27:9:27 | i |
|
||||
| test.cpp:9:19:9:19 | i | SSA phi(i) | test.cpp:12:9:12:9 | i |
|
||||
| test.cpp:19:27:21:1 | { ... } | SSA def(x) | test.cpp:20:3:20:3 | x |
|
||||
| test.cpp:23:27:25:1 | { ... } | SSA def(x) | test.cpp:24:5:24:5 | x |
|
||||
| test.cpp:33:10:33:11 | 1 | SSA def(x) | test.cpp:35:19:35:19 | x |
|
||||
| test.cpp:33:10:33:11 | 1 | SSA def(x) | test.cpp:36:19:36:19 | x |
|
||||
| test.cpp:33:10:33:11 | 1 | SSA def(x) | test.cpp:37:22:37:22 | x |
|
||||
| test.cpp:33:10:33:11 | 1 | SSA def(x) | test.cpp:41:16:41:16 | x |
|
||||
| test.cpp:34:10:34:11 | 2 | SSA def(y) | test.cpp:38:20:38:20 | y |
|
||||
| test.cpp:34:10:34:11 | 2 | SSA def(y) | test.cpp:39:20:39:20 | y |
|
||||
| test.cpp:34:10:34:11 | 2 | SSA def(y) | test.cpp:40:23:40:23 | y |
|
||||
| test.cpp:35:19:35:19 | x | SSA def(r1) | test.cpp:43:14:43:15 | r1 |
|
||||
| test.cpp:36:19:36:19 | x | SSA def(r2) | test.cpp:43:19:43:20 | r2 |
|
||||
| test.cpp:37:22:37:22 | x | SSA def(r3) | test.cpp:43:24:43:25 | r3 |
|
||||
| test.cpp:38:19:38:20 | & ... | SSA def(p1) | test.cpp:43:30:43:31 | p1 |
|
||||
| test.cpp:39:19:39:20 | & ... | SSA def(p2) | test.cpp:43:36:43:37 | p2 |
|
||||
| test.cpp:40:22:40:23 | & ... | SSA def(p3) | test.cpp:43:42:43:43 | p3 |
|
||||
| test.cpp:41:16:41:16 | x | SSA def(x) | test.cpp:42:17:42:17 | x |
|
||||
| test.cpp:42:16:42:17 | & ... | SSA def(x) | test.cpp:43:10:43:10 | x |
|
||||
| test.cpp:47:10:47:11 | 1 | SSA def(x) | test.cpp:48:27:48:27 | x |
|
||||
| test.cpp:47:10:47:11 | 1 | SSA def(x) | test.cpp:49:10:49:10 | x |
|
||||
|
||||
@@ -1,22 +1,22 @@
|
||||
| pass_by_ref.cpp:9:19:28:1 | SSA definition | pass_by_ref.cpp:9:16:9:16 | n |
|
||||
| pass_by_ref.cpp:30:18:34:1 | SSA definition | pass_by_ref.cpp:30:15:30:15 | n |
|
||||
| pass_by_ref.cpp:36:19:43:1 | SSA definition | pass_by_ref.cpp:36:16:36:16 | n |
|
||||
| pass_by_ref.cpp:45:20:55:1 | SSA definition | pass_by_ref.cpp:45:17:45:17 | n |
|
||||
| test.c:2:31:72:1 | SSA definition | test.c:2:14:2:14 | x |
|
||||
| test.c:2:31:72:1 | SSA definition | test.c:2:21:2:21 | w |
|
||||
| test.c:2:31:72:1 | SSA definition | test.c:2:28:2:28 | z |
|
||||
| test.c:74:19:89:1 | SSA definition | test.c:74:16:74:16 | a |
|
||||
| test.c:91:33:97:1 | SSA definition | test.c:91:27:91:30 | cond |
|
||||
| test.cpp:2:19:17:1 | SSA definition | test.cpp:2:16:2:16 | p |
|
||||
| test.cpp:19:27:21:1 | SSA definition | test.cpp:19:24:19:24 | x |
|
||||
| test.cpp:23:27:25:1 | SSA definition | test.cpp:23:24:23:24 | x |
|
||||
| test.cpp:93:3:93:4 | SSA definition | test.cpp:72:12:72:16 | nextp |
|
||||
| test.cpp:93:3:93:4 | SSA definition | test.cpp:73:12:73:16 | nextr |
|
||||
| test.cpp:93:3:93:4 | SSA definition | test.cpp:74:18:74:23 | nextcp |
|
||||
| test.cpp:93:3:93:4 | SSA definition | test.cpp:75:18:75:23 | nextcr |
|
||||
| test.cpp:93:3:93:4 | SSA definition | test.cpp:76:9:76:9 | i |
|
||||
| test.cpp:93:3:93:4 | SSA definition | test.cpp:77:10:77:11 | ip |
|
||||
| test.cpp:93:3:93:4 | SSA definition | test.cpp:78:10:78:11 | ir |
|
||||
| test.cpp:93:3:93:4 | SSA definition | test.cpp:79:15:79:16 | ci |
|
||||
| test.cpp:93:3:93:4 | SSA definition | test.cpp:80:16:80:18 | cip |
|
||||
| test.cpp:93:3:93:4 | SSA definition | test.cpp:81:16:81:18 | cir |
|
||||
| pass_by_ref.cpp:9:19:28:1 | { ... } | pass_by_ref.cpp:9:16:9:16 | n |
|
||||
| pass_by_ref.cpp:30:18:34:1 | { ... } | pass_by_ref.cpp:30:15:30:15 | n |
|
||||
| pass_by_ref.cpp:36:19:43:1 | { ... } | pass_by_ref.cpp:36:16:36:16 | n |
|
||||
| pass_by_ref.cpp:45:20:55:1 | { ... } | pass_by_ref.cpp:45:17:45:17 | n |
|
||||
| test.c:2:31:72:1 | { ... } | test.c:2:14:2:14 | x |
|
||||
| test.c:2:31:72:1 | { ... } | test.c:2:21:2:21 | w |
|
||||
| test.c:2:31:72:1 | { ... } | test.c:2:28:2:28 | z |
|
||||
| test.c:74:19:89:1 | { ... } | test.c:74:16:74:16 | a |
|
||||
| test.c:91:33:97:1 | { ... } | test.c:91:27:91:30 | cond |
|
||||
| test.cpp:2:19:17:1 | { ... } | test.cpp:2:16:2:16 | p |
|
||||
| test.cpp:19:27:21:1 | { ... } | test.cpp:19:24:19:24 | x |
|
||||
| test.cpp:23:27:25:1 | { ... } | test.cpp:23:24:23:24 | x |
|
||||
| test.cpp:93:3:93:4 | { ... } | test.cpp:72:12:72:16 | nextp |
|
||||
| test.cpp:93:3:93:4 | { ... } | test.cpp:73:12:73:16 | nextr |
|
||||
| test.cpp:93:3:93:4 | { ... } | test.cpp:74:18:74:23 | nextcp |
|
||||
| test.cpp:93:3:93:4 | { ... } | test.cpp:75:18:75:23 | nextcr |
|
||||
| test.cpp:93:3:93:4 | { ... } | test.cpp:76:9:76:9 | i |
|
||||
| test.cpp:93:3:93:4 | { ... } | test.cpp:77:10:77:11 | ip |
|
||||
| test.cpp:93:3:93:4 | { ... } | test.cpp:78:10:78:11 | ir |
|
||||
| test.cpp:93:3:93:4 | { ... } | test.cpp:79:15:79:16 | ci |
|
||||
| test.cpp:93:3:93:4 | { ... } | test.cpp:80:16:80:18 | cip |
|
||||
| test.cpp:93:3:93:4 | { ... } | test.cpp:81:16:81:18 | cir |
|
||||
|
||||
@@ -1,56 +1,56 @@
|
||||
| test.c:2:31:72:1 | SSA definition | test.c:2:14:2:14 | x | < | test.c:7:13:7:13 | 0 | 10 | 11 |
|
||||
| test.c:2:31:72:1 | SSA definition | test.c:2:14:2:14 | x | < | test.c:17:12:17:12 | 0 | 18 | 26 |
|
||||
| test.c:2:31:72:1 | SSA definition | test.c:2:14:2:14 | x | < | test.c:17:12:17:12 | 0 | 26 | 28 |
|
||||
| test.c:2:31:72:1 | SSA definition | test.c:2:14:2:14 | x | < | test.c:17:12:17:12 | 0 | 31 | 37 |
|
||||
| test.c:2:31:72:1 | SSA definition | test.c:2:14:2:14 | x | < | test.c:17:12:17:12 | 0 | 34 | 34 |
|
||||
| test.c:2:31:72:1 | SSA definition | test.c:2:14:2:14 | x | < | test.c:17:12:17:12 | 0 | 34 | 36 |
|
||||
| test.c:2:31:72:1 | SSA definition | test.c:2:14:2:14 | x | < | test.c:17:12:17:12 | 0 | 39 | 42 |
|
||||
| test.c:2:31:72:1 | SSA definition | test.c:2:14:2:14 | x | < | test.c:17:12:17:12 | 0 | 42 | 42 |
|
||||
| test.c:2:31:72:1 | SSA definition | test.c:2:14:2:14 | x | < | test.c:17:12:17:12 | 0 | 47 | 50 |
|
||||
| test.c:2:31:72:1 | SSA definition | test.c:2:14:2:14 | x | < | test.c:17:12:17:12 | 0 | 50 | 50 |
|
||||
| test.c:2:31:72:1 | SSA definition | test.c:2:14:2:14 | x | < | test.c:17:12:17:12 | 0 | 50 | 52 |
|
||||
| test.c:2:31:72:1 | SSA definition | test.c:2:14:2:14 | x | < | test.c:17:12:17:12 | 0 | 53 | 53 |
|
||||
| test.c:2:31:72:1 | SSA definition | test.c:2:14:2:14 | x | < | test.c:17:12:17:12 | 0 | 53 | 55 |
|
||||
| test.c:2:31:72:1 | SSA definition | test.c:2:14:2:14 | x | < | test.c:17:12:17:12 | 0 | 56 | 63 |
|
||||
| test.c:2:31:72:1 | SSA definition | test.c:2:14:2:14 | x | < | test.c:17:12:17:12 | 0 | 59 | 61 |
|
||||
| test.c:2:31:72:1 | SSA definition | test.c:2:14:2:14 | x | < | test.c:17:12:17:12 | 0 | 64 | 71 |
|
||||
| test.c:2:31:72:1 | SSA definition | test.c:2:14:2:14 | x | > | test.c:7:13:7:13 | 0 | 7 | 9 |
|
||||
| test.c:2:31:72:1 | SSA definition | test.c:2:14:2:14 | x | > | test.c:17:12:17:12 | 0 | 20 | 20 |
|
||||
| test.c:34:11:34:11 | SSA definition | test.c:2:14:2:14 | x | < | test.c:34:15:34:15 | 0 | 39 | 42 |
|
||||
| test.c:34:11:34:11 | SSA definition | test.c:2:14:2:14 | x | < | test.c:34:15:34:15 | 0 | 42 | 42 |
|
||||
| test.c:34:11:34:11 | SSA definition | test.c:2:14:2:14 | x | < | test.c:34:15:34:15 | 0 | 47 | 50 |
|
||||
| test.c:34:11:34:11 | SSA definition | test.c:2:14:2:14 | x | < | test.c:34:15:34:15 | 0 | 50 | 50 |
|
||||
| test.c:34:11:34:11 | SSA definition | test.c:2:14:2:14 | x | < | test.c:34:15:34:15 | 0 | 50 | 52 |
|
||||
| test.c:34:11:34:11 | SSA definition | test.c:2:14:2:14 | x | < | test.c:34:15:34:15 | 0 | 53 | 53 |
|
||||
| test.c:34:11:34:11 | SSA definition | test.c:2:14:2:14 | x | < | test.c:34:15:34:15 | 0 | 53 | 55 |
|
||||
| test.c:34:11:34:11 | SSA definition | test.c:2:14:2:14 | x | < | test.c:34:15:34:15 | 0 | 56 | 63 |
|
||||
| test.c:34:11:34:11 | SSA definition | test.c:2:14:2:14 | x | < | test.c:34:15:34:15 | 0 | 59 | 61 |
|
||||
| test.c:34:11:34:11 | SSA definition | test.c:2:14:2:14 | x | < | test.c:34:15:34:15 | 0 | 64 | 71 |
|
||||
| test.c:34:11:34:11 | SSA definition | test.c:2:14:2:14 | x | > | test.c:34:15:34:15 | 0 | 34 | 36 |
|
||||
| test.c:42:16:42:16 | SSA definition | test.c:3:9:3:9 | j | < | test.c:42:20:42:21 | 10 | 42 | 42 |
|
||||
| test.c:42:16:42:16 | SSA definition | test.c:3:9:3:9 | j | > | test.c:42:20:42:21 | 10 | 47 | 50 |
|
||||
| test.c:42:16:42:16 | SSA definition | test.c:3:9:3:9 | j | > | test.c:42:20:42:21 | 10 | 50 | 50 |
|
||||
| test.c:42:16:42:16 | SSA definition | test.c:3:9:3:9 | j | > | test.c:42:20:42:21 | 10 | 50 | 52 |
|
||||
| test.c:42:16:42:16 | SSA definition | test.c:3:9:3:9 | j | > | test.c:42:20:42:21 | 10 | 53 | 53 |
|
||||
| test.c:42:16:42:16 | SSA definition | test.c:3:9:3:9 | j | > | test.c:42:20:42:21 | 10 | 53 | 55 |
|
||||
| test.c:42:16:42:16 | SSA definition | test.c:3:9:3:9 | j | > | test.c:42:20:42:21 | 10 | 56 | 63 |
|
||||
| test.c:42:16:42:16 | SSA definition | test.c:3:9:3:9 | j | > | test.c:42:20:42:21 | 10 | 59 | 61 |
|
||||
| test.c:42:16:42:16 | SSA definition | test.c:3:9:3:9 | j | > | test.c:42:20:42:21 | 10 | 64 | 71 |
|
||||
| test.c:47:5:47:10 | SSA definition | test.c:2:28:2:28 | z | < | test.c:52:16:52:16 | 0 | 59 | 61 |
|
||||
| test.c:47:5:47:10 | SSA definition | test.c:2:28:2:28 | z | > | test.c:52:16:52:16 | 0 | 53 | 53 |
|
||||
| test.c:47:5:47:10 | SSA definition | test.c:2:28:2:28 | z | > | test.c:52:16:52:16 | 0 | 53 | 55 |
|
||||
| test.c:47:5:47:10 | SSA definition | test.c:2:28:2:28 | z | > | test.c:52:16:52:16 | 0 | 56 | 63 |
|
||||
| test.c:50:16:50:16 | SSA definition | test.c:3:9:3:9 | j | < | test.c:50:20:50:21 | 10 | 50 | 50 |
|
||||
| test.c:50:16:50:16 | SSA definition | test.c:3:9:3:9 | j | < | test.c:50:20:50:21 | 10 | 50 | 52 |
|
||||
| test.c:50:16:50:16 | SSA definition | test.c:3:9:3:9 | j | < | test.c:50:20:50:21 | 10 | 53 | 53 |
|
||||
| test.c:50:16:50:16 | SSA definition | test.c:3:9:3:9 | j | < | test.c:50:20:50:21 | 10 | 53 | 55 |
|
||||
| test.c:50:16:50:16 | SSA definition | test.c:3:9:3:9 | j | < | test.c:50:20:50:21 | 10 | 56 | 63 |
|
||||
| test.c:50:16:50:16 | SSA definition | test.c:3:9:3:9 | j | < | test.c:50:20:50:21 | 10 | 59 | 61 |
|
||||
| test.c:51:9:51:14 | SSA definition | test.c:4:10:4:10 | y | < | test.c:53:20:53:20 | 0 | 56 | 63 |
|
||||
| test.c:51:9:51:14 | SSA definition | test.c:4:10:4:10 | y | > | test.c:53:20:53:20 | 0 | 53 | 55 |
|
||||
| test.c:74:19:89:1 | SSA definition | test.c:74:16:74:16 | a | > | test.c:79:17:79:19 | 100 | 79 | 81 |
|
||||
| test.cpp:9:19:9:19 | SSA definition | test.cpp:9:12:9:12 | i | < | test.cpp:9:23:9:24 | 10 | 9 | 9 |
|
||||
| test.cpp:9:19:9:19 | SSA definition | test.cpp:9:12:9:12 | i | < | test.cpp:9:23:9:24 | 10 | 9 | 12 |
|
||||
| test.cpp:9:19:9:19 | SSA definition | test.cpp:9:12:9:12 | i | < | test.cpp:9:23:9:24 | 10 | 12 | 13 |
|
||||
| test.cpp:9:19:9:19 | SSA definition | test.cpp:9:12:9:12 | i | > | test.cpp:9:23:9:24 | 10 | 16 | 2 |
|
||||
| test.cpp:9:19:9:19 | SSA definition | test.cpp:9:12:9:12 | i | > | test.cpp:12:13:12:13 | 5 | 12 | 13 |
|
||||
| test.c:2:31:72:1 | { ... } | test.c:2:14:2:14 | x | < | test.c:7:13:7:13 | 0 | 10 | 11 |
|
||||
| test.c:2:31:72:1 | { ... } | test.c:2:14:2:14 | x | < | test.c:17:12:17:12 | 0 | 18 | 26 |
|
||||
| test.c:2:31:72:1 | { ... } | test.c:2:14:2:14 | x | < | test.c:17:12:17:12 | 0 | 26 | 28 |
|
||||
| test.c:2:31:72:1 | { ... } | test.c:2:14:2:14 | x | < | test.c:17:12:17:12 | 0 | 31 | 37 |
|
||||
| test.c:2:31:72:1 | { ... } | test.c:2:14:2:14 | x | < | test.c:17:12:17:12 | 0 | 34 | 34 |
|
||||
| test.c:2:31:72:1 | { ... } | test.c:2:14:2:14 | x | < | test.c:17:12:17:12 | 0 | 34 | 36 |
|
||||
| test.c:2:31:72:1 | { ... } | test.c:2:14:2:14 | x | < | test.c:17:12:17:12 | 0 | 39 | 42 |
|
||||
| test.c:2:31:72:1 | { ... } | test.c:2:14:2:14 | x | < | test.c:17:12:17:12 | 0 | 42 | 42 |
|
||||
| test.c:2:31:72:1 | { ... } | test.c:2:14:2:14 | x | < | test.c:17:12:17:12 | 0 | 47 | 50 |
|
||||
| test.c:2:31:72:1 | { ... } | test.c:2:14:2:14 | x | < | test.c:17:12:17:12 | 0 | 50 | 50 |
|
||||
| test.c:2:31:72:1 | { ... } | test.c:2:14:2:14 | x | < | test.c:17:12:17:12 | 0 | 50 | 52 |
|
||||
| test.c:2:31:72:1 | { ... } | test.c:2:14:2:14 | x | < | test.c:17:12:17:12 | 0 | 53 | 53 |
|
||||
| test.c:2:31:72:1 | { ... } | test.c:2:14:2:14 | x | < | test.c:17:12:17:12 | 0 | 53 | 55 |
|
||||
| test.c:2:31:72:1 | { ... } | test.c:2:14:2:14 | x | < | test.c:17:12:17:12 | 0 | 56 | 63 |
|
||||
| test.c:2:31:72:1 | { ... } | test.c:2:14:2:14 | x | < | test.c:17:12:17:12 | 0 | 59 | 61 |
|
||||
| test.c:2:31:72:1 | { ... } | test.c:2:14:2:14 | x | < | test.c:17:12:17:12 | 0 | 64 | 71 |
|
||||
| test.c:2:31:72:1 | { ... } | test.c:2:14:2:14 | x | > | test.c:7:13:7:13 | 0 | 7 | 9 |
|
||||
| test.c:2:31:72:1 | { ... } | test.c:2:14:2:14 | x | > | test.c:17:12:17:12 | 0 | 20 | 20 |
|
||||
| test.c:34:11:34:11 | x | test.c:2:14:2:14 | x | < | test.c:34:15:34:15 | 0 | 39 | 42 |
|
||||
| test.c:34:11:34:11 | x | test.c:2:14:2:14 | x | < | test.c:34:15:34:15 | 0 | 42 | 42 |
|
||||
| test.c:34:11:34:11 | x | test.c:2:14:2:14 | x | < | test.c:34:15:34:15 | 0 | 47 | 50 |
|
||||
| test.c:34:11:34:11 | x | test.c:2:14:2:14 | x | < | test.c:34:15:34:15 | 0 | 50 | 50 |
|
||||
| test.c:34:11:34:11 | x | test.c:2:14:2:14 | x | < | test.c:34:15:34:15 | 0 | 50 | 52 |
|
||||
| test.c:34:11:34:11 | x | test.c:2:14:2:14 | x | < | test.c:34:15:34:15 | 0 | 53 | 53 |
|
||||
| test.c:34:11:34:11 | x | test.c:2:14:2:14 | x | < | test.c:34:15:34:15 | 0 | 53 | 55 |
|
||||
| test.c:34:11:34:11 | x | test.c:2:14:2:14 | x | < | test.c:34:15:34:15 | 0 | 56 | 63 |
|
||||
| test.c:34:11:34:11 | x | test.c:2:14:2:14 | x | < | test.c:34:15:34:15 | 0 | 59 | 61 |
|
||||
| test.c:34:11:34:11 | x | test.c:2:14:2:14 | x | < | test.c:34:15:34:15 | 0 | 64 | 71 |
|
||||
| test.c:34:11:34:11 | x | test.c:2:14:2:14 | x | > | test.c:34:15:34:15 | 0 | 34 | 36 |
|
||||
| test.c:42:16:42:16 | j | test.c:3:9:3:9 | j | < | test.c:42:20:42:21 | 10 | 42 | 42 |
|
||||
| test.c:42:16:42:16 | j | test.c:3:9:3:9 | j | > | test.c:42:20:42:21 | 10 | 47 | 50 |
|
||||
| test.c:42:16:42:16 | j | test.c:3:9:3:9 | j | > | test.c:42:20:42:21 | 10 | 50 | 50 |
|
||||
| test.c:42:16:42:16 | j | test.c:3:9:3:9 | j | > | test.c:42:20:42:21 | 10 | 50 | 52 |
|
||||
| test.c:42:16:42:16 | j | test.c:3:9:3:9 | j | > | test.c:42:20:42:21 | 10 | 53 | 53 |
|
||||
| test.c:42:16:42:16 | j | test.c:3:9:3:9 | j | > | test.c:42:20:42:21 | 10 | 53 | 55 |
|
||||
| test.c:42:16:42:16 | j | test.c:3:9:3:9 | j | > | test.c:42:20:42:21 | 10 | 56 | 63 |
|
||||
| test.c:42:16:42:16 | j | test.c:3:9:3:9 | j | > | test.c:42:20:42:21 | 10 | 59 | 61 |
|
||||
| test.c:42:16:42:16 | j | test.c:3:9:3:9 | j | > | test.c:42:20:42:21 | 10 | 64 | 71 |
|
||||
| test.c:47:5:47:10 | ... += ... | test.c:2:28:2:28 | z | < | test.c:52:16:52:16 | 0 | 59 | 61 |
|
||||
| test.c:47:5:47:10 | ... += ... | test.c:2:28:2:28 | z | > | test.c:52:16:52:16 | 0 | 53 | 53 |
|
||||
| test.c:47:5:47:10 | ... += ... | test.c:2:28:2:28 | z | > | test.c:52:16:52:16 | 0 | 53 | 55 |
|
||||
| test.c:47:5:47:10 | ... += ... | test.c:2:28:2:28 | z | > | test.c:52:16:52:16 | 0 | 56 | 63 |
|
||||
| test.c:50:16:50:16 | j | test.c:3:9:3:9 | j | < | test.c:50:20:50:21 | 10 | 50 | 50 |
|
||||
| test.c:50:16:50:16 | j | test.c:3:9:3:9 | j | < | test.c:50:20:50:21 | 10 | 50 | 52 |
|
||||
| test.c:50:16:50:16 | j | test.c:3:9:3:9 | j | < | test.c:50:20:50:21 | 10 | 53 | 53 |
|
||||
| test.c:50:16:50:16 | j | test.c:3:9:3:9 | j | < | test.c:50:20:50:21 | 10 | 53 | 55 |
|
||||
| test.c:50:16:50:16 | j | test.c:3:9:3:9 | j | < | test.c:50:20:50:21 | 10 | 56 | 63 |
|
||||
| test.c:50:16:50:16 | j | test.c:3:9:3:9 | j | < | test.c:50:20:50:21 | 10 | 59 | 61 |
|
||||
| test.c:51:9:51:14 | ... = ... | test.c:4:10:4:10 | y | < | test.c:53:20:53:20 | 0 | 56 | 63 |
|
||||
| test.c:51:9:51:14 | ... = ... | test.c:4:10:4:10 | y | > | test.c:53:20:53:20 | 0 | 53 | 55 |
|
||||
| test.c:74:19:89:1 | { ... } | test.c:74:16:74:16 | a | > | test.c:79:17:79:19 | 100 | 79 | 81 |
|
||||
| test.cpp:9:19:9:19 | i | test.cpp:9:12:9:12 | i | < | test.cpp:9:23:9:24 | 10 | 9 | 9 |
|
||||
| test.cpp:9:19:9:19 | i | test.cpp:9:12:9:12 | i | < | test.cpp:9:23:9:24 | 10 | 9 | 12 |
|
||||
| test.cpp:9:19:9:19 | i | test.cpp:9:12:9:12 | i | < | test.cpp:9:23:9:24 | 10 | 12 | 13 |
|
||||
| test.cpp:9:19:9:19 | i | test.cpp:9:12:9:12 | i | > | test.cpp:9:23:9:24 | 10 | 16 | 2 |
|
||||
| test.cpp:9:19:9:19 | i | test.cpp:9:12:9:12 | i | > | test.cpp:12:13:12:13 | 5 | 12 | 13 |
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -1,38 +1,38 @@
|
||||
| test.c:2:31:72:1 | SSA definition | SSA def(x) | test.c:7:9:7:9 | x |
|
||||
| test.c:14:5:14:13 | SSA definition | SSA def(z) | test.c:20:16:20:16 | z |
|
||||
| test.c:14:5:14:14 | SSA definition | SSA phi(x) | test.c:14:9:14:9 | x |
|
||||
| test.c:14:5:14:14 | SSA definition | SSA phi(x) | test.c:17:8:17:8 | x |
|
||||
| test.c:14:5:14:14 | SSA definition | SSA phi(y) | test.c:14:13:14:13 | y |
|
||||
| test.c:18:9:18:15 | SSA definition | SSA phi(x) | test.c:26:9:26:9 | x |
|
||||
| test.c:31:5:31:10 | SSA definition | SSA def(z) | test.c:39:5:39:5 | z |
|
||||
| test.c:31:5:31:11 | SSA definition | SSA phi(x) | test.c:31:10:31:10 | x |
|
||||
| test.c:31:5:31:11 | SSA definition | SSA phi(z) | test.c:31:5:31:5 | z |
|
||||
| test.c:34:11:34:11 | SSA definition | SSA phi(x) | test.c:34:11:34:11 | x |
|
||||
| test.c:34:11:34:11 | SSA definition | SSA phi(y) | test.c:39:10:39:10 | y |
|
||||
| test.c:34:18:37:5 | SSA definition | SSA phi(x) | test.c:36:9:36:9 | x |
|
||||
| test.c:39:5:39:10 | SSA definition | SSA def(z) | test.c:47:5:47:5 | z |
|
||||
| test.c:42:16:42:16 | SSA definition | SSA phi(j) | test.c:42:16:42:16 | j |
|
||||
| test.c:42:16:42:16 | SSA definition | SSA phi(w) | test.c:47:10:47:10 | w |
|
||||
| test.c:42:29:45:5 | SSA definition | SSA phi(j) | test.c:42:24:42:24 | j |
|
||||
| test.c:50:16:50:16 | SSA definition | SSA phi(j) | test.c:50:16:50:16 | j |
|
||||
| test.c:50:16:50:16 | SSA definition | SSA phi(x) | test.c:66:10:66:10 | x |
|
||||
| test.c:50:16:50:16 | SSA definition | SSA phi(z) | test.c:52:12:52:12 | z |
|
||||
| test.c:50:29:64:5 | SSA definition | SSA phi(j) | test.c:50:24:50:24 | j |
|
||||
| test.c:51:9:51:14 | SSA definition | SSA def(y) | test.c:53:16:53:16 | y |
|
||||
| test.c:64:5:64:5 | SSA definition | SSA phi(w) | test.c:66:18:66:18 | w |
|
||||
| test.c:64:5:64:5 | SSA definition | SSA phi(y) | test.c:66:14:66:14 | y |
|
||||
| test.c:64:5:64:5 | SSA definition | SSA phi(z) | test.c:66:5:66:5 | z |
|
||||
| test.c:70:5:70:10 | SSA definition | SSA def(w) | test.c:71:12:71:12 | w |
|
||||
| test.c:77:14:87:5 | SSA definition | SSA phi(a) | test.c:79:13:79:13 | a |
|
||||
| test.c:80:13:80:18 | SSA definition | SSA def(c) | test.c:81:17:81:17 | c |
|
||||
| test.c:83:9:84:18 | SSA definition | SSA phi(a) | test.c:83:13:83:13 | a |
|
||||
| test.c:83:9:84:18 | SSA definition | SSA phi(b) | test.c:88:12:88:12 | b |
|
||||
| test.c:83:9:84:18 | SSA definition | SSA phi(c) | test.c:86:20:86:20 | c |
|
||||
| test.c:85:9:86:21 | SSA definition | SSA phi(a) | test.c:85:13:85:13 | a |
|
||||
| test.c:91:33:97:1 | SSA definition | SSA def(cond) | test.c:93:9:93:12 | cond |
|
||||
| test.c:96:5:96:11 | SSA definition | SSA phi(x) | test.c:96:9:96:9 | x |
|
||||
| test.cpp:2:29:13:1 | SSA definition | SSA def(a) | test.cpp:4:14:4:14 | a |
|
||||
| test.cpp:4:14:4:14 | SSA definition | SSA def(x) | test.cpp:5:17:5:17 | x |
|
||||
| test.cpp:4:14:4:14 | SSA definition | SSA def(x) | test.cpp:6:9:6:9 | x |
|
||||
| test.cpp:4:14:4:14 | SSA definition | SSA def(x) | test.cpp:7:9:7:9 | x |
|
||||
| test.cpp:4:14:4:14 | SSA definition | SSA def(x) | test.cpp:8:13:8:13 | x |
|
||||
| test.c:2:31:72:1 | { ... } | SSA def(x) | test.c:7:9:7:9 | x |
|
||||
| test.c:14:5:14:13 | ... = ... | SSA def(z) | test.c:20:16:20:16 | z |
|
||||
| test.c:14:5:14:14 | ExprStmt | SSA phi(x) | test.c:14:9:14:9 | x |
|
||||
| test.c:14:5:14:14 | ExprStmt | SSA phi(x) | test.c:17:8:17:8 | x |
|
||||
| test.c:14:5:14:14 | ExprStmt | SSA phi(y) | test.c:14:13:14:13 | y |
|
||||
| test.c:18:9:18:15 | ExprStmt | SSA phi(x) | test.c:26:9:26:9 | x |
|
||||
| test.c:31:5:31:10 | ... += ... | SSA def(z) | test.c:39:5:39:5 | z |
|
||||
| test.c:31:5:31:11 | ExprStmt | SSA phi(x) | test.c:31:10:31:10 | x |
|
||||
| test.c:31:5:31:11 | ExprStmt | SSA phi(z) | test.c:31:5:31:5 | z |
|
||||
| test.c:34:11:34:11 | x | SSA phi(x) | test.c:34:11:34:11 | x |
|
||||
| test.c:34:11:34:11 | x | SSA phi(y) | test.c:39:10:39:10 | y |
|
||||
| test.c:34:18:37:5 | { ... } | SSA phi(x) | test.c:36:9:36:9 | x |
|
||||
| test.c:39:5:39:10 | ... += ... | SSA def(z) | test.c:47:5:47:5 | z |
|
||||
| test.c:42:16:42:16 | j | SSA phi(j) | test.c:42:16:42:16 | j |
|
||||
| test.c:42:16:42:16 | j | SSA phi(w) | test.c:47:10:47:10 | w |
|
||||
| test.c:42:29:45:5 | { ... } | SSA phi(j) | test.c:42:24:42:24 | j |
|
||||
| test.c:50:16:50:16 | j | SSA phi(j) | test.c:50:16:50:16 | j |
|
||||
| test.c:50:16:50:16 | j | SSA phi(x) | test.c:66:10:66:10 | x |
|
||||
| test.c:50:16:50:16 | j | SSA phi(z) | test.c:52:12:52:12 | z |
|
||||
| test.c:50:29:64:5 | { ... } | SSA phi(j) | test.c:50:24:50:24 | j |
|
||||
| test.c:51:9:51:14 | ... = ... | SSA def(y) | test.c:53:16:53:16 | y |
|
||||
| test.c:64:5:64:5 | label ...: | SSA phi(w) | test.c:66:18:66:18 | w |
|
||||
| test.c:64:5:64:5 | label ...: | SSA phi(y) | test.c:66:14:66:14 | y |
|
||||
| test.c:64:5:64:5 | label ...: | SSA phi(z) | test.c:66:5:66:5 | z |
|
||||
| test.c:70:5:70:10 | ... = ... | SSA def(w) | test.c:71:12:71:12 | w |
|
||||
| test.c:77:14:87:5 | { ... } | SSA phi(a) | test.c:79:13:79:13 | a |
|
||||
| test.c:80:13:80:18 | ... = ... | SSA def(c) | test.c:81:17:81:17 | c |
|
||||
| test.c:83:9:84:18 | if (...) ... | SSA phi(a) | test.c:83:13:83:13 | a |
|
||||
| test.c:83:9:84:18 | if (...) ... | SSA phi(b) | test.c:88:12:88:12 | b |
|
||||
| test.c:83:9:84:18 | if (...) ... | SSA phi(c) | test.c:86:20:86:20 | c |
|
||||
| test.c:85:9:86:21 | if (...) ... | SSA phi(a) | test.c:85:13:85:13 | a |
|
||||
| test.c:91:33:97:1 | { ... } | SSA def(cond) | test.c:93:9:93:12 | cond |
|
||||
| test.c:96:5:96:11 | ExprStmt | SSA phi(x) | test.c:96:9:96:9 | x |
|
||||
| test.cpp:2:29:13:1 | { ... } | SSA def(a) | test.cpp:4:14:4:14 | a |
|
||||
| test.cpp:4:14:4:14 | a | SSA def(x) | test.cpp:5:17:5:17 | x |
|
||||
| test.cpp:4:14:4:14 | a | SSA def(x) | test.cpp:6:9:6:9 | x |
|
||||
| test.cpp:4:14:4:14 | a | SSA def(x) | test.cpp:7:9:7:9 | x |
|
||||
| test.cpp:4:14:4:14 | a | SSA def(x) | test.cpp:8:13:8:13 | x |
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
| test.c:2:31:72:1 | SSA definition | test.c:2:14:2:14 | x |
|
||||
| test.c:2:31:72:1 | SSA definition | test.c:2:21:2:21 | w |
|
||||
| test.c:2:31:72:1 | SSA definition | test.c:2:28:2:28 | z |
|
||||
| test.c:74:19:89:1 | SSA definition | test.c:74:16:74:16 | a |
|
||||
| test.c:91:33:97:1 | SSA definition | test.c:91:27:91:30 | cond |
|
||||
| test.cpp:2:29:13:1 | SSA definition | test.cpp:2:26:2:26 | a |
|
||||
| test.c:2:31:72:1 | { ... } | test.c:2:14:2:14 | x |
|
||||
| test.c:2:31:72:1 | { ... } | test.c:2:21:2:21 | w |
|
||||
| test.c:2:31:72:1 | { ... } | test.c:2:28:2:28 | z |
|
||||
| test.c:74:19:89:1 | { ... } | test.c:74:16:74:16 | a |
|
||||
| test.c:91:33:97:1 | { ... } | test.c:91:27:91:30 | cond |
|
||||
| test.cpp:2:29:13:1 | { ... } | test.cpp:2:26:2:26 | a |
|
||||
|
||||
@@ -1,2 +1,2 @@
|
||||
| typedefs.cpp:6:6:6:7 | f1 | typedefs.cpp:8:15:8:18 | TYPE | LocalTypedefType |
|
||||
| typedefs.cpp:6:6:6:7 | f1 | typedefs.cpp:9:9:9:9 | D | LocalClass, MetricClass, StructLikeClass |
|
||||
| typedefs.cpp:6:6:6:7 | f1 | typedefs.cpp:9:9:9:9 | D | DirectAccessHolder, LocalClass, MetricClass, StructLikeClass |
|
||||
|
||||
@@ -18,9 +18,9 @@
|
||||
| _Imaginary long double | FloatingPointType | | | | |
|
||||
| __float128 | Float128Type | | | | |
|
||||
| __int128 | Int128Type | | | | |
|
||||
| __va_list_tag | MetricClass, Struct, StructLikeClass | | | | |
|
||||
| __va_list_tag | DirectAccessHolder, MetricClass, Struct, StructLikeClass | | | | |
|
||||
| __va_list_tag & | LValueReferenceType | | __va_list_tag | | |
|
||||
| address | MetricClass, Struct, StructLikeClass | | | | |
|
||||
| address | DirectAccessHolder, MetricClass, Struct, StructLikeClass | | | | |
|
||||
| address & | LValueReferenceType | | address | | |
|
||||
| address && | RValueReferenceType | | address | | |
|
||||
| auto | AutoType | | | | |
|
||||
|
||||
@@ -1,48 +1,48 @@
|
||||
| tst.c:1:12:1:18 | // lgtm | lgtm | lgtm | tst.c:1:1:1:18 | suppression range |
|
||||
| tst.c:2:1:2:30 | // lgtm[js/debugger-statement] | lgtm[js/debugger-statement] | lgtm[js/debugger-statement] | tst.c:2:1:2:30 | suppression range |
|
||||
| tst.c:3:1:3:61 | // lgtm[js/debugger-statement, js/invocation-of-non-function] | lgtm[js/debugger-statement, js/invocation-of-non-function] | lgtm[js/debugger-statement, js/invocation-of-non-function] | tst.c:3:1:3:61 | suppression range |
|
||||
| tst.c:4:1:4:22 | // lgtm[@tag:nullness] | lgtm[@tag:nullness] | lgtm[@tag:nullness] | tst.c:4:1:4:22 | suppression range |
|
||||
| tst.c:5:1:5:44 | // lgtm[@tag:nullness,js/debugger-statement] | lgtm[@tag:nullness,js/debugger-statement] | lgtm[@tag:nullness,js/debugger-statement] | tst.c:5:1:5:44 | suppression range |
|
||||
| tst.c:6:1:6:28 | // lgtm[@expires:2017-06-11] | lgtm[@expires:2017-06-11] | lgtm[@expires:2017-06-11] | tst.c:6:1:6:28 | suppression range |
|
||||
| tst.c:7:1:7:70 | // lgtm[js/invocation-of-non-function] because I know better than lgtm | lgtm[js/invocation-of-non-function] because I know better than lgtm | lgtm[js/invocation-of-non-function] | tst.c:7:1:7:70 | suppression range |
|
||||
| tst.c:8:1:8:18 | // lgtm: blah blah | lgtm: blah blah | lgtm | tst.c:8:1:8:18 | suppression range |
|
||||
| tst.c:9:1:9:32 | // lgtm blah blah #falsepositive | lgtm blah blah #falsepositive | lgtm | tst.c:9:1:9:32 | suppression range |
|
||||
| tst.c:10:1:10:39 | //lgtm [js/invocation-of-non-function] | lgtm [js/invocation-of-non-function] | lgtm [js/invocation-of-non-function] | tst.c:10:1:10:39 | suppression range |
|
||||
| tst.c:12:1:12:9 | // lgtm[] | lgtm[] | lgtm[] | tst.c:12:1:12:9 | suppression range |
|
||||
| tst.c:14:1:14:6 | //lgtm | lgtm | lgtm | tst.c:14:1:14:6 | suppression range |
|
||||
| tst.c:15:1:15:7 | //\tlgtm | \tlgtm | lgtm | tst.c:15:1:15:7 | suppression range |
|
||||
| tst.c:16:1:16:31 | // lgtm\t[js/debugger-statement] | lgtm\t[js/debugger-statement] | lgtm\t[js/debugger-statement] | tst.c:16:1:16:31 | suppression range |
|
||||
| tst.c:19:1:19:12 | // foo; lgtm | foo; lgtm | lgtm | tst.c:19:1:19:12 | suppression range |
|
||||
| tst.c:20:1:20:35 | // foo; lgtm[js/debugger-statement] | foo; lgtm[js/debugger-statement] | lgtm[js/debugger-statement] | tst.c:20:1:20:35 | suppression range |
|
||||
| tst.c:22:1:22:34 | // foo lgtm[js/debugger-statement] | foo lgtm[js/debugger-statement] | lgtm[js/debugger-statement] | tst.c:22:1:22:34 | suppression range |
|
||||
| tst.c:24:1:24:38 | // foo lgtm[js/debugger-statement] bar | foo lgtm[js/debugger-statement] bar | lgtm[js/debugger-statement] | tst.c:24:1:24:38 | suppression range |
|
||||
| tst.c:25:1:25:8 | // LGTM! | LGTM! | LGTM | tst.c:25:1:25:8 | suppression range |
|
||||
| tst.c:26:1:26:30 | // LGTM[js/debugger-statement] | LGTM[js/debugger-statement] | LGTM[js/debugger-statement] | tst.c:26:1:26:30 | suppression range |
|
||||
| tst.c:27:1:27:70 | // lgtm[js/debugger-statement] and lgtm[js/invocation-of-non-function] | lgtm[js/debugger-statement] and lgtm[js/invocation-of-non-function] | lgtm[js/debugger-statement] | tst.c:27:1:27:70 | suppression range |
|
||||
| tst.c:27:1:27:70 | // lgtm[js/debugger-statement] and lgtm[js/invocation-of-non-function] | lgtm[js/debugger-statement] and lgtm[js/invocation-of-non-function] | lgtm[js/invocation-of-non-function] | tst.c:27:1:27:70 | suppression range |
|
||||
| tst.c:28:1:28:36 | // lgtm[js/debugger-statement]; lgtm | lgtm[js/debugger-statement]; lgtm | lgtm | tst.c:28:1:28:36 | suppression range |
|
||||
| tst.c:28:1:28:36 | // lgtm[js/debugger-statement]; lgtm | lgtm[js/debugger-statement]; lgtm | lgtm[js/debugger-statement] | tst.c:28:1:28:36 | suppression range |
|
||||
| tstWindows.c:1:12:1:18 | // lgtm | lgtm | lgtm | tstWindows.c:1:1:1:18 | suppression range |
|
||||
| tstWindows.c:2:1:2:30 | // lgtm[js/debugger-statement] | lgtm[js/debugger-statement] | lgtm[js/debugger-statement] | tstWindows.c:2:1:2:30 | suppression range |
|
||||
| tstWindows.c:3:1:3:61 | // lgtm[js/debugger-statement, js/invocation-of-non-function] | lgtm[js/debugger-statement, js/invocation-of-non-function] | lgtm[js/debugger-statement, js/invocation-of-non-function] | tstWindows.c:3:1:3:61 | suppression range |
|
||||
| tstWindows.c:4:1:4:22 | // lgtm[@tag:nullness] | lgtm[@tag:nullness] | lgtm[@tag:nullness] | tstWindows.c:4:1:4:22 | suppression range |
|
||||
| tstWindows.c:5:1:5:44 | // lgtm[@tag:nullness,js/debugger-statement] | lgtm[@tag:nullness,js/debugger-statement] | lgtm[@tag:nullness,js/debugger-statement] | tstWindows.c:5:1:5:44 | suppression range |
|
||||
| tstWindows.c:6:1:6:28 | // lgtm[@expires:2017-06-11] | lgtm[@expires:2017-06-11] | lgtm[@expires:2017-06-11] | tstWindows.c:6:1:6:28 | suppression range |
|
||||
| tstWindows.c:7:1:7:70 | // lgtm[js/invocation-of-non-function] because I know better than lgtm | lgtm[js/invocation-of-non-function] because I know better than lgtm | lgtm[js/invocation-of-non-function] | tstWindows.c:7:1:7:70 | suppression range |
|
||||
| tstWindows.c:8:1:8:18 | // lgtm: blah blah | lgtm: blah blah | lgtm | tstWindows.c:8:1:8:18 | suppression range |
|
||||
| tstWindows.c:9:1:9:32 | // lgtm blah blah #falsepositive | lgtm blah blah #falsepositive | lgtm | tstWindows.c:9:1:9:32 | suppression range |
|
||||
| tstWindows.c:10:1:10:39 | //lgtm [js/invocation-of-non-function] | lgtm [js/invocation-of-non-function] | lgtm [js/invocation-of-non-function] | tstWindows.c:10:1:10:39 | suppression range |
|
||||
| tstWindows.c:12:1:12:9 | // lgtm[] | lgtm[] | lgtm[] | tstWindows.c:12:1:12:9 | suppression range |
|
||||
| tstWindows.c:14:1:14:6 | //lgtm | lgtm | lgtm | tstWindows.c:14:1:14:6 | suppression range |
|
||||
| tstWindows.c:15:1:15:7 | //\tlgtm | \tlgtm | lgtm | tstWindows.c:15:1:15:7 | suppression range |
|
||||
| tstWindows.c:16:1:16:31 | // lgtm\t[js/debugger-statement] | lgtm\t[js/debugger-statement] | lgtm\t[js/debugger-statement] | tstWindows.c:16:1:16:31 | suppression range |
|
||||
| tstWindows.c:19:1:19:12 | // foo; lgtm | foo; lgtm | lgtm | tstWindows.c:19:1:19:12 | suppression range |
|
||||
| tstWindows.c:20:1:20:35 | // foo; lgtm[js/debugger-statement] | foo; lgtm[js/debugger-statement] | lgtm[js/debugger-statement] | tstWindows.c:20:1:20:35 | suppression range |
|
||||
| tstWindows.c:22:1:22:34 | // foo lgtm[js/debugger-statement] | foo lgtm[js/debugger-statement] | lgtm[js/debugger-statement] | tstWindows.c:22:1:22:34 | suppression range |
|
||||
| tstWindows.c:24:1:24:38 | // foo lgtm[js/debugger-statement] bar | foo lgtm[js/debugger-statement] bar | lgtm[js/debugger-statement] | tstWindows.c:24:1:24:38 | suppression range |
|
||||
| tstWindows.c:25:1:25:8 | // LGTM! | LGTM! | LGTM | tstWindows.c:25:1:25:8 | suppression range |
|
||||
| tstWindows.c:26:1:26:30 | // LGTM[js/debugger-statement] | LGTM[js/debugger-statement] | LGTM[js/debugger-statement] | tstWindows.c:26:1:26:30 | suppression range |
|
||||
| tstWindows.c:27:1:27:70 | // lgtm[js/debugger-statement] and lgtm[js/invocation-of-non-function] | lgtm[js/debugger-statement] and lgtm[js/invocation-of-non-function] | lgtm[js/debugger-statement] | tstWindows.c:27:1:27:70 | suppression range |
|
||||
| tstWindows.c:27:1:27:70 | // lgtm[js/debugger-statement] and lgtm[js/invocation-of-non-function] | lgtm[js/debugger-statement] and lgtm[js/invocation-of-non-function] | lgtm[js/invocation-of-non-function] | tstWindows.c:27:1:27:70 | suppression range |
|
||||
| tstWindows.c:28:1:28:36 | // lgtm[js/debugger-statement]; lgtm | lgtm[js/debugger-statement]; lgtm | lgtm | tstWindows.c:28:1:28:36 | suppression range |
|
||||
| tstWindows.c:28:1:28:36 | // lgtm[js/debugger-statement]; lgtm | lgtm[js/debugger-statement]; lgtm | lgtm[js/debugger-statement] | tstWindows.c:28:1:28:36 | suppression range |
|
||||
| tst.c:1:12:1:18 | // lgtm | lgtm | lgtm | tst.c:1:1:1:18 | // lgtm |
|
||||
| tst.c:2:1:2:30 | // lgtm[js/debugger-statement] | lgtm[js/debugger-statement] | lgtm[js/debugger-statement] | tst.c:2:1:2:30 | // lgtm[js/debugger-statement] |
|
||||
| tst.c:3:1:3:61 | // lgtm[js/debugger-statement, js/invocation-of-non-function] | lgtm[js/debugger-statement, js/invocation-of-non-function] | lgtm[js/debugger-statement, js/invocation-of-non-function] | tst.c:3:1:3:61 | // lgtm[js/debugger-statement, js/invocation-of-non-function] |
|
||||
| tst.c:4:1:4:22 | // lgtm[@tag:nullness] | lgtm[@tag:nullness] | lgtm[@tag:nullness] | tst.c:4:1:4:22 | // lgtm[@tag:nullness] |
|
||||
| tst.c:5:1:5:44 | // lgtm[@tag:nullness,js/debugger-statement] | lgtm[@tag:nullness,js/debugger-statement] | lgtm[@tag:nullness,js/debugger-statement] | tst.c:5:1:5:44 | // lgtm[@tag:nullness,js/debugger-statement] |
|
||||
| tst.c:6:1:6:28 | // lgtm[@expires:2017-06-11] | lgtm[@expires:2017-06-11] | lgtm[@expires:2017-06-11] | tst.c:6:1:6:28 | // lgtm[@expires:2017-06-11] |
|
||||
| tst.c:7:1:7:70 | // lgtm[js/invocation-of-non-function] because I know better than lgtm | lgtm[js/invocation-of-non-function] because I know better than lgtm | lgtm[js/invocation-of-non-function] | tst.c:7:1:7:70 | // lgtm[js/invocation-of-non-function] because I know better than lgtm |
|
||||
| tst.c:8:1:8:18 | // lgtm: blah blah | lgtm: blah blah | lgtm | tst.c:8:1:8:18 | // lgtm: blah blah |
|
||||
| tst.c:9:1:9:32 | // lgtm blah blah #falsepositive | lgtm blah blah #falsepositive | lgtm | tst.c:9:1:9:32 | // lgtm blah blah #falsepositive |
|
||||
| tst.c:10:1:10:39 | //lgtm [js/invocation-of-non-function] | lgtm [js/invocation-of-non-function] | lgtm [js/invocation-of-non-function] | tst.c:10:1:10:39 | //lgtm [js/invocation-of-non-function] |
|
||||
| tst.c:12:1:12:9 | // lgtm[] | lgtm[] | lgtm[] | tst.c:12:1:12:9 | // lgtm[] |
|
||||
| tst.c:14:1:14:6 | //lgtm | lgtm | lgtm | tst.c:14:1:14:6 | //lgtm |
|
||||
| tst.c:15:1:15:7 | //\tlgtm | \tlgtm | lgtm | tst.c:15:1:15:7 | //\tlgtm |
|
||||
| tst.c:16:1:16:31 | // lgtm\t[js/debugger-statement] | lgtm\t[js/debugger-statement] | lgtm\t[js/debugger-statement] | tst.c:16:1:16:31 | // lgtm\t[js/debugger-statement] |
|
||||
| tst.c:19:1:19:12 | // foo; lgtm | foo; lgtm | lgtm | tst.c:19:1:19:12 | // foo; lgtm |
|
||||
| tst.c:20:1:20:35 | // foo; lgtm[js/debugger-statement] | foo; lgtm[js/debugger-statement] | lgtm[js/debugger-statement] | tst.c:20:1:20:35 | // foo; lgtm[js/debugger-statement] |
|
||||
| tst.c:22:1:22:34 | // foo lgtm[js/debugger-statement] | foo lgtm[js/debugger-statement] | lgtm[js/debugger-statement] | tst.c:22:1:22:34 | // foo lgtm[js/debugger-statement] |
|
||||
| tst.c:24:1:24:38 | // foo lgtm[js/debugger-statement] bar | foo lgtm[js/debugger-statement] bar | lgtm[js/debugger-statement] | tst.c:24:1:24:38 | // foo lgtm[js/debugger-statement] bar |
|
||||
| tst.c:25:1:25:8 | // LGTM! | LGTM! | LGTM | tst.c:25:1:25:8 | // LGTM! |
|
||||
| tst.c:26:1:26:30 | // LGTM[js/debugger-statement] | LGTM[js/debugger-statement] | LGTM[js/debugger-statement] | tst.c:26:1:26:30 | // LGTM[js/debugger-statement] |
|
||||
| tst.c:27:1:27:70 | // lgtm[js/debugger-statement] and lgtm[js/invocation-of-non-function] | lgtm[js/debugger-statement] and lgtm[js/invocation-of-non-function] | lgtm[js/debugger-statement] | tst.c:27:1:27:70 | // lgtm[js/debugger-statement] and lgtm[js/invocation-of-non-function] |
|
||||
| tst.c:27:1:27:70 | // lgtm[js/debugger-statement] and lgtm[js/invocation-of-non-function] | lgtm[js/debugger-statement] and lgtm[js/invocation-of-non-function] | lgtm[js/invocation-of-non-function] | tst.c:27:1:27:70 | // lgtm[js/debugger-statement] and lgtm[js/invocation-of-non-function] |
|
||||
| tst.c:28:1:28:36 | // lgtm[js/debugger-statement]; lgtm | lgtm[js/debugger-statement]; lgtm | lgtm | tst.c:28:1:28:36 | // lgtm[js/debugger-statement]; lgtm |
|
||||
| tst.c:28:1:28:36 | // lgtm[js/debugger-statement]; lgtm | lgtm[js/debugger-statement]; lgtm | lgtm[js/debugger-statement] | tst.c:28:1:28:36 | // lgtm[js/debugger-statement]; lgtm |
|
||||
| tstWindows.c:1:12:1:18 | // lgtm | lgtm | lgtm | tstWindows.c:1:1:1:18 | // lgtm |
|
||||
| tstWindows.c:2:1:2:30 | // lgtm[js/debugger-statement] | lgtm[js/debugger-statement] | lgtm[js/debugger-statement] | tstWindows.c:2:1:2:30 | // lgtm[js/debugger-statement] |
|
||||
| tstWindows.c:3:1:3:61 | // lgtm[js/debugger-statement, js/invocation-of-non-function] | lgtm[js/debugger-statement, js/invocation-of-non-function] | lgtm[js/debugger-statement, js/invocation-of-non-function] | tstWindows.c:3:1:3:61 | // lgtm[js/debugger-statement, js/invocation-of-non-function] |
|
||||
| tstWindows.c:4:1:4:22 | // lgtm[@tag:nullness] | lgtm[@tag:nullness] | lgtm[@tag:nullness] | tstWindows.c:4:1:4:22 | // lgtm[@tag:nullness] |
|
||||
| tstWindows.c:5:1:5:44 | // lgtm[@tag:nullness,js/debugger-statement] | lgtm[@tag:nullness,js/debugger-statement] | lgtm[@tag:nullness,js/debugger-statement] | tstWindows.c:5:1:5:44 | // lgtm[@tag:nullness,js/debugger-statement] |
|
||||
| tstWindows.c:6:1:6:28 | // lgtm[@expires:2017-06-11] | lgtm[@expires:2017-06-11] | lgtm[@expires:2017-06-11] | tstWindows.c:6:1:6:28 | // lgtm[@expires:2017-06-11] |
|
||||
| tstWindows.c:7:1:7:70 | // lgtm[js/invocation-of-non-function] because I know better than lgtm | lgtm[js/invocation-of-non-function] because I know better than lgtm | lgtm[js/invocation-of-non-function] | tstWindows.c:7:1:7:70 | // lgtm[js/invocation-of-non-function] because I know better than lgtm |
|
||||
| tstWindows.c:8:1:8:18 | // lgtm: blah blah | lgtm: blah blah | lgtm | tstWindows.c:8:1:8:18 | // lgtm: blah blah |
|
||||
| tstWindows.c:9:1:9:32 | // lgtm blah blah #falsepositive | lgtm blah blah #falsepositive | lgtm | tstWindows.c:9:1:9:32 | // lgtm blah blah #falsepositive |
|
||||
| tstWindows.c:10:1:10:39 | //lgtm [js/invocation-of-non-function] | lgtm [js/invocation-of-non-function] | lgtm [js/invocation-of-non-function] | tstWindows.c:10:1:10:39 | //lgtm [js/invocation-of-non-function] |
|
||||
| tstWindows.c:12:1:12:9 | // lgtm[] | lgtm[] | lgtm[] | tstWindows.c:12:1:12:9 | // lgtm[] |
|
||||
| tstWindows.c:14:1:14:6 | //lgtm | lgtm | lgtm | tstWindows.c:14:1:14:6 | //lgtm |
|
||||
| tstWindows.c:15:1:15:7 | //\tlgtm | \tlgtm | lgtm | tstWindows.c:15:1:15:7 | //\tlgtm |
|
||||
| tstWindows.c:16:1:16:31 | // lgtm\t[js/debugger-statement] | lgtm\t[js/debugger-statement] | lgtm\t[js/debugger-statement] | tstWindows.c:16:1:16:31 | // lgtm\t[js/debugger-statement] |
|
||||
| tstWindows.c:19:1:19:12 | // foo; lgtm | foo; lgtm | lgtm | tstWindows.c:19:1:19:12 | // foo; lgtm |
|
||||
| tstWindows.c:20:1:20:35 | // foo; lgtm[js/debugger-statement] | foo; lgtm[js/debugger-statement] | lgtm[js/debugger-statement] | tstWindows.c:20:1:20:35 | // foo; lgtm[js/debugger-statement] |
|
||||
| tstWindows.c:22:1:22:34 | // foo lgtm[js/debugger-statement] | foo lgtm[js/debugger-statement] | lgtm[js/debugger-statement] | tstWindows.c:22:1:22:34 | // foo lgtm[js/debugger-statement] |
|
||||
| tstWindows.c:24:1:24:38 | // foo lgtm[js/debugger-statement] bar | foo lgtm[js/debugger-statement] bar | lgtm[js/debugger-statement] | tstWindows.c:24:1:24:38 | // foo lgtm[js/debugger-statement] bar |
|
||||
| tstWindows.c:25:1:25:8 | // LGTM! | LGTM! | LGTM | tstWindows.c:25:1:25:8 | // LGTM! |
|
||||
| tstWindows.c:26:1:26:30 | // LGTM[js/debugger-statement] | LGTM[js/debugger-statement] | LGTM[js/debugger-statement] | tstWindows.c:26:1:26:30 | // LGTM[js/debugger-statement] |
|
||||
| tstWindows.c:27:1:27:70 | // lgtm[js/debugger-statement] and lgtm[js/invocation-of-non-function] | lgtm[js/debugger-statement] and lgtm[js/invocation-of-non-function] | lgtm[js/debugger-statement] | tstWindows.c:27:1:27:70 | // lgtm[js/debugger-statement] and lgtm[js/invocation-of-non-function] |
|
||||
| tstWindows.c:27:1:27:70 | // lgtm[js/debugger-statement] and lgtm[js/invocation-of-non-function] | lgtm[js/debugger-statement] and lgtm[js/invocation-of-non-function] | lgtm[js/invocation-of-non-function] | tstWindows.c:27:1:27:70 | // lgtm[js/debugger-statement] and lgtm[js/invocation-of-non-function] |
|
||||
| tstWindows.c:28:1:28:36 | // lgtm[js/debugger-statement]; lgtm | lgtm[js/debugger-statement]; lgtm | lgtm | tstWindows.c:28:1:28:36 | // lgtm[js/debugger-statement]; lgtm |
|
||||
| tstWindows.c:28:1:28:36 | // lgtm[js/debugger-statement]; lgtm | lgtm[js/debugger-statement]; lgtm | lgtm[js/debugger-statement] | tstWindows.c:28:1:28:36 | // lgtm[js/debugger-statement]; lgtm |
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
| cwmf.cpp:8:3:9:12 | aa | Struct aa has 20 fields, which is too many. | cwmf.cpp:8:3:9:12 | group of 20 fields here | group of 20 fields here |
|
||||
| cwmf.cpp:13:3:14:12 | bb | Class bb has 20 fields, which is too many. | cwmf.cpp:13:3:14:12 | group of 20 fields here | group of 20 fields here |
|
||||
| cwmf.cpp:24:3:25:12 | dd<T> | Template class dd<T> has 20 fields, which is too many. | cwmf.cpp:24:3:25:12 | group of 20 fields here | group of 20 fields here |
|
||||
| cwmf.cpp:30:3:31:12 | ee<U> | Template class ee<U> has 20 fields, which is too many. | cwmf.cpp:30:3:31:12 | group of 20 fields here | group of 20 fields here |
|
||||
| cwmf.cpp:41:8:57:22 | MyParticle | Struct MyParticle has 30 fields, which is too many. | cwmf.cpp:41:8:57:22 | group of 30 fields here | group of 30 fields here |
|
||||
| different_types.h:15:15:33:10 | DifferentTypes2 | Class DifferentTypes2 has 18 fields, which is too many. | different_types.h:15:15:33:10 | group of 18 fields here | group of 18 fields here |
|
||||
| different_types.h:15:15:33:10 | DifferentTypes2 | Class DifferentTypes2 has 18 fields, which is too many. | different_types.h:15:15:33:10 | group of 18 fields here | group of 18 fields here |
|
||||
| cwmf.cpp:8:3:9:12 | aa | Struct aa has 20 fields, which is too many. | cwmf.cpp:8:3:9:12 | definition of f1 | group of 20 fields here |
|
||||
| cwmf.cpp:13:3:14:12 | bb | Class bb has 20 fields, which is too many. | cwmf.cpp:13:3:14:12 | definition of f1 | group of 20 fields here |
|
||||
| cwmf.cpp:24:3:25:12 | dd<T> | Template class dd<T> has 20 fields, which is too many. | cwmf.cpp:24:3:25:12 | definition of f1 | group of 20 fields here |
|
||||
| cwmf.cpp:30:3:31:12 | ee<U> | Template class ee<U> has 20 fields, which is too many. | cwmf.cpp:30:3:31:12 | definition of f1 | group of 20 fields here |
|
||||
| cwmf.cpp:41:8:57:22 | MyParticle | Struct MyParticle has 30 fields, which is too many. | cwmf.cpp:41:8:57:22 | definition of isActive | group of 30 fields here |
|
||||
| different_types.h:15:15:33:10 | DifferentTypes2 | Class DifferentTypes2 has 18 fields, which is too many. | different_types.h:15:15:33:10 | definition of i1 | group of 18 fields here |
|
||||
| different_types.h:15:15:33:10 | DifferentTypes2 | Class DifferentTypes2 has 18 fields, which is too many. | different_types.h:15:15:33:10 | definition of i1 | group of 18 fields here |
|
||||
|
||||
Reference in New Issue
Block a user