Merge pull request #20558 from aschackmull/csharp/guards3

C#: Instantiate shared Guards and shared ControlFlowReachability and replace nullness
This commit is contained in:
Anders Schack-Mulligen
2025-10-23 08:43:14 +02:00
committed by GitHub
70 changed files with 7008 additions and 14285 deletions

View File

@@ -115,7 +115,6 @@
| test.c:127:9:127:9 | 1 | not 0 | test.c:131:10:132:16 | { ... } |
| test.c:131:7:131:7 | b | not 0 | test.c:131:10:132:16 | { ... } |
| test.c:131:7:131:7 | b | true | test.c:131:10:132:16 | { ... } |
| test.c:137:7:137:7 | 0 | 0 | test.c:142:3:136:10 | return ... |
| test.c:137:7:137:7 | 0 | false | test.c:142:3:136:10 | return ... |
| test.c:145:16:145:16 | x | 0 | test.c:146:11:147:9 | { ... } |
| test.c:146:7:146:8 | ! ... | true | test.c:146:11:147:9 | { ... } |

View File

@@ -0,0 +1,4 @@
---
category: majorAnalysis
---
* The representation of the C# control-flow graph has been significantly changed. This has minor effects on a wide range of queries including both minor improvements and minor regressions, for example, improved precision has been observed for `cs/inefficient-containskey` and `cs/stringbuilder-creation-in-loop`. Two queries stand out as being significantly affected with great improvements: `cs/dereferenced-value-may-be-null` has been completely rewritten which removes a very significant number of false positives. Furthermore, `cs/constant-condition` has been updated to report many new results - these new results are primarily expected to be true positives, but a few new false positives are expected as well. As part of these changes, `cs/dereferenced-value-may-be-null` has been changed from a `path-problem` query to a `problem` query, so paths are no longer reported for this query.

View File

@@ -40,6 +40,12 @@ class ControlFlowElement extends ExprOrStmtParent, @control_flow_element {
*/
Nodes::ElementNode getAControlFlowNode() { result.getAstNode() = this }
/** Gets the control flow node for this element. */
ControlFlow::Node getControlFlowNode() { result.getAstNode() = this }
/** Gets the basic block in which this element occurs. */
BasicBlock getBasicBlock() { result = this.getAControlFlowNode().getBasicBlock() }
/**
* Gets a first control flow node executed within this element.
*/

View File

@@ -251,6 +251,9 @@ module ControlFlow {
}
}
/** A control flow node indicating normal termination of a callable. */
class NormalExitNode extends AnnotatedExitNode instanceof Impl::NormalExitNode { }
/** A node for a callable exit point. */
class ExitNode extends Node instanceof Impl::ExitNode {
/** Gets the callable that this exit applies to. */
@@ -292,13 +295,7 @@ module ControlFlow {
class Split = Splitting::Split;
class FinallySplit = Splitting::FinallySplitting::FinallySplit;
class ExceptionHandlerSplit = Splitting::ExceptionHandlerSplitting::ExceptionHandlerSplit;
class BooleanSplit = Splitting::BooleanSplitting::BooleanSplit;
class LoopSplit = Splitting::LoopSplitting::LoopSplit;
}
class BasicBlock = BBs::BasicBlock;

View File

@@ -0,0 +1,57 @@
/**
* Provides an implementation of local (intraprocedural) control flow reachability.
*/
import csharp
private import codeql.controlflow.ControlFlow
private import semmle.code.csharp.controlflow.BasicBlocks
private import semmle.code.csharp.controlflow.Guards as Guards
private import semmle.code.csharp.ExprOrStmtParent
private module ControlFlowInput implements
InputSig<Location, ControlFlow::Node, ControlFlow::BasicBlock>
{
private import csharp as CS
AstNode getEnclosingAstNode(ControlFlow::Node node) {
node.getAstNode() = result
or
not exists(node.getAstNode()) and result = node.getEnclosingCallable()
}
class AstNode = ExprOrStmtParent;
AstNode getParent(AstNode node) { result = node.getParent() }
class FinallyBlock extends AstNode {
FinallyBlock() { any(TryStmt try).getFinally() = this }
}
class Expr = CS::Expr;
class SourceVariable = Ssa::SourceVariable;
class SsaDefinition = Ssa::Definition;
class SsaWriteDefinition extends SsaDefinition instanceof Ssa::ExplicitDefinition {
Expr getDefinition() { result = super.getADefinition().getSource() }
}
class SsaPhiNode = Ssa::PhiNode;
class SsaUncertainDefinition = Ssa::UncertainDefinition;
class GuardValue = Guards::GuardValue;
predicate ssaControlsBranchEdge(SsaDefinition def, BasicBlock bb1, BasicBlock bb2, GuardValue v) {
Guards::Guards::ssaControlsBranchEdge(def, bb1, bb2, v)
}
predicate ssaControls(SsaDefinition def, BasicBlock bb, GuardValue v) {
Guards::Guards::ssaControls(def, bb, v)
}
import Guards::Guards::InternalUtil
}
module ControlFlowReachability = Make<Location, Cfg, ControlFlowInput>;

View File

@@ -13,6 +13,284 @@ private import semmle.code.csharp.frameworks.System
private import semmle.code.csharp.frameworks.system.Linq
private import semmle.code.csharp.frameworks.system.Collections
private import semmle.code.csharp.frameworks.system.collections.Generic
private import codeql.controlflow.Guards as SharedGuards
private module GuardsInput implements
SharedGuards::InputSig<Location, ControlFlow::Node, ControlFlow::BasicBlock>
{
private import csharp as CS
class NormalExitNode = ControlFlow::Nodes::NormalExitNode;
class AstNode = ControlFlowElement;
class Expr = CS::Expr;
private newtype TConstantValue =
TStringValue(string value) { any(StringLiteral s).getValue() = value }
class ConstantValue extends TConstantValue {
string toString() { this = TStringValue(result) }
}
abstract class ConstantExpr extends Expr {
predicate isNull() { none() }
boolean asBooleanValue() { none() }
int asIntegerValue() { none() }
ConstantValue asConstantValue() { none() }
}
private class NullConstant extends ConstantExpr {
NullConstant() { nullValueImplied(this) }
override predicate isNull() { any() }
}
private class BooleanConstant extends ConstantExpr instanceof BoolLiteral {
override boolean asBooleanValue() { result = super.getBoolValue() }
}
private predicate intConst(Expr e, int i) {
e.getValue().toInt() = i and
(
e.getType() instanceof Enum
or
e.getType() instanceof IntegralType
)
}
private class IntegerConstant extends ConstantExpr {
IntegerConstant() { intConst(this, _) }
override int asIntegerValue() { intConst(this, result) }
}
private class EnumConst extends ConstantExpr {
EnumConst() { this.getType() instanceof Enum and this.hasValue() }
override int asIntegerValue() { result = this.getValue().toInt() }
}
private class StringConstant extends ConstantExpr instanceof StringLiteral {
override ConstantValue asConstantValue() { result = TStringValue(this.getValue()) }
}
class NonNullExpr extends Expr {
NonNullExpr() { nonNullValueImplied(this) }
}
class Case extends AstNode instanceof CS::Case {
Expr getSwitchExpr() { super.getExpr() = result }
predicate isDefaultCase() { this instanceof DefaultCase }
ConstantExpr asConstantCase() { super.getPattern() = result }
private predicate hasEdge(BasicBlock bb1, BasicBlock bb2, MatchingCompletion c) {
exists(PatternExpr pe |
super.getPattern() = pe and
c.isValidFor(pe) and
bb1.getLastNode() = pe.getAControlFlowNode() and
bb1.getASuccessor(c.getAMatchingSuccessorType()) = bb2
)
}
predicate matchEdge(BasicBlock bb1, BasicBlock bb2) {
exists(MatchingCompletion c | this.hasEdge(bb1, bb2, c) and c.isMatch())
}
predicate nonMatchEdge(BasicBlock bb1, BasicBlock bb2) {
exists(MatchingCompletion c | this.hasEdge(bb1, bb2, c) and c.isNonMatch())
}
}
abstract private class BinExpr extends BinaryOperation { }
class AndExpr extends BinExpr {
AndExpr() {
this instanceof LogicalAndExpr or
this instanceof BitwiseAndExpr
}
}
class OrExpr extends BinExpr {
OrExpr() {
this instanceof LogicalOrExpr or
this instanceof BitwiseOrExpr
}
}
class NotExpr = LogicalNotExpr;
class IdExpr extends Expr {
IdExpr() { this instanceof AssignExpr or this instanceof CastExpr }
Expr getEqualChildExpr() {
result = this.(AssignExpr).getRValue()
or
result = this.(CastExpr).getExpr()
}
}
predicate equalityTest(Expr eqtest, Expr left, Expr right, boolean polarity) {
exists(ComparisonTest ct |
ct.getExpr() = eqtest and
ct.getFirstArgument() = left and
ct.getSecondArgument() = right
|
ct.getComparisonKind().isEquality() and polarity = true
or
ct.getComparisonKind().isInequality() and polarity = false
)
or
exists(IsExpr ie, PatternExpr pat |
ie = eqtest and
ie.getExpr() = left and
ie.getPattern() = pat
|
right = pat.(ConstantPatternExpr) and
polarity = true
or
right = pat.(NotPatternExpr).getPattern().(ConstantPatternExpr) and
polarity = false
)
}
class ConditionalExpr = CS::ConditionalExpr;
class Parameter = CS::Parameter;
private int parameterPosition() { result in [-1, any(Parameter p).getPosition()] }
class ParameterPosition extends int {
ParameterPosition() { this = parameterPosition() }
}
class ArgumentPosition extends int {
ArgumentPosition() { this = parameterPosition() }
}
pragma[inline]
predicate parameterMatch(ParameterPosition ppos, ArgumentPosition apos) { ppos = apos }
final private class FinalCallable = Callable;
class NonOverridableMethod extends FinalCallable {
NonOverridableMethod() { not this.(Overridable).isOverridableOrImplementable() }
Parameter getParameter(ParameterPosition ppos) {
super.getParameter(ppos) = result and
not result.isParams()
}
Expr getAReturnExpr() { this.canReturn(result) }
}
class NonOverridableMethodCall extends Expr instanceof Call {
NonOverridableMethod getMethod() { super.getTarget().getUnboundDeclaration() = result }
Expr getArgument(ArgumentPosition apos) {
result = super.getArgumentForParameter(any(Parameter p | p.getPosition() = apos))
}
}
}
private module GuardsImpl = SharedGuards::Make<Location, Cfg, GuardsInput>;
class GuardValue = GuardsImpl::GuardValue;
private module LogicInput implements GuardsImpl::LogicInputSig {
class SsaDefinition extends Ssa::Definition {
Expr getARead() { super.getARead() = result }
}
class SsaWriteDefinition extends SsaDefinition instanceof Ssa::ExplicitDefinition {
Expr getDefinition() { result = super.getADefinition().getSource() }
}
class SsaPhiNode extends SsaDefinition instanceof Ssa::PhiNode {
predicate hasInputFromBlock(SsaDefinition inp, BasicBlock bb) {
super.hasInputFromBlock(inp, bb)
}
}
predicate parameterDefinition(Parameter p, SsaDefinition def) {
def.(Ssa::ImplicitParameterDefinition).getParameter() = p
}
predicate additionalNullCheck(GuardsImpl::PreGuard guard, GuardValue val, Expr e, boolean isNull) {
// Comparison with a non-`null` value, for example `x?.Length > 0`
exists(ComparisonTest ct, ComparisonKind ck, Expr arg | ct.getExpr() = guard |
e instanceof DereferenceableExpr and
ct.getAnArgument() = e and
ct.getAnArgument() = arg and
arg = any(NullValue nv | nv.isNonNull()).getAnExpr() and
ck = ct.getComparisonKind() and
e != arg and
isNull = false and
not ck.isEquality() and
not ck.isInequality() and
val.asBooleanValue() = true
)
or
// Call to `string.IsNullOrEmpty()` or `string.IsNullOrWhiteSpace()`
exists(MethodCall mc, string name | guard = mc |
mc.getTarget() = any(SystemStringClass c).getAMethod(name) and
name.regexpMatch("IsNullOr(Empty|WhiteSpace)") and
mc.getArgument(0) = e and
val.asBooleanValue() = false and
isNull = false
)
or
guard =
any(PatternMatch pm |
e instanceof DereferenceableExpr and
e = pm.getExpr() and
(
val.asBooleanValue().booleanNot() = patternMatchesNull(pm.getPattern()) and
isNull = false
or
exists(TypePatternExpr tpe |
// E.g. `x is string` where `x` has type `string`
typePattern(guard, tpe, tpe.getCheckedType()) and
val.asBooleanValue() = false and
isNull = true
)
)
)
or
e.(DereferenceableExpr).hasNullableType() and
guard =
any(PropertyAccess pa |
pa.getQualifier() = e and
pa.getTarget().hasName("HasValue") and
val.asBooleanValue().booleanNot() = isNull
)
}
predicate additionalImpliesStep(
GuardsImpl::PreGuard g1, GuardValue v1, GuardsImpl::PreGuard g2, GuardValue v2
) {
g1 instanceof DereferenceableExpr and
g1 = getNullEquivParent(g2) and
v1.isNullness(_) and
v2 = v1
or
g1 instanceof DereferenceableExpr and
g2 = getANullImplyingChild(g1) and
v1.isNonNullValue() and
v2 = v1
or
g2 = g1.(NullCoalescingExpr).getAnOperand() and
v1.isNullValue() and
v2 = v1
}
}
module Guards = GuardsImpl::Logic<LogicInput>;
/** An expression whose value may control the execution of another element. */
class Guard extends Expr {

View File

@@ -26,10 +26,7 @@ private module Cached {
TInitializerSplitKind() or
TConditionalCompletionSplitKind() or
TAssertionSplitKind() or
TFinallySplitKind(int nestLevel) { nestLevel = any(Statements::TryStmtTree t).nestLevel() } or
TExceptionHandlerSplitKind() or
TBooleanSplitKind(BooleanSplitting::BooleanSplitSubKind kind) { kind.startsSplit(_) } or
TLoopSplitKind(LoopSplitting::AnalyzableLoopStmt loop)
TExceptionHandlerSplitKind()
cached
newtype TSplit =
@@ -39,15 +36,7 @@ private module Cached {
exists(a.getExpr(i)) and
success in [false, true]
} or
TFinallySplit(FinallySplitting::FinallySplitType type, int nestLevel) {
nestLevel = any(Statements::TryStmtTree t).nestLevel()
} or
TExceptionHandlerSplit(ExceptionClass ec) or
TBooleanSplit(BooleanSplitting::BooleanSplitSubKind kind, boolean branch) {
kind.startsSplit(_) and
branch in [false, true]
} or
TLoopSplit(LoopSplitting::AnalyzableLoopStmt loop)
TExceptionHandlerSplit(ExceptionClass ec)
}
import Cached
@@ -461,241 +450,6 @@ module AssertionSplitting {
}
}
module FinallySplitting {
/**
* The type of a split `finally` node.
*
* The type represents one of the possible ways of entering a `finally`
* block. For example, if a `try` statement ends with a `return` statement,
* then the `finally` block must end with a `return` as well (provided that
* the `finally` block exits normally).
*/
class FinallySplitType extends Cfg::SuccessorType {
FinallySplitType() { not this instanceof Cfg::ConditionalSuccessor }
/** Holds if this split type matches entry into a `finally` block with completion `c`. */
predicate isSplitForEntryCompletion(Completion c) {
if c instanceof NormalCompletion
then
// If the entry into the `finally` block completes with any normal completion,
// it simply means normal execution after the `finally` block
this instanceof Cfg::DirectSuccessor
else this = c.getAMatchingSuccessorType()
}
}
/** A control flow element that belongs to a `finally` block. */
private class FinallyAstNode extends AstNode {
private Statements::TryStmtTree try;
FinallyAstNode() { this = try.getAFinallyDescendant() }
/** Gets the immediate `try` block that this node belongs to. */
Statements::TryStmtTree getTryStmt() { result = try }
/** Holds if this node is the entry node in the `finally` block it belongs to. */
predicate isEntryNode() { first(try.(TryStmt).getFinally(), this) }
}
/**
* A split for elements belonging to a `finally` block, which determines how to
* continue execution after leaving the `finally` block. For example, in
*
* ```csharp
* try
* {
* if (!M())
* throw new Exception();
* }
* finally
* {
* Log.Write("M failed");
* }
* ```
*
* all control flow nodes in the `finally` block have two splits: one representing
* normal execution of the `try` block (when `M()` returns `true`), and one
* representing exceptional execution of the `try` block (when `M()` returns `false`).
*/
class FinallySplit extends Split, TFinallySplit {
private FinallySplitType type;
private int nestLevel;
FinallySplit() { this = TFinallySplit(type, nestLevel) }
/**
* Gets the type of this `finally` split, that is, how to continue execution after the
* `finally` block.
*/
FinallySplitType getType() { result = type }
/** Gets the `finally` nesting level. */
int getNestLevel() { result = nestLevel }
override string toString() {
if type instanceof Cfg::DirectSuccessor
then result = ""
else
if nestLevel > 0
then result = "finally(" + nestLevel + "): " + type.toString()
else result = "finally: " + type.toString()
}
}
private int getListOrder(FinallySplitKind kind) {
result = AssertionSplitting::getNextListOrder() + kind.getNestLevel()
}
int getNextListOrder() {
result = max([getListOrder(_) + 1, AssertionSplitting::getNextListOrder()])
}
private class FinallySplitKind extends SplitKind, TFinallySplitKind {
private int nestLevel;
FinallySplitKind() { this = TFinallySplitKind(nestLevel) }
/** Gets the `finally` nesting level. */
int getNestLevel() { result = nestLevel }
override int getListOrder() { result = getListOrder(this) }
override string toString() { result = "Finally (" + nestLevel + ")" }
}
pragma[nomagic]
private predicate hasEntry0(AstNode pred, FinallyAstNode succ, int nestLevel, Completion c) {
succ.isEntryNode() and
nestLevel = succ.getTryStmt().nestLevel() and
succ(pred, succ, c)
}
private class FinallySplitImpl extends SplitImpl instanceof FinallySplit {
override FinallySplitKind getKind() { result.getNestLevel() = super.getNestLevel() }
override predicate hasEntry(AstNode pred, AstNode succ, Completion c) {
hasEntry0(pred, succ, super.getNestLevel(), c) and
super.getType().isSplitForEntryCompletion(c)
}
override predicate hasEntryScope(CfgScope scope, AstNode first) { none() }
/**
* Holds if this split applies to control flow element `pred`, where `pred`
* is a valid predecessor.
*/
private predicate appliesToPredecessor(AstNode pred) {
this.appliesTo(pred) and
(succ(pred, _, _) or scopeLast(_, pred, _))
}
pragma[noinline]
private predicate exit0(AstNode pred, Statements::TryStmtTree try, int nestLevel, Completion c) {
this.appliesToPredecessor(pred) and
nestLevel = try.nestLevel() and
last(try, pred, c)
}
/**
* Holds if `pred` may exit this split with completion `c`. The Boolean
* `inherited` indicates whether `c` is an inherited completion from a `try`/
* `catch` block.
*/
private predicate exit(AstNode pred, Completion c, boolean inherited) {
exists(TryStmt try, FinallySplitType type |
this.exit0(pred, try, super.getNestLevel(), c) and
type = super.getType()
|
if last(try.getFinally(), pred, c)
then
// Finally block can itself exit with completion `c`: either `c` must
// match this split, `c` must be an abnormal completion, or this split
// does not require another completion to be recovered
inherited = false and
(
type = c.getAMatchingSuccessorType()
or
not c instanceof NormalCompletion
or
type instanceof Cfg::DirectSuccessor
)
else (
// Finally block can exit with completion `c` inherited from try/catch
// block: must match this split
inherited = true and
type = c.getAMatchingSuccessorType() and
not type instanceof Cfg::DirectSuccessor
)
)
or
// If this split is normal, and an outer split can exit based on an inherited
// completion, we need to exit this split as well. For example, in
//
// ```csharp
// bool done;
// try
// {
// if (b1) throw new ExceptionA();
// }
// finally
// {
// try
// {
// if (b2) throw new ExceptionB();
// }
// finally
// {
// done = true;
// }
// }
// ```
//
// if the outer split for `done = true` is `ExceptionA` and the inner split
// is "normal" (corresponding to `b1 = true` and `b2 = false`), then the inner
// split must be able to exit with an `ExceptionA` completion.
this.appliesToPredecessor(pred) and
exists(FinallySplit outer |
outer.getNestLevel() = super.getNestLevel() - 1 and
outer.(FinallySplitImpl).exit(pred, c, inherited) and
super.getType() instanceof Cfg::DirectSuccessor and
inherited = true
)
}
override predicate hasExit(AstNode pred, AstNode succ, Completion c) {
succ(pred, succ, c) and
(
this.exit(pred, c, _)
or
this.exit(pred, c.(NestedBreakCompletion).getAnInnerCompatibleCompletion(), _)
)
}
override predicate hasExitScope(CfgScope scope, AstNode last, Completion c) {
scopeLast(scope, last, c) and
(
this.exit(last, c, _)
or
this.exit(last, c.(NestedBreakCompletion).getAnInnerCompatibleCompletion(), _)
)
}
override predicate hasSuccessor(AstNode pred, AstNode succ, Completion c) {
this.appliesSucc(pred, succ, c) and
succ =
any(FinallyAstNode fcfe |
if fcfe.isEntryNode()
then
// entering a nested `finally` block
fcfe.getTryStmt().nestLevel() > super.getNestLevel()
else
// staying in the same (possibly nested) `finally` block as `pred`
fcfe.getTryStmt().nestLevel() >= super.getNestLevel()
)
}
}
}
module ExceptionHandlerSplitting {
private newtype TMatch =
TAlways() or
@@ -749,12 +503,12 @@ module ExceptionHandlerSplitting {
}
private class ExceptionHandlerSplitKind extends SplitKind, TExceptionHandlerSplitKind {
override int getListOrder() { result = FinallySplitting::getNextListOrder() }
override int getListOrder() { result = AssertionSplitting::getNextListOrder() }
override string toString() { result = "ExceptionHandler" }
}
int getNextListOrder() { result = FinallySplitting::getNextListOrder() + 1 }
int getNextListOrder() { result = AssertionSplitting::getNextListOrder() + 1 }
private class ExceptionHandlerSplitImpl extends SplitImpl instanceof ExceptionHandlerSplit {
override ExceptionHandlerSplitKind getKind() { any() }
@@ -871,452 +625,3 @@ module ExceptionHandlerSplitting {
}
}
}
module BooleanSplitting {
private import semmle.code.csharp.controlflow.internal.PreBasicBlocks
/** A sub-classification of Boolean splits. */
abstract class BooleanSplitSubKind extends TBooleanSplitSubKind {
/**
* Holds if the branch taken by condition `cb1` should be recorded in
* this split, and the recorded value determines the branch taken by a
* later condition `cb2`, possibly inverted.
*
* For example, in
*
* ```csharp
* var b = GetB();
* if (b)
* Console.WriteLine("b is true");
* if (!b)
* Console.WriteLine("b is false");
* ```
*
* the branch taken in the condition on line 2 can be recorded, and the
* recorded value will determine the branch taken in the condition on line 4.
*/
abstract predicate correlatesConditions(ConditionBlock cb1, ConditionBlock cb2, boolean inverted);
/** Holds if control flow element `cfe` starts a split of this kind. */
predicate startsSplit(AstNode cfe) {
this.correlatesConditions(any(ConditionBlock cb | cb.getLastNode() = cfe), _, _)
}
/**
* Holds if basic block `bb` can reach a condition correlated with a
* split of this kind.
*/
abstract predicate canReachCorrelatedCondition(PreBasicBlock bb);
/** Gets the callable that this Boolean split kind belongs to. */
abstract Callable getEnclosingCallable();
/** Gets a textual representation of this Boolean split kind. */
abstract string toString();
/** Gets the location of this Boolean split kind. */
abstract Location getLocation();
}
/**
* A Boolean split that records the value of a Boolean SSA variable.
*
* For example, in
*
* ```csharp
* var b = GetB();
* if (b)
* Console.WriteLine("b is true");
* if (!b)
* Console.WriteLine("b is false");
* ```
*
* there is a Boolean split on the SSA variable for `b` at line 1.
*/
class SsaBooleanSplitSubKind extends BooleanSplitSubKind, TSsaBooleanSplitSubKind {
private PreSsa::Definition def;
SsaBooleanSplitSubKind() { this = TSsaBooleanSplitSubKind(def) }
/**
* Holds if condition `cb` is a read of the SSA variable in this split.
*/
private predicate defCondition(ConditionBlock cb) { cb.getLastNode() = def.getARead() }
/**
* Holds if condition `cb` is a read of the SSA variable in this split,
* and `cb` can be reached from `read` without passing through another
* condition that reads the same SSA variable.
*/
private predicate defConditionReachableFromRead(ConditionBlock cb, AssignableRead read) {
this.defCondition(cb) and
read = cb.getLastNode()
or
exists(AssignableRead mid | this.defConditionReachableFromRead(cb, mid) |
PreSsa::adjacentReadPairSameVar(read, mid) and
not this.defCondition(read)
)
}
/**
* Holds if condition `cb` is a read of the SSA variable in this split,
* and `cb` can be reached from the SSA definition without passing through
* another condition that reads the same SSA variable.
*/
private predicate firstDefCondition(ConditionBlock cb) {
this.defConditionReachableFromRead(cb, def.getAFirstRead())
}
override predicate correlatesConditions(ConditionBlock cb1, ConditionBlock cb2, boolean inverted) {
this.firstDefCondition(cb1) and
exists(AssignableRead read1, AssignableRead read2 |
read1 = cb1.getLastNode() and
PreSsa::adjacentReadPairSameVar+(read1, read2) and
read2 = cb2.getLastNode() and
inverted = false
)
}
override predicate canReachCorrelatedCondition(PreBasicBlock bb) {
this.correlatesConditions(_, bb, _) and
not def.getBasicBlock() = bb
or
exists(PreBasicBlock mid | this.canReachCorrelatedCondition(mid) |
bb = mid.getAPredecessor() and
not def.getBasicBlock() = bb
)
}
override Callable getEnclosingCallable() { result = def.getBasicBlock().getEnclosingCallable() }
override string toString() { result = def.getSourceVariable().toString() }
override Location getLocation() { result = def.getLocation() }
}
/**
* A split for elements that can reach a condition where this split determines
* the Boolean value that the condition evaluates to. For example, in
*
* ```csharp
* if (b)
* Console.WriteLine("b is true");
* if (!b)
* Console.WriteLine("b is false");
* ```
*
* all control flow nodes on line 2 and line 3 have two splits: one representing
* that the condition on line 1 took the `true` branch, and one representing that
* the condition on line 1 took the `false` branch.
*/
class BooleanSplit extends Split, TBooleanSplit {
private BooleanSplitSubKind kind;
private boolean branch;
BooleanSplit() { this = TBooleanSplit(kind, branch) }
/** Gets the kind of this Boolean split. */
BooleanSplitSubKind getSubKind() { result = kind }
/** Gets the branch taken in this split. */
boolean getBranch() { result = branch }
override string toString() {
exists(int line |
line = kind.getLocation().getStartLine() and
result = kind.toString() + " (line " + line + "): " + branch.toString()
)
}
}
private int getListOrder(BooleanSplitSubKind kind) {
exists(Callable c, int r | c = kind.getEnclosingCallable() |
result = r + ExceptionHandlerSplitting::getNextListOrder() - 1 and
kind =
rank[r](BooleanSplitSubKind kind0, Location l |
kind0.getEnclosingCallable() = c and
kind0.startsSplit(_) and
l = kind0.getLocation()
|
kind0 order by l.getStartLine(), l.getStartColumn(), kind0.toString()
)
)
}
int getNextListOrder() {
result = max([getListOrder(_) + 1, ExceptionHandlerSplitting::getNextListOrder()])
}
private class BooleanSplitKind extends SplitKind, TBooleanSplitKind {
private BooleanSplitSubKind kind;
BooleanSplitKind() { this = TBooleanSplitKind(kind) }
/** Gets the sub kind of this Boolean split kind. */
BooleanSplitSubKind getSubKind() { result = kind }
override int getListOrder() { result = getListOrder(kind) }
override string toString() { result = kind.toString() }
}
pragma[nomagic]
private predicate hasEntry0(
AstNode pred, AstNode succ, BooleanSplitSubKind kind, boolean b, Completion c
) {
kind.startsSplit(pred) and
succ(pred, succ, c) and
b = c.getInnerCompletion().(BooleanCompletion).getValue()
}
private class BooleanSplitImpl extends SplitImpl instanceof BooleanSplit {
override BooleanSplitKind getKind() { result.getSubKind() = super.getSubKind() }
override predicate hasEntry(AstNode pred, AstNode succ, Completion c) {
hasEntry0(pred, succ, super.getSubKind(), super.getBranch(), c)
}
override predicate hasEntryScope(CfgScope scope, AstNode first) { none() }
private ConditionBlock getACorrelatedCondition(boolean inverted) {
super.getSubKind().correlatesConditions(_, result, inverted)
}
/**
* Holds if this split applies to basic block `bb`, where the the last
* element of `bb` can have completion `c`.
*/
private predicate appliesToBlock(PreBasicBlock bb, Completion c) {
this.appliesTo(bb) and
exists(AstNode last | last = bb.getLastNode() |
(succ(last, _, c) or scopeLast(_, last, c)) and
// Respect the value recorded in this split for all correlated conditions
forall(boolean inverted | bb = this.getACorrelatedCondition(inverted) |
c.getInnerCompletion() instanceof BooleanCompletion
implies
c.getInnerCompletion().(BooleanCompletion).getValue() =
super.getBranch().booleanXor(inverted)
)
)
}
override predicate hasExit(AstNode pred, AstNode succ, Completion c) {
exists(PreBasicBlock bb | this.appliesToBlock(bb, c) |
pred = bb.getLastNode() and
succ(pred, succ, c) and
// Exit this split if we can no longer reach a correlated condition
not super.getSubKind().canReachCorrelatedCondition(succ)
)
}
override predicate hasExitScope(CfgScope scope, AstNode last, Completion c) {
exists(PreBasicBlock bb | this.appliesToBlock(bb, c) |
last = bb.getLastNode() and
scopeLast(scope, last, c)
)
}
override predicate hasSuccessor(AstNode pred, AstNode succ, Completion c) {
exists(PreBasicBlock bb, Completion c0 | this.appliesToBlock(bb, c0) |
pred = bb.getAnElement() and
this.appliesSucc(pred, succ, c) and
(
pred = bb.getLastNode()
implies
(
// We must still be able to reach a correlated condition to stay in this split
super.getSubKind().canReachCorrelatedCondition(succ) and
c = c0
)
)
)
}
}
}
module LoopSplitting {
private import semmle.code.csharp.controlflow.Guards as Guards
private import PreBasicBlocks
/** Holds if `ce` is guarded by a (non-)empty check, as specified by `v`. */
private predicate emptinessGuarded(
Guards::Guard g, Guards::EnumerableCollectionExpr ce,
Guards::AbstractValues::EmptyCollectionValue v
) {
exists(PreBasicBlock bb | Guards::Internal::preControls(g, bb, v) |
PreSsa::adjacentReadPairSameVar(g, ce) and
bb.getAnElement() = ce
)
}
/**
* A loop where the body is guaranteed to be executed at least once, and hence
* can be unrolled in the control flow graph, or where the body is guaranteed
* to never be executed, and hence can be removed from the control flow graph.
*/
abstract class AnalyzableLoopStmt extends LoopStmt {
/** Holds if the step `pred --c--> succ` should start the split. */
abstract predicate start(AstNode pred, AstNode succ, Completion c);
/** Holds if the step `pred --c--> succ` should stop the split. */
abstract predicate stop(AstNode pred, AstNode succ, Completion c);
/**
* Holds if any step `pred --c--> _` should be pruned from the control flow graph.
*/
abstract predicate pruneLoopCondition(AstNode pred, ConditionalCompletion c);
/**
* Holds if the body is guaranteed to be executed at least once. If not, the
* body is guaranteed to never be executed.
*/
abstract predicate isUnroll();
}
private class AnalyzableForeachStmt extends AnalyzableLoopStmt, ForeachStmt {
Guards::AbstractValues::EmptyCollectionValue v;
AnalyzableForeachStmt() {
/*
* We use `unique` to avoid degenerate cases like
* ```csharp
* if (xs.Length == 0)
* return;
* if (xs.Length > 0)
* return;
* foreach (var x in xs)
* ....
* ```
* where the iterator expression `xs` is guarded by both an emptiness check
* and a non-emptiness check.
*/
v =
unique(Guards::AbstractValues::EmptyCollectionValue v0 |
emptinessGuarded(_, this.getIterableExpr(), v0)
or
this.getIterableExpr() = v0.getAnExpr()
|
v0
)
}
override predicate start(AstNode pred, AstNode succ, Completion c) {
last(this.getIterableExpr(), pred, c) and
succ = this
}
override predicate stop(AstNode pred, AstNode succ, Completion c) {
pred = this and
succ(pred, succ, c)
}
override predicate pruneLoopCondition(AstNode pred, ConditionalCompletion c) {
pred = this and
c = any(EmptinessCompletion ec | if v.isEmpty() then not ec.isEmpty() else ec.isEmpty())
}
override predicate isUnroll() { v.isNonEmpty() }
}
/**
* A split for loops where the body is guaranteed to be executed at least once, or
* guaranteed to never be executed. For example, in
*
* ```csharp
* void M(string[] args)
* {
* if (args.Length == 0)
* return;
* foreach (var arg in args)
* System.Console.WriteLine(args);
* }
* ```
*
* the `foreach` loop is guaranteed to be executed at least once, as a result of the
* `args.Length == 0` check.
*/
class LoopSplit extends Split, TLoopSplit {
AnalyzableLoopStmt loop;
LoopSplit() { this = TLoopSplit(loop) }
override string toString() {
if loop.isUnroll()
then result = "unroll (line " + loop.getLocation().getStartLine() + ")"
else result = "skip (line " + loop.getLocation().getStartLine() + ")"
}
}
pragma[noinline]
private Callable enclosingCallable(AnalyzableLoopStmt loop) {
result = loop.getEnclosingCallable()
}
private int getListOrder(AnalyzableLoopStmt loop) {
exists(Callable c, int r | c = enclosingCallable(loop) |
result = r + BooleanSplitting::getNextListOrder() - 1 and
loop =
rank[r](AnalyzableLoopStmt loop0, Location l |
enclosingCallable(loop0) = c and
l = loop0.getLocation()
|
loop0 order by l.getStartLine(), l.getStartColumn()
)
)
}
int getNextListOrder() {
result = max([getListOrder(_) + 1, BooleanSplitting::getNextListOrder()])
}
private class LoopSplitKind extends SplitKind, TLoopSplitKind {
private AnalyzableLoopStmt loop;
LoopSplitKind() { this = TLoopSplitKind(loop) }
override int getListOrder() { result = getListOrder(loop) }
override string toString() { result = "Unroll" }
}
private class LoopUnrollingSplitImpl extends SplitImpl instanceof LoopSplit {
AnalyzableLoopStmt loop;
LoopUnrollingSplitImpl() { this = TLoopSplit(loop) }
override LoopSplitKind getKind() { result = TLoopSplitKind(loop) }
override predicate hasEntry(AstNode pred, AstNode succ, Completion c) {
loop.start(pred, succ, c)
}
override predicate hasEntryScope(CfgScope scope, AstNode first) { none() }
/**
* Holds if this split applies to control flow element `pred`, where `pred`
* is a valid predecessor.
*/
private predicate appliesToPredecessor(AstNode pred, Completion c) {
this.appliesTo(pred) and
(succ(pred, _, c) or scopeLast(_, pred, c)) and
not loop.pruneLoopCondition(pred, c)
}
override predicate hasExit(AstNode pred, AstNode succ, Completion c) {
this.appliesToPredecessor(pred, c) and
loop.stop(pred, succ, c)
}
override predicate hasExitScope(CfgScope scope, AstNode last, Completion c) {
this.appliesToPredecessor(last, c) and
scopeLast(scope, last, c)
}
override predicate hasSuccessor(AstNode pred, AstNode succ, Completion c) {
this.appliesToPredecessor(pred, c) and
this.appliesSucc(pred, succ, c) and
not loop.stop(pred, succ, c)
}
}
}

View File

@@ -20,33 +20,35 @@
import csharp
private import ControlFlow
private import internal.CallableReturns
private import semmle.code.csharp.commons.Assertions
private import semmle.code.csharp.controlflow.Guards as G
private import semmle.code.csharp.controlflow.Guards::AbstractValues
private import semmle.code.csharp.dataflow.internal.SsaImpl as SsaImpl
private import semmle.code.csharp.frameworks.System
private import semmle.code.csharp.frameworks.Test
private import semmle.code.csharp.controlflow.ControlFlowReachability as Cf
private Expr maybeNullExpr(Expr reason) {
G::Internal::nullValue(result) and reason = result
or
result instanceof AsExpr and reason = result
or
result.(AssignExpr).getRValue() = maybeNullExpr(reason)
or
result.(CastExpr).getExpr() = maybeNullExpr(reason)
or
result =
any(ConditionalExpr ce |
ce.getThen() = maybeNullExpr(reason)
or
ce.getElse() = maybeNullExpr(reason)
)
or
result.(NullCoalescingExpr).getRightOperand() = maybeNullExpr(reason)
}
/** An expression that may be `null`. */
class MaybeNullExpr extends Expr {
MaybeNullExpr() {
G::Internal::nullValue(this)
or
this instanceof AsExpr
or
this.(AssignExpr).getRValue() instanceof MaybeNullExpr
or
this.(Cast).getExpr() instanceof MaybeNullExpr
or
this =
any(ConditionalExpr ce |
ce.getThen() instanceof MaybeNullExpr
or
ce.getElse() instanceof MaybeNullExpr
)
or
this.(NullCoalescingExpr).getRightOperand() instanceof MaybeNullExpr
}
MaybeNullExpr() { this = maybeNullExpr(_) }
}
/** An expression that is always `null`. */
@@ -116,43 +118,10 @@ private predicate nonNullDef(Ssa::ExplicitDefinition def) {
}
/**
* Holds if the `i`th node of basic block `bb` is a dereference `d` of SSA
* definition `def`.
* Holds if `node` is a dereference `d` of SSA definition `def`.
*/
private predicate dereferenceAt(BasicBlock bb, int i, Ssa::Definition def, Dereference d) {
d = def.getAReadAtNode(bb.getNode(i))
}
/**
* Holds if `e` having abstract value `vExpr` implies that SSA definition `def`
* has abstract value `vDef`.
*/
private predicate exprImpliesSsaDef(
G::Guard e, G::AbstractValue vExpr, Ssa::Definition def, G::AbstractValue vDef
) {
vExpr = e.getAValue() and
vExpr = vDef and
(
e = def.getARead()
or
e = def.(Ssa::ExplicitDefinition).getADefinition().getTargetAccess()
)
or
exists(Expr e0, G::AbstractValue vExpr0 |
exprImpliesSsaDef(e0, vExpr0, def, vDef) and
G::Internal::impliesStep(e, vExpr, e0, vExpr0)
)
}
/**
* Gets an element that tests whether a given SSA definition, `def`, is
* `null` or not.
*
* If the returned element takes the `s` branch, then `def` is guaranteed to be
* `null` if `nv.isNull()` holds, and non-`null` otherwise.
*/
private ControlFlowElement getANullCheck(Ssa::Definition def, ConditionalSuccessor s, NullValue nv) {
exists(Expr e, G::AbstractValue v | v.branch(result, s, e) | exprImpliesSsaDef(e, v, def, nv))
private predicate dereferenceAt(ControlFlow::Node node, Ssa::Definition def, Dereference d) {
d = def.getAReadAtNode(node)
}
private predicate isMaybeNullArgument(Ssa::ImplicitParameterDefinition def, MaybeNullExpr arg) {
@@ -217,13 +186,16 @@ private predicate isNullDefaultArgument(Ssa::ImplicitParameterDefinition def, Al
}
/** Holds if `def` is an SSA definition that may be `null`. */
private predicate defMaybeNull(Ssa::Definition def, string msg, Element reason) {
private predicate defMaybeNull(
Ssa::Definition def, ControlFlow::Node node, string msg, Element reason
) {
not nonNullDef(def) and
(
// A variable compared to `null` might be `null`
exists(G::DereferenceableExpr de | de = def.getARead() |
reason = de.getANullCheck(_, true) and
msg = "as suggested by $@ null check" and
node = def.getControlFlowNode() and
not de = any(Ssa::PhiNode phi).getARead() and
strictcount(Element e | e = any(Ssa::Definition def0 | de = def0.getARead()).getElement()) = 1 and
// Don't use a check as reason if there is a `null` assignment
@@ -234,23 +206,27 @@ private predicate defMaybeNull(Ssa::Definition def, string msg, Element reason)
or
// A parameter might be `null` if there is a `null` argument somewhere
isMaybeNullArgument(def, reason) and
node = def.getControlFlowNode() and
(
if reason instanceof AlwaysNullExpr
then msg = "because of $@ null argument"
else msg = "because of $@ potential null argument"
)
or
isNullDefaultArgument(def, reason) and msg = "because the parameter has a null default value"
isNullDefaultArgument(def, reason) and
node = def.getControlFlowNode() and
msg = "because the parameter has a null default value"
or
// If the source of a variable is `null` then the variable may be `null`
exists(AssignableDefinition adef | adef = def.(Ssa::ExplicitDefinition).getADefinition() |
adef.getSource() instanceof MaybeNullExpr and
adef.getSource() = maybeNullExpr(node.getAstNode()) and
reason = adef.getExpr() and
msg = "because of $@ assignment"
)
or
// A variable of nullable type may be null
exists(Dereference d | dereferenceAt(_, _, def, d) |
exists(Dereference d | dereferenceAt(_, def, d) |
node = def.getControlFlowNode() and
d.hasNullableType() and
not def instanceof Ssa::PhiNode and
reason = def.getSourceVariable().getAssignable() and
@@ -259,219 +235,6 @@ private predicate defMaybeNull(Ssa::Definition def, string msg, Element reason)
)
}
pragma[noinline]
private predicate sourceVariableMaybeNull(Ssa::SourceVariable v) {
defMaybeNull(v.getAnSsaDefinition(), _, _)
}
pragma[noinline]
private predicate defNullImpliesStep0(
Ssa::SourceVariable v, Ssa::Definition def1, BasicBlock bb1, BasicBlock bb2
) {
sourceVariableMaybeNull(v) and
def1.getSourceVariable() = v and
def1.isLiveAtEndOfBlock(bb1) and
bb2 = bb1.getASuccessor()
}
/**
* Holds if `def1` being `null` in basic block `bb1` implies that `def2` might
* be `null` in basic block `bb2`. The SSA definitions share the same source
* variable.
*/
private predicate defNullImpliesStep(
Ssa::Definition def1, BasicBlock bb1, Ssa::Definition def2, BasicBlock bb2
) {
exists(Ssa::SourceVariable v | defNullImpliesStep0(v, def1, bb1, bb2) |
def2.(Ssa::PhiNode).getAnInput() = def1 and
bb2 = def2.getBasicBlock()
or
def2 = def1 and
not exists(Ssa::PhiNode phi |
phi.getSourceVariable() = v and
bb2 = phi.getBasicBlock()
)
) and
not exists(ConditionalSuccessor s, NullValue nv |
bb1.getLastNode() = getANullCheck(def1, s, nv).getAControlFlowNode()
|
bb2 = bb1.getASuccessor(s) and
nv.isNonNull()
)
}
/**
* The transitive closure of `defNullImpliesStep()` originating from `defMaybeNull()`.
* That is, those basic blocks for which the SSA definition is suspected of being `null`.
*/
private predicate defMaybeNullInBlock(Ssa::Definition def, BasicBlock bb) {
defMaybeNull(def, _, _) and
bb = def.getBasicBlock()
or
exists(BasicBlock mid, Ssa::Definition midDef | defMaybeNullInBlock(midDef, mid) |
defNullImpliesStep(midDef, mid, def, bb)
)
}
/**
* Holds if `v` is a source variable that might reach a potential `null`
* dereference.
*/
private predicate nullDerefCandidateVariable(Ssa::SourceVariable v) {
exists(Ssa::Definition def, BasicBlock bb | dereferenceAt(bb, _, def, _) |
defMaybeNullInBlock(def, bb) and
v = def.getSourceVariable()
)
}
private predicate succStep(PathNode pred, Ssa::Definition def, BasicBlock bb) {
defNullImpliesStep(pred.getSsaDefinition(), pred.getBasicBlock(), def, bb)
}
private predicate succNullArgument(SourcePathNode pred, Ssa::Definition def, BasicBlock bb) {
pred = TSourcePathNode(def, _, _, true) and
bb = def.getBasicBlock()
}
private predicate succSourceSink(SourcePathNode source, Ssa::Definition def, BasicBlock bb) {
source = TSourcePathNode(def, _, _, false) and
bb = def.getBasicBlock()
}
private newtype TPathNode =
TSourcePathNode(Ssa::Definition def, string msg, Element reason, boolean isNullArgument) {
nullDerefCandidateVariable(def.getSourceVariable()) and
defMaybeNull(def, msg, reason) and
if isMaybeNullArgument(def, reason) then isNullArgument = true else isNullArgument = false
} or
TInternalPathNode(Ssa::Definition def, BasicBlock bb) {
succStep(_, def, bb)
or
succNullArgument(_, def, bb)
} or
TSinkPathNode(Ssa::Definition def, BasicBlock bb, int i, Dereference d) {
dereferenceAt(bb, i, def, d) and
(
succStep(_, def, bb)
or
succNullArgument(_, def, bb)
or
succSourceSink(_, def, bb)
)
}
/**
* An SSA definition, which may be `null`, augmented with at basic block which can
* be reached without passing through a `null` check.
*/
abstract class PathNode extends TPathNode {
/** Gets the SSA definition. */
abstract Ssa::Definition getSsaDefinition();
/** Gets the basic block that can be reached without passing through a `null` check. */
abstract BasicBlock getBasicBlock();
/** Gets another node that can be reached from this node. */
abstract PathNode getASuccessor();
/** Gets a textual representation of this node. */
abstract string toString();
/** Gets the location of this node. */
abstract Location getLocation();
}
private class SourcePathNode extends PathNode, TSourcePathNode {
private Ssa::Definition def;
private string msg;
private Element reason;
private boolean isNullArgument;
SourcePathNode() { this = TSourcePathNode(def, msg, reason, isNullArgument) }
override Ssa::Definition getSsaDefinition() { result = def }
override BasicBlock getBasicBlock() {
isNullArgument = false and
result = def.getBasicBlock()
}
string getMessage() { result = msg }
Element getReason() { result = reason }
override PathNode getASuccessor() {
succStep(this, result.getSsaDefinition(), result.getBasicBlock())
or
succNullArgument(this, result.getSsaDefinition(), result.getBasicBlock())
or
result instanceof SinkPathNode and
succSourceSink(this, result.getSsaDefinition(), result.getBasicBlock())
}
override string toString() {
if isNullArgument = true then result = reason.toString() else result = def.toString()
}
override Location getLocation() {
if isNullArgument = true then result = reason.getLocation() else result = def.getLocation()
}
}
private class InternalPathNode extends PathNode, TInternalPathNode {
private Ssa::Definition def;
private BasicBlock bb;
InternalPathNode() { this = TInternalPathNode(def, bb) }
override Ssa::Definition getSsaDefinition() { result = def }
override BasicBlock getBasicBlock() { result = bb }
override PathNode getASuccessor() {
succStep(this, result.getSsaDefinition(), result.getBasicBlock())
}
override string toString() { result = bb.getFirstNode().toString() }
override Location getLocation() { result = bb.getFirstNode().getLocation() }
}
private class SinkPathNode extends PathNode, TSinkPathNode {
private Ssa::Definition def;
private BasicBlock bb;
private int i;
private Dereference d;
SinkPathNode() { this = TSinkPathNode(def, bb, i, d) }
override Ssa::Definition getSsaDefinition() { result = def }
override BasicBlock getBasicBlock() { result = bb }
override PathNode getASuccessor() { none() }
Dereference getDereference() { result = d }
override string toString() { result = d.toString() }
override Location getLocation() { result = d.getLocation() }
}
/**
* Provides the query predicates needed to include a graph in a path-problem query
* for `Dereference::is[First]MaybeNull()`.
*/
module PathGraph {
query predicate nodes(PathNode n) { n.getASuccessor*() instanceof SinkPathNode }
query predicate edges(PathNode pred, PathNode succ) {
nodes(pred) and
nodes(succ) and
succ = pred.getASuccessor()
}
}
private Ssa::Definition getAPseudoInput(Ssa::Definition def) {
result = def.(Ssa::PhiNode).getAnInput()
}
@@ -485,21 +248,44 @@ private Ssa::Definition getAnUltimateDefinition(Ssa::Definition def) {
/**
* Holds if SSA definition `def` can reach a read at `cfn`, without passing
* through an intermediate dereference that always (`always = true`) or
* maybe (`always = false`) throws a null reference exception.
* through an intermediate dereference that always throws a null reference
* exception.
*/
private predicate defReaches(Ssa::Definition def, ControlFlow::Node cfn, boolean always) {
exists(def.getAFirstReadAtNode(cfn)) and
(always = true or always = false)
private predicate defReaches(Ssa::Definition def, ControlFlow::Node cfn) {
exists(def.getAFirstReadAtNode(cfn))
or
exists(ControlFlow::Node mid | defReaches(def, mid, always) |
exists(ControlFlow::Node mid | defReaches(def, mid) |
SsaImpl::adjacentReadPairSameVar(_, mid, cfn) and
not mid =
any(Dereference d |
if always = true
then d.isAlwaysNull(def.getSourceVariable())
else d.isMaybeNull(def, _, _, _, _)
).getAControlFlowNode()
not mid = any(Dereference d | d.isAlwaysNull(def.getSourceVariable())).getAControlFlowNode()
)
}
private module NullnessConfig implements Cf::ControlFlowReachability::ConfigSig {
predicate source(ControlFlow::Node node, Ssa::Definition def) { defMaybeNull(def, node, _, _) }
predicate sink(ControlFlow::Node node, Ssa::Definition def) {
exists(Dereference d |
dereferenceAt(node, def, d) and
not d instanceof NonNullExpr
)
}
predicate barrierValue(G::GuardValue gv) { gv.isNullness(false) }
predicate uncertainFlow() { none() }
}
private module NullnessFlow = Cf::ControlFlowReachability::Flow<NullnessConfig>;
predicate maybeNullDeref(Dereference d, Ssa::SourceVariable v, string msg, Element reason) {
exists(
Ssa::Definition origin, Ssa::Definition ssa, ControlFlow::Node src, ControlFlow::Node sink
|
defMaybeNull(origin, src, msg, reason) and
NullnessFlow::flow(src, origin, sink, ssa) and
ssa.getSourceVariable() = v and
dereferenceAt(sink, ssa, d) and
not d.isAlwaysNull(v)
)
}
@@ -597,33 +383,6 @@ class Dereference extends G::DereferenceableExpr {
*/
predicate isFirstAlwaysNull(Ssa::SourceVariable v) {
this.isAlwaysNull(v) and
defReaches(v.getAnSsaDefinition(), this.getAControlFlowNode(), true)
}
/**
* Holds if this expression dereferences SSA definition `def`, which may
* be `null`.
*/
predicate isMaybeNull(
Ssa::Definition def, SourcePathNode source, SinkPathNode sink, string msg, Element reason
) {
source.getASuccessor*() = sink and
msg = source.getMessage() and
reason = source.getReason() and
def = sink.getSsaDefinition() and
this = sink.getDereference() and
not this.isAlwaysNull(def.getSourceVariable())
}
/**
* Holds if this expression dereferences SSA definition `def`, which may
* be `null`, and this expression can be reached from `def` without passing
* through another such dereference.
*/
predicate isFirstMaybeNull(
Ssa::Definition def, SourcePathNode source, SinkPathNode sink, string msg, Element reason
) {
this.isMaybeNull(def, source, sink, msg, reason) and
defReaches(def, this.getAControlFlowNode(), false)
defReaches(v.getAnSsaDefinition(), this.getAControlFlowNode())
}
}

View File

@@ -163,13 +163,11 @@ module Ssa {
* (`ImplicitDefinition`), or a phi node (`PhiNode`).
*/
class Definition extends SsaImpl::Definition {
/**
* Gets the control flow node of this SSA definition, if any. Phi nodes are
* examples of SSA definitions without a control flow node, as they are
* modeled at index `-1` in the relevant basic block.
*/
/** Gets the control flow node of this SSA definition. */
final ControlFlow::Node getControlFlowNode() {
exists(ControlFlow::BasicBlock bb, int i | this.definesAt(_, bb, i) | result = bb.getNode(i))
exists(ControlFlow::BasicBlock bb, int i | this.definesAt(_, bb, i) |
result = bb.getNode(0.maximum(i))
)
}
/**

View File

@@ -16,16 +16,94 @@
import csharp
import semmle.code.csharp.commons.Assertions
import semmle.code.csharp.commons.Constants
import semmle.code.csharp.controlflow.BasicBlocks
import semmle.code.csharp.controlflow.Guards as Guards
import codeql.controlflow.queries.ConstantCondition as ConstCond
module ConstCondInput implements ConstCond::InputSig<ControlFlow::BasicBlock> {
class SsaDefinition = Ssa::Definition;
class GuardValue = Guards::GuardValue;
class Guard = Guards::Guards::Guard;
predicate ssaControlsBranchEdge(SsaDefinition def, BasicBlock bb1, BasicBlock bb2, GuardValue v) {
Guards::Guards::ssaControlsBranchEdge(def, bb1, bb2, v)
}
predicate ssaControls(SsaDefinition def, BasicBlock bb, GuardValue v) {
Guards::Guards::ssaControls(def, bb, v)
}
import Guards::Guards::InternalUtil
}
module ConstCondImpl = ConstCond::Make<Location, Cfg, ConstCondInput>;
predicate nullCheck(Expr e, boolean direct) {
exists(QualifiableExpr qe | qe.isConditional() and qe.getQualifier() = e and direct = true)
or
exists(NullCoalescingExpr nce | nce.getLeftOperand() = e and direct = true)
or
exists(ConditionalExpr ce | ce.getThen() = e or ce.getElse() = e |
nullCheck(ce, _) and direct = false
)
}
predicate constantGuard(
Guards::Guards::Guard g, string msg, Guards::Guards::Guard reason, string reasonMsg
) {
ConstCondImpl::problems(g, msg, reason, reasonMsg) and
// conditional qualified expressions sit at an akward place in the CFG, which
// leads to FPs
not g.(QualifiableExpr).getQualifier() = reason and
// and if they're extension method calls, the syntactic qualifier is actually argument 0
not g.(ExtensionMethodCall).getArgument(0) = reason and
// if a logical connective is constant, one of its operands is constant, so
// we report that instead
not g instanceof LogicalNotExpr and
not g instanceof LogicalAndExpr and
not g instanceof LogicalOrExpr and
// if a logical connective is a reason for another condition to be constant,
// then one of its operands is a more precise reason
not reason instanceof LogicalNotExpr and
not reason instanceof LogicalAndExpr and
not reason instanceof LogicalOrExpr and
// don't report double-checked locking
not exists(LockStmt ls, BasicBlock bb |
bb = ls.getBasicBlock() and
reason.getBasicBlock().strictlyDominates(bb) and
bb.dominates(g.getBasicBlock())
) and
// exclude indirect null checks like `x` in `(b ? x : null)?.Foo()`
not nullCheck(g, false)
}
/** A constant condition. */
abstract class ConstantCondition extends Expr {
abstract class ConstantCondition extends Guards::Guards::Guard {
/** Gets the alert message for this constant condition. */
abstract string getMessage();
predicate hasReason(Guards::Guards::Guard reason, string reasonMsg) {
// dummy value, overridden when message has a placeholder
reason = this and reasonMsg = "dummy"
}
/** Holds if this constant condition is white-listed. */
predicate isWhiteListed() { none() }
}
/** A constant guard. */
class ConstantGuard extends ConstantCondition {
ConstantGuard() { constantGuard(this, _, _, _) }
override string getMessage() { constantGuard(this, result, _, _) }
override predicate hasReason(Guards::Guards::Guard reason, string reasonMsg) {
constantGuard(this, _, reason, reasonMsg)
}
}
/** A constant Boolean condition. */
class ConstantBooleanCondition extends ConstantCondition {
boolean b;
@@ -111,6 +189,7 @@ class ConstantMatchingCondition extends ConstantCondition {
boolean b;
ConstantMatchingCondition() {
this instanceof Expr and
forex(ControlFlow::Node cfn | cfn = this.getAControlFlowNode() |
exists(ControlFlow::MatchingSuccessor t | exists(cfn.getASuccessorByType(t)) |
b = t.getValue()
@@ -138,9 +217,10 @@ class ConstantMatchingCondition extends ConstantCondition {
}
}
from ConstantCondition c, string msg
from ConstantCondition c, string msg, Guards::Guards::Guard reason, string reasonMsg
where
msg = c.getMessage() and
c.hasReason(reason, reasonMsg) and
not c.isWhiteListed() and
not isExprInAssertion(c)
select c, msg
select c, msg, reason, reasonMsg

View File

@@ -2,7 +2,7 @@
* @name Dereferenced variable may be null
* @description Dereferencing a variable whose value may be 'null' may cause a
* 'NullReferenceException'.
* @kind path-problem
* @kind problem
* @problem.severity warning
* @precision high
* @id cs/dereferenced-value-may-be-null
@@ -15,10 +15,7 @@
import csharp
import semmle.code.csharp.dataflow.Nullness
import PathGraph
from
Dereference d, PathNode source, PathNode sink, Ssa::SourceVariable v, string msg, Element reason
where d.isFirstMaybeNull(v.getAnSsaDefinition(), source, sink, msg, reason)
select d, source, sink, "Variable $@ may be null at this access " + msg + ".", v, v.toString(),
reason, "this"
from Dereference d, Ssa::SourceVariable v, string msg, Element reason
where maybeNullDeref(d, v, msg, reason)
select d, "Variable $@ may be null at this access " + msg + ".", v, v.toString(), reason, "this"

View File

@@ -81,7 +81,6 @@
| Discards.cs:25:22:25:22 | String _ | Discards.cs:25:22:25:22 | String _ |
| Finally.cs:7:13:7:17 | Int32 i = ... | Finally.cs:7:13:7:17 | Int32 i = ... |
| Finally.cs:15:13:15:17 | ... = ... | Finally.cs:15:13:15:17 | ... = ... |
| Finally.cs:15:13:15:17 | ... = ... | Finally.cs:15:13:15:17 | [finally: exception] ... = ... |
| Patterns.cs:7:16:7:23 | Object o = ... | Patterns.cs:7:16:7:23 | Object o = ... |
| Patterns.cs:8:18:8:23 | Int32 i1 | Patterns.cs:8:18:8:23 | Int32 i1 |
| Patterns.cs:12:23:12:31 | String s1 | Patterns.cs:12:23:12:31 | String s1 |

View File

@@ -69,119 +69,118 @@
| Assert.cs:52:9:52:33 | [assertion success] call to method IsFalse | Assert.cs:49:10:49:11 | exit M7 (normal) | 6 |
| Assert.cs:56:10:56:11 | enter M8 | Assert.cs:58:20:58:20 | access to parameter b | 4 |
| Assert.cs:56:10:56:11 | exit M8 | Assert.cs:56:10:56:11 | exit M8 | 1 |
| Assert.cs:58:24:58:27 | [b (line 56): true] null | Assert.cs:59:23:59:31 | [b (line 56): true] ... != ... | 7 |
| Assert.cs:58:31:58:32 | [b (line 56): false] "" | Assert.cs:59:23:59:31 | [b (line 56): false] ... != ... | 7 |
| Assert.cs:58:20:58:32 | ... ? ... : ... | Assert.cs:59:23:59:31 | ... != ... | 6 |
| Assert.cs:58:24:58:27 | null | Assert.cs:58:24:58:27 | null | 1 |
| Assert.cs:58:31:58:32 | "" | Assert.cs:58:31:58:32 | "" | 1 |
| Assert.cs:59:9:59:37 | [assertion failure] call to method IsTrue | Assert.cs:56:10:56:11 | exit M8 (abnormal) | 2 |
| Assert.cs:59:9:59:37 | [assertion success] call to method IsTrue | Assert.cs:56:10:56:11 | exit M8 (normal) | 6 |
| Assert.cs:59:23:59:36 | [false] ... && ... | Assert.cs:59:23:59:36 | [false] ... && ... | 1 |
| Assert.cs:59:23:59:36 | [true] ... && ... | Assert.cs:59:23:59:36 | [true] ... && ... | 1 |
| Assert.cs:59:36:59:36 | [b (line 56): false] access to parameter b | Assert.cs:59:36:59:36 | [b (line 56): false] access to parameter b | 1 |
| Assert.cs:59:36:59:36 | [b (line 56): true] access to parameter b | Assert.cs:59:36:59:36 | [b (line 56): true] access to parameter b | 1 |
| Assert.cs:59:36:59:36 | access to parameter b | Assert.cs:59:36:59:36 | access to parameter b | 1 |
| Assert.cs:63:10:63:11 | enter M9 | Assert.cs:65:20:65:20 | access to parameter b | 4 |
| Assert.cs:63:10:63:11 | exit M9 | Assert.cs:63:10:63:11 | exit M9 | 1 |
| Assert.cs:65:24:65:27 | [b (line 63): true] null | Assert.cs:66:24:66:32 | [b (line 63): true] ... == ... | 7 |
| Assert.cs:65:31:65:32 | [b (line 63): false] "" | Assert.cs:66:24:66:32 | [b (line 63): false] ... == ... | 7 |
| Assert.cs:65:20:65:32 | ... ? ... : ... | Assert.cs:66:24:66:32 | ... == ... | 6 |
| Assert.cs:65:24:65:27 | null | Assert.cs:65:24:65:27 | null | 1 |
| Assert.cs:65:31:65:32 | "" | Assert.cs:65:31:65:32 | "" | 1 |
| Assert.cs:66:9:66:38 | [assertion failure] call to method IsFalse | Assert.cs:63:10:63:11 | exit M9 (abnormal) | 2 |
| Assert.cs:66:9:66:38 | [assertion success] call to method IsFalse | Assert.cs:63:10:63:11 | exit M9 (normal) | 6 |
| Assert.cs:66:24:66:37 | [false] ... \|\| ... | Assert.cs:66:24:66:37 | [false] ... \|\| ... | 1 |
| Assert.cs:66:24:66:37 | [true] ... \|\| ... | Assert.cs:66:24:66:37 | [true] ... \|\| ... | 1 |
| Assert.cs:66:37:66:37 | [b (line 63): false] access to parameter b | Assert.cs:66:37:66:37 | [b (line 63): false] access to parameter b | 1 |
| Assert.cs:66:37:66:37 | [b (line 63): true] access to parameter b | Assert.cs:66:37:66:37 | [b (line 63): true] access to parameter b | 1 |
| Assert.cs:66:37:66:37 | access to parameter b | Assert.cs:66:37:66:37 | access to parameter b | 1 |
| Assert.cs:70:10:70:12 | enter M10 | Assert.cs:72:20:72:20 | access to parameter b | 4 |
| Assert.cs:70:10:70:12 | exit M10 | Assert.cs:70:10:70:12 | exit M10 | 1 |
| Assert.cs:72:24:72:27 | [b (line 70): true] null | Assert.cs:73:23:73:31 | [b (line 70): true] ... == ... | 7 |
| Assert.cs:72:31:72:32 | [b (line 70): false] "" | Assert.cs:73:23:73:31 | [b (line 70): false] ... == ... | 7 |
| Assert.cs:72:20:72:32 | ... ? ... : ... | Assert.cs:73:23:73:31 | ... == ... | 6 |
| Assert.cs:72:24:72:27 | null | Assert.cs:72:24:72:27 | null | 1 |
| Assert.cs:72:31:72:32 | "" | Assert.cs:72:31:72:32 | "" | 1 |
| Assert.cs:73:9:73:37 | [assertion failure] call to method IsTrue | Assert.cs:70:10:70:12 | exit M10 (abnormal) | 2 |
| Assert.cs:73:9:73:37 | [assertion success] call to method IsTrue | Assert.cs:70:10:70:12 | exit M10 (normal) | 6 |
| Assert.cs:73:23:73:36 | [false] ... && ... | Assert.cs:73:23:73:36 | [false] ... && ... | 1 |
| Assert.cs:73:23:73:36 | [true] ... && ... | Assert.cs:73:23:73:36 | [true] ... && ... | 1 |
| Assert.cs:73:36:73:36 | [b (line 70): false] access to parameter b | Assert.cs:73:36:73:36 | [b (line 70): false] access to parameter b | 1 |
| Assert.cs:73:36:73:36 | [b (line 70): true] access to parameter b | Assert.cs:73:36:73:36 | [b (line 70): true] access to parameter b | 1 |
| Assert.cs:73:36:73:36 | access to parameter b | Assert.cs:73:36:73:36 | access to parameter b | 1 |
| Assert.cs:77:10:77:12 | enter M11 | Assert.cs:79:20:79:20 | access to parameter b | 4 |
| Assert.cs:77:10:77:12 | exit M11 | Assert.cs:77:10:77:12 | exit M11 | 1 |
| Assert.cs:79:24:79:27 | [b (line 77): true] null | Assert.cs:80:24:80:32 | [b (line 77): true] ... != ... | 7 |
| Assert.cs:79:31:79:32 | [b (line 77): false] "" | Assert.cs:80:24:80:32 | [b (line 77): false] ... != ... | 7 |
| Assert.cs:79:20:79:32 | ... ? ... : ... | Assert.cs:80:24:80:32 | ... != ... | 6 |
| Assert.cs:79:24:79:27 | null | Assert.cs:79:24:79:27 | null | 1 |
| Assert.cs:79:31:79:32 | "" | Assert.cs:79:31:79:32 | "" | 1 |
| Assert.cs:80:9:80:38 | [assertion failure] call to method IsFalse | Assert.cs:77:10:77:12 | exit M11 (abnormal) | 2 |
| Assert.cs:80:9:80:38 | [assertion success] call to method IsFalse | Assert.cs:77:10:77:12 | exit M11 (normal) | 6 |
| Assert.cs:80:24:80:37 | [false] ... \|\| ... | Assert.cs:80:24:80:37 | [false] ... \|\| ... | 1 |
| Assert.cs:80:24:80:37 | [true] ... \|\| ... | Assert.cs:80:24:80:37 | [true] ... \|\| ... | 1 |
| Assert.cs:80:37:80:37 | [b (line 77): false] access to parameter b | Assert.cs:80:37:80:37 | [b (line 77): false] access to parameter b | 1 |
| Assert.cs:80:37:80:37 | [b (line 77): true] access to parameter b | Assert.cs:80:37:80:37 | [b (line 77): true] access to parameter b | 1 |
| Assert.cs:80:37:80:37 | access to parameter b | Assert.cs:80:37:80:37 | access to parameter b | 1 |
| Assert.cs:84:10:84:12 | enter M12 | Assert.cs:86:20:86:20 | access to parameter b | 4 |
| Assert.cs:84:10:84:12 | exit M12 | Assert.cs:84:10:84:12 | exit M12 | 1 |
| Assert.cs:84:10:84:12 | exit M12 (abnormal) | Assert.cs:84:10:84:12 | exit M12 (abnormal) | 1 |
| Assert.cs:86:24:86:27 | [b (line 84): true] null | Assert.cs:87:22:87:30 | [b (line 84): true] ... != ... | 7 |
| Assert.cs:86:31:86:32 | [b (line 84): false] "" | Assert.cs:87:22:87:30 | [b (line 84): false] ... != ... | 7 |
| Assert.cs:87:9:87:31 | [assertion failure, b (line 84): false] call to method Assert | Assert.cs:87:9:87:31 | [assertion failure, b (line 84): false] call to method Assert | 1 |
| Assert.cs:87:9:87:31 | [assertion failure, b (line 84): true] call to method Assert | Assert.cs:87:9:87:31 | [assertion failure, b (line 84): true] call to method Assert | 1 |
| Assert.cs:87:9:87:31 | [assertion success, b (line 84): false] call to method Assert | Assert.cs:90:13:90:13 | [b (line 84): false] access to parameter b | 7 |
| Assert.cs:87:9:87:31 | [assertion success, b (line 84): true] call to method Assert | Assert.cs:90:13:90:13 | [b (line 84): true] access to parameter b | 7 |
| Assert.cs:90:17:90:20 | [b (line 84): true] null | Assert.cs:91:23:91:23 | [b (line 84): true] access to local variable s | 5 |
| Assert.cs:90:24:90:25 | [b (line 84): false] "" | Assert.cs:91:23:91:23 | [b (line 84): false] access to local variable s | 5 |
| Assert.cs:91:9:91:24 | [assertion failure, b (line 84): false] call to method IsNull | Assert.cs:91:9:91:24 | [assertion failure, b (line 84): false] call to method IsNull | 1 |
| Assert.cs:91:9:91:24 | [assertion failure, b (line 84): true] call to method IsNull | Assert.cs:91:9:91:24 | [assertion failure, b (line 84): true] call to method IsNull | 1 |
| Assert.cs:91:9:91:24 | [assertion success, b (line 84): false] call to method IsNull | Assert.cs:94:13:94:13 | [b (line 84): false] access to parameter b | 7 |
| Assert.cs:91:9:91:24 | [assertion success, b (line 84): true] call to method IsNull | Assert.cs:94:13:94:13 | [b (line 84): true] access to parameter b | 7 |
| Assert.cs:94:17:94:20 | [b (line 84): true] null | Assert.cs:95:26:95:26 | [b (line 84): true] access to local variable s | 5 |
| Assert.cs:94:24:94:25 | [b (line 84): false] "" | Assert.cs:95:26:95:26 | [b (line 84): false] access to local variable s | 5 |
| Assert.cs:95:9:95:27 | [assertion failure, b (line 84): false] call to method IsNotNull | Assert.cs:95:9:95:27 | [assertion failure, b (line 84): false] call to method IsNotNull | 1 |
| Assert.cs:95:9:95:27 | [assertion failure, b (line 84): true] call to method IsNotNull | Assert.cs:95:9:95:27 | [assertion failure, b (line 84): true] call to method IsNotNull | 1 |
| Assert.cs:95:9:95:27 | [assertion success, b (line 84): false] call to method IsNotNull | Assert.cs:98:13:98:13 | [b (line 84): false] access to parameter b | 7 |
| Assert.cs:95:9:95:27 | [assertion success, b (line 84): true] call to method IsNotNull | Assert.cs:98:13:98:13 | [b (line 84): true] access to parameter b | 7 |
| Assert.cs:98:17:98:20 | [b (line 84): true] null | Assert.cs:99:23:99:31 | [b (line 84): true] ... == ... | 7 |
| Assert.cs:98:24:98:25 | [b (line 84): false] "" | Assert.cs:99:23:99:31 | [b (line 84): false] ... == ... | 7 |
| Assert.cs:99:9:99:32 | [assertion failure, b (line 84): false] call to method IsTrue | Assert.cs:99:9:99:32 | [assertion failure, b (line 84): false] call to method IsTrue | 1 |
| Assert.cs:99:9:99:32 | [assertion failure, b (line 84): true] call to method IsTrue | Assert.cs:99:9:99:32 | [assertion failure, b (line 84): true] call to method IsTrue | 1 |
| Assert.cs:99:9:99:32 | [assertion success, b (line 84): false] call to method IsTrue | Assert.cs:102:13:102:13 | [b (line 84): false] access to parameter b | 7 |
| Assert.cs:99:9:99:32 | [assertion success, b (line 84): true] call to method IsTrue | Assert.cs:102:13:102:13 | [b (line 84): true] access to parameter b | 7 |
| Assert.cs:102:17:102:20 | [b (line 84): true] null | Assert.cs:103:23:103:31 | [b (line 84): true] ... != ... | 7 |
| Assert.cs:102:24:102:25 | [b (line 84): false] "" | Assert.cs:103:23:103:31 | [b (line 84): false] ... != ... | 7 |
| Assert.cs:103:9:103:32 | [assertion failure, b (line 84): false] call to method IsTrue | Assert.cs:103:9:103:32 | [assertion failure, b (line 84): false] call to method IsTrue | 1 |
| Assert.cs:103:9:103:32 | [assertion failure, b (line 84): true] call to method IsTrue | Assert.cs:103:9:103:32 | [assertion failure, b (line 84): true] call to method IsTrue | 1 |
| Assert.cs:103:9:103:32 | [assertion success, b (line 84): false] call to method IsTrue | Assert.cs:106:13:106:13 | [b (line 84): false] access to parameter b | 7 |
| Assert.cs:103:9:103:32 | [assertion success, b (line 84): true] call to method IsTrue | Assert.cs:106:13:106:13 | [b (line 84): true] access to parameter b | 7 |
| Assert.cs:106:17:106:20 | [b (line 84): true] null | Assert.cs:107:24:107:32 | [b (line 84): true] ... != ... | 7 |
| Assert.cs:106:24:106:25 | [b (line 84): false] "" | Assert.cs:107:24:107:32 | [b (line 84): false] ... != ... | 7 |
| Assert.cs:107:9:107:33 | [assertion failure, b (line 84): false] call to method IsFalse | Assert.cs:107:9:107:33 | [assertion failure, b (line 84): false] call to method IsFalse | 1 |
| Assert.cs:107:9:107:33 | [assertion failure, b (line 84): true] call to method IsFalse | Assert.cs:107:9:107:33 | [assertion failure, b (line 84): true] call to method IsFalse | 1 |
| Assert.cs:107:9:107:33 | [assertion success, b (line 84): false] call to method IsFalse | Assert.cs:110:13:110:13 | [b (line 84): false] access to parameter b | 7 |
| Assert.cs:107:9:107:33 | [assertion success, b (line 84): true] call to method IsFalse | Assert.cs:110:13:110:13 | [b (line 84): true] access to parameter b | 7 |
| Assert.cs:110:17:110:20 | [b (line 84): true] null | Assert.cs:111:24:111:32 | [b (line 84): true] ... == ... | 7 |
| Assert.cs:110:24:110:25 | [b (line 84): false] "" | Assert.cs:111:24:111:32 | [b (line 84): false] ... == ... | 7 |
| Assert.cs:111:9:111:33 | [assertion failure, b (line 84): false] call to method IsFalse | Assert.cs:111:9:111:33 | [assertion failure, b (line 84): false] call to method IsFalse | 1 |
| Assert.cs:111:9:111:33 | [assertion failure, b (line 84): true] call to method IsFalse | Assert.cs:111:9:111:33 | [assertion failure, b (line 84): true] call to method IsFalse | 1 |
| Assert.cs:111:9:111:33 | [assertion success, b (line 84): false] call to method IsFalse | Assert.cs:114:13:114:13 | [b (line 84): false] access to parameter b | 7 |
| Assert.cs:111:9:111:33 | [assertion success, b (line 84): true] call to method IsFalse | Assert.cs:114:13:114:13 | [b (line 84): true] access to parameter b | 7 |
| Assert.cs:114:17:114:20 | [b (line 84): true] null | Assert.cs:115:23:115:31 | [b (line 84): true] ... != ... | 7 |
| Assert.cs:114:24:114:25 | [b (line 84): false] "" | Assert.cs:115:23:115:31 | [b (line 84): false] ... != ... | 7 |
| Assert.cs:115:9:115:37 | [assertion failure, b (line 84): false] call to method IsTrue | Assert.cs:115:9:115:37 | [assertion failure, b (line 84): false] call to method IsTrue | 1 |
| Assert.cs:115:9:115:37 | [assertion failure, b (line 84): true] call to method IsTrue | Assert.cs:115:9:115:37 | [assertion failure, b (line 84): true] call to method IsTrue | 1 |
| Assert.cs:115:9:115:37 | [assertion success, b (line 84): true] call to method IsTrue | Assert.cs:118:13:118:13 | [b (line 84): true] access to parameter b | 7 |
| Assert.cs:115:23:115:36 | [false, b (line 84): false] ... && ... | Assert.cs:115:23:115:36 | [false, b (line 84): false] ... && ... | 1 |
| Assert.cs:115:23:115:36 | [false, b (line 84): true] ... && ... | Assert.cs:115:23:115:36 | [false, b (line 84): true] ... && ... | 1 |
| Assert.cs:115:23:115:36 | [true, b (line 84): true] ... && ... | Assert.cs:115:23:115:36 | [true, b (line 84): true] ... && ... | 1 |
| Assert.cs:115:36:115:36 | [b (line 84): false] access to parameter b | Assert.cs:115:36:115:36 | [b (line 84): false] access to parameter b | 1 |
| Assert.cs:115:36:115:36 | [b (line 84): true] access to parameter b | Assert.cs:115:36:115:36 | [b (line 84): true] access to parameter b | 1 |
| Assert.cs:118:17:118:20 | [b (line 84): true] null | Assert.cs:119:24:119:32 | [b (line 84): true] ... == ... | 7 |
| Assert.cs:119:9:119:39 | [assertion failure, b (line 84): true] call to method IsFalse | Assert.cs:119:9:119:39 | [assertion failure, b (line 84): true] call to method IsFalse | 1 |
| Assert.cs:119:9:119:39 | [assertion success, b (line 84): true] call to method IsFalse | Assert.cs:122:13:122:13 | [b (line 84): true] access to parameter b | 7 |
| Assert.cs:119:24:119:38 | [false, b (line 84): true] ... \|\| ... | Assert.cs:119:24:119:38 | [false, b (line 84): true] ... \|\| ... | 1 |
| Assert.cs:119:24:119:38 | [true, b (line 84): true] ... \|\| ... | Assert.cs:119:24:119:38 | [true, b (line 84): true] ... \|\| ... | 1 |
| Assert.cs:119:37:119:38 | [false, b (line 84): true] !... | Assert.cs:119:37:119:38 | [false, b (line 84): true] !... | 1 |
| Assert.cs:119:38:119:38 | [b (line 84): true] access to parameter b | Assert.cs:119:38:119:38 | [b (line 84): true] access to parameter b | 1 |
| Assert.cs:122:17:122:20 | [b (line 84): true] null | Assert.cs:123:23:123:31 | [b (line 84): true] ... == ... | 7 |
| Assert.cs:123:9:123:37 | [assertion failure, b (line 84): true] call to method IsTrue | Assert.cs:123:9:123:37 | [assertion failure, b (line 84): true] call to method IsTrue | 1 |
| Assert.cs:123:9:123:37 | [assertion success, b (line 84): true] call to method IsTrue | Assert.cs:126:13:126:13 | [b (line 84): true] access to parameter b | 7 |
| Assert.cs:123:23:123:36 | [false, b (line 84): true] ... && ... | Assert.cs:123:23:123:36 | [false, b (line 84): true] ... && ... | 1 |
| Assert.cs:123:23:123:36 | [true, b (line 84): true] ... && ... | Assert.cs:123:23:123:36 | [true, b (line 84): true] ... && ... | 1 |
| Assert.cs:123:36:123:36 | [b (line 84): true] access to parameter b | Assert.cs:123:36:123:36 | [b (line 84): true] access to parameter b | 1 |
| Assert.cs:126:17:126:20 | [b (line 84): true] null | Assert.cs:127:24:127:32 | [b (line 84): true] ... != ... | 7 |
| Assert.cs:86:20:86:32 | ... ? ... : ... | Assert.cs:87:22:87:30 | ... != ... | 6 |
| Assert.cs:86:24:86:27 | null | Assert.cs:86:24:86:27 | null | 1 |
| Assert.cs:86:31:86:32 | "" | Assert.cs:86:31:86:32 | "" | 1 |
| Assert.cs:87:9:87:31 | [assertion failure] call to method Assert | Assert.cs:87:9:87:31 | [assertion failure] call to method Assert | 1 |
| Assert.cs:87:9:87:31 | [assertion success] call to method Assert | Assert.cs:90:13:90:13 | access to parameter b | 7 |
| Assert.cs:90:13:90:25 | ... ? ... : ... | Assert.cs:91:23:91:23 | access to local variable s | 4 |
| Assert.cs:90:17:90:20 | null | Assert.cs:90:17:90:20 | null | 1 |
| Assert.cs:90:24:90:25 | "" | Assert.cs:90:24:90:25 | "" | 1 |
| Assert.cs:91:9:91:24 | [assertion failure] call to method IsNull | Assert.cs:91:9:91:24 | [assertion failure] call to method IsNull | 1 |
| Assert.cs:91:9:91:24 | [assertion success] call to method IsNull | Assert.cs:94:13:94:13 | access to parameter b | 7 |
| Assert.cs:94:13:94:25 | ... ? ... : ... | Assert.cs:95:26:95:26 | access to local variable s | 4 |
| Assert.cs:94:17:94:20 | null | Assert.cs:94:17:94:20 | null | 1 |
| Assert.cs:94:24:94:25 | "" | Assert.cs:94:24:94:25 | "" | 1 |
| Assert.cs:95:9:95:27 | [assertion failure] call to method IsNotNull | Assert.cs:95:9:95:27 | [assertion failure] call to method IsNotNull | 1 |
| Assert.cs:95:9:95:27 | [assertion success] call to method IsNotNull | Assert.cs:98:13:98:13 | access to parameter b | 7 |
| Assert.cs:98:13:98:25 | ... ? ... : ... | Assert.cs:99:23:99:31 | ... == ... | 6 |
| Assert.cs:98:17:98:20 | null | Assert.cs:98:17:98:20 | null | 1 |
| Assert.cs:98:24:98:25 | "" | Assert.cs:98:24:98:25 | "" | 1 |
| Assert.cs:99:9:99:32 | [assertion failure] call to method IsTrue | Assert.cs:99:9:99:32 | [assertion failure] call to method IsTrue | 1 |
| Assert.cs:99:9:99:32 | [assertion success] call to method IsTrue | Assert.cs:102:13:102:13 | access to parameter b | 7 |
| Assert.cs:102:13:102:25 | ... ? ... : ... | Assert.cs:103:23:103:31 | ... != ... | 6 |
| Assert.cs:102:17:102:20 | null | Assert.cs:102:17:102:20 | null | 1 |
| Assert.cs:102:24:102:25 | "" | Assert.cs:102:24:102:25 | "" | 1 |
| Assert.cs:103:9:103:32 | [assertion failure] call to method IsTrue | Assert.cs:103:9:103:32 | [assertion failure] call to method IsTrue | 1 |
| Assert.cs:103:9:103:32 | [assertion success] call to method IsTrue | Assert.cs:106:13:106:13 | access to parameter b | 7 |
| Assert.cs:106:13:106:25 | ... ? ... : ... | Assert.cs:107:24:107:32 | ... != ... | 6 |
| Assert.cs:106:17:106:20 | null | Assert.cs:106:17:106:20 | null | 1 |
| Assert.cs:106:24:106:25 | "" | Assert.cs:106:24:106:25 | "" | 1 |
| Assert.cs:107:9:107:33 | [assertion failure] call to method IsFalse | Assert.cs:107:9:107:33 | [assertion failure] call to method IsFalse | 1 |
| Assert.cs:107:9:107:33 | [assertion success] call to method IsFalse | Assert.cs:110:13:110:13 | access to parameter b | 7 |
| Assert.cs:110:13:110:25 | ... ? ... : ... | Assert.cs:111:24:111:32 | ... == ... | 6 |
| Assert.cs:110:17:110:20 | null | Assert.cs:110:17:110:20 | null | 1 |
| Assert.cs:110:24:110:25 | "" | Assert.cs:110:24:110:25 | "" | 1 |
| Assert.cs:111:9:111:33 | [assertion failure] call to method IsFalse | Assert.cs:111:9:111:33 | [assertion failure] call to method IsFalse | 1 |
| Assert.cs:111:9:111:33 | [assertion success] call to method IsFalse | Assert.cs:114:13:114:13 | access to parameter b | 7 |
| Assert.cs:114:13:114:25 | ... ? ... : ... | Assert.cs:115:23:115:31 | ... != ... | 6 |
| Assert.cs:114:17:114:20 | null | Assert.cs:114:17:114:20 | null | 1 |
| Assert.cs:114:24:114:25 | "" | Assert.cs:114:24:114:25 | "" | 1 |
| Assert.cs:115:9:115:37 | [assertion failure] call to method IsTrue | Assert.cs:115:9:115:37 | [assertion failure] call to method IsTrue | 1 |
| Assert.cs:115:9:115:37 | [assertion success] call to method IsTrue | Assert.cs:118:13:118:13 | access to parameter b | 7 |
| Assert.cs:115:23:115:36 | [false] ... && ... | Assert.cs:115:23:115:36 | [false] ... && ... | 1 |
| Assert.cs:115:23:115:36 | [true] ... && ... | Assert.cs:115:23:115:36 | [true] ... && ... | 1 |
| Assert.cs:115:36:115:36 | access to parameter b | Assert.cs:115:36:115:36 | access to parameter b | 1 |
| Assert.cs:118:13:118:25 | ... ? ... : ... | Assert.cs:119:24:119:32 | ... == ... | 6 |
| Assert.cs:118:17:118:20 | null | Assert.cs:118:17:118:20 | null | 1 |
| Assert.cs:118:24:118:25 | "" | Assert.cs:118:24:118:25 | "" | 1 |
| Assert.cs:119:9:119:39 | [assertion failure] call to method IsFalse | Assert.cs:119:9:119:39 | [assertion failure] call to method IsFalse | 1 |
| Assert.cs:119:9:119:39 | [assertion success] call to method IsFalse | Assert.cs:122:13:122:13 | access to parameter b | 7 |
| Assert.cs:119:24:119:38 | [false] ... \|\| ... | Assert.cs:119:24:119:38 | [false] ... \|\| ... | 1 |
| Assert.cs:119:24:119:38 | [true] ... \|\| ... | Assert.cs:119:24:119:38 | [true] ... \|\| ... | 1 |
| Assert.cs:119:37:119:38 | [false] !... | Assert.cs:119:37:119:38 | [false] !... | 1 |
| Assert.cs:119:37:119:38 | [true] !... | Assert.cs:119:37:119:38 | [true] !... | 1 |
| Assert.cs:119:38:119:38 | access to parameter b | Assert.cs:119:38:119:38 | access to parameter b | 1 |
| Assert.cs:122:13:122:25 | ... ? ... : ... | Assert.cs:123:23:123:31 | ... == ... | 6 |
| Assert.cs:122:17:122:20 | null | Assert.cs:122:17:122:20 | null | 1 |
| Assert.cs:122:24:122:25 | "" | Assert.cs:122:24:122:25 | "" | 1 |
| Assert.cs:123:9:123:37 | [assertion failure] call to method IsTrue | Assert.cs:123:9:123:37 | [assertion failure] call to method IsTrue | 1 |
| Assert.cs:123:9:123:37 | [assertion success] call to method IsTrue | Assert.cs:126:13:126:13 | access to parameter b | 7 |
| Assert.cs:123:23:123:36 | [false] ... && ... | Assert.cs:123:23:123:36 | [false] ... && ... | 1 |
| Assert.cs:123:23:123:36 | [true] ... && ... | Assert.cs:123:23:123:36 | [true] ... && ... | 1 |
| Assert.cs:123:36:123:36 | access to parameter b | Assert.cs:123:36:123:36 | access to parameter b | 1 |
| Assert.cs:126:13:126:25 | ... ? ... : ... | Assert.cs:127:24:127:32 | ... != ... | 6 |
| Assert.cs:126:17:126:20 | null | Assert.cs:126:17:126:20 | null | 1 |
| Assert.cs:126:24:126:25 | "" | Assert.cs:126:24:126:25 | "" | 1 |
| Assert.cs:127:9:127:39 | [assertion failure] call to method IsFalse | Assert.cs:127:9:127:39 | [assertion failure] call to method IsFalse | 1 |
| Assert.cs:127:9:127:39 | [assertion success] call to method IsFalse | Assert.cs:84:10:84:12 | exit M12 (normal) | 6 |
| Assert.cs:127:24:127:38 | [false] ... \|\| ... | Assert.cs:127:24:127:38 | [false] ... \|\| ... | 1 |
| Assert.cs:127:24:127:38 | [true] ... \|\| ... | Assert.cs:127:24:127:38 | [true] ... \|\| ... | 1 |
| Assert.cs:127:37:127:38 | [false] !... | Assert.cs:127:37:127:38 | [false] !... | 1 |
| Assert.cs:127:38:127:38 | [b (line 84): true] access to parameter b | Assert.cs:127:38:127:38 | [b (line 84): true] access to parameter b | 1 |
| Assert.cs:127:37:127:38 | [true] !... | Assert.cs:127:37:127:38 | [true] !... | 1 |
| Assert.cs:127:38:127:38 | access to parameter b | Assert.cs:127:38:127:38 | access to parameter b | 1 |
| Assert.cs:131:18:131:32 | enter AssertTrueFalse | Assert.cs:131:18:131:32 | exit AssertTrueFalse | 4 |
| Assert.cs:138:10:138:12 | enter M13 | Assert.cs:140:25:140:26 | access to parameter b1 | 5 |
| Assert.cs:138:10:138:12 | exit M13 | Assert.cs:138:10:138:12 | exit M13 | 1 |
@@ -206,31 +205,24 @@
| BreakInTry.cs:20:10:20:11 | enter M2 | BreakInTry.cs:22:29:22:32 | access to parameter args | 3 |
| BreakInTry.cs:22:9:34:9 | foreach (... ... in ...) ... | BreakInTry.cs:22:9:34:9 | foreach (... ... in ...) ... | 1 |
| BreakInTry.cs:22:22:22:24 | String arg | BreakInTry.cs:26:21:26:31 | ... == ... | 8 |
| BreakInTry.cs:27:21:27:26 | break; | BreakInTry.cs:31:21:31:32 | [finally: break] ... == ... | 6 |
| BreakInTry.cs:27:21:27:26 | break; | BreakInTry.cs:27:21:27:26 | break; | 1 |
| BreakInTry.cs:30:13:33:13 | {...} | BreakInTry.cs:31:21:31:32 | ... == ... | 5 |
| BreakInTry.cs:32:21:32:21 | ; | BreakInTry.cs:32:21:32:21 | ; | 1 |
| BreakInTry.cs:32:21:32:21 | [finally: break] ; | BreakInTry.cs:32:21:32:21 | [finally: break] ; | 1 |
| BreakInTry.cs:35:7:35:7 | ; | BreakInTry.cs:20:10:20:11 | exit M2 | 3 |
| BreakInTry.cs:38:10:38:11 | enter M3 | BreakInTry.cs:42:17:42:28 | ... == ... | 8 |
| BreakInTry.cs:38:10:38:11 | exit M3 (normal) | BreakInTry.cs:38:10:38:11 | exit M3 | 2 |
| BreakInTry.cs:43:17:43:23 | return ...; | BreakInTry.cs:47:33:47:36 | [finally: return] access to parameter args | 3 |
| BreakInTry.cs:43:17:43:23 | return ...; | BreakInTry.cs:43:17:43:23 | return ...; | 1 |
| BreakInTry.cs:46:9:52:9 | {...} | BreakInTry.cs:47:33:47:36 | access to parameter args | 2 |
| BreakInTry.cs:47:13:51:13 | [finally: return] foreach (... ... in ...) ... | BreakInTry.cs:47:13:51:13 | [finally: return] foreach (... ... in ...) ... | 1 |
| BreakInTry.cs:47:13:51:13 | foreach (... ... in ...) ... | BreakInTry.cs:47:13:51:13 | foreach (... ... in ...) ... | 1 |
| BreakInTry.cs:47:26:47:28 | String arg | BreakInTry.cs:49:21:49:31 | ... == ... | 6 |
| BreakInTry.cs:47:26:47:28 | [finally: return] String arg | BreakInTry.cs:49:21:49:31 | [finally: return] ... == ... | 6 |
| BreakInTry.cs:50:21:50:26 | [finally: return] break; | BreakInTry.cs:50:21:50:26 | [finally: return] break; | 1 |
| BreakInTry.cs:50:21:50:26 | break; | BreakInTry.cs:50:21:50:26 | break; | 1 |
| BreakInTry.cs:53:7:53:7 | ; | BreakInTry.cs:53:7:53:7 | ; | 1 |
| BreakInTry.cs:56:10:56:11 | enter M4 | BreakInTry.cs:60:17:60:28 | ... == ... | 8 |
| BreakInTry.cs:56:10:56:11 | exit M4 (normal) | BreakInTry.cs:56:10:56:11 | exit M4 | 2 |
| BreakInTry.cs:61:17:61:23 | return ...; | BreakInTry.cs:65:33:65:36 | [finally: return] access to parameter args | 3 |
| BreakInTry.cs:61:17:61:23 | return ...; | BreakInTry.cs:61:17:61:23 | return ...; | 1 |
| BreakInTry.cs:64:9:70:9 | {...} | BreakInTry.cs:65:33:65:36 | access to parameter args | 2 |
| BreakInTry.cs:65:13:69:13 | [finally: return] foreach (... ... in ...) ... | BreakInTry.cs:65:13:69:13 | [finally: return] foreach (... ... in ...) ... | 1 |
| BreakInTry.cs:65:13:69:13 | foreach (... ... in ...) ... | BreakInTry.cs:65:13:69:13 | foreach (... ... in ...) ... | 1 |
| BreakInTry.cs:65:26:65:28 | String arg | BreakInTry.cs:67:21:67:31 | ... == ... | 6 |
| BreakInTry.cs:65:26:65:28 | [finally: return] String arg | BreakInTry.cs:67:21:67:31 | [finally: return] ... == ... | 6 |
| BreakInTry.cs:68:21:68:26 | [finally: return] break; | BreakInTry.cs:68:21:68:26 | [finally: return] break; | 1 |
| BreakInTry.cs:68:21:68:26 | break; | BreakInTry.cs:68:21:68:26 | break; | 1 |
| CompileTimeOperators.cs:3:7:3:26 | enter CompileTimeOperators | CompileTimeOperators.cs:3:7:3:26 | exit CompileTimeOperators | 5 |
| CompileTimeOperators.cs:5:9:5:15 | enter Default | CompileTimeOperators.cs:5:9:5:15 | exit Default | 6 |
@@ -238,7 +230,11 @@
| CompileTimeOperators.cs:15:10:15:15 | enter Typeof | CompileTimeOperators.cs:15:10:15:15 | exit Typeof | 6 |
| CompileTimeOperators.cs:20:12:20:17 | enter Nameof | CompileTimeOperators.cs:20:12:20:17 | exit Nameof | 6 |
| CompileTimeOperators.cs:26:7:26:22 | enter GotoInTryFinally | CompileTimeOperators.cs:26:7:26:22 | exit GotoInTryFinally | 5 |
| CompileTimeOperators.cs:28:10:28:10 | enter M | CompileTimeOperators.cs:28:10:28:10 | exit M | 15 |
| CompileTimeOperators.cs:28:10:28:10 | enter M | CompileTimeOperators.cs:37:13:37:40 | call to method WriteLine | 9 |
| CompileTimeOperators.cs:28:10:28:10 | exit M | CompileTimeOperators.cs:28:10:28:10 | exit M | 1 |
| CompileTimeOperators.cs:28:10:28:10 | exit M (abnormal) | CompileTimeOperators.cs:28:10:28:10 | exit M (abnormal) | 1 |
| CompileTimeOperators.cs:39:9:39:34 | ...; | CompileTimeOperators.cs:39:9:39:33 | call to method WriteLine | 3 |
| CompileTimeOperators.cs:40:9:40:11 | End: | CompileTimeOperators.cs:28:10:28:10 | exit M (normal) | 5 |
| ConditionalAccess.cs:1:7:1:23 | enter ConditionalAccess | ConditionalAccess.cs:1:7:1:23 | exit ConditionalAccess | 5 |
| ConditionalAccess.cs:3:12:3:13 | enter M1 | ConditionalAccess.cs:3:26:3:26 | access to parameter i | 2 |
| ConditionalAccess.cs:3:12:3:13 | exit M1 (normal) | ConditionalAccess.cs:3:12:3:13 | exit M1 | 2 |
@@ -279,49 +275,41 @@
| Conditions.cs:1:7:1:16 | enter Conditions | Conditions.cs:1:7:1:16 | exit Conditions | 5 |
| Conditions.cs:3:10:3:19 | enter IncrOrDecr | Conditions.cs:5:13:5:15 | access to parameter inc | 4 |
| Conditions.cs:3:10:3:19 | exit IncrOrDecr (normal) | Conditions.cs:3:10:3:19 | exit IncrOrDecr | 2 |
| Conditions.cs:6:13:6:16 | [inc (line 3): true] ...; | Conditions.cs:7:14:7:16 | [inc (line 3): true] access to parameter inc | 5 |
| Conditions.cs:7:9:8:16 | [inc (line 3): false] if (...) ... | Conditions.cs:7:14:7:16 | [inc (line 3): false] access to parameter inc | 2 |
| Conditions.cs:6:13:6:16 | ...; | Conditions.cs:6:13:6:15 | ...++ | 3 |
| Conditions.cs:7:9:8:16 | if (...) ... | Conditions.cs:7:14:7:16 | access to parameter inc | 2 |
| Conditions.cs:7:13:7:16 | [false] !... | Conditions.cs:7:13:7:16 | [false] !... | 1 |
| Conditions.cs:7:13:7:16 | [true] !... | Conditions.cs:7:13:7:16 | [true] !... | 1 |
| Conditions.cs:8:13:8:16 | ...; | Conditions.cs:8:13:8:15 | ...-- | 3 |
| Conditions.cs:11:9:11:10 | enter M1 | Conditions.cs:14:13:14:13 | access to parameter b | 7 |
| Conditions.cs:15:13:15:16 | [b (line 11): true] ...; | Conditions.cs:16:13:16:17 | [b (line 11): true] ... > ... | 7 |
| Conditions.cs:16:9:18:20 | [b (line 11): false] if (...) ... | Conditions.cs:16:13:16:17 | [b (line 11): false] ... > ... | 4 |
| Conditions.cs:17:13:18:20 | [b (line 11): false] if (...) ... | Conditions.cs:17:18:17:18 | [b (line 11): false] access to parameter b | 2 |
| Conditions.cs:17:13:18:20 | [b (line 11): true] if (...) ... | Conditions.cs:17:18:17:18 | [b (line 11): true] access to parameter b | 2 |
| Conditions.cs:15:13:15:16 | ...; | Conditions.cs:15:13:15:15 | ...++ | 3 |
| Conditions.cs:16:9:18:20 | if (...) ... | Conditions.cs:16:13:16:17 | ... > ... | 4 |
| Conditions.cs:17:13:18:20 | if (...) ... | Conditions.cs:17:18:17:18 | access to parameter b | 2 |
| Conditions.cs:17:17:17:18 | [false] !... | Conditions.cs:17:17:17:18 | [false] !... | 1 |
| Conditions.cs:17:17:17:18 | [true] !... | Conditions.cs:17:17:17:18 | [true] !... | 1 |
| Conditions.cs:18:17:18:20 | ...; | Conditions.cs:18:17:18:19 | ...-- | 3 |
| Conditions.cs:19:16:19:16 | access to local variable x | Conditions.cs:11:9:11:10 | exit M1 | 4 |
| Conditions.cs:22:9:22:10 | enter M2 | Conditions.cs:25:13:25:14 | access to parameter b1 | 7 |
| Conditions.cs:26:13:27:20 | if (...) ... | Conditions.cs:26:17:26:18 | access to parameter b2 | 2 |
| Conditions.cs:27:17:27:20 | [b2 (line 22): true] ...; | Conditions.cs:28:13:28:14 | [b2 (line 22): true] access to parameter b2 | 5 |
| Conditions.cs:28:9:29:16 | [b2 (line 22): false] if (...) ... | Conditions.cs:28:13:28:14 | [b2 (line 22): false] access to parameter b2 | 2 |
| Conditions.cs:27:17:27:20 | ...; | Conditions.cs:27:17:27:19 | ...++ | 3 |
| Conditions.cs:28:9:29:16 | if (...) ... | Conditions.cs:28:13:28:14 | access to parameter b2 | 2 |
| Conditions.cs:29:13:29:16 | ...; | Conditions.cs:29:13:29:15 | ...++ | 3 |
| Conditions.cs:30:16:30:16 | access to local variable x | Conditions.cs:22:9:22:10 | exit M2 | 4 |
| Conditions.cs:33:9:33:10 | enter M3 | Conditions.cs:37:13:37:14 | access to parameter b1 | 10 |
| Conditions.cs:38:13:38:20 | ...; | Conditions.cs:38:13:38:19 | ... = ... | 3 |
| Conditions.cs:39:9:40:16 | if (...) ... | Conditions.cs:39:13:39:14 | access to local variable b2 | 2 |
| Conditions.cs:40:13:40:16 | [b2 (line 39): true] ...; | Conditions.cs:41:13:41:14 | [b2 (line 39): true] access to local variable b2 | 5 |
| Conditions.cs:41:9:42:16 | [b2 (line 39): false] if (...) ... | Conditions.cs:41:13:41:14 | [b2 (line 39): false] access to local variable b2 | 2 |
| Conditions.cs:40:13:40:16 | ...; | Conditions.cs:40:13:40:15 | ...++ | 3 |
| Conditions.cs:41:9:42:16 | if (...) ... | Conditions.cs:41:13:41:14 | access to local variable b2 | 2 |
| Conditions.cs:42:13:42:16 | ...; | Conditions.cs:42:13:42:15 | ...++ | 3 |
| Conditions.cs:43:16:43:16 | access to local variable x | Conditions.cs:33:9:33:10 | exit M3 | 4 |
| Conditions.cs:46:9:46:10 | enter M4 | Conditions.cs:49:16:49:22 | ... > ... | 10 |
| Conditions.cs:49:16:49:16 | [b (line 46): false] access to parameter x | Conditions.cs:49:16:49:22 | [b (line 46): false] ... > ... | 4 |
| Conditions.cs:50:9:53:9 | [b (line 46): false] {...} | Conditions.cs:51:17:51:17 | [b (line 46): false] access to parameter b | 3 |
| Conditions.cs:50:9:53:9 | [b (line 46): true] {...} | Conditions.cs:51:17:51:17 | [b (line 46): true] access to parameter b | 3 |
| Conditions.cs:46:9:46:10 | enter M4 | Conditions.cs:49:9:53:9 | while (...) ... | 6 |
| Conditions.cs:49:16:49:16 | access to parameter x | Conditions.cs:49:16:49:22 | ... > ... | 4 |
| Conditions.cs:50:9:53:9 | {...} | Conditions.cs:51:17:51:17 | access to parameter b | 3 |
| Conditions.cs:52:17:52:20 | [b (line 46): true] ...; | Conditions.cs:49:16:49:22 | [b (line 46): true] ... > ... | 7 |
| Conditions.cs:52:17:52:20 | ...; | Conditions.cs:52:17:52:19 | ...++ | 3 |
| Conditions.cs:54:16:54:16 | access to local variable y | Conditions.cs:46:9:46:10 | exit M4 | 4 |
| Conditions.cs:57:9:57:10 | enter M5 | Conditions.cs:60:16:60:22 | ... > ... | 10 |
| Conditions.cs:60:16:60:16 | [b (line 57): false] access to parameter x | Conditions.cs:60:16:60:22 | [b (line 57): false] ... > ... | 4 |
| Conditions.cs:61:9:64:9 | [b (line 57): false] {...} | Conditions.cs:62:17:62:17 | [b (line 57): false] access to parameter b | 3 |
| Conditions.cs:61:9:64:9 | [b (line 57): true] {...} | Conditions.cs:62:17:62:17 | [b (line 57): true] access to parameter b | 3 |
| Conditions.cs:57:9:57:10 | enter M5 | Conditions.cs:60:9:64:9 | while (...) ... | 6 |
| Conditions.cs:60:16:60:16 | access to parameter x | Conditions.cs:60:16:60:22 | ... > ... | 4 |
| Conditions.cs:61:9:64:9 | {...} | Conditions.cs:62:17:62:17 | access to parameter b | 3 |
| Conditions.cs:63:17:63:20 | [b (line 57): true] ...; | Conditions.cs:60:16:60:22 | [b (line 57): true] ... > ... | 7 |
| Conditions.cs:65:9:66:16 | [b (line 57): false] if (...) ... | Conditions.cs:65:13:65:13 | [b (line 57): false] access to parameter b | 2 |
| Conditions.cs:65:9:66:16 | [b (line 57): true] if (...) ... | Conditions.cs:65:13:65:13 | [b (line 57): true] access to parameter b | 2 |
| Conditions.cs:63:17:63:20 | ...; | Conditions.cs:63:17:63:19 | ...++ | 3 |
| Conditions.cs:65:9:66:16 | if (...) ... | Conditions.cs:65:13:65:13 | access to parameter b | 2 |
| Conditions.cs:66:13:66:16 | ...; | Conditions.cs:66:13:66:15 | ...++ | 3 |
| Conditions.cs:67:16:67:16 | access to local variable y | Conditions.cs:57:9:57:10 | exit M5 | 4 |
@@ -344,10 +332,9 @@
| Conditions.cs:97:17:97:20 | ...; | Conditions.cs:97:17:97:19 | ...++ | 3 |
| Conditions.cs:99:16:99:16 | access to local variable x | Conditions.cs:86:9:86:10 | exit M7 | 4 |
| Conditions.cs:102:12:102:13 | enter M8 | Conditions.cs:105:13:105:13 | access to parameter b | 8 |
| Conditions.cs:106:13:106:20 | [b (line 102): true] ...; | Conditions.cs:107:13:107:24 | [b (line 102): true] ... > ... | 10 |
| Conditions.cs:107:9:109:24 | [b (line 102): false] if (...) ... | Conditions.cs:107:13:107:24 | [b (line 102): false] ... > ... | 5 |
| Conditions.cs:108:13:109:24 | [b (line 102): false] if (...) ... | Conditions.cs:108:18:108:18 | [b (line 102): false] access to parameter b | 2 |
| Conditions.cs:108:13:109:24 | [b (line 102): true] if (...) ... | Conditions.cs:108:18:108:18 | [b (line 102): true] access to parameter b | 2 |
| Conditions.cs:106:13:106:20 | ...; | Conditions.cs:106:13:106:19 | ... = ... | 5 |
| Conditions.cs:107:9:109:24 | if (...) ... | Conditions.cs:107:13:107:24 | ... > ... | 5 |
| Conditions.cs:108:13:109:24 | if (...) ... | Conditions.cs:108:18:108:18 | access to parameter b | 2 |
| Conditions.cs:108:17:108:18 | [false] !... | Conditions.cs:108:17:108:18 | [false] !... | 1 |
| Conditions.cs:108:17:108:18 | [true] !... | Conditions.cs:108:17:108:18 | [true] !... | 1 |
| Conditions.cs:109:17:109:24 | ...; | Conditions.cs:109:17:109:23 | ... = ... | 5 |
@@ -357,26 +344,21 @@
| Conditions.cs:116:25:116:25 | access to local variable i | Conditions.cs:116:25:116:39 | ... < ... | 4 |
| Conditions.cs:116:42:116:42 | access to local variable i | Conditions.cs:116:42:116:44 | ...++ | 2 |
| Conditions.cs:117:9:123:9 | {...} | Conditions.cs:119:18:119:21 | access to local variable last | 11 |
| Conditions.cs:119:17:119:21 | [false, last (line 118): true] !... | Conditions.cs:119:17:119:21 | [false, last (line 118): true] !... | 1 |
| Conditions.cs:119:17:119:21 | [true, last (line 118): false] !... | Conditions.cs:119:17:119:21 | [true, last (line 118): false] !... | 1 |
| Conditions.cs:120:17:120:23 | [last (line 118): false] ...; | Conditions.cs:121:17:121:20 | [last (line 118): false] access to local variable last | 5 |
| Conditions.cs:121:13:122:25 | [last (line 118): true] if (...) ... | Conditions.cs:121:17:121:20 | [last (line 118): true] access to local variable last | 2 |
| Conditions.cs:119:17:119:21 | [false] !... | Conditions.cs:119:17:119:21 | [false] !... | 1 |
| Conditions.cs:119:17:119:21 | [true] !... | Conditions.cs:119:17:119:21 | [true] !... | 1 |
| Conditions.cs:120:17:120:23 | ...; | Conditions.cs:120:17:120:22 | ... = ... | 3 |
| Conditions.cs:121:13:122:25 | if (...) ... | Conditions.cs:121:17:121:20 | access to local variable last | 2 |
| Conditions.cs:122:17:122:25 | ...; | Conditions.cs:122:17:122:24 | ... = ... | 3 |
| Conditions.cs:129:10:129:12 | enter M10 | Conditions.cs:131:16:131:19 | true | 4 |
| Conditions.cs:131:16:131:19 | [Field1 (line 129): false] true | Conditions.cs:131:16:131:19 | [Field1 (line 129): false] true | 1 |
| Conditions.cs:131:16:131:19 | [Field1 (line 129): true, Field2 (line 129): false] true | Conditions.cs:131:16:131:19 | [Field1 (line 129): true, Field2 (line 129): false] true | 1 |
| Conditions.cs:132:9:140:9 | [Field1 (line 129): false] {...} | Conditions.cs:133:17:133:22 | [Field1 (line 129): false] access to field Field1 | 4 |
| Conditions.cs:132:9:140:9 | [Field1 (line 129): true, Field2 (line 129): false] {...} | Conditions.cs:133:17:133:22 | [Field1 (line 129): true, Field2 (line 129): false] access to field Field1 | 4 |
| Conditions.cs:132:9:140:9 | [Field1 (line 129): true, Field2 (line 129): true] {...} | Conditions.cs:133:17:133:22 | [Field1 (line 129): true, Field2 (line 129): true] access to field Field1 | 4 |
| Conditions.cs:129:10:129:12 | enter M10 | Conditions.cs:131:9:140:9 | while (...) ... | 3 |
| Conditions.cs:131:16:131:19 | true | Conditions.cs:131:16:131:19 | true | 1 |
| Conditions.cs:132:9:140:9 | {...} | Conditions.cs:133:17:133:22 | access to field Field1 | 4 |
| Conditions.cs:134:13:139:13 | [Field1 (line 129): true, Field2 (line 129): false] {...} | Conditions.cs:135:21:135:26 | [Field1 (line 129): true, Field2 (line 129): false] access to field Field2 | 4 |
| Conditions.cs:134:13:139:13 | [Field1 (line 129): true, Field2 (line 129): true] {...} | Conditions.cs:135:21:135:26 | [Field1 (line 129): true, Field2 (line 129): true] access to field Field2 | 4 |
| Conditions.cs:134:13:139:13 | [Field1 (line 129): true] {...} | Conditions.cs:135:21:135:26 | [Field1 (line 129): true] access to field Field2 | 4 |
| Conditions.cs:136:17:138:17 | [Field1 (line 129): true, Field2 (line 129): true] {...} | Conditions.cs:131:16:131:19 | [Field1 (line 129): true, Field2 (line 129): true] true | 6 |
| Conditions.cs:134:13:139:13 | {...} | Conditions.cs:135:21:135:26 | access to field Field2 | 4 |
| Conditions.cs:136:17:138:17 | {...} | Conditions.cs:137:21:137:37 | call to method ToString | 5 |
| Conditions.cs:143:10:143:12 | enter M11 | Conditions.cs:145:17:145:17 | access to parameter b | 4 |
| Conditions.cs:143:10:143:12 | exit M11 (normal) | Conditions.cs:143:10:143:12 | exit M11 | 2 |
| Conditions.cs:145:21:145:23 | [b (line 143): true] "a" | Conditions.cs:146:13:146:13 | [b (line 143): true] access to parameter b | 5 |
| Conditions.cs:145:27:145:29 | [b (line 143): false] "b" | Conditions.cs:146:13:146:13 | [b (line 143): false] access to parameter b | 5 |
| Conditions.cs:145:17:145:29 | ... ? ... : ... | Conditions.cs:146:13:146:13 | access to parameter b | 4 |
| Conditions.cs:145:21:145:23 | "a" | Conditions.cs:145:21:145:23 | "a" | 1 |
| Conditions.cs:145:27:145:29 | "b" | Conditions.cs:145:27:145:29 | "b" | 1 |
| Conditions.cs:147:13:147:49 | ...; | Conditions.cs:147:13:147:48 | call to method WriteLine | 6 |
| Conditions.cs:149:13:149:49 | ...; | Conditions.cs:149:13:149:48 | call to method WriteLine | 6 |
| ExitMethods.cs:6:7:6:17 | enter ExitMethods | ExitMethods.cs:6:7:6:17 | exit ExitMethods | 5 |
@@ -433,61 +415,50 @@
| Extensions.cs:15:23:15:33 | enter CallToInt32 | Extensions.cs:15:23:15:33 | exit CallToInt32 | 5 |
| Extensions.cs:20:17:20:20 | enter Main | Extensions.cs:20:17:20:20 | exit Main | 20 |
| Finally.cs:3:14:3:20 | enter Finally | Finally.cs:3:14:3:20 | exit Finally | 5 |
| Finally.cs:7:10:7:11 | enter M1 | Finally.cs:11:13:11:37 | call to method WriteLine | 7 |
| Finally.cs:7:10:7:11 | enter M1 | Finally.cs:15:13:15:40 | call to method WriteLine | 11 |
| Finally.cs:7:10:7:11 | exit M1 | Finally.cs:7:10:7:11 | exit M1 | 1 |
| Finally.cs:14:9:16:9 | [finally: exception] {...} | Finally.cs:7:10:7:11 | exit M1 (abnormal) | 5 |
| Finally.cs:14:9:16:9 | {...} | Finally.cs:7:10:7:11 | exit M1 (normal) | 5 |
| Finally.cs:7:10:7:11 | exit M1 (abnormal) | Finally.cs:7:10:7:11 | exit M1 (abnormal) | 1 |
| Finally.cs:7:10:7:11 | exit M1 (normal) | Finally.cs:7:10:7:11 | exit M1 (normal) | 1 |
| Finally.cs:19:10:19:11 | enter M2 | Finally.cs:23:13:23:37 | call to method WriteLine | 7 |
| Finally.cs:19:10:19:11 | exit M2 | Finally.cs:19:10:19:11 | exit M2 | 1 |
| Finally.cs:19:10:19:11 | exit M2 (abnormal) | Finally.cs:19:10:19:11 | exit M2 (abnormal) | 1 |
| Finally.cs:19:10:19:11 | exit M2 (normal) | Finally.cs:19:10:19:11 | exit M2 (normal) | 1 |
| Finally.cs:24:13:24:19 | return ...; | Finally.cs:50:13:50:40 | [finally: return] call to method WriteLine | 5 |
| Finally.cs:24:13:24:19 | return ...; | Finally.cs:24:13:24:19 | return ...; | 1 |
| Finally.cs:26:9:29:9 | [exception: Exception] catch (...) {...} | Finally.cs:26:9:29:9 | [exception: Exception] catch (...) {...} | 1 |
| Finally.cs:26:38:26:39 | [exception: Exception] IOException ex | Finally.cs:26:48:26:51 | [exception: Exception] true | 2 |
| Finally.cs:27:9:29:9 | {...} | Finally.cs:28:13:28:18 | throw ...; | 2 |
| Finally.cs:30:9:40:9 | [exception: Exception] catch (...) {...} | Finally.cs:30:9:40:9 | [exception: Exception] catch (...) {...} | 1 |
| Finally.cs:30:41:30:42 | [exception: Exception] ArgumentException ex | Finally.cs:34:21:34:24 | true | 6 |
| Finally.cs:34:27:34:32 | throw ...; | Finally.cs:38:17:38:44 | [finally: exception] throw ...; | 5 |
| Finally.cs:34:27:34:32 | throw ...; | Finally.cs:38:17:38:44 | throw ...; | 5 |
| Finally.cs:41:9:43:9 | [exception: Exception] catch (...) {...} | Finally.cs:41:9:43:9 | [exception: Exception] catch (...) {...} | 1 |
| Finally.cs:42:9:43:9 | {...} | Finally.cs:50:13:50:40 | call to method WriteLine | 5 |
| Finally.cs:49:9:51:9 | [finally: exception] {...} | Finally.cs:19:10:19:11 | exit M2 (abnormal) | 5 |
| Finally.cs:42:9:43:9 | {...} | Finally.cs:42:9:43:9 | {...} | 1 |
| Finally.cs:49:9:51:9 | {...} | Finally.cs:50:13:50:40 | call to method WriteLine | 4 |
| Finally.cs:54:10:54:11 | enter M3 | Finally.cs:58:13:58:37 | call to method WriteLine | 7 |
| Finally.cs:54:10:54:11 | exit M3 | Finally.cs:54:10:54:11 | exit M3 | 1 |
| Finally.cs:54:10:54:11 | exit M3 (abnormal) | Finally.cs:54:10:54:11 | exit M3 (abnormal) | 1 |
| Finally.cs:54:10:54:11 | exit M3 (normal) | Finally.cs:54:10:54:11 | exit M3 (normal) | 1 |
| Finally.cs:59:13:59:19 | return ...; | Finally.cs:70:13:70:40 | [finally: return] call to method WriteLine | 5 |
| Finally.cs:59:13:59:19 | return ...; | Finally.cs:59:13:59:19 | return ...; | 1 |
| Finally.cs:61:9:64:9 | [exception: Exception] catch (...) {...} | Finally.cs:61:9:64:9 | [exception: Exception] catch (...) {...} | 1 |
| Finally.cs:61:38:61:39 | [exception: Exception] IOException ex | Finally.cs:61:48:61:51 | [exception: Exception] true | 2 |
| Finally.cs:62:9:64:9 | {...} | Finally.cs:63:13:63:18 | throw ...; | 2 |
| Finally.cs:65:9:67:9 | [exception: Exception] catch (...) {...} | Finally.cs:65:9:67:9 | [exception: Exception] catch (...) {...} | 1 |
| Finally.cs:65:26:65:26 | [exception: Exception] Exception e | Finally.cs:65:35:65:51 | [exception: Exception] ... != ... | 5 |
| Finally.cs:66:9:67:9 | {...} | Finally.cs:70:13:70:40 | call to method WriteLine | 5 |
| Finally.cs:69:9:71:9 | [finally: exception] {...} | Finally.cs:54:10:54:11 | exit M3 (abnormal) | 5 |
| Finally.cs:66:9:67:9 | {...} | Finally.cs:66:9:67:9 | {...} | 1 |
| Finally.cs:69:9:71:9 | {...} | Finally.cs:70:13:70:40 | call to method WriteLine | 4 |
| Finally.cs:74:10:74:11 | enter M4 | Finally.cs:77:9:100:9 | while (...) ... | 6 |
| Finally.cs:74:10:74:11 | exit M4 | Finally.cs:74:10:74:11 | exit M4 | 1 |
| Finally.cs:74:10:74:11 | exit M4 (abnormal) | Finally.cs:74:10:74:11 | exit M4 (abnormal) | 1 |
| Finally.cs:74:10:74:11 | exit M4 (normal) | Finally.cs:74:10:74:11 | exit M4 (normal) | 1 |
| Finally.cs:77:16:77:16 | access to local variable i | Finally.cs:77:16:77:20 | ... > ... | 3 |
| Finally.cs:78:9:100:9 | {...} | Finally.cs:81:21:81:26 | ... == ... | 7 |
| Finally.cs:82:21:82:27 | return ...; | Finally.cs:92:25:92:30 | [finally: return] ... == ... | 8 |
| Finally.cs:82:21:82:27 | return ...; | Finally.cs:82:21:82:27 | return ...; | 1 |
| Finally.cs:83:17:84:29 | if (...) ... | Finally.cs:83:21:83:26 | ... == ... | 4 |
| Finally.cs:84:21:84:29 | continue; | Finally.cs:92:25:92:30 | [finally: continue] ... == ... | 8 |
| Finally.cs:84:21:84:29 | continue; | Finally.cs:84:21:84:29 | continue; | 1 |
| Finally.cs:85:17:86:26 | if (...) ... | Finally.cs:85:21:85:26 | ... == ... | 4 |
| Finally.cs:86:21:86:26 | break; | Finally.cs:92:25:92:30 | [finally: break] ... == ... | 8 |
| Finally.cs:86:21:86:26 | break; | Finally.cs:86:21:86:26 | break; | 1 |
| Finally.cs:89:13:99:13 | {...} | Finally.cs:92:25:92:30 | ... == ... | 7 |
| Finally.cs:93:25:93:46 | [finally: break] throw ...; | Finally.cs:93:25:93:46 | [finally: break] throw ...; | 1 |
| Finally.cs:93:25:93:46 | [finally: continue] throw ...; | Finally.cs:93:25:93:46 | [finally: continue] throw ...; | 1 |
| Finally.cs:93:25:93:46 | [finally: return] throw ...; | Finally.cs:93:25:93:46 | [finally: return] throw ...; | 1 |
| Finally.cs:93:25:93:46 | throw ...; | Finally.cs:93:25:93:46 | throw ...; | 1 |
| Finally.cs:93:31:93:45 | [finally: break] object creation of type Exception | Finally.cs:93:31:93:45 | [finally: break] object creation of type Exception | 1 |
| Finally.cs:93:31:93:45 | [finally: continue] object creation of type Exception | Finally.cs:93:31:93:45 | [finally: continue] object creation of type Exception | 1 |
| Finally.cs:93:31:93:45 | [finally: return] object creation of type Exception | Finally.cs:93:31:93:45 | [finally: return] object creation of type Exception | 1 |
| Finally.cs:93:31:93:45 | object creation of type Exception | Finally.cs:93:31:93:45 | object creation of type Exception | 1 |
| Finally.cs:96:17:98:17 | [finally(1): exception] {...} | Finally.cs:97:21:97:23 | [finally(1): exception] ...-- | 4 |
| Finally.cs:96:17:98:17 | [finally: break, finally(1): exception] {...} | Finally.cs:97:21:97:23 | [finally: break, finally(1): exception] ...-- | 4 |
| Finally.cs:96:17:98:17 | [finally: break] {...} | Finally.cs:97:21:97:23 | [finally: break] ...-- | 4 |
| Finally.cs:96:17:98:17 | [finally: continue, finally(1): exception] {...} | Finally.cs:97:21:97:23 | [finally: continue, finally(1): exception] ...-- | 4 |
| Finally.cs:96:17:98:17 | [finally: continue] {...} | Finally.cs:97:21:97:23 | [finally: continue] ...-- | 4 |
| Finally.cs:96:17:98:17 | [finally: return, finally(1): exception] {...} | Finally.cs:97:21:97:23 | [finally: return, finally(1): exception] ...-- | 4 |
| Finally.cs:96:17:98:17 | [finally: return] {...} | Finally.cs:97:21:97:23 | [finally: return] ...-- | 4 |
| Finally.cs:96:17:98:17 | {...} | Finally.cs:97:21:97:23 | ...-- | 4 |
| Finally.cs:103:10:103:11 | enter M5 | Finally.cs:107:17:107:21 | access to field Field | 7 |
| Finally.cs:103:10:103:11 | exit M5 | Finally.cs:103:10:103:11 | exit M5 | 1 |
@@ -495,59 +466,35 @@
| Finally.cs:103:10:103:11 | exit M5 (normal) | Finally.cs:103:10:103:11 | exit M5 (normal) | 1 |
| Finally.cs:107:17:107:28 | access to property Length | Finally.cs:107:17:107:28 | access to property Length | 1 |
| Finally.cs:107:33:107:33 | 0 | Finally.cs:107:17:107:33 | ... == ... | 2 |
| Finally.cs:108:17:108:23 | return ...; | Finally.cs:114:19:114:35 | [finally: return] ... == ... | 8 |
| Finally.cs:108:17:108:23 | return ...; | Finally.cs:108:17:108:23 | return ...; | 1 |
| Finally.cs:109:13:110:49 | if (...) ... | Finally.cs:109:17:109:21 | access to field Field | 3 |
| Finally.cs:109:17:109:28 | access to property Length | Finally.cs:109:17:109:28 | access to property Length | 1 |
| Finally.cs:109:33:109:33 | 1 | Finally.cs:109:17:109:33 | ... == ... | 2 |
| Finally.cs:110:17:110:49 | throw ...; | Finally.cs:110:17:110:49 | throw ...; | 1 |
| Finally.cs:110:23:110:48 | object creation of type OutOfMemoryException | Finally.cs:110:23:110:48 | object creation of type OutOfMemoryException | 1 |
| Finally.cs:113:9:118:9 | [finally: exception] {...} | Finally.cs:114:19:114:35 | [finally: exception] ... == ... | 7 |
| Finally.cs:113:9:118:9 | {...} | Finally.cs:114:19:114:35 | ... == ... | 7 |
| Finally.cs:114:17:114:36 | [false, finally: exception] !... | Finally.cs:114:17:114:36 | [false, finally: exception] !... | 1 |
| Finally.cs:114:17:114:36 | [false, finally: return] !... | Finally.cs:114:17:114:36 | [false, finally: return] !... | 1 |
| Finally.cs:114:17:114:36 | [false] !... | Finally.cs:114:17:114:36 | [false] !... | 1 |
| Finally.cs:114:17:114:36 | [true, finally: exception] !... | Finally.cs:114:17:114:36 | [true, finally: exception] !... | 1 |
| Finally.cs:114:17:114:36 | [true, finally: return] !... | Finally.cs:114:17:114:36 | [true, finally: return] !... | 1 |
| Finally.cs:114:17:114:36 | [true] !... | Finally.cs:114:17:114:36 | [true] !... | 1 |
| Finally.cs:115:17:115:41 | ...; | Finally.cs:115:17:115:40 | call to method WriteLine | 4 |
| Finally.cs:115:17:115:41 | [finally: exception] ...; | Finally.cs:115:17:115:40 | [finally: exception] call to method WriteLine | 4 |
| Finally.cs:115:17:115:41 | [finally: return] ...; | Finally.cs:115:17:115:40 | [finally: return] call to method WriteLine | 4 |
| Finally.cs:116:13:117:37 | [finally: exception] if (...) ... | Finally.cs:116:17:116:32 | [finally: exception] ... > ... | 6 |
| Finally.cs:116:13:117:37 | [finally: return] if (...) ... | Finally.cs:116:17:116:32 | [finally: return] ... > ... | 6 |
| Finally.cs:116:13:117:37 | if (...) ... | Finally.cs:116:17:116:32 | ... > ... | 6 |
| Finally.cs:117:17:117:37 | ...; | Finally.cs:117:17:117:36 | call to method WriteLine | 3 |
| Finally.cs:117:17:117:37 | [finally: exception] ...; | Finally.cs:117:17:117:36 | [finally: exception] call to method WriteLine | 3 |
| Finally.cs:117:17:117:37 | [finally: return] ...; | Finally.cs:117:17:117:36 | [finally: return] call to method WriteLine | 3 |
| Finally.cs:121:10:121:11 | enter M6 | Finally.cs:121:10:121:11 | exit M6 | 12 |
| Finally.cs:133:10:133:11 | enter M7 | Finally.cs:137:13:137:36 | call to method WriteLine | 7 |
| Finally.cs:133:10:133:11 | exit M7 (abnormal) | Finally.cs:133:10:133:11 | exit M7 | 2 |
| Finally.cs:140:9:143:9 | [finally: exception] {...} | Finally.cs:141:13:141:44 | [finally: exception] throw ...; | 4 |
| Finally.cs:140:9:143:9 | {...} | Finally.cs:141:13:141:44 | throw ...; | 4 |
| Finally.cs:133:10:133:11 | enter M7 | Finally.cs:133:10:133:11 | exit M7 | 13 |
| Finally.cs:147:10:147:11 | enter M8 | Finally.cs:151:17:151:28 | ... == ... | 8 |
| Finally.cs:147:10:147:11 | exit M8 | Finally.cs:147:10:147:11 | exit M8 | 1 |
| Finally.cs:147:10:147:11 | exit M8 (abnormal) | Finally.cs:147:10:147:11 | exit M8 (abnormal) | 1 |
| Finally.cs:147:10:147:11 | exit M8 (normal) | Finally.cs:147:10:147:11 | exit M8 (normal) | 1 |
| Finally.cs:152:17:152:50 | throw ...; | Finally.cs:152:17:152:50 | throw ...; | 1 |
| Finally.cs:152:23:152:49 | object creation of type ArgumentNullException | Finally.cs:152:23:152:49 | object creation of type ArgumentNullException | 1 |
| Finally.cs:155:9:169:9 | [finally: exception] {...} | Finally.cs:158:21:158:31 | [finally: exception] access to property Length | 6 |
| Finally.cs:155:9:169:9 | {...} | Finally.cs:158:21:158:31 | access to property Length | 6 |
| Finally.cs:158:36:158:36 | 1 | Finally.cs:158:21:158:36 | ... == ... | 2 |
| Finally.cs:158:36:158:36 | [finally: exception] 1 | Finally.cs:158:21:158:36 | [finally: exception] ... == ... | 2 |
| Finally.cs:159:21:159:45 | [finally: exception] throw ...; | Finally.cs:159:21:159:45 | [finally: exception] throw ...; | 1 |
| Finally.cs:159:21:159:45 | throw ...; | Finally.cs:159:21:159:45 | throw ...; | 1 |
| Finally.cs:159:41:159:43 | "1" | Finally.cs:159:27:159:44 | object creation of type Exception | 2 |
| Finally.cs:159:41:159:43 | [finally: exception] "1" | Finally.cs:159:27:159:44 | [finally: exception] object creation of type Exception | 2 |
| Finally.cs:161:13:164:13 | [exception: Exception] catch (...) {...} | Finally.cs:161:13:164:13 | [exception: Exception] catch (...) {...} | 1 |
| Finally.cs:161:13:164:13 | [exception: NullReferenceException] catch (...) {...} | Finally.cs:161:13:164:13 | [exception: NullReferenceException] catch (...) {...} | 1 |
| Finally.cs:161:13:164:13 | [finally: exception, exception: Exception] catch (...) {...} | Finally.cs:161:13:164:13 | [finally: exception, exception: Exception] catch (...) {...} | 1 |
| Finally.cs:161:13:164:13 | [finally: exception, exception: NullReferenceException] catch (...) {...} | Finally.cs:161:13:164:13 | [finally: exception, exception: NullReferenceException] catch (...) {...} | 1 |
| Finally.cs:161:30:161:30 | [exception: Exception] Exception e | Finally.cs:161:39:161:54 | [exception: Exception] ... == ... | 5 |
| Finally.cs:161:30:161:30 | [exception: NullReferenceException] Exception e | Finally.cs:161:39:161:54 | [exception: NullReferenceException] ... == ... | 5 |
| Finally.cs:161:30:161:30 | [finally: exception, exception: Exception] Exception e | Finally.cs:161:39:161:54 | [finally: exception, exception: Exception] ... == ... | 5 |
| Finally.cs:161:30:161:30 | [finally: exception, exception: NullReferenceException] Exception e | Finally.cs:161:39:161:54 | [finally: exception, exception: NullReferenceException] ... == ... | 5 |
| Finally.cs:162:13:164:13 | [finally: exception] {...} | Finally.cs:163:17:163:42 | [finally: exception] call to method WriteLine | 6 |
| Finally.cs:162:13:164:13 | {...} | Finally.cs:163:17:163:42 | call to method WriteLine | 6 |
| Finally.cs:165:13:168:13 | [finally: exception] catch {...} | Finally.cs:167:17:167:37 | [finally: exception] call to method WriteLine | 5 |
| Finally.cs:165:13:168:13 | catch {...} | Finally.cs:167:17:167:37 | call to method WriteLine | 5 |
| Finally.cs:172:11:172:20 | enter ExceptionA | Finally.cs:172:11:172:20 | exit ExceptionA | 5 |
| Finally.cs:173:11:173:20 | enter ExceptionB | Finally.cs:173:11:173:20 | exit ExceptionB | 5 |
@@ -556,67 +503,47 @@
| Finally.cs:176:10:176:11 | exit M9 | Finally.cs:176:10:176:11 | exit M9 | 1 |
| Finally.cs:176:10:176:11 | exit M9 (abnormal) | Finally.cs:176:10:176:11 | exit M9 (abnormal) | 1 |
| Finally.cs:176:10:176:11 | exit M9 (normal) | Finally.cs:176:10:176:11 | exit M9 (normal) | 1 |
| Finally.cs:180:21:180:43 | [b1 (line 176): true] throw ...; | Finally.cs:180:21:180:43 | [b1 (line 176): true] throw ...; | 1 |
| Finally.cs:180:27:180:42 | [b1 (line 176): true] object creation of type ExceptionA | Finally.cs:180:27:180:42 | [b1 (line 176): true] object creation of type ExceptionA | 1 |
| Finally.cs:183:9:192:9 | [b1 (line 176): false] {...} | Finally.cs:186:21:186:22 | [b1 (line 176): false] access to parameter b2 | 5 |
| Finally.cs:183:9:192:9 | [finally: exception, b1 (line 176): true] {...} | Finally.cs:186:21:186:22 | [finally: exception, b1 (line 176): true] access to parameter b2 | 5 |
| Finally.cs:186:25:186:47 | [b1 (line 176): false, b2 (line 176): true] throw ...; | Finally.cs:188:13:191:13 | [exception: ExceptionB, b1 (line 176): false, b2 (line 176): true] catch (...) {...} | 2 |
| Finally.cs:186:25:186:47 | [finally: exception, b1 (line 176): true, b2 (line 176): true] throw ...; | Finally.cs:188:13:191:13 | [finally: exception, exception: ExceptionB, b1 (line 176): true, b2 (line 176): true] catch (...) {...} | 2 |
| Finally.cs:186:31:186:46 | [b1 (line 176): false, b2 (line 176): true] object creation of type ExceptionB | Finally.cs:186:31:186:46 | [b1 (line 176): false, b2 (line 176): true] object creation of type ExceptionB | 1 |
| Finally.cs:186:31:186:46 | [finally: exception, b1 (line 176): true, b2 (line 176): true] object creation of type ExceptionB | Finally.cs:186:31:186:46 | [finally: exception, b1 (line 176): true, b2 (line 176): true] object creation of type ExceptionB | 1 |
| Finally.cs:188:13:191:13 | [exception: Exception, b1 (line 176): false, b2 (line 176): true] catch (...) {...} | Finally.cs:188:13:191:13 | [exception: Exception, b1 (line 176): false, b2 (line 176): true] catch (...) {...} | 1 |
| Finally.cs:188:13:191:13 | [finally: exception, exception: Exception, b1 (line 176): true, b2 (line 176): true] catch (...) {...} | Finally.cs:188:13:191:13 | [finally: exception, exception: Exception, b1 (line 176): true, b2 (line 176): true] catch (...) {...} | 1 |
| Finally.cs:188:38:188:39 | [exception: Exception, b1 (line 176): false, b2 (line 176): true] access to parameter b2 | Finally.cs:188:38:188:39 | [exception: Exception, b1 (line 176): false, b2 (line 176): true] access to parameter b2 | 1 |
| Finally.cs:188:38:188:39 | [exception: ExceptionB, b1 (line 176): false, b2 (line 176): true] access to parameter b2 | Finally.cs:188:38:188:39 | [exception: ExceptionB, b1 (line 176): false, b2 (line 176): true] access to parameter b2 | 1 |
| Finally.cs:188:38:188:39 | [finally: exception, exception: Exception, b1 (line 176): true, b2 (line 176): true] access to parameter b2 | Finally.cs:188:38:188:39 | [finally: exception, exception: Exception, b1 (line 176): true, b2 (line 176): true] access to parameter b2 | 1 |
| Finally.cs:188:38:188:39 | [finally: exception, exception: ExceptionB, b1 (line 176): true, b2 (line 176): true] access to parameter b2 | Finally.cs:188:38:188:39 | [finally: exception, exception: ExceptionB, b1 (line 176): true, b2 (line 176): true] access to parameter b2 | 1 |
| Finally.cs:189:13:191:13 | [b1 (line 176): false] {...} | Finally.cs:190:21:190:22 | [b1 (line 176): false] access to parameter b1 | 3 |
| Finally.cs:189:13:191:13 | [finally: exception, b1 (line 176): true] {...} | Finally.cs:190:21:190:22 | [finally: exception, b1 (line 176): true] access to parameter b1 | 3 |
| Finally.cs:190:31:190:46 | [finally: exception] object creation of type ExceptionC | Finally.cs:190:25:190:47 | [finally: exception] throw ...; | 2 |
| Finally.cs:180:21:180:43 | throw ...; | Finally.cs:180:21:180:43 | throw ...; | 1 |
| Finally.cs:180:27:180:42 | object creation of type ExceptionA | Finally.cs:180:27:180:42 | object creation of type ExceptionA | 1 |
| Finally.cs:183:9:192:9 | {...} | Finally.cs:186:21:186:22 | access to parameter b2 | 5 |
| Finally.cs:186:25:186:47 | throw ...; | Finally.cs:188:13:191:13 | [exception: ExceptionB] catch (...) {...} | 2 |
| Finally.cs:186:31:186:46 | object creation of type ExceptionB | Finally.cs:186:31:186:46 | object creation of type ExceptionB | 1 |
| Finally.cs:188:13:191:13 | [exception: Exception] catch (...) {...} | Finally.cs:188:13:191:13 | [exception: Exception] catch (...) {...} | 1 |
| Finally.cs:188:38:188:39 | [exception: ExceptionB] access to parameter b2 | Finally.cs:188:38:188:39 | [exception: ExceptionB] access to parameter b2 | 1 |
| Finally.cs:188:38:188:39 | [exception: Exception] access to parameter b2 | Finally.cs:188:38:188:39 | [exception: Exception] access to parameter b2 | 1 |
| Finally.cs:189:13:191:13 | {...} | Finally.cs:190:21:190:22 | access to parameter b1 | 3 |
| Finally.cs:190:31:190:46 | object creation of type ExceptionC | Finally.cs:190:25:190:47 | throw ...; | 2 |
| Finally.cs:195:10:195:12 | enter M10 | Finally.cs:199:17:199:18 | access to parameter b1 | 6 |
| Finally.cs:195:10:195:12 | exit M10 | Finally.cs:195:10:195:12 | exit M10 | 1 |
| Finally.cs:195:10:195:12 | exit M10 (abnormal) | Finally.cs:195:10:195:12 | exit M10 (abnormal) | 1 |
| Finally.cs:199:21:199:43 | throw ...; | Finally.cs:199:21:199:43 | throw ...; | 1 |
| Finally.cs:199:27:199:42 | object creation of type ExceptionA | Finally.cs:199:27:199:42 | object creation of type ExceptionA | 1 |
| Finally.cs:202:9:212:9 | [finally: exception] {...} | Finally.cs:205:21:205:22 | [finally: exception] access to parameter b2 | 5 |
| Finally.cs:202:9:212:9 | {...} | Finally.cs:205:21:205:22 | access to parameter b2 | 5 |
| Finally.cs:205:25:205:47 | [finally: exception] throw ...; | Finally.cs:205:25:205:47 | [finally: exception] throw ...; | 1 |
| Finally.cs:205:25:205:47 | throw ...; | Finally.cs:205:25:205:47 | throw ...; | 1 |
| Finally.cs:205:31:205:46 | [finally: exception] object creation of type ExceptionB | Finally.cs:205:31:205:46 | [finally: exception] object creation of type ExceptionB | 1 |
| Finally.cs:205:31:205:46 | object creation of type ExceptionB | Finally.cs:205:31:205:46 | object creation of type ExceptionB | 1 |
| Finally.cs:208:13:210:13 | [finally(1): exception] {...} | Finally.cs:209:21:209:22 | [finally(1): exception] access to parameter b3 | 3 |
| Finally.cs:208:13:210:13 | [finally: exception, finally(1): exception] {...} | Finally.cs:209:21:209:22 | [finally: exception, finally(1): exception] access to parameter b3 | 3 |
| Finally.cs:208:13:210:13 | [finally: exception] {...} | Finally.cs:209:21:209:22 | [finally: exception] access to parameter b3 | 3 |
| Finally.cs:208:13:210:13 | {...} | Finally.cs:209:21:209:22 | access to parameter b3 | 3 |
| Finally.cs:209:31:209:46 | [finally(1): exception] object creation of type ExceptionC | Finally.cs:209:25:209:47 | [finally(1): exception] throw ...; | 2 |
| Finally.cs:209:31:209:46 | [finally: exception, finally(1): exception] object creation of type ExceptionC | Finally.cs:209:25:209:47 | [finally: exception, finally(1): exception] throw ...; | 2 |
| Finally.cs:209:31:209:46 | [finally: exception] object creation of type ExceptionC | Finally.cs:209:25:209:47 | [finally: exception] throw ...; | 2 |
| Finally.cs:209:31:209:46 | object creation of type ExceptionC | Finally.cs:209:25:209:47 | throw ...; | 2 |
| Finally.cs:211:13:211:29 | ...; | Finally.cs:195:10:195:12 | exit M10 (normal) | 9 |
| Finally.cs:211:13:211:29 | [finally: exception] ...; | Finally.cs:211:13:211:28 | [finally: exception] ... = ... | 4 |
| Finally.cs:211:13:211:29 | ...; | Finally.cs:211:13:211:28 | ... = ... | 4 |
| Finally.cs:213:9:213:25 | ...; | Finally.cs:195:10:195:12 | exit M10 (normal) | 5 |
| Finally.cs:216:10:216:12 | enter M11 | Finally.cs:220:13:220:36 | call to method WriteLine | 7 |
| Finally.cs:222:9:225:9 | catch {...} | Finally.cs:224:13:224:38 | call to method WriteLine | 5 |
| Finally.cs:227:9:229:9 | {...} | Finally.cs:216:10:216:12 | exit M11 | 9 |
| Finally.cs:233:10:233:12 | enter M12 | Finally.cs:239:21:239:22 | access to parameter b1 | 8 |
| Finally.cs:233:10:233:12 | exit M12 | Finally.cs:233:10:233:12 | exit M12 | 1 |
| Finally.cs:233:10:233:12 | exit M12 (abnormal) | Finally.cs:233:10:233:12 | exit M12 (abnormal) | 1 |
| Finally.cs:240:21:240:43 | throw ...; | Finally.cs:240:21:240:43 | throw ...; | 1 |
| Finally.cs:240:27:240:42 | object creation of type ExceptionA | Finally.cs:240:27:240:42 | object creation of type ExceptionA | 1 |
| Finally.cs:243:13:253:13 | [finally: exception] {...} | Finally.cs:246:25:246:26 | [finally: exception] access to parameter b2 | 5 |
| Finally.cs:243:13:253:13 | {...} | Finally.cs:246:25:246:26 | access to parameter b2 | 5 |
| Finally.cs:247:25:247:47 | [finally: exception] throw ...; | Finally.cs:247:25:247:47 | [finally: exception] throw ...; | 1 |
| Finally.cs:247:25:247:47 | throw ...; | Finally.cs:247:25:247:47 | throw ...; | 1 |
| Finally.cs:247:31:247:46 | [finally: exception] object creation of type ExceptionA | Finally.cs:247:31:247:46 | [finally: exception] object creation of type ExceptionA | 1 |
| Finally.cs:247:31:247:46 | object creation of type ExceptionA | Finally.cs:247:31:247:46 | object creation of type ExceptionA | 1 |
| Finally.cs:250:17:252:17 | [finally(1): exception] {...} | Finally.cs:251:21:251:54 | [finally(1): exception] call to method WriteLine | 4 |
| Finally.cs:250:17:252:17 | [finally: exception, finally(1): exception] {...} | Finally.cs:251:21:251:54 | [finally: exception, finally(1): exception] call to method WriteLine | 4 |
| Finally.cs:250:17:252:17 | [finally: exception] {...} | Finally.cs:251:21:251:54 | [finally: exception] call to method WriteLine | 4 |
| Finally.cs:250:17:252:17 | {...} | Finally.cs:254:13:254:44 | call to method WriteLine | 7 |
| Finally.cs:257:9:259:9 | [finally: exception] {...} | Finally.cs:233:10:233:12 | exit M12 (abnormal) | 5 |
| Finally.cs:257:9:259:9 | {...} | Finally.cs:233:10:233:12 | exit M12 (normal) | 8 |
| Finally.cs:263:10:263:12 | enter M13 | Finally.cs:267:13:267:34 | call to method WriteLine | 7 |
| Finally.cs:250:17:252:17 | {...} | Finally.cs:251:21:251:54 | call to method WriteLine | 4 |
| Finally.cs:254:13:254:45 | ...; | Finally.cs:254:13:254:44 | call to method WriteLine | 3 |
| Finally.cs:257:9:259:9 | {...} | Finally.cs:258:13:258:46 | call to method WriteLine | 4 |
| Finally.cs:260:9:260:34 | ...; | Finally.cs:233:10:233:12 | exit M12 (normal) | 4 |
| Finally.cs:263:10:263:12 | enter M13 | Finally.cs:272:13:272:18 | ... = ... | 16 |
| Finally.cs:263:10:263:12 | exit M13 | Finally.cs:263:10:263:12 | exit M13 | 1 |
| Finally.cs:270:9:273:9 | [finally: exception] {...} | Finally.cs:263:10:263:12 | exit M13 (abnormal) | 10 |
| Finally.cs:270:9:273:9 | {...} | Finally.cs:263:10:263:12 | exit M13 (normal) | 10 |
| Finally.cs:263:10:263:12 | exit M13 (abnormal) | Finally.cs:263:10:263:12 | exit M13 (abnormal) | 1 |
| Finally.cs:263:10:263:12 | exit M13 (normal) | Finally.cs:263:10:263:12 | exit M13 (normal) | 1 |
| Foreach.cs:4:7:4:13 | enter Foreach | Foreach.cs:4:7:4:13 | exit Foreach | 5 |
| Foreach.cs:6:10:6:11 | enter M1 | Foreach.cs:8:29:8:32 | access to parameter args | 3 |
| Foreach.cs:6:10:6:11 | exit M1 (normal) | Foreach.cs:6:10:6:11 | exit M1 | 2 |
@@ -661,48 +588,60 @@
| LoopUnrolling.cs:7:10:7:11 | enter M1 | LoopUnrolling.cs:9:13:9:28 | ... == ... | 7 |
| LoopUnrolling.cs:7:10:7:11 | exit M1 (normal) | LoopUnrolling.cs:7:10:7:11 | exit M1 | 2 |
| LoopUnrolling.cs:10:13:10:19 | return ...; | LoopUnrolling.cs:10:13:10:19 | return ...; | 1 |
| LoopUnrolling.cs:11:22:11:24 | String arg | LoopUnrolling.cs:11:9:12:35 | foreach (... ... in ...) ... | 5 |
| LoopUnrolling.cs:11:29:11:32 | access to parameter args | LoopUnrolling.cs:11:9:12:35 | [unroll (line 11)] foreach (... ... in ...) ... | 2 |
| LoopUnrolling.cs:15:10:15:11 | enter M2 | LoopUnrolling.cs:18:9:19:33 | [unroll (line 18)] foreach (... ... in ...) ... | 12 |
| LoopUnrolling.cs:11:9:12:35 | foreach (... ... in ...) ... | LoopUnrolling.cs:11:9:12:35 | foreach (... ... in ...) ... | 1 |
| LoopUnrolling.cs:11:22:11:24 | String arg | LoopUnrolling.cs:12:13:12:34 | call to method WriteLine | 4 |
| LoopUnrolling.cs:11:29:11:32 | access to parameter args | LoopUnrolling.cs:11:29:11:32 | access to parameter args | 1 |
| LoopUnrolling.cs:15:10:15:11 | enter M2 | LoopUnrolling.cs:18:27:18:28 | access to local variable xs | 11 |
| LoopUnrolling.cs:15:10:15:11 | exit M2 (normal) | LoopUnrolling.cs:15:10:15:11 | exit M2 | 2 |
| LoopUnrolling.cs:18:22:18:22 | String x | LoopUnrolling.cs:18:9:19:33 | foreach (... ... in ...) ... | 5 |
| LoopUnrolling.cs:18:9:19:33 | foreach (... ... in ...) ... | LoopUnrolling.cs:18:9:19:33 | foreach (... ... in ...) ... | 1 |
| LoopUnrolling.cs:18:22:18:22 | String x | LoopUnrolling.cs:19:13:19:32 | call to method WriteLine | 4 |
| LoopUnrolling.cs:22:10:22:11 | enter M3 | LoopUnrolling.cs:24:29:24:32 | access to parameter args | 3 |
| LoopUnrolling.cs:22:10:22:11 | exit M3 (normal) | LoopUnrolling.cs:22:10:22:11 | exit M3 | 2 |
| LoopUnrolling.cs:24:9:26:40 | foreach (... ... in ...) ... | LoopUnrolling.cs:24:9:26:40 | foreach (... ... in ...) ... | 1 |
| LoopUnrolling.cs:24:22:24:24 | Char arg | LoopUnrolling.cs:25:13:26:40 | [unroll (line 25)] foreach (... ... in ...) ... | 3 |
| LoopUnrolling.cs:25:26:25:29 | Char arg0 | LoopUnrolling.cs:25:13:26:40 | foreach (... ... in ...) ... | 5 |
| LoopUnrolling.cs:29:10:29:11 | enter M4 | LoopUnrolling.cs:32:9:33:33 | [skip (line 32)] foreach (... ... in ...) ... | 8 |
| LoopUnrolling.cs:24:22:24:24 | Char arg | LoopUnrolling.cs:25:34:25:37 | access to parameter args | 2 |
| LoopUnrolling.cs:25:13:26:40 | foreach (... ... in ...) ... | LoopUnrolling.cs:25:13:26:40 | foreach (... ... in ...) ... | 1 |
| LoopUnrolling.cs:25:26:25:29 | Char arg0 | LoopUnrolling.cs:26:17:26:39 | call to method WriteLine | 4 |
| LoopUnrolling.cs:29:10:29:11 | enter M4 | LoopUnrolling.cs:32:27:32:28 | access to local variable xs | 7 |
| LoopUnrolling.cs:29:10:29:11 | exit M4 (normal) | LoopUnrolling.cs:29:10:29:11 | exit M4 | 2 |
| LoopUnrolling.cs:36:10:36:11 | enter M5 | LoopUnrolling.cs:40:9:42:41 | [unroll (line 40)] foreach (... ... in ...) ... | 20 |
| LoopUnrolling.cs:32:9:33:33 | foreach (... ... in ...) ... | LoopUnrolling.cs:32:9:33:33 | foreach (... ... in ...) ... | 1 |
| LoopUnrolling.cs:32:22:32:22 | String x | LoopUnrolling.cs:33:13:33:32 | call to method WriteLine | 4 |
| LoopUnrolling.cs:36:10:36:11 | enter M5 | LoopUnrolling.cs:40:27:40:28 | access to local variable xs | 19 |
| LoopUnrolling.cs:36:10:36:11 | exit M5 (normal) | LoopUnrolling.cs:36:10:36:11 | exit M5 | 2 |
| LoopUnrolling.cs:40:9:42:41 | foreach (... ... in ...) ... | LoopUnrolling.cs:40:9:42:41 | foreach (... ... in ...) ... | 1 |
| LoopUnrolling.cs:40:22:40:22 | String x | LoopUnrolling.cs:41:13:42:41 | [unroll (line 41)] foreach (... ... in ...) ... | 3 |
| LoopUnrolling.cs:41:26:41:26 | String y | LoopUnrolling.cs:41:13:42:41 | foreach (... ... in ...) ... | 7 |
| LoopUnrolling.cs:45:10:45:11 | enter M6 | LoopUnrolling.cs:48:9:52:9 | [unroll (line 48)] foreach (... ... in ...) ... | 12 |
| LoopUnrolling.cs:40:22:40:22 | String x | LoopUnrolling.cs:41:31:41:32 | access to local variable ys | 2 |
| LoopUnrolling.cs:41:13:42:41 | foreach (... ... in ...) ... | LoopUnrolling.cs:41:13:42:41 | foreach (... ... in ...) ... | 1 |
| LoopUnrolling.cs:41:26:41:26 | String y | LoopUnrolling.cs:42:17:42:40 | call to method WriteLine | 6 |
| LoopUnrolling.cs:45:10:45:11 | enter M6 | LoopUnrolling.cs:48:9:52:9 | foreach (... ... in ...) ... | 12 |
| LoopUnrolling.cs:45:10:45:11 | exit M6 (normal) | LoopUnrolling.cs:45:10:45:11 | exit M6 | 2 |
| LoopUnrolling.cs:48:22:48:22 | String x | LoopUnrolling.cs:49:9:52:9 | {...} | 2 |
| LoopUnrolling.cs:50:9:50:13 | Label: | LoopUnrolling.cs:51:13:51:23 | goto ...; | 5 |
| LoopUnrolling.cs:55:10:55:11 | enter M7 | LoopUnrolling.cs:58:9:64:9 | [unroll (line 58)] foreach (... ... in ...) ... | 12 |
| LoopUnrolling.cs:55:10:55:11 | enter M7 | LoopUnrolling.cs:58:27:58:28 | access to local variable xs | 11 |
| LoopUnrolling.cs:55:10:55:11 | exit M7 (normal) | LoopUnrolling.cs:55:10:55:11 | exit M7 | 2 |
| LoopUnrolling.cs:58:9:64:9 | [b (line 55): false] foreach (... ... in ...) ... | LoopUnrolling.cs:58:9:64:9 | [b (line 55): false] foreach (... ... in ...) ... | 1 |
| LoopUnrolling.cs:58:9:64:9 | foreach (... ... in ...) ... | LoopUnrolling.cs:58:9:64:9 | foreach (... ... in ...) ... | 1 |
| LoopUnrolling.cs:58:22:58:22 | String x | LoopUnrolling.cs:60:17:60:17 | access to parameter b | 4 |
| LoopUnrolling.cs:58:22:58:22 | [b (line 55): false] String x | LoopUnrolling.cs:60:17:60:17 | [b (line 55): false] access to parameter b | 4 |
| LoopUnrolling.cs:58:22:58:22 | [b (line 55): true] String x | LoopUnrolling.cs:60:17:60:17 | [b (line 55): true] access to parameter b | 4 |
| LoopUnrolling.cs:61:17:61:37 | [b (line 55): true] ...; | LoopUnrolling.cs:62:17:62:17 | [b (line 55): true] access to parameter b | 5 |
| LoopUnrolling.cs:62:13:63:37 | [b (line 55): false] if (...) ... | LoopUnrolling.cs:62:17:62:17 | [b (line 55): false] access to parameter b | 2 |
| LoopUnrolling.cs:63:17:63:37 | [b (line 55): true] ...; | LoopUnrolling.cs:58:9:64:9 | [b (line 55): true] foreach (... ... in ...) ... | 4 |
| LoopUnrolling.cs:61:17:61:37 | ...; | LoopUnrolling.cs:61:17:61:36 | call to method WriteLine | 3 |
| LoopUnrolling.cs:62:13:63:37 | if (...) ... | LoopUnrolling.cs:62:17:62:17 | access to parameter b | 2 |
| LoopUnrolling.cs:63:17:63:37 | ...; | LoopUnrolling.cs:63:17:63:36 | call to method WriteLine | 3 |
| LoopUnrolling.cs:67:10:67:11 | enter M8 | LoopUnrolling.cs:69:14:69:23 | call to method Any<String> | 5 |
| LoopUnrolling.cs:67:10:67:11 | exit M8 (normal) | LoopUnrolling.cs:67:10:67:11 | exit M8 | 2 |
| LoopUnrolling.cs:69:13:69:23 | [false] !... | LoopUnrolling.cs:69:13:69:23 | [false] !... | 1 |
| LoopUnrolling.cs:69:13:69:23 | [true] !... | LoopUnrolling.cs:69:13:69:23 | [true] !... | 1 |
| LoopUnrolling.cs:70:13:70:19 | return ...; | LoopUnrolling.cs:70:13:70:19 | return ...; | 1 |
| LoopUnrolling.cs:71:9:71:21 | ...; | LoopUnrolling.cs:72:9:73:35 | [skip (line 72)] foreach (... ... in ...) ... | 5 |
| LoopUnrolling.cs:76:10:76:11 | enter M9 | LoopUnrolling.cs:79:9:82:9 | [skip (line 79)] foreach (... ... in ...) ... | 9 |
| LoopUnrolling.cs:71:9:71:21 | ...; | LoopUnrolling.cs:72:29:72:32 | access to parameter args | 4 |
| LoopUnrolling.cs:72:9:73:35 | foreach (... ... in ...) ... | LoopUnrolling.cs:72:9:73:35 | foreach (... ... in ...) ... | 1 |
| LoopUnrolling.cs:72:22:72:24 | String arg | LoopUnrolling.cs:73:13:73:34 | call to method WriteLine | 4 |
| LoopUnrolling.cs:76:10:76:11 | enter M9 | LoopUnrolling.cs:79:27:79:28 | access to local variable xs | 8 |
| LoopUnrolling.cs:76:10:76:11 | exit M9 (normal) | LoopUnrolling.cs:76:10:76:11 | exit M9 | 2 |
| LoopUnrolling.cs:85:10:85:12 | enter M10 | LoopUnrolling.cs:88:9:91:9 | [skip (line 88)] foreach (... ... in ...) ... | 9 |
| LoopUnrolling.cs:79:9:82:9 | foreach (... ... in ...) ... | LoopUnrolling.cs:79:9:82:9 | foreach (... ... in ...) ... | 1 |
| LoopUnrolling.cs:79:22:79:22 | String x | LoopUnrolling.cs:81:13:81:32 | call to method WriteLine | 5 |
| LoopUnrolling.cs:85:10:85:12 | enter M10 | LoopUnrolling.cs:88:27:88:28 | access to local variable xs | 8 |
| LoopUnrolling.cs:85:10:85:12 | exit M10 (normal) | LoopUnrolling.cs:85:10:85:12 | exit M10 | 2 |
| LoopUnrolling.cs:94:10:94:12 | enter M11 | LoopUnrolling.cs:97:9:100:9 | [unroll (line 97)] foreach (... ... in ...) ... | 9 |
| LoopUnrolling.cs:88:9:91:9 | foreach (... ... in ...) ... | LoopUnrolling.cs:88:9:91:9 | foreach (... ... in ...) ... | 1 |
| LoopUnrolling.cs:88:22:88:22 | String x | LoopUnrolling.cs:90:13:90:32 | call to method WriteLine | 5 |
| LoopUnrolling.cs:94:10:94:12 | enter M11 | LoopUnrolling.cs:97:27:97:28 | access to local variable xs | 8 |
| LoopUnrolling.cs:94:10:94:12 | exit M11 (normal) | LoopUnrolling.cs:94:10:94:12 | exit M11 | 2 |
| LoopUnrolling.cs:97:22:97:22 | String x | LoopUnrolling.cs:97:9:100:9 | foreach (... ... in ...) ... | 6 |
| LoopUnrolling.cs:97:9:100:9 | foreach (... ... in ...) ... | LoopUnrolling.cs:97:9:100:9 | foreach (... ... in ...) ... | 1 |
| LoopUnrolling.cs:97:22:97:22 | String x | LoopUnrolling.cs:99:13:99:32 | call to method WriteLine | 5 |
| MultiImplementationA.cs:4:7:4:8 | call to constructor Object | MultiImplementationA.cs:4:7:4:8 | {...} | 2 |
| MultiImplementationA.cs:4:7:4:8 | enter C1 | MultiImplementationA.cs:4:7:4:8 | enter C1 | 1 |
| MultiImplementationA.cs:4:7:4:8 | exit C1 (normal) | MultiImplementationA.cs:4:7:4:8 | exit C1 | 2 |
@@ -1220,9 +1159,12 @@
| cflow.cs:254:17:254:27 | goto ...; | cflow.cs:254:17:254:27 | goto ...; | 1 |
| cflow.cs:255:13:255:20 | default: | cflow.cs:257:17:257:22 | break; | 5 |
| cflow.cs:261:49:261:53 | enter Yield | cflow.cs:264:18:264:22 | Int32 i = ... | 7 |
| cflow.cs:261:49:261:53 | exit Yield | cflow.cs:261:49:261:53 | exit Yield | 1 |
| cflow.cs:261:49:261:53 | exit Yield (abnormal) | cflow.cs:261:49:261:53 | exit Yield (abnormal) | 1 |
| cflow.cs:261:49:261:53 | exit Yield (normal) | cflow.cs:261:49:261:53 | exit Yield (normal) | 1 |
| cflow.cs:264:25:264:25 | access to local variable i | cflow.cs:264:25:264:30 | ... < ... | 3 |
| cflow.cs:265:9:267:9 | {...} | cflow.cs:264:33:264:35 | ...++ | 5 |
| cflow.cs:268:9:276:9 | try {...} ... | cflow.cs:261:49:261:53 | exit Yield | 9 |
| cflow.cs:268:9:276:9 | try {...} ... | cflow.cs:275:13:275:41 | call to method WriteLine | 7 |
| cflow.cs:282:5:282:18 | enter ControlFlowSub | cflow.cs:282:5:282:18 | exit ControlFlowSub | 5 |
| cflow.cs:284:5:284:18 | enter ControlFlowSub | cflow.cs:284:5:284:18 | exit ControlFlowSub | 5 |
| cflow.cs:286:5:286:18 | enter ControlFlowSub | cflow.cs:286:5:286:18 | exit ControlFlowSub | 7 |

View File

@@ -0,0 +1,6 @@
multipleSuccessors
| BreakInTry.cs:31:21:31:32 | ... == ... | false | BreakInTry.cs:22:9:34:9 | foreach (... ... in ...) ... |
| BreakInTry.cs:31:21:31:32 | ... == ... | false | BreakInTry.cs:35:7:35:7 | ; |
simpleAndNormalSuccessors
| BreakInTry.cs:32:21:32:21 | ; | break | successor | BreakInTry.cs:35:7:35:7 | ; | BreakInTry.cs:22:9:34:9 | foreach (... ... in ...) ... |
| Finally.cs:97:21:97:23 | ...-- | break | successor | Finally.cs:74:10:74:11 | exit M4 (normal) | Finally.cs:77:16:77:16 | access to local variable i |

View File

@@ -1,843 +1,3 @@
booleanNode
| Assert.cs:58:16:58:32 | [b (line 56): false] String s = ... | b (line 56): false |
| Assert.cs:58:16:58:32 | [b (line 56): true] String s = ... | b (line 56): true |
| Assert.cs:58:20:58:32 | [b (line 56): false] ... ? ... : ... | b (line 56): false |
| Assert.cs:58:20:58:32 | [b (line 56): true] ... ? ... : ... | b (line 56): true |
| Assert.cs:58:24:58:27 | [b (line 56): true] null | b (line 56): true |
| Assert.cs:58:31:58:32 | [b (line 56): false] "" | b (line 56): false |
| Assert.cs:59:9:59:38 | [b (line 56): false] ...; | b (line 56): false |
| Assert.cs:59:9:59:38 | [b (line 56): true] ...; | b (line 56): true |
| Assert.cs:59:23:59:23 | [b (line 56): false] access to local variable s | b (line 56): false |
| Assert.cs:59:23:59:23 | [b (line 56): true] access to local variable s | b (line 56): true |
| Assert.cs:59:23:59:31 | [b (line 56): false] ... != ... | b (line 56): false |
| Assert.cs:59:23:59:31 | [b (line 56): true] ... != ... | b (line 56): true |
| Assert.cs:59:28:59:31 | [b (line 56): false] null | b (line 56): false |
| Assert.cs:59:28:59:31 | [b (line 56): true] null | b (line 56): true |
| Assert.cs:59:36:59:36 | [b (line 56): false] access to parameter b | b (line 56): false |
| Assert.cs:59:36:59:36 | [b (line 56): true] access to parameter b | b (line 56): true |
| Assert.cs:65:16:65:32 | [b (line 63): false] String s = ... | b (line 63): false |
| Assert.cs:65:16:65:32 | [b (line 63): true] String s = ... | b (line 63): true |
| Assert.cs:65:20:65:32 | [b (line 63): false] ... ? ... : ... | b (line 63): false |
| Assert.cs:65:20:65:32 | [b (line 63): true] ... ? ... : ... | b (line 63): true |
| Assert.cs:65:24:65:27 | [b (line 63): true] null | b (line 63): true |
| Assert.cs:65:31:65:32 | [b (line 63): false] "" | b (line 63): false |
| Assert.cs:66:9:66:39 | [b (line 63): false] ...; | b (line 63): false |
| Assert.cs:66:9:66:39 | [b (line 63): true] ...; | b (line 63): true |
| Assert.cs:66:24:66:24 | [b (line 63): false] access to local variable s | b (line 63): false |
| Assert.cs:66:24:66:24 | [b (line 63): true] access to local variable s | b (line 63): true |
| Assert.cs:66:24:66:32 | [b (line 63): false] ... == ... | b (line 63): false |
| Assert.cs:66:24:66:32 | [b (line 63): true] ... == ... | b (line 63): true |
| Assert.cs:66:29:66:32 | [b (line 63): false] null | b (line 63): false |
| Assert.cs:66:29:66:32 | [b (line 63): true] null | b (line 63): true |
| Assert.cs:66:37:66:37 | [b (line 63): false] access to parameter b | b (line 63): false |
| Assert.cs:66:37:66:37 | [b (line 63): true] access to parameter b | b (line 63): true |
| Assert.cs:72:16:72:32 | [b (line 70): false] String s = ... | b (line 70): false |
| Assert.cs:72:16:72:32 | [b (line 70): true] String s = ... | b (line 70): true |
| Assert.cs:72:20:72:32 | [b (line 70): false] ... ? ... : ... | b (line 70): false |
| Assert.cs:72:20:72:32 | [b (line 70): true] ... ? ... : ... | b (line 70): true |
| Assert.cs:72:24:72:27 | [b (line 70): true] null | b (line 70): true |
| Assert.cs:72:31:72:32 | [b (line 70): false] "" | b (line 70): false |
| Assert.cs:73:9:73:38 | [b (line 70): false] ...; | b (line 70): false |
| Assert.cs:73:9:73:38 | [b (line 70): true] ...; | b (line 70): true |
| Assert.cs:73:23:73:23 | [b (line 70): false] access to local variable s | b (line 70): false |
| Assert.cs:73:23:73:23 | [b (line 70): true] access to local variable s | b (line 70): true |
| Assert.cs:73:23:73:31 | [b (line 70): false] ... == ... | b (line 70): false |
| Assert.cs:73:23:73:31 | [b (line 70): true] ... == ... | b (line 70): true |
| Assert.cs:73:28:73:31 | [b (line 70): false] null | b (line 70): false |
| Assert.cs:73:28:73:31 | [b (line 70): true] null | b (line 70): true |
| Assert.cs:73:36:73:36 | [b (line 70): false] access to parameter b | b (line 70): false |
| Assert.cs:73:36:73:36 | [b (line 70): true] access to parameter b | b (line 70): true |
| Assert.cs:79:16:79:32 | [b (line 77): false] String s = ... | b (line 77): false |
| Assert.cs:79:16:79:32 | [b (line 77): true] String s = ... | b (line 77): true |
| Assert.cs:79:20:79:32 | [b (line 77): false] ... ? ... : ... | b (line 77): false |
| Assert.cs:79:20:79:32 | [b (line 77): true] ... ? ... : ... | b (line 77): true |
| Assert.cs:79:24:79:27 | [b (line 77): true] null | b (line 77): true |
| Assert.cs:79:31:79:32 | [b (line 77): false] "" | b (line 77): false |
| Assert.cs:80:9:80:39 | [b (line 77): false] ...; | b (line 77): false |
| Assert.cs:80:9:80:39 | [b (line 77): true] ...; | b (line 77): true |
| Assert.cs:80:24:80:24 | [b (line 77): false] access to local variable s | b (line 77): false |
| Assert.cs:80:24:80:24 | [b (line 77): true] access to local variable s | b (line 77): true |
| Assert.cs:80:24:80:32 | [b (line 77): false] ... != ... | b (line 77): false |
| Assert.cs:80:24:80:32 | [b (line 77): true] ... != ... | b (line 77): true |
| Assert.cs:80:29:80:32 | [b (line 77): false] null | b (line 77): false |
| Assert.cs:80:29:80:32 | [b (line 77): true] null | b (line 77): true |
| Assert.cs:80:37:80:37 | [b (line 77): false] access to parameter b | b (line 77): false |
| Assert.cs:80:37:80:37 | [b (line 77): true] access to parameter b | b (line 77): true |
| Assert.cs:86:16:86:32 | [b (line 84): false] String s = ... | b (line 84): false |
| Assert.cs:86:16:86:32 | [b (line 84): true] String s = ... | b (line 84): true |
| Assert.cs:86:20:86:32 | [b (line 84): false] ... ? ... : ... | b (line 84): false |
| Assert.cs:86:20:86:32 | [b (line 84): true] ... ? ... : ... | b (line 84): true |
| Assert.cs:86:24:86:27 | [b (line 84): true] null | b (line 84): true |
| Assert.cs:86:31:86:32 | [b (line 84): false] "" | b (line 84): false |
| Assert.cs:87:9:87:31 | [assertion failure, b (line 84): false] call to method Assert | b (line 84): false |
| Assert.cs:87:9:87:31 | [assertion failure, b (line 84): true] call to method Assert | b (line 84): true |
| Assert.cs:87:9:87:31 | [assertion success, b (line 84): false] call to method Assert | b (line 84): false |
| Assert.cs:87:9:87:31 | [assertion success, b (line 84): true] call to method Assert | b (line 84): true |
| Assert.cs:87:9:87:32 | [b (line 84): false] ...; | b (line 84): false |
| Assert.cs:87:9:87:32 | [b (line 84): true] ...; | b (line 84): true |
| Assert.cs:87:22:87:22 | [b (line 84): false] access to local variable s | b (line 84): false |
| Assert.cs:87:22:87:22 | [b (line 84): true] access to local variable s | b (line 84): true |
| Assert.cs:87:22:87:30 | [b (line 84): false] ... != ... | b (line 84): false |
| Assert.cs:87:22:87:30 | [b (line 84): true] ... != ... | b (line 84): true |
| Assert.cs:87:27:87:30 | [b (line 84): false] null | b (line 84): false |
| Assert.cs:87:27:87:30 | [b (line 84): true] null | b (line 84): true |
| Assert.cs:88:9:88:35 | [b (line 84): false] call to method WriteLine | b (line 84): false |
| Assert.cs:88:9:88:35 | [b (line 84): true] call to method WriteLine | b (line 84): true |
| Assert.cs:88:9:88:36 | [b (line 84): false] ...; | b (line 84): false |
| Assert.cs:88:9:88:36 | [b (line 84): true] ...; | b (line 84): true |
| Assert.cs:88:27:88:27 | [b (line 84): false] access to local variable s | b (line 84): false |
| Assert.cs:88:27:88:27 | [b (line 84): true] access to local variable s | b (line 84): true |
| Assert.cs:88:27:88:34 | [b (line 84): false] access to property Length | b (line 84): false |
| Assert.cs:88:27:88:34 | [b (line 84): true] access to property Length | b (line 84): true |
| Assert.cs:90:9:90:25 | [b (line 84): false] ... = ... | b (line 84): false |
| Assert.cs:90:9:90:25 | [b (line 84): true] ... = ... | b (line 84): true |
| Assert.cs:90:9:90:26 | [b (line 84): false] ...; | b (line 84): false |
| Assert.cs:90:9:90:26 | [b (line 84): true] ...; | b (line 84): true |
| Assert.cs:90:13:90:13 | [b (line 84): false] access to parameter b | b (line 84): false |
| Assert.cs:90:13:90:13 | [b (line 84): true] access to parameter b | b (line 84): true |
| Assert.cs:90:13:90:25 | [b (line 84): false] ... ? ... : ... | b (line 84): false |
| Assert.cs:90:13:90:25 | [b (line 84): true] ... ? ... : ... | b (line 84): true |
| Assert.cs:90:17:90:20 | [b (line 84): true] null | b (line 84): true |
| Assert.cs:90:24:90:25 | [b (line 84): false] "" | b (line 84): false |
| Assert.cs:91:9:91:24 | [assertion failure, b (line 84): false] call to method IsNull | b (line 84): false |
| Assert.cs:91:9:91:24 | [assertion failure, b (line 84): true] call to method IsNull | b (line 84): true |
| Assert.cs:91:9:91:24 | [assertion success, b (line 84): false] call to method IsNull | b (line 84): false |
| Assert.cs:91:9:91:24 | [assertion success, b (line 84): true] call to method IsNull | b (line 84): true |
| Assert.cs:91:9:91:25 | [b (line 84): false] ...; | b (line 84): false |
| Assert.cs:91:9:91:25 | [b (line 84): true] ...; | b (line 84): true |
| Assert.cs:91:23:91:23 | [b (line 84): false] access to local variable s | b (line 84): false |
| Assert.cs:91:23:91:23 | [b (line 84): true] access to local variable s | b (line 84): true |
| Assert.cs:92:9:92:35 | [b (line 84): false] call to method WriteLine | b (line 84): false |
| Assert.cs:92:9:92:35 | [b (line 84): true] call to method WriteLine | b (line 84): true |
| Assert.cs:92:9:92:36 | [b (line 84): false] ...; | b (line 84): false |
| Assert.cs:92:9:92:36 | [b (line 84): true] ...; | b (line 84): true |
| Assert.cs:92:27:92:27 | [b (line 84): false] access to local variable s | b (line 84): false |
| Assert.cs:92:27:92:27 | [b (line 84): true] access to local variable s | b (line 84): true |
| Assert.cs:92:27:92:34 | [b (line 84): false] access to property Length | b (line 84): false |
| Assert.cs:92:27:92:34 | [b (line 84): true] access to property Length | b (line 84): true |
| Assert.cs:94:9:94:25 | [b (line 84): false] ... = ... | b (line 84): false |
| Assert.cs:94:9:94:25 | [b (line 84): true] ... = ... | b (line 84): true |
| Assert.cs:94:9:94:26 | [b (line 84): false] ...; | b (line 84): false |
| Assert.cs:94:9:94:26 | [b (line 84): true] ...; | b (line 84): true |
| Assert.cs:94:13:94:13 | [b (line 84): false] access to parameter b | b (line 84): false |
| Assert.cs:94:13:94:13 | [b (line 84): true] access to parameter b | b (line 84): true |
| Assert.cs:94:13:94:25 | [b (line 84): false] ... ? ... : ... | b (line 84): false |
| Assert.cs:94:13:94:25 | [b (line 84): true] ... ? ... : ... | b (line 84): true |
| Assert.cs:94:17:94:20 | [b (line 84): true] null | b (line 84): true |
| Assert.cs:94:24:94:25 | [b (line 84): false] "" | b (line 84): false |
| Assert.cs:95:9:95:27 | [assertion failure, b (line 84): false] call to method IsNotNull | b (line 84): false |
| Assert.cs:95:9:95:27 | [assertion failure, b (line 84): true] call to method IsNotNull | b (line 84): true |
| Assert.cs:95:9:95:27 | [assertion success, b (line 84): false] call to method IsNotNull | b (line 84): false |
| Assert.cs:95:9:95:27 | [assertion success, b (line 84): true] call to method IsNotNull | b (line 84): true |
| Assert.cs:95:9:95:28 | [b (line 84): false] ...; | b (line 84): false |
| Assert.cs:95:9:95:28 | [b (line 84): true] ...; | b (line 84): true |
| Assert.cs:95:26:95:26 | [b (line 84): false] access to local variable s | b (line 84): false |
| Assert.cs:95:26:95:26 | [b (line 84): true] access to local variable s | b (line 84): true |
| Assert.cs:96:9:96:35 | [b (line 84): false] call to method WriteLine | b (line 84): false |
| Assert.cs:96:9:96:35 | [b (line 84): true] call to method WriteLine | b (line 84): true |
| Assert.cs:96:9:96:36 | [b (line 84): false] ...; | b (line 84): false |
| Assert.cs:96:9:96:36 | [b (line 84): true] ...; | b (line 84): true |
| Assert.cs:96:27:96:27 | [b (line 84): false] access to local variable s | b (line 84): false |
| Assert.cs:96:27:96:27 | [b (line 84): true] access to local variable s | b (line 84): true |
| Assert.cs:96:27:96:34 | [b (line 84): false] access to property Length | b (line 84): false |
| Assert.cs:96:27:96:34 | [b (line 84): true] access to property Length | b (line 84): true |
| Assert.cs:98:9:98:25 | [b (line 84): false] ... = ... | b (line 84): false |
| Assert.cs:98:9:98:25 | [b (line 84): true] ... = ... | b (line 84): true |
| Assert.cs:98:9:98:26 | [b (line 84): false] ...; | b (line 84): false |
| Assert.cs:98:9:98:26 | [b (line 84): true] ...; | b (line 84): true |
| Assert.cs:98:13:98:13 | [b (line 84): false] access to parameter b | b (line 84): false |
| Assert.cs:98:13:98:13 | [b (line 84): true] access to parameter b | b (line 84): true |
| Assert.cs:98:13:98:25 | [b (line 84): false] ... ? ... : ... | b (line 84): false |
| Assert.cs:98:13:98:25 | [b (line 84): true] ... ? ... : ... | b (line 84): true |
| Assert.cs:98:17:98:20 | [b (line 84): true] null | b (line 84): true |
| Assert.cs:98:24:98:25 | [b (line 84): false] "" | b (line 84): false |
| Assert.cs:99:9:99:32 | [assertion failure, b (line 84): false] call to method IsTrue | b (line 84): false |
| Assert.cs:99:9:99:32 | [assertion failure, b (line 84): true] call to method IsTrue | b (line 84): true |
| Assert.cs:99:9:99:32 | [assertion success, b (line 84): false] call to method IsTrue | b (line 84): false |
| Assert.cs:99:9:99:32 | [assertion success, b (line 84): true] call to method IsTrue | b (line 84): true |
| Assert.cs:99:9:99:33 | [b (line 84): false] ...; | b (line 84): false |
| Assert.cs:99:9:99:33 | [b (line 84): true] ...; | b (line 84): true |
| Assert.cs:99:23:99:23 | [b (line 84): false] access to local variable s | b (line 84): false |
| Assert.cs:99:23:99:23 | [b (line 84): true] access to local variable s | b (line 84): true |
| Assert.cs:99:23:99:31 | [b (line 84): false] ... == ... | b (line 84): false |
| Assert.cs:99:23:99:31 | [b (line 84): true] ... == ... | b (line 84): true |
| Assert.cs:99:28:99:31 | [b (line 84): false] null | b (line 84): false |
| Assert.cs:99:28:99:31 | [b (line 84): true] null | b (line 84): true |
| Assert.cs:100:9:100:35 | [b (line 84): false] call to method WriteLine | b (line 84): false |
| Assert.cs:100:9:100:35 | [b (line 84): true] call to method WriteLine | b (line 84): true |
| Assert.cs:100:9:100:36 | [b (line 84): false] ...; | b (line 84): false |
| Assert.cs:100:9:100:36 | [b (line 84): true] ...; | b (line 84): true |
| Assert.cs:100:27:100:27 | [b (line 84): false] access to local variable s | b (line 84): false |
| Assert.cs:100:27:100:27 | [b (line 84): true] access to local variable s | b (line 84): true |
| Assert.cs:100:27:100:34 | [b (line 84): false] access to property Length | b (line 84): false |
| Assert.cs:100:27:100:34 | [b (line 84): true] access to property Length | b (line 84): true |
| Assert.cs:102:9:102:25 | [b (line 84): false] ... = ... | b (line 84): false |
| Assert.cs:102:9:102:25 | [b (line 84): true] ... = ... | b (line 84): true |
| Assert.cs:102:9:102:26 | [b (line 84): false] ...; | b (line 84): false |
| Assert.cs:102:9:102:26 | [b (line 84): true] ...; | b (line 84): true |
| Assert.cs:102:13:102:13 | [b (line 84): false] access to parameter b | b (line 84): false |
| Assert.cs:102:13:102:13 | [b (line 84): true] access to parameter b | b (line 84): true |
| Assert.cs:102:13:102:25 | [b (line 84): false] ... ? ... : ... | b (line 84): false |
| Assert.cs:102:13:102:25 | [b (line 84): true] ... ? ... : ... | b (line 84): true |
| Assert.cs:102:17:102:20 | [b (line 84): true] null | b (line 84): true |
| Assert.cs:102:24:102:25 | [b (line 84): false] "" | b (line 84): false |
| Assert.cs:103:9:103:32 | [assertion failure, b (line 84): false] call to method IsTrue | b (line 84): false |
| Assert.cs:103:9:103:32 | [assertion failure, b (line 84): true] call to method IsTrue | b (line 84): true |
| Assert.cs:103:9:103:32 | [assertion success, b (line 84): false] call to method IsTrue | b (line 84): false |
| Assert.cs:103:9:103:32 | [assertion success, b (line 84): true] call to method IsTrue | b (line 84): true |
| Assert.cs:103:9:103:33 | [b (line 84): false] ...; | b (line 84): false |
| Assert.cs:103:9:103:33 | [b (line 84): true] ...; | b (line 84): true |
| Assert.cs:103:23:103:23 | [b (line 84): false] access to local variable s | b (line 84): false |
| Assert.cs:103:23:103:23 | [b (line 84): true] access to local variable s | b (line 84): true |
| Assert.cs:103:23:103:31 | [b (line 84): false] ... != ... | b (line 84): false |
| Assert.cs:103:23:103:31 | [b (line 84): true] ... != ... | b (line 84): true |
| Assert.cs:103:28:103:31 | [b (line 84): false] null | b (line 84): false |
| Assert.cs:103:28:103:31 | [b (line 84): true] null | b (line 84): true |
| Assert.cs:104:9:104:35 | [b (line 84): false] call to method WriteLine | b (line 84): false |
| Assert.cs:104:9:104:35 | [b (line 84): true] call to method WriteLine | b (line 84): true |
| Assert.cs:104:9:104:36 | [b (line 84): false] ...; | b (line 84): false |
| Assert.cs:104:9:104:36 | [b (line 84): true] ...; | b (line 84): true |
| Assert.cs:104:27:104:27 | [b (line 84): false] access to local variable s | b (line 84): false |
| Assert.cs:104:27:104:27 | [b (line 84): true] access to local variable s | b (line 84): true |
| Assert.cs:104:27:104:34 | [b (line 84): false] access to property Length | b (line 84): false |
| Assert.cs:104:27:104:34 | [b (line 84): true] access to property Length | b (line 84): true |
| Assert.cs:106:9:106:25 | [b (line 84): false] ... = ... | b (line 84): false |
| Assert.cs:106:9:106:25 | [b (line 84): true] ... = ... | b (line 84): true |
| Assert.cs:106:9:106:26 | [b (line 84): false] ...; | b (line 84): false |
| Assert.cs:106:9:106:26 | [b (line 84): true] ...; | b (line 84): true |
| Assert.cs:106:13:106:13 | [b (line 84): false] access to parameter b | b (line 84): false |
| Assert.cs:106:13:106:13 | [b (line 84): true] access to parameter b | b (line 84): true |
| Assert.cs:106:13:106:25 | [b (line 84): false] ... ? ... : ... | b (line 84): false |
| Assert.cs:106:13:106:25 | [b (line 84): true] ... ? ... : ... | b (line 84): true |
| Assert.cs:106:17:106:20 | [b (line 84): true] null | b (line 84): true |
| Assert.cs:106:24:106:25 | [b (line 84): false] "" | b (line 84): false |
| Assert.cs:107:9:107:33 | [assertion failure, b (line 84): false] call to method IsFalse | b (line 84): false |
| Assert.cs:107:9:107:33 | [assertion failure, b (line 84): true] call to method IsFalse | b (line 84): true |
| Assert.cs:107:9:107:33 | [assertion success, b (line 84): false] call to method IsFalse | b (line 84): false |
| Assert.cs:107:9:107:33 | [assertion success, b (line 84): true] call to method IsFalse | b (line 84): true |
| Assert.cs:107:9:107:34 | [b (line 84): false] ...; | b (line 84): false |
| Assert.cs:107:9:107:34 | [b (line 84): true] ...; | b (line 84): true |
| Assert.cs:107:24:107:24 | [b (line 84): false] access to local variable s | b (line 84): false |
| Assert.cs:107:24:107:24 | [b (line 84): true] access to local variable s | b (line 84): true |
| Assert.cs:107:24:107:32 | [b (line 84): false] ... != ... | b (line 84): false |
| Assert.cs:107:24:107:32 | [b (line 84): true] ... != ... | b (line 84): true |
| Assert.cs:107:29:107:32 | [b (line 84): false] null | b (line 84): false |
| Assert.cs:107:29:107:32 | [b (line 84): true] null | b (line 84): true |
| Assert.cs:108:9:108:35 | [b (line 84): false] call to method WriteLine | b (line 84): false |
| Assert.cs:108:9:108:35 | [b (line 84): true] call to method WriteLine | b (line 84): true |
| Assert.cs:108:9:108:36 | [b (line 84): false] ...; | b (line 84): false |
| Assert.cs:108:9:108:36 | [b (line 84): true] ...; | b (line 84): true |
| Assert.cs:108:27:108:27 | [b (line 84): false] access to local variable s | b (line 84): false |
| Assert.cs:108:27:108:27 | [b (line 84): true] access to local variable s | b (line 84): true |
| Assert.cs:108:27:108:34 | [b (line 84): false] access to property Length | b (line 84): false |
| Assert.cs:108:27:108:34 | [b (line 84): true] access to property Length | b (line 84): true |
| Assert.cs:110:9:110:25 | [b (line 84): false] ... = ... | b (line 84): false |
| Assert.cs:110:9:110:25 | [b (line 84): true] ... = ... | b (line 84): true |
| Assert.cs:110:9:110:26 | [b (line 84): false] ...; | b (line 84): false |
| Assert.cs:110:9:110:26 | [b (line 84): true] ...; | b (line 84): true |
| Assert.cs:110:13:110:13 | [b (line 84): false] access to parameter b | b (line 84): false |
| Assert.cs:110:13:110:13 | [b (line 84): true] access to parameter b | b (line 84): true |
| Assert.cs:110:13:110:25 | [b (line 84): false] ... ? ... : ... | b (line 84): false |
| Assert.cs:110:13:110:25 | [b (line 84): true] ... ? ... : ... | b (line 84): true |
| Assert.cs:110:17:110:20 | [b (line 84): true] null | b (line 84): true |
| Assert.cs:110:24:110:25 | [b (line 84): false] "" | b (line 84): false |
| Assert.cs:111:9:111:33 | [assertion failure, b (line 84): false] call to method IsFalse | b (line 84): false |
| Assert.cs:111:9:111:33 | [assertion failure, b (line 84): true] call to method IsFalse | b (line 84): true |
| Assert.cs:111:9:111:33 | [assertion success, b (line 84): false] call to method IsFalse | b (line 84): false |
| Assert.cs:111:9:111:33 | [assertion success, b (line 84): true] call to method IsFalse | b (line 84): true |
| Assert.cs:111:9:111:34 | [b (line 84): false] ...; | b (line 84): false |
| Assert.cs:111:9:111:34 | [b (line 84): true] ...; | b (line 84): true |
| Assert.cs:111:24:111:24 | [b (line 84): false] access to local variable s | b (line 84): false |
| Assert.cs:111:24:111:24 | [b (line 84): true] access to local variable s | b (line 84): true |
| Assert.cs:111:24:111:32 | [b (line 84): false] ... == ... | b (line 84): false |
| Assert.cs:111:24:111:32 | [b (line 84): true] ... == ... | b (line 84): true |
| Assert.cs:111:29:111:32 | [b (line 84): false] null | b (line 84): false |
| Assert.cs:111:29:111:32 | [b (line 84): true] null | b (line 84): true |
| Assert.cs:112:9:112:35 | [b (line 84): false] call to method WriteLine | b (line 84): false |
| Assert.cs:112:9:112:35 | [b (line 84): true] call to method WriteLine | b (line 84): true |
| Assert.cs:112:9:112:36 | [b (line 84): false] ...; | b (line 84): false |
| Assert.cs:112:9:112:36 | [b (line 84): true] ...; | b (line 84): true |
| Assert.cs:112:27:112:27 | [b (line 84): false] access to local variable s | b (line 84): false |
| Assert.cs:112:27:112:27 | [b (line 84): true] access to local variable s | b (line 84): true |
| Assert.cs:112:27:112:34 | [b (line 84): false] access to property Length | b (line 84): false |
| Assert.cs:112:27:112:34 | [b (line 84): true] access to property Length | b (line 84): true |
| Assert.cs:114:9:114:25 | [b (line 84): false] ... = ... | b (line 84): false |
| Assert.cs:114:9:114:25 | [b (line 84): true] ... = ... | b (line 84): true |
| Assert.cs:114:9:114:26 | [b (line 84): false] ...; | b (line 84): false |
| Assert.cs:114:9:114:26 | [b (line 84): true] ...; | b (line 84): true |
| Assert.cs:114:13:114:13 | [b (line 84): false] access to parameter b | b (line 84): false |
| Assert.cs:114:13:114:13 | [b (line 84): true] access to parameter b | b (line 84): true |
| Assert.cs:114:13:114:25 | [b (line 84): false] ... ? ... : ... | b (line 84): false |
| Assert.cs:114:13:114:25 | [b (line 84): true] ... ? ... : ... | b (line 84): true |
| Assert.cs:114:17:114:20 | [b (line 84): true] null | b (line 84): true |
| Assert.cs:114:24:114:25 | [b (line 84): false] "" | b (line 84): false |
| Assert.cs:115:9:115:37 | [assertion failure, b (line 84): false] call to method IsTrue | b (line 84): false |
| Assert.cs:115:9:115:37 | [assertion failure, b (line 84): true] call to method IsTrue | b (line 84): true |
| Assert.cs:115:9:115:37 | [assertion success, b (line 84): true] call to method IsTrue | b (line 84): true |
| Assert.cs:115:9:115:38 | [b (line 84): false] ...; | b (line 84): false |
| Assert.cs:115:9:115:38 | [b (line 84): true] ...; | b (line 84): true |
| Assert.cs:115:23:115:23 | [b (line 84): false] access to local variable s | b (line 84): false |
| Assert.cs:115:23:115:23 | [b (line 84): true] access to local variable s | b (line 84): true |
| Assert.cs:115:23:115:31 | [b (line 84): false] ... != ... | b (line 84): false |
| Assert.cs:115:23:115:31 | [b (line 84): true] ... != ... | b (line 84): true |
| Assert.cs:115:23:115:36 | [false, b (line 84): false] ... && ... | b (line 84): false |
| Assert.cs:115:23:115:36 | [false, b (line 84): true] ... && ... | b (line 84): true |
| Assert.cs:115:23:115:36 | [true, b (line 84): true] ... && ... | b (line 84): true |
| Assert.cs:115:28:115:31 | [b (line 84): false] null | b (line 84): false |
| Assert.cs:115:28:115:31 | [b (line 84): true] null | b (line 84): true |
| Assert.cs:115:36:115:36 | [b (line 84): false] access to parameter b | b (line 84): false |
| Assert.cs:115:36:115:36 | [b (line 84): true] access to parameter b | b (line 84): true |
| Assert.cs:116:9:116:35 | [b (line 84): true] call to method WriteLine | b (line 84): true |
| Assert.cs:116:9:116:36 | [b (line 84): true] ...; | b (line 84): true |
| Assert.cs:116:27:116:27 | [b (line 84): true] access to local variable s | b (line 84): true |
| Assert.cs:116:27:116:34 | [b (line 84): true] access to property Length | b (line 84): true |
| Assert.cs:118:9:118:25 | [b (line 84): true] ... = ... | b (line 84): true |
| Assert.cs:118:9:118:26 | [b (line 84): true] ...; | b (line 84): true |
| Assert.cs:118:13:118:13 | [b (line 84): true] access to parameter b | b (line 84): true |
| Assert.cs:118:13:118:25 | [b (line 84): true] ... ? ... : ... | b (line 84): true |
| Assert.cs:118:17:118:20 | [b (line 84): true] null | b (line 84): true |
| Assert.cs:119:9:119:39 | [assertion failure, b (line 84): true] call to method IsFalse | b (line 84): true |
| Assert.cs:119:9:119:39 | [assertion success, b (line 84): true] call to method IsFalse | b (line 84): true |
| Assert.cs:119:9:119:40 | [b (line 84): true] ...; | b (line 84): true |
| Assert.cs:119:24:119:24 | [b (line 84): true] access to local variable s | b (line 84): true |
| Assert.cs:119:24:119:32 | [b (line 84): true] ... == ... | b (line 84): true |
| Assert.cs:119:24:119:38 | [false, b (line 84): true] ... \|\| ... | b (line 84): true |
| Assert.cs:119:24:119:38 | [true, b (line 84): true] ... \|\| ... | b (line 84): true |
| Assert.cs:119:29:119:32 | [b (line 84): true] null | b (line 84): true |
| Assert.cs:119:37:119:38 | [false, b (line 84): true] !... | b (line 84): true |
| Assert.cs:119:38:119:38 | [b (line 84): true] access to parameter b | b (line 84): true |
| Assert.cs:120:9:120:35 | [b (line 84): true] call to method WriteLine | b (line 84): true |
| Assert.cs:120:9:120:36 | [b (line 84): true] ...; | b (line 84): true |
| Assert.cs:120:27:120:27 | [b (line 84): true] access to local variable s | b (line 84): true |
| Assert.cs:120:27:120:34 | [b (line 84): true] access to property Length | b (line 84): true |
| Assert.cs:122:9:122:25 | [b (line 84): true] ... = ... | b (line 84): true |
| Assert.cs:122:9:122:26 | [b (line 84): true] ...; | b (line 84): true |
| Assert.cs:122:13:122:13 | [b (line 84): true] access to parameter b | b (line 84): true |
| Assert.cs:122:13:122:25 | [b (line 84): true] ... ? ... : ... | b (line 84): true |
| Assert.cs:122:17:122:20 | [b (line 84): true] null | b (line 84): true |
| Assert.cs:123:9:123:37 | [assertion failure, b (line 84): true] call to method IsTrue | b (line 84): true |
| Assert.cs:123:9:123:37 | [assertion success, b (line 84): true] call to method IsTrue | b (line 84): true |
| Assert.cs:123:9:123:38 | [b (line 84): true] ...; | b (line 84): true |
| Assert.cs:123:23:123:23 | [b (line 84): true] access to local variable s | b (line 84): true |
| Assert.cs:123:23:123:31 | [b (line 84): true] ... == ... | b (line 84): true |
| Assert.cs:123:23:123:36 | [false, b (line 84): true] ... && ... | b (line 84): true |
| Assert.cs:123:23:123:36 | [true, b (line 84): true] ... && ... | b (line 84): true |
| Assert.cs:123:28:123:31 | [b (line 84): true] null | b (line 84): true |
| Assert.cs:123:36:123:36 | [b (line 84): true] access to parameter b | b (line 84): true |
| Assert.cs:124:9:124:35 | [b (line 84): true] call to method WriteLine | b (line 84): true |
| Assert.cs:124:9:124:36 | [b (line 84): true] ...; | b (line 84): true |
| Assert.cs:124:27:124:27 | [b (line 84): true] access to local variable s | b (line 84): true |
| Assert.cs:124:27:124:34 | [b (line 84): true] access to property Length | b (line 84): true |
| Assert.cs:126:9:126:25 | [b (line 84): true] ... = ... | b (line 84): true |
| Assert.cs:126:9:126:26 | [b (line 84): true] ...; | b (line 84): true |
| Assert.cs:126:13:126:13 | [b (line 84): true] access to parameter b | b (line 84): true |
| Assert.cs:126:13:126:25 | [b (line 84): true] ... ? ... : ... | b (line 84): true |
| Assert.cs:126:17:126:20 | [b (line 84): true] null | b (line 84): true |
| Assert.cs:127:9:127:40 | [b (line 84): true] ...; | b (line 84): true |
| Assert.cs:127:24:127:24 | [b (line 84): true] access to local variable s | b (line 84): true |
| Assert.cs:127:24:127:32 | [b (line 84): true] ... != ... | b (line 84): true |
| Assert.cs:127:29:127:32 | [b (line 84): true] null | b (line 84): true |
| Assert.cs:127:38:127:38 | [b (line 84): true] access to parameter b | b (line 84): true |
| Conditions.cs:6:13:6:13 | [inc (line 3): true] access to parameter x | inc (line 3): true |
| Conditions.cs:6:13:6:15 | [inc (line 3): true] ...++ | inc (line 3): true |
| Conditions.cs:6:13:6:16 | [inc (line 3): true] ...; | inc (line 3): true |
| Conditions.cs:7:9:8:16 | [inc (line 3): false] if (...) ... | inc (line 3): false |
| Conditions.cs:7:9:8:16 | [inc (line 3): true] if (...) ... | inc (line 3): true |
| Conditions.cs:7:14:7:16 | [inc (line 3): false] access to parameter inc | inc (line 3): false |
| Conditions.cs:7:14:7:16 | [inc (line 3): true] access to parameter inc | inc (line 3): true |
| Conditions.cs:15:13:15:13 | [b (line 11): true] access to local variable x | b (line 11): true |
| Conditions.cs:15:13:15:15 | [b (line 11): true] ...++ | b (line 11): true |
| Conditions.cs:15:13:15:16 | [b (line 11): true] ...; | b (line 11): true |
| Conditions.cs:16:9:18:20 | [b (line 11): false] if (...) ... | b (line 11): false |
| Conditions.cs:16:9:18:20 | [b (line 11): true] if (...) ... | b (line 11): true |
| Conditions.cs:16:13:16:13 | [b (line 11): false] access to local variable x | b (line 11): false |
| Conditions.cs:16:13:16:13 | [b (line 11): true] access to local variable x | b (line 11): true |
| Conditions.cs:16:13:16:17 | [b (line 11): false] ... > ... | b (line 11): false |
| Conditions.cs:16:13:16:17 | [b (line 11): true] ... > ... | b (line 11): true |
| Conditions.cs:16:17:16:17 | [b (line 11): false] 0 | b (line 11): false |
| Conditions.cs:16:17:16:17 | [b (line 11): true] 0 | b (line 11): true |
| Conditions.cs:17:13:18:20 | [b (line 11): false] if (...) ... | b (line 11): false |
| Conditions.cs:17:13:18:20 | [b (line 11): true] if (...) ... | b (line 11): true |
| Conditions.cs:17:18:17:18 | [b (line 11): false] access to parameter b | b (line 11): false |
| Conditions.cs:17:18:17:18 | [b (line 11): true] access to parameter b | b (line 11): true |
| Conditions.cs:27:17:27:17 | [b2 (line 22): true] access to local variable x | b2 (line 22): true |
| Conditions.cs:27:17:27:19 | [b2 (line 22): true] ...++ | b2 (line 22): true |
| Conditions.cs:27:17:27:20 | [b2 (line 22): true] ...; | b2 (line 22): true |
| Conditions.cs:28:9:29:16 | [b2 (line 22): false] if (...) ... | b2 (line 22): false |
| Conditions.cs:28:9:29:16 | [b2 (line 22): true] if (...) ... | b2 (line 22): true |
| Conditions.cs:28:13:28:14 | [b2 (line 22): false] access to parameter b2 | b2 (line 22): false |
| Conditions.cs:28:13:28:14 | [b2 (line 22): true] access to parameter b2 | b2 (line 22): true |
| Conditions.cs:40:13:40:13 | [b2 (line 39): true] access to local variable x | b2 (line 39): true |
| Conditions.cs:40:13:40:15 | [b2 (line 39): true] ...++ | b2 (line 39): true |
| Conditions.cs:40:13:40:16 | [b2 (line 39): true] ...; | b2 (line 39): true |
| Conditions.cs:41:9:42:16 | [b2 (line 39): false] if (...) ... | b2 (line 39): false |
| Conditions.cs:41:9:42:16 | [b2 (line 39): true] if (...) ... | b2 (line 39): true |
| Conditions.cs:41:13:41:14 | [b2 (line 39): false] access to local variable b2 | b2 (line 39): false |
| Conditions.cs:41:13:41:14 | [b2 (line 39): true] access to local variable b2 | b2 (line 39): true |
| Conditions.cs:49:16:49:16 | [b (line 46): false] access to parameter x | b (line 46): false |
| Conditions.cs:49:16:49:16 | [b (line 46): true] access to parameter x | b (line 46): true |
| Conditions.cs:49:16:49:18 | [b (line 46): false] ...-- | b (line 46): false |
| Conditions.cs:49:16:49:18 | [b (line 46): true] ...-- | b (line 46): true |
| Conditions.cs:49:16:49:22 | [b (line 46): false] ... > ... | b (line 46): false |
| Conditions.cs:49:16:49:22 | [b (line 46): true] ... > ... | b (line 46): true |
| Conditions.cs:49:22:49:22 | [b (line 46): false] 0 | b (line 46): false |
| Conditions.cs:49:22:49:22 | [b (line 46): true] 0 | b (line 46): true |
| Conditions.cs:50:9:53:9 | [b (line 46): false] {...} | b (line 46): false |
| Conditions.cs:50:9:53:9 | [b (line 46): true] {...} | b (line 46): true |
| Conditions.cs:51:13:52:20 | [b (line 46): false] if (...) ... | b (line 46): false |
| Conditions.cs:51:13:52:20 | [b (line 46): true] if (...) ... | b (line 46): true |
| Conditions.cs:51:17:51:17 | [b (line 46): false] access to parameter b | b (line 46): false |
| Conditions.cs:51:17:51:17 | [b (line 46): true] access to parameter b | b (line 46): true |
| Conditions.cs:52:17:52:17 | [b (line 46): true] access to local variable y | b (line 46): true |
| Conditions.cs:52:17:52:19 | [b (line 46): true] ...++ | b (line 46): true |
| Conditions.cs:52:17:52:20 | [b (line 46): true] ...; | b (line 46): true |
| Conditions.cs:60:16:60:16 | [b (line 57): false] access to parameter x | b (line 57): false |
| Conditions.cs:60:16:60:16 | [b (line 57): true] access to parameter x | b (line 57): true |
| Conditions.cs:60:16:60:18 | [b (line 57): false] ...-- | b (line 57): false |
| Conditions.cs:60:16:60:18 | [b (line 57): true] ...-- | b (line 57): true |
| Conditions.cs:60:16:60:22 | [b (line 57): false] ... > ... | b (line 57): false |
| Conditions.cs:60:16:60:22 | [b (line 57): true] ... > ... | b (line 57): true |
| Conditions.cs:60:22:60:22 | [b (line 57): false] 0 | b (line 57): false |
| Conditions.cs:60:22:60:22 | [b (line 57): true] 0 | b (line 57): true |
| Conditions.cs:61:9:64:9 | [b (line 57): false] {...} | b (line 57): false |
| Conditions.cs:61:9:64:9 | [b (line 57): true] {...} | b (line 57): true |
| Conditions.cs:62:13:63:20 | [b (line 57): false] if (...) ... | b (line 57): false |
| Conditions.cs:62:13:63:20 | [b (line 57): true] if (...) ... | b (line 57): true |
| Conditions.cs:62:17:62:17 | [b (line 57): false] access to parameter b | b (line 57): false |
| Conditions.cs:62:17:62:17 | [b (line 57): true] access to parameter b | b (line 57): true |
| Conditions.cs:63:17:63:17 | [b (line 57): true] access to local variable y | b (line 57): true |
| Conditions.cs:63:17:63:19 | [b (line 57): true] ...++ | b (line 57): true |
| Conditions.cs:63:17:63:20 | [b (line 57): true] ...; | b (line 57): true |
| Conditions.cs:65:9:66:16 | [b (line 57): false] if (...) ... | b (line 57): false |
| Conditions.cs:65:9:66:16 | [b (line 57): true] if (...) ... | b (line 57): true |
| Conditions.cs:65:13:65:13 | [b (line 57): false] access to parameter b | b (line 57): false |
| Conditions.cs:65:13:65:13 | [b (line 57): true] access to parameter b | b (line 57): true |
| Conditions.cs:106:13:106:13 | [b (line 102): true] access to local variable x | b (line 102): true |
| Conditions.cs:106:13:106:19 | [b (line 102): true] ... + ... | b (line 102): true |
| Conditions.cs:106:13:106:19 | [b (line 102): true] ... = ... | b (line 102): true |
| Conditions.cs:106:13:106:20 | [b (line 102): true] ...; | b (line 102): true |
| Conditions.cs:106:18:106:19 | [b (line 102): true] "" | b (line 102): true |
| Conditions.cs:107:9:109:24 | [b (line 102): false] if (...) ... | b (line 102): false |
| Conditions.cs:107:9:109:24 | [b (line 102): true] if (...) ... | b (line 102): true |
| Conditions.cs:107:13:107:13 | [b (line 102): false] access to local variable x | b (line 102): false |
| Conditions.cs:107:13:107:13 | [b (line 102): true] access to local variable x | b (line 102): true |
| Conditions.cs:107:13:107:20 | [b (line 102): false] access to property Length | b (line 102): false |
| Conditions.cs:107:13:107:20 | [b (line 102): true] access to property Length | b (line 102): true |
| Conditions.cs:107:13:107:24 | [b (line 102): false] ... > ... | b (line 102): false |
| Conditions.cs:107:13:107:24 | [b (line 102): true] ... > ... | b (line 102): true |
| Conditions.cs:107:24:107:24 | [b (line 102): false] 0 | b (line 102): false |
| Conditions.cs:107:24:107:24 | [b (line 102): true] 0 | b (line 102): true |
| Conditions.cs:108:13:109:24 | [b (line 102): false] if (...) ... | b (line 102): false |
| Conditions.cs:108:13:109:24 | [b (line 102): true] if (...) ... | b (line 102): true |
| Conditions.cs:108:18:108:18 | [b (line 102): false] access to parameter b | b (line 102): false |
| Conditions.cs:108:18:108:18 | [b (line 102): true] access to parameter b | b (line 102): true |
| Conditions.cs:119:17:119:21 | [false, last (line 118): true] !... | last (line 118): true |
| Conditions.cs:119:17:119:21 | [true, last (line 118): false] !... | last (line 118): false |
| Conditions.cs:120:17:120:22 | [last (line 118): false] ... = ... | last (line 118): false |
| Conditions.cs:120:17:120:23 | [last (line 118): false] ...; | last (line 118): false |
| Conditions.cs:120:21:120:22 | [last (line 118): false] "" | last (line 118): false |
| Conditions.cs:121:13:122:25 | [last (line 118): false] if (...) ... | last (line 118): false |
| Conditions.cs:121:13:122:25 | [last (line 118): true] if (...) ... | last (line 118): true |
| Conditions.cs:121:17:121:20 | [last (line 118): false] access to local variable last | last (line 118): false |
| Conditions.cs:121:17:121:20 | [last (line 118): true] access to local variable last | last (line 118): true |
| Conditions.cs:131:16:131:19 | [Field1 (line 129): false] true | Field1 (line 129): false |
| Conditions.cs:131:16:131:19 | [Field1 (line 129): true, Field2 (line 129): false] true | Field1 (line 129): true |
| Conditions.cs:131:16:131:19 | [Field1 (line 129): true, Field2 (line 129): false] true | Field2 (line 129): false |
| Conditions.cs:131:16:131:19 | [Field1 (line 129): true, Field2 (line 129): true] true | Field1 (line 129): true |
| Conditions.cs:131:16:131:19 | [Field1 (line 129): true, Field2 (line 129): true] true | Field2 (line 129): true |
| Conditions.cs:132:9:140:9 | [Field1 (line 129): false] {...} | Field1 (line 129): false |
| Conditions.cs:132:9:140:9 | [Field1 (line 129): true, Field2 (line 129): false] {...} | Field1 (line 129): true |
| Conditions.cs:132:9:140:9 | [Field1 (line 129): true, Field2 (line 129): false] {...} | Field2 (line 129): false |
| Conditions.cs:132:9:140:9 | [Field1 (line 129): true, Field2 (line 129): true] {...} | Field1 (line 129): true |
| Conditions.cs:132:9:140:9 | [Field1 (line 129): true, Field2 (line 129): true] {...} | Field2 (line 129): true |
| Conditions.cs:133:13:139:13 | [Field1 (line 129): false] if (...) ... | Field1 (line 129): false |
| Conditions.cs:133:13:139:13 | [Field1 (line 129): true, Field2 (line 129): false] if (...) ... | Field1 (line 129): true |
| Conditions.cs:133:13:139:13 | [Field1 (line 129): true, Field2 (line 129): false] if (...) ... | Field2 (line 129): false |
| Conditions.cs:133:13:139:13 | [Field1 (line 129): true, Field2 (line 129): true] if (...) ... | Field1 (line 129): true |
| Conditions.cs:133:13:139:13 | [Field1 (line 129): true, Field2 (line 129): true] if (...) ... | Field2 (line 129): true |
| Conditions.cs:133:17:133:22 | [Field1 (line 129): false] access to field Field1 | Field1 (line 129): false |
| Conditions.cs:133:17:133:22 | [Field1 (line 129): false] this access | Field1 (line 129): false |
| Conditions.cs:133:17:133:22 | [Field1 (line 129): true, Field2 (line 129): false] access to field Field1 | Field1 (line 129): true |
| Conditions.cs:133:17:133:22 | [Field1 (line 129): true, Field2 (line 129): false] access to field Field1 | Field2 (line 129): false |
| Conditions.cs:133:17:133:22 | [Field1 (line 129): true, Field2 (line 129): false] this access | Field1 (line 129): true |
| Conditions.cs:133:17:133:22 | [Field1 (line 129): true, Field2 (line 129): false] this access | Field2 (line 129): false |
| Conditions.cs:133:17:133:22 | [Field1 (line 129): true, Field2 (line 129): true] access to field Field1 | Field1 (line 129): true |
| Conditions.cs:133:17:133:22 | [Field1 (line 129): true, Field2 (line 129): true] access to field Field1 | Field2 (line 129): true |
| Conditions.cs:133:17:133:22 | [Field1 (line 129): true, Field2 (line 129): true] this access | Field1 (line 129): true |
| Conditions.cs:133:17:133:22 | [Field1 (line 129): true, Field2 (line 129): true] this access | Field2 (line 129): true |
| Conditions.cs:134:13:139:13 | [Field1 (line 129): true, Field2 (line 129): false] {...} | Field1 (line 129): true |
| Conditions.cs:134:13:139:13 | [Field1 (line 129): true, Field2 (line 129): false] {...} | Field2 (line 129): false |
| Conditions.cs:134:13:139:13 | [Field1 (line 129): true, Field2 (line 129): true] {...} | Field1 (line 129): true |
| Conditions.cs:134:13:139:13 | [Field1 (line 129): true, Field2 (line 129): true] {...} | Field2 (line 129): true |
| Conditions.cs:134:13:139:13 | [Field1 (line 129): true] {...} | Field1 (line 129): true |
| Conditions.cs:135:17:138:17 | [Field1 (line 129): true, Field2 (line 129): false] if (...) ... | Field1 (line 129): true |
| Conditions.cs:135:17:138:17 | [Field1 (line 129): true, Field2 (line 129): false] if (...) ... | Field2 (line 129): false |
| Conditions.cs:135:17:138:17 | [Field1 (line 129): true, Field2 (line 129): true] if (...) ... | Field1 (line 129): true |
| Conditions.cs:135:17:138:17 | [Field1 (line 129): true, Field2 (line 129): true] if (...) ... | Field2 (line 129): true |
| Conditions.cs:135:17:138:17 | [Field1 (line 129): true] if (...) ... | Field1 (line 129): true |
| Conditions.cs:135:21:135:26 | [Field1 (line 129): true, Field2 (line 129): false] access to field Field2 | Field1 (line 129): true |
| Conditions.cs:135:21:135:26 | [Field1 (line 129): true, Field2 (line 129): false] access to field Field2 | Field2 (line 129): false |
| Conditions.cs:135:21:135:26 | [Field1 (line 129): true, Field2 (line 129): false] this access | Field1 (line 129): true |
| Conditions.cs:135:21:135:26 | [Field1 (line 129): true, Field2 (line 129): false] this access | Field2 (line 129): false |
| Conditions.cs:135:21:135:26 | [Field1 (line 129): true, Field2 (line 129): true] access to field Field2 | Field1 (line 129): true |
| Conditions.cs:135:21:135:26 | [Field1 (line 129): true, Field2 (line 129): true] access to field Field2 | Field2 (line 129): true |
| Conditions.cs:135:21:135:26 | [Field1 (line 129): true, Field2 (line 129): true] this access | Field1 (line 129): true |
| Conditions.cs:135:21:135:26 | [Field1 (line 129): true, Field2 (line 129): true] this access | Field2 (line 129): true |
| Conditions.cs:135:21:135:26 | [Field1 (line 129): true] access to field Field2 | Field1 (line 129): true |
| Conditions.cs:135:21:135:26 | [Field1 (line 129): true] this access | Field1 (line 129): true |
| Conditions.cs:136:17:138:17 | [Field1 (line 129): true, Field2 (line 129): true] {...} | Field1 (line 129): true |
| Conditions.cs:136:17:138:17 | [Field1 (line 129): true, Field2 (line 129): true] {...} | Field2 (line 129): true |
| Conditions.cs:137:21:137:26 | [Field1 (line 129): true, Field2 (line 129): true] access to field Field1 | Field1 (line 129): true |
| Conditions.cs:137:21:137:26 | [Field1 (line 129): true, Field2 (line 129): true] access to field Field1 | Field2 (line 129): true |
| Conditions.cs:137:21:137:26 | [Field1 (line 129): true, Field2 (line 129): true] this access | Field1 (line 129): true |
| Conditions.cs:137:21:137:26 | [Field1 (line 129): true, Field2 (line 129): true] this access | Field2 (line 129): true |
| Conditions.cs:137:21:137:37 | [Field1 (line 129): true, Field2 (line 129): true] call to method ToString | Field1 (line 129): true |
| Conditions.cs:137:21:137:37 | [Field1 (line 129): true, Field2 (line 129): true] call to method ToString | Field2 (line 129): true |
| Conditions.cs:137:21:137:38 | [Field1 (line 129): true, Field2 (line 129): true] ...; | Field1 (line 129): true |
| Conditions.cs:137:21:137:38 | [Field1 (line 129): true, Field2 (line 129): true] ...; | Field2 (line 129): true |
| Conditions.cs:145:13:145:29 | [b (line 143): false] String s = ... | b (line 143): false |
| Conditions.cs:145:13:145:29 | [b (line 143): true] String s = ... | b (line 143): true |
| Conditions.cs:145:17:145:29 | [b (line 143): false] ... ? ... : ... | b (line 143): false |
| Conditions.cs:145:17:145:29 | [b (line 143): true] ... ? ... : ... | b (line 143): true |
| Conditions.cs:145:21:145:23 | [b (line 143): true] "a" | b (line 143): true |
| Conditions.cs:145:27:145:29 | [b (line 143): false] "b" | b (line 143): false |
| Conditions.cs:146:9:149:49 | [b (line 143): false] if (...) ... | b (line 143): false |
| Conditions.cs:146:9:149:49 | [b (line 143): true] if (...) ... | b (line 143): true |
| Conditions.cs:146:13:146:13 | [b (line 143): false] access to parameter b | b (line 143): false |
| Conditions.cs:146:13:146:13 | [b (line 143): true] access to parameter b | b (line 143): true |
| Finally.cs:180:21:180:43 | [b1 (line 176): true] throw ...; | b1 (line 176): true |
| Finally.cs:180:27:180:42 | [b1 (line 176): true] object creation of type ExceptionA | b1 (line 176): true |
| Finally.cs:183:9:192:9 | [b1 (line 176): false] {...} | b1 (line 176): false |
| Finally.cs:183:9:192:9 | [finally: exception, b1 (line 176): true] {...} | b1 (line 176): true |
| Finally.cs:184:13:191:13 | [b1 (line 176): false] try {...} ... | b1 (line 176): false |
| Finally.cs:184:13:191:13 | [finally: exception, b1 (line 176): true] try {...} ... | b1 (line 176): true |
| Finally.cs:185:13:187:13 | [b1 (line 176): false] {...} | b1 (line 176): false |
| Finally.cs:185:13:187:13 | [finally: exception, b1 (line 176): true] {...} | b1 (line 176): true |
| Finally.cs:186:17:186:47 | [b1 (line 176): false] if (...) ... | b1 (line 176): false |
| Finally.cs:186:17:186:47 | [finally: exception, b1 (line 176): true] if (...) ... | b1 (line 176): true |
| Finally.cs:186:21:186:22 | [b1 (line 176): false] access to parameter b2 | b1 (line 176): false |
| Finally.cs:186:21:186:22 | [finally: exception, b1 (line 176): true] access to parameter b2 | b1 (line 176): true |
| Finally.cs:186:25:186:47 | [b1 (line 176): false, b2 (line 176): true] throw ...; | b1 (line 176): false |
| Finally.cs:186:25:186:47 | [b1 (line 176): false, b2 (line 176): true] throw ...; | b2 (line 176): true |
| Finally.cs:186:25:186:47 | [finally: exception, b1 (line 176): true, b2 (line 176): true] throw ...; | b1 (line 176): true |
| Finally.cs:186:25:186:47 | [finally: exception, b1 (line 176): true, b2 (line 176): true] throw ...; | b2 (line 176): true |
| Finally.cs:186:31:186:46 | [b1 (line 176): false, b2 (line 176): true] object creation of type ExceptionB | b1 (line 176): false |
| Finally.cs:186:31:186:46 | [b1 (line 176): false, b2 (line 176): true] object creation of type ExceptionB | b2 (line 176): true |
| Finally.cs:186:31:186:46 | [finally: exception, b1 (line 176): true, b2 (line 176): true] object creation of type ExceptionB | b1 (line 176): true |
| Finally.cs:186:31:186:46 | [finally: exception, b1 (line 176): true, b2 (line 176): true] object creation of type ExceptionB | b2 (line 176): true |
| Finally.cs:188:13:191:13 | [exception: Exception, b1 (line 176): false, b2 (line 176): true] catch (...) {...} | b1 (line 176): false |
| Finally.cs:188:13:191:13 | [exception: Exception, b1 (line 176): false, b2 (line 176): true] catch (...) {...} | b2 (line 176): true |
| Finally.cs:188:13:191:13 | [exception: ExceptionB, b1 (line 176): false, b2 (line 176): true] catch (...) {...} | b1 (line 176): false |
| Finally.cs:188:13:191:13 | [exception: ExceptionB, b1 (line 176): false, b2 (line 176): true] catch (...) {...} | b2 (line 176): true |
| Finally.cs:188:13:191:13 | [finally: exception, exception: Exception, b1 (line 176): true, b2 (line 176): true] catch (...) {...} | b1 (line 176): true |
| Finally.cs:188:13:191:13 | [finally: exception, exception: Exception, b1 (line 176): true, b2 (line 176): true] catch (...) {...} | b2 (line 176): true |
| Finally.cs:188:13:191:13 | [finally: exception, exception: ExceptionB, b1 (line 176): true, b2 (line 176): true] catch (...) {...} | b1 (line 176): true |
| Finally.cs:188:13:191:13 | [finally: exception, exception: ExceptionB, b1 (line 176): true, b2 (line 176): true] catch (...) {...} | b2 (line 176): true |
| Finally.cs:188:38:188:39 | [exception: Exception, b1 (line 176): false, b2 (line 176): true] access to parameter b2 | b1 (line 176): false |
| Finally.cs:188:38:188:39 | [exception: Exception, b1 (line 176): false, b2 (line 176): true] access to parameter b2 | b2 (line 176): true |
| Finally.cs:188:38:188:39 | [exception: ExceptionB, b1 (line 176): false, b2 (line 176): true] access to parameter b2 | b1 (line 176): false |
| Finally.cs:188:38:188:39 | [exception: ExceptionB, b1 (line 176): false, b2 (line 176): true] access to parameter b2 | b2 (line 176): true |
| Finally.cs:188:38:188:39 | [finally: exception, exception: Exception, b1 (line 176): true, b2 (line 176): true] access to parameter b2 | b1 (line 176): true |
| Finally.cs:188:38:188:39 | [finally: exception, exception: Exception, b1 (line 176): true, b2 (line 176): true] access to parameter b2 | b2 (line 176): true |
| Finally.cs:188:38:188:39 | [finally: exception, exception: ExceptionB, b1 (line 176): true, b2 (line 176): true] access to parameter b2 | b1 (line 176): true |
| Finally.cs:188:38:188:39 | [finally: exception, exception: ExceptionB, b1 (line 176): true, b2 (line 176): true] access to parameter b2 | b2 (line 176): true |
| Finally.cs:189:13:191:13 | [b1 (line 176): false] {...} | b1 (line 176): false |
| Finally.cs:189:13:191:13 | [finally: exception, b1 (line 176): true] {...} | b1 (line 176): true |
| Finally.cs:190:17:190:47 | [b1 (line 176): false] if (...) ... | b1 (line 176): false |
| Finally.cs:190:17:190:47 | [finally: exception, b1 (line 176): true] if (...) ... | b1 (line 176): true |
| Finally.cs:190:21:190:22 | [b1 (line 176): false] access to parameter b1 | b1 (line 176): false |
| Finally.cs:190:21:190:22 | [finally: exception, b1 (line 176): true] access to parameter b1 | b1 (line 176): true |
| LoopUnrolling.cs:58:9:64:9 | [b (line 55): false] foreach (... ... in ...) ... | b (line 55): false |
| LoopUnrolling.cs:58:9:64:9 | [b (line 55): true] foreach (... ... in ...) ... | b (line 55): true |
| LoopUnrolling.cs:58:22:58:22 | [b (line 55): false] String x | b (line 55): false |
| LoopUnrolling.cs:58:22:58:22 | [b (line 55): true] String x | b (line 55): true |
| LoopUnrolling.cs:59:9:64:9 | [b (line 55): false] {...} | b (line 55): false |
| LoopUnrolling.cs:59:9:64:9 | [b (line 55): true] {...} | b (line 55): true |
| LoopUnrolling.cs:60:13:61:37 | [b (line 55): false] if (...) ... | b (line 55): false |
| LoopUnrolling.cs:60:13:61:37 | [b (line 55): true] if (...) ... | b (line 55): true |
| LoopUnrolling.cs:60:17:60:17 | [b (line 55): false] access to parameter b | b (line 55): false |
| LoopUnrolling.cs:60:17:60:17 | [b (line 55): true] access to parameter b | b (line 55): true |
| LoopUnrolling.cs:61:17:61:36 | [b (line 55): true] call to method WriteLine | b (line 55): true |
| LoopUnrolling.cs:61:17:61:37 | [b (line 55): true] ...; | b (line 55): true |
| LoopUnrolling.cs:61:35:61:35 | [b (line 55): true] access to local variable x | b (line 55): true |
| LoopUnrolling.cs:62:13:63:37 | [b (line 55): false] if (...) ... | b (line 55): false |
| LoopUnrolling.cs:62:13:63:37 | [b (line 55): true] if (...) ... | b (line 55): true |
| LoopUnrolling.cs:62:17:62:17 | [b (line 55): false] access to parameter b | b (line 55): false |
| LoopUnrolling.cs:62:17:62:17 | [b (line 55): true] access to parameter b | b (line 55): true |
| LoopUnrolling.cs:63:17:63:36 | [b (line 55): true] call to method WriteLine | b (line 55): true |
| LoopUnrolling.cs:63:17:63:37 | [b (line 55): true] ...; | b (line 55): true |
| LoopUnrolling.cs:63:35:63:35 | [b (line 55): true] access to local variable x | b (line 55): true |
finallyNode
| BreakInTry.cs:30:13:33:13 | [finally: break] {...} | BreakInTry.cs:24:13:33:13 | try {...} ... |
| BreakInTry.cs:31:17:32:21 | [finally: break] if (...) ... | BreakInTry.cs:24:13:33:13 | try {...} ... |
| BreakInTry.cs:31:21:31:24 | [finally: break] access to parameter args | BreakInTry.cs:24:13:33:13 | try {...} ... |
| BreakInTry.cs:31:21:31:32 | [finally: break] ... == ... | BreakInTry.cs:24:13:33:13 | try {...} ... |
| BreakInTry.cs:31:29:31:32 | [finally: break] null | BreakInTry.cs:24:13:33:13 | try {...} ... |
| BreakInTry.cs:32:21:32:21 | [finally: break] ; | BreakInTry.cs:24:13:33:13 | try {...} ... |
| BreakInTry.cs:46:9:52:9 | [finally: return] {...} | BreakInTry.cs:40:9:52:9 | try {...} ... |
| BreakInTry.cs:47:13:51:13 | [finally: return] foreach (... ... in ...) ... | BreakInTry.cs:40:9:52:9 | try {...} ... |
| BreakInTry.cs:47:26:47:28 | [finally: return] String arg | BreakInTry.cs:40:9:52:9 | try {...} ... |
| BreakInTry.cs:47:33:47:36 | [finally: return] access to parameter args | BreakInTry.cs:40:9:52:9 | try {...} ... |
| BreakInTry.cs:48:13:51:13 | [finally: return] {...} | BreakInTry.cs:40:9:52:9 | try {...} ... |
| BreakInTry.cs:49:17:50:26 | [finally: return] if (...) ... | BreakInTry.cs:40:9:52:9 | try {...} ... |
| BreakInTry.cs:49:21:49:23 | [finally: return] access to local variable arg | BreakInTry.cs:40:9:52:9 | try {...} ... |
| BreakInTry.cs:49:21:49:31 | [finally: return] ... == ... | BreakInTry.cs:40:9:52:9 | try {...} ... |
| BreakInTry.cs:49:28:49:31 | [finally: return] null | BreakInTry.cs:40:9:52:9 | try {...} ... |
| BreakInTry.cs:50:21:50:26 | [finally: return] break; | BreakInTry.cs:40:9:52:9 | try {...} ... |
| BreakInTry.cs:64:9:70:9 | [finally: return] {...} | BreakInTry.cs:58:9:70:9 | try {...} ... |
| BreakInTry.cs:65:13:69:13 | [finally: return] foreach (... ... in ...) ... | BreakInTry.cs:58:9:70:9 | try {...} ... |
| BreakInTry.cs:65:26:65:28 | [finally: return] String arg | BreakInTry.cs:58:9:70:9 | try {...} ... |
| BreakInTry.cs:65:33:65:36 | [finally: return] access to parameter args | BreakInTry.cs:58:9:70:9 | try {...} ... |
| BreakInTry.cs:66:13:69:13 | [finally: return] {...} | BreakInTry.cs:58:9:70:9 | try {...} ... |
| BreakInTry.cs:67:17:68:26 | [finally: return] if (...) ... | BreakInTry.cs:58:9:70:9 | try {...} ... |
| BreakInTry.cs:67:21:67:23 | [finally: return] access to local variable arg | BreakInTry.cs:58:9:70:9 | try {...} ... |
| BreakInTry.cs:67:21:67:31 | [finally: return] ... == ... | BreakInTry.cs:58:9:70:9 | try {...} ... |
| BreakInTry.cs:67:28:67:31 | [finally: return] null | BreakInTry.cs:58:9:70:9 | try {...} ... |
| BreakInTry.cs:68:21:68:26 | [finally: return] break; | BreakInTry.cs:58:9:70:9 | try {...} ... |
| CompileTimeOperators.cs:36:9:38:9 | [finally: goto] {...} | CompileTimeOperators.cs:30:9:38:9 | try {...} ... |
| CompileTimeOperators.cs:37:13:37:40 | [finally: goto] call to method WriteLine | CompileTimeOperators.cs:30:9:38:9 | try {...} ... |
| CompileTimeOperators.cs:37:13:37:41 | [finally: goto] ...; | CompileTimeOperators.cs:30:9:38:9 | try {...} ... |
| CompileTimeOperators.cs:37:31:37:39 | [finally: goto] "Finally" | CompileTimeOperators.cs:30:9:38:9 | try {...} ... |
| Finally.cs:14:9:16:9 | [finally: exception] {...} | Finally.cs:9:9:16:9 | try {...} ... |
| Finally.cs:15:13:15:40 | [finally: exception] call to method WriteLine | Finally.cs:9:9:16:9 | try {...} ... |
| Finally.cs:15:13:15:41 | [finally: exception] ...; | Finally.cs:9:9:16:9 | try {...} ... |
| Finally.cs:15:31:15:39 | [finally: exception] "Finally" | Finally.cs:9:9:16:9 | try {...} ... |
| Finally.cs:37:13:39:13 | [finally: exception] {...} | Finally.cs:32:13:39:13 | try {...} ... |
| Finally.cs:38:17:38:44 | [finally: exception] throw ...; | Finally.cs:32:13:39:13 | try {...} ... |
| Finally.cs:38:23:38:43 | [finally: exception] object creation of type Exception | Finally.cs:32:13:39:13 | try {...} ... |
| Finally.cs:38:37:38:42 | [finally: exception] "Boo!" | Finally.cs:32:13:39:13 | try {...} ... |
| Finally.cs:49:9:51:9 | [finally: exception] {...} | Finally.cs:21:9:51:9 | try {...} ... |
| Finally.cs:49:9:51:9 | [finally: return] {...} | Finally.cs:21:9:51:9 | try {...} ... |
| Finally.cs:50:13:50:40 | [finally: exception] call to method WriteLine | Finally.cs:21:9:51:9 | try {...} ... |
| Finally.cs:50:13:50:40 | [finally: return] call to method WriteLine | Finally.cs:21:9:51:9 | try {...} ... |
| Finally.cs:50:13:50:41 | [finally: exception] ...; | Finally.cs:21:9:51:9 | try {...} ... |
| Finally.cs:50:13:50:41 | [finally: return] ...; | Finally.cs:21:9:51:9 | try {...} ... |
| Finally.cs:50:31:50:39 | [finally: exception] "Finally" | Finally.cs:21:9:51:9 | try {...} ... |
| Finally.cs:50:31:50:39 | [finally: return] "Finally" | Finally.cs:21:9:51:9 | try {...} ... |
| Finally.cs:69:9:71:9 | [finally: exception] {...} | Finally.cs:56:9:71:9 | try {...} ... |
| Finally.cs:69:9:71:9 | [finally: return] {...} | Finally.cs:56:9:71:9 | try {...} ... |
| Finally.cs:70:13:70:40 | [finally: exception] call to method WriteLine | Finally.cs:56:9:71:9 | try {...} ... |
| Finally.cs:70:13:70:40 | [finally: return] call to method WriteLine | Finally.cs:56:9:71:9 | try {...} ... |
| Finally.cs:70:13:70:41 | [finally: exception] ...; | Finally.cs:56:9:71:9 | try {...} ... |
| Finally.cs:70:13:70:41 | [finally: return] ...; | Finally.cs:56:9:71:9 | try {...} ... |
| Finally.cs:70:31:70:39 | [finally: exception] "Finally" | Finally.cs:56:9:71:9 | try {...} ... |
| Finally.cs:70:31:70:39 | [finally: return] "Finally" | Finally.cs:56:9:71:9 | try {...} ... |
| Finally.cs:89:13:99:13 | [finally: break] {...} | Finally.cs:79:13:99:13 | try {...} ... |
| Finally.cs:89:13:99:13 | [finally: continue] {...} | Finally.cs:79:13:99:13 | try {...} ... |
| Finally.cs:89:13:99:13 | [finally: return] {...} | Finally.cs:79:13:99:13 | try {...} ... |
| Finally.cs:90:17:98:17 | [finally: break] try {...} ... | Finally.cs:79:13:99:13 | try {...} ... |
| Finally.cs:90:17:98:17 | [finally: continue] try {...} ... | Finally.cs:79:13:99:13 | try {...} ... |
| Finally.cs:90:17:98:17 | [finally: return] try {...} ... | Finally.cs:79:13:99:13 | try {...} ... |
| Finally.cs:91:17:94:17 | [finally: break] {...} | Finally.cs:79:13:99:13 | try {...} ... |
| Finally.cs:91:17:94:17 | [finally: continue] {...} | Finally.cs:79:13:99:13 | try {...} ... |
| Finally.cs:91:17:94:17 | [finally: return] {...} | Finally.cs:79:13:99:13 | try {...} ... |
| Finally.cs:92:21:93:46 | [finally: break] if (...) ... | Finally.cs:79:13:99:13 | try {...} ... |
| Finally.cs:92:21:93:46 | [finally: continue] if (...) ... | Finally.cs:79:13:99:13 | try {...} ... |
| Finally.cs:92:21:93:46 | [finally: return] if (...) ... | Finally.cs:79:13:99:13 | try {...} ... |
| Finally.cs:92:25:92:25 | [finally: break] access to local variable i | Finally.cs:79:13:99:13 | try {...} ... |
| Finally.cs:92:25:92:25 | [finally: continue] access to local variable i | Finally.cs:79:13:99:13 | try {...} ... |
| Finally.cs:92:25:92:25 | [finally: return] access to local variable i | Finally.cs:79:13:99:13 | try {...} ... |
| Finally.cs:92:25:92:30 | [finally: break] ... == ... | Finally.cs:79:13:99:13 | try {...} ... |
| Finally.cs:92:25:92:30 | [finally: continue] ... == ... | Finally.cs:79:13:99:13 | try {...} ... |
| Finally.cs:92:25:92:30 | [finally: return] ... == ... | Finally.cs:79:13:99:13 | try {...} ... |
| Finally.cs:92:30:92:30 | [finally: break] 3 | Finally.cs:79:13:99:13 | try {...} ... |
| Finally.cs:92:30:92:30 | [finally: continue] 3 | Finally.cs:79:13:99:13 | try {...} ... |
| Finally.cs:92:30:92:30 | [finally: return] 3 | Finally.cs:79:13:99:13 | try {...} ... |
| Finally.cs:93:25:93:46 | [finally: break] throw ...; | Finally.cs:79:13:99:13 | try {...} ... |
| Finally.cs:93:25:93:46 | [finally: continue] throw ...; | Finally.cs:79:13:99:13 | try {...} ... |
| Finally.cs:93:25:93:46 | [finally: return] throw ...; | Finally.cs:79:13:99:13 | try {...} ... |
| Finally.cs:93:31:93:45 | [finally: break] object creation of type Exception | Finally.cs:79:13:99:13 | try {...} ... |
| Finally.cs:93:31:93:45 | [finally: continue] object creation of type Exception | Finally.cs:79:13:99:13 | try {...} ... |
| Finally.cs:93:31:93:45 | [finally: return] object creation of type Exception | Finally.cs:79:13:99:13 | try {...} ... |
| Finally.cs:96:17:98:17 | [finally(1): exception] {...} | Finally.cs:90:17:98:17 | try {...} ... |
| Finally.cs:96:17:98:17 | [finally: break, finally(1): exception] {...} | Finally.cs:90:17:98:17 | try {...} ... |
| Finally.cs:96:17:98:17 | [finally: break] {...} | Finally.cs:90:17:98:17 | try {...} ... |
| Finally.cs:96:17:98:17 | [finally: continue, finally(1): exception] {...} | Finally.cs:90:17:98:17 | try {...} ... |
| Finally.cs:96:17:98:17 | [finally: continue] {...} | Finally.cs:90:17:98:17 | try {...} ... |
| Finally.cs:96:17:98:17 | [finally: return, finally(1): exception] {...} | Finally.cs:90:17:98:17 | try {...} ... |
| Finally.cs:96:17:98:17 | [finally: return] {...} | Finally.cs:90:17:98:17 | try {...} ... |
| Finally.cs:97:21:97:21 | [finally(1): exception] access to local variable i | Finally.cs:90:17:98:17 | try {...} ... |
| Finally.cs:97:21:97:21 | [finally: break, finally(1): exception] access to local variable i | Finally.cs:90:17:98:17 | try {...} ... |
| Finally.cs:97:21:97:21 | [finally: break] access to local variable i | Finally.cs:90:17:98:17 | try {...} ... |
| Finally.cs:97:21:97:21 | [finally: continue, finally(1): exception] access to local variable i | Finally.cs:90:17:98:17 | try {...} ... |
| Finally.cs:97:21:97:21 | [finally: continue] access to local variable i | Finally.cs:90:17:98:17 | try {...} ... |
| Finally.cs:97:21:97:21 | [finally: return, finally(1): exception] access to local variable i | Finally.cs:90:17:98:17 | try {...} ... |
| Finally.cs:97:21:97:21 | [finally: return] access to local variable i | Finally.cs:90:17:98:17 | try {...} ... |
| Finally.cs:97:21:97:23 | [finally(1): exception] ...-- | Finally.cs:90:17:98:17 | try {...} ... |
| Finally.cs:97:21:97:23 | [finally: break, finally(1): exception] ...-- | Finally.cs:90:17:98:17 | try {...} ... |
| Finally.cs:97:21:97:23 | [finally: break] ...-- | Finally.cs:90:17:98:17 | try {...} ... |
| Finally.cs:97:21:97:23 | [finally: continue, finally(1): exception] ...-- | Finally.cs:90:17:98:17 | try {...} ... |
| Finally.cs:97:21:97:23 | [finally: continue] ...-- | Finally.cs:90:17:98:17 | try {...} ... |
| Finally.cs:97:21:97:23 | [finally: return, finally(1): exception] ...-- | Finally.cs:90:17:98:17 | try {...} ... |
| Finally.cs:97:21:97:23 | [finally: return] ...-- | Finally.cs:90:17:98:17 | try {...} ... |
| Finally.cs:97:21:97:24 | [finally(1): exception] ...; | Finally.cs:90:17:98:17 | try {...} ... |
| Finally.cs:97:21:97:24 | [finally: break, finally(1): exception] ...; | Finally.cs:90:17:98:17 | try {...} ... |
| Finally.cs:97:21:97:24 | [finally: break] ...; | Finally.cs:90:17:98:17 | try {...} ... |
| Finally.cs:97:21:97:24 | [finally: continue, finally(1): exception] ...; | Finally.cs:90:17:98:17 | try {...} ... |
| Finally.cs:97:21:97:24 | [finally: continue] ...; | Finally.cs:90:17:98:17 | try {...} ... |
| Finally.cs:97:21:97:24 | [finally: return, finally(1): exception] ...; | Finally.cs:90:17:98:17 | try {...} ... |
| Finally.cs:97:21:97:24 | [finally: return] ...; | Finally.cs:90:17:98:17 | try {...} ... |
| Finally.cs:113:9:118:9 | [finally: exception] {...} | Finally.cs:105:9:118:9 | try {...} ... |
| Finally.cs:113:9:118:9 | [finally: return] {...} | Finally.cs:105:9:118:9 | try {...} ... |
| Finally.cs:114:13:115:41 | [finally: exception] if (...) ... | Finally.cs:105:9:118:9 | try {...} ... |
| Finally.cs:114:13:115:41 | [finally: return] if (...) ... | Finally.cs:105:9:118:9 | try {...} ... |
| Finally.cs:114:17:114:36 | [false, finally: exception] !... | Finally.cs:105:9:118:9 | try {...} ... |
| Finally.cs:114:17:114:36 | [false, finally: return] !... | Finally.cs:105:9:118:9 | try {...} ... |
| Finally.cs:114:17:114:36 | [true, finally: exception] !... | Finally.cs:105:9:118:9 | try {...} ... |
| Finally.cs:114:17:114:36 | [true, finally: return] !... | Finally.cs:105:9:118:9 | try {...} ... |
| Finally.cs:114:19:114:23 | [finally: exception] access to field Field | Finally.cs:105:9:118:9 | try {...} ... |
| Finally.cs:114:19:114:23 | [finally: exception] this access | Finally.cs:105:9:118:9 | try {...} ... |
| Finally.cs:114:19:114:23 | [finally: return] access to field Field | Finally.cs:105:9:118:9 | try {...} ... |
| Finally.cs:114:19:114:23 | [finally: return] this access | Finally.cs:105:9:118:9 | try {...} ... |
| Finally.cs:114:19:114:30 | [finally: exception] access to property Length | Finally.cs:105:9:118:9 | try {...} ... |
| Finally.cs:114:19:114:30 | [finally: return] access to property Length | Finally.cs:105:9:118:9 | try {...} ... |
| Finally.cs:114:19:114:35 | [finally: exception] ... == ... | Finally.cs:105:9:118:9 | try {...} ... |
| Finally.cs:114:19:114:35 | [finally: return] ... == ... | Finally.cs:105:9:118:9 | try {...} ... |
| Finally.cs:114:35:114:35 | [finally: exception] 0 | Finally.cs:105:9:118:9 | try {...} ... |
| Finally.cs:114:35:114:35 | [finally: return] 0 | Finally.cs:105:9:118:9 | try {...} ... |
| Finally.cs:115:17:115:40 | [finally: exception] call to method WriteLine | Finally.cs:105:9:118:9 | try {...} ... |
| Finally.cs:115:17:115:40 | [finally: return] call to method WriteLine | Finally.cs:105:9:118:9 | try {...} ... |
| Finally.cs:115:17:115:41 | [finally: exception] ...; | Finally.cs:105:9:118:9 | try {...} ... |
| Finally.cs:115:17:115:41 | [finally: return] ...; | Finally.cs:105:9:118:9 | try {...} ... |
| Finally.cs:115:35:115:39 | [finally: exception] access to field Field | Finally.cs:105:9:118:9 | try {...} ... |
| Finally.cs:115:35:115:39 | [finally: exception] this access | Finally.cs:105:9:118:9 | try {...} ... |
| Finally.cs:115:35:115:39 | [finally: return] access to field Field | Finally.cs:105:9:118:9 | try {...} ... |
| Finally.cs:115:35:115:39 | [finally: return] this access | Finally.cs:105:9:118:9 | try {...} ... |
| Finally.cs:116:13:117:37 | [finally: exception] if (...) ... | Finally.cs:105:9:118:9 | try {...} ... |
| Finally.cs:116:13:117:37 | [finally: return] if (...) ... | Finally.cs:105:9:118:9 | try {...} ... |
| Finally.cs:116:17:116:21 | [finally: exception] access to field Field | Finally.cs:105:9:118:9 | try {...} ... |
| Finally.cs:116:17:116:21 | [finally: exception] this access | Finally.cs:105:9:118:9 | try {...} ... |
| Finally.cs:116:17:116:21 | [finally: return] access to field Field | Finally.cs:105:9:118:9 | try {...} ... |
| Finally.cs:116:17:116:21 | [finally: return] this access | Finally.cs:105:9:118:9 | try {...} ... |
| Finally.cs:116:17:116:28 | [finally: exception] access to property Length | Finally.cs:105:9:118:9 | try {...} ... |
| Finally.cs:116:17:116:28 | [finally: return] access to property Length | Finally.cs:105:9:118:9 | try {...} ... |
| Finally.cs:116:17:116:32 | [finally: exception] ... > ... | Finally.cs:105:9:118:9 | try {...} ... |
| Finally.cs:116:17:116:32 | [finally: return] ... > ... | Finally.cs:105:9:118:9 | try {...} ... |
| Finally.cs:116:32:116:32 | [finally: exception] 0 | Finally.cs:105:9:118:9 | try {...} ... |
| Finally.cs:116:32:116:32 | [finally: return] 0 | Finally.cs:105:9:118:9 | try {...} ... |
| Finally.cs:117:17:117:36 | [finally: exception] call to method WriteLine | Finally.cs:105:9:118:9 | try {...} ... |
| Finally.cs:117:17:117:36 | [finally: return] call to method WriteLine | Finally.cs:105:9:118:9 | try {...} ... |
| Finally.cs:117:17:117:37 | [finally: exception] ...; | Finally.cs:105:9:118:9 | try {...} ... |
| Finally.cs:117:17:117:37 | [finally: return] ...; | Finally.cs:105:9:118:9 | try {...} ... |
| Finally.cs:117:35:117:35 | [finally: exception] 1 | Finally.cs:105:9:118:9 | try {...} ... |
| Finally.cs:117:35:117:35 | [finally: return] 1 | Finally.cs:105:9:118:9 | try {...} ... |
| Finally.cs:140:9:143:9 | [finally: exception] {...} | Finally.cs:135:9:143:9 | try {...} ... |
| Finally.cs:141:13:141:44 | [finally: exception] throw ...; | Finally.cs:135:9:143:9 | try {...} ... |
| Finally.cs:141:19:141:43 | [finally: exception] object creation of type ArgumentException | Finally.cs:135:9:143:9 | try {...} ... |
| Finally.cs:141:41:141:42 | [finally: exception] "" | Finally.cs:135:9:143:9 | try {...} ... |
| Finally.cs:155:9:169:9 | [finally: exception] {...} | Finally.cs:149:9:169:9 | try {...} ... |
| Finally.cs:156:13:168:13 | [finally: exception] try {...} ... | Finally.cs:149:9:169:9 | try {...} ... |
| Finally.cs:157:13:160:13 | [finally: exception] {...} | Finally.cs:149:9:169:9 | try {...} ... |
| Finally.cs:158:17:159:45 | [finally: exception] if (...) ... | Finally.cs:149:9:169:9 | try {...} ... |
| Finally.cs:158:21:158:24 | [finally: exception] access to parameter args | Finally.cs:149:9:169:9 | try {...} ... |
| Finally.cs:158:21:158:31 | [finally: exception] access to property Length | Finally.cs:149:9:169:9 | try {...} ... |
| Finally.cs:158:21:158:36 | [finally: exception] ... == ... | Finally.cs:149:9:169:9 | try {...} ... |
| Finally.cs:158:36:158:36 | [finally: exception] 1 | Finally.cs:149:9:169:9 | try {...} ... |
| Finally.cs:159:21:159:45 | [finally: exception] throw ...; | Finally.cs:149:9:169:9 | try {...} ... |
| Finally.cs:159:27:159:44 | [finally: exception] object creation of type Exception | Finally.cs:149:9:169:9 | try {...} ... |
| Finally.cs:159:41:159:43 | [finally: exception] "1" | Finally.cs:149:9:169:9 | try {...} ... |
| Finally.cs:161:13:164:13 | [finally: exception, exception: Exception] catch (...) {...} | Finally.cs:149:9:169:9 | try {...} ... |
| Finally.cs:161:13:164:13 | [finally: exception, exception: NullReferenceException] catch (...) {...} | Finally.cs:149:9:169:9 | try {...} ... |
| Finally.cs:161:30:161:30 | [finally: exception, exception: Exception] Exception e | Finally.cs:149:9:169:9 | try {...} ... |
| Finally.cs:161:30:161:30 | [finally: exception, exception: NullReferenceException] Exception e | Finally.cs:149:9:169:9 | try {...} ... |
| Finally.cs:161:39:161:39 | [finally: exception, exception: Exception] access to local variable e | Finally.cs:149:9:169:9 | try {...} ... |
| Finally.cs:161:39:161:39 | [finally: exception, exception: NullReferenceException] access to local variable e | Finally.cs:149:9:169:9 | try {...} ... |
| Finally.cs:161:39:161:47 | [finally: exception, exception: Exception] access to property Message | Finally.cs:149:9:169:9 | try {...} ... |
| Finally.cs:161:39:161:47 | [finally: exception, exception: NullReferenceException] access to property Message | Finally.cs:149:9:169:9 | try {...} ... |
| Finally.cs:161:39:161:54 | [finally: exception, exception: Exception] ... == ... | Finally.cs:149:9:169:9 | try {...} ... |
| Finally.cs:161:39:161:54 | [finally: exception, exception: NullReferenceException] ... == ... | Finally.cs:149:9:169:9 | try {...} ... |
| Finally.cs:161:52:161:54 | [finally: exception, exception: Exception] "1" | Finally.cs:149:9:169:9 | try {...} ... |
| Finally.cs:161:52:161:54 | [finally: exception, exception: NullReferenceException] "1" | Finally.cs:149:9:169:9 | try {...} ... |
| Finally.cs:162:13:164:13 | [finally: exception] {...} | Finally.cs:149:9:169:9 | try {...} ... |
| Finally.cs:163:17:163:42 | [finally: exception] call to method WriteLine | Finally.cs:149:9:169:9 | try {...} ... |
| Finally.cs:163:17:163:43 | [finally: exception] ...; | Finally.cs:149:9:169:9 | try {...} ... |
| Finally.cs:163:35:163:38 | [finally: exception] access to parameter args | Finally.cs:149:9:169:9 | try {...} ... |
| Finally.cs:163:35:163:41 | [finally: exception] access to array element | Finally.cs:149:9:169:9 | try {...} ... |
| Finally.cs:163:40:163:40 | [finally: exception] 0 | Finally.cs:149:9:169:9 | try {...} ... |
| Finally.cs:165:13:168:13 | [finally: exception] catch {...} | Finally.cs:149:9:169:9 | try {...} ... |
| Finally.cs:166:13:168:13 | [finally: exception] {...} | Finally.cs:149:9:169:9 | try {...} ... |
| Finally.cs:167:17:167:37 | [finally: exception] call to method WriteLine | Finally.cs:149:9:169:9 | try {...} ... |
| Finally.cs:167:17:167:38 | [finally: exception] ...; | Finally.cs:149:9:169:9 | try {...} ... |
| Finally.cs:167:35:167:36 | [finally: exception] "" | Finally.cs:149:9:169:9 | try {...} ... |
| Finally.cs:183:9:192:9 | [finally: exception, b1 (line 176): true] {...} | Finally.cs:178:9:192:9 | try {...} ... |
| Finally.cs:184:13:191:13 | [finally: exception, b1 (line 176): true] try {...} ... | Finally.cs:178:9:192:9 | try {...} ... |
| Finally.cs:185:13:187:13 | [finally: exception, b1 (line 176): true] {...} | Finally.cs:178:9:192:9 | try {...} ... |
| Finally.cs:186:17:186:47 | [finally: exception, b1 (line 176): true] if (...) ... | Finally.cs:178:9:192:9 | try {...} ... |
| Finally.cs:186:21:186:22 | [finally: exception, b1 (line 176): true] access to parameter b2 | Finally.cs:178:9:192:9 | try {...} ... |
| Finally.cs:186:25:186:47 | [finally: exception, b1 (line 176): true, b2 (line 176): true] throw ...; | Finally.cs:178:9:192:9 | try {...} ... |
| Finally.cs:186:31:186:46 | [finally: exception, b1 (line 176): true, b2 (line 176): true] object creation of type ExceptionB | Finally.cs:178:9:192:9 | try {...} ... |
| Finally.cs:188:13:191:13 | [finally: exception, exception: Exception, b1 (line 176): true, b2 (line 176): true] catch (...) {...} | Finally.cs:178:9:192:9 | try {...} ... |
| Finally.cs:188:13:191:13 | [finally: exception, exception: ExceptionB, b1 (line 176): true, b2 (line 176): true] catch (...) {...} | Finally.cs:178:9:192:9 | try {...} ... |
| Finally.cs:188:38:188:39 | [finally: exception, exception: Exception, b1 (line 176): true, b2 (line 176): true] access to parameter b2 | Finally.cs:178:9:192:9 | try {...} ... |
| Finally.cs:188:38:188:39 | [finally: exception, exception: ExceptionB, b1 (line 176): true, b2 (line 176): true] access to parameter b2 | Finally.cs:178:9:192:9 | try {...} ... |
| Finally.cs:189:13:191:13 | [finally: exception, b1 (line 176): true] {...} | Finally.cs:178:9:192:9 | try {...} ... |
| Finally.cs:190:17:190:47 | [finally: exception, b1 (line 176): true] if (...) ... | Finally.cs:178:9:192:9 | try {...} ... |
| Finally.cs:190:21:190:22 | [finally: exception, b1 (line 176): true] access to parameter b1 | Finally.cs:178:9:192:9 | try {...} ... |
| Finally.cs:190:25:190:47 | [finally: exception] throw ...; | Finally.cs:178:9:192:9 | try {...} ... |
| Finally.cs:190:31:190:46 | [finally: exception] object creation of type ExceptionC | Finally.cs:178:9:192:9 | try {...} ... |
| Finally.cs:202:9:212:9 | [finally: exception] {...} | Finally.cs:197:9:212:9 | try {...} ... |
| Finally.cs:203:13:210:13 | [finally: exception] try {...} ... | Finally.cs:197:9:212:9 | try {...} ... |
| Finally.cs:204:13:206:13 | [finally: exception] {...} | Finally.cs:197:9:212:9 | try {...} ... |
| Finally.cs:205:17:205:47 | [finally: exception] if (...) ... | Finally.cs:197:9:212:9 | try {...} ... |
| Finally.cs:205:21:205:22 | [finally: exception] access to parameter b2 | Finally.cs:197:9:212:9 | try {...} ... |
| Finally.cs:205:25:205:47 | [finally: exception] throw ...; | Finally.cs:197:9:212:9 | try {...} ... |
| Finally.cs:205:31:205:46 | [finally: exception] object creation of type ExceptionB | Finally.cs:197:9:212:9 | try {...} ... |
| Finally.cs:208:13:210:13 | [finally(1): exception] {...} | Finally.cs:203:13:210:13 | try {...} ... |
| Finally.cs:208:13:210:13 | [finally: exception, finally(1): exception] {...} | Finally.cs:203:13:210:13 | try {...} ... |
| Finally.cs:208:13:210:13 | [finally: exception] {...} | Finally.cs:203:13:210:13 | try {...} ... |
| Finally.cs:209:17:209:47 | [finally(1): exception] if (...) ... | Finally.cs:203:13:210:13 | try {...} ... |
| Finally.cs:209:17:209:47 | [finally: exception, finally(1): exception] if (...) ... | Finally.cs:203:13:210:13 | try {...} ... |
| Finally.cs:209:17:209:47 | [finally: exception] if (...) ... | Finally.cs:203:13:210:13 | try {...} ... |
| Finally.cs:209:21:209:22 | [finally(1): exception] access to parameter b3 | Finally.cs:203:13:210:13 | try {...} ... |
| Finally.cs:209:21:209:22 | [finally: exception, finally(1): exception] access to parameter b3 | Finally.cs:203:13:210:13 | try {...} ... |
| Finally.cs:209:21:209:22 | [finally: exception] access to parameter b3 | Finally.cs:203:13:210:13 | try {...} ... |
| Finally.cs:209:25:209:47 | [finally(1): exception] throw ...; | Finally.cs:203:13:210:13 | try {...} ... |
| Finally.cs:209:25:209:47 | [finally: exception, finally(1): exception] throw ...; | Finally.cs:203:13:210:13 | try {...} ... |
| Finally.cs:209:25:209:47 | [finally: exception] throw ...; | Finally.cs:203:13:210:13 | try {...} ... |
| Finally.cs:209:31:209:46 | [finally(1): exception] object creation of type ExceptionC | Finally.cs:203:13:210:13 | try {...} ... |
| Finally.cs:209:31:209:46 | [finally: exception, finally(1): exception] object creation of type ExceptionC | Finally.cs:203:13:210:13 | try {...} ... |
| Finally.cs:209:31:209:46 | [finally: exception] object creation of type ExceptionC | Finally.cs:203:13:210:13 | try {...} ... |
| Finally.cs:211:13:211:16 | [finally: exception] this access | Finally.cs:197:9:212:9 | try {...} ... |
| Finally.cs:211:13:211:28 | [finally: exception] ... = ... | Finally.cs:197:9:212:9 | try {...} ... |
| Finally.cs:211:13:211:29 | [finally: exception] ...; | Finally.cs:197:9:212:9 | try {...} ... |
| Finally.cs:211:26:211:28 | [finally: exception] "0" | Finally.cs:197:9:212:9 | try {...} ... |
| Finally.cs:243:13:253:13 | [finally: exception] {...} | Finally.cs:237:13:253:13 | try {...} ... |
| Finally.cs:244:17:252:17 | [finally: exception] try {...} ... | Finally.cs:237:13:253:13 | try {...} ... |
| Finally.cs:245:17:248:17 | [finally: exception] {...} | Finally.cs:237:13:253:13 | try {...} ... |
| Finally.cs:246:21:247:47 | [finally: exception] if (...) ... | Finally.cs:237:13:253:13 | try {...} ... |
| Finally.cs:246:25:246:26 | [finally: exception] access to parameter b2 | Finally.cs:237:13:253:13 | try {...} ... |
| Finally.cs:247:25:247:47 | [finally: exception] throw ...; | Finally.cs:237:13:253:13 | try {...} ... |
| Finally.cs:247:31:247:46 | [finally: exception] object creation of type ExceptionA | Finally.cs:237:13:253:13 | try {...} ... |
| Finally.cs:250:17:252:17 | [finally(1): exception] {...} | Finally.cs:244:17:252:17 | try {...} ... |
| Finally.cs:250:17:252:17 | [finally: exception, finally(1): exception] {...} | Finally.cs:244:17:252:17 | try {...} ... |
| Finally.cs:250:17:252:17 | [finally: exception] {...} | Finally.cs:244:17:252:17 | try {...} ... |
| Finally.cs:251:21:251:54 | [finally(1): exception] call to method WriteLine | Finally.cs:244:17:252:17 | try {...} ... |
| Finally.cs:251:21:251:54 | [finally: exception, finally(1): exception] call to method WriteLine | Finally.cs:244:17:252:17 | try {...} ... |
| Finally.cs:251:21:251:54 | [finally: exception] call to method WriteLine | Finally.cs:244:17:252:17 | try {...} ... |
| Finally.cs:251:21:251:55 | [finally(1): exception] ...; | Finally.cs:244:17:252:17 | try {...} ... |
| Finally.cs:251:21:251:55 | [finally: exception, finally(1): exception] ...; | Finally.cs:244:17:252:17 | try {...} ... |
| Finally.cs:251:21:251:55 | [finally: exception] ...; | Finally.cs:244:17:252:17 | try {...} ... |
| Finally.cs:251:39:251:53 | [finally(1): exception] "Inner finally" | Finally.cs:244:17:252:17 | try {...} ... |
| Finally.cs:251:39:251:53 | [finally: exception, finally(1): exception] "Inner finally" | Finally.cs:244:17:252:17 | try {...} ... |
| Finally.cs:251:39:251:53 | [finally: exception] "Inner finally" | Finally.cs:244:17:252:17 | try {...} ... |
| Finally.cs:257:9:259:9 | [finally: exception] {...} | Finally.cs:235:9:259:9 | try {...} ... |
| Finally.cs:258:13:258:46 | [finally: exception] call to method WriteLine | Finally.cs:235:9:259:9 | try {...} ... |
| Finally.cs:258:13:258:47 | [finally: exception] ...; | Finally.cs:235:9:259:9 | try {...} ... |
| Finally.cs:258:31:258:45 | [finally: exception] "Outer finally" | Finally.cs:235:9:259:9 | try {...} ... |
| Finally.cs:270:9:273:9 | [finally: exception] {...} | Finally.cs:265:9:273:9 | try {...} ... |
| Finally.cs:271:13:271:34 | [finally: exception] call to method WriteLine | Finally.cs:265:9:273:9 | try {...} ... |
| Finally.cs:271:13:271:35 | [finally: exception] ...; | Finally.cs:265:9:273:9 | try {...} ... |
| Finally.cs:271:31:271:33 | [finally: exception] "3" | Finally.cs:265:9:273:9 | try {...} ... |
| Finally.cs:272:13:272:13 | [finally: exception] access to parameter i | Finally.cs:265:9:273:9 | try {...} ... |
| Finally.cs:272:13:272:18 | [finally: exception] ... + ... | Finally.cs:265:9:273:9 | try {...} ... |
| Finally.cs:272:13:272:18 | [finally: exception] ... = ... | Finally.cs:265:9:273:9 | try {...} ... |
| Finally.cs:272:13:272:19 | [finally: exception] ...; | Finally.cs:265:9:273:9 | try {...} ... |
| Finally.cs:272:18:272:18 | [finally: exception] 3 | Finally.cs:265:9:273:9 | try {...} ... |
| cflow.cs:274:9:276:9 | [finally: return] {...} | cflow.cs:268:9:276:9 | try {...} ... |
| cflow.cs:275:13:275:41 | [finally: return] call to method WriteLine | cflow.cs:268:9:276:9 | try {...} ... |
| cflow.cs:275:13:275:42 | [finally: return] ...; | cflow.cs:268:9:276:9 | try {...} ... |
| cflow.cs:275:31:275:40 | [finally: return] "not dead" | cflow.cs:268:9:276:9 | try {...} ... |
entryPoint
| AccessorCalls.cs:1:7:1:19 | AccessorCalls | AccessorCalls.cs:1:7:1:19 | call to constructor Object |
| AccessorCalls.cs:5:23:5:25 | get_Item | AccessorCalls.cs:5:30:5:30 | access to parameter i |
| AccessorCalls.cs:5:33:5:35 | set_Item | AccessorCalls.cs:5:37:5:39 | {...} |

View File

@@ -5,22 +5,6 @@ import semmle.code.csharp.controlflow.internal.ControlFlowGraphImpl as Impl
import semmle.code.csharp.controlflow.internal.Splitting as Splitting
import Nodes
query predicate booleanNode(ElementNode e, BooleanSplit split) { split = e.getASplit() }
class MyFinallySplitControlFlowNode extends ElementNode {
MyFinallySplitControlFlowNode() {
exists(Splitting::FinallySplitting::FinallySplitType type |
type = this.getASplit().(FinallySplit).getType()
|
not type instanceof DirectSuccessor
)
}
Impl::Statements::TryStmtTree getTryStmt() { this.getAstNode() = result.getAFinallyDescendant() }
}
query predicate finallyNode(MyFinallySplitControlFlowNode f, TryStmt try) { try = f.getTryStmt() }
query predicate entryPoint(Callable c, SourceControlFlowElement cfn) {
c.getEntryPoint().getASuccessor().getAstNode() = cfn
}

View File

@@ -32,7 +32,6 @@ abstractValue
| 0 | Guards.cs:322:18:322:18 | 0 |
| 0 | Guards.cs:329:17:329:19 | access to constant A |
| 0 | Guards.cs:334:20:334:20 | 0 |
| 0 | Splitting.cs:137:20:137:20 | 0 |
| 1 | Collections.cs:12:28:12:28 | 1 |
| 1 | Collections.cs:14:28:14:28 | 1 |
| 1 | Collections.cs:17:28:17:28 | 1 |
@@ -371,32 +370,6 @@ abstractValue
| non-null | Guards.cs:343:13:343:19 | access to type Console |
| non-null | Guards.cs:343:31:343:31 | access to local variable s |
| non-null | Guards.cs:349:13:349:13 | access to parameter o |
| non-null | Splitting.cs:13:17:13:17 | access to parameter o |
| non-null | Splitting.cs:23:24:23:24 | access to parameter o |
| non-null | Splitting.cs:33:24:33:25 | "" |
| non-null | Splitting.cs:44:17:44:17 | access to parameter o |
| non-null | Splitting.cs:46:17:46:17 | access to parameter o |
| non-null | Splitting.cs:55:13:55:13 | access to parameter o |
| non-null | Splitting.cs:66:20:66:20 | access to parameter o |
| non-null | Splitting.cs:78:24:78:24 | access to parameter o |
| non-null | Splitting.cs:87:13:87:17 | access to type Debug |
| non-null | Splitting.cs:90:13:90:13 | access to parameter o |
| non-null | Splitting.cs:91:9:91:9 | access to parameter o |
| non-null | Splitting.cs:97:13:97:17 | access to type Debug |
| non-null | Splitting.cs:105:9:105:13 | access to type Debug |
| non-null | Splitting.cs:107:13:107:13 | access to parameter o |
| non-null | Splitting.cs:109:13:109:13 | access to parameter o |
| non-null | Splitting.cs:116:9:116:13 | access to type Debug |
| non-null | Splitting.cs:117:9:117:9 | access to parameter o |
| non-null | Splitting.cs:119:13:119:13 | access to parameter o |
| non-null | Splitting.cs:120:16:120:16 | access to parameter o |
| non-null | Splitting.cs:129:17:129:17 | access to local variable o |
| non-null | Splitting.cs:133:17:133:17 | access to local variable o |
| non-null | Splitting.cs:133:17:133:29 | ... = ... |
| non-null | Splitting.cs:133:21:133:29 | call to method M11 |
| non-null | Splitting.cs:133:21:133:29 | this access |
| non-null | Splitting.cs:133:28:133:28 | access to local variable o |
| non-null | Splitting.cs:134:17:134:17 | access to local variable o |
| null | Assert.cs:9:24:9:27 | null |
| null | Assert.cs:10:27:10:30 | null |
| null | Assert.cs:16:24:16:27 | null |
@@ -447,19 +420,6 @@ abstractValue
| null | Guards.cs:203:18:203:21 | null |
| null | Guards.cs:341:24:341:27 | null |
| null | Guards.cs:342:18:342:21 | null |
| null | Splitting.cs:12:22:12:25 | null |
| null | Splitting.cs:22:22:22:25 | null |
| null | Splitting.cs:32:22:32:25 | null |
| null | Splitting.cs:41:18:41:21 | null |
| null | Splitting.cs:54:18:54:21 | null |
| null | Splitting.cs:65:18:65:21 | null |
| null | Splitting.cs:76:18:76:21 | null |
| null | Splitting.cs:87:31:87:34 | null |
| null | Splitting.cs:97:31:97:34 | null |
| null | Splitting.cs:105:27:105:30 | null |
| null | Splitting.cs:116:27:116:30 | null |
| null | Splitting.cs:125:21:125:24 | null |
| null | Splitting.cs:129:22:129:25 | null |
| true | Assert.cs:86:61:86:64 | true |
| true | Guards.cs:177:20:177:23 | true |
| true | Guards.cs:181:46:181:49 | true |

View File

@@ -72,22 +72,3 @@
| Guards.cs:342:27:342:27 | access to parameter b | Guards.cs:341:20:341:20 | access to parameter b | Guards.cs:341:20:341:20 | access to parameter b | false |
| Guards.cs:343:31:343:31 | access to local variable s | Guards.cs:342:13:342:21 | ... != ... | Guards.cs:342:13:342:13 | access to local variable s | true |
| Guards.cs:349:13:349:13 | access to parameter o | Guards.cs:348:13:348:25 | ... is ... | Guards.cs:348:13:348:13 | access to parameter o | true |
| Splitting.cs:13:17:13:17 | access to parameter o | Splitting.cs:12:17:12:25 | ... != ... | Splitting.cs:12:17:12:17 | access to parameter o | true |
| Splitting.cs:23:24:23:24 | access to parameter o | Splitting.cs:22:17:22:25 | ... != ... | Splitting.cs:22:17:22:17 | access to parameter o | true |
| Splitting.cs:25:13:25:13 | access to parameter o | Splitting.cs:22:17:22:25 | ... != ... | Splitting.cs:22:17:22:17 | access to parameter o | false |
| Splitting.cs:35:13:35:13 | access to parameter o | Splitting.cs:32:17:32:25 | ... == ... | Splitting.cs:32:17:32:17 | access to parameter o | false |
| Splitting.cs:44:17:44:17 | access to parameter o | Splitting.cs:41:13:41:21 | ... != ... | Splitting.cs:41:13:41:13 | access to parameter o | true |
| Splitting.cs:46:17:46:17 | access to parameter o | Splitting.cs:41:13:41:21 | ... != ... | Splitting.cs:41:13:41:13 | access to parameter o | true |
| Splitting.cs:55:13:55:13 | access to parameter o | Splitting.cs:54:13:54:21 | ... != ... | Splitting.cs:54:13:54:13 | access to parameter o | true |
| Splitting.cs:66:20:66:20 | access to parameter o | Splitting.cs:65:13:65:21 | ... != ... | Splitting.cs:65:13:65:13 | access to parameter o | true |
| Splitting.cs:68:13:68:13 | access to parameter o | Splitting.cs:65:13:65:21 | ... != ... | Splitting.cs:65:13:65:13 | access to parameter o | false |
| Splitting.cs:69:16:69:16 | access to parameter o | Splitting.cs:65:13:65:21 | ... != ... | Splitting.cs:65:13:65:13 | access to parameter o | false |
| Splitting.cs:78:24:78:24 | access to parameter o | Splitting.cs:76:13:76:21 | ... != ... | Splitting.cs:76:13:76:13 | access to parameter o | true |
| Splitting.cs:90:13:90:13 | access to parameter o | Splitting.cs:87:26:87:34 | ... != ... | Splitting.cs:87:26:87:26 | access to parameter o | true |
| Splitting.cs:99:13:99:13 | access to parameter o | Splitting.cs:97:26:97:34 | ... == ... | Splitting.cs:97:26:97:26 | access to parameter o | true |
| Splitting.cs:107:13:107:13 | access to parameter o | Splitting.cs:105:22:105:30 | ... != ... | Splitting.cs:105:22:105:22 | access to parameter o | true |
| Splitting.cs:109:13:109:13 | access to parameter o | Splitting.cs:105:22:105:30 | ... != ... | Splitting.cs:105:22:105:22 | access to parameter o | true |
| Splitting.cs:117:9:117:9 | access to parameter o | Splitting.cs:116:22:116:30 | ... != ... | Splitting.cs:116:22:116:22 | access to parameter o | true |
| Splitting.cs:119:13:119:13 | access to parameter o | Splitting.cs:116:22:116:30 | ... != ... | Splitting.cs:116:22:116:22 | access to parameter o | true |
| Splitting.cs:120:16:120:16 | access to parameter o | Splitting.cs:116:22:116:30 | ... != ... | Splitting.cs:116:22:116:22 | access to parameter o | true |
| Splitting.cs:133:25:133:25 | access to parameter b | Splitting.cs:131:21:131:21 | access to parameter b | Splitting.cs:131:21:131:21 | access to parameter b | false |

View File

@@ -10,39 +10,27 @@
| Assert.cs:46:27:46:27 | access to local variable s | Assert.cs:45:24:45:32 | ... != ... | Assert.cs:45:24:45:24 | access to local variable s | false |
| Assert.cs:53:27:53:27 | access to local variable s | Assert.cs:52:24:52:24 | access to local variable s | Assert.cs:52:24:52:24 | access to local variable s | non-null |
| Assert.cs:53:27:53:27 | access to local variable s | Assert.cs:52:24:52:32 | ... == ... | Assert.cs:52:24:52:24 | access to local variable s | false |
| Assert.cs:59:36:59:36 | [b (line 56): false] access to parameter b | Assert.cs:58:20:58:20 | access to parameter b | Assert.cs:58:20:58:20 | access to parameter b | false |
| Assert.cs:59:36:59:36 | [b (line 56): false] access to parameter b | Assert.cs:58:20:58:32 | ... ? ... : ... | Assert.cs:58:20:58:20 | access to parameter b | non-null |
| Assert.cs:59:36:59:36 | [b (line 56): true] access to parameter b | Assert.cs:58:20:58:20 | access to parameter b | Assert.cs:58:20:58:20 | access to parameter b | false |
| Assert.cs:59:36:59:36 | [b (line 56): true] access to parameter b | Assert.cs:58:20:58:20 | access to parameter b | Assert.cs:58:20:58:20 | access to parameter b | true |
| Assert.cs:59:36:59:36 | [b (line 56): true] access to parameter b | Assert.cs:58:20:58:32 | ... ? ... : ... | Assert.cs:58:20:58:20 | access to parameter b | non-null |
| Assert.cs:59:36:59:36 | access to parameter b | Assert.cs:58:20:58:20 | access to parameter b | Assert.cs:58:20:58:20 | access to parameter b | false |
| Assert.cs:59:36:59:36 | access to parameter b | Assert.cs:58:20:58:32 | ... ? ... : ... | Assert.cs:58:20:58:20 | access to parameter b | non-null |
| Assert.cs:60:27:60:27 | access to local variable s | Assert.cs:59:23:59:23 | access to local variable s | Assert.cs:59:23:59:23 | access to local variable s | non-null |
| Assert.cs:60:27:60:27 | access to local variable s | Assert.cs:59:23:59:31 | ... != ... | Assert.cs:59:23:59:23 | access to local variable s | true |
| Assert.cs:66:37:66:37 | [b (line 63): false] access to parameter b | Assert.cs:65:20:65:20 | access to parameter b | Assert.cs:65:20:65:20 | access to parameter b | false |
| Assert.cs:66:37:66:37 | [b (line 63): false] access to parameter b | Assert.cs:65:20:65:32 | ... ? ... : ... | Assert.cs:65:20:65:20 | access to parameter b | non-null |
| Assert.cs:66:37:66:37 | [b (line 63): true] access to parameter b | Assert.cs:65:20:65:20 | access to parameter b | Assert.cs:65:20:65:20 | access to parameter b | false |
| Assert.cs:66:37:66:37 | [b (line 63): true] access to parameter b | Assert.cs:65:20:65:20 | access to parameter b | Assert.cs:65:20:65:20 | access to parameter b | true |
| Assert.cs:66:37:66:37 | [b (line 63): true] access to parameter b | Assert.cs:65:20:65:32 | ... ? ... : ... | Assert.cs:65:20:65:20 | access to parameter b | non-null |
| Assert.cs:66:37:66:37 | access to parameter b | Assert.cs:65:20:65:20 | access to parameter b | Assert.cs:65:20:65:20 | access to parameter b | false |
| Assert.cs:66:37:66:37 | access to parameter b | Assert.cs:65:20:65:32 | ... ? ... : ... | Assert.cs:65:20:65:20 | access to parameter b | non-null |
| Assert.cs:67:27:67:27 | access to local variable s | Assert.cs:66:24:66:24 | access to local variable s | Assert.cs:66:24:66:24 | access to local variable s | non-null |
| Assert.cs:67:27:67:27 | access to local variable s | Assert.cs:66:24:66:32 | ... == ... | Assert.cs:66:24:66:24 | access to local variable s | false |
| Assert.cs:73:36:73:36 | [b (line 70): false] access to parameter b | Assert.cs:72:20:72:20 | access to parameter b | Assert.cs:72:20:72:20 | access to parameter b | false |
| Assert.cs:73:36:73:36 | [b (line 70): false] access to parameter b | Assert.cs:72:20:72:20 | access to parameter b | Assert.cs:72:20:72:20 | access to parameter b | true |
| Assert.cs:73:36:73:36 | [b (line 70): false] access to parameter b | Assert.cs:72:20:72:32 | ... ? ... : ... | Assert.cs:72:20:72:20 | access to parameter b | null |
| Assert.cs:73:36:73:36 | [b (line 70): true] access to parameter b | Assert.cs:72:20:72:20 | access to parameter b | Assert.cs:72:20:72:20 | access to parameter b | true |
| Assert.cs:73:36:73:36 | [b (line 70): true] access to parameter b | Assert.cs:72:20:72:32 | ... ? ... : ... | Assert.cs:72:20:72:20 | access to parameter b | null |
| Assert.cs:73:36:73:36 | access to parameter b | Assert.cs:72:20:72:20 | access to parameter b | Assert.cs:72:20:72:20 | access to parameter b | true |
| Assert.cs:73:36:73:36 | access to parameter b | Assert.cs:72:20:72:32 | ... ? ... : ... | Assert.cs:72:20:72:20 | access to parameter b | null |
| Assert.cs:74:27:74:27 | access to local variable s | Assert.cs:73:23:73:23 | access to local variable s | Assert.cs:73:23:73:23 | access to local variable s | null |
| Assert.cs:74:27:74:27 | access to local variable s | Assert.cs:73:23:73:31 | ... == ... | Assert.cs:73:23:73:23 | access to local variable s | true |
| Assert.cs:80:37:80:37 | [b (line 77): false] access to parameter b | Assert.cs:79:20:79:20 | access to parameter b | Assert.cs:79:20:79:20 | access to parameter b | false |
| Assert.cs:80:37:80:37 | [b (line 77): false] access to parameter b | Assert.cs:79:20:79:20 | access to parameter b | Assert.cs:79:20:79:20 | access to parameter b | true |
| Assert.cs:80:37:80:37 | [b (line 77): false] access to parameter b | Assert.cs:79:20:79:32 | ... ? ... : ... | Assert.cs:79:20:79:20 | access to parameter b | null |
| Assert.cs:80:37:80:37 | [b (line 77): true] access to parameter b | Assert.cs:79:20:79:20 | access to parameter b | Assert.cs:79:20:79:20 | access to parameter b | true |
| Assert.cs:80:37:80:37 | [b (line 77): true] access to parameter b | Assert.cs:79:20:79:32 | ... ? ... : ... | Assert.cs:79:20:79:20 | access to parameter b | null |
| Assert.cs:80:37:80:37 | access to parameter b | Assert.cs:79:20:79:20 | access to parameter b | Assert.cs:79:20:79:20 | access to parameter b | true |
| Assert.cs:80:37:80:37 | access to parameter b | Assert.cs:79:20:79:32 | ... ? ... : ... | Assert.cs:79:20:79:20 | access to parameter b | null |
| Assert.cs:81:27:81:27 | access to local variable s | Assert.cs:80:24:80:24 | access to local variable s | Assert.cs:80:24:80:24 | access to local variable s | null |
| Assert.cs:81:27:81:27 | access to local variable s | Assert.cs:80:24:80:32 | ... != ... | Assert.cs:80:24:80:24 | access to local variable s | false |
| Assert.cs:93:33:93:34 | [assertion failure, b1 (line 91): false] access to parameter b2 | Assert.cs:93:29:93:30 | access to parameter b2 | Assert.cs:93:29:93:30 | access to parameter b2 | false |
| Assert.cs:93:33:93:34 | [assertion failure, b1 (line 91): false] access to parameter b2 | Assert.cs:93:29:93:30 | access to parameter b2 | Assert.cs:93:29:93:30 | access to parameter b2 | true |
| Assert.cs:93:33:93:34 | [assertion failure, b1 (line 91): true] access to parameter b2 | Assert.cs:93:29:93:30 | access to parameter b2 | Assert.cs:93:29:93:30 | access to parameter b2 | true |
| Assert.cs:93:33:93:34 | [assertion success, b1 (line 91): true] access to parameter b2 | Assert.cs:93:29:93:30 | access to parameter b2 | Assert.cs:93:29:93:30 | access to parameter b2 | false |
| Assert.cs:94:16:94:17 | [b1 (line 91): true] access to parameter b1 | Assert.cs:93:25:93:26 | access to parameter b1 | Assert.cs:93:25:93:26 | access to parameter b1 | true |
| Assert.cs:93:33:93:34 | [assertion failure] access to parameter b2 | Assert.cs:93:29:93:30 | access to parameter b2 | Assert.cs:93:29:93:30 | access to parameter b2 | false |
| Assert.cs:93:33:93:34 | [assertion failure] access to parameter b2 | Assert.cs:93:29:93:30 | access to parameter b2 | Assert.cs:93:29:93:30 | access to parameter b2 | true |
| Assert.cs:93:33:93:34 | [assertion failure] access to parameter b2 | Assert.cs:93:29:93:30 | access to parameter b2 | Assert.cs:93:29:93:30 | access to parameter b2 | true |
| Assert.cs:93:33:93:34 | [assertion success] access to parameter b2 | Assert.cs:93:29:93:30 | access to parameter b2 | Assert.cs:93:29:93:30 | access to parameter b2 | false |
| Assert.cs:94:16:94:17 | access to parameter b1 | Assert.cs:93:25:93:26 | access to parameter b1 | Assert.cs:93:25:93:26 | access to parameter b1 | true |
| Assert.cs:94:23:94:24 | access to parameter b2 | Assert.cs:93:29:93:30 | access to parameter b2 | Assert.cs:93:29:93:30 | access to parameter b2 | false |
| Collections.cs:51:17:51:20 | access to parameter args | Collections.cs:49:13:49:16 | access to parameter args | Collections.cs:49:13:49:16 | access to parameter args | non-empty |
| Collections.cs:51:17:51:20 | access to parameter args | Collections.cs:49:13:49:27 | ... == ... | Collections.cs:49:13:49:16 | access to parameter args | false |
@@ -203,78 +191,9 @@
| Guards.cs:287:17:287:17 | access to parameter o | Guards.cs:276:16:276:16 | access to parameter o | Guards.cs:276:16:276:16 | access to parameter o | non-match access to type Action<Object> |
| Guards.cs:287:17:287:17 | access to parameter o | Guards.cs:276:16:276:16 | access to parameter o | Guards.cs:276:16:276:16 | access to parameter o | non-match null |
| Guards.cs:287:17:287:17 | access to parameter o | Guards.cs:276:16:276:16 | access to parameter o | Guards.cs:276:16:276:16 | access to parameter o | non-null |
| Guards.cs:342:27:342:27 | [b (line 339): false] access to parameter b | Guards.cs:341:20:341:20 | access to parameter b | Guards.cs:341:20:341:20 | access to parameter b | false |
| Guards.cs:342:27:342:27 | [b (line 339): false] access to parameter b | Guards.cs:341:20:341:32 | ... ? ... : ... | Guards.cs:341:20:341:20 | access to parameter b | non-null |
| Guards.cs:342:27:342:27 | [b (line 339): true] access to parameter b | Guards.cs:341:20:341:20 | access to parameter b | Guards.cs:341:20:341:20 | access to parameter b | false |
| Guards.cs:342:27:342:27 | [b (line 339): true] access to parameter b | Guards.cs:341:20:341:20 | access to parameter b | Guards.cs:341:20:341:20 | access to parameter b | true |
| Guards.cs:342:27:342:27 | [b (line 339): true] access to parameter b | Guards.cs:341:20:341:32 | ... ? ... : ... | Guards.cs:341:20:341:20 | access to parameter b | non-null |
| Guards.cs:342:27:342:27 | access to parameter b | Guards.cs:341:20:341:20 | access to parameter b | Guards.cs:341:20:341:20 | access to parameter b | false |
| Guards.cs:342:27:342:27 | access to parameter b | Guards.cs:341:20:341:32 | ... ? ... : ... | Guards.cs:341:20:341:20 | access to parameter b | non-null |
| Guards.cs:343:31:343:31 | access to local variable s | Guards.cs:342:13:342:13 | access to local variable s | Guards.cs:342:13:342:13 | access to local variable s | non-null |
| Guards.cs:343:31:343:31 | access to local variable s | Guards.cs:342:13:342:21 | ... != ... | Guards.cs:342:13:342:13 | access to local variable s | true |
| Guards.cs:349:13:349:13 | access to parameter o | Guards.cs:348:13:348:13 | access to parameter o | Guards.cs:348:13:348:13 | access to parameter o | non-null |
| Guards.cs:349:13:349:13 | access to parameter o | Guards.cs:348:13:348:25 | ... is ... | Guards.cs:348:13:348:13 | access to parameter o | true |
| Splitting.cs:13:17:13:17 | [b (line 9): true] access to parameter o | Splitting.cs:12:17:12:17 | access to parameter o | Splitting.cs:12:17:12:17 | access to parameter o | non-null |
| Splitting.cs:13:17:13:17 | [b (line 9): true] access to parameter o | Splitting.cs:12:17:12:25 | ... != ... | Splitting.cs:12:17:12:17 | access to parameter o | true |
| Splitting.cs:14:13:14:13 | [b (line 9): false] access to parameter b | Splitting.cs:11:13:11:13 | access to parameter b | Splitting.cs:11:13:11:13 | access to parameter b | false |
| Splitting.cs:14:13:14:13 | [b (line 9): true] access to parameter b | Splitting.cs:11:13:11:13 | access to parameter b | Splitting.cs:11:13:11:13 | access to parameter b | true |
| Splitting.cs:23:24:23:24 | access to parameter o | Splitting.cs:22:17:22:17 | access to parameter o | Splitting.cs:22:17:22:17 | access to parameter o | non-null |
| Splitting.cs:23:24:23:24 | access to parameter o | Splitting.cs:22:17:22:25 | ... != ... | Splitting.cs:22:17:22:17 | access to parameter o | true |
| Splitting.cs:24:13:24:13 | [b (line 19): false] access to parameter b | Splitting.cs:21:13:21:13 | access to parameter b | Splitting.cs:21:13:21:13 | access to parameter b | false |
| Splitting.cs:24:13:24:13 | [b (line 19): true] access to parameter b | Splitting.cs:21:13:21:13 | access to parameter b | Splitting.cs:21:13:21:13 | access to parameter b | true |
| Splitting.cs:25:13:25:13 | access to parameter o | Splitting.cs:22:17:22:17 | access to parameter o | Splitting.cs:22:17:22:17 | access to parameter o | null |
| Splitting.cs:25:13:25:13 | access to parameter o | Splitting.cs:22:17:22:25 | ... != ... | Splitting.cs:22:17:22:17 | access to parameter o | false |
| Splitting.cs:34:13:34:13 | [b (line 29): false] access to parameter b | Splitting.cs:31:13:31:13 | access to parameter b | Splitting.cs:31:13:31:13 | access to parameter b | false |
| Splitting.cs:34:13:34:13 | [b (line 29): true] access to parameter b | Splitting.cs:31:13:31:13 | access to parameter b | Splitting.cs:31:13:31:13 | access to parameter b | true |
| Splitting.cs:35:13:35:13 | access to parameter o | Splitting.cs:32:17:32:17 | access to parameter o | Splitting.cs:32:17:32:17 | access to parameter o | non-null |
| Splitting.cs:35:13:35:13 | access to parameter o | Splitting.cs:32:17:32:25 | ... == ... | Splitting.cs:32:17:32:17 | access to parameter o | false |
| Splitting.cs:44:17:44:17 | [b (line 39): true] access to parameter o | Splitting.cs:41:13:41:13 | access to parameter o | Splitting.cs:41:13:41:13 | access to parameter o | non-null |
| Splitting.cs:44:17:44:17 | [b (line 39): true] access to parameter o | Splitting.cs:41:13:41:21 | ... != ... | Splitting.cs:41:13:41:13 | access to parameter o | true |
| Splitting.cs:45:17:45:17 | [b (line 39): false] access to parameter b | Splitting.cs:43:17:43:17 | access to parameter b | Splitting.cs:43:17:43:17 | access to parameter b | false |
| Splitting.cs:45:17:45:17 | [b (line 39): true] access to parameter b | Splitting.cs:43:17:43:17 | access to parameter b | Splitting.cs:43:17:43:17 | access to parameter b | true |
| Splitting.cs:46:17:46:17 | access to parameter o | Splitting.cs:41:13:41:13 | access to parameter o | Splitting.cs:41:13:41:13 | access to parameter o | non-null |
| Splitting.cs:46:17:46:17 | access to parameter o | Splitting.cs:41:13:41:21 | ... != ... | Splitting.cs:41:13:41:13 | access to parameter o | true |
| Splitting.cs:55:13:55:13 | [b (line 50): false] access to parameter o | Splitting.cs:54:13:54:13 | access to parameter o | Splitting.cs:54:13:54:13 | access to parameter o | non-null |
| Splitting.cs:55:13:55:13 | [b (line 50): false] access to parameter o | Splitting.cs:54:13:54:21 | ... != ... | Splitting.cs:54:13:54:13 | access to parameter o | true |
| Splitting.cs:55:13:55:13 | [b (line 50): true] access to parameter o | Splitting.cs:54:13:54:13 | access to parameter o | Splitting.cs:54:13:54:13 | access to parameter o | non-null |
| Splitting.cs:55:13:55:13 | [b (line 50): true] access to parameter o | Splitting.cs:54:13:54:21 | ... != ... | Splitting.cs:54:13:54:13 | access to parameter o | true |
| Splitting.cs:56:13:56:13 | [b (line 50): false] access to parameter b | Splitting.cs:52:13:52:13 | access to parameter b | Splitting.cs:52:13:52:13 | access to parameter b | false |
| Splitting.cs:56:13:56:13 | [b (line 50): true] access to parameter b | Splitting.cs:52:13:52:13 | access to parameter b | Splitting.cs:52:13:52:13 | access to parameter b | true |
| Splitting.cs:66:20:66:20 | access to parameter o | Splitting.cs:65:13:65:13 | access to parameter o | Splitting.cs:65:13:65:13 | access to parameter o | non-null |
| Splitting.cs:66:20:66:20 | access to parameter o | Splitting.cs:65:13:65:21 | ... != ... | Splitting.cs:65:13:65:13 | access to parameter o | true |
| Splitting.cs:67:13:67:13 | [b (line 61): false] access to parameter b | Splitting.cs:63:13:63:13 | access to parameter b | Splitting.cs:63:13:63:13 | access to parameter b | false |
| Splitting.cs:67:13:67:13 | [b (line 61): true] access to parameter b | Splitting.cs:63:13:63:13 | access to parameter b | Splitting.cs:63:13:63:13 | access to parameter b | true |
| Splitting.cs:68:13:68:13 | access to parameter o | Splitting.cs:65:13:65:13 | access to parameter o | Splitting.cs:65:13:65:13 | access to parameter o | null |
| Splitting.cs:68:13:68:13 | access to parameter o | Splitting.cs:65:13:65:21 | ... != ... | Splitting.cs:65:13:65:13 | access to parameter o | false |
| Splitting.cs:69:16:69:16 | access to parameter o | Splitting.cs:65:13:65:13 | access to parameter o | Splitting.cs:65:13:65:13 | access to parameter o | null |
| Splitting.cs:69:16:69:16 | access to parameter o | Splitting.cs:65:13:65:21 | ... != ... | Splitting.cs:65:13:65:13 | access to parameter o | false |
| Splitting.cs:78:24:78:24 | access to parameter o | Splitting.cs:76:13:76:13 | access to parameter o | Splitting.cs:76:13:76:13 | access to parameter o | non-null |
| Splitting.cs:78:24:78:24 | access to parameter o | Splitting.cs:76:13:76:21 | ... != ... | Splitting.cs:76:13:76:13 | access to parameter o | true |
| Splitting.cs:79:13:79:13 | [b (line 72): false] access to parameter b | Splitting.cs:74:13:74:13 | access to parameter b | Splitting.cs:74:13:74:13 | access to parameter b | false |
| Splitting.cs:79:13:79:13 | [b (line 72): true] access to parameter b | Splitting.cs:74:13:74:13 | access to parameter b | Splitting.cs:74:13:74:13 | access to parameter b | true |
| Splitting.cs:88:9:88:9 | [b (line 84): true] access to parameter o | Splitting.cs:87:26:87:26 | access to parameter o | Splitting.cs:87:26:87:26 | access to parameter o | non-null |
| Splitting.cs:88:9:88:9 | [b (line 84): true] access to parameter o | Splitting.cs:87:26:87:34 | ... != ... | Splitting.cs:87:26:87:26 | access to parameter o | true |
| Splitting.cs:89:13:89:13 | [b (line 84): false] access to parameter b | Splitting.cs:86:13:86:13 | access to parameter b | Splitting.cs:86:13:86:13 | access to parameter b | false |
| Splitting.cs:89:13:89:13 | [b (line 84): true] access to parameter b | Splitting.cs:86:13:86:13 | access to parameter b | Splitting.cs:86:13:86:13 | access to parameter b | true |
| Splitting.cs:90:13:90:13 | access to parameter o | Splitting.cs:87:26:87:26 | access to parameter o | Splitting.cs:87:26:87:26 | access to parameter o | non-null |
| Splitting.cs:90:13:90:13 | access to parameter o | Splitting.cs:87:26:87:34 | ... != ... | Splitting.cs:87:26:87:26 | access to parameter o | true |
| Splitting.cs:98:13:98:13 | [b (line 94): false] access to parameter b | Splitting.cs:96:13:96:13 | access to parameter b | Splitting.cs:96:13:96:13 | access to parameter b | false |
| Splitting.cs:98:13:98:13 | [b (line 94): true] access to parameter b | Splitting.cs:96:13:96:13 | access to parameter b | Splitting.cs:96:13:96:13 | access to parameter b | true |
| Splitting.cs:99:13:99:13 | access to parameter o | Splitting.cs:97:26:97:26 | access to parameter o | Splitting.cs:97:26:97:26 | access to parameter o | null |
| Splitting.cs:99:13:99:13 | access to parameter o | Splitting.cs:97:26:97:34 | ... == ... | Splitting.cs:97:26:97:26 | access to parameter o | true |
| Splitting.cs:107:13:107:13 | [b (line 103): true] access to parameter o | Splitting.cs:105:22:105:22 | access to parameter o | Splitting.cs:105:22:105:22 | access to parameter o | non-null |
| Splitting.cs:107:13:107:13 | [b (line 103): true] access to parameter o | Splitting.cs:105:22:105:30 | ... != ... | Splitting.cs:105:22:105:22 | access to parameter o | true |
| Splitting.cs:108:13:108:13 | [b (line 103): false] access to parameter b | Splitting.cs:106:13:106:13 | access to parameter b | Splitting.cs:106:13:106:13 | access to parameter b | false |
| Splitting.cs:108:13:108:13 | [b (line 103): true] access to parameter b | Splitting.cs:106:13:106:13 | access to parameter b | Splitting.cs:106:13:106:13 | access to parameter b | true |
| Splitting.cs:109:13:109:13 | access to parameter o | Splitting.cs:105:22:105:22 | access to parameter o | Splitting.cs:105:22:105:22 | access to parameter o | non-null |
| Splitting.cs:109:13:109:13 | access to parameter o | Splitting.cs:105:22:105:30 | ... != ... | Splitting.cs:105:22:105:22 | access to parameter o | true |
| Splitting.cs:117:9:117:9 | [b (line 112): false] access to parameter o | Splitting.cs:116:22:116:22 | access to parameter o | Splitting.cs:116:22:116:22 | access to parameter o | non-null |
| Splitting.cs:117:9:117:9 | [b (line 112): false] access to parameter o | Splitting.cs:116:22:116:30 | ... != ... | Splitting.cs:116:22:116:22 | access to parameter o | true |
| Splitting.cs:117:9:117:9 | [b (line 112): true] access to parameter o | Splitting.cs:116:22:116:22 | access to parameter o | Splitting.cs:116:22:116:22 | access to parameter o | non-null |
| Splitting.cs:117:9:117:9 | [b (line 112): true] access to parameter o | Splitting.cs:116:22:116:30 | ... != ... | Splitting.cs:116:22:116:22 | access to parameter o | true |
| Splitting.cs:118:13:118:13 | [b (line 112): false] access to parameter b | Splitting.cs:114:13:114:13 | access to parameter b | Splitting.cs:114:13:114:13 | access to parameter b | false |
| Splitting.cs:118:13:118:13 | [b (line 112): true] access to parameter b | Splitting.cs:114:13:114:13 | access to parameter b | Splitting.cs:114:13:114:13 | access to parameter b | true |
| Splitting.cs:119:13:119:13 | access to parameter o | Splitting.cs:116:22:116:22 | access to parameter o | Splitting.cs:116:22:116:22 | access to parameter o | non-null |
| Splitting.cs:119:13:119:13 | access to parameter o | Splitting.cs:116:22:116:30 | ... != ... | Splitting.cs:116:22:116:22 | access to parameter o | true |
| Splitting.cs:120:16:120:16 | access to parameter o | Splitting.cs:116:22:116:22 | access to parameter o | Splitting.cs:116:22:116:22 | access to parameter o | non-null |
| Splitting.cs:120:16:120:16 | access to parameter o | Splitting.cs:116:22:116:30 | ... != ... | Splitting.cs:116:22:116:22 | access to parameter o | true |
| Splitting.cs:131:21:131:21 | [b (line 123): false] access to parameter b | Splitting.cs:131:21:131:21 | access to parameter b | Splitting.cs:131:21:131:21 | access to parameter b | false |
| Splitting.cs:133:25:133:25 | [b (line 123): false] access to parameter b | Splitting.cs:131:21:131:21 | access to parameter b | Splitting.cs:131:21:131:21 | access to parameter b | false |

View File

@@ -193,40 +193,3 @@
| Guards.cs:343:31:343:31 | access to local variable s | Guards.cs:342:13:342:21 | ... != ... | Guards.cs:342:13:342:13 | access to local variable s | true |
| Guards.cs:349:13:349:13 | access to parameter o | Guards.cs:348:13:348:13 | access to parameter o | Guards.cs:348:13:348:13 | access to parameter o | non-null |
| Guards.cs:349:13:349:13 | access to parameter o | Guards.cs:348:13:348:25 | ... is ... | Guards.cs:348:13:348:13 | access to parameter o | true |
| Splitting.cs:13:17:13:17 | access to parameter o | Splitting.cs:12:17:12:17 | access to parameter o | Splitting.cs:12:17:12:17 | access to parameter o | non-null |
| Splitting.cs:13:17:13:17 | access to parameter o | Splitting.cs:12:17:12:25 | ... != ... | Splitting.cs:12:17:12:17 | access to parameter o | true |
| Splitting.cs:23:24:23:24 | access to parameter o | Splitting.cs:22:17:22:17 | access to parameter o | Splitting.cs:22:17:22:17 | access to parameter o | non-null |
| Splitting.cs:23:24:23:24 | access to parameter o | Splitting.cs:22:17:22:25 | ... != ... | Splitting.cs:22:17:22:17 | access to parameter o | true |
| Splitting.cs:25:13:25:13 | access to parameter o | Splitting.cs:22:17:22:17 | access to parameter o | Splitting.cs:22:17:22:17 | access to parameter o | null |
| Splitting.cs:25:13:25:13 | access to parameter o | Splitting.cs:22:17:22:25 | ... != ... | Splitting.cs:22:17:22:17 | access to parameter o | false |
| Splitting.cs:35:13:35:13 | access to parameter o | Splitting.cs:32:17:32:17 | access to parameter o | Splitting.cs:32:17:32:17 | access to parameter o | non-null |
| Splitting.cs:35:13:35:13 | access to parameter o | Splitting.cs:32:17:32:25 | ... == ... | Splitting.cs:32:17:32:17 | access to parameter o | false |
| Splitting.cs:44:17:44:17 | access to parameter o | Splitting.cs:41:13:41:13 | access to parameter o | Splitting.cs:41:13:41:13 | access to parameter o | non-null |
| Splitting.cs:44:17:44:17 | access to parameter o | Splitting.cs:41:13:41:21 | ... != ... | Splitting.cs:41:13:41:13 | access to parameter o | true |
| Splitting.cs:46:17:46:17 | access to parameter o | Splitting.cs:41:13:41:13 | access to parameter o | Splitting.cs:41:13:41:13 | access to parameter o | non-null |
| Splitting.cs:46:17:46:17 | access to parameter o | Splitting.cs:41:13:41:21 | ... != ... | Splitting.cs:41:13:41:13 | access to parameter o | true |
| Splitting.cs:55:13:55:13 | access to parameter o | Splitting.cs:54:13:54:13 | access to parameter o | Splitting.cs:54:13:54:13 | access to parameter o | non-null |
| Splitting.cs:55:13:55:13 | access to parameter o | Splitting.cs:54:13:54:21 | ... != ... | Splitting.cs:54:13:54:13 | access to parameter o | true |
| Splitting.cs:66:20:66:20 | access to parameter o | Splitting.cs:65:13:65:13 | access to parameter o | Splitting.cs:65:13:65:13 | access to parameter o | non-null |
| Splitting.cs:66:20:66:20 | access to parameter o | Splitting.cs:65:13:65:21 | ... != ... | Splitting.cs:65:13:65:13 | access to parameter o | true |
| Splitting.cs:68:13:68:13 | access to parameter o | Splitting.cs:65:13:65:13 | access to parameter o | Splitting.cs:65:13:65:13 | access to parameter o | null |
| Splitting.cs:68:13:68:13 | access to parameter o | Splitting.cs:65:13:65:21 | ... != ... | Splitting.cs:65:13:65:13 | access to parameter o | false |
| Splitting.cs:69:16:69:16 | access to parameter o | Splitting.cs:65:13:65:13 | access to parameter o | Splitting.cs:65:13:65:13 | access to parameter o | null |
| Splitting.cs:69:16:69:16 | access to parameter o | Splitting.cs:65:13:65:21 | ... != ... | Splitting.cs:65:13:65:13 | access to parameter o | false |
| Splitting.cs:78:24:78:24 | access to parameter o | Splitting.cs:76:13:76:13 | access to parameter o | Splitting.cs:76:13:76:13 | access to parameter o | non-null |
| Splitting.cs:78:24:78:24 | access to parameter o | Splitting.cs:76:13:76:21 | ... != ... | Splitting.cs:76:13:76:13 | access to parameter o | true |
| Splitting.cs:90:13:90:13 | access to parameter o | Splitting.cs:87:26:87:26 | access to parameter o | Splitting.cs:87:26:87:26 | access to parameter o | non-null |
| Splitting.cs:90:13:90:13 | access to parameter o | Splitting.cs:87:26:87:34 | ... != ... | Splitting.cs:87:26:87:26 | access to parameter o | true |
| Splitting.cs:99:13:99:13 | access to parameter o | Splitting.cs:97:26:97:26 | access to parameter o | Splitting.cs:97:26:97:26 | access to parameter o | null |
| Splitting.cs:99:13:99:13 | access to parameter o | Splitting.cs:97:26:97:34 | ... == ... | Splitting.cs:97:26:97:26 | access to parameter o | true |
| Splitting.cs:107:13:107:13 | access to parameter o | Splitting.cs:105:22:105:22 | access to parameter o | Splitting.cs:105:22:105:22 | access to parameter o | non-null |
| Splitting.cs:107:13:107:13 | access to parameter o | Splitting.cs:105:22:105:30 | ... != ... | Splitting.cs:105:22:105:22 | access to parameter o | true |
| Splitting.cs:109:13:109:13 | access to parameter o | Splitting.cs:105:22:105:22 | access to parameter o | Splitting.cs:105:22:105:22 | access to parameter o | non-null |
| Splitting.cs:109:13:109:13 | access to parameter o | Splitting.cs:105:22:105:30 | ... != ... | Splitting.cs:105:22:105:22 | access to parameter o | true |
| Splitting.cs:117:9:117:9 | access to parameter o | Splitting.cs:116:22:116:22 | access to parameter o | Splitting.cs:116:22:116:22 | access to parameter o | non-null |
| Splitting.cs:117:9:117:9 | access to parameter o | Splitting.cs:116:22:116:30 | ... != ... | Splitting.cs:116:22:116:22 | access to parameter o | true |
| Splitting.cs:119:13:119:13 | access to parameter o | Splitting.cs:116:22:116:22 | access to parameter o | Splitting.cs:116:22:116:22 | access to parameter o | non-null |
| Splitting.cs:119:13:119:13 | access to parameter o | Splitting.cs:116:22:116:30 | ... != ... | Splitting.cs:116:22:116:22 | access to parameter o | true |
| Splitting.cs:120:16:120:16 | access to parameter o | Splitting.cs:116:22:116:22 | access to parameter o | Splitting.cs:116:22:116:22 | access to parameter o | non-null |
| Splitting.cs:120:16:120:16 | access to parameter o | Splitting.cs:116:22:116:30 | ... != ... | Splitting.cs:116:22:116:22 | access to parameter o | true |
| Splitting.cs:133:25:133:25 | access to parameter b | Splitting.cs:131:21:131:21 | access to parameter b | Splitting.cs:131:21:131:21 | access to parameter b | false |

View File

@@ -443,30 +443,3 @@
| Guards.cs:343:31:343:31 | access to local variable s | non-null | Guards.cs:341:20:341:32 | ... ? ... : ... | non-null |
| Guards.cs:343:31:343:31 | access to local variable s | null | Guards.cs:341:20:341:32 | ... ? ... : ... | null |
| Guards.cs:348:13:348:25 | ... is ... | true | Guards.cs:348:13:348:13 | access to parameter o | non-null |
| Splitting.cs:12:17:12:25 | ... != ... | false | Splitting.cs:12:17:12:17 | access to parameter o | null |
| Splitting.cs:12:17:12:25 | ... != ... | true | Splitting.cs:12:17:12:17 | access to parameter o | non-null |
| Splitting.cs:22:17:22:25 | ... != ... | false | Splitting.cs:22:17:22:17 | access to parameter o | null |
| Splitting.cs:22:17:22:25 | ... != ... | true | Splitting.cs:22:17:22:17 | access to parameter o | non-null |
| Splitting.cs:32:17:32:25 | ... == ... | false | Splitting.cs:32:17:32:17 | access to parameter o | non-null |
| Splitting.cs:32:17:32:25 | ... == ... | true | Splitting.cs:32:17:32:17 | access to parameter o | null |
| Splitting.cs:41:13:41:21 | ... != ... | false | Splitting.cs:41:13:41:13 | access to parameter o | null |
| Splitting.cs:41:13:41:21 | ... != ... | true | Splitting.cs:41:13:41:13 | access to parameter o | non-null |
| Splitting.cs:54:13:54:21 | ... != ... | false | Splitting.cs:54:13:54:13 | access to parameter o | null |
| Splitting.cs:54:13:54:21 | ... != ... | true | Splitting.cs:54:13:54:13 | access to parameter o | non-null |
| Splitting.cs:65:13:65:21 | ... != ... | false | Splitting.cs:65:13:65:13 | access to parameter o | null |
| Splitting.cs:65:13:65:21 | ... != ... | true | Splitting.cs:65:13:65:13 | access to parameter o | non-null |
| Splitting.cs:76:13:76:21 | ... != ... | false | Splitting.cs:76:13:76:13 | access to parameter o | null |
| Splitting.cs:76:13:76:21 | ... != ... | true | Splitting.cs:76:13:76:13 | access to parameter o | non-null |
| Splitting.cs:87:26:87:34 | ... != ... | false | Splitting.cs:87:26:87:26 | access to parameter o | null |
| Splitting.cs:87:26:87:34 | ... != ... | true | Splitting.cs:87:26:87:26 | access to parameter o | non-null |
| Splitting.cs:97:26:97:34 | ... == ... | false | Splitting.cs:97:26:97:26 | access to parameter o | non-null |
| Splitting.cs:97:26:97:34 | ... == ... | true | Splitting.cs:97:26:97:26 | access to parameter o | null |
| Splitting.cs:105:22:105:30 | ... != ... | false | Splitting.cs:105:22:105:22 | access to parameter o | null |
| Splitting.cs:105:22:105:30 | ... != ... | true | Splitting.cs:105:22:105:22 | access to parameter o | non-null |
| Splitting.cs:116:22:116:30 | ... != ... | false | Splitting.cs:116:22:116:22 | access to parameter o | null |
| Splitting.cs:116:22:116:30 | ... != ... | true | Splitting.cs:116:22:116:22 | access to parameter o | non-null |
| Splitting.cs:129:17:129:25 | ... != ... | false | Splitting.cs:129:17:129:17 | access to local variable o | null |
| Splitting.cs:129:17:129:25 | ... != ... | false | Splitting.cs:129:22:129:25 | null | non-null |
| Splitting.cs:129:17:129:25 | ... != ... | true | Splitting.cs:129:17:129:17 | access to local variable o | non-null |
| Splitting.cs:134:17:134:17 | access to local variable o | non-null | Splitting.cs:133:21:133:29 | call to method M11 | non-null |
| Splitting.cs:134:17:134:17 | access to local variable o | null | Splitting.cs:133:21:133:29 | call to method M11 | null |

View File

@@ -47,17 +47,3 @@
| Guards.cs:287:17:287:17 | access to parameter o |
| Guards.cs:343:31:343:31 | access to local variable s |
| Guards.cs:349:13:349:13 | access to parameter o |
| Splitting.cs:13:17:13:17 | access to parameter o |
| Splitting.cs:23:24:23:24 | access to parameter o |
| Splitting.cs:35:13:35:13 | access to parameter o |
| Splitting.cs:44:17:44:17 | access to parameter o |
| Splitting.cs:46:17:46:17 | access to parameter o |
| Splitting.cs:55:13:55:13 | access to parameter o |
| Splitting.cs:66:20:66:20 | access to parameter o |
| Splitting.cs:78:24:78:24 | access to parameter o |
| Splitting.cs:90:13:90:13 | access to parameter o |
| Splitting.cs:107:13:107:13 | access to parameter o |
| Splitting.cs:109:13:109:13 | access to parameter o |
| Splitting.cs:117:9:117:9 | access to parameter o |
| Splitting.cs:119:13:119:13 | access to parameter o |
| Splitting.cs:120:16:120:16 | access to parameter o |

View File

@@ -1,139 +0,0 @@
using System;
using System.Diagnostics;
#nullable enable
/// <summary>
/// Tests related to CFG splitting.
/// </summary>
public class Splitting
{
void M1(bool b, object? o)
{
if (b)
if (o != null)
o.ToString(); // null guarded
if (b)
o.ToString(); // not null guarded
o.ToString(); // not null guarded
}
string M2(bool b, object? o)
{
if (b)
if (o != null)
return o.ToString(); // null guarded
if (b)
o.ToString(); // anti-null guarded
return o.ToString(); // not null guarded
}
string M3(bool b, object? o)
{
if (b)
if (o == null)
return "";
if (b)
o.ToString(); // null guarded
return o.ToString(); // not null guarded
}
void M4(bool b, object? o)
{
if (o != null)
{
if (b)
o.ToString(); // null guarded
if (b)
o.ToString(); // null guarded
}
}
string M5(bool b, object? o)
{
if (b)
o.ToString(); // not null guarded
if (o != null)
o.ToString(); // null guarded
if (b)
o.ToString(); // not null guarded
return o.ToString(); // not null guarded
}
string M6(bool b, object? o)
{
if (b)
o.ToString(); // not null guarded
if (o != null)
return o.ToString(); // null guarded
if (b)
o.ToString(); // anti-null guarded
return o.ToString(); // anti-null guarded
}
string M7(bool b, object? o, bool b2)
{
if (b)
o.ToString(); // not null guarded
if (o != null)
if (b2)
return o.ToString(); // null guarded
if (b)
o.ToString(); // not null guarded
return o.ToString(); // not null guarded
}
void M8(bool b, object? o)
{
if (b)
Debug.Assert(o != null);
o.ToString(); // not null guarded
if (b)
o.ToString(); // null guarded
o.ToString(); // not null guarded
}
string M9(bool b, object? o)
{
if (b)
Debug.Assert(o == null);
if (b)
o.ToString(); // anti-null guarded
return o.ToString(); // not null guarded
}
void M10(bool b, object? o)
{
Debug.Assert(o != null);
if (b)
o.ToString(); // null guarded
if (b)
o.ToString(); // null guarded
}
string M11(bool b, object? o)
{
if (b)
o.ToString(); // not null guarded
Debug.Assert(o != null);
o.ToString(); // null guarded
if (b)
o.ToString(); // null guarded
return o.ToString(); // null guarded
}
public void M12(int i, bool b)
{
object? o = null;
do
{
o.GetHashCode(); // not null guarded
if (o != null)
{
if (b)
return;
o = M11(b, o);
o.GetHashCode(); // not null guarded
}
}
while (i > 0);
}
}

View File

@@ -1,3 +0,0 @@
deadEnd
| SplittingStressTest.cs:95:13:95:14 | [b5 (line 3): false] access to parameter b5 |
| SplittingStressTest.cs:95:13:95:14 | [b5 (line 3): true] access to parameter b5 |

View File

@@ -1,321 +0,0 @@
class SplittingStressTest
{
void M1(bool b1, bool b2, bool b3, bool b4, bool b5, bool b6, bool b7, bool b8, bool b9, bool b10, bool b11, bool b12, bool b13, bool b14, bool b15, bool b16, bool b17, bool b18, bool b19, bool b20, bool b21, bool b22, bool b23, bool b24, bool b25, bool b26, bool b27, bool b28, bool b29, bool b30, bool b31, bool b32, bool b33, bool b34, bool b35, bool b36, bool b37, bool b38, bool b39, bool b40)
{
if (b1)
;
if (b2)
;
if (b3)
;
if (b4)
;
if (b5)
;
if (b6)
;
if (b7)
;
if (b8)
;
if (b9)
;
if (b10)
;
if (b11)
;
if (b12)
;
if (b13)
;
if (b14)
;
if (b15)
;
if (b16)
;
if (b17)
;
if (b18)
;
if (b19)
;
if (b20)
;
if (b21)
;
if (b22)
;
if (b23)
;
if (b24)
;
if (b25)
;
if (b26)
;
if (b27)
;
if (b28)
;
if (b29)
;
if (b30)
;
if (b31)
;
if (b32)
;
if (b33)
;
if (b34)
;
if (b35)
;
if (b36)
;
if (b37)
;
if (b38)
;
if (b39)
;
if (b40)
;
; // 2^40 splits
if (b1)
;
if (b2)
;
if (b3)
;
if (b4)
;
if (b5)
;
if (b6)
;
if (b7)
;
if (b8)
;
if (b9)
;
if (b10)
;
if (b11)
;
if (b12)
;
if (b13)
;
if (b14)
;
if (b15)
;
if (b16)
;
if (b17)
;
if (b18)
;
if (b19)
;
if (b20)
;
if (b21)
;
if (b22)
;
if (b23)
;
if (b24)
;
if (b25)
;
if (b26)
;
if (b27)
;
if (b28)
;
if (b29)
;
if (b30)
;
if (b31)
;
if (b32)
;
if (b33)
;
if (b34)
;
if (b35)
;
if (b36)
;
if (b37)
;
if (b38)
;
if (b39)
;
if (b40)
;
;
}
void M2(int i, bool b1, bool b2, bool b3, bool b4, bool b5, bool b6, bool b7, bool b8, bool b9, bool b10, bool b11, bool b12, bool b13, bool b14, bool b15, bool b16, bool b17, bool b18, bool b19, bool b20, bool b21, bool b22, bool b23, bool b24, bool b25, bool b26, bool b27, bool b28, bool b29)
{
while (i-- > 0)
{
if (i == 1)
{
if (b1)
;
}
if (i == 2)
{
if (b2)
;
}
if (i == 3)
{
if (b3)
;
}
if (i == 4)
{
if (b4)
;
}
if (i == 5)
{
if (b5)
;
}
if (i == 6)
{
if (b6)
;
}
if (i == 7)
{
if (b7)
;
}
if (i == 8)
{
if (b8)
;
}
if (i == 9)
{
if (b9)
;
}
if (i == 10)
{
if (b10)
;
}
if (i == 11)
{
if (b11)
;
}
if (i == 12)
{
if (b12)
;
}
if (i == 13)
{
if (b13)
;
}
if (i == 14)
{
if (b14)
;
}
if (i == 15)
{
if (b15)
;
}
if (i == 16)
{
if (b16)
;
}
if (i == 17)
{
if (b17)
;
}
if (i == 18)
{
if (b18)
;
}
if (i == 19)
{
if (b19)
;
}
if (i == 20)
{
if (b20)
;
}
if (i == 21)
{
if (b21)
;
}
if (i == 22)
{
if (b22)
;
}
if (i == 23)
{
if (b23)
;
}
if (i == 24)
{
if (b24)
;
}
if (i == 25)
{
if (b25)
;
}
if (i == 26)
{
if (b26)
;
}
if (i == 27)
{
if (b27)
;
}
if (i == 28)
{
if (b28)
;
}
if (i == 29)
{
if (b29)
;
}
}
}
}

View File

@@ -1,8 +0,0 @@
import csharp
query predicate countSplits(ControlFlowElement cfe, int i) {
not cfe.fromLibrary() and
i = strictcount(ControlFlow::Nodes::ElementNode n | n.getAstNode() = cfe)
}
query predicate ssaDef(Ssa::Definition def) { any() }

View File

@@ -2,7 +2,7 @@ edges
| CallSensitivityFlow.cs:7:38:7:38 | o : Object | CallSensitivityFlow.cs:11:20:11:20 | access to parameter o : Object | provenance | |
| CallSensitivityFlow.cs:19:39:19:39 | o : Object | CallSensitivityFlow.cs:23:18:23:18 | access to parameter o | provenance | |
| CallSensitivityFlow.cs:27:40:27:40 | o : Object | CallSensitivityFlow.cs:31:18:31:18 | access to parameter o | provenance | |
| CallSensitivityFlow.cs:35:41:35:41 | o : Object | CallSensitivityFlow.cs:39:18:39:18 | [cond (line 35): true] access to parameter o | provenance | |
| CallSensitivityFlow.cs:35:41:35:41 | o : Object | CallSensitivityFlow.cs:39:18:39:18 | access to parameter o | provenance | |
| CallSensitivityFlow.cs:43:45:43:45 | o : Object | CallSensitivityFlow.cs:45:16:45:17 | access to local variable o1 : Object | provenance | |
| CallSensitivityFlow.cs:45:16:45:17 | access to local variable o1 : Object | CallSensitivityFlow.cs:49:20:49:22 | access to local variable tmp : Object | provenance | |
| CallSensitivityFlow.cs:49:20:49:22 | access to local variable tmp : Object | CallSensitivityFlow.cs:50:13:50:14 | access to local variable o2 : Object | provenance | |
@@ -71,7 +71,7 @@ nodes
| CallSensitivityFlow.cs:27:40:27:40 | o : Object | semmle.label | o : Object |
| CallSensitivityFlow.cs:31:18:31:18 | access to parameter o | semmle.label | access to parameter o |
| CallSensitivityFlow.cs:35:41:35:41 | o : Object | semmle.label | o : Object |
| CallSensitivityFlow.cs:39:18:39:18 | [cond (line 35): true] access to parameter o | semmle.label | [cond (line 35): true] access to parameter o |
| CallSensitivityFlow.cs:39:18:39:18 | access to parameter o | semmle.label | access to parameter o |
| CallSensitivityFlow.cs:43:45:43:45 | o : Object | semmle.label | o : Object |
| CallSensitivityFlow.cs:45:16:45:17 | access to local variable o1 : Object | semmle.label | access to local variable o1 : Object |
| CallSensitivityFlow.cs:49:20:49:22 | access to local variable tmp : Object | semmle.label | access to local variable tmp : Object |
@@ -147,7 +147,7 @@ subpaths
#select
| CallSensitivityFlow.cs:78:24:78:35 | object creation of type Object : Object | CallSensitivityFlow.cs:78:24:78:35 | object creation of type Object : Object | CallSensitivityFlow.cs:23:18:23:18 | access to parameter o | $@ | CallSensitivityFlow.cs:23:18:23:18 | access to parameter o | access to parameter o |
| CallSensitivityFlow.cs:79:25:79:36 | object creation of type Object : Object | CallSensitivityFlow.cs:79:25:79:36 | object creation of type Object : Object | CallSensitivityFlow.cs:31:18:31:18 | access to parameter o | $@ | CallSensitivityFlow.cs:31:18:31:18 | access to parameter o | access to parameter o |
| CallSensitivityFlow.cs:80:26:80:37 | object creation of type Object : Object | CallSensitivityFlow.cs:80:26:80:37 | object creation of type Object : Object | CallSensitivityFlow.cs:39:18:39:18 | [cond (line 35): true] access to parameter o | $@ | CallSensitivityFlow.cs:39:18:39:18 | [cond (line 35): true] access to parameter o | [cond (line 35): true] access to parameter o |
| CallSensitivityFlow.cs:80:26:80:37 | object creation of type Object : Object | CallSensitivityFlow.cs:80:26:80:37 | object creation of type Object : Object | CallSensitivityFlow.cs:39:18:39:18 | access to parameter o | $@ | CallSensitivityFlow.cs:39:18:39:18 | access to parameter o | access to parameter o |
| CallSensitivityFlow.cs:81:30:81:41 | object creation of type Object : Object | CallSensitivityFlow.cs:81:30:81:41 | object creation of type Object : Object | CallSensitivityFlow.cs:53:14:53:15 | access to local variable o3 | $@ | CallSensitivityFlow.cs:53:14:53:15 | access to local variable o3 | access to local variable o3 |
| CallSensitivityFlow.cs:82:31:82:42 | object creation of type Object : Object | CallSensitivityFlow.cs:82:31:82:42 | object creation of type Object : Object | CallSensitivityFlow.cs:66:14:66:15 | access to local variable o3 | $@ | CallSensitivityFlow.cs:66:14:66:15 | access to local variable o3 | access to local variable o3 |
| CallSensitivityFlow.cs:83:31:83:42 | object creation of type Object : Object | CallSensitivityFlow.cs:83:31:83:42 | object creation of type Object : Object | CallSensitivityFlow.cs:66:14:66:15 | access to local variable o3 | $@ | CallSensitivityFlow.cs:66:14:66:15 | access to local variable o3 | access to local variable o3 |
@@ -156,7 +156,7 @@ subpaths
| CallSensitivityFlow.cs:87:31:87:42 | object creation of type Object : Object | CallSensitivityFlow.cs:87:31:87:42 | object creation of type Object : Object | CallSensitivityFlow.cs:66:14:66:15 | access to local variable o3 | $@ | CallSensitivityFlow.cs:66:14:66:15 | access to local variable o3 | access to local variable o3 |
| CallSensitivityFlow.cs:101:24:101:35 | object creation of type Object : Object | CallSensitivityFlow.cs:101:24:101:35 | object creation of type Object : Object | CallSensitivityFlow.cs:23:18:23:18 | access to parameter o | $@ | CallSensitivityFlow.cs:23:18:23:18 | access to parameter o | access to parameter o |
| CallSensitivityFlow.cs:102:25:102:36 | object creation of type Object : Object | CallSensitivityFlow.cs:102:25:102:36 | object creation of type Object : Object | CallSensitivityFlow.cs:31:18:31:18 | access to parameter o | $@ | CallSensitivityFlow.cs:31:18:31:18 | access to parameter o | access to parameter o |
| CallSensitivityFlow.cs:103:26:103:37 | object creation of type Object : Object | CallSensitivityFlow.cs:103:26:103:37 | object creation of type Object : Object | CallSensitivityFlow.cs:39:18:39:18 | [cond (line 35): true] access to parameter o | $@ | CallSensitivityFlow.cs:39:18:39:18 | [cond (line 35): true] access to parameter o | [cond (line 35): true] access to parameter o |
| CallSensitivityFlow.cs:103:26:103:37 | object creation of type Object : Object | CallSensitivityFlow.cs:103:26:103:37 | object creation of type Object : Object | CallSensitivityFlow.cs:39:18:39:18 | access to parameter o | $@ | CallSensitivityFlow.cs:39:18:39:18 | access to parameter o | access to parameter o |
| CallSensitivityFlow.cs:104:30:104:41 | object creation of type Object : Object | CallSensitivityFlow.cs:104:30:104:41 | object creation of type Object : Object | CallSensitivityFlow.cs:53:14:53:15 | access to local variable o3 | $@ | CallSensitivityFlow.cs:53:14:53:15 | access to local variable o3 | access to local variable o3 |
| CallSensitivityFlow.cs:105:26:105:37 | object creation of type Object : Object | CallSensitivityFlow.cs:105:26:105:37 | object creation of type Object : Object | CallSensitivityFlow.cs:105:14:105:41 | call to method FlowThrough | $@ | CallSensitivityFlow.cs:105:14:105:41 | call to method FlowThrough | call to method FlowThrough |
| CallSensitivityFlow.cs:117:26:117:37 | object creation of type Object : Object | CallSensitivityFlow.cs:117:26:117:37 | object creation of type Object : Object | CallSensitivityFlow.cs:128:22:128:22 | access to parameter o | $@ | CallSensitivityFlow.cs:128:22:128:22 | access to parameter o | access to parameter o |

View File

@@ -84,13 +84,12 @@
| GlobalDataFlow.cs:547:15:547:21 | access to field field |
| MultiImplementationA.cs:7:39:7:39 | access to parameter x |
| MultiImplementationB.cs:5:39:5:39 | access to parameter x |
| Splitting.cs:9:15:9:15 | [b (line 3): false] access to local variable x |
| Splitting.cs:9:15:9:15 | [b (line 3): true] access to local variable x |
| Splitting.cs:9:15:9:15 | access to local variable x |
| Splitting.cs:11:19:11:19 | access to local variable x |
| Splitting.cs:21:21:21:33 | call to method Return<String> |
| Splitting.cs:32:15:32:15 | [b (line 24): false] access to local variable x |
| Splitting.cs:32:15:32:15 | [b (line 24): true] access to local variable x |
| Splitting.cs:32:15:32:15 | access to local variable x |
| Splitting.cs:34:19:34:19 | access to local variable x |
| Splitting.cs:41:19:41:19 | access to local variable s |
| Splitting.cs:43:19:43:19 | access to local variable s |
| Splitting.cs:50:19:50:19 | access to local variable s |
| Splitting.cs:52:19:52:19 | access to local variable s |

View File

@@ -464,17 +464,12 @@ edges
| MultiImplementationA.cs:7:27:7:27 | x : String | MultiImplementationA.cs:7:39:7:39 | access to parameter x | provenance | |
| MultiImplementationB.cs:3:28:3:41 | "taint source" : String | MultiImplementationB.cs:5:27:5:27 | x : String | provenance | |
| MultiImplementationB.cs:5:27:5:27 | x : String | MultiImplementationB.cs:5:39:5:39 | access to parameter x | provenance | |
| Splitting.cs:3:28:3:34 | tainted : String | Splitting.cs:8:24:8:30 | [b (line 3): false] access to parameter tainted : String | provenance | |
| Splitting.cs:3:28:3:34 | tainted : String | Splitting.cs:8:24:8:30 | [b (line 3): true] access to parameter tainted : String | provenance | |
| Splitting.cs:8:13:8:13 | access to local variable x : String | Splitting.cs:9:15:9:15 | [b (line 3): false] access to local variable x | provenance | |
| Splitting.cs:8:13:8:13 | access to local variable x : String | Splitting.cs:9:15:9:15 | [b (line 3): true] access to local variable x | provenance | |
| Splitting.cs:3:28:3:34 | tainted : String | Splitting.cs:8:24:8:30 | access to parameter tainted : String | provenance | |
| Splitting.cs:8:13:8:13 | access to local variable x : String | Splitting.cs:9:15:9:15 | access to local variable x | provenance | |
| Splitting.cs:8:13:8:13 | access to local variable x : String | Splitting.cs:11:19:11:19 | access to local variable x | provenance | |
| Splitting.cs:8:17:8:31 | [b (line 3): false] call to method Return<String> : String | Splitting.cs:8:13:8:13 | access to local variable x : String | provenance | |
| Splitting.cs:8:17:8:31 | [b (line 3): true] call to method Return<String> : String | Splitting.cs:8:13:8:13 | access to local variable x : String | provenance | |
| Splitting.cs:8:24:8:30 | [b (line 3): false] access to parameter tainted : String | Splitting.cs:8:17:8:31 | [b (line 3): false] call to method Return<String> : String | provenance | |
| Splitting.cs:8:24:8:30 | [b (line 3): false] access to parameter tainted : String | Splitting.cs:16:26:16:26 | x : String | provenance | |
| Splitting.cs:8:24:8:30 | [b (line 3): true] access to parameter tainted : String | Splitting.cs:8:17:8:31 | [b (line 3): true] call to method Return<String> : String | provenance | |
| Splitting.cs:8:24:8:30 | [b (line 3): true] access to parameter tainted : String | Splitting.cs:16:26:16:26 | x : String | provenance | |
| Splitting.cs:8:17:8:31 | call to method Return<String> : String | Splitting.cs:8:13:8:13 | access to local variable x : String | provenance | |
| Splitting.cs:8:24:8:30 | access to parameter tainted : String | Splitting.cs:8:17:8:31 | call to method Return<String> : String | provenance | |
| Splitting.cs:8:24:8:30 | access to parameter tainted : String | Splitting.cs:16:26:16:26 | x : String | provenance | |
| Splitting.cs:16:26:16:26 | x : String | Splitting.cs:16:32:16:32 | access to parameter x : String | provenance | |
| Splitting.cs:18:24:18:24 | s : String | Splitting.cs:20:29:20:29 | access to parameter s : String | provenance | |
| Splitting.cs:20:29:20:29 | access to parameter s : String | Splitting.cs:16:26:16:26 | x : String | provenance | |
@@ -482,23 +477,17 @@ edges
| Splitting.cs:21:9:21:11 | value : String | Splitting.cs:21:28:21:32 | access to parameter value : String | provenance | |
| Splitting.cs:21:28:21:32 | access to parameter value : String | Splitting.cs:16:26:16:26 | x : String | provenance | |
| Splitting.cs:21:28:21:32 | access to parameter value : String | Splitting.cs:21:21:21:33 | call to method Return<String> | provenance | |
| Splitting.cs:24:28:24:34 | tainted : String | Splitting.cs:30:17:30:23 | [b (line 24): false] access to parameter tainted : String | provenance | |
| Splitting.cs:24:28:24:34 | tainted : String | Splitting.cs:30:17:30:23 | [b (line 24): true] access to parameter tainted : String | provenance | |
| Splitting.cs:24:28:24:34 | tainted : String | Splitting.cs:31:19:31:25 | [b (line 24): false] access to parameter tainted : String | provenance | |
| Splitting.cs:24:28:24:34 | tainted : String | Splitting.cs:31:19:31:25 | [b (line 24): true] access to parameter tainted : String | provenance | |
| Splitting.cs:30:17:30:23 | [b (line 24): false] access to parameter tainted : String | Splitting.cs:21:9:21:11 | value : String | provenance | |
| Splitting.cs:30:17:30:23 | [b (line 24): true] access to parameter tainted : String | Splitting.cs:21:9:21:11 | value : String | provenance | |
| Splitting.cs:31:13:31:13 | access to local variable x : String | Splitting.cs:32:15:32:15 | [b (line 24): false] access to local variable x | provenance | |
| Splitting.cs:31:13:31:13 | access to local variable x : String | Splitting.cs:32:15:32:15 | [b (line 24): true] access to local variable x | provenance | |
| Splitting.cs:24:28:24:34 | tainted : String | Splitting.cs:30:17:30:23 | access to parameter tainted : String | provenance | |
| Splitting.cs:24:28:24:34 | tainted : String | Splitting.cs:31:19:31:25 | access to parameter tainted : String | provenance | |
| Splitting.cs:30:17:30:23 | access to parameter tainted : String | Splitting.cs:21:9:21:11 | value : String | provenance | |
| Splitting.cs:31:13:31:13 | access to local variable x : String | Splitting.cs:32:15:32:15 | access to local variable x | provenance | |
| Splitting.cs:31:13:31:13 | access to local variable x : String | Splitting.cs:34:19:34:19 | access to local variable x | provenance | |
| Splitting.cs:31:17:31:26 | [b (line 24): false] dynamic access to element : String | Splitting.cs:31:13:31:13 | access to local variable x : String | provenance | |
| Splitting.cs:31:17:31:26 | [b (line 24): true] dynamic access to element : String | Splitting.cs:31:13:31:13 | access to local variable x : String | provenance | |
| Splitting.cs:31:19:31:25 | [b (line 24): false] access to parameter tainted : String | Splitting.cs:18:24:18:24 | s : String | provenance | |
| Splitting.cs:31:19:31:25 | [b (line 24): false] access to parameter tainted : String | Splitting.cs:31:17:31:26 | [b (line 24): false] dynamic access to element : String | provenance | |
| Splitting.cs:31:19:31:25 | [b (line 24): true] access to parameter tainted : String | Splitting.cs:18:24:18:24 | s : String | provenance | |
| Splitting.cs:31:19:31:25 | [b (line 24): true] access to parameter tainted : String | Splitting.cs:31:17:31:26 | [b (line 24): true] dynamic access to element : String | provenance | |
| Splitting.cs:31:17:31:26 | dynamic access to element : String | Splitting.cs:31:13:31:13 | access to local variable x : String | provenance | |
| Splitting.cs:31:19:31:25 | access to parameter tainted : String | Splitting.cs:18:24:18:24 | s : String | provenance | |
| Splitting.cs:31:19:31:25 | access to parameter tainted : String | Splitting.cs:31:17:31:26 | dynamic access to element : String | provenance | |
| Splitting.cs:39:13:39:13 | access to local variable s : String | Splitting.cs:41:19:41:19 | access to local variable s | provenance | |
| Splitting.cs:39:21:39:34 | [b (line 37): true] "taint source" : String | Splitting.cs:39:13:39:13 | access to local variable s : String | provenance | |
| Splitting.cs:39:13:39:13 | access to local variable s : String | Splitting.cs:43:19:43:19 | access to local variable s | provenance | |
| Splitting.cs:39:21:39:34 | "taint source" : String | Splitting.cs:39:13:39:13 | access to local variable s : String | provenance | |
| Splitting.cs:48:13:48:13 | access to local variable s : String | Splitting.cs:50:19:50:19 | access to local variable s | provenance | |
| Splitting.cs:48:13:48:13 | access to local variable s : String | Splitting.cs:52:19:52:19 | access to local variable s | provenance | |
| Splitting.cs:48:36:48:49 | "taint source" : String | Splitting.cs:48:13:48:13 | access to local variable s : String | provenance | |
@@ -919,13 +908,9 @@ nodes
| MultiImplementationB.cs:5:39:5:39 | access to parameter x | semmle.label | access to parameter x |
| Splitting.cs:3:28:3:34 | tainted : String | semmle.label | tainted : String |
| Splitting.cs:8:13:8:13 | access to local variable x : String | semmle.label | access to local variable x : String |
| Splitting.cs:8:13:8:13 | access to local variable x : String | semmle.label | access to local variable x : String |
| Splitting.cs:8:17:8:31 | [b (line 3): false] call to method Return<String> : String | semmle.label | [b (line 3): false] call to method Return<String> : String |
| Splitting.cs:8:17:8:31 | [b (line 3): true] call to method Return<String> : String | semmle.label | [b (line 3): true] call to method Return<String> : String |
| Splitting.cs:8:24:8:30 | [b (line 3): false] access to parameter tainted : String | semmle.label | [b (line 3): false] access to parameter tainted : String |
| Splitting.cs:8:24:8:30 | [b (line 3): true] access to parameter tainted : String | semmle.label | [b (line 3): true] access to parameter tainted : String |
| Splitting.cs:9:15:9:15 | [b (line 3): false] access to local variable x | semmle.label | [b (line 3): false] access to local variable x |
| Splitting.cs:9:15:9:15 | [b (line 3): true] access to local variable x | semmle.label | [b (line 3): true] access to local variable x |
| Splitting.cs:8:17:8:31 | call to method Return<String> : String | semmle.label | call to method Return<String> : String |
| Splitting.cs:8:24:8:30 | access to parameter tainted : String | semmle.label | access to parameter tainted : String |
| Splitting.cs:9:15:9:15 | access to local variable x | semmle.label | access to local variable x |
| Splitting.cs:11:19:11:19 | access to local variable x | semmle.label | access to local variable x |
| Splitting.cs:16:26:16:26 | x : String | semmle.label | x : String |
| Splitting.cs:16:32:16:32 | access to parameter x : String | semmle.label | access to parameter x : String |
@@ -936,20 +921,16 @@ nodes
| Splitting.cs:21:21:21:33 | call to method Return<String> | semmle.label | call to method Return<String> |
| Splitting.cs:21:28:21:32 | access to parameter value : String | semmle.label | access to parameter value : String |
| Splitting.cs:24:28:24:34 | tainted : String | semmle.label | tainted : String |
| Splitting.cs:30:17:30:23 | [b (line 24): false] access to parameter tainted : String | semmle.label | [b (line 24): false] access to parameter tainted : String |
| Splitting.cs:30:17:30:23 | [b (line 24): true] access to parameter tainted : String | semmle.label | [b (line 24): true] access to parameter tainted : String |
| Splitting.cs:30:17:30:23 | access to parameter tainted : String | semmle.label | access to parameter tainted : String |
| Splitting.cs:31:13:31:13 | access to local variable x : String | semmle.label | access to local variable x : String |
| Splitting.cs:31:13:31:13 | access to local variable x : String | semmle.label | access to local variable x : String |
| Splitting.cs:31:17:31:26 | [b (line 24): false] dynamic access to element : String | semmle.label | [b (line 24): false] dynamic access to element : String |
| Splitting.cs:31:17:31:26 | [b (line 24): true] dynamic access to element : String | semmle.label | [b (line 24): true] dynamic access to element : String |
| Splitting.cs:31:19:31:25 | [b (line 24): false] access to parameter tainted : String | semmle.label | [b (line 24): false] access to parameter tainted : String |
| Splitting.cs:31:19:31:25 | [b (line 24): true] access to parameter tainted : String | semmle.label | [b (line 24): true] access to parameter tainted : String |
| Splitting.cs:32:15:32:15 | [b (line 24): false] access to local variable x | semmle.label | [b (line 24): false] access to local variable x |
| Splitting.cs:32:15:32:15 | [b (line 24): true] access to local variable x | semmle.label | [b (line 24): true] access to local variable x |
| Splitting.cs:31:17:31:26 | dynamic access to element : String | semmle.label | dynamic access to element : String |
| Splitting.cs:31:19:31:25 | access to parameter tainted : String | semmle.label | access to parameter tainted : String |
| Splitting.cs:32:15:32:15 | access to local variable x | semmle.label | access to local variable x |
| Splitting.cs:34:19:34:19 | access to local variable x | semmle.label | access to local variable x |
| Splitting.cs:39:13:39:13 | access to local variable s : String | semmle.label | access to local variable s : String |
| Splitting.cs:39:21:39:34 | [b (line 37): true] "taint source" : String | semmle.label | [b (line 37): true] "taint source" : String |
| Splitting.cs:39:21:39:34 | "taint source" : String | semmle.label | "taint source" : String |
| Splitting.cs:41:19:41:19 | access to local variable s | semmle.label | access to local variable s |
| Splitting.cs:43:19:43:19 | access to local variable s | semmle.label | access to local variable s |
| Splitting.cs:48:13:48:13 | access to local variable s : String | semmle.label | access to local variable s : String |
| Splitting.cs:48:36:48:49 | "taint source" : String | semmle.label | "taint source" : String |
| Splitting.cs:50:19:50:19 | access to local variable s | semmle.label | access to local variable s |
@@ -984,17 +965,11 @@ subpaths
| GlobalDataFlow.cs:389:18:389:18 | access to parameter x : String | GlobalDataFlow.cs:298:26:298:26 | x : String | GlobalDataFlow.cs:301:16:301:41 | ... ? ... : ... : String | GlobalDataFlow.cs:389:16:389:19 | delegate call : String |
| GlobalDataFlow.cs:389:18:389:18 | access to parameter x : String | GlobalDataFlow.cs:300:27:300:28 | x0 : String | GlobalDataFlow.cs:300:33:300:34 | access to parameter x0 : String | GlobalDataFlow.cs:389:16:389:19 | delegate call : String |
| GlobalDataFlow.cs:558:46:558:46 | access to local variable x : String | GlobalDataFlow.cs:81:79:81:79 | x : String | GlobalDataFlow.cs:81:84:81:84 | access to parameter x : String | GlobalDataFlow.cs:558:44:558:47 | delegate call : String |
| Splitting.cs:8:24:8:30 | [b (line 3): false] access to parameter tainted : String | Splitting.cs:16:26:16:26 | x : String | Splitting.cs:16:32:16:32 | access to parameter x : String | Splitting.cs:8:17:8:31 | [b (line 3): false] call to method Return<String> : String |
| Splitting.cs:8:24:8:30 | [b (line 3): true] access to parameter tainted : String | Splitting.cs:16:26:16:26 | x : String | Splitting.cs:16:32:16:32 | access to parameter x : String | Splitting.cs:8:17:8:31 | [b (line 3): true] call to method Return<String> : String |
| Splitting.cs:8:24:8:30 | access to parameter tainted : String | Splitting.cs:16:26:16:26 | x : String | Splitting.cs:16:32:16:32 | access to parameter x : String | Splitting.cs:8:17:8:31 | call to method Return<String> : String |
| Splitting.cs:20:29:20:29 | access to parameter s : String | Splitting.cs:16:26:16:26 | x : String | Splitting.cs:16:32:16:32 | access to parameter x : String | Splitting.cs:20:22:20:30 | call to method Return<String> : String |
| Splitting.cs:21:28:21:32 | access to parameter value : String | Splitting.cs:16:26:16:26 | x : String | Splitting.cs:16:32:16:32 | access to parameter x : String | Splitting.cs:21:21:21:33 | call to method Return<String> |
| Splitting.cs:31:19:31:25 | [b (line 24): false] access to parameter tainted : String | Splitting.cs:18:24:18:24 | s : String | Splitting.cs:20:22:20:30 | call to method Return<String> : String | Splitting.cs:31:17:31:26 | [b (line 24): false] dynamic access to element : String |
| Splitting.cs:31:19:31:25 | [b (line 24): true] access to parameter tainted : String | Splitting.cs:18:24:18:24 | s : String | Splitting.cs:20:22:20:30 | call to method Return<String> : String | Splitting.cs:31:17:31:26 | [b (line 24): true] dynamic access to element : String |
| Splitting.cs:31:19:31:25 | access to parameter tainted : String | Splitting.cs:18:24:18:24 | s : String | Splitting.cs:20:22:20:30 | call to method Return<String> : String | Splitting.cs:31:17:31:26 | dynamic access to element : String |
#select
| Splitting.cs:32:15:32:15 | [b (line 24): false] access to local variable x | Splitting.cs:24:28:24:34 | tainted : String | Splitting.cs:32:15:32:15 | [b (line 24): false] access to local variable x | [b (line 24): false] access to local variable x |
| Splitting.cs:32:15:32:15 | [b (line 24): true] access to local variable x | Splitting.cs:24:28:24:34 | tainted : String | Splitting.cs:32:15:32:15 | [b (line 24): true] access to local variable x | [b (line 24): true] access to local variable x |
| Splitting.cs:9:15:9:15 | [b (line 3): false] access to local variable x | Splitting.cs:3:28:3:34 | tainted : String | Splitting.cs:9:15:9:15 | [b (line 3): false] access to local variable x | [b (line 3): false] access to local variable x |
| Splitting.cs:9:15:9:15 | [b (line 3): true] access to local variable x | Splitting.cs:3:28:3:34 | tainted : String | Splitting.cs:9:15:9:15 | [b (line 3): true] access to local variable x | [b (line 3): true] access to local variable x |
| Capture.cs:246:19:246:25 | access to field Field | Capture.cs:242:19:242:32 | "taint source" : String | Capture.cs:246:19:246:25 | access to field Field | access to field Field |
| Capture.cs:251:15:251:21 | access to field Field | Capture.cs:242:19:242:32 | "taint source" : String | Capture.cs:251:15:251:21 | access to field Field | access to field Field |
| Capture.cs:251:15:251:21 | access to field Field | Capture.cs:247:23:247:36 | "taint source" : String | Capture.cs:251:15:251:21 | access to field Field | access to field Field |
@@ -1016,7 +991,8 @@ subpaths
| GlobalDataFlow.cs:533:15:533:21 | access to field field | GlobalDataFlow.cs:483:20:483:33 | "taint source" : String | GlobalDataFlow.cs:533:15:533:21 | access to field field | access to field field |
| GlobalDataFlow.cs:539:15:539:22 | access to field field | GlobalDataFlow.cs:483:20:483:33 | "taint source" : String | GlobalDataFlow.cs:539:15:539:22 | access to field field | access to field field |
| GlobalDataFlow.cs:547:15:547:21 | access to field field | GlobalDataFlow.cs:483:20:483:33 | "taint source" : String | GlobalDataFlow.cs:547:15:547:21 | access to field field | access to field field |
| Splitting.cs:41:19:41:19 | access to local variable s | Splitting.cs:39:21:39:34 | [b (line 37): true] "taint source" : String | Splitting.cs:41:19:41:19 | access to local variable s | access to local variable s |
| Splitting.cs:41:19:41:19 | access to local variable s | Splitting.cs:39:21:39:34 | "taint source" : String | Splitting.cs:41:19:41:19 | access to local variable s | access to local variable s |
| Splitting.cs:43:19:43:19 | access to local variable s | Splitting.cs:39:21:39:34 | "taint source" : String | Splitting.cs:43:19:43:19 | access to local variable s | access to local variable s |
| Splitting.cs:50:19:50:19 | access to local variable s | Splitting.cs:48:36:48:49 | "taint source" : String | Splitting.cs:50:19:50:19 | access to local variable s | access to local variable s |
| Splitting.cs:52:19:52:19 | access to local variable s | Splitting.cs:48:36:48:49 | "taint source" : String | Splitting.cs:52:19:52:19 | access to local variable s | access to local variable s |
| GlobalDataFlow.cs:72:15:72:19 | access to local variable sink0 | GlobalDataFlow.cs:18:27:18:40 | "taint source" : String | GlobalDataFlow.cs:72:15:72:19 | access to local variable sink0 | access to local variable sink0 |
@@ -1068,7 +1044,9 @@ subpaths
| Capture.cs:319:19:319:19 | access to local variable x | Capture.cs:318:17:318:30 | "taint source" : String | Capture.cs:319:19:319:19 | access to local variable x | access to local variable x |
| Capture.cs:330:47:330:47 | access to local variable x | Capture.cs:328:17:328:30 | "taint source" : String | Capture.cs:330:47:330:47 | access to local variable x | access to local variable x |
| Capture.cs:341:45:341:45 | access to local variable x | Capture.cs:339:17:339:30 | "taint source" : String | Capture.cs:341:45:341:45 | access to local variable x | access to local variable x |
| Splitting.cs:9:15:9:15 | access to local variable x | Splitting.cs:3:28:3:34 | tainted : String | Splitting.cs:9:15:9:15 | access to local variable x | access to local variable x |
| Splitting.cs:11:19:11:19 | access to local variable x | Splitting.cs:3:28:3:34 | tainted : String | Splitting.cs:11:19:11:19 | access to local variable x | access to local variable x |
| Splitting.cs:32:15:32:15 | access to local variable x | Splitting.cs:24:28:24:34 | tainted : String | Splitting.cs:32:15:32:15 | access to local variable x | access to local variable x |
| Splitting.cs:34:19:34:19 | access to local variable x | Splitting.cs:24:28:24:34 | tainted : String | Splitting.cs:34:19:34:19 | access to local variable x | access to local variable x |
| Capture.cs:206:19:206:19 | access to parameter s | Capture.cs:211:21:211:34 | "taint source" : String | Capture.cs:206:19:206:19 | access to parameter s | access to parameter s |
| Capture.cs:217:19:217:19 | access to parameter s | Capture.cs:221:21:221:34 | "taint source" : String | Capture.cs:217:19:217:19 | access to parameter s | access to parameter s |

View File

@@ -184,16 +184,12 @@
| MultiImplementationA.cs:3:7:3:15 | call to constructor Object | normal | MultiImplementationA.cs:3:7:3:15 | call to constructor Object |
| MultiImplementationB.cs:1:7:1:15 | call to constructor Object | normal | MultiImplementationB.cs:1:7:1:15 | call to constructor Object |
| Splitting.cs:1:7:1:15 | call to constructor Object | normal | Splitting.cs:1:7:1:15 | call to constructor Object |
| Splitting.cs:8:17:8:31 | [b (line 3): false] call to method Return<String> | normal | Splitting.cs:8:17:8:31 | [b (line 3): false] call to method Return<String> |
| Splitting.cs:8:17:8:31 | [b (line 3): true] call to method Return<String> | normal | Splitting.cs:8:17:8:31 | [b (line 3): true] call to method Return<String> |
| Splitting.cs:8:17:8:31 | call to method Return<String> | normal | Splitting.cs:8:17:8:31 | call to method Return<String> |
| Splitting.cs:20:22:20:30 | call to method Return<String> | normal | Splitting.cs:20:22:20:30 | call to method Return<String> |
| Splitting.cs:21:21:21:33 | call to method Return<String> | normal | Splitting.cs:21:21:21:33 | call to method Return<String> |
| Splitting.cs:30:9:30:13 | [b (line 24): false] dynamic access to element | normal | Splitting.cs:30:9:30:13 | [b (line 24): false] dynamic access to element |
| Splitting.cs:30:9:30:13 | [b (line 24): true] dynamic access to element | normal | Splitting.cs:30:9:30:13 | [b (line 24): true] dynamic access to element |
| Splitting.cs:31:17:31:26 | [b (line 24): false] dynamic access to element | normal | Splitting.cs:31:17:31:26 | [b (line 24): false] dynamic access to element |
| Splitting.cs:31:17:31:26 | [b (line 24): true] dynamic access to element | normal | Splitting.cs:31:17:31:26 | [b (line 24): true] dynamic access to element |
| Splitting.cs:32:9:32:16 | [b (line 24): false] dynamic call to method Check | normal | Splitting.cs:32:9:32:16 | [b (line 24): false] dynamic call to method Check |
| Splitting.cs:32:9:32:16 | [b (line 24): true] dynamic call to method Check | normal | Splitting.cs:32:9:32:16 | [b (line 24): true] dynamic call to method Check |
| Splitting.cs:30:9:30:13 | dynamic access to element | normal | Splitting.cs:30:9:30:13 | dynamic access to element |
| Splitting.cs:31:17:31:26 | dynamic access to element | normal | Splitting.cs:31:17:31:26 | dynamic access to element |
| Splitting.cs:32:9:32:16 | dynamic call to method Check | normal | Splitting.cs:32:9:32:16 | dynamic call to method Check |
| Splitting.cs:34:13:34:20 | dynamic call to method Check | normal | Splitting.cs:34:13:34:20 | dynamic call to method Check |
| This.cs:7:5:7:8 | call to constructor Object | normal | This.cs:7:5:7:8 | call to constructor Object |
| This.cs:17:9:17:18 | object creation of type This | normal | This.cs:17:9:17:18 | object creation of type This |

View File

@@ -94,13 +94,12 @@
| GlobalDataFlowStringBuilder.cs:50:15:50:19 | access to local variable sink3 |
| MultiImplementationA.cs:7:39:7:39 | access to parameter x |
| MultiImplementationB.cs:5:39:5:39 | access to parameter x |
| Splitting.cs:9:15:9:15 | [b (line 3): false] access to local variable x |
| Splitting.cs:9:15:9:15 | [b (line 3): true] access to local variable x |
| Splitting.cs:9:15:9:15 | access to local variable x |
| Splitting.cs:11:19:11:19 | access to local variable x |
| Splitting.cs:21:21:21:33 | call to method Return<String> |
| Splitting.cs:32:15:32:15 | [b (line 24): false] access to local variable x |
| Splitting.cs:32:15:32:15 | [b (line 24): true] access to local variable x |
| Splitting.cs:32:15:32:15 | access to local variable x |
| Splitting.cs:34:19:34:19 | access to local variable x |
| Splitting.cs:41:19:41:19 | access to local variable s |
| Splitting.cs:43:19:43:19 | access to local variable s |
| Splitting.cs:50:19:50:19 | access to local variable s |
| Splitting.cs:52:19:52:19 | access to local variable s |

View File

@@ -536,17 +536,12 @@ edges
| MultiImplementationA.cs:7:27:7:27 | x : String | MultiImplementationA.cs:7:39:7:39 | access to parameter x | provenance | |
| MultiImplementationB.cs:3:28:3:41 | "taint source" : String | MultiImplementationB.cs:5:27:5:27 | x : String | provenance | |
| MultiImplementationB.cs:5:27:5:27 | x : String | MultiImplementationB.cs:5:39:5:39 | access to parameter x | provenance | |
| Splitting.cs:3:28:3:34 | tainted : String | Splitting.cs:8:24:8:30 | [b (line 3): false] access to parameter tainted : String | provenance | |
| Splitting.cs:3:28:3:34 | tainted : String | Splitting.cs:8:24:8:30 | [b (line 3): true] access to parameter tainted : String | provenance | |
| Splitting.cs:8:13:8:13 | access to local variable x : String | Splitting.cs:9:15:9:15 | [b (line 3): false] access to local variable x | provenance | |
| Splitting.cs:8:13:8:13 | access to local variable x : String | Splitting.cs:9:15:9:15 | [b (line 3): true] access to local variable x | provenance | |
| Splitting.cs:3:28:3:34 | tainted : String | Splitting.cs:8:24:8:30 | access to parameter tainted : String | provenance | |
| Splitting.cs:8:13:8:13 | access to local variable x : String | Splitting.cs:9:15:9:15 | access to local variable x | provenance | |
| Splitting.cs:8:13:8:13 | access to local variable x : String | Splitting.cs:11:19:11:19 | access to local variable x | provenance | |
| Splitting.cs:8:17:8:31 | [b (line 3): false] call to method Return<String> : String | Splitting.cs:8:13:8:13 | access to local variable x : String | provenance | |
| Splitting.cs:8:17:8:31 | [b (line 3): true] call to method Return<String> : String | Splitting.cs:8:13:8:13 | access to local variable x : String | provenance | |
| Splitting.cs:8:24:8:30 | [b (line 3): false] access to parameter tainted : String | Splitting.cs:8:17:8:31 | [b (line 3): false] call to method Return<String> : String | provenance | |
| Splitting.cs:8:24:8:30 | [b (line 3): false] access to parameter tainted : String | Splitting.cs:16:26:16:26 | x : String | provenance | |
| Splitting.cs:8:24:8:30 | [b (line 3): true] access to parameter tainted : String | Splitting.cs:8:17:8:31 | [b (line 3): true] call to method Return<String> : String | provenance | |
| Splitting.cs:8:24:8:30 | [b (line 3): true] access to parameter tainted : String | Splitting.cs:16:26:16:26 | x : String | provenance | |
| Splitting.cs:8:17:8:31 | call to method Return<String> : String | Splitting.cs:8:13:8:13 | access to local variable x : String | provenance | |
| Splitting.cs:8:24:8:30 | access to parameter tainted : String | Splitting.cs:8:17:8:31 | call to method Return<String> : String | provenance | |
| Splitting.cs:8:24:8:30 | access to parameter tainted : String | Splitting.cs:16:26:16:26 | x : String | provenance | |
| Splitting.cs:16:26:16:26 | x : String | Splitting.cs:16:32:16:32 | access to parameter x : String | provenance | |
| Splitting.cs:18:24:18:24 | s : String | Splitting.cs:20:29:20:29 | access to parameter s : String | provenance | |
| Splitting.cs:20:29:20:29 | access to parameter s : String | Splitting.cs:16:26:16:26 | x : String | provenance | |
@@ -554,23 +549,17 @@ edges
| Splitting.cs:21:9:21:11 | value : String | Splitting.cs:21:28:21:32 | access to parameter value : String | provenance | |
| Splitting.cs:21:28:21:32 | access to parameter value : String | Splitting.cs:16:26:16:26 | x : String | provenance | |
| Splitting.cs:21:28:21:32 | access to parameter value : String | Splitting.cs:21:21:21:33 | call to method Return<String> | provenance | |
| Splitting.cs:24:28:24:34 | tainted : String | Splitting.cs:30:17:30:23 | [b (line 24): false] access to parameter tainted : String | provenance | |
| Splitting.cs:24:28:24:34 | tainted : String | Splitting.cs:30:17:30:23 | [b (line 24): true] access to parameter tainted : String | provenance | |
| Splitting.cs:24:28:24:34 | tainted : String | Splitting.cs:31:19:31:25 | [b (line 24): false] access to parameter tainted : String | provenance | |
| Splitting.cs:24:28:24:34 | tainted : String | Splitting.cs:31:19:31:25 | [b (line 24): true] access to parameter tainted : String | provenance | |
| Splitting.cs:30:17:30:23 | [b (line 24): false] access to parameter tainted : String | Splitting.cs:21:9:21:11 | value : String | provenance | |
| Splitting.cs:30:17:30:23 | [b (line 24): true] access to parameter tainted : String | Splitting.cs:21:9:21:11 | value : String | provenance | |
| Splitting.cs:31:13:31:13 | access to local variable x : String | Splitting.cs:32:15:32:15 | [b (line 24): false] access to local variable x | provenance | |
| Splitting.cs:31:13:31:13 | access to local variable x : String | Splitting.cs:32:15:32:15 | [b (line 24): true] access to local variable x | provenance | |
| Splitting.cs:24:28:24:34 | tainted : String | Splitting.cs:30:17:30:23 | access to parameter tainted : String | provenance | |
| Splitting.cs:24:28:24:34 | tainted : String | Splitting.cs:31:19:31:25 | access to parameter tainted : String | provenance | |
| Splitting.cs:30:17:30:23 | access to parameter tainted : String | Splitting.cs:21:9:21:11 | value : String | provenance | |
| Splitting.cs:31:13:31:13 | access to local variable x : String | Splitting.cs:32:15:32:15 | access to local variable x | provenance | |
| Splitting.cs:31:13:31:13 | access to local variable x : String | Splitting.cs:34:19:34:19 | access to local variable x | provenance | |
| Splitting.cs:31:17:31:26 | [b (line 24): false] dynamic access to element : String | Splitting.cs:31:13:31:13 | access to local variable x : String | provenance | |
| Splitting.cs:31:17:31:26 | [b (line 24): true] dynamic access to element : String | Splitting.cs:31:13:31:13 | access to local variable x : String | provenance | |
| Splitting.cs:31:19:31:25 | [b (line 24): false] access to parameter tainted : String | Splitting.cs:18:24:18:24 | s : String | provenance | |
| Splitting.cs:31:19:31:25 | [b (line 24): false] access to parameter tainted : String | Splitting.cs:31:17:31:26 | [b (line 24): false] dynamic access to element : String | provenance | |
| Splitting.cs:31:19:31:25 | [b (line 24): true] access to parameter tainted : String | Splitting.cs:18:24:18:24 | s : String | provenance | |
| Splitting.cs:31:19:31:25 | [b (line 24): true] access to parameter tainted : String | Splitting.cs:31:17:31:26 | [b (line 24): true] dynamic access to element : String | provenance | |
| Splitting.cs:31:17:31:26 | dynamic access to element : String | Splitting.cs:31:13:31:13 | access to local variable x : String | provenance | |
| Splitting.cs:31:19:31:25 | access to parameter tainted : String | Splitting.cs:18:24:18:24 | s : String | provenance | |
| Splitting.cs:31:19:31:25 | access to parameter tainted : String | Splitting.cs:31:17:31:26 | dynamic access to element : String | provenance | |
| Splitting.cs:39:13:39:13 | access to local variable s : String | Splitting.cs:41:19:41:19 | access to local variable s | provenance | |
| Splitting.cs:39:21:39:34 | [b (line 37): true] "taint source" : String | Splitting.cs:39:13:39:13 | access to local variable s : String | provenance | |
| Splitting.cs:39:13:39:13 | access to local variable s : String | Splitting.cs:43:19:43:19 | access to local variable s | provenance | |
| Splitting.cs:39:21:39:34 | "taint source" : String | Splitting.cs:39:13:39:13 | access to local variable s : String | provenance | |
| Splitting.cs:48:13:48:13 | access to local variable s : String | Splitting.cs:50:19:50:19 | access to local variable s | provenance | |
| Splitting.cs:48:13:48:13 | access to local variable s : String | Splitting.cs:52:19:52:19 | access to local variable s | provenance | |
| Splitting.cs:48:36:48:49 | "taint source" : String | Splitting.cs:48:13:48:13 | access to local variable s : String | provenance | |
@@ -1056,13 +1045,9 @@ nodes
| MultiImplementationB.cs:5:39:5:39 | access to parameter x | semmle.label | access to parameter x |
| Splitting.cs:3:28:3:34 | tainted : String | semmle.label | tainted : String |
| Splitting.cs:8:13:8:13 | access to local variable x : String | semmle.label | access to local variable x : String |
| Splitting.cs:8:13:8:13 | access to local variable x : String | semmle.label | access to local variable x : String |
| Splitting.cs:8:17:8:31 | [b (line 3): false] call to method Return<String> : String | semmle.label | [b (line 3): false] call to method Return<String> : String |
| Splitting.cs:8:17:8:31 | [b (line 3): true] call to method Return<String> : String | semmle.label | [b (line 3): true] call to method Return<String> : String |
| Splitting.cs:8:24:8:30 | [b (line 3): false] access to parameter tainted : String | semmle.label | [b (line 3): false] access to parameter tainted : String |
| Splitting.cs:8:24:8:30 | [b (line 3): true] access to parameter tainted : String | semmle.label | [b (line 3): true] access to parameter tainted : String |
| Splitting.cs:9:15:9:15 | [b (line 3): false] access to local variable x | semmle.label | [b (line 3): false] access to local variable x |
| Splitting.cs:9:15:9:15 | [b (line 3): true] access to local variable x | semmle.label | [b (line 3): true] access to local variable x |
| Splitting.cs:8:17:8:31 | call to method Return<String> : String | semmle.label | call to method Return<String> : String |
| Splitting.cs:8:24:8:30 | access to parameter tainted : String | semmle.label | access to parameter tainted : String |
| Splitting.cs:9:15:9:15 | access to local variable x | semmle.label | access to local variable x |
| Splitting.cs:11:19:11:19 | access to local variable x | semmle.label | access to local variable x |
| Splitting.cs:16:26:16:26 | x : String | semmle.label | x : String |
| Splitting.cs:16:32:16:32 | access to parameter x : String | semmle.label | access to parameter x : String |
@@ -1073,20 +1058,16 @@ nodes
| Splitting.cs:21:21:21:33 | call to method Return<String> | semmle.label | call to method Return<String> |
| Splitting.cs:21:28:21:32 | access to parameter value : String | semmle.label | access to parameter value : String |
| Splitting.cs:24:28:24:34 | tainted : String | semmle.label | tainted : String |
| Splitting.cs:30:17:30:23 | [b (line 24): false] access to parameter tainted : String | semmle.label | [b (line 24): false] access to parameter tainted : String |
| Splitting.cs:30:17:30:23 | [b (line 24): true] access to parameter tainted : String | semmle.label | [b (line 24): true] access to parameter tainted : String |
| Splitting.cs:30:17:30:23 | access to parameter tainted : String | semmle.label | access to parameter tainted : String |
| Splitting.cs:31:13:31:13 | access to local variable x : String | semmle.label | access to local variable x : String |
| Splitting.cs:31:13:31:13 | access to local variable x : String | semmle.label | access to local variable x : String |
| Splitting.cs:31:17:31:26 | [b (line 24): false] dynamic access to element : String | semmle.label | [b (line 24): false] dynamic access to element : String |
| Splitting.cs:31:17:31:26 | [b (line 24): true] dynamic access to element : String | semmle.label | [b (line 24): true] dynamic access to element : String |
| Splitting.cs:31:19:31:25 | [b (line 24): false] access to parameter tainted : String | semmle.label | [b (line 24): false] access to parameter tainted : String |
| Splitting.cs:31:19:31:25 | [b (line 24): true] access to parameter tainted : String | semmle.label | [b (line 24): true] access to parameter tainted : String |
| Splitting.cs:32:15:32:15 | [b (line 24): false] access to local variable x | semmle.label | [b (line 24): false] access to local variable x |
| Splitting.cs:32:15:32:15 | [b (line 24): true] access to local variable x | semmle.label | [b (line 24): true] access to local variable x |
| Splitting.cs:31:17:31:26 | dynamic access to element : String | semmle.label | dynamic access to element : String |
| Splitting.cs:31:19:31:25 | access to parameter tainted : String | semmle.label | access to parameter tainted : String |
| Splitting.cs:32:15:32:15 | access to local variable x | semmle.label | access to local variable x |
| Splitting.cs:34:19:34:19 | access to local variable x | semmle.label | access to local variable x |
| Splitting.cs:39:13:39:13 | access to local variable s : String | semmle.label | access to local variable s : String |
| Splitting.cs:39:21:39:34 | [b (line 37): true] "taint source" : String | semmle.label | [b (line 37): true] "taint source" : String |
| Splitting.cs:39:21:39:34 | "taint source" : String | semmle.label | "taint source" : String |
| Splitting.cs:41:19:41:19 | access to local variable s | semmle.label | access to local variable s |
| Splitting.cs:43:19:43:19 | access to local variable s | semmle.label | access to local variable s |
| Splitting.cs:48:13:48:13 | access to local variable s : String | semmle.label | access to local variable s : String |
| Splitting.cs:48:36:48:49 | "taint source" : String | semmle.label | "taint source" : String |
| Splitting.cs:50:19:50:19 | access to local variable s | semmle.label | access to local variable s |
@@ -1127,12 +1108,10 @@ subpaths
| GlobalDataFlow.cs:558:46:558:46 | access to local variable x : String | GlobalDataFlow.cs:81:79:81:79 | x : String | GlobalDataFlow.cs:81:84:81:84 | access to parameter x : String | GlobalDataFlow.cs:558:44:558:47 | delegate call : String |
| GlobalDataFlowStringBuilder.cs:30:35:30:48 | "taint source" : String | GlobalDataFlowStringBuilder.cs:17:64:17:64 | s : String | GlobalDataFlowStringBuilder.cs:17:53:17:54 | sb [Return] : StringBuilder | GlobalDataFlowStringBuilder.cs:30:31:30:32 | [post] access to local variable sb : StringBuilder |
| GlobalDataFlowStringBuilder.cs:48:47:48:60 | "taint source" : String | GlobalDataFlowStringBuilder.cs:22:76:22:76 | s : String | GlobalDataFlowStringBuilder.cs:22:65:22:66 | sb [Return] : StringBuilder | GlobalDataFlowStringBuilder.cs:48:43:48:44 | [post] access to local variable sb : StringBuilder |
| Splitting.cs:8:24:8:30 | [b (line 3): false] access to parameter tainted : String | Splitting.cs:16:26:16:26 | x : String | Splitting.cs:16:32:16:32 | access to parameter x : String | Splitting.cs:8:17:8:31 | [b (line 3): false] call to method Return<String> : String |
| Splitting.cs:8:24:8:30 | [b (line 3): true] access to parameter tainted : String | Splitting.cs:16:26:16:26 | x : String | Splitting.cs:16:32:16:32 | access to parameter x : String | Splitting.cs:8:17:8:31 | [b (line 3): true] call to method Return<String> : String |
| Splitting.cs:8:24:8:30 | access to parameter tainted : String | Splitting.cs:16:26:16:26 | x : String | Splitting.cs:16:32:16:32 | access to parameter x : String | Splitting.cs:8:17:8:31 | call to method Return<String> : String |
| Splitting.cs:20:29:20:29 | access to parameter s : String | Splitting.cs:16:26:16:26 | x : String | Splitting.cs:16:32:16:32 | access to parameter x : String | Splitting.cs:20:22:20:30 | call to method Return<String> : String |
| Splitting.cs:21:28:21:32 | access to parameter value : String | Splitting.cs:16:26:16:26 | x : String | Splitting.cs:16:32:16:32 | access to parameter x : String | Splitting.cs:21:21:21:33 | call to method Return<String> |
| Splitting.cs:31:19:31:25 | [b (line 24): false] access to parameter tainted : String | Splitting.cs:18:24:18:24 | s : String | Splitting.cs:20:22:20:30 | call to method Return<String> : String | Splitting.cs:31:17:31:26 | [b (line 24): false] dynamic access to element : String |
| Splitting.cs:31:19:31:25 | [b (line 24): true] access to parameter tainted : String | Splitting.cs:18:24:18:24 | s : String | Splitting.cs:20:22:20:30 | call to method Return<String> : String | Splitting.cs:31:17:31:26 | [b (line 24): true] dynamic access to element : String |
| Splitting.cs:31:19:31:25 | access to parameter tainted : String | Splitting.cs:18:24:18:24 | s : String | Splitting.cs:20:22:20:30 | call to method Return<String> : String | Splitting.cs:31:17:31:26 | dynamic access to element : String |
#select
| Capture.cs:12:19:12:24 | access to local variable sink27 | Capture.cs:7:20:7:26 | tainted : String | Capture.cs:12:19:12:24 | access to local variable sink27 | access to local variable sink27 |
| Capture.cs:21:23:21:28 | access to local variable sink28 | Capture.cs:7:20:7:26 | tainted : String | Capture.cs:21:23:21:28 | access to local variable sink28 | access to local variable sink28 |
@@ -1235,13 +1214,12 @@ subpaths
| GlobalDataFlowStringBuilder.cs:50:15:50:19 | access to local variable sink3 | GlobalDataFlowStringBuilder.cs:48:47:48:60 | "taint source" : String | GlobalDataFlowStringBuilder.cs:50:15:50:19 | access to local variable sink3 | access to local variable sink3 |
| MultiImplementationA.cs:7:39:7:39 | access to parameter x | MultiImplementationA.cs:5:28:5:41 | "taint source" : String | MultiImplementationA.cs:7:39:7:39 | access to parameter x | access to parameter x |
| MultiImplementationB.cs:5:39:5:39 | access to parameter x | MultiImplementationB.cs:3:28:3:41 | "taint source" : String | MultiImplementationB.cs:5:39:5:39 | access to parameter x | access to parameter x |
| Splitting.cs:9:15:9:15 | [b (line 3): false] access to local variable x | Splitting.cs:3:28:3:34 | tainted : String | Splitting.cs:9:15:9:15 | [b (line 3): false] access to local variable x | [b (line 3): false] access to local variable x |
| Splitting.cs:9:15:9:15 | [b (line 3): true] access to local variable x | Splitting.cs:3:28:3:34 | tainted : String | Splitting.cs:9:15:9:15 | [b (line 3): true] access to local variable x | [b (line 3): true] access to local variable x |
| Splitting.cs:9:15:9:15 | access to local variable x | Splitting.cs:3:28:3:34 | tainted : String | Splitting.cs:9:15:9:15 | access to local variable x | access to local variable x |
| Splitting.cs:11:19:11:19 | access to local variable x | Splitting.cs:3:28:3:34 | tainted : String | Splitting.cs:11:19:11:19 | access to local variable x | access to local variable x |
| Splitting.cs:21:21:21:33 | call to method Return<String> | Splitting.cs:24:28:24:34 | tainted : String | Splitting.cs:21:21:21:33 | call to method Return<String> | call to method Return<String> |
| Splitting.cs:32:15:32:15 | [b (line 24): false] access to local variable x | Splitting.cs:24:28:24:34 | tainted : String | Splitting.cs:32:15:32:15 | [b (line 24): false] access to local variable x | [b (line 24): false] access to local variable x |
| Splitting.cs:32:15:32:15 | [b (line 24): true] access to local variable x | Splitting.cs:24:28:24:34 | tainted : String | Splitting.cs:32:15:32:15 | [b (line 24): true] access to local variable x | [b (line 24): true] access to local variable x |
| Splitting.cs:32:15:32:15 | access to local variable x | Splitting.cs:24:28:24:34 | tainted : String | Splitting.cs:32:15:32:15 | access to local variable x | access to local variable x |
| Splitting.cs:34:19:34:19 | access to local variable x | Splitting.cs:24:28:24:34 | tainted : String | Splitting.cs:34:19:34:19 | access to local variable x | access to local variable x |
| Splitting.cs:41:19:41:19 | access to local variable s | Splitting.cs:39:21:39:34 | [b (line 37): true] "taint source" : String | Splitting.cs:41:19:41:19 | access to local variable s | access to local variable s |
| Splitting.cs:41:19:41:19 | access to local variable s | Splitting.cs:39:21:39:34 | "taint source" : String | Splitting.cs:41:19:41:19 | access to local variable s | access to local variable s |
| Splitting.cs:43:19:43:19 | access to local variable s | Splitting.cs:39:21:39:34 | "taint source" : String | Splitting.cs:43:19:43:19 | access to local variable s | access to local variable s |
| Splitting.cs:50:19:50:19 | access to local variable s | Splitting.cs:48:36:48:49 | "taint source" : String | Splitting.cs:50:19:50:19 | access to local variable s | access to local variable s |
| Splitting.cs:52:19:52:19 | access to local variable s | Splitting.cs:48:36:48:49 | "taint source" : String | Splitting.cs:52:19:52:19 | access to local variable s | access to local variable s |

View File

@@ -13,7 +13,9 @@
| SSA.cs:98:15:98:22 | access to local variable ssaSink4 |
| SSA.cs:124:15:124:34 | access to field SsaFieldSink1 |
| SSA.cs:180:15:180:22 | access to local variable ssaSink5 |
| Splitting.cs:8:19:8:19 | [b (line 3): true] access to local variable x |
| Splitting.cs:12:15:12:15 | [b (line 3): false] access to local variable x |
| Splitting.cs:25:15:25:15 | [b (line 17): true] access to local variable x |
| Splitting.cs:8:19:8:19 | access to local variable x |
| Splitting.cs:12:15:12:15 | access to local variable x |
| Splitting.cs:14:19:14:19 | access to local variable x |
| Splitting.cs:25:15:25:15 | access to local variable x |
| Splitting.cs:27:19:27:19 | access to local variable x |
| Splitting.cs:29:19:29:19 | access to local variable x |

View File

@@ -50,32 +50,24 @@
| LocalDataFlow.cs:76:13:76:17 | access to local variable sink6 | LocalDataFlow.cs:76:13:76:27 | SSA def(sink6) |
| LocalDataFlow.cs:76:13:76:27 | SSA def(sink6) | LocalDataFlow.cs:77:15:77:19 | access to local variable sink6 |
| LocalDataFlow.cs:76:22:76:26 | access to local variable sink5 | LocalDataFlow.cs:76:13:76:17 | access to local variable sink6 |
| LocalDataFlow.cs:77:15:77:19 | [post] access to local variable sink6 | LocalDataFlow.cs:84:31:84:35 | [b (line 48): false] access to local variable sink6 |
| LocalDataFlow.cs:77:15:77:19 | access to local variable sink6 | LocalDataFlow.cs:84:31:84:35 | [b (line 48): false] access to local variable sink6 |
| LocalDataFlow.cs:77:15:77:19 | [post] access to local variable sink6 | LocalDataFlow.cs:84:31:84:35 | access to local variable sink6 |
| LocalDataFlow.cs:77:15:77:19 | access to local variable sink6 | LocalDataFlow.cs:84:31:84:35 | access to local variable sink6 |
| LocalDataFlow.cs:80:9:80:16 | access to local variable nonSink0 | LocalDataFlow.cs:80:9:80:29 | SSA def(nonSink0) |
| LocalDataFlow.cs:80:9:80:29 | SSA def(nonSink0) | LocalDataFlow.cs:81:15:81:22 | access to local variable nonSink0 |
| LocalDataFlow.cs:80:21:80:28 | access to local variable nonSink0 | LocalDataFlow.cs:80:9:80:16 | access to local variable nonSink0 |
| LocalDataFlow.cs:84:13:84:17 | access to local variable sink7 | LocalDataFlow.cs:84:13:84:35 | [b (line 48): false] SSA def(sink7) |
| LocalDataFlow.cs:84:13:84:17 | access to local variable sink7 | LocalDataFlow.cs:84:13:84:35 | [b (line 48): true] SSA def(sink7) |
| LocalDataFlow.cs:84:13:84:35 | [b (line 48): false] SSA def(sink7) | LocalDataFlow.cs:85:15:85:19 | [b (line 48): false] access to local variable sink7 |
| LocalDataFlow.cs:84:13:84:35 | [b (line 48): true] SSA def(sink7) | LocalDataFlow.cs:85:15:85:19 | [b (line 48): true] access to local variable sink7 |
| LocalDataFlow.cs:84:21:84:21 | access to parameter b | LocalDataFlow.cs:88:20:88:20 | [b (line 48): false] access to parameter b |
| LocalDataFlow.cs:84:21:84:21 | access to parameter b | LocalDataFlow.cs:88:20:88:20 | [b (line 48): true] access to parameter b |
| LocalDataFlow.cs:84:21:84:35 | [b (line 48): false] ... ? ... : ... | LocalDataFlow.cs:84:13:84:17 | access to local variable sink7 |
| LocalDataFlow.cs:84:21:84:35 | [b (line 48): true] ... ? ... : ... | LocalDataFlow.cs:84:13:84:17 | access to local variable sink7 |
| LocalDataFlow.cs:84:25:84:27 | [b (line 48): true] "a" | LocalDataFlow.cs:84:21:84:35 | [b (line 48): true] ... ? ... : ... |
| LocalDataFlow.cs:84:31:84:35 | [b (line 48): false] access to local variable sink6 | LocalDataFlow.cs:84:21:84:35 | [b (line 48): false] ... ? ... : ... |
| LocalDataFlow.cs:85:15:85:19 | [b (line 48): false] access to local variable sink7 | LocalDataFlow.cs:88:32:88:36 | [input] SSA phi(sink7) |
| LocalDataFlow.cs:85:15:85:19 | [b (line 48): true] access to local variable sink7 | LocalDataFlow.cs:88:24:88:28 | [input] SSA phi(sink7) |
| LocalDataFlow.cs:85:15:85:19 | [post] [b (line 48): false] access to local variable sink7 | LocalDataFlow.cs:88:32:88:36 | [input] SSA phi(sink7) |
| LocalDataFlow.cs:85:15:85:19 | [post] [b (line 48): true] access to local variable sink7 | LocalDataFlow.cs:88:24:88:28 | [input] SSA phi(sink7) |
| LocalDataFlow.cs:84:13:84:17 | access to local variable sink7 | LocalDataFlow.cs:84:13:84:35 | SSA def(sink7) |
| LocalDataFlow.cs:84:13:84:35 | SSA def(sink7) | LocalDataFlow.cs:85:15:85:19 | access to local variable sink7 |
| LocalDataFlow.cs:84:21:84:21 | access to parameter b | LocalDataFlow.cs:88:20:88:20 | access to parameter b |
| LocalDataFlow.cs:84:21:84:35 | ... ? ... : ... | LocalDataFlow.cs:84:13:84:17 | access to local variable sink7 |
| LocalDataFlow.cs:84:25:84:27 | "a" | LocalDataFlow.cs:84:21:84:35 | ... ? ... : ... |
| LocalDataFlow.cs:84:31:84:35 | access to local variable sink6 | LocalDataFlow.cs:84:21:84:35 | ... ? ... : ... |
| LocalDataFlow.cs:85:15:85:19 | [post] access to local variable sink7 | LocalDataFlow.cs:92:29:92:33 | access to local variable sink7 |
| LocalDataFlow.cs:85:15:85:19 | access to local variable sink7 | LocalDataFlow.cs:92:29:92:33 | access to local variable sink7 |
| LocalDataFlow.cs:88:9:88:16 | access to local variable nonSink0 | LocalDataFlow.cs:88:9:88:36 | SSA def(nonSink0) |
| LocalDataFlow.cs:88:9:88:36 | SSA def(nonSink0) | LocalDataFlow.cs:89:15:89:22 | access to local variable nonSink0 |
| LocalDataFlow.cs:88:20:88:36 | ... ? ... : ... | LocalDataFlow.cs:88:9:88:16 | access to local variable nonSink0 |
| LocalDataFlow.cs:88:24:88:28 | "abc" | LocalDataFlow.cs:88:20:88:36 | ... ? ... : ... |
| LocalDataFlow.cs:88:24:88:28 | [input] SSA phi(sink7) | LocalDataFlow.cs:92:29:92:33 | access to local variable sink7 |
| LocalDataFlow.cs:88:32:88:36 | "def" | LocalDataFlow.cs:88:20:88:36 | ... ? ... : ... |
| LocalDataFlow.cs:88:32:88:36 | [input] SSA phi(sink7) | LocalDataFlow.cs:92:29:92:33 | access to local variable sink7 |
| LocalDataFlow.cs:89:15:89:22 | [post] access to local variable nonSink0 | LocalDataFlow.cs:96:32:96:39 | access to local variable nonSink0 |
| LocalDataFlow.cs:89:15:89:22 | access to local variable nonSink0 | LocalDataFlow.cs:96:32:96:39 | access to local variable nonSink0 |
| LocalDataFlow.cs:92:13:92:17 | access to local variable sink8 | LocalDataFlow.cs:92:13:92:33 | SSA def(sink8) |
@@ -930,115 +922,85 @@
| Splitting.cs:3:28:3:34 | SSA param(tainted) | Splitting.cs:5:17:5:23 | access to parameter tainted |
| Splitting.cs:3:28:3:34 | tainted | Splitting.cs:3:28:3:34 | SSA param(tainted) |
| Splitting.cs:5:13:5:13 | access to local variable x | Splitting.cs:5:13:5:23 | SSA def(x) |
| Splitting.cs:5:13:5:23 | SSA def(x) | Splitting.cs:8:19:8:19 | [b (line 3): true] access to local variable x |
| Splitting.cs:5:13:5:23 | SSA def(x) | Splitting.cs:12:15:12:15 | [b (line 3): false] access to local variable x |
| Splitting.cs:5:13:5:23 | SSA def(x) | Splitting.cs:6:13:6:13 | [input] SSA phi read(x) |
| Splitting.cs:5:13:5:23 | SSA def(x) | Splitting.cs:8:19:8:19 | access to local variable x |
| Splitting.cs:5:17:5:23 | access to parameter tainted | Splitting.cs:5:13:5:13 | access to local variable x |
| Splitting.cs:6:13:6:13 | access to parameter b | Splitting.cs:13:13:13:13 | [b (line 3): false] access to parameter b |
| Splitting.cs:6:13:6:13 | access to parameter b | Splitting.cs:13:13:13:13 | [b (line 3): true] access to parameter b |
| Splitting.cs:8:19:8:19 | [b (line 3): true] access to local variable x | Splitting.cs:9:17:9:17 | [b (line 3): true] access to local variable x |
| Splitting.cs:8:19:8:19 | [post] [b (line 3): true] access to local variable x | Splitting.cs:9:17:9:17 | [b (line 3): true] access to local variable x |
| Splitting.cs:9:17:9:17 | [b (line 3): true] access to local variable x | Splitting.cs:12:15:12:15 | [b (line 3): true] access to local variable x |
| Splitting.cs:12:15:12:15 | [b (line 3): true] access to local variable x | Splitting.cs:14:19:14:19 | access to local variable x |
| Splitting.cs:12:15:12:15 | [post] [b (line 3): true] access to local variable x | Splitting.cs:14:19:14:19 | access to local variable x |
| Splitting.cs:6:13:6:13 | [input] SSA phi read(x) | Splitting.cs:12:15:12:15 | access to local variable x |
| Splitting.cs:6:13:6:13 | access to parameter b | Splitting.cs:13:13:13:13 | access to parameter b |
| Splitting.cs:8:19:8:19 | [post] access to local variable x | Splitting.cs:9:17:9:17 | access to local variable x |
| Splitting.cs:8:19:8:19 | access to local variable x | Splitting.cs:9:17:9:17 | access to local variable x |
| Splitting.cs:9:17:9:17 | access to local variable x | Splitting.cs:9:17:9:25 | [input] SSA phi read(x) |
| Splitting.cs:9:17:9:25 | [input] SSA phi read(x) | Splitting.cs:12:15:12:15 | access to local variable x |
| Splitting.cs:12:15:12:15 | [post] access to local variable x | Splitting.cs:14:19:14:19 | access to local variable x |
| Splitting.cs:12:15:12:15 | access to local variable x | Splitting.cs:14:19:14:19 | access to local variable x |
| Splitting.cs:17:18:17:18 | SSA param(b) | Splitting.cs:20:13:20:13 | access to parameter b |
| Splitting.cs:17:18:17:18 | b | Splitting.cs:17:18:17:18 | SSA param(b) |
| Splitting.cs:19:13:19:13 | access to local variable x | Splitting.cs:19:13:19:18 | SSA def(x) |
| Splitting.cs:19:13:19:18 | SSA def(x) | Splitting.cs:22:19:22:19 | [b (line 17): true] access to local variable x |
| Splitting.cs:19:13:19:18 | SSA def(x) | Splitting.cs:25:15:25:15 | [b (line 17): false] access to local variable x |
| Splitting.cs:19:13:19:18 | SSA def(x) | Splitting.cs:20:13:20:13 | [input] SSA phi(x) |
| Splitting.cs:19:13:19:18 | SSA def(x) | Splitting.cs:22:19:22:19 | access to local variable x |
| Splitting.cs:19:17:19:18 | "" | Splitting.cs:19:13:19:13 | access to local variable x |
| Splitting.cs:20:13:20:13 | access to parameter b | Splitting.cs:26:13:26:13 | [b (line 17): false] access to parameter b |
| Splitting.cs:20:13:20:13 | access to parameter b | Splitting.cs:26:13:26:13 | [b (line 17): true] access to parameter b |
| Splitting.cs:23:13:23:13 | access to local variable x | Splitting.cs:23:13:23:30 | [b (line 17): true] SSA def(x) |
| Splitting.cs:23:13:23:30 | [b (line 17): true] SSA def(x) | Splitting.cs:25:15:25:15 | [b (line 17): true] access to local variable x |
| Splitting.cs:23:17:23:30 | [b (line 17): true] "taint source" | Splitting.cs:23:13:23:13 | access to local variable x |
| Splitting.cs:25:15:25:15 | [b (line 17): false] access to local variable x | Splitting.cs:29:19:29:19 | access to local variable x |
| Splitting.cs:25:15:25:15 | [b (line 17): true] access to local variable x | Splitting.cs:27:19:27:19 | access to local variable x |
| Splitting.cs:25:15:25:15 | [post] [b (line 17): false] access to local variable x | Splitting.cs:29:19:29:19 | access to local variable x |
| Splitting.cs:25:15:25:15 | [post] [b (line 17): true] access to local variable x | Splitting.cs:27:19:27:19 | access to local variable x |
| Splitting.cs:20:13:20:13 | [input] SSA phi(x) | Splitting.cs:25:15:25:15 | access to local variable x |
| Splitting.cs:20:13:20:13 | access to parameter b | Splitting.cs:26:13:26:13 | access to parameter b |
| Splitting.cs:23:13:23:13 | access to local variable x | Splitting.cs:23:13:23:30 | SSA def(x) |
| Splitting.cs:23:13:23:30 | SSA def(x) | Splitting.cs:25:15:25:15 | access to local variable x |
| Splitting.cs:23:17:23:30 | "taint source" | Splitting.cs:23:13:23:13 | access to local variable x |
| Splitting.cs:25:15:25:15 | [post] access to local variable x | Splitting.cs:27:19:27:19 | access to local variable x |
| Splitting.cs:25:15:25:15 | [post] access to local variable x | Splitting.cs:29:19:29:19 | access to local variable x |
| Splitting.cs:25:15:25:15 | access to local variable x | Splitting.cs:27:19:27:19 | access to local variable x |
| Splitting.cs:25:15:25:15 | access to local variable x | Splitting.cs:29:19:29:19 | access to local variable x |
| Splitting.cs:32:18:32:18 | SSA param(b) | Splitting.cs:35:13:35:13 | access to parameter b |
| Splitting.cs:32:18:32:18 | b | Splitting.cs:32:18:32:18 | SSA param(b) |
| Splitting.cs:34:17:34:18 | "" | Splitting.cs:34:13:34:13 | access to local variable x |
| Splitting.cs:35:13:35:13 | access to parameter b | Splitting.cs:39:15:39:15 | [b (line 32): false] access to parameter b |
| Splitting.cs:35:13:35:13 | access to parameter b | Splitting.cs:39:15:39:15 | [b (line 32): true] access to parameter b |
| Splitting.cs:36:17:36:19 | [b (line 32): true] "a" | Splitting.cs:36:13:36:13 | access to local variable x |
| Splitting.cs:37:9:37:9 | access to local variable x | Splitting.cs:37:9:37:15 | [b (line 32): false] SSA def(x) |
| Splitting.cs:37:9:37:9 | access to local variable x | Splitting.cs:37:9:37:15 | [b (line 32): true] SSA def(x) |
| Splitting.cs:37:9:37:15 | [b (line 32): false] SSA def(x) | Splitting.cs:38:15:38:15 | [b (line 32): false] access to local variable x |
| Splitting.cs:37:9:37:15 | [b (line 32): true] SSA def(x) | Splitting.cs:38:15:38:15 | [b (line 32): true] access to local variable x |
| Splitting.cs:37:13:37:15 | [b (line 32): false] "b" | Splitting.cs:37:9:37:9 | access to local variable x |
| Splitting.cs:37:13:37:15 | [b (line 32): true] "b" | Splitting.cs:37:9:37:9 | access to local variable x |
| Splitting.cs:38:15:38:15 | [b (line 32): false] access to local variable x | Splitting.cs:40:23:40:23 | [b (line 32): false] access to local variable x |
| Splitting.cs:38:15:38:15 | [b (line 32): true] access to local variable x | Splitting.cs:39:19:39:19 | [b (line 32): true] access to local variable x |
| Splitting.cs:38:15:38:15 | [post] [b (line 32): false] access to local variable x | Splitting.cs:40:23:40:23 | [b (line 32): false] access to local variable x |
| Splitting.cs:38:15:38:15 | [post] [b (line 32): true] access to local variable x | Splitting.cs:39:19:39:19 | [b (line 32): true] access to local variable x |
| Splitting.cs:39:15:39:15 | [b (line 32): false] access to parameter b | Splitting.cs:42:13:42:13 | [b (line 32): false] access to parameter b |
| Splitting.cs:39:15:39:15 | [b (line 32): true] access to parameter b | Splitting.cs:42:13:42:13 | [b (line 32): true] access to parameter b |
| Splitting.cs:39:19:39:19 | [b (line 32): true] access to local variable x | Splitting.cs:39:15:39:25 | [b (line 32): true] ... ? ... : ... |
| Splitting.cs:39:19:39:19 | [b (line 32): true] access to local variable x | Splitting.cs:40:23:40:23 | [b (line 32): true] access to local variable x |
| Splitting.cs:39:19:39:19 | [post] [b (line 32): true] access to local variable x | Splitting.cs:40:23:40:23 | [b (line 32): true] access to local variable x |
| Splitting.cs:39:23:39:25 | [b (line 32): false] "c" | Splitting.cs:39:15:39:25 | [b (line 32): false] ... ? ... : ... |
| Splitting.cs:40:23:40:23 | [b (line 32): false] access to local variable x | Splitting.cs:40:15:40:23 | [b (line 32): false] (...) ... |
| Splitting.cs:40:23:40:23 | [b (line 32): true] access to local variable x | Splitting.cs:40:15:40:23 | [b (line 32): true] (...) ... |
| Splitting.cs:41:19:41:21 | [b (line 32): false] "d" | Splitting.cs:41:15:41:15 | access to local variable x |
| Splitting.cs:41:19:41:21 | [b (line 32): false] "d" | Splitting.cs:41:15:41:21 | [b (line 32): false] ... = ... |
| Splitting.cs:41:19:41:21 | [b (line 32): true] "d" | Splitting.cs:41:15:41:15 | access to local variable x |
| Splitting.cs:41:19:41:21 | [b (line 32): true] "d" | Splitting.cs:41:15:41:21 | [b (line 32): true] ... = ... |
| Splitting.cs:35:13:35:13 | access to parameter b | Splitting.cs:39:15:39:15 | access to parameter b |
| Splitting.cs:36:17:36:19 | "a" | Splitting.cs:36:13:36:13 | access to local variable x |
| Splitting.cs:37:9:37:9 | access to local variable x | Splitting.cs:37:9:37:15 | SSA def(x) |
| Splitting.cs:37:9:37:15 | SSA def(x) | Splitting.cs:38:15:38:15 | access to local variable x |
| Splitting.cs:37:13:37:15 | "b" | Splitting.cs:37:9:37:9 | access to local variable x |
| Splitting.cs:38:15:38:15 | [post] access to local variable x | Splitting.cs:39:19:39:19 | access to local variable x |
| Splitting.cs:38:15:38:15 | [post] access to local variable x | Splitting.cs:39:23:39:25 | [input] SSA phi read(x) |
| Splitting.cs:38:15:38:15 | access to local variable x | Splitting.cs:39:19:39:19 | access to local variable x |
| Splitting.cs:38:15:38:15 | access to local variable x | Splitting.cs:39:23:39:25 | [input] SSA phi read(x) |
| Splitting.cs:39:15:39:15 | access to parameter b | Splitting.cs:42:13:42:13 | access to parameter b |
| Splitting.cs:39:19:39:19 | [post] access to local variable x | Splitting.cs:40:23:40:23 | access to local variable x |
| Splitting.cs:39:19:39:19 | access to local variable x | Splitting.cs:39:15:39:25 | ... ? ... : ... |
| Splitting.cs:39:19:39:19 | access to local variable x | Splitting.cs:40:23:40:23 | access to local variable x |
| Splitting.cs:39:23:39:25 | "c" | Splitting.cs:39:15:39:25 | ... ? ... : ... |
| Splitting.cs:39:23:39:25 | [input] SSA phi read(x) | Splitting.cs:40:23:40:23 | access to local variable x |
| Splitting.cs:40:23:40:23 | access to local variable x | Splitting.cs:40:15:40:23 | (...) ... |
| Splitting.cs:41:19:41:21 | "d" | Splitting.cs:41:15:41:15 | access to local variable x |
| Splitting.cs:41:19:41:21 | "d" | Splitting.cs:41:15:41:21 | ... = ... |
| Splitting.cs:46:18:46:18 | SSA param(b) | Splitting.cs:49:13:49:13 | access to parameter b |
| Splitting.cs:46:18:46:18 | b | Splitting.cs:46:18:46:18 | SSA param(b) |
| Splitting.cs:48:13:48:13 | access to local variable x | Splitting.cs:48:13:48:18 | SSA def(x) |
| Splitting.cs:48:13:48:18 | SSA def(x) | Splitting.cs:53:13:53:13 | [b (line 46): false] access to local variable x |
| Splitting.cs:48:13:48:18 | SSA def(x) | Splitting.cs:53:13:53:13 | access to local variable x |
| Splitting.cs:48:17:48:18 | "" | Splitting.cs:48:13:48:13 | access to local variable x |
| Splitting.cs:49:13:49:13 | access to parameter b | Splitting.cs:60:13:60:13 | [b (line 46): false] access to parameter b |
| Splitting.cs:49:13:49:13 | access to parameter b | Splitting.cs:60:13:60:13 | [b (line 46): true] access to parameter b |
| Splitting.cs:50:13:50:13 | access to local variable x | Splitting.cs:50:13:50:21 | [b (line 46): true] SSA def(x) |
| Splitting.cs:50:13:50:21 | [b (line 46): true] SSA def(x) | Splitting.cs:53:13:53:13 | [b (line 46): true] access to local variable x |
| Splitting.cs:50:17:50:21 | [b (line 46): true] "abc" | Splitting.cs:50:13:50:13 | access to local variable x |
| Splitting.cs:51:13:51:13 | access to local variable y | Splitting.cs:51:13:51:36 | [b (line 46): false] SSA def(y) |
| Splitting.cs:51:13:51:13 | access to local variable y | Splitting.cs:51:13:51:36 | [b (line 46): true] SSA def(y) |
| Splitting.cs:51:13:51:36 | [b (line 46): false] SSA def(y) | Splitting.cs:52:9:52:9 | [b (line 46): false] access to local variable y |
| Splitting.cs:51:13:51:36 | [b (line 46): true] SSA def(y) | Splitting.cs:52:9:52:9 | [b (line 46): true] access to local variable y |
| Splitting.cs:51:17:51:36 | [b (line 46): false] array creation of type String[] | Splitting.cs:51:13:51:13 | access to local variable y |
| Splitting.cs:51:17:51:36 | [b (line 46): true] array creation of type String[] | Splitting.cs:51:13:51:13 | access to local variable y |
| Splitting.cs:51:30:51:36 | [b (line 46): false] { ..., ... } | Splitting.cs:51:17:51:36 | [b (line 46): false] array creation of type String[] |
| Splitting.cs:51:30:51:36 | [b (line 46): true] { ..., ... } | Splitting.cs:51:17:51:36 | [b (line 46): true] array creation of type String[] |
| Splitting.cs:52:9:52:9 | [b (line 46): false] access to local variable y | Splitting.cs:53:17:53:17 | [b (line 46): false] access to local variable y |
| Splitting.cs:52:9:52:9 | [b (line 46): true] access to local variable y | Splitting.cs:53:17:53:17 | [b (line 46): true] access to local variable y |
| Splitting.cs:52:9:52:9 | [post] [b (line 46): false] access to local variable y | Splitting.cs:53:17:53:17 | [b (line 46): false] access to local variable y |
| Splitting.cs:52:9:52:9 | [post] [b (line 46): true] access to local variable y | Splitting.cs:53:17:53:17 | [b (line 46): true] access to local variable y |
| Splitting.cs:52:16:52:18 | [b (line 46): false] "b" | Splitting.cs:52:9:52:12 | access to array element |
| Splitting.cs:52:16:52:18 | [b (line 46): true] "b" | Splitting.cs:52:9:52:12 | access to array element |
| Splitting.cs:53:9:53:9 | access to local variable x | Splitting.cs:53:9:53:20 | [b (line 46): false] SSA def(x) |
| Splitting.cs:53:9:53:9 | access to local variable x | Splitting.cs:53:9:53:20 | [b (line 46): true] SSA def(x) |
| Splitting.cs:53:9:53:20 | [b (line 46): false] SSA def(x) | Splitting.cs:54:17:54:17 | [b (line 46): false] access to local variable x |
| Splitting.cs:53:9:53:20 | [b (line 46): true] SSA def(x) | Splitting.cs:54:17:54:17 | [b (line 46): true] access to local variable x |
| Splitting.cs:53:13:53:20 | [b (line 46): false] ... + ... | Splitting.cs:53:9:53:9 | access to local variable x |
| Splitting.cs:53:13:53:20 | [b (line 46): true] ... + ... | Splitting.cs:53:9:53:9 | access to local variable x |
| Splitting.cs:53:17:53:17 | [b (line 46): false] access to local variable y | Splitting.cs:57:17:57:17 | [b (line 46): false] access to local variable y |
| Splitting.cs:53:17:53:17 | [b (line 46): true] access to local variable y | Splitting.cs:57:17:57:17 | [b (line 46): true] access to local variable y |
| Splitting.cs:54:13:54:13 | access to local variable z | Splitting.cs:54:13:54:23 | [b (line 46): false] SSA def(z) |
| Splitting.cs:54:13:54:13 | access to local variable z | Splitting.cs:54:13:54:23 | [b (line 46): true] SSA def(z) |
| Splitting.cs:54:13:54:23 | [b (line 46): false] SSA def(z) | Splitting.cs:55:14:55:14 | [b (line 46): false] access to local variable z |
| Splitting.cs:54:13:54:23 | [b (line 46): true] SSA def(z) | Splitting.cs:55:14:55:14 | [b (line 46): true] access to local variable z |
| Splitting.cs:54:17:54:17 | [b (line 46): false] access to local variable x | Splitting.cs:56:17:56:17 | [b (line 46): false] access to local variable x |
| Splitting.cs:54:17:54:17 | [b (line 46): true] access to local variable x | Splitting.cs:56:17:56:17 | [b (line 46): true] access to local variable x |
| Splitting.cs:54:17:54:23 | [b (line 46): false] ... == ... | Splitting.cs:54:13:54:13 | access to local variable z |
| Splitting.cs:54:17:54:23 | [b (line 46): true] ... == ... | Splitting.cs:54:13:54:13 | access to local variable z |
| Splitting.cs:55:13:55:14 | [b (line 46): false] !... | Splitting.cs:55:9:55:9 | access to local variable z |
| Splitting.cs:55:13:55:14 | [b (line 46): true] !... | Splitting.cs:55:9:55:9 | access to local variable z |
| Splitting.cs:56:9:56:9 | access to local variable x | Splitting.cs:56:9:56:19 | [b (line 46): false] SSA def(x) |
| Splitting.cs:56:9:56:9 | access to local variable x | Splitting.cs:56:9:56:19 | [b (line 46): true] SSA def(x) |
| Splitting.cs:56:9:56:19 | [b (line 46): false] SSA def(x) | Splitting.cs:57:14:57:14 | [b (line 46): false] access to local variable x |
| Splitting.cs:56:9:56:19 | [b (line 46): true] SSA def(x) | Splitting.cs:57:14:57:14 | [b (line 46): true] access to local variable x |
| Splitting.cs:56:13:56:19 | [b (line 46): false] $"..." | Splitting.cs:56:9:56:9 | access to local variable x |
| Splitting.cs:56:13:56:19 | [b (line 46): true] $"..." | Splitting.cs:56:9:56:9 | access to local variable x |
| Splitting.cs:57:13:57:24 | [b (line 46): false] access to field Item1 | Splitting.cs:57:9:57:9 | access to local variable x |
| Splitting.cs:57:13:57:24 | [b (line 46): true] access to field Item1 | Splitting.cs:57:9:57:9 | access to local variable x |
| Splitting.cs:57:17:57:17 | [b (line 46): false] access to local variable y | Splitting.cs:58:27:58:27 | [b (line 46): false] access to local variable y |
| Splitting.cs:57:17:57:17 | [b (line 46): true] access to local variable y | Splitting.cs:58:27:58:27 | [b (line 46): true] access to local variable y |
| Splitting.cs:58:22:58:22 | String s | Splitting.cs:58:22:58:22 | [b (line 46): false] SSA def(s) |
| Splitting.cs:58:22:58:22 | String s | Splitting.cs:58:22:58:22 | [b (line 46): true] SSA def(s) |
| Splitting.cs:58:22:58:22 | [b (line 46): false] SSA def(s) | Splitting.cs:59:19:59:19 | [b (line 46): false] access to local variable s |
| Splitting.cs:58:22:58:22 | [b (line 46): true] SSA def(s) | Splitting.cs:59:19:59:19 | [b (line 46): true] access to local variable s |
| Splitting.cs:49:13:49:13 | access to parameter b | Splitting.cs:60:13:60:13 | access to parameter b |
| Splitting.cs:50:13:50:13 | access to local variable x | Splitting.cs:50:13:50:21 | SSA def(x) |
| Splitting.cs:50:13:50:21 | SSA def(x) | Splitting.cs:53:13:53:13 | access to local variable x |
| Splitting.cs:50:17:50:21 | "abc" | Splitting.cs:50:13:50:13 | access to local variable x |
| Splitting.cs:51:13:51:13 | access to local variable y | Splitting.cs:51:13:51:36 | SSA def(y) |
| Splitting.cs:51:13:51:36 | SSA def(y) | Splitting.cs:52:9:52:9 | access to local variable y |
| Splitting.cs:51:17:51:36 | array creation of type String[] | Splitting.cs:51:13:51:13 | access to local variable y |
| Splitting.cs:51:30:51:36 | { ..., ... } | Splitting.cs:51:17:51:36 | array creation of type String[] |
| Splitting.cs:52:9:52:9 | [post] access to local variable y | Splitting.cs:53:17:53:17 | access to local variable y |
| Splitting.cs:52:9:52:9 | access to local variable y | Splitting.cs:53:17:53:17 | access to local variable y |
| Splitting.cs:52:16:52:18 | "b" | Splitting.cs:52:9:52:12 | access to array element |
| Splitting.cs:53:9:53:9 | access to local variable x | Splitting.cs:53:9:53:20 | SSA def(x) |
| Splitting.cs:53:9:53:20 | SSA def(x) | Splitting.cs:54:17:54:17 | access to local variable x |
| Splitting.cs:53:13:53:20 | ... + ... | Splitting.cs:53:9:53:9 | access to local variable x |
| Splitting.cs:53:17:53:17 | access to local variable y | Splitting.cs:57:17:57:17 | access to local variable y |
| Splitting.cs:54:13:54:13 | access to local variable z | Splitting.cs:54:13:54:23 | SSA def(z) |
| Splitting.cs:54:13:54:23 | SSA def(z) | Splitting.cs:55:14:55:14 | access to local variable z |
| Splitting.cs:54:17:54:17 | access to local variable x | Splitting.cs:56:17:56:17 | access to local variable x |
| Splitting.cs:54:17:54:23 | ... == ... | Splitting.cs:54:13:54:13 | access to local variable z |
| Splitting.cs:55:13:55:14 | !... | Splitting.cs:55:9:55:9 | access to local variable z |
| Splitting.cs:56:9:56:9 | access to local variable x | Splitting.cs:56:9:56:19 | SSA def(x) |
| Splitting.cs:56:9:56:19 | SSA def(x) | Splitting.cs:57:14:57:14 | access to local variable x |
| Splitting.cs:56:13:56:19 | $"..." | Splitting.cs:56:9:56:9 | access to local variable x |
| Splitting.cs:57:13:57:24 | access to field Item1 | Splitting.cs:57:9:57:9 | access to local variable x |
| Splitting.cs:57:17:57:17 | access to local variable y | Splitting.cs:58:27:58:27 | access to local variable y |
| Splitting.cs:58:22:58:22 | SSA def(s) | Splitting.cs:59:19:59:19 | access to local variable s |
| Splitting.cs:58:22:58:22 | String s | Splitting.cs:58:22:58:22 | SSA def(s) |
| UseUseExplosion.cs:21:10:21:10 | SSA entry def(this.Prop) | UseUseExplosion.cs:24:13:24:16 | access to property Prop |
| UseUseExplosion.cs:21:10:21:10 | this | UseUseExplosion.cs:24:13:24:16 | this access |
| UseUseExplosion.cs:23:13:23:13 | access to local variable x | UseUseExplosion.cs:23:13:23:17 | SSA def(x) |

View File

@@ -2,7 +2,7 @@
| LocalDataFlow.cs:61:15:61:19 | access to local variable sink1 |
| LocalDataFlow.cs:69:15:69:19 | access to local variable sink5 |
| LocalDataFlow.cs:77:15:77:19 | access to local variable sink6 |
| LocalDataFlow.cs:85:15:85:19 | [b (line 48): false] access to local variable sink7 |
| LocalDataFlow.cs:85:15:85:19 | access to local variable sink7 |
| LocalDataFlow.cs:93:15:93:19 | access to local variable sink8 |
| LocalDataFlow.cs:101:15:101:19 | access to local variable sink9 |
| LocalDataFlow.cs:109:15:109:20 | access to local variable sink15 |
@@ -51,7 +51,9 @@
| SSA.cs:98:15:98:22 | access to local variable ssaSink4 |
| SSA.cs:124:15:124:34 | access to field SsaFieldSink1 |
| SSA.cs:180:15:180:22 | access to local variable ssaSink5 |
| Splitting.cs:8:19:8:19 | [b (line 3): true] access to local variable x |
| Splitting.cs:12:15:12:15 | [b (line 3): false] access to local variable x |
| Splitting.cs:25:15:25:15 | [b (line 17): true] access to local variable x |
| Splitting.cs:8:19:8:19 | access to local variable x |
| Splitting.cs:12:15:12:15 | access to local variable x |
| Splitting.cs:14:19:14:19 | access to local variable x |
| Splitting.cs:25:15:25:15 | access to local variable x |
| Splitting.cs:27:19:27:19 | access to local variable x |
| Splitting.cs:29:19:29:19 | access to local variable x |

View File

@@ -58,32 +58,24 @@
| LocalDataFlow.cs:76:13:76:17 | access to local variable sink6 | LocalDataFlow.cs:76:13:76:27 | SSA def(sink6) |
| LocalDataFlow.cs:76:13:76:27 | SSA def(sink6) | LocalDataFlow.cs:77:15:77:19 | access to local variable sink6 |
| LocalDataFlow.cs:76:22:76:26 | access to local variable sink5 | LocalDataFlow.cs:76:13:76:17 | access to local variable sink6 |
| LocalDataFlow.cs:77:15:77:19 | [post] access to local variable sink6 | LocalDataFlow.cs:84:31:84:35 | [b (line 48): false] access to local variable sink6 |
| LocalDataFlow.cs:77:15:77:19 | access to local variable sink6 | LocalDataFlow.cs:84:31:84:35 | [b (line 48): false] access to local variable sink6 |
| LocalDataFlow.cs:77:15:77:19 | [post] access to local variable sink6 | LocalDataFlow.cs:84:31:84:35 | access to local variable sink6 |
| LocalDataFlow.cs:77:15:77:19 | access to local variable sink6 | LocalDataFlow.cs:84:31:84:35 | access to local variable sink6 |
| LocalDataFlow.cs:80:9:80:16 | access to local variable nonSink0 | LocalDataFlow.cs:80:9:80:29 | SSA def(nonSink0) |
| LocalDataFlow.cs:80:9:80:29 | SSA def(nonSink0) | LocalDataFlow.cs:81:15:81:22 | access to local variable nonSink0 |
| LocalDataFlow.cs:80:21:80:28 | access to local variable nonSink0 | LocalDataFlow.cs:80:9:80:16 | access to local variable nonSink0 |
| LocalDataFlow.cs:84:13:84:17 | access to local variable sink7 | LocalDataFlow.cs:84:13:84:35 | [b (line 48): false] SSA def(sink7) |
| LocalDataFlow.cs:84:13:84:17 | access to local variable sink7 | LocalDataFlow.cs:84:13:84:35 | [b (line 48): true] SSA def(sink7) |
| LocalDataFlow.cs:84:13:84:35 | [b (line 48): false] SSA def(sink7) | LocalDataFlow.cs:85:15:85:19 | [b (line 48): false] access to local variable sink7 |
| LocalDataFlow.cs:84:13:84:35 | [b (line 48): true] SSA def(sink7) | LocalDataFlow.cs:85:15:85:19 | [b (line 48): true] access to local variable sink7 |
| LocalDataFlow.cs:84:21:84:21 | access to parameter b | LocalDataFlow.cs:88:20:88:20 | [b (line 48): false] access to parameter b |
| LocalDataFlow.cs:84:21:84:21 | access to parameter b | LocalDataFlow.cs:88:20:88:20 | [b (line 48): true] access to parameter b |
| LocalDataFlow.cs:84:21:84:35 | [b (line 48): false] ... ? ... : ... | LocalDataFlow.cs:84:13:84:17 | access to local variable sink7 |
| LocalDataFlow.cs:84:21:84:35 | [b (line 48): true] ... ? ... : ... | LocalDataFlow.cs:84:13:84:17 | access to local variable sink7 |
| LocalDataFlow.cs:84:25:84:27 | [b (line 48): true] "a" | LocalDataFlow.cs:84:21:84:35 | [b (line 48): true] ... ? ... : ... |
| LocalDataFlow.cs:84:31:84:35 | [b (line 48): false] access to local variable sink6 | LocalDataFlow.cs:84:21:84:35 | [b (line 48): false] ... ? ... : ... |
| LocalDataFlow.cs:85:15:85:19 | [b (line 48): false] access to local variable sink7 | LocalDataFlow.cs:88:32:88:36 | [input] SSA phi(sink7) |
| LocalDataFlow.cs:85:15:85:19 | [b (line 48): true] access to local variable sink7 | LocalDataFlow.cs:88:24:88:28 | [input] SSA phi(sink7) |
| LocalDataFlow.cs:85:15:85:19 | [post] [b (line 48): false] access to local variable sink7 | LocalDataFlow.cs:88:32:88:36 | [input] SSA phi(sink7) |
| LocalDataFlow.cs:85:15:85:19 | [post] [b (line 48): true] access to local variable sink7 | LocalDataFlow.cs:88:24:88:28 | [input] SSA phi(sink7) |
| LocalDataFlow.cs:84:13:84:17 | access to local variable sink7 | LocalDataFlow.cs:84:13:84:35 | SSA def(sink7) |
| LocalDataFlow.cs:84:13:84:35 | SSA def(sink7) | LocalDataFlow.cs:85:15:85:19 | access to local variable sink7 |
| LocalDataFlow.cs:84:21:84:21 | access to parameter b | LocalDataFlow.cs:88:20:88:20 | access to parameter b |
| LocalDataFlow.cs:84:21:84:35 | ... ? ... : ... | LocalDataFlow.cs:84:13:84:17 | access to local variable sink7 |
| LocalDataFlow.cs:84:25:84:27 | "a" | LocalDataFlow.cs:84:21:84:35 | ... ? ... : ... |
| LocalDataFlow.cs:84:31:84:35 | access to local variable sink6 | LocalDataFlow.cs:84:21:84:35 | ... ? ... : ... |
| LocalDataFlow.cs:85:15:85:19 | [post] access to local variable sink7 | LocalDataFlow.cs:92:29:92:33 | access to local variable sink7 |
| LocalDataFlow.cs:85:15:85:19 | access to local variable sink7 | LocalDataFlow.cs:92:29:92:33 | access to local variable sink7 |
| LocalDataFlow.cs:88:9:88:16 | access to local variable nonSink0 | LocalDataFlow.cs:88:9:88:36 | SSA def(nonSink0) |
| LocalDataFlow.cs:88:9:88:36 | SSA def(nonSink0) | LocalDataFlow.cs:89:15:89:22 | access to local variable nonSink0 |
| LocalDataFlow.cs:88:20:88:36 | ... ? ... : ... | LocalDataFlow.cs:88:9:88:16 | access to local variable nonSink0 |
| LocalDataFlow.cs:88:24:88:28 | "abc" | LocalDataFlow.cs:88:20:88:36 | ... ? ... : ... |
| LocalDataFlow.cs:88:24:88:28 | [input] SSA phi(sink7) | LocalDataFlow.cs:92:29:92:33 | access to local variable sink7 |
| LocalDataFlow.cs:88:32:88:36 | "def" | LocalDataFlow.cs:88:20:88:36 | ... ? ... : ... |
| LocalDataFlow.cs:88:32:88:36 | [input] SSA phi(sink7) | LocalDataFlow.cs:92:29:92:33 | access to local variable sink7 |
| LocalDataFlow.cs:89:15:89:22 | [post] access to local variable nonSink0 | LocalDataFlow.cs:96:32:96:39 | access to local variable nonSink0 |
| LocalDataFlow.cs:89:15:89:22 | access to local variable nonSink0 | LocalDataFlow.cs:96:32:96:39 | access to local variable nonSink0 |
| LocalDataFlow.cs:92:13:92:17 | access to local variable sink8 | LocalDataFlow.cs:92:13:92:33 | SSA def(sink8) |
@@ -1060,138 +1052,97 @@
| Splitting.cs:3:28:3:34 | SSA param(tainted) | Splitting.cs:5:17:5:23 | access to parameter tainted |
| Splitting.cs:3:28:3:34 | tainted | Splitting.cs:3:28:3:34 | SSA param(tainted) |
| Splitting.cs:5:13:5:13 | access to local variable x | Splitting.cs:5:13:5:23 | SSA def(x) |
| Splitting.cs:5:13:5:23 | SSA def(x) | Splitting.cs:8:19:8:19 | [b (line 3): true] access to local variable x |
| Splitting.cs:5:13:5:23 | SSA def(x) | Splitting.cs:12:15:12:15 | [b (line 3): false] access to local variable x |
| Splitting.cs:5:13:5:23 | SSA def(x) | Splitting.cs:6:13:6:13 | [input] SSA phi read(x) |
| Splitting.cs:5:13:5:23 | SSA def(x) | Splitting.cs:8:19:8:19 | access to local variable x |
| Splitting.cs:5:17:5:23 | access to parameter tainted | Splitting.cs:5:13:5:13 | access to local variable x |
| Splitting.cs:6:13:6:13 | access to parameter b | Splitting.cs:13:13:13:13 | [b (line 3): false] access to parameter b |
| Splitting.cs:6:13:6:13 | access to parameter b | Splitting.cs:13:13:13:13 | [b (line 3): true] access to parameter b |
| Splitting.cs:8:19:8:19 | [b (line 3): true] access to local variable x | Splitting.cs:9:17:9:17 | [b (line 3): true] access to local variable x |
| Splitting.cs:8:19:8:19 | [post] [b (line 3): true] access to local variable x | Splitting.cs:9:17:9:17 | [b (line 3): true] access to local variable x |
| Splitting.cs:9:17:9:17 | [b (line 3): true] access to local variable x | Splitting.cs:9:17:9:25 | [b (line 3): true] ... == ... |
| Splitting.cs:9:17:9:17 | [b (line 3): true] access to local variable x | Splitting.cs:12:15:12:15 | [b (line 3): true] access to local variable x |
| Splitting.cs:12:15:12:15 | [b (line 3): true] access to local variable x | Splitting.cs:14:19:14:19 | access to local variable x |
| Splitting.cs:12:15:12:15 | [post] [b (line 3): true] access to local variable x | Splitting.cs:14:19:14:19 | access to local variable x |
| Splitting.cs:6:13:6:13 | [input] SSA phi read(x) | Splitting.cs:12:15:12:15 | access to local variable x |
| Splitting.cs:6:13:6:13 | access to parameter b | Splitting.cs:13:13:13:13 | access to parameter b |
| Splitting.cs:8:19:8:19 | [post] access to local variable x | Splitting.cs:9:17:9:17 | access to local variable x |
| Splitting.cs:8:19:8:19 | access to local variable x | Splitting.cs:9:17:9:17 | access to local variable x |
| Splitting.cs:9:17:9:17 | access to local variable x | Splitting.cs:9:17:9:25 | ... == ... |
| Splitting.cs:9:17:9:17 | access to local variable x | Splitting.cs:9:17:9:25 | [input] SSA phi read(x) |
| Splitting.cs:9:17:9:25 | [input] SSA phi read(x) | Splitting.cs:12:15:12:15 | access to local variable x |
| Splitting.cs:12:15:12:15 | [post] access to local variable x | Splitting.cs:14:19:14:19 | access to local variable x |
| Splitting.cs:12:15:12:15 | access to local variable x | Splitting.cs:14:19:14:19 | access to local variable x |
| Splitting.cs:17:18:17:18 | SSA param(b) | Splitting.cs:20:13:20:13 | access to parameter b |
| Splitting.cs:17:18:17:18 | b | Splitting.cs:17:18:17:18 | SSA param(b) |
| Splitting.cs:19:13:19:13 | access to local variable x | Splitting.cs:19:13:19:18 | SSA def(x) |
| Splitting.cs:19:13:19:18 | SSA def(x) | Splitting.cs:22:19:22:19 | [b (line 17): true] access to local variable x |
| Splitting.cs:19:13:19:18 | SSA def(x) | Splitting.cs:25:15:25:15 | [b (line 17): false] access to local variable x |
| Splitting.cs:19:13:19:18 | SSA def(x) | Splitting.cs:20:13:20:13 | [input] SSA phi(x) |
| Splitting.cs:19:13:19:18 | SSA def(x) | Splitting.cs:22:19:22:19 | access to local variable x |
| Splitting.cs:19:17:19:18 | "" | Splitting.cs:19:13:19:13 | access to local variable x |
| Splitting.cs:20:13:20:13 | access to parameter b | Splitting.cs:26:13:26:13 | [b (line 17): false] access to parameter b |
| Splitting.cs:20:13:20:13 | access to parameter b | Splitting.cs:26:13:26:13 | [b (line 17): true] access to parameter b |
| Splitting.cs:23:13:23:13 | access to local variable x | Splitting.cs:23:13:23:30 | [b (line 17): true] SSA def(x) |
| Splitting.cs:23:13:23:30 | [b (line 17): true] SSA def(x) | Splitting.cs:25:15:25:15 | [b (line 17): true] access to local variable x |
| Splitting.cs:23:17:23:30 | [b (line 17): true] "taint source" | Splitting.cs:23:13:23:13 | access to local variable x |
| Splitting.cs:25:15:25:15 | [b (line 17): false] access to local variable x | Splitting.cs:29:19:29:19 | access to local variable x |
| Splitting.cs:25:15:25:15 | [b (line 17): true] access to local variable x | Splitting.cs:27:19:27:19 | access to local variable x |
| Splitting.cs:25:15:25:15 | [post] [b (line 17): false] access to local variable x | Splitting.cs:29:19:29:19 | access to local variable x |
| Splitting.cs:25:15:25:15 | [post] [b (line 17): true] access to local variable x | Splitting.cs:27:19:27:19 | access to local variable x |
| Splitting.cs:20:13:20:13 | [input] SSA phi(x) | Splitting.cs:25:15:25:15 | access to local variable x |
| Splitting.cs:20:13:20:13 | access to parameter b | Splitting.cs:26:13:26:13 | access to parameter b |
| Splitting.cs:23:13:23:13 | access to local variable x | Splitting.cs:23:13:23:30 | SSA def(x) |
| Splitting.cs:23:13:23:30 | SSA def(x) | Splitting.cs:25:15:25:15 | access to local variable x |
| Splitting.cs:23:17:23:30 | "taint source" | Splitting.cs:23:13:23:13 | access to local variable x |
| Splitting.cs:25:15:25:15 | [post] access to local variable x | Splitting.cs:27:19:27:19 | access to local variable x |
| Splitting.cs:25:15:25:15 | [post] access to local variable x | Splitting.cs:29:19:29:19 | access to local variable x |
| Splitting.cs:25:15:25:15 | access to local variable x | Splitting.cs:27:19:27:19 | access to local variable x |
| Splitting.cs:25:15:25:15 | access to local variable x | Splitting.cs:29:19:29:19 | access to local variable x |
| Splitting.cs:32:18:32:18 | SSA param(b) | Splitting.cs:35:13:35:13 | access to parameter b |
| Splitting.cs:32:18:32:18 | b | Splitting.cs:32:18:32:18 | SSA param(b) |
| Splitting.cs:34:17:34:18 | "" | Splitting.cs:34:13:34:13 | access to local variable x |
| Splitting.cs:35:13:35:13 | access to parameter b | Splitting.cs:39:15:39:15 | [b (line 32): false] access to parameter b |
| Splitting.cs:35:13:35:13 | access to parameter b | Splitting.cs:39:15:39:15 | [b (line 32): true] access to parameter b |
| Splitting.cs:36:17:36:19 | [b (line 32): true] "a" | Splitting.cs:36:13:36:13 | access to local variable x |
| Splitting.cs:37:9:37:9 | access to local variable x | Splitting.cs:37:9:37:15 | [b (line 32): false] SSA def(x) |
| Splitting.cs:37:9:37:9 | access to local variable x | Splitting.cs:37:9:37:15 | [b (line 32): true] SSA def(x) |
| Splitting.cs:37:9:37:15 | [b (line 32): false] SSA def(x) | Splitting.cs:38:15:38:15 | [b (line 32): false] access to local variable x |
| Splitting.cs:37:9:37:15 | [b (line 32): true] SSA def(x) | Splitting.cs:38:15:38:15 | [b (line 32): true] access to local variable x |
| Splitting.cs:37:13:37:15 | [b (line 32): false] "b" | Splitting.cs:37:9:37:9 | access to local variable x |
| Splitting.cs:37:13:37:15 | [b (line 32): true] "b" | Splitting.cs:37:9:37:9 | access to local variable x |
| Splitting.cs:38:15:38:15 | [b (line 32): false] access to local variable x | Splitting.cs:40:23:40:23 | [b (line 32): false] access to local variable x |
| Splitting.cs:38:15:38:15 | [b (line 32): true] access to local variable x | Splitting.cs:39:19:39:19 | [b (line 32): true] access to local variable x |
| Splitting.cs:38:15:38:15 | [post] [b (line 32): false] access to local variable x | Splitting.cs:40:23:40:23 | [b (line 32): false] access to local variable x |
| Splitting.cs:38:15:38:15 | [post] [b (line 32): true] access to local variable x | Splitting.cs:39:19:39:19 | [b (line 32): true] access to local variable x |
| Splitting.cs:39:15:39:15 | [b (line 32): false] access to parameter b | Splitting.cs:42:13:42:13 | [b (line 32): false] access to parameter b |
| Splitting.cs:39:15:39:15 | [b (line 32): true] access to parameter b | Splitting.cs:42:13:42:13 | [b (line 32): true] access to parameter b |
| Splitting.cs:39:19:39:19 | [b (line 32): true] access to local variable x | Splitting.cs:39:15:39:25 | [b (line 32): true] ... ? ... : ... |
| Splitting.cs:39:19:39:19 | [b (line 32): true] access to local variable x | Splitting.cs:40:23:40:23 | [b (line 32): true] access to local variable x |
| Splitting.cs:39:19:39:19 | [post] [b (line 32): true] access to local variable x | Splitting.cs:40:23:40:23 | [b (line 32): true] access to local variable x |
| Splitting.cs:39:23:39:25 | [b (line 32): false] "c" | Splitting.cs:39:15:39:25 | [b (line 32): false] ... ? ... : ... |
| Splitting.cs:40:23:40:23 | [b (line 32): false] access to local variable x | Splitting.cs:40:15:40:23 | [b (line 32): false] (...) ... |
| Splitting.cs:40:23:40:23 | [b (line 32): true] access to local variable x | Splitting.cs:40:15:40:23 | [b (line 32): true] (...) ... |
| Splitting.cs:41:19:41:21 | [b (line 32): false] "d" | Splitting.cs:41:15:41:15 | access to local variable x |
| Splitting.cs:41:19:41:21 | [b (line 32): false] "d" | Splitting.cs:41:15:41:21 | [b (line 32): false] ... = ... |
| Splitting.cs:41:19:41:21 | [b (line 32): true] "d" | Splitting.cs:41:15:41:15 | access to local variable x |
| Splitting.cs:41:19:41:21 | [b (line 32): true] "d" | Splitting.cs:41:15:41:21 | [b (line 32): true] ... = ... |
| Splitting.cs:35:13:35:13 | access to parameter b | Splitting.cs:39:15:39:15 | access to parameter b |
| Splitting.cs:36:17:36:19 | "a" | Splitting.cs:36:13:36:13 | access to local variable x |
| Splitting.cs:37:9:37:9 | access to local variable x | Splitting.cs:37:9:37:15 | SSA def(x) |
| Splitting.cs:37:9:37:15 | SSA def(x) | Splitting.cs:38:15:38:15 | access to local variable x |
| Splitting.cs:37:13:37:15 | "b" | Splitting.cs:37:9:37:9 | access to local variable x |
| Splitting.cs:38:15:38:15 | [post] access to local variable x | Splitting.cs:39:19:39:19 | access to local variable x |
| Splitting.cs:38:15:38:15 | [post] access to local variable x | Splitting.cs:39:23:39:25 | [input] SSA phi read(x) |
| Splitting.cs:38:15:38:15 | access to local variable x | Splitting.cs:39:19:39:19 | access to local variable x |
| Splitting.cs:38:15:38:15 | access to local variable x | Splitting.cs:39:23:39:25 | [input] SSA phi read(x) |
| Splitting.cs:39:15:39:15 | access to parameter b | Splitting.cs:42:13:42:13 | access to parameter b |
| Splitting.cs:39:19:39:19 | [post] access to local variable x | Splitting.cs:40:23:40:23 | access to local variable x |
| Splitting.cs:39:19:39:19 | access to local variable x | Splitting.cs:39:15:39:25 | ... ? ... : ... |
| Splitting.cs:39:19:39:19 | access to local variable x | Splitting.cs:40:23:40:23 | access to local variable x |
| Splitting.cs:39:23:39:25 | "c" | Splitting.cs:39:15:39:25 | ... ? ... : ... |
| Splitting.cs:39:23:39:25 | [input] SSA phi read(x) | Splitting.cs:40:23:40:23 | access to local variable x |
| Splitting.cs:40:23:40:23 | access to local variable x | Splitting.cs:40:15:40:23 | (...) ... |
| Splitting.cs:41:19:41:21 | "d" | Splitting.cs:41:15:41:15 | access to local variable x |
| Splitting.cs:41:19:41:21 | "d" | Splitting.cs:41:15:41:21 | ... = ... |
| Splitting.cs:46:18:46:18 | SSA param(b) | Splitting.cs:49:13:49:13 | access to parameter b |
| Splitting.cs:46:18:46:18 | b | Splitting.cs:46:18:46:18 | SSA param(b) |
| Splitting.cs:48:13:48:13 | access to local variable x | Splitting.cs:48:13:48:18 | SSA def(x) |
| Splitting.cs:48:13:48:18 | SSA def(x) | Splitting.cs:53:13:53:13 | [b (line 46): false] access to local variable x |
| Splitting.cs:48:13:48:18 | SSA def(x) | Splitting.cs:53:13:53:13 | access to local variable x |
| Splitting.cs:48:17:48:18 | "" | Splitting.cs:48:13:48:13 | access to local variable x |
| Splitting.cs:49:13:49:13 | access to parameter b | Splitting.cs:60:13:60:13 | [b (line 46): false] access to parameter b |
| Splitting.cs:49:13:49:13 | access to parameter b | Splitting.cs:60:13:60:13 | [b (line 46): true] access to parameter b |
| Splitting.cs:50:13:50:13 | access to local variable x | Splitting.cs:50:13:50:21 | [b (line 46): true] SSA def(x) |
| Splitting.cs:50:13:50:21 | [b (line 46): true] SSA def(x) | Splitting.cs:53:13:53:13 | [b (line 46): true] access to local variable x |
| Splitting.cs:50:17:50:21 | [b (line 46): true] "abc" | Splitting.cs:50:13:50:13 | access to local variable x |
| Splitting.cs:51:13:51:13 | access to local variable y | Splitting.cs:51:13:51:36 | [b (line 46): false] SSA def(y) |
| Splitting.cs:51:13:51:13 | access to local variable y | Splitting.cs:51:13:51:36 | [b (line 46): true] SSA def(y) |
| Splitting.cs:51:13:51:36 | [b (line 46): false] SSA def(y) | Splitting.cs:52:9:52:9 | [b (line 46): false] access to local variable y |
| Splitting.cs:51:13:51:36 | [b (line 46): true] SSA def(y) | Splitting.cs:52:9:52:9 | [b (line 46): true] access to local variable y |
| Splitting.cs:51:17:51:36 | [b (line 46): false] array creation of type String[] | Splitting.cs:51:13:51:13 | access to local variable y |
| Splitting.cs:51:17:51:36 | [b (line 46): true] array creation of type String[] | Splitting.cs:51:13:51:13 | access to local variable y |
| Splitting.cs:51:30:51:36 | [b (line 46): false] { ..., ... } | Splitting.cs:51:17:51:36 | [b (line 46): false] array creation of type String[] |
| Splitting.cs:51:30:51:36 | [b (line 46): true] { ..., ... } | Splitting.cs:51:17:51:36 | [b (line 46): true] array creation of type String[] |
| Splitting.cs:51:32:51:34 | [b (line 46): false] "a" | Splitting.cs:51:30:51:36 | [b (line 46): false] { ..., ... } |
| Splitting.cs:51:32:51:34 | [b (line 46): true] "a" | Splitting.cs:51:30:51:36 | [b (line 46): true] { ..., ... } |
| Splitting.cs:52:9:52:9 | [b (line 46): false] access to local variable y | Splitting.cs:53:17:53:17 | [b (line 46): false] access to local variable y |
| Splitting.cs:52:9:52:9 | [b (line 46): true] access to local variable y | Splitting.cs:53:17:53:17 | [b (line 46): true] access to local variable y |
| Splitting.cs:52:9:52:9 | [post] [b (line 46): false] access to local variable y | Splitting.cs:53:17:53:17 | [b (line 46): false] access to local variable y |
| Splitting.cs:52:9:52:9 | [post] [b (line 46): true] access to local variable y | Splitting.cs:53:17:53:17 | [b (line 46): true] access to local variable y |
| Splitting.cs:52:16:52:18 | [b (line 46): false] "b" | Splitting.cs:52:9:52:9 | [post] [b (line 46): false] access to local variable y |
| Splitting.cs:52:16:52:18 | [b (line 46): false] "b" | Splitting.cs:52:9:52:12 | access to array element |
| Splitting.cs:52:16:52:18 | [b (line 46): true] "b" | Splitting.cs:52:9:52:9 | [post] [b (line 46): true] access to local variable y |
| Splitting.cs:52:16:52:18 | [b (line 46): true] "b" | Splitting.cs:52:9:52:12 | access to array element |
| Splitting.cs:53:9:53:9 | access to local variable x | Splitting.cs:53:9:53:20 | [b (line 46): false] SSA def(x) |
| Splitting.cs:53:9:53:9 | access to local variable x | Splitting.cs:53:9:53:20 | [b (line 46): true] SSA def(x) |
| Splitting.cs:53:9:53:20 | [b (line 46): false] SSA def(x) | Splitting.cs:54:17:54:17 | [b (line 46): false] access to local variable x |
| Splitting.cs:53:9:53:20 | [b (line 46): true] SSA def(x) | Splitting.cs:54:17:54:17 | [b (line 46): true] access to local variable x |
| Splitting.cs:53:13:53:13 | [b (line 46): false] access to local variable x | Splitting.cs:53:13:53:20 | [b (line 46): false] ... + ... |
| Splitting.cs:53:13:53:13 | [b (line 46): true] access to local variable x | Splitting.cs:53:13:53:20 | [b (line 46): true] ... + ... |
| Splitting.cs:53:13:53:20 | [b (line 46): false] ... + ... | Splitting.cs:53:9:53:9 | access to local variable x |
| Splitting.cs:53:13:53:20 | [b (line 46): true] ... + ... | Splitting.cs:53:9:53:9 | access to local variable x |
| Splitting.cs:53:17:53:17 | [b (line 46): false] access to local variable y | Splitting.cs:53:17:53:20 | [b (line 46): false] access to array element |
| Splitting.cs:53:17:53:17 | [b (line 46): false] access to local variable y | Splitting.cs:57:17:57:17 | [b (line 46): false] access to local variable y |
| Splitting.cs:53:17:53:17 | [b (line 46): true] access to local variable y | Splitting.cs:53:17:53:20 | [b (line 46): true] access to array element |
| Splitting.cs:53:17:53:17 | [b (line 46): true] access to local variable y | Splitting.cs:57:17:57:17 | [b (line 46): true] access to local variable y |
| Splitting.cs:53:17:53:20 | [b (line 46): false] access to array element | Splitting.cs:53:13:53:20 | [b (line 46): false] ... + ... |
| Splitting.cs:53:17:53:20 | [b (line 46): true] access to array element | Splitting.cs:53:13:53:20 | [b (line 46): true] ... + ... |
| Splitting.cs:54:13:54:13 | access to local variable z | Splitting.cs:54:13:54:23 | [b (line 46): false] SSA def(z) |
| Splitting.cs:54:13:54:13 | access to local variable z | Splitting.cs:54:13:54:23 | [b (line 46): true] SSA def(z) |
| Splitting.cs:54:13:54:23 | [b (line 46): false] SSA def(z) | Splitting.cs:55:14:55:14 | [b (line 46): false] access to local variable z |
| Splitting.cs:54:13:54:23 | [b (line 46): true] SSA def(z) | Splitting.cs:55:14:55:14 | [b (line 46): true] access to local variable z |
| Splitting.cs:54:17:54:17 | [b (line 46): false] access to local variable x | Splitting.cs:54:17:54:23 | [b (line 46): false] ... == ... |
| Splitting.cs:54:17:54:17 | [b (line 46): false] access to local variable x | Splitting.cs:56:17:56:17 | [b (line 46): false] access to local variable x |
| Splitting.cs:54:17:54:17 | [b (line 46): true] access to local variable x | Splitting.cs:54:17:54:23 | [b (line 46): true] ... == ... |
| Splitting.cs:54:17:54:17 | [b (line 46): true] access to local variable x | Splitting.cs:56:17:56:17 | [b (line 46): true] access to local variable x |
| Splitting.cs:54:17:54:23 | [b (line 46): false] ... == ... | Splitting.cs:54:13:54:13 | access to local variable z |
| Splitting.cs:54:17:54:23 | [b (line 46): true] ... == ... | Splitting.cs:54:13:54:13 | access to local variable z |
| Splitting.cs:55:13:55:14 | [b (line 46): false] !... | Splitting.cs:55:9:55:9 | access to local variable z |
| Splitting.cs:55:13:55:14 | [b (line 46): true] !... | Splitting.cs:55:9:55:9 | access to local variable z |
| Splitting.cs:55:14:55:14 | [b (line 46): false] access to local variable z | Splitting.cs:55:13:55:14 | [b (line 46): false] !... |
| Splitting.cs:55:14:55:14 | [b (line 46): true] access to local variable z | Splitting.cs:55:13:55:14 | [b (line 46): true] !... |
| Splitting.cs:56:9:56:9 | access to local variable x | Splitting.cs:56:9:56:19 | [b (line 46): false] SSA def(x) |
| Splitting.cs:56:9:56:9 | access to local variable x | Splitting.cs:56:9:56:19 | [b (line 46): true] SSA def(x) |
| Splitting.cs:56:9:56:19 | [b (line 46): false] SSA def(x) | Splitting.cs:57:14:57:14 | [b (line 46): false] access to local variable x |
| Splitting.cs:56:9:56:19 | [b (line 46): true] SSA def(x) | Splitting.cs:57:14:57:14 | [b (line 46): true] access to local variable x |
| Splitting.cs:56:13:56:19 | [b (line 46): false] $"..." | Splitting.cs:56:9:56:9 | access to local variable x |
| Splitting.cs:56:13:56:19 | [b (line 46): true] $"..." | Splitting.cs:56:9:56:9 | access to local variable x |
| Splitting.cs:56:15:56:15 | [b (line 46): false] "c" | Splitting.cs:56:13:56:19 | [b (line 46): false] $"..." |
| Splitting.cs:56:15:56:15 | [b (line 46): true] "c" | Splitting.cs:56:13:56:19 | [b (line 46): true] $"..." |
| Splitting.cs:56:16:56:18 | [b (line 46): false] {...} | Splitting.cs:56:13:56:19 | [b (line 46): false] $"..." |
| Splitting.cs:56:16:56:18 | [b (line 46): true] {...} | Splitting.cs:56:13:56:19 | [b (line 46): true] $"..." |
| Splitting.cs:56:17:56:17 | [b (line 46): false] access to local variable x | Splitting.cs:56:16:56:18 | [b (line 46): false] {...} |
| Splitting.cs:56:17:56:17 | [b (line 46): true] access to local variable x | Splitting.cs:56:16:56:18 | [b (line 46): true] {...} |
| Splitting.cs:57:13:57:24 | [b (line 46): false] access to field Item1 | Splitting.cs:57:9:57:9 | access to local variable x |
| Splitting.cs:57:13:57:24 | [b (line 46): true] access to field Item1 | Splitting.cs:57:9:57:9 | access to local variable x |
| Splitting.cs:57:17:57:17 | [b (line 46): false] access to local variable y | Splitting.cs:58:27:58:27 | [b (line 46): false] access to local variable y |
| Splitting.cs:57:17:57:17 | [b (line 46): true] access to local variable y | Splitting.cs:58:27:58:27 | [b (line 46): true] access to local variable y |
| Splitting.cs:58:22:58:22 | String s | Splitting.cs:58:22:58:22 | [b (line 46): false] SSA def(s) |
| Splitting.cs:58:22:58:22 | String s | Splitting.cs:58:22:58:22 | [b (line 46): true] SSA def(s) |
| Splitting.cs:58:22:58:22 | [b (line 46): false] SSA def(s) | Splitting.cs:59:19:59:19 | [b (line 46): false] access to local variable s |
| Splitting.cs:58:22:58:22 | [b (line 46): true] SSA def(s) | Splitting.cs:59:19:59:19 | [b (line 46): true] access to local variable s |
| Splitting.cs:58:27:58:27 | [b (line 46): false] access to local variable y | Splitting.cs:58:22:58:22 | [b (line 46): false] SSA def(s) |
| Splitting.cs:58:27:58:27 | [b (line 46): true] access to local variable y | Splitting.cs:58:22:58:22 | [b (line 46): true] SSA def(s) |
| Splitting.cs:49:13:49:13 | access to parameter b | Splitting.cs:60:13:60:13 | access to parameter b |
| Splitting.cs:50:13:50:13 | access to local variable x | Splitting.cs:50:13:50:21 | SSA def(x) |
| Splitting.cs:50:13:50:21 | SSA def(x) | Splitting.cs:53:13:53:13 | access to local variable x |
| Splitting.cs:50:17:50:21 | "abc" | Splitting.cs:50:13:50:13 | access to local variable x |
| Splitting.cs:51:13:51:13 | access to local variable y | Splitting.cs:51:13:51:36 | SSA def(y) |
| Splitting.cs:51:13:51:36 | SSA def(y) | Splitting.cs:52:9:52:9 | access to local variable y |
| Splitting.cs:51:17:51:36 | array creation of type String[] | Splitting.cs:51:13:51:13 | access to local variable y |
| Splitting.cs:51:30:51:36 | { ..., ... } | Splitting.cs:51:17:51:36 | array creation of type String[] |
| Splitting.cs:51:32:51:34 | "a" | Splitting.cs:51:30:51:36 | { ..., ... } |
| Splitting.cs:52:9:52:9 | [post] access to local variable y | Splitting.cs:53:17:53:17 | access to local variable y |
| Splitting.cs:52:9:52:9 | access to local variable y | Splitting.cs:53:17:53:17 | access to local variable y |
| Splitting.cs:52:16:52:18 | "b" | Splitting.cs:52:9:52:9 | [post] access to local variable y |
| Splitting.cs:52:16:52:18 | "b" | Splitting.cs:52:9:52:12 | access to array element |
| Splitting.cs:53:9:53:9 | access to local variable x | Splitting.cs:53:9:53:20 | SSA def(x) |
| Splitting.cs:53:9:53:20 | SSA def(x) | Splitting.cs:54:17:54:17 | access to local variable x |
| Splitting.cs:53:13:53:13 | access to local variable x | Splitting.cs:53:13:53:20 | ... + ... |
| Splitting.cs:53:13:53:20 | ... + ... | Splitting.cs:53:9:53:9 | access to local variable x |
| Splitting.cs:53:17:53:17 | access to local variable y | Splitting.cs:53:17:53:20 | access to array element |
| Splitting.cs:53:17:53:17 | access to local variable y | Splitting.cs:57:17:57:17 | access to local variable y |
| Splitting.cs:53:17:53:20 | access to array element | Splitting.cs:53:13:53:20 | ... + ... |
| Splitting.cs:54:13:54:13 | access to local variable z | Splitting.cs:54:13:54:23 | SSA def(z) |
| Splitting.cs:54:13:54:23 | SSA def(z) | Splitting.cs:55:14:55:14 | access to local variable z |
| Splitting.cs:54:17:54:17 | access to local variable x | Splitting.cs:54:17:54:23 | ... == ... |
| Splitting.cs:54:17:54:17 | access to local variable x | Splitting.cs:56:17:56:17 | access to local variable x |
| Splitting.cs:54:17:54:23 | ... == ... | Splitting.cs:54:13:54:13 | access to local variable z |
| Splitting.cs:55:13:55:14 | !... | Splitting.cs:55:9:55:9 | access to local variable z |
| Splitting.cs:55:14:55:14 | access to local variable z | Splitting.cs:55:13:55:14 | !... |
| Splitting.cs:56:9:56:9 | access to local variable x | Splitting.cs:56:9:56:19 | SSA def(x) |
| Splitting.cs:56:9:56:19 | SSA def(x) | Splitting.cs:57:14:57:14 | access to local variable x |
| Splitting.cs:56:13:56:19 | $"..." | Splitting.cs:56:9:56:9 | access to local variable x |
| Splitting.cs:56:15:56:15 | "c" | Splitting.cs:56:13:56:19 | $"..." |
| Splitting.cs:56:16:56:18 | {...} | Splitting.cs:56:13:56:19 | $"..." |
| Splitting.cs:56:17:56:17 | access to local variable x | Splitting.cs:56:16:56:18 | {...} |
| Splitting.cs:57:13:57:24 | access to field Item1 | Splitting.cs:57:9:57:9 | access to local variable x |
| Splitting.cs:57:17:57:17 | access to local variable y | Splitting.cs:58:27:58:27 | access to local variable y |
| Splitting.cs:58:22:58:22 | SSA def(s) | Splitting.cs:59:19:59:19 | access to local variable s |
| Splitting.cs:58:22:58:22 | String s | Splitting.cs:58:22:58:22 | SSA def(s) |
| Splitting.cs:58:27:58:27 | access to local variable y | Splitting.cs:58:22:58:22 | SSA def(s) |
| UseUseExplosion.cs:21:10:21:10 | SSA entry def(this.Prop) | UseUseExplosion.cs:24:13:24:16 | access to property Prop |
| UseUseExplosion.cs:21:10:21:10 | this | UseUseExplosion.cs:24:13:24:16 | this access |
| UseUseExplosion.cs:23:13:23:13 | access to local variable x | UseUseExplosion.cs:23:13:23:17 | SSA def(x) |

View File

@@ -89,26 +89,24 @@
| ModulusAnalysis.cs:47:37:47:38 | 11 | 0 | 11 | 0 |
| ModulusAnalysis.cs:48:34:48:34 | access to local variable l | 0 | 1 | 4 |
| ModulusAnalysis.cs:48:34:48:34 | access to local variable l | SSA def(l) | 0 | 0 |
| ModulusAnalysis.cs:52:13:52:25 | [cond2 (line 9): true] ... = ... | 0 | 3 | 4 |
| ModulusAnalysis.cs:52:17:52:17 | [cond2 (line 9): true] access to parameter i | SSA param(i) | 0 | 0 |
| ModulusAnalysis.cs:52:17:52:21 | [cond2 (line 9): true] ... * ... | 0 | 0 | 4 |
| ModulusAnalysis.cs:52:17:52:25 | [cond2 (line 9): true] ... + ... | 0 | 3 | 4 |
| ModulusAnalysis.cs:52:21:52:21 | [cond2 (line 9): true] 4 | 0 | 4 | 0 |
| ModulusAnalysis.cs:52:25:52:25 | [cond2 (line 9): true] 3 | 0 | 3 | 0 |
| ModulusAnalysis.cs:56:13:56:25 | [cond2 (line 9): false] ... = ... | 0 | 7 | 8 |
| ModulusAnalysis.cs:56:17:56:17 | [cond2 (line 9): false] access to parameter i | SSA param(i) | 0 | 0 |
| ModulusAnalysis.cs:56:17:56:21 | [cond2 (line 9): false] ... * ... | 0 | 0 | 8 |
| ModulusAnalysis.cs:56:17:56:25 | [cond2 (line 9): false] ... + ... | 0 | 7 | 8 |
| ModulusAnalysis.cs:56:21:56:21 | [cond2 (line 9): false] 8 | 0 | 8 | 0 |
| ModulusAnalysis.cs:56:25:56:25 | [cond2 (line 9): false] 7 | 0 | 7 | 0 |
| ModulusAnalysis.cs:58:34:58:34 | [cond2 (line 9): false] access to local variable j | 0 | 7 | 8 |
| ModulusAnalysis.cs:58:34:58:34 | [cond2 (line 9): false] access to local variable j | [cond2 (line 9): false] SSA def(j) | 0 | 0 |
| ModulusAnalysis.cs:58:34:58:34 | [cond2 (line 9): true] access to local variable j | 0 | 3 | 4 |
| ModulusAnalysis.cs:58:34:58:34 | [cond2 (line 9): true] access to local variable j | [cond2 (line 9): true] SSA def(j) | 0 | 0 |
| ModulusAnalysis.cs:52:13:52:25 | ... = ... | 0 | 3 | 4 |
| ModulusAnalysis.cs:52:17:52:17 | access to parameter i | SSA param(i) | 0 | 0 |
| ModulusAnalysis.cs:52:17:52:21 | ... * ... | 0 | 0 | 4 |
| ModulusAnalysis.cs:52:17:52:25 | ... + ... | 0 | 3 | 4 |
| ModulusAnalysis.cs:52:21:52:21 | 4 | 0 | 4 | 0 |
| ModulusAnalysis.cs:52:25:52:25 | 3 | 0 | 3 | 0 |
| ModulusAnalysis.cs:56:13:56:25 | ... = ... | 0 | 7 | 8 |
| ModulusAnalysis.cs:56:17:56:17 | access to parameter i | SSA param(i) | 0 | 0 |
| ModulusAnalysis.cs:56:17:56:21 | ... * ... | 0 | 0 | 8 |
| ModulusAnalysis.cs:56:17:56:25 | ... + ... | 0 | 7 | 8 |
| ModulusAnalysis.cs:56:21:56:21 | 8 | 0 | 8 | 0 |
| ModulusAnalysis.cs:56:25:56:25 | 7 | 0 | 7 | 0 |
| ModulusAnalysis.cs:58:34:58:34 | access to local variable j | 0 | 3 | 4 |
| ModulusAnalysis.cs:58:34:58:34 | access to local variable j | SSA phi(j) | 0 | 0 |
| ModulusAnalysis.cs:62:38:62:38 | access to local variable j | 0 | 3 | 4 |
| ModulusAnalysis.cs:62:38:62:38 | access to local variable j | [cond2 (line 9): true] SSA def(j) | 0 | 0 |
| ModulusAnalysis.cs:66:38:66:38 | access to local variable j | 0 | 7 | 8 |
| ModulusAnalysis.cs:66:38:66:38 | access to local variable j | [cond2 (line 9): false] SSA def(j) | 0 | 0 |
| ModulusAnalysis.cs:62:38:62:38 | access to local variable j | SSA phi(j) | 0 | 0 |
| ModulusAnalysis.cs:66:38:66:38 | access to local variable j | 0 | 3 | 4 |
| ModulusAnalysis.cs:66:38:66:38 | access to local variable j | SSA phi(j) | 0 | 0 |
| ModulusAnalysis.cs:69:17:69:18 | 64 | 0 | 64 | 0 |
| ModulusAnalysis.cs:70:34:70:34 | access to local variable t | 0 | 64 | 0 |
| ModulusAnalysis.cs:70:34:70:34 | access to local variable t | SSA def(t) | 0 | 0 |
@@ -131,22 +129,20 @@
| ModulusAnalysis.cs:75:25:75:25 | 3 | 0 | 3 | 0 |
| ModulusAnalysis.cs:77:38:77:38 | access to parameter x | 0 | 3 | 16 |
| ModulusAnalysis.cs:77:38:77:38 | access to parameter x | SSA param(x) | 0 | 0 |
| ModulusAnalysis.cs:80:9:82:23 | [cond3 (line 9): false] ... = ... | 0 | 7 | 8 |
| ModulusAnalysis.cs:80:9:82:23 | [cond3 (line 9): true] ... = ... | 0 | 3 | 4 |
| ModulusAnalysis.cs:80:13:82:23 | [cond3 (line 9): false] ... ? ... : ... | 0 | 7 | 8 |
| ModulusAnalysis.cs:80:13:82:23 | [cond3 (line 9): true] ... ? ... : ... | 0 | 3 | 4 |
| ModulusAnalysis.cs:81:15:81:15 | [cond3 (line 9): true] access to parameter i | SSA param(i) | 0 | 0 |
| ModulusAnalysis.cs:81:15:81:19 | [cond3 (line 9): true] ... * ... | 0 | 0 | 4 |
| ModulusAnalysis.cs:81:15:81:23 | [cond3 (line 9): true] ... + ... | 0 | 3 | 4 |
| ModulusAnalysis.cs:81:19:81:19 | [cond3 (line 9): true] 4 | 0 | 4 | 0 |
| ModulusAnalysis.cs:81:23:81:23 | [cond3 (line 9): true] 3 | 0 | 3 | 0 |
| ModulusAnalysis.cs:82:15:82:15 | [cond3 (line 9): false] access to parameter i | SSA param(i) | 0 | 0 |
| ModulusAnalysis.cs:82:15:82:19 | [cond3 (line 9): false] ... * ... | 0 | 0 | 8 |
| ModulusAnalysis.cs:82:15:82:23 | [cond3 (line 9): false] ... + ... | 0 | 7 | 8 |
| ModulusAnalysis.cs:82:19:82:19 | [cond3 (line 9): false] 8 | 0 | 8 | 0 |
| ModulusAnalysis.cs:82:23:82:23 | [cond3 (line 9): false] 7 | 0 | 7 | 0 |
| ModulusAnalysis.cs:84:38:84:38 | access to local variable j | 0 | 7 | 8 |
| ModulusAnalysis.cs:84:38:84:38 | access to local variable j | [cond3 (line 9): false] SSA def(j) | 0 | 0 |
| ModulusAnalysis.cs:80:9:82:23 | ... = ... | 0 | 3 | 4 |
| ModulusAnalysis.cs:80:13:82:23 | ... ? ... : ... | 0 | 3 | 4 |
| ModulusAnalysis.cs:81:15:81:15 | access to parameter i | SSA param(i) | 0 | 0 |
| ModulusAnalysis.cs:81:15:81:19 | ... * ... | 0 | 0 | 4 |
| ModulusAnalysis.cs:81:15:81:23 | ... + ... | 0 | 3 | 4 |
| ModulusAnalysis.cs:81:19:81:19 | 4 | 0 | 4 | 0 |
| ModulusAnalysis.cs:81:23:81:23 | 3 | 0 | 3 | 0 |
| ModulusAnalysis.cs:82:15:82:15 | access to parameter i | SSA param(i) | 0 | 0 |
| ModulusAnalysis.cs:82:15:82:19 | ... * ... | 0 | 0 | 8 |
| ModulusAnalysis.cs:82:15:82:23 | ... + ... | 0 | 7 | 8 |
| ModulusAnalysis.cs:82:19:82:19 | 8 | 0 | 8 | 0 |
| ModulusAnalysis.cs:82:23:82:23 | 7 | 0 | 7 | 0 |
| ModulusAnalysis.cs:84:38:84:38 | access to local variable j | 0 | 3 | 4 |
| ModulusAnalysis.cs:84:38:84:38 | access to local variable j | SSA def(j) | 0 | 0 |
| ModulusAnalysis.cs:89:22:89:22 | 0 | 0 | 0 | 0 |
| ModulusAnalysis.cs:89:25:89:25 | access to local variable i | SSA phi(i) | 0 | 0 |
| ModulusAnalysis.cs:89:29:89:31 | access to parameter cap | SSA param(cap) | 0 | 0 |

View File

@@ -236,15 +236,11 @@
| SignAnalysis.cs:464:9:464:9 | access to local variable x | positive |
| SignAnalysis.cs:464:9:464:11 | ...++ | positive |
| SignAnalysis.cs:465:34:465:34 | access to local variable x | strictlyPositive |
| SignAnalysis.cs:470:21:470:21 | [b (line 468): true] 1 | strictlyPositive |
| SignAnalysis.cs:470:25:470:26 | [b (line 468): false] -... | strictlyNegative |
| SignAnalysis.cs:470:26:470:26 | [b (line 468): false] 1 | strictlyPositive |
| SignAnalysis.cs:480:16:480:20 | [b (line 477): true] ... = ... | strictlyPositive |
| SignAnalysis.cs:480:20:480:20 | [b (line 477): true] 1 | strictlyPositive |
| SignAnalysis.cs:480:28:480:33 | [b (line 477): false] ... = ... | strictlyNegative |
| SignAnalysis.cs:480:32:480:33 | [b (line 477): false] -... | strictlyNegative |
| SignAnalysis.cs:480:33:480:33 | [b (line 477): false] 1 | strictlyPositive |
| SignAnalysis.cs:482:34:482:34 | [b (line 477): false] access to local variable x | strictlyNegative |
| SignAnalysis.cs:482:34:482:34 | [b (line 477): true] access to local variable x | strictlyPositive |
| SignAnalysis.cs:485:38:485:38 | access to local variable x | strictlyPositive |
| SignAnalysis.cs:487:38:487:38 | access to local variable x | strictlyNegative |
| SignAnalysis.cs:470:21:470:21 | 1 | strictlyPositive |
| SignAnalysis.cs:470:25:470:26 | -... | strictlyNegative |
| SignAnalysis.cs:470:26:470:26 | 1 | strictlyPositive |
| SignAnalysis.cs:480:16:480:20 | ... = ... | strictlyPositive |
| SignAnalysis.cs:480:20:480:20 | 1 | strictlyPositive |
| SignAnalysis.cs:480:28:480:33 | ... = ... | strictlyNegative |
| SignAnalysis.cs:480:32:480:33 | -... | strictlyNegative |
| SignAnalysis.cs:480:33:480:33 | 1 | strictlyPositive |

View File

@@ -119,13 +119,6 @@
| Properties.cs:74:23:74:23 | a | Properties.cs:74:23:74:54 | Action a = ... | Properties.cs:77:9:77:9 | access to local variable a |
| Properties.cs:75:23:75:23 | b | Properties.cs:75:23:75:35 | Action b = ... | Properties.cs:80:9:80:9 | access to local variable b |
| Properties.cs:106:37:106:37 | p | Properties.cs:106:37:106:37 | p | Properties.cs:106:42:106:42 | access to parameter p |
| Splitting.cs:3:18:3:18 | b | Splitting.cs:3:18:3:18 | b | Splitting.cs:6:13:6:13 | access to parameter b |
| Splitting.cs:5:13:5:13 | x | Splitting.cs:10:13:10:19 | ... = ... | Splitting.cs:11:13:11:13 | access to local variable x |
| Splitting.cs:22:18:22:18 | b | Splitting.cs:22:18:22:18 | b | Splitting.cs:25:13:25:13 | access to parameter b |
| Splitting.cs:24:13:24:13 | x | Splitting.cs:29:13:29:19 | ... = ... | Splitting.cs:30:13:30:13 | access to local variable x |
| Splitting.cs:24:13:24:13 | x | Splitting.cs:32:9:32:15 | ... = ... | Splitting.cs:33:9:33:9 | access to local variable x |
| Splitting.cs:42:18:42:18 | b | Splitting.cs:42:18:42:18 | b | Splitting.cs:45:13:45:13 | access to parameter b |
| Splitting.cs:44:13:44:13 | x | Splitting.cs:49:13:49:19 | ... = ... | Splitting.cs:50:13:50:13 | access to local variable x |
| Test.cs:3:9:3:13 | field | Test.cs:57:9:57:17 | ... = ... | Test.cs:58:13:58:17 | access to field field |
| Test.cs:5:15:5:20 | param1 | Test.cs:5:15:5:20 | param1 | Test.cs:11:13:11:18 | access to parameter param1 |
| Test.cs:5:67:5:72 | param2 | Test.cs:5:67:5:72 | param2 | Test.cs:39:27:39:32 | access to parameter param2 |

View File

@@ -94,14 +94,6 @@
| Properties.cs:104:16:104:20 | Props | Properties.cs:114:20:114:35 | access to field Props | Properties.cs:115:21:115:36 | access to field Props |
| Properties.cs:104:16:104:20 | Props | Properties.cs:115:21:115:30 | access to field Props | Properties.cs:116:17:116:26 | access to field Props |
| Properties.cs:104:16:104:20 | Props | Properties.cs:115:21:115:36 | access to field Props | Properties.cs:116:17:116:32 | access to field Props |
| Splitting.cs:3:18:3:18 | b | Splitting.cs:6:13:6:13 | access to parameter b | Splitting.cs:15:13:15:13 | access to parameter b |
| Splitting.cs:5:13:5:13 | x | Splitting.cs:13:9:13:9 | access to local variable x | Splitting.cs:14:9:14:9 | access to local variable x |
| Splitting.cs:5:13:5:13 | x | Splitting.cs:14:9:14:9 | access to local variable x | Splitting.cs:17:13:17:13 | access to local variable x |
| Splitting.cs:22:18:22:18 | b | Splitting.cs:25:13:25:13 | access to parameter b | Splitting.cs:35:13:35:13 | access to parameter b |
| Splitting.cs:24:13:24:13 | x | Splitting.cs:33:9:33:9 | access to local variable x | Splitting.cs:34:9:34:9 | access to local variable x |
| Splitting.cs:24:13:24:13 | x | Splitting.cs:34:9:34:9 | access to local variable x | Splitting.cs:37:13:37:13 | access to local variable x |
| Splitting.cs:42:18:42:18 | b | Splitting.cs:45:13:45:13 | access to parameter b | Splitting.cs:52:13:52:13 | access to parameter b |
| Splitting.cs:44:13:44:13 | x | Splitting.cs:54:9:54:9 | access to local variable x | Splitting.cs:55:9:55:9 | access to local variable x |
| Test.cs:8:13:8:13 | x | Test.cs:25:16:25:16 | access to local variable x | Test.cs:25:16:25:16 | access to local variable x |
| Test.cs:9:13:9:13 | y | Test.cs:25:20:25:20 | access to local variable y | Test.cs:31:13:31:13 | access to local variable y |
| Test.cs:9:13:9:13 | y | Test.cs:25:20:25:20 | access to local variable y | Test.cs:43:20:43:20 | access to local variable y |

View File

@@ -33,8 +33,6 @@
| Properties.cs:33:19:33:22 | Properties.stat | Properties.cs:50:9:50:17 | SSA phi(Properties.stat) | Properties.cs:49:17:49:32 | SSA call def(Properties.stat) |
| Properties.cs:61:23:61:23 | i | Properties.cs:63:16:63:16 | SSA phi(i) | Properties.cs:61:23:61:23 | SSA param(i) |
| Properties.cs:61:23:61:23 | i | Properties.cs:63:16:63:16 | SSA phi(i) | Properties.cs:63:16:63:18 | SSA def(i) |
| Splitting.cs:44:13:44:13 | x | Splitting.cs:54:9:54:21 | SSA phi(x) | Splitting.cs:46:13:46:19 | [b (line 42): true] SSA def(x) |
| Splitting.cs:44:13:44:13 | x | Splitting.cs:54:9:54:21 | SSA phi(x) | Splitting.cs:49:13:49:19 | [b (line 42): false] SSA def(x) |
| Test.cs:5:15:5:20 | param1 | Test.cs:25:16:25:16 | SSA phi(param1) | Test.cs:5:15:5:20 | SSA param(param1) |
| Test.cs:5:15:5:20 | param1 | Test.cs:25:16:25:16 | SSA phi(param1) | Test.cs:27:17:27:24 | SSA def(param1) |
| Test.cs:5:15:5:20 | param1 | Test.cs:33:9:33:19 | SSA phi(param1) | Test.cs:25:16:25:16 | SSA phi(param1) |

View File

@@ -1,57 +0,0 @@
class Splitting
{
void M1(bool b)
{
var x = "";
if (b)
x = "a";
else
{
x = "b";
x.ToString();
}
x.ToString();
x.ToString();
if (b)
{
x.ToString();
x = "c";
}
}
void M2(bool b)
{
var x = "";
if (b)
x = "a";
else
{
x = "b";
x.ToString();
}
x = "c";
x.ToString();
x.ToString();
if (b)
{
x.ToString();
x = "d";
}
}
void M3(bool b)
{
var x = "";
if (b)
x = "a";
else
{
x = "b";
x.ToString();
}
if (b)
b = false;
x.ToString();
x.ToString();
}
}

View File

@@ -35,7 +35,6 @@
| Capture.cs:248:36:248:36 | j | Capture.cs:251:13:251:17 | SSA def(j) |
| Consistency.cs:7:25:7:25 | b | Consistency.cs:7:25:7:25 | SSA param(b) |
| Consistency.cs:15:17:15:17 | i | Consistency.cs:15:17:15:21 | SSA def(i) |
| Consistency.cs:15:17:15:17 | i | Consistency.cs:15:17:15:21 | [finally: exception] SSA def(i) |
| Consistency.cs:25:29:25:29 | c | Consistency.cs:25:29:25:29 | SSA def(c) |
| Consistency.cs:26:13:26:19 | c.Field | Consistency.cs:25:29:25:29 | SSA qualifier def(c.Field) |
| Consistency.cs:30:30:30:30 | c | Consistency.cs:32:9:32:29 | SSA def(c) |
@@ -242,17 +241,6 @@
| Properties.cs:114:20:114:35 | this.Props.Props | Properties.cs:113:9:113:22 | SSA call def(this.Props.Props) |
| Properties.cs:115:21:115:39 | this.Props.Props.xs | Properties.cs:108:10:108:10 | SSA qualifier def(this.Props.Props.xs) |
| Properties.cs:115:21:115:39 | this.Props.Props.xs | Properties.cs:113:9:113:22 | SSA qualifier def(this.Props.Props.xs) |
| Splitting.cs:3:18:3:18 | b | Splitting.cs:3:18:3:18 | SSA param(b) |
| Splitting.cs:5:13:5:13 | x | Splitting.cs:7:13:7:19 | [b (line 3): true] SSA def(x) |
| Splitting.cs:5:13:5:13 | x | Splitting.cs:10:13:10:19 | [b (line 3): false] SSA def(x) |
| Splitting.cs:22:18:22:18 | b | Splitting.cs:22:18:22:18 | SSA param(b) |
| Splitting.cs:24:13:24:13 | x | Splitting.cs:29:13:29:19 | [b (line 22): false] SSA def(x) |
| Splitting.cs:24:13:24:13 | x | Splitting.cs:32:9:32:15 | [b (line 22): false] SSA def(x) |
| Splitting.cs:24:13:24:13 | x | Splitting.cs:32:9:32:15 | [b (line 22): true] SSA def(x) |
| Splitting.cs:42:18:42:18 | b | Splitting.cs:42:18:42:18 | SSA param(b) |
| Splitting.cs:44:13:44:13 | x | Splitting.cs:46:13:46:19 | [b (line 42): true] SSA def(x) |
| Splitting.cs:44:13:44:13 | x | Splitting.cs:49:13:49:19 | [b (line 42): false] SSA def(x) |
| Splitting.cs:44:13:44:13 | x | Splitting.cs:54:9:54:21 | SSA phi(x) |
| Test.cs:5:15:5:20 | param1 | Test.cs:5:15:5:20 | SSA param(param1) |
| Test.cs:5:15:5:20 | param1 | Test.cs:25:16:25:16 | SSA phi(param1) |
| Test.cs:5:15:5:20 | param1 | Test.cs:27:17:27:24 | SSA def(param1) |

View File

@@ -35,7 +35,6 @@
| Capture.cs:251:13:251:17 | SSA def(j) | Capture.cs:251:13:251:17 | ... = ... |
| Consistency.cs:7:25:7:25 | SSA param(b) | Consistency.cs:7:25:7:25 | b |
| Consistency.cs:15:17:15:21 | SSA def(i) | Consistency.cs:15:17:15:21 | Int32 i = ... |
| Consistency.cs:15:17:15:21 | [finally: exception] SSA def(i) | Consistency.cs:15:17:15:21 | Int32 i = ... |
| Consistency.cs:25:29:25:29 | SSA def(c) | Consistency.cs:25:9:25:30 | call to method Out |
| Consistency.cs:25:29:25:29 | SSA qualifier def(c.Field) | Consistency.cs:25:9:25:30 | call to method Out |
| Consistency.cs:32:9:32:29 | SSA def(c) | Consistency.cs:32:9:32:29 | ... = ... |
@@ -52,9 +51,12 @@
| DefUse.cs:13:13:13:18 | SSA def(y) | DefUse.cs:13:13:13:18 | ... = ... |
| DefUse.cs:18:13:18:18 | SSA def(y) | DefUse.cs:18:13:18:18 | ... = ... |
| DefUse.cs:19:13:19:18 | SSA def(w) | DefUse.cs:19:13:19:18 | ... = ... |
| DefUse.cs:23:9:23:15 | SSA phi(w) | DefUse.cs:23:9:23:15 | ...; |
| DefUse.cs:23:9:23:15 | SSA phi(y) | DefUse.cs:23:9:23:15 | ...; |
| DefUse.cs:28:13:28:18 | SSA def(y) | DefUse.cs:28:13:28:18 | ... = ... |
| DefUse.cs:29:13:29:18 | SSA def(w) | DefUse.cs:29:13:29:18 | ... = ... |
| DefUse.cs:39:13:39:18 | SSA def(y) | DefUse.cs:39:13:39:18 | ... = ... |
| DefUse.cs:42:9:42:15 | SSA phi(y) | DefUse.cs:42:9:42:15 | ...; |
| DefUse.cs:44:13:44:17 | SSA def(z) | DefUse.cs:44:13:44:17 | Int32 z = ... |
| DefUse.cs:47:23:47:23 | SSA def(z) | DefUse.cs:47:9:47:24 | call to method outMethod |
| DefUse.cs:50:23:50:23 | SSA def(z) | DefUse.cs:50:9:50:24 | call to method refMethod |
@@ -65,12 +67,14 @@
| DefUse.cs:67:19:67:27 | SSA def(tc) | DefUse.cs:67:19:67:27 | TestClass tc = ... |
| DefUse.cs:79:13:79:18 | SSA def(x1) | DefUse.cs:79:13:79:18 | Int32 x1 = ... |
| DefUse.cs:80:30:80:31 | SSA def(x1) | DefUse.cs:80:16:80:32 | call to method refMethod |
| DefUse.cs:80:30:80:31 | SSA phi(x1) | DefUse.cs:80:30:80:31 | access to local variable x1 |
| DefUse.cs:83:13:83:18 | SSA def(x2) | DefUse.cs:83:13:83:18 | Int32 x2 = ... |
| DefUse.cs:85:15:85:16 | SSA def(x2) | DefUse.cs:84:9:86:17 | call to method refOutMethod |
| DefUse.cs:89:13:89:18 | SSA def(x3) | DefUse.cs:89:13:89:18 | Int32 x3 = ... |
| DefUse.cs:92:15:92:16 | SSA def(x3) | DefUse.cs:91:9:93:17 | call to method refOutMethod |
| DefUse.cs:93:15:93:16 | SSA def(x4) | DefUse.cs:91:9:93:17 | call to method refOutMethod |
| DefUse.cs:97:13:97:18 | SSA def(x5) | DefUse.cs:97:13:97:18 | Int32 x5 = ... |
| DefUse.cs:98:16:98:17 | SSA phi(x5) | DefUse.cs:98:16:98:17 | access to local variable x5 |
| DefUse.cs:101:13:101:23 | SSA def(x5) | DefUse.cs:101:13:101:23 | ... = ... |
| DefUse.cs:104:9:104:15 | SSA def(x5) | DefUse.cs:104:9:104:15 | ... = ... |
| DefUse.cs:114:47:114:52 | SSA def(i) | DefUse.cs:114:47:114:52 | ... = ... |
@@ -93,13 +97,16 @@
| Example.cs:8:9:8:22 | SSA def(this.Field) | Example.cs:8:9:8:22 | ... = ... |
| Example.cs:11:13:11:30 | SSA def(this.Field) | Example.cs:11:13:11:30 | ... = ... |
| Example.cs:13:13:13:23 | SSA call def(this.Field) | Example.cs:13:13:13:23 | call to method SetField |
| Example.cs:14:9:14:24 | SSA phi(this.Field) | Example.cs:14:9:14:24 | ...; |
| Example.cs:18:16:18:16 | SSA param(p) | Example.cs:18:16:18:16 | p |
| Example.cs:18:24:18:24 | SSA param(b) | Example.cs:18:24:18:24 | b |
| Example.cs:23:13:23:17 | SSA def(p) | Example.cs:23:13:23:17 | ... = ... |
| Example.cs:25:9:25:15 | SSA phi(p) | Example.cs:25:9:25:15 | ...; |
| Fields.cs:16:17:16:17 | SSA entry def(this.xs) | Fields.cs:16:17:16:17 | F |
| Fields.cs:19:9:19:13 | SSA call def(this.xs) | Fields.cs:19:9:19:13 | call to method Upd |
| Fields.cs:20:9:20:14 | SSA def(x) | Fields.cs:20:9:20:14 | ... = ... |
| Fields.cs:22:13:22:17 | SSA call def(this.xs) | Fields.cs:22:13:22:17 | call to method Upd |
| Fields.cs:23:9:23:20 | SSA phi(this.xs) | Fields.cs:23:9:23:20 | ...; |
| Fields.cs:24:9:24:23 | SSA def(this.xs) | Fields.cs:24:9:24:23 | ... = ... |
| Fields.cs:28:17:28:17 | SSA entry def(Fields.stat) | Fields.cs:28:17:28:17 | G |
| Fields.cs:28:17:28:17 | SSA entry def(this.xs) | Fields.cs:28:17:28:17 | G |
@@ -118,6 +125,9 @@
| Fields.cs:49:13:49:28 | SSA def(f) | Fields.cs:49:13:49:28 | ... = ... |
| Fields.cs:49:13:49:28 | SSA qualifier def(f.xs) | Fields.cs:49:13:49:28 | ... = ... |
| Fields.cs:49:17:49:28 | SSA call def(Fields.stat) | Fields.cs:49:17:49:28 | object creation of type Fields |
| Fields.cs:50:9:50:17 | SSA phi(Fields.stat) | Fields.cs:50:9:50:17 | ...; |
| Fields.cs:50:9:50:17 | SSA phi(f) | Fields.cs:50:9:50:17 | ...; |
| Fields.cs:50:9:50:17 | SSA phi(f.xs) | Fields.cs:50:9:50:17 | ...; |
| Fields.cs:51:9:51:20 | SSA call def(Fields.stat) | Fields.cs:51:9:51:20 | object creation of type Fields |
| Fields.cs:61:17:61:17 | SSA entry def(this.LoopField) | Fields.cs:61:17:61:17 | H |
| Fields.cs:61:17:61:17 | SSA entry def(this.SingleAccessedField) | Fields.cs:61:17:61:17 | H |
@@ -179,6 +189,7 @@
| Properties.cs:19:9:19:13 | SSA call def(this.xs) | Properties.cs:19:9:19:13 | call to method Upd |
| Properties.cs:20:9:20:14 | SSA def(x) | Properties.cs:20:9:20:14 | ... = ... |
| Properties.cs:22:13:22:17 | SSA call def(this.xs) | Properties.cs:22:13:22:17 | call to method Upd |
| Properties.cs:23:9:23:20 | SSA phi(this.xs) | Properties.cs:23:9:23:20 | ...; |
| Properties.cs:24:9:24:23 | SSA def(this.xs) | Properties.cs:24:9:24:23 | ... = ... |
| Properties.cs:28:17:28:17 | SSA entry def(Properties.stat) | Properties.cs:28:17:28:17 | G |
| Properties.cs:28:17:28:17 | SSA entry def(this.xs) | Properties.cs:28:17:28:17 | G |
@@ -197,10 +208,14 @@
| Properties.cs:49:13:49:32 | SSA def(f) | Properties.cs:49:13:49:32 | ... = ... |
| Properties.cs:49:13:49:32 | SSA qualifier def(f.xs) | Properties.cs:49:13:49:32 | ... = ... |
| Properties.cs:49:17:49:32 | SSA call def(Properties.stat) | Properties.cs:49:17:49:32 | object creation of type Properties |
| Properties.cs:50:9:50:17 | SSA phi(Properties.stat) | Properties.cs:50:9:50:17 | ...; |
| Properties.cs:50:9:50:17 | SSA phi(f) | Properties.cs:50:9:50:17 | ...; |
| Properties.cs:50:9:50:17 | SSA phi(f.xs) | Properties.cs:50:9:50:17 | ...; |
| Properties.cs:51:9:51:24 | SSA call def(Properties.stat) | Properties.cs:51:9:51:24 | object creation of type Properties |
| Properties.cs:61:17:61:17 | SSA entry def(this.LoopProp) | Properties.cs:61:17:61:17 | H |
| Properties.cs:61:17:61:17 | SSA entry def(this.SingleAccessedProp) | Properties.cs:61:17:61:17 | H |
| Properties.cs:61:23:61:23 | SSA param(i) | Properties.cs:61:23:61:23 | i |
| Properties.cs:63:16:63:16 | SSA phi(i) | Properties.cs:63:16:63:16 | access to parameter i |
| Properties.cs:63:16:63:18 | SSA def(i) | Properties.cs:63:16:63:18 | ...-- |
| Properties.cs:70:17:70:17 | SSA entry def(this.SingleAccessedProp) | Properties.cs:70:17:70:17 | I |
| Properties.cs:73:13:73:32 | SSA def(f) | Properties.cs:73:13:73:32 | Properties f = ... |
@@ -221,16 +236,6 @@
| Properties.cs:113:9:113:22 | SSA call def(this.Props) | Properties.cs:113:9:113:22 | call to method SetProps |
| Properties.cs:113:9:113:22 | SSA call def(this.Props.Props) | Properties.cs:113:9:113:22 | call to method SetProps |
| Properties.cs:113:9:113:22 | SSA qualifier def(this.Props.Props.xs) | Properties.cs:113:9:113:22 | call to method SetProps |
| Splitting.cs:3:18:3:18 | SSA param(b) | Splitting.cs:3:18:3:18 | b |
| Splitting.cs:7:13:7:19 | [b (line 3): true] SSA def(x) | Splitting.cs:7:13:7:19 | ... = ... |
| Splitting.cs:10:13:10:19 | [b (line 3): false] SSA def(x) | Splitting.cs:10:13:10:19 | ... = ... |
| Splitting.cs:22:18:22:18 | SSA param(b) | Splitting.cs:22:18:22:18 | b |
| Splitting.cs:29:13:29:19 | [b (line 22): false] SSA def(x) | Splitting.cs:29:13:29:19 | ... = ... |
| Splitting.cs:32:9:32:15 | [b (line 22): false] SSA def(x) | Splitting.cs:32:9:32:15 | ... = ... |
| Splitting.cs:32:9:32:15 | [b (line 22): true] SSA def(x) | Splitting.cs:32:9:32:15 | ... = ... |
| Splitting.cs:42:18:42:18 | SSA param(b) | Splitting.cs:42:18:42:18 | b |
| Splitting.cs:46:13:46:19 | [b (line 42): true] SSA def(x) | Splitting.cs:46:13:46:19 | ... = ... |
| Splitting.cs:49:13:49:19 | [b (line 42): false] SSA def(x) | Splitting.cs:49:13:49:19 | ... = ... |
| Test.cs:5:15:5:20 | SSA param(param1) | Test.cs:5:15:5:20 | param1 |
| Test.cs:5:67:5:72 | SSA param(param2) | Test.cs:5:67:5:72 | param2 |
| Test.cs:7:9:7:17 | SSA def(this.field) | Test.cs:7:9:7:17 | ... = ... |
@@ -243,17 +248,28 @@
| Test.cs:20:13:20:18 | SSA def(y) | Test.cs:20:13:20:18 | ... = ... |
| Test.cs:21:13:21:22 | SSA def(this.field) | Test.cs:21:13:21:22 | ... = ... |
| Test.cs:22:13:22:17 | SSA def(z) | Test.cs:22:13:22:17 | ... = ... |
| Test.cs:24:9:24:15 | SSA phi(this.field) | Test.cs:24:9:24:15 | ...; |
| Test.cs:24:9:24:15 | SSA phi(x) | Test.cs:24:9:24:15 | ...; |
| Test.cs:24:9:24:15 | SSA phi(y) | Test.cs:24:9:24:15 | ...; |
| Test.cs:24:9:24:15 | SSA phi(z) | Test.cs:24:9:24:15 | ...; |
| Test.cs:25:16:25:16 | SSA phi(param1) | Test.cs:25:16:25:16 | access to local variable x |
| Test.cs:25:16:25:16 | SSA phi(y) | Test.cs:25:16:25:16 | access to local variable x |
| Test.cs:27:17:27:24 | SSA def(param1) | Test.cs:27:17:27:24 | ...++ |
| Test.cs:31:13:31:18 | SSA def(y) | Test.cs:31:13:31:18 | ... = ... |
| Test.cs:33:9:33:19 | SSA phi(param1) | Test.cs:33:9:33:19 | ...; |
| Test.cs:34:18:34:22 | SSA def(i) | Test.cs:34:18:34:22 | Int32 i = ... |
| Test.cs:34:25:34:25 | SSA phi(i) | Test.cs:34:25:34:25 | access to local variable i |
| Test.cs:34:25:34:25 | SSA phi(x) | Test.cs:34:25:34:25 | access to local variable i |
| Test.cs:34:33:34:35 | SSA def(i) | Test.cs:34:33:34:35 | ...++ |
| Test.cs:36:13:36:18 | SSA def(x) | Test.cs:36:13:36:18 | ... = ... |
| Test.cs:39:9:42:9 | SSA phi(param1) | Test.cs:39:9:42:9 | foreach (... ... in ...) ... |
| Test.cs:39:22:39:22 | SSA def(w) | Test.cs:39:22:39:22 | Int32 w |
| Test.cs:41:13:41:23 | SSA def(param1) | Test.cs:41:13:41:23 | ... = ... |
| Test.cs:46:10:46:10 | SSA entry def(this.field) | Test.cs:46:10:46:10 | g |
| Test.cs:46:16:46:18 | SSA param(in) | Test.cs:46:16:46:18 | in |
| Test.cs:50:13:50:20 | SSA def(out) | Test.cs:50:13:50:20 | ... = ... |
| Test.cs:54:13:54:20 | SSA def(out) | Test.cs:54:13:54:20 | ... = ... |
| Test.cs:56:9:56:19 | SSA phi(out) | Test.cs:56:9:56:19 | ...; |
| Test.cs:57:9:57:17 | SSA def(this.field) | Test.cs:57:9:57:17 | ... = ... |
| Test.cs:62:16:62:16 | SSA param(x) | Test.cs:62:16:62:16 | x |
| Test.cs:68:45:68:45 | [exception: DivideByZeroException] SSA def(e) | Test.cs:68:45:68:45 | DivideByZeroException e |
@@ -265,6 +281,7 @@
| Test.cs:76:69:76:70 | SSA param(b6) | Test.cs:76:69:76:70 | b6 |
| Test.cs:78:13:78:17 | SSA def(x) | Test.cs:78:13:78:17 | Int32 x = ... |
| Test.cs:108:13:108:17 | SSA def(x) | Test.cs:108:13:108:17 | ... = ... |
| Test.cs:113:9:116:9 | SSA phi(x) | Test.cs:113:9:116:9 | if (...) ... |
| Tuples.cs:10:9:10:54 | SSA def(b) | Tuples.cs:10:9:10:54 | ... = ... |
| Tuples.cs:10:9:10:54 | SSA def(s) | Tuples.cs:10:9:10:54 | ... = ... |
| Tuples.cs:10:9:10:54 | SSA def(x) | Tuples.cs:10:9:10:54 | ... = ... |

View File

@@ -15,7 +15,6 @@
| Capture.cs:212:30:212:35 | exited | Capture.cs:212:30:212:71 | SSA def(exited) | Capture.cs:212:30:212:71 | EventHandler exited = ... |
| Capture.cs:248:36:248:36 | j | Capture.cs:251:13:251:17 | SSA def(j) | Capture.cs:251:13:251:17 | ... = ... |
| Consistency.cs:15:17:15:17 | i | Consistency.cs:15:17:15:21 | SSA def(i) | Consistency.cs:15:17:15:21 | Int32 i = ... |
| Consistency.cs:15:17:15:17 | i | Consistency.cs:15:17:15:21 | [finally: exception] SSA def(i) | Consistency.cs:15:17:15:21 | Int32 i = ... |
| Consistency.cs:25:29:25:29 | c | Consistency.cs:25:29:25:29 | SSA def(c) | Consistency.cs:25:29:25:29 | Consistency c |
| Consistency.cs:30:30:30:30 | c | Consistency.cs:32:9:32:29 | SSA def(c) | Consistency.cs:32:9:32:29 | ... = ... |
| Consistency.cs:44:11:44:11 | s | Consistency.cs:44:11:44:11 | SSA def(s) | Consistency.cs:44:11:44:11 | S s |
@@ -117,13 +116,6 @@
| Properties.cs:76:9:76:12 | f.xs | Properties.cs:84:9:84:25 | SSA def(f.xs) | Properties.cs:84:9:84:25 | ... = ... |
| Properties.cs:78:9:78:15 | this.xs | Properties.cs:81:9:81:22 | SSA def(this.xs) | Properties.cs:81:9:81:22 | ... = ... |
| Properties.cs:78:9:78:15 | this.xs | Properties.cs:83:9:83:22 | SSA def(this.xs) | Properties.cs:83:9:83:22 | ... = ... |
| Splitting.cs:5:13:5:13 | x | Splitting.cs:7:13:7:19 | [b (line 3): true] SSA def(x) | Splitting.cs:7:13:7:19 | ... = ... |
| Splitting.cs:5:13:5:13 | x | Splitting.cs:10:13:10:19 | [b (line 3): false] SSA def(x) | Splitting.cs:10:13:10:19 | ... = ... |
| Splitting.cs:24:13:24:13 | x | Splitting.cs:29:13:29:19 | [b (line 22): false] SSA def(x) | Splitting.cs:29:13:29:19 | ... = ... |
| Splitting.cs:24:13:24:13 | x | Splitting.cs:32:9:32:15 | [b (line 22): false] SSA def(x) | Splitting.cs:32:9:32:15 | ... = ... |
| Splitting.cs:24:13:24:13 | x | Splitting.cs:32:9:32:15 | [b (line 22): true] SSA def(x) | Splitting.cs:32:9:32:15 | ... = ... |
| Splitting.cs:44:13:44:13 | x | Splitting.cs:46:13:46:19 | [b (line 42): true] SSA def(x) | Splitting.cs:46:13:46:19 | ... = ... |
| Splitting.cs:44:13:44:13 | x | Splitting.cs:49:13:49:19 | [b (line 42): false] SSA def(x) | Splitting.cs:49:13:49:19 | ... = ... |
| Test.cs:5:15:5:20 | param1 | Test.cs:27:17:27:24 | SSA def(param1) | Test.cs:27:17:27:24 | ...++ |
| Test.cs:5:15:5:20 | param1 | Test.cs:41:13:41:23 | SSA def(param1) | Test.cs:41:13:41:23 | ... = ... |
| Test.cs:7:9:7:13 | this.field | Test.cs:7:9:7:17 | SSA def(this.field) | Test.cs:7:9:7:17 | ... = ... |

View File

@@ -28,9 +28,6 @@
| OutRef.cs:39:35:39:35 | j | OutRef.cs:39:35:39:35 | SSA param(j) | OutRef.cs:39:35:39:35 | j |
| Properties.cs:61:23:61:23 | i | Properties.cs:61:23:61:23 | SSA param(i) | Properties.cs:61:23:61:23 | i |
| Properties.cs:106:37:106:37 | p | Properties.cs:106:37:106:37 | SSA param(p) | Properties.cs:106:37:106:37 | p |
| Splitting.cs:3:18:3:18 | b | Splitting.cs:3:18:3:18 | SSA param(b) | Splitting.cs:3:18:3:18 | b |
| Splitting.cs:22:18:22:18 | b | Splitting.cs:22:18:22:18 | SSA param(b) | Splitting.cs:22:18:22:18 | b |
| Splitting.cs:42:18:42:18 | b | Splitting.cs:42:18:42:18 | SSA param(b) | Splitting.cs:42:18:42:18 | b |
| Test.cs:5:15:5:20 | param1 | Test.cs:5:15:5:20 | SSA param(param1) | Test.cs:5:15:5:20 | param1 |
| Test.cs:5:67:5:72 | param2 | Test.cs:5:67:5:72 | SSA param(param2) | Test.cs:5:67:5:72 | param2 |
| Test.cs:46:16:46:18 | in | Test.cs:46:16:46:18 | SSA param(in) | Test.cs:46:16:46:18 | in |

View File

@@ -35,7 +35,6 @@
| Capture.cs:212:30:212:35 | exited | Capture.cs:212:30:212:71 | SSA def(exited) | Capture.cs:213:29:213:34 | access to local variable exited |
| Consistency.cs:7:25:7:25 | b | Consistency.cs:7:25:7:25 | SSA param(b) | Consistency.cs:11:17:11:17 | access to parameter b |
| Consistency.cs:15:17:15:17 | i | Consistency.cs:15:17:15:21 | SSA def(i) | Consistency.cs:16:17:16:17 | access to local variable i |
| Consistency.cs:15:17:15:17 | i | Consistency.cs:15:17:15:21 | [finally: exception] SSA def(i) | Consistency.cs:16:17:16:17 | access to local variable i |
| Consistency.cs:25:29:25:29 | c | Consistency.cs:25:29:25:29 | SSA def(c) | Consistency.cs:26:13:26:13 | access to local variable c |
| Consistency.cs:25:29:25:29 | c | Consistency.cs:25:29:25:29 | SSA def(c) | Consistency.cs:27:13:27:13 | access to local variable c |
| Consistency.cs:26:13:26:19 | c.Field | Consistency.cs:25:29:25:29 | SSA qualifier def(c.Field) | Consistency.cs:26:13:26:19 | access to field Field |
@@ -288,27 +287,6 @@
| Properties.cs:114:20:114:35 | this.Props.Props | Properties.cs:113:9:113:22 | SSA call def(this.Props.Props) | Properties.cs:116:17:116:32 | access to field Props |
| Properties.cs:115:21:115:39 | this.Props.Props.xs | Properties.cs:113:9:113:22 | SSA qualifier def(this.Props.Props.xs) | Properties.cs:115:21:115:39 | access to property xs |
| Properties.cs:115:21:115:39 | this.Props.Props.xs | Properties.cs:113:9:113:22 | SSA qualifier def(this.Props.Props.xs) | Properties.cs:116:17:116:35 | access to property xs |
| Splitting.cs:3:18:3:18 | b | Splitting.cs:3:18:3:18 | SSA param(b) | Splitting.cs:6:13:6:13 | access to parameter b |
| Splitting.cs:3:18:3:18 | b | Splitting.cs:3:18:3:18 | SSA param(b) | Splitting.cs:15:13:15:13 | access to parameter b |
| Splitting.cs:5:13:5:13 | x | Splitting.cs:7:13:7:19 | [b (line 3): true] SSA def(x) | Splitting.cs:13:9:13:9 | access to local variable x |
| Splitting.cs:5:13:5:13 | x | Splitting.cs:7:13:7:19 | [b (line 3): true] SSA def(x) | Splitting.cs:14:9:14:9 | access to local variable x |
| Splitting.cs:5:13:5:13 | x | Splitting.cs:7:13:7:19 | [b (line 3): true] SSA def(x) | Splitting.cs:17:13:17:13 | access to local variable x |
| Splitting.cs:5:13:5:13 | x | Splitting.cs:10:13:10:19 | [b (line 3): false] SSA def(x) | Splitting.cs:11:13:11:13 | access to local variable x |
| Splitting.cs:5:13:5:13 | x | Splitting.cs:10:13:10:19 | [b (line 3): false] SSA def(x) | Splitting.cs:13:9:13:9 | access to local variable x |
| Splitting.cs:5:13:5:13 | x | Splitting.cs:10:13:10:19 | [b (line 3): false] SSA def(x) | Splitting.cs:14:9:14:9 | access to local variable x |
| Splitting.cs:22:18:22:18 | b | Splitting.cs:22:18:22:18 | SSA param(b) | Splitting.cs:25:13:25:13 | access to parameter b |
| Splitting.cs:22:18:22:18 | b | Splitting.cs:22:18:22:18 | SSA param(b) | Splitting.cs:35:13:35:13 | access to parameter b |
| Splitting.cs:24:13:24:13 | x | Splitting.cs:29:13:29:19 | [b (line 22): false] SSA def(x) | Splitting.cs:30:13:30:13 | access to local variable x |
| Splitting.cs:24:13:24:13 | x | Splitting.cs:32:9:32:15 | [b (line 22): false] SSA def(x) | Splitting.cs:33:9:33:9 | access to local variable x |
| Splitting.cs:24:13:24:13 | x | Splitting.cs:32:9:32:15 | [b (line 22): false] SSA def(x) | Splitting.cs:34:9:34:9 | access to local variable x |
| Splitting.cs:24:13:24:13 | x | Splitting.cs:32:9:32:15 | [b (line 22): true] SSA def(x) | Splitting.cs:33:9:33:9 | access to local variable x |
| Splitting.cs:24:13:24:13 | x | Splitting.cs:32:9:32:15 | [b (line 22): true] SSA def(x) | Splitting.cs:34:9:34:9 | access to local variable x |
| Splitting.cs:24:13:24:13 | x | Splitting.cs:32:9:32:15 | [b (line 22): true] SSA def(x) | Splitting.cs:37:13:37:13 | access to local variable x |
| Splitting.cs:42:18:42:18 | b | Splitting.cs:42:18:42:18 | SSA param(b) | Splitting.cs:45:13:45:13 | access to parameter b |
| Splitting.cs:42:18:42:18 | b | Splitting.cs:42:18:42:18 | SSA param(b) | Splitting.cs:52:13:52:13 | access to parameter b |
| Splitting.cs:44:13:44:13 | x | Splitting.cs:49:13:49:19 | [b (line 42): false] SSA def(x) | Splitting.cs:50:13:50:13 | access to local variable x |
| Splitting.cs:44:13:44:13 | x | Splitting.cs:54:9:54:21 | SSA phi(x) | Splitting.cs:54:9:54:9 | access to local variable x |
| Splitting.cs:44:13:44:13 | x | Splitting.cs:54:9:54:21 | SSA phi(x) | Splitting.cs:55:9:55:9 | access to local variable x |
| Test.cs:5:15:5:20 | param1 | Test.cs:5:15:5:20 | SSA param(param1) | Test.cs:11:13:11:18 | access to parameter param1 |
| Test.cs:5:15:5:20 | param1 | Test.cs:25:16:25:16 | SSA phi(param1) | Test.cs:27:17:27:22 | access to parameter param1 |
| Test.cs:5:15:5:20 | param1 | Test.cs:39:9:42:9 | SSA phi(param1) | Test.cs:41:13:41:18 | access to parameter param1 |

View File

@@ -35,7 +35,6 @@
| Capture.cs:248:36:248:36 | j | Capture.cs:251:13:251:17 | SSA def(j) | Capture.cs:251:13:251:17 | SSA def(j) |
| Consistency.cs:7:25:7:25 | b | Consistency.cs:7:25:7:25 | SSA param(b) | Consistency.cs:7:25:7:25 | SSA param(b) |
| Consistency.cs:15:17:15:17 | i | Consistency.cs:15:17:15:21 | SSA def(i) | Consistency.cs:15:17:15:21 | SSA def(i) |
| Consistency.cs:15:17:15:17 | i | Consistency.cs:15:17:15:21 | [finally: exception] SSA def(i) | Consistency.cs:15:17:15:21 | [finally: exception] SSA def(i) |
| Consistency.cs:25:29:25:29 | c | Consistency.cs:25:29:25:29 | SSA def(c) | Consistency.cs:25:29:25:29 | SSA def(c) |
| Consistency.cs:26:13:26:19 | c.Field | Consistency.cs:25:29:25:29 | SSA qualifier def(c.Field) | Consistency.cs:25:29:25:29 | SSA qualifier def(c.Field) |
| Consistency.cs:30:30:30:30 | c | Consistency.cs:32:9:32:29 | SSA def(c) | Consistency.cs:32:9:32:29 | SSA def(c) |
@@ -329,18 +328,6 @@
| Properties.cs:115:21:115:39 | this.Props.Props.xs | Properties.cs:108:10:108:10 | SSA qualifier def(this.Props.Props.xs) | Properties.cs:108:10:108:10 | SSA qualifier def(this.Props.Props.xs) |
| Properties.cs:115:21:115:39 | this.Props.Props.xs | Properties.cs:113:9:113:22 | SSA qualifier def(this.Props.Props.xs) | Properties.cs:108:10:108:10 | SSA qualifier def(this.Props.Props.xs) |
| Properties.cs:115:21:115:39 | this.Props.Props.xs | Properties.cs:113:9:113:22 | SSA qualifier def(this.Props.Props.xs) | Properties.cs:113:9:113:22 | SSA qualifier def(this.Props.Props.xs) |
| Splitting.cs:3:18:3:18 | b | Splitting.cs:3:18:3:18 | SSA param(b) | Splitting.cs:3:18:3:18 | SSA param(b) |
| Splitting.cs:5:13:5:13 | x | Splitting.cs:7:13:7:19 | [b (line 3): true] SSA def(x) | Splitting.cs:7:13:7:19 | [b (line 3): true] SSA def(x) |
| Splitting.cs:5:13:5:13 | x | Splitting.cs:10:13:10:19 | [b (line 3): false] SSA def(x) | Splitting.cs:10:13:10:19 | [b (line 3): false] SSA def(x) |
| Splitting.cs:22:18:22:18 | b | Splitting.cs:22:18:22:18 | SSA param(b) | Splitting.cs:22:18:22:18 | SSA param(b) |
| Splitting.cs:24:13:24:13 | x | Splitting.cs:29:13:29:19 | [b (line 22): false] SSA def(x) | Splitting.cs:29:13:29:19 | [b (line 22): false] SSA def(x) |
| Splitting.cs:24:13:24:13 | x | Splitting.cs:32:9:32:15 | [b (line 22): false] SSA def(x) | Splitting.cs:32:9:32:15 | [b (line 22): false] SSA def(x) |
| Splitting.cs:24:13:24:13 | x | Splitting.cs:32:9:32:15 | [b (line 22): true] SSA def(x) | Splitting.cs:32:9:32:15 | [b (line 22): true] SSA def(x) |
| Splitting.cs:42:18:42:18 | b | Splitting.cs:42:18:42:18 | SSA param(b) | Splitting.cs:42:18:42:18 | SSA param(b) |
| Splitting.cs:44:13:44:13 | x | Splitting.cs:46:13:46:19 | [b (line 42): true] SSA def(x) | Splitting.cs:46:13:46:19 | [b (line 42): true] SSA def(x) |
| Splitting.cs:44:13:44:13 | x | Splitting.cs:49:13:49:19 | [b (line 42): false] SSA def(x) | Splitting.cs:49:13:49:19 | [b (line 42): false] SSA def(x) |
| Splitting.cs:44:13:44:13 | x | Splitting.cs:54:9:54:21 | SSA phi(x) | Splitting.cs:46:13:46:19 | [b (line 42): true] SSA def(x) |
| Splitting.cs:44:13:44:13 | x | Splitting.cs:54:9:54:21 | SSA phi(x) | Splitting.cs:49:13:49:19 | [b (line 42): false] SSA def(x) |
| Test.cs:5:15:5:20 | param1 | Test.cs:5:15:5:20 | SSA param(param1) | Test.cs:5:15:5:20 | SSA param(param1) |
| Test.cs:5:15:5:20 | param1 | Test.cs:25:16:25:16 | SSA phi(param1) | Test.cs:5:15:5:20 | SSA param(param1) |
| Test.cs:5:15:5:20 | param1 | Test.cs:25:16:25:16 | SSA phi(param1) | Test.cs:27:17:27:24 | SSA def(param1) |

View File

@@ -1,31 +1,31 @@
| ConstantCondition.cs:38:18:38:29 | (...) ... | Expression is always 'null'. |
| ConstantCondition.cs:39:18:39:24 | (...) ... | Expression is never 'null'. |
| ConstantCondition.cs:46:17:46:26 | (...) ... | Expression is always 'null'. |
| ConstantCondition.cs:47:17:47:18 | "" | Expression is never 'null'. |
| ConstantCondition.cs:48:13:48:19 | (...) ... | Expression is never 'null'. |
| ConstantCondition.cs:49:13:49:14 | "" | Expression is never 'null'. |
| ConstantCondition.cs:62:18:62:18 | 2 | Pattern never matches. |
| ConstantCondition.cs:64:18:64:18 | 3 | Pattern always matches. |
| ConstantCondition.cs:75:18:75:20 | access to type Int32 | Pattern never matches. |
| ConstantCondition.cs:95:13:95:13 | _ | Pattern always matches. |
| ConstantCondition.cs:114:13:114:14 | access to parameter b1 | Condition always evaluates to 'true'. |
| ConstantCondition.cs:114:19:114:20 | access to parameter b2 | Condition always evaluates to 'true'. |
| ConstantCondition.cs:141:22:141:22 | _ | Pattern always matches. |
| ConstantConditionBad.cs:5:16:5:20 | ... > ... | Condition always evaluates to 'false'. |
| ConstantConditionalExpressionCondition.cs:11:22:11:34 | ... == ... | Condition always evaluates to 'true'. |
| ConstantConditionalExpressionCondition.cs:12:21:12:25 | false | Condition always evaluates to 'false'. |
| ConstantConditionalExpressionCondition.cs:13:21:13:30 | ... == ... | Condition always evaluates to 'true'. |
| ConstantForCondition.cs:9:29:9:33 | false | Condition always evaluates to 'false'. |
| ConstantForCondition.cs:11:29:11:34 | ... == ... | Condition always evaluates to 'false'. |
| ConstantIfCondition.cs:11:17:11:29 | ... == ... | Condition always evaluates to 'true'. |
| ConstantIfCondition.cs:14:17:14:21 | false | Condition always evaluates to 'false'. |
| ConstantIfCondition.cs:17:17:17:26 | ... == ... | Condition always evaluates to 'true'. |
| ConstantIsNullOrEmpty.cs:10:21:10:54 | call to method IsNullOrEmpty | Condition always evaluates to 'false'. |
| ConstantIsNullOrEmpty.cs:46:21:46:46 | call to method IsNullOrEmpty | Condition always evaluates to 'true'. |
| ConstantIsNullOrEmpty.cs:50:21:50:44 | call to method IsNullOrEmpty | Condition always evaluates to 'true'. |
| ConstantIsNullOrEmpty.cs:54:21:54:45 | call to method IsNullOrEmpty | Condition always evaluates to 'false'. |
| ConstantNullCoalescingLeftHandOperand.cs:11:24:11:34 | access to constant NULL_OBJECT | Expression is never 'null'. |
| ConstantNullCoalescingLeftHandOperand.cs:12:24:12:27 | null | Expression is always 'null'. |
| ConstantWhileCondition.cs:12:20:12:32 | ... == ... | Condition always evaluates to 'true'. |
| ConstantWhileCondition.cs:16:20:16:24 | false | Condition always evaluates to 'false'. |
| ConstantWhileCondition.cs:24:20:24:29 | ... == ... | Condition always evaluates to 'true'. |
| ConstantCondition.cs:38:18:38:29 | (...) ... | Expression is always 'null'. | ConstantCondition.cs:38:18:38:29 | (...) ... | dummy |
| ConstantCondition.cs:39:18:39:24 | (...) ... | Expression is never 'null'. | ConstantCondition.cs:39:18:39:24 | (...) ... | dummy |
| ConstantCondition.cs:46:17:46:26 | (...) ... | Expression is always 'null'. | ConstantCondition.cs:46:17:46:26 | (...) ... | dummy |
| ConstantCondition.cs:47:17:47:18 | "" | Expression is never 'null'. | ConstantCondition.cs:47:17:47:18 | "" | dummy |
| ConstantCondition.cs:48:13:48:19 | (...) ... | Expression is never 'null'. | ConstantCondition.cs:48:13:48:19 | (...) ... | dummy |
| ConstantCondition.cs:49:13:49:14 | "" | Expression is never 'null'. | ConstantCondition.cs:49:13:49:14 | "" | dummy |
| ConstantCondition.cs:62:18:62:18 | 2 | Pattern never matches. | ConstantCondition.cs:62:18:62:18 | 2 | dummy |
| ConstantCondition.cs:64:18:64:18 | 3 | Pattern always matches. | ConstantCondition.cs:64:18:64:18 | 3 | dummy |
| ConstantCondition.cs:75:18:75:20 | access to type Int32 | Pattern never matches. | ConstantCondition.cs:75:18:75:20 | access to type Int32 | dummy |
| ConstantCondition.cs:95:13:95:13 | _ | Pattern always matches. | ConstantCondition.cs:95:13:95:13 | _ | dummy |
| ConstantCondition.cs:114:13:114:14 | access to parameter b1 | Condition is always true because of $@. | ConstantCondition.cs:110:14:110:15 | access to parameter b1 | access to parameter b1 |
| ConstantCondition.cs:114:19:114:20 | access to parameter b2 | Condition is always true because of $@. | ConstantCondition.cs:112:14:112:15 | access to parameter b2 | access to parameter b2 |
| ConstantCondition.cs:141:22:141:22 | _ | Pattern always matches. | ConstantCondition.cs:141:22:141:22 | _ | dummy |
| ConstantConditionBad.cs:5:16:5:20 | ... > ... | Condition always evaluates to 'false'. | ConstantConditionBad.cs:5:16:5:20 | ... > ... | dummy |
| ConstantConditionalExpressionCondition.cs:11:22:11:34 | ... == ... | Condition always evaluates to 'true'. | ConstantConditionalExpressionCondition.cs:11:22:11:34 | ... == ... | dummy |
| ConstantConditionalExpressionCondition.cs:12:21:12:25 | false | Condition always evaluates to 'false'. | ConstantConditionalExpressionCondition.cs:12:21:12:25 | false | dummy |
| ConstantConditionalExpressionCondition.cs:13:21:13:30 | ... == ... | Condition always evaluates to 'true'. | ConstantConditionalExpressionCondition.cs:13:21:13:30 | ... == ... | dummy |
| ConstantForCondition.cs:9:29:9:33 | false | Condition always evaluates to 'false'. | ConstantForCondition.cs:9:29:9:33 | false | dummy |
| ConstantForCondition.cs:11:29:11:34 | ... == ... | Condition always evaluates to 'false'. | ConstantForCondition.cs:11:29:11:34 | ... == ... | dummy |
| ConstantIfCondition.cs:11:17:11:29 | ... == ... | Condition always evaluates to 'true'. | ConstantIfCondition.cs:11:17:11:29 | ... == ... | dummy |
| ConstantIfCondition.cs:14:17:14:21 | false | Condition always evaluates to 'false'. | ConstantIfCondition.cs:14:17:14:21 | false | dummy |
| ConstantIfCondition.cs:17:17:17:26 | ... == ... | Condition always evaluates to 'true'. | ConstantIfCondition.cs:17:17:17:26 | ... == ... | dummy |
| ConstantIsNullOrEmpty.cs:10:21:10:54 | call to method IsNullOrEmpty | Condition always evaluates to 'false'. | ConstantIsNullOrEmpty.cs:10:21:10:54 | call to method IsNullOrEmpty | dummy |
| ConstantIsNullOrEmpty.cs:46:21:46:46 | call to method IsNullOrEmpty | Condition always evaluates to 'true'. | ConstantIsNullOrEmpty.cs:46:21:46:46 | call to method IsNullOrEmpty | dummy |
| ConstantIsNullOrEmpty.cs:50:21:50:44 | call to method IsNullOrEmpty | Condition always evaluates to 'true'. | ConstantIsNullOrEmpty.cs:50:21:50:44 | call to method IsNullOrEmpty | dummy |
| ConstantIsNullOrEmpty.cs:54:21:54:45 | call to method IsNullOrEmpty | Condition always evaluates to 'false'. | ConstantIsNullOrEmpty.cs:54:21:54:45 | call to method IsNullOrEmpty | dummy |
| ConstantNullCoalescingLeftHandOperand.cs:11:24:11:34 | access to constant NULL_OBJECT | Expression is never 'null'. | ConstantNullCoalescingLeftHandOperand.cs:11:24:11:34 | access to constant NULL_OBJECT | dummy |
| ConstantNullCoalescingLeftHandOperand.cs:12:24:12:27 | null | Expression is always 'null'. | ConstantNullCoalescingLeftHandOperand.cs:12:24:12:27 | null | dummy |
| ConstantWhileCondition.cs:12:20:12:32 | ... == ... | Condition always evaluates to 'true'. | ConstantWhileCondition.cs:12:20:12:32 | ... == ... | dummy |
| ConstantWhileCondition.cs:16:20:16:24 | false | Condition always evaluates to 'false'. | ConstantWhileCondition.cs:16:20:16:24 | false | dummy |
| ConstantWhileCondition.cs:24:20:24:29 | ... == ... | Condition always evaluates to 'true'. | ConstantWhileCondition.cs:24:20:24:29 | ... == ... | dummy |

View File

@@ -395,7 +395,7 @@ class Initializers
{
var s = "";
if (b)
s = "abc"; // $ Alert
s = "abc"; // Not reported
if (!b)
return s;
return null;

View File

@@ -13,7 +13,6 @@
| DeadStoreOfLocal.cs:314:18:314:23 | Object v2 | This assignment to $@ is useless, since its value is never read. | DeadStoreOfLocal.cs:314:22:314:23 | v2 | v2 |
| DeadStoreOfLocal.cs:331:9:331:32 | ... = ... | This assignment to $@ is useless, since its value is never read. | DeadStoreOfLocal.cs:327:23:327:23 | b | b |
| DeadStoreOfLocal.cs:372:13:372:20 | String s = ... | This assignment to $@ is useless, since its value is never read. | DeadStoreOfLocal.cs:372:13:372:13 | s | s |
| DeadStoreOfLocal.cs:398:13:398:21 | ... = ... | This assignment to $@ is useless, since its value is never read. | DeadStoreOfLocal.cs:396:13:396:13 | s | s |
| DeadStoreOfLocal.cs:472:20:472:76 | FileStream y = ... | This assignment to $@ is useless, since its value is never read. | DeadStoreOfLocal.cs:472:20:472:20 | y | y |
| DeadStoreOfLocalBad.cs:7:13:7:48 | Boolean success = ... | This assignment to $@ is useless, since its value is never read. | DeadStoreOfLocalBad.cs:7:13:7:19 | success | success |
| DeadStoreOfLocalBad.cs:23:32:23:32 | FormatException e | This assignment to $@ is useless, since its value is never read. | DeadStoreOfLocalBad.cs:23:32:23:32 | e | e |

View File

@@ -14,7 +14,7 @@ public class D
public void Caller()
{
Callee1(new object());
Callee1(null); // $ Source[cs/dereferenced-value-may-be-null]
Callee1(null);
Callee2(new object());
}
@@ -23,7 +23,7 @@ public class D
param.ToString(); // $ Alert[cs/dereferenced-value-may-be-null]
}
public void Callee2(object param) // $ Source[cs/dereferenced-value-may-be-null]
public void Callee2(object param)
{
if (param != null)
{
@@ -55,24 +55,24 @@ public class D
if ((2 > 1 && o4 != null) != false)
o4.ToString(); // GOOD
var o5 = (o4 != null) ? "" : null; // $ Source[cs/dereferenced-value-may-be-null]
var o5 = (o4 != null) ? "" : null;
if (o5 != null)
o4.ToString(); // GOOD
if (o4 != null)
o5.ToString(); // $ SPURIOUS (false positive): Alert[cs/dereferenced-value-may-be-null]
o5.ToString(); // GOOD
var o6 = maybe ? null : "";
if (!CustomIsNull(o6))
o6.ToString(); // GOOD
var o7 = maybe ? null : ""; // $ Source[cs/dereferenced-value-may-be-null]
var o7 = maybe ? null : "";
var ok = o7 != null && 2 > 1;
if (ok)
o7.ToString(); // GOOD
else
o7.ToString(); // $ Alert[cs/dereferenced-value-may-be-null]
var o8 = maybe ? null : ""; // $ Source[cs/dereferenced-value-may-be-null]
var o8 = maybe ? null : "";
int track = o8 == null ? 42 : 1 + 1;
if (track == 2)
o8.ToString(); // GOOD
@@ -86,7 +86,7 @@ public class D
public void Deref(int i)
{
int[] xs = maybe ? null : new int[2]; // $ Source[cs/dereferenced-value-may-be-null]
int[] xs = maybe ? null : new int[2];
if (i > 1)
xs[0] = 5; // $ Alert[cs/dereferenced-value-may-be-null]
@@ -122,7 +122,7 @@ public class D
x.ToString(); // GOOD
}
public void LengthGuard(int[] a, int[] b) // $ Source[cs/dereferenced-value-may-be-null]
public void LengthGuard(int[] a, int[] b)
{
int alen = a == null ? 0 : a.Length; // GOOD
int blen = b == null ? 0 : b.Length; // GOOD
@@ -146,7 +146,7 @@ public class D
}
}
public void MissedGuard(object obj) // $ Source[cs/dereferenced-value-may-be-null]
public void MissedGuard(object obj)
{
obj.ToString(); // $ Alert[cs/dereferenced-value-may-be-null]
var x = obj != null ? 1 : 0;
@@ -160,7 +160,7 @@ public class D
public void Exceptions()
{
object obj = null; // $ Source[cs/dereferenced-value-may-be-null]
object obj = null;
try
{
obj = MkMaybe();
@@ -237,16 +237,16 @@ public class D
if (flag)
o.ToString(); // GOOD
o = null; // $ Source[cs/dereferenced-value-may-be-null]
o = null;
var other = maybe ? null : "";
if (other == null)
o = "";
if (other != null)
o.ToString(); // $ Alert[cs/dereferenced-value-may-be-null] (always - but reported as maybe)
else
o.ToString(); // $ SPURIOUS (false positive): Alert[cs/dereferenced-value-may-be-null]
o.ToString(); // GOOD
var o2 = (num < 0) ? null : ""; // $ Source[cs/dereferenced-value-may-be-null]
var o2 = (num < 0) ? null : "";
if (num < 0)
o2 = "";
else
@@ -255,7 +255,7 @@ public class D
public void TrackingVariable(int[] a)
{
object o = null; // $ Source[cs/dereferenced-value-may-be-null]
object o = null;
object other = null;
if (maybe)
{
@@ -264,9 +264,9 @@ public class D
}
if (other is string)
o.ToString(); // $ SPURIOUS (false positive): Alert[cs/dereferenced-value-may-be-null]
o.ToString(); // GOOD
o = null; // $ Source[cs/dereferenced-value-may-be-null]
o = null;
int count = 0;
var found = false;
for (var i = 0; i < a.Length; i++)
@@ -280,7 +280,7 @@ public class D
}
if (a[i] > 10000)
{
o = null; // $ Source[cs/dereferenced-value-may-be-null]
o = null;
count = 0;
if (2 > i) { }
found = false;
@@ -291,17 +291,17 @@ public class D
o.ToString(); // $ SPURIOUS (false positive): Alert[cs/dereferenced-value-may-be-null]
if (found)
o.ToString(); // $ SPURIOUS (false positive): Alert[cs/dereferenced-value-may-be-null]
o.ToString(); // GOOD
object prev = null; // $ Source[cs/dereferenced-value-may-be-null]
object prev = null;
for (var i = 0; i < a.Length; ++i)
{
if (i != 0)
prev.ToString(); // $ SPURIOUS (false positive): Alert[cs/dereferenced-value-may-be-null]
prev.ToString(); // GOOD
prev = a[i];
}
string s = null; // $ Source[cs/dereferenced-value-may-be-null]
string s = null;
{
var s_null = true;
foreach (var i in a)
@@ -310,10 +310,10 @@ public class D
s = "" + a;
}
if (!s_null)
s.ToString(); // $ SPURIOUS (false positive): Alert[cs/dereferenced-value-may-be-null]
s.ToString(); // GOOD
}
object r = null; // $ Source[cs/dereferenced-value-may-be-null]
object r = null;
var stat = MyStatus.INIT;
while (stat == MyStatus.INIT && stat != MyStatus.READY)
{
@@ -321,7 +321,7 @@ public class D
if (stat == MyStatus.INIT)
stat = MyStatus.READY;
}
r.ToString(); // $ SPURIOUS (false positive): Alert[cs/dereferenced-value-may-be-null]
r.ToString(); // GOOD
}
public enum MyStatus
@@ -348,7 +348,7 @@ public class D
public void LoopCorr(int iters)
{
int[] a = null; // $ Source[cs/dereferenced-value-may-be-null]
int[] a = null;
if (iters > 0)
a = new int[iters];
@@ -357,13 +357,13 @@ public class D
if (iters > 0)
{
string last = null; // $ Source[cs/dereferenced-value-may-be-null]
string last = null;
for (var i = 0; i < iters; i++)
last = "abc";
last.ToString(); // $ SPURIOUS (false positive): Alert[cs/dereferenced-value-may-be-null]
}
int[] b = maybe ? null : new int[iters]; // $ Source[cs/dereferenced-value-may-be-null]
int[] b = maybe ? null : new int[iters];
if (iters > 0 && (b == null || b.Length < iters))
throw new Exception();
@@ -385,7 +385,7 @@ public class D
ioe.ToString(); // $ Alert[cs/dereferenced-value-is-always-null]
}
public void LengthGuard2(int[] a, int[] b) // $ Source[cs/dereferenced-value-may-be-null]
public void LengthGuard2(int[] a, int[] b)
{
int alen = a == null ? 0 : a.Length; // GOOD
int sum = 0;
@@ -402,13 +402,13 @@ public class D
i = -3;
}
public void CorrConds2(object x, object y) // $ Source[cs/dereferenced-value-may-be-null]
public void CorrConds2(object x, object y)
{
if ((x != null && y == null) || (x == null && y != null))
return;
if (x != null)
y.ToString(); // $ SPURIOUS (false positive): Alert[cs/dereferenced-value-may-be-null]
y.ToString(); // GOOD
if (y != null)
x.ToString(); // $ SPURIOUS (false positive): Alert[cs/dereferenced-value-may-be-null]
x.ToString(); // GOOD
}
}

View File

@@ -6,9 +6,9 @@ public class E
{
public void Ex1(long[][][] a1, int ix, int len)
{
long[][] a2 = null; // $ Source[cs/dereferenced-value-may-be-null]
long[][] a2 = null;
var haveA2 = ix < len && (a2 = a1[ix]) != null;
long[] a3 = null; // $ Source[cs/dereferenced-value-may-be-null]
long[] a3 = null;
var haveA3 = haveA2 && (a3 = a2[ix]) != null; // $ SPURIOUS (false positive): Alert[cs/dereferenced-value-may-be-null]
if (haveA3)
a3[0] = 0; // $ SPURIOUS (false positive): Alert[cs/dereferenced-value-may-be-null]
@@ -20,7 +20,7 @@ public class E
var s2 = (s1 == null) ? null : "";
if (s2 == null)
{
s1 = y ? null : ""; // $ Source[cs/dereferenced-value-may-be-null]
s1 = y ? null : "";
s2 = (s1 == null) ? null : "";
}
if (s2 != null)
@@ -32,7 +32,7 @@ public class E
string last = null;
foreach (var s in new string[] { "aa", "bb" })
last = s;
last.ToString(); // GOOD
last.ToString(); // $ SPURIOUS (false positive): Alert[cs/dereferenced-value-may-be-null]
last = null;
if (ss.Any())
@@ -40,7 +40,7 @@ public class E
foreach (var s in ss)
last = s;
last.ToString(); // GOOD
last.ToString(); // $ SPURIOUS (false positive): Alert[cs/dereferenced-value-may-be-null]
}
}
@@ -48,7 +48,7 @@ public class E
{
int index = 0;
var result = new List<List<string>>();
List<string> slice = null; // $ Source[cs/dereferenced-value-may-be-null]
List<string> slice = null;
var iter = list.GetEnumerator();
while (iter.MoveNext())
{
@@ -63,7 +63,7 @@ public class E
}
}
public void Ex5(bool hasArr, int[] arr) // $ Source[cs/dereferenced-value-may-be-null]
public void Ex5(bool hasArr, int[] arr)
{
int arrLen = 0;
if (hasArr)
@@ -104,7 +104,7 @@ public class E
public void Ex7(int[] arr1)
{
int[] arr2 = null; // $ Source[cs/dereferenced-value-may-be-null]
int[] arr2 = null;
if (arr1.Length > 0)
arr2 = new int[arr1.Length];
@@ -122,7 +122,7 @@ public class E
int j = 0;
while (!stop && j < lim)
{
int step = (j * obj.GetHashCode()) % 10; // $ SPURIOUS (false positive): Alert[cs/dereferenced-value-may-be-null]
int step = (j * obj.GetHashCode()) % 10; // GOOD
if (step == 0)
{
obj.ToString(); // GOOD
@@ -134,7 +134,7 @@ public class E
}
else
{
obj = null; // $ Source[cs/dereferenced-value-may-be-null]
obj = null;
}
continue;
}
@@ -149,17 +149,17 @@ public class E
{
return;
}
object obj2 = obj1; // $ Source[cs/dereferenced-value-may-be-null]
object obj2 = obj1;
if (obj2 != null && obj2.GetHashCode() % 5 > 2)
{
obj2.ToString(); // GOOD
cond = true;
}
if (cond)
obj2.ToString(); // $ SPURIOUS (false positive): Alert[cs/dereferenced-value-may-be-null]
obj2.ToString(); // GOOD
}
public void Ex10(int[] a) // $ Source[cs/dereferenced-value-may-be-null]
public void Ex10(int[] a)
{
int n = a == null ? 0 : a.Length;
for (var i = 0; i < n; i++)
@@ -170,12 +170,12 @@ public class E
}
}
public void Ex11(object obj, bool b1) // $ Source[cs/dereferenced-value-may-be-null]
public void Ex11(object obj, bool b1)
{
bool b2 = obj == null ? false : b1;
if (b2 == null)
{
obj.ToString(); // $ SPURIOUS (false positive): Alert[cs/dereferenced-value-may-be-null]
obj.ToString(); // GOOD
}
if (obj == null)
{
@@ -183,11 +183,11 @@ public class E
}
if (b1 == null)
{
obj.ToString(); // $ SPURIOUS (false positive): Alert[cs/dereferenced-value-may-be-null]
obj.ToString(); // GOOD
}
}
public void Ex12(object o) // $ Source[cs/dereferenced-value-may-be-null]
public void Ex12(object o)
{
var i = o.GetHashCode(); // $ Alert[cs/dereferenced-value-may-be-null]
var s = o?.ToString();
@@ -195,12 +195,12 @@ public class E
public void Ex13(bool b)
{
var o = b ? null : ""; // $ Source[cs/dereferenced-value-may-be-null]
o.M1(); // GOOD
var o = b ? null : "";
o.M1(); // GOOD (because M1 doesn't deref o)
if (b)
o.M2(); // $ Alert[cs/dereferenced-value-may-be-null]
else
o.Select(x => x); // $ Alert[cs/dereferenced-value-may-be-null]
o.Select(x => x); // GOOD
}
public int Ex14(string s)
@@ -214,28 +214,28 @@ public class E
{
var x = "";
if (b)
x = null; // $ Source[cs/dereferenced-value-may-be-null]
x = null;
x.ToString(); // $ Alert[cs/dereferenced-value-may-be-null]
if (b)
x.ToString(); // $ Alert[cs/dereferenced-value-is-always-null]
x.ToString(); // dominated by prior deref, i.e. not reported
}
public void Ex16(bool b)
{
var x = "";
if (b)
x = null; // $ Source[cs/dereferenced-value-may-be-null]
x = null;
if (b)
x.ToString(); // $ Alert[cs/dereferenced-value-is-always-null]
x.ToString(); // $ Alert[cs/dereferenced-value-may-be-null]
x.ToString(); // $ Alert[cs/dereferenced-value-may-be-null]
x.ToString(); // "dominated" by prior deref, i.e. not reported
}
public int Ex17(int? i) // $ Source[cs/dereferenced-value-may-be-null]
public int Ex17(int? i)
{
return i.Value; // $ Alert[cs/dereferenced-value-may-be-null]
}
public int Ex18(int? i) // $ Source[cs/dereferenced-value-may-be-null]
public int Ex18(int? i)
{
return (int)i; // $ Alert[cs/dereferenced-value-may-be-null]
}
@@ -280,7 +280,7 @@ public class E
{
if (b)
b.ToString();
var o = Make(); // $ Source[cs/dereferenced-value-may-be-null]
var o = Make();
o?.ToString();
o.ToString(); // $ Alert[cs/dereferenced-value-may-be-null]
if (b)
@@ -298,7 +298,7 @@ public class E
public void Ex25(object o)
{
var s = o as string; // $ Source[cs/dereferenced-value-may-be-null]
var s = o as string;
s.ToString(); // $ Alert[cs/dereferenced-value-may-be-null]
}
@@ -339,13 +339,13 @@ public class E
static void Ex30(string s, object o)
{
var x = s ?? o as string; // $ Source[cs/dereferenced-value-may-be-null]
var x = s ?? o as string;
x.ToString(); // $ Alert[cs/dereferenced-value-may-be-null]
}
static void Ex31(string s, object o)
{
dynamic x = s ?? o as string; // $ Source[cs/dereferenced-value-may-be-null]
dynamic x = s ?? o as string;
x.ToString(); // $ Alert[cs/dereferenced-value-may-be-null]
}
@@ -371,19 +371,19 @@ public class E
{
if (o is string)
{
var s = o as string; // $ Source[cs/dereferenced-value-may-be-null]
var s = o as string;
return s.Length; // $ SPURIOUS (false positive): Alert[cs/dereferenced-value-may-be-null]
}
return -1;
}
static bool Ex37(E e1, E e2) // $ Source[cs/dereferenced-value-may-be-null]
static bool Ex37(E e1, E e2)
{
if ((e1 == null && e2 != null) || (e1 != null && e2 == null))
return false;
if (e1 == null && e2 == null)
return true;
return e1.Long == e2.Long; // $ SPURIOUS (false positive): Alert[cs/dereferenced-value-may-be-null]
return e1.Long == e2.Long; // GOOD
}
int Ex38(int? i)
@@ -432,24 +432,24 @@ public class E
return @is.Any();
}
static void Ex45(string s) // $ Source[cs/dereferenced-value-may-be-null]
static void Ex45(string s, int i)
{
if (s is null)
if (i == 0 && s is null)
{
s.ToString(); // $ Alert[cs/dereferenced-value-is-always-null]
}
if (s is not not null)
if (i == 1 && s is not not null)
{
s.ToString(); // $ Alert[cs/dereferenced-value-may-be-null] MISSING: Alert[cs/dereferenced-value-is-always-null]
}
if (s is not null)
if (i == 2 && s is not null)
{
s.ToString(); // GOOD
}
if (s is object)
if (i == 3 && s is object)
{
s.ToString(); // GOOD
}

View File

@@ -244,8 +244,16 @@
| E.cs:423:33:423:44 | ... == ... | true | E.cs:423:38:423:44 | access to property Value | E.cs:423:33:423:33 | access to parameter j |
| E.cs:430:34:430:45 | ... == ... | true | E.cs:430:34:430:34 | access to parameter j | E.cs:430:39:430:45 | access to property Value |
| E.cs:430:34:430:45 | ... == ... | true | E.cs:430:39:430:45 | access to property Value | E.cs:430:34:430:34 | access to parameter j |
| E.cs:437:13:437:21 | ... is ... | true | E.cs:437:13:437:13 | access to parameter s | E.cs:437:18:437:21 | null |
| E.cs:437:13:437:21 | ... is ... | true | E.cs:437:18:437:21 | null | E.cs:437:13:437:13 | access to parameter s |
| E.cs:437:13:437:18 | ... == ... | true | E.cs:437:13:437:13 | access to parameter i | E.cs:437:18:437:18 | 0 |
| E.cs:437:13:437:18 | ... == ... | true | E.cs:437:18:437:18 | 0 | E.cs:437:13:437:13 | access to parameter i |
| E.cs:437:23:437:31 | ... is ... | true | E.cs:437:23:437:23 | access to parameter s | E.cs:437:28:437:31 | null |
| E.cs:437:23:437:31 | ... is ... | true | E.cs:437:28:437:31 | null | E.cs:437:23:437:23 | access to parameter s |
| E.cs:442:13:442:18 | ... == ... | true | E.cs:442:13:442:13 | access to parameter i | E.cs:442:18:442:18 | 1 |
| E.cs:442:13:442:18 | ... == ... | true | E.cs:442:18:442:18 | 1 | E.cs:442:13:442:13 | access to parameter i |
| E.cs:447:13:447:18 | ... == ... | true | E.cs:447:13:447:13 | access to parameter i | E.cs:447:18:447:18 | 2 |
| E.cs:447:13:447:18 | ... == ... | true | E.cs:447:18:447:18 | 2 | E.cs:447:13:447:13 | access to parameter i |
| E.cs:452:13:452:18 | ... == ... | true | E.cs:452:13:452:13 | access to parameter i | E.cs:452:18:452:18 | 3 |
| E.cs:452:13:452:18 | ... == ... | true | E.cs:452:18:452:18 | 3 | E.cs:452:13:452:13 | access to parameter i |
| Forwarding.cs:59:13:59:21 | ... == ... | true | Forwarding.cs:59:13:59:13 | access to parameter o | Forwarding.cs:59:18:59:21 | null |
| Forwarding.cs:59:13:59:21 | ... == ... | true | Forwarding.cs:59:18:59:21 | null | Forwarding.cs:59:13:59:13 | access to parameter o |
| Forwarding.cs:78:16:78:39 | call to method ReferenceEquals | true | Forwarding.cs:78:32:78:32 | access to parameter o | Forwarding.cs:78:35:78:38 | null |

View File

@@ -824,8 +824,6 @@
| D.cs:152:17:152:27 | ... != ... | true | D.cs:152:17:152:19 | access to parameter obj | non-null |
| D.cs:182:9:182:12 | access to local variable obj2 | non-null | D.cs:176:20:176:28 | call to method MkMaybe | non-null |
| D.cs:182:9:182:12 | access to local variable obj2 | null | D.cs:176:20:176:28 | call to method MkMaybe | null |
| D.cs:190:9:190:12 | access to local variable obj3 | non-null | D.cs:187:20:187:28 | call to method MkMaybe | non-null |
| D.cs:190:9:190:12 | access to local variable obj3 | null | D.cs:187:20:187:28 | call to method MkMaybe | null |
| D.cs:196:13:196:13 | access to local variable o | non-null | D.cs:195:17:195:28 | object creation of type Object | non-null |
| D.cs:196:13:196:13 | access to local variable o | null | D.cs:195:17:195:28 | object creation of type Object | null |
| D.cs:196:13:196:21 | ... == ... | false | D.cs:196:13:196:13 | access to local variable o | non-null |
@@ -876,10 +874,6 @@
| D.cs:222:13:222:14 | access to local variable o4 | null | D.cs:220:18:220:26 | ... + ... | null |
| D.cs:223:9:223:10 | access to local variable o4 | non-null | D.cs:220:18:220:26 | ... + ... | non-null |
| D.cs:223:9:223:10 | access to local variable o4 | null | D.cs:220:18:220:26 | ... + ... | null |
| D.cs:232:13:232:13 | access to local variable o | non-null | D.cs:230:17:230:28 | object creation of type Object | non-null |
| D.cs:232:13:232:13 | access to local variable o | null | D.cs:230:17:230:28 | object creation of type Object | null |
| D.cs:238:13:238:13 | access to local variable o | non-null | D.cs:236:17:236:18 | "" | non-null |
| D.cs:238:13:238:13 | access to local variable o | null | D.cs:236:17:236:18 | "" | null |
| D.cs:241:21:241:37 | ... ? ... : ... | non-null | D.cs:241:21:241:25 | access to field maybe | false |
| D.cs:241:21:241:37 | ... ? ... : ... | non-null | D.cs:241:36:241:37 | "" | non-null |
| D.cs:241:21:241:37 | ... ? ... : ... | null | D.cs:241:21:241:25 | access to field maybe | true |
@@ -1049,16 +1043,8 @@
| E.cs:24:19:24:28 | ... == ... | true | E.cs:24:19:24:20 | access to local variable s1 | null |
| E.cs:26:13:26:22 | ... != ... | false | E.cs:26:13:26:14 | access to local variable s2 | null |
| E.cs:26:13:26:22 | ... != ... | true | E.cs:26:13:26:14 | access to local variable s2 | non-null |
| E.cs:35:9:35:12 | access to local variable last | empty | E.cs:34:20:34:20 | access to local variable s | empty |
| E.cs:35:9:35:12 | access to local variable last | non-empty | E.cs:34:20:34:20 | access to local variable s | non-empty |
| E.cs:35:9:35:12 | access to local variable last | non-null | E.cs:34:20:34:20 | access to local variable s | non-null |
| E.cs:35:9:35:12 | access to local variable last | null | E.cs:34:20:34:20 | access to local variable s | null |
| E.cs:38:13:38:20 | call to method Any<String> | false | E.cs:38:13:38:14 | access to parameter ss | empty |
| E.cs:38:13:38:20 | call to method Any<String> | true | E.cs:38:13:38:14 | access to parameter ss | non-empty |
| E.cs:43:13:43:16 | access to local variable last | empty | E.cs:41:24:41:24 | access to local variable s | empty |
| E.cs:43:13:43:16 | access to local variable last | non-empty | E.cs:41:24:41:24 | access to local variable s | non-empty |
| E.cs:43:13:43:16 | access to local variable last | non-null | E.cs:41:24:41:24 | access to local variable s | non-null |
| E.cs:43:13:43:16 | access to local variable last | null | E.cs:41:24:41:24 | access to local variable s | null |
| E.cs:53:16:53:19 | access to local variable iter | non-null | E.cs:52:20:52:39 | call to method GetEnumerator | non-null |
| E.cs:53:16:53:19 | access to local variable iter | null | E.cs:52:20:52:39 | call to method GetEnumerator | null |
| E.cs:55:23:55:26 | access to local variable iter | non-null | E.cs:52:20:52:39 | call to method GetEnumerator | non-null |
@@ -1152,12 +1138,6 @@
| E.cs:203:13:203:13 | access to local variable o | null | E.cs:198:17:198:29 | ... ? ... : ... | null |
| E.cs:208:13:208:23 | ... is ... | false | E.cs:208:13:208:13 | access to parameter s | null |
| E.cs:208:13:208:23 | ... is ... | true | E.cs:208:13:208:13 | access to parameter s | non-null |
| E.cs:220:13:220:13 | access to local variable x | non-null | E.cs:217:17:217:20 | null | non-null |
| E.cs:220:13:220:13 | access to local variable x | null | E.cs:217:17:217:20 | null | null |
| E.cs:229:13:229:13 | access to local variable x | empty | E.cs:227:17:227:20 | null | empty |
| E.cs:229:13:229:13 | access to local variable x | non-empty | E.cs:227:17:227:20 | null | non-empty |
| E.cs:229:13:229:13 | access to local variable x | non-null | E.cs:227:17:227:20 | null | non-null |
| E.cs:229:13:229:13 | access to local variable x | null | E.cs:227:17:227:20 | null | null |
| E.cs:245:13:245:22 | access to property HasValue | false | E.cs:245:13:245:13 | access to parameter i | null |
| E.cs:245:13:245:22 | access to property HasValue | true | E.cs:245:13:245:13 | access to parameter i | non-null |
| E.cs:252:13:252:21 | ... != ... | false | E.cs:252:13:252:13 | access to parameter i | null |
@@ -1300,11 +1280,19 @@
| E.cs:429:13:429:22 | access to property HasValue | true | E.cs:429:13:429:13 | access to parameter i | non-null |
| E.cs:432:16:432:24 | call to method Any<Int32> | false | E.cs:432:16:432:18 | access to parameter is | empty |
| E.cs:432:16:432:24 | call to method Any<Int32> | true | E.cs:432:16:432:18 | access to parameter is | non-empty |
| E.cs:437:13:437:21 | ... is ... | false | E.cs:437:13:437:13 | access to parameter s | non-null |
| E.cs:437:13:437:21 | ... is ... | true | E.cs:437:13:437:13 | access to parameter s | null |
| E.cs:442:13:442:29 | ... is ... | false | E.cs:442:13:442:13 | access to parameter s | non-null |
| E.cs:447:13:447:25 | ... is ... | true | E.cs:447:13:447:13 | access to parameter s | non-null |
| E.cs:452:13:452:23 | ... is ... | true | E.cs:452:13:452:13 | access to parameter s | non-null |
| E.cs:437:13:437:31 | ... && ... | true | E.cs:437:13:437:18 | ... == ... | true |
| E.cs:437:13:437:31 | ... && ... | true | E.cs:437:23:437:31 | ... is ... | true |
| E.cs:437:23:437:31 | ... is ... | false | E.cs:437:23:437:23 | access to parameter s | non-null |
| E.cs:437:23:437:31 | ... is ... | true | E.cs:437:23:437:23 | access to parameter s | null |
| E.cs:442:13:442:39 | ... && ... | true | E.cs:442:13:442:18 | ... == ... | true |
| E.cs:442:13:442:39 | ... && ... | true | E.cs:442:23:442:39 | ... is ... | true |
| E.cs:442:23:442:39 | ... is ... | false | E.cs:442:23:442:23 | access to parameter s | non-null |
| E.cs:447:13:447:35 | ... && ... | true | E.cs:447:13:447:18 | ... == ... | true |
| E.cs:447:13:447:35 | ... && ... | true | E.cs:447:23:447:35 | ... is ... | true |
| E.cs:447:23:447:35 | ... is ... | true | E.cs:447:23:447:23 | access to parameter s | non-null |
| E.cs:452:13:452:33 | ... && ... | true | E.cs:452:13:452:18 | ... == ... | true |
| E.cs:452:13:452:33 | ... && ... | true | E.cs:452:23:452:33 | ... is ... | true |
| E.cs:452:23:452:33 | ... is ... | true | E.cs:452:23:452:23 | access to parameter s | non-null |
| E.cs:457:13:457:27 | ... is ... | false | E.cs:457:13:457:13 | access to parameter s | non-null |
| F.cs:8:9:8:9 | access to local variable o | non-null | F.cs:7:20:7:23 | null | non-null |
| F.cs:8:9:8:9 | access to local variable o | null | F.cs:7:20:7:23 | null | null |

View File

@@ -31,8 +31,6 @@
| D.cs:222:13:222:14 | access to local variable o4 | Variable $@ is always null at this dereference. | D.cs:220:13:220:14 | o4 | o4 |
| D.cs:385:13:385:15 | access to local variable ioe | Variable $@ is always null at this dereference. | D.cs:378:19:378:21 | ioe | ioe |
| E.cs:210:16:210:16 | access to parameter s | Variable $@ is always null at this dereference. | E.cs:206:28:206:28 | s | s |
| E.cs:220:13:220:13 | access to local variable x | Variable $@ is always null at this dereference. | E.cs:215:13:215:13 | x | x |
| E.cs:229:13:229:13 | access to local variable x | Variable $@ is always null at this dereference. | E.cs:225:13:225:13 | x | x |
| E.cs:323:13:323:14 | access to parameter s1 | Variable $@ is always null at this dereference. | E.cs:319:29:319:30 | s1 | s1 |
| E.cs:324:13:324:14 | access to parameter s2 | Variable $@ is always null at this dereference. | E.cs:319:40:319:41 | s2 | s2 |
| E.cs:331:9:331:9 | access to local variable x | Variable $@ is always null at this dereference. | E.cs:330:13:330:13 | x | x |

View File

@@ -298,11 +298,11 @@
| E.cs:422:13:422:22 | access to property HasValue | E.cs:422:13:422:13 | access to parameter i | true | false |
| E.cs:429:13:429:22 | access to property HasValue | E.cs:429:13:429:13 | access to parameter i | false | true |
| E.cs:429:13:429:22 | access to property HasValue | E.cs:429:13:429:13 | access to parameter i | true | false |
| E.cs:437:13:437:21 | ... is ... | E.cs:437:13:437:13 | access to parameter s | false | false |
| E.cs:437:13:437:21 | ... is ... | E.cs:437:13:437:13 | access to parameter s | true | true |
| E.cs:442:13:442:29 | ... is ... | E.cs:442:13:442:13 | access to parameter s | false | false |
| E.cs:447:13:447:25 | ... is ... | E.cs:447:13:447:13 | access to parameter s | true | false |
| E.cs:452:13:452:23 | ... is ... | E.cs:452:13:452:13 | access to parameter s | true | false |
| E.cs:437:23:437:31 | ... is ... | E.cs:437:23:437:23 | access to parameter s | false | false |
| E.cs:437:23:437:31 | ... is ... | E.cs:437:23:437:23 | access to parameter s | true | true |
| E.cs:442:23:442:39 | ... is ... | E.cs:442:23:442:23 | access to parameter s | false | false |
| E.cs:447:23:447:35 | ... is ... | E.cs:447:23:447:23 | access to parameter s | true | false |
| E.cs:452:23:452:33 | ... is ... | E.cs:452:23:452:23 | access to parameter s | true | false |
| E.cs:457:13:457:27 | ... is ... | E.cs:457:13:457:13 | access to parameter s | false | false |
| Forwarding.cs:9:14:9:30 | call to method IsNullOrEmpty | Forwarding.cs:9:14:9:14 | access to local variable s | false | false |
| Forwarding.cs:14:13:14:32 | call to method IsNotNullOrEmpty | Forwarding.cs:14:13:14:13 | access to local variable s | true | false |

File diff suppressed because it is too large Load Diff

View File

@@ -1,2 +1,2 @@
| ConstantCondition.cs:15:13:15:26 | ... is ... | Condition always evaluates to 'false'. |
| ConstantCondition.cs:15:24:15:26 | access to type Int32 | Pattern never matches. |
| ConstantCondition.cs:15:13:15:26 | ... is ... | Condition always evaluates to 'false'. | ConstantCondition.cs:15:13:15:26 | ... is ... | dummy |
| ConstantCondition.cs:15:24:15:26 | access to type Int32 | Pattern never matches. | ConstantCondition.cs:15:24:15:26 | access to type Int32 | dummy |

View File

@@ -336,6 +336,9 @@ class SsaPhiNode extends SsaVariable instanceof PhiNode {
/** Gets an input to the phi node defining the SSA variable. */
SsaVariable getAPhiInput() { this.hasInputFromBlock(result, _) }
/** Gets an input to the phi node defining the SSA variable. */
SsaVariable getAnInput() { this.hasInputFromBlock(result, _) }
/** Holds if `inp` is an input to the phi node along the edge originating in `bb`. */
predicate hasInputFromBlock(SsaVariable inp, BasicBlock bb) {
phiHasInputFromBlock(this, inp, bb)

View File

@@ -366,6 +366,9 @@ class BaseSsaPhiNode extends BaseSsaVariable instanceof Impl::PhiNode {
/** Gets an input to the phi node defining the SSA variable. */
BaseSsaVariable getAPhiInput() { this.hasInputFromBlock(result, _) }
/** Gets an input to the phi node defining the SSA variable. */
BaseSsaVariable getAnInput() { this.hasInputFromBlock(result, _) }
/** Holds if `inp` is an input to the phi node along the edge originating in `bb`. */
predicate hasInputFromBlock(BaseSsaVariable inp, BasicBlock bb) {
phiHasInputFromBlock(this, inp, bb)

View File

@@ -1185,6 +1185,11 @@ module MakeWithSplitting<
final class AnnotatedExitNode = AnnotatedExitNodeImpl;
/** A control flow node indicating normal termination of a callable. */
final class NormalExitNode extends AnnotatedExitNodeImpl {
NormalExitNode() { this = TAnnotatedExitNode(_, true) }
}
/** An exit node for a given scope. */
private class ExitNodeImpl extends NodeImpl, TExitNode {
private CfgScope scope;

View File

@@ -64,7 +64,7 @@ signature module InputSig<LocationSig Location, TypSig ControlFlowNode, TypSig B
/** Holds if `inp` is an input to the phi node along the edge originating in `bb`. */
predicate hasInputFromBlock(SsaDefinition inp, BasicBlock bb);
SsaDefinition getAPhiInput();
SsaDefinition getAnInput();
}
class SsaUncertainDefinition extends SsaDefinition {
@@ -663,8 +663,8 @@ module Make<
or
exists(SsaPhiNode phi |
phi.definesAt(var, loopEntry, _) and
phi.getAPhiInput+() = def and
def.(SsaPhiNode).getAPhiInput*() = phi
phi.getAnInput+() = def and
def.(SsaPhiNode).getAnInput*() = phi
)
)
}

View File

@@ -202,12 +202,14 @@ module Make<
private newtype TAbstractSingleValue =
TValueNull() or
TValueTrue() or
TValueBool(Boolean b) or
TValueInt(int i) { exists(ConstantExpr c | c.asIntegerValue() = i) or i = 0 } or
TValueConstant(ConstantValue c) { exists(ConstantExpr ce | ce.asConstantValue() = c) }
private newtype TGuardValue =
TValue(TAbstractSingleValue val, Boolean isVal) or
TValue(TAbstractSingleValue val, Boolean isVal) {
val instanceof TValueBool implies isVal = true
} or
TIntRange(int bound, Boolean upper) {
exists(ConstantExpr c | c.asIntegerValue() + [-1, 0, 1] = bound) and
// exclude edge cases to avoid overflow issues when computing duals
@@ -221,7 +223,9 @@ module Make<
string toString() {
result = "null" and this instanceof TValueNull
or
result = "true" and this instanceof TValueTrue
result = "true" and this = TValueBool(true)
or
result = "false" and this = TValueBool(false)
or
exists(int i | result = i.toString() and this = TValueInt(i))
or
@@ -244,6 +248,11 @@ module Make<
result = TValue(val, isVal.booleanNot())
)
or
exists(boolean b |
this = TValue(TValueBool(b), true) and
result = TValue(TValueBool(b.booleanNot()), true)
)
or
exists(int bound, int d, boolean upper |
upper = true and d = 1
or
@@ -275,7 +284,7 @@ module Make<
int asIntValue() { this = TValue(TValueInt(result), true) }
/** Gets the boolean that this value represents, if any. */
boolean asBooleanValue() { this = TValue(TValueTrue(), result) }
boolean asBooleanValue() { this = TValue(TValueBool(result), true) }
/** Gets the constant that this value represents, if any. */
ConstantValue asConstantValue() { this = TValue(TValueConstant(result), true) }
@@ -293,9 +302,7 @@ module Make<
/** Gets a textual representation of this value. */
string toString() {
result = this.asBooleanValue().toString()
or
exists(AbstractSingleValue val | not val instanceof TValueTrue |
exists(AbstractSingleValue val |
this = TValue(val, true) and result = val.toString()
or
this = TValue(val, false) and result = "not " + val.toString()
@@ -365,15 +372,10 @@ module Make<
}
private predicate branchEdge(BasicBlock bb1, BasicBlock bb2, GuardValue v) {
exists(ConditionalSuccessor s |
bb1.getASuccessor(s) = bb2 and
exists(AbstractSingleValue val |
s instanceof NullnessSuccessor and val = TValueNull()
or
s instanceof BooleanSuccessor and val = TValueTrue()
|
v = TValue(val, s.getValue())
)
exists(ConditionalSuccessor s | bb1.getASuccessor(s) = bb2 |
s instanceof NullnessSuccessor and v = TValue(TValueNull(), s.getValue())
or
s instanceof BooleanSuccessor and v = TValue(TValueBool(s.getValue()), true)
)
or
exceptionBranchPoint(bb1, bb2, _) and v = TException(false)
@@ -503,7 +505,8 @@ module Make<
or
exists(NonNullExpr nonnull |
equalityTestSymmetric(g1, g2, nonnull, v1.asBooleanValue()) and
v2.isNonNullValue()
v2.isNonNullValue() and
not g2 instanceof NonNullExpr // disregard trivial guard
)
or
exists(Case c1, Expr switchExpr |
@@ -799,13 +802,16 @@ module Make<
}
private predicate impliesStep2(Guard g1, GuardValue v1, Guard g2, GuardValue v2) {
impliesStep1(g1, v1, g2, v2)
or
exists(Expr nonnull |
exprHasValue(nonnull, v2) and
equalityTestSymmetric(g1, g2, nonnull, v1.asBooleanValue()) and
v2.isNonNullValue()
)
(
impliesStep1(g1, v1, g2, v2)
or
exists(Expr nonnull |
exprHasValue(nonnull, v2) and
equalityTestSymmetric(g1, g2, nonnull, v1.asBooleanValue()) and
v2.isNonNullValue()
)
) and
not exprHasValue(g2, v2) // disregard trivial guard
}
bindingset[g1, v1]
@@ -969,6 +975,7 @@ module Make<
* Holds if `def` evaluating to `v` controls the basic block `bb`.
* That is, execution of `bb` implies that `def` evaluated to `v`.
*/
pragma[nomagic]
predicate ssaControls(SsaDefinition def, BasicBlock bb, GuardValue v) {
exists(BasicBlock guard, BasicBlock succ |
ssaControlsBranchEdge(def, guard, succ, v) and

View File

@@ -0,0 +1,111 @@
/**
* Provides a query for detecting constant conditions.
*/
overlay[local?]
module;
private import codeql.controlflow.BasicBlock as BB
private import codeql.util.Location
private signature class TypSig;
signature module InputSig<TypSig BasicBlock> {
class SsaDefinition;
/** An abstract value that a `Guard` may evaluate to. */
class GuardValue {
/** Gets a textual representation of this value. */
string toString();
/**
* Gets the dual value. Examples of dual values include:
* - null vs. not null
* - true vs. false
* - evaluating to a specific value vs. evaluating to any other value
* - throwing an exception vs. not throwing an exception
*/
GuardValue getDualValue();
/** Holds if this value represents throwing an exception. */
predicate isThrowsException();
}
/**
* A guard. This may be any expression whose value determines subsequent
* control flow. It may also be a switch case, which as a guard is considered
* to evaluate to either true or false depending on whether the case matches.
*/
class Guard {
/** Gets a textual representation of this guard. */
string toString();
/**
* Holds if this guard evaluating to `v` corresponds to taking the edge
* from `bb1` to `bb2`. For ordinary conditional branching this guard is
* the last node in `bb1`, but for switch case matching it is the switch
* expression, which may either be in `bb1` or an earlier basic block.
*/
predicate hasValueBranchEdge(BasicBlock bb1, BasicBlock bb2, GuardValue v);
}
/**
* Holds if `def` evaluating to `v` controls the control-flow branch
* edge from `bb1` to `bb2`. That is, following the edge from `bb1` to
* `bb2` implies that `def` evaluated to `v`.
*/
predicate ssaControlsBranchEdge(SsaDefinition def, BasicBlock bb1, BasicBlock bb2, GuardValue v);
/**
* Holds if `def` evaluating to `v` controls the basic block `bb`.
* That is, execution of `bb` implies that `def` evaluated to `v`.
*/
predicate ssaControls(SsaDefinition def, BasicBlock bb, GuardValue v);
bindingset[gv1, gv2]
predicate disjointValues(GuardValue gv1, GuardValue gv2);
}
module Make<LocationSig Location, BB::CfgSig<Location> Cfg, InputSig<Cfg::BasicBlock> Input> {
private import Cfg
private import Input
private predicate ssaControlsGuardEdge(
SsaDefinition def, GuardValue v, Guard g, BasicBlock bb1, BasicBlock bb2, GuardValue gv
) {
g.hasValueBranchEdge(bb1, bb2, gv) and
ssaControlsBranchEdge(def, bb1, bb2, v)
}
/** Holds if `g` cannot have value `gv` in `bb` due to `def` controlling `bb` with value `v2`. */
pragma[nomagic]
private predicate impossibleValue(
Guard g, GuardValue gv, SsaDefinition def, BasicBlock bb, GuardValue v2
) {
exists(GuardValue dual, GuardValue v1 |
// If `g` in `bb` evaluates to `gv` then `def` has value `v1`,
ssaControlsGuardEdge(def, v1, g, bb, _, gv) and
dual = gv.getDualValue() and
not gv.isThrowsException() and
not dual.isThrowsException() and
// but `def` controls `bb` with value `v2` via some guard,
ssaControls(def, bb, v2) and
// and `v1` and `v2` are disjoint so `g` cannot be `gv`.
disjointValues(v1, v2)
)
}
query predicate problems(Guard g, string msg, Guard reason, string reasonMsg) {
exists(
BasicBlock bb, GuardValue gv, SsaDefinition def, GuardValue v2, BasicBlock bb1, BasicBlock bb2
|
// `g` cannot have value `gv` in `bb` due to `def` controlling `bb` with value `v2`,
impossibleValue(g, gv, def, bb, v2) and
// and this is because of `reason` taking the branch `bb1` to `bb2`,
ssaControlsGuardEdge(def, v2, reason, bb1, bb2, _) and
dominatingEdge(bb1, bb2) and
bb2.dominates(bb) and
msg = "Condition is always " + gv.getDualValue() + " because of $@." and
reasonMsg = reason.toString()
)
}
}