Merge pull request #110 from jbj/fewer-dbtypes

Approved by ian-semmle
This commit is contained in:
semmle-qlci
2018-08-29 17:26:06 +01:00
committed by GitHub
37 changed files with 3064 additions and 3046 deletions

View File

@@ -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)
}
}

View File

@@ -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()

View File

@@ -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())
}

View File

@@ -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

View File

@@ -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))
}
/**

View File

@@ -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
)
}

View File

@@ -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() }
}
/**

View File

@@ -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() }

View File

@@ -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())
}
}

View File

@@ -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
}

View File

@@ -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
)
}

View File

@@ -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

View File

@@ -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))))
}
}

View File

@@ -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))
}
/**

View File

@@ -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() + ")")

View File

@@ -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]

View File

@@ -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
}

View File

@@ -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, _)
}

View File

@@ -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

View File

@@ -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

View File

@@ -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]

View File

@@ -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))
}
}

View File

@@ -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)

View File

@@ -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) {

View File

@@ -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
}

View File

@@ -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 |

View File

@@ -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 |

View File

@@ -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 |

View File

@@ -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 |

View File

@@ -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 |

View File

@@ -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 |

View File

@@ -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 |

View File

@@ -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 |

View File

@@ -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 | | | | |

View File

@@ -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 |

View File

@@ -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 |