diff --git a/csharp/ql/campaigns/Solorigate/src/ModifiedFnvFunctionDetection.ql b/csharp/ql/campaigns/Solorigate/src/ModifiedFnvFunctionDetection.ql index e09d00807e6d..11085e663b29 100644 --- a/csharp/ql/campaigns/Solorigate/src/ModifiedFnvFunctionDetection.ql +++ b/csharp/ql/campaigns/Solorigate/src/ModifiedFnvFunctionDetection.ql @@ -13,17 +13,19 @@ import csharp import Solorigate import experimental.code.csharp.Cryptography.NonCryptographicHashes +ControlFlowNode loopExitNode(LoopStmt loop) { result.isAfter(loop) } + from Variable v, Literal l, LoopStmt loop, Expr additional_xor where maybeUsedInFnvFunction(v, _, _, loop) and ( exists(BitwiseXorExpr xor2 | xor2.getAnOperand() = l and additional_xor = xor2 | - loop.getAControlFlowExitNode().getASuccessor*() = xor2.getAControlFlowNode() and + loopExitNode(loop).getASuccessor*() = xor2.getAControlFlowNode() and xor2.getAnOperand() = v.getAnAccess() ) or exists(AssignXorExpr xor2 | xor2.getAnOperand() = l and additional_xor = xor2 | - loop.getAControlFlowExitNode().getASuccessor*() = xor2.getAControlFlowNode() and + loopExitNode(loop).getASuccessor*() = xor2.getAControlFlowNode() and xor2.getAnOperand() = v.getAnAccess() ) ) diff --git a/csharp/ql/consistency-queries/CfgConsistency.ql b/csharp/ql/consistency-queries/CfgConsistency.ql index 4b0d15f8a819..883014fdcf08 100644 --- a/csharp/ql/consistency-queries/CfgConsistency.ql +++ b/csharp/ql/consistency-queries/CfgConsistency.ql @@ -1,5 +1,2 @@ import csharp -import semmle.code.csharp.controlflow.internal.Completion -import ControlFlow -import semmle.code.csharp.controlflow.internal.ControlFlowGraphImpl::Consistency -import semmle.code.csharp.controlflow.internal.Splitting +import ControlFlow::Consistency diff --git a/csharp/ql/consistency-queries/DataFlowConsistency.ql b/csharp/ql/consistency-queries/DataFlowConsistency.ql index 03e0f3f1b740..983206aada2c 100644 --- a/csharp/ql/consistency-queries/DataFlowConsistency.ql +++ b/csharp/ql/consistency-queries/DataFlowConsistency.ql @@ -1,5 +1,4 @@ import csharp -private import semmle.code.csharp.controlflow.internal.ControlFlowGraphImpl as ControlFlowGraphImpl private import semmle.code.csharp.dataflow.internal.DataFlowImplSpecific private import semmle.code.csharp.dataflow.internal.TaintTrackingImplSpecific private import codeql.dataflow.internal.DataFlowImplConsistency @@ -7,20 +6,6 @@ private import codeql.dataflow.internal.DataFlowImplConsistency private module Input implements InputSig { private import CsharpDataFlow - private predicate isStaticAssignable(Assignable a) { a.(Modifiable).isStatic() } - - predicate uniqueEnclosingCallableExclude(Node node) { - // TODO: Remove once static initializers are folded into the - // static constructors - isStaticAssignable(ControlFlowGraphImpl::getNodeCfgScope(node.getControlFlowNode())) - } - - predicate uniqueCallEnclosingCallableExclude(DataFlowCall call) { - // TODO: Remove once static initializers are folded into the - // static constructors - isStaticAssignable(ControlFlowGraphImpl::getNodeCfgScope(call.getControlFlowNode())) - } - predicate uniqueNodeLocationExclude(Node n) { // Methods with multiple implementations n instanceof ParameterNode @@ -70,16 +55,6 @@ private module Input implements InputSig { init.getInitializer().getNumberOfChildren() > 1 ) or - exists(ControlFlow::Nodes::ElementNode cfn, ControlFlow::Nodes::Split split | - exists(arg.asExprAtNode(cfn)) - | - split = cfn.getASplit() and - not split = call.getControlFlowNode().getASplit() - or - split = call.getControlFlowNode().getASplit() and - not split = cfn.getASplit() - ) - or call.(NonDelegateDataFlowCall).getDispatchCall().isReflection() ) } diff --git a/csharp/ql/consistency-queries/VariableCaptureConsistency.ql b/csharp/ql/consistency-queries/VariableCaptureConsistency.ql index 927741f07bfe..869be5aea9fe 100644 --- a/csharp/ql/consistency-queries/VariableCaptureConsistency.ql +++ b/csharp/ql/consistency-queries/VariableCaptureConsistency.ql @@ -1,13 +1,6 @@ import csharp import semmle.code.csharp.dataflow.internal.DataFlowPrivate::VariableCapture::Flow::ConsistencyChecks private import semmle.code.csharp.dataflow.internal.DataFlowPrivate::VariableCapture::Flow::ConsistencyChecks as ConsistencyChecks -private import semmle.code.csharp.controlflow.BasicBlocks -private import semmle.code.csharp.controlflow.internal.ControlFlowGraphImpl - -query predicate uniqueEnclosingCallable(BasicBlock bb, string msg) { - ConsistencyChecks::uniqueEnclosingCallable(bb, msg) and - getNodeCfgScope(bb.getFirstNode()) instanceof Callable -} query predicate consistencyOverview(string msg, int n) { none() } diff --git a/csharp/ql/lib/printCfg.ql b/csharp/ql/lib/printCfg.ql index aa92b1192042..c418446b2164 100644 --- a/csharp/ql/lib/printCfg.ql +++ b/csharp/ql/lib/printCfg.ql @@ -7,7 +7,7 @@ * @tags ide-contextual-queries/print-cfg */ -private import semmle.code.csharp.controlflow.internal.ControlFlowGraphImpl +import csharp external string selectedSourceFile(); @@ -21,7 +21,7 @@ external int selectedSourceColumn(); private predicate selectedSourceColumnAlias = selectedSourceColumn/0; -module ViewCfgQueryInput implements ViewCfgQueryInputSig { +module ViewCfgQueryInput implements ControlFlow::ViewCfgQueryInputSig { predicate selectedSourceFile = selectedSourceFileAlias/0; predicate selectedSourceLine = selectedSourceLineAlias/0; @@ -29,7 +29,7 @@ module ViewCfgQueryInput implements ViewCfgQueryInputSig { predicate selectedSourceColumn = selectedSourceColumnAlias/0; predicate cfgScopeSpan( - CfgScope scope, File file, int startLine, int startColumn, int endLine, int endColumn + Callable scope, File file, int startLine, int startColumn, int endLine, int endColumn ) { file = scope.getFile() and scope.getLocation().getStartLine() = startLine and @@ -40,11 +40,20 @@ module ViewCfgQueryInput implements ViewCfgQueryInputSig { | loc = scope.(Callable).getBody().getLocation() or - loc = scope.(Field).getInitializer().getLocation() + loc = any(AssignExpr init | scope.(ObjectInitMethod).initializes(init)).getLocation() or - loc = scope.(Property).getInitializer().getLocation() + exists(AssignableMember a, Constructor ctor | + scope = ctor and + ctor.isStatic() and + a.isStatic() and + a.getDeclaringType() = ctor.getDeclaringType() + | + loc = a.(Field).getInitializer().getLocation() + or + loc = a.(Property).getInitializer().getLocation() + ) ) } } -import ViewCfgQuery +import ControlFlow::ViewCfgQuery diff --git a/csharp/ql/lib/semmle/code/csharp/Assignable.qll b/csharp/ql/lib/semmle/code/csharp/Assignable.qll index 3c7170a6f846..05c1a7e05c58 100644 --- a/csharp/ql/lib/semmle/code/csharp/Assignable.qll +++ b/csharp/ql/lib/semmle/code/csharp/Assignable.qll @@ -83,7 +83,7 @@ class AssignableRead extends AssignableAccess { } pragma[noinline] - private ControlFlow::Node getAnAdjacentReadSameVar() { + private ControlFlowNode getAnAdjacentReadSameVar() { SsaImpl::adjacentReadPairSameVar(_, this.getAControlFlowNode(), result) } @@ -113,7 +113,7 @@ class AssignableRead extends AssignableAccess { */ pragma[nomagic] AssignableRead getANextRead() { - forex(ControlFlow::Node cfn | cfn = result.getAControlFlowNode() | + forex(ControlFlowNode cfn | cfn = result.getAControlFlowNode() | cfn = this.getAnAdjacentReadSameVar() ) } @@ -402,9 +402,7 @@ class AssignableDefinition extends TAssignableDefinition { * the definitions of `x` and `y` in `M(out x, out y)` and `(x, y) = (0, 1)` * relate to the same call to `M` and assignment node, respectively. */ - deprecated ControlFlow::Node getAControlFlowNode() { - result = this.getExpr().getAControlFlowNode() - } + deprecated ControlFlowNode getAControlFlowNode() { result = this.getExpr().getAControlFlowNode() } /** * Gets the underlying expression that updates the targeted assignable when @@ -477,7 +475,7 @@ class AssignableDefinition extends TAssignableDefinition { */ pragma[nomagic] AssignableRead getAFirstRead() { - forex(ControlFlow::Node cfn | cfn = result.getAControlFlowNode() | + forex(ControlFlowNode cfn | cfn = result.getAControlFlowNode() | exists(Ssa::ExplicitDefinition def | result = def.getAFirstReadAtNode(cfn) | this = def.getADefinition() ) @@ -555,9 +553,7 @@ module AssignableDefinitions { } /** Holds if a node in basic block `bb` assigns to `ref` parameter `p` via definition `def`. */ - private predicate basicBlockRefParamDef( - ControlFlow::BasicBlock bb, Parameter p, AssignableDefinition def - ) { + private predicate basicBlockRefParamDef(BasicBlock bb, Parameter p, AssignableDefinition def) { def = any(RefArg arg).getAnAnalyzableRefDef(p) and bb.getANode() = def.getExpr().getAControlFlowNode() } @@ -568,7 +564,7 @@ module AssignableDefinitions { * any assignments to `p`. */ pragma[nomagic] - private predicate parameterReachesWithoutDef(Parameter p, ControlFlow::BasicBlock bb) { + private predicate parameterReachesWithoutDef(Parameter p, BasicBlock bb) { forall(AssignableDefinition def | basicBlockRefParamDef(bb, p, def) | isUncertainRefCall(def.getTargetAccess()) ) and @@ -576,9 +572,7 @@ module AssignableDefinitions { any(RefArg arg).isAnalyzable(p) and p.getCallable().getEntryPoint() = bb.getFirstNode() or - exists(ControlFlow::BasicBlock mid | parameterReachesWithoutDef(p, mid) | - bb = mid.getASuccessor() - ) + exists(BasicBlock mid | parameterReachesWithoutDef(p, mid) | bb = mid.getASuccessor()) ) } @@ -590,7 +584,7 @@ module AssignableDefinitions { cached predicate isUncertainRefCall(RefArg arg) { arg.isPotentialAssignment() and - exists(ControlFlow::BasicBlock bb, Parameter p | arg.isAnalyzable(p) | + exists(BasicBlock bb, Parameter p | arg.isAnalyzable(p) | parameterReachesWithoutDef(p, bb) and bb.getLastNode() = p.getCallable().getExitPoint() ) @@ -671,7 +665,7 @@ module AssignableDefinitions { /** Gets the underlying parameter. */ Parameter getParameter() { result = p } - deprecated override ControlFlow::Node getAControlFlowNode() { + deprecated override ControlFlowNode getAControlFlowNode() { result = p.getCallable().getEntryPoint() } diff --git a/csharp/ql/lib/semmle/code/csharp/Caching.qll b/csharp/ql/lib/semmle/code/csharp/Caching.qll index bbe310fe69e5..134332ee75de 100644 --- a/csharp/ql/lib/semmle/code/csharp/Caching.qll +++ b/csharp/ql/lib/semmle/code/csharp/Caching.qll @@ -7,23 +7,6 @@ private import csharp * in the same stage across different files. */ module Stages { - cached - module ControlFlowStage { - private import semmle.code.csharp.controlflow.internal.Splitting - - cached - predicate forceCachingInSameStage() { any() } - - cached - private predicate forceCachingInSameStageRev() { - exists(Split s) - or - exists(ControlFlow::Node n) - or - forceCachingInSameStageRev() - } - } - cached module GuardsStage { private import semmle.code.csharp.controlflow.Guards diff --git a/csharp/ql/lib/semmle/code/csharp/Callable.qll b/csharp/ql/lib/semmle/code/csharp/Callable.qll index 611b578b859a..7859c7ea1d0e 100644 --- a/csharp/ql/lib/semmle/code/csharp/Callable.qll +++ b/csharp/ql/lib/semmle/code/csharp/Callable.qll @@ -22,7 +22,7 @@ private import TypeRef * an anonymous function (`AnonymousFunctionExpr`), or a local function * (`LocalFunction`). */ -class Callable extends Parameterizable, ExprOrStmtParent, @callable { +class Callable extends Parameterizable, ControlFlowElementOrCallable, @callable { /** Gets the return type of this callable. */ Type getReturnType() { none() } @@ -157,10 +157,10 @@ class Callable extends Parameterizable, ExprOrStmtParent, @callable { final predicate hasExpressionBody() { exists(this.getExpressionBody()) } /** Gets the entry point in the control graph for this callable. */ - ControlFlow::Nodes::EntryNode getEntryPoint() { result.getCallable() = this } + ControlFlow::EntryNode getEntryPoint() { result.getEnclosingCallable() = this } /** Gets the exit point in the control graph for this callable. */ - ControlFlow::Nodes::ExitNode getExitPoint() { result.getCallable() = this } + ControlFlow::ExitNode getExitPoint() { result.getEnclosingCallable() = this } /** * Gets the enclosing callable of this callable, if any. diff --git a/csharp/ql/lib/semmle/code/csharp/commons/Constants.qll b/csharp/ql/lib/semmle/code/csharp/commons/Constants.qll index ab2d9e0eef74..a827ecceeec9 100644 --- a/csharp/ql/lib/semmle/code/csharp/commons/Constants.qll +++ b/csharp/ql/lib/semmle/code/csharp/commons/Constants.qll @@ -1,20 +1,21 @@ /** Provides logic for determining constant expressions. */ import csharp +private import codeql.controlflow.SuccessorType private import semmle.code.csharp.commons.ComparisonTest private import semmle.code.csharp.commons.StructuralComparison as StructuralComparison pragma[noinline] -private predicate isConstantCondition0(ControlFlow::Node cfn, boolean b) { - exists(cfn.getASuccessorByType(any(ControlFlow::BooleanSuccessor t | t.getValue() = b))) and - strictcount(ControlFlow::SuccessorType t | exists(cfn.getASuccessorByType(t))) = 1 +private predicate isConstantCondition0(ControlFlowNode cfn, boolean b) { + exists(cfn.getASuccessor(any(BooleanSuccessor t | t.getValue() = b))) and + strictcount(SuccessorType t | exists(cfn.getASuccessor(t))) = 1 } /** * Holds if `e` is a condition that always evaluates to Boolean value `b`. */ predicate isConstantCondition(Expr e, boolean b) { - forex(ControlFlow::Node cfn | cfn = e.getAControlFlowNode() | isConstantCondition0(cfn, b)) + forex(ControlFlowNode cfn | cfn = e.getAControlFlowNode() | isConstantCondition0(cfn, b)) } /** diff --git a/csharp/ql/lib/semmle/code/csharp/controlflow/BasicBlocks.qll b/csharp/ql/lib/semmle/code/csharp/controlflow/BasicBlocks.qll index bf6a97728574..8b73f72e8041 100644 --- a/csharp/ql/lib/semmle/code/csharp/controlflow/BasicBlocks.qll +++ b/csharp/ql/lib/semmle/code/csharp/controlflow/BasicBlocks.qll @@ -3,354 +3,321 @@ */ import csharp -private import ControlFlow -private import semmle.code.csharp.controlflow.internal.ControlFlowGraphImpl as CfgImpl -private import CfgImpl::BasicBlocks as BasicBlocksImpl -private import codeql.controlflow.BasicBlock as BB - -/** - * A basic block, that is, a maximal straight-line sequence of control flow nodes - * without branches or joins. - */ -final class BasicBlock extends BasicBlocksImpl::BasicBlock { - /** Gets an immediate successor of this basic block of a given type, if any. */ - BasicBlock getASuccessor(ControlFlow::SuccessorType t) { result = super.getASuccessor(t) } - - /** DEPRECATED: Use `getASuccessor` instead. */ - deprecated BasicBlock getASuccessorByType(ControlFlow::SuccessorType t) { - result = this.getASuccessor(t) - } - - /** Gets an immediate predecessor of this basic block of a given type, if any. */ - BasicBlock getAPredecessorByType(ControlFlow::SuccessorType t) { - result = this.getAPredecessor(t) - } - - /** - * Gets an immediate `true` successor, if any. - * - * An immediate `true` successor is a successor that is reached when - * the condition that ends this basic block evaluates to `true`. - * - * Example: - * - * ```csharp - * if (x < 0) - * x = -x; - * ``` - * - * The basic block on line 2 is an immediate `true` successor of the - * basic block on line 1. - */ - BasicBlock getATrueSuccessor() { result.getFirstNode() = this.getLastNode().getATrueSuccessor() } - - /** - * Gets an immediate `false` successor, if any. - * - * An immediate `false` successor is a successor that is reached when - * the condition that ends this basic block evaluates to `false`. - * - * Example: - * - * ```csharp - * if (!(x >= 0)) - * x = -x; - * ``` - * - * The basic block on line 2 is an immediate `false` successor of the - * basic block on line 1. - */ - BasicBlock getAFalseSuccessor() { - result.getFirstNode() = this.getLastNode().getAFalseSuccessor() - } - - BasicBlock getASuccessor() { result = super.getASuccessor() } - - /** Gets the control flow node at a specific (zero-indexed) position in this basic block. */ - ControlFlow::Node getNode(int pos) { result = super.getNode(pos) } - - /** Gets a control flow node in this basic block. */ - ControlFlow::Node getANode() { result = super.getANode() } - - /** Gets the first control flow node in this basic block. */ - ControlFlow::Node getFirstNode() { result = super.getFirstNode() } - - /** Gets the last control flow node in this basic block. */ - ControlFlow::Node getLastNode() { result = super.getLastNode() } - - /** Gets the callable that this basic block belongs to. */ - final Callable getCallable() { result = this.getFirstNode().getEnclosingCallable() } - - /** - * Holds if this basic block immediately dominates basic block `bb`. - * - * That is, this basic block is the unique basic block satisfying: - * 1. This basic block strictly dominates `bb` - * 2. There exists no other basic block that is strictly dominated by this - * basic block and which strictly dominates `bb`. - * - * All basic blocks, except entry basic blocks, have a unique immediate - * dominator. - * - * Example: - * - * ```csharp - * int M(string s) { - * if (s == null) - * throw new ArgumentNullException(nameof(s)); - * return s.Length; - * } - * ``` - * - * The basic block starting on line 2 strictly dominates the - * basic block on line 4 (all paths from the entry point of `M` - * to `return s.Length;` must go through the null check). - */ - predicate immediatelyDominates(BasicBlock bb) { super.immediatelyDominates(bb) } - - /** - * Holds if this basic block strictly dominates basic block `bb`. - * - * That is, all paths reaching basic block `bb` from some entry point - * basic block must go through this basic block (which must be different - * from `bb`). - * - * Example: - * - * ```csharp - * int M(string s) { - * if (s == null) - * throw new ArgumentNullException(nameof(s)); - * return s.Length; - * } - * ``` - * - * The basic block starting on line 2 strictly dominates the - * basic block on line 4 (all paths from the entry point of `M` - * to `return s.Length;` must go through the null check). - */ - predicate strictlyDominates(BasicBlock bb) { super.strictlyDominates(bb) } - - /** - * Holds if this basic block dominates basic block `bb`. - * - * That is, all paths reaching basic block `bb` from some entry point - * basic block must go through this basic block. - * - * Example: - * - * ```csharp - * int M(string s) { - * if (s == null) - * throw new ArgumentNullException(nameof(s)); - * return s.Length; - * } - * ``` - * - * The basic block starting on line 2 dominates the basic - * block on line 4 (all paths from the entry point of `M` to - * `return s.Length;` must go through the null check). - * - * This predicate is *reflexive*, so for example `if (s == null)` dominates - * itself. - */ - predicate dominates(BasicBlock bb) { - bb = this or - this.strictlyDominates(bb) - } - - /** - * Holds if `df` is in the dominance frontier of this basic block. - * That is, this basic block dominates a predecessor of `df`, but - * does not dominate `df` itself. - * - * Example: - * - * ```csharp - * if (x < 0) { - * x = -x; - * if (x > 10) - * x--; - * } - * Console.Write(x); - * ``` - * - * The basic block on line 6 is in the dominance frontier - * of the basic block starting on line 2 because that block - * dominates the basic block on line 4, which is a predecessor of - * `Console.Write(x);`. Also, the basic block starting on line 2 - * does not dominate the basic block on line 6. - */ - predicate inDominanceFrontier(BasicBlock df) { super.inDominanceFrontier(df) } - - /** - * Gets the basic block that immediately dominates this basic block, if any. - * - * That is, the result is the unique basic block satisfying: - * 1. The result strictly dominates this basic block. - * 2. There exists no other basic block that is strictly dominated by the - * result and which strictly dominates this basic block. - * - * All basic blocks, except entry basic blocks, have a unique immediate - * dominator. - * - * Example: - * - * ```csharp - * int M(string s) { - * if (s == null) - * throw new ArgumentNullException(nameof(s)); - * return s.Length; - * } - * ``` - * - * The basic block starting on line 2 is an immediate dominator of - * the basic block online 4 (all paths from the entry point of `M` - * to `return s.Length;` must go through the null check. - */ - BasicBlock getImmediateDominator() { result = super.getImmediateDominator() } - - /** - * Holds if the edge with successor type `s` out of this basic block is a - * dominating edge for `dominated`. - * - * That is, all paths reaching `dominated` from the entry point basic - * block must go through the `s` edge out of this basic block. - * - * Edge dominance is similar to node dominance except it concerns edges - * instead of nodes: A basic block is dominated by a _basic block_ `bb` if it - * can only be reached through `bb` and dominated by an _edge_ `e` if it can - * only be reached through `e`. - * - * Note that where all basic blocks (except the entry basic block) are - * strictly dominated by at least one basic block, a basic block may not be - * dominated by any edge. If an edge dominates a basic block `bb`, then - * both endpoints of the edge dominates `bb`. The converse is not the case, - * as there may be multiple paths between the endpoints with none of them - * dominating. - */ - predicate edgeDominates(BasicBlock dominated, ControlFlow::SuccessorType s) { - super.edgeDominates(dominated, s) - } - - /** - * Holds if this basic block strictly post-dominates basic block `bb`. - * - * That is, all paths reaching a normal exit point basic block from basic - * block `bb` must go through this basic block (which must be different - * from `bb`). - * - * Example: - * - * ```csharp - * int M(string s) { - * try { - * return s.Length; - * } - * finally { - * Console.WriteLine("M"); - * } - * } - * ``` - * - * The basic block on line 6 strictly post-dominates the basic block on - * line 3 (all paths to the exit point of `M` from `return s.Length;` - * must go through the `WriteLine` call). - */ - predicate strictlyPostDominates(BasicBlock bb) { super.strictlyPostDominates(bb) } - - /** - * Holds if this basic block post-dominates basic block `bb`. - * - * That is, all paths reaching a normal exit point basic block from basic - * block `bb` must go through this basic block. - * - * Example: - * - * ```csharp - * int M(string s) { - * try { - * return s.Length; - * } - * finally { - * Console.WriteLine("M"); - * } - * } - * ``` - * - * The basic block on line 6 post-dominates the basic block on line 3 - * (all paths to the exit point of `M` from `return s.Length;` must go - * through the `WriteLine` call). - * - * This predicate is *reflexive*, so for example `Console.WriteLine("M");` - * post-dominates itself. - */ - predicate postDominates(BasicBlock bb) { super.postDominates(bb) } - - /** - * Holds if this basic block is in a loop in the control flow graph. This - * includes loops created by `goto` statements. This predicate may not hold - * even if this basic block is syntactically inside a `while` loop if the - * necessary back edges are unreachable. - */ - predicate inLoop() { this.getASuccessor+() = this } -} - -/** - * An entry basic block, that is, a basic block whose first node is - * an entry node. - */ -final class EntryBasicBlock extends BasicBlock, BasicBlocksImpl::EntryBasicBlock { } - -/** - * An annotated exit basic block, that is, a basic block that contains an - * annotated exit node. - */ -final class AnnotatedExitBasicBlock extends BasicBlock, BasicBlocksImpl::AnnotatedExitBasicBlock { } - -/** - * An exit basic block, that is, a basic block whose last node is - * an exit node. - */ -final class ExitBasicBlock extends BasicBlock, BasicBlocksImpl::ExitBasicBlock { } - -/** A basic block with more than one predecessor. */ -final class JoinBlock extends BasicBlock, BasicBlocksImpl::JoinBasicBlock { - JoinBlockPredecessor getJoinBlockPredecessor(int i) { result = super.getJoinBlockPredecessor(i) } -} - -/** A basic block that is an immediate predecessor of a join block. */ -final class JoinBlockPredecessor extends BasicBlock, BasicBlocksImpl::JoinPredecessorBasicBlock { } - -/** - * A basic block that terminates in a condition, splitting the subsequent - * control flow. - */ -final class ConditionBlock extends BasicBlock, BasicBlocksImpl::ConditionBasicBlock { - /** DEPRECATED: Use `edgeDominates` instead. */ - deprecated predicate immediatelyControls(BasicBlock succ, ConditionalSuccessor s) { - this.getASuccessor(s) = succ and - BasicBlocksImpl::dominatingEdge(this, succ) - } - - /** DEPRECATED: Use `edgeDominates` instead. */ - deprecated predicate controls(BasicBlock controlled, ConditionalSuccessor s) { - super.edgeDominates(controlled, s) - } -} - -private class BasicBlockAlias = BasicBlock; - -private class EntryBasicBlockAlias = EntryBasicBlock; - -module Cfg implements BB::CfgSig { - class ControlFlowNode = ControlFlow::Node; - - class BasicBlock = BasicBlockAlias; - - class EntryBasicBlock = EntryBasicBlockAlias; - - predicate dominatingEdge(BasicBlock bb1, BasicBlock bb2) { - BasicBlocksImpl::dominatingEdge(bb1, bb2) - } -} +// private import ControlFlow +// private import CfgImpl::BasicBlocks as BasicBlocksImpl +// private import codeql.controlflow.BasicBlock as BB +// /** +// * A basic block, that is, a maximal straight-line sequence of control flow nodes +// * without branches or joins. +// */ +// final class BasicBlock extends BasicBlocksImpl::BasicBlock { +// /** Gets an immediate successor of this basic block of a given type, if any. */ +// BasicBlock getASuccessor(ControlFlow::SuccessorType t) { result = super.getASuccessor(t) } +// /** DEPRECATED: Use `getASuccessor` instead. */ +// deprecated BasicBlock getASuccessorByType(ControlFlow::SuccessorType t) { +// result = this.getASuccessor(t) +// } +// /** Gets an immediate predecessor of this basic block of a given type, if any. */ +// BasicBlock getAPredecessorByType(ControlFlow::SuccessorType t) { +// result = this.getAPredecessor(t) +// } +// /** +// * Gets an immediate `true` successor, if any. +// * +// * An immediate `true` successor is a successor that is reached when +// * the condition that ends this basic block evaluates to `true`. +// * +// * Example: +// * +// * ```csharp +// * if (x < 0) +// * x = -x; +// * ``` +// * +// * The basic block on line 2 is an immediate `true` successor of the +// * basic block on line 1. +// */ +// BasicBlock getATrueSuccessor() { result.getFirstNode() = this.getLastNode().getATrueSuccessor() } +// /** +// * Gets an immediate `false` successor, if any. +// * +// * An immediate `false` successor is a successor that is reached when +// * the condition that ends this basic block evaluates to `false`. +// * +// * Example: +// * +// * ```csharp +// * if (!(x >= 0)) +// * x = -x; +// * ``` +// * +// * The basic block on line 2 is an immediate `false` successor of the +// * basic block on line 1. +// */ +// BasicBlock getAFalseSuccessor() { +// result.getFirstNode() = this.getLastNode().getAFalseSuccessor() +// } +// BasicBlock getASuccessor() { result = super.getASuccessor() } +// /** Gets the control flow node at a specific (zero-indexed) position in this basic block. */ +// ControlFlowNode getNode(int pos) { result = super.getNode(pos) } +// /** Gets a control flow node in this basic block. */ +// ControlFlowNode getANode() { result = super.getANode() } +// /** Gets the first control flow node in this basic block. */ +// ControlFlowNode getFirstNode() { result = super.getFirstNode() } +// /** Gets the last control flow node in this basic block. */ +// ControlFlowNode getLastNode() { result = super.getLastNode() } +// /** Gets the callable that this basic block belongs to. */ +// final Callable getCallable() { result = this.getFirstNode().getEnclosingCallable() } +// /** +// * Holds if this basic block immediately dominates basic block `bb`. +// * +// * That is, this basic block is the unique basic block satisfying: +// * 1. This basic block strictly dominates `bb` +// * 2. There exists no other basic block that is strictly dominated by this +// * basic block and which strictly dominates `bb`. +// * +// * All basic blocks, except entry basic blocks, have a unique immediate +// * dominator. +// * +// * Example: +// * +// * ```csharp +// * int M(string s) { +// * if (s == null) +// * throw new ArgumentNullException(nameof(s)); +// * return s.Length; +// * } +// * ``` +// * +// * The basic block starting on line 2 strictly dominates the +// * basic block on line 4 (all paths from the entry point of `M` +// * to `return s.Length;` must go through the null check). +// */ +// predicate immediatelyDominates(BasicBlock bb) { super.immediatelyDominates(bb) } +// /** +// * Holds if this basic block strictly dominates basic block `bb`. +// * +// * That is, all paths reaching basic block `bb` from some entry point +// * basic block must go through this basic block (which must be different +// * from `bb`). +// * +// * Example: +// * +// * ```csharp +// * int M(string s) { +// * if (s == null) +// * throw new ArgumentNullException(nameof(s)); +// * return s.Length; +// * } +// * ``` +// * +// * The basic block starting on line 2 strictly dominates the +// * basic block on line 4 (all paths from the entry point of `M` +// * to `return s.Length;` must go through the null check). +// */ +// predicate strictlyDominates(BasicBlock bb) { super.strictlyDominates(bb) } +// /** +// * Holds if this basic block dominates basic block `bb`. +// * +// * That is, all paths reaching basic block `bb` from some entry point +// * basic block must go through this basic block. +// * +// * Example: +// * +// * ```csharp +// * int M(string s) { +// * if (s == null) +// * throw new ArgumentNullException(nameof(s)); +// * return s.Length; +// * } +// * ``` +// * +// * The basic block starting on line 2 dominates the basic +// * block on line 4 (all paths from the entry point of `M` to +// * `return s.Length;` must go through the null check). +// * +// * This predicate is *reflexive*, so for example `if (s == null)` dominates +// * itself. +// */ +// predicate dominates(BasicBlock bb) { +// bb = this or +// this.strictlyDominates(bb) +// } +// /** +// * Holds if `df` is in the dominance frontier of this basic block. +// * That is, this basic block dominates a predecessor of `df`, but +// * does not dominate `df` itself. +// * +// * Example: +// * +// * ```csharp +// * if (x < 0) { +// * x = -x; +// * if (x > 10) +// * x--; +// * } +// * Console.Write(x); +// * ``` +// * +// * The basic block on line 6 is in the dominance frontier +// * of the basic block starting on line 2 because that block +// * dominates the basic block on line 4, which is a predecessor of +// * `Console.Write(x);`. Also, the basic block starting on line 2 +// * does not dominate the basic block on line 6. +// */ +// predicate inDominanceFrontier(BasicBlock df) { super.inDominanceFrontier(df) } +// /** +// * Gets the basic block that immediately dominates this basic block, if any. +// * +// * That is, the result is the unique basic block satisfying: +// * 1. The result strictly dominates this basic block. +// * 2. There exists no other basic block that is strictly dominated by the +// * result and which strictly dominates this basic block. +// * +// * All basic blocks, except entry basic blocks, have a unique immediate +// * dominator. +// * +// * Example: +// * +// * ```csharp +// * int M(string s) { +// * if (s == null) +// * throw new ArgumentNullException(nameof(s)); +// * return s.Length; +// * } +// * ``` +// * +// * The basic block starting on line 2 is an immediate dominator of +// * the basic block online 4 (all paths from the entry point of `M` +// * to `return s.Length;` must go through the null check. +// */ +// BasicBlock getImmediateDominator() { result = super.getImmediateDominator() } +// /** +// * Holds if the edge with successor type `s` out of this basic block is a +// * dominating edge for `dominated`. +// * +// * That is, all paths reaching `dominated` from the entry point basic +// * block must go through the `s` edge out of this basic block. +// * +// * Edge dominance is similar to node dominance except it concerns edges +// * instead of nodes: A basic block is dominated by a _basic block_ `bb` if it +// * can only be reached through `bb` and dominated by an _edge_ `e` if it can +// * only be reached through `e`. +// * +// * Note that where all basic blocks (except the entry basic block) are +// * strictly dominated by at least one basic block, a basic block may not be +// * dominated by any edge. If an edge dominates a basic block `bb`, then +// * both endpoints of the edge dominates `bb`. The converse is not the case, +// * as there may be multiple paths between the endpoints with none of them +// * dominating. +// */ +// predicate edgeDominates(BasicBlock dominated, ControlFlow::SuccessorType s) { +// super.edgeDominates(dominated, s) +// } +// /** +// * Holds if this basic block strictly post-dominates basic block `bb`. +// * +// * That is, all paths reaching a normal exit point basic block from basic +// * block `bb` must go through this basic block (which must be different +// * from `bb`). +// * +// * Example: +// * +// * ```csharp +// * int M(string s) { +// * try { +// * return s.Length; +// * } +// * finally { +// * Console.WriteLine("M"); +// * } +// * } +// * ``` +// * +// * The basic block on line 6 strictly post-dominates the basic block on +// * line 3 (all paths to the exit point of `M` from `return s.Length;` +// * must go through the `WriteLine` call). +// */ +// predicate strictlyPostDominates(BasicBlock bb) { super.strictlyPostDominates(bb) } +// /** +// * Holds if this basic block post-dominates basic block `bb`. +// * +// * That is, all paths reaching a normal exit point basic block from basic +// * block `bb` must go through this basic block. +// * +// * Example: +// * +// * ```csharp +// * int M(string s) { +// * try { +// * return s.Length; +// * } +// * finally { +// * Console.WriteLine("M"); +// * } +// * } +// * ``` +// * +// * The basic block on line 6 post-dominates the basic block on line 3 +// * (all paths to the exit point of `M` from `return s.Length;` must go +// * through the `WriteLine` call). +// * +// * This predicate is *reflexive*, so for example `Console.WriteLine("M");` +// * post-dominates itself. +// */ +// predicate postDominates(BasicBlock bb) { super.postDominates(bb) } +// /** +// * Holds if this basic block is in a loop in the control flow graph. This +// * includes loops created by `goto` statements. This predicate may not hold +// * even if this basic block is syntactically inside a `while` loop if the +// * necessary back edges are unreachable. +// */ +// predicate inLoop() { this.getASuccessor+() = this } +// } +// /** +// * An entry basic block, that is, a basic block whose first node is +// * an entry node. +// */ +// final class EntryBasicBlock extends BasicBlock, BasicBlocksImpl::EntryBasicBlock { } +// /** +// * An annotated exit basic block, that is, a basic block that contains an +// * annotated exit node. +// */ +// final class AnnotatedExitBasicBlock extends BasicBlock, BasicBlocksImpl::AnnotatedExitBasicBlock { } +// /** +// * An exit basic block, that is, a basic block whose last node is +// * an exit node. +// */ +// final class ExitBasicBlock extends BasicBlock, BasicBlocksImpl::ExitBasicBlock { } +// /** A basic block with more than one predecessor. */ +// final class JoinBlock extends BasicBlock, BasicBlocksImpl::JoinBasicBlock { +// JoinBlockPredecessor getJoinBlockPredecessor(int i) { result = super.getJoinBlockPredecessor(i) } +// } +// /** A basic block that is an immediate predecessor of a join block. */ +// final class JoinBlockPredecessor extends BasicBlock, BasicBlocksImpl::JoinPredecessorBasicBlock { } +// /** +// * A basic block that terminates in a condition, splitting the subsequent +// * control flow. +// */ +// final class ConditionBlock extends BasicBlock, BasicBlocksImpl::ConditionBasicBlock { +// /** DEPRECATED: Use `edgeDominates` instead. */ +// deprecated predicate immediatelyControls(BasicBlock succ, ConditionalSuccessor s) { +// this.getASuccessor(s) = succ and +// BasicBlocksImpl::dominatingEdge(this, succ) +// } +// /** DEPRECATED: Use `edgeDominates` instead. */ +// deprecated predicate controls(BasicBlock controlled, ConditionalSuccessor s) { +// super.edgeDominates(controlled, s) +// } +// } +// private class ControlFlowNodeAlias = ControlFlowNode; +// private class BasicBlockAlias = BasicBlock; +// private class EntryBasicBlockAlias = EntryBasicBlock; +// module Cfg implements BB::CfgSig { +// class ControlFlowNode = ControlFlowNodeAlias; +// class BasicBlock = BasicBlockAlias; +// class EntryBasicBlock = EntryBasicBlockAlias; +// predicate dominatingEdge(BasicBlock bb1, BasicBlock bb2) { +// BasicBlocksImpl::dominatingEdge(bb1, bb2) +// } +// } diff --git a/csharp/ql/lib/semmle/code/csharp/controlflow/ControlFlowElement.qll b/csharp/ql/lib/semmle/code/csharp/controlflow/ControlFlowElement.qll index 0d0ed6819698..a0a578e23884 100644 --- a/csharp/ql/lib/semmle/code/csharp/controlflow/ControlFlowElement.qll +++ b/csharp/ql/lib/semmle/code/csharp/controlflow/ControlFlowElement.qll @@ -4,20 +4,22 @@ import csharp private import semmle.code.csharp.ExprOrStmtParent private import semmle.code.csharp.commons.Compilation private import ControlFlow -private import ControlFlow::BasicBlocks private import semmle.code.csharp.Caching -private import internal.ControlFlowGraphImpl as Impl + +private class TControlFlowElementOrCallable = @callable or @control_flow_element; + +class ControlFlowElementOrCallable extends ExprOrStmtParent, TControlFlowElementOrCallable { } /** * A program element that can possess control flow. That is, either a statement or * an expression. * - * A control flow element can be mapped to a control flow node (`ControlFlow::Node`) + * A control flow element can be mapped to a control flow node (`ControlFlowNode`) * via `getAControlFlowNode()`. There is a one-to-many relationship between * control flow elements and control flow nodes. This allows control flow * splitting, for example modeling the control flow through `finally` blocks. */ -class ControlFlowElement extends ExprOrStmtParent, @control_flow_element { +class ControlFlowElement extends ControlFlowElementOrCallable, @control_flow_element { /** Gets the enclosing callable of this element, if any. */ Callable getEnclosingCallable() { none() } @@ -32,34 +34,15 @@ class ControlFlowElement extends ExprOrStmtParent, @control_flow_element { /** * Gets a control flow node for this element. That is, a node in the * control flow graph that corresponds to this element. - * - * Typically, there is exactly one `ControlFlow::Node` associated with a - * `ControlFlowElement`, but a `ControlFlowElement` may be split into - * several `ControlFlow::Node`s, for example to represent the continuation - * flow in a `try/catch/finally` construction. */ - Nodes::ElementNode getAControlFlowNode() { result.getAstNode() = this } + ControlFlowNodes::ElementNode getAControlFlowNode() { result = this.getControlFlowNode() } /** Gets the control flow node for this element. */ - ControlFlow::Node getControlFlowNode() { result.getAstNode() = this } + ControlFlowNode getControlFlowNode() { result.injects(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. - */ - Nodes::ElementNode getAControlFlowEntryNode() { - result = Impl::getAControlFlowEntryNode(this).(ControlFlowElement).getAControlFlowNode() - } - - /** - * Gets a potential last control flow node executed within this element. - */ - Nodes::ElementNode getAControlFlowExitNode() { - result = Impl::getAControlFlowExitNode(this).(ControlFlowElement).getAControlFlowNode() - } - /** * Holds if this element is live, that is this element can be reached * from the entry point of its enclosing callable. @@ -86,22 +69,4 @@ class ControlFlowElement extends ExprOrStmtParent, @control_flow_element { this.getAControlFlowNode().getBasicBlock().getASuccessor+().getANode() = result.getAControlFlowNode() } - - /** - * DEPRECATED: Use `Guard` class instead. - * - * Holds if basic block `controlled` is controlled by this control flow element - * with conditional value `s`. That is, `controlled` can only be reached from - * the callable entry point by going via the `s` edge out of *some* basic block - * ending with this element. - * - * `cb` records all of the possible condition blocks for this control flow element - * that a path from the callable entry point to `controlled` may go through. - */ - deprecated predicate controlsBlock( - BasicBlock controlled, ConditionalSuccessor s, ConditionBlock cb - ) { - cb.getLastNode() = this.getAControlFlowNode() and - cb.edgeDominates(controlled, s) - } } diff --git a/csharp/ql/lib/semmle/code/csharp/controlflow/ControlFlowGraph.qll b/csharp/ql/lib/semmle/code/csharp/controlflow/ControlFlowGraph.qll index 438174fe2970..4757a44297d7 100644 --- a/csharp/ql/lib/semmle/code/csharp/controlflow/ControlFlowGraph.qll +++ b/csharp/ql/lib/semmle/code/csharp/controlflow/ControlFlowGraph.qll @@ -1,315 +1,568 @@ -import csharp - /** * Provides classes representing the control flow graph within callables. */ -module ControlFlow { - private import semmle.code.csharp.controlflow.BasicBlocks as BBs - import semmle.code.csharp.controlflow.internal.SuccessorType - private import internal.ControlFlowGraphImpl as Impl - private import internal.Splitting as Splitting - /** - * A control flow node. - * - * Either a callable entry node (`EntryNode`), a callable exit node (`ExitNode`), - * or a control flow node for a control flow element, that is, an expression or a - * statement (`ElementNode`). - * - * A control flow node is a node in the control flow graph (CFG). There is a - * many-to-one relationship between `ElementNode`s and `ControlFlowElement`s. - * This allows control flow splitting, for example modeling the control flow - * through `finally` blocks. - * - * Only nodes that can be reached from the callable entry point are included in - * the CFG. - */ - class Node extends Impl::Node { - /** Gets the control flow element that this node corresponds to, if any. */ - final ControlFlowElement getAstNode() { result = super.getAstNode() } - - /** Gets the basic block that this control flow node belongs to. */ - BasicBlock getBasicBlock() { result.getANode() = this } - - /** - * Holds if this node dominates `that` node. - * - * That is, all paths reaching `that` node from some callable entry - * node (`EntryNode`) must go through this node. - * - * Example: - * - * ```csharp - * int M(string s) - * { - * if (s == null) - * throw new ArgumentNullException(nameof(s)); - * return s.Length; - * } - * ``` - * - * The node on line 3 dominates the node on line 5 (all paths from the - * entry point of `M` to `return s.Length;` must go through the null check). - * - * This predicate is *reflexive*, so for example `if (s == null)` dominates - * itself. - */ - // potentially very large predicate, so must be inlined - pragma[inline] - predicate dominates(Node that) { - this.strictlyDominates(that) - or - this = that - } +import csharp +private import codeql.controlflow.ControlFlowGraph +private import codeql.controlflow.SuccessorType +private import semmle.code.csharp.commons.Compilation +private import semmle.code.csharp.controlflow.internal.NonReturning as NonReturning +private import semmle.code.csharp.controlflow.internal.Completion as Completion - /** - * Holds if this node strictly dominates `that` node. - * - * That is, all paths reaching `that` node from some callable entry - * node (`EntryNode`) must go through this node (which must - * be different from `that` node). - * - * Example: - * - * ```csharp - * int M(string s) - * { - * if (s == null) - * throw new ArgumentNullException(nameof(s)); - * return s.Length; - * } - * ``` - * - * The node on line 3 strictly dominates the node on line 5 - * (all paths from the entry point of `M` to `return s.Length;` must go - * through the null check). - */ - // potentially very large predicate, so must be inlined - pragma[inline] - predicate strictlyDominates(Node that) { - this.getBasicBlock().strictlyDominates(that.getBasicBlock()) - or - exists(BasicBlock bb, int i, int j | - bb.getNode(i) = this and - bb.getNode(j) = that and - i < j - ) - } +private module Cfg0 = Make0; - /** - * Holds if this node post-dominates `that` node. - * - * That is, all paths reaching a normal callable exit node (an `AnnotatedExitNode` - * with a normal exit type) from `that` node must go through this node. - * - * Example: - * - * ```csharp - * int M(string s) - * { - * try - * { - * return s.Length; - * } - * finally - * { - * Console.WriteLine("M"); - * } - * } - * ``` - * - * The node on line 9 post-dominates the node on line 5 (all paths to the - * exit point of `M` from `return s.Length;` must go through the `WriteLine` - * call). - * - * This predicate is *reflexive*, so for example `Console.WriteLine("M");` - * post-dominates itself. - */ - // potentially very large predicate, so must be inlined - pragma[inline] - predicate postDominates(Node that) { - this.strictlyPostDominates(that) - or - this = that - } +private module Cfg1 = Make1; - /** - * Holds if this node strictly post-dominates `that` node. - * - * That is, all paths reaching a normal callable exit node (an `AnnotatedExitNode` - * with a normal exit type) from `that` node must go through this node - * (which must be different from `that` node). - * - * Example: - * - * ```csharp - * int M(string s) - * { - * try - * { - * return s.Length; - * } - * finally - * { - * Console.WriteLine("M"); - * } - * } - * ``` - * - * The node on line 9 strictly post-dominates the node on line 5 (all - * paths to the exit point of `M` from `return s.Length;` must go through - * the `WriteLine` call). - */ - // potentially very large predicate, so must be inlined - pragma[inline] - predicate strictlyPostDominates(Node that) { - this.getBasicBlock().strictlyPostDominates(that.getBasicBlock()) - or - exists(BasicBlock bb, int i, int j | - bb.getNode(i) = this and - bb.getNode(j) = that and - i > j +private module Cfg2 = Make2; + +private import Cfg0 +private import Cfg1 +private import Cfg2 +import Public + +/** Provides an implementation of the AST signature for C#. */ +private module Ast implements AstSig { + private import csharp as CS + + class AstNode = ControlFlowElementOrCallable; + + private predicate expandedAssignmentParent(Expr p) { + exists(AssignExpr ae | any(AssignOperation ao).getExpandedAssignment() = ae | + p = ae or p = ae.getRightOperand() + ) + } + + private AstNode getExprChild0(Expr e, int i) { + not e instanceof NameOfExpr and + not e instanceof QualifiableExpr and + not e instanceof Assignment and + not e instanceof AnonymousFunctionExpr and + result = e.getChild(i) + or + e = any(ExtensionMethodCall emc | result = emc.getArgument(i)) + or + e = + any(QualifiableExpr qe | + not qe instanceof ExtensionMethodCall and + result = qe.getChild(i) ) - } + or + e = + any(Assignment a | + // The left-hand side of an assignment is evaluated before the right-hand side + i = 0 and result = a.getLValue() + or + i = 1 and result = a.getRValue() + ) + } - /** Gets a successor node of a given type, if any. */ - Node getASuccessorByType(SuccessorType t) { result = this.getASuccessor(t) } - - /** Gets an immediate successor, if any. */ - Node getASuccessor() { result = this.getASuccessorByType(_) } - - /** Gets an immediate predecessor node of a given flow type, if any. */ - Node getAPredecessorByType(SuccessorType t) { result.getASuccessorByType(t) = this } - - /** Gets an immediate predecessor, if any. */ - Node getAPredecessor() { result = this.getAPredecessorByType(_) } - - /** - * Gets an immediate `true` successor, if any. - * - * An immediate `true` successor is a successor that is reached when - * this condition evaluates to `true`. - * - * Example: - * - * ```csharp - * if (x < 0) - * x = -x; - * ``` - * - * The node on line 2 is an immediate `true` successor of the node - * on line 1. - */ - Node getATrueSuccessor() { - result = this.getASuccessorByType(any(BooleanSuccessor t | t.getValue() = true)) - } + private AstNode getStmtChild0(Stmt s, int i) { + not s instanceof FixedStmt and + not s instanceof UsingBlockStmt and + result = s.getChild(i) + or + s = + any(FixedStmt fs | + result = fs.getVariableDeclExpr(i) + or + result = fs.getBody() and + i = max(int j | exists(fs.getVariableDeclExpr(j))) + 1 + ) + or + s = + any(UsingBlockStmt us | + result = us.getExpr() and + i = 0 + or + result = us.getVariableDeclExpr(i) + or + result = us.getBody() and + i = max([1, count(us.getVariableDeclExpr(_))]) + ) + } - /** - * Gets an immediate `false` successor, if any. - * - * An immediate `false` successor is a successor that is reached when - * this condition evaluates to `false`. - * - * Example: - * - * ```csharp - * if (!(x >= 0)) - * x = -x; - * ``` - * - * The node on line 2 is an immediate `false` successor of the node - * on line 1. - */ - Node getAFalseSuccessor() { - result = this.getASuccessorByType(any(BooleanSuccessor t | t.getValue() = false)) - } + AstNode getChild(AstNode n, int index) { + result = getStmtChild0(n, index) + or + result = getExprChild0(n, index) and not expandedAssignmentParent(n) + } - /** Gets the enclosing callable of this control flow node. */ - final Callable getEnclosingCallable() { result = Impl::getNodeCfgScope(this) } + private AstNode getParent(AstNode n) { n = getChild(result, _) } + + Callable getEnclosingCallable(AstNode node) { + result = node.(ControlFlowElement).getEnclosingCallable() or + result.(ObjectInitMethod).initializes(getParent*(node)) or + Initializers::staticMemberInitializer(result, getParent*(node)) } - /** Provides different types of control flow nodes. */ - module Nodes { - /** A node for a callable entry point. */ - class EntryNode extends Node instanceof Impl::EntryNode { - /** Gets the callable that this entry applies to. */ - Callable getCallable() { result = this.getScope() } + class Callable = CS::Callable; - override BasicBlocks::EntryBlock getBasicBlock() { result = Node.super.getBasicBlock() } - } + AstNode callableGetBody(Callable c) { + result = c.getBody() or + result = c.(Constructor).getObjectInitializerCall() or + result = c.(Constructor).getInitializer() or + c.(ObjectInitMethod).initializes(result) or + Initializers::staticMemberInitializer(c, result) + } - /** A node for a callable exit point, annotated with the type of exit. */ - class AnnotatedExitNode extends Node instanceof Impl::AnnotatedExitNode { - /** Holds if this node represent a normal exit. */ - final predicate isNormal() { super.isNormal() } + class Stmt = CS::Stmt; - /** Gets the callable that this exit applies to. */ - Callable getCallable() { result = this.getScope() } + class Expr = CS::Expr; - override BasicBlocks::AnnotatedExitBlock getBasicBlock() { - result = Node.super.getBasicBlock() - } - } + class BlockStmt = CS::BlockStmt; - /** A control flow node indicating normal termination of a callable. */ - class NormalExitNode extends AnnotatedExitNode instanceof Impl::NormalExitNode { } + class ExprStmt = CS::ExprStmt; - /** A node for a callable exit point. */ - class ExitNode extends Node instanceof Impl::ExitNode { - /** Gets the callable that this exit applies to. */ - Callable getCallable() { result = this.getScope() } + class IfStmt = CS::IfStmt; - override BasicBlocks::ExitBlock getBasicBlock() { result = Node.super.getBasicBlock() } - } + class LoopStmt = CS::LoopStmt; + + class WhileStmt = CS::WhileStmt; + + class DoStmt = CS::DoStmt; + + final private class FinalForStmt = CS::ForStmt; + + class ForStmt extends FinalForStmt { + Expr getInit(int index) { result = this.getInitializer(index) } + } - /** - * A node for a control flow element, that is, an expression or a statement. - * - * Each control flow element maps to zero or more `ElementNode`s: zero when - * the element is in unreachable (dead) code, and multiple when there are - * different splits for the element. - */ - class ElementNode extends Node instanceof Impl::AstCfgNode { - /** Gets a comma-separated list of strings for each split in this node, if any. */ - final string getSplitsString() { result = super.getSplitsString() } - - /** Gets a split for this control flow node, if any. */ - final Split getASplit() { result = super.getASplit() } + final private class FinalForeachStmt = CS::ForeachStmt; + + class ForeachStmt extends FinalForeachStmt { + Expr getVariable() { + result = this.getVariableDeclExpr() or result = this.getVariableDeclTuple() } - /** A control-flow node for an expression. */ - class ExprNode extends ElementNode { - Expr e; + Expr getCollection() { result = this.getIterableExpr() } + } + + class BreakStmt = CS::BreakStmt; + + class ContinueStmt = CS::ContinueStmt; + + class GotoStmt = CS::GotoStmt; + + class ReturnStmt = CS::ReturnStmt; + + class Throw = CS::ThrowElement; + + final private class FinalTryStmt = CS::TryStmt; + + class TryStmt extends FinalTryStmt { + Stmt getBody() { result = this.getBlock() } + + CatchClause getCatch(int index) { result = this.getCatchClause(index) } + + Stmt getFinally() { result = super.getFinally() } + } + + final private class FinalCatchClause = CS::CatchClause; + + class CatchClause extends FinalCatchClause { + AstNode getVariable() { result = this.(CS::SpecificCatchClause).getVariableDeclExpr() } + + Expr getCondition() { result = this.getFilterClause() } + + Stmt getBody() { result = this.getBlock() } + } + + final private class FinalSwitch = CS::Switch; + + class Switch extends FinalSwitch { + Case getCase(int index) { result = super.getCase(index) } + + Stmt getStmt(int index) { result = this.(CS::SwitchStmt).getStmt(index) } + } + + final private class FinalCase = CS::Case; + + class Case extends FinalCase { + AstNode getAPattern() { result = this.getPattern() } + + Expr getGuard() { result = this.getCondition() } + + AstNode getBody() { result = super.getBody() } + } + + class DefaultCase extends Case instanceof CS::DefaultCase { } + + class ConditionalExpr = CS::ConditionalExpr; + + class BinaryExpr = CS::BinaryOperation; + + class LogicalAndExpr = CS::LogicalAndExpr; + + class LogicalOrExpr = CS::LogicalOrExpr; + + final private class FinalNullCoalescingExpr = CS::NullCoalescingExpr; + + // class NullCoalescingExpr = CS::NullCoalescingExpr; + class NullCoalescingExpr extends FinalNullCoalescingExpr { + NullCoalescingExpr() { not expandedAssignmentParent(this) } + } + + class UnaryExpr = CS::UnaryOperation; + + class LogicalNotExpr = CS::LogicalNotExpr; + + class Assignment = CS::Assignment; + + class AssignExpr = CS::AssignExpr; + + class CompoundAssignment = CS::AssignOperation; + + class AssignLogicalAndExpr extends CompoundAssignment { + AssignLogicalAndExpr() { none() } + } + + class AssignLogicalOrExpr extends CompoundAssignment { + AssignLogicalOrExpr() { none() } + } + + class AssignNullCoalescingExpr = CS::AssignCoalesceExpr; - ExprNode() { e = unique(Expr e_ | e_ = this.getAstNode() | e_) } + final private class FinalBoolLiteral = CS::BoolLiteral; - /** Gets the expression that this control-flow node belongs to. */ - Expr getExpr() { result = e } + class BooleanLiteral extends FinalBoolLiteral { + boolean getValue() { result = this.getBoolValue() } + } + + final private class FinalIsExpr = CS::IsExpr; - /** Gets the value of this expression node, if any. */ - string getValue() { result = e.getValue() } + class PatternMatchExpr extends FinalIsExpr { + AstNode getPattern() { result = super.getPattern() } + } +} + +/** + * A compilation. + * + * Unlike the standard `Compilation` class, this class also supports buildless + * extraction. + */ +private newtype CompilationExt = + TCompilation(Compilation c) { not extractionIsStandalone() } or + TBuildless() { extractionIsStandalone() } + +/** Gets the compilation that source file `f` belongs to. */ +private CompilationExt getCompilation(File f) { + exists(Compilation c | + f = c.getAFileCompiled() and + result = TCompilation(c) + ) + or + result = TBuildless() +} + +private module Initializers { + private import semmle.code.csharp.ExprOrStmtParent as ExprOrStmtParent + + /** + * The `expr_parent_top_level_adjusted()` relation restricted to exclude relations + * between properties and their getters' expression bodies in properties such as + * `int P => 0`. + * + * This is in order to only associate the expression body with one CFG scope, namely + * the getter (and not the declaration itself). + */ + private predicate expr_parent_top_level_adjusted2( + Expr child, int i, @top_level_exprorstmt_parent parent + ) { + ExprOrStmtParent::expr_parent_top_level_adjusted(child, i, parent) and + not exists(Getter g | + g.getDeclaration() = parent and + i = 0 + ) + } + + /** + * Holds if `init` is a static member initializer and `staticCtor` is the + * static constructor in the same declaring type. Hence, `staticCtor` can be + * considered to execute `init` prior to the execution of its body. + */ + predicate staticMemberInitializer(Constructor staticCtor, Expr init) { + exists(Assignable a | + a.(Modifiable).isStatic() and + expr_parent_top_level_adjusted2(init, _, a) and + a.getDeclaringType() = staticCtor.getDeclaringType() and + staticCtor.isStatic() + ) + } - /** Gets the type of this expression node. */ - Type getType() { result = e.getType() } + /** + * Gets the `i`th static member initializer expression for static constructor `staticCtor`. + */ + Expr initializedStaticMemberOrder(Constructor staticCtor, int i) { + result = + rank[i + 1](Expr init, Location l | + staticMemberInitializer(staticCtor, init) and + l = init.getLocation() + | + init order by l.getStartLine(), l.getStartColumn(), l.getFile().getAbsolutePath() + ) + } + + /** + * Gets the `i`th member initializer expression for object initializer method `obinit` + * in compilation `comp`. + */ + AssignExpr initializedInstanceMemberOrder(ObjectInitMethod obinit, CompilationExt comp, int i) { + obinit.initializes(result) and + result = + rank[i + 1](AssignExpr ae0, Location l | + obinit.initializes(ae0) and + l = ae0.getLocation() and + getCompilation(l.getFile()) = comp + | + ae0 order by l.getStartLine(), l.getStartColumn(), l.getFile().getAbsolutePath() + ) + } + + /** + * Gets the last member initializer expression for object initializer method `obinit` + * in compilation `comp`. + */ + AssignExpr lastInitializer(ObjectInitMethod obinit, CompilationExt comp) { + exists(int i | + result = initializedInstanceMemberOrder(obinit, comp, i) and + not exists(initializedInstanceMemberOrder(obinit, comp, i + 1)) + ) + } +} + +// module Consistency = ControlFlow::Consistency; +private module Input implements InputSig1, InputSig2 { + predicate cfgCachedStageRef() { CfgCachedStage::ref() } + + predicate catchAll(Ast::CatchClause catch) { catch instanceof GeneralCatchClause } + + predicate matchAll(Ast::Case c) { c instanceof DefaultCase or c.(SwitchCaseExpr).matchesAll() } + + private newtype TLabel = + TLblGoto(string label) { any(GotoLabelStmt goto).getLabel() = label } or + TLblSwitchCase(string value) { any(GotoCaseStmt goto).getLabel() = value } or + TLblSwitchDefault() + + class Label extends TLabel { + string toString() { + this = TLblGoto(result) + or + this = TLblSwitchCase(result) + or + this = TLblSwitchDefault() and result = "default" } + } + + predicate hasLabel(Ast::AstNode n, Label l) { + l = TLblGoto(n.(GotoLabelStmt).getLabel()) + or + l = TLblSwitchCase(n.(GotoCaseStmt).getLabel()) + or + l = TLblSwitchDefault() and n instanceof GotoDefaultStmt + or + l = TLblGoto(n.(LabelStmt).getLabel()) + } + + predicate inConditionalContext(Ast::AstNode n, ConditionKind kind) { + kind.isNullness() and + exists(QualifiableExpr qe | n = qe.getQualifier() and qe.isConditional()) + } - class Split = Splitting::Split; + predicate postOrInOrder(Ast::AstNode n) { n instanceof YieldBreakStmt or n instanceof Call } + + predicate beginAbruptCompletion( + Ast::AstNode ast, PreControlFlowNode n, AbruptCompletion c, boolean always + ) { + // `yield break` behaves like a return statement + ast instanceof YieldBreakStmt and + n.isIn(ast) and + c.asSimpleAbruptCompletion() instanceof ReturnSuccessor and + always = true + or + Completion::mayThrowException(ast) and + n.isIn(ast) and + c.asSimpleAbruptCompletion() instanceof ExceptionSuccessor and + always = false + or + ast instanceof NonReturning::NonReturningCall and + n.isIn(ast) and + c.asSimpleAbruptCompletion() instanceof ExceptionSuccessor and + always = true } - class BasicBlock = BBs::BasicBlock; + predicate endAbruptCompletion(Ast::AstNode ast, PreControlFlowNode n, AbruptCompletion c) { + exists(SwitchStmt switch, Label l, Ast::Case case | + ast.(Stmt).getParent() = switch and + c.getSuccessorType() instanceof GotoSuccessor and + c.hasLabel(l) and + n.isAfterValue(case, any(MatchingSuccessor t | t.getValue() = true)) + | + exists(string value, ConstCase cc | + l = TLblSwitchCase(value) and + switch.getAConstCase() = cc and + cc.getLabel() = value and + cc = case + ) + or + l = TLblSwitchDefault() and switch.getDefaultCase() = case + ) + } + + pragma[noinline] + private MethodCall getObjectInitializerCall(Constructor ctor, CompilationExt comp) { + result = ctor.getObjectInitializerCall() and + comp = getCompilation(result.getFile()) + } - /** Provides different types of basic blocks. */ - module BasicBlocks { - class EntryBlock = BBs::EntryBasicBlock; + pragma[noinline] + private ConstructorInitializer getInitializer(Constructor ctor, CompilationExt comp) { + result = ctor.getInitializer() and + comp = getCompilation(result.getFile()) + } + + pragma[noinline] + private Ast::AstNode getBody(Constructor ctor, CompilationExt comp) { + result = ctor.getBody() and + comp = getCompilation(result.getFile()) + } + + predicate step(PreControlFlowNode n1, PreControlFlowNode n2) { + exists(Constructor ctor | + n1.(EntryNodeImpl).getEnclosingCallable() = ctor and + if Initializers::staticMemberInitializer(ctor, _) + then n2.isBefore(Initializers::initializedStaticMemberOrder(ctor, 0)) + else + if exists(ctor.getObjectInitializerCall()) + then n2.isBefore(ctor.getObjectInitializerCall()) + else + if exists(ctor.getInitializer()) + then n2.isBefore(ctor.getInitializer()) + else n2.isBefore(ctor.getBody()) + or + exists(int i | n1.isAfter(Initializers::initializedStaticMemberOrder(ctor, i)) | + n2.isBefore(Initializers::initializedStaticMemberOrder(ctor, i + 1)) + or + not exists(Initializers::initializedStaticMemberOrder(ctor, i + 1)) and + n2.isBefore(ctor.getBody()) + ) + or + exists(CompilationExt comp | + n1.isAfter(getObjectInitializerCall(ctor, comp)) and + if exists(getInitializer(ctor, comp)) + then n2.isBefore(getInitializer(ctor, comp)) + else + // This is only relevant in the context of compilation errors, since + // normally the existence of an object initializer call implies the + // existence of an initializer. + if exists(getBody(ctor, comp)) + then n2.isBefore(getBody(ctor, comp)) + else n2.(NormalExitNodeImpl).getEnclosingCallable() = ctor + or + n1.isAfter(getInitializer(ctor, comp)) and + if exists(getBody(ctor, comp)) + then n2.isBefore(getBody(ctor, comp)) + else n2.(NormalExitNodeImpl).getEnclosingCallable() = ctor + ) + or + n1.isAfter(ctor.getBody()) and + n2.(NormalExitNodeImpl).getEnclosingCallable() = ctor + ) + or + exists(ObjectInitMethod obinit | + n1.(EntryNodeImpl).getEnclosingCallable() = obinit and + n2.isBefore(Initializers::initializedInstanceMemberOrder(obinit, _, 0)) + or + exists(CompilationExt comp, int i | + // Flow from one member initializer to the next + n1.isAfter(Initializers::initializedInstanceMemberOrder(obinit, comp, i)) and + n2.isBefore(Initializers::initializedInstanceMemberOrder(obinit, comp, i + 1)) + ) + or + n1.isAfter(Initializers::lastInitializer(obinit, _)) and + n2.(NormalExitNodeImpl).getEnclosingCallable() = obinit + ) + or + exists(QualifiableExpr qe | qe.isConditional() | + n1.isBefore(qe) and n2.isBefore(qe.getQualifier()) + or + exists(NullnessSuccessor t | n1.isAfterValue(qe.getQualifier(), t) | + if t.isNull() + then ( + // if `q` is null in `q?.f = x` then the assignment is skipped. This + // holds for both regular, compound, and null-coalescing assignments. + // On the other hand, the CFG definition for the assignment can treat + // the LHS the same regardless of whether it's a conditionally + // qualified access or not, as it just connects to the "before" and + // "after" nodes of the LHS, and the "after" node is skipped in this + // case. + exists(AssignableDefinition def | + def.getTargetAccess() = qe and n2.isAfterValue(def.getExpr(), t) + ) + or + not qe instanceof AssignableWrite and + n2.isAfterValue(qe, t) + ) else ( + n2.isBefore(Ast::getChild(qe, 1)) + or + n2.isIn(qe) and not exists(Ast::getChild(qe, 1)) + ) + ) + or + exists(int i | i >= 1 and n1.isAfter(Ast::getChild(qe, i)) | + n2.isBefore(Ast::getChild(qe, i + 1)) + or + not exists(Ast::getChild(qe, i + 1)) and n2.isIn(qe) + ) + or + n1.isIn(qe) and n2.isAfter(qe) and not beginAbruptCompletion(qe, n1, _, true) + ) + or + exists(ObjectCreation oc | + n1.isBefore(oc) and n2.isBefore(oc.getArgument(0)) + or + n1.isBefore(oc) and n2.isIn(oc) and not exists(oc.getAnArgument()) + or + exists(int i | n1.isAfter(oc.getArgument(i)) | + n2.isBefore(oc.getArgument(i + 1)) + or + not exists(oc.getArgument(i + 1)) and n2.isIn(oc) + ) + or + n1.isIn(oc) and n2.isBefore(oc.getInitializer()) + or + n1.isIn(oc) and n2.isAfter(oc) and not exists(oc.getInitializer()) + or + n1.isAfter(oc.getInitializer()) and n2.isAfter(oc) + ) + } +} + +/** Provides different types of control flow nodes. */ +module ControlFlowNodes { + /** + * A node for a control flow element, that is, an expression or a statement. + * + * Each control flow element maps to zero or one `ElementNode`s: zero when + * the element is in unreachable (dead) code, and otherwise one. + */ + class ElementNode extends ControlFlowNode { + ElementNode() { exists(this.asExpr()) or exists(this.asStmt()) } + } - class AnnotatedExitBlock = BBs::AnnotatedExitBasicBlock; + /** A control-flow node for an expression. */ + class ExprNode extends ElementNode { + Expr e; - class ExitBlock = BBs::ExitBasicBlock; + ExprNode() { e = this.asExpr() } - class JoinBlock = BBs::JoinBlock; + /** Gets the expression that this control-flow node belongs to. */ + Expr getExpr() { result = e } - class JoinBlockPredecessor = BBs::JoinBlockPredecessor; + /** Gets the value of this expression node, if any. */ + string getValue() { result = e.getValue() } - class ConditionBlock = BBs::ConditionBlock; + /** Gets the type of this expression node. */ + Type getType() { result = e.getType() } } } diff --git a/csharp/ql/lib/semmle/code/csharp/controlflow/ControlFlowReachability.qll b/csharp/ql/lib/semmle/code/csharp/controlflow/ControlFlowReachability.qll index aafe14402c7f..ecacbf2cc4d6 100644 --- a/csharp/ql/lib/semmle/code/csharp/controlflow/ControlFlowReachability.qll +++ b/csharp/ql/lib/semmle/code/csharp/controlflow/ControlFlowReachability.qll @@ -8,12 +8,10 @@ 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 -{ +private module ControlFlowInput implements InputSig { private import csharp as CS - AstNode getEnclosingAstNode(ControlFlow::Node node) { + AstNode getEnclosingAstNode(ControlFlowNode node) { node.getAstNode() = result or not exists(node.getAstNode()) and result = node.getEnclosingCallable() diff --git a/csharp/ql/lib/semmle/code/csharp/controlflow/Guards.qll b/csharp/ql/lib/semmle/code/csharp/controlflow/Guards.qll index 40ec3722edd2..8575a81b08d6 100644 --- a/csharp/ql/lib/semmle/code/csharp/controlflow/Guards.qll +++ b/csharp/ql/lib/semmle/code/csharp/controlflow/Guards.qll @@ -15,12 +15,10 @@ 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 -{ +private module GuardsInput implements SharedGuards::InputSig { private import csharp as CS - class NormalExitNode = ControlFlow::Nodes::NormalExitNode; + class NormalExitNode = ControlFlow::NormalExitNode; class AstNode = ControlFlowElement; @@ -96,21 +94,14 @@ private module GuardsInput implements 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()) + bb1.getASuccessor(any(MatchingSuccessor s | s.getValue() = true)) = bb2 and + bb1.getLastNode() = AstNode.super.getControlFlowNode() } predicate nonMatchEdge(BasicBlock bb1, BasicBlock bb2) { - exists(MatchingCompletion c | this.hasEdge(bb1, bb2, c) and c.isNonMatch()) + bb1.getASuccessor(any(MatchingSuccessor s | s.getValue() = false)) = bb2 and + bb1.getLastNode() = AstNode.super.getControlFlowNode() } } @@ -322,7 +313,7 @@ class Guard extends Guards::Guard { * In case `cfn` or `sub` access an SSA variable in their left-most qualifier, then * so must the other (accessing the same SSA variable). */ - predicate controlsNode(ControlFlow::Nodes::ElementNode cfn, AccessOrCallExpr sub, GuardValue v) { + predicate controlsNode(ControlFlowNodes::ElementNode cfn, AccessOrCallExpr sub, GuardValue v) { isGuardedByNode(cfn, this, sub, v) } @@ -332,7 +323,7 @@ class Guard extends Guards::Guard { * Note: This predicate is inlined. */ pragma[inline] - predicate controlsNode(ControlFlow::Nodes::ElementNode cfn, GuardValue v) { + predicate controlsNode(ControlFlowNodes::ElementNode cfn, GuardValue v) { guardControls(this, cfn.getBasicBlock(), v) } @@ -450,7 +441,8 @@ class DereferenceableExpr extends Expr { predicate guardSuggestsMaybeNull(Guards::Guard guard) { not nonNullValueImplied(this) and ( - exists(NullnessCompletion c | c.isValidFor(this) and c.isNull() and guard = this) + exists(guard.getControlFlowNode().getASuccessor(any(NullnessSuccessor n | n.isNull()))) and + guard = this or LogicInput::additionalNullCheck(guard, _, this, true) or @@ -605,7 +597,7 @@ class AccessOrCallExpr extends Expr { * An expression can have more than one SSA qualifier in the presence * of control flow splitting. */ - Ssa::Definition getAnSsaQualifier(ControlFlow::Node cfn) { result = getAnSsaQualifier(this, cfn) } + Ssa::Definition getAnSsaQualifier(ControlFlowNode cfn) { result = getAnSsaQualifier(this, cfn) } } private Declaration getDeclarationTarget(Expr e) { @@ -613,14 +605,14 @@ private Declaration getDeclarationTarget(Expr e) { result = e.(Call).getTarget() } -private Ssa::Definition getAnSsaQualifier(Expr e, ControlFlow::Node cfn) { +private Ssa::Definition getAnSsaQualifier(Expr e, ControlFlowNode cfn) { e = getATrackedAccess(result, cfn) or not e = getATrackedAccess(_, _) and result = getAnSsaQualifier(e.(QualifiableExpr).getQualifier(), cfn) } -private AssignableAccess getATrackedAccess(Ssa::Definition def, ControlFlow::Node cfn) { +private AssignableAccess getATrackedAccess(Ssa::Definition def, ControlFlowNode cfn) { result = def.getAReadAtNode(cfn) or result = def.(Ssa::ExplicitDefinition).getADefinition().getTargetAccess() and @@ -729,7 +721,7 @@ class GuardedExpr extends AccessOrCallExpr { * In the example above, the node for `x.ToString()` is null-guarded in the * split `b == true`, but not in the split `b == false`. */ -class GuardedControlFlowNode extends ControlFlow::Nodes::ElementNode { +class GuardedControlFlowNode extends ControlFlowNodes::ElementNode { private Guard g; private AccessOrCallExpr sub0; private GuardValue v0; @@ -785,7 +777,7 @@ class GuardedDataFlowNode extends DataFlow::ExprNode { private GuardValue v0; GuardedDataFlowNode() { - exists(ControlFlow::Nodes::ElementNode cfn | exists(this.getExprAtNode(cfn)) | + exists(ControlFlowNodes::ElementNode cfn | exists(this.getExprAtNode(cfn)) | g.controlsNode(cfn, sub0, v0) ) } @@ -1114,7 +1106,7 @@ module Internal { pragma[nomagic] private predicate nodeIsGuardedBySameSubExpr0( - ControlFlow::Node guardedCfn, BasicBlock guardedBB, AccessOrCallExpr guarded, Guard g, + ControlFlowNode guardedCfn, BasicBlock guardedBB, AccessOrCallExpr guarded, Guard g, AccessOrCallExpr sub, GuardValue v ) { Stages::GuardsStage::forceCachingInSameStage() and @@ -1127,7 +1119,7 @@ module Internal { pragma[nomagic] private predicate nodeIsGuardedBySameSubExpr( - ControlFlow::Node guardedCfn, BasicBlock guardedBB, AccessOrCallExpr guarded, Guard g, + ControlFlowNode guardedCfn, BasicBlock guardedBB, AccessOrCallExpr guarded, Guard g, AccessOrCallExpr sub, GuardValue v ) { nodeIsGuardedBySameSubExpr0(guardedCfn, guardedBB, guarded, g, sub, v) and @@ -1136,8 +1128,8 @@ module Internal { pragma[nomagic] private predicate nodeIsGuardedBySameSubExprSsaDef0( - ControlFlow::Node cfn, BasicBlock guardedBB, AccessOrCallExpr guarded, Guard g, - ControlFlow::Node subCfn, BasicBlock subCfnBB, AccessOrCallExpr sub, GuardValue v, + ControlFlowNode cfn, BasicBlock guardedBB, AccessOrCallExpr guarded, Guard g, + ControlFlowNode subCfn, BasicBlock subCfnBB, AccessOrCallExpr sub, GuardValue v, Ssa::Definition def ) { nodeIsGuardedBySameSubExpr(cfn, guardedBB, guarded, g, sub, v) and @@ -1147,7 +1139,7 @@ module Internal { pragma[nomagic] private predicate nodeIsGuardedBySameSubExprSsaDef( - ControlFlow::Node guardedCfn, AccessOrCallExpr guarded, Guard g, ControlFlow::Node subCfn, + ControlFlowNode guardedCfn, AccessOrCallExpr guarded, Guard g, ControlFlowNode subCfn, AccessOrCallExpr sub, GuardValue v, Ssa::Definition def ) { exists(BasicBlock guardedBB, BasicBlock subCfnBB | @@ -1161,7 +1153,7 @@ module Internal { private predicate isGuardedByExpr0( AccessOrCallExpr guarded, Guard g, AccessOrCallExpr sub, GuardValue v ) { - forex(ControlFlow::Node cfn | cfn = guarded.getAControlFlowNode() | + forex(ControlFlowNode cfn | cfn = guarded.getAControlFlowNode() | nodeIsGuardedBySameSubExpr(cfn, _, guarded, g, sub, v) ) } @@ -1169,7 +1161,7 @@ module Internal { cached predicate isGuardedByExpr(AccessOrCallExpr guarded, Guard g, AccessOrCallExpr sub, GuardValue v) { isGuardedByExpr0(guarded, g, sub, v) and - forall(ControlFlow::Node subCfn, Ssa::Definition def | + forall(ControlFlowNode subCfn, Ssa::Definition def | nodeIsGuardedBySameSubExprSsaDef(_, guarded, g, subCfn, sub, v, def) | def = guarded.getAnSsaQualifier(_) @@ -1178,17 +1170,14 @@ module Internal { cached predicate isGuardedByNode( - ControlFlow::Nodes::ElementNode guarded, Guard g, AccessOrCallExpr sub, GuardValue v + ControlFlowNodes::ElementNode guarded, Guard g, AccessOrCallExpr sub, GuardValue v ) { nodeIsGuardedBySameSubExpr(guarded, _, _, g, sub, v) and - forall(ControlFlow::Node subCfn, Ssa::Definition def | + forall(ControlFlowNode subCfn, Ssa::Definition def | nodeIsGuardedBySameSubExprSsaDef(guarded, _, g, subCfn, sub, v, def) | def = - guarded - .getAstNode() - .(AccessOrCallExpr) - .getAnSsaQualifier(guarded.getBasicBlock().getANode()) + guarded.asExpr().(AccessOrCallExpr).getAnSsaQualifier(guarded.getBasicBlock().getANode()) ) } } diff --git a/csharp/ql/lib/semmle/code/csharp/controlflow/internal/Completion.qll b/csharp/ql/lib/semmle/code/csharp/controlflow/internal/Completion.qll index ab8bb233e2cc..21f6d012ada3 100644 --- a/csharp/ql/lib/semmle/code/csharp/controlflow/internal/Completion.qll +++ b/csharp/ql/lib/semmle/code/csharp/controlflow/internal/Completion.qll @@ -23,283 +23,9 @@ import csharp private import semmle.code.csharp.commons.Assertions private import semmle.code.csharp.commons.Constants private import semmle.code.csharp.frameworks.System -private import ControlFlowGraphImpl private import NonReturning private import SuccessorType -private newtype TCompletion = - TSimpleCompletion() or - TBooleanCompletion(boolean b) { b = true or b = false } or - TNullnessCompletion(boolean isNull) { isNull = true or isNull = false } or - TMatchingCompletion(boolean isMatch) { isMatch = true or isMatch = false } or - TEmptinessCompletion(boolean isEmpty) { isEmpty = true or isEmpty = false } or - TReturnCompletion() or - TBreakCompletion() or - TContinueCompletion() or - TGotoCompletion(string label) { label = any(GotoStmt gs).getLabel() } or - TThrowCompletion(ExceptionClass ec) or - TExitCompletion() or - TNestedCompletion(Completion inner, Completion outer, int nestLevel) { - inner = TBreakCompletion() and - outer instanceof NonNestedNormalCompletion and - nestLevel = 0 - or - inner instanceof NormalCompletion and - nestedFinallyCompletion(outer, nestLevel) - } - -pragma[nomagic] -private int getAFinallyNestLevel() { result = any(Statements::TryStmtTree t).nestLevel() } - -pragma[nomagic] -private predicate nestedFinallyCompletion(Completion outer, int nestLevel) { - ( - outer = TReturnCompletion() - or - outer = TBreakCompletion() - or - outer = TContinueCompletion() - or - outer = TGotoCompletion(_) - or - outer = TThrowCompletion(_) - or - outer = TExitCompletion() - ) and - nestLevel = getAFinallyNestLevel() -} - -pragma[noinline] -private predicate completionIsValidForStmt(Stmt s, Completion c) { - s instanceof BreakStmt and - c = TBreakCompletion() - or - s instanceof ContinueStmt and - c = TContinueCompletion() - or - s instanceof GotoStmt and - c = TGotoCompletion(s.(GotoStmt).getLabel()) - or - s instanceof ReturnStmt and - c = TReturnCompletion() - or - s instanceof YieldBreakStmt and - // `yield break` behaves like a return statement - c = TReturnCompletion() - or - mustHaveEmptinessCompletion(s) and - c = TEmptinessCompletion(_) -} - -/** - * A completion of a statement or an expression. - */ -abstract class Completion extends TCompletion { - /** - * Holds if this completion is valid for control flow element `cfe`. - * - * If `cfe` is part of a `try` statement and `cfe` may throw an exception, this - * completion can be a throw completion. - * - * If `cfe` is used in a Boolean context, this completion is a Boolean completion, - * otherwise it is a normal non-Boolean completion. - */ - predicate isValidFor(ControlFlowElement cfe) { - this = cfe.(NonReturningCall).getACompletion() - or - this = TThrowCompletion(cfe.(TriedControlFlowElement).getAThrownException()) - or - cfe instanceof ThrowElement and - this = TThrowCompletion(cfe.(ThrowElement).getThrownExceptionType()) - or - this = assertionCompletion(cfe, _) - or - completionIsValidForStmt(cfe, this) - or - mustHaveBooleanCompletion(cfe) and - ( - exists(boolean value | isBooleanConstant(cfe, value) | this = TBooleanCompletion(value)) - or - not isBooleanConstant(cfe, _) and - this = TBooleanCompletion(_) - or - // Corner case: In `if (x ?? y) { ... }`, `x` must have both a `true` - // completion, a `false` completion, and a `null` completion (but not a - // non-`null` completion) - mustHaveNullnessCompletion(cfe) and - this = TNullnessCompletion(true) - ) - or - mustHaveNullnessCompletion(cfe) and - not mustHaveBooleanCompletion(cfe) and - ( - exists(boolean value | isNullnessConstant(cfe, value) | this = TNullnessCompletion(value)) - or - not isNullnessConstant(cfe, _) and - this = TNullnessCompletion(_) - ) - or - mustHaveMatchingCompletion(cfe) and - ( - exists(boolean value | isMatchingConstant(cfe, value) | this = TMatchingCompletion(value)) - or - not isMatchingConstant(cfe, _) and - this = TMatchingCompletion(_) - ) - or - not cfe instanceof NonReturningCall and - not cfe instanceof ThrowElement and - not cfe instanceof BreakStmt and - not cfe instanceof ContinueStmt and - not cfe instanceof GotoStmt and - not cfe instanceof ReturnStmt and - not cfe instanceof YieldBreakStmt and - not mustHaveBooleanCompletion(cfe) and - not mustHaveNullnessCompletion(cfe) and - not mustHaveMatchingCompletion(cfe) and - not mustHaveEmptinessCompletion(cfe) and - this = TSimpleCompletion() - } - - /** - * Holds if this completion will continue a loop when it is the completion - * of a loop body. - */ - predicate continuesLoop() { - this instanceof NormalCompletion or - this instanceof ContinueCompletion - } - - /** - * Gets the inner completion. This is either the inner completion, - * when the completion is nested, or the completion itself. - */ - Completion getInnerCompletion() { result = this } - - /** - * Gets the outer completion. This is either the outer completion, - * when the completion is nested, or the completion itself. - */ - Completion getOuterCompletion() { result = this } - - /** Gets a successor type that matches this completion. */ - abstract SuccessorType getAMatchingSuccessorType(); - - /** Gets a textual representation of this completion. */ - abstract string toString(); -} - -/** Holds if expression `e` has the Boolean constant value `value`. */ -private predicate isBooleanConstant(Expr e, boolean value) { - mustHaveBooleanCompletion(e) and - ( - e.getValue() = "true" and - value = true - or - e.getValue() = "false" and - value = false - or - isConstantComparison(e, value) - or - exists(Method m, Call c, Expr expr | - m = any(SystemStringClass s).getIsNullOrEmptyMethod() and - c.getTarget() = m and - e = c and - expr = c.getArgument(0) and - expr.hasValue() and - if expr.getValue().length() > 0 and not expr instanceof NullLiteral - then value = false - else value = true - ) - ) -} - -/** - * Holds if expression `e` is constantly `null` (`value = true`) or constantly - * non-`null` (`value = false`). - */ -private predicate isNullnessConstant(Expr e, boolean value) { - mustHaveNullnessCompletion(e) and - exists(Expr stripped | stripped = e.stripCasts() | - stripped.getType() = - any(ValueType t | - not t instanceof NullableType and - // Extractor bug: the type of `x?.Length` is reported as `int`, but it should - // be `int?` - not getQualifier*(stripped).(QualifiableExpr).isConditional() - ) and - value = false - or - stripped instanceof NullLiteral and - value = true - or - stripped.hasValue() and - not stripped instanceof NullLiteral and - value = false - ) -} - -private Expr getQualifier(QualifiableExpr e) { - // `e.getQualifier()` does not work for calls to extension methods - result = e.getChildExpr(-1) -} - -pragma[noinline] -private predicate typePatternMustHaveMatchingCompletion( - TypePatternExpr tpe, Type t, Type strippedType -) { - exists(Expr e, Expr stripped | mustHaveMatchingCompletion(e, tpe) | - stripped = e.stripCasts() and - t = tpe.getCheckedType() and - strippedType = stripped.getType() and - not t.containsTypeParameters() and - not strippedType.containsTypeParameters() - ) -} - -pragma[noinline] -private Type typePatternCommonSubTypeLeft(Type t) { - typePatternMustHaveMatchingCompletion(_, t, _) and - result.isImplicitlyConvertibleTo(t) and - not result instanceof DynamicType -} - -pragma[noinline] -private Type typePatternCommonSubTypeRight(Type strippedType) { - typePatternMustHaveMatchingCompletion(_, _, strippedType) and - result.isImplicitlyConvertibleTo(strippedType) and - not result instanceof DynamicType -} - -pragma[noinline] -private predicate typePatternCommonSubType(Type t, Type strippedType) { - typePatternCommonSubTypeLeft(t) = typePatternCommonSubTypeRight(strippedType) -} - -/** - * Holds if pattern expression `pe` constantly matches (`value = true`) or - * constantly non-matches (`value = false`). - */ -private predicate isMatchingConstant(PatternExpr pe, boolean value) { - exists(Expr e, string exprValue, string patternValue | - mustHaveMatchingCompletion(e, pe) and - exprValue = e.stripCasts().getValue() and - patternValue = pe.getValue() and - if exprValue = patternValue then value = true else value = false - ) - or - pe instanceof DiscardPatternExpr and - value = true - or - exists(Type t, Type strippedType | - not t instanceof UnknownType and - not strippedType instanceof UnknownType and - typePatternMustHaveMatchingCompletion(pe, t, strippedType) and - not typePatternCommonSubType(t, strippedType) and - value = false - ) -} - private class Overflowable extends UnaryOperation { Overflowable() { not this instanceof UnaryBitwiseOperation and @@ -307,6 +33,13 @@ private class Overflowable extends UnaryOperation { } } +/** A control flow element that may throw an exception. */ +predicate mayThrowException(ControlFlowElement cfe) { + exists(cfe.(TriedControlFlowElement).getAThrownException()) + or + cfe instanceof Assertion +} + /** A control flow element that is inside a `try` block. */ private class TriedControlFlowElement extends ControlFlowElement { TriedControlFlowElement() { @@ -389,508 +122,3 @@ pragma[nomagic] private predicate invalidCastCandidate(CastExpr ce) { ce.getExpr().getType() = getACastExprBaseType(ce) } - -/** Gets a valid completion when argument `i` fails in assertion `a`. */ -Completion assertionCompletion(Assertion a, int i) { - exists(AssertMethod am | am = a.getAssertMethod() | - if am.getAssertionFailure(i).isExit() - then result = TExitCompletion() - else - exists(Class c | - am.getAssertionFailure(i).isException(c) and - result = TThrowCompletion(c) - ) - ) -} - -/** - * Holds if a normal completion of `e` must be a Boolean completion. - */ -private predicate mustHaveBooleanCompletion(Expr e) { - inBooleanContext(e) and - not e instanceof NonReturningCall -} - -/** - * Holds if `e` is used in a Boolean context. That is, whether the value - * that `e` evaluates to determines a true/false branch successor. - */ -private predicate inBooleanContext(Expr e) { - e = any(IfStmt is).getCondition() - or - e = any(LoopStmt ls).getCondition() - or - e = any(Case c).getCondition() - or - e = any(SpecificCatchClause scc).getFilterClause() - or - e = any(LogicalNotExpr lne | inBooleanContext(lne)).getAnOperand() - or - exists(LogicalAndExpr lae | - lae.getLeftOperand() = e - or - inBooleanContext(lae) and - lae.getRightOperand() = e - ) - or - exists(LogicalOrExpr lae | - lae.getLeftOperand() = e - or - inBooleanContext(lae) and - lae.getRightOperand() = e - ) - or - exists(ConditionalExpr ce | - ce.getCondition() = e - or - inBooleanContext(ce) and - e in [ce.getThen(), ce.getElse()] - ) - or - e = any(NullCoalescingExpr nce | inBooleanContext(nce)).getAnOperand() - or - e = any(SwitchExpr se | inBooleanContext(se)).getACase() - or - e = any(SwitchCaseExpr sce | inBooleanContext(sce)).getBody() -} - -/** - * Holds if a normal completion of `e` must be a nullness completion. - */ -private predicate mustHaveNullnessCompletion(Expr e) { - inNullnessContext(e) and - not e instanceof NonReturningCall -} - -/** - * Holds if `e` is used in a nullness context. That is, whether the value - * that `e` evaluates to determines a `null`/non-`null` branch successor. - */ -private predicate inNullnessContext(Expr e) { - e = any(NullCoalescingExpr nce).getLeftOperand() - or - exists(QualifiableExpr qe | qe.isConditional() | e = qe.getChildExpr(-1)) - or - exists(ConditionalExpr ce | inNullnessContext(ce) | (e = ce.getThen() or e = ce.getElse())) - or - exists(NullCoalescingExpr nce | inNullnessContext(nce) | e = nce.getRightOperand()) - or - e = any(SwitchExpr se | inNullnessContext(se)).getACase() - or - e = any(SwitchCaseExpr sce | inNullnessContext(sce)).getBody() -} - -/** - * Holds if `pe` is the pattern inside case `c`, belonging to `switch` `s`, that - * has the matching completion. - */ -predicate switchMatching(Switch s, Case c, PatternExpr pe) { - s.getACase() = c and - pe = c.getPattern() -} - -/** - * Holds if a normal completion of `cfe` must be a matching completion. Thats is, - * whether `cfe` determines a match in a `switch/if` statement or `catch` clause. - */ -private predicate mustHaveMatchingCompletion(ControlFlowElement cfe) { - switchMatching(_, _, cfe) - or - cfe instanceof SpecificCatchClause - or - cfe = any(IsExpr ie | inBooleanContext(ie)).getPattern() - or - cfe = any(RecursivePatternExpr rpe).getAChildExpr() - or - cfe = any(PositionalPatternExpr ppe).getPattern(_) - or - cfe = any(PropertyPatternExpr ppe).getPattern(_) - or - cfe = any(UnaryPatternExpr upe | mustHaveMatchingCompletion(upe)).getPattern() - or - cfe = any(BinaryPatternExpr bpe).getAnOperand() -} - -/** - * Holds if `pe` must have a matching completion, and `e` is the expression - * that is being matched. - */ -private predicate mustHaveMatchingCompletion(Expr e, PatternExpr pe) { - exists(Switch s | - switchMatching(s, _, pe) and - e = s.getExpr() - ) - or - e = any(IsExpr ie | pe = ie.getPattern()).getExpr() and - mustHaveMatchingCompletion(pe) - or - exists(PatternExpr mid | mustHaveMatchingCompletion(e, mid) | - pe = mid.(UnaryPatternExpr).getPattern() - or - pe = mid.(RecursivePatternExpr).getAChildExpr() - or - pe = mid.(BinaryPatternExpr).getAnOperand() - ) -} - -/** - * Holds if `cfe` is the element inside foreach statement `fs` that has the emptiness - * completion. - */ -predicate foreachEmptiness(ForeachStmt fs, ControlFlowElement cfe) { - cfe = fs // use `foreach` statement itself to represent the emptiness test -} - -/** - * Holds if a normal completion of `cfe` must be an emptiness completion. Thats is, - * whether `cfe` determines whether to execute the body of a `foreach` statement. - */ -private predicate mustHaveEmptinessCompletion(ControlFlowElement cfe) { foreachEmptiness(_, cfe) } - -/** - * A completion that represents normal evaluation of a statement or an - * expression. - */ -abstract class NormalCompletion extends Completion { } - -abstract private class NonNestedNormalCompletion extends NormalCompletion { } - -/** A simple (normal) completion. */ -class SimpleCompletion extends NonNestedNormalCompletion, TSimpleCompletion { - override DirectSuccessor getAMatchingSuccessorType() { any() } - - override string toString() { result = "normal" } -} - -/** - * A completion that represents evaluation of an expression, whose value determines - * the successor. Either a Boolean completion (`BooleanCompletion`), a nullness - * completion (`NullnessCompletion`), a matching completion (`MatchingCompletion`), - * or an emptiness completion (`EmptinessCompletion`). - */ -abstract class ConditionalCompletion extends NonNestedNormalCompletion { - /** Gets the Boolean value of this completion. */ - abstract boolean getValue(); - - /** Gets the dual completion. */ - abstract ConditionalCompletion getDual(); -} - -/** - * A completion that represents evaluation of an expression - * with a Boolean value. - */ -class BooleanCompletion extends ConditionalCompletion { - private boolean value; - - BooleanCompletion() { this = TBooleanCompletion(value) } - - override boolean getValue() { result = value } - - override BooleanCompletion getDual() { result = TBooleanCompletion(value.booleanNot()) } - - override BooleanSuccessor getAMatchingSuccessorType() { result.getValue() = value } - - override string toString() { result = value.toString() } -} - -/** A Boolean `true` completion. */ -class TrueCompletion extends BooleanCompletion { - TrueCompletion() { this.getValue() = true } -} - -/** A Boolean `false` completion. */ -class FalseCompletion extends BooleanCompletion { - FalseCompletion() { this.getValue() = false } -} - -/** - * A completion that represents evaluation of an expression that is either - * `null` or non-`null`. - */ -class NullnessCompletion extends ConditionalCompletion, TNullnessCompletion { - private boolean value; - - NullnessCompletion() { this = TNullnessCompletion(value) } - - /** Holds if the last sub expression of this expression evaluates to `null`. */ - predicate isNull() { value = true } - - /** Holds if the last sub expression of this expression evaluates to a non-`null` value. */ - predicate isNonNull() { value = false } - - override boolean getValue() { result = value } - - override NullnessCompletion getDual() { result = TNullnessCompletion(value.booleanNot()) } - - override NullnessSuccessor getAMatchingSuccessorType() { result.getValue() = value } - - override string toString() { if this.isNull() then result = "null" else result = "non-null" } -} - -/** - * A completion that represents matching, for example a `case` statement in a - * `switch` statement. - */ -class MatchingCompletion extends ConditionalCompletion, TMatchingCompletion { - private boolean value; - - MatchingCompletion() { this = TMatchingCompletion(value) } - - /** Holds if there is a match. */ - predicate isMatch() { value = true } - - /** Holds if there is not a match. */ - predicate isNonMatch() { value = false } - - override boolean getValue() { result = value } - - override MatchingCompletion getDual() { result = TMatchingCompletion(value.booleanNot()) } - - override MatchingSuccessor getAMatchingSuccessorType() { result.getValue() = value } - - override string toString() { if this.isMatch() then result = "match" else result = "no-match" } -} - -/** - * A completion that represents evaluation of an emptiness test, for example - * a test in a `foreach` statement. - */ -class EmptinessCompletion extends ConditionalCompletion, TEmptinessCompletion { - private boolean value; - - EmptinessCompletion() { this = TEmptinessCompletion(value) } - - /** Holds if the emptiness test evaluates to `true`. */ - predicate isEmpty() { value = true } - - override boolean getValue() { result = value } - - override EmptinessCompletion getDual() { result = TEmptinessCompletion(value.booleanNot()) } - - override EmptinessSuccessor getAMatchingSuccessorType() { result.getValue() = value } - - override string toString() { if this.isEmpty() then result = "empty" else result = "non-empty" } -} - -/** - * A nested completion. For example, in - * - * ```csharp - * void M(bool b1, bool b2) - * { - * try - * { - * if (b1) - * throw new Exception(); - * } - * finally - * { - * if (b2) - * System.Console.WriteLine("M called"); - * } - * } - * ``` - * - * `b2` has an outer throw completion (inherited from `throw new Exception`) - * and an inner `false` completion. `b2` also has a (normal) `true` completion. - */ -class NestedCompletion extends Completion, TNestedCompletion { - Completion inner; - Completion outer; - int nestLevel; - - NestedCompletion() { this = TNestedCompletion(inner, outer, nestLevel) } - - /** Gets a completion that is compatible with the inner completion. */ - Completion getAnInnerCompatibleCompletion() { - result.getOuterCompletion() = this.getInnerCompletion() - } - - /** Gets the level of this nested completion. */ - int getNestLevel() { result = nestLevel } - - override Completion getInnerCompletion() { result = inner } - - override Completion getOuterCompletion() { result = outer } - - override SuccessorType getAMatchingSuccessorType() { none() } - - override string toString() { result = outer + " [" + inner + "] (" + nestLevel + ")" } -} - -/** - * A nested completion for a loop that exists with a `break`. - * - * This completion is added for technical reasons only: when a loop - * body can complete with a break completion, the loop itself completes - * normally. However, if we choose `TSimpleCompletion` as the completion - * of the loop, we lose the information that the last element actually - * completed with a break, meaning that the control flow edge out of the - * breaking node cannot be marked with a `break` label. - * - * Example: - * - * ```csharp - * while (...) { - * ... - * break; - * } - * return; - * ``` - * - * The `break` on line 3 completes with a `TBreakCompletion`, therefore - * the `while` loop can complete with a `NestedBreakCompletion`, so we - * get an edge `break --break--> return`. (If we instead used a - * `TSimpleCompletion`, we would get a less precise edge - * `break --normal--> return`.) - */ -class NestedBreakCompletion extends NormalCompletion, NestedCompletion { - NestedBreakCompletion() { - inner = TBreakCompletion() and - outer instanceof NonNestedNormalCompletion - } - - override BreakCompletion getInnerCompletion() { result = inner } - - override NonNestedNormalCompletion getOuterCompletion() { result = outer } - - override Completion getAnInnerCompatibleCompletion() { - result = inner and - outer = TSimpleCompletion() - or - result = TNestedCompletion(outer, inner, _) - } - - override SuccessorType getAMatchingSuccessorType() { - outer instanceof SimpleCompletion and - result instanceof BreakSuccessor - or - result = outer.(ConditionalCompletion).getAMatchingSuccessorType() - } -} - -/** - * A completion that represents evaluation of a statement or an - * expression resulting in a return from a callable. - */ -class ReturnCompletion extends Completion { - ReturnCompletion() { - this = TReturnCompletion() or - this = TNestedCompletion(_, TReturnCompletion(), _) - } - - override ReturnSuccessor getAMatchingSuccessorType() { any() } - - override string toString() { - // `NestedCompletion` defines `toString()` for the other case - this = TReturnCompletion() and result = "return" - } -} - -/** - * A completion that represents evaluation of a statement or an - * expression resulting in a break (in a loop or in a `switch` - * statement). - */ -class BreakCompletion extends Completion { - BreakCompletion() { - this = TBreakCompletion() or - this = TNestedCompletion(_, TBreakCompletion(), _) - } - - override BreakSuccessor getAMatchingSuccessorType() { any() } - - override string toString() { - // `NestedCompletion` defines `toString()` for the other case - this = TBreakCompletion() and result = "break" - } -} - -/** - * A completion that represents evaluation of a statement or an - * expression resulting in a loop continuation (a `continue` - * statement). - */ -class ContinueCompletion extends Completion { - ContinueCompletion() { - this = TContinueCompletion() or - this = TNestedCompletion(_, TContinueCompletion(), _) - } - - override ContinueSuccessor getAMatchingSuccessorType() { any() } - - override string toString() { - // `NestedCompletion` defines `toString()` for the other case - this = TContinueCompletion() and result = "continue" - } -} - -/** - * A completion that represents evaluation of a statement or an - * expression resulting in a `goto` jump. - */ -class GotoCompletion extends Completion { - private string label; - - GotoCompletion() { - this = TGotoCompletion(label) or - this = TNestedCompletion(_, TGotoCompletion(label), _) - } - - /** Gets the label of the `goto` completion. */ - string getLabel() { result = label } - - override GotoSuccessor getAMatchingSuccessorType() { any() } - - override string toString() { - // `NestedCompletion` defines `toString()` for the other case - this = TGotoCompletion(label) and result = "goto(" + label + ")" - } -} - -/** - * A completion that represents evaluation of a statement or an - * expression resulting in a thrown exception. - */ -class ThrowCompletion extends Completion { - private ExceptionClass ec; - - ThrowCompletion() { - this = TThrowCompletion(ec) or - this = TNestedCompletion(_, TThrowCompletion(ec), _) - } - - /** Gets the type of the exception being thrown. */ - ExceptionClass getExceptionClass() { result = ec } - - override ExceptionSuccessor getAMatchingSuccessorType() { any() } - - override string toString() { - // `NestedCompletion` defines `toString()` for the other case - this = TThrowCompletion(ec) and result = "throw(" + ec + ")" - } -} - -/** - * A completion that represents evaluation of a statement or an - * expression resulting in a program exit, for example - * `System.Environment.Exit(0)`. - * - * An exit completion is different from a `return` completion; the former - * exits the whole application, and exists inside `try` statements skip - * `finally` blocks. - */ -class ExitCompletion extends Completion { - ExitCompletion() { - this = TExitCompletion() or - this = TNestedCompletion(_, TExitCompletion(), _) - } - - override ExitSuccessor getAMatchingSuccessorType() { any() } - - override string toString() { - // `NestedCompletion` defines `toString()` for the other case - this = TExitCompletion() and result = "exit" - } -} diff --git a/csharp/ql/lib/semmle/code/csharp/controlflow/internal/ControlFlowGraphImpl.qll b/csharp/ql/lib/semmle/code/csharp/controlflow/internal/ControlFlowGraphImpl.qll deleted file mode 100644 index 0bdf1f795db2..000000000000 --- a/csharp/ql/lib/semmle/code/csharp/controlflow/internal/ControlFlowGraphImpl.qll +++ /dev/null @@ -1,1866 +0,0 @@ -/** - * Provides an implementation for constructing control-flow graphs (CFGs) from - * abstract syntax trees (ASTs), using the shared library from `codeql.controlflow.Cfg`. - */ - -import csharp -private import codeql.controlflow.Cfg as CfgShared -private import Completion -private import semmle.code.csharp.ExprOrStmtParent -private import semmle.code.csharp.commons.Compilation - -private module Initializers { - /** - * Gets the `i`th member initializer expression for object initializer method `obinit` - * in compilation `comp`. - */ - AssignExpr initializedInstanceMemberOrder(ObjectInitMethod obinit, CompilationExt comp, int i) { - obinit.initializes(result) and - result = - rank[i + 1](AssignExpr ae0, Location l | - obinit.initializes(ae0) and - l = ae0.getLocation() and - getCompilation(l.getFile()) = comp - | - ae0 order by l.getStartLine(), l.getStartColumn(), l.getFile().getAbsolutePath() - ) - } - - /** - * Gets the last member initializer expression for object initializer method `obinit` - * in compilation `comp`. - */ - AssignExpr lastInitializer(ObjectInitMethod obinit, CompilationExt comp) { - exists(int i | - result = initializedInstanceMemberOrder(obinit, comp, i) and - not exists(initializedInstanceMemberOrder(obinit, comp, i + 1)) - ) - } -} - -/** An element that defines a new CFG scope. */ -class CfgScope extends Element, @top_level_exprorstmt_parent { - CfgScope() { - this.getFile().fromSource() and - ( - this = - any(Callable c | - c.(Constructor).hasInitializer() - or - c.(ObjectInitMethod).initializes(_) - or - c.hasBody() - ) - or - // For now, static initializer values have their own scope. Eventually, they - // should be treated like instance initializers. - this.(Assignable).(Modifiable).isStatic() and - expr_parent_top_level_adjusted2(_, _, this) - ) - } -} - -private class TAstNode = @callable or @control_flow_element; - -private Element getAChild(Element p) { - result = p.getAChild() or - result = p.(AssignOperation).getExpandedAssignment() -} - -pragma[nomagic] -private predicate astNode(Element e) { - e = any(@top_level_exprorstmt_parent p | not p instanceof Attribute) - or - exists(Element parent | - astNode(parent) and - e = getAChild(parent) - ) -} - -/** An AST node. */ -class AstNode extends Element, TAstNode { - AstNode() { astNode(this) } - - int getId() { idOf(this, result) } -} - -private predicate id(AstNode x, AstNode y) { x = y } - -private predicate idOf(AstNode x, int y) = equivalenceRelation(id/2)(x, y) - -private module CfgInput implements CfgShared::InputSig { - private import ControlFlowGraphImpl as Impl - private import Completion as Comp - private import SuccessorType as ST - private import semmle.code.csharp.Caching - - class AstNode = Impl::AstNode; - - class Completion = Comp::Completion; - - predicate completionIsNormal(Completion c) { c instanceof Comp::NormalCompletion } - - predicate completionIsSimple(Completion c) { c instanceof Comp::SimpleCompletion } - - predicate completionIsValidFor(Completion c, AstNode e) { c.isValidFor(e) } - - class CfgScope = Impl::CfgScope; - - CfgScope getCfgScope(AstNode n) { - Stages::ControlFlowStage::forceCachingInSameStage() and - result = n.(ControlFlowElement).getEnclosingCallable() - } - - predicate scopeFirst(CfgScope scope, AstNode first) { Impl::scopeFirst(scope, first) } - - predicate scopeLast(CfgScope scope, AstNode last, Completion c) { - Impl::scopeLast(scope, last, c) - } - - private class SuccessorType = ST::SuccessorType; - - SuccessorType getAMatchingSuccessorType(Completion c) { result = c.getAMatchingSuccessorType() } - - int idOfAstNode(AstNode node) { result = node.getId() } - - int idOfCfgScope(CfgScope node) { result = idOfAstNode(node) } -} - -private module CfgSplittingInput implements CfgShared::SplittingInputSig { - private import Splitting as S - - class SplitKindBase = S::TSplitKind; - - class Split = S::Split; -} - -private module ConditionalCompletionSplittingInput implements - CfgShared::ConditionalCompletionSplittingInputSig -{ - import Splitting::ConditionalCompletionSplitting::ConditionalCompletionSplittingInput -} - -import CfgShared::MakeWithSplitting - -/** - * A compilation. - * - * Unlike the standard `Compilation` class, this class also supports buildless - * extraction. - */ -newtype CompilationExt = - TCompilation(Compilation c) { not extractionIsStandalone() } or - TBuildless() { extractionIsStandalone() } - -/** Gets the compilation that source file `f` belongs to. */ -CompilationExt getCompilation(File f) { - exists(Compilation c | - f = c.getAFileCompiled() and - result = TCompilation(c) - ) - or - result = TBuildless() -} - -/** - * The `expr_parent_top_level_adjusted()` relation restricted to exclude relations - * between properties and their getters' expression bodies in properties such as - * `int P => 0`. - * - * This is in order to only associate the expression body with one CFG scope, namely - * the getter (and not the declaration itself). - */ -private predicate expr_parent_top_level_adjusted2( - Expr child, int i, @top_level_exprorstmt_parent parent -) { - expr_parent_top_level_adjusted(child, i, parent) and - not exists(Getter g | - g.getDeclaration() = parent and - i = 0 - ) -} - -/** Holds if `first` is first executed when entering `scope`. */ -predicate scopeFirst(CfgScope scope, AstNode first) { - scope = - any(Callable c | - if exists(c.(Constructor).getObjectInitializerCall()) - then first(c.(Constructor).getObjectInitializerCall(), first) - else - if exists(c.(Constructor).getInitializer()) - then first(c.(Constructor).getInitializer(), first) - else first(c.getBody(), first) - ) - or - first(Initializers::initializedInstanceMemberOrder(scope, _, 0), first) - or - expr_parent_top_level_adjusted2(any(Expr e | first(e, first)), _, scope) and - not scope instanceof Callable -} - -/** Holds if `scope` is exited when `last` finishes with completion `c`. */ -predicate scopeLast(CfgScope scope, AstNode last, Completion c) { - scope = - any(Callable callable | - last(callable.getBody(), last, c) and - not c instanceof GotoCompletion - or - last(callable.(Constructor).getInitializer(), last, c) and - not callable.hasBody() - or - // This is only relevant in the context of compilation errors, since - // normally the existence of an object initializer call implies the - // existence of an initializer. - last(callable.(Constructor).getObjectInitializerCall(), last, c) and - not callable.(Constructor).hasInitializer() and - not callable.hasBody() - ) - or - last(Initializers::lastInitializer(scope, _), last, c) - or - expr_parent_top_level_adjusted2(any(Expr e | last(e, last, c)), _, scope) and - not scope instanceof Callable -} - -private class ObjectInitTree extends ControlFlowTree instanceof ObjectInitMethod { - final override predicate propagatesAbnormal(AstNode child) { none() } - - final override predicate first(AstNode first) { none() } - - final override predicate last(AstNode last, Completion c) { none() } - - final override predicate succ(AstNode pred, AstNode succ, Completion c) { - exists(CompilationExt comp, int i | - // Flow from one member initializer to the next - last(Initializers::initializedInstanceMemberOrder(this, comp, i), pred, c) and - c instanceof NormalCompletion and - first(Initializers::initializedInstanceMemberOrder(this, comp, i + 1), succ) - ) - } -} - -private class ConstructorTree extends ControlFlowTree instanceof Constructor { - final override predicate propagatesAbnormal(AstNode child) { none() } - - final override predicate first(AstNode first) { none() } - - final override predicate last(AstNode last, Completion c) { none() } - - /** Gets the body of this constructor belonging to compilation `comp`. */ - pragma[noinline] - AstNode getBody(CompilationExt comp) { - result = super.getBody() and - comp = getCompilation(result.getFile()) - } - - pragma[noinline] - private MethodCall getObjectInitializerCall(CompilationExt comp) { - result = super.getObjectInitializerCall() and - comp = getCompilation(result.getFile()) - } - - pragma[noinline] - private ConstructorInitializer getInitializer(CompilationExt comp) { - result = super.getInitializer() and - comp = getCompilation(result.getFile()) - } - - final override predicate succ(AstNode pred, AstNode succ, Completion c) { - exists(CompilationExt comp | - last(this.getObjectInitializerCall(comp), pred, c) and - c instanceof NormalCompletion - | - first(this.getInitializer(comp), succ) - or - // This is only relevant in the context of compilation errors, since - // normally the existence of an object initializer call implies the - // existence of an initializer. - not exists(this.getInitializer(comp)) and - first(this.getBody(comp), succ) - ) - } -} - -cached -private module SwithStmtInternal { - // Reorders default to be last if needed - cached - CaseStmt getCase(SwitchStmt ss, int i) { - exists(int index, int rankIndex | - caseIndex(ss, result, index) and - rankIndex = i + 1 and - index = rank[rankIndex](int j, CaseStmt cs | caseIndex(ss, cs, j) | j) - ) - } - - /** Implicitly reorder case statements to put the default case last if needed. */ - private predicate caseIndex(SwitchStmt ss, CaseStmt case, int index) { - exists(int i | case = ss.getChildStmt(i) | - if case instanceof DefaultCase - then index = max(int j | exists(ss.getChildStmt(j))) + 1 - else index = i - ) - } - - /** - * Gets the `i`th statement in the body of this `switch` statement. - * - * Example: - * - * ```csharp - * switch (x) { - * case "abc": // i = 0 - * return 0; - * case int i when i > 0: // i = 1 - * return 1; - * case string s: // i = 2 - * Console.WriteLine(s); - * return 2; // i = 3 - * default: // i = 4 - * return 3; // i = 5 - * } - * ``` - * - * Note that each non-`default` case is a labeled statement, so the statement - * that follows is a child of the labeled statement, and not the `switch` block. - */ - cached - Stmt getStmt(SwitchStmt ss, int i) { - exists(int index, int rankIndex | - result = ss.getChildStmt(index) and - rankIndex = i + 1 and - index = - rank[rankIndex](int j, Stmt s | - // `getChild` includes both labeled statements and the targeted - // statements of labeled statement as separate children, but we - // only want the labeled statement - s = getLabeledStmt(ss, j) - | - j - ) - ) - } - - private Stmt getLabeledStmt(SwitchStmt ss, int i) { - result = ss.getChildStmt(i) and - not result = caseStmtGetBody(_) - } -} - -private ControlFlowElement caseGetBody(Case c) { - result = c.getBody() or result = caseStmtGetBody(c) -} - -private ControlFlowElement caseStmtGetBody(CaseStmt c) { - exists(int i, Stmt next | - c = c.getParent().getChild(i) and - next = c.getParent().getChild(i + 1) - | - result = next and - not result instanceof CaseStmt - or - result = caseStmtGetBody(next) - ) -} - -// Reorders default to be last if needed -private Case switchGetCase(Switch s, int i) { - result = s.(SwitchExpr).getCase(i) or result = SwithStmtInternal::getCase(s, i) -} - -abstract private class SwitchTree extends ControlFlowTree instanceof Switch { - override predicate propagatesAbnormal(AstNode child) { child = super.getExpr() } - - override predicate succ(AstNode pred, AstNode succ, Completion c) { - // Flow from last element of switch expression to first element of first case - last(super.getExpr(), pred, c) and - c instanceof NormalCompletion and - first(switchGetCase(this, 0), succ) - or - // Flow from last element of case pattern to next case - exists(Case case, int i | case = switchGetCase(this, i) | - last(case.getPattern(), pred, c) and - c.(MatchingCompletion).isNonMatch() and - first(switchGetCase(this, i + 1), succ) - ) - or - // Flow from last element of condition to next case - exists(Case case, int i | case = switchGetCase(this, i) | - last(case.getCondition(), pred, c) and - c instanceof FalseCompletion and - first(switchGetCase(this, i + 1), succ) - ) - } -} - -abstract private class CaseTree extends ControlFlowTree instanceof Case { - final override predicate propagatesAbnormal(AstNode child) { - child in [super.getPattern().(ControlFlowElement), super.getCondition(), caseGetBody(this)] - } - - override predicate succ(AstNode pred, AstNode succ, Completion c) { - last(super.getPattern(), pred, c) and - c.(MatchingCompletion).isMatch() and - ( - if exists(super.getCondition()) - then - // Flow from the last element of pattern to the condition - first(super.getCondition(), succ) - else - // Flow from last element of pattern to first element of body - first(caseGetBody(this), succ) - ) - or - // Flow from last element of condition to first element of body - last(super.getCondition(), pred, c) and - c instanceof TrueCompletion and - first(caseGetBody(this), succ) - } -} - -module Expressions { - /** An expression that should not be included in the control flow graph. */ - abstract private class NoNodeExpr extends Expr { } - - private class SimpleNoNodeExpr extends NoNodeExpr { - SimpleNoNodeExpr() { - this instanceof TypeAccess and - not this instanceof TypeAccessPatternExpr - } - } - - /** A write access that is not also a read access. */ - private class WriteAccess extends AssignableWrite { - WriteAccess() { - // `x++` is both a read and write access - not this instanceof AssignableRead - } - } - - private class WriteAccessNoNodeExpr extends WriteAccess, NoNodeExpr { - WriteAccessNoNodeExpr() { - // For example a write to a static field, `Foo.Bar = 0`. - forall(Expr e | e = this.getAChildExpr() | e instanceof NoNodeExpr) - } - } - - private AstNode getExprChild0(Expr e, int i) { - not e instanceof NameOfExpr and - not e instanceof QualifiableExpr and - not e instanceof Assignment and - not e instanceof AnonymousFunctionExpr and - result = e.getChild(i) - or - e = any(ExtensionMethodCall emc | result = emc.getArgument(i)) - or - e = - any(QualifiableExpr qe | - not qe instanceof ExtensionMethodCall and - result = qe.getChild(i) - ) - or - e = - any(Assignment a | - // The left-hand side of an assignment is evaluated before the right-hand side - i = 0 and result = a.getLValue() - or - i = 1 and result = a.getRValue() - ) - } - - private AstNode getExprChild(Expr e, int i) { - result = - rank[i + 1](AstNode cfe, int j | - cfe = getExprChild0(e, j) and - not cfe instanceof NoNodeExpr - | - cfe order by j - ) - } - - private AstNode getLastExprChild(Expr e) { - exists(int last | - result = getExprChild(e, last) and - not exists(getExprChild(e, last + 1)) - ) - } - - private class StandardExpr extends StandardPostOrderTree instanceof Expr { - StandardExpr() { - // The following expressions need special treatment - not this instanceof LogicalNotExpr and - not this instanceof LogicalAndExpr and - not this instanceof LogicalOrExpr and - not this instanceof NullCoalescingExpr and - not this instanceof ConditionalExpr and - not this instanceof AssignOperationWithExpandedAssignment and - not this instanceof ConditionallyQualifiedExpr and - not this instanceof ThrowExpr and - not this instanceof ObjectCreation and - not this instanceof ArrayCreation and - not this instanceof QualifiedWriteAccess and - not this instanceof QualifiedAccessorWrite and - not this instanceof NoNodeExpr and - not this instanceof SwitchExpr and - not this instanceof SwitchCaseExpr and - not this instanceof ConstructorInitializer and - not this instanceof NotPatternExpr and - not this instanceof OrPatternExpr and - not this instanceof AndPatternExpr and - not this instanceof RecursivePatternExpr and - not this instanceof PositionalPatternExpr and - not this instanceof PropertyPatternExpr - } - - final override AstNode getChildNode(int i) { result = getExprChild(this, i) } - } - - /** - * A qualified write access. - * - * The successor declaration in `QualifiedAccessorWrite` ensures that the access itself - * is evaluated after the qualifier and the indexer arguments (if any) - * and the right hand side of the assignment. - * - * When a qualified write access is used as an `out/ref` argument, the access itself is evaluated immediately. - */ - private class QualifiedWriteAccess extends ControlFlowTree instanceof WriteAccess, QualifiableExpr - { - QualifiedWriteAccess() { - ( - this.hasQualifier() - or - // Member initializers like - // ```csharp - // new Dictionary() { [0] = "Zero", [1] = "One", [2] = "Two" } - // ``` - // need special treatment, because the accesses `[0]`, `[1]`, and `[2]` - // have no qualifier. - this = any(MemberInitializer mi).getLValue() - ) and - not exists(AssignableDefinitions::OutRefDefinition def | def.getTargetAccess() = this) - } - - final override predicate propagatesAbnormal(AstNode child) { child = getExprChild(this, _) } - - final override predicate first(AstNode first) { first(getExprChild(this, 0), first) } - - final override predicate last(AstNode last, Completion c) { - // Skip the access in a qualified write access - last(getLastExprChild(this), last, c) - or - // Qualifier exits with a null completion - super.isConditional() and - last(super.getQualifier(), last, c) and - c.(NullnessCompletion).isNull() - } - - final override predicate succ(AstNode pred, AstNode succ, Completion c) { - exists(int i | - last(getExprChild(this, i), pred, c) and - c instanceof NormalCompletion and - (if i = 0 then not c.(NullnessCompletion).isNull() else any()) and - first(getExprChild(this, i + 1), succ) - ) - } - } - - /** - * An expression that writes via a qualifiable expression, for example `x.Prop = 0`, - * where `Prop` is a property. - * - * Accessor writes need special attention, because we need to model the fact - * that the accessor is called *after* the assigned value has been evaluated. - * In the example above, this means we want a CFG that looks like - * - * ```csharp - * x -> 0 -> set_Prop -> x.Prop = 0 - * ``` - * - * For consistency, control flow is implemented the same way for other qualified writes. - * For example, `x.Field = 0`, where `Field` is a field, we want a CFG that looks like - * - * ```csharp - * x -> 0 -> x.Field -> x.Field = 0 - * ``` - */ - private class QualifiedAccessorWrite extends PostOrderTree instanceof Expr { - AssignableDefinition def; - - QualifiedAccessorWrite() { - def.getExpr() = this and - def.getTargetAccess().(WriteAccess) instanceof QualifiableExpr and - not def instanceof AssignableDefinitions::OutRefDefinition and - not this instanceof AssignOperationWithExpandedAssignment - } - - /** - * Gets the `i`th accessor being called in this write. More than one call - * can happen in tuple assignments. - */ - QualifiableExpr getAccess(int i) { - result = - rank[i + 1](AssignableDefinitions::TupleAssignmentDefinition tdef | - tdef.getExpr() = this and - tdef.getTargetAccess() instanceof QualifiableExpr - | - tdef order by tdef.getEvaluationOrder() - ).getTargetAccess() - or - i = 0 and - result = def.getTargetAccess() and - not def instanceof AssignableDefinitions::TupleAssignmentDefinition - } - - final override predicate propagatesAbnormal(AstNode child) { - child = getExprChild(this, _) - or - child = this.getAccess(_) - } - - final override predicate last(AstNode last, Completion c) { - PostOrderTree.super.last(last, c) - or - last(getExprChild(this, 0), last, c) and c.(NullnessCompletion).isNull() - } - - final override predicate first(AstNode first) { first(getExprChild(this, 0), first) } - - final override predicate succ(AstNode pred, AstNode succ, Completion c) { - // Standard left-to-right evaluation - exists(int i | - last(getExprChild(this, i), pred, c) and - c instanceof NormalCompletion and - (if i = 0 then not c.(NullnessCompletion).isNull() else any()) and - first(getExprChild(this, i + 1), succ) - ) - or - // Flow from last element of last child to first accessor call - last(getLastExprChild(this), pred, c) and - succ = this.getAccess(0) and - c instanceof NormalCompletion - or - // Flow from one call to the next - exists(int i | pred = this.getAccess(i) | - succ = this.getAccess(i + 1) and - c.isValidFor(pred) and - c instanceof NormalCompletion - ) - or - // Post-order: flow from last call to element itself - exists(int last | last = max(int i | exists(this.getAccess(i))) | - pred = this.getAccess(last) and - succ = this and - c.isValidFor(pred) and - c instanceof NormalCompletion - ) - } - } - - private class LogicalNotExprTree extends PostOrderTree instanceof LogicalNotExpr { - private Expr operand; - - LogicalNotExprTree() { operand = this.getOperand() } - - final override predicate propagatesAbnormal(AstNode child) { child = operand } - - final override predicate first(AstNode first) { first(operand, first) } - - final override predicate succ(AstNode pred, AstNode succ, Completion c) { - succ = this and - last(operand, pred, c) and - c instanceof NormalCompletion - } - } - - private class LogicalAndExprTree extends PostOrderTree instanceof LogicalAndExpr { - final override predicate propagatesAbnormal(AstNode child) { - child in [super.getLeftOperand(), super.getRightOperand()] - } - - final override predicate first(AstNode first) { first(super.getLeftOperand(), first) } - - final override predicate succ(AstNode pred, AstNode succ, Completion c) { - // Flow from last element of left operand to first element of right operand - last(super.getLeftOperand(), pred, c) and - c instanceof TrueCompletion and - first(super.getRightOperand(), succ) - or - // Post-order: flow from last element of left operand to element itself - last(super.getLeftOperand(), pred, c) and - c instanceof FalseCompletion and - succ = this - or - // Post-order: flow from last element of right operand to element itself - last(super.getRightOperand(), pred, c) and - c instanceof NormalCompletion and - succ = this - } - } - - private class LogicalOrExprTree extends PostOrderTree instanceof LogicalOrExpr { - final override predicate propagatesAbnormal(AstNode child) { - child in [super.getLeftOperand(), super.getRightOperand()] - } - - final override predicate first(AstNode first) { first(super.getLeftOperand(), first) } - - final override predicate succ(AstNode pred, AstNode succ, Completion c) { - // Flow from last element of left operand to first element of right operand - last(super.getLeftOperand(), pred, c) and - c instanceof FalseCompletion and - first(super.getRightOperand(), succ) - or - // Post-order: flow from last element of left operand to element itself - last(super.getLeftOperand(), pred, c) and - c instanceof TrueCompletion and - succ = this - or - // Post-order: flow from last element of right operand to element itself - last(super.getRightOperand(), pred, c) and - c instanceof NormalCompletion and - succ = this - } - } - - private class NullCoalescingExprTree extends PostOrderTree instanceof NullCoalescingExpr { - final override predicate propagatesAbnormal(AstNode child) { - child in [super.getLeftOperand(), super.getRightOperand()] - } - - final override predicate first(AstNode first) { first(super.getLeftOperand(), first) } - - final override predicate succ(AstNode pred, AstNode succ, Completion c) { - // Flow from last element of left operand to first element of right operand - last(super.getLeftOperand(), pred, c) and - c.(NullnessCompletion).isNull() and - first(super.getRightOperand(), succ) - or - // Post-order: flow from last element of left operand to element itself - last(super.getLeftOperand(), pred, c) and - succ = this and - c instanceof NormalCompletion and - not c.(NullnessCompletion).isNull() - or - // Post-order: flow from last element of right operand to element itself - last(super.getRightOperand(), pred, c) and - c instanceof NormalCompletion and - succ = this - } - } - - private class ConditionalExprTree extends PostOrderTree instanceof ConditionalExpr { - final override predicate propagatesAbnormal(AstNode child) { - child in [super.getCondition(), super.getThen(), super.getElse()] - } - - final override predicate first(AstNode first) { first(super.getCondition(), first) } - - final override predicate succ(AstNode pred, AstNode succ, Completion c) { - // Flow from last element of condition to first element of then branch - last(super.getCondition(), pred, c) and - c instanceof TrueCompletion and - first(super.getThen(), succ) - or - // Flow from last element of condition to first element of else branch - last(super.getCondition(), pred, c) and - c instanceof FalseCompletion and - first(super.getElse(), succ) - or - // Post-order: flow from last element of a branch to element itself - last([super.getThen(), super.getElse()], pred, c) and - c instanceof NormalCompletion and - succ = this - } - } - - /** - * An assignment operation that has an expanded version. We use the expanded - * version in the control flow graph in order to get better data flow / taint - * tracking. - */ - private class AssignOperationWithExpandedAssignment extends ControlFlowTree instanceof AssignOperation - { - private Expr expanded; - - AssignOperationWithExpandedAssignment() { expanded = this.getExpandedAssignment() } - - final override predicate first(AstNode first) { first(expanded, first) } - - final override predicate last(AstNode last, Completion c) { last(expanded, last, c) } - - final override predicate propagatesAbnormal(AstNode child) { none() } - - final override predicate succ(AstNode pred, AstNode succ, Completion c) { none() } - } - - /** A conditionally qualified expression. */ - private class ConditionallyQualifiedExpr extends PostOrderTree instanceof QualifiableExpr { - private Expr qualifier; - - ConditionallyQualifiedExpr() { - this.isConditional() and qualifier = getExprChild(this, 0) and not this instanceof WriteAccess - } - - final override predicate propagatesAbnormal(AstNode child) { child = qualifier } - - final override predicate first(AstNode first) { first(qualifier, first) } - - pragma[nomagic] - private predicate lastQualifier(AstNode last, Completion c) { last(qualifier, last, c) } - - final override predicate last(AstNode last, Completion c) { - PostOrderTree.super.last(last, c) - or - // Qualifier exits with a `null` completion - this.lastQualifier(last, c) and - c.(NullnessCompletion).isNull() - } - - final override predicate succ(AstNode pred, AstNode succ, Completion c) { - exists(int i | - last(getExprChild(this, i), pred, c) and - c instanceof NormalCompletion and - if i = 0 then c.(NullnessCompletion).isNonNull() else any() - | - // Post-order: flow from last element of last child to element itself - i = max(int j | exists(getExprChild(this, j))) and - succ = this - or - // Standard left-to-right evaluation - first(getExprChild(this, i + 1), succ) - ) - } - } - - private class ThrowExprTree extends PostOrderTree instanceof ThrowExpr { - final override predicate propagatesAbnormal(AstNode child) { child = super.getExpr() } - - final override predicate first(AstNode first) { first(super.getExpr(), first) } - - final override predicate succ(AstNode pred, AstNode succ, Completion c) { - last(super.getExpr(), pred, c) and - c instanceof NormalCompletion and - succ = this - } - } - - private class ObjectCreationTree extends ControlFlowTree instanceof ObjectCreation { - private Expr getObjectCreationArgument(int i) { - i >= 0 and - if super.hasInitializer() - then result = getExprChild(this, i + 1) - else result = getExprChild(this, i) - } - - final override predicate propagatesAbnormal(AstNode child) { - child = this.getObjectCreationArgument(_) - } - - final override predicate first(AstNode first) { - first(this.getObjectCreationArgument(0), first) - or - not exists(this.getObjectCreationArgument(0)) and - first = this - } - - final override predicate last(AstNode last, Completion c) { - // Post-order: element itself (when no initializer) - last = this and - not super.hasInitializer() and - c.isValidFor(this) - or - // Last element of initializer - last(super.getInitializer(), last, c) - } - - final override predicate succ(AstNode pred, AstNode succ, Completion c) { - // Flow from last element of argument `i` to first element of argument `i+1` - exists(int i | last(this.getObjectCreationArgument(i), pred, c) | - first(this.getObjectCreationArgument(i + 1), succ) and - c instanceof NormalCompletion - ) - or - // Flow from last element of last argument to self - exists(int last | last = max(int i | exists(this.getObjectCreationArgument(i))) | - last(this.getObjectCreationArgument(last), pred, c) and - succ = this and - c instanceof NormalCompletion - ) - or - // Flow from self to first element of initializer - pred = this and - first(super.getInitializer(), succ) and - c instanceof SimpleCompletion - } - } - - private class ArrayCreationTree extends ControlFlowTree instanceof ArrayCreation { - final override predicate propagatesAbnormal(AstNode child) { - child = super.getALengthArgument() - } - - final override predicate first(AstNode first) { - // First element of first length argument - first(super.getLengthArgument(0), first) - or - // No length argument: element itself - not exists(super.getLengthArgument(0)) and - first = this - } - - final override predicate last(AstNode last, Completion c) { - // Post-order: element itself (when no initializer) - last = this and - not super.hasInitializer() and - c.isValidFor(this) - or - // Last element of initializer - last(super.getInitializer(), last, c) - } - - final override predicate succ(AstNode pred, AstNode succ, Completion c) { - // Flow from self to first element of initializer - pred = this and - first(super.getInitializer(), succ) and - c instanceof SimpleCompletion - or - exists(int i | - last(super.getLengthArgument(i), pred, c) and - c instanceof SimpleCompletion - | - // Flow from last length argument to self - i = max(int j | exists(super.getLengthArgument(j))) and - succ = this - or - // Flow from one length argument to the next - first(super.getLengthArgument(i + 1), succ) - ) - } - } - - private class SwitchExprTree extends PostOrderTree, SwitchTree instanceof SwitchExpr { - final override predicate propagatesAbnormal(AstNode child) { - SwitchTree.super.propagatesAbnormal(child) - or - child = super.getACase() - } - - final override predicate first(AstNode first) { first(super.getExpr(), first) } - - final override predicate succ(AstNode pred, AstNode succ, Completion c) { - SwitchTree.super.succ(pred, succ, c) - or - last(super.getACase(), pred, c) and - succ = this and - c instanceof NormalCompletion - } - } - - private class SwitchCaseExprTree extends PostOrderTree, CaseTree instanceof SwitchCaseExpr { - final override predicate first(AstNode first) { first(super.getPattern(), first) } - - pragma[noinline] - private predicate lastNoMatch(AstNode last, ConditionalCompletion cc) { - last([super.getPattern(), super.getCondition()], last, cc) and - (cc.(MatchingCompletion).isNonMatch() or cc instanceof FalseCompletion) - } - - final override predicate last(AstNode last, Completion c) { - PostOrderTree.super.last(last, c) - or - // Last case exists with a non-match - exists(SwitchExpr se, int i, ConditionalCompletion cc | - this = se.getCase(i) and - not super.matchesAll() and - not exists(se.getCase(i + 1)) and - this.lastNoMatch(last, cc) and - c = - any(NestedCompletion nc | - nc.getNestLevel() = 0 and - nc.getInnerCompletion() = cc and - nc.getOuterCompletion() - .(ThrowCompletion) - .getExceptionClass() - .hasFullyQualifiedName("System", "InvalidOperationException") - ) - ) - } - - final override predicate succ(AstNode pred, AstNode succ, Completion c) { - CaseTree.super.succ(pred, succ, c) - or - last(super.getBody(), pred, c) and - succ = this and - c instanceof NormalCompletion - } - } - - private class ConstructorInitializerTree extends PostOrderTree instanceof ConstructorInitializer { - private ControlFlowTree getChildNode(int i) { result = getExprChild(this, i) } - - final override predicate propagatesAbnormal(AstNode child) { child = this.getChildNode(_) } - - final override predicate first(AstNode first) { - first(this.getChildNode(0), first) - or - not exists(this.getChildNode(0)) and - first = this - } - - final override predicate succ(AstNode pred, AstNode succ, Completion c) { - // Post-order: flow from last element of last child to element itself - exists(int lst | - lst = max(int i | exists(this.getChildNode(i))) and - last(this.getChildNode(lst), pred, c) and - succ = this and - c instanceof NormalCompletion - ) - or - // Standard left-to-right evaluation - exists(int i | - last(this.getChildNode(i), pred, c) and - c instanceof NormalCompletion and - first(this.getChildNode(i + 1), succ) - ) - or - exists(ConstructorTree con, CompilationExt comp | - last(this, pred, c) and - con = super.getConstructor() and - comp = getCompilation(this.getFile()) and - c instanceof NormalCompletion and - first(con.getBody(comp), succ) - ) - } - } - - private class NotPatternExprTree extends PostOrderTree instanceof NotPatternExpr { - final override predicate propagatesAbnormal(AstNode child) { child = super.getPattern() } - - final override predicate first(AstNode first) { first(super.getPattern(), first) } - - final override predicate succ(AstNode pred, AstNode succ, Completion c) { - succ = this and - last(super.getPattern(), pred, c) and - c instanceof NormalCompletion - } - } - - private class AndPatternExprTree extends PostOrderTree instanceof AndPatternExpr { - final override predicate propagatesAbnormal(AstNode child) { child = super.getAnOperand() } - - final override predicate first(AstNode first) { first(super.getLeftOperand(), first) } - - final override predicate succ(AstNode pred, AstNode succ, Completion c) { - // Flow from last element of left operand to first element of right operand - last(super.getLeftOperand(), pred, c) and - c.(MatchingCompletion).getValue() = true and - first(super.getRightOperand(), succ) - or - // Post-order: flow from last element of left operand to element itself - last(super.getLeftOperand(), pred, c) and - c.(MatchingCompletion).getValue() = false and - succ = this - or - // Post-order: flow from last element of right operand to element itself - last(super.getRightOperand(), pred, c) and - c instanceof MatchingCompletion and - succ = this - } - } - - private class OrPatternExprTree extends PostOrderTree instanceof OrPatternExpr { - final override predicate propagatesAbnormal(AstNode child) { child = super.getAnOperand() } - - final override predicate first(AstNode first) { first(super.getLeftOperand(), first) } - - final override predicate succ(AstNode pred, AstNode succ, Completion c) { - // Flow from last element of left operand to first element of right operand - last(super.getLeftOperand(), pred, c) and - c.(MatchingCompletion).getValue() = false and - first(super.getRightOperand(), succ) - or - // Post-order: flow from last element of left operand to element itself - last(super.getLeftOperand(), pred, c) and - c.(MatchingCompletion).getValue() = true and - succ = this - or - // Post-order: flow from last element of right operand to element itself - last(super.getRightOperand(), pred, c) and - c instanceof MatchingCompletion and - succ = this - } - } -} - -private class RecursivePatternExprTree extends PostOrderTree instanceof RecursivePatternExpr { - private Expr getTypeExpr() { - result = super.getVariableDeclExpr() - or - not exists(super.getVariableDeclExpr()) and - result = super.getTypeAccess() - } - - private PatternExpr getChildPattern() { - result = super.getPositionalPatterns() - or - result = super.getPropertyPatterns() - } - - final override predicate propagatesAbnormal(AstNode child) { child = this.getChildPattern() } - - final override predicate first(AstNode first) { - first(this.getTypeExpr(), first) - or - not exists(this.getTypeExpr()) and - first(this.getChildPattern(), first) - } - - final override predicate succ(AstNode pred, AstNode succ, Completion c) { - // Flow from type test to child pattern - last(this.getTypeExpr(), pred, c) and - first(this.getChildPattern(), succ) and - c.(MatchingCompletion).getValue() = true - or - // Flow from type test to self - last(this.getTypeExpr(), pred, c) and - succ = this and - c.(MatchingCompletion).getValue() = false - or - // Flow from child pattern to self - last(this.getChildPattern(), pred, c) and - succ = this and - c instanceof MatchingCompletion - } -} - -private class PositionalPatternExprTree extends PreOrderTree instanceof PositionalPatternExpr { - final override predicate propagatesAbnormal(AstNode child) { child = super.getPattern(_) } - - final override predicate last(AstNode last, Completion c) { - last = this and - c.(MatchingCompletion).getValue() = false - or - last(super.getPattern(_), last, c) and - c.(MatchingCompletion).getValue() = false - or - exists(int lst | - last(super.getPattern(lst), last, c) and - not exists(super.getPattern(lst + 1)) - ) - } - - final override predicate succ(AstNode pred, AstNode succ, Completion c) { - // Flow from self to first pattern - pred = this and - c.(MatchingCompletion).getValue() = true and - first(super.getPattern(0), succ) - or - // Flow from one pattern to the next - exists(int i | - last(super.getPattern(i), pred, c) and - c.(MatchingCompletion).getValue() = true and - first(super.getPattern(i + 1), succ) - ) - } -} - -private class PropertyPatternExprExprTree extends PostOrderTree instanceof PropertyPatternExpr { - final override predicate propagatesAbnormal(AstNode child) { child = super.getPattern(_) } - - final override predicate first(AstNode first) { - first(super.getPattern(0), first) - or - not exists(super.getPattern(0)) and - first = this - } - - final override predicate succ(AstNode pred, AstNode succ, Completion c) { - // Flow from one pattern to the next - exists(int i | - last(super.getPattern(i), pred, c) and - c.(MatchingCompletion).getValue() = true and - first(super.getPattern(i + 1), succ) - ) - or - // Post-order: flow from last element of failing pattern to element itself - last(super.getPattern(_), pred, c) and - c.(MatchingCompletion).getValue() = false and - succ = this - or - // Post-order: flow from last element of last pattern to element itself - exists(int last | - last(super.getPattern(last), pred, c) and - not exists(super.getPattern(last + 1)) and - c instanceof MatchingCompletion and - succ = this - ) - } -} - -module Statements { - private class StandardStmt extends StandardPreOrderTree instanceof Stmt { - StandardStmt() { - // The following statements need special treatment - not this instanceof IfStmt and - not this instanceof SwitchStmt and - not this instanceof CaseStmt and - not this instanceof LoopStmt and - not this instanceof TryStmt and - not this instanceof SpecificCatchClause and - not this instanceof JumpStmt and - not this instanceof LabeledStmt - } - - private ControlFlowTree getChildNode0(int i) { - not this instanceof GeneralCatchClause and - not this instanceof FixedStmt and - not this instanceof UsingBlockStmt and - result = this.getChild(i) - or - this = any(GeneralCatchClause gcc | i = 0 and result = gcc.getBlock()) - or - this = - any(FixedStmt fs | - result = fs.getVariableDeclExpr(i) - or - result = fs.getBody() and - i = max(int j | exists(fs.getVariableDeclExpr(j))) + 1 - ) - or - this = - any(UsingBlockStmt us | - result = us.getExpr() and - i = 0 - or - result = us.getVariableDeclExpr(i) - or - result = us.getBody() and - i = max([1, count(us.getVariableDeclExpr(_))]) - ) - } - - final override AstNode getChildNode(int i) { - result = rank[i + 1](AstNode cfe, int j | cfe = this.getChildNode0(j) | cfe order by j) - } - } - - private class IfStmtTree extends PreOrderTree instanceof IfStmt { - final override predicate propagatesAbnormal(AstNode child) { child = super.getCondition() } - - final override predicate last(AstNode last, Completion c) { - // Condition exits with a false completion and there is no `else` branch - last(super.getCondition(), last, c) and - c instanceof FalseCompletion and - not exists(super.getElse()) - or - // Then branch exits with any completion - last(super.getThen(), last, c) - or - // Else branch exits with any completion - last(super.getElse(), last, c) - } - - final override predicate succ(AstNode pred, AstNode succ, Completion c) { - // Pre-order: flow from statement itself to first element of condition - pred = this and - first(super.getCondition(), succ) and - c instanceof SimpleCompletion - or - last(super.getCondition(), pred, c) and - ( - // Flow from last element of condition to first element of then branch - c instanceof TrueCompletion and first(super.getThen(), succ) - or - // Flow from last element of condition to first element of else branch - c instanceof FalseCompletion and first(super.getElse(), succ) - ) - } - } - - private class SwitchStmtTree extends PreOrderTree, SwitchTree instanceof SwitchStmt { - final override predicate last(AstNode last, Completion c) { - // Switch expression exits normally and there are no cases - not exists(super.getACase()) and - last(super.getExpr(), last, c) and - c instanceof NormalCompletion - or - // A statement exits with a `break` completion - last(SwithStmtInternal::getStmt(this, _), last, - c.(NestedBreakCompletion).getAnInnerCompatibleCompletion()) - or - // A statement exits abnormally - last(SwithStmtInternal::getStmt(this, _), last, c) and - not c instanceof BreakCompletion and - not c instanceof NormalCompletion and - not any(LabeledStmtTree t | - t.hasLabelInCallable(c.(GotoCompletion).getLabel(), super.getEnclosingCallable()) - ) instanceof CaseStmt - or - // Last case exits with a non-match - exists(CaseStmt cs, int last_ | - last_ = max(int i | exists(SwithStmtInternal::getCase(this, i))) and - cs = SwithStmtInternal::getCase(this, last_) - | - last(cs.getPattern(), last, c) and - not c.(MatchingCompletion).isMatch() - or - last(cs.getCondition(), last, c) and - c instanceof FalseCompletion - ) - } - - final override predicate succ(AstNode pred, AstNode succ, Completion c) { - SwitchTree.super.succ(pred, succ, c) - or - // Pre-order: flow from statement itself to first switch expression - pred = this and - first(super.getExpr(), succ) and - c instanceof SimpleCompletion - or - // Flow from last element of non-`case` statement `i` to first element of statement `i+1` - exists(int i | last(SwithStmtInternal::getStmt(this, i), pred, c) | - not SwithStmtInternal::getStmt(this, i) instanceof CaseStmt and - c instanceof NormalCompletion and - first(SwithStmtInternal::getStmt(this, i + 1), succ) - ) - or - // Flow from last element of `case` statement `i` to first element of statement `i+1` - exists(int i, Stmt body | - body = caseStmtGetBody(SwithStmtInternal::getStmt(this, i)) and - // in case of fall-through cases, make sure to not jump from their shared body back - // to one of the fall-through cases - not body = caseStmtGetBody(SwithStmtInternal::getStmt(this, i + 1)) and - last(body, pred, c) - | - c instanceof NormalCompletion and - first(SwithStmtInternal::getStmt(this, i + 1), succ) - ) - } - } - - private class CaseStmtTree extends PreOrderTree, CaseTree instanceof CaseStmt { - final override predicate last(AstNode last, Completion c) { - // Condition exists with a `false` completion - last(super.getCondition(), last, c) and - c instanceof FalseCompletion - or - // Case pattern exits with a non-match - last(super.getPattern(), last, c) and - not c.(MatchingCompletion).isMatch() - or - // Case body exits with any completion - last(caseStmtGetBody(this), last, c) - } - - final override predicate succ(AstNode pred, AstNode succ, Completion c) { - CaseTree.super.succ(pred, succ, c) - or - pred = this and - first(super.getPattern(), succ) and - c instanceof SimpleCompletion - } - } - - abstract private class LoopStmtTree extends PreOrderTree instanceof LoopStmt { - final override predicate propagatesAbnormal(AstNode child) { child = super.getCondition() } - - final override predicate last(AstNode last, Completion c) { - // Condition exits with a false completion - last(super.getCondition(), last, c) and - c instanceof FalseCompletion - or - // Body exits with a break completion - last(super.getBody(), last, c.(NestedBreakCompletion).getAnInnerCompatibleCompletion()) - or - // Body exits with a completion that does not continue the loop - last(super.getBody(), last, c) and - not c instanceof BreakCompletion and - not c.continuesLoop() - } - - override predicate succ(AstNode pred, AstNode succ, Completion c) { - // Flow from last element of condition to first element of loop body - last(super.getCondition(), pred, c) and - c instanceof TrueCompletion and - first(super.getBody(), succ) - or - // Flow from last element of loop body back to first element of condition - not this instanceof ForStmt and - last(super.getBody(), pred, c) and - c.continuesLoop() and - first(super.getCondition(), succ) - } - } - - private class WhileStmtTree extends LoopStmtTree instanceof WhileStmt { - final override predicate succ(AstNode pred, AstNode succ, Completion c) { - LoopStmtTree.super.succ(pred, succ, c) - or - pred = this and - first(super.getCondition(), succ) and - c instanceof SimpleCompletion - } - } - - private class DoStmtTree extends LoopStmtTree instanceof DoStmt { - final override predicate succ(AstNode pred, AstNode succ, Completion c) { - LoopStmtTree.super.succ(pred, succ, c) - or - pred = this and - first(super.getBody(), succ) and - c instanceof SimpleCompletion - } - } - - private class ForStmtTree extends LoopStmtTree instanceof ForStmt { - /** Gets the condition if it exists, otherwise the body. */ - private AstNode getConditionOrBody() { - result = super.getCondition() - or - not exists(super.getCondition()) and - result = super.getBody() - } - - final override predicate succ(AstNode pred, AstNode succ, Completion c) { - LoopStmtTree.super.succ(pred, succ, c) - or - // Pre-order: flow from statement itself to first element of first initializer/ - // condition/loop body - exists(AstNode next | - pred = this and - first(next, succ) and - c instanceof SimpleCompletion - | - next = super.getInitializer(0) - or - not exists(super.getInitializer(0)) and - next = this.getConditionOrBody() - ) - or - // Flow from last element of initializer `i` to first element of initializer `i+1` - exists(int i | last(super.getInitializer(i), pred, c) | - c instanceof NormalCompletion and - first(super.getInitializer(i + 1), succ) - ) - or - // Flow from last element of last initializer to first element of condition/loop body - exists(int last | last = max(int i | exists(super.getInitializer(i))) | - last(super.getInitializer(last), pred, c) and - c instanceof NormalCompletion and - first(this.getConditionOrBody(), succ) - ) - or - // Flow from last element of condition into first element of loop body - last(super.getCondition(), pred, c) and - c instanceof TrueCompletion and - first(super.getBody(), succ) - or - // Flow from last element of loop body to first element of update/condition/self - exists(AstNode next | - last(super.getBody(), pred, c) and - c.continuesLoop() and - first(next, succ) and - if exists(super.getUpdate(0)) - then next = super.getUpdate(0) - else next = this.getConditionOrBody() - ) - or - // Flow from last element of update to first element of next update/condition/loop body - exists(AstNode next, int i | - last(super.getUpdate(i), pred, c) and - c instanceof NormalCompletion and - first(next, succ) and - if exists(super.getUpdate(i + 1)) - then next = super.getUpdate(i + 1) - else next = this.getConditionOrBody() - ) - } - } - - private class ForeachStmtTree extends ControlFlowTree instanceof ForeachStmt { - final override predicate propagatesAbnormal(AstNode child) { child = super.getIterableExpr() } - - final override predicate first(AstNode first) { - // Unlike most other statements, `foreach` statements are not modeled in - // pre-order, because we use the `foreach` node itself to represent the - // emptiness test that determines whether to execute the loop body - first(super.getIterableExpr(), first) - } - - final override predicate last(AstNode last, Completion c) { - // Emptiness test exits with no more elements - last = this and - c.(EmptinessCompletion).isEmpty() - or - // Body exits with a break completion - last(super.getBody(), last, c.(NestedBreakCompletion).getAnInnerCompatibleCompletion()) - or - // Body exits abnormally - last(super.getBody(), last, c) and - not c instanceof NormalCompletion and - not c instanceof ContinueCompletion and - not c instanceof BreakCompletion - } - - final override predicate succ(AstNode pred, AstNode succ, Completion c) { - // Flow from last element of iterator expression to emptiness test - last(super.getIterableExpr(), pred, c) and - c instanceof NormalCompletion and - succ = this - or - // Flow from emptiness test to first element of variable declaration/loop body - pred = this and - c = any(EmptinessCompletion ec | not ec.isEmpty()) and - ( - first(super.getVariableDeclExpr(), succ) - or - first(super.getVariableDeclTuple(), succ) - or - not exists(super.getVariableDeclExpr()) and - not exists(super.getVariableDeclTuple()) and - first(super.getBody(), succ) - ) - or - // Flow from last element of variable declaration to first element of loop body - ( - last(super.getVariableDeclExpr(), pred, c) or - last(super.getVariableDeclTuple(), pred, c) - ) and - c instanceof SimpleCompletion and - first(super.getBody(), succ) - or - // Flow from last element of loop body back to emptiness test - last(super.getBody(), pred, c) and - c.continuesLoop() and - succ = this - } - } - - pragma[nomagic] - private AstNode lastLastCatchClause(CatchClause cc, Completion c) { - cc.isLast() and - last(cc, result, c) - } - - pragma[nomagic] - private AstNode lastCatchClauseBlock(CatchClause cc, Completion c) { - last(cc.getBlock(), result, c) - } - - /** Gets a child of `cfe` that is in CFG scope `scope`. */ - pragma[noinline] - private ControlFlowElement getAChildInScope(AstNode cfe, Callable scope) { - result = getAChild(cfe) and - scope = result.getEnclosingCallable() - } - - class TryStmtTree extends PreOrderTree instanceof TryStmt { - final override predicate propagatesAbnormal(AstNode child) { child = super.getFinally() } - - /** - * Gets a descendant that belongs to the finally block of this try statement. - */ - AstNode getAFinallyDescendant() { - result = super.getFinally() - or - exists(ControlFlowElement mid | - mid = this.getAFinallyDescendant() and - result = getAChildInScope(mid, mid.getEnclosingCallable()) and - not exists(TryStmt nestedTry | - result = nestedTry.getFinally() and - nestedTry != this - ) - ) - } - - /** - * Holds if `innerTry` has a finally block and is immediately nested inside the - * finally block of this try statement. - */ - private predicate nestedFinally(TryStmt innerTry) { - exists(AstNode innerFinally | - innerFinally = getAChildInScope(this.getAFinallyDescendant(), super.getEnclosingCallable()) and - innerFinally = innerTry.getFinally() - ) - } - - /** - * Gets the finally-nesting level of this try statement. That is, the number of - * finally blocks that this try statement is nested under. - */ - int nestLevel() { result = count(TryStmtTree outer | outer.nestedFinally+(this)) } - - /** Holds if `last` is a last element of the block of this try statement. */ - pragma[nomagic] - predicate lastBlock(AstNode last, Completion c) { last(super.getBlock(), last, c) } - - /** - * Gets a last element from a `try` or `catch` block of this try statement - * that may finish with completion `c`, such that control may be transferred - * to the finally block (if it exists), but only if `finalizable = true`. - */ - pragma[nomagic] - AstNode getAFinallyPredecessor(Completion c, boolean finalizable) { - // Exit completions skip the finally block - (if c instanceof ExitCompletion then finalizable = false else finalizable = true) and - ( - this.lastBlock(result, c) and - ( - // Any non-throw completion from the `try` block will always continue directly - // to the finally block - not c instanceof ThrowCompletion - or - // Any completion from the `try` block will continue to the finally block - // when there are no catch clauses - not exists(super.getACatchClause()) - ) - or - // Last element from any of the `catch` clause blocks continues to the finally block - result = lastCatchClauseBlock(super.getACatchClause(), c) - or - // Last element of last `catch` clause continues to the finally block - result = lastLastCatchClause(super.getACatchClause(), c) - ) - } - - pragma[nomagic] - private predicate lastFinally0(AstNode last, Completion c) { last(super.getFinally(), last, c) } - - pragma[nomagic] - private predicate lastFinally( - AstNode last, NormalCompletion finally, Completion outer, int nestLevel - ) { - this.lastFinally0(last, finally) and - exists( - this.getAFinallyPredecessor(any(Completion c0 | outer = c0.getOuterCompletion()), true) - ) and - nestLevel = this.nestLevel() - } - - final override predicate last(AstNode last, Completion c) { - exists(boolean finalizable | last = this.getAFinallyPredecessor(c, finalizable) | - // If there is no finally block, last elements are from the body, from - // the blocks of one of the `catch` clauses, or from the last `catch` clause - not super.hasFinally() - or - finalizable = false - ) - or - this.lastFinally(last, c, any(NormalCompletion nc), _) - or - // If the finally block completes normally, it inherits any non-normal - // completion that was current before the finally block was entered - exists(int nestLevel | - c = - any(NestedCompletion nc | - this.lastFinally(last, nc.getAnInnerCompatibleCompletion(), nc.getOuterCompletion(), - nestLevel) and - // unbind - nc.getNestLevel() >= nestLevel and - nc.getNestLevel() <= nestLevel - ) - ) - } - - /** - * Gets an exception type that is thrown by `cfe` in the block of this `try` - * statement. Throw completion `c` matches the exception type. - */ - ExceptionClass getAThrownException(AstNode cfe, ThrowCompletion c) { - this.lastBlock(cfe, c) and - result = c.getExceptionClass() - } - - final override predicate succ(AstNode pred, AstNode succ, Completion c) { - // Pre-order: flow from statement itself to first element of body - pred = this and - first(super.getBlock(), succ) and - c instanceof SimpleCompletion - or - // Flow from last element of body to first `catch` clause - exists(this.getAThrownException(pred, c)) and - first(super.getCatchClause(0), succ) - or - exists(CatchClause cc, int i | cc = super.getCatchClause(i) | - // Flow from one `catch` clause to the next - pred = cc and - last(super.getCatchClause(i), cc, c) and - first(super.getCatchClause(i + 1), succ) and - c = any(MatchingCompletion mc | not mc.isMatch()) - or - // Flow from last element of `catch` clause filter to next `catch` clause - last(super.getCatchClause(i), pred, c) and - last(cc.getFilterClause(), pred, _) and - first(super.getCatchClause(i + 1), succ) and - c instanceof FalseCompletion - ) - or - // Flow into finally block - pred = this.getAFinallyPredecessor(c, true) and - first(super.getFinally(), succ) - } - } - - private class SpecificCatchClauseTree extends PreOrderTree instanceof SpecificCatchClause { - final override predicate propagatesAbnormal(AstNode child) { child = super.getFilterClause() } - - pragma[nomagic] - private predicate lastFilterClause(AstNode last, Completion c) { - last(super.getFilterClause(), last, c) - } - - /** - * Holds if the `try` block that this catch clause belongs to may throw an - * exception of type `c`, where no `catch` clause is guaranteed to catch it. - * This catch clause is the last catch clause in the try statement that - * it belongs to. - */ - pragma[nomagic] - private predicate throwMayBeUncaught(ThrowCompletion c) { - exists(TryStmt ts | - ts = super.getTryStmt() and - ts.(TryStmtTree).lastBlock(_, c) and - not ts.getACatchClause() instanceof GeneralCatchClause and - forall(SpecificCatchClause scc | scc = ts.getACatchClause() | - scc.hasFilterClause() - or - not c.getExceptionClass().getABaseType*() = scc.getCaughtExceptionType() - ) and - super.isLast() - ) - } - - final override predicate last(AstNode last, Completion c) { - // Last element of `catch` block - last(super.getBlock(), last, c) - or - not super.isLast() and - ( - // Incompatible exception type: clause itself - last = this and - c.(MatchingCompletion).isNonMatch() - or - // Incompatible filter - this.lastFilterClause(last, c) and - c instanceof FalseCompletion - ) - or - // Last `catch` clause inherits throw completions from the `try` block, - // when the clause does not match - super.isLast() and - c = - any(NestedCompletion nc | - nc.getNestLevel() = 0 and - this.throwMayBeUncaught(nc.getOuterCompletion()) and - ( - // Incompatible exception type: clause itself - last = this and - nc.getInnerCompletion() = - any(MatchingCompletion mc | - mc.isNonMatch() and - mc.isValidFor(this) - ) - or - // Incompatible filter - this.lastFilterClause(last, nc.getInnerCompletion().(FalseCompletion)) - ) - ) - } - - final override predicate succ(AstNode pred, AstNode succ, Completion c) { - // Flow from catch clause to variable declaration/filter clause/block - pred = this and - c.(MatchingCompletion).isMatch() and - exists(AstNode next | first(next, succ) | - if exists(super.getVariableDeclExpr()) - then next = super.getVariableDeclExpr() - else - if exists(super.getFilterClause()) - then next = super.getFilterClause() - else next = super.getBlock() - ) - or - // Flow from variable declaration to filter clause/block - last(super.getVariableDeclExpr(), pred, c) and - c instanceof SimpleCompletion and - exists(AstNode next | first(next, succ) | - if exists(super.getFilterClause()) - then next = super.getFilterClause() - else next = super.getBlock() - ) - or - // Flow from filter to block - last(super.getFilterClause(), pred, c) and - c instanceof TrueCompletion and - first(super.getBlock(), succ) - } - } - - private class JumpStmtTree extends PostOrderTree instanceof JumpStmt { - final override predicate propagatesAbnormal(AstNode child) { child = this.getChild(0) } - - final override predicate first(AstNode first) { - first(this.getChild(0), first) - or - not exists(this.getChild(0)) and first = this - } - - final override predicate succ(AstNode pred, AstNode succ, Completion c) { - last(this.getChild(0), pred, c) and - succ = this and - c instanceof NormalCompletion - } - } - - pragma[nomagic] - private predicate goto(ControlFlowElement cfe, GotoCompletion gc, string label, Callable enclosing) { - last(_, cfe, gc) and - // Special case: when a `goto` happens inside a try statement with a - // finally block, flow does not go directly to the target, but instead - // to the finally block (and from there possibly to the target) - not cfe = - any(Statements::TryStmtTree t | t.(TryStmt).hasFinally()).getAFinallyPredecessor(_, true) and - label = gc.getLabel() and - enclosing = cfe.getEnclosingCallable() - } - - private class LabeledStmtTree extends PreOrderTree instanceof LabeledStmt { - final override predicate propagatesAbnormal(AstNode child) { none() } - - final override predicate last(AstNode last, Completion c) { - if this instanceof DefaultCase - then last(super.getStmt(), last, c) - else ( - not this instanceof CaseStmt and - last = this and - c.isValidFor(this) - ) - } - - pragma[noinline] - predicate hasLabelInCallable(string label, Callable c) { - super.getEnclosingCallable() = c and - label = super.getLabel() - } - - final override predicate succ(AstNode pred, AstNode succ, Completion c) { - this instanceof DefaultCase and - pred = this and - first(super.getStmt(), succ) and - c instanceof SimpleCompletion - or - // Flow from element with matching `goto` completion to this statement - exists(string label, Callable enclosing | - goto(pred, c, label, enclosing) and - this.hasLabelInCallable(label, enclosing) and - succ = this - ) - } - } -} - -/** A control flow element that is split into multiple control flow nodes. */ -class SplitAstNode extends AstNode, ControlFlowElement { - SplitAstNode() { strictcount(this.getAControlFlowNode()) > 1 } -} diff --git a/csharp/ql/lib/semmle/code/csharp/controlflow/internal/NonReturning.qll b/csharp/ql/lib/semmle/code/csharp/controlflow/internal/NonReturning.qll index 10f92d882b79..45f802619bed 100644 --- a/csharp/ql/lib/semmle/code/csharp/controlflow/internal/NonReturning.qll +++ b/csharp/ql/lib/semmle/code/csharp/controlflow/internal/NonReturning.qll @@ -9,13 +9,9 @@ import csharp private import semmle.code.csharp.ExprOrStmtParent private import semmle.code.csharp.commons.Assertions private import semmle.code.csharp.frameworks.System -private import Completion /** A call that definitely does not return (conservative analysis). */ -abstract class NonReturningCall extends Call { - /** Gets a valid completion for this non-returning call. */ - abstract Completion getACompletion(); -} +abstract class NonReturningCall extends Call { } private class ExitingCall extends NonReturningCall { ExitingCall() { @@ -23,36 +19,21 @@ private class ExitingCall extends NonReturningCall { or this = any(FailingAssertion fa | fa.getAssertionFailure().isExit()) } - - override ExitCompletion getACompletion() { not result instanceof NestedCompletion } } private class ThrowingCall extends NonReturningCall { - private ThrowCompletion c; - ThrowingCall() { - not c instanceof NestedCompletion and - ( - c = this.getTarget().(ThrowingCallable).getACallCompletion() - or - this.(FailingAssertion).getAssertionFailure().isException(c.getExceptionClass()) - or - this = - any(MethodCall mc | - mc.getTarget() - .hasFullyQualifiedName("System.Runtime.ExceptionServices", "ExceptionDispatchInfo", - "Throw") and - ( - mc.hasNoArguments() and - c.getExceptionClass() instanceof SystemExceptionClass - or - c.getExceptionClass() = mc.getArgument(0).getType() - ) - ) - ) + this.getTarget() instanceof ThrowingCallable + or + this.(FailingAssertion).getAssertionFailure().isException(_) + or + this = + any(MethodCall mc | + mc.getTarget() + .hasFullyQualifiedName("System.Runtime.ExceptionServices", "ExceptionDispatchInfo", + "Throw") + ) } - - override ThrowCompletion getACompletion() { result = c } } /** Holds if accessor `a` has an auto-implementation. */ @@ -107,44 +88,35 @@ private Stmt getAnExitingStmt() { private class ThrowingCallable extends NonReturningCallable { ThrowingCallable() { - forex(ControlFlowElement body | body = this.getBody() | body = getAThrowingElement(_)) + forex(ControlFlowElement body | body = this.getBody() | body = getAThrowingElement()) } - - /** Gets a valid completion for a call to this throwing callable. */ - ThrowCompletion getACallCompletion() { this.getBody() = getAThrowingElement(result) } } -private predicate directlyThrows(ThrowElement te, ThrowCompletion c) { - c.getExceptionClass() = te.getThrownExceptionType() and - not c instanceof NestedCompletion and +private predicate directlyThrows(ThrowElement te) { // For stub implementations, there may exist proper implementations that are not seen // during compilation, so we conservatively rule those out not isStub(te) } -private ControlFlowElement getAThrowingElement(ThrowCompletion c) { - c = result.(ThrowingCall).getACompletion() +private ControlFlowElement getAThrowingElement() { + result instanceof ThrowingCall or - directlyThrows(result, c) + directlyThrows(result) or - result = getAThrowingStmt(c) + result = getAThrowingStmt() } -private Stmt getAThrowingStmt(ThrowCompletion c) { - directlyThrows(result, c) +private Stmt getAThrowingStmt() { + directlyThrows(result) or - result.(ExprStmt).getExpr() = getAThrowingElement(c) + result.(ExprStmt).getExpr() = getAThrowingElement() or - result.(BlockStmt).getFirstStmt() = getAThrowingStmt(c) + result.(BlockStmt).getFirstStmt() = getAThrowingStmt() or - exists(IfStmt ifStmt, ThrowCompletion c1, ThrowCompletion c2 | + exists(IfStmt ifStmt | result = ifStmt and - ifStmt.getThen() = getAThrowingStmt(c1) and - ifStmt.getElse() = getAThrowingStmt(c2) - | - c = c1 - or - c = c2 + ifStmt.getThen() = getAThrowingStmt() and + ifStmt.getElse() = getAThrowingStmt() ) } diff --git a/csharp/ql/lib/semmle/code/csharp/controlflow/internal/Splitting.qll b/csharp/ql/lib/semmle/code/csharp/controlflow/internal/Splitting.qll index 55b75ed31a71..084b21ea1bfb 100644 --- a/csharp/ql/lib/semmle/code/csharp/controlflow/internal/Splitting.qll +++ b/csharp/ql/lib/semmle/code/csharp/controlflow/internal/Splitting.qll @@ -5,120 +5,3 @@ */ import csharp -private import Completion as Comp -private import Comp -private import ControlFlowGraphImpl -private import semmle.code.csharp.controlflow.ControlFlowGraph::ControlFlow as Cfg - -cached -private module Cached { - private import semmle.code.csharp.Caching - - cached - newtype TSplitKind = TConditionalCompletionSplitKind() - - cached - newtype TSplit = TConditionalCompletionSplit(ConditionalCompletion c) -} - -import Cached - -/** - * A split for a control flow element. For example, a tag that determines how to - * continue execution after leaving a `finally` block. - */ -class Split extends TSplit { - /** Gets a textual representation of this split. */ - string toString() { none() } -} - -module ConditionalCompletionSplitting { - /** - * A split for conditional completions. For example, in - * - * ```csharp - * void M(int i) - * { - * if (x && !y) - * System.Console.WriteLine("true") - * } - * ``` - * - * we record whether `x`, `y`, and `!y` evaluate to `true` or `false`, and restrict - * the edges out of `!y` and `x && !y` accordingly. - */ - class ConditionalCompletionSplit extends Split, TConditionalCompletionSplit { - ConditionalCompletion completion; - - ConditionalCompletionSplit() { this = TConditionalCompletionSplit(completion) } - - ConditionalCompletion getCompletion() { result = completion } - - override string toString() { result = completion.toString() } - } - - private class ConditionalCompletionSplitKind_ extends SplitKind, TConditionalCompletionSplitKind { - override int getListOrder() { result = 0 } - - override predicate isEnabled(AstNode cfe) { this.appliesTo(cfe) } - - override string toString() { result = "ConditionalCompletion" } - } - - module ConditionalCompletionSplittingInput { - private import Completion as Comp - - class ConditionalCompletion = Comp::ConditionalCompletion; - - class ConditionalCompletionSplitKind extends ConditionalCompletionSplitKind_, TSplitKind { } - - class ConditionalCompletionSplit = ConditionalCompletionSplitting::ConditionalCompletionSplit; - - bindingset[parent, parentCompletion] - predicate condPropagateExpr( - AstNode parent, ConditionalCompletion parentCompletion, AstNode child, - ConditionalCompletion childCompletion - ) { - child = parent.(LogicalNotExpr).getOperand() and - childCompletion.getDual() = parentCompletion - or - childCompletion = parentCompletion and - ( - child = parent.(LogicalAndExpr).getAnOperand() - or - child = parent.(LogicalOrExpr).getAnOperand() - or - parent = any(ConditionalExpr ce | child = [ce.getThen(), ce.getElse()]) - or - child = parent.(SwitchExpr).getACase() - or - child = parent.(SwitchCaseExpr).getBody() - or - parent = - any(NullCoalescingExpr nce | - if childCompletion instanceof NullnessCompletion - then child = nce.getRightOperand() - else child = nce.getAnOperand() - ) - ) - or - child = parent.(NotPatternExpr).getPattern() and - childCompletion.getDual() = parentCompletion - or - child = parent.(IsExpr).getPattern() and - parentCompletion.(BooleanCompletion).getValue() = - childCompletion.(MatchingCompletion).getValue() - or - childCompletion = parentCompletion and - ( - child = parent.(AndPatternExpr).getAnOperand() - or - child = parent.(OrPatternExpr).getAnOperand() - or - child = parent.(RecursivePatternExpr).getAChildExpr() - or - child = parent.(PropertyPatternExpr).getPattern(_) - ) - } - } -} diff --git a/csharp/ql/lib/semmle/code/csharp/dataflow/Nullness.qll b/csharp/ql/lib/semmle/code/csharp/dataflow/Nullness.qll index c7ac34d3d01a..a1952c2e7fca 100644 --- a/csharp/ql/lib/semmle/code/csharp/dataflow/Nullness.qll +++ b/csharp/ql/lib/semmle/code/csharp/dataflow/Nullness.qll @@ -126,7 +126,7 @@ private predicate nonNullDef(Ssa::ExplicitDefinition def) { /** * Holds if `node` is a dereference `d` of SSA definition `def`. */ -private predicate dereferenceAt(ControlFlow::Node node, Ssa::Definition def, Dereference d) { +private predicate dereferenceAt(ControlFlowNode node, Ssa::Definition def, Dereference d) { d = def.getAReadAtNode(node) } @@ -192,9 +192,7 @@ private predicate isNullDefaultArgument(Ssa::ImplicitParameterDefinition def, Al } /** Holds if `def` is an SSA definition that may be `null`. */ -private predicate defMaybeNull( - Ssa::Definition def, ControlFlow::Node node, string msg, Element reason -) { +private predicate defMaybeNull(Ssa::Definition def, ControlFlowNode node, string msg, Element reason) { not nonNullDef(def) and ( // A variable compared to `null` might be `null` @@ -224,7 +222,7 @@ private predicate defMaybeNull( 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() = maybeNullExpr(node.getAstNode()) and + adef.getSource() = maybeNullExpr(node.asExpr()) and reason = adef.getExpr() and msg = "because of $@ assignment" ) @@ -256,19 +254,19 @@ private Ssa::Definition getAnUltimateDefinition(Ssa::Definition def) { * through an intermediate dereference that always throws a null reference * exception. */ -private predicate defReaches(Ssa::Definition def, ControlFlow::Node cfn) { +private predicate defReaches(Ssa::Definition def, ControlFlowNode cfn) { exists(def.getAFirstReadAtNode(cfn)) or - exists(ControlFlow::Node mid | defReaches(def, mid) | + exists(ControlFlowNode mid | defReaches(def, mid) | SsaImpl::adjacentReadPairSameVar(_, mid, cfn) and not mid = any(Dereference d | d.isAlwaysNull(def.getSourceVariable())).getAControlFlowNode() ) } private module NullnessConfig implements ControlFlowReachability::ConfigSig { - predicate source(ControlFlow::Node node, Ssa::Definition def) { defMaybeNull(def, node, _, _) } + predicate source(ControlFlowNode node, Ssa::Definition def) { defMaybeNull(def, node, _, _) } - predicate sink(ControlFlow::Node node, Ssa::Definition def) { + predicate sink(ControlFlowNode node, Ssa::Definition def) { exists(Dereference d | dereferenceAt(node, def, d) and not d instanceof NonNullExpr @@ -283,9 +281,7 @@ private module NullnessConfig implements ControlFlowReachability::ConfigSig { private module NullnessFlow = ControlFlowReachability::Flow; predicate maybeNullDeref(Dereference d, Ssa::SourceVariable v, string msg, Element reason) { - exists( - Ssa::Definition origin, Ssa::Definition ssa, ControlFlow::Node src, ControlFlow::Node sink - | + exists(Ssa::Definition origin, Ssa::Definition ssa, ControlFlowNode src, ControlFlowNode sink | defMaybeNull(origin, src, msg, reason) and NullnessFlow::flow(src, origin, sink, ssa) and ssa.getSourceVariable() = v and diff --git a/csharp/ql/lib/semmle/code/csharp/dataflow/SSA.qll b/csharp/ql/lib/semmle/code/csharp/dataflow/SSA.qll index e8180201b9a8..11124cc20949 100644 --- a/csharp/ql/lib/semmle/code/csharp/dataflow/SSA.qll +++ b/csharp/ql/lib/semmle/code/csharp/dataflow/SSA.qll @@ -164,10 +164,8 @@ module Ssa { */ class Definition extends SsaImpl::Definition { /** 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(0.maximum(i)) - ) + final ControlFlowNode getControlFlowNode() { + exists(BasicBlock bb, int i | this.definesAt(_, bb, i) | result = bb.getNode(0.maximum(i))) } /** @@ -176,9 +174,7 @@ module Ssa { * point it is still live, without crossing another SSA definition of the * same source variable. */ - final predicate isLiveAtEndOfBlock(ControlFlow::BasicBlock bb) { - SsaImpl::isLiveAtEndOfBlock(this, bb) - } + final predicate isLiveAtEndOfBlock(BasicBlock bb) { SsaImpl::isLiveAtEndOfBlock(this, bb) } /** * Gets a read of the source variable underlying this SSA definition that @@ -236,7 +232,7 @@ module Ssa { * - The reads of `this.Field` on lines 10 and 11 can be reached from the phi * node between lines 9 and 10. */ - final AssignableRead getAReadAtNode(ControlFlow::Node cfn) { + final AssignableRead getAReadAtNode(ControlFlowNode cfn) { result = SsaImpl::getAReadAtNode(this, cfn) } @@ -310,7 +306,7 @@ module Ssa { * Subsequent reads can be found by following the steps defined by * `AssignableRead.getANextRead()`. */ - final AssignableRead getAFirstReadAtNode(ControlFlow::Node cfn) { + final AssignableRead getAFirstReadAtNode(ControlFlowNode cfn) { SsaImpl::firstReadSameVar(this, cfn) and result.getAControlFlowNode() = cfn } @@ -373,7 +369,7 @@ module Ssa { * - The read of `this.Field` on line 11 is a last read of the phi node * between lines 9 and 10. */ - deprecated final AssignableRead getALastReadAtNode(ControlFlow::Node cfn) { + deprecated final AssignableRead getALastReadAtNode(ControlFlowNode cfn) { SsaImpl::lastReadSameVar(this, cfn) and result.getAControlFlowNode() = cfn } @@ -426,7 +422,9 @@ module Ssa { * This is either an expression, for example `x = 0`, a parameter, or a * callable. Phi nodes have no associated syntax element. */ - Element getElement() { result = this.getControlFlowNode().getAstNode() } + Element getElement() { + result.(ControlFlowElement).getControlFlowNode() = this.getControlFlowNode() + } /** Gets the callable to which this SSA definition belongs. */ final Callable getEnclosingCallable() { @@ -484,7 +482,7 @@ module Ssa { * `M2` via the call on line 6. */ deprecated final predicate isCapturedVariableDefinitionFlowIn( - ImplicitEntryDefinition def, ControlFlow::Nodes::ElementNode c, boolean additionalCalls + ImplicitEntryDefinition def, ControlFlowNodes::ElementNode c, boolean additionalCalls ) { none() } @@ -520,9 +518,7 @@ module Ssa { override Element getElement() { result = ad.getElement() } - override string toString() { - result = SsaImpl::getToStringPrefix(this) + "SSA def(" + this.getSourceVariable() + ")" - } + override string toString() { result = "SSA def(" + this.getSourceVariable() + ")" } override Location getLocation() { result = ad.getLocation() } } @@ -536,7 +532,7 @@ module Ssa { */ class ImplicitDefinition extends Definition, SsaImpl::WriteDefinition { ImplicitDefinition() { - exists(ControlFlow::BasicBlock bb, SourceVariable v, int i | this.definesAt(v, bb, i) | + exists(BasicBlock bb, SourceVariable v, int i | this.definesAt(v, bb, i) | SsaImpl::implicitEntryDefinition(bb, v) and i = -1 or @@ -554,25 +550,21 @@ module Ssa { */ class ImplicitEntryDefinition extends ImplicitDefinition { ImplicitEntryDefinition() { - exists(ControlFlow::BasicBlock bb, SourceVariable v | + exists(BasicBlock bb, SourceVariable v | this.definesAt(v, bb, -1) and SsaImpl::implicitEntryDefinition(bb, v) ) } /** Gets the callable that this entry definition belongs to. */ - final Callable getCallable() { result = this.getBasicBlock().getCallable() } + final Callable getCallable() { result = this.getBasicBlock().getEnclosingCallable() } override Element getElement() { result = this.getCallable() } override string toString() { if this.getSourceVariable().getAssignable() instanceof LocalScopeVariable - then - result = - SsaImpl::getToStringPrefix(this) + "SSA capture def(" + this.getSourceVariable() + ")" - else - result = - SsaImpl::getToStringPrefix(this) + "SSA entry def(" + this.getSourceVariable() + ")" + then result = "SSA capture def(" + this.getSourceVariable() + ")" + else result = "SSA entry def(" + this.getSourceVariable() + ")" } override Location getLocation() { result = this.getCallable().getLocation() } @@ -582,7 +574,7 @@ module Ssa { class C = ImplicitParameterDefinition; predicate relevantLocations(ImplicitParameterDefinition def, Location l1, Location l2) { - not def.getBasicBlock() instanceof ControlFlow::BasicBlocks::EntryBlock and + not def.getBasicBlock() instanceof EntryBasicBlock and l1 = def.getParameter().getALocation() and l2 = def.getBasicBlock().getLocation() } @@ -613,9 +605,7 @@ module Ssa { override Element getElement() { result = this.getParameter() } - override string toString() { - result = SsaImpl::getToStringPrefix(this) + "SSA param(" + this.getParameter() + ")" - } + override string toString() { result = "SSA param(" + this.getParameter() + ")" } override Location getLocation() { not NearestLocation::nearestLocation(this, _, _) and @@ -634,7 +624,7 @@ module Ssa { private Call c; ImplicitCallDefinition() { - exists(ControlFlow::BasicBlock bb, SourceVariable v, int i | + exists(BasicBlock bb, SourceVariable v, int i | this.definesAt(v, bb, i) and SsaImpl::updatesNamedFieldOrProp(bb, i, c, v, _) ) @@ -656,9 +646,7 @@ module Ssa { ) } - override string toString() { - result = SsaImpl::getToStringPrefix(this) + "SSA call def(" + this.getSourceVariable() + ")" - } + override string toString() { result = "SSA call def(" + this.getSourceVariable() + ")" } override Location getLocation() { result = this.getCall().getLocation() } } @@ -671,9 +659,7 @@ module Ssa { private Definition q; ImplicitQualifierDefinition() { - exists( - ControlFlow::BasicBlock bb, int i, SourceVariables::QualifiedFieldOrPropSourceVariable v - | + exists(BasicBlock bb, int i, SourceVariables::QualifiedFieldOrPropSourceVariable v | this.definesAt(v, bb, i) | SsaImpl::variableWriteQualifier(bb, i, v, _) and @@ -684,10 +670,7 @@ module Ssa { /** Gets the SSA definition for the qualifier. */ final Definition getQualifierDefinition() { result = q } - override string toString() { - result = - SsaImpl::getToStringPrefix(this) + "SSA qualifier def(" + this.getSourceVariable() + ")" - } + override string toString() { result = "SSA qualifier def(" + this.getSourceVariable() + ")" } override Location getLocation() { result = this.getQualifierDefinition().getLocation() } } @@ -723,13 +706,11 @@ module Ssa { final Definition getAnInput() { this.hasInputFromBlock(result, _) } /** Holds if `inp` is an input to this phi node along the edge originating in `bb`. */ - predicate hasInputFromBlock(Definition inp, ControlFlow::BasicBlock bb) { + predicate hasInputFromBlock(Definition inp, BasicBlock bb) { inp = SsaImpl::phiHasInputFromBlock(this, bb) } - override string toString() { - result = SsaImpl::getToStringPrefix(this) + "SSA phi(" + this.getSourceVariable() + ")" - } + override string toString() { result = "SSA phi(" + this.getSourceVariable() + ")" } /* * The location of a phi node is the same as the location of the first node diff --git a/csharp/ql/lib/semmle/code/csharp/dataflow/SignAnalysis.qll b/csharp/ql/lib/semmle/code/csharp/dataflow/SignAnalysis.qll index 6f6f38bd199f..e7d3590e0fde 100644 --- a/csharp/ql/lib/semmle/code/csharp/dataflow/SignAnalysis.qll +++ b/csharp/ql/lib/semmle/code/csharp/dataflow/SignAnalysis.qll @@ -11,36 +11,36 @@ private import semmle.code.csharp.dataflow.internal.rangeanalysis.SignAnalysisCo /** Holds if `e` can be positive and cannot be negative. */ predicate positiveExpr(Expr e) { - forex(ControlFlow::Node cfn | cfn = e.getAControlFlowNode() | + forex(ControlFlowNode cfn | cfn = e.getAControlFlowNode() | positive(cfn) or strictlyPositive(cfn) ) } /** Holds if `e` can be negative and cannot be positive. */ predicate negativeExpr(Expr e) { - forex(ControlFlow::Node cfn | cfn = e.getAControlFlowNode() | + forex(ControlFlowNode cfn | cfn = e.getAControlFlowNode() | negative(cfn) or strictlyNegative(cfn) ) } /** Holds if `e` is strictly positive. */ predicate strictlyPositiveExpr(Expr e) { - forex(ControlFlow::Node cfn | cfn = e.getAControlFlowNode() | strictlyPositive(cfn)) + forex(ControlFlowNode cfn | cfn = e.getAControlFlowNode() | strictlyPositive(cfn)) } /** Holds if `e` is strictly negative. */ predicate strictlyNegativeExpr(Expr e) { - forex(ControlFlow::Node cfn | cfn = e.getAControlFlowNode() | strictlyNegative(cfn)) + forex(ControlFlowNode cfn | cfn = e.getAControlFlowNode() | strictlyNegative(cfn)) } /** Holds if `e` can be positive and cannot be negative. */ -predicate positive(ControlFlow::Nodes::ExprNode e) { Common::positive(e) } +predicate positive(ControlFlowNodes::ExprNode e) { Common::positive(e) } /** Holds if `e` can be negative and cannot be positive. */ -predicate negative(ControlFlow::Nodes::ExprNode e) { Common::negative(e) } +predicate negative(ControlFlowNodes::ExprNode e) { Common::negative(e) } /** Holds if `e` is strictly positive. */ -predicate strictlyPositive(ControlFlow::Nodes::ExprNode e) { Common::strictlyPositive(e) } +predicate strictlyPositive(ControlFlowNodes::ExprNode e) { Common::strictlyPositive(e) } /** Holds if `e` is strictly negative. */ -predicate strictlyNegative(ControlFlow::Nodes::ExprNode e) { Common::strictlyNegative(e) } +predicate strictlyNegative(ControlFlowNodes::ExprNode e) { Common::strictlyNegative(e) } diff --git a/csharp/ql/lib/semmle/code/csharp/dataflow/internal/BaseSSA.qll b/csharp/ql/lib/semmle/code/csharp/dataflow/internal/BaseSSA.qll index a994873274af..efa486c675aa 100644 --- a/csharp/ql/lib/semmle/code/csharp/dataflow/internal/BaseSSA.qll +++ b/csharp/ql/lib/semmle/code/csharp/dataflow/internal/BaseSSA.qll @@ -13,7 +13,7 @@ module BaseSsa { * targeting local scope variable `v`. */ private predicate definitionAt( - AssignableDefinition def, ControlFlow::BasicBlock bb, int i, SsaInput::SourceVariable v + AssignableDefinition def, BasicBlock bb, int i, SsaInput::SourceVariable v ) { bb.getNode(i) = def.getExpr().getAControlFlowNode() and v = def.getTarget() and @@ -25,11 +25,9 @@ module BaseSsa { ) } - private predicate implicitEntryDef( - Callable c, ControlFlow::BasicBlocks::EntryBlock bb, SsaInput::SourceVariable v - ) { - exists(ControlFlow::BasicBlocks::EntryBlock entry | - c = entry.getCallable() and + private predicate implicitEntryDef(Callable c, EntryBasicBlock bb, SsaInput::SourceVariable v) { + exists(EntryBasicBlock entry | + c = entry.getEnclosingCallable() and // In case `c` has multiple bodies, we want each body to get its own implicit // entry definition. In case `c` doesn't have multiple bodies, the line below // is simply the same as `bb = entry`, because `entry.getFirstNode().getASuccessor()` @@ -82,10 +80,10 @@ module BaseSsa { } } - private module SsaInput implements SsaImplCommon::InputSig { + private module SsaInput implements SsaImplCommon::InputSig { class SourceVariable = SimpleLocalScopeVariable; - predicate variableWrite(ControlFlow::BasicBlock bb, int i, SourceVariable v, boolean certain) { + predicate variableWrite(BasicBlock bb, int i, SourceVariable v, boolean certain) { exists(AssignableDefinition def | definitionAt(def, bb, i, v) and if def.isCertain() then certain = true else certain = false @@ -96,7 +94,7 @@ module BaseSsa { certain = true } - predicate variableRead(ControlFlow::BasicBlock bb, int i, SourceVariable v, boolean certain) { + predicate variableRead(BasicBlock bb, int i, SourceVariable v, boolean certain) { exists(AssignableRead read | read.getAControlFlowNode() = bb.getNode(i) and read.getTarget() = v and @@ -109,21 +107,21 @@ module BaseSsa { class Definition extends SsaImpl::Definition { final AssignableRead getARead() { - exists(ControlFlow::BasicBlock bb, int i | + exists(BasicBlock bb, int i | SsaImpl::ssaDefReachesRead(_, this, bb, i) and result.getAControlFlowNode() = bb.getNode(i) ) } final AssignableDefinition getDefinition() { - exists(ControlFlow::BasicBlock bb, int i, SsaInput::SourceVariable v | + exists(BasicBlock bb, int i, SsaInput::SourceVariable v | this.definesAt(v, bb, i) and definitionAt(result, bb, i, v) ) } final predicate isImplicitEntryDefinition(SsaInput::SourceVariable v) { - exists(ControlFlow::BasicBlock bb | + exists(BasicBlock bb | this.definesAt(v, bb, -1) and implicitEntryDef(_, bb, v) ) @@ -142,7 +140,7 @@ module BaseSsa { override Location getLocation() { result = this.getDefinition().getLocation() or - exists(Callable c, ControlFlow::BasicBlock bb, SsaInput::SourceVariable v | + exists(Callable c, BasicBlock bb, SsaInput::SourceVariable v | this.definesAt(v, bb, -1) and implicitEntryDef(c, bb, v) and result = c.getLocation() diff --git a/csharp/ql/lib/semmle/code/csharp/dataflow/internal/DataFlowDispatch.qll b/csharp/ql/lib/semmle/code/csharp/dataflow/internal/DataFlowDispatch.qll index be183815c715..fe2a240e1098 100644 --- a/csharp/ql/lib/semmle/code/csharp/dataflow/internal/DataFlowDispatch.qll +++ b/csharp/ql/lib/semmle/code/csharp/dataflow/internal/DataFlowDispatch.qll @@ -28,8 +28,8 @@ newtype TReturnKind = private predicate hasMultipleSourceLocations(Callable c) { strictcount(getASourceLocation(c)) > 1 } private predicate objectInitEntry(ObjectInitMethod m, ControlFlowElement first) { - exists(ControlFlow::Nodes::EntryNode en | - en.getCallable() = m and first.getControlFlowNode() = en.getASuccessor() + exists(ControlFlow::EntryNode en | + en.getEnclosingCallable() = m and first.getControlFlowNode() = en.getASuccessor() ) } @@ -73,12 +73,12 @@ private module Cached { cached newtype TDataFlowCall = - TNonDelegateCall(ControlFlow::Nodes::ElementNode cfn, DispatchCall dc) { + TNonDelegateCall(ControlFlowNodes::ElementNode cfn, DispatchCall dc) { DataFlowImplCommon::forceCachingInSameStage() and - cfn.getAstNode() = dc.getCall() + cfn.asExpr() = dc.getCall() } or - TExplicitDelegateLikeCall(ControlFlow::Nodes::ElementNode cfn, DelegateLikeCall dc) { - cfn.getAstNode() = dc + TExplicitDelegateLikeCall(ControlFlowNodes::ElementNode cfn, DelegateLikeCall dc) { + cfn.asExpr() = dc } or TSummaryCall(FlowSummary::SummarizedCallable c, FlowSummaryImpl::Private::SummaryNode receiver) { FlowSummaryImpl::Private::summaryCallbackRange(c, receiver) @@ -210,28 +210,28 @@ class DataFlowCallable extends TDataFlowCallable { } pragma[nomagic] - private ControlFlow::Nodes::ElementNode getAMultiBodyEntryNode(ControlFlow::BasicBlock bb, int i) { + private ControlFlowNode getAMultiBodyEntryNode(BasicBlock bb, int i) { this.isMultiBodied() and exists(ControlFlowElement body, Location l | body = this.asCallable(l).getBody() or objectInitEntry(this.asCallable(l), body) | NearestLocation::nearestLocation(body, l, _) and - result = body.getAControlFlowEntryNode() + result.isBefore(body) ) and bb.getNode(i) = result } pragma[nomagic] - private ControlFlow::Nodes::ElementNode getAMultiBodyControlFlowNodePred() { + private ControlFlowNode getAMultiBodyControlFlowNodePred() { result = this.getAMultiBodyEntryNode(_, _).getAPredecessor() or result = this.getAMultiBodyControlFlowNodePred().getAPredecessor() } pragma[nomagic] - private ControlFlow::Nodes::ElementNode getAMultiBodyControlFlowNodeSuccSameBasicBlock() { - exists(ControlFlow::BasicBlock bb, int i, int j | + private ControlFlowNode getAMultiBodyControlFlowNodeSuccSameBasicBlock() { + exists(BasicBlock bb, int i, int j | exists(this.getAMultiBodyEntryNode(bb, i)) and result = bb.getNode(j) and j > i @@ -239,14 +239,14 @@ class DataFlowCallable extends TDataFlowCallable { } pragma[nomagic] - private ControlFlow::BasicBlock getAMultiBodyBasicBlockSucc() { + private BasicBlock getAMultiBodyBasicBlockSucc() { result = this.getAMultiBodyEntryNode(_, _).getBasicBlock().getASuccessor() or result = this.getAMultiBodyBasicBlockSucc().getASuccessor() } pragma[inline] - private ControlFlow::Nodes::ElementNode getAMultiBodyControlFlowNode() { + private ControlFlowNode getAMultiBodyControlFlowNode() { result = [ this.getAMultiBodyEntryNode(_, _), this.getAMultiBodyControlFlowNodePred(), @@ -257,7 +257,7 @@ class DataFlowCallable extends TDataFlowCallable { /** Gets a control flow node belonging to this callable. */ pragma[inline] - ControlFlow::Node getAControlFlowNode() { + ControlFlowNode getAControlFlowNode() { result = this.getAMultiBodyControlFlowNode() or not this.isMultiBodied() and @@ -307,7 +307,7 @@ abstract class DataFlowCall extends TDataFlowCall { abstract DataFlowCallable getARuntimeTarget(); /** Gets the control flow node where this call happens, if any. */ - abstract ControlFlow::Nodes::ElementNode getControlFlowNode(); + abstract ControlFlowNodes::ElementNode getControlFlowNode(); /** Gets the data flow node corresponding to this call, if any. */ abstract DataFlow::Node getNode(); @@ -363,7 +363,7 @@ private predicate folderDist(Folder f1, Folder f2, int i) = /** A non-delegate C# call relevant for data flow. */ class NonDelegateDataFlowCall extends DataFlowCall, TNonDelegateCall { - private ControlFlow::Nodes::ElementNode cfn; + private ControlFlowNodes::ElementNode cfn; private DispatchCall dc; NonDelegateDataFlowCall() { this = TNonDelegateCall(cfn, dc) } @@ -436,7 +436,7 @@ class NonDelegateDataFlowCall extends DataFlowCall, TNonDelegateCall { not dc.isReflection() } - override ControlFlow::Nodes::ElementNode getControlFlowNode() { result = cfn } + override ControlFlowNodes::ElementNode getControlFlowNode() { result = cfn } override DataFlow::ExprNode getNode() { result.getControlFlowNode() = cfn } @@ -452,7 +452,7 @@ abstract class DelegateDataFlowCall extends DataFlowCall { } /** An explicit delegate or function pointer call relevant for data flow. */ class ExplicitDelegateLikeDataFlowCall extends DelegateDataFlowCall, TExplicitDelegateLikeCall { - private ControlFlow::Nodes::ElementNode cfn; + private ControlFlowNodes::ElementNode cfn; private DelegateLikeCall dc; ExplicitDelegateLikeDataFlowCall() { this = TExplicitDelegateLikeCall(cfn, dc) } @@ -464,7 +464,7 @@ class ExplicitDelegateLikeDataFlowCall extends DelegateDataFlowCall, TExplicitDe none() // handled by the shared library } - override ControlFlow::Nodes::ElementNode getControlFlowNode() { result = cfn } + override ControlFlowNodes::ElementNode getControlFlowNode() { result = cfn } override DataFlow::ExprNode getNode() { result.getControlFlowNode() = cfn } @@ -495,7 +495,7 @@ class SummaryCall extends DelegateDataFlowCall, TSummaryCall { none() // handled by the shared library } - override ControlFlow::Nodes::ElementNode getControlFlowNode() { none() } + override ControlFlowNodes::ElementNode getControlFlowNode() { none() } override DataFlow::Node getNode() { none() } diff --git a/csharp/ql/lib/semmle/code/csharp/dataflow/internal/DataFlowPrivate.qll b/csharp/ql/lib/semmle/code/csharp/dataflow/internal/DataFlowPrivate.qll index 03164960d410..37615c5e1e11 100644 --- a/csharp/ql/lib/semmle/code/csharp/dataflow/internal/DataFlowPrivate.qll +++ b/csharp/ql/lib/semmle/code/csharp/dataflow/internal/DataFlowPrivate.qll @@ -41,7 +41,7 @@ predicate isArgumentNode(ArgumentNode arg, DataFlowCall c, ArgumentPosition pos) * Gets a control flow node used for data flow purposes for the primary constructor * parameter access `pa`. */ -private ControlFlow::Node getAPrimaryConstructorParameterCfn(ParameterAccess pa) { +private ControlFlowNode getAPrimaryConstructorParameterCfn(ParameterAccess pa) { pa.getTarget().getCallable() instanceof PrimaryConstructor and ( result = pa.(ParameterRead).getAControlFlowNode() @@ -72,7 +72,7 @@ abstract class NodeImpl extends Node { /** Do not call: use `getControlFlowNode()` instead. */ cached - abstract ControlFlow::Node getControlFlowNodeImpl(); + abstract ControlFlowNode getControlFlowNodeImpl(); /** Do not call: use `getLocation()` instead. */ cached @@ -83,22 +83,9 @@ abstract class NodeImpl extends Node { abstract string toStringImpl(); } -// TODO: Remove once static initializers are folded into the -// static constructors -private DataFlowCallable getEnclosingStaticFieldOrProperty(Expr e) { - result.asFieldOrProperty() = - any(FieldOrProperty f | - f.isStatic() and - e = f.getAChild+() and - not exists(e.getEnclosingCallable()) - ) -} - private class ExprNodeImpl extends ExprNode, NodeImpl { override DataFlowCallable getEnclosingCallableImpl() { result.getAControlFlowNode() = this.getControlFlowNodeImpl() - or - result = getEnclosingStaticFieldOrProperty(this.asExpr()) } override Type getTypeImpl() { @@ -106,7 +93,7 @@ private class ExprNodeImpl extends ExprNode, NodeImpl { result = this.getExpr().getType() } - override ControlFlow::Nodes::ElementNode getControlFlowNodeImpl() { + override ControlFlowNodes::ElementNode getControlFlowNodeImpl() { forceCachingInSameStage() and this = TExprNode(result) } @@ -127,13 +114,13 @@ private class ExprNodeImpl extends ExprNode, NodeImpl { * as if they were lambdas. */ abstract private class LocalFunctionCreationNode extends NodeImpl, TLocalFunctionCreationNode { - ControlFlow::Nodes::ElementNode cfn; + ControlFlowNodes::ElementNode cfn; LocalFunction function; boolean isPostUpdate; LocalFunctionCreationNode() { this = TLocalFunctionCreationNode(cfn, isPostUpdate) and - function = cfn.getAstNode().(LocalFunctionStmt).getLocalFunction() + function = cfn.asStmt().(LocalFunctionStmt).getLocalFunction() } LocalFunction getFunction() { result = function } @@ -151,9 +138,9 @@ abstract private class LocalFunctionCreationNode extends NodeImpl, TLocalFunctio override DataFlowType getDataFlowType() { result.asDelegate() = function } - override ControlFlow::Nodes::ElementNode getControlFlowNodeImpl() { none() } + override ControlFlowNodes::ElementNode getControlFlowNodeImpl() { none() } - ControlFlow::Nodes::ElementNode getUnderlyingControlFlowNode() { result = cfn } + ControlFlowNodes::ElementNode getUnderlyingControlFlowNode() { result = cfn } override Location getLocationImpl() { result = cfn.getLocation() } } @@ -166,13 +153,11 @@ private class LocalFunctionCreationPreNode extends LocalFunctionCreationNode { /** Calculation of the relative order in which `this` references are read. */ private module ThisFlow { - private class BasicBlock = ControlFlow::BasicBlock; - /** Holds if `e` is a `this` access. */ predicate thisAccessExpr(Expr e) { e instanceof ThisAccess or e instanceof BaseAccess } /** Holds if `n` is a `this` access at control flow node `cfn`. */ - private predicate thisAccess(Node n, ControlFlow::Node cfn) { + private predicate thisAccess(Node n, ControlFlowNode cfn) { thisAccessExpr(n.asExprAtNode(cfn)) or cfn = n.(InstanceParameterAccessPreNode).getUnderlyingControlFlowNode() @@ -181,7 +166,7 @@ private module ThisFlow { private predicate primaryConstructorThisAccess(Node n, BasicBlock bb, int ppos) { exists(Parameter p | n.(PrimaryConstructorThisAccessPreNode).getParameter() = p and - bb.getCallable() = p.getCallable() and + bb.getEnclosingCallable() = p.getCallable() and ppos = p.getPosition() ) } @@ -198,9 +183,9 @@ private module ThisFlow { i = ppos - numberOfPrimaryConstructorParameters(bb) ) or - exists(DataFlowCallable c, ControlFlow::BasicBlocks::EntryBlock entry | + exists(DataFlowCallable c, EntryBasicBlock entry | n.(InstanceParameterNode).isParameterOf(c, _) and - exists(ControlFlow::Node succ | + exists(ControlFlowNode succ | succ = c.getAControlFlowNode() and succ = entry.getFirstNode().getASuccessor() and // In case `c` has multiple bodies, we want each body to gets its own implicit @@ -263,7 +248,7 @@ module VariableCapture { private import codeql.dataflow.VariableCapture as Shared private import semmle.code.csharp.controlflow.BasicBlocks as BasicBlocks - private predicate closureFlowStep(ControlFlow::Nodes::ExprNode e1, ControlFlow::Nodes::ExprNode e2) { + private predicate closureFlowStep(ControlFlowNodes::ExprNode e1, ControlFlowNodes::ExprNode e2) { e1.getExpr() = LocalFlow::getALastEvalNode(e2.getExpr()) or exists(Ssa::Definition def, AssignableDefinition adef | @@ -279,15 +264,15 @@ module VariableCapture { private import TaintTrackingPrivate as TaintTrackingPrivate Callable basicBlockGetEnclosingCallable(BasicBlocks::BasicBlock bb) { - result = bb.getCallable() + result = bb.getEnclosingCallable() } - private predicate thisAccess(ControlFlow::Node cfn, InstanceCallable c) { - ThisFlow::thisAccessExpr(cfn.getAstNode()) and + private predicate thisAccess(ControlFlowNode cfn, InstanceCallable c) { + ThisFlow::thisAccessExpr(cfn.asExpr()) and cfn.getEnclosingCallable().getEnclosingCallable*() = c } - private predicate capturedThisAccess(ControlFlow::Node cfn, InstanceCallable c) { + private predicate capturedThisAccess(ControlFlowNode cfn, InstanceCallable c) { thisAccess(cfn, c) and cfn.getEnclosingCallable() != c } @@ -347,7 +332,7 @@ module VariableCapture { } } - class Expr extends ControlFlow::Node { + class Expr extends ControlFlowNode { predicate hasCfgNode(BasicBlocks::BasicBlock bb, int i) { this = bb.getNode(i) } } @@ -360,7 +345,7 @@ module VariableCapture { this = def.getExpr().getAControlFlowNode() } - ControlFlow::Node getRhs() { LocalFlow::defAssigns(def, this, _, result) } + ControlFlowNode getRhs() { LocalFlow::defAssigns(def, this, _, result) } CapturedVariable getVariable() { result = v } } @@ -369,7 +354,7 @@ module VariableCapture { CapturedVariable v; VariableRead() { - this.getAstNode().(AssignableRead).getTarget() = v.asLocalScopeVariable() + this.asExpr().(AssignableRead).getTarget() = v.asLocalScopeVariable() or thisAccess(this, v.asThis()) } @@ -380,14 +365,16 @@ module VariableCapture { class ClosureExpr extends Expr { Callable c; - ClosureExpr() { lambdaCreationExpr(this.getAstNode(), c) } + ClosureExpr() { + lambdaCreationExpr(any(ControlFlowElement e | e.getControlFlowNode() = this), c) + } predicate hasBody(Callable body) { body = c } predicate hasAliasedAccess(Expr f) { closureFlowStep+(this, f) and not closureFlowStep(f, _) or - isLocalFunctionCallReceiver(_, f.getAstNode(), c) + isLocalFunctionCallReceiver(_, f.asExpr(), c) } } @@ -564,7 +551,7 @@ module LocalFlow { } predicate defAssigns( - AssignableDefinition def, ControlFlow::Node cfnDef, Expr value, ControlFlow::Node valueCfn + AssignableDefinition def, ControlFlowNode cfnDef, Expr value, ControlFlowNode valueCfn ) { def.getSource() = value and valueCfn = value.getControlFlowNode() and @@ -572,7 +559,7 @@ module LocalFlow { } private predicate defAssigns(ExprNode value, AssignableDefinitionNode defNode) { - exists(ControlFlow::Node cfn, AssignableDefinition def, ControlFlow::Node cfnDef | + exists(ControlFlowNode cfn, AssignableDefinition def, ControlFlowNode cfnDef | defAssigns(def, cfnDef, value.getExpr(), _) and cfn = value.getControlFlowNode() and defNode = TAssignableDefinitionNode(def, cfnDef) @@ -596,7 +583,7 @@ module LocalFlow { or ThisFlow::adjacentThisRefs(nodeFrom.(PostUpdateNode).getPreUpdateNode(), nodeTo) or - exists(AssignableDefinition def, ControlFlow::Node cfn, Ssa::ExplicitDefinition ssaDef | + exists(AssignableDefinition def, ControlFlowNode cfn, Ssa::ExplicitDefinition ssaDef | ssaDef.getADefinition() = def and ssaDef.getControlFlowNode() = cfn and nodeFrom = TAssignableDefinitionNode(def, cfn) and @@ -1024,9 +1011,9 @@ private module Cached { cached newtype TNode = - TExprNode(ControlFlow::Nodes::ElementNode cfn) { cfn.getAstNode() instanceof Expr } or + TExprNode(ControlFlowNodes::ElementNode cfn) { exists(cfn.asExpr()) } or TSsaNode(SsaImpl::DataFlowIntegration::SsaNode node) or - TAssignableDefinitionNode(AssignableDefinition def, ControlFlow::Node cfn) { + TAssignableDefinitionNode(AssignableDefinition def, ControlFlowNode cfn) { cfn = def.getExpr().getAControlFlowNode() } or TExplicitParameterNode(Parameter p, DataFlowCallable c) { @@ -1038,20 +1025,20 @@ private module Cached { l = c.getARelevantLocation() } or TDelegateSelfReferenceNode(Callable c) { lambdaCreationExpr(_, c) } or - TLocalFunctionCreationNode(ControlFlow::Nodes::ElementNode cfn, Boolean isPostUpdate) { - cfn.getAstNode() instanceof LocalFunctionStmt + TLocalFunctionCreationNode(ControlFlowNodes::ElementNode cfn, Boolean isPostUpdate) { + cfn.asStmt() instanceof LocalFunctionStmt } or - TYieldReturnNode(ControlFlow::Nodes::ElementNode cfn) { - any(Callable c).canYieldReturn(cfn.getAstNode()) + TYieldReturnNode(ControlFlowNodes::ElementNode cfn) { + any(Callable c).canYieldReturn(cfn.asExpr()) } or - TAsyncReturnNode(ControlFlow::Nodes::ElementNode cfn) { - any(Callable c | c.(Modifiable).isAsync()).canReturn(cfn.getAstNode()) + TAsyncReturnNode(ControlFlowNodes::ElementNode cfn) { + any(Callable c | c.(Modifiable).isAsync()).canReturn(cfn.asExpr()) } or - TMallocNode(ControlFlow::Nodes::ElementNode cfn) { cfn.getAstNode() instanceof ObjectCreation } or - TObjectInitializerNode(ControlFlow::Nodes::ElementNode cfn) { - cfn.getAstNode().(ObjectCreation).hasInitializer() + TMallocNode(ControlFlowNodes::ElementNode cfn) { cfn.asExpr() instanceof ObjectCreation } or + TObjectInitializerNode(ControlFlowNodes::ElementNode cfn) { + cfn.asExpr().(ObjectCreation).hasInitializer() } or - TExprPostUpdateNode(ControlFlow::Nodes::ExprNode cfn) { + TExprPostUpdateNode(ControlFlowNodes::ExprNode cfn) { ( cfn.getExpr() instanceof Argument or @@ -1085,12 +1072,12 @@ private module Cached { TFlowSummaryNode(FlowSummaryImpl::Private::SummaryNode sn) { sn.getSummarizedCallable() instanceof CallableUsedInSource } or - TParamsArgumentNode(ControlFlow::Node callCfn) { + TParamsArgumentNode(ControlFlowNode callCfn) { callCfn = any(Call c | isParamsArg(c, _, _)).getAControlFlowNode() } or TFlowInsensitiveFieldNode(FieldOrPropertyUsedInSource f) { f.isFieldLike() } or TFlowInsensitiveCapturedVariableNode(LocalScopeVariable v) { v.isCaptured() } or - TInstanceParameterAccessNode(ControlFlow::Node cfn, Boolean isPostUpdate) { + TInstanceParameterAccessNode(ControlFlowNode cfn, Boolean isPostUpdate) { cfn = getAPrimaryConstructorParameterCfn(_) } or TPrimaryConstructorThisAccessNode(Parameter p, Boolean isPostUpdate, DataFlowCallable c) { @@ -1232,7 +1219,7 @@ class SsaNode extends NodeImpl, TSsaNode { override Type getTypeImpl() { result = node.getSourceVariable().getType() } - override ControlFlow::Node getControlFlowNodeImpl() { none() } + override ControlFlowNode getControlFlowNodeImpl() { none() } override Location getLocationImpl() { result = node.getLocation() } @@ -1245,7 +1232,7 @@ class SsaDefinitionNode extends SsaNode { Ssa::Definition getDefinition() { result = node.getDefinition() } - override ControlFlow::Node getControlFlowNodeImpl() { + override ControlFlowNode getControlFlowNodeImpl() { result = this.getDefinition().getControlFlowNode() } } @@ -1253,7 +1240,7 @@ class SsaDefinitionNode extends SsaNode { /** A definition, viewed as a node in a data flow graph. */ class AssignableDefinitionNodeImpl extends NodeImpl, TAssignableDefinitionNode { private AssignableDefinition def; - private ControlFlow::Node cfn_; + private ControlFlowNode cfn_; AssignableDefinitionNodeImpl() { this = TAssignableDefinitionNode(def, cfn_) } @@ -1261,7 +1248,7 @@ class AssignableDefinitionNodeImpl extends NodeImpl, TAssignableDefinitionNode { AssignableDefinition getDefinition() { result = def } /** Gets the underlying definition, at control flow node `cfn`, if any. */ - AssignableDefinition getDefinitionAtNode(ControlFlow::Node cfn) { + AssignableDefinition getDefinitionAtNode(ControlFlowNode cfn) { result = def and cfn = cfn_ } @@ -1270,7 +1257,7 @@ class AssignableDefinitionNodeImpl extends NodeImpl, TAssignableDefinitionNode { override Type getTypeImpl() { result = def.getTarget().getType() } - override ControlFlow::Node getControlFlowNodeImpl() { result = cfn_ } + override ControlFlowNode getControlFlowNodeImpl() { result = cfn_ } override Location getLocationImpl() { result = def.getTargetAccess().getLocation() @@ -1373,7 +1360,7 @@ private module ParameterNodes { override Type getTypeImpl() { result = parameter.getType() } - override ControlFlow::Node getControlFlowNodeImpl() { none() } + override ControlFlowNode getControlFlowNodeImpl() { none() } override Location getLocationImpl() { result = this.getParameterLocation(_) } @@ -1398,7 +1385,7 @@ private module ParameterNodes { override Type getTypeImpl() { result = callable.getDeclaringType() } - override ControlFlow::Node getControlFlowNodeImpl() { none() } + override ControlFlowNode getControlFlowNodeImpl() { none() } override Location getLocationImpl() { result = location } @@ -1423,7 +1410,7 @@ private module ParameterNodes { callable = c.asCallable(_) and pos.isDelegateSelf() } - override ControlFlow::Node getControlFlowNodeImpl() { none() } + override ControlFlowNode getControlFlowNodeImpl() { none() } override DataFlowCallable getEnclosingCallableImpl() { result.asCallable(_) = callable } @@ -1507,7 +1494,7 @@ private module ArgumentNodes { * the constructor has run. */ class MallocNode extends ArgumentNodeImpl, NodeImpl, TMallocNode { - private ControlFlow::Nodes::ElementNode cfn; + private ControlFlowNodes::ElementNode cfn; MallocNode() { this = TMallocNode(cfn) } @@ -1516,15 +1503,11 @@ private module ArgumentNodes { pos.isQualifier() } - override ControlFlow::Node getControlFlowNodeImpl() { result = cfn } + override ControlFlowNode getControlFlowNodeImpl() { result = cfn } - override DataFlowCallable getEnclosingCallableImpl() { - result.getAControlFlowNode() = cfn - or - result = getEnclosingStaticFieldOrProperty(cfn.getAstNode()) - } + override DataFlowCallable getEnclosingCallableImpl() { result.getAControlFlowNode() = cfn } - override Type getTypeImpl() { result = cfn.getAstNode().(Expr).getType() } + override Type getTypeImpl() { result = cfn.asExpr().getType() } override Location getLocationImpl() { result = cfn.getLocation() } @@ -1546,7 +1529,7 @@ private module ArgumentNodes { * `Foo(new[] { "a", "b", "c" })`. */ class ParamsArgumentNode extends ArgumentNodeImpl, NodeImpl, TParamsArgumentNode { - private ControlFlow::Node callCfn; + private ControlFlowNode callCfn; ParamsArgumentNode() { this = TParamsArgumentNode(callCfn) } @@ -1559,15 +1542,11 @@ private module ArgumentNodes { pos.getPosition() = this.getParameter().getPosition() } - override DataFlowCallable getEnclosingCallableImpl() { - result.getAControlFlowNode() = callCfn - or - result = getEnclosingStaticFieldOrProperty(callCfn.getAstNode()) - } + override DataFlowCallable getEnclosingCallableImpl() { result.getAControlFlowNode() = callCfn } override Type getTypeImpl() { result = this.getParameter().getType() } - override ControlFlow::Node getControlFlowNodeImpl() { none() } + override ControlFlowNode getControlFlowNodeImpl() { none() } override Location getLocationImpl() { result = callCfn.getLocation() } @@ -1638,7 +1617,7 @@ private module ReturnNodes { * to `yield return e [e]`. */ class YieldReturnNode extends ReturnNode, NodeImpl, TYieldReturnNode { - private ControlFlow::Nodes::ElementNode cfn; + private ControlFlowNodes::ElementNode cfn; private YieldReturnStmt yrs; YieldReturnNode() { this = TYieldReturnNode(cfn) and yrs.getExpr().getAControlFlowNode() = cfn } @@ -1651,7 +1630,7 @@ private module ReturnNodes { override Type getTypeImpl() { result = yrs.getEnclosingCallable().getReturnType() } - override ControlFlow::Node getControlFlowNodeImpl() { result = cfn } + override ControlFlowNode getControlFlowNodeImpl() { result = cfn } override Location getLocationImpl() { result = yrs.getLocation() } @@ -1662,10 +1641,10 @@ private module ReturnNodes { * A synthesized `return` node for returned expressions inside `async` methods. */ class AsyncReturnNode extends ReturnNode, NodeImpl, TAsyncReturnNode { - private ControlFlow::Nodes::ElementNode cfn; + private ControlFlowNodes::ElementNode cfn; private Expr expr; - AsyncReturnNode() { this = TAsyncReturnNode(cfn) and expr = cfn.getAstNode() } + AsyncReturnNode() { this = TAsyncReturnNode(cfn) and expr = cfn.asExpr() } Expr getExpr() { result = expr } @@ -1675,7 +1654,7 @@ private module ReturnNodes { override Type getTypeImpl() { result = expr.getEnclosingCallable().getReturnType() } - override ControlFlow::Node getControlFlowNodeImpl() { result = cfn } + override ControlFlowNode getControlFlowNodeImpl() { result = cfn } override Location getLocationImpl() { result = expr.getLocation() } @@ -1727,7 +1706,7 @@ private module OutNodes { private import semmle.code.csharp.frameworks.system.Collections private import semmle.code.csharp.frameworks.system.collections.Generic - private DataFlowCall csharpCall(Expr e, ControlFlow::Node cfn) { + private DataFlowCall csharpCall(Expr e, ControlFlowNode cfn) { e = any(DispatchCall dc | result = TNonDelegateCall(cfn, dc)).getCall() or result = TExplicitDelegateLikeCall(cfn, e) } @@ -1757,7 +1736,7 @@ private module OutNodes { */ class ParamOutNode extends OutNode, AssignableDefinitionNode { private AssignableDefinitions::OutRefDefinition outRefDef; - private ControlFlow::Node cfn; + private ControlFlowNode cfn; ParamOutNode() { outRefDef = this.getDefinitionAtNode(cfn) } @@ -1802,7 +1781,7 @@ class FlowSummaryNode extends NodeImpl, TFlowSummaryNode { override Type getTypeImpl() { none() } - override ControlFlow::Node getControlFlowNodeImpl() { none() } + override ControlFlowNode getControlFlowNodeImpl() { none() } override Location getLocationImpl() { result = this.getSummarizedCallable().getLocation() } @@ -1826,7 +1805,7 @@ class FlowSummaryNode extends NodeImpl, TFlowSummaryNode { * all of which are represented by an `InstanceParameterAccessNode` node. */ abstract private class InstanceParameterAccessNode extends NodeImpl, TInstanceParameterAccessNode { - ControlFlow::Node cfn; + ControlFlowNode cfn; boolean isPostUpdate; Parameter p; @@ -1839,14 +1818,14 @@ abstract private class InstanceParameterAccessNode extends NodeImpl, TInstancePa override Type getTypeImpl() { result = cfn.getEnclosingCallable().getDeclaringType() } - override ControlFlow::Nodes::ElementNode getControlFlowNodeImpl() { none() } + override ControlFlowNodes::ElementNode getControlFlowNodeImpl() { none() } override Location getLocationImpl() { result = cfn.getLocation() } /** * Gets the underlying control flow node. */ - ControlFlow::Node getUnderlyingControlFlowNode() { result = cfn } + ControlFlowNode getUnderlyingControlFlowNode() { result = cfn } /** * Gets the primary constructor parameter that this is a this access to. @@ -1888,7 +1867,7 @@ abstract private class PrimaryConstructorThisAccessNode extends NodeImpl, override Type getTypeImpl() { result = p.getCallable().getDeclaringType() } - override ControlFlow::Nodes::ElementNode getControlFlowNodeImpl() { none() } + override ControlFlowNodes::ElementNode getControlFlowNodeImpl() { none() } override Location getLocationImpl() { NearestLocation::nearestLocation(p, @@ -1939,7 +1918,7 @@ class CaptureNode extends NodeImpl, TCaptureNode { else result = super.getDataFlowType() } - override ControlFlow::Node getControlFlowNodeImpl() { none() } + override ControlFlowNode getControlFlowNodeImpl() { none() } override Location getLocationImpl() { result = cn.getLocation() } @@ -2050,7 +2029,7 @@ class FlowInsensitiveFieldNode extends NodeImpl, TFlowInsensitiveFieldNode { override Type getTypeImpl() { result = f.getType() } - override ControlFlow::Node getControlFlowNodeImpl() { none() } + override ControlFlowNode getControlFlowNodeImpl() { none() } override Location getLocationImpl() { result = f.getLocation() } @@ -2074,7 +2053,7 @@ class FlowInsensitiveCapturedVariableNode extends NodeImpl, TFlowInsensitiveCapt override Type getTypeImpl() { result = v.getType() } - override ControlFlow::Node getControlFlowNodeImpl() { none() } + override ControlFlowNode getControlFlowNodeImpl() { none() } override Location getLocationImpl() { result = v.getLocation() } @@ -2117,7 +2096,7 @@ private ContentSet getResultContent() { private predicate primaryConstructorParameterStore( AssignableDefinitionNode node1, PrimaryConstructorParameterContent c, Node node2 ) { - exists(AssignableDefinition def, ControlFlow::Node cfn, Parameter p | + exists(AssignableDefinition def, ControlFlowNode cfn, Parameter p | node1 = TAssignableDefinitionNode(def, cfn) and p = def.getTarget() and node2 = TInstanceParameterAccessNode(cfn, true) and @@ -2360,7 +2339,7 @@ predicate expectsContent(Node n, ContentSet c) { n.asExpr() instanceof SpreadElementExpr and c.isElement() } -class NodeRegion instanceof ControlFlow::BasicBlock { +class NodeRegion instanceof BasicBlock { string toString() { result = "NodeRegion" } predicate contains(Node n) { this = n.getControlFlowNode().getBasicBlock() } @@ -2421,10 +2400,10 @@ DataFlowType getNodeType(Node n) { not lambdaCreation(n, _, _) and not isLocalFunctionCallReceiver(_, n.asExpr(), _) or - [ - n.asExpr().(ControlFlowElement), - n.(LocalFunctionCreationPreNode).getUnderlyingControlFlowNode().getAstNode() - ] = result.getADelegateCreation() + n.asExpr() = result.getADelegateCreation() + or + n.(LocalFunctionCreationPreNode).getUnderlyingControlFlowNode() = + result.getADelegateCreation().getControlFlowNode() } private class DataFlowNullType extends Gvn::GvnType { @@ -2543,7 +2522,7 @@ module PostUpdateNodes { ObjectCreationNode() { this = TExprNode(oc.getAControlFlowNode()) } override Node getPreUpdateSourceNode() { - exists(ControlFlow::Nodes::ElementNode cfn | this = TExprNode(cfn) | + exists(ControlFlowNodes::ElementNode cfn | this = TExprNode(cfn) | result = TObjectInitializerNode(cfn) or not oc.hasInitializer() and @@ -2563,7 +2542,7 @@ module PostUpdateNodes { TObjectInitializerNode { private ObjectCreation oc; - private ControlFlow::Nodes::ElementNode cfn; + private ControlFlowNodes::ElementNode cfn; ObjectInitializerNode() { this = TObjectInitializerNode(cfn) and @@ -2586,15 +2565,11 @@ module PostUpdateNodes { ) } - override DataFlowCallable getEnclosingCallableImpl() { - result.getAControlFlowNode() = cfn - or - result = getEnclosingStaticFieldOrProperty(oc) - } + override DataFlowCallable getEnclosingCallableImpl() { result.getAControlFlowNode() = cfn } override Type getTypeImpl() { result = oc.getType() } - override ControlFlow::Nodes::ElementNode getControlFlowNodeImpl() { result = cfn } + override ControlFlowNodes::ElementNode getControlFlowNodeImpl() { result = cfn } override Location getLocationImpl() { result = cfn.getLocation() } @@ -2602,21 +2577,17 @@ module PostUpdateNodes { } class ExprPostUpdateNode extends SourcePostUpdateNode, NodeImpl, TExprPostUpdateNode { - private ControlFlow::Nodes::ElementNode cfn; + private ControlFlowNodes::ElementNode cfn; ExprPostUpdateNode() { this = TExprPostUpdateNode(cfn) } override ExprNode getPreUpdateSourceNode() { result = TExprNode(cfn) } - override DataFlowCallable getEnclosingCallableImpl() { - result.getAControlFlowNode() = cfn - or - result = getEnclosingStaticFieldOrProperty(cfn.getAstNode()) - } + override DataFlowCallable getEnclosingCallableImpl() { result.getAControlFlowNode() = cfn } - override Type getTypeImpl() { result = cfn.getAstNode().(Expr).getType() } + override Type getTypeImpl() { result = cfn.asExpr().getType() } - override ControlFlow::Node getControlFlowNodeImpl() { none() } + override ControlFlowNode getControlFlowNodeImpl() { none() } override Location getLocationImpl() { result = cfn.getLocation() } @@ -2745,7 +2716,7 @@ private predicate isLocalFunctionCallReceiver( f = receiver.getTarget().getUnboundDeclaration() } -private predicate lambdaCallExpr(DataFlowCall call, Expr receiver, ControlFlow::Node receiverCfn) { +private predicate lambdaCallExpr(DataFlowCall call, Expr receiver, ControlFlowNode receiverCfn) { exists(DelegateLikeCall dc | call.(ExplicitDelegateLikeDataFlowCall).getCall() = dc and receiver = dc.getExpr() and @@ -2766,7 +2737,7 @@ predicate lambdaCall(DataFlowCall call, LambdaCallKind kind, Node receiver) { ( lambdaCallExpr(call, receiver.asExpr(), _) and // local function calls can be resolved directly without a flow analysis - not call.getControlFlowNode().getAstNode() instanceof LocalFunctionCall + not call.getControlFlowNode().asExpr() instanceof LocalFunctionCall or receiver.(FlowSummaryNode).getSummaryNode() = call.(SummaryCall).getReceiver() ) and diff --git a/csharp/ql/lib/semmle/code/csharp/dataflow/internal/DataFlowPublic.qll b/csharp/ql/lib/semmle/code/csharp/dataflow/internal/DataFlowPublic.qll index f4d24fdb5101..5c49809ed406 100644 --- a/csharp/ql/lib/semmle/code/csharp/dataflow/internal/DataFlowPublic.qll +++ b/csharp/ql/lib/semmle/code/csharp/dataflow/internal/DataFlowPublic.qll @@ -17,7 +17,7 @@ class Node extends TNode { * Gets the expression corresponding to this node, at control flow node `cfn`, * if any. */ - Expr asExprAtNode(ControlFlow::Nodes::ElementNode cfn) { + Expr asExprAtNode(ControlFlowNodes::ElementNode cfn) { result = this.(ExprNode).getExprAtNode(cfn) } @@ -31,7 +31,7 @@ class Node extends TNode { * Gets the definition corresponding to this node, at control flow node `cfn`, * if any. */ - AssignableDefinition asDefinitionAtNode(ControlFlow::Node cfn) { + AssignableDefinition asDefinitionAtNode(ControlFlowNode cfn) { result = this.(AssignableDefinitionNode).getDefinitionAtNode(cfn) } @@ -44,7 +44,7 @@ class Node extends TNode { } /** Gets the control flow node corresponding to this node, if any. */ - final ControlFlow::Node getControlFlowNode() { result = this.(NodeImpl).getControlFlowNodeImpl() } + final ControlFlowNode getControlFlowNode() { result = this.(NodeImpl).getControlFlowNodeImpl() } /** Gets a textual representation of this node. */ final string toString() { result = this.(NodeImpl).toStringImpl() } @@ -71,7 +71,7 @@ class Node extends TNode { * * Note that because of control-flow splitting, one `Expr` may correspond * to multiple `ExprNode`s, just like it may correspond to multiple - * `ControlFlow::Node`s. + * `ControlFlowNode`s. */ class ExprNode extends Node, TExprNode { /** Gets the expression corresponding to this node. */ @@ -81,9 +81,9 @@ class ExprNode extends Node, TExprNode { * Gets the expression corresponding to this node, at control flow node `cfn`, * if any. */ - Expr getExprAtNode(ControlFlow::Nodes::ElementNode cfn) { + Expr getExprAtNode(ControlFlowNodes::ElementNode cfn) { this = TExprNode(cfn) and - result = cfn.getAstNode() + result = cfn.asExpr() } } @@ -113,7 +113,7 @@ class AssignableDefinitionNode extends Node instanceof AssignableDefinitionNodeI AssignableDefinition getDefinition() { result = super.getDefinition() } /** Gets the underlying definition, at control flow node `cfn`, if any. */ - AssignableDefinition getDefinitionAtNode(ControlFlow::Node cfn) { + AssignableDefinition getDefinitionAtNode(ControlFlowNode cfn) { result = super.getDefinitionAtNode(cfn) } } diff --git a/csharp/ql/lib/semmle/code/csharp/dataflow/internal/SsaImpl.qll b/csharp/ql/lib/semmle/code/csharp/dataflow/internal/SsaImpl.qll index 7a592bebff0f..790c0e4ba9d0 100644 --- a/csharp/ql/lib/semmle/code/csharp/dataflow/internal/SsaImpl.qll +++ b/csharp/ql/lib/semmle/code/csharp/dataflow/internal/SsaImpl.qll @@ -9,7 +9,7 @@ private import semmle.code.csharp.controlflow.BasicBlocks as BasicBlocks private import semmle.code.csharp.controlflow.Guards as Guards private import semmle.code.csharp.dataflow.internal.BaseSSA -private module SsaInput implements SsaImplCommon::InputSig { +private module SsaInput implements SsaImplCommon::InputSig { class SourceVariable = Ssa::SourceVariable; /** @@ -18,7 +18,7 @@ private module SsaInput implements SsaImplCommon::InputSig { +module ConstCondInput implements ConstCond::InputSig { class SsaDefinition = Ssa::Definition; class GuardValue = Guards::GuardValue; @@ -166,14 +166,12 @@ class ConstantNullnessCondition extends ConstantCondition { boolean b; ConstantNullnessCondition() { - forex(ControlFlow::Node cfn | cfn = this.getAControlFlowNode() | - exists(ControlFlow::NullnessSuccessor t, ControlFlow::Node s | - s = cfn.getASuccessorByType(t) - | + exists(ControlFlowNode cfn | cfn = this.getAControlFlowNode() | + exists(ControlFlow::NullnessSuccessor t, ControlFlowNode s | s = cfn.getASuccessor(t) | b = t.getValue() and - not s.isJoin() + exists(unique(ControlFlowNode pred | s.getAPredecessor() = pred)) ) and - strictcount(ControlFlow::SuccessorType t | exists(cfn.getASuccessorByType(t))) = 1 + strictcount(ControlFlow::SuccessorType t | exists(cfn.getASuccessor(t))) = 1 ) } @@ -190,11 +188,9 @@ class ConstantMatchingCondition extends ConstantCondition { ConstantMatchingCondition() { this instanceof Expr and - forex(ControlFlow::Node cfn | cfn = this.getAControlFlowNode() | - exists(ControlFlow::MatchingSuccessor t | exists(cfn.getASuccessorByType(t)) | - b = t.getValue() - ) and - strictcount(ControlFlow::SuccessorType t | exists(cfn.getASuccessorByType(t))) = 1 + forex(ControlFlowNode cfn | cfn = this.getAControlFlowNode() | + exists(ControlFlow::MatchingSuccessor t | exists(cfn.getASuccessor(t)) | b = t.getValue()) and + strictcount(ControlFlow::SuccessorType t | exists(cfn.getASuccessor(t))) = 1 ) } diff --git a/csharp/ql/src/Concurrency/UnsynchronizedStaticAccess.ql b/csharp/ql/src/Concurrency/UnsynchronizedStaticAccess.ql index 150ae78ae090..ca41f94cf566 100644 --- a/csharp/ql/src/Concurrency/UnsynchronizedStaticAccess.ql +++ b/csharp/ql/src/Concurrency/UnsynchronizedStaticAccess.ql @@ -26,11 +26,11 @@ predicate correctlySynchronized(CollectionMember c, Expr access) { ) } -ControlFlow::Node unlockedReachable(Callable a) { +ControlFlowNode unlockedReachable(Callable a) { result = a.getEntryPoint() or - exists(ControlFlow::Node mid | mid = unlockedReachable(a) | - not mid.getAstNode() instanceof LockingCall and + exists(ControlFlowNode mid | mid = unlockedReachable(a) | + not mid.asExpr() instanceof LockingCall and result = mid.getASuccessor() ) } diff --git a/csharp/ql/src/Likely Bugs/NestedLoopsSameVariable.ql b/csharp/ql/src/Likely Bugs/NestedLoopsSameVariable.ql index 0831eb561997..d616c2377c3f 100644 --- a/csharp/ql/src/Likely Bugs/NestedLoopsSameVariable.ql +++ b/csharp/ql/src/Likely Bugs/NestedLoopsSameVariable.ql @@ -80,21 +80,20 @@ class NestedForLoopSameVariable extends ForStmt { } /** Finds elements inside the outer loop that are no longer guarded by the loop invariant. */ - private ControlFlow::Node getAnUnguardedNode() { + private ControlFlowNode getAnUnguardedNode() { hasChild(this.getOuterForStmt().getBody(), result.getAstNode()) and ( - result = - this.getCondition().(ControlFlowElement).getAControlFlowExitNode().getAFalseSuccessor() + result.isAfterFalse(this.getCondition()) or - exists(ControlFlow::Node mid | mid = this.getAnUnguardedNode() | + exists(ControlFlowNode mid | mid = this.getAnUnguardedNode() | mid.getASuccessor() = result and - not exists(this.getAComparisonTest(result.getAstNode())) + not exists(this.getAComparisonTest(result.asExpr())) ) ) } private VariableAccess getAnUnguardedAccess() { - result = this.getAnUnguardedNode().getAstNode() and + result = this.getAnUnguardedNode().asExpr() and result.getTarget() = iteration } } diff --git a/csharp/ql/src/Likely Bugs/Statements/UseBraces.ql b/csharp/ql/src/Likely Bugs/Statements/UseBraces.ql index f639b060ac17..bef3fabd296d 100644 --- a/csharp/ql/src/Likely Bugs/Statements/UseBraces.ql +++ b/csharp/ql/src/Likely Bugs/Statements/UseBraces.ql @@ -15,10 +15,10 @@ import csharp // Iterate the control flow until we reach a Stmt -Stmt findSuccessorStmt(ControlFlow::Node n) { - result = n.getAstNode() +Stmt findSuccessorStmt(ControlFlowNode n) { + result = n.asStmt() or - not n.getAstNode() instanceof Stmt and result = findSuccessorStmt(n.getASuccessor()) + not exists(n.asStmt()) and result = findSuccessorStmt(n.getASuccessor()) } // Return a successor statement to s diff --git a/csharp/ql/src/Likely Bugs/UncheckedCastInEquals.ql b/csharp/ql/src/Likely Bugs/UncheckedCastInEquals.ql index 5c11a77f30df..94eb9d909d36 100644 --- a/csharp/ql/src/Likely Bugs/UncheckedCastInEquals.ql +++ b/csharp/ql/src/Likely Bugs/UncheckedCastInEquals.ql @@ -19,14 +19,14 @@ private predicate equalsMethodChild(EqualsMethod equals, Element child) { equalsMethodChild(equals, child.getParent()) } -predicate nodeBeforeParameterAccess(ControlFlow::Node node) { - exists(EqualsMethod equals | equals.getBody() = node.getAstNode()) +predicate nodeBeforeParameterAccess(ControlFlowNode node) { + exists(EqualsMethod equals | equals.getBody().getControlFlowNode() = node) or - exists(EqualsMethod equals, Parameter param, ControlFlow::Node mid | + exists(EqualsMethod equals, Parameter param, ControlFlowNode mid | equals.getParameter(0) = param and - equalsMethodChild(equals, mid.getAstNode()) and + equalsMethodChild(equals, any(ControlFlowElement e | e.getControlFlowNode() = mid)) and nodeBeforeParameterAccess(mid) and - not param.getAnAccess() = mid.getAstNode() and + not param.getAnAccess().getControlFlowNode() = mid and mid.getASuccessor() = node ) } diff --git a/csharp/ql/src/Performance/StringBuilderInLoop.ql b/csharp/ql/src/Performance/StringBuilderInLoop.ql index f1f23ebf5e0d..f2a13923478c 100644 --- a/csharp/ql/src/Performance/StringBuilderInLoop.ql +++ b/csharp/ql/src/Performance/StringBuilderInLoop.ql @@ -13,10 +13,10 @@ import csharp import semmle.code.csharp.frameworks.system.Text -from ObjectCreation creation, LoopStmt loop, ControlFlow::Node loopEntryNode +from ObjectCreation creation, LoopStmt loop, ControlFlowNode loopEntryNode where creation.getType() instanceof SystemTextStringBuilderClass and - loopEntryNode = loop.getBody().getAControlFlowEntryNode() and + loopEntryNode.isBefore(loop.getBody()) and loop.getBody().getAChild*() = creation and creation.getAControlFlowNode().postDominates(loopEntryNode) select creation, "Creating a 'StringBuilder' in a loop." diff --git a/csharp/ql/src/Security Features/CWE-384/AbandonSession.ql b/csharp/ql/src/Security Features/CWE-384/AbandonSession.ql index c350c8f37554..2654b48c233f 100644 --- a/csharp/ql/src/Security Features/CWE-384/AbandonSession.ql +++ b/csharp/ql/src/Security Features/CWE-384/AbandonSession.ql @@ -56,18 +56,18 @@ predicate sessionUse(MemberAccess ma) { } /** A control flow step that is not sanitised by a call to clear the session. */ -predicate controlStep(ControlFlow::Node s1, ControlFlow::Node s2) { +predicate controlStep(ControlFlowNode s1, ControlFlowNode s2) { s2 = s1.getASuccessor() and - not sessionEndMethod(s2.getAstNode().(MethodCall).getTarget()) + not sessionEndMethod(s2.asExpr().(MethodCall).getTarget()) } from - ControlFlow::Node loginCall, Method loginMethod, ControlFlow::Node sessionUse, + ControlFlowNode loginCall, Method loginMethod, ControlFlowNode sessionUse, ControlFlow::SuccessorType fromLoginFlow where - loginMethod = loginCall.getAstNode().(MethodCall).getTarget() and + loginMethod = loginCall.asExpr().(MethodCall).getTarget() and loginMethod(loginMethod, fromLoginFlow) and - sessionUse(sessionUse.getAstNode()) and - controlStep+(loginCall.getASuccessorByType(fromLoginFlow), sessionUse) + sessionUse(sessionUse.asExpr()) and + controlStep+(loginCall.getASuccessor(fromLoginFlow), sessionUse) select sessionUse, "This session has not been invalidated following the call to $@.", loginCall, loginMethod.getName() diff --git a/csharp/ql/test/library-tests/controlflow/graph/Common.qll b/csharp/ql/test/library-tests/controlflow/graph/Common.qll index f6f9b26f1cdd..0df87ac46701 100644 --- a/csharp/ql/test/library-tests/controlflow/graph/Common.qll +++ b/csharp/ql/test/library-tests/controlflow/graph/Common.qll @@ -10,14 +10,14 @@ class SourceControlFlowElement extends ControlFlowElement { } } -class SourceControlFlowNode extends ControlFlow::Node { +class SourceControlFlowNode extends ControlFlowNode { SourceControlFlowNode() { not this.getLocation().getFile() instanceof StubFile and not this.getLocation().getFile().fromLibrary() } } -class SourceBasicBlock extends ControlFlow::BasicBlock { +class SourceBasicBlock extends BasicBlock { SourceBasicBlock() { not this.getLocation().getFile() instanceof StubFile and not this.getLocation().getFile().fromLibrary() diff --git a/csharp/ql/test/library-tests/controlflow/graph/Condition.ql b/csharp/ql/test/library-tests/controlflow/graph/Condition.ql index 61c801819246..616c4d1b95f4 100644 --- a/csharp/ql/test/library-tests/controlflow/graph/Condition.ql +++ b/csharp/ql/test/library-tests/controlflow/graph/Condition.ql @@ -1,18 +1,14 @@ import csharp import ControlFlow -query predicate conditionBlock( - BasicBlocks::ConditionBlock cb, BasicBlock controlled, boolean testIsTrue -) { +query predicate conditionBlock(BasicBlock cb, BasicBlock controlled, boolean testIsTrue) { cb.edgeDominates(controlled, any(ConditionalSuccessor s | testIsTrue = s.getValue())) } -ControlFlow::Node successor(ControlFlow::Node node, boolean kind) { - kind = true and result = node.getATrueSuccessor() - or - kind = false and result = node.getAFalseSuccessor() +ControlFlowNode successor(ControlFlowNode node, boolean kind) { + result = node.getASuccessor(any(BooleanSuccessor s | s.getValue() = kind)) } -query predicate conditionFlow(ControlFlow::Node node, ControlFlow::Node successor, boolean kind) { +query predicate conditionFlow(ControlFlowNode node, ControlFlowNode successor, boolean kind) { successor = successor(node, kind) } diff --git a/csharp/ql/test/library-tests/controlflow/graph/ConditionalAccess.cs b/csharp/ql/test/library-tests/controlflow/graph/ConditionalAccess.cs index b99e940f88b5..f40cfd8c8414 100644 --- a/csharp/ql/test/library-tests/controlflow/graph/ConditionalAccess.cs +++ b/csharp/ql/test/library-tests/controlflow/graph/ConditionalAccess.cs @@ -52,6 +52,7 @@ void M9(ConditionalAccess ca) ca?.Prop?.StringProp = "World"; ca?.IntField -= 1; ca?.StringProp += "!"; + ca?[1] ??= "Set1"; } } diff --git a/csharp/ql/test/library-tests/controlflow/graph/EnclosingCallable.ql b/csharp/ql/test/library-tests/controlflow/graph/EnclosingCallable.ql index 7309151bb7ed..54d0c07d5538 100644 --- a/csharp/ql/test/library-tests/controlflow/graph/EnclosingCallable.ql +++ b/csharp/ql/test/library-tests/controlflow/graph/EnclosingCallable.ql @@ -3,4 +3,4 @@ import Common query predicate nodeEnclosing(SourceControlFlowNode n, Callable c) { c = n.getEnclosingCallable() } -query predicate blockEnclosing(SourceBasicBlock bb, Callable c) { c = bb.getCallable() } +query predicate blockEnclosing(SourceBasicBlock bb, Callable c) { c = bb.getEnclosingCallable() } diff --git a/csharp/ql/test/library-tests/controlflow/graph/EntryElement.ql b/csharp/ql/test/library-tests/controlflow/graph/EntryElement.ql index 08f37467efef..60bd04647fda 100644 --- a/csharp/ql/test/library-tests/controlflow/graph/EntryElement.ql +++ b/csharp/ql/test/library-tests/controlflow/graph/EntryElement.ql @@ -1,7 +1,14 @@ import csharp import Common -import semmle.code.csharp.controlflow.internal.ControlFlowGraphImpl + +predicate first(SourceControlFlowElement cfe, ControlFlowNode first) { + first.isBefore(cfe) + or + exists(ControlFlowNode mid | + first(cfe, mid) and not mid.injects(_) and first = mid.getASuccessor() + ) +} from SourceControlFlowElement cfe, ControlFlowElement first -where first(cfe, first) +where first(cfe, first.getControlFlowNode()) select cfe, first diff --git a/csharp/ql/test/library-tests/controlflow/graph/ExitElement.expected b/csharp/ql/test/library-tests/controlflow/graph/ExitElement.expected deleted file mode 100644 index a6794112ebda..000000000000 --- a/csharp/ql/test/library-tests/controlflow/graph/ExitElement.expected +++ /dev/null @@ -1,4617 +0,0 @@ -| AccessorCalls.cs:1:7:1:19 | call to constructor Object | AccessorCalls.cs:1:7:1:19 | call to constructor Object | normal | -| AccessorCalls.cs:1:7:1:19 | call to method | AccessorCalls.cs:1:7:1:19 | call to method | normal | -| AccessorCalls.cs:1:7:1:19 | this access | AccessorCalls.cs:1:7:1:19 | this access | normal | -| AccessorCalls.cs:1:7:1:19 | {...} | AccessorCalls.cs:1:7:1:19 | {...} | normal | -| AccessorCalls.cs:5:30:5:30 | access to parameter i | AccessorCalls.cs:5:30:5:30 | access to parameter i | normal | -| AccessorCalls.cs:5:37:5:39 | {...} | AccessorCalls.cs:5:37:5:39 | {...} | normal | -| AccessorCalls.cs:7:36:7:38 | {...} | AccessorCalls.cs:7:36:7:38 | {...} | normal | -| AccessorCalls.cs:7:47:7:49 | {...} | AccessorCalls.cs:7:47:7:49 | {...} | normal | -| AccessorCalls.cs:11:5:17:5 | {...} | AccessorCalls.cs:16:9:16:23 | ... -= ... | normal | -| AccessorCalls.cs:12:9:12:12 | this access | AccessorCalls.cs:12:9:12:12 | this access | normal | -| AccessorCalls.cs:12:9:12:18 | access to field Field | AccessorCalls.cs:12:9:12:12 | this access | normal | -| AccessorCalls.cs:12:9:12:31 | ... = ... | AccessorCalls.cs:12:9:12:31 | ... = ... | normal | -| AccessorCalls.cs:12:9:12:32 | ...; | AccessorCalls.cs:12:9:12:31 | ... = ... | normal | -| AccessorCalls.cs:12:22:12:25 | this access | AccessorCalls.cs:12:22:12:25 | this access | normal | -| AccessorCalls.cs:12:22:12:31 | access to field Field | AccessorCalls.cs:12:22:12:31 | access to field Field | normal | -| AccessorCalls.cs:13:9:13:12 | this access | AccessorCalls.cs:13:9:13:12 | this access | normal | -| AccessorCalls.cs:13:9:13:17 | access to property Prop | AccessorCalls.cs:13:9:13:12 | this access | normal | -| AccessorCalls.cs:13:9:13:29 | ... = ... | AccessorCalls.cs:13:9:13:29 | ... = ... | normal | -| AccessorCalls.cs:13:9:13:30 | ...; | AccessorCalls.cs:13:9:13:29 | ... = ... | normal | -| AccessorCalls.cs:13:21:13:24 | this access | AccessorCalls.cs:13:21:13:24 | this access | normal | -| AccessorCalls.cs:13:21:13:29 | access to property Prop | AccessorCalls.cs:13:21:13:29 | access to property Prop | normal | -| AccessorCalls.cs:14:9:14:12 | this access | AccessorCalls.cs:14:9:14:12 | this access | normal | -| AccessorCalls.cs:14:9:14:15 | access to indexer | AccessorCalls.cs:14:14:14:14 | 0 | normal | -| AccessorCalls.cs:14:9:14:25 | ... = ... | AccessorCalls.cs:14:9:14:25 | ... = ... | normal | -| AccessorCalls.cs:14:9:14:26 | ...; | AccessorCalls.cs:14:9:14:25 | ... = ... | normal | -| AccessorCalls.cs:14:14:14:14 | 0 | AccessorCalls.cs:14:14:14:14 | 0 | normal | -| AccessorCalls.cs:14:19:14:22 | this access | AccessorCalls.cs:14:19:14:22 | this access | normal | -| AccessorCalls.cs:14:19:14:25 | access to indexer | AccessorCalls.cs:14:19:14:25 | access to indexer | normal | -| AccessorCalls.cs:14:24:14:24 | 1 | AccessorCalls.cs:14:24:14:24 | 1 | normal | -| AccessorCalls.cs:15:9:15:12 | this access | AccessorCalls.cs:15:9:15:12 | this access | normal | -| AccessorCalls.cs:15:9:15:18 | access to event Event | AccessorCalls.cs:15:9:15:12 | this access | normal | -| AccessorCalls.cs:15:9:15:23 | ... += ... | AccessorCalls.cs:15:9:15:23 | ... += ... | normal | -| AccessorCalls.cs:15:9:15:24 | ...; | AccessorCalls.cs:15:9:15:23 | ... += ... | normal | -| AccessorCalls.cs:15:23:15:23 | access to parameter e | AccessorCalls.cs:15:23:15:23 | access to parameter e | normal | -| AccessorCalls.cs:16:9:16:12 | this access | AccessorCalls.cs:16:9:16:12 | this access | normal | -| AccessorCalls.cs:16:9:16:18 | access to event Event | AccessorCalls.cs:16:9:16:12 | this access | normal | -| AccessorCalls.cs:16:9:16:23 | ... -= ... | AccessorCalls.cs:16:9:16:23 | ... -= ... | normal | -| AccessorCalls.cs:16:9:16:24 | ...; | AccessorCalls.cs:16:9:16:23 | ... -= ... | normal | -| AccessorCalls.cs:16:23:16:23 | access to parameter e | AccessorCalls.cs:16:23:16:23 | access to parameter e | normal | -| AccessorCalls.cs:20:5:26:5 | {...} | AccessorCalls.cs:25:9:25:25 | ... -= ... | normal | -| AccessorCalls.cs:21:9:21:12 | this access | AccessorCalls.cs:21:9:21:12 | this access | normal | -| AccessorCalls.cs:21:9:21:14 | access to field x | AccessorCalls.cs:21:9:21:14 | access to field x | normal | -| AccessorCalls.cs:21:9:21:20 | access to field Field | AccessorCalls.cs:21:9:21:14 | access to field x | normal | -| AccessorCalls.cs:21:9:21:35 | ... = ... | AccessorCalls.cs:21:9:21:35 | ... = ... | normal | -| AccessorCalls.cs:21:9:21:36 | ...; | AccessorCalls.cs:21:9:21:35 | ... = ... | normal | -| AccessorCalls.cs:21:24:21:27 | this access | AccessorCalls.cs:21:24:21:27 | this access | normal | -| AccessorCalls.cs:21:24:21:29 | access to field x | AccessorCalls.cs:21:24:21:29 | access to field x | normal | -| AccessorCalls.cs:21:24:21:35 | access to field Field | AccessorCalls.cs:21:24:21:35 | access to field Field | normal | -| AccessorCalls.cs:22:9:22:12 | this access | AccessorCalls.cs:22:9:22:12 | this access | normal | -| AccessorCalls.cs:22:9:22:14 | access to field x | AccessorCalls.cs:22:9:22:14 | access to field x | normal | -| AccessorCalls.cs:22:9:22:19 | access to property Prop | AccessorCalls.cs:22:9:22:14 | access to field x | normal | -| AccessorCalls.cs:22:9:22:33 | ... = ... | AccessorCalls.cs:22:9:22:33 | ... = ... | normal | -| AccessorCalls.cs:22:9:22:34 | ...; | AccessorCalls.cs:22:9:22:33 | ... = ... | normal | -| AccessorCalls.cs:22:23:22:26 | this access | AccessorCalls.cs:22:23:22:26 | this access | normal | -| AccessorCalls.cs:22:23:22:28 | access to field x | AccessorCalls.cs:22:23:22:28 | access to field x | normal | -| AccessorCalls.cs:22:23:22:33 | access to property Prop | AccessorCalls.cs:22:23:22:33 | access to property Prop | normal | -| AccessorCalls.cs:23:9:23:12 | this access | AccessorCalls.cs:23:9:23:12 | this access | normal | -| AccessorCalls.cs:23:9:23:14 | access to field x | AccessorCalls.cs:23:9:23:14 | access to field x | normal | -| AccessorCalls.cs:23:9:23:17 | access to indexer | AccessorCalls.cs:23:16:23:16 | 0 | normal | -| AccessorCalls.cs:23:9:23:29 | ... = ... | AccessorCalls.cs:23:9:23:29 | ... = ... | normal | -| AccessorCalls.cs:23:9:23:30 | ...; | AccessorCalls.cs:23:9:23:29 | ... = ... | normal | -| AccessorCalls.cs:23:16:23:16 | 0 | AccessorCalls.cs:23:16:23:16 | 0 | normal | -| AccessorCalls.cs:23:21:23:24 | this access | AccessorCalls.cs:23:21:23:24 | this access | normal | -| AccessorCalls.cs:23:21:23:26 | access to field x | AccessorCalls.cs:23:21:23:26 | access to field x | normal | -| AccessorCalls.cs:23:21:23:29 | access to indexer | AccessorCalls.cs:23:21:23:29 | access to indexer | normal | -| AccessorCalls.cs:23:28:23:28 | 1 | AccessorCalls.cs:23:28:23:28 | 1 | normal | -| AccessorCalls.cs:24:9:24:12 | this access | AccessorCalls.cs:24:9:24:12 | this access | normal | -| AccessorCalls.cs:24:9:24:14 | access to field x | AccessorCalls.cs:24:9:24:14 | access to field x | normal | -| AccessorCalls.cs:24:9:24:20 | access to event Event | AccessorCalls.cs:24:9:24:14 | access to field x | normal | -| AccessorCalls.cs:24:9:24:25 | ... += ... | AccessorCalls.cs:24:9:24:25 | ... += ... | normal | -| AccessorCalls.cs:24:9:24:26 | ...; | AccessorCalls.cs:24:9:24:25 | ... += ... | normal | -| AccessorCalls.cs:24:25:24:25 | access to parameter e | AccessorCalls.cs:24:25:24:25 | access to parameter e | normal | -| AccessorCalls.cs:25:9:25:12 | this access | AccessorCalls.cs:25:9:25:12 | this access | normal | -| AccessorCalls.cs:25:9:25:14 | access to field x | AccessorCalls.cs:25:9:25:14 | access to field x | normal | -| AccessorCalls.cs:25:9:25:20 | access to event Event | AccessorCalls.cs:25:9:25:14 | access to field x | normal | -| AccessorCalls.cs:25:9:25:25 | ... -= ... | AccessorCalls.cs:25:9:25:25 | ... -= ... | normal | -| AccessorCalls.cs:25:9:25:26 | ...; | AccessorCalls.cs:25:9:25:25 | ... -= ... | normal | -| AccessorCalls.cs:25:25:25:25 | access to parameter e | AccessorCalls.cs:25:25:25:25 | access to parameter e | normal | -| AccessorCalls.cs:29:5:33:5 | {...} | AccessorCalls.cs:32:9:32:17 | ...++ | normal | -| AccessorCalls.cs:30:9:30:12 | this access | AccessorCalls.cs:30:9:30:12 | this access | normal | -| AccessorCalls.cs:30:9:30:18 | access to field Field | AccessorCalls.cs:30:9:30:18 | access to field Field | normal | -| AccessorCalls.cs:30:9:30:20 | ...++ | AccessorCalls.cs:30:9:30:20 | ...++ | normal | -| AccessorCalls.cs:30:9:30:21 | ...; | AccessorCalls.cs:30:9:30:20 | ...++ | normal | -| AccessorCalls.cs:31:9:31:12 | this access | AccessorCalls.cs:31:9:31:12 | this access | normal | -| AccessorCalls.cs:31:9:31:17 | access to property Prop | AccessorCalls.cs:31:9:31:17 | access to property Prop | normal | -| AccessorCalls.cs:31:9:31:19 | ...++ | AccessorCalls.cs:31:9:31:19 | ...++ | normal | -| AccessorCalls.cs:31:9:31:20 | ...; | AccessorCalls.cs:31:9:31:19 | ...++ | normal | -| AccessorCalls.cs:32:9:32:12 | this access | AccessorCalls.cs:32:9:32:12 | this access | normal | -| AccessorCalls.cs:32:9:32:15 | access to indexer | AccessorCalls.cs:32:9:32:15 | access to indexer | normal | -| AccessorCalls.cs:32:9:32:17 | ...++ | AccessorCalls.cs:32:9:32:17 | ...++ | normal | -| AccessorCalls.cs:32:9:32:18 | ...; | AccessorCalls.cs:32:9:32:17 | ...++ | normal | -| AccessorCalls.cs:32:14:32:14 | 0 | AccessorCalls.cs:32:14:32:14 | 0 | normal | -| AccessorCalls.cs:36:5:40:5 | {...} | AccessorCalls.cs:39:9:39:19 | ...++ | normal | -| AccessorCalls.cs:37:9:37:12 | this access | AccessorCalls.cs:37:9:37:12 | this access | normal | -| AccessorCalls.cs:37:9:37:14 | access to field x | AccessorCalls.cs:37:9:37:14 | access to field x | normal | -| AccessorCalls.cs:37:9:37:20 | access to field Field | AccessorCalls.cs:37:9:37:20 | access to field Field | normal | -| AccessorCalls.cs:37:9:37:22 | ...++ | AccessorCalls.cs:37:9:37:22 | ...++ | normal | -| AccessorCalls.cs:37:9:37:23 | ...; | AccessorCalls.cs:37:9:37:22 | ...++ | normal | -| AccessorCalls.cs:38:9:38:12 | this access | AccessorCalls.cs:38:9:38:12 | this access | normal | -| AccessorCalls.cs:38:9:38:14 | access to field x | AccessorCalls.cs:38:9:38:14 | access to field x | normal | -| AccessorCalls.cs:38:9:38:19 | access to property Prop | AccessorCalls.cs:38:9:38:19 | access to property Prop | normal | -| AccessorCalls.cs:38:9:38:21 | ...++ | AccessorCalls.cs:38:9:38:21 | ...++ | normal | -| AccessorCalls.cs:38:9:38:22 | ...; | AccessorCalls.cs:38:9:38:21 | ...++ | normal | -| AccessorCalls.cs:39:9:39:12 | this access | AccessorCalls.cs:39:9:39:12 | this access | normal | -| AccessorCalls.cs:39:9:39:14 | access to field x | AccessorCalls.cs:39:9:39:14 | access to field x | normal | -| AccessorCalls.cs:39:9:39:17 | access to indexer | AccessorCalls.cs:39:9:39:17 | access to indexer | normal | -| AccessorCalls.cs:39:9:39:19 | ...++ | AccessorCalls.cs:39:9:39:19 | ...++ | normal | -| AccessorCalls.cs:39:9:39:20 | ...; | AccessorCalls.cs:39:9:39:19 | ...++ | normal | -| AccessorCalls.cs:39:16:39:16 | 0 | AccessorCalls.cs:39:16:39:16 | 0 | normal | -| AccessorCalls.cs:43:5:47:5 | {...} | AccessorCalls.cs:46:9:46:26 | ... = ... | normal | -| AccessorCalls.cs:44:9:44:12 | this access | AccessorCalls.cs:44:9:44:12 | this access | normal | -| AccessorCalls.cs:44:9:44:12 | this access | AccessorCalls.cs:44:9:44:12 | this access | normal | -| AccessorCalls.cs:44:9:44:18 | access to field Field | AccessorCalls.cs:44:9:44:12 | this access | normal | -| AccessorCalls.cs:44:9:44:18 | access to field Field | AccessorCalls.cs:44:9:44:18 | access to field Field | normal | -| AccessorCalls.cs:44:9:44:32 | ... + ... | AccessorCalls.cs:44:9:44:32 | ... + ... | normal | -| AccessorCalls.cs:44:9:44:32 | ... += ... | AccessorCalls.cs:44:9:44:32 | ... = ... | normal | -| AccessorCalls.cs:44:9:44:32 | ... = ... | AccessorCalls.cs:44:9:44:32 | ... = ... | normal | -| AccessorCalls.cs:44:9:44:33 | ...; | AccessorCalls.cs:44:9:44:32 | ... = ... | normal | -| AccessorCalls.cs:44:23:44:26 | this access | AccessorCalls.cs:44:23:44:26 | this access | normal | -| AccessorCalls.cs:44:23:44:32 | access to field Field | AccessorCalls.cs:44:23:44:32 | access to field Field | normal | -| AccessorCalls.cs:45:9:45:12 | this access | AccessorCalls.cs:45:9:45:12 | this access | normal | -| AccessorCalls.cs:45:9:45:12 | this access | AccessorCalls.cs:45:9:45:12 | this access | normal | -| AccessorCalls.cs:45:9:45:17 | access to property Prop | AccessorCalls.cs:45:9:45:12 | this access | normal | -| AccessorCalls.cs:45:9:45:17 | access to property Prop | AccessorCalls.cs:45:9:45:17 | access to property Prop | normal | -| AccessorCalls.cs:45:9:45:30 | ... + ... | AccessorCalls.cs:45:9:45:30 | ... + ... | normal | -| AccessorCalls.cs:45:9:45:30 | ... += ... | AccessorCalls.cs:45:9:45:30 | ... = ... | normal | -| AccessorCalls.cs:45:9:45:30 | ... = ... | AccessorCalls.cs:45:9:45:30 | ... = ... | normal | -| AccessorCalls.cs:45:9:45:31 | ...; | AccessorCalls.cs:45:9:45:30 | ... = ... | normal | -| AccessorCalls.cs:45:22:45:25 | this access | AccessorCalls.cs:45:22:45:25 | this access | normal | -| AccessorCalls.cs:45:22:45:30 | access to property Prop | AccessorCalls.cs:45:22:45:30 | access to property Prop | normal | -| AccessorCalls.cs:46:9:46:12 | this access | AccessorCalls.cs:46:9:46:12 | this access | normal | -| AccessorCalls.cs:46:9:46:12 | this access | AccessorCalls.cs:46:9:46:12 | this access | normal | -| AccessorCalls.cs:46:9:46:15 | access to indexer | AccessorCalls.cs:46:9:46:15 | access to indexer | normal | -| AccessorCalls.cs:46:9:46:15 | access to indexer | AccessorCalls.cs:46:14:46:14 | 0 | normal | -| AccessorCalls.cs:46:9:46:26 | ... + ... | AccessorCalls.cs:46:9:46:26 | ... + ... | normal | -| AccessorCalls.cs:46:9:46:26 | ... += ... | AccessorCalls.cs:46:9:46:26 | ... = ... | normal | -| AccessorCalls.cs:46:9:46:26 | ... = ... | AccessorCalls.cs:46:9:46:26 | ... = ... | normal | -| AccessorCalls.cs:46:9:46:27 | ...; | AccessorCalls.cs:46:9:46:26 | ... = ... | normal | -| AccessorCalls.cs:46:14:46:14 | 0 | AccessorCalls.cs:46:14:46:14 | 0 | normal | -| AccessorCalls.cs:46:14:46:14 | 0 | AccessorCalls.cs:46:14:46:14 | 0 | normal | -| AccessorCalls.cs:46:20:46:23 | this access | AccessorCalls.cs:46:20:46:23 | this access | normal | -| AccessorCalls.cs:46:20:46:26 | access to indexer | AccessorCalls.cs:46:20:46:26 | access to indexer | normal | -| AccessorCalls.cs:46:25:46:25 | 0 | AccessorCalls.cs:46:25:46:25 | 0 | normal | -| AccessorCalls.cs:50:5:54:5 | {...} | AccessorCalls.cs:53:9:53:30 | ... = ... | normal | -| AccessorCalls.cs:51:9:51:12 | this access | AccessorCalls.cs:51:9:51:12 | this access | normal | -| AccessorCalls.cs:51:9:51:12 | this access | AccessorCalls.cs:51:9:51:12 | this access | normal | -| AccessorCalls.cs:51:9:51:14 | access to field x | AccessorCalls.cs:51:9:51:14 | access to field x | normal | -| AccessorCalls.cs:51:9:51:14 | access to field x | AccessorCalls.cs:51:9:51:14 | access to field x | normal | -| AccessorCalls.cs:51:9:51:20 | access to field Field | AccessorCalls.cs:51:9:51:14 | access to field x | normal | -| AccessorCalls.cs:51:9:51:20 | access to field Field | AccessorCalls.cs:51:9:51:20 | access to field Field | normal | -| AccessorCalls.cs:51:9:51:36 | ... + ... | AccessorCalls.cs:51:9:51:36 | ... + ... | normal | -| AccessorCalls.cs:51:9:51:36 | ... += ... | AccessorCalls.cs:51:9:51:36 | ... = ... | normal | -| AccessorCalls.cs:51:9:51:36 | ... = ... | AccessorCalls.cs:51:9:51:36 | ... = ... | normal | -| AccessorCalls.cs:51:9:51:37 | ...; | AccessorCalls.cs:51:9:51:36 | ... = ... | normal | -| AccessorCalls.cs:51:25:51:28 | this access | AccessorCalls.cs:51:25:51:28 | this access | normal | -| AccessorCalls.cs:51:25:51:30 | access to field x | AccessorCalls.cs:51:25:51:30 | access to field x | normal | -| AccessorCalls.cs:51:25:51:36 | access to field Field | AccessorCalls.cs:51:25:51:36 | access to field Field | normal | -| AccessorCalls.cs:52:9:52:12 | this access | AccessorCalls.cs:52:9:52:12 | this access | normal | -| AccessorCalls.cs:52:9:52:12 | this access | AccessorCalls.cs:52:9:52:12 | this access | normal | -| AccessorCalls.cs:52:9:52:14 | access to field x | AccessorCalls.cs:52:9:52:14 | access to field x | normal | -| AccessorCalls.cs:52:9:52:14 | access to field x | AccessorCalls.cs:52:9:52:14 | access to field x | normal | -| AccessorCalls.cs:52:9:52:19 | access to property Prop | AccessorCalls.cs:52:9:52:14 | access to field x | normal | -| AccessorCalls.cs:52:9:52:19 | access to property Prop | AccessorCalls.cs:52:9:52:19 | access to property Prop | normal | -| AccessorCalls.cs:52:9:52:34 | ... + ... | AccessorCalls.cs:52:9:52:34 | ... + ... | normal | -| AccessorCalls.cs:52:9:52:34 | ... += ... | AccessorCalls.cs:52:9:52:34 | ... = ... | normal | -| AccessorCalls.cs:52:9:52:34 | ... = ... | AccessorCalls.cs:52:9:52:34 | ... = ... | normal | -| AccessorCalls.cs:52:9:52:35 | ...; | AccessorCalls.cs:52:9:52:34 | ... = ... | normal | -| AccessorCalls.cs:52:24:52:27 | this access | AccessorCalls.cs:52:24:52:27 | this access | normal | -| AccessorCalls.cs:52:24:52:29 | access to field x | AccessorCalls.cs:52:24:52:29 | access to field x | normal | -| AccessorCalls.cs:52:24:52:34 | access to property Prop | AccessorCalls.cs:52:24:52:34 | access to property Prop | normal | -| AccessorCalls.cs:53:9:53:12 | this access | AccessorCalls.cs:53:9:53:12 | this access | normal | -| AccessorCalls.cs:53:9:53:12 | this access | AccessorCalls.cs:53:9:53:12 | this access | normal | -| AccessorCalls.cs:53:9:53:14 | access to field x | AccessorCalls.cs:53:9:53:14 | access to field x | normal | -| AccessorCalls.cs:53:9:53:14 | access to field x | AccessorCalls.cs:53:9:53:14 | access to field x | normal | -| AccessorCalls.cs:53:9:53:17 | access to indexer | AccessorCalls.cs:53:9:53:17 | access to indexer | normal | -| AccessorCalls.cs:53:9:53:17 | access to indexer | AccessorCalls.cs:53:16:53:16 | 0 | normal | -| AccessorCalls.cs:53:9:53:30 | ... + ... | AccessorCalls.cs:53:9:53:30 | ... + ... | normal | -| AccessorCalls.cs:53:9:53:30 | ... += ... | AccessorCalls.cs:53:9:53:30 | ... = ... | normal | -| AccessorCalls.cs:53:9:53:30 | ... = ... | AccessorCalls.cs:53:9:53:30 | ... = ... | normal | -| AccessorCalls.cs:53:9:53:31 | ...; | AccessorCalls.cs:53:9:53:30 | ... = ... | normal | -| AccessorCalls.cs:53:16:53:16 | 0 | AccessorCalls.cs:53:16:53:16 | 0 | normal | -| AccessorCalls.cs:53:16:53:16 | 0 | AccessorCalls.cs:53:16:53:16 | 0 | normal | -| AccessorCalls.cs:53:22:53:25 | this access | AccessorCalls.cs:53:22:53:25 | this access | normal | -| AccessorCalls.cs:53:22:53:27 | access to field x | AccessorCalls.cs:53:22:53:27 | access to field x | normal | -| AccessorCalls.cs:53:22:53:30 | access to indexer | AccessorCalls.cs:53:22:53:30 | access to indexer | normal | -| AccessorCalls.cs:53:29:53:29 | 0 | AccessorCalls.cs:53:29:53:29 | 0 | normal | -| AccessorCalls.cs:57:5:59:5 | {...} | AccessorCalls.cs:58:9:58:85 | ... = ... | normal | -| AccessorCalls.cs:58:9:58:45 | (..., ...) | AccessorCalls.cs:58:9:58:45 | (..., ...) | normal | -| AccessorCalls.cs:58:9:58:85 | ... = ... | AccessorCalls.cs:58:9:58:85 | ... = ... | normal | -| AccessorCalls.cs:58:9:58:86 | ...; | AccessorCalls.cs:58:9:58:85 | ... = ... | normal | -| AccessorCalls.cs:58:10:58:13 | this access | AccessorCalls.cs:58:10:58:13 | this access | normal | -| AccessorCalls.cs:58:10:58:19 | access to field Field | AccessorCalls.cs:58:10:58:13 | this access | normal | -| AccessorCalls.cs:58:22:58:25 | this access | AccessorCalls.cs:58:22:58:25 | this access | normal | -| AccessorCalls.cs:58:22:58:30 | access to property Prop | AccessorCalls.cs:58:22:58:25 | this access | normal | -| AccessorCalls.cs:58:33:58:44 | (..., ...) | AccessorCalls.cs:58:33:58:44 | (..., ...) | normal | -| AccessorCalls.cs:58:37:58:40 | this access | AccessorCalls.cs:58:37:58:40 | this access | normal | -| AccessorCalls.cs:58:37:58:43 | access to indexer | AccessorCalls.cs:58:42:58:42 | 0 | normal | -| AccessorCalls.cs:58:42:58:42 | 0 | AccessorCalls.cs:58:42:58:42 | 0 | normal | -| AccessorCalls.cs:58:49:58:85 | (..., ...) | AccessorCalls.cs:58:49:58:85 | (..., ...) | normal | -| AccessorCalls.cs:58:50:58:53 | this access | AccessorCalls.cs:58:50:58:53 | this access | normal | -| AccessorCalls.cs:58:50:58:59 | access to field Field | AccessorCalls.cs:58:50:58:59 | access to field Field | normal | -| AccessorCalls.cs:58:62:58:65 | this access | AccessorCalls.cs:58:62:58:65 | this access | normal | -| AccessorCalls.cs:58:62:58:70 | access to property Prop | AccessorCalls.cs:58:62:58:70 | access to property Prop | normal | -| AccessorCalls.cs:58:73:58:84 | (..., ...) | AccessorCalls.cs:58:73:58:84 | (..., ...) | normal | -| AccessorCalls.cs:58:74:58:74 | 0 | AccessorCalls.cs:58:74:58:74 | 0 | normal | -| AccessorCalls.cs:58:77:58:80 | this access | AccessorCalls.cs:58:77:58:80 | this access | normal | -| AccessorCalls.cs:58:77:58:83 | access to indexer | AccessorCalls.cs:58:77:58:83 | access to indexer | normal | -| AccessorCalls.cs:58:82:58:82 | 1 | AccessorCalls.cs:58:82:58:82 | 1 | normal | -| AccessorCalls.cs:62:5:64:5 | {...} | AccessorCalls.cs:63:9:63:97 | ... = ... | normal | -| AccessorCalls.cs:63:9:63:51 | (..., ...) | AccessorCalls.cs:63:9:63:51 | (..., ...) | normal | -| AccessorCalls.cs:63:9:63:97 | ... = ... | AccessorCalls.cs:63:9:63:97 | ... = ... | normal | -| AccessorCalls.cs:63:9:63:98 | ...; | AccessorCalls.cs:63:9:63:97 | ... = ... | normal | -| AccessorCalls.cs:63:10:63:13 | this access | AccessorCalls.cs:63:10:63:13 | this access | normal | -| AccessorCalls.cs:63:10:63:15 | access to field x | AccessorCalls.cs:63:10:63:15 | access to field x | normal | -| AccessorCalls.cs:63:10:63:21 | access to field Field | AccessorCalls.cs:63:10:63:15 | access to field x | normal | -| AccessorCalls.cs:63:24:63:27 | this access | AccessorCalls.cs:63:24:63:27 | this access | normal | -| AccessorCalls.cs:63:24:63:29 | access to field x | AccessorCalls.cs:63:24:63:29 | access to field x | normal | -| AccessorCalls.cs:63:24:63:34 | access to property Prop | AccessorCalls.cs:63:24:63:29 | access to field x | normal | -| AccessorCalls.cs:63:37:63:50 | (..., ...) | AccessorCalls.cs:63:37:63:50 | (..., ...) | normal | -| AccessorCalls.cs:63:41:63:44 | this access | AccessorCalls.cs:63:41:63:44 | this access | normal | -| AccessorCalls.cs:63:41:63:46 | access to field x | AccessorCalls.cs:63:41:63:46 | access to field x | normal | -| AccessorCalls.cs:63:41:63:49 | access to indexer | AccessorCalls.cs:63:48:63:48 | 0 | normal | -| AccessorCalls.cs:63:48:63:48 | 0 | AccessorCalls.cs:63:48:63:48 | 0 | normal | -| AccessorCalls.cs:63:55:63:97 | (..., ...) | AccessorCalls.cs:63:55:63:97 | (..., ...) | normal | -| AccessorCalls.cs:63:56:63:59 | this access | AccessorCalls.cs:63:56:63:59 | this access | normal | -| AccessorCalls.cs:63:56:63:61 | access to field x | AccessorCalls.cs:63:56:63:61 | access to field x | normal | -| AccessorCalls.cs:63:56:63:67 | access to field Field | AccessorCalls.cs:63:56:63:67 | access to field Field | normal | -| AccessorCalls.cs:63:70:63:73 | this access | AccessorCalls.cs:63:70:63:73 | this access | normal | -| AccessorCalls.cs:63:70:63:75 | access to field x | AccessorCalls.cs:63:70:63:75 | access to field x | normal | -| AccessorCalls.cs:63:70:63:80 | access to property Prop | AccessorCalls.cs:63:70:63:80 | access to property Prop | normal | -| AccessorCalls.cs:63:83:63:96 | (..., ...) | AccessorCalls.cs:63:83:63:96 | (..., ...) | normal | -| AccessorCalls.cs:63:84:63:84 | 0 | AccessorCalls.cs:63:84:63:84 | 0 | normal | -| AccessorCalls.cs:63:87:63:90 | this access | AccessorCalls.cs:63:87:63:90 | this access | normal | -| AccessorCalls.cs:63:87:63:92 | access to field x | AccessorCalls.cs:63:87:63:92 | access to field x | normal | -| AccessorCalls.cs:63:87:63:95 | access to indexer | AccessorCalls.cs:63:87:63:95 | access to indexer | normal | -| AccessorCalls.cs:63:94:63:94 | 1 | AccessorCalls.cs:63:94:63:94 | 1 | normal | -| AccessorCalls.cs:67:5:74:5 | {...} | AccessorCalls.cs:73:9:73:83 | ... = ... | normal | -| AccessorCalls.cs:68:9:68:22 | ... ...; | AccessorCalls.cs:68:17:68:21 | dynamic d = ... | normal | -| AccessorCalls.cs:68:17:68:21 | dynamic d = ... | AccessorCalls.cs:68:17:68:21 | dynamic d = ... | normal | -| AccessorCalls.cs:68:21:68:21 | access to parameter o | AccessorCalls.cs:68:21:68:21 | access to parameter o | normal | -| AccessorCalls.cs:69:9:69:9 | access to local variable d | AccessorCalls.cs:69:9:69:9 | access to local variable d | normal | -| AccessorCalls.cs:69:9:69:20 | dynamic access to member MaybeProp1 | AccessorCalls.cs:69:9:69:9 | access to local variable d | normal | -| AccessorCalls.cs:69:9:69:35 | ... = ... | AccessorCalls.cs:69:9:69:35 | ... = ... | normal | -| AccessorCalls.cs:69:9:69:36 | ...; | AccessorCalls.cs:69:9:69:35 | ... = ... | normal | -| AccessorCalls.cs:69:24:69:24 | access to local variable d | AccessorCalls.cs:69:24:69:24 | access to local variable d | normal | -| AccessorCalls.cs:69:24:69:35 | dynamic access to member MaybeProp2 | AccessorCalls.cs:69:24:69:35 | dynamic access to member MaybeProp2 | normal | -| AccessorCalls.cs:70:9:70:9 | access to local variable d | AccessorCalls.cs:70:9:70:9 | access to local variable d | normal | -| AccessorCalls.cs:70:9:70:19 | dynamic access to member MaybeProp | AccessorCalls.cs:70:9:70:19 | dynamic access to member MaybeProp | normal | -| AccessorCalls.cs:70:9:70:21 | dynamic call to operator ++ | AccessorCalls.cs:70:9:70:21 | dynamic call to operator ++ | normal | -| AccessorCalls.cs:70:9:70:22 | ...; | AccessorCalls.cs:70:9:70:21 | dynamic call to operator ++ | normal | -| AccessorCalls.cs:71:9:71:9 | access to local variable d | AccessorCalls.cs:71:9:71:9 | access to local variable d | normal | -| AccessorCalls.cs:71:9:71:9 | access to local variable d | AccessorCalls.cs:71:9:71:9 | access to local variable d | normal | -| AccessorCalls.cs:71:9:71:20 | dynamic access to member MaybeEvent | AccessorCalls.cs:71:9:71:9 | access to local variable d | normal | -| AccessorCalls.cs:71:9:71:20 | dynamic access to member MaybeEvent | AccessorCalls.cs:71:9:71:20 | dynamic access to member MaybeEvent | normal | -| AccessorCalls.cs:71:9:71:25 | ... += ... | AccessorCalls.cs:71:9:71:25 | ... = ... | normal | -| AccessorCalls.cs:71:9:71:25 | ... = ... | AccessorCalls.cs:71:9:71:25 | ... = ... | normal | -| AccessorCalls.cs:71:9:71:25 | dynamic call to operator + | AccessorCalls.cs:71:9:71:25 | dynamic call to operator + | normal | -| AccessorCalls.cs:71:9:71:26 | ...; | AccessorCalls.cs:71:9:71:25 | ... = ... | normal | -| AccessorCalls.cs:71:25:71:25 | access to parameter e | AccessorCalls.cs:71:25:71:25 | access to parameter e | normal | -| AccessorCalls.cs:72:9:72:9 | access to local variable d | AccessorCalls.cs:72:9:72:9 | access to local variable d | normal | -| AccessorCalls.cs:72:9:72:9 | access to local variable d | AccessorCalls.cs:72:9:72:9 | access to local variable d | normal | -| AccessorCalls.cs:72:9:72:12 | dynamic access to element | AccessorCalls.cs:72:9:72:12 | dynamic access to element | normal | -| AccessorCalls.cs:72:9:72:12 | dynamic access to element | AccessorCalls.cs:72:11:72:11 | 0 | normal | -| AccessorCalls.cs:72:9:72:20 | ... += ... | AccessorCalls.cs:72:9:72:20 | ... = ... | normal | -| AccessorCalls.cs:72:9:72:20 | ... = ... | AccessorCalls.cs:72:9:72:20 | ... = ... | normal | -| AccessorCalls.cs:72:9:72:20 | dynamic call to operator + | AccessorCalls.cs:72:9:72:20 | dynamic call to operator + | normal | -| AccessorCalls.cs:72:9:72:21 | ...; | AccessorCalls.cs:72:9:72:20 | ... = ... | normal | -| AccessorCalls.cs:72:11:72:11 | 0 | AccessorCalls.cs:72:11:72:11 | 0 | normal | -| AccessorCalls.cs:72:11:72:11 | 0 | AccessorCalls.cs:72:11:72:11 | 0 | normal | -| AccessorCalls.cs:72:17:72:17 | access to local variable d | AccessorCalls.cs:72:17:72:17 | access to local variable d | normal | -| AccessorCalls.cs:72:17:72:20 | dynamic access to element | AccessorCalls.cs:72:17:72:20 | dynamic access to element | normal | -| AccessorCalls.cs:72:19:72:19 | 1 | AccessorCalls.cs:72:19:72:19 | 1 | normal | -| AccessorCalls.cs:73:9:73:44 | (..., ...) | AccessorCalls.cs:73:9:73:44 | (..., ...) | normal | -| AccessorCalls.cs:73:9:73:83 | ... = ... | AccessorCalls.cs:73:9:73:83 | ... = ... | normal | -| AccessorCalls.cs:73:9:73:84 | ...; | AccessorCalls.cs:73:9:73:83 | ... = ... | normal | -| AccessorCalls.cs:73:10:73:10 | access to local variable d | AccessorCalls.cs:73:10:73:10 | access to local variable d | normal | -| AccessorCalls.cs:73:10:73:21 | dynamic access to member MaybeProp1 | AccessorCalls.cs:73:10:73:10 | access to local variable d | normal | -| AccessorCalls.cs:73:24:73:27 | this access | AccessorCalls.cs:73:24:73:27 | this access | normal | -| AccessorCalls.cs:73:24:73:32 | access to property Prop | AccessorCalls.cs:73:24:73:27 | this access | normal | -| AccessorCalls.cs:73:35:73:43 | (..., ...) | AccessorCalls.cs:73:35:73:43 | (..., ...) | normal | -| AccessorCalls.cs:73:39:73:39 | access to local variable d | AccessorCalls.cs:73:39:73:39 | access to local variable d | normal | -| AccessorCalls.cs:73:39:73:42 | dynamic access to element | AccessorCalls.cs:73:41:73:41 | 0 | normal | -| AccessorCalls.cs:73:41:73:41 | 0 | AccessorCalls.cs:73:41:73:41 | 0 | normal | -| AccessorCalls.cs:73:48:73:83 | (..., ...) | AccessorCalls.cs:73:48:73:83 | (..., ...) | normal | -| AccessorCalls.cs:73:49:73:49 | access to local variable d | AccessorCalls.cs:73:49:73:49 | access to local variable d | normal | -| AccessorCalls.cs:73:49:73:60 | dynamic access to member MaybeProp1 | AccessorCalls.cs:73:49:73:60 | dynamic access to member MaybeProp1 | normal | -| AccessorCalls.cs:73:63:73:66 | this access | AccessorCalls.cs:73:63:73:66 | this access | normal | -| AccessorCalls.cs:73:63:73:71 | access to property Prop | AccessorCalls.cs:73:63:73:71 | access to property Prop | normal | -| AccessorCalls.cs:73:74:73:82 | (..., ...) | AccessorCalls.cs:73:74:73:82 | (..., ...) | normal | -| AccessorCalls.cs:73:75:73:75 | 0 | AccessorCalls.cs:73:75:73:75 | 0 | normal | -| AccessorCalls.cs:73:78:73:78 | access to local variable d | AccessorCalls.cs:73:78:73:78 | access to local variable d | normal | -| AccessorCalls.cs:73:78:73:81 | dynamic access to element | AccessorCalls.cs:73:78:73:81 | dynamic access to element | normal | -| AccessorCalls.cs:73:80:73:80 | 1 | AccessorCalls.cs:73:80:73:80 | 1 | normal | -| ArrayCreation.cs:1:7:1:19 | call to constructor Object | ArrayCreation.cs:1:7:1:19 | call to constructor Object | normal | -| ArrayCreation.cs:1:7:1:19 | call to method | ArrayCreation.cs:1:7:1:19 | call to method | normal | -| ArrayCreation.cs:1:7:1:19 | this access | ArrayCreation.cs:1:7:1:19 | this access | normal | -| ArrayCreation.cs:1:7:1:19 | {...} | ArrayCreation.cs:1:7:1:19 | {...} | normal | -| ArrayCreation.cs:3:19:3:28 | array creation of type Int32[] | ArrayCreation.cs:3:19:3:28 | array creation of type Int32[] | normal | -| ArrayCreation.cs:3:27:3:27 | 0 | ArrayCreation.cs:3:27:3:27 | 0 | normal | -| ArrayCreation.cs:5:20:5:32 | array creation of type Int32[,] | ArrayCreation.cs:5:20:5:32 | array creation of type Int32[,] | normal | -| ArrayCreation.cs:5:28:5:28 | 0 | ArrayCreation.cs:5:28:5:28 | 0 | normal | -| ArrayCreation.cs:5:31:5:31 | 1 | ArrayCreation.cs:5:31:5:31 | 1 | normal | -| ArrayCreation.cs:7:19:7:36 | 2 | ArrayCreation.cs:7:19:7:36 | 2 | normal | -| ArrayCreation.cs:7:19:7:36 | array creation of type Int32[] | ArrayCreation.cs:7:29:7:36 | { ..., ... } | normal | -| ArrayCreation.cs:7:29:7:36 | { ..., ... } | ArrayCreation.cs:7:29:7:36 | { ..., ... } | normal | -| ArrayCreation.cs:7:31:7:31 | 0 | ArrayCreation.cs:7:31:7:31 | 0 | normal | -| ArrayCreation.cs:7:34:7:34 | 1 | ArrayCreation.cs:7:34:7:34 | 1 | normal | -| ArrayCreation.cs:9:20:9:52 | 2 | ArrayCreation.cs:9:20:9:52 | 2 | normal | -| ArrayCreation.cs:9:20:9:52 | 2 | ArrayCreation.cs:9:20:9:52 | 2 | normal | -| ArrayCreation.cs:9:20:9:52 | array creation of type Int32[,] | ArrayCreation.cs:9:31:9:52 | { ..., ... } | normal | -| ArrayCreation.cs:9:31:9:52 | { ..., ... } | ArrayCreation.cs:9:31:9:52 | { ..., ... } | normal | -| ArrayCreation.cs:9:33:9:40 | { ..., ... } | ArrayCreation.cs:9:33:9:40 | { ..., ... } | normal | -| ArrayCreation.cs:9:35:9:35 | 0 | ArrayCreation.cs:9:35:9:35 | 0 | normal | -| ArrayCreation.cs:9:38:9:38 | 1 | ArrayCreation.cs:9:38:9:38 | 1 | normal | -| ArrayCreation.cs:9:43:9:50 | { ..., ... } | ArrayCreation.cs:9:43:9:50 | { ..., ... } | normal | -| ArrayCreation.cs:9:45:9:45 | 2 | ArrayCreation.cs:9:45:9:45 | 2 | normal | -| ArrayCreation.cs:9:48:9:48 | 3 | ArrayCreation.cs:9:48:9:48 | 3 | normal | -| Assert.cs:5:7:5:17 | call to constructor Object | Assert.cs:5:7:5:17 | call to constructor Object | normal | -| Assert.cs:5:7:5:17 | call to method | Assert.cs:5:7:5:17 | call to method | normal | -| Assert.cs:5:7:5:17 | this access | Assert.cs:5:7:5:17 | this access | normal | -| Assert.cs:5:7:5:17 | {...} | Assert.cs:5:7:5:17 | {...} | normal | -| Assert.cs:8:5:12:5 | {...} | Assert.cs:10:9:10:31 | call to method Assert | exit | -| Assert.cs:8:5:12:5 | {...} | Assert.cs:11:9:11:35 | call to method WriteLine | normal | -| Assert.cs:9:9:9:33 | ... ...; | Assert.cs:9:16:9:32 | String s = ... | normal | -| Assert.cs:9:16:9:32 | String s = ... | Assert.cs:9:16:9:32 | String s = ... | normal | -| Assert.cs:9:20:9:20 | access to parameter b | Assert.cs:9:20:9:20 | access to parameter b | false | -| Assert.cs:9:20:9:20 | access to parameter b | Assert.cs:9:20:9:20 | access to parameter b | true | -| Assert.cs:9:20:9:32 | ... ? ... : ... | Assert.cs:9:20:9:32 | ... ? ... : ... | normal | -| Assert.cs:9:24:9:27 | null | Assert.cs:9:24:9:27 | null | normal | -| Assert.cs:9:31:9:32 | "" | Assert.cs:9:31:9:32 | "" | normal | -| Assert.cs:10:9:10:31 | call to method Assert | Assert.cs:10:9:10:31 | call to method Assert | exit | -| Assert.cs:10:9:10:31 | call to method Assert | Assert.cs:10:9:10:31 | call to method Assert | normal | -| Assert.cs:10:9:10:32 | ...; | Assert.cs:10:9:10:31 | call to method Assert | exit | -| Assert.cs:10:9:10:32 | ...; | Assert.cs:10:9:10:31 | call to method Assert | normal | -| Assert.cs:10:22:10:22 | access to local variable s | Assert.cs:10:22:10:22 | access to local variable s | normal | -| Assert.cs:10:22:10:30 | ... != ... | Assert.cs:10:22:10:30 | ... != ... | normal | -| Assert.cs:10:27:10:30 | null | Assert.cs:10:27:10:30 | null | normal | -| Assert.cs:11:9:11:35 | call to method WriteLine | Assert.cs:11:9:11:35 | call to method WriteLine | normal | -| Assert.cs:11:9:11:36 | ...; | Assert.cs:11:9:11:35 | call to method WriteLine | normal | -| Assert.cs:11:27:11:27 | access to local variable s | Assert.cs:11:27:11:27 | access to local variable s | normal | -| Assert.cs:11:27:11:34 | access to property Length | Assert.cs:11:27:11:34 | access to property Length | normal | -| Assert.cs:15:5:19:5 | {...} | Assert.cs:17:9:17:24 | call to method IsNull | throw(AssertFailedException) | -| Assert.cs:15:5:19:5 | {...} | Assert.cs:18:9:18:35 | call to method WriteLine | normal | -| Assert.cs:16:9:16:33 | ... ...; | Assert.cs:16:16:16:32 | String s = ... | normal | -| Assert.cs:16:16:16:32 | String s = ... | Assert.cs:16:16:16:32 | String s = ... | normal | -| Assert.cs:16:20:16:20 | access to parameter b | Assert.cs:16:20:16:20 | access to parameter b | false | -| Assert.cs:16:20:16:20 | access to parameter b | Assert.cs:16:20:16:20 | access to parameter b | true | -| Assert.cs:16:20:16:32 | ... ? ... : ... | Assert.cs:16:20:16:32 | ... ? ... : ... | normal | -| Assert.cs:16:24:16:27 | null | Assert.cs:16:24:16:27 | null | normal | -| Assert.cs:16:31:16:32 | "" | Assert.cs:16:31:16:32 | "" | normal | -| Assert.cs:17:9:17:24 | call to method IsNull | Assert.cs:17:9:17:24 | call to method IsNull | normal | -| Assert.cs:17:9:17:24 | call to method IsNull | Assert.cs:17:9:17:24 | call to method IsNull | throw(AssertFailedException) | -| Assert.cs:17:9:17:25 | ...; | Assert.cs:17:9:17:24 | call to method IsNull | normal | -| Assert.cs:17:9:17:25 | ...; | Assert.cs:17:9:17:24 | call to method IsNull | throw(AssertFailedException) | -| Assert.cs:17:23:17:23 | access to local variable s | Assert.cs:17:23:17:23 | access to local variable s | normal | -| Assert.cs:18:9:18:35 | call to method WriteLine | Assert.cs:18:9:18:35 | call to method WriteLine | normal | -| Assert.cs:18:9:18:36 | ...; | Assert.cs:18:9:18:35 | call to method WriteLine | normal | -| Assert.cs:18:27:18:27 | access to local variable s | Assert.cs:18:27:18:27 | access to local variable s | normal | -| Assert.cs:18:27:18:34 | access to property Length | Assert.cs:18:27:18:34 | access to property Length | normal | -| Assert.cs:22:5:26:5 | {...} | Assert.cs:24:9:24:27 | call to method IsNotNull | throw(AssertFailedException) | -| Assert.cs:22:5:26:5 | {...} | Assert.cs:25:9:25:35 | call to method WriteLine | normal | -| Assert.cs:23:9:23:33 | ... ...; | Assert.cs:23:16:23:32 | String s = ... | normal | -| Assert.cs:23:16:23:32 | String s = ... | Assert.cs:23:16:23:32 | String s = ... | normal | -| Assert.cs:23:20:23:20 | access to parameter b | Assert.cs:23:20:23:20 | access to parameter b | false | -| Assert.cs:23:20:23:20 | access to parameter b | Assert.cs:23:20:23:20 | access to parameter b | true | -| Assert.cs:23:20:23:32 | ... ? ... : ... | Assert.cs:23:20:23:32 | ... ? ... : ... | normal | -| Assert.cs:23:24:23:27 | null | Assert.cs:23:24:23:27 | null | normal | -| Assert.cs:23:31:23:32 | "" | Assert.cs:23:31:23:32 | "" | normal | -| Assert.cs:24:9:24:27 | call to method IsNotNull | Assert.cs:24:9:24:27 | call to method IsNotNull | normal | -| Assert.cs:24:9:24:27 | call to method IsNotNull | Assert.cs:24:9:24:27 | call to method IsNotNull | throw(AssertFailedException) | -| Assert.cs:24:9:24:28 | ...; | Assert.cs:24:9:24:27 | call to method IsNotNull | normal | -| Assert.cs:24:9:24:28 | ...; | Assert.cs:24:9:24:27 | call to method IsNotNull | throw(AssertFailedException) | -| Assert.cs:24:26:24:26 | access to local variable s | Assert.cs:24:26:24:26 | access to local variable s | normal | -| Assert.cs:25:9:25:35 | call to method WriteLine | Assert.cs:25:9:25:35 | call to method WriteLine | normal | -| Assert.cs:25:9:25:36 | ...; | Assert.cs:25:9:25:35 | call to method WriteLine | normal | -| Assert.cs:25:27:25:27 | access to local variable s | Assert.cs:25:27:25:27 | access to local variable s | normal | -| Assert.cs:25:27:25:34 | access to property Length | Assert.cs:25:27:25:34 | access to property Length | normal | -| Assert.cs:29:5:33:5 | {...} | Assert.cs:31:9:31:32 | call to method IsTrue | throw(AssertFailedException) | -| Assert.cs:29:5:33:5 | {...} | Assert.cs:32:9:32:35 | call to method WriteLine | normal | -| Assert.cs:30:9:30:33 | ... ...; | Assert.cs:30:16:30:32 | String s = ... | normal | -| Assert.cs:30:16:30:32 | String s = ... | Assert.cs:30:16:30:32 | String s = ... | normal | -| Assert.cs:30:20:30:20 | access to parameter b | Assert.cs:30:20:30:20 | access to parameter b | false | -| Assert.cs:30:20:30:20 | access to parameter b | Assert.cs:30:20:30:20 | access to parameter b | true | -| Assert.cs:30:20:30:32 | ... ? ... : ... | Assert.cs:30:20:30:32 | ... ? ... : ... | normal | -| Assert.cs:30:24:30:27 | null | Assert.cs:30:24:30:27 | null | normal | -| Assert.cs:30:31:30:32 | "" | Assert.cs:30:31:30:32 | "" | normal | -| Assert.cs:31:9:31:32 | call to method IsTrue | Assert.cs:31:9:31:32 | call to method IsTrue | normal | -| Assert.cs:31:9:31:32 | call to method IsTrue | Assert.cs:31:9:31:32 | call to method IsTrue | throw(AssertFailedException) | -| Assert.cs:31:9:31:33 | ...; | Assert.cs:31:9:31:32 | call to method IsTrue | normal | -| Assert.cs:31:9:31:33 | ...; | Assert.cs:31:9:31:32 | call to method IsTrue | throw(AssertFailedException) | -| Assert.cs:31:23:31:23 | access to local variable s | Assert.cs:31:23:31:23 | access to local variable s | normal | -| Assert.cs:31:23:31:31 | ... == ... | Assert.cs:31:23:31:31 | ... == ... | normal | -| Assert.cs:31:28:31:31 | null | Assert.cs:31:28:31:31 | null | normal | -| Assert.cs:32:9:32:35 | call to method WriteLine | Assert.cs:32:9:32:35 | call to method WriteLine | normal | -| Assert.cs:32:9:32:36 | ...; | Assert.cs:32:9:32:35 | call to method WriteLine | normal | -| Assert.cs:32:27:32:27 | access to local variable s | Assert.cs:32:27:32:27 | access to local variable s | normal | -| Assert.cs:32:27:32:34 | access to property Length | Assert.cs:32:27:32:34 | access to property Length | normal | -| Assert.cs:36:5:40:5 | {...} | Assert.cs:38:9:38:32 | call to method IsTrue | throw(AssertFailedException) | -| Assert.cs:36:5:40:5 | {...} | Assert.cs:39:9:39:35 | call to method WriteLine | normal | -| Assert.cs:37:9:37:33 | ... ...; | Assert.cs:37:16:37:32 | String s = ... | normal | -| Assert.cs:37:16:37:32 | String s = ... | Assert.cs:37:16:37:32 | String s = ... | normal | -| Assert.cs:37:20:37:20 | access to parameter b | Assert.cs:37:20:37:20 | access to parameter b | false | -| Assert.cs:37:20:37:20 | access to parameter b | Assert.cs:37:20:37:20 | access to parameter b | true | -| Assert.cs:37:20:37:32 | ... ? ... : ... | Assert.cs:37:20:37:32 | ... ? ... : ... | normal | -| Assert.cs:37:24:37:27 | null | Assert.cs:37:24:37:27 | null | normal | -| Assert.cs:37:31:37:32 | "" | Assert.cs:37:31:37:32 | "" | normal | -| Assert.cs:38:9:38:32 | call to method IsTrue | Assert.cs:38:9:38:32 | call to method IsTrue | normal | -| Assert.cs:38:9:38:32 | call to method IsTrue | Assert.cs:38:9:38:32 | call to method IsTrue | throw(AssertFailedException) | -| Assert.cs:38:9:38:33 | ...; | Assert.cs:38:9:38:32 | call to method IsTrue | normal | -| Assert.cs:38:9:38:33 | ...; | Assert.cs:38:9:38:32 | call to method IsTrue | throw(AssertFailedException) | -| Assert.cs:38:23:38:23 | access to local variable s | Assert.cs:38:23:38:23 | access to local variable s | normal | -| Assert.cs:38:23:38:31 | ... != ... | Assert.cs:38:23:38:31 | ... != ... | normal | -| Assert.cs:38:28:38:31 | null | Assert.cs:38:28:38:31 | null | normal | -| Assert.cs:39:9:39:35 | call to method WriteLine | Assert.cs:39:9:39:35 | call to method WriteLine | normal | -| Assert.cs:39:9:39:36 | ...; | Assert.cs:39:9:39:35 | call to method WriteLine | normal | -| Assert.cs:39:27:39:27 | access to local variable s | Assert.cs:39:27:39:27 | access to local variable s | normal | -| Assert.cs:39:27:39:34 | access to property Length | Assert.cs:39:27:39:34 | access to property Length | normal | -| Assert.cs:43:5:47:5 | {...} | Assert.cs:45:9:45:33 | call to method IsFalse | throw(AssertFailedException) | -| Assert.cs:43:5:47:5 | {...} | Assert.cs:46:9:46:35 | call to method WriteLine | normal | -| Assert.cs:44:9:44:33 | ... ...; | Assert.cs:44:16:44:32 | String s = ... | normal | -| Assert.cs:44:16:44:32 | String s = ... | Assert.cs:44:16:44:32 | String s = ... | normal | -| Assert.cs:44:20:44:20 | access to parameter b | Assert.cs:44:20:44:20 | access to parameter b | false | -| Assert.cs:44:20:44:20 | access to parameter b | Assert.cs:44:20:44:20 | access to parameter b | true | -| Assert.cs:44:20:44:32 | ... ? ... : ... | Assert.cs:44:20:44:32 | ... ? ... : ... | normal | -| Assert.cs:44:24:44:27 | null | Assert.cs:44:24:44:27 | null | normal | -| Assert.cs:44:31:44:32 | "" | Assert.cs:44:31:44:32 | "" | normal | -| Assert.cs:45:9:45:33 | call to method IsFalse | Assert.cs:45:9:45:33 | call to method IsFalse | normal | -| Assert.cs:45:9:45:33 | call to method IsFalse | Assert.cs:45:9:45:33 | call to method IsFalse | throw(AssertFailedException) | -| Assert.cs:45:9:45:34 | ...; | Assert.cs:45:9:45:33 | call to method IsFalse | normal | -| Assert.cs:45:9:45:34 | ...; | Assert.cs:45:9:45:33 | call to method IsFalse | throw(AssertFailedException) | -| Assert.cs:45:24:45:24 | access to local variable s | Assert.cs:45:24:45:24 | access to local variable s | normal | -| Assert.cs:45:24:45:32 | ... != ... | Assert.cs:45:24:45:32 | ... != ... | normal | -| Assert.cs:45:29:45:32 | null | Assert.cs:45:29:45:32 | null | normal | -| Assert.cs:46:9:46:35 | call to method WriteLine | Assert.cs:46:9:46:35 | call to method WriteLine | normal | -| Assert.cs:46:9:46:36 | ...; | Assert.cs:46:9:46:35 | call to method WriteLine | normal | -| Assert.cs:46:27:46:27 | access to local variable s | Assert.cs:46:27:46:27 | access to local variable s | normal | -| Assert.cs:46:27:46:34 | access to property Length | Assert.cs:46:27:46:34 | access to property Length | normal | -| Assert.cs:50:5:54:5 | {...} | Assert.cs:52:9:52:33 | call to method IsFalse | throw(AssertFailedException) | -| Assert.cs:50:5:54:5 | {...} | Assert.cs:53:9:53:35 | call to method WriteLine | normal | -| Assert.cs:51:9:51:33 | ... ...; | Assert.cs:51:16:51:32 | String s = ... | normal | -| Assert.cs:51:16:51:32 | String s = ... | Assert.cs:51:16:51:32 | String s = ... | normal | -| Assert.cs:51:20:51:20 | access to parameter b | Assert.cs:51:20:51:20 | access to parameter b | false | -| Assert.cs:51:20:51:20 | access to parameter b | Assert.cs:51:20:51:20 | access to parameter b | true | -| Assert.cs:51:20:51:32 | ... ? ... : ... | Assert.cs:51:20:51:32 | ... ? ... : ... | normal | -| Assert.cs:51:24:51:27 | null | Assert.cs:51:24:51:27 | null | normal | -| Assert.cs:51:31:51:32 | "" | Assert.cs:51:31:51:32 | "" | normal | -| Assert.cs:52:9:52:33 | call to method IsFalse | Assert.cs:52:9:52:33 | call to method IsFalse | normal | -| Assert.cs:52:9:52:33 | call to method IsFalse | Assert.cs:52:9:52:33 | call to method IsFalse | throw(AssertFailedException) | -| Assert.cs:52:9:52:34 | ...; | Assert.cs:52:9:52:33 | call to method IsFalse | normal | -| Assert.cs:52:9:52:34 | ...; | Assert.cs:52:9:52:33 | call to method IsFalse | throw(AssertFailedException) | -| Assert.cs:52:24:52:24 | access to local variable s | Assert.cs:52:24:52:24 | access to local variable s | normal | -| Assert.cs:52:24:52:32 | ... == ... | Assert.cs:52:24:52:32 | ... == ... | normal | -| Assert.cs:52:29:52:32 | null | Assert.cs:52:29:52:32 | null | normal | -| Assert.cs:53:9:53:35 | call to method WriteLine | Assert.cs:53:9:53:35 | call to method WriteLine | normal | -| Assert.cs:53:9:53:36 | ...; | Assert.cs:53:9:53:35 | call to method WriteLine | normal | -| Assert.cs:53:27:53:27 | access to local variable s | Assert.cs:53:27:53:27 | access to local variable s | normal | -| Assert.cs:53:27:53:34 | access to property Length | Assert.cs:53:27:53:34 | access to property Length | normal | -| Assert.cs:57:5:61:5 | {...} | Assert.cs:59:9:59:37 | call to method IsTrue | throw(AssertFailedException) | -| Assert.cs:57:5:61:5 | {...} | Assert.cs:60:9:60:35 | call to method WriteLine | normal | -| Assert.cs:58:9:58:33 | ... ...; | Assert.cs:58:16:58:32 | String s = ... | normal | -| Assert.cs:58:16:58:32 | String s = ... | Assert.cs:58:16:58:32 | String s = ... | normal | -| Assert.cs:58:20:58:20 | access to parameter b | Assert.cs:58:20:58:20 | access to parameter b | false | -| Assert.cs:58:20:58:20 | access to parameter b | Assert.cs:58:20:58:20 | access to parameter b | true | -| Assert.cs:58:20:58:32 | ... ? ... : ... | Assert.cs:58:20:58:32 | ... ? ... : ... | normal | -| Assert.cs:58:24:58:27 | null | Assert.cs:58:24:58:27 | null | normal | -| Assert.cs:58:31:58:32 | "" | Assert.cs:58:31:58:32 | "" | normal | -| Assert.cs:59:9:59:37 | call to method IsTrue | Assert.cs:59:9:59:37 | call to method IsTrue | normal | -| Assert.cs:59:9:59:37 | call to method IsTrue | Assert.cs:59:9:59:37 | call to method IsTrue | throw(AssertFailedException) | -| Assert.cs:59:9:59:38 | ...; | Assert.cs:59:9:59:37 | call to method IsTrue | normal | -| Assert.cs:59:9:59:38 | ...; | Assert.cs:59:9:59:37 | call to method IsTrue | throw(AssertFailedException) | -| Assert.cs:59:23:59:23 | access to local variable s | Assert.cs:59:23:59:23 | access to local variable s | normal | -| Assert.cs:59:23:59:31 | ... != ... | Assert.cs:59:23:59:31 | ... != ... | false | -| Assert.cs:59:23:59:31 | ... != ... | Assert.cs:59:23:59:31 | ... != ... | true | -| Assert.cs:59:23:59:36 | ... && ... | Assert.cs:59:23:59:36 | ... && ... | normal | -| Assert.cs:59:28:59:31 | null | Assert.cs:59:28:59:31 | null | normal | -| Assert.cs:59:36:59:36 | access to parameter b | Assert.cs:59:36:59:36 | access to parameter b | normal | -| Assert.cs:60:9:60:35 | call to method WriteLine | Assert.cs:60:9:60:35 | call to method WriteLine | normal | -| Assert.cs:60:9:60:36 | ...; | Assert.cs:60:9:60:35 | call to method WriteLine | normal | -| Assert.cs:60:27:60:27 | access to local variable s | Assert.cs:60:27:60:27 | access to local variable s | normal | -| Assert.cs:60:27:60:34 | access to property Length | Assert.cs:60:27:60:34 | access to property Length | normal | -| Assert.cs:64:5:68:5 | {...} | Assert.cs:66:9:66:38 | call to method IsFalse | throw(AssertFailedException) | -| Assert.cs:64:5:68:5 | {...} | Assert.cs:67:9:67:35 | call to method WriteLine | normal | -| Assert.cs:65:9:65:33 | ... ...; | Assert.cs:65:16:65:32 | String s = ... | normal | -| Assert.cs:65:16:65:32 | String s = ... | Assert.cs:65:16:65:32 | String s = ... | normal | -| Assert.cs:65:20:65:20 | access to parameter b | Assert.cs:65:20:65:20 | access to parameter b | false | -| Assert.cs:65:20:65:20 | access to parameter b | Assert.cs:65:20:65:20 | access to parameter b | true | -| Assert.cs:65:20:65:32 | ... ? ... : ... | Assert.cs:65:20:65:32 | ... ? ... : ... | normal | -| Assert.cs:65:24:65:27 | null | Assert.cs:65:24:65:27 | null | normal | -| Assert.cs:65:31:65:32 | "" | Assert.cs:65:31:65:32 | "" | normal | -| Assert.cs:66:9:66:38 | call to method IsFalse | Assert.cs:66:9:66:38 | call to method IsFalse | normal | -| Assert.cs:66:9:66:38 | call to method IsFalse | Assert.cs:66:9:66:38 | call to method IsFalse | throw(AssertFailedException) | -| Assert.cs:66:9:66:39 | ...; | Assert.cs:66:9:66:38 | call to method IsFalse | normal | -| Assert.cs:66:9:66:39 | ...; | Assert.cs:66:9:66:38 | call to method IsFalse | throw(AssertFailedException) | -| Assert.cs:66:24:66:24 | access to local variable s | Assert.cs:66:24:66:24 | access to local variable s | normal | -| Assert.cs:66:24:66:32 | ... == ... | Assert.cs:66:24:66:32 | ... == ... | false | -| Assert.cs:66:24:66:32 | ... == ... | Assert.cs:66:24:66:32 | ... == ... | true | -| Assert.cs:66:24:66:37 | ... \|\| ... | Assert.cs:66:24:66:37 | ... \|\| ... | normal | -| Assert.cs:66:29:66:32 | null | Assert.cs:66:29:66:32 | null | normal | -| Assert.cs:66:37:66:37 | access to parameter b | Assert.cs:66:37:66:37 | access to parameter b | normal | -| Assert.cs:67:9:67:35 | call to method WriteLine | Assert.cs:67:9:67:35 | call to method WriteLine | normal | -| Assert.cs:67:9:67:36 | ...; | Assert.cs:67:9:67:35 | call to method WriteLine | normal | -| Assert.cs:67:27:67:27 | access to local variable s | Assert.cs:67:27:67:27 | access to local variable s | normal | -| Assert.cs:67:27:67:34 | access to property Length | Assert.cs:67:27:67:34 | access to property Length | normal | -| Assert.cs:71:5:75:5 | {...} | Assert.cs:73:9:73:37 | call to method IsTrue | throw(AssertFailedException) | -| Assert.cs:71:5:75:5 | {...} | Assert.cs:74:9:74:35 | call to method WriteLine | normal | -| Assert.cs:72:9:72:33 | ... ...; | Assert.cs:72:16:72:32 | String s = ... | normal | -| Assert.cs:72:16:72:32 | String s = ... | Assert.cs:72:16:72:32 | String s = ... | normal | -| Assert.cs:72:20:72:20 | access to parameter b | Assert.cs:72:20:72:20 | access to parameter b | false | -| Assert.cs:72:20:72:20 | access to parameter b | Assert.cs:72:20:72:20 | access to parameter b | true | -| Assert.cs:72:20:72:32 | ... ? ... : ... | Assert.cs:72:20:72:32 | ... ? ... : ... | normal | -| Assert.cs:72:24:72:27 | null | Assert.cs:72:24:72:27 | null | normal | -| Assert.cs:72:31:72:32 | "" | Assert.cs:72:31:72:32 | "" | normal | -| Assert.cs:73:9:73:37 | call to method IsTrue | Assert.cs:73:9:73:37 | call to method IsTrue | normal | -| Assert.cs:73:9:73:37 | call to method IsTrue | Assert.cs:73:9:73:37 | call to method IsTrue | throw(AssertFailedException) | -| Assert.cs:73:9:73:38 | ...; | Assert.cs:73:9:73:37 | call to method IsTrue | normal | -| Assert.cs:73:9:73:38 | ...; | Assert.cs:73:9:73:37 | call to method IsTrue | throw(AssertFailedException) | -| Assert.cs:73:23:73:23 | access to local variable s | Assert.cs:73:23:73:23 | access to local variable s | normal | -| Assert.cs:73:23:73:31 | ... == ... | Assert.cs:73:23:73:31 | ... == ... | false | -| Assert.cs:73:23:73:31 | ... == ... | Assert.cs:73:23:73:31 | ... == ... | true | -| Assert.cs:73:23:73:36 | ... && ... | Assert.cs:73:23:73:36 | ... && ... | normal | -| Assert.cs:73:28:73:31 | null | Assert.cs:73:28:73:31 | null | normal | -| Assert.cs:73:36:73:36 | access to parameter b | Assert.cs:73:36:73:36 | access to parameter b | normal | -| Assert.cs:74:9:74:35 | call to method WriteLine | Assert.cs:74:9:74:35 | call to method WriteLine | normal | -| Assert.cs:74:9:74:36 | ...; | Assert.cs:74:9:74:35 | call to method WriteLine | normal | -| Assert.cs:74:27:74:27 | access to local variable s | Assert.cs:74:27:74:27 | access to local variable s | normal | -| Assert.cs:74:27:74:34 | access to property Length | Assert.cs:74:27:74:34 | access to property Length | normal | -| Assert.cs:78:5:82:5 | {...} | Assert.cs:80:9:80:38 | call to method IsFalse | throw(AssertFailedException) | -| Assert.cs:78:5:82:5 | {...} | Assert.cs:81:9:81:35 | call to method WriteLine | normal | -| Assert.cs:79:9:79:33 | ... ...; | Assert.cs:79:16:79:32 | String s = ... | normal | -| Assert.cs:79:16:79:32 | String s = ... | Assert.cs:79:16:79:32 | String s = ... | normal | -| Assert.cs:79:20:79:20 | access to parameter b | Assert.cs:79:20:79:20 | access to parameter b | false | -| Assert.cs:79:20:79:20 | access to parameter b | Assert.cs:79:20:79:20 | access to parameter b | true | -| Assert.cs:79:20:79:32 | ... ? ... : ... | Assert.cs:79:20:79:32 | ... ? ... : ... | normal | -| Assert.cs:79:24:79:27 | null | Assert.cs:79:24:79:27 | null | normal | -| Assert.cs:79:31:79:32 | "" | Assert.cs:79:31:79:32 | "" | normal | -| Assert.cs:80:9:80:38 | call to method IsFalse | Assert.cs:80:9:80:38 | call to method IsFalse | normal | -| Assert.cs:80:9:80:38 | call to method IsFalse | Assert.cs:80:9:80:38 | call to method IsFalse | throw(AssertFailedException) | -| Assert.cs:80:9:80:39 | ...; | Assert.cs:80:9:80:38 | call to method IsFalse | normal | -| Assert.cs:80:9:80:39 | ...; | Assert.cs:80:9:80:38 | call to method IsFalse | throw(AssertFailedException) | -| Assert.cs:80:24:80:24 | access to local variable s | Assert.cs:80:24:80:24 | access to local variable s | normal | -| Assert.cs:80:24:80:32 | ... != ... | Assert.cs:80:24:80:32 | ... != ... | false | -| Assert.cs:80:24:80:32 | ... != ... | Assert.cs:80:24:80:32 | ... != ... | true | -| Assert.cs:80:24:80:37 | ... \|\| ... | Assert.cs:80:24:80:37 | ... \|\| ... | normal | -| Assert.cs:80:29:80:32 | null | Assert.cs:80:29:80:32 | null | normal | -| Assert.cs:80:37:80:37 | access to parameter b | Assert.cs:80:37:80:37 | access to parameter b | normal | -| Assert.cs:81:9:81:35 | call to method WriteLine | Assert.cs:81:9:81:35 | call to method WriteLine | normal | -| Assert.cs:81:9:81:36 | ...; | Assert.cs:81:9:81:35 | call to method WriteLine | normal | -| Assert.cs:81:27:81:27 | access to local variable s | Assert.cs:81:27:81:27 | access to local variable s | normal | -| Assert.cs:81:27:81:34 | access to property Length | Assert.cs:81:27:81:34 | access to property Length | normal | -| Assert.cs:85:5:129:5 | {...} | Assert.cs:87:9:87:31 | call to method Assert | exit | -| Assert.cs:85:5:129:5 | {...} | Assert.cs:91:9:91:24 | call to method IsNull | throw(AssertFailedException) | -| Assert.cs:85:5:129:5 | {...} | Assert.cs:95:9:95:27 | call to method IsNotNull | throw(AssertFailedException) | -| Assert.cs:85:5:129:5 | {...} | Assert.cs:99:9:99:32 | call to method IsTrue | throw(AssertFailedException) | -| Assert.cs:85:5:129:5 | {...} | Assert.cs:103:9:103:32 | call to method IsTrue | throw(AssertFailedException) | -| Assert.cs:85:5:129:5 | {...} | Assert.cs:107:9:107:33 | call to method IsFalse | throw(AssertFailedException) | -| Assert.cs:85:5:129:5 | {...} | Assert.cs:111:9:111:33 | call to method IsFalse | throw(AssertFailedException) | -| Assert.cs:85:5:129:5 | {...} | Assert.cs:115:9:115:37 | call to method IsTrue | throw(AssertFailedException) | -| Assert.cs:85:5:129:5 | {...} | Assert.cs:119:9:119:39 | call to method IsFalse | throw(AssertFailedException) | -| Assert.cs:85:5:129:5 | {...} | Assert.cs:123:9:123:37 | call to method IsTrue | throw(AssertFailedException) | -| Assert.cs:85:5:129:5 | {...} | Assert.cs:127:9:127:39 | call to method IsFalse | throw(AssertFailedException) | -| Assert.cs:85:5:129:5 | {...} | Assert.cs:128:9:128:35 | call to method WriteLine | normal | -| Assert.cs:86:9:86:33 | ... ...; | Assert.cs:86:16:86:32 | String s = ... | normal | -| Assert.cs:86:16:86:32 | String s = ... | Assert.cs:86:16:86:32 | String s = ... | normal | -| Assert.cs:86:20:86:20 | access to parameter b | Assert.cs:86:20:86:20 | access to parameter b | false | -| Assert.cs:86:20:86:20 | access to parameter b | Assert.cs:86:20:86:20 | access to parameter b | true | -| Assert.cs:86:20:86:32 | ... ? ... : ... | Assert.cs:86:20:86:32 | ... ? ... : ... | normal | -| Assert.cs:86:24:86:27 | null | Assert.cs:86:24:86:27 | null | normal | -| Assert.cs:86:31:86:32 | "" | Assert.cs:86:31:86:32 | "" | normal | -| Assert.cs:87:9:87:31 | call to method Assert | Assert.cs:87:9:87:31 | call to method Assert | exit | -| Assert.cs:87:9:87:31 | call to method Assert | Assert.cs:87:9:87:31 | call to method Assert | normal | -| Assert.cs:87:9:87:32 | ...; | Assert.cs:87:9:87:31 | call to method Assert | exit | -| Assert.cs:87:9:87:32 | ...; | Assert.cs:87:9:87:31 | call to method Assert | normal | -| Assert.cs:87:22:87:22 | access to local variable s | Assert.cs:87:22:87:22 | access to local variable s | normal | -| Assert.cs:87:22:87:30 | ... != ... | Assert.cs:87:22:87:30 | ... != ... | normal | -| Assert.cs:87:27:87:30 | null | Assert.cs:87:27:87:30 | null | normal | -| Assert.cs:88:9:88:35 | call to method WriteLine | Assert.cs:88:9:88:35 | call to method WriteLine | normal | -| Assert.cs:88:9:88:36 | ...; | Assert.cs:88:9:88:35 | call to method WriteLine | normal | -| Assert.cs:88:27:88:27 | access to local variable s | Assert.cs:88:27:88:27 | access to local variable s | normal | -| Assert.cs:88:27:88:34 | access to property Length | Assert.cs:88:27:88:34 | access to property Length | normal | -| Assert.cs:90:9:90:25 | ... = ... | Assert.cs:90:9:90:25 | ... = ... | normal | -| Assert.cs:90:9:90:26 | ...; | Assert.cs:90:9:90:25 | ... = ... | normal | -| Assert.cs:90:13:90:13 | access to parameter b | Assert.cs:90:13:90:13 | access to parameter b | false | -| Assert.cs:90:13:90:13 | access to parameter b | Assert.cs:90:13:90:13 | access to parameter b | true | -| Assert.cs:90:13:90:25 | ... ? ... : ... | Assert.cs:90:13:90:25 | ... ? ... : ... | normal | -| Assert.cs:90:17:90:20 | null | Assert.cs:90:17:90:20 | null | normal | -| Assert.cs:90:24:90:25 | "" | Assert.cs:90:24:90:25 | "" | normal | -| Assert.cs:91:9:91:24 | call to method IsNull | Assert.cs:91:9:91:24 | call to method IsNull | normal | -| Assert.cs:91:9:91:24 | call to method IsNull | Assert.cs:91:9:91:24 | call to method IsNull | throw(AssertFailedException) | -| Assert.cs:91:9:91:25 | ...; | Assert.cs:91:9:91:24 | call to method IsNull | normal | -| Assert.cs:91:9:91:25 | ...; | Assert.cs:91:9:91:24 | call to method IsNull | throw(AssertFailedException) | -| Assert.cs:91:23:91:23 | access to local variable s | Assert.cs:91:23:91:23 | access to local variable s | normal | -| Assert.cs:92:9:92:35 | call to method WriteLine | Assert.cs:92:9:92:35 | call to method WriteLine | normal | -| Assert.cs:92:9:92:36 | ...; | Assert.cs:92:9:92:35 | call to method WriteLine | normal | -| Assert.cs:92:27:92:27 | access to local variable s | Assert.cs:92:27:92:27 | access to local variable s | normal | -| Assert.cs:92:27:92:34 | access to property Length | Assert.cs:92:27:92:34 | access to property Length | normal | -| Assert.cs:94:9:94:25 | ... = ... | Assert.cs:94:9:94:25 | ... = ... | normal | -| Assert.cs:94:9:94:26 | ...; | Assert.cs:94:9:94:25 | ... = ... | normal | -| Assert.cs:94:13:94:13 | access to parameter b | Assert.cs:94:13:94:13 | access to parameter b | false | -| Assert.cs:94:13:94:13 | access to parameter b | Assert.cs:94:13:94:13 | access to parameter b | true | -| Assert.cs:94:13:94:25 | ... ? ... : ... | Assert.cs:94:13:94:25 | ... ? ... : ... | normal | -| Assert.cs:94:17:94:20 | null | Assert.cs:94:17:94:20 | null | normal | -| Assert.cs:94:24:94:25 | "" | Assert.cs:94:24:94:25 | "" | normal | -| Assert.cs:95:9:95:27 | call to method IsNotNull | Assert.cs:95:9:95:27 | call to method IsNotNull | normal | -| Assert.cs:95:9:95:27 | call to method IsNotNull | Assert.cs:95:9:95:27 | call to method IsNotNull | throw(AssertFailedException) | -| Assert.cs:95:9:95:28 | ...; | Assert.cs:95:9:95:27 | call to method IsNotNull | normal | -| Assert.cs:95:9:95:28 | ...; | Assert.cs:95:9:95:27 | call to method IsNotNull | throw(AssertFailedException) | -| Assert.cs:95:26:95:26 | access to local variable s | Assert.cs:95:26:95:26 | access to local variable s | normal | -| Assert.cs:96:9:96:35 | call to method WriteLine | Assert.cs:96:9:96:35 | call to method WriteLine | normal | -| Assert.cs:96:9:96:36 | ...; | Assert.cs:96:9:96:35 | call to method WriteLine | normal | -| Assert.cs:96:27:96:27 | access to local variable s | Assert.cs:96:27:96:27 | access to local variable s | normal | -| Assert.cs:96:27:96:34 | access to property Length | Assert.cs:96:27:96:34 | access to property Length | normal | -| Assert.cs:98:9:98:25 | ... = ... | Assert.cs:98:9:98:25 | ... = ... | normal | -| Assert.cs:98:9:98:26 | ...; | Assert.cs:98:9:98:25 | ... = ... | normal | -| Assert.cs:98:13:98:13 | access to parameter b | Assert.cs:98:13:98:13 | access to parameter b | false | -| Assert.cs:98:13:98:13 | access to parameter b | Assert.cs:98:13:98:13 | access to parameter b | true | -| Assert.cs:98:13:98:25 | ... ? ... : ... | Assert.cs:98:13:98:25 | ... ? ... : ... | normal | -| Assert.cs:98:17:98:20 | null | Assert.cs:98:17:98:20 | null | normal | -| Assert.cs:98:24:98:25 | "" | Assert.cs:98:24:98:25 | "" | normal | -| Assert.cs:99:9:99:32 | call to method IsTrue | Assert.cs:99:9:99:32 | call to method IsTrue | normal | -| Assert.cs:99:9:99:32 | call to method IsTrue | Assert.cs:99:9:99:32 | call to method IsTrue | throw(AssertFailedException) | -| Assert.cs:99:9:99:33 | ...; | Assert.cs:99:9:99:32 | call to method IsTrue | normal | -| Assert.cs:99:9:99:33 | ...; | Assert.cs:99:9:99:32 | call to method IsTrue | throw(AssertFailedException) | -| Assert.cs:99:23:99:23 | access to local variable s | Assert.cs:99:23:99:23 | access to local variable s | normal | -| Assert.cs:99:23:99:31 | ... == ... | Assert.cs:99:23:99:31 | ... == ... | normal | -| Assert.cs:99:28:99:31 | null | Assert.cs:99:28:99:31 | null | normal | -| Assert.cs:100:9:100:35 | call to method WriteLine | Assert.cs:100:9:100:35 | call to method WriteLine | normal | -| Assert.cs:100:9:100:36 | ...; | Assert.cs:100:9:100:35 | call to method WriteLine | normal | -| Assert.cs:100:27:100:27 | access to local variable s | Assert.cs:100:27:100:27 | access to local variable s | normal | -| Assert.cs:100:27:100:34 | access to property Length | Assert.cs:100:27:100:34 | access to property Length | normal | -| Assert.cs:102:9:102:25 | ... = ... | Assert.cs:102:9:102:25 | ... = ... | normal | -| Assert.cs:102:9:102:26 | ...; | Assert.cs:102:9:102:25 | ... = ... | normal | -| Assert.cs:102:13:102:13 | access to parameter b | Assert.cs:102:13:102:13 | access to parameter b | false | -| Assert.cs:102:13:102:13 | access to parameter b | Assert.cs:102:13:102:13 | access to parameter b | true | -| Assert.cs:102:13:102:25 | ... ? ... : ... | Assert.cs:102:13:102:25 | ... ? ... : ... | normal | -| Assert.cs:102:17:102:20 | null | Assert.cs:102:17:102:20 | null | normal | -| Assert.cs:102:24:102:25 | "" | Assert.cs:102:24:102:25 | "" | normal | -| Assert.cs:103:9:103:32 | call to method IsTrue | Assert.cs:103:9:103:32 | call to method IsTrue | normal | -| Assert.cs:103:9:103:32 | call to method IsTrue | Assert.cs:103:9:103:32 | call to method IsTrue | throw(AssertFailedException) | -| Assert.cs:103:9:103:33 | ...; | Assert.cs:103:9:103:32 | call to method IsTrue | normal | -| Assert.cs:103:9:103:33 | ...; | Assert.cs:103:9:103:32 | call to method IsTrue | throw(AssertFailedException) | -| Assert.cs:103:23:103:23 | access to local variable s | Assert.cs:103:23:103:23 | access to local variable s | normal | -| Assert.cs:103:23:103:31 | ... != ... | Assert.cs:103:23:103:31 | ... != ... | normal | -| Assert.cs:103:28:103:31 | null | Assert.cs:103:28:103:31 | null | normal | -| Assert.cs:104:9:104:35 | call to method WriteLine | Assert.cs:104:9:104:35 | call to method WriteLine | normal | -| Assert.cs:104:9:104:36 | ...; | Assert.cs:104:9:104:35 | call to method WriteLine | normal | -| Assert.cs:104:27:104:27 | access to local variable s | Assert.cs:104:27:104:27 | access to local variable s | normal | -| Assert.cs:104:27:104:34 | access to property Length | Assert.cs:104:27:104:34 | access to property Length | normal | -| Assert.cs:106:9:106:25 | ... = ... | Assert.cs:106:9:106:25 | ... = ... | normal | -| Assert.cs:106:9:106:26 | ...; | Assert.cs:106:9:106:25 | ... = ... | normal | -| Assert.cs:106:13:106:13 | access to parameter b | Assert.cs:106:13:106:13 | access to parameter b | false | -| Assert.cs:106:13:106:13 | access to parameter b | Assert.cs:106:13:106:13 | access to parameter b | true | -| Assert.cs:106:13:106:25 | ... ? ... : ... | Assert.cs:106:13:106:25 | ... ? ... : ... | normal | -| Assert.cs:106:17:106:20 | null | Assert.cs:106:17:106:20 | null | normal | -| Assert.cs:106:24:106:25 | "" | Assert.cs:106:24:106:25 | "" | normal | -| Assert.cs:107:9:107:33 | call to method IsFalse | Assert.cs:107:9:107:33 | call to method IsFalse | normal | -| Assert.cs:107:9:107:33 | call to method IsFalse | Assert.cs:107:9:107:33 | call to method IsFalse | throw(AssertFailedException) | -| Assert.cs:107:9:107:34 | ...; | Assert.cs:107:9:107:33 | call to method IsFalse | normal | -| Assert.cs:107:9:107:34 | ...; | Assert.cs:107:9:107:33 | call to method IsFalse | throw(AssertFailedException) | -| Assert.cs:107:24:107:24 | access to local variable s | Assert.cs:107:24:107:24 | access to local variable s | normal | -| Assert.cs:107:24:107:32 | ... != ... | Assert.cs:107:24:107:32 | ... != ... | normal | -| Assert.cs:107:29:107:32 | null | Assert.cs:107:29:107:32 | null | normal | -| Assert.cs:108:9:108:35 | call to method WriteLine | Assert.cs:108:9:108:35 | call to method WriteLine | normal | -| Assert.cs:108:9:108:36 | ...; | Assert.cs:108:9:108:35 | call to method WriteLine | normal | -| Assert.cs:108:27:108:27 | access to local variable s | Assert.cs:108:27:108:27 | access to local variable s | normal | -| Assert.cs:108:27:108:34 | access to property Length | Assert.cs:108:27:108:34 | access to property Length | normal | -| Assert.cs:110:9:110:25 | ... = ... | Assert.cs:110:9:110:25 | ... = ... | normal | -| Assert.cs:110:9:110:26 | ...; | Assert.cs:110:9:110:25 | ... = ... | normal | -| Assert.cs:110:13:110:13 | access to parameter b | Assert.cs:110:13:110:13 | access to parameter b | false | -| Assert.cs:110:13:110:13 | access to parameter b | Assert.cs:110:13:110:13 | access to parameter b | true | -| Assert.cs:110:13:110:25 | ... ? ... : ... | Assert.cs:110:13:110:25 | ... ? ... : ... | normal | -| Assert.cs:110:17:110:20 | null | Assert.cs:110:17:110:20 | null | normal | -| Assert.cs:110:24:110:25 | "" | Assert.cs:110:24:110:25 | "" | normal | -| Assert.cs:111:9:111:33 | call to method IsFalse | Assert.cs:111:9:111:33 | call to method IsFalse | normal | -| Assert.cs:111:9:111:33 | call to method IsFalse | Assert.cs:111:9:111:33 | call to method IsFalse | throw(AssertFailedException) | -| Assert.cs:111:9:111:34 | ...; | Assert.cs:111:9:111:33 | call to method IsFalse | normal | -| Assert.cs:111:9:111:34 | ...; | Assert.cs:111:9:111:33 | call to method IsFalse | throw(AssertFailedException) | -| Assert.cs:111:24:111:24 | access to local variable s | Assert.cs:111:24:111:24 | access to local variable s | normal | -| Assert.cs:111:24:111:32 | ... == ... | Assert.cs:111:24:111:32 | ... == ... | normal | -| Assert.cs:111:29:111:32 | null | Assert.cs:111:29:111:32 | null | normal | -| Assert.cs:112:9:112:35 | call to method WriteLine | Assert.cs:112:9:112:35 | call to method WriteLine | normal | -| Assert.cs:112:9:112:36 | ...; | Assert.cs:112:9:112:35 | call to method WriteLine | normal | -| Assert.cs:112:27:112:27 | access to local variable s | Assert.cs:112:27:112:27 | access to local variable s | normal | -| Assert.cs:112:27:112:34 | access to property Length | Assert.cs:112:27:112:34 | access to property Length | normal | -| Assert.cs:114:9:114:25 | ... = ... | Assert.cs:114:9:114:25 | ... = ... | normal | -| Assert.cs:114:9:114:26 | ...; | Assert.cs:114:9:114:25 | ... = ... | normal | -| Assert.cs:114:13:114:13 | access to parameter b | Assert.cs:114:13:114:13 | access to parameter b | false | -| Assert.cs:114:13:114:13 | access to parameter b | Assert.cs:114:13:114:13 | access to parameter b | true | -| Assert.cs:114:13:114:25 | ... ? ... : ... | Assert.cs:114:13:114:25 | ... ? ... : ... | normal | -| Assert.cs:114:17:114:20 | null | Assert.cs:114:17:114:20 | null | normal | -| Assert.cs:114:24:114:25 | "" | Assert.cs:114:24:114:25 | "" | normal | -| Assert.cs:115:9:115:37 | call to method IsTrue | Assert.cs:115:9:115:37 | call to method IsTrue | normal | -| Assert.cs:115:9:115:37 | call to method IsTrue | Assert.cs:115:9:115:37 | call to method IsTrue | throw(AssertFailedException) | -| Assert.cs:115:9:115:38 | ...; | Assert.cs:115:9:115:37 | call to method IsTrue | normal | -| Assert.cs:115:9:115:38 | ...; | Assert.cs:115:9:115:37 | call to method IsTrue | throw(AssertFailedException) | -| Assert.cs:115:23:115:23 | access to local variable s | Assert.cs:115:23:115:23 | access to local variable s | normal | -| Assert.cs:115:23:115:31 | ... != ... | Assert.cs:115:23:115:31 | ... != ... | false | -| Assert.cs:115:23:115:31 | ... != ... | Assert.cs:115:23:115:31 | ... != ... | true | -| Assert.cs:115:23:115:36 | ... && ... | Assert.cs:115:23:115:36 | ... && ... | normal | -| Assert.cs:115:28:115:31 | null | Assert.cs:115:28:115:31 | null | normal | -| Assert.cs:115:36:115:36 | access to parameter b | Assert.cs:115:36:115:36 | access to parameter b | normal | -| Assert.cs:116:9:116:35 | call to method WriteLine | Assert.cs:116:9:116:35 | call to method WriteLine | normal | -| Assert.cs:116:9:116:36 | ...; | Assert.cs:116:9:116:35 | call to method WriteLine | normal | -| Assert.cs:116:27:116:27 | access to local variable s | Assert.cs:116:27:116:27 | access to local variable s | normal | -| Assert.cs:116:27:116:34 | access to property Length | Assert.cs:116:27:116:34 | access to property Length | normal | -| Assert.cs:118:9:118:25 | ... = ... | Assert.cs:118:9:118:25 | ... = ... | normal | -| Assert.cs:118:9:118:26 | ...; | Assert.cs:118:9:118:25 | ... = ... | normal | -| Assert.cs:118:13:118:13 | access to parameter b | Assert.cs:118:13:118:13 | access to parameter b | false | -| Assert.cs:118:13:118:13 | access to parameter b | Assert.cs:118:13:118:13 | access to parameter b | true | -| Assert.cs:118:13:118:25 | ... ? ... : ... | Assert.cs:118:13:118:25 | ... ? ... : ... | normal | -| Assert.cs:118:17:118:20 | null | Assert.cs:118:17:118:20 | null | normal | -| Assert.cs:118:24:118:25 | "" | Assert.cs:118:24:118:25 | "" | normal | -| Assert.cs:119:9:119:39 | call to method IsFalse | Assert.cs:119:9:119:39 | call to method IsFalse | normal | -| Assert.cs:119:9:119:39 | call to method IsFalse | Assert.cs:119:9:119:39 | call to method IsFalse | throw(AssertFailedException) | -| Assert.cs:119:9:119:40 | ...; | Assert.cs:119:9:119:39 | call to method IsFalse | normal | -| Assert.cs:119:9:119:40 | ...; | Assert.cs:119:9:119:39 | call to method IsFalse | throw(AssertFailedException) | -| Assert.cs:119:24:119:24 | access to local variable s | Assert.cs:119:24:119:24 | access to local variable s | normal | -| Assert.cs:119:24:119:32 | ... == ... | Assert.cs:119:24:119:32 | ... == ... | false | -| Assert.cs:119:24:119:32 | ... == ... | Assert.cs:119:24:119:32 | ... == ... | true | -| Assert.cs:119:24:119:38 | ... \|\| ... | Assert.cs:119:24:119:38 | ... \|\| ... | normal | -| Assert.cs:119:29:119:32 | null | Assert.cs:119:29:119:32 | null | normal | -| Assert.cs:119:37:119:38 | !... | Assert.cs:119:37:119:38 | !... | normal | -| Assert.cs:119:38:119:38 | access to parameter b | Assert.cs:119:38:119:38 | access to parameter b | normal | -| Assert.cs:120:9:120:35 | call to method WriteLine | Assert.cs:120:9:120:35 | call to method WriteLine | normal | -| Assert.cs:120:9:120:36 | ...; | Assert.cs:120:9:120:35 | call to method WriteLine | normal | -| Assert.cs:120:27:120:27 | access to local variable s | Assert.cs:120:27:120:27 | access to local variable s | normal | -| Assert.cs:120:27:120:34 | access to property Length | Assert.cs:120:27:120:34 | access to property Length | normal | -| Assert.cs:122:9:122:25 | ... = ... | Assert.cs:122:9:122:25 | ... = ... | normal | -| Assert.cs:122:9:122:26 | ...; | Assert.cs:122:9:122:25 | ... = ... | normal | -| Assert.cs:122:13:122:13 | access to parameter b | Assert.cs:122:13:122:13 | access to parameter b | false | -| Assert.cs:122:13:122:13 | access to parameter b | Assert.cs:122:13:122:13 | access to parameter b | true | -| Assert.cs:122:13:122:25 | ... ? ... : ... | Assert.cs:122:13:122:25 | ... ? ... : ... | normal | -| Assert.cs:122:17:122:20 | null | Assert.cs:122:17:122:20 | null | normal | -| Assert.cs:122:24:122:25 | "" | Assert.cs:122:24:122:25 | "" | normal | -| Assert.cs:123:9:123:37 | call to method IsTrue | Assert.cs:123:9:123:37 | call to method IsTrue | normal | -| Assert.cs:123:9:123:37 | call to method IsTrue | Assert.cs:123:9:123:37 | call to method IsTrue | throw(AssertFailedException) | -| Assert.cs:123:9:123:38 | ...; | Assert.cs:123:9:123:37 | call to method IsTrue | normal | -| Assert.cs:123:9:123:38 | ...; | Assert.cs:123:9:123:37 | call to method IsTrue | throw(AssertFailedException) | -| Assert.cs:123:23:123:23 | access to local variable s | Assert.cs:123:23:123:23 | access to local variable s | normal | -| Assert.cs:123:23:123:31 | ... == ... | Assert.cs:123:23:123:31 | ... == ... | false | -| Assert.cs:123:23:123:31 | ... == ... | Assert.cs:123:23:123:31 | ... == ... | true | -| Assert.cs:123:23:123:36 | ... && ... | Assert.cs:123:23:123:36 | ... && ... | normal | -| Assert.cs:123:28:123:31 | null | Assert.cs:123:28:123:31 | null | normal | -| Assert.cs:123:36:123:36 | access to parameter b | Assert.cs:123:36:123:36 | access to parameter b | normal | -| Assert.cs:124:9:124:35 | call to method WriteLine | Assert.cs:124:9:124:35 | call to method WriteLine | normal | -| Assert.cs:124:9:124:36 | ...; | Assert.cs:124:9:124:35 | call to method WriteLine | normal | -| Assert.cs:124:27:124:27 | access to local variable s | Assert.cs:124:27:124:27 | access to local variable s | normal | -| Assert.cs:124:27:124:34 | access to property Length | Assert.cs:124:27:124:34 | access to property Length | normal | -| Assert.cs:126:9:126:25 | ... = ... | Assert.cs:126:9:126:25 | ... = ... | normal | -| Assert.cs:126:9:126:26 | ...; | Assert.cs:126:9:126:25 | ... = ... | normal | -| Assert.cs:126:13:126:13 | access to parameter b | Assert.cs:126:13:126:13 | access to parameter b | false | -| Assert.cs:126:13:126:13 | access to parameter b | Assert.cs:126:13:126:13 | access to parameter b | true | -| Assert.cs:126:13:126:25 | ... ? ... : ... | Assert.cs:126:13:126:25 | ... ? ... : ... | normal | -| Assert.cs:126:17:126:20 | null | Assert.cs:126:17:126:20 | null | normal | -| Assert.cs:126:24:126:25 | "" | Assert.cs:126:24:126:25 | "" | normal | -| Assert.cs:127:9:127:39 | call to method IsFalse | Assert.cs:127:9:127:39 | call to method IsFalse | normal | -| Assert.cs:127:9:127:39 | call to method IsFalse | Assert.cs:127:9:127:39 | call to method IsFalse | throw(AssertFailedException) | -| Assert.cs:127:9:127:40 | ...; | Assert.cs:127:9:127:39 | call to method IsFalse | normal | -| Assert.cs:127:9:127:40 | ...; | Assert.cs:127:9:127:39 | call to method IsFalse | throw(AssertFailedException) | -| Assert.cs:127:24:127:24 | access to local variable s | Assert.cs:127:24:127:24 | access to local variable s | normal | -| Assert.cs:127:24:127:32 | ... != ... | Assert.cs:127:24:127:32 | ... != ... | false | -| Assert.cs:127:24:127:32 | ... != ... | Assert.cs:127:24:127:32 | ... != ... | true | -| Assert.cs:127:24:127:38 | ... \|\| ... | Assert.cs:127:24:127:38 | ... \|\| ... | normal | -| Assert.cs:127:29:127:32 | null | Assert.cs:127:29:127:32 | null | normal | -| Assert.cs:127:37:127:38 | !... | Assert.cs:127:37:127:38 | !... | normal | -| Assert.cs:127:38:127:38 | access to parameter b | Assert.cs:127:38:127:38 | access to parameter b | normal | -| Assert.cs:128:9:128:35 | call to method WriteLine | Assert.cs:128:9:128:35 | call to method WriteLine | normal | -| Assert.cs:128:9:128:36 | ...; | Assert.cs:128:9:128:35 | call to method WriteLine | normal | -| Assert.cs:128:27:128:27 | access to local variable s | Assert.cs:128:27:128:27 | access to local variable s | normal | -| Assert.cs:128:27:128:34 | access to property Length | Assert.cs:128:27:128:34 | access to property Length | normal | -| Assert.cs:135:5:136:5 | {...} | Assert.cs:135:5:136:5 | {...} | normal | -| Assert.cs:139:5:142:5 | {...} | Assert.cs:140:9:140:35 | call to method AssertTrueFalse | throw(Exception) | -| Assert.cs:139:5:142:5 | {...} | Assert.cs:141:9:141:15 | return ...; | return | -| Assert.cs:140:9:140:35 | call to method AssertTrueFalse | Assert.cs:140:9:140:35 | call to method AssertTrueFalse | normal | -| Assert.cs:140:9:140:35 | call to method AssertTrueFalse | Assert.cs:140:9:140:35 | call to method AssertTrueFalse | throw(Exception) | -| Assert.cs:140:9:140:35 | this access | Assert.cs:140:9:140:35 | this access | normal | -| Assert.cs:140:9:140:36 | ...; | Assert.cs:140:9:140:35 | call to method AssertTrueFalse | normal | -| Assert.cs:140:9:140:36 | ...; | Assert.cs:140:9:140:35 | call to method AssertTrueFalse | throw(Exception) | -| Assert.cs:140:25:140:26 | access to parameter b1 | Assert.cs:140:25:140:26 | access to parameter b1 | normal | -| Assert.cs:140:29:140:30 | access to parameter b2 | Assert.cs:140:29:140:30 | access to parameter b2 | normal | -| Assert.cs:140:33:140:34 | access to parameter b3 | Assert.cs:140:33:140:34 | access to parameter b3 | normal | -| Assert.cs:141:9:141:15 | return ...; | Assert.cs:141:9:141:15 | return ...; | return | -| Assignments.cs:1:7:1:17 | call to constructor Object | Assignments.cs:1:7:1:17 | call to constructor Object | normal | -| Assignments.cs:1:7:1:17 | call to method | Assignments.cs:1:7:1:17 | call to method | normal | -| Assignments.cs:1:7:1:17 | this access | Assignments.cs:1:7:1:17 | this access | normal | -| Assignments.cs:1:7:1:17 | {...} | Assignments.cs:1:7:1:17 | {...} | normal | -| Assignments.cs:4:5:15:5 | {...} | Assignments.cs:14:9:14:35 | ... += ... | normal | -| Assignments.cs:5:9:5:18 | ... ...; | Assignments.cs:5:13:5:17 | Int32 x = ... | normal | -| Assignments.cs:5:13:5:17 | Int32 x = ... | Assignments.cs:5:13:5:17 | Int32 x = ... | normal | -| Assignments.cs:5:17:5:17 | 0 | Assignments.cs:5:17:5:17 | 0 | normal | -| Assignments.cs:6:9:6:9 | access to local variable x | Assignments.cs:6:9:6:9 | access to local variable x | normal | -| Assignments.cs:6:9:6:14 | ... + ... | Assignments.cs:6:9:6:14 | ... + ... | normal | -| Assignments.cs:6:9:6:14 | ... += ... | Assignments.cs:6:9:6:14 | ... = ... | normal | -| Assignments.cs:6:9:6:14 | ... = ... | Assignments.cs:6:9:6:14 | ... = ... | normal | -| Assignments.cs:6:9:6:15 | ...; | Assignments.cs:6:9:6:14 | ... = ... | normal | -| Assignments.cs:6:14:6:14 | 1 | Assignments.cs:6:14:6:14 | 1 | normal | -| Assignments.cs:8:9:8:22 | ... ...; | Assignments.cs:8:17:8:21 | dynamic d = ... | normal | -| Assignments.cs:8:17:8:21 | dynamic d = ... | Assignments.cs:8:17:8:21 | dynamic d = ... | normal | -| Assignments.cs:8:21:8:21 | 0 | Assignments.cs:8:21:8:21 | 0 | normal | -| Assignments.cs:8:21:8:21 | (...) ... | Assignments.cs:8:21:8:21 | (...) ... | normal | -| Assignments.cs:9:9:9:9 | access to local variable d | Assignments.cs:9:9:9:9 | access to local variable d | normal | -| Assignments.cs:9:9:9:14 | ... -= ... | Assignments.cs:9:9:9:14 | ... = ... | normal | -| Assignments.cs:9:9:9:14 | ... = ... | Assignments.cs:9:9:9:14 | ... = ... | normal | -| Assignments.cs:9:9:9:14 | dynamic call to operator - | Assignments.cs:9:9:9:14 | dynamic call to operator - | normal | -| Assignments.cs:9:9:9:15 | ...; | Assignments.cs:9:9:9:14 | ... = ... | normal | -| Assignments.cs:9:14:9:14 | 2 | Assignments.cs:9:14:9:14 | 2 | normal | -| Assignments.cs:11:9:11:34 | ... ...; | Assignments.cs:11:13:11:33 | Assignments a = ... | normal | -| Assignments.cs:11:13:11:33 | Assignments a = ... | Assignments.cs:11:13:11:33 | Assignments a = ... | normal | -| Assignments.cs:11:17:11:33 | object creation of type Assignments | Assignments.cs:11:17:11:33 | object creation of type Assignments | normal | -| Assignments.cs:12:9:12:9 | access to local variable a | Assignments.cs:12:9:12:9 | access to local variable a | normal | -| Assignments.cs:12:9:12:17 | ... += ... | Assignments.cs:12:9:12:17 | ... = ... | normal | -| Assignments.cs:12:9:12:17 | ... = ... | Assignments.cs:12:9:12:17 | ... = ... | normal | -| Assignments.cs:12:9:12:17 | call to operator + | Assignments.cs:12:9:12:17 | call to operator + | normal | -| Assignments.cs:12:9:12:18 | ...; | Assignments.cs:12:9:12:17 | ... = ... | normal | -| Assignments.cs:12:14:12:17 | this access | Assignments.cs:12:14:12:17 | this access | normal | -| Assignments.cs:14:9:14:13 | access to event Event | Assignments.cs:14:9:14:13 | this access | normal | -| Assignments.cs:14:9:14:13 | this access | Assignments.cs:14:9:14:13 | this access | normal | -| Assignments.cs:14:9:14:35 | ... += ... | Assignments.cs:14:9:14:35 | ... += ... | normal | -| Assignments.cs:14:9:14:36 | ...; | Assignments.cs:14:9:14:35 | ... += ... | normal | -| Assignments.cs:14:18:14:35 | (...) => ... | Assignments.cs:14:18:14:35 | (...) => ... | normal | -| Assignments.cs:14:33:14:35 | {...} | Assignments.cs:14:33:14:35 | {...} | normal | -| Assignments.cs:18:5:20:5 | {...} | Assignments.cs:19:9:19:17 | return ...; | return | -| Assignments.cs:19:9:19:17 | return ...; | Assignments.cs:19:9:19:17 | return ...; | return | -| Assignments.cs:19:16:19:16 | access to parameter x | Assignments.cs:19:16:19:16 | access to parameter x | normal | -| Assignments.cs:28:5:30:5 | {...} | Assignments.cs:29:9:29:14 | ... = ... | normal | -| Assignments.cs:29:9:29:14 | ... = ... | Assignments.cs:29:9:29:14 | ... = ... | normal | -| Assignments.cs:29:9:29:15 | ...; | Assignments.cs:29:9:29:14 | ... = ... | normal | -| Assignments.cs:29:13:29:14 | 42 | Assignments.cs:29:13:29:14 | 42 | normal | -| Assignments.cs:33:5:36:5 | {...} | Assignments.cs:35:9:35:19 | ... = ... | normal | -| Assignments.cs:34:9:34:14 | ... = ... | Assignments.cs:34:9:34:14 | ... = ... | normal | -| Assignments.cs:34:9:34:15 | ...; | Assignments.cs:34:9:34:14 | ... = ... | normal | -| Assignments.cs:34:13:34:14 | 42 | Assignments.cs:34:13:34:14 | 42 | normal | -| Assignments.cs:35:9:35:19 | ... = ... | Assignments.cs:35:9:35:19 | ... = ... | normal | -| Assignments.cs:35:9:35:20 | ...; | Assignments.cs:35:9:35:19 | ... = ... | normal | -| Assignments.cs:35:13:35:19 | "Hello" | Assignments.cs:35:13:35:19 | "Hello" | normal | -| Assignments.cs:39:5:45:5 | {...} | Assignments.cs:44:9:44:58 | call to method SetParamMulti | normal | -| Assignments.cs:40:9:40:15 | ... ...; | Assignments.cs:40:13:40:14 | Int32 x1 | normal | -| Assignments.cs:40:13:40:14 | Int32 x1 | Assignments.cs:40:13:40:14 | Int32 x1 | normal | -| Assignments.cs:41:9:41:30 | call to method SetParamSingle | Assignments.cs:41:9:41:30 | call to method SetParamSingle | normal | -| Assignments.cs:41:9:41:30 | this access | Assignments.cs:41:9:41:30 | this access | normal | -| Assignments.cs:41:9:41:31 | ...; | Assignments.cs:41:9:41:30 | call to method SetParamSingle | normal | -| Assignments.cs:42:9:42:36 | call to method SetParamSingle | Assignments.cs:42:9:42:36 | call to method SetParamSingle | normal | -| Assignments.cs:42:9:42:36 | this access | Assignments.cs:42:9:42:36 | this access | normal | -| Assignments.cs:42:9:42:37 | ...; | Assignments.cs:42:9:42:36 | call to method SetParamSingle | normal | -| Assignments.cs:42:28:42:35 | access to field IntField | Assignments.cs:42:28:42:35 | access to field IntField | normal | -| Assignments.cs:42:28:42:35 | this access | Assignments.cs:42:28:42:35 | this access | normal | -| Assignments.cs:43:9:43:55 | call to method SetParamMulti | Assignments.cs:43:9:43:55 | call to method SetParamMulti | normal | -| Assignments.cs:43:9:43:55 | this access | Assignments.cs:43:9:43:55 | this access | normal | -| Assignments.cs:43:9:43:56 | ...; | Assignments.cs:43:9:43:55 | call to method SetParamMulti | normal | -| Assignments.cs:43:34:43:37 | null | Assignments.cs:43:34:43:37 | null | normal | -| Assignments.cs:43:44:43:54 | access to field StringField | Assignments.cs:43:44:43:54 | access to field StringField | normal | -| Assignments.cs:43:44:43:54 | this access | Assignments.cs:43:44:43:54 | this access | normal | -| Assignments.cs:44:9:44:58 | call to method SetParamMulti | Assignments.cs:44:9:44:58 | call to method SetParamMulti | normal | -| Assignments.cs:44:9:44:58 | this access | Assignments.cs:44:9:44:58 | this access | normal | -| Assignments.cs:44:9:44:59 | ...; | Assignments.cs:44:9:44:58 | call to method SetParamMulti | normal | -| Assignments.cs:44:27:44:34 | access to field IntField | Assignments.cs:44:27:44:34 | access to field IntField | normal | -| Assignments.cs:44:27:44:34 | this access | Assignments.cs:44:27:44:34 | this access | normal | -| Assignments.cs:44:37:44:40 | null | Assignments.cs:44:37:44:40 | null | normal | -| Assignments.cs:44:47:44:57 | access to field StringField | Assignments.cs:44:47:44:57 | access to field StringField | normal | -| Assignments.cs:44:47:44:57 | this access | Assignments.cs:44:47:44:57 | this access | normal | -| BreakInTry.cs:1:7:1:16 | call to constructor Object | BreakInTry.cs:1:7:1:16 | call to constructor Object | normal | -| BreakInTry.cs:1:7:1:16 | call to method | BreakInTry.cs:1:7:1:16 | call to method | normal | -| BreakInTry.cs:1:7:1:16 | this access | BreakInTry.cs:1:7:1:16 | this access | normal | -| BreakInTry.cs:1:7:1:16 | {...} | BreakInTry.cs:1:7:1:16 | {...} | normal | -| BreakInTry.cs:4:5:18:5 | {...} | BreakInTry.cs:15:17:15:28 | ... == ... | false | -| BreakInTry.cs:4:5:18:5 | {...} | BreakInTry.cs:16:17:16:17 | ; | normal | -| BreakInTry.cs:5:9:17:9 | try {...} ... | BreakInTry.cs:15:17:15:28 | ... == ... | false | -| BreakInTry.cs:5:9:17:9 | try {...} ... | BreakInTry.cs:16:17:16:17 | ; | normal | -| BreakInTry.cs:6:9:12:9 | {...} | BreakInTry.cs:7:13:11:13 | foreach (... ... in ...) ... | empty | -| BreakInTry.cs:6:9:12:9 | {...} | BreakInTry.cs:10:21:10:26 | break; | normal [break] (0) | -| BreakInTry.cs:7:13:11:13 | foreach (... ... in ...) ... | BreakInTry.cs:7:13:11:13 | foreach (... ... in ...) ... | empty | -| BreakInTry.cs:7:13:11:13 | foreach (... ... in ...) ... | BreakInTry.cs:10:21:10:26 | break; | normal [break] (0) | -| BreakInTry.cs:7:26:7:28 | String arg | BreakInTry.cs:7:26:7:28 | String arg | normal | -| BreakInTry.cs:7:33:7:36 | access to parameter args | BreakInTry.cs:7:33:7:36 | access to parameter args | normal | -| BreakInTry.cs:8:13:11:13 | {...} | BreakInTry.cs:9:21:9:31 | ... == ... | false | -| BreakInTry.cs:8:13:11:13 | {...} | BreakInTry.cs:10:21:10:26 | break; | break | -| BreakInTry.cs:9:17:10:26 | if (...) ... | BreakInTry.cs:9:21:9:31 | ... == ... | false | -| BreakInTry.cs:9:17:10:26 | if (...) ... | BreakInTry.cs:10:21:10:26 | break; | break | -| BreakInTry.cs:9:21:9:23 | access to local variable arg | BreakInTry.cs:9:21:9:23 | access to local variable arg | normal | -| BreakInTry.cs:9:21:9:31 | ... == ... | BreakInTry.cs:9:21:9:31 | ... == ... | false | -| BreakInTry.cs:9:21:9:31 | ... == ... | BreakInTry.cs:9:21:9:31 | ... == ... | true | -| BreakInTry.cs:9:28:9:31 | null | BreakInTry.cs:9:28:9:31 | null | normal | -| BreakInTry.cs:10:21:10:26 | break; | BreakInTry.cs:10:21:10:26 | break; | break | -| BreakInTry.cs:14:9:17:9 | {...} | BreakInTry.cs:15:17:15:28 | ... == ... | false | -| BreakInTry.cs:14:9:17:9 | {...} | BreakInTry.cs:16:17:16:17 | ; | normal | -| BreakInTry.cs:15:13:16:17 | if (...) ... | BreakInTry.cs:15:17:15:28 | ... == ... | false | -| BreakInTry.cs:15:13:16:17 | if (...) ... | BreakInTry.cs:16:17:16:17 | ; | normal | -| BreakInTry.cs:15:17:15:20 | access to parameter args | BreakInTry.cs:15:17:15:20 | access to parameter args | normal | -| BreakInTry.cs:15:17:15:28 | ... == ... | BreakInTry.cs:15:17:15:28 | ... == ... | false | -| BreakInTry.cs:15:17:15:28 | ... == ... | BreakInTry.cs:15:17:15:28 | ... == ... | true | -| BreakInTry.cs:15:25:15:28 | null | BreakInTry.cs:15:25:15:28 | null | normal | -| BreakInTry.cs:16:17:16:17 | ; | BreakInTry.cs:16:17:16:17 | ; | normal | -| BreakInTry.cs:21:5:36:5 | {...} | BreakInTry.cs:35:7:35:7 | ; | normal | -| BreakInTry.cs:22:9:34:9 | foreach (... ... in ...) ... | BreakInTry.cs:22:9:34:9 | foreach (... ... in ...) ... | empty | -| BreakInTry.cs:22:9:34:9 | foreach (... ... in ...) ... | BreakInTry.cs:31:21:31:32 | ... == ... | false [break] (0) | -| BreakInTry.cs:22:9:34:9 | foreach (... ... in ...) ... | BreakInTry.cs:32:21:32:21 | ; | normal [break] (0) | -| BreakInTry.cs:22:22:22:24 | String arg | BreakInTry.cs:22:22:22:24 | String arg | normal | -| BreakInTry.cs:22:29:22:32 | access to parameter args | BreakInTry.cs:22:29:22:32 | access to parameter args | normal | -| BreakInTry.cs:23:9:34:9 | {...} | BreakInTry.cs:31:21:31:32 | ... == ... | break [false] (0) | -| BreakInTry.cs:23:9:34:9 | {...} | BreakInTry.cs:31:21:31:32 | ... == ... | false | -| BreakInTry.cs:23:9:34:9 | {...} | BreakInTry.cs:32:21:32:21 | ; | break [normal] (0) | -| BreakInTry.cs:23:9:34:9 | {...} | BreakInTry.cs:32:21:32:21 | ; | normal | -| BreakInTry.cs:24:13:33:13 | try {...} ... | BreakInTry.cs:31:21:31:32 | ... == ... | break [false] (0) | -| BreakInTry.cs:24:13:33:13 | try {...} ... | BreakInTry.cs:31:21:31:32 | ... == ... | false | -| BreakInTry.cs:24:13:33:13 | try {...} ... | BreakInTry.cs:32:21:32:21 | ; | break [normal] (0) | -| BreakInTry.cs:24:13:33:13 | try {...} ... | BreakInTry.cs:32:21:32:21 | ; | normal | -| BreakInTry.cs:25:13:28:13 | {...} | BreakInTry.cs:26:21:26:31 | ... == ... | false | -| BreakInTry.cs:25:13:28:13 | {...} | BreakInTry.cs:27:21:27:26 | break; | break | -| BreakInTry.cs:26:17:27:26 | if (...) ... | BreakInTry.cs:26:21:26:31 | ... == ... | false | -| BreakInTry.cs:26:17:27:26 | if (...) ... | BreakInTry.cs:27:21:27:26 | break; | break | -| BreakInTry.cs:26:21:26:23 | access to local variable arg | BreakInTry.cs:26:21:26:23 | access to local variable arg | normal | -| BreakInTry.cs:26:21:26:31 | ... == ... | BreakInTry.cs:26:21:26:31 | ... == ... | false | -| BreakInTry.cs:26:21:26:31 | ... == ... | BreakInTry.cs:26:21:26:31 | ... == ... | true | -| BreakInTry.cs:26:28:26:31 | null | BreakInTry.cs:26:28:26:31 | null | normal | -| BreakInTry.cs:27:21:27:26 | break; | BreakInTry.cs:27:21:27:26 | break; | break | -| BreakInTry.cs:30:13:33:13 | {...} | BreakInTry.cs:31:21:31:32 | ... == ... | false | -| BreakInTry.cs:30:13:33:13 | {...} | BreakInTry.cs:32:21:32:21 | ; | normal | -| BreakInTry.cs:31:17:32:21 | if (...) ... | BreakInTry.cs:31:21:31:32 | ... == ... | false | -| BreakInTry.cs:31:17:32:21 | if (...) ... | BreakInTry.cs:32:21:32:21 | ; | normal | -| BreakInTry.cs:31:21:31:24 | access to parameter args | BreakInTry.cs:31:21:31:24 | access to parameter args | normal | -| BreakInTry.cs:31:21:31:32 | ... == ... | BreakInTry.cs:31:21:31:32 | ... == ... | false | -| BreakInTry.cs:31:21:31:32 | ... == ... | BreakInTry.cs:31:21:31:32 | ... == ... | true | -| BreakInTry.cs:31:29:31:32 | null | BreakInTry.cs:31:29:31:32 | null | normal | -| BreakInTry.cs:32:21:32:21 | ; | BreakInTry.cs:32:21:32:21 | ; | normal | -| BreakInTry.cs:35:7:35:7 | ; | BreakInTry.cs:35:7:35:7 | ; | normal | -| BreakInTry.cs:39:5:54:5 | {...} | BreakInTry.cs:47:13:51:13 | foreach (... ... in ...) ... | return [empty] (0) | -| BreakInTry.cs:39:5:54:5 | {...} | BreakInTry.cs:50:21:50:26 | break; | return [normal] (0) | -| BreakInTry.cs:39:5:54:5 | {...} | BreakInTry.cs:53:7:53:7 | ; | normal | -| BreakInTry.cs:40:9:52:9 | try {...} ... | BreakInTry.cs:47:13:51:13 | foreach (... ... in ...) ... | empty | -| BreakInTry.cs:40:9:52:9 | try {...} ... | BreakInTry.cs:47:13:51:13 | foreach (... ... in ...) ... | return [empty] (0) | -| BreakInTry.cs:40:9:52:9 | try {...} ... | BreakInTry.cs:50:21:50:26 | break; | normal [break] (0) | -| BreakInTry.cs:40:9:52:9 | try {...} ... | BreakInTry.cs:50:21:50:26 | break; | return [normal] (0) | -| BreakInTry.cs:41:9:44:9 | {...} | BreakInTry.cs:42:17:42:28 | ... == ... | false | -| BreakInTry.cs:41:9:44:9 | {...} | BreakInTry.cs:43:17:43:23 | return ...; | return | -| BreakInTry.cs:42:13:43:23 | if (...) ... | BreakInTry.cs:42:17:42:28 | ... == ... | false | -| BreakInTry.cs:42:13:43:23 | if (...) ... | BreakInTry.cs:43:17:43:23 | return ...; | return | -| BreakInTry.cs:42:17:42:20 | access to parameter args | BreakInTry.cs:42:17:42:20 | access to parameter args | normal | -| BreakInTry.cs:42:17:42:28 | ... == ... | BreakInTry.cs:42:17:42:28 | ... == ... | false | -| BreakInTry.cs:42:17:42:28 | ... == ... | BreakInTry.cs:42:17:42:28 | ... == ... | true | -| BreakInTry.cs:42:25:42:28 | null | BreakInTry.cs:42:25:42:28 | null | normal | -| BreakInTry.cs:43:17:43:23 | return ...; | BreakInTry.cs:43:17:43:23 | return ...; | return | -| BreakInTry.cs:46:9:52:9 | {...} | BreakInTry.cs:47:13:51:13 | foreach (... ... in ...) ... | empty | -| BreakInTry.cs:46:9:52:9 | {...} | BreakInTry.cs:50:21:50:26 | break; | normal [break] (0) | -| BreakInTry.cs:47:13:51:13 | foreach (... ... in ...) ... | BreakInTry.cs:47:13:51:13 | foreach (... ... in ...) ... | empty | -| BreakInTry.cs:47:13:51:13 | foreach (... ... in ...) ... | BreakInTry.cs:50:21:50:26 | break; | normal [break] (0) | -| BreakInTry.cs:47:26:47:28 | String arg | BreakInTry.cs:47:26:47:28 | String arg | normal | -| BreakInTry.cs:47:33:47:36 | access to parameter args | BreakInTry.cs:47:33:47:36 | access to parameter args | normal | -| BreakInTry.cs:48:13:51:13 | {...} | BreakInTry.cs:49:21:49:31 | ... == ... | false | -| BreakInTry.cs:48:13:51:13 | {...} | BreakInTry.cs:50:21:50:26 | break; | break | -| BreakInTry.cs:49:17:50:26 | if (...) ... | BreakInTry.cs:49:21:49:31 | ... == ... | false | -| BreakInTry.cs:49:17:50:26 | if (...) ... | BreakInTry.cs:50:21:50:26 | break; | break | -| BreakInTry.cs:49:21:49:23 | access to local variable arg | BreakInTry.cs:49:21:49:23 | access to local variable arg | normal | -| BreakInTry.cs:49:21:49:31 | ... == ... | BreakInTry.cs:49:21:49:31 | ... == ... | false | -| BreakInTry.cs:49:21:49:31 | ... == ... | BreakInTry.cs:49:21:49:31 | ... == ... | true | -| BreakInTry.cs:49:28:49:31 | null | BreakInTry.cs:49:28:49:31 | null | normal | -| BreakInTry.cs:50:21:50:26 | break; | BreakInTry.cs:50:21:50:26 | break; | break | -| BreakInTry.cs:53:7:53:7 | ; | BreakInTry.cs:53:7:53:7 | ; | normal | -| BreakInTry.cs:57:5:71:5 | {...} | BreakInTry.cs:65:13:69:13 | foreach (... ... in ...) ... | empty | -| BreakInTry.cs:57:5:71:5 | {...} | BreakInTry.cs:65:13:69:13 | foreach (... ... in ...) ... | return [empty] (0) | -| BreakInTry.cs:57:5:71:5 | {...} | BreakInTry.cs:68:21:68:26 | break; | normal [break] (0) | -| BreakInTry.cs:57:5:71:5 | {...} | BreakInTry.cs:68:21:68:26 | break; | return [normal] (0) | -| BreakInTry.cs:58:9:70:9 | try {...} ... | BreakInTry.cs:65:13:69:13 | foreach (... ... in ...) ... | empty | -| BreakInTry.cs:58:9:70:9 | try {...} ... | BreakInTry.cs:65:13:69:13 | foreach (... ... in ...) ... | return [empty] (0) | -| BreakInTry.cs:58:9:70:9 | try {...} ... | BreakInTry.cs:68:21:68:26 | break; | normal [break] (0) | -| BreakInTry.cs:58:9:70:9 | try {...} ... | BreakInTry.cs:68:21:68:26 | break; | return [normal] (0) | -| BreakInTry.cs:59:9:62:9 | {...} | BreakInTry.cs:60:17:60:28 | ... == ... | false | -| BreakInTry.cs:59:9:62:9 | {...} | BreakInTry.cs:61:17:61:23 | return ...; | return | -| BreakInTry.cs:60:13:61:23 | if (...) ... | BreakInTry.cs:60:17:60:28 | ... == ... | false | -| BreakInTry.cs:60:13:61:23 | if (...) ... | BreakInTry.cs:61:17:61:23 | return ...; | return | -| BreakInTry.cs:60:17:60:20 | access to parameter args | BreakInTry.cs:60:17:60:20 | access to parameter args | normal | -| BreakInTry.cs:60:17:60:28 | ... == ... | BreakInTry.cs:60:17:60:28 | ... == ... | false | -| BreakInTry.cs:60:17:60:28 | ... == ... | BreakInTry.cs:60:17:60:28 | ... == ... | true | -| BreakInTry.cs:60:25:60:28 | null | BreakInTry.cs:60:25:60:28 | null | normal | -| BreakInTry.cs:61:17:61:23 | return ...; | BreakInTry.cs:61:17:61:23 | return ...; | return | -| BreakInTry.cs:64:9:70:9 | {...} | BreakInTry.cs:65:13:69:13 | foreach (... ... in ...) ... | empty | -| BreakInTry.cs:64:9:70:9 | {...} | BreakInTry.cs:68:21:68:26 | break; | normal [break] (0) | -| BreakInTry.cs:65:13:69:13 | foreach (... ... in ...) ... | BreakInTry.cs:65:13:69:13 | foreach (... ... in ...) ... | empty | -| BreakInTry.cs:65:13:69:13 | foreach (... ... in ...) ... | BreakInTry.cs:68:21:68:26 | break; | normal [break] (0) | -| BreakInTry.cs:65:26:65:28 | String arg | BreakInTry.cs:65:26:65:28 | String arg | normal | -| BreakInTry.cs:65:33:65:36 | access to parameter args | BreakInTry.cs:65:33:65:36 | access to parameter args | normal | -| BreakInTry.cs:66:13:69:13 | {...} | BreakInTry.cs:67:21:67:31 | ... == ... | false | -| BreakInTry.cs:66:13:69:13 | {...} | BreakInTry.cs:68:21:68:26 | break; | break | -| BreakInTry.cs:67:17:68:26 | if (...) ... | BreakInTry.cs:67:21:67:31 | ... == ... | false | -| BreakInTry.cs:67:17:68:26 | if (...) ... | BreakInTry.cs:68:21:68:26 | break; | break | -| BreakInTry.cs:67:21:67:23 | access to local variable arg | BreakInTry.cs:67:21:67:23 | access to local variable arg | normal | -| BreakInTry.cs:67:21:67:31 | ... == ... | BreakInTry.cs:67:21:67:31 | ... == ... | false | -| BreakInTry.cs:67:21:67:31 | ... == ... | BreakInTry.cs:67:21:67:31 | ... == ... | true | -| BreakInTry.cs:67:28:67:31 | null | BreakInTry.cs:67:28:67:31 | null | normal | -| BreakInTry.cs:68:21:68:26 | break; | BreakInTry.cs:68:21:68:26 | break; | break | -| CompileTimeOperators.cs:3:7:3:26 | call to constructor Object | CompileTimeOperators.cs:3:7:3:26 | call to constructor Object | normal | -| CompileTimeOperators.cs:3:7:3:26 | call to method | CompileTimeOperators.cs:3:7:3:26 | call to method | normal | -| CompileTimeOperators.cs:3:7:3:26 | this access | CompileTimeOperators.cs:3:7:3:26 | this access | normal | -| CompileTimeOperators.cs:3:7:3:26 | {...} | CompileTimeOperators.cs:3:7:3:26 | {...} | normal | -| CompileTimeOperators.cs:6:5:8:5 | {...} | CompileTimeOperators.cs:7:9:7:28 | return ...; | return | -| CompileTimeOperators.cs:7:9:7:28 | return ...; | CompileTimeOperators.cs:7:9:7:28 | return ...; | return | -| CompileTimeOperators.cs:7:16:7:27 | default(...) | CompileTimeOperators.cs:7:16:7:27 | default(...) | normal | -| CompileTimeOperators.cs:11:5:13:5 | {...} | CompileTimeOperators.cs:12:9:12:27 | return ...; | return | -| CompileTimeOperators.cs:12:9:12:27 | return ...; | CompileTimeOperators.cs:12:9:12:27 | return ...; | return | -| CompileTimeOperators.cs:12:16:12:26 | sizeof(..) | CompileTimeOperators.cs:12:16:12:26 | sizeof(..) | normal | -| CompileTimeOperators.cs:16:5:18:5 | {...} | CompileTimeOperators.cs:17:9:17:27 | return ...; | return | -| CompileTimeOperators.cs:17:9:17:27 | return ...; | CompileTimeOperators.cs:17:9:17:27 | return ...; | return | -| CompileTimeOperators.cs:17:16:17:26 | typeof(...) | CompileTimeOperators.cs:17:16:17:26 | typeof(...) | normal | -| CompileTimeOperators.cs:21:5:23:5 | {...} | CompileTimeOperators.cs:22:9:22:25 | return ...; | return | -| CompileTimeOperators.cs:22:9:22:25 | return ...; | CompileTimeOperators.cs:22:9:22:25 | return ...; | return | -| CompileTimeOperators.cs:22:16:22:24 | nameof(...) | CompileTimeOperators.cs:22:16:22:24 | nameof(...) | normal | -| CompileTimeOperators.cs:22:23:22:23 | access to parameter i | CompileTimeOperators.cs:22:23:22:23 | access to parameter i | normal | -| CompileTimeOperators.cs:26:7:26:22 | call to constructor Object | CompileTimeOperators.cs:26:7:26:22 | call to constructor Object | normal | -| CompileTimeOperators.cs:26:7:26:22 | call to method | CompileTimeOperators.cs:26:7:26:22 | call to method | normal | -| CompileTimeOperators.cs:26:7:26:22 | this access | CompileTimeOperators.cs:26:7:26:22 | this access | normal | -| CompileTimeOperators.cs:26:7:26:22 | {...} | CompileTimeOperators.cs:26:7:26:22 | {...} | normal | -| CompileTimeOperators.cs:29:5:41:5 | {...} | CompileTimeOperators.cs:37:13:37:40 | call to method WriteLine | goto(End) [normal] (0) | -| CompileTimeOperators.cs:29:5:41:5 | {...} | CompileTimeOperators.cs:37:13:37:40 | call to method WriteLine | throw(Exception) [normal] (0) | -| CompileTimeOperators.cs:29:5:41:5 | {...} | CompileTimeOperators.cs:40:14:40:37 | call to method WriteLine | normal | -| CompileTimeOperators.cs:30:9:38:9 | try {...} ... | CompileTimeOperators.cs:37:13:37:40 | call to method WriteLine | goto(End) [normal] (0) | -| CompileTimeOperators.cs:30:9:38:9 | try {...} ... | CompileTimeOperators.cs:37:13:37:40 | call to method WriteLine | normal | -| CompileTimeOperators.cs:30:9:38:9 | try {...} ... | CompileTimeOperators.cs:37:13:37:40 | call to method WriteLine | throw(Exception) [normal] (0) | -| CompileTimeOperators.cs:31:9:34:9 | {...} | CompileTimeOperators.cs:32:13:32:21 | goto ...; | goto(End) | -| CompileTimeOperators.cs:31:9:34:9 | {...} | CompileTimeOperators.cs:33:13:33:37 | call to method WriteLine | normal | -| CompileTimeOperators.cs:31:9:34:9 | {...} | CompileTimeOperators.cs:33:13:33:37 | call to method WriteLine | throw(Exception) | -| CompileTimeOperators.cs:32:13:32:21 | goto ...; | CompileTimeOperators.cs:32:13:32:21 | goto ...; | goto(End) | -| CompileTimeOperators.cs:33:13:33:37 | call to method WriteLine | CompileTimeOperators.cs:33:13:33:37 | call to method WriteLine | normal | -| CompileTimeOperators.cs:33:13:33:37 | call to method WriteLine | CompileTimeOperators.cs:33:13:33:37 | call to method WriteLine | throw(Exception) | -| CompileTimeOperators.cs:33:13:33:38 | ...; | CompileTimeOperators.cs:33:13:33:37 | call to method WriteLine | normal | -| CompileTimeOperators.cs:33:13:33:38 | ...; | CompileTimeOperators.cs:33:13:33:37 | call to method WriteLine | throw(Exception) | -| CompileTimeOperators.cs:33:31:33:36 | "Dead" | CompileTimeOperators.cs:33:31:33:36 | "Dead" | normal | -| CompileTimeOperators.cs:36:9:38:9 | {...} | CompileTimeOperators.cs:37:13:37:40 | call to method WriteLine | normal | -| CompileTimeOperators.cs:37:13:37:40 | call to method WriteLine | CompileTimeOperators.cs:37:13:37:40 | call to method WriteLine | normal | -| CompileTimeOperators.cs:37:13:37:41 | ...; | CompileTimeOperators.cs:37:13:37:40 | call to method WriteLine | normal | -| CompileTimeOperators.cs:37:31:37:39 | "Finally" | CompileTimeOperators.cs:37:31:37:39 | "Finally" | normal | -| CompileTimeOperators.cs:39:9:39:33 | call to method WriteLine | CompileTimeOperators.cs:39:9:39:33 | call to method WriteLine | normal | -| CompileTimeOperators.cs:39:9:39:34 | ...; | CompileTimeOperators.cs:39:9:39:33 | call to method WriteLine | normal | -| CompileTimeOperators.cs:39:27:39:32 | "Dead" | CompileTimeOperators.cs:39:27:39:32 | "Dead" | normal | -| CompileTimeOperators.cs:40:9:40:11 | End: | CompileTimeOperators.cs:40:9:40:11 | End: | normal | -| CompileTimeOperators.cs:40:14:40:37 | call to method WriteLine | CompileTimeOperators.cs:40:14:40:37 | call to method WriteLine | normal | -| CompileTimeOperators.cs:40:14:40:38 | ...; | CompileTimeOperators.cs:40:14:40:37 | call to method WriteLine | normal | -| CompileTimeOperators.cs:40:32:40:36 | "End" | CompileTimeOperators.cs:40:32:40:36 | "End" | normal | -| ConditionalAccess.cs:1:7:1:23 | call to constructor Object | ConditionalAccess.cs:1:7:1:23 | call to constructor Object | normal | -| ConditionalAccess.cs:1:7:1:23 | call to method | ConditionalAccess.cs:1:7:1:23 | call to method | normal | -| ConditionalAccess.cs:1:7:1:23 | this access | ConditionalAccess.cs:1:7:1:23 | this access | normal | -| ConditionalAccess.cs:1:7:1:23 | {...} | ConditionalAccess.cs:1:7:1:23 | {...} | normal | -| ConditionalAccess.cs:3:26:3:26 | access to parameter i | ConditionalAccess.cs:3:26:3:26 | access to parameter i | non-null | -| ConditionalAccess.cs:3:26:3:26 | access to parameter i | ConditionalAccess.cs:3:26:3:26 | access to parameter i | null | -| ConditionalAccess.cs:3:26:3:38 | call to method ToString | ConditionalAccess.cs:3:26:3:26 | access to parameter i | null | -| ConditionalAccess.cs:3:26:3:38 | call to method ToString | ConditionalAccess.cs:3:26:3:38 | call to method ToString | non-null | -| ConditionalAccess.cs:3:26:3:38 | call to method ToString | ConditionalAccess.cs:3:26:3:38 | call to method ToString | null | -| ConditionalAccess.cs:3:26:3:49 | call to method ToLower | ConditionalAccess.cs:3:26:3:26 | access to parameter i | null | -| ConditionalAccess.cs:3:26:3:49 | call to method ToLower | ConditionalAccess.cs:3:26:3:38 | call to method ToString | null | -| ConditionalAccess.cs:3:26:3:49 | call to method ToLower | ConditionalAccess.cs:3:26:3:49 | call to method ToLower | normal | -| ConditionalAccess.cs:5:26:5:26 | access to parameter s | ConditionalAccess.cs:5:26:5:26 | access to parameter s | non-null | -| ConditionalAccess.cs:5:26:5:26 | access to parameter s | ConditionalAccess.cs:5:26:5:26 | access to parameter s | null | -| ConditionalAccess.cs:5:26:5:34 | access to property Length | ConditionalAccess.cs:5:26:5:26 | access to parameter s | null | -| ConditionalAccess.cs:5:26:5:34 | access to property Length | ConditionalAccess.cs:5:26:5:34 | access to property Length | normal | -| ConditionalAccess.cs:7:38:7:55 | access to property Length | ConditionalAccess.cs:7:38:7:55 | access to property Length | normal | -| ConditionalAccess.cs:7:38:7:55 | access to property Length | ConditionalAccess.cs:7:39:7:46 | ... ?? ... | null | -| ConditionalAccess.cs:7:39:7:40 | access to parameter s1 | ConditionalAccess.cs:7:39:7:40 | access to parameter s1 | non-null | -| ConditionalAccess.cs:7:39:7:40 | access to parameter s1 | ConditionalAccess.cs:7:39:7:40 | access to parameter s1 | null | -| ConditionalAccess.cs:7:39:7:46 | ... ?? ... | ConditionalAccess.cs:7:39:7:46 | ... ?? ... | non-null | -| ConditionalAccess.cs:7:39:7:46 | ... ?? ... | ConditionalAccess.cs:7:39:7:46 | ... ?? ... | null | -| ConditionalAccess.cs:7:45:7:46 | access to parameter s2 | ConditionalAccess.cs:7:45:7:46 | access to parameter s2 | non-null | -| ConditionalAccess.cs:7:45:7:46 | access to parameter s2 | ConditionalAccess.cs:7:45:7:46 | access to parameter s2 | null | -| ConditionalAccess.cs:9:25:9:25 | access to parameter s | ConditionalAccess.cs:9:25:9:25 | access to parameter s | non-null | -| ConditionalAccess.cs:9:25:9:25 | access to parameter s | ConditionalAccess.cs:9:25:9:25 | access to parameter s | null | -| ConditionalAccess.cs:9:25:9:33 | access to property Length | ConditionalAccess.cs:9:25:9:25 | access to parameter s | null | -| ConditionalAccess.cs:9:25:9:33 | access to property Length | ConditionalAccess.cs:9:25:9:33 | access to property Length | non-null | -| ConditionalAccess.cs:9:25:9:33 | access to property Length | ConditionalAccess.cs:9:25:9:33 | access to property Length | null | -| ConditionalAccess.cs:9:25:9:38 | ... ?? ... | ConditionalAccess.cs:9:25:9:38 | ... ?? ... | normal | -| ConditionalAccess.cs:9:38:9:38 | 0 | ConditionalAccess.cs:9:38:9:38 | 0 | normal | -| ConditionalAccess.cs:12:5:17:5 | {...} | ConditionalAccess.cs:14:13:14:21 | return ...; | return | -| ConditionalAccess.cs:12:5:17:5 | {...} | ConditionalAccess.cs:16:13:16:21 | return ...; | return | -| ConditionalAccess.cs:13:9:16:21 | if (...) ... | ConditionalAccess.cs:14:13:14:21 | return ...; | return | -| ConditionalAccess.cs:13:9:16:21 | if (...) ... | ConditionalAccess.cs:16:13:16:21 | return ...; | return | -| ConditionalAccess.cs:13:13:13:13 | access to parameter s | ConditionalAccess.cs:13:13:13:13 | access to parameter s | non-null | -| ConditionalAccess.cs:13:13:13:13 | access to parameter s | ConditionalAccess.cs:13:13:13:13 | access to parameter s | null | -| ConditionalAccess.cs:13:13:13:21 | access to property Length | ConditionalAccess.cs:13:13:13:13 | access to parameter s | null | -| ConditionalAccess.cs:13:13:13:21 | access to property Length | ConditionalAccess.cs:13:13:13:21 | access to property Length | normal | -| ConditionalAccess.cs:13:13:13:25 | ... > ... | ConditionalAccess.cs:13:13:13:25 | ... > ... | false | -| ConditionalAccess.cs:13:13:13:25 | ... > ... | ConditionalAccess.cs:13:13:13:25 | ... > ... | true | -| ConditionalAccess.cs:13:25:13:25 | 0 | ConditionalAccess.cs:13:25:13:25 | 0 | normal | -| ConditionalAccess.cs:13:25:13:25 | (...) ... | ConditionalAccess.cs:13:25:13:25 | (...) ... | normal | -| ConditionalAccess.cs:14:13:14:21 | return ...; | ConditionalAccess.cs:14:13:14:21 | return ...; | return | -| ConditionalAccess.cs:14:20:14:20 | 0 | ConditionalAccess.cs:14:20:14:20 | 0 | normal | -| ConditionalAccess.cs:16:13:16:21 | return ...; | ConditionalAccess.cs:16:13:16:21 | return ...; | return | -| ConditionalAccess.cs:16:20:16:20 | 1 | ConditionalAccess.cs:16:20:16:20 | 1 | normal | -| ConditionalAccess.cs:19:40:19:41 | access to parameter s1 | ConditionalAccess.cs:19:40:19:41 | access to parameter s1 | non-null | -| ConditionalAccess.cs:19:40:19:41 | access to parameter s1 | ConditionalAccess.cs:19:40:19:41 | access to parameter s1 | null | -| ConditionalAccess.cs:19:40:19:60 | call to method CommaJoinWith | ConditionalAccess.cs:19:40:19:41 | access to parameter s1 | null | -| ConditionalAccess.cs:19:40:19:60 | call to method CommaJoinWith | ConditionalAccess.cs:19:40:19:60 | call to method CommaJoinWith | normal | -| ConditionalAccess.cs:19:58:19:59 | access to parameter s2 | ConditionalAccess.cs:19:58:19:59 | access to parameter s2 | normal | -| ConditionalAccess.cs:22:5:26:5 | {...} | ConditionalAccess.cs:25:9:25:32 | ... = ... | normal | -| ConditionalAccess.cs:23:9:23:39 | ... ...; | ConditionalAccess.cs:23:13:23:38 | Nullable j = ... | normal | -| ConditionalAccess.cs:23:13:23:38 | Nullable j = ... | ConditionalAccess.cs:23:13:23:38 | Nullable j = ... | normal | -| ConditionalAccess.cs:23:17:23:38 | access to property Length | ConditionalAccess.cs:23:17:23:38 | access to property Length | normal | -| ConditionalAccess.cs:23:17:23:38 | access to property Length | ConditionalAccess.cs:23:18:23:29 | (...) ... | null | -| ConditionalAccess.cs:23:18:23:29 | (...) ... | ConditionalAccess.cs:23:18:23:29 | (...) ... | null | -| ConditionalAccess.cs:23:26:23:29 | null | ConditionalAccess.cs:23:26:23:29 | null | normal | -| ConditionalAccess.cs:24:9:24:38 | ... ...; | ConditionalAccess.cs:24:13:24:37 | String s = ... | normal | -| ConditionalAccess.cs:24:13:24:37 | String s = ... | ConditionalAccess.cs:24:13:24:37 | String s = ... | normal | -| ConditionalAccess.cs:24:17:24:37 | call to method ToString | ConditionalAccess.cs:24:17:24:37 | call to method ToString | normal | -| ConditionalAccess.cs:24:18:24:24 | (...) ... | ConditionalAccess.cs:24:18:24:24 | (...) ... | non-null | -| ConditionalAccess.cs:24:24:24:24 | access to parameter i | ConditionalAccess.cs:24:24:24:24 | access to parameter i | normal | -| ConditionalAccess.cs:25:9:25:32 | ... = ... | ConditionalAccess.cs:25:9:25:32 | ... = ... | normal | -| ConditionalAccess.cs:25:9:25:33 | ...; | ConditionalAccess.cs:25:9:25:32 | ... = ... | normal | -| ConditionalAccess.cs:25:13:25:14 | "" | ConditionalAccess.cs:25:13:25:14 | "" | non-null | -| ConditionalAccess.cs:25:13:25:32 | call to method CommaJoinWith | ConditionalAccess.cs:25:13:25:32 | call to method CommaJoinWith | normal | -| ConditionalAccess.cs:25:31:25:31 | access to local variable s | ConditionalAccess.cs:25:31:25:31 | access to local variable s | normal | -| ConditionalAccess.cs:30:28:30:32 | ... = ... | ConditionalAccess.cs:30:28:30:32 | ... = ... | normal | -| ConditionalAccess.cs:30:32:30:32 | 0 | ConditionalAccess.cs:30:32:30:32 | 0 | normal | -| ConditionalAccess.cs:33:5:36:5 | {...} | ConditionalAccess.cs:35:9:35:12 | access to property Prop | null | -| ConditionalAccess.cs:33:5:36:5 | {...} | ConditionalAccess.cs:35:9:35:24 | call to method Out | normal | -| ConditionalAccess.cs:34:9:34:13 | ... = ... | ConditionalAccess.cs:34:9:34:13 | ... = ... | normal | -| ConditionalAccess.cs:34:9:34:14 | ...; | ConditionalAccess.cs:34:9:34:13 | ... = ... | normal | -| ConditionalAccess.cs:34:13:34:13 | 0 | ConditionalAccess.cs:34:13:34:13 | 0 | normal | -| ConditionalAccess.cs:35:9:35:12 | access to property Prop | ConditionalAccess.cs:35:9:35:12 | access to property Prop | non-null | -| ConditionalAccess.cs:35:9:35:12 | access to property Prop | ConditionalAccess.cs:35:9:35:12 | access to property Prop | null | -| ConditionalAccess.cs:35:9:35:12 | this access | ConditionalAccess.cs:35:9:35:12 | this access | normal | -| ConditionalAccess.cs:35:9:35:24 | call to method Out | ConditionalAccess.cs:35:9:35:12 | access to property Prop | null | -| ConditionalAccess.cs:35:9:35:24 | call to method Out | ConditionalAccess.cs:35:9:35:24 | call to method Out | normal | -| ConditionalAccess.cs:35:9:35:25 | ...; | ConditionalAccess.cs:35:9:35:12 | access to property Prop | null | -| ConditionalAccess.cs:35:9:35:25 | ...; | ConditionalAccess.cs:35:9:35:24 | call to method Out | normal | -| ConditionalAccess.cs:42:13:42:28 | {...} | ConditionalAccess.cs:42:15:42:26 | return ...; | return | -| ConditionalAccess.cs:42:15:42:26 | return ...; | ConditionalAccess.cs:42:15:42:26 | return ...; | return | -| ConditionalAccess.cs:42:22:42:25 | null | ConditionalAccess.cs:42:22:42:25 | null | normal | -| ConditionalAccess.cs:43:13:43:15 | {...} | ConditionalAccess.cs:43:13:43:15 | {...} | normal | -| ConditionalAccess.cs:47:5:55:5 | {...} | ConditionalAccess.cs:54:9:54:10 | access to parameter ca | null | -| ConditionalAccess.cs:47:5:55:5 | {...} | ConditionalAccess.cs:54:12:54:29 | ... = ... | normal | -| ConditionalAccess.cs:48:9:48:10 | access to parameter ca | ConditionalAccess.cs:48:9:48:10 | access to parameter ca | non-null | -| ConditionalAccess.cs:48:9:48:10 | access to parameter ca | ConditionalAccess.cs:48:9:48:10 | access to parameter ca | null | -| ConditionalAccess.cs:48:9:48:20 | access to field IntField | ConditionalAccess.cs:48:9:48:10 | access to parameter ca | non-null | -| ConditionalAccess.cs:48:9:48:20 | access to field IntField | ConditionalAccess.cs:48:9:48:10 | access to parameter ca | null | -| ConditionalAccess.cs:48:9:48:26 | ...; | ConditionalAccess.cs:48:9:48:10 | access to parameter ca | null | -| ConditionalAccess.cs:48:9:48:26 | ...; | ConditionalAccess.cs:48:12:48:25 | ... = ... | normal | -| ConditionalAccess.cs:48:12:48:25 | ... = ... | ConditionalAccess.cs:48:9:48:10 | access to parameter ca | null | -| ConditionalAccess.cs:48:12:48:25 | ... = ... | ConditionalAccess.cs:48:12:48:25 | ... = ... | normal | -| ConditionalAccess.cs:48:24:48:25 | 42 | ConditionalAccess.cs:48:24:48:25 | 42 | normal | -| ConditionalAccess.cs:49:9:49:10 | access to parameter ca | ConditionalAccess.cs:49:9:49:10 | access to parameter ca | non-null | -| ConditionalAccess.cs:49:9:49:10 | access to parameter ca | ConditionalAccess.cs:49:9:49:10 | access to parameter ca | null | -| ConditionalAccess.cs:49:9:49:22 | access to property StringProp | ConditionalAccess.cs:49:9:49:10 | access to parameter ca | non-null | -| ConditionalAccess.cs:49:9:49:22 | access to property StringProp | ConditionalAccess.cs:49:9:49:10 | access to parameter ca | null | -| ConditionalAccess.cs:49:9:49:33 | ...; | ConditionalAccess.cs:49:9:49:10 | access to parameter ca | null | -| ConditionalAccess.cs:49:9:49:33 | ...; | ConditionalAccess.cs:49:12:49:32 | ... = ... | normal | -| ConditionalAccess.cs:49:12:49:32 | ... = ... | ConditionalAccess.cs:49:9:49:10 | access to parameter ca | null | -| ConditionalAccess.cs:49:12:49:32 | ... = ... | ConditionalAccess.cs:49:12:49:32 | ... = ... | normal | -| ConditionalAccess.cs:49:26:49:32 | "Hello" | ConditionalAccess.cs:49:26:49:32 | "Hello" | normal | -| ConditionalAccess.cs:50:9:50:10 | access to parameter ca | ConditionalAccess.cs:50:9:50:10 | access to parameter ca | non-null | -| ConditionalAccess.cs:50:9:50:10 | access to parameter ca | ConditionalAccess.cs:50:9:50:10 | access to parameter ca | null | -| ConditionalAccess.cs:50:9:50:14 | access to indexer | ConditionalAccess.cs:50:9:50:10 | access to parameter ca | null | -| ConditionalAccess.cs:50:9:50:14 | access to indexer | ConditionalAccess.cs:50:13:50:13 | 0 | normal | -| ConditionalAccess.cs:50:9:50:24 | ...; | ConditionalAccess.cs:50:9:50:10 | access to parameter ca | null | -| ConditionalAccess.cs:50:9:50:24 | ...; | ConditionalAccess.cs:50:12:50:23 | ... = ... | normal | -| ConditionalAccess.cs:50:12:50:23 | ... = ... | ConditionalAccess.cs:50:9:50:10 | access to parameter ca | null | -| ConditionalAccess.cs:50:12:50:23 | ... = ... | ConditionalAccess.cs:50:12:50:23 | ... = ... | normal | -| ConditionalAccess.cs:50:13:50:13 | 0 | ConditionalAccess.cs:50:13:50:13 | 0 | normal | -| ConditionalAccess.cs:50:18:50:23 | "Set0" | ConditionalAccess.cs:50:18:50:23 | "Set0" | normal | -| ConditionalAccess.cs:51:9:51:10 | access to parameter ca | ConditionalAccess.cs:51:9:51:10 | access to parameter ca | non-null | -| ConditionalAccess.cs:51:9:51:10 | access to parameter ca | ConditionalAccess.cs:51:9:51:10 | access to parameter ca | null | -| ConditionalAccess.cs:51:9:51:16 | access to property Prop | ConditionalAccess.cs:51:9:51:10 | access to parameter ca | null | -| ConditionalAccess.cs:51:9:51:16 | access to property Prop | ConditionalAccess.cs:51:9:51:16 | access to property Prop | non-null | -| ConditionalAccess.cs:51:9:51:16 | access to property Prop | ConditionalAccess.cs:51:9:51:16 | access to property Prop | null | -| ConditionalAccess.cs:51:9:51:26 | access to field IntField | ConditionalAccess.cs:51:9:51:10 | access to parameter ca | null | -| ConditionalAccess.cs:51:9:51:26 | access to field IntField | ConditionalAccess.cs:51:9:51:16 | access to property Prop | non-null | -| ConditionalAccess.cs:51:9:51:26 | access to field IntField | ConditionalAccess.cs:51:9:51:16 | access to property Prop | null | -| ConditionalAccess.cs:51:9:51:32 | ...; | ConditionalAccess.cs:51:9:51:10 | access to parameter ca | null | -| ConditionalAccess.cs:51:9:51:32 | ...; | ConditionalAccess.cs:51:9:51:16 | access to property Prop | null | -| ConditionalAccess.cs:51:9:51:32 | ...; | ConditionalAccess.cs:51:18:51:31 | ... = ... | normal | -| ConditionalAccess.cs:51:18:51:31 | ... = ... | ConditionalAccess.cs:51:9:51:10 | access to parameter ca | null | -| ConditionalAccess.cs:51:18:51:31 | ... = ... | ConditionalAccess.cs:51:9:51:16 | access to property Prop | null | -| ConditionalAccess.cs:51:18:51:31 | ... = ... | ConditionalAccess.cs:51:18:51:31 | ... = ... | normal | -| ConditionalAccess.cs:51:30:51:31 | 84 | ConditionalAccess.cs:51:30:51:31 | 84 | normal | -| ConditionalAccess.cs:52:9:52:10 | access to parameter ca | ConditionalAccess.cs:52:9:52:10 | access to parameter ca | non-null | -| ConditionalAccess.cs:52:9:52:10 | access to parameter ca | ConditionalAccess.cs:52:9:52:10 | access to parameter ca | null | -| ConditionalAccess.cs:52:9:52:16 | access to property Prop | ConditionalAccess.cs:52:9:52:10 | access to parameter ca | null | -| ConditionalAccess.cs:52:9:52:16 | access to property Prop | ConditionalAccess.cs:52:9:52:16 | access to property Prop | non-null | -| ConditionalAccess.cs:52:9:52:16 | access to property Prop | ConditionalAccess.cs:52:9:52:16 | access to property Prop | null | -| ConditionalAccess.cs:52:9:52:28 | access to property StringProp | ConditionalAccess.cs:52:9:52:10 | access to parameter ca | null | -| ConditionalAccess.cs:52:9:52:28 | access to property StringProp | ConditionalAccess.cs:52:9:52:16 | access to property Prop | non-null | -| ConditionalAccess.cs:52:9:52:28 | access to property StringProp | ConditionalAccess.cs:52:9:52:16 | access to property Prop | null | -| ConditionalAccess.cs:52:9:52:39 | ...; | ConditionalAccess.cs:52:9:52:10 | access to parameter ca | null | -| ConditionalAccess.cs:52:9:52:39 | ...; | ConditionalAccess.cs:52:9:52:16 | access to property Prop | null | -| ConditionalAccess.cs:52:9:52:39 | ...; | ConditionalAccess.cs:52:18:52:38 | ... = ... | normal | -| ConditionalAccess.cs:52:18:52:38 | ... = ... | ConditionalAccess.cs:52:9:52:10 | access to parameter ca | null | -| ConditionalAccess.cs:52:18:52:38 | ... = ... | ConditionalAccess.cs:52:9:52:16 | access to property Prop | null | -| ConditionalAccess.cs:52:18:52:38 | ... = ... | ConditionalAccess.cs:52:18:52:38 | ... = ... | normal | -| ConditionalAccess.cs:52:32:52:38 | "World" | ConditionalAccess.cs:52:32:52:38 | "World" | normal | -| ConditionalAccess.cs:53:9:53:10 | access to parameter ca | ConditionalAccess.cs:53:9:53:10 | access to parameter ca | non-null | -| ConditionalAccess.cs:53:9:53:10 | access to parameter ca | ConditionalAccess.cs:53:9:53:10 | access to parameter ca | non-null | -| ConditionalAccess.cs:53:9:53:10 | access to parameter ca | ConditionalAccess.cs:53:9:53:10 | access to parameter ca | null | -| ConditionalAccess.cs:53:9:53:10 | access to parameter ca | ConditionalAccess.cs:53:9:53:10 | access to parameter ca | null | -| ConditionalAccess.cs:53:9:53:20 | access to field IntField | ConditionalAccess.cs:53:9:53:10 | access to parameter ca | non-null | -| ConditionalAccess.cs:53:9:53:20 | access to field IntField | ConditionalAccess.cs:53:9:53:10 | access to parameter ca | null | -| ConditionalAccess.cs:53:9:53:20 | access to field IntField | ConditionalAccess.cs:53:9:53:10 | access to parameter ca | null | -| ConditionalAccess.cs:53:9:53:20 | access to field IntField | ConditionalAccess.cs:53:9:53:20 | access to field IntField | normal | -| ConditionalAccess.cs:53:9:53:26 | ...; | ConditionalAccess.cs:53:9:53:10 | access to parameter ca | null | -| ConditionalAccess.cs:53:9:53:26 | ...; | ConditionalAccess.cs:53:12:53:25 | ... = ... | normal | -| ConditionalAccess.cs:53:12:53:25 | ... - ... | ConditionalAccess.cs:53:12:53:25 | ... - ... | normal | -| ConditionalAccess.cs:53:12:53:25 | ... -= ... | ConditionalAccess.cs:53:9:53:10 | access to parameter ca | null | -| ConditionalAccess.cs:53:12:53:25 | ... -= ... | ConditionalAccess.cs:53:12:53:25 | ... = ... | normal | -| ConditionalAccess.cs:53:12:53:25 | ... = ... | ConditionalAccess.cs:53:9:53:10 | access to parameter ca | null | -| ConditionalAccess.cs:53:12:53:25 | ... = ... | ConditionalAccess.cs:53:12:53:25 | ... = ... | normal | -| ConditionalAccess.cs:53:25:53:25 | 1 | ConditionalAccess.cs:53:25:53:25 | 1 | normal | -| ConditionalAccess.cs:54:9:54:10 | access to parameter ca | ConditionalAccess.cs:54:9:54:10 | access to parameter ca | non-null | -| ConditionalAccess.cs:54:9:54:10 | access to parameter ca | ConditionalAccess.cs:54:9:54:10 | access to parameter ca | non-null | -| ConditionalAccess.cs:54:9:54:10 | access to parameter ca | ConditionalAccess.cs:54:9:54:10 | access to parameter ca | null | -| ConditionalAccess.cs:54:9:54:10 | access to parameter ca | ConditionalAccess.cs:54:9:54:10 | access to parameter ca | null | -| ConditionalAccess.cs:54:9:54:22 | access to property StringProp | ConditionalAccess.cs:54:9:54:10 | access to parameter ca | non-null | -| ConditionalAccess.cs:54:9:54:22 | access to property StringProp | ConditionalAccess.cs:54:9:54:10 | access to parameter ca | null | -| ConditionalAccess.cs:54:9:54:22 | access to property StringProp | ConditionalAccess.cs:54:9:54:10 | access to parameter ca | null | -| ConditionalAccess.cs:54:9:54:22 | access to property StringProp | ConditionalAccess.cs:54:9:54:22 | access to property StringProp | normal | -| ConditionalAccess.cs:54:9:54:30 | ...; | ConditionalAccess.cs:54:9:54:10 | access to parameter ca | null | -| ConditionalAccess.cs:54:9:54:30 | ...; | ConditionalAccess.cs:54:12:54:29 | ... = ... | normal | -| ConditionalAccess.cs:54:12:54:29 | ... + ... | ConditionalAccess.cs:54:12:54:29 | ... + ... | normal | -| ConditionalAccess.cs:54:12:54:29 | ... += ... | ConditionalAccess.cs:54:9:54:10 | access to parameter ca | null | -| ConditionalAccess.cs:54:12:54:29 | ... += ... | ConditionalAccess.cs:54:12:54:29 | ... = ... | normal | -| ConditionalAccess.cs:54:12:54:29 | ... = ... | ConditionalAccess.cs:54:9:54:10 | access to parameter ca | null | -| ConditionalAccess.cs:54:12:54:29 | ... = ... | ConditionalAccess.cs:54:12:54:29 | ... = ... | normal | -| ConditionalAccess.cs:54:27:54:29 | "!" | ConditionalAccess.cs:54:27:54:29 | "!" | normal | -| ConditionalAccess.cs:60:70:60:71 | access to parameter s1 | ConditionalAccess.cs:60:70:60:71 | access to parameter s1 | normal | -| ConditionalAccess.cs:60:70:60:78 | ... + ... | ConditionalAccess.cs:60:70:60:78 | ... + ... | normal | -| ConditionalAccess.cs:60:70:60:83 | ... + ... | ConditionalAccess.cs:60:70:60:83 | ... + ... | normal | -| ConditionalAccess.cs:60:75:60:78 | ", " | ConditionalAccess.cs:60:75:60:78 | ", " | normal | -| ConditionalAccess.cs:60:82:60:83 | access to parameter s2 | ConditionalAccess.cs:60:82:60:83 | access to parameter s2 | normal | -| Conditions.cs:1:7:1:16 | call to constructor Object | Conditions.cs:1:7:1:16 | call to constructor Object | normal | -| Conditions.cs:1:7:1:16 | call to method | Conditions.cs:1:7:1:16 | call to method | normal | -| Conditions.cs:1:7:1:16 | this access | Conditions.cs:1:7:1:16 | this access | normal | -| Conditions.cs:1:7:1:16 | {...} | Conditions.cs:1:7:1:16 | {...} | normal | -| Conditions.cs:4:5:9:5 | {...} | Conditions.cs:7:13:7:16 | !... | false | -| Conditions.cs:4:5:9:5 | {...} | Conditions.cs:8:13:8:15 | ...-- | normal | -| Conditions.cs:5:9:6:16 | if (...) ... | Conditions.cs:5:13:5:15 | access to parameter inc | false | -| Conditions.cs:5:9:6:16 | if (...) ... | Conditions.cs:6:13:6:15 | ...++ | normal | -| Conditions.cs:5:13:5:15 | access to parameter inc | Conditions.cs:5:13:5:15 | access to parameter inc | false | -| Conditions.cs:5:13:5:15 | access to parameter inc | Conditions.cs:5:13:5:15 | access to parameter inc | true | -| Conditions.cs:6:13:6:13 | access to parameter x | Conditions.cs:6:13:6:13 | access to parameter x | normal | -| Conditions.cs:6:13:6:15 | ...++ | Conditions.cs:6:13:6:15 | ...++ | normal | -| Conditions.cs:6:13:6:16 | ...; | Conditions.cs:6:13:6:15 | ...++ | normal | -| Conditions.cs:7:9:8:16 | if (...) ... | Conditions.cs:7:13:7:16 | !... | false | -| Conditions.cs:7:9:8:16 | if (...) ... | Conditions.cs:8:13:8:15 | ...-- | normal | -| Conditions.cs:7:13:7:16 | !... | Conditions.cs:7:13:7:16 | !... | false | -| Conditions.cs:7:13:7:16 | !... | Conditions.cs:7:13:7:16 | !... | true | -| Conditions.cs:7:14:7:16 | access to parameter inc | Conditions.cs:7:14:7:16 | access to parameter inc | false | -| Conditions.cs:7:14:7:16 | access to parameter inc | Conditions.cs:7:14:7:16 | access to parameter inc | true | -| Conditions.cs:8:13:8:13 | access to parameter x | Conditions.cs:8:13:8:13 | access to parameter x | normal | -| Conditions.cs:8:13:8:15 | ...-- | Conditions.cs:8:13:8:15 | ...-- | normal | -| Conditions.cs:8:13:8:16 | ...; | Conditions.cs:8:13:8:15 | ...-- | normal | -| Conditions.cs:12:5:20:5 | {...} | Conditions.cs:19:9:19:17 | return ...; | return | -| Conditions.cs:13:9:13:18 | ... ...; | Conditions.cs:13:13:13:17 | Int32 x = ... | normal | -| Conditions.cs:13:13:13:17 | Int32 x = ... | Conditions.cs:13:13:13:17 | Int32 x = ... | normal | -| Conditions.cs:13:17:13:17 | 0 | Conditions.cs:13:17:13:17 | 0 | normal | -| Conditions.cs:14:9:15:16 | if (...) ... | Conditions.cs:14:13:14:13 | access to parameter b | false | -| Conditions.cs:14:9:15:16 | if (...) ... | Conditions.cs:15:13:15:15 | ...++ | normal | -| Conditions.cs:14:13:14:13 | access to parameter b | Conditions.cs:14:13:14:13 | access to parameter b | false | -| Conditions.cs:14:13:14:13 | access to parameter b | Conditions.cs:14:13:14:13 | access to parameter b | true | -| Conditions.cs:15:13:15:13 | access to local variable x | Conditions.cs:15:13:15:13 | access to local variable x | normal | -| Conditions.cs:15:13:15:15 | ...++ | Conditions.cs:15:13:15:15 | ...++ | normal | -| Conditions.cs:15:13:15:16 | ...; | Conditions.cs:15:13:15:15 | ...++ | normal | -| Conditions.cs:16:9:18:20 | if (...) ... | Conditions.cs:16:13:16:17 | ... > ... | false | -| Conditions.cs:16:9:18:20 | if (...) ... | Conditions.cs:17:17:17:18 | !... | false | -| Conditions.cs:16:9:18:20 | if (...) ... | Conditions.cs:18:17:18:19 | ...-- | normal | -| Conditions.cs:16:13:16:13 | access to local variable x | Conditions.cs:16:13:16:13 | access to local variable x | normal | -| Conditions.cs:16:13:16:17 | ... > ... | Conditions.cs:16:13:16:17 | ... > ... | false | -| Conditions.cs:16:13:16:17 | ... > ... | Conditions.cs:16:13:16:17 | ... > ... | true | -| Conditions.cs:16:17:16:17 | 0 | Conditions.cs:16:17:16:17 | 0 | normal | -| Conditions.cs:17:13:18:20 | if (...) ... | Conditions.cs:17:17:17:18 | !... | false | -| Conditions.cs:17:13:18:20 | if (...) ... | Conditions.cs:18:17:18:19 | ...-- | normal | -| Conditions.cs:17:17:17:18 | !... | Conditions.cs:17:17:17:18 | !... | false | -| Conditions.cs:17:17:17:18 | !... | Conditions.cs:17:17:17:18 | !... | true | -| Conditions.cs:17:18:17:18 | access to parameter b | Conditions.cs:17:18:17:18 | access to parameter b | false | -| Conditions.cs:17:18:17:18 | access to parameter b | Conditions.cs:17:18:17:18 | access to parameter b | true | -| Conditions.cs:18:17:18:17 | access to local variable x | Conditions.cs:18:17:18:17 | access to local variable x | normal | -| Conditions.cs:18:17:18:19 | ...-- | Conditions.cs:18:17:18:19 | ...-- | normal | -| Conditions.cs:18:17:18:20 | ...; | Conditions.cs:18:17:18:19 | ...-- | normal | -| Conditions.cs:19:9:19:17 | return ...; | Conditions.cs:19:9:19:17 | return ...; | return | -| Conditions.cs:19:16:19:16 | access to local variable x | Conditions.cs:19:16:19:16 | access to local variable x | normal | -| Conditions.cs:23:5:31:5 | {...} | Conditions.cs:30:9:30:17 | return ...; | return | -| Conditions.cs:24:9:24:18 | ... ...; | Conditions.cs:24:13:24:17 | Int32 x = ... | normal | -| Conditions.cs:24:13:24:17 | Int32 x = ... | Conditions.cs:24:13:24:17 | Int32 x = ... | normal | -| Conditions.cs:24:17:24:17 | 0 | Conditions.cs:24:17:24:17 | 0 | normal | -| Conditions.cs:25:9:27:20 | if (...) ... | Conditions.cs:25:13:25:14 | access to parameter b1 | false | -| Conditions.cs:25:9:27:20 | if (...) ... | Conditions.cs:26:17:26:18 | access to parameter b2 | false | -| Conditions.cs:25:9:27:20 | if (...) ... | Conditions.cs:27:17:27:19 | ...++ | normal | -| Conditions.cs:25:13:25:14 | access to parameter b1 | Conditions.cs:25:13:25:14 | access to parameter b1 | false | -| Conditions.cs:25:13:25:14 | access to parameter b1 | Conditions.cs:25:13:25:14 | access to parameter b1 | true | -| Conditions.cs:26:13:27:20 | if (...) ... | Conditions.cs:26:17:26:18 | access to parameter b2 | false | -| Conditions.cs:26:13:27:20 | if (...) ... | Conditions.cs:27:17:27:19 | ...++ | normal | -| Conditions.cs:26:17:26:18 | access to parameter b2 | Conditions.cs:26:17:26:18 | access to parameter b2 | false | -| Conditions.cs:26:17:26:18 | access to parameter b2 | Conditions.cs:26:17:26:18 | access to parameter b2 | true | -| Conditions.cs:27:17:27:17 | access to local variable x | Conditions.cs:27:17:27:17 | access to local variable x | normal | -| Conditions.cs:27:17:27:19 | ...++ | Conditions.cs:27:17:27:19 | ...++ | normal | -| Conditions.cs:27:17:27:20 | ...; | Conditions.cs:27:17:27:19 | ...++ | normal | -| Conditions.cs:28:9:29:16 | if (...) ... | Conditions.cs:28:13:28:14 | access to parameter b2 | false | -| Conditions.cs:28:9:29:16 | if (...) ... | Conditions.cs:29:13:29:15 | ...++ | normal | -| Conditions.cs:28:13:28:14 | access to parameter b2 | Conditions.cs:28:13:28:14 | access to parameter b2 | false | -| Conditions.cs:28:13:28:14 | access to parameter b2 | Conditions.cs:28:13:28:14 | access to parameter b2 | true | -| Conditions.cs:29:13:29:13 | access to local variable x | Conditions.cs:29:13:29:13 | access to local variable x | normal | -| Conditions.cs:29:13:29:15 | ...++ | Conditions.cs:29:13:29:15 | ...++ | normal | -| Conditions.cs:29:13:29:16 | ...; | Conditions.cs:29:13:29:15 | ...++ | normal | -| Conditions.cs:30:9:30:17 | return ...; | Conditions.cs:30:9:30:17 | return ...; | return | -| Conditions.cs:30:16:30:16 | access to local variable x | Conditions.cs:30:16:30:16 | access to local variable x | normal | -| Conditions.cs:34:5:44:5 | {...} | Conditions.cs:43:9:43:17 | return ...; | return | -| Conditions.cs:35:9:35:18 | ... ...; | Conditions.cs:35:13:35:17 | Int32 x = ... | normal | -| Conditions.cs:35:13:35:17 | Int32 x = ... | Conditions.cs:35:13:35:17 | Int32 x = ... | normal | -| Conditions.cs:35:17:35:17 | 0 | Conditions.cs:35:17:35:17 | 0 | normal | -| Conditions.cs:36:9:36:23 | ... ...; | Conditions.cs:36:13:36:22 | Boolean b2 = ... | normal | -| Conditions.cs:36:13:36:22 | Boolean b2 = ... | Conditions.cs:36:13:36:22 | Boolean b2 = ... | normal | -| Conditions.cs:36:18:36:22 | false | Conditions.cs:36:18:36:22 | false | normal | -| Conditions.cs:37:9:38:20 | if (...) ... | Conditions.cs:37:13:37:14 | access to parameter b1 | false | -| Conditions.cs:37:9:38:20 | if (...) ... | Conditions.cs:38:13:38:19 | ... = ... | normal | -| Conditions.cs:37:13:37:14 | access to parameter b1 | Conditions.cs:37:13:37:14 | access to parameter b1 | false | -| Conditions.cs:37:13:37:14 | access to parameter b1 | Conditions.cs:37:13:37:14 | access to parameter b1 | true | -| Conditions.cs:38:13:38:19 | ... = ... | Conditions.cs:38:13:38:19 | ... = ... | normal | -| Conditions.cs:38:13:38:20 | ...; | Conditions.cs:38:13:38:19 | ... = ... | normal | -| Conditions.cs:38:18:38:19 | access to parameter b1 | Conditions.cs:38:18:38:19 | access to parameter b1 | normal | -| Conditions.cs:39:9:40:16 | if (...) ... | Conditions.cs:39:13:39:14 | access to local variable b2 | false | -| Conditions.cs:39:9:40:16 | if (...) ... | Conditions.cs:40:13:40:15 | ...++ | normal | -| Conditions.cs:39:13:39:14 | access to local variable b2 | Conditions.cs:39:13:39:14 | access to local variable b2 | false | -| Conditions.cs:39:13:39:14 | access to local variable b2 | Conditions.cs:39:13:39:14 | access to local variable b2 | true | -| Conditions.cs:40:13:40:13 | access to local variable x | Conditions.cs:40:13:40:13 | access to local variable x | normal | -| Conditions.cs:40:13:40:15 | ...++ | Conditions.cs:40:13:40:15 | ...++ | normal | -| Conditions.cs:40:13:40:16 | ...; | Conditions.cs:40:13:40:15 | ...++ | normal | -| Conditions.cs:41:9:42:16 | if (...) ... | Conditions.cs:41:13:41:14 | access to local variable b2 | false | -| Conditions.cs:41:9:42:16 | if (...) ... | Conditions.cs:42:13:42:15 | ...++ | normal | -| Conditions.cs:41:13:41:14 | access to local variable b2 | Conditions.cs:41:13:41:14 | access to local variable b2 | false | -| Conditions.cs:41:13:41:14 | access to local variable b2 | Conditions.cs:41:13:41:14 | access to local variable b2 | true | -| Conditions.cs:42:13:42:13 | access to local variable x | Conditions.cs:42:13:42:13 | access to local variable x | normal | -| Conditions.cs:42:13:42:15 | ...++ | Conditions.cs:42:13:42:15 | ...++ | normal | -| Conditions.cs:42:13:42:16 | ...; | Conditions.cs:42:13:42:15 | ...++ | normal | -| Conditions.cs:43:9:43:17 | return ...; | Conditions.cs:43:9:43:17 | return ...; | return | -| Conditions.cs:43:16:43:16 | access to local variable x | Conditions.cs:43:16:43:16 | access to local variable x | normal | -| Conditions.cs:47:5:55:5 | {...} | Conditions.cs:54:9:54:17 | return ...; | return | -| Conditions.cs:48:9:48:18 | ... ...; | Conditions.cs:48:13:48:17 | Int32 y = ... | normal | -| Conditions.cs:48:13:48:17 | Int32 y = ... | Conditions.cs:48:13:48:17 | Int32 y = ... | normal | -| Conditions.cs:48:17:48:17 | 0 | Conditions.cs:48:17:48:17 | 0 | normal | -| Conditions.cs:49:9:53:9 | while (...) ... | Conditions.cs:49:16:49:22 | ... > ... | false | -| Conditions.cs:49:16:49:16 | access to parameter x | Conditions.cs:49:16:49:16 | access to parameter x | normal | -| Conditions.cs:49:16:49:18 | ...-- | Conditions.cs:49:16:49:18 | ...-- | normal | -| Conditions.cs:49:16:49:22 | ... > ... | Conditions.cs:49:16:49:22 | ... > ... | false | -| Conditions.cs:49:16:49:22 | ... > ... | Conditions.cs:49:16:49:22 | ... > ... | true | -| Conditions.cs:49:22:49:22 | 0 | Conditions.cs:49:22:49:22 | 0 | normal | -| Conditions.cs:50:9:53:9 | {...} | Conditions.cs:51:17:51:17 | access to parameter b | false | -| Conditions.cs:50:9:53:9 | {...} | Conditions.cs:52:17:52:19 | ...++ | normal | -| Conditions.cs:51:13:52:20 | if (...) ... | Conditions.cs:51:17:51:17 | access to parameter b | false | -| Conditions.cs:51:13:52:20 | if (...) ... | Conditions.cs:52:17:52:19 | ...++ | normal | -| Conditions.cs:51:17:51:17 | access to parameter b | Conditions.cs:51:17:51:17 | access to parameter b | false | -| Conditions.cs:51:17:51:17 | access to parameter b | Conditions.cs:51:17:51:17 | access to parameter b | true | -| Conditions.cs:52:17:52:17 | access to local variable y | Conditions.cs:52:17:52:17 | access to local variable y | normal | -| Conditions.cs:52:17:52:19 | ...++ | Conditions.cs:52:17:52:19 | ...++ | normal | -| Conditions.cs:52:17:52:20 | ...; | Conditions.cs:52:17:52:19 | ...++ | normal | -| Conditions.cs:54:9:54:17 | return ...; | Conditions.cs:54:9:54:17 | return ...; | return | -| Conditions.cs:54:16:54:16 | access to local variable y | Conditions.cs:54:16:54:16 | access to local variable y | normal | -| Conditions.cs:58:5:68:5 | {...} | Conditions.cs:67:9:67:17 | return ...; | return | -| Conditions.cs:59:9:59:18 | ... ...; | Conditions.cs:59:13:59:17 | Int32 y = ... | normal | -| Conditions.cs:59:13:59:17 | Int32 y = ... | Conditions.cs:59:13:59:17 | Int32 y = ... | normal | -| Conditions.cs:59:17:59:17 | 0 | Conditions.cs:59:17:59:17 | 0 | normal | -| Conditions.cs:60:9:64:9 | while (...) ... | Conditions.cs:60:16:60:22 | ... > ... | false | -| Conditions.cs:60:16:60:16 | access to parameter x | Conditions.cs:60:16:60:16 | access to parameter x | normal | -| Conditions.cs:60:16:60:18 | ...-- | Conditions.cs:60:16:60:18 | ...-- | normal | -| Conditions.cs:60:16:60:22 | ... > ... | Conditions.cs:60:16:60:22 | ... > ... | false | -| Conditions.cs:60:16:60:22 | ... > ... | Conditions.cs:60:16:60:22 | ... > ... | true | -| Conditions.cs:60:22:60:22 | 0 | Conditions.cs:60:22:60:22 | 0 | normal | -| Conditions.cs:61:9:64:9 | {...} | Conditions.cs:62:17:62:17 | access to parameter b | false | -| Conditions.cs:61:9:64:9 | {...} | Conditions.cs:63:17:63:19 | ...++ | normal | -| Conditions.cs:62:13:63:20 | if (...) ... | Conditions.cs:62:17:62:17 | access to parameter b | false | -| Conditions.cs:62:13:63:20 | if (...) ... | Conditions.cs:63:17:63:19 | ...++ | normal | -| Conditions.cs:62:17:62:17 | access to parameter b | Conditions.cs:62:17:62:17 | access to parameter b | false | -| Conditions.cs:62:17:62:17 | access to parameter b | Conditions.cs:62:17:62:17 | access to parameter b | true | -| Conditions.cs:63:17:63:17 | access to local variable y | Conditions.cs:63:17:63:17 | access to local variable y | normal | -| Conditions.cs:63:17:63:19 | ...++ | Conditions.cs:63:17:63:19 | ...++ | normal | -| Conditions.cs:63:17:63:20 | ...; | Conditions.cs:63:17:63:19 | ...++ | normal | -| Conditions.cs:65:9:66:16 | if (...) ... | Conditions.cs:65:13:65:13 | access to parameter b | false | -| Conditions.cs:65:9:66:16 | if (...) ... | Conditions.cs:66:13:66:15 | ...++ | normal | -| Conditions.cs:65:13:65:13 | access to parameter b | Conditions.cs:65:13:65:13 | access to parameter b | false | -| Conditions.cs:65:13:65:13 | access to parameter b | Conditions.cs:65:13:65:13 | access to parameter b | true | -| Conditions.cs:66:13:66:13 | access to local variable y | Conditions.cs:66:13:66:13 | access to local variable y | normal | -| Conditions.cs:66:13:66:15 | ...++ | Conditions.cs:66:13:66:15 | ...++ | normal | -| Conditions.cs:66:13:66:16 | ...; | Conditions.cs:66:13:66:15 | ...++ | normal | -| Conditions.cs:67:9:67:17 | return ...; | Conditions.cs:67:9:67:17 | return ...; | return | -| Conditions.cs:67:16:67:16 | access to local variable y | Conditions.cs:67:16:67:16 | access to local variable y | normal | -| Conditions.cs:71:5:84:5 | {...} | Conditions.cs:83:9:83:17 | return ...; | return | -| Conditions.cs:72:9:72:30 | ... ...; | Conditions.cs:72:13:72:29 | Boolean b = ... | normal | -| Conditions.cs:72:13:72:29 | Boolean b = ... | Conditions.cs:72:13:72:29 | Boolean b = ... | normal | -| Conditions.cs:72:17:72:18 | access to parameter ss | Conditions.cs:72:17:72:18 | access to parameter ss | normal | -| Conditions.cs:72:17:72:25 | access to property Length | Conditions.cs:72:17:72:25 | access to property Length | normal | -| Conditions.cs:72:17:72:29 | ... > ... | Conditions.cs:72:17:72:29 | ... > ... | normal | -| Conditions.cs:72:29:72:29 | 0 | Conditions.cs:72:29:72:29 | 0 | normal | -| Conditions.cs:73:9:73:18 | ... ...; | Conditions.cs:73:13:73:17 | Int32 x = ... | normal | -| Conditions.cs:73:13:73:17 | Int32 x = ... | Conditions.cs:73:13:73:17 | Int32 x = ... | normal | -| Conditions.cs:73:17:73:17 | 0 | Conditions.cs:73:17:73:17 | 0 | normal | -| Conditions.cs:74:9:80:9 | foreach (... ... in ...) ... | Conditions.cs:74:9:80:9 | foreach (... ... in ...) ... | empty | -| Conditions.cs:74:22:74:22 | String _ | Conditions.cs:74:22:74:22 | String _ | normal | -| Conditions.cs:74:27:74:28 | access to parameter ss | Conditions.cs:74:27:74:28 | access to parameter ss | normal | -| Conditions.cs:75:9:80:9 | {...} | Conditions.cs:78:17:78:21 | ... > ... | false | -| Conditions.cs:75:9:80:9 | {...} | Conditions.cs:79:17:79:25 | ... = ... | normal | -| Conditions.cs:76:13:77:20 | if (...) ... | Conditions.cs:76:17:76:17 | access to local variable b | false | -| Conditions.cs:76:13:77:20 | if (...) ... | Conditions.cs:77:17:77:19 | ...++ | normal | -| Conditions.cs:76:17:76:17 | access to local variable b | Conditions.cs:76:17:76:17 | access to local variable b | false | -| Conditions.cs:76:17:76:17 | access to local variable b | Conditions.cs:76:17:76:17 | access to local variable b | true | -| Conditions.cs:77:17:77:17 | access to local variable x | Conditions.cs:77:17:77:17 | access to local variable x | normal | -| Conditions.cs:77:17:77:19 | ...++ | Conditions.cs:77:17:77:19 | ...++ | normal | -| Conditions.cs:77:17:77:20 | ...; | Conditions.cs:77:17:77:19 | ...++ | normal | -| Conditions.cs:78:13:79:26 | if (...) ... | Conditions.cs:78:17:78:21 | ... > ... | false | -| Conditions.cs:78:13:79:26 | if (...) ... | Conditions.cs:79:17:79:25 | ... = ... | normal | -| Conditions.cs:78:17:78:17 | access to local variable x | Conditions.cs:78:17:78:17 | access to local variable x | normal | -| Conditions.cs:78:17:78:21 | ... > ... | Conditions.cs:78:17:78:21 | ... > ... | false | -| Conditions.cs:78:17:78:21 | ... > ... | Conditions.cs:78:17:78:21 | ... > ... | true | -| Conditions.cs:78:21:78:21 | 0 | Conditions.cs:78:21:78:21 | 0 | normal | -| Conditions.cs:79:17:79:25 | ... = ... | Conditions.cs:79:17:79:25 | ... = ... | normal | -| Conditions.cs:79:17:79:26 | ...; | Conditions.cs:79:17:79:25 | ... = ... | normal | -| Conditions.cs:79:21:79:25 | false | Conditions.cs:79:21:79:25 | false | normal | -| Conditions.cs:81:9:82:16 | if (...) ... | Conditions.cs:81:13:81:13 | access to local variable b | false | -| Conditions.cs:81:9:82:16 | if (...) ... | Conditions.cs:82:13:82:15 | ...++ | normal | -| Conditions.cs:81:13:81:13 | access to local variable b | Conditions.cs:81:13:81:13 | access to local variable b | false | -| Conditions.cs:81:13:81:13 | access to local variable b | Conditions.cs:81:13:81:13 | access to local variable b | true | -| Conditions.cs:82:13:82:13 | access to local variable x | Conditions.cs:82:13:82:13 | access to local variable x | normal | -| Conditions.cs:82:13:82:15 | ...++ | Conditions.cs:82:13:82:15 | ...++ | normal | -| Conditions.cs:82:13:82:16 | ...; | Conditions.cs:82:13:82:15 | ...++ | normal | -| Conditions.cs:83:9:83:17 | return ...; | Conditions.cs:83:9:83:17 | return ...; | return | -| Conditions.cs:83:16:83:16 | access to local variable x | Conditions.cs:83:16:83:16 | access to local variable x | normal | -| Conditions.cs:87:5:100:5 | {...} | Conditions.cs:99:9:99:17 | return ...; | return | -| Conditions.cs:88:9:88:30 | ... ...; | Conditions.cs:88:13:88:29 | Boolean b = ... | normal | -| Conditions.cs:88:13:88:29 | Boolean b = ... | Conditions.cs:88:13:88:29 | Boolean b = ... | normal | -| Conditions.cs:88:17:88:18 | access to parameter ss | Conditions.cs:88:17:88:18 | access to parameter ss | normal | -| Conditions.cs:88:17:88:25 | access to property Length | Conditions.cs:88:17:88:25 | access to property Length | normal | -| Conditions.cs:88:17:88:29 | ... > ... | Conditions.cs:88:17:88:29 | ... > ... | normal | -| Conditions.cs:88:29:88:29 | 0 | Conditions.cs:88:29:88:29 | 0 | normal | -| Conditions.cs:89:9:89:18 | ... ...; | Conditions.cs:89:13:89:17 | Int32 x = ... | normal | -| Conditions.cs:89:13:89:17 | Int32 x = ... | Conditions.cs:89:13:89:17 | Int32 x = ... | normal | -| Conditions.cs:89:17:89:17 | 0 | Conditions.cs:89:17:89:17 | 0 | normal | -| Conditions.cs:90:9:98:9 | foreach (... ... in ...) ... | Conditions.cs:90:9:98:9 | foreach (... ... in ...) ... | empty | -| Conditions.cs:90:22:90:22 | String _ | Conditions.cs:90:22:90:22 | String _ | normal | -| Conditions.cs:90:27:90:28 | access to parameter ss | Conditions.cs:90:27:90:28 | access to parameter ss | normal | -| Conditions.cs:91:9:98:9 | {...} | Conditions.cs:96:17:96:17 | access to local variable b | false | -| Conditions.cs:91:9:98:9 | {...} | Conditions.cs:97:17:97:19 | ...++ | normal | -| Conditions.cs:92:13:93:20 | if (...) ... | Conditions.cs:92:17:92:17 | access to local variable b | false | -| Conditions.cs:92:13:93:20 | if (...) ... | Conditions.cs:93:17:93:19 | ...++ | normal | -| Conditions.cs:92:17:92:17 | access to local variable b | Conditions.cs:92:17:92:17 | access to local variable b | false | -| Conditions.cs:92:17:92:17 | access to local variable b | Conditions.cs:92:17:92:17 | access to local variable b | true | -| Conditions.cs:93:17:93:17 | access to local variable x | Conditions.cs:93:17:93:17 | access to local variable x | normal | -| Conditions.cs:93:17:93:19 | ...++ | Conditions.cs:93:17:93:19 | ...++ | normal | -| Conditions.cs:93:17:93:20 | ...; | Conditions.cs:93:17:93:19 | ...++ | normal | -| Conditions.cs:94:13:95:26 | if (...) ... | Conditions.cs:94:17:94:21 | ... > ... | false | -| Conditions.cs:94:13:95:26 | if (...) ... | Conditions.cs:95:17:95:25 | ... = ... | normal | -| Conditions.cs:94:17:94:17 | access to local variable x | Conditions.cs:94:17:94:17 | access to local variable x | normal | -| Conditions.cs:94:17:94:21 | ... > ... | Conditions.cs:94:17:94:21 | ... > ... | false | -| Conditions.cs:94:17:94:21 | ... > ... | Conditions.cs:94:17:94:21 | ... > ... | true | -| Conditions.cs:94:21:94:21 | 0 | Conditions.cs:94:21:94:21 | 0 | normal | -| Conditions.cs:95:17:95:25 | ... = ... | Conditions.cs:95:17:95:25 | ... = ... | normal | -| Conditions.cs:95:17:95:26 | ...; | Conditions.cs:95:17:95:25 | ... = ... | normal | -| Conditions.cs:95:21:95:25 | false | Conditions.cs:95:21:95:25 | false | normal | -| Conditions.cs:96:13:97:20 | if (...) ... | Conditions.cs:96:17:96:17 | access to local variable b | false | -| Conditions.cs:96:13:97:20 | if (...) ... | Conditions.cs:97:17:97:19 | ...++ | normal | -| Conditions.cs:96:17:96:17 | access to local variable b | Conditions.cs:96:17:96:17 | access to local variable b | false | -| Conditions.cs:96:17:96:17 | access to local variable b | Conditions.cs:96:17:96:17 | access to local variable b | true | -| Conditions.cs:97:17:97:17 | access to local variable x | Conditions.cs:97:17:97:17 | access to local variable x | normal | -| Conditions.cs:97:17:97:19 | ...++ | Conditions.cs:97:17:97:19 | ...++ | normal | -| Conditions.cs:97:17:97:20 | ...; | Conditions.cs:97:17:97:19 | ...++ | normal | -| Conditions.cs:99:9:99:17 | return ...; | Conditions.cs:99:9:99:17 | return ...; | return | -| Conditions.cs:99:16:99:16 | access to local variable x | Conditions.cs:99:16:99:16 | access to local variable x | normal | -| Conditions.cs:103:5:111:5 | {...} | Conditions.cs:110:9:110:17 | return ...; | return | -| Conditions.cs:104:9:104:29 | ... ...; | Conditions.cs:104:13:104:28 | String x = ... | normal | -| Conditions.cs:104:13:104:28 | String x = ... | Conditions.cs:104:13:104:28 | String x = ... | normal | -| Conditions.cs:104:17:104:17 | access to parameter b | Conditions.cs:104:17:104:17 | access to parameter b | normal | -| Conditions.cs:104:17:104:28 | call to method ToString | Conditions.cs:104:17:104:28 | call to method ToString | normal | -| Conditions.cs:105:9:106:20 | if (...) ... | Conditions.cs:105:13:105:13 | access to parameter b | false | -| Conditions.cs:105:9:106:20 | if (...) ... | Conditions.cs:106:13:106:19 | ... = ... | normal | -| Conditions.cs:105:13:105:13 | access to parameter b | Conditions.cs:105:13:105:13 | access to parameter b | false | -| Conditions.cs:105:13:105:13 | access to parameter b | Conditions.cs:105:13:105:13 | access to parameter b | true | -| Conditions.cs:106:13:106:13 | access to local variable x | Conditions.cs:106:13:106:13 | access to local variable x | normal | -| Conditions.cs:106:13:106:19 | ... + ... | Conditions.cs:106:13:106:19 | ... + ... | normal | -| Conditions.cs:106:13:106:19 | ... += ... | Conditions.cs:106:13:106:19 | ... = ... | normal | -| Conditions.cs:106:13:106:19 | ... = ... | Conditions.cs:106:13:106:19 | ... = ... | normal | -| Conditions.cs:106:13:106:20 | ...; | Conditions.cs:106:13:106:19 | ... = ... | normal | -| Conditions.cs:106:18:106:19 | "" | Conditions.cs:106:18:106:19 | "" | normal | -| Conditions.cs:107:9:109:24 | if (...) ... | Conditions.cs:107:13:107:24 | ... > ... | false | -| Conditions.cs:107:9:109:24 | if (...) ... | Conditions.cs:108:17:108:18 | !... | false | -| Conditions.cs:107:9:109:24 | if (...) ... | Conditions.cs:109:17:109:23 | ... = ... | normal | -| Conditions.cs:107:13:107:13 | access to local variable x | Conditions.cs:107:13:107:13 | access to local variable x | normal | -| Conditions.cs:107:13:107:20 | access to property Length | Conditions.cs:107:13:107:20 | access to property Length | normal | -| Conditions.cs:107:13:107:24 | ... > ... | Conditions.cs:107:13:107:24 | ... > ... | false | -| Conditions.cs:107:13:107:24 | ... > ... | Conditions.cs:107:13:107:24 | ... > ... | true | -| Conditions.cs:107:24:107:24 | 0 | Conditions.cs:107:24:107:24 | 0 | normal | -| Conditions.cs:108:13:109:24 | if (...) ... | Conditions.cs:108:17:108:18 | !... | false | -| Conditions.cs:108:13:109:24 | if (...) ... | Conditions.cs:109:17:109:23 | ... = ... | normal | -| Conditions.cs:108:17:108:18 | !... | Conditions.cs:108:17:108:18 | !... | false | -| Conditions.cs:108:17:108:18 | !... | Conditions.cs:108:17:108:18 | !... | true | -| Conditions.cs:108:18:108:18 | access to parameter b | Conditions.cs:108:18:108:18 | access to parameter b | false | -| Conditions.cs:108:18:108:18 | access to parameter b | Conditions.cs:108:18:108:18 | access to parameter b | true | -| Conditions.cs:109:17:109:17 | access to local variable x | Conditions.cs:109:17:109:17 | access to local variable x | normal | -| Conditions.cs:109:17:109:23 | ... + ... | Conditions.cs:109:17:109:23 | ... + ... | normal | -| Conditions.cs:109:17:109:23 | ... += ... | Conditions.cs:109:17:109:23 | ... = ... | normal | -| Conditions.cs:109:17:109:23 | ... = ... | Conditions.cs:109:17:109:23 | ... = ... | normal | -| Conditions.cs:109:17:109:24 | ...; | Conditions.cs:109:17:109:23 | ... = ... | normal | -| Conditions.cs:109:22:109:23 | "" | Conditions.cs:109:22:109:23 | "" | normal | -| Conditions.cs:110:9:110:17 | return ...; | Conditions.cs:110:9:110:17 | return ...; | return | -| Conditions.cs:110:16:110:16 | access to local variable x | Conditions.cs:110:16:110:16 | access to local variable x | normal | -| Conditions.cs:114:5:124:5 | {...} | Conditions.cs:116:25:116:39 | ... < ... | false | -| Conditions.cs:115:9:115:24 | ... ...; | Conditions.cs:115:16:115:23 | String s = ... | normal | -| Conditions.cs:115:16:115:23 | String s = ... | Conditions.cs:115:16:115:23 | String s = ... | normal | -| Conditions.cs:115:20:115:23 | null | Conditions.cs:115:20:115:23 | null | normal | -| Conditions.cs:116:9:123:9 | for (...;...;...) ... | Conditions.cs:116:25:116:39 | ... < ... | false | -| Conditions.cs:116:18:116:22 | Int32 i = ... | Conditions.cs:116:18:116:22 | Int32 i = ... | normal | -| Conditions.cs:116:22:116:22 | 0 | Conditions.cs:116:22:116:22 | 0 | normal | -| Conditions.cs:116:25:116:25 | access to local variable i | Conditions.cs:116:25:116:25 | access to local variable i | normal | -| Conditions.cs:116:25:116:39 | ... < ... | Conditions.cs:116:25:116:39 | ... < ... | false | -| Conditions.cs:116:25:116:39 | ... < ... | Conditions.cs:116:25:116:39 | ... < ... | true | -| Conditions.cs:116:29:116:32 | access to parameter args | Conditions.cs:116:29:116:32 | access to parameter args | normal | -| Conditions.cs:116:29:116:39 | access to property Length | Conditions.cs:116:29:116:39 | access to property Length | normal | -| Conditions.cs:116:42:116:42 | access to local variable i | Conditions.cs:116:42:116:42 | access to local variable i | normal | -| Conditions.cs:116:42:116:44 | ...++ | Conditions.cs:116:42:116:44 | ...++ | normal | -| Conditions.cs:117:9:123:9 | {...} | Conditions.cs:121:17:121:20 | access to local variable last | false | -| Conditions.cs:117:9:123:9 | {...} | Conditions.cs:122:17:122:24 | ... = ... | normal | -| Conditions.cs:118:13:118:44 | ... ...; | Conditions.cs:118:17:118:43 | Boolean last = ... | normal | -| Conditions.cs:118:17:118:43 | Boolean last = ... | Conditions.cs:118:17:118:43 | Boolean last = ... | normal | -| Conditions.cs:118:24:118:24 | access to local variable i | Conditions.cs:118:24:118:24 | access to local variable i | normal | -| Conditions.cs:118:24:118:43 | ... == ... | Conditions.cs:118:24:118:43 | ... == ... | normal | -| Conditions.cs:118:29:118:32 | access to parameter args | Conditions.cs:118:29:118:32 | access to parameter args | normal | -| Conditions.cs:118:29:118:39 | access to property Length | Conditions.cs:118:29:118:39 | access to property Length | normal | -| Conditions.cs:118:29:118:43 | ... - ... | Conditions.cs:118:29:118:43 | ... - ... | normal | -| Conditions.cs:118:43:118:43 | 1 | Conditions.cs:118:43:118:43 | 1 | normal | -| Conditions.cs:119:13:120:23 | if (...) ... | Conditions.cs:119:17:119:21 | !... | false | -| Conditions.cs:119:13:120:23 | if (...) ... | Conditions.cs:120:17:120:22 | ... = ... | normal | -| Conditions.cs:119:17:119:21 | !... | Conditions.cs:119:17:119:21 | !... | false | -| Conditions.cs:119:17:119:21 | !... | Conditions.cs:119:17:119:21 | !... | true | -| Conditions.cs:119:18:119:21 | access to local variable last | Conditions.cs:119:18:119:21 | access to local variable last | false | -| Conditions.cs:119:18:119:21 | access to local variable last | Conditions.cs:119:18:119:21 | access to local variable last | true | -| Conditions.cs:120:17:120:22 | ... = ... | Conditions.cs:120:17:120:22 | ... = ... | normal | -| Conditions.cs:120:17:120:23 | ...; | Conditions.cs:120:17:120:22 | ... = ... | normal | -| Conditions.cs:120:21:120:22 | "" | Conditions.cs:120:21:120:22 | "" | normal | -| Conditions.cs:121:13:122:25 | if (...) ... | Conditions.cs:121:17:121:20 | access to local variable last | false | -| Conditions.cs:121:13:122:25 | if (...) ... | Conditions.cs:122:17:122:24 | ... = ... | normal | -| Conditions.cs:121:17:121:20 | access to local variable last | Conditions.cs:121:17:121:20 | access to local variable last | false | -| Conditions.cs:121:17:121:20 | access to local variable last | Conditions.cs:121:17:121:20 | access to local variable last | true | -| Conditions.cs:122:17:122:24 | ... = ... | Conditions.cs:122:17:122:24 | ... = ... | normal | -| Conditions.cs:122:17:122:25 | ...; | Conditions.cs:122:17:122:24 | ... = ... | normal | -| Conditions.cs:122:21:122:24 | null | Conditions.cs:122:21:122:24 | null | normal | -| Conditions.cs:131:16:131:19 | true | Conditions.cs:131:16:131:19 | true | true | -| Conditions.cs:132:9:140:9 | {...} | Conditions.cs:133:17:133:22 | access to field Field1 | false | -| Conditions.cs:132:9:140:9 | {...} | Conditions.cs:135:21:135:26 | access to field Field2 | false | -| Conditions.cs:132:9:140:9 | {...} | Conditions.cs:137:21:137:37 | call to method ToString | normal | -| Conditions.cs:133:13:139:13 | if (...) ... | Conditions.cs:133:17:133:22 | access to field Field1 | false | -| Conditions.cs:133:13:139:13 | if (...) ... | Conditions.cs:135:21:135:26 | access to field Field2 | false | -| Conditions.cs:133:13:139:13 | if (...) ... | Conditions.cs:137:21:137:37 | call to method ToString | normal | -| Conditions.cs:133:17:133:22 | access to field Field1 | Conditions.cs:133:17:133:22 | access to field Field1 | false | -| Conditions.cs:133:17:133:22 | access to field Field1 | Conditions.cs:133:17:133:22 | access to field Field1 | true | -| Conditions.cs:133:17:133:22 | this access | Conditions.cs:133:17:133:22 | this access | normal | -| Conditions.cs:134:13:139:13 | {...} | Conditions.cs:135:21:135:26 | access to field Field2 | false | -| Conditions.cs:134:13:139:13 | {...} | Conditions.cs:137:21:137:37 | call to method ToString | normal | -| Conditions.cs:135:17:138:17 | if (...) ... | Conditions.cs:135:21:135:26 | access to field Field2 | false | -| Conditions.cs:135:17:138:17 | if (...) ... | Conditions.cs:137:21:137:37 | call to method ToString | normal | -| Conditions.cs:135:21:135:26 | access to field Field2 | Conditions.cs:135:21:135:26 | access to field Field2 | false | -| Conditions.cs:135:21:135:26 | access to field Field2 | Conditions.cs:135:21:135:26 | access to field Field2 | true | -| Conditions.cs:135:21:135:26 | this access | Conditions.cs:135:21:135:26 | this access | normal | -| Conditions.cs:136:17:138:17 | {...} | Conditions.cs:137:21:137:37 | call to method ToString | normal | -| Conditions.cs:137:21:137:26 | access to field Field1 | Conditions.cs:137:21:137:26 | access to field Field1 | normal | -| Conditions.cs:137:21:137:26 | this access | Conditions.cs:137:21:137:26 | this access | normal | -| Conditions.cs:137:21:137:37 | call to method ToString | Conditions.cs:137:21:137:37 | call to method ToString | normal | -| Conditions.cs:137:21:137:38 | ...; | Conditions.cs:137:21:137:37 | call to method ToString | normal | -| Conditions.cs:144:5:150:5 | {...} | Conditions.cs:147:13:147:48 | call to method WriteLine | normal | -| Conditions.cs:144:5:150:5 | {...} | Conditions.cs:149:13:149:48 | call to method WriteLine | normal | -| Conditions.cs:145:9:145:30 | ... ...; | Conditions.cs:145:13:145:29 | String s = ... | normal | -| Conditions.cs:145:13:145:29 | String s = ... | Conditions.cs:145:13:145:29 | String s = ... | normal | -| Conditions.cs:145:17:145:17 | access to parameter b | Conditions.cs:145:17:145:17 | access to parameter b | false | -| Conditions.cs:145:17:145:17 | access to parameter b | Conditions.cs:145:17:145:17 | access to parameter b | true | -| Conditions.cs:145:17:145:29 | ... ? ... : ... | Conditions.cs:145:17:145:29 | ... ? ... : ... | normal | -| Conditions.cs:145:21:145:23 | "a" | Conditions.cs:145:21:145:23 | "a" | normal | -| Conditions.cs:145:27:145:29 | "b" | Conditions.cs:145:27:145:29 | "b" | normal | -| Conditions.cs:146:9:149:49 | if (...) ... | Conditions.cs:147:13:147:48 | call to method WriteLine | normal | -| Conditions.cs:146:9:149:49 | if (...) ... | Conditions.cs:149:13:149:48 | call to method WriteLine | normal | -| Conditions.cs:146:13:146:13 | access to parameter b | Conditions.cs:146:13:146:13 | access to parameter b | false | -| Conditions.cs:146:13:146:13 | access to parameter b | Conditions.cs:146:13:146:13 | access to parameter b | true | -| Conditions.cs:147:13:147:48 | call to method WriteLine | Conditions.cs:147:13:147:48 | call to method WriteLine | normal | -| Conditions.cs:147:13:147:49 | ...; | Conditions.cs:147:13:147:48 | call to method WriteLine | normal | -| Conditions.cs:147:38:147:47 | $"..." | Conditions.cs:147:38:147:47 | $"..." | normal | -| Conditions.cs:147:40:147:43 | "a = " | Conditions.cs:147:40:147:43 | "a = " | normal | -| Conditions.cs:147:44:147:46 | {...} | Conditions.cs:147:44:147:46 | {...} | normal | -| Conditions.cs:147:45:147:45 | access to local variable s | Conditions.cs:147:45:147:45 | access to local variable s | normal | -| Conditions.cs:149:13:149:48 | call to method WriteLine | Conditions.cs:149:13:149:48 | call to method WriteLine | normal | -| Conditions.cs:149:13:149:49 | ...; | Conditions.cs:149:13:149:48 | call to method WriteLine | normal | -| Conditions.cs:149:38:149:47 | $"..." | Conditions.cs:149:38:149:47 | $"..." | normal | -| Conditions.cs:149:40:149:43 | "b = " | Conditions.cs:149:40:149:43 | "b = " | normal | -| Conditions.cs:149:44:149:46 | {...} | Conditions.cs:149:44:149:46 | {...} | normal | -| Conditions.cs:149:45:149:45 | access to local variable s | Conditions.cs:149:45:149:45 | access to local variable s | normal | -| ExitMethods.cs:6:7:6:17 | call to constructor Object | ExitMethods.cs:6:7:6:17 | call to constructor Object | normal | -| ExitMethods.cs:6:7:6:17 | call to method | ExitMethods.cs:6:7:6:17 | call to method | normal | -| ExitMethods.cs:6:7:6:17 | this access | ExitMethods.cs:6:7:6:17 | this access | normal | -| ExitMethods.cs:6:7:6:17 | {...} | ExitMethods.cs:6:7:6:17 | {...} | normal | -| ExitMethods.cs:9:5:12:5 | {...} | ExitMethods.cs:11:9:11:15 | return ...; | return | -| ExitMethods.cs:10:9:10:24 | call to method ErrorMaybe | ExitMethods.cs:10:9:10:24 | call to method ErrorMaybe | normal | -| ExitMethods.cs:10:9:10:25 | ...; | ExitMethods.cs:10:9:10:24 | call to method ErrorMaybe | normal | -| ExitMethods.cs:10:20:10:23 | true | ExitMethods.cs:10:20:10:23 | true | normal | -| ExitMethods.cs:11:9:11:15 | return ...; | ExitMethods.cs:11:9:11:15 | return ...; | return | -| ExitMethods.cs:15:5:18:5 | {...} | ExitMethods.cs:17:9:17:15 | return ...; | return | -| ExitMethods.cs:16:9:16:25 | call to method ErrorMaybe | ExitMethods.cs:16:9:16:25 | call to method ErrorMaybe | normal | -| ExitMethods.cs:16:9:16:26 | ...; | ExitMethods.cs:16:9:16:25 | call to method ErrorMaybe | normal | -| ExitMethods.cs:16:20:16:24 | false | ExitMethods.cs:16:20:16:24 | false | normal | -| ExitMethods.cs:17:9:17:15 | return ...; | ExitMethods.cs:17:9:17:15 | return ...; | return | -| ExitMethods.cs:21:5:24:5 | {...} | ExitMethods.cs:22:9:22:25 | call to method ErrorAlways | throw(ArgumentException) | -| ExitMethods.cs:21:5:24:5 | {...} | ExitMethods.cs:22:9:22:25 | call to method ErrorAlways | throw(Exception) | -| ExitMethods.cs:21:5:24:5 | {...} | ExitMethods.cs:23:9:23:15 | return ...; | return | -| ExitMethods.cs:22:9:22:25 | call to method ErrorAlways | ExitMethods.cs:22:9:22:25 | call to method ErrorAlways | throw(ArgumentException) | -| ExitMethods.cs:22:9:22:25 | call to method ErrorAlways | ExitMethods.cs:22:9:22:25 | call to method ErrorAlways | throw(Exception) | -| ExitMethods.cs:22:9:22:26 | ...; | ExitMethods.cs:22:9:22:25 | call to method ErrorAlways | throw(ArgumentException) | -| ExitMethods.cs:22:9:22:26 | ...; | ExitMethods.cs:22:9:22:25 | call to method ErrorAlways | throw(Exception) | -| ExitMethods.cs:22:21:22:24 | true | ExitMethods.cs:22:21:22:24 | true | normal | -| ExitMethods.cs:23:9:23:15 | return ...; | ExitMethods.cs:23:9:23:15 | return ...; | return | -| ExitMethods.cs:27:5:30:5 | {...} | ExitMethods.cs:28:9:28:14 | call to method Exit | exit | -| ExitMethods.cs:27:5:30:5 | {...} | ExitMethods.cs:29:9:29:15 | return ...; | return | -| ExitMethods.cs:28:9:28:14 | call to method Exit | ExitMethods.cs:28:9:28:14 | call to method Exit | exit | -| ExitMethods.cs:28:9:28:14 | this access | ExitMethods.cs:28:9:28:14 | this access | normal | -| ExitMethods.cs:28:9:28:15 | ...; | ExitMethods.cs:28:9:28:14 | call to method Exit | exit | -| ExitMethods.cs:29:9:29:15 | return ...; | ExitMethods.cs:29:9:29:15 | return ...; | return | -| ExitMethods.cs:33:5:36:5 | {...} | ExitMethods.cs:34:9:34:25 | call to method ApplicationExit | exit | -| ExitMethods.cs:33:5:36:5 | {...} | ExitMethods.cs:35:9:35:15 | return ...; | return | -| ExitMethods.cs:34:9:34:25 | call to method ApplicationExit | ExitMethods.cs:34:9:34:25 | call to method ApplicationExit | exit | -| ExitMethods.cs:34:9:34:25 | this access | ExitMethods.cs:34:9:34:25 | this access | normal | -| ExitMethods.cs:34:9:34:26 | ...; | ExitMethods.cs:34:9:34:25 | call to method ApplicationExit | exit | -| ExitMethods.cs:35:9:35:15 | return ...; | ExitMethods.cs:35:9:35:15 | return ...; | return | -| ExitMethods.cs:39:5:52:5 | {...} | ExitMethods.cs:46:13:46:19 | return ...; | return | -| ExitMethods.cs:39:5:52:5 | {...} | ExitMethods.cs:50:13:50:19 | return ...; | return | -| ExitMethods.cs:40:9:51:9 | try {...} ... | ExitMethods.cs:46:13:46:19 | return ...; | return | -| ExitMethods.cs:40:9:51:9 | try {...} ... | ExitMethods.cs:50:13:50:19 | return ...; | return | -| ExitMethods.cs:41:9:43:9 | {...} | ExitMethods.cs:42:13:42:30 | call to method ErrorAlways | throw(ArgumentException) | -| ExitMethods.cs:41:9:43:9 | {...} | ExitMethods.cs:42:13:42:30 | call to method ErrorAlways | throw(Exception) | -| ExitMethods.cs:42:13:42:30 | call to method ErrorAlways | ExitMethods.cs:42:13:42:30 | call to method ErrorAlways | throw(ArgumentException) | -| ExitMethods.cs:42:13:42:30 | call to method ErrorAlways | ExitMethods.cs:42:13:42:30 | call to method ErrorAlways | throw(Exception) | -| ExitMethods.cs:42:13:42:31 | ...; | ExitMethods.cs:42:13:42:30 | call to method ErrorAlways | throw(ArgumentException) | -| ExitMethods.cs:42:13:42:31 | ...; | ExitMethods.cs:42:13:42:30 | call to method ErrorAlways | throw(Exception) | -| ExitMethods.cs:42:25:42:29 | false | ExitMethods.cs:42:25:42:29 | false | normal | -| ExitMethods.cs:44:9:47:9 | catch (...) {...} | ExitMethods.cs:44:9:47:9 | catch (...) {...} | no-match | -| ExitMethods.cs:44:9:47:9 | catch (...) {...} | ExitMethods.cs:46:13:46:19 | return ...; | return | -| ExitMethods.cs:45:9:47:9 | {...} | ExitMethods.cs:46:13:46:19 | return ...; | return | -| ExitMethods.cs:46:13:46:19 | return ...; | ExitMethods.cs:46:13:46:19 | return ...; | return | -| ExitMethods.cs:48:9:51:9 | catch (...) {...} | ExitMethods.cs:50:13:50:19 | return ...; | return | -| ExitMethods.cs:49:9:51:9 | {...} | ExitMethods.cs:50:13:50:19 | return ...; | return | -| ExitMethods.cs:50:13:50:19 | return ...; | ExitMethods.cs:50:13:50:19 | return ...; | return | -| ExitMethods.cs:55:5:58:5 | {...} | ExitMethods.cs:56:9:56:22 | call to method ErrorAlways2 | throw(Exception) | -| ExitMethods.cs:55:5:58:5 | {...} | ExitMethods.cs:57:9:57:15 | return ...; | return | -| ExitMethods.cs:56:9:56:22 | call to method ErrorAlways2 | ExitMethods.cs:56:9:56:22 | call to method ErrorAlways2 | throw(Exception) | -| ExitMethods.cs:56:9:56:23 | ...; | ExitMethods.cs:56:9:56:22 | call to method ErrorAlways2 | throw(Exception) | -| ExitMethods.cs:57:9:57:15 | return ...; | ExitMethods.cs:57:9:57:15 | return ...; | return | -| ExitMethods.cs:61:5:64:5 | {...} | ExitMethods.cs:62:9:62:22 | call to method ErrorAlways3 | throw(Exception) | -| ExitMethods.cs:61:5:64:5 | {...} | ExitMethods.cs:63:9:63:15 | return ...; | return | -| ExitMethods.cs:62:9:62:22 | call to method ErrorAlways3 | ExitMethods.cs:62:9:62:22 | call to method ErrorAlways3 | throw(Exception) | -| ExitMethods.cs:62:9:62:23 | ...; | ExitMethods.cs:62:9:62:22 | call to method ErrorAlways3 | throw(Exception) | -| ExitMethods.cs:63:9:63:15 | return ...; | ExitMethods.cs:63:9:63:15 | return ...; | return | -| ExitMethods.cs:67:5:70:5 | {...} | ExitMethods.cs:68:13:68:13 | access to parameter b | false | -| ExitMethods.cs:67:5:70:5 | {...} | ExitMethods.cs:69:13:69:34 | throw ...; | throw(Exception) | -| ExitMethods.cs:68:9:69:34 | if (...) ... | ExitMethods.cs:68:13:68:13 | access to parameter b | false | -| ExitMethods.cs:68:9:69:34 | if (...) ... | ExitMethods.cs:69:13:69:34 | throw ...; | throw(Exception) | -| ExitMethods.cs:68:13:68:13 | access to parameter b | ExitMethods.cs:68:13:68:13 | access to parameter b | false | -| ExitMethods.cs:68:13:68:13 | access to parameter b | ExitMethods.cs:68:13:68:13 | access to parameter b | true | -| ExitMethods.cs:69:13:69:34 | throw ...; | ExitMethods.cs:69:13:69:34 | throw ...; | throw(Exception) | -| ExitMethods.cs:69:19:69:33 | object creation of type Exception | ExitMethods.cs:69:19:69:33 | object creation of type Exception | normal | -| ExitMethods.cs:73:5:78:5 | {...} | ExitMethods.cs:75:13:75:34 | throw ...; | throw(Exception) | -| ExitMethods.cs:73:5:78:5 | {...} | ExitMethods.cs:77:13:77:45 | throw ...; | throw(ArgumentException) | -| ExitMethods.cs:74:9:77:45 | if (...) ... | ExitMethods.cs:75:13:75:34 | throw ...; | throw(Exception) | -| ExitMethods.cs:74:9:77:45 | if (...) ... | ExitMethods.cs:77:13:77:45 | throw ...; | throw(ArgumentException) | -| ExitMethods.cs:74:13:74:13 | access to parameter b | ExitMethods.cs:74:13:74:13 | access to parameter b | false | -| ExitMethods.cs:74:13:74:13 | access to parameter b | ExitMethods.cs:74:13:74:13 | access to parameter b | true | -| ExitMethods.cs:75:13:75:34 | throw ...; | ExitMethods.cs:75:13:75:34 | throw ...; | throw(Exception) | -| ExitMethods.cs:75:19:75:33 | object creation of type Exception | ExitMethods.cs:75:19:75:33 | object creation of type Exception | normal | -| ExitMethods.cs:77:13:77:45 | throw ...; | ExitMethods.cs:77:13:77:45 | throw ...; | throw(ArgumentException) | -| ExitMethods.cs:77:19:77:44 | object creation of type ArgumentException | ExitMethods.cs:77:19:77:44 | object creation of type ArgumentException | normal | -| ExitMethods.cs:77:41:77:43 | "b" | ExitMethods.cs:77:41:77:43 | "b" | normal | -| ExitMethods.cs:81:5:83:5 | {...} | ExitMethods.cs:82:9:82:30 | throw ...; | throw(Exception) | -| ExitMethods.cs:82:9:82:30 | throw ...; | ExitMethods.cs:82:9:82:30 | throw ...; | throw(Exception) | -| ExitMethods.cs:82:15:82:29 | object creation of type Exception | ExitMethods.cs:82:15:82:29 | object creation of type Exception | normal | -| ExitMethods.cs:85:35:85:55 | throw ... | ExitMethods.cs:85:35:85:55 | throw ... | throw(Exception) | -| ExitMethods.cs:85:41:85:55 | object creation of type Exception | ExitMethods.cs:85:41:85:55 | object creation of type Exception | normal | -| ExitMethods.cs:88:5:90:5 | {...} | ExitMethods.cs:89:9:89:27 | call to method Exit | exit | -| ExitMethods.cs:89:9:89:27 | call to method Exit | ExitMethods.cs:89:9:89:27 | call to method Exit | exit | -| ExitMethods.cs:89:9:89:28 | ...; | ExitMethods.cs:89:9:89:27 | call to method Exit | exit | -| ExitMethods.cs:89:26:89:26 | 0 | ExitMethods.cs:89:26:89:26 | 0 | normal | -| ExitMethods.cs:93:5:103:5 | {...} | ExitMethods.cs:96:13:96:18 | call to method Exit | exit | -| ExitMethods.cs:94:9:102:9 | try {...} ... | ExitMethods.cs:96:13:96:18 | call to method Exit | exit | -| ExitMethods.cs:95:9:97:9 | {...} | ExitMethods.cs:96:13:96:18 | call to method Exit | exit | -| ExitMethods.cs:96:13:96:18 | call to method Exit | ExitMethods.cs:96:13:96:18 | call to method Exit | exit | -| ExitMethods.cs:96:13:96:18 | this access | ExitMethods.cs:96:13:96:18 | this access | normal | -| ExitMethods.cs:96:13:96:19 | ...; | ExitMethods.cs:96:13:96:18 | call to method Exit | exit | -| ExitMethods.cs:99:9:102:9 | {...} | ExitMethods.cs:101:13:101:40 | call to method WriteLine | normal | -| ExitMethods.cs:101:13:101:40 | call to method WriteLine | ExitMethods.cs:101:13:101:40 | call to method WriteLine | normal | -| ExitMethods.cs:101:13:101:41 | ...; | ExitMethods.cs:101:13:101:40 | call to method WriteLine | normal | -| ExitMethods.cs:101:38:101:39 | "" | ExitMethods.cs:101:38:101:39 | "" | normal | -| ExitMethods.cs:106:5:108:5 | {...} | ExitMethods.cs:107:9:107:47 | call to method Exit | exit | -| ExitMethods.cs:107:9:107:47 | call to method Exit | ExitMethods.cs:107:9:107:47 | call to method Exit | exit | -| ExitMethods.cs:107:9:107:48 | ...; | ExitMethods.cs:107:9:107:47 | call to method Exit | exit | -| ExitMethods.cs:111:5:113:5 | {...} | ExitMethods.cs:112:9:112:77 | return ...; | return | -| ExitMethods.cs:111:5:113:5 | {...} | ExitMethods.cs:112:41:112:76 | throw ... | throw(ArgumentException) | -| ExitMethods.cs:112:9:112:77 | return ...; | ExitMethods.cs:112:9:112:77 | return ...; | return | -| ExitMethods.cs:112:9:112:77 | return ...; | ExitMethods.cs:112:41:112:76 | throw ... | throw(ArgumentException) | -| ExitMethods.cs:112:16:112:20 | access to parameter input | ExitMethods.cs:112:16:112:20 | access to parameter input | normal | -| ExitMethods.cs:112:16:112:25 | ... != ... | ExitMethods.cs:112:16:112:25 | ... != ... | false | -| ExitMethods.cs:112:16:112:25 | ... != ... | ExitMethods.cs:112:16:112:25 | ... != ... | true | -| ExitMethods.cs:112:16:112:76 | ... ? ... : ... | ExitMethods.cs:112:16:112:76 | ... ? ... : ... | normal | -| ExitMethods.cs:112:16:112:76 | ... ? ... : ... | ExitMethods.cs:112:41:112:76 | throw ... | throw(ArgumentException) | -| ExitMethods.cs:112:25:112:25 | 0 | ExitMethods.cs:112:25:112:25 | 0 | normal | -| ExitMethods.cs:112:25:112:25 | (...) ... | ExitMethods.cs:112:25:112:25 | (...) ... | normal | -| ExitMethods.cs:112:29:112:29 | 1 | ExitMethods.cs:112:29:112:29 | 1 | normal | -| ExitMethods.cs:112:29:112:29 | (...) ... | ExitMethods.cs:112:29:112:29 | (...) ... | normal | -| ExitMethods.cs:112:29:112:37 | ... / ... | ExitMethods.cs:112:29:112:37 | ... / ... | normal | -| ExitMethods.cs:112:33:112:37 | access to parameter input | ExitMethods.cs:112:33:112:37 | access to parameter input | normal | -| ExitMethods.cs:112:41:112:76 | throw ... | ExitMethods.cs:112:41:112:76 | throw ... | throw(ArgumentException) | -| ExitMethods.cs:112:47:112:76 | object creation of type ArgumentException | ExitMethods.cs:112:47:112:76 | object creation of type ArgumentException | normal | -| ExitMethods.cs:112:69:112:75 | "input" | ExitMethods.cs:112:69:112:75 | "input" | normal | -| ExitMethods.cs:116:5:118:5 | {...} | ExitMethods.cs:117:9:117:39 | return ...; | return | -| ExitMethods.cs:117:9:117:39 | return ...; | ExitMethods.cs:117:9:117:39 | return ...; | return | -| ExitMethods.cs:117:16:117:16 | access to parameter s | ExitMethods.cs:117:16:117:16 | access to parameter s | normal | -| ExitMethods.cs:117:16:117:30 | call to method Contains | ExitMethods.cs:117:16:117:30 | call to method Contains | false | -| ExitMethods.cs:117:16:117:30 | call to method Contains | ExitMethods.cs:117:16:117:30 | call to method Contains | true | -| ExitMethods.cs:117:16:117:38 | ... ? ... : ... | ExitMethods.cs:117:16:117:38 | ... ? ... : ... | normal | -| ExitMethods.cs:117:27:117:29 | - | ExitMethods.cs:117:27:117:29 | - | normal | -| ExitMethods.cs:117:34:117:34 | 0 | ExitMethods.cs:117:34:117:34 | 0 | normal | -| ExitMethods.cs:117:38:117:38 | 1 | ExitMethods.cs:117:38:117:38 | 1 | normal | -| ExitMethods.cs:121:5:124:5 | {...} | ExitMethods.cs:122:9:122:28 | call to method IsTrue | throw(AssertFailedException) | -| ExitMethods.cs:121:5:124:5 | {...} | ExitMethods.cs:123:13:123:17 | Int32 x = ... | normal | -| ExitMethods.cs:122:9:122:28 | call to method IsTrue | ExitMethods.cs:122:9:122:28 | call to method IsTrue | throw(AssertFailedException) | -| ExitMethods.cs:122:9:122:29 | ...; | ExitMethods.cs:122:9:122:28 | call to method IsTrue | throw(AssertFailedException) | -| ExitMethods.cs:122:23:122:27 | false | ExitMethods.cs:122:23:122:27 | false | normal | -| ExitMethods.cs:123:9:123:18 | ... ...; | ExitMethods.cs:123:13:123:17 | Int32 x = ... | normal | -| ExitMethods.cs:123:13:123:17 | Int32 x = ... | ExitMethods.cs:123:13:123:17 | Int32 x = ... | normal | -| ExitMethods.cs:123:17:123:17 | 0 | ExitMethods.cs:123:17:123:17 | 0 | normal | -| ExitMethods.cs:127:5:130:5 | {...} | ExitMethods.cs:128:9:128:26 | call to method FailingAssertion | throw(AssertFailedException) | -| ExitMethods.cs:127:5:130:5 | {...} | ExitMethods.cs:129:13:129:17 | Int32 x = ... | normal | -| ExitMethods.cs:128:9:128:26 | call to method FailingAssertion | ExitMethods.cs:128:9:128:26 | call to method FailingAssertion | throw(AssertFailedException) | -| ExitMethods.cs:128:9:128:26 | this access | ExitMethods.cs:128:9:128:26 | this access | normal | -| ExitMethods.cs:128:9:128:27 | ...; | ExitMethods.cs:128:9:128:26 | call to method FailingAssertion | throw(AssertFailedException) | -| ExitMethods.cs:129:9:129:18 | ... ...; | ExitMethods.cs:129:13:129:17 | Int32 x = ... | normal | -| ExitMethods.cs:129:13:129:17 | Int32 x = ... | ExitMethods.cs:129:13:129:17 | Int32 x = ... | normal | -| ExitMethods.cs:129:17:129:17 | 0 | ExitMethods.cs:129:17:129:17 | 0 | normal | -| ExitMethods.cs:132:33:132:49 | call to method IsFalse | ExitMethods.cs:132:33:132:49 | call to method IsFalse | normal | -| ExitMethods.cs:132:33:132:49 | call to method IsFalse | ExitMethods.cs:132:33:132:49 | call to method IsFalse | throw(AssertFailedException) | -| ExitMethods.cs:132:48:132:48 | access to parameter b | ExitMethods.cs:132:48:132:48 | access to parameter b | normal | -| ExitMethods.cs:135:5:138:5 | {...} | ExitMethods.cs:136:9:136:25 | call to method AssertFalse | throw(AssertFailedException) | -| ExitMethods.cs:135:5:138:5 | {...} | ExitMethods.cs:137:13:137:17 | Int32 x = ... | normal | -| ExitMethods.cs:136:9:136:25 | call to method AssertFalse | ExitMethods.cs:136:9:136:25 | call to method AssertFalse | throw(AssertFailedException) | -| ExitMethods.cs:136:9:136:25 | this access | ExitMethods.cs:136:9:136:25 | this access | normal | -| ExitMethods.cs:136:9:136:26 | ...; | ExitMethods.cs:136:9:136:25 | call to method AssertFalse | throw(AssertFailedException) | -| ExitMethods.cs:136:21:136:24 | true | ExitMethods.cs:136:21:136:24 | true | normal | -| ExitMethods.cs:137:9:137:18 | ... ...; | ExitMethods.cs:137:13:137:17 | Int32 x = ... | normal | -| ExitMethods.cs:137:13:137:17 | Int32 x = ... | ExitMethods.cs:137:13:137:17 | Int32 x = ... | normal | -| ExitMethods.cs:137:17:137:17 | 0 | ExitMethods.cs:137:17:137:17 | 0 | normal | -| ExitMethods.cs:141:5:147:5 | {...} | ExitMethods.cs:143:13:143:42 | call to method Throw | throw(ArgumentException) | -| ExitMethods.cs:141:5:147:5 | {...} | ExitMethods.cs:145:13:145:52 | call to method Throw | throw(Exception) | -| ExitMethods.cs:141:5:147:5 | {...} | ExitMethods.cs:146:9:146:33 | call to method WriteLine | normal | -| ExitMethods.cs:142:9:145:53 | if (...) ... | ExitMethods.cs:143:13:143:42 | call to method Throw | throw(ArgumentException) | -| ExitMethods.cs:142:9:145:53 | if (...) ... | ExitMethods.cs:145:13:145:52 | call to method Throw | throw(Exception) | -| ExitMethods.cs:142:13:142:13 | access to parameter b | ExitMethods.cs:142:13:142:13 | access to parameter b | false | -| ExitMethods.cs:142:13:142:13 | access to parameter b | ExitMethods.cs:142:13:142:13 | access to parameter b | true | -| ExitMethods.cs:143:13:143:42 | call to method Throw | ExitMethods.cs:143:13:143:42 | call to method Throw | throw(ArgumentException) | -| ExitMethods.cs:143:13:143:43 | ...; | ExitMethods.cs:143:13:143:42 | call to method Throw | throw(ArgumentException) | -| ExitMethods.cs:143:41:143:41 | access to parameter e | ExitMethods.cs:143:41:143:41 | access to parameter e | normal | -| ExitMethods.cs:145:13:145:44 | call to method Capture | ExitMethods.cs:145:13:145:44 | call to method Capture | normal | -| ExitMethods.cs:145:13:145:52 | call to method Throw | ExitMethods.cs:145:13:145:52 | call to method Throw | throw(Exception) | -| ExitMethods.cs:145:13:145:53 | ...; | ExitMethods.cs:145:13:145:52 | call to method Throw | throw(Exception) | -| ExitMethods.cs:145:43:145:43 | access to parameter e | ExitMethods.cs:145:43:145:43 | access to parameter e | normal | -| ExitMethods.cs:146:9:146:33 | call to method WriteLine | ExitMethods.cs:146:9:146:33 | call to method WriteLine | normal | -| ExitMethods.cs:146:9:146:34 | ...; | ExitMethods.cs:146:9:146:33 | call to method WriteLine | normal | -| ExitMethods.cs:146:27:146:32 | "dead" | ExitMethods.cs:146:27:146:32 | "dead" | normal | -| Extensions.cs:6:5:8:5 | {...} | Extensions.cs:7:9:7:30 | return ...; | return | -| Extensions.cs:7:9:7:30 | return ...; | Extensions.cs:7:9:7:30 | return ...; | return | -| Extensions.cs:7:16:7:29 | call to method Parse | Extensions.cs:7:16:7:29 | call to method Parse | normal | -| Extensions.cs:7:28:7:28 | access to parameter s | Extensions.cs:7:28:7:28 | access to parameter s | normal | -| Extensions.cs:11:5:13:5 | {...} | Extensions.cs:12:9:12:20 | return ...; | return | -| Extensions.cs:12:9:12:20 | return ...; | Extensions.cs:12:9:12:20 | return ...; | return | -| Extensions.cs:12:16:12:16 | access to parameter f | Extensions.cs:12:16:12:16 | access to parameter f | normal | -| Extensions.cs:12:16:12:19 | delegate call | Extensions.cs:12:16:12:19 | delegate call | normal | -| Extensions.cs:12:18:12:18 | access to parameter s | Extensions.cs:12:18:12:18 | access to parameter s | normal | -| Extensions.cs:15:40:15:51 | call to method ToInt32 | Extensions.cs:15:40:15:51 | call to method ToInt32 | normal | -| Extensions.cs:15:48:15:50 | "0" | Extensions.cs:15:48:15:50 | "0" | normal | -| Extensions.cs:21:5:26:5 | {...} | Extensions.cs:25:9:25:33 | call to method ToBool | normal | -| Extensions.cs:22:9:22:9 | access to parameter s | Extensions.cs:22:9:22:9 | access to parameter s | normal | -| Extensions.cs:22:9:22:19 | call to method ToInt32 | Extensions.cs:22:9:22:19 | call to method ToInt32 | normal | -| Extensions.cs:22:9:22:20 | ...; | Extensions.cs:22:9:22:19 | call to method ToInt32 | normal | -| Extensions.cs:23:9:23:30 | call to method ToInt32 | Extensions.cs:23:9:23:30 | call to method ToInt32 | normal | -| Extensions.cs:23:9:23:31 | ...; | Extensions.cs:23:9:23:30 | call to method ToInt32 | normal | -| Extensions.cs:23:28:23:29 | "" | Extensions.cs:23:28:23:29 | "" | normal | -| Extensions.cs:24:9:24:45 | call to method ToBool | Extensions.cs:24:9:24:45 | call to method ToBool | normal | -| Extensions.cs:24:9:24:46 | ...; | Extensions.cs:24:9:24:45 | call to method ToBool | normal | -| Extensions.cs:24:27:24:32 | "true" | Extensions.cs:24:27:24:32 | "true" | normal | -| Extensions.cs:24:35:24:44 | access to method Parse | Extensions.cs:24:35:24:44 | access to method Parse | normal | -| Extensions.cs:24:35:24:44 | delegate creation of type Func | Extensions.cs:24:35:24:44 | delegate creation of type Func | normal | -| Extensions.cs:25:9:25:14 | "true" | Extensions.cs:25:9:25:14 | "true" | normal | -| Extensions.cs:25:9:25:33 | call to method ToBool | Extensions.cs:25:9:25:33 | call to method ToBool | normal | -| Extensions.cs:25:9:25:34 | ...; | Extensions.cs:25:9:25:33 | call to method ToBool | normal | -| Extensions.cs:25:23:25:32 | access to method Parse | Extensions.cs:25:23:25:32 | access to method Parse | normal | -| Extensions.cs:25:23:25:32 | delegate creation of type Func | Extensions.cs:25:23:25:32 | delegate creation of type Func | normal | -| Finally.cs:3:14:3:20 | call to constructor Object | Finally.cs:3:14:3:20 | call to constructor Object | normal | -| Finally.cs:3:14:3:20 | call to method | Finally.cs:3:14:3:20 | call to method | normal | -| Finally.cs:3:14:3:20 | this access | Finally.cs:3:14:3:20 | this access | normal | -| Finally.cs:3:14:3:20 | {...} | Finally.cs:3:14:3:20 | {...} | normal | -| Finally.cs:8:5:17:5 | {...} | Finally.cs:15:13:15:40 | call to method WriteLine | normal | -| Finally.cs:8:5:17:5 | {...} | Finally.cs:15:13:15:40 | call to method WriteLine | throw(Exception) [normal] (0) | -| Finally.cs:9:9:16:9 | try {...} ... | Finally.cs:15:13:15:40 | call to method WriteLine | normal | -| Finally.cs:9:9:16:9 | try {...} ... | Finally.cs:15:13:15:40 | call to method WriteLine | throw(Exception) [normal] (0) | -| Finally.cs:10:9:12:9 | {...} | Finally.cs:11:13:11:37 | call to method WriteLine | normal | -| Finally.cs:10:9:12:9 | {...} | Finally.cs:11:13:11:37 | call to method WriteLine | throw(Exception) | -| Finally.cs:11:13:11:37 | call to method WriteLine | Finally.cs:11:13:11:37 | call to method WriteLine | normal | -| Finally.cs:11:13:11:37 | call to method WriteLine | Finally.cs:11:13:11:37 | call to method WriteLine | throw(Exception) | -| Finally.cs:11:13:11:38 | ...; | Finally.cs:11:13:11:37 | call to method WriteLine | normal | -| Finally.cs:11:13:11:38 | ...; | Finally.cs:11:13:11:37 | call to method WriteLine | throw(Exception) | -| Finally.cs:11:31:11:36 | "Try1" | Finally.cs:11:31:11:36 | "Try1" | normal | -| Finally.cs:14:9:16:9 | {...} | Finally.cs:15:13:15:40 | call to method WriteLine | normal | -| Finally.cs:15:13:15:40 | call to method WriteLine | Finally.cs:15:13:15:40 | call to method WriteLine | normal | -| Finally.cs:15:13:15:41 | ...; | Finally.cs:15:13:15:40 | call to method WriteLine | normal | -| Finally.cs:15:31:15:39 | "Finally" | Finally.cs:15:31:15:39 | "Finally" | normal | -| Finally.cs:20:5:52:5 | {...} | Finally.cs:50:13:50:40 | call to method WriteLine | normal | -| Finally.cs:20:5:52:5 | {...} | Finally.cs:50:13:50:40 | call to method WriteLine | return [normal] (0) | -| Finally.cs:20:5:52:5 | {...} | Finally.cs:50:13:50:40 | call to method WriteLine | throw(Exception) [normal] (0) | -| Finally.cs:20:5:52:5 | {...} | Finally.cs:50:13:50:40 | call to method WriteLine | throw(IOException) [normal] (0) | -| Finally.cs:21:9:51:9 | try {...} ... | Finally.cs:50:13:50:40 | call to method WriteLine | normal | -| Finally.cs:21:9:51:9 | try {...} ... | Finally.cs:50:13:50:40 | call to method WriteLine | return [normal] (0) | -| Finally.cs:21:9:51:9 | try {...} ... | Finally.cs:50:13:50:40 | call to method WriteLine | throw(Exception) [normal] (0) | -| Finally.cs:21:9:51:9 | try {...} ... | Finally.cs:50:13:50:40 | call to method WriteLine | throw(IOException) [normal] (0) | -| Finally.cs:22:9:25:9 | {...} | Finally.cs:23:13:23:37 | call to method WriteLine | throw(Exception) | -| Finally.cs:22:9:25:9 | {...} | Finally.cs:24:13:24:19 | return ...; | return | -| Finally.cs:23:13:23:37 | call to method WriteLine | Finally.cs:23:13:23:37 | call to method WriteLine | normal | -| Finally.cs:23:13:23:37 | call to method WriteLine | Finally.cs:23:13:23:37 | call to method WriteLine | throw(Exception) | -| Finally.cs:23:13:23:38 | ...; | Finally.cs:23:13:23:37 | call to method WriteLine | normal | -| Finally.cs:23:13:23:38 | ...; | Finally.cs:23:13:23:37 | call to method WriteLine | throw(Exception) | -| Finally.cs:23:31:23:36 | "Try2" | Finally.cs:23:31:23:36 | "Try2" | normal | -| Finally.cs:24:13:24:19 | return ...; | Finally.cs:24:13:24:19 | return ...; | return | -| Finally.cs:26:9:29:9 | catch (...) {...} | Finally.cs:26:9:29:9 | catch (...) {...} | no-match | -| Finally.cs:26:9:29:9 | catch (...) {...} | Finally.cs:28:13:28:18 | throw ...; | throw(IOException) | -| Finally.cs:26:38:26:39 | IOException ex | Finally.cs:26:38:26:39 | IOException ex | normal | -| Finally.cs:26:48:26:51 | true | Finally.cs:26:48:26:51 | true | true | -| Finally.cs:27:9:29:9 | {...} | Finally.cs:28:13:28:18 | throw ...; | throw(IOException) | -| Finally.cs:28:13:28:18 | throw ...; | Finally.cs:28:13:28:18 | throw ...; | throw(IOException) | -| Finally.cs:30:9:40:9 | catch (...) {...} | Finally.cs:30:9:40:9 | catch (...) {...} | no-match | -| Finally.cs:30:9:40:9 | catch (...) {...} | Finally.cs:38:17:38:44 | throw ...; | throw(Exception) | -| Finally.cs:30:41:30:42 | ArgumentException ex | Finally.cs:30:41:30:42 | ArgumentException ex | normal | -| Finally.cs:31:9:40:9 | {...} | Finally.cs:38:17:38:44 | throw ...; | throw(Exception) | -| Finally.cs:32:13:39:13 | try {...} ... | Finally.cs:38:17:38:44 | throw ...; | throw(Exception) | -| Finally.cs:33:13:35:13 | {...} | Finally.cs:34:27:34:32 | throw ...; | throw(ArgumentException) | -| Finally.cs:34:17:34:32 | if (...) ... | Finally.cs:34:27:34:32 | throw ...; | throw(ArgumentException) | -| Finally.cs:34:21:34:24 | true | Finally.cs:34:21:34:24 | true | true | -| Finally.cs:34:27:34:32 | throw ...; | Finally.cs:34:27:34:32 | throw ...; | throw(ArgumentException) | -| Finally.cs:37:13:39:13 | {...} | Finally.cs:38:17:38:44 | throw ...; | throw(Exception) | -| Finally.cs:38:17:38:44 | throw ...; | Finally.cs:38:17:38:44 | throw ...; | throw(Exception) | -| Finally.cs:38:23:38:43 | object creation of type Exception | Finally.cs:38:23:38:43 | object creation of type Exception | normal | -| Finally.cs:38:37:38:42 | "Boo!" | Finally.cs:38:37:38:42 | "Boo!" | normal | -| Finally.cs:41:9:43:9 | catch (...) {...} | Finally.cs:41:9:43:9 | catch (...) {...} | no-match | -| Finally.cs:41:9:43:9 | catch (...) {...} | Finally.cs:42:9:43:9 | {...} | normal | -| Finally.cs:42:9:43:9 | {...} | Finally.cs:42:9:43:9 | {...} | normal | -| Finally.cs:44:9:47:9 | catch {...} | Finally.cs:46:13:46:19 | return ...; | return | -| Finally.cs:45:9:47:9 | {...} | Finally.cs:46:13:46:19 | return ...; | return | -| Finally.cs:46:13:46:19 | return ...; | Finally.cs:46:13:46:19 | return ...; | return | -| Finally.cs:49:9:51:9 | {...} | Finally.cs:50:13:50:40 | call to method WriteLine | normal | -| Finally.cs:50:13:50:40 | call to method WriteLine | Finally.cs:50:13:50:40 | call to method WriteLine | normal | -| Finally.cs:50:13:50:41 | ...; | Finally.cs:50:13:50:40 | call to method WriteLine | normal | -| Finally.cs:50:31:50:39 | "Finally" | Finally.cs:50:31:50:39 | "Finally" | normal | -| Finally.cs:55:5:72:5 | {...} | Finally.cs:70:13:70:40 | call to method WriteLine | normal | -| Finally.cs:55:5:72:5 | {...} | Finally.cs:70:13:70:40 | call to method WriteLine | return [normal] (0) | -| Finally.cs:55:5:72:5 | {...} | Finally.cs:70:13:70:40 | call to method WriteLine | throw(Exception) [normal] (0) | -| Finally.cs:55:5:72:5 | {...} | Finally.cs:70:13:70:40 | call to method WriteLine | throw(IOException) [normal] (0) | -| Finally.cs:56:9:71:9 | try {...} ... | Finally.cs:70:13:70:40 | call to method WriteLine | normal | -| Finally.cs:56:9:71:9 | try {...} ... | Finally.cs:70:13:70:40 | call to method WriteLine | return [normal] (0) | -| Finally.cs:56:9:71:9 | try {...} ... | Finally.cs:70:13:70:40 | call to method WriteLine | throw(Exception) [normal] (0) | -| Finally.cs:56:9:71:9 | try {...} ... | Finally.cs:70:13:70:40 | call to method WriteLine | throw(IOException) [normal] (0) | -| Finally.cs:57:9:60:9 | {...} | Finally.cs:58:13:58:37 | call to method WriteLine | throw(Exception) | -| Finally.cs:57:9:60:9 | {...} | Finally.cs:59:13:59:19 | return ...; | return | -| Finally.cs:58:13:58:37 | call to method WriteLine | Finally.cs:58:13:58:37 | call to method WriteLine | normal | -| Finally.cs:58:13:58:37 | call to method WriteLine | Finally.cs:58:13:58:37 | call to method WriteLine | throw(Exception) | -| Finally.cs:58:13:58:38 | ...; | Finally.cs:58:13:58:37 | call to method WriteLine | normal | -| Finally.cs:58:13:58:38 | ...; | Finally.cs:58:13:58:37 | call to method WriteLine | throw(Exception) | -| Finally.cs:58:31:58:36 | "Try3" | Finally.cs:58:31:58:36 | "Try3" | normal | -| Finally.cs:59:13:59:19 | return ...; | Finally.cs:59:13:59:19 | return ...; | return | -| Finally.cs:61:9:64:9 | catch (...) {...} | Finally.cs:61:9:64:9 | catch (...) {...} | no-match | -| Finally.cs:61:9:64:9 | catch (...) {...} | Finally.cs:63:13:63:18 | throw ...; | throw(IOException) | -| Finally.cs:61:38:61:39 | IOException ex | Finally.cs:61:38:61:39 | IOException ex | normal | -| Finally.cs:61:48:61:51 | true | Finally.cs:61:48:61:51 | true | true | -| Finally.cs:62:9:64:9 | {...} | Finally.cs:63:13:63:18 | throw ...; | throw(IOException) | -| Finally.cs:63:13:63:18 | throw ...; | Finally.cs:63:13:63:18 | throw ...; | throw(IOException) | -| Finally.cs:65:9:67:9 | catch (...) {...} | Finally.cs:65:9:67:9 | catch (...) {...} | throw(Exception) [no-match] (0) | -| Finally.cs:65:9:67:9 | catch (...) {...} | Finally.cs:65:35:65:51 | ... != ... | throw(Exception) [false] (0) | -| Finally.cs:65:9:67:9 | catch (...) {...} | Finally.cs:66:9:67:9 | {...} | normal | -| Finally.cs:65:26:65:26 | Exception e | Finally.cs:65:26:65:26 | Exception e | normal | -| Finally.cs:65:35:65:35 | access to local variable e | Finally.cs:65:35:65:35 | access to local variable e | normal | -| Finally.cs:65:35:65:43 | access to property Message | Finally.cs:65:35:65:43 | access to property Message | normal | -| Finally.cs:65:35:65:51 | ... != ... | Finally.cs:65:35:65:51 | ... != ... | false | -| Finally.cs:65:35:65:51 | ... != ... | Finally.cs:65:35:65:51 | ... != ... | true | -| Finally.cs:65:48:65:51 | null | Finally.cs:65:48:65:51 | null | normal | -| Finally.cs:66:9:67:9 | {...} | Finally.cs:66:9:67:9 | {...} | normal | -| Finally.cs:69:9:71:9 | {...} | Finally.cs:70:13:70:40 | call to method WriteLine | normal | -| Finally.cs:70:13:70:40 | call to method WriteLine | Finally.cs:70:13:70:40 | call to method WriteLine | normal | -| Finally.cs:70:13:70:41 | ...; | Finally.cs:70:13:70:40 | call to method WriteLine | normal | -| Finally.cs:70:31:70:39 | "Finally" | Finally.cs:70:31:70:39 | "Finally" | normal | -| Finally.cs:75:5:101:5 | {...} | Finally.cs:77:16:77:20 | ... > ... | false | -| Finally.cs:75:5:101:5 | {...} | Finally.cs:97:21:97:23 | ...-- | normal [break] (0) | -| Finally.cs:75:5:101:5 | {...} | Finally.cs:97:21:97:23 | ...-- | return [normal] (0) | -| Finally.cs:75:5:101:5 | {...} | Finally.cs:97:21:97:23 | ...-- | throw(Exception) [normal] (1) | -| Finally.cs:76:9:76:19 | ... ...; | Finally.cs:76:13:76:18 | Int32 i = ... | normal | -| Finally.cs:76:13:76:18 | Int32 i = ... | Finally.cs:76:13:76:18 | Int32 i = ... | normal | -| Finally.cs:76:17:76:18 | 10 | Finally.cs:76:17:76:18 | 10 | normal | -| Finally.cs:77:9:100:9 | while (...) ... | Finally.cs:77:16:77:20 | ... > ... | false | -| Finally.cs:77:9:100:9 | while (...) ... | Finally.cs:97:21:97:23 | ...-- | normal [break] (0) | -| Finally.cs:77:9:100:9 | while (...) ... | Finally.cs:97:21:97:23 | ...-- | return [normal] (0) | -| Finally.cs:77:9:100:9 | while (...) ... | Finally.cs:97:21:97:23 | ...-- | throw(Exception) [normal] (1) | -| Finally.cs:77:16:77:16 | access to local variable i | Finally.cs:77:16:77:16 | access to local variable i | normal | -| Finally.cs:77:16:77:20 | ... > ... | Finally.cs:77:16:77:20 | ... > ... | false | -| Finally.cs:77:16:77:20 | ... > ... | Finally.cs:77:16:77:20 | ... > ... | true | -| Finally.cs:77:20:77:20 | 0 | Finally.cs:77:20:77:20 | 0 | normal | -| Finally.cs:78:9:100:9 | {...} | Finally.cs:97:21:97:23 | ...-- | break [normal] (0) | -| Finally.cs:78:9:100:9 | {...} | Finally.cs:97:21:97:23 | ...-- | continue [normal] (0) | -| Finally.cs:78:9:100:9 | {...} | Finally.cs:97:21:97:23 | ...-- | normal | -| Finally.cs:78:9:100:9 | {...} | Finally.cs:97:21:97:23 | ...-- | return [normal] (0) | -| Finally.cs:78:9:100:9 | {...} | Finally.cs:97:21:97:23 | ...-- | throw(Exception) [normal] (1) | -| Finally.cs:79:13:99:13 | try {...} ... | Finally.cs:97:21:97:23 | ...-- | break [normal] (0) | -| Finally.cs:79:13:99:13 | try {...} ... | Finally.cs:97:21:97:23 | ...-- | continue [normal] (0) | -| Finally.cs:79:13:99:13 | try {...} ... | Finally.cs:97:21:97:23 | ...-- | normal | -| Finally.cs:79:13:99:13 | try {...} ... | Finally.cs:97:21:97:23 | ...-- | return [normal] (0) | -| Finally.cs:79:13:99:13 | try {...} ... | Finally.cs:97:21:97:23 | ...-- | throw(Exception) [normal] (1) | -| Finally.cs:80:13:87:13 | {...} | Finally.cs:82:21:82:27 | return ...; | return | -| Finally.cs:80:13:87:13 | {...} | Finally.cs:84:21:84:29 | continue; | continue | -| Finally.cs:80:13:87:13 | {...} | Finally.cs:85:21:85:26 | ... == ... | false | -| Finally.cs:80:13:87:13 | {...} | Finally.cs:86:21:86:26 | break; | break | -| Finally.cs:81:17:82:27 | if (...) ... | Finally.cs:81:21:81:26 | ... == ... | false | -| Finally.cs:81:17:82:27 | if (...) ... | Finally.cs:82:21:82:27 | return ...; | return | -| Finally.cs:81:21:81:21 | access to local variable i | Finally.cs:81:21:81:21 | access to local variable i | normal | -| Finally.cs:81:21:81:26 | ... == ... | Finally.cs:81:21:81:26 | ... == ... | false | -| Finally.cs:81:21:81:26 | ... == ... | Finally.cs:81:21:81:26 | ... == ... | true | -| Finally.cs:81:26:81:26 | 0 | Finally.cs:81:26:81:26 | 0 | normal | -| Finally.cs:82:21:82:27 | return ...; | Finally.cs:82:21:82:27 | return ...; | return | -| Finally.cs:83:17:84:29 | if (...) ... | Finally.cs:83:21:83:26 | ... == ... | false | -| Finally.cs:83:17:84:29 | if (...) ... | Finally.cs:84:21:84:29 | continue; | continue | -| Finally.cs:83:21:83:21 | access to local variable i | Finally.cs:83:21:83:21 | access to local variable i | normal | -| Finally.cs:83:21:83:26 | ... == ... | Finally.cs:83:21:83:26 | ... == ... | false | -| Finally.cs:83:21:83:26 | ... == ... | Finally.cs:83:21:83:26 | ... == ... | true | -| Finally.cs:83:26:83:26 | 1 | Finally.cs:83:26:83:26 | 1 | normal | -| Finally.cs:84:21:84:29 | continue; | Finally.cs:84:21:84:29 | continue; | continue | -| Finally.cs:85:17:86:26 | if (...) ... | Finally.cs:85:21:85:26 | ... == ... | false | -| Finally.cs:85:17:86:26 | if (...) ... | Finally.cs:86:21:86:26 | break; | break | -| Finally.cs:85:21:85:21 | access to local variable i | Finally.cs:85:21:85:21 | access to local variable i | normal | -| Finally.cs:85:21:85:26 | ... == ... | Finally.cs:85:21:85:26 | ... == ... | false | -| Finally.cs:85:21:85:26 | ... == ... | Finally.cs:85:21:85:26 | ... == ... | true | -| Finally.cs:85:26:85:26 | 2 | Finally.cs:85:26:85:26 | 2 | normal | -| Finally.cs:86:21:86:26 | break; | Finally.cs:86:21:86:26 | break; | break | -| Finally.cs:89:13:99:13 | {...} | Finally.cs:97:21:97:23 | ...-- | normal | -| Finally.cs:89:13:99:13 | {...} | Finally.cs:97:21:97:23 | ...-- | throw(Exception) [normal] (1) | -| Finally.cs:90:17:98:17 | try {...} ... | Finally.cs:97:21:97:23 | ...-- | normal | -| Finally.cs:90:17:98:17 | try {...} ... | Finally.cs:97:21:97:23 | ...-- | throw(Exception) [normal] (1) | -| Finally.cs:91:17:94:17 | {...} | Finally.cs:92:25:92:30 | ... == ... | false | -| Finally.cs:91:17:94:17 | {...} | Finally.cs:93:25:93:46 | throw ...; | throw(Exception) | -| Finally.cs:91:17:94:17 | {...} | Finally.cs:93:31:93:45 | object creation of type Exception | throw(Exception) | -| Finally.cs:92:21:93:46 | if (...) ... | Finally.cs:92:25:92:30 | ... == ... | false | -| Finally.cs:92:21:93:46 | if (...) ... | Finally.cs:93:25:93:46 | throw ...; | throw(Exception) | -| Finally.cs:92:21:93:46 | if (...) ... | Finally.cs:93:31:93:45 | object creation of type Exception | throw(Exception) | -| Finally.cs:92:25:92:25 | access to local variable i | Finally.cs:92:25:92:25 | access to local variable i | normal | -| Finally.cs:92:25:92:30 | ... == ... | Finally.cs:92:25:92:30 | ... == ... | false | -| Finally.cs:92:25:92:30 | ... == ... | Finally.cs:92:25:92:30 | ... == ... | true | -| Finally.cs:92:30:92:30 | 3 | Finally.cs:92:30:92:30 | 3 | normal | -| Finally.cs:93:25:93:46 | throw ...; | Finally.cs:93:25:93:46 | throw ...; | throw(Exception) | -| Finally.cs:93:25:93:46 | throw ...; | Finally.cs:93:31:93:45 | object creation of type Exception | throw(Exception) | -| Finally.cs:93:31:93:45 | object creation of type Exception | Finally.cs:93:31:93:45 | object creation of type Exception | normal | -| Finally.cs:93:31:93:45 | object creation of type Exception | Finally.cs:93:31:93:45 | object creation of type Exception | throw(Exception) | -| Finally.cs:96:17:98:17 | {...} | Finally.cs:97:21:97:23 | ...-- | normal | -| Finally.cs:97:21:97:21 | access to local variable i | Finally.cs:97:21:97:21 | access to local variable i | normal | -| Finally.cs:97:21:97:23 | ...-- | Finally.cs:97:21:97:23 | ...-- | normal | -| Finally.cs:97:21:97:24 | ...; | Finally.cs:97:21:97:23 | ...-- | normal | -| Finally.cs:104:5:119:5 | {...} | Finally.cs:116:17:116:32 | ... > ... | false | -| Finally.cs:104:5:119:5 | {...} | Finally.cs:116:17:116:32 | ... > ... | return [false] (0) | -| Finally.cs:104:5:119:5 | {...} | Finally.cs:116:17:116:32 | ... > ... | throw(Exception) [false] (0) | -| Finally.cs:104:5:119:5 | {...} | Finally.cs:116:17:116:32 | ... > ... | throw(NullReferenceException) [false] (0) | -| Finally.cs:104:5:119:5 | {...} | Finally.cs:116:17:116:32 | ... > ... | throw(OutOfMemoryException) [false] (0) | -| Finally.cs:104:5:119:5 | {...} | Finally.cs:117:17:117:36 | call to method WriteLine | normal | -| Finally.cs:104:5:119:5 | {...} | Finally.cs:117:17:117:36 | call to method WriteLine | return [normal] (0) | -| Finally.cs:104:5:119:5 | {...} | Finally.cs:117:17:117:36 | call to method WriteLine | throw(Exception) [normal] (0) | -| Finally.cs:104:5:119:5 | {...} | Finally.cs:117:17:117:36 | call to method WriteLine | throw(NullReferenceException) [normal] (0) | -| Finally.cs:104:5:119:5 | {...} | Finally.cs:117:17:117:36 | call to method WriteLine | throw(OutOfMemoryException) [normal] (0) | -| Finally.cs:105:9:118:9 | try {...} ... | Finally.cs:116:17:116:32 | ... > ... | false | -| Finally.cs:105:9:118:9 | try {...} ... | Finally.cs:116:17:116:32 | ... > ... | return [false] (0) | -| Finally.cs:105:9:118:9 | try {...} ... | Finally.cs:116:17:116:32 | ... > ... | throw(Exception) [false] (0) | -| Finally.cs:105:9:118:9 | try {...} ... | Finally.cs:116:17:116:32 | ... > ... | throw(NullReferenceException) [false] (0) | -| Finally.cs:105:9:118:9 | try {...} ... | Finally.cs:116:17:116:32 | ... > ... | throw(OutOfMemoryException) [false] (0) | -| Finally.cs:105:9:118:9 | try {...} ... | Finally.cs:117:17:117:36 | call to method WriteLine | normal | -| Finally.cs:105:9:118:9 | try {...} ... | Finally.cs:117:17:117:36 | call to method WriteLine | return [normal] (0) | -| Finally.cs:105:9:118:9 | try {...} ... | Finally.cs:117:17:117:36 | call to method WriteLine | throw(Exception) [normal] (0) | -| Finally.cs:105:9:118:9 | try {...} ... | Finally.cs:117:17:117:36 | call to method WriteLine | throw(NullReferenceException) [normal] (0) | -| Finally.cs:105:9:118:9 | try {...} ... | Finally.cs:117:17:117:36 | call to method WriteLine | throw(OutOfMemoryException) [normal] (0) | -| Finally.cs:106:9:111:9 | {...} | Finally.cs:107:17:107:21 | access to field Field | throw(NullReferenceException) | -| Finally.cs:106:9:111:9 | {...} | Finally.cs:107:17:107:28 | access to property Length | throw(Exception) | -| Finally.cs:106:9:111:9 | {...} | Finally.cs:107:17:107:28 | access to property Length | throw(NullReferenceException) | -| Finally.cs:106:9:111:9 | {...} | Finally.cs:108:17:108:23 | return ...; | return | -| Finally.cs:106:9:111:9 | {...} | Finally.cs:109:17:109:21 | access to field Field | throw(NullReferenceException) | -| Finally.cs:106:9:111:9 | {...} | Finally.cs:109:17:109:28 | access to property Length | throw(Exception) | -| Finally.cs:106:9:111:9 | {...} | Finally.cs:109:17:109:28 | access to property Length | throw(NullReferenceException) | -| Finally.cs:106:9:111:9 | {...} | Finally.cs:109:17:109:33 | ... == ... | false | -| Finally.cs:106:9:111:9 | {...} | Finally.cs:110:17:110:49 | throw ...; | throw(OutOfMemoryException) | -| Finally.cs:106:9:111:9 | {...} | Finally.cs:110:23:110:48 | object creation of type OutOfMemoryException | throw(Exception) | -| Finally.cs:107:13:108:23 | if (...) ... | Finally.cs:107:17:107:21 | access to field Field | throw(NullReferenceException) | -| Finally.cs:107:13:108:23 | if (...) ... | Finally.cs:107:17:107:28 | access to property Length | throw(Exception) | -| Finally.cs:107:13:108:23 | if (...) ... | Finally.cs:107:17:107:28 | access to property Length | throw(NullReferenceException) | -| Finally.cs:107:13:108:23 | if (...) ... | Finally.cs:107:17:107:33 | ... == ... | false | -| Finally.cs:107:13:108:23 | if (...) ... | Finally.cs:108:17:108:23 | return ...; | return | -| Finally.cs:107:17:107:21 | access to field Field | Finally.cs:107:17:107:21 | access to field Field | normal | -| Finally.cs:107:17:107:21 | access to field Field | Finally.cs:107:17:107:21 | access to field Field | throw(NullReferenceException) | -| Finally.cs:107:17:107:21 | this access | Finally.cs:107:17:107:21 | this access | normal | -| Finally.cs:107:17:107:28 | access to property Length | Finally.cs:107:17:107:21 | access to field Field | throw(NullReferenceException) | -| Finally.cs:107:17:107:28 | access to property Length | Finally.cs:107:17:107:28 | access to property Length | normal | -| Finally.cs:107:17:107:28 | access to property Length | Finally.cs:107:17:107:28 | access to property Length | throw(Exception) | -| Finally.cs:107:17:107:28 | access to property Length | Finally.cs:107:17:107:28 | access to property Length | throw(NullReferenceException) | -| Finally.cs:107:17:107:33 | ... == ... | Finally.cs:107:17:107:21 | access to field Field | throw(NullReferenceException) | -| Finally.cs:107:17:107:33 | ... == ... | Finally.cs:107:17:107:28 | access to property Length | throw(Exception) | -| Finally.cs:107:17:107:33 | ... == ... | Finally.cs:107:17:107:28 | access to property Length | throw(NullReferenceException) | -| Finally.cs:107:17:107:33 | ... == ... | Finally.cs:107:17:107:33 | ... == ... | false | -| Finally.cs:107:17:107:33 | ... == ... | Finally.cs:107:17:107:33 | ... == ... | true | -| Finally.cs:107:33:107:33 | 0 | Finally.cs:107:33:107:33 | 0 | normal | -| Finally.cs:108:17:108:23 | return ...; | Finally.cs:108:17:108:23 | return ...; | return | -| Finally.cs:109:13:110:49 | if (...) ... | Finally.cs:109:17:109:21 | access to field Field | throw(NullReferenceException) | -| Finally.cs:109:13:110:49 | if (...) ... | Finally.cs:109:17:109:28 | access to property Length | throw(Exception) | -| Finally.cs:109:13:110:49 | if (...) ... | Finally.cs:109:17:109:28 | access to property Length | throw(NullReferenceException) | -| Finally.cs:109:13:110:49 | if (...) ... | Finally.cs:109:17:109:33 | ... == ... | false | -| Finally.cs:109:13:110:49 | if (...) ... | Finally.cs:110:17:110:49 | throw ...; | throw(OutOfMemoryException) | -| Finally.cs:109:13:110:49 | if (...) ... | Finally.cs:110:23:110:48 | object creation of type OutOfMemoryException | throw(Exception) | -| Finally.cs:109:17:109:21 | access to field Field | Finally.cs:109:17:109:21 | access to field Field | normal | -| Finally.cs:109:17:109:21 | access to field Field | Finally.cs:109:17:109:21 | access to field Field | throw(NullReferenceException) | -| Finally.cs:109:17:109:21 | this access | Finally.cs:109:17:109:21 | this access | normal | -| Finally.cs:109:17:109:28 | access to property Length | Finally.cs:109:17:109:21 | access to field Field | throw(NullReferenceException) | -| Finally.cs:109:17:109:28 | access to property Length | Finally.cs:109:17:109:28 | access to property Length | normal | -| Finally.cs:109:17:109:28 | access to property Length | Finally.cs:109:17:109:28 | access to property Length | throw(Exception) | -| Finally.cs:109:17:109:28 | access to property Length | Finally.cs:109:17:109:28 | access to property Length | throw(NullReferenceException) | -| Finally.cs:109:17:109:33 | ... == ... | Finally.cs:109:17:109:21 | access to field Field | throw(NullReferenceException) | -| Finally.cs:109:17:109:33 | ... == ... | Finally.cs:109:17:109:28 | access to property Length | throw(Exception) | -| Finally.cs:109:17:109:33 | ... == ... | Finally.cs:109:17:109:28 | access to property Length | throw(NullReferenceException) | -| Finally.cs:109:17:109:33 | ... == ... | Finally.cs:109:17:109:33 | ... == ... | false | -| Finally.cs:109:17:109:33 | ... == ... | Finally.cs:109:17:109:33 | ... == ... | true | -| Finally.cs:109:33:109:33 | 1 | Finally.cs:109:33:109:33 | 1 | normal | -| Finally.cs:110:17:110:49 | throw ...; | Finally.cs:110:17:110:49 | throw ...; | throw(OutOfMemoryException) | -| Finally.cs:110:17:110:49 | throw ...; | Finally.cs:110:23:110:48 | object creation of type OutOfMemoryException | throw(Exception) | -| Finally.cs:110:23:110:48 | object creation of type OutOfMemoryException | Finally.cs:110:23:110:48 | object creation of type OutOfMemoryException | normal | -| Finally.cs:110:23:110:48 | object creation of type OutOfMemoryException | Finally.cs:110:23:110:48 | object creation of type OutOfMemoryException | throw(Exception) | -| Finally.cs:113:9:118:9 | {...} | Finally.cs:116:17:116:32 | ... > ... | false | -| Finally.cs:113:9:118:9 | {...} | Finally.cs:117:17:117:36 | call to method WriteLine | normal | -| Finally.cs:114:13:115:41 | if (...) ... | Finally.cs:114:17:114:36 | !... | false | -| Finally.cs:114:13:115:41 | if (...) ... | Finally.cs:115:17:115:40 | call to method WriteLine | normal | -| Finally.cs:114:17:114:36 | !... | Finally.cs:114:17:114:36 | !... | false | -| Finally.cs:114:17:114:36 | !... | Finally.cs:114:17:114:36 | !... | true | -| Finally.cs:114:19:114:23 | access to field Field | Finally.cs:114:19:114:23 | access to field Field | normal | -| Finally.cs:114:19:114:23 | this access | Finally.cs:114:19:114:23 | this access | normal | -| Finally.cs:114:19:114:30 | access to property Length | Finally.cs:114:19:114:30 | access to property Length | normal | -| Finally.cs:114:19:114:35 | ... == ... | Finally.cs:114:19:114:35 | ... == ... | false | -| Finally.cs:114:19:114:35 | ... == ... | Finally.cs:114:19:114:35 | ... == ... | true | -| Finally.cs:114:35:114:35 | 0 | Finally.cs:114:35:114:35 | 0 | normal | -| Finally.cs:115:17:115:40 | call to method WriteLine | Finally.cs:115:17:115:40 | call to method WriteLine | normal | -| Finally.cs:115:17:115:41 | ...; | Finally.cs:115:17:115:40 | call to method WriteLine | normal | -| Finally.cs:115:35:115:39 | access to field Field | Finally.cs:115:35:115:39 | access to field Field | normal | -| Finally.cs:115:35:115:39 | this access | Finally.cs:115:35:115:39 | this access | normal | -| Finally.cs:116:13:117:37 | if (...) ... | Finally.cs:116:17:116:32 | ... > ... | false | -| Finally.cs:116:13:117:37 | if (...) ... | Finally.cs:117:17:117:36 | call to method WriteLine | normal | -| Finally.cs:116:17:116:21 | access to field Field | Finally.cs:116:17:116:21 | access to field Field | normal | -| Finally.cs:116:17:116:21 | this access | Finally.cs:116:17:116:21 | this access | normal | -| Finally.cs:116:17:116:28 | access to property Length | Finally.cs:116:17:116:28 | access to property Length | normal | -| Finally.cs:116:17:116:32 | ... > ... | Finally.cs:116:17:116:32 | ... > ... | false | -| Finally.cs:116:17:116:32 | ... > ... | Finally.cs:116:17:116:32 | ... > ... | true | -| Finally.cs:116:32:116:32 | 0 | Finally.cs:116:32:116:32 | 0 | normal | -| Finally.cs:117:17:117:36 | call to method WriteLine | Finally.cs:117:17:117:36 | call to method WriteLine | normal | -| Finally.cs:117:17:117:37 | ...; | Finally.cs:117:17:117:36 | call to method WriteLine | normal | -| Finally.cs:117:35:117:35 | 1 | Finally.cs:117:35:117:35 | 1 | normal | -| Finally.cs:122:5:131:5 | {...} | Finally.cs:125:17:125:40 | Double temp = ... | normal | -| Finally.cs:122:5:131:5 | {...} | Finally.cs:129:13:129:13 | ; | normal | -| Finally.cs:123:9:130:9 | try {...} ... | Finally.cs:125:17:125:40 | Double temp = ... | normal | -| Finally.cs:123:9:130:9 | try {...} ... | Finally.cs:129:13:129:13 | ; | normal | -| Finally.cs:124:9:126:9 | {...} | Finally.cs:125:17:125:40 | Double temp = ... | normal | -| Finally.cs:125:13:125:41 | ... ...; | Finally.cs:125:17:125:40 | Double temp = ... | normal | -| Finally.cs:125:17:125:40 | Double temp = ... | Finally.cs:125:17:125:40 | Double temp = ... | normal | -| Finally.cs:125:24:125:24 | 0 | Finally.cs:125:24:125:24 | 0 | normal | -| Finally.cs:125:24:125:24 | (...) ... | Finally.cs:125:24:125:24 | (...) ... | normal | -| Finally.cs:125:24:125:40 | ... / ... | Finally.cs:125:24:125:40 | ... / ... | normal | -| Finally.cs:125:28:125:40 | access to constant E | Finally.cs:125:28:125:40 | access to constant E | normal | -| Finally.cs:127:9:130:9 | catch {...} | Finally.cs:129:13:129:13 | ; | normal | -| Finally.cs:128:9:130:9 | {...} | Finally.cs:129:13:129:13 | ; | normal | -| Finally.cs:129:13:129:13 | ; | Finally.cs:129:13:129:13 | ; | normal | -| Finally.cs:134:5:145:5 | {...} | Finally.cs:141:13:141:44 | throw ...; | throw(ArgumentException) | -| Finally.cs:134:5:145:5 | {...} | Finally.cs:142:13:142:37 | call to method WriteLine | throw(Exception) [normal] (0) | -| Finally.cs:134:5:145:5 | {...} | Finally.cs:144:9:144:33 | call to method WriteLine | normal | -| Finally.cs:135:9:143:9 | try {...} ... | Finally.cs:141:13:141:44 | throw ...; | throw(ArgumentException) | -| Finally.cs:135:9:143:9 | try {...} ... | Finally.cs:142:13:142:37 | call to method WriteLine | normal | -| Finally.cs:135:9:143:9 | try {...} ... | Finally.cs:142:13:142:37 | call to method WriteLine | throw(Exception) [normal] (0) | -| Finally.cs:136:9:138:9 | {...} | Finally.cs:137:13:137:36 | call to method WriteLine | normal | -| Finally.cs:136:9:138:9 | {...} | Finally.cs:137:13:137:36 | call to method WriteLine | throw(Exception) | -| Finally.cs:137:13:137:36 | call to method WriteLine | Finally.cs:137:13:137:36 | call to method WriteLine | normal | -| Finally.cs:137:13:137:36 | call to method WriteLine | Finally.cs:137:13:137:36 | call to method WriteLine | throw(Exception) | -| Finally.cs:137:13:137:37 | ...; | Finally.cs:137:13:137:36 | call to method WriteLine | normal | -| Finally.cs:137:13:137:37 | ...; | Finally.cs:137:13:137:36 | call to method WriteLine | throw(Exception) | -| Finally.cs:137:31:137:35 | "Try" | Finally.cs:137:31:137:35 | "Try" | normal | -| Finally.cs:140:9:143:9 | {...} | Finally.cs:141:13:141:44 | throw ...; | throw(ArgumentException) | -| Finally.cs:140:9:143:9 | {...} | Finally.cs:142:13:142:37 | call to method WriteLine | normal | -| Finally.cs:141:13:141:44 | throw ...; | Finally.cs:141:13:141:44 | throw ...; | throw(ArgumentException) | -| Finally.cs:141:19:141:43 | object creation of type ArgumentException | Finally.cs:141:19:141:43 | object creation of type ArgumentException | normal | -| Finally.cs:141:41:141:42 | "" | Finally.cs:141:41:141:42 | "" | normal | -| Finally.cs:142:13:142:37 | call to method WriteLine | Finally.cs:142:13:142:37 | call to method WriteLine | normal | -| Finally.cs:142:13:142:38 | ...; | Finally.cs:142:13:142:37 | call to method WriteLine | normal | -| Finally.cs:142:31:142:36 | "Dead" | Finally.cs:142:31:142:36 | "Dead" | normal | -| Finally.cs:144:9:144:33 | call to method WriteLine | Finally.cs:144:9:144:33 | call to method WriteLine | normal | -| Finally.cs:144:9:144:34 | ...; | Finally.cs:144:9:144:33 | call to method WriteLine | normal | -| Finally.cs:144:27:144:32 | "Dead" | Finally.cs:144:27:144:32 | "Dead" | normal | -| Finally.cs:148:5:170:5 | {...} | Finally.cs:158:21:158:36 | ... == ... | false | -| Finally.cs:148:5:170:5 | {...} | Finally.cs:158:21:158:36 | ... == ... | throw(ArgumentNullException) [false] (0) | -| Finally.cs:148:5:170:5 | {...} | Finally.cs:158:21:158:36 | ... == ... | throw(Exception) [false] (0) | -| Finally.cs:148:5:170:5 | {...} | Finally.cs:163:17:163:42 | call to method WriteLine | normal | -| Finally.cs:148:5:170:5 | {...} | Finally.cs:163:17:163:42 | call to method WriteLine | throw(ArgumentNullException) [normal] (0) | -| Finally.cs:148:5:170:5 | {...} | Finally.cs:163:17:163:42 | call to method WriteLine | throw(Exception) [normal] (0) | -| Finally.cs:148:5:170:5 | {...} | Finally.cs:167:17:167:37 | call to method WriteLine | normal | -| Finally.cs:148:5:170:5 | {...} | Finally.cs:167:17:167:37 | call to method WriteLine | throw(ArgumentNullException) [normal] (0) | -| Finally.cs:148:5:170:5 | {...} | Finally.cs:167:17:167:37 | call to method WriteLine | throw(Exception) [normal] (0) | -| Finally.cs:149:9:169:9 | try {...} ... | Finally.cs:158:21:158:36 | ... == ... | false | -| Finally.cs:149:9:169:9 | try {...} ... | Finally.cs:158:21:158:36 | ... == ... | throw(ArgumentNullException) [false] (0) | -| Finally.cs:149:9:169:9 | try {...} ... | Finally.cs:158:21:158:36 | ... == ... | throw(Exception) [false] (0) | -| Finally.cs:149:9:169:9 | try {...} ... | Finally.cs:163:17:163:42 | call to method WriteLine | normal | -| Finally.cs:149:9:169:9 | try {...} ... | Finally.cs:163:17:163:42 | call to method WriteLine | throw(ArgumentNullException) [normal] (0) | -| Finally.cs:149:9:169:9 | try {...} ... | Finally.cs:163:17:163:42 | call to method WriteLine | throw(Exception) [normal] (0) | -| Finally.cs:149:9:169:9 | try {...} ... | Finally.cs:167:17:167:37 | call to method WriteLine | normal | -| Finally.cs:149:9:169:9 | try {...} ... | Finally.cs:167:17:167:37 | call to method WriteLine | throw(ArgumentNullException) [normal] (0) | -| Finally.cs:149:9:169:9 | try {...} ... | Finally.cs:167:17:167:37 | call to method WriteLine | throw(Exception) [normal] (0) | -| Finally.cs:150:9:153:9 | {...} | Finally.cs:151:17:151:28 | ... == ... | false | -| Finally.cs:150:9:153:9 | {...} | Finally.cs:152:17:152:50 | throw ...; | throw(ArgumentNullException) | -| Finally.cs:150:9:153:9 | {...} | Finally.cs:152:23:152:49 | object creation of type ArgumentNullException | throw(Exception) | -| Finally.cs:151:13:152:50 | if (...) ... | Finally.cs:151:17:151:28 | ... == ... | false | -| Finally.cs:151:13:152:50 | if (...) ... | Finally.cs:152:17:152:50 | throw ...; | throw(ArgumentNullException) | -| Finally.cs:151:13:152:50 | if (...) ... | Finally.cs:152:23:152:49 | object creation of type ArgumentNullException | throw(Exception) | -| Finally.cs:151:17:151:20 | access to parameter args | Finally.cs:151:17:151:20 | access to parameter args | normal | -| Finally.cs:151:17:151:28 | ... == ... | Finally.cs:151:17:151:28 | ... == ... | false | -| Finally.cs:151:17:151:28 | ... == ... | Finally.cs:151:17:151:28 | ... == ... | true | -| Finally.cs:151:25:151:28 | null | Finally.cs:151:25:151:28 | null | normal | -| Finally.cs:152:17:152:50 | throw ...; | Finally.cs:152:17:152:50 | throw ...; | throw(ArgumentNullException) | -| Finally.cs:152:17:152:50 | throw ...; | Finally.cs:152:23:152:49 | object creation of type ArgumentNullException | throw(Exception) | -| Finally.cs:152:23:152:49 | object creation of type ArgumentNullException | Finally.cs:152:23:152:49 | object creation of type ArgumentNullException | normal | -| Finally.cs:152:23:152:49 | object creation of type ArgumentNullException | Finally.cs:152:23:152:49 | object creation of type ArgumentNullException | throw(Exception) | -| Finally.cs:155:9:169:9 | {...} | Finally.cs:158:21:158:36 | ... == ... | false | -| Finally.cs:155:9:169:9 | {...} | Finally.cs:163:17:163:42 | call to method WriteLine | normal | -| Finally.cs:155:9:169:9 | {...} | Finally.cs:167:17:167:37 | call to method WriteLine | normal | -| Finally.cs:156:13:168:13 | try {...} ... | Finally.cs:158:21:158:36 | ... == ... | false | -| Finally.cs:156:13:168:13 | try {...} ... | Finally.cs:163:17:163:42 | call to method WriteLine | normal | -| Finally.cs:156:13:168:13 | try {...} ... | Finally.cs:167:17:167:37 | call to method WriteLine | normal | -| Finally.cs:157:13:160:13 | {...} | Finally.cs:158:21:158:31 | access to property Length | throw(Exception) | -| Finally.cs:157:13:160:13 | {...} | Finally.cs:158:21:158:31 | access to property Length | throw(NullReferenceException) | -| Finally.cs:157:13:160:13 | {...} | Finally.cs:158:21:158:36 | ... == ... | false | -| Finally.cs:157:13:160:13 | {...} | Finally.cs:159:21:159:45 | throw ...; | throw(Exception) | -| Finally.cs:157:13:160:13 | {...} | Finally.cs:159:27:159:44 | object creation of type Exception | throw(Exception) | -| Finally.cs:158:17:159:45 | if (...) ... | Finally.cs:158:21:158:31 | access to property Length | throw(Exception) | -| Finally.cs:158:17:159:45 | if (...) ... | Finally.cs:158:21:158:31 | access to property Length | throw(NullReferenceException) | -| Finally.cs:158:17:159:45 | if (...) ... | Finally.cs:158:21:158:36 | ... == ... | false | -| Finally.cs:158:17:159:45 | if (...) ... | Finally.cs:159:21:159:45 | throw ...; | throw(Exception) | -| Finally.cs:158:17:159:45 | if (...) ... | Finally.cs:159:27:159:44 | object creation of type Exception | throw(Exception) | -| Finally.cs:158:21:158:24 | access to parameter args | Finally.cs:158:21:158:24 | access to parameter args | normal | -| Finally.cs:158:21:158:31 | access to property Length | Finally.cs:158:21:158:31 | access to property Length | normal | -| Finally.cs:158:21:158:31 | access to property Length | Finally.cs:158:21:158:31 | access to property Length | throw(Exception) | -| Finally.cs:158:21:158:31 | access to property Length | Finally.cs:158:21:158:31 | access to property Length | throw(NullReferenceException) | -| Finally.cs:158:21:158:36 | ... == ... | Finally.cs:158:21:158:31 | access to property Length | throw(Exception) | -| Finally.cs:158:21:158:36 | ... == ... | Finally.cs:158:21:158:31 | access to property Length | throw(NullReferenceException) | -| Finally.cs:158:21:158:36 | ... == ... | Finally.cs:158:21:158:36 | ... == ... | false | -| Finally.cs:158:21:158:36 | ... == ... | Finally.cs:158:21:158:36 | ... == ... | true | -| Finally.cs:158:36:158:36 | 1 | Finally.cs:158:36:158:36 | 1 | normal | -| Finally.cs:159:21:159:45 | throw ...; | Finally.cs:159:21:159:45 | throw ...; | throw(Exception) | -| Finally.cs:159:21:159:45 | throw ...; | Finally.cs:159:27:159:44 | object creation of type Exception | throw(Exception) | -| Finally.cs:159:27:159:44 | object creation of type Exception | Finally.cs:159:27:159:44 | object creation of type Exception | normal | -| Finally.cs:159:27:159:44 | object creation of type Exception | Finally.cs:159:27:159:44 | object creation of type Exception | throw(Exception) | -| Finally.cs:159:41:159:43 | "1" | Finally.cs:159:41:159:43 | "1" | normal | -| Finally.cs:161:13:164:13 | catch (...) {...} | Finally.cs:161:13:164:13 | catch (...) {...} | no-match | -| Finally.cs:161:13:164:13 | catch (...) {...} | Finally.cs:161:39:161:54 | ... == ... | false | -| Finally.cs:161:13:164:13 | catch (...) {...} | Finally.cs:163:17:163:42 | call to method WriteLine | normal | -| Finally.cs:161:30:161:30 | Exception e | Finally.cs:161:30:161:30 | Exception e | normal | -| Finally.cs:161:39:161:39 | access to local variable e | Finally.cs:161:39:161:39 | access to local variable e | normal | -| Finally.cs:161:39:161:47 | access to property Message | Finally.cs:161:39:161:47 | access to property Message | normal | -| Finally.cs:161:39:161:54 | ... == ... | Finally.cs:161:39:161:54 | ... == ... | false | -| Finally.cs:161:39:161:54 | ... == ... | Finally.cs:161:39:161:54 | ... == ... | true | -| Finally.cs:161:52:161:54 | "1" | Finally.cs:161:52:161:54 | "1" | normal | -| Finally.cs:162:13:164:13 | {...} | Finally.cs:163:17:163:42 | call to method WriteLine | normal | -| Finally.cs:163:17:163:42 | call to method WriteLine | Finally.cs:163:17:163:42 | call to method WriteLine | normal | -| Finally.cs:163:17:163:43 | ...; | Finally.cs:163:17:163:42 | call to method WriteLine | normal | -| Finally.cs:163:35:163:38 | access to parameter args | Finally.cs:163:35:163:38 | access to parameter args | normal | -| Finally.cs:163:35:163:41 | access to array element | Finally.cs:163:35:163:41 | access to array element | normal | -| Finally.cs:163:40:163:40 | 0 | Finally.cs:163:40:163:40 | 0 | normal | -| Finally.cs:165:13:168:13 | catch {...} | Finally.cs:167:17:167:37 | call to method WriteLine | normal | -| Finally.cs:166:13:168:13 | {...} | Finally.cs:167:17:167:37 | call to method WriteLine | normal | -| Finally.cs:167:17:167:37 | call to method WriteLine | Finally.cs:167:17:167:37 | call to method WriteLine | normal | -| Finally.cs:167:17:167:38 | ...; | Finally.cs:167:17:167:37 | call to method WriteLine | normal | -| Finally.cs:167:35:167:36 | "" | Finally.cs:167:35:167:36 | "" | normal | -| Finally.cs:172:11:172:20 | call to constructor Exception | Finally.cs:172:11:172:20 | call to constructor Exception | normal | -| Finally.cs:172:11:172:20 | call to method | Finally.cs:172:11:172:20 | call to method | normal | -| Finally.cs:172:11:172:20 | this access | Finally.cs:172:11:172:20 | this access | normal | -| Finally.cs:172:11:172:20 | {...} | Finally.cs:172:11:172:20 | {...} | normal | -| Finally.cs:173:11:173:20 | call to constructor Exception | Finally.cs:173:11:173:20 | call to constructor Exception | normal | -| Finally.cs:173:11:173:20 | call to method | Finally.cs:173:11:173:20 | call to method | normal | -| Finally.cs:173:11:173:20 | this access | Finally.cs:173:11:173:20 | this access | normal | -| Finally.cs:173:11:173:20 | {...} | Finally.cs:173:11:173:20 | {...} | normal | -| Finally.cs:174:11:174:20 | call to constructor Exception | Finally.cs:174:11:174:20 | call to constructor Exception | normal | -| Finally.cs:174:11:174:20 | call to method | Finally.cs:174:11:174:20 | call to method | normal | -| Finally.cs:174:11:174:20 | this access | Finally.cs:174:11:174:20 | this access | normal | -| Finally.cs:174:11:174:20 | {...} | Finally.cs:174:11:174:20 | {...} | normal | -| Finally.cs:177:5:193:5 | {...} | Finally.cs:186:21:186:22 | access to parameter b2 | false | -| Finally.cs:177:5:193:5 | {...} | Finally.cs:186:21:186:22 | access to parameter b2 | throw(Exception) [false] (0) | -| Finally.cs:177:5:193:5 | {...} | Finally.cs:186:21:186:22 | access to parameter b2 | throw(ExceptionA) [false] (0) | -| Finally.cs:177:5:193:5 | {...} | Finally.cs:188:13:191:13 | catch (...) {...} | throw(Exception) [no-match] (0) | -| Finally.cs:177:5:193:5 | {...} | Finally.cs:188:13:191:13 | catch (...) {...} | throw(ExceptionB) [no-match] (0) | -| Finally.cs:177:5:193:5 | {...} | Finally.cs:188:38:188:39 | access to parameter b2 | throw(Exception) [false] (0) | -| Finally.cs:177:5:193:5 | {...} | Finally.cs:188:38:188:39 | access to parameter b2 | throw(ExceptionB) [false] (0) | -| Finally.cs:177:5:193:5 | {...} | Finally.cs:190:21:190:22 | access to parameter b1 | false | -| Finally.cs:177:5:193:5 | {...} | Finally.cs:190:21:190:22 | access to parameter b1 | throw(Exception) [false] (0) | -| Finally.cs:177:5:193:5 | {...} | Finally.cs:190:21:190:22 | access to parameter b1 | throw(ExceptionA) [false] (0) | -| Finally.cs:177:5:193:5 | {...} | Finally.cs:190:25:190:47 | throw ...; | throw(ExceptionC) | -| Finally.cs:178:9:192:9 | try {...} ... | Finally.cs:186:21:186:22 | access to parameter b2 | false | -| Finally.cs:178:9:192:9 | try {...} ... | Finally.cs:186:21:186:22 | access to parameter b2 | throw(Exception) [false] (0) | -| Finally.cs:178:9:192:9 | try {...} ... | Finally.cs:186:21:186:22 | access to parameter b2 | throw(ExceptionA) [false] (0) | -| Finally.cs:178:9:192:9 | try {...} ... | Finally.cs:188:13:191:13 | catch (...) {...} | throw(Exception) [no-match] (0) | -| Finally.cs:178:9:192:9 | try {...} ... | Finally.cs:188:13:191:13 | catch (...) {...} | throw(ExceptionB) [no-match] (0) | -| Finally.cs:178:9:192:9 | try {...} ... | Finally.cs:188:38:188:39 | access to parameter b2 | throw(Exception) [false] (0) | -| Finally.cs:178:9:192:9 | try {...} ... | Finally.cs:188:38:188:39 | access to parameter b2 | throw(ExceptionB) [false] (0) | -| Finally.cs:178:9:192:9 | try {...} ... | Finally.cs:190:21:190:22 | access to parameter b1 | false | -| Finally.cs:178:9:192:9 | try {...} ... | Finally.cs:190:21:190:22 | access to parameter b1 | throw(Exception) [false] (0) | -| Finally.cs:178:9:192:9 | try {...} ... | Finally.cs:190:21:190:22 | access to parameter b1 | throw(ExceptionA) [false] (0) | -| Finally.cs:178:9:192:9 | try {...} ... | Finally.cs:190:25:190:47 | throw ...; | throw(ExceptionC) | -| Finally.cs:179:9:181:9 | {...} | Finally.cs:180:17:180:18 | access to parameter b1 | false | -| Finally.cs:179:9:181:9 | {...} | Finally.cs:180:21:180:43 | throw ...; | throw(ExceptionA) | -| Finally.cs:179:9:181:9 | {...} | Finally.cs:180:27:180:42 | object creation of type ExceptionA | throw(Exception) | -| Finally.cs:180:13:180:43 | if (...) ... | Finally.cs:180:17:180:18 | access to parameter b1 | false | -| Finally.cs:180:13:180:43 | if (...) ... | Finally.cs:180:21:180:43 | throw ...; | throw(ExceptionA) | -| Finally.cs:180:13:180:43 | if (...) ... | Finally.cs:180:27:180:42 | object creation of type ExceptionA | throw(Exception) | -| Finally.cs:180:17:180:18 | access to parameter b1 | Finally.cs:180:17:180:18 | access to parameter b1 | false | -| Finally.cs:180:17:180:18 | access to parameter b1 | Finally.cs:180:17:180:18 | access to parameter b1 | true | -| Finally.cs:180:21:180:43 | throw ...; | Finally.cs:180:21:180:43 | throw ...; | throw(ExceptionA) | -| Finally.cs:180:21:180:43 | throw ...; | Finally.cs:180:27:180:42 | object creation of type ExceptionA | throw(Exception) | -| Finally.cs:180:27:180:42 | object creation of type ExceptionA | Finally.cs:180:27:180:42 | object creation of type ExceptionA | normal | -| Finally.cs:180:27:180:42 | object creation of type ExceptionA | Finally.cs:180:27:180:42 | object creation of type ExceptionA | throw(Exception) | -| Finally.cs:183:9:192:9 | {...} | Finally.cs:186:21:186:22 | access to parameter b2 | false | -| Finally.cs:183:9:192:9 | {...} | Finally.cs:188:13:191:13 | catch (...) {...} | throw(Exception) [no-match] (0) | -| Finally.cs:183:9:192:9 | {...} | Finally.cs:188:13:191:13 | catch (...) {...} | throw(ExceptionB) [no-match] (0) | -| Finally.cs:183:9:192:9 | {...} | Finally.cs:188:38:188:39 | access to parameter b2 | throw(Exception) [false] (0) | -| Finally.cs:183:9:192:9 | {...} | Finally.cs:188:38:188:39 | access to parameter b2 | throw(ExceptionB) [false] (0) | -| Finally.cs:183:9:192:9 | {...} | Finally.cs:190:21:190:22 | access to parameter b1 | false | -| Finally.cs:183:9:192:9 | {...} | Finally.cs:190:25:190:47 | throw ...; | throw(ExceptionC) | -| Finally.cs:184:13:191:13 | try {...} ... | Finally.cs:186:21:186:22 | access to parameter b2 | false | -| Finally.cs:184:13:191:13 | try {...} ... | Finally.cs:188:13:191:13 | catch (...) {...} | throw(Exception) [no-match] (0) | -| Finally.cs:184:13:191:13 | try {...} ... | Finally.cs:188:13:191:13 | catch (...) {...} | throw(ExceptionB) [no-match] (0) | -| Finally.cs:184:13:191:13 | try {...} ... | Finally.cs:188:38:188:39 | access to parameter b2 | throw(Exception) [false] (0) | -| Finally.cs:184:13:191:13 | try {...} ... | Finally.cs:188:38:188:39 | access to parameter b2 | throw(ExceptionB) [false] (0) | -| Finally.cs:184:13:191:13 | try {...} ... | Finally.cs:190:21:190:22 | access to parameter b1 | false | -| Finally.cs:184:13:191:13 | try {...} ... | Finally.cs:190:25:190:47 | throw ...; | throw(ExceptionC) | -| Finally.cs:185:13:187:13 | {...} | Finally.cs:186:21:186:22 | access to parameter b2 | false | -| Finally.cs:185:13:187:13 | {...} | Finally.cs:186:25:186:47 | throw ...; | throw(ExceptionB) | -| Finally.cs:185:13:187:13 | {...} | Finally.cs:186:31:186:46 | object creation of type ExceptionB | throw(Exception) | -| Finally.cs:186:17:186:47 | if (...) ... | Finally.cs:186:21:186:22 | access to parameter b2 | false | -| Finally.cs:186:17:186:47 | if (...) ... | Finally.cs:186:25:186:47 | throw ...; | throw(ExceptionB) | -| Finally.cs:186:17:186:47 | if (...) ... | Finally.cs:186:31:186:46 | object creation of type ExceptionB | throw(Exception) | -| Finally.cs:186:21:186:22 | access to parameter b2 | Finally.cs:186:21:186:22 | access to parameter b2 | false | -| Finally.cs:186:21:186:22 | access to parameter b2 | Finally.cs:186:21:186:22 | access to parameter b2 | true | -| Finally.cs:186:25:186:47 | throw ...; | Finally.cs:186:25:186:47 | throw ...; | throw(ExceptionB) | -| Finally.cs:186:25:186:47 | throw ...; | Finally.cs:186:31:186:46 | object creation of type ExceptionB | throw(Exception) | -| Finally.cs:186:31:186:46 | object creation of type ExceptionB | Finally.cs:186:31:186:46 | object creation of type ExceptionB | normal | -| Finally.cs:186:31:186:46 | object creation of type ExceptionB | Finally.cs:186:31:186:46 | object creation of type ExceptionB | throw(Exception) | -| Finally.cs:188:13:191:13 | catch (...) {...} | Finally.cs:188:13:191:13 | catch (...) {...} | throw(Exception) [no-match] (0) | -| Finally.cs:188:13:191:13 | catch (...) {...} | Finally.cs:188:13:191:13 | catch (...) {...} | throw(ExceptionB) [no-match] (0) | -| Finally.cs:188:13:191:13 | catch (...) {...} | Finally.cs:188:38:188:39 | access to parameter b2 | throw(Exception) [false] (0) | -| Finally.cs:188:13:191:13 | catch (...) {...} | Finally.cs:188:38:188:39 | access to parameter b2 | throw(ExceptionB) [false] (0) | -| Finally.cs:188:13:191:13 | catch (...) {...} | Finally.cs:190:21:190:22 | access to parameter b1 | false | -| Finally.cs:188:13:191:13 | catch (...) {...} | Finally.cs:190:25:190:47 | throw ...; | throw(ExceptionC) | -| Finally.cs:188:38:188:39 | access to parameter b2 | Finally.cs:188:38:188:39 | access to parameter b2 | false | -| Finally.cs:188:38:188:39 | access to parameter b2 | Finally.cs:188:38:188:39 | access to parameter b2 | true | -| Finally.cs:189:13:191:13 | {...} | Finally.cs:190:21:190:22 | access to parameter b1 | false | -| Finally.cs:189:13:191:13 | {...} | Finally.cs:190:25:190:47 | throw ...; | throw(ExceptionC) | -| Finally.cs:190:17:190:47 | if (...) ... | Finally.cs:190:21:190:22 | access to parameter b1 | false | -| Finally.cs:190:17:190:47 | if (...) ... | Finally.cs:190:25:190:47 | throw ...; | throw(ExceptionC) | -| Finally.cs:190:21:190:22 | access to parameter b1 | Finally.cs:190:21:190:22 | access to parameter b1 | false | -| Finally.cs:190:21:190:22 | access to parameter b1 | Finally.cs:190:21:190:22 | access to parameter b1 | true | -| Finally.cs:190:25:190:47 | throw ...; | Finally.cs:190:25:190:47 | throw ...; | throw(ExceptionC) | -| Finally.cs:190:31:190:46 | object creation of type ExceptionC | Finally.cs:190:31:190:46 | object creation of type ExceptionC | normal | -| Finally.cs:196:5:214:5 | {...} | Finally.cs:209:21:209:22 | access to parameter b3 | throw(Exception) [false] (1) | -| Finally.cs:196:5:214:5 | {...} | Finally.cs:209:21:209:22 | access to parameter b3 | throw(ExceptionB) [false] (1) | -| Finally.cs:196:5:214:5 | {...} | Finally.cs:209:25:209:47 | throw ...; | throw(ExceptionC) | -| Finally.cs:196:5:214:5 | {...} | Finally.cs:211:13:211:28 | ... = ... | throw(Exception) [normal] (0) | -| Finally.cs:196:5:214:5 | {...} | Finally.cs:211:13:211:28 | ... = ... | throw(ExceptionA) [normal] (0) | -| Finally.cs:196:5:214:5 | {...} | Finally.cs:213:9:213:24 | ... = ... | normal | -| Finally.cs:197:9:212:9 | try {...} ... | Finally.cs:209:21:209:22 | access to parameter b3 | throw(Exception) [false] (1) | -| Finally.cs:197:9:212:9 | try {...} ... | Finally.cs:209:21:209:22 | access to parameter b3 | throw(ExceptionB) [false] (1) | -| Finally.cs:197:9:212:9 | try {...} ... | Finally.cs:209:25:209:47 | throw ...; | throw(ExceptionC) | -| Finally.cs:197:9:212:9 | try {...} ... | Finally.cs:211:13:211:28 | ... = ... | normal | -| Finally.cs:197:9:212:9 | try {...} ... | Finally.cs:211:13:211:28 | ... = ... | throw(Exception) [normal] (0) | -| Finally.cs:197:9:212:9 | try {...} ... | Finally.cs:211:13:211:28 | ... = ... | throw(ExceptionA) [normal] (0) | -| Finally.cs:198:9:200:9 | {...} | Finally.cs:199:17:199:18 | access to parameter b1 | false | -| Finally.cs:198:9:200:9 | {...} | Finally.cs:199:21:199:43 | throw ...; | throw(ExceptionA) | -| Finally.cs:198:9:200:9 | {...} | Finally.cs:199:27:199:42 | object creation of type ExceptionA | throw(Exception) | -| Finally.cs:199:13:199:43 | if (...) ... | Finally.cs:199:17:199:18 | access to parameter b1 | false | -| Finally.cs:199:13:199:43 | if (...) ... | Finally.cs:199:21:199:43 | throw ...; | throw(ExceptionA) | -| Finally.cs:199:13:199:43 | if (...) ... | Finally.cs:199:27:199:42 | object creation of type ExceptionA | throw(Exception) | -| Finally.cs:199:17:199:18 | access to parameter b1 | Finally.cs:199:17:199:18 | access to parameter b1 | false | -| Finally.cs:199:17:199:18 | access to parameter b1 | Finally.cs:199:17:199:18 | access to parameter b1 | true | -| Finally.cs:199:21:199:43 | throw ...; | Finally.cs:199:21:199:43 | throw ...; | throw(ExceptionA) | -| Finally.cs:199:21:199:43 | throw ...; | Finally.cs:199:27:199:42 | object creation of type ExceptionA | throw(Exception) | -| Finally.cs:199:27:199:42 | object creation of type ExceptionA | Finally.cs:199:27:199:42 | object creation of type ExceptionA | normal | -| Finally.cs:199:27:199:42 | object creation of type ExceptionA | Finally.cs:199:27:199:42 | object creation of type ExceptionA | throw(Exception) | -| Finally.cs:202:9:212:9 | {...} | Finally.cs:209:21:209:22 | access to parameter b3 | throw(Exception) [false] (1) | -| Finally.cs:202:9:212:9 | {...} | Finally.cs:209:21:209:22 | access to parameter b3 | throw(ExceptionB) [false] (1) | -| Finally.cs:202:9:212:9 | {...} | Finally.cs:209:25:209:47 | throw ...; | throw(ExceptionC) | -| Finally.cs:202:9:212:9 | {...} | Finally.cs:211:13:211:28 | ... = ... | normal | -| Finally.cs:203:13:210:13 | try {...} ... | Finally.cs:209:21:209:22 | access to parameter b3 | false | -| Finally.cs:203:13:210:13 | try {...} ... | Finally.cs:209:21:209:22 | access to parameter b3 | throw(Exception) [false] (1) | -| Finally.cs:203:13:210:13 | try {...} ... | Finally.cs:209:21:209:22 | access to parameter b3 | throw(ExceptionB) [false] (1) | -| Finally.cs:203:13:210:13 | try {...} ... | Finally.cs:209:25:209:47 | throw ...; | throw(ExceptionC) | -| Finally.cs:204:13:206:13 | {...} | Finally.cs:205:21:205:22 | access to parameter b2 | false | -| Finally.cs:204:13:206:13 | {...} | Finally.cs:205:25:205:47 | throw ...; | throw(ExceptionB) | -| Finally.cs:204:13:206:13 | {...} | Finally.cs:205:31:205:46 | object creation of type ExceptionB | throw(Exception) | -| Finally.cs:205:17:205:47 | if (...) ... | Finally.cs:205:21:205:22 | access to parameter b2 | false | -| Finally.cs:205:17:205:47 | if (...) ... | Finally.cs:205:25:205:47 | throw ...; | throw(ExceptionB) | -| Finally.cs:205:17:205:47 | if (...) ... | Finally.cs:205:31:205:46 | object creation of type ExceptionB | throw(Exception) | -| Finally.cs:205:21:205:22 | access to parameter b2 | Finally.cs:205:21:205:22 | access to parameter b2 | false | -| Finally.cs:205:21:205:22 | access to parameter b2 | Finally.cs:205:21:205:22 | access to parameter b2 | true | -| Finally.cs:205:25:205:47 | throw ...; | Finally.cs:205:25:205:47 | throw ...; | throw(ExceptionB) | -| Finally.cs:205:25:205:47 | throw ...; | Finally.cs:205:31:205:46 | object creation of type ExceptionB | throw(Exception) | -| Finally.cs:205:31:205:46 | object creation of type ExceptionB | Finally.cs:205:31:205:46 | object creation of type ExceptionB | normal | -| Finally.cs:205:31:205:46 | object creation of type ExceptionB | Finally.cs:205:31:205:46 | object creation of type ExceptionB | throw(Exception) | -| Finally.cs:208:13:210:13 | {...} | Finally.cs:209:21:209:22 | access to parameter b3 | false | -| Finally.cs:208:13:210:13 | {...} | Finally.cs:209:25:209:47 | throw ...; | throw(ExceptionC) | -| Finally.cs:209:17:209:47 | if (...) ... | Finally.cs:209:21:209:22 | access to parameter b3 | false | -| Finally.cs:209:17:209:47 | if (...) ... | Finally.cs:209:25:209:47 | throw ...; | throw(ExceptionC) | -| Finally.cs:209:21:209:22 | access to parameter b3 | Finally.cs:209:21:209:22 | access to parameter b3 | false | -| Finally.cs:209:21:209:22 | access to parameter b3 | Finally.cs:209:21:209:22 | access to parameter b3 | true | -| Finally.cs:209:25:209:47 | throw ...; | Finally.cs:209:25:209:47 | throw ...; | throw(ExceptionC) | -| Finally.cs:209:31:209:46 | object creation of type ExceptionC | Finally.cs:209:31:209:46 | object creation of type ExceptionC | normal | -| Finally.cs:211:13:211:16 | this access | Finally.cs:211:13:211:16 | this access | normal | -| Finally.cs:211:13:211:22 | access to field Field | Finally.cs:211:13:211:16 | this access | normal | -| Finally.cs:211:13:211:28 | ... = ... | Finally.cs:211:13:211:28 | ... = ... | normal | -| Finally.cs:211:13:211:29 | ...; | Finally.cs:211:13:211:28 | ... = ... | normal | -| Finally.cs:211:26:211:28 | "0" | Finally.cs:211:26:211:28 | "0" | normal | -| Finally.cs:213:9:213:12 | this access | Finally.cs:213:9:213:12 | this access | normal | -| Finally.cs:213:9:213:18 | access to field Field | Finally.cs:213:9:213:12 | this access | normal | -| Finally.cs:213:9:213:24 | ... = ... | Finally.cs:213:9:213:24 | ... = ... | normal | -| Finally.cs:213:9:213:25 | ...; | Finally.cs:213:9:213:24 | ... = ... | normal | -| Finally.cs:213:22:213:24 | "1" | Finally.cs:213:22:213:24 | "1" | normal | -| Finally.cs:217:5:231:5 | {...} | Finally.cs:230:9:230:33 | call to method WriteLine | normal | -| Finally.cs:218:9:229:9 | try {...} ... | Finally.cs:228:13:228:40 | call to method WriteLine | normal | -| Finally.cs:219:9:221:9 | {...} | Finally.cs:220:13:220:36 | call to method WriteLine | normal | -| Finally.cs:219:9:221:9 | {...} | Finally.cs:220:13:220:36 | call to method WriteLine | throw(Exception) | -| Finally.cs:220:13:220:36 | call to method WriteLine | Finally.cs:220:13:220:36 | call to method WriteLine | normal | -| Finally.cs:220:13:220:36 | call to method WriteLine | Finally.cs:220:13:220:36 | call to method WriteLine | throw(Exception) | -| Finally.cs:220:13:220:37 | ...; | Finally.cs:220:13:220:36 | call to method WriteLine | normal | -| Finally.cs:220:13:220:37 | ...; | Finally.cs:220:13:220:36 | call to method WriteLine | throw(Exception) | -| Finally.cs:220:31:220:35 | "Try" | Finally.cs:220:31:220:35 | "Try" | normal | -| Finally.cs:222:9:225:9 | catch {...} | Finally.cs:224:13:224:38 | call to method WriteLine | normal | -| Finally.cs:223:9:225:9 | {...} | Finally.cs:224:13:224:38 | call to method WriteLine | normal | -| Finally.cs:224:13:224:38 | call to method WriteLine | Finally.cs:224:13:224:38 | call to method WriteLine | normal | -| Finally.cs:224:13:224:39 | ...; | Finally.cs:224:13:224:38 | call to method WriteLine | normal | -| Finally.cs:224:31:224:37 | "Catch" | Finally.cs:224:31:224:37 | "Catch" | normal | -| Finally.cs:227:9:229:9 | {...} | Finally.cs:228:13:228:40 | call to method WriteLine | normal | -| Finally.cs:228:13:228:40 | call to method WriteLine | Finally.cs:228:13:228:40 | call to method WriteLine | normal | -| Finally.cs:228:13:228:41 | ...; | Finally.cs:228:13:228:40 | call to method WriteLine | normal | -| Finally.cs:228:31:228:39 | "Finally" | Finally.cs:228:31:228:39 | "Finally" | normal | -| Finally.cs:230:9:230:33 | call to method WriteLine | Finally.cs:230:9:230:33 | call to method WriteLine | normal | -| Finally.cs:230:9:230:34 | ...; | Finally.cs:230:9:230:33 | call to method WriteLine | normal | -| Finally.cs:230:27:230:32 | "Done" | Finally.cs:230:27:230:32 | "Done" | normal | -| Finally.cs:234:5:261:5 | {...} | Finally.cs:258:13:258:46 | call to method WriteLine | throw(Exception) [normal] (0) | -| Finally.cs:234:5:261:5 | {...} | Finally.cs:258:13:258:46 | call to method WriteLine | throw(ExceptionA) [normal] (0) | -| Finally.cs:234:5:261:5 | {...} | Finally.cs:260:9:260:33 | call to method WriteLine | normal | -| Finally.cs:235:9:259:9 | try {...} ... | Finally.cs:258:13:258:46 | call to method WriteLine | normal | -| Finally.cs:235:9:259:9 | try {...} ... | Finally.cs:258:13:258:46 | call to method WriteLine | throw(Exception) [normal] (0) | -| Finally.cs:235:9:259:9 | try {...} ... | Finally.cs:258:13:258:46 | call to method WriteLine | throw(ExceptionA) [normal] (0) | -| Finally.cs:236:9:255:9 | {...} | Finally.cs:251:21:251:54 | call to method WriteLine | throw(Exception) [normal] (0) | -| Finally.cs:236:9:255:9 | {...} | Finally.cs:251:21:251:54 | call to method WriteLine | throw(Exception) [normal] (1) | -| Finally.cs:236:9:255:9 | {...} | Finally.cs:251:21:251:54 | call to method WriteLine | throw(ExceptionA) [normal] (0) | -| Finally.cs:236:9:255:9 | {...} | Finally.cs:251:21:251:54 | call to method WriteLine | throw(ExceptionA) [normal] (1) | -| Finally.cs:236:9:255:9 | {...} | Finally.cs:254:13:254:44 | call to method WriteLine | normal | -| Finally.cs:236:9:255:9 | {...} | Finally.cs:254:13:254:44 | call to method WriteLine | throw(Exception) | -| Finally.cs:237:13:253:13 | try {...} ... | Finally.cs:251:21:251:54 | call to method WriteLine | normal | -| Finally.cs:237:13:253:13 | try {...} ... | Finally.cs:251:21:251:54 | call to method WriteLine | throw(Exception) [normal] (0) | -| Finally.cs:237:13:253:13 | try {...} ... | Finally.cs:251:21:251:54 | call to method WriteLine | throw(Exception) [normal] (1) | -| Finally.cs:237:13:253:13 | try {...} ... | Finally.cs:251:21:251:54 | call to method WriteLine | throw(ExceptionA) [normal] (0) | -| Finally.cs:237:13:253:13 | try {...} ... | Finally.cs:251:21:251:54 | call to method WriteLine | throw(ExceptionA) [normal] (1) | -| Finally.cs:238:13:241:13 | {...} | Finally.cs:239:21:239:22 | access to parameter b1 | false | -| Finally.cs:238:13:241:13 | {...} | Finally.cs:240:21:240:43 | throw ...; | throw(ExceptionA) | -| Finally.cs:238:13:241:13 | {...} | Finally.cs:240:27:240:42 | object creation of type ExceptionA | throw(Exception) | -| Finally.cs:239:17:240:43 | if (...) ... | Finally.cs:239:21:239:22 | access to parameter b1 | false | -| Finally.cs:239:17:240:43 | if (...) ... | Finally.cs:240:21:240:43 | throw ...; | throw(ExceptionA) | -| Finally.cs:239:17:240:43 | if (...) ... | Finally.cs:240:27:240:42 | object creation of type ExceptionA | throw(Exception) | -| Finally.cs:239:21:239:22 | access to parameter b1 | Finally.cs:239:21:239:22 | access to parameter b1 | false | -| Finally.cs:239:21:239:22 | access to parameter b1 | Finally.cs:239:21:239:22 | access to parameter b1 | true | -| Finally.cs:240:21:240:43 | throw ...; | Finally.cs:240:21:240:43 | throw ...; | throw(ExceptionA) | -| Finally.cs:240:21:240:43 | throw ...; | Finally.cs:240:27:240:42 | object creation of type ExceptionA | throw(Exception) | -| Finally.cs:240:27:240:42 | object creation of type ExceptionA | Finally.cs:240:27:240:42 | object creation of type ExceptionA | normal | -| Finally.cs:240:27:240:42 | object creation of type ExceptionA | Finally.cs:240:27:240:42 | object creation of type ExceptionA | throw(Exception) | -| Finally.cs:243:13:253:13 | {...} | Finally.cs:251:21:251:54 | call to method WriteLine | normal | -| Finally.cs:243:13:253:13 | {...} | Finally.cs:251:21:251:54 | call to method WriteLine | throw(Exception) [normal] (1) | -| Finally.cs:243:13:253:13 | {...} | Finally.cs:251:21:251:54 | call to method WriteLine | throw(ExceptionA) [normal] (1) | -| Finally.cs:244:17:252:17 | try {...} ... | Finally.cs:251:21:251:54 | call to method WriteLine | normal | -| Finally.cs:244:17:252:17 | try {...} ... | Finally.cs:251:21:251:54 | call to method WriteLine | throw(Exception) [normal] (1) | -| Finally.cs:244:17:252:17 | try {...} ... | Finally.cs:251:21:251:54 | call to method WriteLine | throw(ExceptionA) [normal] (1) | -| Finally.cs:245:17:248:17 | {...} | Finally.cs:246:25:246:26 | access to parameter b2 | false | -| Finally.cs:245:17:248:17 | {...} | Finally.cs:247:25:247:47 | throw ...; | throw(ExceptionA) | -| Finally.cs:245:17:248:17 | {...} | Finally.cs:247:31:247:46 | object creation of type ExceptionA | throw(Exception) | -| Finally.cs:246:21:247:47 | if (...) ... | Finally.cs:246:25:246:26 | access to parameter b2 | false | -| Finally.cs:246:21:247:47 | if (...) ... | Finally.cs:247:25:247:47 | throw ...; | throw(ExceptionA) | -| Finally.cs:246:21:247:47 | if (...) ... | Finally.cs:247:31:247:46 | object creation of type ExceptionA | throw(Exception) | -| Finally.cs:246:25:246:26 | access to parameter b2 | Finally.cs:246:25:246:26 | access to parameter b2 | false | -| Finally.cs:246:25:246:26 | access to parameter b2 | Finally.cs:246:25:246:26 | access to parameter b2 | true | -| Finally.cs:247:25:247:47 | throw ...; | Finally.cs:247:25:247:47 | throw ...; | throw(ExceptionA) | -| Finally.cs:247:25:247:47 | throw ...; | Finally.cs:247:31:247:46 | object creation of type ExceptionA | throw(Exception) | -| Finally.cs:247:31:247:46 | object creation of type ExceptionA | Finally.cs:247:31:247:46 | object creation of type ExceptionA | normal | -| Finally.cs:247:31:247:46 | object creation of type ExceptionA | Finally.cs:247:31:247:46 | object creation of type ExceptionA | throw(Exception) | -| Finally.cs:250:17:252:17 | {...} | Finally.cs:251:21:251:54 | call to method WriteLine | normal | -| Finally.cs:251:21:251:54 | call to method WriteLine | Finally.cs:251:21:251:54 | call to method WriteLine | normal | -| Finally.cs:251:21:251:55 | ...; | Finally.cs:251:21:251:54 | call to method WriteLine | normal | -| Finally.cs:251:39:251:53 | "Inner finally" | Finally.cs:251:39:251:53 | "Inner finally" | normal | -| Finally.cs:254:13:254:44 | call to method WriteLine | Finally.cs:254:13:254:44 | call to method WriteLine | normal | -| Finally.cs:254:13:254:44 | call to method WriteLine | Finally.cs:254:13:254:44 | call to method WriteLine | throw(Exception) | -| Finally.cs:254:13:254:45 | ...; | Finally.cs:254:13:254:44 | call to method WriteLine | normal | -| Finally.cs:254:13:254:45 | ...; | Finally.cs:254:13:254:44 | call to method WriteLine | throw(Exception) | -| Finally.cs:254:31:254:43 | "Mid finally" | Finally.cs:254:31:254:43 | "Mid finally" | normal | -| Finally.cs:257:9:259:9 | {...} | Finally.cs:258:13:258:46 | call to method WriteLine | normal | -| Finally.cs:258:13:258:46 | call to method WriteLine | Finally.cs:258:13:258:46 | call to method WriteLine | normal | -| Finally.cs:258:13:258:47 | ...; | Finally.cs:258:13:258:46 | call to method WriteLine | normal | -| Finally.cs:258:31:258:45 | "Outer finally" | Finally.cs:258:31:258:45 | "Outer finally" | normal | -| Finally.cs:260:9:260:33 | call to method WriteLine | Finally.cs:260:9:260:33 | call to method WriteLine | normal | -| Finally.cs:260:9:260:34 | ...; | Finally.cs:260:9:260:33 | call to method WriteLine | normal | -| Finally.cs:260:27:260:32 | "Done" | Finally.cs:260:27:260:32 | "Done" | normal | -| Finally.cs:264:5:274:5 | {...} | Finally.cs:272:13:272:18 | ... = ... | normal | -| Finally.cs:264:5:274:5 | {...} | Finally.cs:272:13:272:18 | ... = ... | throw(Exception) [normal] (0) | -| Finally.cs:265:9:273:9 | try {...} ... | Finally.cs:272:13:272:18 | ... = ... | normal | -| Finally.cs:265:9:273:9 | try {...} ... | Finally.cs:272:13:272:18 | ... = ... | throw(Exception) [normal] (0) | -| Finally.cs:266:9:268:9 | {...} | Finally.cs:267:13:267:34 | call to method WriteLine | normal | -| Finally.cs:266:9:268:9 | {...} | Finally.cs:267:13:267:34 | call to method WriteLine | throw(Exception) | -| Finally.cs:267:13:267:34 | call to method WriteLine | Finally.cs:267:13:267:34 | call to method WriteLine | normal | -| Finally.cs:267:13:267:34 | call to method WriteLine | Finally.cs:267:13:267:34 | call to method WriteLine | throw(Exception) | -| Finally.cs:267:13:267:35 | ...; | Finally.cs:267:13:267:34 | call to method WriteLine | normal | -| Finally.cs:267:13:267:35 | ...; | Finally.cs:267:13:267:34 | call to method WriteLine | throw(Exception) | -| Finally.cs:267:31:267:33 | "1" | Finally.cs:267:31:267:33 | "1" | normal | -| Finally.cs:270:9:273:9 | {...} | Finally.cs:272:13:272:18 | ... = ... | normal | -| Finally.cs:271:13:271:34 | call to method WriteLine | Finally.cs:271:13:271:34 | call to method WriteLine | normal | -| Finally.cs:271:13:271:35 | ...; | Finally.cs:271:13:271:34 | call to method WriteLine | normal | -| Finally.cs:271:31:271:33 | "3" | Finally.cs:271:31:271:33 | "3" | normal | -| Finally.cs:272:13:272:13 | access to parameter i | Finally.cs:272:13:272:13 | access to parameter i | normal | -| Finally.cs:272:13:272:18 | ... + ... | Finally.cs:272:13:272:18 | ... + ... | normal | -| Finally.cs:272:13:272:18 | ... += ... | Finally.cs:272:13:272:18 | ... = ... | normal | -| Finally.cs:272:13:272:18 | ... = ... | Finally.cs:272:13:272:18 | ... = ... | normal | -| Finally.cs:272:13:272:19 | ...; | Finally.cs:272:13:272:18 | ... = ... | normal | -| Finally.cs:272:18:272:18 | 3 | Finally.cs:272:18:272:18 | 3 | normal | -| Foreach.cs:4:7:4:13 | call to constructor Object | Foreach.cs:4:7:4:13 | call to constructor Object | normal | -| Foreach.cs:4:7:4:13 | call to method | Foreach.cs:4:7:4:13 | call to method | normal | -| Foreach.cs:4:7:4:13 | this access | Foreach.cs:4:7:4:13 | this access | normal | -| Foreach.cs:4:7:4:13 | {...} | Foreach.cs:4:7:4:13 | {...} | normal | -| Foreach.cs:7:5:10:5 | {...} | Foreach.cs:8:9:9:13 | foreach (... ... in ...) ... | empty | -| Foreach.cs:8:9:9:13 | foreach (... ... in ...) ... | Foreach.cs:8:9:9:13 | foreach (... ... in ...) ... | empty | -| Foreach.cs:8:22:8:24 | String arg | Foreach.cs:8:22:8:24 | String arg | normal | -| Foreach.cs:8:29:8:32 | access to parameter args | Foreach.cs:8:29:8:32 | access to parameter args | normal | -| Foreach.cs:9:13:9:13 | ; | Foreach.cs:9:13:9:13 | ; | normal | -| Foreach.cs:13:5:16:5 | {...} | Foreach.cs:14:9:15:13 | foreach (... ... in ...) ... | empty | -| Foreach.cs:14:9:15:13 | foreach (... ... in ...) ... | Foreach.cs:14:9:15:13 | foreach (... ... in ...) ... | empty | -| Foreach.cs:14:22:14:22 | String _ | Foreach.cs:14:22:14:22 | String _ | normal | -| Foreach.cs:14:27:14:30 | access to parameter args | Foreach.cs:14:27:14:30 | access to parameter args | normal | -| Foreach.cs:15:13:15:13 | ; | Foreach.cs:15:13:15:13 | ; | normal | -| Foreach.cs:19:5:22:5 | {...} | Foreach.cs:20:9:21:11 | foreach (... ... in ...) ... | empty | -| Foreach.cs:20:9:21:11 | foreach (... ... in ...) ... | Foreach.cs:20:9:21:11 | foreach (... ... in ...) ... | empty | -| Foreach.cs:20:22:20:22 | String x | Foreach.cs:20:22:20:22 | String x | normal | -| Foreach.cs:20:27:20:27 | access to parameter e | Foreach.cs:20:27:20:27 | access to parameter e | non-null | -| Foreach.cs:20:27:20:27 | access to parameter e | Foreach.cs:20:27:20:27 | access to parameter e | null | -| Foreach.cs:20:27:20:38 | call to method ToArray | Foreach.cs:20:27:20:27 | access to parameter e | null | -| Foreach.cs:20:27:20:38 | call to method ToArray | Foreach.cs:20:27:20:38 | call to method ToArray | non-null | -| Foreach.cs:20:27:20:38 | call to method ToArray | Foreach.cs:20:27:20:38 | call to method ToArray | null | -| Foreach.cs:20:27:20:68 | ... ?? ... | Foreach.cs:20:27:20:68 | ... ?? ... | normal | -| Foreach.cs:20:43:20:68 | call to method Empty | Foreach.cs:20:43:20:68 | call to method Empty | normal | -| Foreach.cs:21:11:21:11 | ; | Foreach.cs:21:11:21:11 | ; | normal | -| Foreach.cs:25:5:28:5 | {...} | Foreach.cs:26:9:27:11 | foreach (... ... in ...) ... | empty | -| Foreach.cs:26:9:27:11 | foreach (... ... in ...) ... | Foreach.cs:26:9:27:11 | foreach (... ... in ...) ... | empty | -| Foreach.cs:26:18:26:31 | (..., ...) | Foreach.cs:26:18:26:31 | (..., ...) | normal | -| Foreach.cs:26:23:26:23 | String x | Foreach.cs:26:23:26:23 | String x | normal | -| Foreach.cs:26:30:26:30 | Int32 y | Foreach.cs:26:30:26:30 | Int32 y | normal | -| Foreach.cs:26:36:26:39 | access to parameter args | Foreach.cs:26:36:26:39 | access to parameter args | normal | -| Foreach.cs:27:11:27:11 | ; | Foreach.cs:27:11:27:11 | ; | normal | -| Foreach.cs:31:5:34:5 | {...} | Foreach.cs:32:9:33:11 | foreach (... ... in ...) ... | empty | -| Foreach.cs:32:9:33:11 | foreach (... ... in ...) ... | Foreach.cs:32:9:33:11 | foreach (... ... in ...) ... | empty | -| Foreach.cs:32:18:32:27 | (..., ...) | Foreach.cs:32:18:32:27 | (..., ...) | normal | -| Foreach.cs:32:23:32:23 | String x | Foreach.cs:32:23:32:23 | String x | normal | -| Foreach.cs:32:26:32:26 | Int32 y | Foreach.cs:32:26:32:26 | Int32 y | normal | -| Foreach.cs:32:32:32:35 | access to parameter args | Foreach.cs:32:32:32:35 | access to parameter args | normal | -| Foreach.cs:33:11:33:11 | ; | Foreach.cs:33:11:33:11 | ; | normal | -| Foreach.cs:37:5:40:5 | {...} | Foreach.cs:38:9:39:11 | foreach (... ... in ...) ... | empty | -| Foreach.cs:38:9:39:11 | foreach (... ... in ...) ... | Foreach.cs:38:9:39:11 | foreach (... ... in ...) ... | empty | -| Foreach.cs:38:18:38:34 | (..., ...) | Foreach.cs:38:18:38:34 | (..., ...) | normal | -| Foreach.cs:38:26:38:26 | String x | Foreach.cs:38:26:38:26 | String x | normal | -| Foreach.cs:38:33:38:33 | Int32 y | Foreach.cs:38:33:38:33 | Int32 y | normal | -| Foreach.cs:38:39:38:42 | access to parameter args | Foreach.cs:38:39:38:42 | access to parameter args | normal | -| Foreach.cs:39:11:39:11 | ; | Foreach.cs:39:11:39:11 | ; | normal | -| Initializers.cs:3:7:3:18 | {...} | Initializers.cs:3:7:3:18 | {...} | normal | -| Initializers.cs:5:9:5:9 | access to field F | Initializers.cs:5:9:5:9 | this access | normal | -| Initializers.cs:5:9:5:9 | this access | Initializers.cs:5:9:5:9 | this access | normal | -| Initializers.cs:5:9:5:17 | ... = ... | Initializers.cs:5:9:5:17 | ... = ... | normal | -| Initializers.cs:5:13:5:13 | access to field H | Initializers.cs:5:13:5:13 | access to field H | normal | -| Initializers.cs:5:13:5:17 | ... + ... | Initializers.cs:5:13:5:17 | ... + ... | normal | -| Initializers.cs:5:17:5:17 | 1 | Initializers.cs:5:17:5:17 | 1 | normal | -| Initializers.cs:6:9:6:9 | access to property G | Initializers.cs:6:9:6:9 | this access | normal | -| Initializers.cs:6:9:6:9 | this access | Initializers.cs:6:9:6:9 | this access | normal | -| Initializers.cs:6:25:6:31 | ... = ... | Initializers.cs:6:25:6:31 | ... = ... | normal | -| Initializers.cs:6:27:6:27 | access to field H | Initializers.cs:6:27:6:27 | access to field H | normal | -| Initializers.cs:6:27:6:31 | ... + ... | Initializers.cs:6:27:6:31 | ... + ... | normal | -| Initializers.cs:6:31:6:31 | 2 | Initializers.cs:6:31:6:31 | 2 | normal | -| Initializers.cs:8:5:8:16 | call to constructor Object | Initializers.cs:8:5:8:16 | call to constructor Object | normal | -| Initializers.cs:8:5:8:16 | call to method | Initializers.cs:8:5:8:16 | call to method | normal | -| Initializers.cs:8:5:8:16 | this access | Initializers.cs:8:5:8:16 | this access | normal | -| Initializers.cs:8:20:8:22 | {...} | Initializers.cs:8:20:8:22 | {...} | normal | -| Initializers.cs:10:5:10:16 | call to constructor Object | Initializers.cs:10:5:10:16 | call to constructor Object | normal | -| Initializers.cs:10:5:10:16 | call to method | Initializers.cs:10:5:10:16 | call to method | normal | -| Initializers.cs:10:5:10:16 | this access | Initializers.cs:10:5:10:16 | this access | normal | -| Initializers.cs:10:28:10:30 | {...} | Initializers.cs:10:28:10:30 | {...} | normal | -| Initializers.cs:13:5:16:5 | {...} | Initializers.cs:15:13:15:63 | Initializers[] iz = ... | normal | -| Initializers.cs:14:9:14:54 | ... ...; | Initializers.cs:14:13:14:53 | Initializers i = ... | normal | -| Initializers.cs:14:13:14:53 | Initializers i = ... | Initializers.cs:14:13:14:53 | Initializers i = ... | normal | -| Initializers.cs:14:17:14:53 | object creation of type Initializers | Initializers.cs:14:38:14:53 | { ..., ... } | normal | -| Initializers.cs:14:34:14:35 | "" | Initializers.cs:14:34:14:35 | "" | normal | -| Initializers.cs:14:38:14:53 | { ..., ... } | Initializers.cs:14:38:14:53 | { ..., ... } | normal | -| Initializers.cs:14:40:14:44 | ... = ... | Initializers.cs:14:40:14:44 | ... = ... | normal | -| Initializers.cs:14:44:14:44 | 0 | Initializers.cs:14:44:14:44 | 0 | normal | -| Initializers.cs:14:47:14:51 | ... = ... | Initializers.cs:14:47:14:51 | ... = ... | normal | -| Initializers.cs:14:51:14:51 | 1 | Initializers.cs:14:51:14:51 | 1 | normal | -| Initializers.cs:15:9:15:64 | ... ...; | Initializers.cs:15:13:15:63 | Initializers[] iz = ... | normal | -| Initializers.cs:15:13:15:63 | Initializers[] iz = ... | Initializers.cs:15:13:15:63 | Initializers[] iz = ... | normal | -| Initializers.cs:15:18:15:63 | 2 | Initializers.cs:15:18:15:63 | 2 | normal | -| Initializers.cs:15:18:15:63 | array creation of type Initializers[] | Initializers.cs:15:37:15:63 | { ..., ... } | normal | -| Initializers.cs:15:37:15:63 | { ..., ... } | Initializers.cs:15:37:15:63 | { ..., ... } | normal | -| Initializers.cs:15:39:15:39 | access to local variable i | Initializers.cs:15:39:15:39 | access to local variable i | normal | -| Initializers.cs:15:42:15:61 | object creation of type Initializers | Initializers.cs:15:42:15:61 | object creation of type Initializers | normal | -| Initializers.cs:15:59:15:60 | "" | Initializers.cs:15:59:15:60 | "" | normal | -| Initializers.cs:18:16:18:20 | ... = ... | Initializers.cs:18:16:18:20 | ... = ... | normal | -| Initializers.cs:18:20:18:20 | 1 | Initializers.cs:18:20:18:20 | 1 | normal | -| Initializers.cs:20:11:20:23 | call to constructor Object | Initializers.cs:20:11:20:23 | call to constructor Object | normal | -| Initializers.cs:20:11:20:23 | call to method | Initializers.cs:20:11:20:23 | call to method | normal | -| Initializers.cs:20:11:20:23 | this access | Initializers.cs:20:11:20:23 | this access | normal | -| Initializers.cs:20:11:20:23 | {...} | Initializers.cs:20:11:20:23 | {...} | normal | -| Initializers.cs:22:23:22:23 | access to field F | Initializers.cs:22:23:22:23 | this access | normal | -| Initializers.cs:22:23:22:23 | this access | Initializers.cs:22:23:22:23 | this access | normal | -| Initializers.cs:22:23:22:27 | ... = ... | Initializers.cs:22:23:22:27 | ... = ... | normal | -| Initializers.cs:22:27:22:27 | 0 | Initializers.cs:22:27:22:27 | 0 | normal | -| Initializers.cs:23:23:23:23 | access to field G | Initializers.cs:23:23:23:23 | this access | normal | -| Initializers.cs:23:23:23:23 | this access | Initializers.cs:23:23:23:23 | this access | normal | -| Initializers.cs:23:23:23:27 | ... = ... | Initializers.cs:23:23:23:27 | ... = ... | normal | -| Initializers.cs:23:27:23:27 | 1 | Initializers.cs:23:27:23:27 | 1 | normal | -| Initializers.cs:28:13:28:13 | access to field H | Initializers.cs:28:13:28:13 | this access | normal | -| Initializers.cs:28:13:28:13 | this access | Initializers.cs:28:13:28:13 | this access | normal | -| Initializers.cs:28:13:28:17 | ... = ... | Initializers.cs:28:13:28:17 | ... = ... | normal | -| Initializers.cs:28:17:28:17 | 2 | Initializers.cs:28:17:28:17 | 2 | normal | -| Initializers.cs:31:9:31:11 | call to method | Initializers.cs:31:9:31:11 | call to method | normal | -| Initializers.cs:31:9:31:11 | this access | Initializers.cs:31:9:31:11 | this access | normal | -| Initializers.cs:31:17:31:20 | call to constructor NoConstructor | Initializers.cs:31:17:31:20 | call to constructor NoConstructor | normal | -| Initializers.cs:31:24:31:33 | {...} | Initializers.cs:31:26:31:30 | ... = ... | normal | -| Initializers.cs:31:26:31:26 | access to field I | Initializers.cs:31:26:31:26 | this access | normal | -| Initializers.cs:31:26:31:26 | this access | Initializers.cs:31:26:31:26 | this access | normal | -| Initializers.cs:31:26:31:30 | ... = ... | Initializers.cs:31:26:31:30 | ... = ... | normal | -| Initializers.cs:31:26:31:31 | ...; | Initializers.cs:31:26:31:30 | ... = ... | normal | -| Initializers.cs:31:30:31:30 | 3 | Initializers.cs:31:30:31:30 | 3 | normal | -| Initializers.cs:33:22:33:25 | call to constructor Sub | Initializers.cs:33:22:33:25 | call to constructor Sub | normal | -| Initializers.cs:33:29:33:38 | {...} | Initializers.cs:33:31:33:35 | ... = ... | normal | -| Initializers.cs:33:31:33:31 | access to field I | Initializers.cs:33:31:33:31 | this access | normal | -| Initializers.cs:33:31:33:31 | this access | Initializers.cs:33:31:33:31 | this access | normal | -| Initializers.cs:33:31:33:35 | ... = ... | Initializers.cs:33:31:33:35 | ... = ... | normal | -| Initializers.cs:33:31:33:36 | ...; | Initializers.cs:33:31:33:35 | ... = ... | normal | -| Initializers.cs:33:35:33:35 | access to parameter i | Initializers.cs:33:35:33:35 | access to parameter i | normal | -| Initializers.cs:35:9:35:11 | call to constructor NoConstructor | Initializers.cs:35:9:35:11 | call to constructor NoConstructor | normal | -| Initializers.cs:35:9:35:11 | call to method | Initializers.cs:35:9:35:11 | call to method | normal | -| Initializers.cs:35:9:35:11 | this access | Initializers.cs:35:9:35:11 | this access | normal | -| Initializers.cs:35:27:35:40 | {...} | Initializers.cs:35:29:35:37 | ... = ... | normal | -| Initializers.cs:35:29:35:29 | access to field I | Initializers.cs:35:29:35:29 | this access | normal | -| Initializers.cs:35:29:35:29 | this access | Initializers.cs:35:29:35:29 | this access | normal | -| Initializers.cs:35:29:35:37 | ... = ... | Initializers.cs:35:29:35:37 | ... = ... | normal | -| Initializers.cs:35:29:35:38 | ...; | Initializers.cs:35:29:35:37 | ... = ... | normal | -| Initializers.cs:35:33:35:33 | access to parameter i | Initializers.cs:35:33:35:33 | access to parameter i | normal | -| Initializers.cs:35:33:35:37 | ... + ... | Initializers.cs:35:33:35:37 | ... + ... | normal | -| Initializers.cs:35:37:35:37 | access to parameter j | Initializers.cs:35:37:35:37 | access to parameter j | normal | -| Initializers.cs:39:7:39:23 | call to constructor Object | Initializers.cs:39:7:39:23 | call to constructor Object | normal | -| Initializers.cs:39:7:39:23 | call to method | Initializers.cs:39:7:39:23 | call to method | normal | -| Initializers.cs:39:7:39:23 | this access | Initializers.cs:39:7:39:23 | this access | normal | -| Initializers.cs:39:7:39:23 | {...} | Initializers.cs:39:7:39:23 | {...} | normal | -| Initializers.cs:41:11:41:18 | call to constructor Object | Initializers.cs:41:11:41:18 | call to constructor Object | normal | -| Initializers.cs:41:11:41:18 | call to method | Initializers.cs:41:11:41:18 | call to method | normal | -| Initializers.cs:41:11:41:18 | this access | Initializers.cs:41:11:41:18 | this access | normal | -| Initializers.cs:41:11:41:18 | {...} | Initializers.cs:41:11:41:18 | {...} | normal | -| Initializers.cs:52:5:66:5 | {...} | Initializers.cs:57:13:65:9 | Compound compound = ... | normal | -| Initializers.cs:54:9:54:96 | ... ...; | Initializers.cs:54:13:54:95 | Dictionary dict = ... | normal | -| Initializers.cs:54:13:54:95 | Dictionary dict = ... | Initializers.cs:54:13:54:95 | Dictionary dict = ... | normal | -| Initializers.cs:54:20:54:95 | object creation of type Dictionary | Initializers.cs:54:50:54:95 | { ..., ... } | normal | -| Initializers.cs:54:50:54:95 | { ..., ... } | Initializers.cs:54:50:54:95 | { ..., ... } | normal | -| Initializers.cs:54:52:54:54 | access to indexer | Initializers.cs:54:53:54:53 | 0 | normal | -| Initializers.cs:54:52:54:63 | ... = ... | Initializers.cs:54:52:54:63 | ... = ... | normal | -| Initializers.cs:54:53:54:53 | 0 | Initializers.cs:54:53:54:53 | 0 | normal | -| Initializers.cs:54:58:54:63 | "Zero" | Initializers.cs:54:58:54:63 | "Zero" | normal | -| Initializers.cs:54:66:54:68 | access to indexer | Initializers.cs:54:67:54:67 | 1 | normal | -| Initializers.cs:54:66:54:76 | ... = ... | Initializers.cs:54:66:54:76 | ... = ... | normal | -| Initializers.cs:54:67:54:67 | 1 | Initializers.cs:54:67:54:67 | 1 | normal | -| Initializers.cs:54:72:54:76 | "One" | Initializers.cs:54:72:54:76 | "One" | normal | -| Initializers.cs:54:79:54:85 | access to indexer | Initializers.cs:54:80:54:84 | ... + ... | normal | -| Initializers.cs:54:79:54:93 | ... = ... | Initializers.cs:54:79:54:93 | ... = ... | normal | -| Initializers.cs:54:80:54:80 | access to parameter i | Initializers.cs:54:80:54:80 | access to parameter i | normal | -| Initializers.cs:54:80:54:84 | ... + ... | Initializers.cs:54:80:54:84 | ... + ... | normal | -| Initializers.cs:54:84:54:84 | 2 | Initializers.cs:54:84:54:84 | 2 | normal | -| Initializers.cs:54:89:54:93 | "Two" | Initializers.cs:54:89:54:93 | "Two" | normal | -| Initializers.cs:57:9:65:10 | ... ...; | Initializers.cs:57:13:65:9 | Compound compound = ... | normal | -| Initializers.cs:57:13:65:9 | Compound compound = ... | Initializers.cs:57:13:65:9 | Compound compound = ... | normal | -| Initializers.cs:57:24:65:9 | object creation of type Compound | Initializers.cs:58:9:65:9 | { ..., ... } | normal | -| Initializers.cs:58:9:65:9 | { ..., ... } | Initializers.cs:58:9:65:9 | { ..., ... } | normal | -| Initializers.cs:59:13:59:76 | ... = ... | Initializers.cs:59:13:59:76 | ... = ... | normal | -| Initializers.cs:59:31:59:76 | { ..., ... } | Initializers.cs:59:31:59:76 | { ..., ... } | normal | -| Initializers.cs:59:33:59:35 | access to indexer | Initializers.cs:59:34:59:34 | 0 | normal | -| Initializers.cs:59:33:59:44 | ... = ... | Initializers.cs:59:33:59:44 | ... = ... | normal | -| Initializers.cs:59:34:59:34 | 0 | Initializers.cs:59:34:59:34 | 0 | normal | -| Initializers.cs:59:39:59:44 | "Zero" | Initializers.cs:59:39:59:44 | "Zero" | normal | -| Initializers.cs:59:47:59:49 | access to indexer | Initializers.cs:59:48:59:48 | 1 | normal | -| Initializers.cs:59:47:59:57 | ... = ... | Initializers.cs:59:47:59:57 | ... = ... | normal | -| Initializers.cs:59:48:59:48 | 1 | Initializers.cs:59:48:59:48 | 1 | normal | -| Initializers.cs:59:53:59:57 | "One" | Initializers.cs:59:53:59:57 | "One" | normal | -| Initializers.cs:59:60:59:66 | access to indexer | Initializers.cs:59:61:59:65 | ... + ... | normal | -| Initializers.cs:59:60:59:74 | ... = ... | Initializers.cs:59:60:59:74 | ... = ... | normal | -| Initializers.cs:59:61:59:61 | access to parameter i | Initializers.cs:59:61:59:61 | access to parameter i | normal | -| Initializers.cs:59:61:59:65 | ... + ... | Initializers.cs:59:61:59:65 | ... + ... | normal | -| Initializers.cs:59:65:59:65 | 2 | Initializers.cs:59:65:59:65 | 2 | normal | -| Initializers.cs:59:70:59:74 | "Two" | Initializers.cs:59:70:59:74 | "Two" | normal | -| Initializers.cs:60:13:60:80 | ... = ... | Initializers.cs:60:13:60:80 | ... = ... | normal | -| Initializers.cs:60:34:60:80 | { ..., ... } | Initializers.cs:60:34:60:80 | { ..., ... } | normal | -| Initializers.cs:60:36:60:38 | access to indexer | Initializers.cs:60:37:60:37 | 3 | normal | -| Initializers.cs:60:36:60:48 | ... = ... | Initializers.cs:60:36:60:48 | ... = ... | normal | -| Initializers.cs:60:37:60:37 | 3 | Initializers.cs:60:37:60:37 | 3 | normal | -| Initializers.cs:60:42:60:48 | "Three" | Initializers.cs:60:42:60:48 | "Three" | normal | -| Initializers.cs:60:51:60:53 | access to indexer | Initializers.cs:60:52:60:52 | 2 | normal | -| Initializers.cs:60:51:60:61 | ... = ... | Initializers.cs:60:51:60:61 | ... = ... | normal | -| Initializers.cs:60:52:60:52 | 2 | Initializers.cs:60:52:60:52 | 2 | normal | -| Initializers.cs:60:57:60:61 | "Two" | Initializers.cs:60:57:60:61 | "Two" | normal | -| Initializers.cs:60:64:60:70 | access to indexer | Initializers.cs:60:65:60:69 | ... + ... | normal | -| Initializers.cs:60:64:60:78 | ... = ... | Initializers.cs:60:64:60:78 | ... = ... | normal | -| Initializers.cs:60:65:60:65 | access to parameter i | Initializers.cs:60:65:60:65 | access to parameter i | normal | -| Initializers.cs:60:65:60:69 | ... + ... | Initializers.cs:60:65:60:69 | ... + ... | normal | -| Initializers.cs:60:69:60:69 | 1 | Initializers.cs:60:69:60:69 | 1 | normal | -| Initializers.cs:60:74:60:78 | "One" | Initializers.cs:60:74:60:78 | "One" | normal | -| Initializers.cs:61:13:61:58 | ... = ... | Initializers.cs:61:13:61:58 | ... = ... | normal | -| Initializers.cs:61:26:61:58 | { ..., ... } | Initializers.cs:61:26:61:58 | { ..., ... } | normal | -| Initializers.cs:61:28:61:30 | access to array element | Initializers.cs:61:29:61:29 | 0 | normal | -| Initializers.cs:61:28:61:39 | ... = ... | Initializers.cs:61:28:61:39 | ... = ... | normal | -| Initializers.cs:61:29:61:29 | 0 | Initializers.cs:61:29:61:29 | 0 | normal | -| Initializers.cs:61:34:61:39 | "Zero" | Initializers.cs:61:34:61:39 | "Zero" | normal | -| Initializers.cs:61:42:61:48 | access to array element | Initializers.cs:61:43:61:47 | ... + ... | normal | -| Initializers.cs:61:42:61:56 | ... = ... | Initializers.cs:61:42:61:56 | ... = ... | normal | -| Initializers.cs:61:43:61:43 | access to parameter i | Initializers.cs:61:43:61:43 | access to parameter i | normal | -| Initializers.cs:61:43:61:47 | ... + ... | Initializers.cs:61:43:61:47 | ... + ... | normal | -| Initializers.cs:61:47:61:47 | 1 | Initializers.cs:61:47:61:47 | 1 | normal | -| Initializers.cs:61:52:61:56 | "One" | Initializers.cs:61:52:61:56 | "One" | normal | -| Initializers.cs:62:13:62:60 | ... = ... | Initializers.cs:62:13:62:60 | ... = ... | normal | -| Initializers.cs:62:27:62:60 | { ..., ... } | Initializers.cs:62:27:62:60 | { ..., ... } | normal | -| Initializers.cs:62:29:62:34 | access to array element | Initializers.cs:62:33:62:33 | 1 | normal | -| Initializers.cs:62:29:62:40 | ... = ... | Initializers.cs:62:29:62:40 | ... = ... | normal | -| Initializers.cs:62:30:62:30 | 0 | Initializers.cs:62:30:62:30 | 0 | normal | -| Initializers.cs:62:33:62:33 | 1 | Initializers.cs:62:33:62:33 | 1 | normal | -| Initializers.cs:62:38:62:40 | "i" | Initializers.cs:62:38:62:40 | "i" | normal | -| Initializers.cs:62:43:62:52 | access to array element | Initializers.cs:62:47:62:51 | ... + ... | normal | -| Initializers.cs:62:43:62:58 | ... = ... | Initializers.cs:62:43:62:58 | ... = ... | normal | -| Initializers.cs:62:44:62:44 | 1 | Initializers.cs:62:44:62:44 | 1 | normal | -| Initializers.cs:62:47:62:47 | access to parameter i | Initializers.cs:62:47:62:47 | access to parameter i | normal | -| Initializers.cs:62:47:62:51 | ... + ... | Initializers.cs:62:47:62:51 | ... + ... | normal | -| Initializers.cs:62:51:62:51 | 0 | Initializers.cs:62:51:62:51 | 0 | normal | -| Initializers.cs:62:56:62:58 | "1" | Initializers.cs:62:56:62:58 | "1" | normal | -| Initializers.cs:63:13:63:60 | ... = ... | Initializers.cs:63:13:63:60 | ... = ... | normal | -| Initializers.cs:63:29:63:60 | { ..., ... } | Initializers.cs:63:29:63:60 | { ..., ... } | normal | -| Initializers.cs:63:31:63:33 | access to array element | Initializers.cs:63:32:63:32 | 1 | normal | -| Initializers.cs:63:31:63:41 | ... = ... | Initializers.cs:63:31:63:41 | ... = ... | normal | -| Initializers.cs:63:32:63:32 | 1 | Initializers.cs:63:32:63:32 | 1 | normal | -| Initializers.cs:63:37:63:41 | "One" | Initializers.cs:63:37:63:41 | "One" | normal | -| Initializers.cs:63:44:63:50 | access to array element | Initializers.cs:63:45:63:49 | ... + ... | normal | -| Initializers.cs:63:44:63:58 | ... = ... | Initializers.cs:63:44:63:58 | ... = ... | normal | -| Initializers.cs:63:45:63:45 | access to parameter i | Initializers.cs:63:45:63:45 | access to parameter i | normal | -| Initializers.cs:63:45:63:49 | ... + ... | Initializers.cs:63:45:63:49 | ... + ... | normal | -| Initializers.cs:63:49:63:49 | 2 | Initializers.cs:63:49:63:49 | 2 | normal | -| Initializers.cs:63:54:63:58 | "Two" | Initializers.cs:63:54:63:58 | "Two" | normal | -| Initializers.cs:64:13:64:63 | ... = ... | Initializers.cs:64:13:64:63 | ... = ... | normal | -| Initializers.cs:64:30:64:63 | { ..., ... } | Initializers.cs:64:30:64:63 | { ..., ... } | normal | -| Initializers.cs:64:32:64:37 | access to array element | Initializers.cs:64:36:64:36 | 1 | normal | -| Initializers.cs:64:32:64:43 | ... = ... | Initializers.cs:64:32:64:43 | ... = ... | normal | -| Initializers.cs:64:33:64:33 | 0 | Initializers.cs:64:33:64:33 | 0 | normal | -| Initializers.cs:64:36:64:36 | 1 | Initializers.cs:64:36:64:36 | 1 | normal | -| Initializers.cs:64:41:64:43 | "i" | Initializers.cs:64:41:64:43 | "i" | normal | -| Initializers.cs:64:46:64:55 | access to array element | Initializers.cs:64:50:64:54 | ... + ... | normal | -| Initializers.cs:64:46:64:61 | ... = ... | Initializers.cs:64:46:64:61 | ... = ... | normal | -| Initializers.cs:64:47:64:47 | 1 | Initializers.cs:64:47:64:47 | 1 | normal | -| Initializers.cs:64:50:64:50 | access to parameter i | Initializers.cs:64:50:64:50 | access to parameter i | normal | -| Initializers.cs:64:50:64:54 | ... + ... | Initializers.cs:64:50:64:54 | ... + ... | normal | -| Initializers.cs:64:54:64:54 | 0 | Initializers.cs:64:54:64:54 | 0 | normal | -| Initializers.cs:64:59:64:61 | "1" | Initializers.cs:64:59:64:61 | "1" | normal | -| LoopUnrolling.cs:5:7:5:19 | call to constructor Object | LoopUnrolling.cs:5:7:5:19 | call to constructor Object | normal | -| LoopUnrolling.cs:5:7:5:19 | call to method | LoopUnrolling.cs:5:7:5:19 | call to method | normal | -| LoopUnrolling.cs:5:7:5:19 | this access | LoopUnrolling.cs:5:7:5:19 | this access | normal | -| LoopUnrolling.cs:5:7:5:19 | {...} | LoopUnrolling.cs:5:7:5:19 | {...} | normal | -| LoopUnrolling.cs:8:5:13:5 | {...} | LoopUnrolling.cs:10:13:10:19 | return ...; | return | -| LoopUnrolling.cs:8:5:13:5 | {...} | LoopUnrolling.cs:11:9:12:35 | foreach (... ... in ...) ... | empty | -| LoopUnrolling.cs:9:9:10:19 | if (...) ... | LoopUnrolling.cs:9:13:9:28 | ... == ... | false | -| LoopUnrolling.cs:9:9:10:19 | if (...) ... | LoopUnrolling.cs:10:13:10:19 | return ...; | return | -| LoopUnrolling.cs:9:13:9:16 | access to parameter args | LoopUnrolling.cs:9:13:9:16 | access to parameter args | normal | -| LoopUnrolling.cs:9:13:9:23 | access to property Length | LoopUnrolling.cs:9:13:9:23 | access to property Length | normal | -| LoopUnrolling.cs:9:13:9:28 | ... == ... | LoopUnrolling.cs:9:13:9:28 | ... == ... | false | -| LoopUnrolling.cs:9:13:9:28 | ... == ... | LoopUnrolling.cs:9:13:9:28 | ... == ... | true | -| LoopUnrolling.cs:9:28:9:28 | 0 | LoopUnrolling.cs:9:28:9:28 | 0 | normal | -| LoopUnrolling.cs:10:13:10:19 | return ...; | LoopUnrolling.cs:10:13:10:19 | return ...; | return | -| LoopUnrolling.cs:11:9:12:35 | foreach (... ... in ...) ... | LoopUnrolling.cs:11:9:12:35 | foreach (... ... in ...) ... | empty | -| LoopUnrolling.cs:11:22:11:24 | String arg | LoopUnrolling.cs:11:22:11:24 | String arg | normal | -| LoopUnrolling.cs:11:29:11:32 | access to parameter args | LoopUnrolling.cs:11:29:11:32 | access to parameter args | normal | -| LoopUnrolling.cs:12:13:12:34 | call to method WriteLine | LoopUnrolling.cs:12:13:12:34 | call to method WriteLine | normal | -| LoopUnrolling.cs:12:13:12:35 | ...; | LoopUnrolling.cs:12:13:12:34 | call to method WriteLine | normal | -| LoopUnrolling.cs:12:31:12:33 | access to local variable arg | LoopUnrolling.cs:12:31:12:33 | access to local variable arg | normal | -| LoopUnrolling.cs:16:5:20:5 | {...} | LoopUnrolling.cs:18:9:19:33 | foreach (... ... in ...) ... | empty | -| LoopUnrolling.cs:17:9:17:48 | ... ...; | LoopUnrolling.cs:17:13:17:47 | String[] xs = ... | normal | -| LoopUnrolling.cs:17:13:17:47 | String[] xs = ... | LoopUnrolling.cs:17:13:17:47 | String[] xs = ... | normal | -| LoopUnrolling.cs:17:18:17:47 | 3 | LoopUnrolling.cs:17:18:17:47 | 3 | normal | -| LoopUnrolling.cs:17:18:17:47 | array creation of type String[] | LoopUnrolling.cs:17:31:17:47 | { ..., ... } | normal | -| LoopUnrolling.cs:17:31:17:47 | { ..., ... } | LoopUnrolling.cs:17:31:17:47 | { ..., ... } | normal | -| LoopUnrolling.cs:17:33:17:35 | "a" | LoopUnrolling.cs:17:33:17:35 | "a" | normal | -| LoopUnrolling.cs:17:38:17:40 | "b" | LoopUnrolling.cs:17:38:17:40 | "b" | normal | -| LoopUnrolling.cs:17:43:17:45 | "c" | LoopUnrolling.cs:17:43:17:45 | "c" | normal | -| LoopUnrolling.cs:18:9:19:33 | foreach (... ... in ...) ... | LoopUnrolling.cs:18:9:19:33 | foreach (... ... in ...) ... | empty | -| LoopUnrolling.cs:18:22:18:22 | String x | LoopUnrolling.cs:18:22:18:22 | String x | normal | -| LoopUnrolling.cs:18:27:18:28 | access to local variable xs | LoopUnrolling.cs:18:27:18:28 | access to local variable xs | normal | -| LoopUnrolling.cs:19:13:19:32 | call to method WriteLine | LoopUnrolling.cs:19:13:19:32 | call to method WriteLine | normal | -| LoopUnrolling.cs:19:13:19:33 | ...; | LoopUnrolling.cs:19:13:19:32 | call to method WriteLine | normal | -| LoopUnrolling.cs:19:31:19:31 | access to local variable x | LoopUnrolling.cs:19:31:19:31 | access to local variable x | normal | -| LoopUnrolling.cs:23:5:27:5 | {...} | LoopUnrolling.cs:24:9:26:40 | foreach (... ... in ...) ... | empty | -| LoopUnrolling.cs:24:9:26:40 | foreach (... ... in ...) ... | LoopUnrolling.cs:24:9:26:40 | foreach (... ... in ...) ... | empty | -| LoopUnrolling.cs:24:22:24:24 | Char arg | LoopUnrolling.cs:24:22:24:24 | Char arg | normal | -| LoopUnrolling.cs:24:29:24:32 | access to parameter args | LoopUnrolling.cs:24:29:24:32 | access to parameter args | normal | -| LoopUnrolling.cs:25:13:26:40 | foreach (... ... in ...) ... | LoopUnrolling.cs:25:13:26:40 | foreach (... ... in ...) ... | empty | -| LoopUnrolling.cs:25:26:25:29 | Char arg0 | LoopUnrolling.cs:25:26:25:29 | Char arg0 | normal | -| LoopUnrolling.cs:25:34:25:37 | access to parameter args | LoopUnrolling.cs:25:34:25:37 | access to parameter args | normal | -| LoopUnrolling.cs:26:17:26:39 | call to method WriteLine | LoopUnrolling.cs:26:17:26:39 | call to method WriteLine | normal | -| LoopUnrolling.cs:26:17:26:40 | ...; | LoopUnrolling.cs:26:17:26:39 | call to method WriteLine | normal | -| LoopUnrolling.cs:26:35:26:38 | access to local variable arg0 | LoopUnrolling.cs:26:35:26:38 | access to local variable arg0 | normal | -| LoopUnrolling.cs:30:5:34:5 | {...} | LoopUnrolling.cs:32:9:33:33 | foreach (... ... in ...) ... | empty | -| LoopUnrolling.cs:31:9:31:31 | ... ...; | LoopUnrolling.cs:31:13:31:30 | String[] xs = ... | normal | -| LoopUnrolling.cs:31:13:31:30 | String[] xs = ... | LoopUnrolling.cs:31:13:31:30 | String[] xs = ... | normal | -| LoopUnrolling.cs:31:18:31:30 | array creation of type String[] | LoopUnrolling.cs:31:18:31:30 | array creation of type String[] | normal | -| LoopUnrolling.cs:31:29:31:29 | 0 | LoopUnrolling.cs:31:29:31:29 | 0 | normal | -| LoopUnrolling.cs:32:9:33:33 | foreach (... ... in ...) ... | LoopUnrolling.cs:32:9:33:33 | foreach (... ... in ...) ... | empty | -| LoopUnrolling.cs:32:22:32:22 | String x | LoopUnrolling.cs:32:22:32:22 | String x | normal | -| LoopUnrolling.cs:32:27:32:28 | access to local variable xs | LoopUnrolling.cs:32:27:32:28 | access to local variable xs | normal | -| LoopUnrolling.cs:33:13:33:32 | call to method WriteLine | LoopUnrolling.cs:33:13:33:32 | call to method WriteLine | normal | -| LoopUnrolling.cs:33:13:33:33 | ...; | LoopUnrolling.cs:33:13:33:32 | call to method WriteLine | normal | -| LoopUnrolling.cs:33:31:33:31 | access to local variable x | LoopUnrolling.cs:33:31:33:31 | access to local variable x | normal | -| LoopUnrolling.cs:37:5:43:5 | {...} | LoopUnrolling.cs:40:9:42:41 | foreach (... ... in ...) ... | empty | -| LoopUnrolling.cs:38:9:38:48 | ... ...; | LoopUnrolling.cs:38:13:38:47 | String[] xs = ... | normal | -| LoopUnrolling.cs:38:13:38:47 | String[] xs = ... | LoopUnrolling.cs:38:13:38:47 | String[] xs = ... | normal | -| LoopUnrolling.cs:38:18:38:47 | 3 | LoopUnrolling.cs:38:18:38:47 | 3 | normal | -| LoopUnrolling.cs:38:18:38:47 | array creation of type String[] | LoopUnrolling.cs:38:31:38:47 | { ..., ... } | normal | -| LoopUnrolling.cs:38:31:38:47 | { ..., ... } | LoopUnrolling.cs:38:31:38:47 | { ..., ... } | normal | -| LoopUnrolling.cs:38:33:38:35 | "a" | LoopUnrolling.cs:38:33:38:35 | "a" | normal | -| LoopUnrolling.cs:38:38:38:40 | "b" | LoopUnrolling.cs:38:38:38:40 | "b" | normal | -| LoopUnrolling.cs:38:43:38:45 | "c" | LoopUnrolling.cs:38:43:38:45 | "c" | normal | -| LoopUnrolling.cs:39:9:39:48 | ... ...; | LoopUnrolling.cs:39:13:39:47 | String[] ys = ... | normal | -| LoopUnrolling.cs:39:13:39:47 | String[] ys = ... | LoopUnrolling.cs:39:13:39:47 | String[] ys = ... | normal | -| LoopUnrolling.cs:39:18:39:47 | 3 | LoopUnrolling.cs:39:18:39:47 | 3 | normal | -| LoopUnrolling.cs:39:18:39:47 | array creation of type String[] | LoopUnrolling.cs:39:31:39:47 | { ..., ... } | normal | -| LoopUnrolling.cs:39:31:39:47 | { ..., ... } | LoopUnrolling.cs:39:31:39:47 | { ..., ... } | normal | -| LoopUnrolling.cs:39:33:39:35 | "0" | LoopUnrolling.cs:39:33:39:35 | "0" | normal | -| LoopUnrolling.cs:39:38:39:40 | "1" | LoopUnrolling.cs:39:38:39:40 | "1" | normal | -| LoopUnrolling.cs:39:43:39:45 | "2" | LoopUnrolling.cs:39:43:39:45 | "2" | normal | -| LoopUnrolling.cs:40:9:42:41 | foreach (... ... in ...) ... | LoopUnrolling.cs:40:9:42:41 | foreach (... ... in ...) ... | empty | -| LoopUnrolling.cs:40:22:40:22 | String x | LoopUnrolling.cs:40:22:40:22 | String x | normal | -| LoopUnrolling.cs:40:27:40:28 | access to local variable xs | LoopUnrolling.cs:40:27:40:28 | access to local variable xs | normal | -| LoopUnrolling.cs:41:13:42:41 | foreach (... ... in ...) ... | LoopUnrolling.cs:41:13:42:41 | foreach (... ... in ...) ... | empty | -| LoopUnrolling.cs:41:26:41:26 | String y | LoopUnrolling.cs:41:26:41:26 | String y | normal | -| LoopUnrolling.cs:41:31:41:32 | access to local variable ys | LoopUnrolling.cs:41:31:41:32 | access to local variable ys | normal | -| LoopUnrolling.cs:42:17:42:40 | call to method WriteLine | LoopUnrolling.cs:42:17:42:40 | call to method WriteLine | normal | -| LoopUnrolling.cs:42:17:42:41 | ...; | LoopUnrolling.cs:42:17:42:40 | call to method WriteLine | normal | -| LoopUnrolling.cs:42:35:42:35 | access to local variable x | LoopUnrolling.cs:42:35:42:35 | access to local variable x | normal | -| LoopUnrolling.cs:42:35:42:39 | ... + ... | LoopUnrolling.cs:42:35:42:39 | ... + ... | normal | -| LoopUnrolling.cs:42:39:42:39 | access to local variable y | LoopUnrolling.cs:42:39:42:39 | access to local variable y | normal | -| LoopUnrolling.cs:46:5:53:5 | {...} | LoopUnrolling.cs:48:9:52:9 | foreach (... ... in ...) ... | empty | -| LoopUnrolling.cs:46:5:53:5 | {...} | LoopUnrolling.cs:51:13:51:23 | goto ...; | goto(Label) | -| LoopUnrolling.cs:47:9:47:48 | ... ...; | LoopUnrolling.cs:47:13:47:47 | String[] xs = ... | normal | -| LoopUnrolling.cs:47:13:47:47 | String[] xs = ... | LoopUnrolling.cs:47:13:47:47 | String[] xs = ... | normal | -| LoopUnrolling.cs:47:18:47:47 | 3 | LoopUnrolling.cs:47:18:47:47 | 3 | normal | -| LoopUnrolling.cs:47:18:47:47 | array creation of type String[] | LoopUnrolling.cs:47:31:47:47 | { ..., ... } | normal | -| LoopUnrolling.cs:47:31:47:47 | { ..., ... } | LoopUnrolling.cs:47:31:47:47 | { ..., ... } | normal | -| LoopUnrolling.cs:47:33:47:35 | "a" | LoopUnrolling.cs:47:33:47:35 | "a" | normal | -| LoopUnrolling.cs:47:38:47:40 | "b" | LoopUnrolling.cs:47:38:47:40 | "b" | normal | -| LoopUnrolling.cs:47:43:47:45 | "c" | LoopUnrolling.cs:47:43:47:45 | "c" | normal | -| LoopUnrolling.cs:48:9:52:9 | foreach (... ... in ...) ... | LoopUnrolling.cs:48:9:52:9 | foreach (... ... in ...) ... | empty | -| LoopUnrolling.cs:48:9:52:9 | foreach (... ... in ...) ... | LoopUnrolling.cs:51:13:51:23 | goto ...; | goto(Label) | -| LoopUnrolling.cs:48:22:48:22 | String x | LoopUnrolling.cs:48:22:48:22 | String x | normal | -| LoopUnrolling.cs:48:27:48:28 | access to local variable xs | LoopUnrolling.cs:48:27:48:28 | access to local variable xs | normal | -| LoopUnrolling.cs:49:9:52:9 | {...} | LoopUnrolling.cs:51:13:51:23 | goto ...; | goto(Label) | -| LoopUnrolling.cs:50:9:50:13 | Label: | LoopUnrolling.cs:50:9:50:13 | Label: | normal | -| LoopUnrolling.cs:50:16:50:35 | call to method WriteLine | LoopUnrolling.cs:50:16:50:35 | call to method WriteLine | normal | -| LoopUnrolling.cs:50:16:50:36 | ...; | LoopUnrolling.cs:50:16:50:35 | call to method WriteLine | normal | -| LoopUnrolling.cs:50:34:50:34 | access to local variable x | LoopUnrolling.cs:50:34:50:34 | access to local variable x | normal | -| LoopUnrolling.cs:51:13:51:23 | goto ...; | LoopUnrolling.cs:51:13:51:23 | goto ...; | goto(Label) | -| LoopUnrolling.cs:56:5:65:5 | {...} | LoopUnrolling.cs:58:9:64:9 | foreach (... ... in ...) ... | empty | -| LoopUnrolling.cs:57:9:57:48 | ... ...; | LoopUnrolling.cs:57:13:57:47 | String[] xs = ... | normal | -| LoopUnrolling.cs:57:13:57:47 | String[] xs = ... | LoopUnrolling.cs:57:13:57:47 | String[] xs = ... | normal | -| LoopUnrolling.cs:57:18:57:47 | 3 | LoopUnrolling.cs:57:18:57:47 | 3 | normal | -| LoopUnrolling.cs:57:18:57:47 | array creation of type String[] | LoopUnrolling.cs:57:31:57:47 | { ..., ... } | normal | -| LoopUnrolling.cs:57:31:57:47 | { ..., ... } | LoopUnrolling.cs:57:31:57:47 | { ..., ... } | normal | -| LoopUnrolling.cs:57:33:57:35 | "a" | LoopUnrolling.cs:57:33:57:35 | "a" | normal | -| LoopUnrolling.cs:57:38:57:40 | "b" | LoopUnrolling.cs:57:38:57:40 | "b" | normal | -| LoopUnrolling.cs:57:43:57:45 | "c" | LoopUnrolling.cs:57:43:57:45 | "c" | normal | -| LoopUnrolling.cs:58:9:64:9 | foreach (... ... in ...) ... | LoopUnrolling.cs:58:9:64:9 | foreach (... ... in ...) ... | empty | -| LoopUnrolling.cs:58:22:58:22 | String x | LoopUnrolling.cs:58:22:58:22 | String x | normal | -| LoopUnrolling.cs:58:27:58:28 | access to local variable xs | LoopUnrolling.cs:58:27:58:28 | access to local variable xs | normal | -| LoopUnrolling.cs:59:9:64:9 | {...} | LoopUnrolling.cs:62:17:62:17 | access to parameter b | false | -| LoopUnrolling.cs:59:9:64:9 | {...} | LoopUnrolling.cs:63:17:63:36 | call to method WriteLine | normal | -| LoopUnrolling.cs:60:13:61:37 | if (...) ... | LoopUnrolling.cs:60:17:60:17 | access to parameter b | false | -| LoopUnrolling.cs:60:13:61:37 | if (...) ... | LoopUnrolling.cs:61:17:61:36 | call to method WriteLine | normal | -| LoopUnrolling.cs:60:17:60:17 | access to parameter b | LoopUnrolling.cs:60:17:60:17 | access to parameter b | false | -| LoopUnrolling.cs:60:17:60:17 | access to parameter b | LoopUnrolling.cs:60:17:60:17 | access to parameter b | true | -| LoopUnrolling.cs:61:17:61:36 | call to method WriteLine | LoopUnrolling.cs:61:17:61:36 | call to method WriteLine | normal | -| LoopUnrolling.cs:61:17:61:37 | ...; | LoopUnrolling.cs:61:17:61:36 | call to method WriteLine | normal | -| LoopUnrolling.cs:61:35:61:35 | access to local variable x | LoopUnrolling.cs:61:35:61:35 | access to local variable x | normal | -| LoopUnrolling.cs:62:13:63:37 | if (...) ... | LoopUnrolling.cs:62:17:62:17 | access to parameter b | false | -| LoopUnrolling.cs:62:13:63:37 | if (...) ... | LoopUnrolling.cs:63:17:63:36 | call to method WriteLine | normal | -| LoopUnrolling.cs:62:17:62:17 | access to parameter b | LoopUnrolling.cs:62:17:62:17 | access to parameter b | false | -| LoopUnrolling.cs:62:17:62:17 | access to parameter b | LoopUnrolling.cs:62:17:62:17 | access to parameter b | true | -| LoopUnrolling.cs:63:17:63:36 | call to method WriteLine | LoopUnrolling.cs:63:17:63:36 | call to method WriteLine | normal | -| LoopUnrolling.cs:63:17:63:37 | ...; | LoopUnrolling.cs:63:17:63:36 | call to method WriteLine | normal | -| LoopUnrolling.cs:63:35:63:35 | access to local variable x | LoopUnrolling.cs:63:35:63:35 | access to local variable x | normal | -| LoopUnrolling.cs:68:5:74:5 | {...} | LoopUnrolling.cs:70:13:70:19 | return ...; | return | -| LoopUnrolling.cs:68:5:74:5 | {...} | LoopUnrolling.cs:72:9:73:35 | foreach (... ... in ...) ... | empty | -| LoopUnrolling.cs:69:9:70:19 | if (...) ... | LoopUnrolling.cs:69:13:69:23 | !... | false | -| LoopUnrolling.cs:69:9:70:19 | if (...) ... | LoopUnrolling.cs:70:13:70:19 | return ...; | return | -| LoopUnrolling.cs:69:13:69:23 | !... | LoopUnrolling.cs:69:13:69:23 | !... | false | -| LoopUnrolling.cs:69:13:69:23 | !... | LoopUnrolling.cs:69:13:69:23 | !... | true | -| LoopUnrolling.cs:69:14:69:17 | access to parameter args | LoopUnrolling.cs:69:14:69:17 | access to parameter args | normal | -| LoopUnrolling.cs:69:14:69:23 | call to method Any | LoopUnrolling.cs:69:14:69:23 | call to method Any | false | -| LoopUnrolling.cs:69:14:69:23 | call to method Any | LoopUnrolling.cs:69:14:69:23 | call to method Any | true | -| LoopUnrolling.cs:70:13:70:19 | return ...; | LoopUnrolling.cs:70:13:70:19 | return ...; | return | -| LoopUnrolling.cs:71:9:71:12 | access to parameter args | LoopUnrolling.cs:71:9:71:12 | access to parameter args | normal | -| LoopUnrolling.cs:71:9:71:20 | call to method Clear | LoopUnrolling.cs:71:9:71:20 | call to method Clear | normal | -| LoopUnrolling.cs:71:9:71:21 | ...; | LoopUnrolling.cs:71:9:71:20 | call to method Clear | normal | -| LoopUnrolling.cs:72:9:73:35 | foreach (... ... in ...) ... | LoopUnrolling.cs:72:9:73:35 | foreach (... ... in ...) ... | empty | -| LoopUnrolling.cs:72:22:72:24 | String arg | LoopUnrolling.cs:72:22:72:24 | String arg | normal | -| LoopUnrolling.cs:72:29:72:32 | access to parameter args | LoopUnrolling.cs:72:29:72:32 | access to parameter args | normal | -| LoopUnrolling.cs:73:13:73:34 | call to method WriteLine | LoopUnrolling.cs:73:13:73:34 | call to method WriteLine | normal | -| LoopUnrolling.cs:73:13:73:35 | ...; | LoopUnrolling.cs:73:13:73:34 | call to method WriteLine | normal | -| LoopUnrolling.cs:73:31:73:33 | access to local variable arg | LoopUnrolling.cs:73:31:73:33 | access to local variable arg | normal | -| LoopUnrolling.cs:77:5:83:5 | {...} | LoopUnrolling.cs:79:9:82:9 | foreach (... ... in ...) ... | empty | -| LoopUnrolling.cs:78:9:78:34 | ... ...; | LoopUnrolling.cs:78:13:78:33 | String[,] xs = ... | normal | -| LoopUnrolling.cs:78:13:78:33 | String[,] xs = ... | LoopUnrolling.cs:78:13:78:33 | String[,] xs = ... | normal | -| LoopUnrolling.cs:78:18:78:33 | array creation of type String[,] | LoopUnrolling.cs:78:18:78:33 | array creation of type String[,] | normal | -| LoopUnrolling.cs:78:29:78:29 | 2 | LoopUnrolling.cs:78:29:78:29 | 2 | normal | -| LoopUnrolling.cs:78:32:78:32 | 0 | LoopUnrolling.cs:78:32:78:32 | 0 | normal | -| LoopUnrolling.cs:79:9:82:9 | foreach (... ... in ...) ... | LoopUnrolling.cs:79:9:82:9 | foreach (... ... in ...) ... | empty | -| LoopUnrolling.cs:79:22:79:22 | String x | LoopUnrolling.cs:79:22:79:22 | String x | normal | -| LoopUnrolling.cs:79:27:79:28 | access to local variable xs | LoopUnrolling.cs:79:27:79:28 | access to local variable xs | normal | -| LoopUnrolling.cs:80:9:82:9 | {...} | LoopUnrolling.cs:81:13:81:32 | call to method WriteLine | normal | -| LoopUnrolling.cs:81:13:81:32 | call to method WriteLine | LoopUnrolling.cs:81:13:81:32 | call to method WriteLine | normal | -| LoopUnrolling.cs:81:13:81:33 | ...; | LoopUnrolling.cs:81:13:81:32 | call to method WriteLine | normal | -| LoopUnrolling.cs:81:31:81:31 | access to local variable x | LoopUnrolling.cs:81:31:81:31 | access to local variable x | normal | -| LoopUnrolling.cs:86:5:92:5 | {...} | LoopUnrolling.cs:88:9:91:9 | foreach (... ... in ...) ... | empty | -| LoopUnrolling.cs:87:9:87:34 | ... ...; | LoopUnrolling.cs:87:13:87:33 | String[,] xs = ... | normal | -| LoopUnrolling.cs:87:13:87:33 | String[,] xs = ... | LoopUnrolling.cs:87:13:87:33 | String[,] xs = ... | normal | -| LoopUnrolling.cs:87:18:87:33 | array creation of type String[,] | LoopUnrolling.cs:87:18:87:33 | array creation of type String[,] | normal | -| LoopUnrolling.cs:87:29:87:29 | 0 | LoopUnrolling.cs:87:29:87:29 | 0 | normal | -| LoopUnrolling.cs:87:32:87:32 | 2 | LoopUnrolling.cs:87:32:87:32 | 2 | normal | -| LoopUnrolling.cs:88:9:91:9 | foreach (... ... in ...) ... | LoopUnrolling.cs:88:9:91:9 | foreach (... ... in ...) ... | empty | -| LoopUnrolling.cs:88:22:88:22 | String x | LoopUnrolling.cs:88:22:88:22 | String x | normal | -| LoopUnrolling.cs:88:27:88:28 | access to local variable xs | LoopUnrolling.cs:88:27:88:28 | access to local variable xs | normal | -| LoopUnrolling.cs:89:9:91:9 | {...} | LoopUnrolling.cs:90:13:90:32 | call to method WriteLine | normal | -| LoopUnrolling.cs:90:13:90:32 | call to method WriteLine | LoopUnrolling.cs:90:13:90:32 | call to method WriteLine | normal | -| LoopUnrolling.cs:90:13:90:33 | ...; | LoopUnrolling.cs:90:13:90:32 | call to method WriteLine | normal | -| LoopUnrolling.cs:90:31:90:31 | access to local variable x | LoopUnrolling.cs:90:31:90:31 | access to local variable x | normal | -| LoopUnrolling.cs:95:5:101:5 | {...} | LoopUnrolling.cs:97:9:100:9 | foreach (... ... in ...) ... | empty | -| LoopUnrolling.cs:96:9:96:34 | ... ...; | LoopUnrolling.cs:96:13:96:33 | String[,] xs = ... | normal | -| LoopUnrolling.cs:96:13:96:33 | String[,] xs = ... | LoopUnrolling.cs:96:13:96:33 | String[,] xs = ... | normal | -| LoopUnrolling.cs:96:18:96:33 | array creation of type String[,] | LoopUnrolling.cs:96:18:96:33 | array creation of type String[,] | normal | -| LoopUnrolling.cs:96:29:96:29 | 2 | LoopUnrolling.cs:96:29:96:29 | 2 | normal | -| LoopUnrolling.cs:96:32:96:32 | 2 | LoopUnrolling.cs:96:32:96:32 | 2 | normal | -| LoopUnrolling.cs:97:9:100:9 | foreach (... ... in ...) ... | LoopUnrolling.cs:97:9:100:9 | foreach (... ... in ...) ... | empty | -| LoopUnrolling.cs:97:22:97:22 | String x | LoopUnrolling.cs:97:22:97:22 | String x | normal | -| LoopUnrolling.cs:97:27:97:28 | access to local variable xs | LoopUnrolling.cs:97:27:97:28 | access to local variable xs | normal | -| LoopUnrolling.cs:98:9:100:9 | {...} | LoopUnrolling.cs:99:13:99:32 | call to method WriteLine | normal | -| LoopUnrolling.cs:99:13:99:32 | call to method WriteLine | LoopUnrolling.cs:99:13:99:32 | call to method WriteLine | normal | -| LoopUnrolling.cs:99:13:99:33 | ...; | LoopUnrolling.cs:99:13:99:32 | call to method WriteLine | normal | -| LoopUnrolling.cs:99:31:99:31 | access to local variable x | LoopUnrolling.cs:99:31:99:31 | access to local variable x | normal | -| MultiImplementationA.cs:4:7:4:8 | call to constructor Object | MultiImplementationA.cs:4:7:4:8 | call to constructor Object | normal | -| MultiImplementationA.cs:4:7:4:8 | call to method | MultiImplementationA.cs:4:7:4:8 | call to method | normal | -| MultiImplementationA.cs:4:7:4:8 | this access | MultiImplementationA.cs:4:7:4:8 | this access | normal | -| MultiImplementationA.cs:4:7:4:8 | {...} | MultiImplementationA.cs:4:7:4:8 | {...} | normal | -| MultiImplementationA.cs:6:22:6:31 | throw ... | MultiImplementationA.cs:6:22:6:31 | throw ... | throw(NullReferenceException) | -| MultiImplementationA.cs:6:28:6:31 | null | MultiImplementationA.cs:6:28:6:31 | null | normal | -| MultiImplementationA.cs:7:25:7:39 | {...} | MultiImplementationA.cs:7:27:7:37 | throw ...; | throw(NullReferenceException) | -| MultiImplementationA.cs:7:27:7:37 | throw ...; | MultiImplementationA.cs:7:27:7:37 | throw ...; | throw(NullReferenceException) | -| MultiImplementationA.cs:7:33:7:36 | null | MultiImplementationA.cs:7:33:7:36 | null | normal | -| MultiImplementationA.cs:7:45:7:59 | {...} | MultiImplementationA.cs:7:47:7:57 | throw ...; | throw(NullReferenceException) | -| MultiImplementationA.cs:7:47:7:57 | throw ...; | MultiImplementationA.cs:7:47:7:57 | throw ...; | throw(NullReferenceException) | -| MultiImplementationA.cs:7:53:7:56 | null | MultiImplementationA.cs:7:53:7:56 | null | normal | -| MultiImplementationA.cs:8:23:8:32 | throw ... | MultiImplementationA.cs:8:23:8:32 | throw ... | throw(NullReferenceException) | -| MultiImplementationA.cs:8:29:8:32 | null | MultiImplementationA.cs:8:29:8:32 | null | normal | -| MultiImplementationA.cs:13:16:13:16 | access to field F | MultiImplementationA.cs:13:16:13:16 | this access | normal | -| MultiImplementationA.cs:13:16:13:16 | this access | MultiImplementationA.cs:13:16:13:16 | this access | normal | -| MultiImplementationA.cs:13:16:13:20 | ... = ... | MultiImplementationA.cs:13:16:13:20 | ... = ... | normal | -| MultiImplementationA.cs:13:20:13:20 | 0 | MultiImplementationA.cs:13:20:13:20 | 0 | normal | -| MultiImplementationA.cs:14:31:14:31 | access to parameter i | MultiImplementationA.cs:14:31:14:31 | access to parameter i | normal | -| MultiImplementationA.cs:15:40:15:52 | {...} | MultiImplementationA.cs:15:42:15:50 | return ...; | return | -| MultiImplementationA.cs:15:42:15:50 | return ...; | MultiImplementationA.cs:15:42:15:50 | return ...; | return | -| MultiImplementationA.cs:15:49:15:49 | access to parameter s | MultiImplementationA.cs:15:49:15:49 | access to parameter s | normal | -| MultiImplementationA.cs:15:58:15:60 | {...} | MultiImplementationA.cs:15:58:15:60 | {...} | normal | -| MultiImplementationA.cs:16:28:16:28 | 0 | MultiImplementationA.cs:16:28:16:28 | 0 | normal | -| MultiImplementationA.cs:17:5:19:5 | {...} | MultiImplementationA.cs:18:9:18:22 | M2(...) | normal | -| MultiImplementationA.cs:18:9:18:22 | M2(...) | MultiImplementationA.cs:18:9:18:22 | M2(...) | normal | -| MultiImplementationA.cs:18:21:18:21 | 0 | MultiImplementationA.cs:18:21:18:21 | 0 | normal | -| MultiImplementationA.cs:20:12:20:13 | call to constructor Object | MultiImplementationA.cs:20:12:20:13 | call to constructor Object | normal | -| MultiImplementationA.cs:20:12:20:13 | call to method | MultiImplementationA.cs:20:12:20:13 | call to method | normal | -| MultiImplementationA.cs:20:12:20:13 | this access | MultiImplementationA.cs:20:12:20:13 | this access | normal | -| MultiImplementationA.cs:20:22:20:31 | {...} | MultiImplementationA.cs:20:24:20:28 | ... = ... | normal | -| MultiImplementationA.cs:20:24:20:24 | access to field F | MultiImplementationA.cs:20:24:20:24 | this access | normal | -| MultiImplementationA.cs:20:24:20:24 | this access | MultiImplementationA.cs:20:24:20:24 | this access | normal | -| MultiImplementationA.cs:20:24:20:28 | ... = ... | MultiImplementationA.cs:20:24:20:28 | ... = ... | normal | -| MultiImplementationA.cs:20:24:20:29 | ...; | MultiImplementationA.cs:20:24:20:28 | ... = ... | normal | -| MultiImplementationA.cs:20:28:20:28 | access to parameter i | MultiImplementationA.cs:20:28:20:28 | access to parameter i | normal | -| MultiImplementationA.cs:21:19:21:22 | call to constructor C2 | MultiImplementationA.cs:21:19:21:22 | call to constructor C2 | normal | -| MultiImplementationA.cs:21:24:21:24 | 0 | MultiImplementationA.cs:21:24:21:24 | 0 | normal | -| MultiImplementationA.cs:21:27:21:29 | {...} | MultiImplementationA.cs:21:27:21:29 | {...} | normal | -| MultiImplementationA.cs:22:11:22:13 | {...} | MultiImplementationA.cs:22:11:22:13 | {...} | normal | -| MultiImplementationA.cs:23:50:23:53 | null | MultiImplementationA.cs:23:50:23:53 | null | normal | -| MultiImplementationA.cs:24:16:24:16 | access to property P | MultiImplementationA.cs:24:16:24:16 | this access | normal | -| MultiImplementationA.cs:24:16:24:16 | this access | MultiImplementationA.cs:24:16:24:16 | this access | normal | -| MultiImplementationA.cs:24:32:24:34 | ... = ... | MultiImplementationA.cs:24:32:24:34 | ... = ... | normal | -| MultiImplementationA.cs:24:34:24:34 | 0 | MultiImplementationA.cs:24:34:24:34 | 0 | normal | -| MultiImplementationA.cs:28:7:28:8 | call to constructor Object | MultiImplementationA.cs:28:7:28:8 | call to constructor Object | normal | -| MultiImplementationA.cs:28:7:28:8 | call to method | MultiImplementationA.cs:28:7:28:8 | call to method | normal | -| MultiImplementationA.cs:28:7:28:8 | this access | MultiImplementationA.cs:28:7:28:8 | this access | normal | -| MultiImplementationA.cs:28:7:28:8 | {...} | MultiImplementationA.cs:28:7:28:8 | {...} | normal | -| MultiImplementationA.cs:30:28:30:37 | throw ... | MultiImplementationA.cs:30:28:30:37 | throw ... | throw(NullReferenceException) | -| MultiImplementationA.cs:30:34:30:37 | null | MultiImplementationA.cs:30:34:30:37 | null | normal | -| MultiImplementationA.cs:34:15:34:16 | call to constructor Object | MultiImplementationA.cs:34:15:34:16 | call to constructor Object | normal | -| MultiImplementationA.cs:34:15:34:16 | call to method | MultiImplementationA.cs:34:15:34:16 | call to method | normal | -| MultiImplementationA.cs:34:15:34:16 | this access | MultiImplementationA.cs:34:15:34:16 | this access | normal | -| MultiImplementationA.cs:34:15:34:16 | {...} | MultiImplementationA.cs:34:15:34:16 | {...} | normal | -| MultiImplementationA.cs:36:14:36:28 | {...} | MultiImplementationA.cs:36:16:36:26 | throw ...; | throw(NullReferenceException) | -| MultiImplementationA.cs:36:16:36:26 | throw ...; | MultiImplementationA.cs:36:16:36:26 | throw ...; | throw(NullReferenceException) | -| MultiImplementationA.cs:36:22:36:25 | null | MultiImplementationA.cs:36:22:36:25 | null | normal | -| MultiImplementationA.cs:37:14:37:28 | {...} | MultiImplementationA.cs:37:16:37:26 | throw ...; | throw(NullReferenceException) | -| MultiImplementationA.cs:37:16:37:26 | throw ...; | MultiImplementationA.cs:37:16:37:26 | throw ...; | throw(NullReferenceException) | -| MultiImplementationA.cs:37:22:37:25 | null | MultiImplementationA.cs:37:22:37:25 | null | normal | -| MultiImplementationB.cs:1:7:1:8 | call to constructor Object | MultiImplementationB.cs:1:7:1:8 | call to constructor Object | normal | -| MultiImplementationB.cs:1:7:1:8 | call to method | MultiImplementationB.cs:1:7:1:8 | call to method | normal | -| MultiImplementationB.cs:1:7:1:8 | this access | MultiImplementationB.cs:1:7:1:8 | this access | normal | -| MultiImplementationB.cs:1:7:1:8 | {...} | MultiImplementationB.cs:1:7:1:8 | {...} | normal | -| MultiImplementationB.cs:3:22:3:22 | 0 | MultiImplementationB.cs:3:22:3:22 | 0 | normal | -| MultiImplementationB.cs:4:25:4:37 | {...} | MultiImplementationB.cs:4:27:4:35 | return ...; | return | -| MultiImplementationB.cs:4:27:4:35 | return ...; | MultiImplementationB.cs:4:27:4:35 | return ...; | return | -| MultiImplementationB.cs:4:34:4:34 | 1 | MultiImplementationB.cs:4:34:4:34 | 1 | normal | -| MultiImplementationB.cs:4:43:4:45 | {...} | MultiImplementationB.cs:4:43:4:45 | {...} | normal | -| MultiImplementationB.cs:5:23:5:23 | 2 | MultiImplementationB.cs:5:23:5:23 | 2 | normal | -| MultiImplementationB.cs:11:16:11:16 | access to field F | MultiImplementationB.cs:11:16:11:16 | this access | normal | -| MultiImplementationB.cs:11:16:11:16 | this access | MultiImplementationB.cs:11:16:11:16 | this access | normal | -| MultiImplementationB.cs:11:16:11:20 | ... = ... | MultiImplementationB.cs:11:16:11:20 | ... = ... | normal | -| MultiImplementationB.cs:11:20:11:20 | 1 | MultiImplementationB.cs:11:20:11:20 | 1 | normal | -| MultiImplementationB.cs:12:31:12:40 | throw ... | MultiImplementationB.cs:12:31:12:40 | throw ... | throw(NullReferenceException) | -| MultiImplementationB.cs:12:37:12:40 | null | MultiImplementationB.cs:12:37:12:40 | null | normal | -| MultiImplementationB.cs:13:40:13:54 | {...} | MultiImplementationB.cs:13:42:13:52 | throw ...; | throw(NullReferenceException) | -| MultiImplementationB.cs:13:42:13:52 | throw ...; | MultiImplementationB.cs:13:42:13:52 | throw ...; | throw(NullReferenceException) | -| MultiImplementationB.cs:13:48:13:51 | null | MultiImplementationB.cs:13:48:13:51 | null | normal | -| MultiImplementationB.cs:13:60:13:62 | {...} | MultiImplementationB.cs:13:60:13:62 | {...} | normal | -| MultiImplementationB.cs:14:28:14:28 | 1 | MultiImplementationB.cs:14:28:14:28 | 1 | normal | -| MultiImplementationB.cs:15:5:17:5 | {...} | MultiImplementationB.cs:16:9:16:31 | M2(...) | normal | -| MultiImplementationB.cs:16:9:16:31 | M2(...) | MultiImplementationB.cs:16:9:16:31 | M2(...) | normal | -| MultiImplementationB.cs:16:21:16:30 | throw ... | MultiImplementationB.cs:16:21:16:30 | throw ... | throw(NullReferenceException) | -| MultiImplementationB.cs:16:27:16:30 | null | MultiImplementationB.cs:16:27:16:30 | null | normal | -| MultiImplementationB.cs:18:12:18:13 | call to constructor Object | MultiImplementationB.cs:18:12:18:13 | call to constructor Object | normal | -| MultiImplementationB.cs:18:12:18:13 | call to method | MultiImplementationB.cs:18:12:18:13 | call to method | normal | -| MultiImplementationB.cs:18:12:18:13 | this access | MultiImplementationB.cs:18:12:18:13 | this access | normal | -| MultiImplementationB.cs:18:22:18:36 | {...} | MultiImplementationB.cs:18:24:18:34 | throw ...; | throw(NullReferenceException) | -| MultiImplementationB.cs:18:24:18:34 | throw ...; | MultiImplementationB.cs:18:24:18:34 | throw ...; | throw(NullReferenceException) | -| MultiImplementationB.cs:18:30:18:33 | null | MultiImplementationB.cs:18:30:18:33 | null | normal | -| MultiImplementationB.cs:19:19:19:22 | call to constructor C2 | MultiImplementationB.cs:19:19:19:22 | call to constructor C2 | normal | -| MultiImplementationB.cs:19:24:19:24 | 1 | MultiImplementationB.cs:19:24:19:24 | 1 | normal | -| MultiImplementationB.cs:19:27:19:29 | {...} | MultiImplementationB.cs:19:27:19:29 | {...} | normal | -| MultiImplementationB.cs:20:11:20:25 | {...} | MultiImplementationB.cs:20:13:20:23 | throw ...; | throw(NullReferenceException) | -| MultiImplementationB.cs:20:13:20:23 | throw ...; | MultiImplementationB.cs:20:13:20:23 | throw ...; | throw(NullReferenceException) | -| MultiImplementationB.cs:20:19:20:22 | null | MultiImplementationB.cs:20:19:20:22 | null | normal | -| MultiImplementationB.cs:21:50:21:59 | throw ... | MultiImplementationB.cs:21:50:21:59 | throw ... | throw(NullReferenceException) | -| MultiImplementationB.cs:21:56:21:59 | null | MultiImplementationB.cs:21:56:21:59 | null | normal | -| MultiImplementationB.cs:22:16:22:16 | access to property P | MultiImplementationB.cs:22:16:22:16 | this access | normal | -| MultiImplementationB.cs:22:16:22:16 | this access | MultiImplementationB.cs:22:16:22:16 | this access | normal | -| MultiImplementationB.cs:22:32:22:34 | ... = ... | MultiImplementationB.cs:22:32:22:34 | ... = ... | normal | -| MultiImplementationB.cs:22:34:22:34 | 1 | MultiImplementationB.cs:22:34:22:34 | 1 | normal | -| MultiImplementationB.cs:25:7:25:8 | call to constructor Object | MultiImplementationB.cs:25:7:25:8 | call to constructor Object | normal | -| MultiImplementationB.cs:25:7:25:8 | call to method | MultiImplementationB.cs:25:7:25:8 | call to method | normal | -| MultiImplementationB.cs:25:7:25:8 | this access | MultiImplementationB.cs:25:7:25:8 | this access | normal | -| MultiImplementationB.cs:25:7:25:8 | {...} | MultiImplementationB.cs:25:7:25:8 | {...} | normal | -| MultiImplementationB.cs:30:15:30:16 | call to constructor Object | MultiImplementationB.cs:30:15:30:16 | call to constructor Object | normal | -| MultiImplementationB.cs:30:15:30:16 | call to method | MultiImplementationB.cs:30:15:30:16 | call to method | normal | -| MultiImplementationB.cs:30:15:30:16 | this access | MultiImplementationB.cs:30:15:30:16 | this access | normal | -| MultiImplementationB.cs:30:15:30:16 | {...} | MultiImplementationB.cs:30:15:30:16 | {...} | normal | -| MultiImplementationB.cs:32:17:32:17 | 0 | MultiImplementationB.cs:32:17:32:17 | 0 | normal | -| NullCoalescing.cs:1:7:1:20 | call to constructor Object | NullCoalescing.cs:1:7:1:20 | call to constructor Object | normal | -| NullCoalescing.cs:1:7:1:20 | call to method | NullCoalescing.cs:1:7:1:20 | call to method | normal | -| NullCoalescing.cs:1:7:1:20 | this access | NullCoalescing.cs:1:7:1:20 | this access | normal | -| NullCoalescing.cs:1:7:1:20 | {...} | NullCoalescing.cs:1:7:1:20 | {...} | normal | -| NullCoalescing.cs:3:23:3:23 | access to parameter i | NullCoalescing.cs:3:23:3:23 | access to parameter i | non-null | -| NullCoalescing.cs:3:23:3:23 | access to parameter i | NullCoalescing.cs:3:23:3:23 | access to parameter i | null | -| NullCoalescing.cs:3:23:3:28 | ... ?? ... | NullCoalescing.cs:3:23:3:28 | ... ?? ... | normal | -| NullCoalescing.cs:3:28:3:28 | 0 | NullCoalescing.cs:3:28:3:28 | 0 | normal | -| NullCoalescing.cs:5:24:5:43 | ... ? ... : ... | NullCoalescing.cs:5:24:5:43 | ... ? ... : ... | normal | -| NullCoalescing.cs:5:25:5:25 | access to parameter b | NullCoalescing.cs:5:25:5:25 | access to parameter b | false | -| NullCoalescing.cs:5:25:5:25 | access to parameter b | NullCoalescing.cs:5:25:5:25 | access to parameter b | null | -| NullCoalescing.cs:5:25:5:25 | access to parameter b | NullCoalescing.cs:5:25:5:25 | access to parameter b | true | -| NullCoalescing.cs:5:25:5:34 | ... ?? ... | NullCoalescing.cs:5:25:5:34 | ... ?? ... | false | -| NullCoalescing.cs:5:25:5:34 | ... ?? ... | NullCoalescing.cs:5:25:5:34 | ... ?? ... | true | -| NullCoalescing.cs:5:30:5:34 | false | NullCoalescing.cs:5:30:5:34 | false | false | -| NullCoalescing.cs:5:39:5:39 | 0 | NullCoalescing.cs:5:39:5:39 | 0 | normal | -| NullCoalescing.cs:5:43:5:43 | 1 | NullCoalescing.cs:5:43:5:43 | 1 | normal | -| NullCoalescing.cs:7:40:7:41 | access to parameter s1 | NullCoalescing.cs:7:40:7:41 | access to parameter s1 | non-null | -| NullCoalescing.cs:7:40:7:41 | access to parameter s1 | NullCoalescing.cs:7:40:7:41 | access to parameter s1 | null | -| NullCoalescing.cs:7:40:7:53 | ... ?? ... | NullCoalescing.cs:7:40:7:53 | ... ?? ... | normal | -| NullCoalescing.cs:7:46:7:47 | access to parameter s2 | NullCoalescing.cs:7:46:7:47 | access to parameter s2 | non-null | -| NullCoalescing.cs:7:46:7:47 | access to parameter s2 | NullCoalescing.cs:7:46:7:47 | access to parameter s2 | null | -| NullCoalescing.cs:7:46:7:53 | ... ?? ... | NullCoalescing.cs:7:46:7:53 | ... ?? ... | normal | -| NullCoalescing.cs:7:52:7:53 | "" | NullCoalescing.cs:7:52:7:53 | "" | normal | -| NullCoalescing.cs:9:36:9:58 | ... ?? ... | NullCoalescing.cs:9:36:9:58 | ... ?? ... | normal | -| NullCoalescing.cs:9:37:9:37 | access to parameter b | NullCoalescing.cs:9:37:9:37 | access to parameter b | false | -| NullCoalescing.cs:9:37:9:37 | access to parameter b | NullCoalescing.cs:9:37:9:37 | access to parameter b | true | -| NullCoalescing.cs:9:37:9:45 | ... ? ... : ... | NullCoalescing.cs:9:37:9:45 | ... ? ... : ... | non-null | -| NullCoalescing.cs:9:37:9:45 | ... ? ... : ... | NullCoalescing.cs:9:37:9:45 | ... ? ... : ... | null | -| NullCoalescing.cs:9:41:9:41 | access to parameter s | NullCoalescing.cs:9:41:9:41 | access to parameter s | non-null | -| NullCoalescing.cs:9:41:9:41 | access to parameter s | NullCoalescing.cs:9:41:9:41 | access to parameter s | null | -| NullCoalescing.cs:9:45:9:45 | access to parameter s | NullCoalescing.cs:9:45:9:45 | access to parameter s | non-null | -| NullCoalescing.cs:9:45:9:45 | access to parameter s | NullCoalescing.cs:9:45:9:45 | access to parameter s | null | -| NullCoalescing.cs:9:51:9:52 | "" | NullCoalescing.cs:9:51:9:52 | "" | non-null | -| NullCoalescing.cs:9:51:9:58 | ... ?? ... | NullCoalescing.cs:9:51:9:58 | ... ?? ... | normal | -| NullCoalescing.cs:9:57:9:58 | "" | NullCoalescing.cs:9:57:9:58 | "" | normal | -| NullCoalescing.cs:11:43:11:68 | ... ? ... : ... | NullCoalescing.cs:11:43:11:68 | ... ? ... : ... | normal | -| NullCoalescing.cs:11:44:11:45 | access to parameter b1 | NullCoalescing.cs:11:44:11:45 | access to parameter b1 | false | -| NullCoalescing.cs:11:44:11:45 | access to parameter b1 | NullCoalescing.cs:11:44:11:45 | access to parameter b1 | null | -| NullCoalescing.cs:11:44:11:45 | access to parameter b1 | NullCoalescing.cs:11:44:11:45 | access to parameter b1 | true | -| NullCoalescing.cs:11:44:11:59 | ... ?? ... | NullCoalescing.cs:11:44:11:59 | ... ?? ... | false | -| NullCoalescing.cs:11:44:11:59 | ... ?? ... | NullCoalescing.cs:11:44:11:59 | ... ?? ... | true | -| NullCoalescing.cs:11:51:11:52 | access to parameter b2 | NullCoalescing.cs:11:51:11:52 | access to parameter b2 | false | -| NullCoalescing.cs:11:51:11:52 | access to parameter b2 | NullCoalescing.cs:11:51:11:52 | access to parameter b2 | true | -| NullCoalescing.cs:11:51:11:58 | ... && ... | NullCoalescing.cs:11:51:11:58 | ... && ... | false | -| NullCoalescing.cs:11:51:11:58 | ... && ... | NullCoalescing.cs:11:51:11:58 | ... && ... | true | -| NullCoalescing.cs:11:57:11:58 | access to parameter b3 | NullCoalescing.cs:11:57:11:58 | access to parameter b3 | false | -| NullCoalescing.cs:11:57:11:58 | access to parameter b3 | NullCoalescing.cs:11:57:11:58 | access to parameter b3 | true | -| NullCoalescing.cs:11:64:11:64 | 0 | NullCoalescing.cs:11:64:11:64 | 0 | normal | -| NullCoalescing.cs:11:68:11:68 | 1 | NullCoalescing.cs:11:68:11:68 | 1 | normal | -| NullCoalescing.cs:14:5:18:5 | {...} | NullCoalescing.cs:17:9:17:24 | ... = ... | normal | -| NullCoalescing.cs:15:9:15:32 | ... ...; | NullCoalescing.cs:15:13:15:31 | Int32 j = ... | normal | -| NullCoalescing.cs:15:13:15:31 | Int32 j = ... | NullCoalescing.cs:15:13:15:31 | Int32 j = ... | normal | -| NullCoalescing.cs:15:17:15:26 | (...) ... | NullCoalescing.cs:15:17:15:26 | (...) ... | null | -| NullCoalescing.cs:15:17:15:31 | ... ?? ... | NullCoalescing.cs:15:17:15:31 | ... ?? ... | normal | -| NullCoalescing.cs:15:23:15:26 | null | NullCoalescing.cs:15:23:15:26 | null | normal | -| NullCoalescing.cs:15:31:15:31 | 0 | NullCoalescing.cs:15:31:15:31 | 0 | normal | -| NullCoalescing.cs:16:9:16:26 | ... ...; | NullCoalescing.cs:16:13:16:25 | String s = ... | normal | -| NullCoalescing.cs:16:13:16:25 | String s = ... | NullCoalescing.cs:16:13:16:25 | String s = ... | normal | -| NullCoalescing.cs:16:17:16:18 | "" | NullCoalescing.cs:16:17:16:18 | "" | non-null | -| NullCoalescing.cs:16:17:16:25 | ... ?? ... | NullCoalescing.cs:16:17:16:25 | ... ?? ... | normal | -| NullCoalescing.cs:16:23:16:25 | "a" | NullCoalescing.cs:16:23:16:25 | "a" | normal | -| NullCoalescing.cs:17:9:17:24 | ... = ... | NullCoalescing.cs:17:9:17:24 | ... = ... | normal | -| NullCoalescing.cs:17:9:17:25 | ...; | NullCoalescing.cs:17:9:17:24 | ... = ... | normal | -| NullCoalescing.cs:17:13:17:19 | (...) ... | NullCoalescing.cs:17:13:17:19 | (...) ... | non-null | -| NullCoalescing.cs:17:13:17:24 | ... ?? ... | NullCoalescing.cs:17:13:17:24 | ... ?? ... | normal | -| NullCoalescing.cs:17:19:17:19 | access to parameter i | NullCoalescing.cs:17:19:17:19 | access to parameter i | normal | -| NullCoalescing.cs:17:24:17:24 | 1 | NullCoalescing.cs:17:24:17:24 | 1 | normal | -| PartialImplementationA.cs:3:12:3:18 | call to constructor Object | PartialImplementationA.cs:3:12:3:18 | call to constructor Object | normal | -| PartialImplementationA.cs:3:12:3:18 | call to method | PartialImplementationA.cs:3:12:3:18 | call to method | normal | -| PartialImplementationA.cs:3:12:3:18 | this access | PartialImplementationA.cs:3:12:3:18 | this access | normal | -| PartialImplementationA.cs:3:27:3:29 | {...} | PartialImplementationA.cs:3:27:3:29 | {...} | normal | -| PartialImplementationB.cs:3:16:3:16 | access to field F | PartialImplementationB.cs:3:16:3:16 | this access | normal | -| PartialImplementationB.cs:3:16:3:16 | this access | PartialImplementationB.cs:3:16:3:16 | this access | normal | -| PartialImplementationB.cs:3:16:3:20 | ... = ... | PartialImplementationB.cs:3:16:3:20 | ... = ... | normal | -| PartialImplementationB.cs:3:20:3:20 | 0 | PartialImplementationB.cs:3:20:3:20 | 0 | normal | -| PartialImplementationB.cs:4:12:4:18 | call to constructor Object | PartialImplementationB.cs:4:12:4:18 | call to constructor Object | normal | -| PartialImplementationB.cs:4:12:4:18 | call to method | PartialImplementationB.cs:4:12:4:18 | call to method | normal | -| PartialImplementationB.cs:4:12:4:18 | this access | PartialImplementationB.cs:4:12:4:18 | this access | normal | -| PartialImplementationB.cs:4:22:4:24 | {...} | PartialImplementationB.cs:4:22:4:24 | {...} | normal | -| PartialImplementationB.cs:5:16:5:16 | access to property P | PartialImplementationB.cs:5:16:5:16 | this access | normal | -| PartialImplementationB.cs:5:16:5:16 | this access | PartialImplementationB.cs:5:16:5:16 | this access | normal | -| PartialImplementationB.cs:5:32:5:34 | ... = ... | PartialImplementationB.cs:5:32:5:34 | ... = ... | normal | -| PartialImplementationB.cs:5:34:5:34 | 0 | PartialImplementationB.cs:5:34:5:34 | 0 | normal | -| Patterns.cs:3:7:3:14 | call to constructor Object | Patterns.cs:3:7:3:14 | call to constructor Object | normal | -| Patterns.cs:3:7:3:14 | call to method | Patterns.cs:3:7:3:14 | call to method | normal | -| Patterns.cs:3:7:3:14 | this access | Patterns.cs:3:7:3:14 | this access | normal | -| Patterns.cs:3:7:3:14 | {...} | Patterns.cs:3:7:3:14 | {...} | normal | -| Patterns.cs:6:5:43:5 | {...} | Patterns.cs:40:17:40:17 | access to local variable o | normal | -| Patterns.cs:7:9:7:24 | ... ...; | Patterns.cs:7:16:7:23 | Object o = ... | normal | -| Patterns.cs:7:16:7:23 | Object o = ... | Patterns.cs:7:16:7:23 | Object o = ... | normal | -| Patterns.cs:7:20:7:23 | null | Patterns.cs:7:20:7:23 | null | normal | -| Patterns.cs:8:9:18:9 | if (...) ... | Patterns.cs:10:13:10:42 | call to method WriteLine | normal | -| Patterns.cs:8:9:18:9 | if (...) ... | Patterns.cs:14:13:14:45 | call to method WriteLine | normal | -| Patterns.cs:8:9:18:9 | if (...) ... | Patterns.cs:16:18:16:28 | ... is ... | false | -| Patterns.cs:8:9:18:9 | if (...) ... | Patterns.cs:17:9:18:9 | {...} | normal | -| Patterns.cs:8:13:8:13 | access to local variable o | Patterns.cs:8:13:8:13 | access to local variable o | normal | -| Patterns.cs:8:13:8:23 | ... is ... | Patterns.cs:8:13:8:23 | ... is ... | false | -| Patterns.cs:8:13:8:23 | ... is ... | Patterns.cs:8:13:8:23 | ... is ... | true | -| Patterns.cs:8:18:8:23 | Int32 i1 | Patterns.cs:8:18:8:23 | Int32 i1 | match | -| Patterns.cs:8:18:8:23 | Int32 i1 | Patterns.cs:8:18:8:23 | Int32 i1 | no-match | -| Patterns.cs:9:9:11:9 | {...} | Patterns.cs:10:13:10:42 | call to method WriteLine | normal | -| Patterns.cs:10:13:10:42 | call to method WriteLine | Patterns.cs:10:13:10:42 | call to method WriteLine | normal | -| Patterns.cs:10:13:10:43 | ...; | Patterns.cs:10:13:10:42 | call to method WriteLine | normal | -| Patterns.cs:10:31:10:41 | $"..." | Patterns.cs:10:31:10:41 | $"..." | normal | -| Patterns.cs:10:33:10:36 | "int " | Patterns.cs:10:33:10:36 | "int " | normal | -| Patterns.cs:10:37:10:40 | {...} | Patterns.cs:10:37:10:40 | {...} | normal | -| Patterns.cs:10:38:10:39 | access to local variable i1 | Patterns.cs:10:38:10:39 | access to local variable i1 | normal | -| Patterns.cs:12:14:18:9 | if (...) ... | Patterns.cs:14:13:14:45 | call to method WriteLine | normal | -| Patterns.cs:12:14:18:9 | if (...) ... | Patterns.cs:16:18:16:28 | ... is ... | false | -| Patterns.cs:12:14:18:9 | if (...) ... | Patterns.cs:17:9:18:9 | {...} | normal | -| Patterns.cs:12:18:12:18 | access to local variable o | Patterns.cs:12:18:12:18 | access to local variable o | normal | -| Patterns.cs:12:18:12:31 | ... is ... | Patterns.cs:12:18:12:31 | ... is ... | false | -| Patterns.cs:12:18:12:31 | ... is ... | Patterns.cs:12:18:12:31 | ... is ... | true | -| Patterns.cs:12:23:12:31 | String s1 | Patterns.cs:12:23:12:31 | String s1 | match | -| Patterns.cs:12:23:12:31 | String s1 | Patterns.cs:12:23:12:31 | String s1 | no-match | -| Patterns.cs:13:9:15:9 | {...} | Patterns.cs:14:13:14:45 | call to method WriteLine | normal | -| Patterns.cs:14:13:14:45 | call to method WriteLine | Patterns.cs:14:13:14:45 | call to method WriteLine | normal | -| Patterns.cs:14:13:14:46 | ...; | Patterns.cs:14:13:14:45 | call to method WriteLine | normal | -| Patterns.cs:14:31:14:44 | $"..." | Patterns.cs:14:31:14:44 | $"..." | normal | -| Patterns.cs:14:33:14:39 | "string " | Patterns.cs:14:33:14:39 | "string " | normal | -| Patterns.cs:14:40:14:43 | {...} | Patterns.cs:14:40:14:43 | {...} | normal | -| Patterns.cs:14:41:14:42 | access to local variable s1 | Patterns.cs:14:41:14:42 | access to local variable s1 | normal | -| Patterns.cs:16:14:18:9 | if (...) ... | Patterns.cs:16:18:16:28 | ... is ... | false | -| Patterns.cs:16:14:18:9 | if (...) ... | Patterns.cs:17:9:18:9 | {...} | normal | -| Patterns.cs:16:18:16:18 | access to local variable o | Patterns.cs:16:18:16:18 | access to local variable o | normal | -| Patterns.cs:16:18:16:28 | ... is ... | Patterns.cs:16:18:16:28 | ... is ... | false | -| Patterns.cs:16:18:16:28 | ... is ... | Patterns.cs:16:18:16:28 | ... is ... | true | -| Patterns.cs:16:23:16:28 | Object v1 | Patterns.cs:16:23:16:28 | Object v1 | match | -| Patterns.cs:16:23:16:28 | Object v1 | Patterns.cs:16:23:16:28 | Object v1 | no-match | -| Patterns.cs:17:9:18:9 | {...} | Patterns.cs:17:9:18:9 | {...} | normal | -| Patterns.cs:20:9:38:9 | switch (...) {...} | Patterns.cs:23:17:23:22 | break; | normal [break] (0) | -| Patterns.cs:20:9:38:9 | switch (...) {...} | Patterns.cs:26:17:26:22 | break; | normal [break] (0) | -| Patterns.cs:20:9:38:9 | switch (...) {...} | Patterns.cs:29:17:29:22 | break; | normal [break] (0) | -| Patterns.cs:20:9:38:9 | switch (...) {...} | Patterns.cs:32:17:32:22 | break; | normal [break] (0) | -| Patterns.cs:20:9:38:9 | switch (...) {...} | Patterns.cs:34:17:34:22 | break; | normal [break] (0) | -| Patterns.cs:20:9:38:9 | switch (...) {...} | Patterns.cs:37:17:37:22 | break; | normal [break] (0) | -| Patterns.cs:20:17:20:17 | access to local variable o | Patterns.cs:20:17:20:17 | access to local variable o | normal | -| Patterns.cs:22:13:22:23 | case ...: | Patterns.cs:22:18:22:22 | "xyz" | no-match | -| Patterns.cs:22:13:22:23 | case ...: | Patterns.cs:23:17:23:22 | break; | break | -| Patterns.cs:22:18:22:22 | "xyz" | Patterns.cs:22:18:22:22 | "xyz" | match | -| Patterns.cs:22:18:22:22 | "xyz" | Patterns.cs:22:18:22:22 | "xyz" | no-match | -| Patterns.cs:23:17:23:22 | break; | Patterns.cs:23:17:23:22 | break; | break | -| Patterns.cs:24:13:24:36 | case ...: | Patterns.cs:24:18:24:23 | Int32 i2 | no-match | -| Patterns.cs:24:13:24:36 | case ...: | Patterns.cs:24:30:24:35 | ... > ... | false | -| Patterns.cs:24:13:24:36 | case ...: | Patterns.cs:25:17:25:51 | call to method WriteLine | normal | -| Patterns.cs:24:18:24:23 | Int32 i2 | Patterns.cs:24:18:24:23 | Int32 i2 | match | -| Patterns.cs:24:18:24:23 | Int32 i2 | Patterns.cs:24:18:24:23 | Int32 i2 | no-match | -| Patterns.cs:24:30:24:31 | access to local variable i2 | Patterns.cs:24:30:24:31 | access to local variable i2 | normal | -| Patterns.cs:24:30:24:35 | ... > ... | Patterns.cs:24:30:24:35 | ... > ... | false | -| Patterns.cs:24:30:24:35 | ... > ... | Patterns.cs:24:30:24:35 | ... > ... | true | -| Patterns.cs:24:35:24:35 | 0 | Patterns.cs:24:35:24:35 | 0 | normal | -| Patterns.cs:25:17:25:51 | call to method WriteLine | Patterns.cs:25:17:25:51 | call to method WriteLine | normal | -| Patterns.cs:25:17:25:52 | ...; | Patterns.cs:25:17:25:51 | call to method WriteLine | normal | -| Patterns.cs:25:35:25:50 | $"..." | Patterns.cs:25:35:25:50 | $"..." | normal | -| Patterns.cs:25:37:25:45 | "positive " | Patterns.cs:25:37:25:45 | "positive " | normal | -| Patterns.cs:25:46:25:49 | {...} | Patterns.cs:25:46:25:49 | {...} | normal | -| Patterns.cs:25:47:25:48 | access to local variable i2 | Patterns.cs:25:47:25:48 | access to local variable i2 | normal | -| Patterns.cs:26:17:26:22 | break; | Patterns.cs:26:17:26:22 | break; | break | -| Patterns.cs:27:13:27:24 | case ...: | Patterns.cs:27:18:27:23 | Int32 i3 | no-match | -| Patterns.cs:27:13:27:24 | case ...: | Patterns.cs:28:17:28:46 | call to method WriteLine | normal | -| Patterns.cs:27:18:27:23 | Int32 i3 | Patterns.cs:27:18:27:23 | Int32 i3 | match | -| Patterns.cs:27:18:27:23 | Int32 i3 | Patterns.cs:27:18:27:23 | Int32 i3 | no-match | -| Patterns.cs:28:17:28:46 | call to method WriteLine | Patterns.cs:28:17:28:46 | call to method WriteLine | normal | -| Patterns.cs:28:17:28:47 | ...; | Patterns.cs:28:17:28:46 | call to method WriteLine | normal | -| Patterns.cs:28:35:28:45 | $"..." | Patterns.cs:28:35:28:45 | $"..." | normal | -| Patterns.cs:28:37:28:40 | "int " | Patterns.cs:28:37:28:40 | "int " | normal | -| Patterns.cs:28:41:28:44 | {...} | Patterns.cs:28:41:28:44 | {...} | normal | -| Patterns.cs:28:42:28:43 | access to local variable i3 | Patterns.cs:28:42:28:43 | access to local variable i3 | normal | -| Patterns.cs:29:17:29:22 | break; | Patterns.cs:29:17:29:22 | break; | break | -| Patterns.cs:30:13:30:27 | case ...: | Patterns.cs:30:18:30:26 | String s2 | no-match | -| Patterns.cs:30:13:30:27 | case ...: | Patterns.cs:31:17:31:49 | call to method WriteLine | normal | -| Patterns.cs:30:18:30:26 | String s2 | Patterns.cs:30:18:30:26 | String s2 | match | -| Patterns.cs:30:18:30:26 | String s2 | Patterns.cs:30:18:30:26 | String s2 | no-match | -| Patterns.cs:31:17:31:49 | call to method WriteLine | Patterns.cs:31:17:31:49 | call to method WriteLine | normal | -| Patterns.cs:31:17:31:50 | ...; | Patterns.cs:31:17:31:49 | call to method WriteLine | normal | -| Patterns.cs:31:35:31:48 | $"..." | Patterns.cs:31:35:31:48 | $"..." | normal | -| Patterns.cs:31:37:31:43 | "string " | Patterns.cs:31:37:31:43 | "string " | normal | -| Patterns.cs:31:44:31:47 | {...} | Patterns.cs:31:44:31:47 | {...} | normal | -| Patterns.cs:31:45:31:46 | access to local variable s2 | Patterns.cs:31:45:31:46 | access to local variable s2 | normal | -| Patterns.cs:32:17:32:22 | break; | Patterns.cs:32:17:32:22 | break; | break | -| Patterns.cs:33:13:33:24 | case ...: | Patterns.cs:33:18:33:23 | Object v2 | no-match | -| Patterns.cs:33:13:33:24 | case ...: | Patterns.cs:34:17:34:22 | break; | break | -| Patterns.cs:33:18:33:23 | Object v2 | Patterns.cs:33:18:33:23 | Object v2 | match | -| Patterns.cs:33:18:33:23 | Object v2 | Patterns.cs:33:18:33:23 | Object v2 | no-match | -| Patterns.cs:34:17:34:22 | break; | Patterns.cs:34:17:34:22 | break; | break | -| Patterns.cs:35:13:35:20 | default: | Patterns.cs:36:17:36:51 | call to method WriteLine | normal | -| Patterns.cs:36:17:36:51 | call to method WriteLine | Patterns.cs:36:17:36:51 | call to method WriteLine | normal | -| Patterns.cs:36:17:36:52 | ...; | Patterns.cs:36:17:36:51 | call to method WriteLine | normal | -| Patterns.cs:36:35:36:50 | "Something else" | Patterns.cs:36:35:36:50 | "Something else" | normal | -| Patterns.cs:37:17:37:22 | break; | Patterns.cs:37:17:37:22 | break; | break | -| Patterns.cs:40:9:42:9 | switch (...) {...} | Patterns.cs:40:17:40:17 | access to local variable o | normal | -| Patterns.cs:40:17:40:17 | access to local variable o | Patterns.cs:40:17:40:17 | access to local variable o | normal | -| Patterns.cs:48:9:48:9 | access to parameter c | Patterns.cs:48:9:48:9 | access to parameter c | normal | -| Patterns.cs:48:9:48:20 | ... is ... | Patterns.cs:48:9:48:20 | ... is ... | normal | -| Patterns.cs:48:14:48:20 | not ... | Patterns.cs:48:14:48:20 | not ... | normal | -| Patterns.cs:48:18:48:20 | a | Patterns.cs:48:18:48:20 | a | normal | -| Patterns.cs:51:9:51:9 | access to parameter c | Patterns.cs:51:9:51:9 | access to parameter c | normal | -| Patterns.cs:51:9:51:21 | ... is ... | Patterns.cs:51:9:51:21 | ... is ... | false | -| Patterns.cs:51:9:51:21 | ... is ... | Patterns.cs:51:9:51:21 | ... is ... | true | -| Patterns.cs:51:9:51:39 | ... ? ... : ... | Patterns.cs:51:9:51:39 | ... ? ... : ... | normal | -| Patterns.cs:51:14:51:21 | not ... | Patterns.cs:51:14:51:21 | not ... | match | -| Patterns.cs:51:14:51:21 | not ... | Patterns.cs:51:14:51:21 | not ... | no-match | -| Patterns.cs:51:18:51:21 | null | Patterns.cs:51:18:51:21 | null | match | -| Patterns.cs:51:18:51:21 | null | Patterns.cs:51:18:51:21 | null | no-match | -| Patterns.cs:51:25:51:25 | access to parameter c | Patterns.cs:51:25:51:25 | access to parameter c | normal | -| Patterns.cs:51:25:51:30 | ... is ... | Patterns.cs:51:25:51:30 | ... is ... | normal | -| Patterns.cs:51:30:51:30 | 1 | Patterns.cs:51:30:51:30 | 1 | normal | -| Patterns.cs:51:34:51:34 | access to parameter c | Patterns.cs:51:34:51:34 | access to parameter c | normal | -| Patterns.cs:51:34:51:39 | ... is ... | Patterns.cs:51:34:51:39 | ... is ... | normal | -| Patterns.cs:51:39:51:39 | 2 | Patterns.cs:51:39:51:39 | 2 | normal | -| Patterns.cs:54:9:54:9 | access to parameter c | Patterns.cs:54:9:54:9 | access to parameter c | normal | -| Patterns.cs:54:9:54:37 | ... is ... | Patterns.cs:54:9:54:37 | ... is ... | normal | -| Patterns.cs:54:14:54:37 | not ... | Patterns.cs:54:14:54:37 | not ... | normal | -| Patterns.cs:54:18:54:25 | access to type Patterns | Patterns.cs:54:18:54:25 | access to type Patterns | match | -| Patterns.cs:54:18:54:25 | access to type Patterns | Patterns.cs:54:18:54:25 | access to type Patterns | no-match | -| Patterns.cs:54:18:54:37 | Patterns u | Patterns.cs:54:18:54:37 | Patterns u | match | -| Patterns.cs:54:18:54:37 | Patterns u | Patterns.cs:54:18:54:37 | Patterns u | no-match | -| Patterns.cs:54:18:54:37 | { ... } | Patterns.cs:54:18:54:37 | { ... } | normal | -| Patterns.cs:54:27:54:35 | { ... } | Patterns.cs:54:27:54:35 | { ... } | match | -| Patterns.cs:54:27:54:35 | { ... } | Patterns.cs:54:27:54:35 | { ... } | no-match | -| Patterns.cs:54:33:54:33 | 1 | Patterns.cs:54:33:54:33 | 1 | match | -| Patterns.cs:54:33:54:33 | 1 | Patterns.cs:54:33:54:33 | 1 | no-match | -| Patterns.cs:57:5:63:5 | {...} | Patterns.cs:58:9:62:10 | return ...; | return | -| Patterns.cs:58:9:62:10 | return ...; | Patterns.cs:58:9:62:10 | return ...; | return | -| Patterns.cs:58:16:58:16 | access to parameter i | Patterns.cs:58:16:58:16 | access to parameter i | normal | -| Patterns.cs:58:16:62:9 | ... switch { ... } | Patterns.cs:58:16:62:9 | ... switch { ... } | normal | -| Patterns.cs:60:13:60:17 | not ... | Patterns.cs:60:13:60:17 | not ... | match | -| Patterns.cs:60:13:60:17 | not ... | Patterns.cs:60:13:60:17 | not ... | no-match | -| Patterns.cs:60:13:60:28 | ... => ... | Patterns.cs:60:13:60:28 | ... => ... | normal | -| Patterns.cs:60:17:60:17 | 1 | Patterns.cs:60:17:60:17 | 1 | match | -| Patterns.cs:60:17:60:17 | 1 | Patterns.cs:60:17:60:17 | 1 | no-match | -| Patterns.cs:60:22:60:28 | "not 1" | Patterns.cs:60:22:60:28 | "not 1" | normal | -| Patterns.cs:61:13:61:13 | _ | Patterns.cs:61:13:61:13 | _ | match | -| Patterns.cs:61:13:61:24 | ... => ... | Patterns.cs:61:13:61:24 | ... => ... | normal | -| Patterns.cs:61:18:61:24 | "other" | Patterns.cs:61:18:61:24 | "other" | normal | -| Patterns.cs:66:5:72:5 | {...} | Patterns.cs:67:9:71:10 | return ...; | return | -| Patterns.cs:67:9:71:10 | return ...; | Patterns.cs:67:9:71:10 | return ...; | return | -| Patterns.cs:67:16:67:16 | 2 | Patterns.cs:67:16:67:16 | 2 | normal | -| Patterns.cs:67:16:71:9 | ... switch { ... } | Patterns.cs:67:16:71:9 | ... switch { ... } | normal | -| Patterns.cs:69:13:69:17 | not ... | Patterns.cs:69:13:69:17 | not ... | match | -| Patterns.cs:69:13:69:17 | not ... | Patterns.cs:69:13:69:17 | not ... | no-match | -| Patterns.cs:69:13:69:33 | ... => ... | Patterns.cs:69:13:69:33 | ... => ... | normal | -| Patterns.cs:69:17:69:17 | 2 | Patterns.cs:69:17:69:17 | 2 | match | -| Patterns.cs:69:22:69:33 | "impossible" | Patterns.cs:69:22:69:33 | "impossible" | normal | -| Patterns.cs:70:13:70:13 | 2 | Patterns.cs:70:13:70:13 | 2 | match | -| Patterns.cs:70:13:70:27 | ... => ... | Patterns.cs:70:13:70:27 | ... => ... | normal | -| Patterns.cs:70:18:70:27 | "possible" | Patterns.cs:70:18:70:27 | "possible" | normal | -| Patterns.cs:75:5:83:5 | {...} | Patterns.cs:76:9:82:10 | return ...; | return | -| Patterns.cs:76:9:82:10 | return ...; | Patterns.cs:76:9:82:10 | return ...; | return | -| Patterns.cs:76:16:76:16 | access to parameter i | Patterns.cs:76:16:76:16 | access to parameter i | normal | -| Patterns.cs:76:16:82:9 | ... switch { ... } | Patterns.cs:76:16:82:9 | ... switch { ... } | normal | -| Patterns.cs:78:13:78:15 | > ... | Patterns.cs:78:13:78:15 | > ... | match | -| Patterns.cs:78:13:78:15 | > ... | Patterns.cs:78:13:78:15 | > ... | no-match | -| Patterns.cs:78:13:78:24 | ... => ... | Patterns.cs:78:13:78:24 | ... => ... | normal | -| Patterns.cs:78:15:78:15 | 1 | Patterns.cs:78:15:78:15 | 1 | normal | -| Patterns.cs:78:20:78:24 | "> 1" | Patterns.cs:78:20:78:24 | "> 1" | normal | -| Patterns.cs:79:13:79:15 | < ... | Patterns.cs:79:13:79:15 | < ... | match | -| Patterns.cs:79:13:79:15 | < ... | Patterns.cs:79:13:79:15 | < ... | no-match | -| Patterns.cs:79:13:79:24 | ... => ... | Patterns.cs:79:13:79:24 | ... => ... | normal | -| Patterns.cs:79:15:79:15 | 0 | Patterns.cs:79:15:79:15 | 0 | normal | -| Patterns.cs:79:20:79:24 | "< 0" | Patterns.cs:79:20:79:24 | "< 0" | normal | -| Patterns.cs:80:13:80:13 | 1 | Patterns.cs:80:13:80:13 | 1 | match | -| Patterns.cs:80:13:80:13 | 1 | Patterns.cs:80:13:80:13 | 1 | no-match | -| Patterns.cs:80:13:80:20 | ... => ... | Patterns.cs:80:13:80:20 | ... => ... | normal | -| Patterns.cs:80:18:80:20 | "1" | Patterns.cs:80:18:80:20 | "1" | normal | -| Patterns.cs:81:13:81:13 | _ | Patterns.cs:81:13:81:13 | _ | match | -| Patterns.cs:81:13:81:20 | ... => ... | Patterns.cs:81:13:81:20 | ... => ... | normal | -| Patterns.cs:81:18:81:20 | "0" | Patterns.cs:81:18:81:20 | "0" | normal | -| Patterns.cs:85:39:85:39 | access to parameter i | Patterns.cs:85:39:85:39 | access to parameter i | normal | -| Patterns.cs:85:39:85:53 | ... is ... | Patterns.cs:85:39:85:53 | ... is ... | false | -| Patterns.cs:85:39:85:53 | ... is ... | Patterns.cs:85:39:85:53 | ... is ... | true | -| Patterns.cs:85:39:85:69 | ... ? ... : ... | Patterns.cs:85:39:85:69 | ... ? ... : ... | normal | -| Patterns.cs:85:44:85:44 | 1 | Patterns.cs:85:44:85:44 | 1 | match | -| Patterns.cs:85:44:85:44 | 1 | Patterns.cs:85:44:85:44 | 1 | no-match | -| Patterns.cs:85:44:85:53 | ... or ... | Patterns.cs:85:44:85:53 | ... or ... | match | -| Patterns.cs:85:44:85:53 | ... or ... | Patterns.cs:85:44:85:53 | ... or ... | no-match | -| Patterns.cs:85:49:85:53 | not ... | Patterns.cs:85:49:85:53 | not ... | match | -| Patterns.cs:85:49:85:53 | not ... | Patterns.cs:85:49:85:53 | not ... | no-match | -| Patterns.cs:85:53:85:53 | 2 | Patterns.cs:85:53:85:53 | 2 | match | -| Patterns.cs:85:53:85:53 | 2 | Patterns.cs:85:53:85:53 | 2 | no-match | -| Patterns.cs:85:57:85:63 | "not 2" | Patterns.cs:85:57:85:63 | "not 2" | normal | -| Patterns.cs:85:67:85:69 | "2" | Patterns.cs:85:67:85:69 | "2" | normal | -| Patterns.cs:87:39:87:39 | access to parameter i | Patterns.cs:87:39:87:39 | access to parameter i | normal | -| Patterns.cs:87:39:87:54 | ... is ... | Patterns.cs:87:39:87:54 | ... is ... | false | -| Patterns.cs:87:39:87:54 | ... is ... | Patterns.cs:87:39:87:54 | ... is ... | true | -| Patterns.cs:87:39:87:70 | ... ? ... : ... | Patterns.cs:87:39:87:70 | ... ? ... : ... | normal | -| Patterns.cs:87:44:87:44 | 1 | Patterns.cs:87:44:87:44 | 1 | match | -| Patterns.cs:87:44:87:44 | 1 | Patterns.cs:87:44:87:44 | 1 | no-match | -| Patterns.cs:87:44:87:54 | ... and ... | Patterns.cs:87:44:87:54 | ... and ... | match | -| Patterns.cs:87:44:87:54 | ... and ... | Patterns.cs:87:44:87:54 | ... and ... | no-match | -| Patterns.cs:87:50:87:54 | not ... | Patterns.cs:87:50:87:54 | not ... | match | -| Patterns.cs:87:50:87:54 | not ... | Patterns.cs:87:50:87:54 | not ... | no-match | -| Patterns.cs:87:54:87:54 | 2 | Patterns.cs:87:54:87:54 | 2 | match | -| Patterns.cs:87:54:87:54 | 2 | Patterns.cs:87:54:87:54 | 2 | no-match | -| Patterns.cs:87:58:87:60 | "1" | Patterns.cs:87:58:87:60 | "1" | normal | -| Patterns.cs:87:64:87:70 | "not 1" | Patterns.cs:87:64:87:70 | "not 1" | normal | -| Patterns.cs:94:5:99:5 | {...} | Patterns.cs:95:13:95:40 | ... is ... | false | -| Patterns.cs:94:5:99:5 | {...} | Patterns.cs:97:13:97:38 | call to method WriteLine | normal | -| Patterns.cs:95:9:98:9 | if (...) ... | Patterns.cs:95:13:95:40 | ... is ... | false | -| Patterns.cs:95:9:98:9 | if (...) ... | Patterns.cs:97:13:97:38 | call to method WriteLine | normal | -| Patterns.cs:95:13:95:16 | this access | Patterns.cs:95:13:95:16 | this access | normal | -| Patterns.cs:95:13:95:40 | ... is ... | Patterns.cs:95:13:95:40 | ... is ... | false | -| Patterns.cs:95:13:95:40 | ... is ... | Patterns.cs:95:13:95:40 | ... is ... | true | -| Patterns.cs:95:21:95:40 | { ... } | Patterns.cs:95:21:95:40 | { ... } | match | -| Patterns.cs:95:21:95:40 | { ... } | Patterns.cs:95:21:95:40 | { ... } | match | -| Patterns.cs:95:21:95:40 | { ... } | Patterns.cs:95:21:95:40 | { ... } | no-match | -| Patterns.cs:95:21:95:40 | { ... } | Patterns.cs:95:21:95:40 | { ... } | no-match | -| Patterns.cs:95:29:95:31 | access to constant A | Patterns.cs:95:29:95:31 | access to constant A | match | -| Patterns.cs:95:29:95:31 | access to constant A | Patterns.cs:95:29:95:31 | access to constant A | no-match | -| Patterns.cs:95:29:95:38 | ... or ... | Patterns.cs:95:29:95:38 | ... or ... | match | -| Patterns.cs:95:29:95:38 | ... or ... | Patterns.cs:95:29:95:38 | ... or ... | no-match | -| Patterns.cs:95:36:95:38 | access to constant B | Patterns.cs:95:36:95:38 | access to constant B | match | -| Patterns.cs:95:36:95:38 | access to constant B | Patterns.cs:95:36:95:38 | access to constant B | no-match | -| Patterns.cs:96:9:98:9 | {...} | Patterns.cs:97:13:97:38 | call to method WriteLine | normal | -| Patterns.cs:97:13:97:38 | call to method WriteLine | Patterns.cs:97:13:97:38 | call to method WriteLine | normal | -| Patterns.cs:97:13:97:39 | ...; | Patterns.cs:97:13:97:38 | call to method WriteLine | normal | -| Patterns.cs:97:31:97:37 | "not C" | Patterns.cs:97:31:97:37 | "not C" | normal | -| PostDominance.cs:3:7:3:19 | call to constructor Object | PostDominance.cs:3:7:3:19 | call to constructor Object | normal | -| PostDominance.cs:3:7:3:19 | call to method | PostDominance.cs:3:7:3:19 | call to method | normal | -| PostDominance.cs:3:7:3:19 | this access | PostDominance.cs:3:7:3:19 | this access | normal | -| PostDominance.cs:3:7:3:19 | {...} | PostDominance.cs:3:7:3:19 | {...} | normal | -| PostDominance.cs:6:5:8:5 | {...} | PostDominance.cs:7:9:7:28 | call to method WriteLine | normal | -| PostDominance.cs:7:9:7:28 | call to method WriteLine | PostDominance.cs:7:9:7:28 | call to method WriteLine | normal | -| PostDominance.cs:7:9:7:29 | ...; | PostDominance.cs:7:9:7:28 | call to method WriteLine | normal | -| PostDominance.cs:7:27:7:27 | access to parameter s | PostDominance.cs:7:27:7:27 | access to parameter s | normal | -| PostDominance.cs:11:5:15:5 | {...} | PostDominance.cs:13:13:13:19 | return ...; | return | -| PostDominance.cs:11:5:15:5 | {...} | PostDominance.cs:14:9:14:28 | call to method WriteLine | normal | -| PostDominance.cs:12:9:13:19 | if (...) ... | PostDominance.cs:12:13:12:21 | ... is ... | false | -| PostDominance.cs:12:9:13:19 | if (...) ... | PostDominance.cs:13:13:13:19 | return ...; | return | -| PostDominance.cs:12:13:12:13 | access to parameter s | PostDominance.cs:12:13:12:13 | access to parameter s | normal | -| PostDominance.cs:12:13:12:21 | ... is ... | PostDominance.cs:12:13:12:21 | ... is ... | false | -| PostDominance.cs:12:13:12:21 | ... is ... | PostDominance.cs:12:13:12:21 | ... is ... | true | -| PostDominance.cs:12:18:12:21 | null | PostDominance.cs:12:18:12:21 | null | match | -| PostDominance.cs:12:18:12:21 | null | PostDominance.cs:12:18:12:21 | null | no-match | -| PostDominance.cs:13:13:13:19 | return ...; | PostDominance.cs:13:13:13:19 | return ...; | return | -| PostDominance.cs:14:9:14:28 | call to method WriteLine | PostDominance.cs:14:9:14:28 | call to method WriteLine | normal | -| PostDominance.cs:14:9:14:29 | ...; | PostDominance.cs:14:9:14:28 | call to method WriteLine | normal | -| PostDominance.cs:14:27:14:27 | access to parameter s | PostDominance.cs:14:27:14:27 | access to parameter s | normal | -| PostDominance.cs:18:5:22:5 | {...} | PostDominance.cs:20:13:20:55 | throw ...; | throw(ArgumentNullException) | -| PostDominance.cs:18:5:22:5 | {...} | PostDominance.cs:21:9:21:28 | call to method WriteLine | normal | -| PostDominance.cs:19:9:20:55 | if (...) ... | PostDominance.cs:19:13:19:21 | ... is ... | false | -| PostDominance.cs:19:9:20:55 | if (...) ... | PostDominance.cs:20:13:20:55 | throw ...; | throw(ArgumentNullException) | -| PostDominance.cs:19:13:19:13 | access to parameter s | PostDominance.cs:19:13:19:13 | access to parameter s | normal | -| PostDominance.cs:19:13:19:21 | ... is ... | PostDominance.cs:19:13:19:21 | ... is ... | false | -| PostDominance.cs:19:13:19:21 | ... is ... | PostDominance.cs:19:13:19:21 | ... is ... | true | -| PostDominance.cs:19:18:19:21 | null | PostDominance.cs:19:18:19:21 | null | match | -| PostDominance.cs:19:18:19:21 | null | PostDominance.cs:19:18:19:21 | null | no-match | -| PostDominance.cs:20:13:20:55 | throw ...; | PostDominance.cs:20:13:20:55 | throw ...; | throw(ArgumentNullException) | -| PostDominance.cs:20:19:20:54 | object creation of type ArgumentNullException | PostDominance.cs:20:19:20:54 | object creation of type ArgumentNullException | normal | -| PostDominance.cs:20:45:20:53 | nameof(...) | PostDominance.cs:20:45:20:53 | nameof(...) | normal | -| PostDominance.cs:20:52:20:52 | access to parameter s | PostDominance.cs:20:52:20:52 | access to parameter s | normal | -| PostDominance.cs:21:9:21:28 | call to method WriteLine | PostDominance.cs:21:9:21:28 | call to method WriteLine | normal | -| PostDominance.cs:21:9:21:29 | ...; | PostDominance.cs:21:9:21:28 | call to method WriteLine | normal | -| PostDominance.cs:21:27:21:27 | access to parameter s | PostDominance.cs:21:27:21:27 | access to parameter s | normal | -| Qualifiers.cs:1:7:1:16 | call to constructor Object | Qualifiers.cs:1:7:1:16 | call to constructor Object | normal | -| Qualifiers.cs:1:7:1:16 | call to method | Qualifiers.cs:1:7:1:16 | call to method | normal | -| Qualifiers.cs:1:7:1:16 | this access | Qualifiers.cs:1:7:1:16 | this access | normal | -| Qualifiers.cs:1:7:1:16 | {...} | Qualifiers.cs:1:7:1:16 | {...} | normal | -| Qualifiers.cs:7:28:7:31 | null | Qualifiers.cs:7:28:7:31 | null | normal | -| Qualifiers.cs:8:41:8:44 | null | Qualifiers.cs:8:41:8:44 | null | normal | -| Qualifiers.cs:11:5:31:5 | {...} | Qualifiers.cs:30:9:30:46 | ... = ... | normal | -| Qualifiers.cs:12:9:12:22 | ... ...; | Qualifiers.cs:12:13:12:21 | Qualifiers q = ... | normal | -| Qualifiers.cs:12:13:12:21 | Qualifiers q = ... | Qualifiers.cs:12:13:12:21 | Qualifiers q = ... | normal | -| Qualifiers.cs:12:17:12:21 | access to field Field | Qualifiers.cs:12:17:12:21 | access to field Field | normal | -| Qualifiers.cs:12:17:12:21 | this access | Qualifiers.cs:12:17:12:21 | this access | normal | -| Qualifiers.cs:13:9:13:20 | ... = ... | Qualifiers.cs:13:9:13:20 | ... = ... | normal | -| Qualifiers.cs:13:9:13:21 | ...; | Qualifiers.cs:13:9:13:20 | ... = ... | normal | -| Qualifiers.cs:13:13:13:20 | access to property Property | Qualifiers.cs:13:13:13:20 | access to property Property | normal | -| Qualifiers.cs:13:13:13:20 | this access | Qualifiers.cs:13:13:13:20 | this access | normal | -| Qualifiers.cs:14:9:14:20 | ... = ... | Qualifiers.cs:14:9:14:20 | ... = ... | normal | -| Qualifiers.cs:14:9:14:21 | ...; | Qualifiers.cs:14:9:14:20 | ... = ... | normal | -| Qualifiers.cs:14:13:14:20 | call to method Method | Qualifiers.cs:14:13:14:20 | call to method Method | normal | -| Qualifiers.cs:14:13:14:20 | this access | Qualifiers.cs:14:13:14:20 | this access | normal | -| Qualifiers.cs:16:9:16:22 | ... = ... | Qualifiers.cs:16:9:16:22 | ... = ... | normal | -| Qualifiers.cs:16:9:16:23 | ...; | Qualifiers.cs:16:9:16:22 | ... = ... | normal | -| Qualifiers.cs:16:13:16:16 | this access | Qualifiers.cs:16:13:16:16 | this access | normal | -| Qualifiers.cs:16:13:16:22 | access to field Field | Qualifiers.cs:16:13:16:22 | access to field Field | normal | -| Qualifiers.cs:17:9:17:25 | ... = ... | Qualifiers.cs:17:9:17:25 | ... = ... | normal | -| Qualifiers.cs:17:9:17:26 | ...; | Qualifiers.cs:17:9:17:25 | ... = ... | normal | -| Qualifiers.cs:17:13:17:16 | this access | Qualifiers.cs:17:13:17:16 | this access | normal | -| Qualifiers.cs:17:13:17:25 | access to property Property | Qualifiers.cs:17:13:17:25 | access to property Property | normal | -| Qualifiers.cs:18:9:18:25 | ... = ... | Qualifiers.cs:18:9:18:25 | ... = ... | normal | -| Qualifiers.cs:18:9:18:26 | ...; | Qualifiers.cs:18:9:18:25 | ... = ... | normal | -| Qualifiers.cs:18:13:18:16 | this access | Qualifiers.cs:18:13:18:16 | this access | normal | -| Qualifiers.cs:18:13:18:25 | call to method Method | Qualifiers.cs:18:13:18:25 | call to method Method | normal | -| Qualifiers.cs:20:9:20:23 | ... = ... | Qualifiers.cs:20:9:20:23 | ... = ... | normal | -| Qualifiers.cs:20:9:20:24 | ...; | Qualifiers.cs:20:9:20:23 | ... = ... | normal | -| Qualifiers.cs:20:13:20:23 | access to field StaticField | Qualifiers.cs:20:13:20:23 | access to field StaticField | normal | -| Qualifiers.cs:21:9:21:26 | ... = ... | Qualifiers.cs:21:9:21:26 | ... = ... | normal | -| Qualifiers.cs:21:9:21:27 | ...; | Qualifiers.cs:21:9:21:26 | ... = ... | normal | -| Qualifiers.cs:21:13:21:26 | access to property StaticProperty | Qualifiers.cs:21:13:21:26 | access to property StaticProperty | normal | -| Qualifiers.cs:22:9:22:26 | ... = ... | Qualifiers.cs:22:9:22:26 | ... = ... | normal | -| Qualifiers.cs:22:9:22:27 | ...; | Qualifiers.cs:22:9:22:26 | ... = ... | normal | -| Qualifiers.cs:22:13:22:26 | call to method StaticMethod | Qualifiers.cs:22:13:22:26 | call to method StaticMethod | normal | -| Qualifiers.cs:24:9:24:34 | ... = ... | Qualifiers.cs:24:9:24:34 | ... = ... | normal | -| Qualifiers.cs:24:9:24:35 | ...; | Qualifiers.cs:24:9:24:34 | ... = ... | normal | -| Qualifiers.cs:24:13:24:34 | access to field StaticField | Qualifiers.cs:24:13:24:34 | access to field StaticField | normal | -| Qualifiers.cs:25:9:25:37 | ... = ... | Qualifiers.cs:25:9:25:37 | ... = ... | normal | -| Qualifiers.cs:25:9:25:38 | ...; | Qualifiers.cs:25:9:25:37 | ... = ... | normal | -| Qualifiers.cs:25:13:25:37 | access to property StaticProperty | Qualifiers.cs:25:13:25:37 | access to property StaticProperty | normal | -| Qualifiers.cs:26:9:26:37 | ... = ... | Qualifiers.cs:26:9:26:37 | ... = ... | normal | -| Qualifiers.cs:26:9:26:38 | ...; | Qualifiers.cs:26:9:26:37 | ... = ... | normal | -| Qualifiers.cs:26:13:26:37 | call to method StaticMethod | Qualifiers.cs:26:13:26:37 | call to method StaticMethod | normal | -| Qualifiers.cs:28:9:28:40 | ... = ... | Qualifiers.cs:28:9:28:40 | ... = ... | normal | -| Qualifiers.cs:28:9:28:41 | ...; | Qualifiers.cs:28:9:28:40 | ... = ... | normal | -| Qualifiers.cs:28:13:28:34 | access to field StaticField | Qualifiers.cs:28:13:28:34 | access to field StaticField | normal | -| Qualifiers.cs:28:13:28:40 | access to field Field | Qualifiers.cs:28:13:28:40 | access to field Field | normal | -| Qualifiers.cs:29:9:29:46 | ... = ... | Qualifiers.cs:29:9:29:46 | ... = ... | normal | -| Qualifiers.cs:29:9:29:47 | ...; | Qualifiers.cs:29:9:29:46 | ... = ... | normal | -| Qualifiers.cs:29:13:29:37 | access to property StaticProperty | Qualifiers.cs:29:13:29:37 | access to property StaticProperty | normal | -| Qualifiers.cs:29:13:29:46 | access to property Property | Qualifiers.cs:29:13:29:46 | access to property Property | normal | -| Qualifiers.cs:30:9:30:46 | ... = ... | Qualifiers.cs:30:9:30:46 | ... = ... | normal | -| Qualifiers.cs:30:9:30:47 | ...; | Qualifiers.cs:30:9:30:46 | ... = ... | normal | -| Qualifiers.cs:30:13:30:37 | call to method StaticMethod | Qualifiers.cs:30:13:30:37 | call to method StaticMethod | normal | -| Qualifiers.cs:30:13:30:46 | call to method Method | Qualifiers.cs:30:13:30:46 | call to method Method | normal | -| Switch.cs:3:7:3:12 | call to constructor Object | Switch.cs:3:7:3:12 | call to constructor Object | normal | -| Switch.cs:3:7:3:12 | call to method | Switch.cs:3:7:3:12 | call to method | normal | -| Switch.cs:3:7:3:12 | this access | Switch.cs:3:7:3:12 | this access | normal | -| Switch.cs:3:7:3:12 | {...} | Switch.cs:3:7:3:12 | {...} | normal | -| Switch.cs:6:5:8:5 | {...} | Switch.cs:7:17:7:17 | access to parameter o | normal | -| Switch.cs:7:9:7:22 | switch (...) {...} | Switch.cs:7:17:7:17 | access to parameter o | normal | -| Switch.cs:7:17:7:17 | access to parameter o | Switch.cs:7:17:7:17 | access to parameter o | normal | -| Switch.cs:11:5:33:5 | {...} | Switch.cs:15:17:15:23 | return ...; | return | -| Switch.cs:11:5:33:5 | {...} | Switch.cs:17:17:17:38 | throw ...; | throw(Exception) | -| Switch.cs:11:5:33:5 | {...} | Switch.cs:22:21:22:27 | return ...; | return | -| Switch.cs:11:5:33:5 | {...} | Switch.cs:26:17:26:23 | return ...; | return | -| Switch.cs:11:5:33:5 | {...} | Switch.cs:27:32:27:38 | call to method Throw | throw(Exception) | -| Switch.cs:11:5:33:5 | {...} | Switch.cs:29:17:29:23 | return ...; | return | -| Switch.cs:11:5:33:5 | {...} | Switch.cs:31:17:31:27 | goto ...; | goto(Label) | -| Switch.cs:12:9:32:9 | switch (...) {...} | Switch.cs:15:17:15:23 | return ...; | return | -| Switch.cs:12:9:32:9 | switch (...) {...} | Switch.cs:17:17:17:38 | throw ...; | throw(Exception) | -| Switch.cs:12:9:32:9 | switch (...) {...} | Switch.cs:22:21:22:27 | return ...; | return | -| Switch.cs:12:9:32:9 | switch (...) {...} | Switch.cs:26:17:26:23 | return ...; | return | -| Switch.cs:12:9:32:9 | switch (...) {...} | Switch.cs:27:32:27:38 | call to method Throw | throw(Exception) | -| Switch.cs:12:9:32:9 | switch (...) {...} | Switch.cs:29:17:29:23 | return ...; | return | -| Switch.cs:12:9:32:9 | switch (...) {...} | Switch.cs:31:17:31:27 | goto ...; | goto(Label) | -| Switch.cs:12:17:12:17 | access to parameter o | Switch.cs:12:17:12:17 | access to parameter o | normal | -| Switch.cs:14:13:14:21 | case ...: | Switch.cs:14:18:14:20 | "a" | no-match | -| Switch.cs:14:13:14:21 | case ...: | Switch.cs:15:17:15:23 | return ...; | return | -| Switch.cs:14:18:14:20 | "a" | Switch.cs:14:18:14:20 | "a" | match | -| Switch.cs:14:18:14:20 | "a" | Switch.cs:14:18:14:20 | "a" | no-match | -| Switch.cs:15:17:15:23 | return ...; | Switch.cs:15:17:15:23 | return ...; | return | -| Switch.cs:16:13:16:19 | case ...: | Switch.cs:16:18:16:18 | 0 | no-match | -| Switch.cs:16:13:16:19 | case ...: | Switch.cs:17:17:17:38 | throw ...; | throw(Exception) | -| Switch.cs:16:18:16:18 | 0 | Switch.cs:16:18:16:18 | 0 | match | -| Switch.cs:16:18:16:18 | 0 | Switch.cs:16:18:16:18 | 0 | no-match | -| Switch.cs:17:17:17:38 | throw ...; | Switch.cs:17:17:17:38 | throw ...; | throw(Exception) | -| Switch.cs:17:23:17:37 | object creation of type Exception | Switch.cs:17:23:17:37 | object creation of type Exception | normal | -| Switch.cs:18:13:18:22 | case ...: | Switch.cs:18:18:18:21 | null | no-match | -| Switch.cs:18:13:18:22 | case ...: | Switch.cs:19:17:19:29 | goto default; | goto(default) | -| Switch.cs:18:18:18:21 | null | Switch.cs:18:18:18:21 | null | match | -| Switch.cs:18:18:18:21 | null | Switch.cs:18:18:18:21 | null | no-match | -| Switch.cs:19:17:19:29 | goto default; | Switch.cs:19:17:19:29 | goto default; | goto(default) | -| Switch.cs:20:13:20:23 | case ...: | Switch.cs:20:18:20:22 | Int32 i | no-match | -| Switch.cs:20:13:20:23 | case ...: | Switch.cs:21:21:21:29 | ... == ... | false | -| Switch.cs:20:13:20:23 | case ...: | Switch.cs:22:21:22:27 | return ...; | return | -| Switch.cs:20:18:20:22 | Int32 i | Switch.cs:20:18:20:22 | Int32 i | match | -| Switch.cs:20:18:20:22 | Int32 i | Switch.cs:20:18:20:22 | Int32 i | no-match | -| Switch.cs:21:17:22:27 | if (...) ... | Switch.cs:21:21:21:29 | ... == ... | false | -| Switch.cs:21:17:22:27 | if (...) ... | Switch.cs:22:21:22:27 | return ...; | return | -| Switch.cs:21:21:21:21 | access to parameter o | Switch.cs:21:21:21:21 | access to parameter o | normal | -| Switch.cs:21:21:21:29 | ... == ... | Switch.cs:21:21:21:29 | ... == ... | false | -| Switch.cs:21:21:21:29 | ... == ... | Switch.cs:21:21:21:29 | ... == ... | true | -| Switch.cs:21:26:21:29 | null | Switch.cs:21:26:21:29 | null | normal | -| Switch.cs:22:21:22:27 | return ...; | Switch.cs:22:21:22:27 | return ...; | return | -| Switch.cs:23:17:23:28 | goto case ...; | Switch.cs:23:17:23:28 | goto case ...; | goto(0) | -| Switch.cs:23:27:23:27 | 0 | Switch.cs:23:27:23:27 | 0 | normal | -| Switch.cs:24:13:24:56 | case ...: | Switch.cs:24:18:24:25 | String s | no-match | -| Switch.cs:24:13:24:56 | case ...: | Switch.cs:24:32:24:55 | ... && ... | false | -| Switch.cs:24:13:24:56 | case ...: | Switch.cs:25:17:25:36 | call to method WriteLine | normal | -| Switch.cs:24:18:24:25 | String s | Switch.cs:24:18:24:25 | String s | match | -| Switch.cs:24:18:24:25 | String s | Switch.cs:24:18:24:25 | String s | no-match | -| Switch.cs:24:32:24:32 | access to local variable s | Switch.cs:24:32:24:32 | access to local variable s | normal | -| Switch.cs:24:32:24:39 | access to property Length | Switch.cs:24:32:24:39 | access to property Length | normal | -| Switch.cs:24:32:24:43 | ... > ... | Switch.cs:24:32:24:43 | ... > ... | false | -| Switch.cs:24:32:24:43 | ... > ... | Switch.cs:24:32:24:43 | ... > ... | true | -| Switch.cs:24:32:24:55 | ... && ... | Switch.cs:24:32:24:55 | ... && ... | false | -| Switch.cs:24:32:24:55 | ... && ... | Switch.cs:24:32:24:55 | ... && ... | true | -| Switch.cs:24:43:24:43 | 0 | Switch.cs:24:43:24:43 | 0 | normal | -| Switch.cs:24:48:24:48 | access to local variable s | Switch.cs:24:48:24:48 | access to local variable s | normal | -| Switch.cs:24:48:24:55 | ... != ... | Switch.cs:24:48:24:55 | ... != ... | false | -| Switch.cs:24:48:24:55 | ... != ... | Switch.cs:24:48:24:55 | ... != ... | true | -| Switch.cs:24:53:24:55 | "a" | Switch.cs:24:53:24:55 | "a" | normal | -| Switch.cs:25:17:25:36 | call to method WriteLine | Switch.cs:25:17:25:36 | call to method WriteLine | normal | -| Switch.cs:25:17:25:37 | ...; | Switch.cs:25:17:25:36 | call to method WriteLine | normal | -| Switch.cs:25:35:25:35 | access to local variable s | Switch.cs:25:35:25:35 | access to local variable s | normal | -| Switch.cs:26:17:26:23 | return ...; | Switch.cs:26:17:26:23 | return ...; | return | -| Switch.cs:27:13:27:39 | case ...: | Switch.cs:27:18:27:25 | Double d | no-match | -| Switch.cs:27:13:27:39 | case ...: | Switch.cs:27:32:27:38 | call to method Throw | throw(Exception) | -| Switch.cs:27:13:27:39 | case ...: | Switch.cs:28:13:28:17 | Label: | normal | -| Switch.cs:27:18:27:25 | Double d | Switch.cs:27:18:27:25 | Double d | match | -| Switch.cs:27:18:27:25 | Double d | Switch.cs:27:18:27:25 | Double d | no-match | -| Switch.cs:27:32:27:38 | call to method Throw | Switch.cs:27:32:27:38 | call to method Throw | throw(Exception) | -| Switch.cs:28:13:28:17 | Label: | Switch.cs:28:13:28:17 | Label: | normal | -| Switch.cs:29:17:29:23 | return ...; | Switch.cs:29:17:29:23 | return ...; | return | -| Switch.cs:30:13:30:20 | default: | Switch.cs:31:17:31:27 | goto ...; | goto(Label) | -| Switch.cs:31:17:31:27 | goto ...; | Switch.cs:31:17:31:27 | goto ...; | goto(Label) | -| Switch.cs:36:5:42:5 | {...} | Switch.cs:37:17:37:23 | call to method Throw | throw(Exception) | -| Switch.cs:36:5:42:5 | {...} | Switch.cs:40:17:40:23 | return ...; | return | -| Switch.cs:37:9:41:9 | switch (...) {...} | Switch.cs:37:17:37:23 | call to method Throw | throw(Exception) | -| Switch.cs:37:9:41:9 | switch (...) {...} | Switch.cs:40:17:40:23 | return ...; | return | -| Switch.cs:37:17:37:23 | call to method Throw | Switch.cs:37:17:37:23 | call to method Throw | throw(Exception) | -| Switch.cs:39:13:39:20 | default: | Switch.cs:40:17:40:23 | return ...; | return | -| Switch.cs:40:17:40:23 | return ...; | Switch.cs:40:17:40:23 | return ...; | return | -| Switch.cs:45:5:53:5 | {...} | Switch.cs:49:17:49:22 | break; | normal [break] (0) | -| Switch.cs:45:5:53:5 | {...} | Switch.cs:50:18:50:21 | access to type Boolean | no-match | -| Switch.cs:45:5:53:5 | {...} | Switch.cs:50:30:50:38 | ... != ... | false | -| Switch.cs:45:5:53:5 | {...} | Switch.cs:51:17:51:22 | break; | normal [break] (0) | -| Switch.cs:46:9:52:9 | switch (...) {...} | Switch.cs:49:17:49:22 | break; | normal [break] (0) | -| Switch.cs:46:9:52:9 | switch (...) {...} | Switch.cs:50:18:50:21 | access to type Boolean | no-match | -| Switch.cs:46:9:52:9 | switch (...) {...} | Switch.cs:50:30:50:38 | ... != ... | false | -| Switch.cs:46:9:52:9 | switch (...) {...} | Switch.cs:51:17:51:22 | break; | normal [break] (0) | -| Switch.cs:46:17:46:17 | access to parameter o | Switch.cs:46:17:46:17 | access to parameter o | normal | -| Switch.cs:48:13:48:23 | case ...: | Switch.cs:48:18:48:20 | access to type Int32 | no-match | -| Switch.cs:48:13:48:23 | case ...: | Switch.cs:49:17:49:22 | break; | break | -| Switch.cs:48:18:48:20 | access to type Int32 | Switch.cs:48:18:48:20 | access to type Int32 | match | -| Switch.cs:48:18:48:20 | access to type Int32 | Switch.cs:48:18:48:20 | access to type Int32 | no-match | -| Switch.cs:49:17:49:22 | break; | Switch.cs:49:17:49:22 | break; | break | -| Switch.cs:50:13:50:39 | case ...: | Switch.cs:50:18:50:21 | access to type Boolean | no-match | -| Switch.cs:50:13:50:39 | case ...: | Switch.cs:50:30:50:38 | ... != ... | false | -| Switch.cs:50:13:50:39 | case ...: | Switch.cs:51:17:51:22 | break; | break | -| Switch.cs:50:18:50:21 | access to type Boolean | Switch.cs:50:18:50:21 | access to type Boolean | match | -| Switch.cs:50:18:50:21 | access to type Boolean | Switch.cs:50:18:50:21 | access to type Boolean | no-match | -| Switch.cs:50:30:50:30 | access to parameter o | Switch.cs:50:30:50:30 | access to parameter o | normal | -| Switch.cs:50:30:50:38 | ... != ... | Switch.cs:50:30:50:38 | ... != ... | false | -| Switch.cs:50:30:50:38 | ... != ... | Switch.cs:50:30:50:38 | ... != ... | true | -| Switch.cs:50:35:50:38 | null | Switch.cs:50:35:50:38 | null | normal | -| Switch.cs:51:17:51:22 | break; | Switch.cs:51:17:51:22 | break; | break | -| Switch.cs:56:5:64:5 | {...} | Switch.cs:60:17:60:22 | break; | normal [break] (0) | -| Switch.cs:56:5:64:5 | {...} | Switch.cs:62:17:62:22 | break; | normal [break] (0) | -| Switch.cs:57:9:63:9 | switch (...) {...} | Switch.cs:60:17:60:22 | break; | normal [break] (0) | -| Switch.cs:57:9:63:9 | switch (...) {...} | Switch.cs:62:17:62:22 | break; | normal [break] (0) | -| Switch.cs:57:17:57:17 | 1 | Switch.cs:57:17:57:17 | 1 | normal | -| Switch.cs:57:17:57:21 | ... + ... | Switch.cs:57:17:57:21 | ... + ... | normal | -| Switch.cs:57:21:57:21 | 2 | Switch.cs:57:21:57:21 | 2 | normal | -| Switch.cs:59:13:59:19 | case ...: | Switch.cs:59:18:59:18 | 2 | no-match | -| Switch.cs:59:13:59:19 | case ...: | Switch.cs:60:17:60:22 | break; | break | -| Switch.cs:59:18:59:18 | 2 | Switch.cs:59:18:59:18 | 2 | no-match | -| Switch.cs:60:17:60:22 | break; | Switch.cs:60:17:60:22 | break; | break | -| Switch.cs:61:13:61:19 | case ...: | Switch.cs:62:17:62:22 | break; | break | -| Switch.cs:61:18:61:18 | 3 | Switch.cs:61:18:61:18 | 3 | match | -| Switch.cs:62:17:62:22 | break; | Switch.cs:62:17:62:22 | break; | break | -| Switch.cs:67:5:75:5 | {...} | Switch.cs:71:17:71:22 | break; | normal [break] (0) | -| Switch.cs:67:5:75:5 | {...} | Switch.cs:72:18:72:19 | "" | no-match | -| Switch.cs:67:5:75:5 | {...} | Switch.cs:73:17:73:22 | break; | normal [break] (0) | -| Switch.cs:68:9:74:9 | switch (...) {...} | Switch.cs:71:17:71:22 | break; | normal [break] (0) | -| Switch.cs:68:9:74:9 | switch (...) {...} | Switch.cs:72:18:72:19 | "" | no-match | -| Switch.cs:68:9:74:9 | switch (...) {...} | Switch.cs:73:17:73:22 | break; | normal [break] (0) | -| Switch.cs:68:17:68:25 | (...) ... | Switch.cs:68:17:68:25 | (...) ... | normal | -| Switch.cs:68:25:68:25 | access to parameter s | Switch.cs:68:25:68:25 | access to parameter s | normal | -| Switch.cs:70:13:70:23 | case ...: | Switch.cs:70:18:70:20 | access to type Int32 | no-match | -| Switch.cs:70:13:70:23 | case ...: | Switch.cs:71:17:71:22 | break; | break | -| Switch.cs:70:18:70:20 | access to type Int32 | Switch.cs:70:18:70:20 | access to type Int32 | no-match | -| Switch.cs:71:17:71:22 | break; | Switch.cs:71:17:71:22 | break; | break | -| Switch.cs:72:13:72:20 | case ...: | Switch.cs:72:18:72:19 | "" | no-match | -| Switch.cs:72:13:72:20 | case ...: | Switch.cs:73:17:73:22 | break; | break | -| Switch.cs:72:18:72:19 | "" | Switch.cs:72:18:72:19 | "" | match | -| Switch.cs:72:18:72:19 | "" | Switch.cs:72:18:72:19 | "" | no-match | -| Switch.cs:73:17:73:22 | break; | Switch.cs:73:17:73:22 | break; | break | -| Switch.cs:78:5:89:5 | {...} | Switch.cs:82:17:82:28 | return ...; | return | -| Switch.cs:78:5:89:5 | {...} | Switch.cs:86:17:86:28 | return ...; | return | -| Switch.cs:78:5:89:5 | {...} | Switch.cs:88:9:88:21 | return ...; | return | -| Switch.cs:79:9:87:9 | switch (...) {...} | Switch.cs:82:17:82:28 | return ...; | return | -| Switch.cs:79:9:87:9 | switch (...) {...} | Switch.cs:83:18:83:18 | 2 | no-match | -| Switch.cs:79:9:87:9 | switch (...) {...} | Switch.cs:85:21:85:26 | break; | normal [break] (0) | -| Switch.cs:79:9:87:9 | switch (...) {...} | Switch.cs:86:17:86:28 | return ...; | return | -| Switch.cs:79:17:79:17 | access to parameter i | Switch.cs:79:17:79:17 | access to parameter i | normal | -| Switch.cs:81:13:81:19 | case ...: | Switch.cs:81:18:81:18 | 1 | no-match | -| Switch.cs:81:13:81:19 | case ...: | Switch.cs:82:17:82:28 | return ...; | return | -| Switch.cs:81:18:81:18 | 1 | Switch.cs:81:18:81:18 | 1 | match | -| Switch.cs:81:18:81:18 | 1 | Switch.cs:81:18:81:18 | 1 | no-match | -| Switch.cs:82:17:82:28 | return ...; | Switch.cs:82:17:82:28 | return ...; | return | -| Switch.cs:82:24:82:27 | true | Switch.cs:82:24:82:27 | true | normal | -| Switch.cs:83:13:83:19 | case ...: | Switch.cs:83:18:83:18 | 2 | no-match | -| Switch.cs:83:13:83:19 | case ...: | Switch.cs:84:21:84:25 | ... > ... | false | -| Switch.cs:83:13:83:19 | case ...: | Switch.cs:85:21:85:26 | break; | break | -| Switch.cs:83:18:83:18 | 2 | Switch.cs:83:18:83:18 | 2 | match | -| Switch.cs:83:18:83:18 | 2 | Switch.cs:83:18:83:18 | 2 | no-match | -| Switch.cs:84:17:85:26 | if (...) ... | Switch.cs:84:21:84:25 | ... > ... | false | -| Switch.cs:84:17:85:26 | if (...) ... | Switch.cs:85:21:85:26 | break; | break | -| Switch.cs:84:21:84:21 | access to parameter j | Switch.cs:84:21:84:21 | access to parameter j | normal | -| Switch.cs:84:21:84:25 | ... > ... | Switch.cs:84:21:84:25 | ... > ... | false | -| Switch.cs:84:21:84:25 | ... > ... | Switch.cs:84:21:84:25 | ... > ... | true | -| Switch.cs:84:25:84:25 | 2 | Switch.cs:84:25:84:25 | 2 | normal | -| Switch.cs:85:21:85:26 | break; | Switch.cs:85:21:85:26 | break; | break | -| Switch.cs:86:17:86:28 | return ...; | Switch.cs:86:17:86:28 | return ...; | return | -| Switch.cs:86:24:86:27 | true | Switch.cs:86:24:86:27 | true | normal | -| Switch.cs:88:9:88:21 | return ...; | Switch.cs:88:9:88:21 | return ...; | return | -| Switch.cs:88:16:88:20 | false | Switch.cs:88:16:88:20 | false | normal | -| Switch.cs:92:5:99:5 | {...} | Switch.cs:96:17:96:28 | return ...; | return | -| Switch.cs:92:5:99:5 | {...} | Switch.cs:98:9:98:21 | return ...; | return | -| Switch.cs:93:9:97:9 | switch (...) {...} | Switch.cs:95:18:95:20 | access to type Int32 | no-match | -| Switch.cs:93:9:97:9 | switch (...) {...} | Switch.cs:96:17:96:28 | return ...; | return | -| Switch.cs:93:17:93:17 | access to parameter o | Switch.cs:93:17:93:17 | access to parameter o | normal | -| Switch.cs:95:13:95:23 | case ...: | Switch.cs:95:18:95:20 | access to type Int32 | no-match | -| Switch.cs:95:13:95:23 | case ...: | Switch.cs:96:17:96:28 | return ...; | return | -| Switch.cs:95:18:95:20 | access to type Int32 | Switch.cs:95:18:95:20 | access to type Int32 | match | -| Switch.cs:95:18:95:20 | access to type Int32 | Switch.cs:95:18:95:20 | access to type Int32 | no-match | -| Switch.cs:96:17:96:28 | return ...; | Switch.cs:96:17:96:28 | return ...; | return | -| Switch.cs:96:24:96:27 | true | Switch.cs:96:24:96:27 | true | normal | -| Switch.cs:98:9:98:21 | return ...; | Switch.cs:98:9:98:21 | return ...; | return | -| Switch.cs:98:16:98:20 | false | Switch.cs:98:16:98:20 | false | normal | -| Switch.cs:102:5:109:5 | {...} | Switch.cs:105:21:105:29 | return ...; | return | -| Switch.cs:102:5:109:5 | {...} | Switch.cs:106:21:106:29 | return ...; | return | -| Switch.cs:102:5:109:5 | {...} | Switch.cs:108:9:108:18 | return ...; | return | -| Switch.cs:103:9:107:9 | switch (...) {...} | Switch.cs:105:21:105:29 | return ...; | return | -| Switch.cs:103:9:107:9 | switch (...) {...} | Switch.cs:106:18:106:18 | 1 | no-match | -| Switch.cs:103:9:107:9 | switch (...) {...} | Switch.cs:106:21:106:29 | return ...; | return | -| Switch.cs:103:17:103:17 | access to parameter s | Switch.cs:103:17:103:17 | access to parameter s | non-null | -| Switch.cs:103:17:103:17 | access to parameter s | Switch.cs:103:17:103:17 | access to parameter s | null | -| Switch.cs:103:17:103:25 | access to property Length | Switch.cs:103:17:103:17 | access to parameter s | null | -| Switch.cs:103:17:103:25 | access to property Length | Switch.cs:103:17:103:25 | access to property Length | normal | -| Switch.cs:105:13:105:19 | case ...: | Switch.cs:105:18:105:18 | 0 | no-match | -| Switch.cs:105:13:105:19 | case ...: | Switch.cs:105:21:105:29 | return ...; | return | -| Switch.cs:105:18:105:18 | 0 | Switch.cs:105:18:105:18 | 0 | match | -| Switch.cs:105:18:105:18 | 0 | Switch.cs:105:18:105:18 | 0 | no-match | -| Switch.cs:105:21:105:29 | return ...; | Switch.cs:105:21:105:29 | return ...; | return | -| Switch.cs:105:28:105:28 | 0 | Switch.cs:105:28:105:28 | 0 | normal | -| Switch.cs:106:13:106:19 | case ...: | Switch.cs:106:18:106:18 | 1 | no-match | -| Switch.cs:106:13:106:19 | case ...: | Switch.cs:106:21:106:29 | return ...; | return | -| Switch.cs:106:18:106:18 | 1 | Switch.cs:106:18:106:18 | 1 | match | -| Switch.cs:106:18:106:18 | 1 | Switch.cs:106:18:106:18 | 1 | no-match | -| Switch.cs:106:21:106:29 | return ...; | Switch.cs:106:21:106:29 | return ...; | return | -| Switch.cs:106:28:106:28 | 1 | Switch.cs:106:28:106:28 | 1 | normal | -| Switch.cs:108:9:108:18 | return ...; | Switch.cs:108:9:108:18 | return ...; | return | -| Switch.cs:108:16:108:17 | -... | Switch.cs:108:16:108:17 | -... | normal | -| Switch.cs:108:17:108:17 | 1 | Switch.cs:108:17:108:17 | 1 | normal | -| Switch.cs:111:28:111:48 | throw ... | Switch.cs:111:28:111:48 | throw ... | throw(Exception) | -| Switch.cs:111:34:111:48 | object creation of type Exception | Switch.cs:111:34:111:48 | object creation of type Exception | normal | -| Switch.cs:114:5:121:5 | {...} | Switch.cs:117:37:117:45 | return ...; | return | -| Switch.cs:114:5:121:5 | {...} | Switch.cs:118:36:118:44 | return ...; | return | -| Switch.cs:114:5:121:5 | {...} | Switch.cs:120:9:120:18 | return ...; | return | -| Switch.cs:115:9:119:9 | switch (...) {...} | Switch.cs:117:37:117:45 | return ...; | return | -| Switch.cs:115:9:119:9 | switch (...) {...} | Switch.cs:118:18:118:18 | 2 | no-match | -| Switch.cs:115:9:119:9 | switch (...) {...} | Switch.cs:118:25:118:33 | ... == ... | false | -| Switch.cs:115:9:119:9 | switch (...) {...} | Switch.cs:118:36:118:44 | return ...; | return | -| Switch.cs:115:17:115:17 | access to parameter s | Switch.cs:115:17:115:17 | access to parameter s | normal | -| Switch.cs:115:17:115:24 | access to property Length | Switch.cs:115:17:115:24 | access to property Length | normal | -| Switch.cs:117:13:117:35 | case ...: | Switch.cs:117:18:117:18 | 3 | no-match | -| Switch.cs:117:13:117:35 | case ...: | Switch.cs:117:25:117:34 | ... == ... | false | -| Switch.cs:117:13:117:35 | case ...: | Switch.cs:117:37:117:45 | return ...; | return | -| Switch.cs:117:18:117:18 | 3 | Switch.cs:117:18:117:18 | 3 | match | -| Switch.cs:117:18:117:18 | 3 | Switch.cs:117:18:117:18 | 3 | no-match | -| Switch.cs:117:25:117:25 | access to parameter s | Switch.cs:117:25:117:25 | access to parameter s | normal | -| Switch.cs:117:25:117:34 | ... == ... | Switch.cs:117:25:117:34 | ... == ... | false | -| Switch.cs:117:25:117:34 | ... == ... | Switch.cs:117:25:117:34 | ... == ... | true | -| Switch.cs:117:30:117:34 | "foo" | Switch.cs:117:30:117:34 | "foo" | normal | -| Switch.cs:117:37:117:45 | return ...; | Switch.cs:117:37:117:45 | return ...; | return | -| Switch.cs:117:44:117:44 | 1 | Switch.cs:117:44:117:44 | 1 | normal | -| Switch.cs:118:13:118:34 | case ...: | Switch.cs:118:18:118:18 | 2 | no-match | -| Switch.cs:118:13:118:34 | case ...: | Switch.cs:118:25:118:33 | ... == ... | false | -| Switch.cs:118:13:118:34 | case ...: | Switch.cs:118:36:118:44 | return ...; | return | -| Switch.cs:118:18:118:18 | 2 | Switch.cs:118:18:118:18 | 2 | match | -| Switch.cs:118:18:118:18 | 2 | Switch.cs:118:18:118:18 | 2 | no-match | -| Switch.cs:118:25:118:25 | access to parameter s | Switch.cs:118:25:118:25 | access to parameter s | normal | -| Switch.cs:118:25:118:33 | ... == ... | Switch.cs:118:25:118:33 | ... == ... | false | -| Switch.cs:118:25:118:33 | ... == ... | Switch.cs:118:25:118:33 | ... == ... | true | -| Switch.cs:118:30:118:33 | "fu" | Switch.cs:118:30:118:33 | "fu" | normal | -| Switch.cs:118:36:118:44 | return ...; | Switch.cs:118:36:118:44 | return ...; | return | -| Switch.cs:118:43:118:43 | 2 | Switch.cs:118:43:118:43 | 2 | normal | -| Switch.cs:120:9:120:18 | return ...; | Switch.cs:120:9:120:18 | return ...; | return | -| Switch.cs:120:16:120:17 | -... | Switch.cs:120:16:120:17 | -... | normal | -| Switch.cs:120:17:120:17 | 1 | Switch.cs:120:17:120:17 | 1 | normal | -| Switch.cs:124:5:127:5 | {...} | Switch.cs:125:13:125:48 | ... switch { ... } | false | -| Switch.cs:124:5:127:5 | {...} | Switch.cs:126:13:126:19 | return ...; | return | -| Switch.cs:125:9:126:19 | if (...) ... | Switch.cs:125:13:125:48 | ... switch { ... } | false | -| Switch.cs:125:9:126:19 | if (...) ... | Switch.cs:126:13:126:19 | return ...; | return | -| Switch.cs:125:13:125:13 | access to parameter o | Switch.cs:125:13:125:13 | access to parameter o | normal | -| Switch.cs:125:13:125:48 | ... switch { ... } | Switch.cs:125:13:125:48 | ... switch { ... } | false | -| Switch.cs:125:13:125:48 | ... switch { ... } | Switch.cs:125:13:125:48 | ... switch { ... } | true | -| Switch.cs:125:24:125:29 | Boolean b | Switch.cs:125:24:125:29 | Boolean b | match | -| Switch.cs:125:24:125:29 | Boolean b | Switch.cs:125:24:125:29 | Boolean b | no-match | -| Switch.cs:125:24:125:34 | ... => ... | Switch.cs:125:24:125:34 | ... => ... | false | -| Switch.cs:125:24:125:34 | ... => ... | Switch.cs:125:24:125:34 | ... => ... | true | -| Switch.cs:125:34:125:34 | access to local variable b | Switch.cs:125:34:125:34 | access to local variable b | false | -| Switch.cs:125:34:125:34 | access to local variable b | Switch.cs:125:34:125:34 | access to local variable b | true | -| Switch.cs:125:37:125:37 | _ | Switch.cs:125:37:125:37 | _ | match | -| Switch.cs:125:37:125:46 | ... => ... | Switch.cs:125:37:125:46 | ... => ... | false | -| Switch.cs:125:37:125:46 | ... => ... | Switch.cs:125:37:125:46 | ... => ... | true | -| Switch.cs:125:42:125:46 | false | Switch.cs:125:42:125:46 | false | false | -| Switch.cs:126:13:126:19 | return ...; | Switch.cs:126:13:126:19 | return ...; | return | -| Switch.cs:130:5:132:5 | {...} | Switch.cs:131:9:131:67 | return ...; | return | -| Switch.cs:131:9:131:67 | return ...; | Switch.cs:131:9:131:67 | return ...; | return | -| Switch.cs:131:16:131:66 | call to method ToString | Switch.cs:131:16:131:66 | call to method ToString | normal | -| Switch.cs:131:16:131:66 | call to method ToString | Switch.cs:131:17:131:53 | ... switch { ... } | null | -| Switch.cs:131:17:131:17 | access to parameter o | Switch.cs:131:17:131:17 | access to parameter o | normal | -| Switch.cs:131:17:131:53 | ... switch { ... } | Switch.cs:131:17:131:53 | ... switch { ... } | non-null | -| Switch.cs:131:17:131:53 | ... switch { ... } | Switch.cs:131:17:131:53 | ... switch { ... } | null | -| Switch.cs:131:28:131:35 | String s | Switch.cs:131:28:131:35 | String s | match | -| Switch.cs:131:28:131:35 | String s | Switch.cs:131:28:131:35 | String s | no-match | -| Switch.cs:131:28:131:40 | ... => ... | Switch.cs:131:28:131:40 | ... => ... | non-null | -| Switch.cs:131:28:131:40 | ... => ... | Switch.cs:131:28:131:40 | ... => ... | null | -| Switch.cs:131:40:131:40 | access to local variable s | Switch.cs:131:40:131:40 | access to local variable s | non-null | -| Switch.cs:131:40:131:40 | access to local variable s | Switch.cs:131:40:131:40 | access to local variable s | null | -| Switch.cs:131:43:131:43 | _ | Switch.cs:131:43:131:43 | _ | match | -| Switch.cs:131:43:131:51 | ... => ... | Switch.cs:131:43:131:51 | ... => ... | non-null | -| Switch.cs:131:43:131:51 | ... => ... | Switch.cs:131:43:131:51 | ... => ... | null | -| Switch.cs:131:48:131:51 | null | Switch.cs:131:48:131:51 | null | null | -| Switch.cs:135:5:142:5 | {...} | Switch.cs:138:22:138:31 | return ...; | return | -| Switch.cs:135:5:142:5 | {...} | Switch.cs:139:21:139:29 | return ...; | return | -| Switch.cs:135:5:142:5 | {...} | Switch.cs:140:21:140:29 | return ...; | return | -| Switch.cs:136:9:141:9 | switch (...) {...} | Switch.cs:138:22:138:31 | return ...; | return | -| Switch.cs:136:9:141:9 | switch (...) {...} | Switch.cs:139:21:139:29 | return ...; | return | -| Switch.cs:136:9:141:9 | switch (...) {...} | Switch.cs:140:21:140:29 | return ...; | return | -| Switch.cs:136:17:136:17 | access to parameter i | Switch.cs:136:17:136:17 | access to parameter i | normal | -| Switch.cs:138:13:138:20 | default: | Switch.cs:138:22:138:31 | return ...; | return | -| Switch.cs:138:22:138:31 | return ...; | Switch.cs:138:22:138:31 | return ...; | return | -| Switch.cs:138:29:138:30 | -... | Switch.cs:138:29:138:30 | -... | normal | -| Switch.cs:138:30:138:30 | 1 | Switch.cs:138:30:138:30 | 1 | normal | -| Switch.cs:139:13:139:19 | case ...: | Switch.cs:139:18:139:18 | 1 | no-match | -| Switch.cs:139:13:139:19 | case ...: | Switch.cs:139:21:139:29 | return ...; | return | -| Switch.cs:139:18:139:18 | 1 | Switch.cs:139:18:139:18 | 1 | match | -| Switch.cs:139:18:139:18 | 1 | Switch.cs:139:18:139:18 | 1 | no-match | -| Switch.cs:139:21:139:29 | return ...; | Switch.cs:139:21:139:29 | return ...; | return | -| Switch.cs:139:28:139:28 | 1 | Switch.cs:139:28:139:28 | 1 | normal | -| Switch.cs:140:13:140:19 | case ...: | Switch.cs:140:18:140:18 | 2 | no-match | -| Switch.cs:140:13:140:19 | case ...: | Switch.cs:140:21:140:29 | return ...; | return | -| Switch.cs:140:18:140:18 | 2 | Switch.cs:140:18:140:18 | 2 | match | -| Switch.cs:140:18:140:18 | 2 | Switch.cs:140:18:140:18 | 2 | no-match | -| Switch.cs:140:21:140:29 | return ...; | Switch.cs:140:21:140:29 | return ...; | return | -| Switch.cs:140:28:140:28 | 2 | Switch.cs:140:28:140:28 | 2 | normal | -| Switch.cs:145:5:152:5 | {...} | Switch.cs:148:21:148:29 | return ...; | return | -| Switch.cs:145:5:152:5 | {...} | Switch.cs:149:22:149:31 | return ...; | return | -| Switch.cs:145:5:152:5 | {...} | Switch.cs:150:21:150:29 | return ...; | return | -| Switch.cs:146:9:151:9 | switch (...) {...} | Switch.cs:148:21:148:29 | return ...; | return | -| Switch.cs:146:9:151:9 | switch (...) {...} | Switch.cs:149:22:149:31 | return ...; | return | -| Switch.cs:146:9:151:9 | switch (...) {...} | Switch.cs:150:21:150:29 | return ...; | return | -| Switch.cs:146:17:146:17 | access to parameter i | Switch.cs:146:17:146:17 | access to parameter i | normal | -| Switch.cs:148:13:148:19 | case ...: | Switch.cs:148:18:148:18 | 1 | no-match | -| Switch.cs:148:13:148:19 | case ...: | Switch.cs:148:21:148:29 | return ...; | return | -| Switch.cs:148:18:148:18 | 1 | Switch.cs:148:18:148:18 | 1 | match | -| Switch.cs:148:18:148:18 | 1 | Switch.cs:148:18:148:18 | 1 | no-match | -| Switch.cs:148:21:148:29 | return ...; | Switch.cs:148:21:148:29 | return ...; | return | -| Switch.cs:148:28:148:28 | 1 | Switch.cs:148:28:148:28 | 1 | normal | -| Switch.cs:149:13:149:20 | default: | Switch.cs:149:22:149:31 | return ...; | return | -| Switch.cs:149:22:149:31 | return ...; | Switch.cs:149:22:149:31 | return ...; | return | -| Switch.cs:149:29:149:30 | -... | Switch.cs:149:29:149:30 | -... | normal | -| Switch.cs:149:30:149:30 | 1 | Switch.cs:149:30:149:30 | 1 | normal | -| Switch.cs:150:13:150:19 | case ...: | Switch.cs:150:18:150:18 | 2 | no-match | -| Switch.cs:150:13:150:19 | case ...: | Switch.cs:150:21:150:29 | return ...; | return | -| Switch.cs:150:18:150:18 | 2 | Switch.cs:150:18:150:18 | 2 | match | -| Switch.cs:150:18:150:18 | 2 | Switch.cs:150:18:150:18 | 2 | no-match | -| Switch.cs:150:21:150:29 | return ...; | Switch.cs:150:21:150:29 | return ...; | return | -| Switch.cs:150:28:150:28 | 2 | Switch.cs:150:28:150:28 | 2 | normal | -| Switch.cs:155:5:161:5 | {...} | Switch.cs:156:41:156:45 | false | throw(InvalidOperationException) [no-match] (0) | -| Switch.cs:155:5:161:5 | {...} | Switch.cs:158:13:158:48 | call to method WriteLine | normal | -| Switch.cs:155:5:161:5 | {...} | Switch.cs:160:13:160:48 | call to method WriteLine | normal | -| Switch.cs:156:9:156:55 | ... ...; | Switch.cs:156:13:156:54 | String s = ... | normal | -| Switch.cs:156:9:156:55 | ... ...; | Switch.cs:156:41:156:45 | false | throw(InvalidOperationException) [no-match] (0) | -| Switch.cs:156:13:156:54 | String s = ... | Switch.cs:156:13:156:54 | String s = ... | normal | -| Switch.cs:156:13:156:54 | String s = ... | Switch.cs:156:41:156:45 | false | throw(InvalidOperationException) [no-match] (0) | -| Switch.cs:156:17:156:17 | access to parameter b | Switch.cs:156:17:156:17 | access to parameter b | normal | -| Switch.cs:156:17:156:54 | ... switch { ... } | Switch.cs:156:17:156:54 | ... switch { ... } | normal | -| Switch.cs:156:17:156:54 | ... switch { ... } | Switch.cs:156:41:156:45 | false | throw(InvalidOperationException) [no-match] (0) | -| Switch.cs:156:28:156:31 | true | Switch.cs:156:28:156:31 | true | match | -| Switch.cs:156:28:156:31 | true | Switch.cs:156:28:156:31 | true | no-match | -| Switch.cs:156:28:156:38 | ... => ... | Switch.cs:156:28:156:38 | ... => ... | normal | -| Switch.cs:156:36:156:38 | "a" | Switch.cs:156:36:156:38 | "a" | normal | -| Switch.cs:156:41:156:45 | false | Switch.cs:156:41:156:45 | false | match | -| Switch.cs:156:41:156:45 | false | Switch.cs:156:41:156:45 | false | no-match | -| Switch.cs:156:41:156:52 | ... => ... | Switch.cs:156:41:156:45 | false | throw(InvalidOperationException) [no-match] (0) | -| Switch.cs:156:41:156:52 | ... => ... | Switch.cs:156:41:156:52 | ... => ... | normal | -| Switch.cs:156:50:156:52 | "b" | Switch.cs:156:50:156:52 | "b" | normal | -| Switch.cs:157:9:160:49 | if (...) ... | Switch.cs:158:13:158:48 | call to method WriteLine | normal | -| Switch.cs:157:9:160:49 | if (...) ... | Switch.cs:160:13:160:48 | call to method WriteLine | normal | -| Switch.cs:157:13:157:13 | access to parameter b | Switch.cs:157:13:157:13 | access to parameter b | false | -| Switch.cs:157:13:157:13 | access to parameter b | Switch.cs:157:13:157:13 | access to parameter b | true | -| Switch.cs:158:13:158:48 | call to method WriteLine | Switch.cs:158:13:158:48 | call to method WriteLine | normal | -| Switch.cs:158:13:158:49 | ...; | Switch.cs:158:13:158:48 | call to method WriteLine | normal | -| Switch.cs:158:38:158:47 | $"..." | Switch.cs:158:38:158:47 | $"..." | normal | -| Switch.cs:158:40:158:43 | "a = " | Switch.cs:158:40:158:43 | "a = " | normal | -| Switch.cs:158:44:158:46 | {...} | Switch.cs:158:44:158:46 | {...} | normal | -| Switch.cs:158:45:158:45 | access to local variable s | Switch.cs:158:45:158:45 | access to local variable s | normal | -| Switch.cs:160:13:160:48 | call to method WriteLine | Switch.cs:160:13:160:48 | call to method WriteLine | normal | -| Switch.cs:160:13:160:49 | ...; | Switch.cs:160:13:160:48 | call to method WriteLine | normal | -| Switch.cs:160:38:160:47 | $"..." | Switch.cs:160:38:160:47 | $"..." | normal | -| Switch.cs:160:40:160:43 | "b = " | Switch.cs:160:40:160:43 | "b = " | normal | -| Switch.cs:160:44:160:46 | {...} | Switch.cs:160:44:160:46 | {...} | normal | -| Switch.cs:160:45:160:45 | access to local variable s | Switch.cs:160:45:160:45 | access to local variable s | normal | -| Switch.cs:164:5:178:5 | {...} | Switch.cs:170:17:170:22 | break; | normal [break] (0) | -| Switch.cs:164:5:178:5 | {...} | Switch.cs:173:17:173:22 | break; | normal [break] (0) | -| Switch.cs:164:5:178:5 | {...} | Switch.cs:176:17:176:22 | break; | normal [break] (0) | -| Switch.cs:165:9:177:9 | switch (...) {...} | Switch.cs:170:17:170:22 | break; | normal [break] (0) | -| Switch.cs:165:9:177:9 | switch (...) {...} | Switch.cs:173:17:173:22 | break; | normal [break] (0) | -| Switch.cs:165:9:177:9 | switch (...) {...} | Switch.cs:176:17:176:22 | break; | normal [break] (0) | -| Switch.cs:165:17:165:17 | access to parameter i | Switch.cs:165:17:165:17 | access to parameter i | normal | -| Switch.cs:167:13:167:19 | case ...: | Switch.cs:167:18:167:18 | 1 | no-match | -| Switch.cs:167:13:167:19 | case ...: | Switch.cs:169:17:169:50 | call to method WriteLine | normal | -| Switch.cs:167:18:167:18 | 1 | Switch.cs:167:18:167:18 | 1 | match | -| Switch.cs:167:18:167:18 | 1 | Switch.cs:167:18:167:18 | 1 | no-match | -| Switch.cs:168:13:168:19 | case ...: | Switch.cs:168:18:168:18 | 2 | no-match | -| Switch.cs:168:13:168:19 | case ...: | Switch.cs:169:17:169:50 | call to method WriteLine | normal | -| Switch.cs:168:18:168:18 | 2 | Switch.cs:168:18:168:18 | 2 | match | -| Switch.cs:168:18:168:18 | 2 | Switch.cs:168:18:168:18 | 2 | no-match | -| Switch.cs:169:17:169:50 | call to method WriteLine | Switch.cs:169:17:169:50 | call to method WriteLine | normal | -| Switch.cs:169:17:169:51 | ...; | Switch.cs:169:17:169:50 | call to method WriteLine | normal | -| Switch.cs:169:42:169:49 | "1 or 2" | Switch.cs:169:42:169:49 | "1 or 2" | normal | -| Switch.cs:170:17:170:22 | break; | Switch.cs:170:17:170:22 | break; | break | -| Switch.cs:171:13:171:19 | case ...: | Switch.cs:171:18:171:18 | 3 | no-match | -| Switch.cs:171:13:171:19 | case ...: | Switch.cs:172:17:172:45 | call to method WriteLine | normal | -| Switch.cs:171:18:171:18 | 3 | Switch.cs:171:18:171:18 | 3 | match | -| Switch.cs:171:18:171:18 | 3 | Switch.cs:171:18:171:18 | 3 | no-match | -| Switch.cs:172:17:172:45 | call to method WriteLine | Switch.cs:172:17:172:45 | call to method WriteLine | normal | -| Switch.cs:172:17:172:46 | ...; | Switch.cs:172:17:172:45 | call to method WriteLine | normal | -| Switch.cs:172:42:172:44 | "3" | Switch.cs:172:42:172:44 | "3" | normal | -| Switch.cs:173:17:173:22 | break; | Switch.cs:173:17:173:22 | break; | break | -| Switch.cs:174:13:174:20 | default: | Switch.cs:175:17:175:47 | call to method WriteLine | normal | -| Switch.cs:175:17:175:47 | call to method WriteLine | Switch.cs:175:17:175:47 | call to method WriteLine | normal | -| Switch.cs:175:17:175:48 | ...; | Switch.cs:175:17:175:47 | call to method WriteLine | normal | -| Switch.cs:175:42:175:46 | "def" | Switch.cs:175:42:175:46 | "def" | normal | -| Switch.cs:176:17:176:22 | break; | Switch.cs:176:17:176:22 | break; | break | -| TypeAccesses.cs:1:7:1:18 | call to constructor Object | TypeAccesses.cs:1:7:1:18 | call to constructor Object | normal | -| TypeAccesses.cs:1:7:1:18 | call to method | TypeAccesses.cs:1:7:1:18 | call to method | normal | -| TypeAccesses.cs:1:7:1:18 | this access | TypeAccesses.cs:1:7:1:18 | this access | normal | -| TypeAccesses.cs:1:7:1:18 | {...} | TypeAccesses.cs:1:7:1:18 | {...} | normal | -| TypeAccesses.cs:4:5:9:5 | {...} | TypeAccesses.cs:8:13:8:27 | Type t = ... | normal | -| TypeAccesses.cs:5:9:5:26 | ... ...; | TypeAccesses.cs:5:13:5:25 | String s = ... | normal | -| TypeAccesses.cs:5:13:5:25 | String s = ... | TypeAccesses.cs:5:13:5:25 | String s = ... | normal | -| TypeAccesses.cs:5:17:5:25 | (...) ... | TypeAccesses.cs:5:17:5:25 | (...) ... | normal | -| TypeAccesses.cs:5:25:5:25 | access to parameter o | TypeAccesses.cs:5:25:5:25 | access to parameter o | normal | -| TypeAccesses.cs:6:9:6:23 | ... = ... | TypeAccesses.cs:6:9:6:23 | ... = ... | normal | -| TypeAccesses.cs:6:9:6:24 | ...; | TypeAccesses.cs:6:9:6:23 | ... = ... | normal | -| TypeAccesses.cs:6:13:6:13 | access to parameter o | TypeAccesses.cs:6:13:6:13 | access to parameter o | normal | -| TypeAccesses.cs:6:13:6:23 | ... as ... | TypeAccesses.cs:6:13:6:23 | ... as ... | normal | -| TypeAccesses.cs:7:9:7:25 | if (...) ... | TypeAccesses.cs:7:13:7:22 | ... is ... | false | -| TypeAccesses.cs:7:9:7:25 | if (...) ... | TypeAccesses.cs:7:25:7:25 | ; | normal | -| TypeAccesses.cs:7:13:7:13 | access to parameter o | TypeAccesses.cs:7:13:7:13 | access to parameter o | normal | -| TypeAccesses.cs:7:13:7:22 | ... is ... | TypeAccesses.cs:7:13:7:22 | ... is ... | false | -| TypeAccesses.cs:7:13:7:22 | ... is ... | TypeAccesses.cs:7:13:7:22 | ... is ... | true | -| TypeAccesses.cs:7:18:7:22 | Int32 j | TypeAccesses.cs:7:18:7:22 | Int32 j | match | -| TypeAccesses.cs:7:18:7:22 | Int32 j | TypeAccesses.cs:7:18:7:22 | Int32 j | no-match | -| TypeAccesses.cs:7:25:7:25 | ; | TypeAccesses.cs:7:25:7:25 | ; | normal | -| TypeAccesses.cs:8:9:8:28 | ... ...; | TypeAccesses.cs:8:13:8:27 | Type t = ... | normal | -| TypeAccesses.cs:8:13:8:27 | Type t = ... | TypeAccesses.cs:8:13:8:27 | Type t = ... | normal | -| TypeAccesses.cs:8:17:8:27 | typeof(...) | TypeAccesses.cs:8:17:8:27 | typeof(...) | normal | -| VarDecls.cs:3:7:3:14 | call to constructor Object | VarDecls.cs:3:7:3:14 | call to constructor Object | normal | -| VarDecls.cs:3:7:3:14 | call to method | VarDecls.cs:3:7:3:14 | call to method | normal | -| VarDecls.cs:3:7:3:14 | this access | VarDecls.cs:3:7:3:14 | this access | normal | -| VarDecls.cs:3:7:3:14 | {...} | VarDecls.cs:3:7:3:14 | {...} | normal | -| VarDecls.cs:6:5:11:5 | {...} | VarDecls.cs:9:13:9:29 | return ...; | return | -| VarDecls.cs:7:9:10:9 | fixed(...) { ... } | VarDecls.cs:9:13:9:29 | return ...; | return | -| VarDecls.cs:7:22:7:36 | Char* c1 = ... | VarDecls.cs:7:22:7:36 | Char* c1 = ... | normal | -| VarDecls.cs:7:27:7:33 | access to parameter strings | VarDecls.cs:7:27:7:33 | access to parameter strings | normal | -| VarDecls.cs:7:27:7:36 | (...) ... | VarDecls.cs:7:27:7:36 | (...) ... | normal | -| VarDecls.cs:7:27:7:36 | access to array element | VarDecls.cs:7:27:7:36 | access to array element | normal | -| VarDecls.cs:7:35:7:35 | 0 | VarDecls.cs:7:35:7:35 | 0 | normal | -| VarDecls.cs:7:39:7:53 | Char* c2 = ... | VarDecls.cs:7:39:7:53 | Char* c2 = ... | normal | -| VarDecls.cs:7:44:7:50 | access to parameter strings | VarDecls.cs:7:44:7:50 | access to parameter strings | normal | -| VarDecls.cs:7:44:7:53 | (...) ... | VarDecls.cs:7:44:7:53 | (...) ... | normal | -| VarDecls.cs:7:44:7:53 | access to array element | VarDecls.cs:7:44:7:53 | access to array element | normal | -| VarDecls.cs:7:52:7:52 | 1 | VarDecls.cs:7:52:7:52 | 1 | normal | -| VarDecls.cs:8:9:10:9 | {...} | VarDecls.cs:9:13:9:29 | return ...; | return | -| VarDecls.cs:9:13:9:29 | return ...; | VarDecls.cs:9:13:9:29 | return ...; | return | -| VarDecls.cs:9:20:9:28 | (...) ... | VarDecls.cs:9:20:9:28 | (...) ... | normal | -| VarDecls.cs:9:27:9:28 | access to local variable c1 | VarDecls.cs:9:27:9:28 | access to local variable c1 | normal | -| VarDecls.cs:14:5:17:5 | {...} | VarDecls.cs:16:9:16:23 | return ...; | return | -| VarDecls.cs:15:9:15:30 | ... ...; | VarDecls.cs:15:24:15:29 | String s2 = ... | normal | -| VarDecls.cs:15:16:15:21 | String s1 = ... | VarDecls.cs:15:16:15:21 | String s1 = ... | normal | -| VarDecls.cs:15:21:15:21 | access to parameter s | VarDecls.cs:15:21:15:21 | access to parameter s | normal | -| VarDecls.cs:15:24:15:29 | String s2 = ... | VarDecls.cs:15:24:15:29 | String s2 = ... | normal | -| VarDecls.cs:15:29:15:29 | access to parameter s | VarDecls.cs:15:29:15:29 | access to parameter s | normal | -| VarDecls.cs:16:9:16:23 | return ...; | VarDecls.cs:16:9:16:23 | return ...; | return | -| VarDecls.cs:16:16:16:17 | access to local variable s1 | VarDecls.cs:16:16:16:17 | access to local variable s1 | normal | -| VarDecls.cs:16:16:16:22 | ... + ... | VarDecls.cs:16:16:16:22 | ... + ... | normal | -| VarDecls.cs:16:21:16:22 | access to local variable s2 | VarDecls.cs:16:21:16:22 | access to local variable s2 | normal | -| VarDecls.cs:20:5:26:5 | {...} | VarDecls.cs:25:13:25:29 | return ...; | return | -| VarDecls.cs:21:9:22:13 | using (...) {...} | VarDecls.cs:22:13:22:13 | ; | normal | -| VarDecls.cs:21:16:21:22 | object creation of type C | VarDecls.cs:21:16:21:22 | object creation of type C | normal | -| VarDecls.cs:22:13:22:13 | ; | VarDecls.cs:22:13:22:13 | ; | normal | -| VarDecls.cs:24:9:25:29 | using (...) {...} | VarDecls.cs:25:13:25:29 | return ...; | return | -| VarDecls.cs:24:18:24:28 | C x = ... | VarDecls.cs:24:18:24:28 | C x = ... | normal | -| VarDecls.cs:24:22:24:28 | object creation of type C | VarDecls.cs:24:22:24:28 | object creation of type C | normal | -| VarDecls.cs:24:31:24:41 | C y = ... | VarDecls.cs:24:31:24:41 | C y = ... | normal | -| VarDecls.cs:24:35:24:41 | object creation of type C | VarDecls.cs:24:35:24:41 | object creation of type C | normal | -| VarDecls.cs:25:13:25:29 | return ...; | VarDecls.cs:25:13:25:29 | return ...; | return | -| VarDecls.cs:25:20:25:20 | access to parameter b | VarDecls.cs:25:20:25:20 | access to parameter b | false | -| VarDecls.cs:25:20:25:20 | access to parameter b | VarDecls.cs:25:20:25:20 | access to parameter b | true | -| VarDecls.cs:25:20:25:28 | ... ? ... : ... | VarDecls.cs:25:20:25:28 | ... ? ... : ... | normal | -| VarDecls.cs:25:24:25:24 | access to local variable x | VarDecls.cs:25:24:25:24 | access to local variable x | normal | -| VarDecls.cs:25:28:25:28 | access to local variable y | VarDecls.cs:25:28:25:28 | access to local variable y | normal | -| VarDecls.cs:28:11:28:11 | call to constructor Object | VarDecls.cs:28:11:28:11 | call to constructor Object | normal | -| VarDecls.cs:28:11:28:11 | call to method | VarDecls.cs:28:11:28:11 | call to method | normal | -| VarDecls.cs:28:11:28:11 | this access | VarDecls.cs:28:11:28:11 | this access | normal | -| VarDecls.cs:28:11:28:11 | {...} | VarDecls.cs:28:11:28:11 | {...} | normal | -| VarDecls.cs:28:51:28:53 | {...} | VarDecls.cs:28:51:28:53 | {...} | normal | -| cflow.cs:6:5:35:5 | {...} | cflow.cs:24:25:24:31 | ... <= ... | false | -| cflow.cs:7:9:7:28 | ... ...; | cflow.cs:7:13:7:27 | Int32 a = ... | normal | -| cflow.cs:7:13:7:27 | Int32 a = ... | cflow.cs:7:13:7:27 | Int32 a = ... | normal | -| cflow.cs:7:17:7:20 | access to parameter args | cflow.cs:7:17:7:20 | access to parameter args | normal | -| cflow.cs:7:17:7:27 | access to property Length | cflow.cs:7:17:7:27 | access to property Length | normal | -| cflow.cs:9:9:9:39 | ... = ... | cflow.cs:9:9:9:39 | ... = ... | normal | -| cflow.cs:9:9:9:40 | ...; | cflow.cs:9:9:9:39 | ... = ... | normal | -| cflow.cs:9:13:9:29 | object creation of type ControlFlow | cflow.cs:9:13:9:29 | object creation of type ControlFlow | normal | -| cflow.cs:9:13:9:39 | call to method Switch | cflow.cs:9:13:9:39 | call to method Switch | normal | -| cflow.cs:9:38:9:38 | access to local variable a | cflow.cs:9:38:9:38 | access to local variable a | normal | -| cflow.cs:11:9:12:49 | if (...) ... | cflow.cs:11:13:11:17 | ... > ... | false | -| cflow.cs:11:9:12:49 | if (...) ... | cflow.cs:12:13:12:48 | call to method WriteLine | normal | -| cflow.cs:11:13:11:13 | access to local variable a | cflow.cs:11:13:11:13 | access to local variable a | normal | -| cflow.cs:11:13:11:17 | ... > ... | cflow.cs:11:13:11:17 | ... > ... | false | -| cflow.cs:11:13:11:17 | ... > ... | cflow.cs:11:13:11:17 | ... > ... | true | -| cflow.cs:11:17:11:17 | 3 | cflow.cs:11:17:11:17 | 3 | normal | -| cflow.cs:12:13:12:48 | call to method WriteLine | cflow.cs:12:13:12:48 | call to method WriteLine | normal | -| cflow.cs:12:13:12:49 | ...; | cflow.cs:12:13:12:48 | call to method WriteLine | normal | -| cflow.cs:12:31:12:47 | "more than a few" | cflow.cs:12:31:12:47 | "more than a few" | normal | -| cflow.cs:14:9:17:9 | while (...) ... | cflow.cs:14:16:14:20 | ... > ... | false | -| cflow.cs:14:16:14:16 | access to local variable a | cflow.cs:14:16:14:16 | access to local variable a | normal | -| cflow.cs:14:16:14:20 | ... > ... | cflow.cs:14:16:14:20 | ... > ... | false | -| cflow.cs:14:16:14:20 | ... > ... | cflow.cs:14:16:14:20 | ... > ... | true | -| cflow.cs:14:20:14:20 | 0 | cflow.cs:14:20:14:20 | 0 | normal | -| cflow.cs:15:9:17:9 | {...} | cflow.cs:16:13:16:40 | call to method WriteLine | normal | -| cflow.cs:16:13:16:40 | call to method WriteLine | cflow.cs:16:13:16:40 | call to method WriteLine | normal | -| cflow.cs:16:13:16:41 | ...; | cflow.cs:16:13:16:40 | call to method WriteLine | normal | -| cflow.cs:16:31:16:31 | access to local variable a | cflow.cs:16:31:16:31 | access to local variable a | normal | -| cflow.cs:16:31:16:33 | ...-- | cflow.cs:16:31:16:33 | ...-- | normal | -| cflow.cs:16:31:16:39 | ... * ... | cflow.cs:16:31:16:39 | ... * ... | normal | -| cflow.cs:16:37:16:39 | 100 | cflow.cs:16:37:16:39 | 100 | normal | -| cflow.cs:19:9:22:25 | do ... while (...); | cflow.cs:22:18:22:23 | ... < ... | false | -| cflow.cs:20:9:22:9 | {...} | cflow.cs:21:13:21:35 | call to method WriteLine | normal | -| cflow.cs:21:13:21:35 | call to method WriteLine | cflow.cs:21:13:21:35 | call to method WriteLine | normal | -| cflow.cs:21:13:21:36 | ...; | cflow.cs:21:13:21:35 | call to method WriteLine | normal | -| cflow.cs:21:31:21:34 | -... | cflow.cs:21:31:21:34 | -... | normal | -| cflow.cs:21:32:21:32 | access to local variable a | cflow.cs:21:32:21:32 | access to local variable a | normal | -| cflow.cs:21:32:21:34 | ...++ | cflow.cs:21:32:21:34 | ...++ | normal | -| cflow.cs:22:18:22:18 | access to local variable a | cflow.cs:22:18:22:18 | access to local variable a | normal | -| cflow.cs:22:18:22:23 | ... < ... | cflow.cs:22:18:22:23 | ... < ... | false | -| cflow.cs:22:18:22:23 | ... < ... | cflow.cs:22:18:22:23 | ... < ... | true | -| cflow.cs:22:22:22:23 | 10 | cflow.cs:22:22:22:23 | 10 | normal | -| cflow.cs:24:9:34:9 | for (...;...;...) ... | cflow.cs:24:25:24:31 | ... <= ... | false | -| cflow.cs:24:18:24:22 | Int32 i = ... | cflow.cs:24:18:24:22 | Int32 i = ... | normal | -| cflow.cs:24:22:24:22 | 1 | cflow.cs:24:22:24:22 | 1 | normal | -| cflow.cs:24:25:24:25 | access to local variable i | cflow.cs:24:25:24:25 | access to local variable i | normal | -| cflow.cs:24:25:24:31 | ... <= ... | cflow.cs:24:25:24:31 | ... <= ... | false | -| cflow.cs:24:25:24:31 | ... <= ... | cflow.cs:24:25:24:31 | ... <= ... | true | -| cflow.cs:24:30:24:31 | 20 | cflow.cs:24:30:24:31 | 20 | normal | -| cflow.cs:24:34:24:34 | access to local variable i | cflow.cs:24:34:24:34 | access to local variable i | normal | -| cflow.cs:24:34:24:36 | ...++ | cflow.cs:24:34:24:36 | ...++ | normal | -| cflow.cs:25:9:34:9 | {...} | cflow.cs:27:17:27:45 | call to method WriteLine | normal | -| cflow.cs:25:9:34:9 | {...} | cflow.cs:29:17:29:41 | call to method WriteLine | normal | -| cflow.cs:25:9:34:9 | {...} | cflow.cs:31:17:31:41 | call to method WriteLine | normal | -| cflow.cs:25:9:34:9 | {...} | cflow.cs:33:17:33:36 | call to method WriteLine | normal | -| cflow.cs:26:13:33:37 | if (...) ... | cflow.cs:27:17:27:45 | call to method WriteLine | normal | -| cflow.cs:26:13:33:37 | if (...) ... | cflow.cs:29:17:29:41 | call to method WriteLine | normal | -| cflow.cs:26:13:33:37 | if (...) ... | cflow.cs:31:17:31:41 | call to method WriteLine | normal | -| cflow.cs:26:13:33:37 | if (...) ... | cflow.cs:33:17:33:36 | call to method WriteLine | normal | -| cflow.cs:26:17:26:17 | access to local variable i | cflow.cs:26:17:26:17 | access to local variable i | normal | -| cflow.cs:26:17:26:21 | ... % ... | cflow.cs:26:17:26:21 | ... % ... | normal | -| cflow.cs:26:17:26:26 | ... == ... | cflow.cs:26:17:26:26 | ... == ... | false | -| cflow.cs:26:17:26:26 | ... == ... | cflow.cs:26:17:26:26 | ... == ... | true | -| cflow.cs:26:17:26:40 | ... && ... | cflow.cs:26:17:26:40 | ... && ... | false | -| cflow.cs:26:17:26:40 | ... && ... | cflow.cs:26:17:26:40 | ... && ... | true | -| cflow.cs:26:21:26:21 | 3 | cflow.cs:26:21:26:21 | 3 | normal | -| cflow.cs:26:26:26:26 | 0 | cflow.cs:26:26:26:26 | 0 | normal | -| cflow.cs:26:31:26:31 | access to local variable i | cflow.cs:26:31:26:31 | access to local variable i | normal | -| cflow.cs:26:31:26:35 | ... % ... | cflow.cs:26:31:26:35 | ... % ... | normal | -| cflow.cs:26:31:26:40 | ... == ... | cflow.cs:26:31:26:40 | ... == ... | false | -| cflow.cs:26:31:26:40 | ... == ... | cflow.cs:26:31:26:40 | ... == ... | true | -| cflow.cs:26:35:26:35 | 5 | cflow.cs:26:35:26:35 | 5 | normal | -| cflow.cs:26:40:26:40 | 0 | cflow.cs:26:40:26:40 | 0 | normal | -| cflow.cs:27:17:27:45 | call to method WriteLine | cflow.cs:27:17:27:45 | call to method WriteLine | normal | -| cflow.cs:27:17:27:46 | ...; | cflow.cs:27:17:27:45 | call to method WriteLine | normal | -| cflow.cs:27:35:27:44 | "FizzBuzz" | cflow.cs:27:35:27:44 | "FizzBuzz" | normal | -| cflow.cs:28:18:33:37 | if (...) ... | cflow.cs:29:17:29:41 | call to method WriteLine | normal | -| cflow.cs:28:18:33:37 | if (...) ... | cflow.cs:31:17:31:41 | call to method WriteLine | normal | -| cflow.cs:28:18:33:37 | if (...) ... | cflow.cs:33:17:33:36 | call to method WriteLine | normal | -| cflow.cs:28:22:28:22 | access to local variable i | cflow.cs:28:22:28:22 | access to local variable i | normal | -| cflow.cs:28:22:28:26 | ... % ... | cflow.cs:28:22:28:26 | ... % ... | normal | -| cflow.cs:28:22:28:31 | ... == ... | cflow.cs:28:22:28:31 | ... == ... | false | -| cflow.cs:28:22:28:31 | ... == ... | cflow.cs:28:22:28:31 | ... == ... | true | -| cflow.cs:28:26:28:26 | 3 | cflow.cs:28:26:28:26 | 3 | normal | -| cflow.cs:28:31:28:31 | 0 | cflow.cs:28:31:28:31 | 0 | normal | -| cflow.cs:29:17:29:41 | call to method WriteLine | cflow.cs:29:17:29:41 | call to method WriteLine | normal | -| cflow.cs:29:17:29:42 | ...; | cflow.cs:29:17:29:41 | call to method WriteLine | normal | -| cflow.cs:29:35:29:40 | "Fizz" | cflow.cs:29:35:29:40 | "Fizz" | normal | -| cflow.cs:30:18:33:37 | if (...) ... | cflow.cs:31:17:31:41 | call to method WriteLine | normal | -| cflow.cs:30:18:33:37 | if (...) ... | cflow.cs:33:17:33:36 | call to method WriteLine | normal | -| cflow.cs:30:22:30:22 | access to local variable i | cflow.cs:30:22:30:22 | access to local variable i | normal | -| cflow.cs:30:22:30:26 | ... % ... | cflow.cs:30:22:30:26 | ... % ... | normal | -| cflow.cs:30:22:30:31 | ... == ... | cflow.cs:30:22:30:31 | ... == ... | false | -| cflow.cs:30:22:30:31 | ... == ... | cflow.cs:30:22:30:31 | ... == ... | true | -| cflow.cs:30:26:30:26 | 5 | cflow.cs:30:26:30:26 | 5 | normal | -| cflow.cs:30:31:30:31 | 0 | cflow.cs:30:31:30:31 | 0 | normal | -| cflow.cs:31:17:31:41 | call to method WriteLine | cflow.cs:31:17:31:41 | call to method WriteLine | normal | -| cflow.cs:31:17:31:42 | ...; | cflow.cs:31:17:31:41 | call to method WriteLine | normal | -| cflow.cs:31:35:31:40 | "Buzz" | cflow.cs:31:35:31:40 | "Buzz" | normal | -| cflow.cs:33:17:33:36 | call to method WriteLine | cflow.cs:33:17:33:36 | call to method WriteLine | normal | -| cflow.cs:33:17:33:37 | ...; | cflow.cs:33:17:33:36 | call to method WriteLine | normal | -| cflow.cs:33:35:33:35 | access to local variable i | cflow.cs:33:35:33:35 | access to local variable i | normal | -| cflow.cs:38:5:68:5 | {...} | cflow.cs:64:21:64:55 | throw ...; | throw(NullReferenceException) | -| cflow.cs:38:5:68:5 | {...} | cflow.cs:67:9:67:17 | return ...; | return | -| cflow.cs:39:9:50:9 | switch (...) {...} | cflow.cs:47:18:47:18 | 3 | no-match | -| cflow.cs:39:9:50:9 | switch (...) {...} | cflow.cs:49:17:49:22 | break; | normal [break] (0) | -| cflow.cs:39:17:39:17 | access to parameter a | cflow.cs:39:17:39:17 | access to parameter a | normal | -| cflow.cs:41:13:41:19 | case ...: | cflow.cs:41:18:41:18 | 1 | no-match | -| cflow.cs:41:13:41:19 | case ...: | cflow.cs:42:17:42:38 | call to method WriteLine | normal | -| cflow.cs:41:18:41:18 | 1 | cflow.cs:41:18:41:18 | 1 | match | -| cflow.cs:41:18:41:18 | 1 | cflow.cs:41:18:41:18 | 1 | no-match | -| cflow.cs:42:17:42:38 | call to method WriteLine | cflow.cs:42:17:42:38 | call to method WriteLine | normal | -| cflow.cs:42:17:42:39 | ...; | cflow.cs:42:17:42:38 | call to method WriteLine | normal | -| cflow.cs:42:35:42:37 | "1" | cflow.cs:42:35:42:37 | "1" | normal | -| cflow.cs:43:17:43:28 | goto case ...; | cflow.cs:43:17:43:28 | goto case ...; | goto(2) | -| cflow.cs:43:27:43:27 | 2 | cflow.cs:43:27:43:27 | 2 | normal | -| cflow.cs:44:13:44:19 | case ...: | cflow.cs:44:18:44:18 | 2 | no-match | -| cflow.cs:44:13:44:19 | case ...: | cflow.cs:45:17:45:38 | call to method WriteLine | normal | -| cflow.cs:44:18:44:18 | 2 | cflow.cs:44:18:44:18 | 2 | match | -| cflow.cs:44:18:44:18 | 2 | cflow.cs:44:18:44:18 | 2 | no-match | -| cflow.cs:45:17:45:38 | call to method WriteLine | cflow.cs:45:17:45:38 | call to method WriteLine | normal | -| cflow.cs:45:17:45:39 | ...; | cflow.cs:45:17:45:38 | call to method WriteLine | normal | -| cflow.cs:45:35:45:37 | "2" | cflow.cs:45:35:45:37 | "2" | normal | -| cflow.cs:46:17:46:28 | goto case ...; | cflow.cs:46:17:46:28 | goto case ...; | goto(1) | -| cflow.cs:46:27:46:27 | 1 | cflow.cs:46:27:46:27 | 1 | normal | -| cflow.cs:47:13:47:19 | case ...: | cflow.cs:47:18:47:18 | 3 | no-match | -| cflow.cs:47:13:47:19 | case ...: | cflow.cs:48:17:48:38 | call to method WriteLine | normal | -| cflow.cs:47:18:47:18 | 3 | cflow.cs:47:18:47:18 | 3 | match | -| cflow.cs:47:18:47:18 | 3 | cflow.cs:47:18:47:18 | 3 | no-match | -| cflow.cs:48:17:48:38 | call to method WriteLine | cflow.cs:48:17:48:38 | call to method WriteLine | normal | -| cflow.cs:48:17:48:39 | ...; | cflow.cs:48:17:48:38 | call to method WriteLine | normal | -| cflow.cs:48:35:48:37 | "3" | cflow.cs:48:35:48:37 | "3" | normal | -| cflow.cs:49:17:49:22 | break; | cflow.cs:49:17:49:22 | break; | break | -| cflow.cs:51:9:59:9 | switch (...) {...} | cflow.cs:55:17:55:22 | break; | normal [break] (0) | -| cflow.cs:51:9:59:9 | switch (...) {...} | cflow.cs:58:17:58:22 | break; | normal [break] (0) | -| cflow.cs:51:17:51:17 | access to parameter a | cflow.cs:51:17:51:17 | access to parameter a | normal | -| cflow.cs:53:13:53:20 | case ...: | cflow.cs:53:18:53:19 | 42 | no-match | -| cflow.cs:53:13:53:20 | case ...: | cflow.cs:54:17:54:47 | call to method WriteLine | normal | -| cflow.cs:53:18:53:19 | 42 | cflow.cs:53:18:53:19 | 42 | match | -| cflow.cs:53:18:53:19 | 42 | cflow.cs:53:18:53:19 | 42 | no-match | -| cflow.cs:54:17:54:47 | call to method WriteLine | cflow.cs:54:17:54:47 | call to method WriteLine | normal | -| cflow.cs:54:17:54:48 | ...; | cflow.cs:54:17:54:47 | call to method WriteLine | normal | -| cflow.cs:54:35:54:46 | "The answer" | cflow.cs:54:35:54:46 | "The answer" | normal | -| cflow.cs:55:17:55:22 | break; | cflow.cs:55:17:55:22 | break; | break | -| cflow.cs:56:13:56:20 | default: | cflow.cs:57:17:57:51 | call to method WriteLine | normal | -| cflow.cs:57:17:57:51 | call to method WriteLine | cflow.cs:57:17:57:51 | call to method WriteLine | normal | -| cflow.cs:57:17:57:52 | ...; | cflow.cs:57:17:57:51 | call to method WriteLine | normal | -| cflow.cs:57:35:57:50 | "Not the answer" | cflow.cs:57:35:57:50 | "Not the answer" | normal | -| cflow.cs:58:17:58:22 | break; | cflow.cs:58:17:58:22 | break; | break | -| cflow.cs:60:9:66:9 | switch (...) {...} | cflow.cs:62:18:62:18 | 0 | no-match | -| cflow.cs:60:9:66:9 | switch (...) {...} | cflow.cs:64:21:64:55 | throw ...; | throw(NullReferenceException) | -| cflow.cs:60:9:66:9 | switch (...) {...} | cflow.cs:65:17:65:22 | break; | normal [break] (0) | -| cflow.cs:60:17:60:32 | call to method Parse | cflow.cs:60:17:60:32 | call to method Parse | normal | -| cflow.cs:60:27:60:31 | access to field Field | cflow.cs:60:27:60:31 | access to field Field | normal | -| cflow.cs:60:27:60:31 | this access | cflow.cs:60:27:60:31 | this access | normal | -| cflow.cs:62:13:62:19 | case ...: | cflow.cs:62:18:62:18 | 0 | no-match | -| cflow.cs:62:13:62:19 | case ...: | cflow.cs:63:21:63:34 | !... | false | -| cflow.cs:62:13:62:19 | case ...: | cflow.cs:64:21:64:55 | throw ...; | throw(NullReferenceException) | -| cflow.cs:62:18:62:18 | 0 | cflow.cs:62:18:62:18 | 0 | match | -| cflow.cs:62:18:62:18 | 0 | cflow.cs:62:18:62:18 | 0 | no-match | -| cflow.cs:63:17:64:55 | if (...) ... | cflow.cs:63:21:63:34 | !... | false | -| cflow.cs:63:17:64:55 | if (...) ... | cflow.cs:64:21:64:55 | throw ...; | throw(NullReferenceException) | -| cflow.cs:63:21:63:34 | !... | cflow.cs:63:21:63:34 | !... | false | -| cflow.cs:63:21:63:34 | !... | cflow.cs:63:21:63:34 | !... | true | -| cflow.cs:63:23:63:27 | access to field Field | cflow.cs:63:23:63:27 | access to field Field | normal | -| cflow.cs:63:23:63:27 | this access | cflow.cs:63:23:63:27 | this access | normal | -| cflow.cs:63:23:63:33 | ... == ... | cflow.cs:63:23:63:33 | ... == ... | false | -| cflow.cs:63:23:63:33 | ... == ... | cflow.cs:63:23:63:33 | ... == ... | true | -| cflow.cs:63:32:63:33 | "" | cflow.cs:63:32:63:33 | "" | normal | -| cflow.cs:64:21:64:55 | throw ...; | cflow.cs:64:21:64:55 | throw ...; | throw(NullReferenceException) | -| cflow.cs:64:27:64:54 | object creation of type NullReferenceException | cflow.cs:64:27:64:54 | object creation of type NullReferenceException | normal | -| cflow.cs:65:17:65:22 | break; | cflow.cs:65:17:65:22 | break; | break | -| cflow.cs:67:9:67:17 | return ...; | cflow.cs:67:9:67:17 | return ...; | return | -| cflow.cs:67:16:67:16 | access to parameter a | cflow.cs:67:16:67:16 | access to parameter a | normal | -| cflow.cs:71:5:82:5 | {...} | cflow.cs:73:13:73:19 | return ...; | return | -| cflow.cs:71:5:82:5 | {...} | cflow.cs:76:13:76:32 | call to method WriteLine | normal | -| cflow.cs:71:5:82:5 | {...} | cflow.cs:80:13:80:47 | call to method WriteLine | normal | -| cflow.cs:72:9:73:19 | if (...) ... | cflow.cs:72:13:72:21 | ... == ... | false | -| cflow.cs:72:9:73:19 | if (...) ... | cflow.cs:73:13:73:19 | return ...; | return | -| cflow.cs:72:13:72:13 | access to parameter s | cflow.cs:72:13:72:13 | access to parameter s | normal | -| cflow.cs:72:13:72:21 | ... == ... | cflow.cs:72:13:72:21 | ... == ... | false | -| cflow.cs:72:13:72:21 | ... == ... | cflow.cs:72:13:72:21 | ... == ... | true | -| cflow.cs:72:18:72:21 | null | cflow.cs:72:18:72:21 | null | normal | -| cflow.cs:73:13:73:19 | return ...; | cflow.cs:73:13:73:19 | return ...; | return | -| cflow.cs:74:9:81:9 | if (...) ... | cflow.cs:76:13:76:32 | call to method WriteLine | normal | -| cflow.cs:74:9:81:9 | if (...) ... | cflow.cs:80:13:80:47 | call to method WriteLine | normal | -| cflow.cs:74:13:74:13 | access to parameter s | cflow.cs:74:13:74:13 | access to parameter s | normal | -| cflow.cs:74:13:74:20 | access to property Length | cflow.cs:74:13:74:20 | access to property Length | normal | -| cflow.cs:74:13:74:24 | ... > ... | cflow.cs:74:13:74:24 | ... > ... | false | -| cflow.cs:74:13:74:24 | ... > ... | cflow.cs:74:13:74:24 | ... > ... | true | -| cflow.cs:74:24:74:24 | 0 | cflow.cs:74:24:74:24 | 0 | normal | -| cflow.cs:75:9:77:9 | {...} | cflow.cs:76:13:76:32 | call to method WriteLine | normal | -| cflow.cs:76:13:76:32 | call to method WriteLine | cflow.cs:76:13:76:32 | call to method WriteLine | normal | -| cflow.cs:76:13:76:33 | ...; | cflow.cs:76:13:76:32 | call to method WriteLine | normal | -| cflow.cs:76:31:76:31 | access to parameter s | cflow.cs:76:31:76:31 | access to parameter s | normal | -| cflow.cs:79:9:81:9 | {...} | cflow.cs:80:13:80:47 | call to method WriteLine | normal | -| cflow.cs:80:13:80:47 | call to method WriteLine | cflow.cs:80:13:80:47 | call to method WriteLine | normal | -| cflow.cs:80:13:80:48 | ...; | cflow.cs:80:13:80:47 | call to method WriteLine | normal | -| cflow.cs:80:31:80:46 | "" | cflow.cs:80:31:80:46 | "" | normal | -| cflow.cs:85:5:88:5 | {...} | cflow.cs:86:13:86:37 | ... && ... | false | -| cflow.cs:85:5:88:5 | {...} | cflow.cs:87:13:87:32 | call to method WriteLine | normal | -| cflow.cs:86:9:87:33 | if (...) ... | cflow.cs:86:13:86:37 | ... && ... | false | -| cflow.cs:86:9:87:33 | if (...) ... | cflow.cs:87:13:87:32 | call to method WriteLine | normal | -| cflow.cs:86:13:86:13 | access to parameter s | cflow.cs:86:13:86:13 | access to parameter s | normal | -| cflow.cs:86:13:86:21 | ... != ... | cflow.cs:86:13:86:21 | ... != ... | false | -| cflow.cs:86:13:86:21 | ... != ... | cflow.cs:86:13:86:21 | ... != ... | true | -| cflow.cs:86:13:86:37 | ... && ... | cflow.cs:86:13:86:37 | ... && ... | false | -| cflow.cs:86:13:86:37 | ... && ... | cflow.cs:86:13:86:37 | ... && ... | true | -| cflow.cs:86:18:86:21 | null | cflow.cs:86:18:86:21 | null | normal | -| cflow.cs:86:26:86:26 | access to parameter s | cflow.cs:86:26:86:26 | access to parameter s | normal | -| cflow.cs:86:26:86:33 | access to property Length | cflow.cs:86:26:86:33 | access to property Length | normal | -| cflow.cs:86:26:86:37 | ... > ... | cflow.cs:86:26:86:37 | ... > ... | false | -| cflow.cs:86:26:86:37 | ... > ... | cflow.cs:86:26:86:37 | ... > ... | true | -| cflow.cs:86:37:86:37 | 0 | cflow.cs:86:37:86:37 | 0 | normal | -| cflow.cs:87:13:87:32 | call to method WriteLine | cflow.cs:87:13:87:32 | call to method WriteLine | normal | -| cflow.cs:87:13:87:33 | ...; | cflow.cs:87:13:87:32 | call to method WriteLine | normal | -| cflow.cs:87:31:87:31 | access to parameter s | cflow.cs:87:31:87:31 | access to parameter s | normal | -| cflow.cs:91:5:104:5 | {...} | cflow.cs:93:13:93:49 | throw ...; | throw(ArgumentNullException) | -| cflow.cs:91:5:104:5 | {...} | cflow.cs:102:13:102:29 | ... != ... | false | -| cflow.cs:91:5:104:5 | {...} | cflow.cs:103:13:103:35 | call to method WriteLine | normal | -| cflow.cs:92:9:93:49 | if (...) ... | cflow.cs:92:13:92:27 | call to method Equals | false | -| cflow.cs:92:9:93:49 | if (...) ... | cflow.cs:93:13:93:49 | throw ...; | throw(ArgumentNullException) | -| cflow.cs:92:13:92:27 | call to method Equals | cflow.cs:92:13:92:27 | call to method Equals | false | -| cflow.cs:92:13:92:27 | call to method Equals | cflow.cs:92:13:92:27 | call to method Equals | true | -| cflow.cs:92:20:92:20 | access to parameter s | cflow.cs:92:20:92:20 | access to parameter s | normal | -| cflow.cs:92:23:92:26 | null | cflow.cs:92:23:92:26 | null | normal | -| cflow.cs:93:13:93:49 | throw ...; | cflow.cs:93:13:93:49 | throw ...; | throw(ArgumentNullException) | -| cflow.cs:93:19:93:48 | object creation of type ArgumentNullException | cflow.cs:93:19:93:48 | object creation of type ArgumentNullException | normal | -| cflow.cs:93:45:93:47 | "s" | cflow.cs:93:45:93:47 | "s" | normal | -| cflow.cs:94:9:94:28 | call to method WriteLine | cflow.cs:94:9:94:28 | call to method WriteLine | normal | -| cflow.cs:94:9:94:29 | ...; | cflow.cs:94:9:94:28 | call to method WriteLine | normal | -| cflow.cs:94:27:94:27 | access to parameter s | cflow.cs:94:27:94:27 | access to parameter s | normal | -| cflow.cs:96:9:97:55 | if (...) ... | cflow.cs:96:13:96:25 | ... != ... | false | -| cflow.cs:96:9:97:55 | if (...) ... | cflow.cs:97:13:97:54 | call to method WriteLine | normal | -| cflow.cs:96:13:96:17 | access to field Field | cflow.cs:96:13:96:17 | access to field Field | normal | -| cflow.cs:96:13:96:17 | this access | cflow.cs:96:13:96:17 | this access | normal | -| cflow.cs:96:13:96:25 | ... != ... | cflow.cs:96:13:96:25 | ... != ... | false | -| cflow.cs:96:13:96:25 | ... != ... | cflow.cs:96:13:96:25 | ... != ... | true | -| cflow.cs:96:22:96:25 | null | cflow.cs:96:22:96:25 | null | normal | -| cflow.cs:97:13:97:54 | call to method WriteLine | cflow.cs:97:13:97:54 | call to method WriteLine | normal | -| cflow.cs:97:13:97:55 | ...; | cflow.cs:97:13:97:54 | call to method WriteLine | normal | -| cflow.cs:97:31:97:47 | object creation of type ControlFlow | cflow.cs:97:31:97:47 | object creation of type ControlFlow | normal | -| cflow.cs:97:31:97:53 | access to field Field | cflow.cs:97:31:97:53 | access to field Field | normal | -| cflow.cs:99:9:100:42 | if (...) ... | cflow.cs:99:13:99:25 | ... != ... | false | -| cflow.cs:99:9:100:42 | if (...) ... | cflow.cs:100:13:100:41 | call to method WriteLine | normal | -| cflow.cs:99:13:99:17 | access to field Field | cflow.cs:99:13:99:17 | access to field Field | normal | -| cflow.cs:99:13:99:17 | this access | cflow.cs:99:13:99:17 | this access | normal | -| cflow.cs:99:13:99:25 | ... != ... | cflow.cs:99:13:99:25 | ... != ... | false | -| cflow.cs:99:13:99:25 | ... != ... | cflow.cs:99:13:99:25 | ... != ... | true | -| cflow.cs:99:22:99:25 | null | cflow.cs:99:22:99:25 | null | normal | -| cflow.cs:100:13:100:41 | call to method WriteLine | cflow.cs:100:13:100:41 | call to method WriteLine | normal | -| cflow.cs:100:13:100:42 | ...; | cflow.cs:100:13:100:41 | call to method WriteLine | normal | -| cflow.cs:100:31:100:34 | this access | cflow.cs:100:31:100:34 | this access | normal | -| cflow.cs:100:31:100:40 | access to field Field | cflow.cs:100:31:100:40 | access to field Field | normal | -| cflow.cs:102:9:103:36 | if (...) ... | cflow.cs:102:13:102:29 | ... != ... | false | -| cflow.cs:102:9:103:36 | if (...) ... | cflow.cs:103:13:103:35 | call to method WriteLine | normal | -| cflow.cs:102:13:102:16 | this access | cflow.cs:102:13:102:16 | this access | normal | -| cflow.cs:102:13:102:21 | access to property Prop | cflow.cs:102:13:102:21 | access to property Prop | normal | -| cflow.cs:102:13:102:29 | ... != ... | cflow.cs:102:13:102:29 | ... != ... | false | -| cflow.cs:102:13:102:29 | ... != ... | cflow.cs:102:13:102:29 | ... != ... | true | -| cflow.cs:102:26:102:29 | null | cflow.cs:102:26:102:29 | null | normal | -| cflow.cs:103:13:103:35 | call to method WriteLine | cflow.cs:103:13:103:35 | call to method WriteLine | normal | -| cflow.cs:103:13:103:36 | ...; | cflow.cs:103:13:103:35 | call to method WriteLine | normal | -| cflow.cs:103:31:103:34 | access to property Prop | cflow.cs:103:31:103:34 | access to property Prop | normal | -| cflow.cs:103:31:103:34 | this access | cflow.cs:103:31:103:34 | this access | normal | -| cflow.cs:107:5:117:5 | {...} | cflow.cs:116:9:116:28 | call to method WriteLine | normal | -| cflow.cs:108:9:115:9 | if (...) ... | cflow.cs:108:13:108:21 | ... != ... | false | -| cflow.cs:108:9:115:9 | if (...) ... | cflow.cs:114:13:114:32 | call to method WriteLine | normal | -| cflow.cs:108:13:108:13 | access to parameter s | cflow.cs:108:13:108:13 | access to parameter s | normal | -| cflow.cs:108:13:108:21 | ... != ... | cflow.cs:108:13:108:21 | ... != ... | false | -| cflow.cs:108:13:108:21 | ... != ... | cflow.cs:108:13:108:21 | ... != ... | true | -| cflow.cs:108:18:108:21 | null | cflow.cs:108:18:108:21 | null | normal | -| cflow.cs:109:9:115:9 | {...} | cflow.cs:114:13:114:32 | call to method WriteLine | normal | -| cflow.cs:110:20:110:23 | true | cflow.cs:110:20:110:23 | true | true | -| cflow.cs:111:13:113:13 | {...} | cflow.cs:112:17:112:36 | call to method WriteLine | normal | -| cflow.cs:112:17:112:36 | call to method WriteLine | cflow.cs:112:17:112:36 | call to method WriteLine | normal | -| cflow.cs:112:17:112:37 | ...; | cflow.cs:112:17:112:36 | call to method WriteLine | normal | -| cflow.cs:112:35:112:35 | access to parameter s | cflow.cs:112:35:112:35 | access to parameter s | normal | -| cflow.cs:114:13:114:32 | call to method WriteLine | cflow.cs:114:13:114:32 | call to method WriteLine | normal | -| cflow.cs:114:13:114:33 | ...; | cflow.cs:114:13:114:32 | call to method WriteLine | normal | -| cflow.cs:114:31:114:31 | access to parameter s | cflow.cs:114:31:114:31 | access to parameter s | normal | -| cflow.cs:116:9:116:28 | call to method WriteLine | cflow.cs:116:9:116:28 | call to method WriteLine | normal | -| cflow.cs:116:9:116:29 | ...; | cflow.cs:116:9:116:28 | call to method WriteLine | normal | -| cflow.cs:116:27:116:27 | access to parameter s | cflow.cs:116:27:116:27 | access to parameter s | normal | -| cflow.cs:120:5:124:5 | {...} | cflow.cs:123:9:123:17 | return ...; | return | -| cflow.cs:121:9:121:18 | ... ...; | cflow.cs:121:13:121:17 | String x = ... | normal | -| cflow.cs:121:13:121:17 | String x = ... | cflow.cs:121:13:121:17 | String x = ... | normal | -| cflow.cs:121:17:121:17 | access to parameter s | cflow.cs:121:17:121:17 | access to parameter s | normal | -| cflow.cs:122:9:122:19 | ... = ... | cflow.cs:122:9:122:19 | ... = ... | normal | -| cflow.cs:122:9:122:20 | ...; | cflow.cs:122:9:122:19 | ... = ... | normal | -| cflow.cs:122:13:122:13 | access to local variable x | cflow.cs:122:13:122:13 | access to local variable x | normal | -| cflow.cs:122:13:122:19 | ... + ... | cflow.cs:122:13:122:19 | ... + ... | normal | -| cflow.cs:122:17:122:19 | " " | cflow.cs:122:17:122:19 | " " | normal | -| cflow.cs:123:9:123:17 | return ...; | cflow.cs:123:9:123:17 | return ...; | return | -| cflow.cs:123:16:123:16 | access to local variable x | cflow.cs:123:16:123:16 | access to local variable x | normal | -| cflow.cs:127:23:127:60 | {...} | cflow.cs:127:25:127:58 | return ...; | return | -| cflow.cs:127:25:127:58 | return ...; | cflow.cs:127:25:127:58 | return ...; | return | -| cflow.cs:127:32:127:36 | access to field Field | cflow.cs:127:32:127:36 | access to field Field | normal | -| cflow.cs:127:32:127:36 | this access | cflow.cs:127:32:127:36 | this access | normal | -| cflow.cs:127:32:127:44 | ... == ... | cflow.cs:127:32:127:44 | ... == ... | false | -| cflow.cs:127:32:127:44 | ... == ... | cflow.cs:127:32:127:44 | ... == ... | true | -| cflow.cs:127:32:127:57 | ... ? ... : ... | cflow.cs:127:32:127:57 | ... ? ... : ... | normal | -| cflow.cs:127:41:127:44 | null | cflow.cs:127:41:127:44 | null | normal | -| cflow.cs:127:48:127:49 | "" | cflow.cs:127:48:127:49 | "" | normal | -| cflow.cs:127:53:127:57 | access to field Field | cflow.cs:127:53:127:57 | access to field Field | normal | -| cflow.cs:127:53:127:57 | this access | cflow.cs:127:53:127:57 | this access | normal | -| cflow.cs:127:66:127:83 | {...} | cflow.cs:127:68:127:80 | ... = ... | normal | -| cflow.cs:127:68:127:72 | access to field Field | cflow.cs:127:68:127:72 | this access | normal | -| cflow.cs:127:68:127:72 | this access | cflow.cs:127:68:127:72 | this access | normal | -| cflow.cs:127:68:127:80 | ... = ... | cflow.cs:127:68:127:80 | ... = ... | normal | -| cflow.cs:127:68:127:81 | ...; | cflow.cs:127:68:127:80 | ... = ... | normal | -| cflow.cs:127:76:127:80 | access to parameter value | cflow.cs:127:76:127:80 | access to parameter value | normal | -| cflow.cs:129:5:129:15 | call to constructor Object | cflow.cs:129:5:129:15 | call to constructor Object | normal | -| cflow.cs:129:5:129:15 | call to method | cflow.cs:129:5:129:15 | call to method | normal | -| cflow.cs:129:5:129:15 | this access | cflow.cs:129:5:129:15 | this access | normal | -| cflow.cs:130:5:132:5 | {...} | cflow.cs:131:9:131:17 | ... = ... | normal | -| cflow.cs:131:9:131:13 | access to field Field | cflow.cs:131:9:131:13 | this access | normal | -| cflow.cs:131:9:131:13 | this access | cflow.cs:131:9:131:13 | this access | normal | -| cflow.cs:131:9:131:17 | ... = ... | cflow.cs:131:9:131:17 | ... = ... | normal | -| cflow.cs:131:9:131:18 | ...; | cflow.cs:131:9:131:17 | ... = ... | normal | -| cflow.cs:131:17:131:17 | access to parameter s | cflow.cs:131:17:131:17 | access to parameter s | normal | -| cflow.cs:134:26:134:29 | call to constructor ControlFlow | cflow.cs:134:26:134:29 | call to constructor ControlFlow | normal | -| cflow.cs:134:31:134:31 | (...) ... | cflow.cs:134:31:134:31 | (...) ... | normal | -| cflow.cs:134:31:134:31 | access to parameter i | cflow.cs:134:31:134:31 | access to parameter i | normal | -| cflow.cs:134:31:134:36 | ... + ... | cflow.cs:134:31:134:36 | ... + ... | normal | -| cflow.cs:134:35:134:36 | "" | cflow.cs:134:35:134:36 | "" | normal | -| cflow.cs:134:39:134:41 | {...} | cflow.cs:134:39:134:41 | {...} | normal | -| cflow.cs:136:28:136:31 | call to constructor ControlFlow | cflow.cs:136:28:136:31 | call to constructor ControlFlow | normal | -| cflow.cs:136:33:136:33 | 0 | cflow.cs:136:33:136:33 | 0 | normal | -| cflow.cs:136:33:136:37 | ... + ... | cflow.cs:136:33:136:37 | ... + ... | normal | -| cflow.cs:136:37:136:37 | 1 | cflow.cs:136:37:136:37 | 1 | normal | -| cflow.cs:136:40:136:42 | {...} | cflow.cs:136:40:136:42 | {...} | normal | -| cflow.cs:139:5:142:5 | {...} | cflow.cs:141:9:141:17 | return ...; | return | -| cflow.cs:140:9:140:28 | call to method WriteLine | cflow.cs:140:9:140:28 | call to method WriteLine | normal | -| cflow.cs:140:9:140:29 | ...; | cflow.cs:140:9:140:28 | call to method WriteLine | normal | -| cflow.cs:140:27:140:27 | access to parameter x | cflow.cs:140:27:140:27 | access to parameter x | normal | -| cflow.cs:141:9:141:17 | return ...; | cflow.cs:141:9:141:17 | return ...; | return | -| cflow.cs:141:16:141:16 | access to parameter y | cflow.cs:141:16:141:16 | access to parameter y | normal | -| cflow.cs:144:37:144:54 | {...} | cflow.cs:144:39:144:52 | return ...; | return | -| cflow.cs:144:39:144:52 | return ...; | cflow.cs:144:39:144:52 | return ...; | return | -| cflow.cs:144:46:144:46 | (...) ... | cflow.cs:144:46:144:46 | (...) ... | normal | -| cflow.cs:144:46:144:46 | access to parameter i | cflow.cs:144:46:144:46 | access to parameter i | normal | -| cflow.cs:144:46:144:51 | ... + ... | cflow.cs:144:46:144:51 | ... + ... | normal | -| cflow.cs:144:50:144:51 | "" | cflow.cs:144:50:144:51 | "" | normal | -| cflow.cs:144:60:144:62 | {...} | cflow.cs:144:60:144:62 | {...} | normal | -| cflow.cs:147:5:177:5 | {...} | cflow.cs:173:32:173:41 | ... < ... | false | -| cflow.cs:148:9:148:18 | ... ...; | cflow.cs:148:13:148:17 | Int32 x = ... | normal | -| cflow.cs:148:13:148:17 | Int32 x = ... | cflow.cs:148:13:148:17 | Int32 x = ... | normal | -| cflow.cs:148:17:148:17 | 0 | cflow.cs:148:17:148:17 | 0 | normal | -| cflow.cs:149:9:150:33 | for (...;...;...) ... | cflow.cs:149:16:149:21 | ... < ... | false | -| cflow.cs:149:16:149:16 | access to local variable x | cflow.cs:149:16:149:16 | access to local variable x | normal | -| cflow.cs:149:16:149:21 | ... < ... | cflow.cs:149:16:149:21 | ... < ... | false | -| cflow.cs:149:16:149:21 | ... < ... | cflow.cs:149:16:149:21 | ... < ... | true | -| cflow.cs:149:20:149:21 | 10 | cflow.cs:149:20:149:21 | 10 | normal | -| cflow.cs:149:24:149:26 | ++... | cflow.cs:149:24:149:26 | ++... | normal | -| cflow.cs:149:26:149:26 | access to local variable x | cflow.cs:149:26:149:26 | access to local variable x | normal | -| cflow.cs:150:13:150:32 | call to method WriteLine | cflow.cs:150:13:150:32 | call to method WriteLine | normal | -| cflow.cs:150:13:150:33 | ...; | cflow.cs:150:13:150:32 | call to method WriteLine | normal | -| cflow.cs:150:31:150:31 | access to local variable x | cflow.cs:150:31:150:31 | access to local variable x | normal | -| cflow.cs:152:9:157:9 | for (...;...;...) ... | cflow.cs:156:17:156:22 | break; | normal [break] (0) | -| cflow.cs:152:18:152:18 | access to local variable x | cflow.cs:152:18:152:18 | access to local variable x | normal | -| cflow.cs:152:18:152:20 | ...++ | cflow.cs:152:18:152:20 | ...++ | normal | -| cflow.cs:153:9:157:9 | {...} | cflow.cs:155:17:155:22 | ... > ... | false | -| cflow.cs:153:9:157:9 | {...} | cflow.cs:156:17:156:22 | break; | break | -| cflow.cs:154:13:154:32 | call to method WriteLine | cflow.cs:154:13:154:32 | call to method WriteLine | normal | -| cflow.cs:154:13:154:33 | ...; | cflow.cs:154:13:154:32 | call to method WriteLine | normal | -| cflow.cs:154:31:154:31 | access to local variable x | cflow.cs:154:31:154:31 | access to local variable x | normal | -| cflow.cs:155:13:156:22 | if (...) ... | cflow.cs:155:17:155:22 | ... > ... | false | -| cflow.cs:155:13:156:22 | if (...) ... | cflow.cs:156:17:156:22 | break; | break | -| cflow.cs:155:17:155:17 | access to local variable x | cflow.cs:155:17:155:17 | access to local variable x | normal | -| cflow.cs:155:17:155:22 | ... > ... | cflow.cs:155:17:155:22 | ... > ... | false | -| cflow.cs:155:17:155:22 | ... > ... | cflow.cs:155:17:155:22 | ... > ... | true | -| cflow.cs:155:21:155:22 | 20 | cflow.cs:155:21:155:22 | 20 | normal | -| cflow.cs:156:17:156:22 | break; | cflow.cs:156:17:156:22 | break; | break | -| cflow.cs:159:9:165:9 | for (...;...;...) ... | cflow.cs:164:17:164:22 | break; | normal [break] (0) | -| cflow.cs:160:9:165:9 | {...} | cflow.cs:163:17:163:22 | ... > ... | false | -| cflow.cs:160:9:165:9 | {...} | cflow.cs:164:17:164:22 | break; | break | -| cflow.cs:161:13:161:32 | call to method WriteLine | cflow.cs:161:13:161:32 | call to method WriteLine | normal | -| cflow.cs:161:13:161:33 | ...; | cflow.cs:161:13:161:32 | call to method WriteLine | normal | -| cflow.cs:161:31:161:31 | access to local variable x | cflow.cs:161:31:161:31 | access to local variable x | normal | -| cflow.cs:162:13:162:13 | access to local variable x | cflow.cs:162:13:162:13 | access to local variable x | normal | -| cflow.cs:162:13:162:15 | ...++ | cflow.cs:162:13:162:15 | ...++ | normal | -| cflow.cs:162:13:162:16 | ...; | cflow.cs:162:13:162:15 | ...++ | normal | -| cflow.cs:163:13:164:22 | if (...) ... | cflow.cs:163:17:163:22 | ... > ... | false | -| cflow.cs:163:13:164:22 | if (...) ... | cflow.cs:164:17:164:22 | break; | break | -| cflow.cs:163:17:163:17 | access to local variable x | cflow.cs:163:17:163:17 | access to local variable x | normal | -| cflow.cs:163:17:163:22 | ... > ... | cflow.cs:163:17:163:22 | ... > ... | false | -| cflow.cs:163:17:163:22 | ... > ... | cflow.cs:163:17:163:22 | ... > ... | true | -| cflow.cs:163:21:163:22 | 30 | cflow.cs:163:21:163:22 | 30 | normal | -| cflow.cs:164:17:164:22 | break; | cflow.cs:164:17:164:22 | break; | break | -| cflow.cs:167:9:171:9 | for (...;...;...) ... | cflow.cs:167:16:167:21 | ... < ... | false | -| cflow.cs:167:16:167:16 | access to local variable x | cflow.cs:167:16:167:16 | access to local variable x | normal | -| cflow.cs:167:16:167:21 | ... < ... | cflow.cs:167:16:167:21 | ... < ... | false | -| cflow.cs:167:16:167:21 | ... < ... | cflow.cs:167:16:167:21 | ... < ... | true | -| cflow.cs:167:20:167:21 | 40 | cflow.cs:167:20:167:21 | 40 | normal | -| cflow.cs:168:9:171:9 | {...} | cflow.cs:170:13:170:15 | ...++ | normal | -| cflow.cs:169:13:169:32 | call to method WriteLine | cflow.cs:169:13:169:32 | call to method WriteLine | normal | -| cflow.cs:169:13:169:33 | ...; | cflow.cs:169:13:169:32 | call to method WriteLine | normal | -| cflow.cs:169:31:169:31 | access to local variable x | cflow.cs:169:31:169:31 | access to local variable x | normal | -| cflow.cs:170:13:170:13 | access to local variable x | cflow.cs:170:13:170:13 | access to local variable x | normal | -| cflow.cs:170:13:170:15 | ...++ | cflow.cs:170:13:170:15 | ...++ | normal | -| cflow.cs:170:13:170:16 | ...; | cflow.cs:170:13:170:15 | ...++ | normal | -| cflow.cs:173:9:176:9 | for (...;...;...) ... | cflow.cs:173:32:173:41 | ... < ... | false | -| cflow.cs:173:18:173:22 | Int32 i = ... | cflow.cs:173:18:173:22 | Int32 i = ... | normal | -| cflow.cs:173:22:173:22 | 0 | cflow.cs:173:22:173:22 | 0 | normal | -| cflow.cs:173:25:173:29 | Int32 j = ... | cflow.cs:173:25:173:29 | Int32 j = ... | normal | -| cflow.cs:173:29:173:29 | 0 | cflow.cs:173:29:173:29 | 0 | normal | -| cflow.cs:173:32:173:32 | access to local variable i | cflow.cs:173:32:173:32 | access to local variable i | normal | -| cflow.cs:173:32:173:36 | ... + ... | cflow.cs:173:32:173:36 | ... + ... | normal | -| cflow.cs:173:32:173:41 | ... < ... | cflow.cs:173:32:173:41 | ... < ... | false | -| cflow.cs:173:32:173:41 | ... < ... | cflow.cs:173:32:173:41 | ... < ... | true | -| cflow.cs:173:36:173:36 | access to local variable j | cflow.cs:173:36:173:36 | access to local variable j | normal | -| cflow.cs:173:40:173:41 | 10 | cflow.cs:173:40:173:41 | 10 | normal | -| cflow.cs:173:44:173:44 | access to local variable i | cflow.cs:173:44:173:44 | access to local variable i | normal | -| cflow.cs:173:44:173:46 | ...++ | cflow.cs:173:44:173:46 | ...++ | normal | -| cflow.cs:173:49:173:49 | access to local variable j | cflow.cs:173:49:173:49 | access to local variable j | normal | -| cflow.cs:173:49:173:51 | ...++ | cflow.cs:173:49:173:51 | ...++ | normal | -| cflow.cs:174:9:176:9 | {...} | cflow.cs:175:13:175:36 | call to method WriteLine | normal | -| cflow.cs:175:13:175:36 | call to method WriteLine | cflow.cs:175:13:175:36 | call to method WriteLine | normal | -| cflow.cs:175:13:175:37 | ...; | cflow.cs:175:13:175:36 | call to method WriteLine | normal | -| cflow.cs:175:31:175:31 | access to local variable i | cflow.cs:175:31:175:31 | access to local variable i | normal | -| cflow.cs:175:31:175:35 | ... + ... | cflow.cs:175:31:175:35 | ... + ... | normal | -| cflow.cs:175:35:175:35 | access to local variable j | cflow.cs:175:35:175:35 | access to local variable j | normal | -| cflow.cs:180:5:183:5 | {...} | cflow.cs:182:24:182:61 | Func z = ... | normal | -| cflow.cs:181:9:181:38 | ... ...; | cflow.cs:181:24:181:37 | Func y = ... | normal | -| cflow.cs:181:24:181:37 | Func y = ... | cflow.cs:181:24:181:37 | Func y = ... | normal | -| cflow.cs:181:28:181:37 | (...) => ... | cflow.cs:181:28:181:37 | (...) => ... | normal | -| cflow.cs:181:33:181:33 | access to parameter x | cflow.cs:181:33:181:33 | access to parameter x | normal | -| cflow.cs:181:33:181:37 | ... + ... | cflow.cs:181:33:181:37 | ... + ... | normal | -| cflow.cs:181:37:181:37 | 1 | cflow.cs:181:37:181:37 | 1 | normal | -| cflow.cs:182:9:182:62 | ... ...; | cflow.cs:182:24:182:61 | Func z = ... | normal | -| cflow.cs:182:24:182:61 | Func z = ... | cflow.cs:182:24:182:61 | Func z = ... | normal | -| cflow.cs:182:28:182:61 | delegate(...) { ... } | cflow.cs:182:28:182:61 | delegate(...) { ... } | normal | -| cflow.cs:182:45:182:61 | {...} | cflow.cs:182:47:182:59 | return ...; | return | -| cflow.cs:182:47:182:59 | return ...; | cflow.cs:182:47:182:59 | return ...; | return | -| cflow.cs:182:54:182:54 | access to parameter x | cflow.cs:182:54:182:54 | access to parameter x | normal | -| cflow.cs:182:54:182:58 | ... + ... | cflow.cs:182:54:182:58 | ... + ... | normal | -| cflow.cs:182:58:182:58 | 1 | cflow.cs:182:58:182:58 | 1 | normal | -| cflow.cs:186:5:191:5 | {...} | cflow.cs:188:13:188:54 | call to method WriteLine | normal | -| cflow.cs:186:5:191:5 | {...} | cflow.cs:190:13:190:51 | call to method WriteLine | normal | -| cflow.cs:187:9:190:52 | if (...) ... | cflow.cs:188:13:188:54 | call to method WriteLine | normal | -| cflow.cs:187:9:190:52 | if (...) ... | cflow.cs:190:13:190:51 | call to method WriteLine | normal | -| cflow.cs:187:13:187:13 | 1 | cflow.cs:187:13:187:13 | 1 | normal | -| cflow.cs:187:13:187:18 | ... == ... | cflow.cs:187:13:187:18 | ... == ... | false | -| cflow.cs:187:13:187:28 | ... \|\| ... | cflow.cs:187:13:187:28 | ... \|\| ... | false | -| cflow.cs:187:13:187:50 | ... \|\| ... | cflow.cs:187:13:187:50 | ... \|\| ... | false | -| cflow.cs:187:18:187:18 | 2 | cflow.cs:187:18:187:18 | 2 | normal | -| cflow.cs:187:23:187:23 | 2 | cflow.cs:187:23:187:23 | 2 | normal | -| cflow.cs:187:23:187:28 | ... == ... | cflow.cs:187:23:187:28 | ... == ... | false | -| cflow.cs:187:28:187:28 | 3 | cflow.cs:187:28:187:28 | 3 | normal | -| cflow.cs:187:34:187:34 | 1 | cflow.cs:187:34:187:34 | 1 | normal | -| cflow.cs:187:34:187:39 | ... == ... | cflow.cs:187:34:187:39 | ... == ... | false | -| cflow.cs:187:34:187:49 | ... && ... | cflow.cs:187:34:187:49 | ... && ... | false | -| cflow.cs:187:39:187:39 | 3 | cflow.cs:187:39:187:39 | 3 | normal | -| cflow.cs:187:44:187:44 | 3 | cflow.cs:187:44:187:44 | 3 | normal | -| cflow.cs:187:44:187:49 | ... == ... | cflow.cs:187:44:187:49 | ... == ... | false | -| cflow.cs:187:49:187:49 | 1 | cflow.cs:187:49:187:49 | 1 | normal | -| cflow.cs:188:13:188:54 | call to method WriteLine | cflow.cs:188:13:188:54 | call to method WriteLine | normal | -| cflow.cs:188:13:188:55 | ...; | cflow.cs:188:13:188:54 | call to method WriteLine | normal | -| cflow.cs:188:31:188:53 | "This shouldn't happen" | cflow.cs:188:31:188:53 | "This shouldn't happen" | normal | -| cflow.cs:190:13:190:51 | call to method WriteLine | cflow.cs:190:13:190:51 | call to method WriteLine | normal | -| cflow.cs:190:13:190:52 | ...; | cflow.cs:190:13:190:51 | call to method WriteLine | normal | -| cflow.cs:190:31:190:50 | "This should happen" | cflow.cs:190:31:190:50 | "This should happen" | normal | -| cflow.cs:194:5:206:5 | {...} | cflow.cs:200:13:200:62 | ... \|\| ... | false | -| cflow.cs:194:5:206:5 | {...} | cflow.cs:203:17:203:38 | throw ...; | throw(Exception) | -| cflow.cs:195:9:195:57 | ... ...; | cflow.cs:195:13:195:56 | Boolean b = ... | normal | -| cflow.cs:195:13:195:56 | Boolean b = ... | cflow.cs:195:13:195:56 | Boolean b = ... | normal | -| cflow.cs:195:17:195:21 | access to field Field | cflow.cs:195:17:195:21 | access to field Field | normal | -| cflow.cs:195:17:195:21 | this access | cflow.cs:195:17:195:21 | this access | normal | -| cflow.cs:195:17:195:28 | access to property Length | cflow.cs:195:17:195:28 | access to property Length | normal | -| cflow.cs:195:17:195:32 | ... > ... | cflow.cs:195:17:195:32 | ... > ... | false | -| cflow.cs:195:17:195:32 | ... > ... | cflow.cs:195:17:195:32 | ... > ... | true | -| cflow.cs:195:17:195:56 | ... && ... | cflow.cs:195:17:195:56 | ... && ... | normal | -| cflow.cs:195:32:195:32 | 0 | cflow.cs:195:32:195:32 | 0 | normal | -| cflow.cs:195:37:195:56 | !... | cflow.cs:195:37:195:56 | !... | normal | -| cflow.cs:195:39:195:43 | access to field Field | cflow.cs:195:39:195:43 | access to field Field | normal | -| cflow.cs:195:39:195:43 | this access | cflow.cs:195:39:195:43 | this access | normal | -| cflow.cs:195:39:195:50 | access to property Length | cflow.cs:195:39:195:50 | access to property Length | normal | -| cflow.cs:195:39:195:55 | ... == ... | cflow.cs:195:39:195:55 | ... == ... | normal | -| cflow.cs:195:55:195:55 | 1 | cflow.cs:195:55:195:55 | 1 | normal | -| cflow.cs:197:9:198:49 | if (...) ... | cflow.cs:197:13:197:47 | !... | false | -| cflow.cs:197:9:198:49 | if (...) ... | cflow.cs:198:13:198:48 | ... = ... | normal | -| cflow.cs:197:13:197:47 | !... | cflow.cs:197:13:197:47 | !... | false | -| cflow.cs:197:13:197:47 | !... | cflow.cs:197:13:197:47 | !... | true | -| cflow.cs:197:15:197:19 | access to field Field | cflow.cs:197:15:197:19 | access to field Field | normal | -| cflow.cs:197:15:197:19 | this access | cflow.cs:197:15:197:19 | this access | normal | -| cflow.cs:197:15:197:26 | access to property Length | cflow.cs:197:15:197:26 | access to property Length | normal | -| cflow.cs:197:15:197:31 | ... == ... | cflow.cs:197:15:197:31 | ... == ... | false | -| cflow.cs:197:15:197:31 | ... == ... | cflow.cs:197:15:197:31 | ... == ... | true | -| cflow.cs:197:15:197:46 | ... ? ... : ... | cflow.cs:197:15:197:46 | ... ? ... : ... | false | -| cflow.cs:197:15:197:46 | ... ? ... : ... | cflow.cs:197:15:197:46 | ... ? ... : ... | true | -| cflow.cs:197:31:197:31 | 0 | cflow.cs:197:31:197:31 | 0 | normal | -| cflow.cs:197:35:197:39 | false | cflow.cs:197:35:197:39 | false | false | -| cflow.cs:197:43:197:46 | true | cflow.cs:197:43:197:46 | true | true | -| cflow.cs:198:13:198:48 | ... = ... | cflow.cs:198:13:198:48 | ... = ... | normal | -| cflow.cs:198:13:198:49 | ...; | cflow.cs:198:13:198:48 | ... = ... | normal | -| cflow.cs:198:17:198:21 | access to field Field | cflow.cs:198:17:198:21 | access to field Field | normal | -| cflow.cs:198:17:198:21 | this access | cflow.cs:198:17:198:21 | this access | normal | -| cflow.cs:198:17:198:28 | access to property Length | cflow.cs:198:17:198:28 | access to property Length | normal | -| cflow.cs:198:17:198:33 | ... == ... | cflow.cs:198:17:198:33 | ... == ... | false | -| cflow.cs:198:17:198:33 | ... == ... | cflow.cs:198:17:198:33 | ... == ... | true | -| cflow.cs:198:17:198:48 | ... ? ... : ... | cflow.cs:198:17:198:48 | ... ? ... : ... | normal | -| cflow.cs:198:33:198:33 | 0 | cflow.cs:198:33:198:33 | 0 | normal | -| cflow.cs:198:37:198:41 | false | cflow.cs:198:37:198:41 | false | normal | -| cflow.cs:198:45:198:48 | true | cflow.cs:198:45:198:48 | true | normal | -| cflow.cs:200:9:205:9 | if (...) ... | cflow.cs:200:13:200:62 | ... \|\| ... | false | -| cflow.cs:200:9:205:9 | if (...) ... | cflow.cs:203:17:203:38 | throw ...; | throw(Exception) | -| cflow.cs:200:13:200:32 | !... | cflow.cs:200:13:200:32 | !... | false | -| cflow.cs:200:13:200:32 | !... | cflow.cs:200:13:200:32 | !... | true | -| cflow.cs:200:13:200:62 | ... \|\| ... | cflow.cs:200:13:200:62 | ... \|\| ... | false | -| cflow.cs:200:13:200:62 | ... \|\| ... | cflow.cs:200:13:200:62 | ... \|\| ... | true | -| cflow.cs:200:15:200:19 | access to field Field | cflow.cs:200:15:200:19 | access to field Field | normal | -| cflow.cs:200:15:200:19 | this access | cflow.cs:200:15:200:19 | this access | normal | -| cflow.cs:200:15:200:26 | access to property Length | cflow.cs:200:15:200:26 | access to property Length | normal | -| cflow.cs:200:15:200:31 | ... == ... | cflow.cs:200:15:200:31 | ... == ... | false | -| cflow.cs:200:15:200:31 | ... == ... | cflow.cs:200:15:200:31 | ... == ... | true | -| cflow.cs:200:31:200:31 | 0 | cflow.cs:200:31:200:31 | 0 | normal | -| cflow.cs:200:37:200:62 | !... | cflow.cs:200:37:200:62 | !... | false | -| cflow.cs:200:37:200:62 | !... | cflow.cs:200:37:200:62 | !... | true | -| cflow.cs:200:38:200:62 | !... | cflow.cs:200:38:200:62 | !... | false | -| cflow.cs:200:38:200:62 | !... | cflow.cs:200:38:200:62 | !... | true | -| cflow.cs:200:40:200:44 | access to field Field | cflow.cs:200:40:200:44 | access to field Field | normal | -| cflow.cs:200:40:200:44 | this access | cflow.cs:200:40:200:44 | this access | normal | -| cflow.cs:200:40:200:51 | access to property Length | cflow.cs:200:40:200:51 | access to property Length | normal | -| cflow.cs:200:40:200:56 | ... == ... | cflow.cs:200:40:200:56 | ... == ... | false | -| cflow.cs:200:40:200:56 | ... == ... | cflow.cs:200:40:200:56 | ... == ... | true | -| cflow.cs:200:40:200:61 | ... && ... | cflow.cs:200:40:200:61 | ... && ... | false | -| cflow.cs:200:40:200:61 | ... && ... | cflow.cs:200:40:200:61 | ... && ... | true | -| cflow.cs:200:56:200:56 | 1 | cflow.cs:200:56:200:56 | 1 | normal | -| cflow.cs:200:61:200:61 | access to local variable b | cflow.cs:200:61:200:61 | access to local variable b | false | -| cflow.cs:200:61:200:61 | access to local variable b | cflow.cs:200:61:200:61 | access to local variable b | true | -| cflow.cs:201:9:205:9 | {...} | cflow.cs:203:17:203:38 | throw ...; | throw(Exception) | -| cflow.cs:202:13:204:13 | {...} | cflow.cs:203:17:203:38 | throw ...; | throw(Exception) | -| cflow.cs:203:17:203:38 | throw ...; | cflow.cs:203:17:203:38 | throw ...; | throw(Exception) | -| cflow.cs:203:23:203:37 | object creation of type Exception | cflow.cs:203:23:203:37 | object creation of type Exception | normal | -| cflow.cs:209:5:222:5 | {...} | cflow.cs:219:17:219:22 | break; | normal [break] (0) | -| cflow.cs:209:5:222:5 | {...} | cflow.cs:221:18:221:34 | ... < ... | false | -| cflow.cs:210:9:221:36 | do ... while (...); | cflow.cs:219:17:219:22 | break; | normal [break] (0) | -| cflow.cs:210:9:221:36 | do ... while (...); | cflow.cs:221:18:221:34 | ... < ... | false | -| cflow.cs:211:9:221:9 | {...} | cflow.cs:215:17:215:25 | continue; | continue | -| cflow.cs:211:9:221:9 | {...} | cflow.cs:217:17:217:32 | ... < ... | false | -| cflow.cs:211:9:221:9 | {...} | cflow.cs:219:17:219:22 | break; | break | -| cflow.cs:212:13:212:17 | access to field Field | cflow.cs:212:13:212:17 | access to field Field | normal | -| cflow.cs:212:13:212:17 | access to field Field | cflow.cs:212:13:212:17 | this access | normal | -| cflow.cs:212:13:212:17 | this access | cflow.cs:212:13:212:17 | this access | normal | -| cflow.cs:212:13:212:17 | this access | cflow.cs:212:13:212:17 | this access | normal | -| cflow.cs:212:13:212:24 | ... + ... | cflow.cs:212:13:212:24 | ... + ... | normal | -| cflow.cs:212:13:212:24 | ... += ... | cflow.cs:212:13:212:24 | ... = ... | normal | -| cflow.cs:212:13:212:24 | ... = ... | cflow.cs:212:13:212:24 | ... = ... | normal | -| cflow.cs:212:13:212:25 | ...; | cflow.cs:212:13:212:24 | ... = ... | normal | -| cflow.cs:212:22:212:24 | "a" | cflow.cs:212:22:212:24 | "a" | normal | -| cflow.cs:213:13:216:13 | if (...) ... | cflow.cs:213:17:213:32 | ... > ... | false | -| cflow.cs:213:13:216:13 | if (...) ... | cflow.cs:215:17:215:25 | continue; | continue | -| cflow.cs:213:17:213:21 | access to field Field | cflow.cs:213:17:213:21 | access to field Field | normal | -| cflow.cs:213:17:213:21 | this access | cflow.cs:213:17:213:21 | this access | normal | -| cflow.cs:213:17:213:28 | access to property Length | cflow.cs:213:17:213:28 | access to property Length | normal | -| cflow.cs:213:17:213:32 | ... > ... | cflow.cs:213:17:213:32 | ... > ... | false | -| cflow.cs:213:17:213:32 | ... > ... | cflow.cs:213:17:213:32 | ... > ... | true | -| cflow.cs:213:32:213:32 | 0 | cflow.cs:213:32:213:32 | 0 | normal | -| cflow.cs:214:13:216:13 | {...} | cflow.cs:215:17:215:25 | continue; | continue | -| cflow.cs:215:17:215:25 | continue; | cflow.cs:215:17:215:25 | continue; | continue | -| cflow.cs:217:13:220:13 | if (...) ... | cflow.cs:217:17:217:32 | ... < ... | false | -| cflow.cs:217:13:220:13 | if (...) ... | cflow.cs:219:17:219:22 | break; | break | -| cflow.cs:217:17:217:21 | access to field Field | cflow.cs:217:17:217:21 | access to field Field | normal | -| cflow.cs:217:17:217:21 | this access | cflow.cs:217:17:217:21 | this access | normal | -| cflow.cs:217:17:217:28 | access to property Length | cflow.cs:217:17:217:28 | access to property Length | normal | -| cflow.cs:217:17:217:32 | ... < ... | cflow.cs:217:17:217:32 | ... < ... | false | -| cflow.cs:217:17:217:32 | ... < ... | cflow.cs:217:17:217:32 | ... < ... | true | -| cflow.cs:217:32:217:32 | 0 | cflow.cs:217:32:217:32 | 0 | normal | -| cflow.cs:218:13:220:13 | {...} | cflow.cs:219:17:219:22 | break; | break | -| cflow.cs:219:17:219:22 | break; | cflow.cs:219:17:219:22 | break; | break | -| cflow.cs:221:18:221:22 | access to field Field | cflow.cs:221:18:221:22 | access to field Field | normal | -| cflow.cs:221:18:221:22 | this access | cflow.cs:221:18:221:22 | this access | normal | -| cflow.cs:221:18:221:29 | access to property Length | cflow.cs:221:18:221:29 | access to property Length | normal | -| cflow.cs:221:18:221:34 | ... < ... | cflow.cs:221:18:221:34 | ... < ... | false | -| cflow.cs:221:18:221:34 | ... < ... | cflow.cs:221:18:221:34 | ... < ... | true | -| cflow.cs:221:33:221:34 | 10 | cflow.cs:221:33:221:34 | 10 | normal | -| cflow.cs:225:5:238:5 | {...} | cflow.cs:226:9:237:9 | foreach (... ... in ...) ... | empty | -| cflow.cs:225:5:238:5 | {...} | cflow.cs:235:17:235:22 | break; | normal [break] (0) | -| cflow.cs:226:9:237:9 | foreach (... ... in ...) ... | cflow.cs:226:9:237:9 | foreach (... ... in ...) ... | empty | -| cflow.cs:226:9:237:9 | foreach (... ... in ...) ... | cflow.cs:235:17:235:22 | break; | normal [break] (0) | -| cflow.cs:226:22:226:22 | String x | cflow.cs:226:22:226:22 | String x | normal | -| cflow.cs:226:27:226:64 | call to method Repeat | cflow.cs:226:27:226:64 | call to method Repeat | normal | -| cflow.cs:226:57:226:59 | "a" | cflow.cs:226:57:226:59 | "a" | normal | -| cflow.cs:226:62:226:63 | 10 | cflow.cs:226:62:226:63 | 10 | normal | -| cflow.cs:227:9:237:9 | {...} | cflow.cs:231:17:231:25 | continue; | continue | -| cflow.cs:227:9:237:9 | {...} | cflow.cs:233:17:233:32 | ... < ... | false | -| cflow.cs:227:9:237:9 | {...} | cflow.cs:235:17:235:22 | break; | break | -| cflow.cs:228:13:228:17 | access to field Field | cflow.cs:228:13:228:17 | access to field Field | normal | -| cflow.cs:228:13:228:17 | access to field Field | cflow.cs:228:13:228:17 | this access | normal | -| cflow.cs:228:13:228:17 | this access | cflow.cs:228:13:228:17 | this access | normal | -| cflow.cs:228:13:228:17 | this access | cflow.cs:228:13:228:17 | this access | normal | -| cflow.cs:228:13:228:22 | ... + ... | cflow.cs:228:13:228:22 | ... + ... | normal | -| cflow.cs:228:13:228:22 | ... += ... | cflow.cs:228:13:228:22 | ... = ... | normal | -| cflow.cs:228:13:228:22 | ... = ... | cflow.cs:228:13:228:22 | ... = ... | normal | -| cflow.cs:228:13:228:23 | ...; | cflow.cs:228:13:228:22 | ... = ... | normal | -| cflow.cs:228:22:228:22 | access to local variable x | cflow.cs:228:22:228:22 | access to local variable x | normal | -| cflow.cs:229:13:232:13 | if (...) ... | cflow.cs:229:17:229:32 | ... > ... | false | -| cflow.cs:229:13:232:13 | if (...) ... | cflow.cs:231:17:231:25 | continue; | continue | -| cflow.cs:229:17:229:21 | access to field Field | cflow.cs:229:17:229:21 | access to field Field | normal | -| cflow.cs:229:17:229:21 | this access | cflow.cs:229:17:229:21 | this access | normal | -| cflow.cs:229:17:229:28 | access to property Length | cflow.cs:229:17:229:28 | access to property Length | normal | -| cflow.cs:229:17:229:32 | ... > ... | cflow.cs:229:17:229:32 | ... > ... | false | -| cflow.cs:229:17:229:32 | ... > ... | cflow.cs:229:17:229:32 | ... > ... | true | -| cflow.cs:229:32:229:32 | 0 | cflow.cs:229:32:229:32 | 0 | normal | -| cflow.cs:230:13:232:13 | {...} | cflow.cs:231:17:231:25 | continue; | continue | -| cflow.cs:231:17:231:25 | continue; | cflow.cs:231:17:231:25 | continue; | continue | -| cflow.cs:233:13:236:13 | if (...) ... | cflow.cs:233:17:233:32 | ... < ... | false | -| cflow.cs:233:13:236:13 | if (...) ... | cflow.cs:235:17:235:22 | break; | break | -| cflow.cs:233:17:233:21 | access to field Field | cflow.cs:233:17:233:21 | access to field Field | normal | -| cflow.cs:233:17:233:21 | this access | cflow.cs:233:17:233:21 | this access | normal | -| cflow.cs:233:17:233:28 | access to property Length | cflow.cs:233:17:233:28 | access to property Length | normal | -| cflow.cs:233:17:233:32 | ... < ... | cflow.cs:233:17:233:32 | ... < ... | false | -| cflow.cs:233:17:233:32 | ... < ... | cflow.cs:233:17:233:32 | ... < ... | true | -| cflow.cs:233:32:233:32 | 0 | cflow.cs:233:32:233:32 | 0 | normal | -| cflow.cs:234:13:236:13 | {...} | cflow.cs:235:17:235:22 | break; | break | -| cflow.cs:235:17:235:22 | break; | cflow.cs:235:17:235:22 | break; | break | -| cflow.cs:241:5:259:5 | {...} | cflow.cs:244:31:244:41 | goto ...; | goto(Label) | -| cflow.cs:241:5:259:5 | {...} | cflow.cs:252:17:252:22 | break; | normal [break] (0) | -| cflow.cs:241:5:259:5 | {...} | cflow.cs:254:17:254:27 | goto ...; | goto(Label) | -| cflow.cs:241:5:259:5 | {...} | cflow.cs:257:17:257:22 | break; | normal [break] (0) | -| cflow.cs:242:5:242:9 | Label: | cflow.cs:242:5:242:9 | Label: | normal | -| cflow.cs:242:12:242:41 | if (...) ... | cflow.cs:242:16:242:36 | !... | false | -| cflow.cs:242:12:242:41 | if (...) ... | cflow.cs:242:39:242:41 | {...} | normal | -| cflow.cs:242:16:242:36 | !... | cflow.cs:242:16:242:36 | !... | false | -| cflow.cs:242:16:242:36 | !... | cflow.cs:242:16:242:36 | !... | true | -| cflow.cs:242:17:242:36 | !... | cflow.cs:242:17:242:36 | !... | false | -| cflow.cs:242:17:242:36 | !... | cflow.cs:242:17:242:36 | !... | true | -| cflow.cs:242:19:242:23 | access to field Field | cflow.cs:242:19:242:23 | access to field Field | normal | -| cflow.cs:242:19:242:23 | this access | cflow.cs:242:19:242:23 | this access | normal | -| cflow.cs:242:19:242:30 | access to property Length | cflow.cs:242:19:242:30 | access to property Length | normal | -| cflow.cs:242:19:242:35 | ... == ... | cflow.cs:242:19:242:35 | ... == ... | false | -| cflow.cs:242:19:242:35 | ... == ... | cflow.cs:242:19:242:35 | ... == ... | true | -| cflow.cs:242:35:242:35 | 0 | cflow.cs:242:35:242:35 | 0 | normal | -| cflow.cs:242:39:242:41 | {...} | cflow.cs:242:39:242:41 | {...} | normal | -| cflow.cs:244:9:244:41 | if (...) ... | cflow.cs:244:13:244:28 | ... > ... | false | -| cflow.cs:244:9:244:41 | if (...) ... | cflow.cs:244:31:244:41 | goto ...; | goto(Label) | -| cflow.cs:244:13:244:17 | access to field Field | cflow.cs:244:13:244:17 | access to field Field | normal | -| cflow.cs:244:13:244:17 | this access | cflow.cs:244:13:244:17 | this access | normal | -| cflow.cs:244:13:244:24 | access to property Length | cflow.cs:244:13:244:24 | access to property Length | normal | -| cflow.cs:244:13:244:28 | ... > ... | cflow.cs:244:13:244:28 | ... > ... | false | -| cflow.cs:244:13:244:28 | ... > ... | cflow.cs:244:13:244:28 | ... > ... | true | -| cflow.cs:244:28:244:28 | 0 | cflow.cs:244:28:244:28 | 0 | normal | -| cflow.cs:244:31:244:41 | goto ...; | cflow.cs:244:31:244:41 | goto ...; | goto(Label) | -| cflow.cs:246:9:258:9 | switch (...) {...} | cflow.cs:252:17:252:22 | break; | normal [break] (0) | -| cflow.cs:246:9:258:9 | switch (...) {...} | cflow.cs:254:17:254:27 | goto ...; | goto(Label) | -| cflow.cs:246:9:258:9 | switch (...) {...} | cflow.cs:257:17:257:22 | break; | normal [break] (0) | -| cflow.cs:246:17:246:21 | access to field Field | cflow.cs:246:17:246:21 | access to field Field | normal | -| cflow.cs:246:17:246:21 | this access | cflow.cs:246:17:246:21 | this access | normal | -| cflow.cs:246:17:246:28 | access to property Length | cflow.cs:246:17:246:28 | access to property Length | normal | -| cflow.cs:246:17:246:32 | ... + ... | cflow.cs:246:17:246:32 | ... + ... | normal | -| cflow.cs:246:32:246:32 | 3 | cflow.cs:246:32:246:32 | 3 | normal | -| cflow.cs:248:13:248:19 | case ...: | cflow.cs:248:18:248:18 | 0 | no-match | -| cflow.cs:248:13:248:19 | case ...: | cflow.cs:249:17:249:29 | goto default; | goto(default) | -| cflow.cs:248:18:248:18 | 0 | cflow.cs:248:18:248:18 | 0 | match | -| cflow.cs:248:18:248:18 | 0 | cflow.cs:248:18:248:18 | 0 | no-match | -| cflow.cs:249:17:249:29 | goto default; | cflow.cs:249:17:249:29 | goto default; | goto(default) | -| cflow.cs:250:13:250:19 | case ...: | cflow.cs:250:18:250:18 | 1 | no-match | -| cflow.cs:250:13:250:19 | case ...: | cflow.cs:251:17:251:36 | call to method WriteLine | normal | -| cflow.cs:250:18:250:18 | 1 | cflow.cs:250:18:250:18 | 1 | match | -| cflow.cs:250:18:250:18 | 1 | cflow.cs:250:18:250:18 | 1 | no-match | -| cflow.cs:251:17:251:36 | call to method WriteLine | cflow.cs:251:17:251:36 | call to method WriteLine | normal | -| cflow.cs:251:17:251:37 | ...; | cflow.cs:251:17:251:36 | call to method WriteLine | normal | -| cflow.cs:251:35:251:35 | 1 | cflow.cs:251:35:251:35 | 1 | normal | -| cflow.cs:252:17:252:22 | break; | cflow.cs:252:17:252:22 | break; | break | -| cflow.cs:253:13:253:19 | case ...: | cflow.cs:253:18:253:18 | 2 | no-match | -| cflow.cs:253:13:253:19 | case ...: | cflow.cs:254:17:254:27 | goto ...; | goto(Label) | -| cflow.cs:253:18:253:18 | 2 | cflow.cs:253:18:253:18 | 2 | match | -| cflow.cs:253:18:253:18 | 2 | cflow.cs:253:18:253:18 | 2 | no-match | -| cflow.cs:254:17:254:27 | goto ...; | cflow.cs:254:17:254:27 | goto ...; | goto(Label) | -| cflow.cs:255:13:255:20 | default: | cflow.cs:256:17:256:36 | call to method WriteLine | normal | -| cflow.cs:256:17:256:36 | call to method WriteLine | cflow.cs:256:17:256:36 | call to method WriteLine | normal | -| cflow.cs:256:17:256:37 | ...; | cflow.cs:256:17:256:36 | call to method WriteLine | normal | -| cflow.cs:256:35:256:35 | 0 | cflow.cs:256:35:256:35 | 0 | normal | -| cflow.cs:257:17:257:22 | break; | cflow.cs:257:17:257:22 | break; | break | -| cflow.cs:262:5:277:5 | {...} | cflow.cs:275:13:275:41 | call to method WriteLine | normal | -| cflow.cs:262:5:277:5 | {...} | cflow.cs:275:13:275:41 | call to method WriteLine | return [normal] (0) | -| cflow.cs:262:5:277:5 | {...} | cflow.cs:275:13:275:41 | call to method WriteLine | throw(Exception) [normal] (0) | -| cflow.cs:263:9:263:23 | yield return ...; | cflow.cs:263:9:263:23 | yield return ...; | normal | -| cflow.cs:263:22:263:22 | 0 | cflow.cs:263:22:263:22 | 0 | normal | -| cflow.cs:264:9:267:9 | for (...;...;...) ... | cflow.cs:264:25:264:30 | ... < ... | false | -| cflow.cs:264:18:264:22 | Int32 i = ... | cflow.cs:264:18:264:22 | Int32 i = ... | normal | -| cflow.cs:264:22:264:22 | 1 | cflow.cs:264:22:264:22 | 1 | normal | -| cflow.cs:264:25:264:25 | access to local variable i | cflow.cs:264:25:264:25 | access to local variable i | normal | -| cflow.cs:264:25:264:30 | ... < ... | cflow.cs:264:25:264:30 | ... < ... | false | -| cflow.cs:264:25:264:30 | ... < ... | cflow.cs:264:25:264:30 | ... < ... | true | -| cflow.cs:264:29:264:30 | 10 | cflow.cs:264:29:264:30 | 10 | normal | -| cflow.cs:264:33:264:33 | access to local variable i | cflow.cs:264:33:264:33 | access to local variable i | normal | -| cflow.cs:264:33:264:35 | ...++ | cflow.cs:264:33:264:35 | ...++ | normal | -| cflow.cs:265:9:267:9 | {...} | cflow.cs:266:13:266:27 | yield return ...; | normal | -| cflow.cs:266:13:266:27 | yield return ...; | cflow.cs:266:13:266:27 | yield return ...; | normal | -| cflow.cs:266:26:266:26 | access to local variable i | cflow.cs:266:26:266:26 | access to local variable i | normal | -| cflow.cs:268:9:276:9 | try {...} ... | cflow.cs:275:13:275:41 | call to method WriteLine | normal | -| cflow.cs:268:9:276:9 | try {...} ... | cflow.cs:275:13:275:41 | call to method WriteLine | return [normal] (0) | -| cflow.cs:268:9:276:9 | try {...} ... | cflow.cs:275:13:275:41 | call to method WriteLine | throw(Exception) [normal] (0) | -| cflow.cs:269:9:272:9 | {...} | cflow.cs:270:13:270:24 | yield break; | return | -| cflow.cs:269:9:272:9 | {...} | cflow.cs:271:13:271:42 | call to method WriteLine | normal | -| cflow.cs:269:9:272:9 | {...} | cflow.cs:271:13:271:42 | call to method WriteLine | throw(Exception) | -| cflow.cs:270:13:270:24 | yield break; | cflow.cs:270:13:270:24 | yield break; | return | -| cflow.cs:271:13:271:42 | call to method WriteLine | cflow.cs:271:13:271:42 | call to method WriteLine | normal | -| cflow.cs:271:13:271:42 | call to method WriteLine | cflow.cs:271:13:271:42 | call to method WriteLine | throw(Exception) | -| cflow.cs:271:13:271:43 | ...; | cflow.cs:271:13:271:42 | call to method WriteLine | normal | -| cflow.cs:271:13:271:43 | ...; | cflow.cs:271:13:271:42 | call to method WriteLine | throw(Exception) | -| cflow.cs:271:31:271:41 | "dead code" | cflow.cs:271:31:271:41 | "dead code" | normal | -| cflow.cs:274:9:276:9 | {...} | cflow.cs:275:13:275:41 | call to method WriteLine | normal | -| cflow.cs:275:13:275:41 | call to method WriteLine | cflow.cs:275:13:275:41 | call to method WriteLine | normal | -| cflow.cs:275:13:275:42 | ...; | cflow.cs:275:13:275:41 | call to method WriteLine | normal | -| cflow.cs:275:31:275:40 | "not dead" | cflow.cs:275:31:275:40 | "not dead" | normal | -| cflow.cs:282:5:282:18 | call to method | cflow.cs:282:5:282:18 | call to method | normal | -| cflow.cs:282:5:282:18 | this access | cflow.cs:282:5:282:18 | this access | normal | -| cflow.cs:282:24:282:27 | call to constructor ControlFlow | cflow.cs:282:24:282:27 | call to constructor ControlFlow | normal | -| cflow.cs:282:31:282:33 | {...} | cflow.cs:282:31:282:33 | {...} | normal | -| cflow.cs:284:32:284:35 | call to constructor ControlFlowSub | cflow.cs:284:32:284:35 | call to constructor ControlFlowSub | normal | -| cflow.cs:284:39:284:41 | {...} | cflow.cs:284:39:284:41 | {...} | normal | -| cflow.cs:286:29:286:32 | call to constructor ControlFlowSub | cflow.cs:286:29:286:32 | call to constructor ControlFlowSub | normal | -| cflow.cs:286:34:286:34 | access to parameter i | cflow.cs:286:34:286:34 | access to parameter i | normal | -| cflow.cs:286:34:286:45 | call to method ToString | cflow.cs:286:34:286:45 | call to method ToString | normal | -| cflow.cs:286:48:286:50 | {...} | cflow.cs:286:48:286:50 | {...} | normal | -| cflow.cs:289:7:289:18 | call to constructor Object | cflow.cs:289:7:289:18 | call to constructor Object | normal | -| cflow.cs:289:7:289:18 | call to method | cflow.cs:289:7:289:18 | call to method | normal | -| cflow.cs:289:7:289:18 | this access | cflow.cs:289:7:289:18 | this access | normal | -| cflow.cs:289:7:289:18 | {...} | cflow.cs:289:7:289:18 | {...} | normal | -| cflow.cs:291:38:291:38 | access to parameter f | cflow.cs:291:38:291:38 | access to parameter f | normal | -| cflow.cs:291:38:291:41 | delegate call | cflow.cs:291:38:291:41 | delegate call | normal | -| cflow.cs:291:40:291:40 | 0 | cflow.cs:291:40:291:40 | 0 | normal | -| cflow.cs:296:5:296:25 | call to constructor Object | cflow.cs:296:5:296:25 | call to constructor Object | normal | -| cflow.cs:296:5:296:25 | call to method | cflow.cs:296:5:296:25 | call to method | normal | -| cflow.cs:296:5:296:25 | this access | cflow.cs:296:5:296:25 | this access | normal | -| cflow.cs:296:52:296:54 | {...} | cflow.cs:296:52:296:54 | {...} | normal | -| cflow.cs:299:5:301:5 | {...} | cflow.cs:300:9:300:72 | object creation of type NegationInConstructor | normal | -| cflow.cs:300:9:300:72 | object creation of type NegationInConstructor | cflow.cs:300:9:300:72 | object creation of type NegationInConstructor | normal | -| cflow.cs:300:9:300:73 | ...; | cflow.cs:300:9:300:72 | object creation of type NegationInConstructor | normal | -| cflow.cs:300:38:300:38 | 0 | cflow.cs:300:38:300:38 | 0 | normal | -| cflow.cs:300:44:300:51 | !... | cflow.cs:300:44:300:51 | !... | false | -| cflow.cs:300:44:300:51 | !... | cflow.cs:300:44:300:51 | !... | true | -| cflow.cs:300:44:300:64 | ... && ... | cflow.cs:300:44:300:64 | ... && ... | normal | -| cflow.cs:300:46:300:46 | access to parameter i | cflow.cs:300:46:300:46 | access to parameter i | normal | -| cflow.cs:300:46:300:50 | ... > ... | cflow.cs:300:46:300:50 | ... > ... | false | -| cflow.cs:300:46:300:50 | ... > ... | cflow.cs:300:46:300:50 | ... > ... | true | -| cflow.cs:300:50:300:50 | 0 | cflow.cs:300:50:300:50 | 0 | normal | -| cflow.cs:300:56:300:56 | access to parameter s | cflow.cs:300:56:300:56 | access to parameter s | normal | -| cflow.cs:300:56:300:64 | ... != ... | cflow.cs:300:56:300:64 | ... != ... | normal | -| cflow.cs:300:61:300:64 | null | cflow.cs:300:61:300:64 | null | normal | -| cflow.cs:300:70:300:71 | "" | cflow.cs:300:70:300:71 | "" | normal | -| cflow.cs:304:7:304:18 | call to constructor Object | cflow.cs:304:7:304:18 | call to constructor Object | normal | -| cflow.cs:304:7:304:18 | call to method | cflow.cs:304:7:304:18 | call to method | normal | -| cflow.cs:304:7:304:18 | this access | cflow.cs:304:7:304:18 | this access | normal | -| cflow.cs:304:7:304:18 | {...} | cflow.cs:304:7:304:18 | {...} | normal | -| cflow.cs:306:60:310:5 | (...) => ... | cflow.cs:306:60:310:5 | (...) => ... | normal | -| cflow.cs:307:5:310:5 | {...} | cflow.cs:309:9:309:17 | return ...; | return | -| cflow.cs:308:9:308:21 | ... ...; | cflow.cs:308:16:308:20 | Object x = ... | normal | -| cflow.cs:308:16:308:20 | Object x = ... | cflow.cs:308:16:308:20 | Object x = ... | normal | -| cflow.cs:308:20:308:20 | access to parameter o | cflow.cs:308:20:308:20 | access to parameter o | normal | -| cflow.cs:309:9:309:17 | return ...; | cflow.cs:309:9:309:17 | return ...; | return | -| cflow.cs:309:16:309:16 | access to local variable x | cflow.cs:309:16:309:16 | access to local variable x | normal | diff --git a/csharp/ql/test/library-tests/controlflow/graph/ExitElement.ql b/csharp/ql/test/library-tests/controlflow/graph/ExitElement.ql deleted file mode 100644 index d51cbcb82c40..000000000000 --- a/csharp/ql/test/library-tests/controlflow/graph/ExitElement.ql +++ /dev/null @@ -1,8 +0,0 @@ -import csharp -import semmle.code.csharp.controlflow.internal.ControlFlowGraphImpl -private import semmle.code.csharp.controlflow.internal.Completion -import Common - -from SourceControlFlowElement cfe, ControlFlowElement last, Completion c -where last(cfe, last, c) -select cfe, last, c diff --git a/csharp/ql/test/library-tests/controlflow/graph/NodeGraph.ql b/csharp/ql/test/library-tests/controlflow/graph/NodeGraph.ql index 6915c2a546cd..b8026566563e 100644 --- a/csharp/ql/test/library-tests/controlflow/graph/NodeGraph.ql +++ b/csharp/ql/test/library-tests/controlflow/graph/NodeGraph.ql @@ -1,3 +1,3 @@ import csharp import Common -import semmle.code.csharp.controlflow.internal.ControlFlowGraphImpl::TestOutput +import ControlFlow::TestOutput diff --git a/csharp/ql/test/library-tests/controlflow/graph/Nodes.ql b/csharp/ql/test/library-tests/controlflow/graph/Nodes.ql index 1140f78de660..ce2a5b9d60d0 100644 --- a/csharp/ql/test/library-tests/controlflow/graph/Nodes.ql +++ b/csharp/ql/test/library-tests/controlflow/graph/Nodes.ql @@ -1,10 +1,7 @@ import csharp import ControlFlow import Common -import semmle.code.csharp.controlflow.internal.ControlFlowGraphImpl as Impl -import semmle.code.csharp.controlflow.internal.Splitting as Splitting -import Nodes query predicate entryPoint(Callable c, SourceControlFlowElement cfn) { - c.getEntryPoint().getASuccessor().getAstNode() = cfn + c.getEntryPoint().getASuccessor() = cfn.getControlFlowNode() } diff --git a/csharp/ql/test/library-tests/csharp11/signAnalysis.ql b/csharp/ql/test/library-tests/csharp11/signAnalysis.ql index 2aeb57e29fb8..97471fec351b 100644 --- a/csharp/ql/test/library-tests/csharp11/signAnalysis.ql +++ b/csharp/ql/test/library-tests/csharp11/signAnalysis.ql @@ -1,7 +1,7 @@ import csharp import semmle.code.csharp.dataflow.internal.rangeanalysis.SignAnalysisCommon as Common -from ControlFlow::Nodes::ExprNode e, Expr expr +from ControlFlowNodes::ExprNode e, Expr expr where e.getExpr() = expr and expr.getFile().getStem() = "SignAnalysis" and diff --git a/csharp/ql/test/library-tests/csharp7/IsFlow.ql b/csharp/ql/test/library-tests/csharp7/IsFlow.ql index 02b65c0d3e2c..ccd51760504e 100644 --- a/csharp/ql/test/library-tests/csharp7/IsFlow.ql +++ b/csharp/ql/test/library-tests/csharp7/IsFlow.ql @@ -1,10 +1,10 @@ import csharp -query predicate edges(ControlFlow::Node n1, ControlFlow::Node n2, string attr, string val) { +query predicate edges(ControlFlowNode n1, ControlFlowNode n2, string attr, string val) { exists(SwitchStmt switch, ControlFlow::SuccessorType t | switch.getAControlFlowNode().getASuccessor*() = n1 | - n2 = n1.getASuccessorByType(t) and + n2 = n1.getASuccessor(t) and attr = "semmle.label" and val = t.toString() ) diff --git a/csharp/ql/test/library-tests/csharp8/NullCoalescingControlFlow.ql b/csharp/ql/test/library-tests/csharp8/NullCoalescingControlFlow.ql index 1037ad321691..65d471b49eb7 100644 --- a/csharp/ql/test/library-tests/csharp8/NullCoalescingControlFlow.ql +++ b/csharp/ql/test/library-tests/csharp8/NullCoalescingControlFlow.ql @@ -1,9 +1,7 @@ import csharp -query predicate edges(ControlFlow::Node node1, ControlFlow::Node node2, string label, string value) { +query predicate edges(ControlFlowNode node1, ControlFlowNode node2, string label, string value) { label = "semmle.label" and - exists(ControlFlow::SuccessorType t | - node2 = node1.getASuccessorByType(t) and value = t.toString() - ) and + exists(ControlFlow::SuccessorType t | node2 = node1.getASuccessor(t) and value = t.toString()) and node1.getEnclosingCallable().hasName("NullCoalescing") } diff --git a/csharp/ql/test/library-tests/csharp8/NullableRefTypes.ql b/csharp/ql/test/library-tests/csharp8/NullableRefTypes.ql index f519f9a14e83..0d057d678ee4 100644 --- a/csharp/ql/test/library-tests/csharp8/NullableRefTypes.ql +++ b/csharp/ql/test/library-tests/csharp8/NullableRefTypes.ql @@ -11,10 +11,10 @@ query predicate nullableDataFlow(DataFlow::Node src, DataFlow::Node sink) { } query predicate nullableControlFlow( - ControlFlow::Node a, ControlFlow::Node b, ControlFlow::SuccessorType t + ControlFlowNode a, ControlFlowNode b, ControlFlow::SuccessorType t ) { a.getEnclosingCallable().hasName("TestSuppressNullableWarningExpr") and - b = a.getASuccessorByType(t) + b = a.getASuccessor(t) } query predicate nonNullExpressions(NonNullExpr e) { diff --git a/csharp/ql/test/library-tests/csharp8/UsingControlFlow.ql b/csharp/ql/test/library-tests/csharp8/UsingControlFlow.ql index fe2f90be4a7d..927d21e8ec70 100644 --- a/csharp/ql/test/library-tests/csharp8/UsingControlFlow.ql +++ b/csharp/ql/test/library-tests/csharp8/UsingControlFlow.ql @@ -1,9 +1,7 @@ import csharp -query predicate edges(ControlFlow::Node node1, ControlFlow::Node node2, string label, string value) { +query predicate edges(ControlFlowNode node1, ControlFlowNode node2, string label, string value) { label = "semmle.label" and - exists(ControlFlow::SuccessorType t | - node2 = node1.getASuccessorByType(t) and value = t.toString() - ) and + exists(ControlFlow::SuccessorType t | node2 = node1.getASuccessor(t) and value = t.toString()) and node1.getEnclosingCallable().hasName("TestUsingDeclarations") } diff --git a/csharp/ql/test/library-tests/csharp8/ispatternflow.ql b/csharp/ql/test/library-tests/csharp8/ispatternflow.ql index 33f0095c8379..61b0562d5fa9 100644 --- a/csharp/ql/test/library-tests/csharp8/ispatternflow.ql +++ b/csharp/ql/test/library-tests/csharp8/ispatternflow.ql @@ -1,9 +1,9 @@ import csharp -query predicate edges(ControlFlow::Node a, ControlFlow::Node b, string label, string value) { +query predicate edges(ControlFlowNode a, ControlFlowNode b, string label, string value) { exists(ControlFlow::SuccessorType t | a.getEnclosingCallable().getName() = "IsPatterns" and - b = a.getASuccessorByType(t) and + b = a.getASuccessor(t) and label = "semmle.label" and value = t.toString() ) diff --git a/csharp/ql/test/library-tests/csharp8/switchexprcontrolflow.ql b/csharp/ql/test/library-tests/csharp8/switchexprcontrolflow.ql index 696f747b9254..2eba0e54581e 100644 --- a/csharp/ql/test/library-tests/csharp8/switchexprcontrolflow.ql +++ b/csharp/ql/test/library-tests/csharp8/switchexprcontrolflow.ql @@ -1,9 +1,9 @@ import csharp -query predicate edges(ControlFlow::Node a, ControlFlow::Node b, string label, string value) { +query predicate edges(ControlFlowNode a, ControlFlowNode b, string label, string value) { exists(ControlFlow::SuccessorType t | a.getEnclosingCallable().getName().matches("Expressions%") and - b = a.getASuccessorByType(t) and + b = a.getASuccessor(t) and label = "semmle.label" and value = t.toString() ) diff --git a/csharp/ql/test/library-tests/csharp8/switchstmtctrlflow.ql b/csharp/ql/test/library-tests/csharp8/switchstmtctrlflow.ql index 100f05e562a8..3030332cc0a1 100644 --- a/csharp/ql/test/library-tests/csharp8/switchstmtctrlflow.ql +++ b/csharp/ql/test/library-tests/csharp8/switchstmtctrlflow.ql @@ -1,9 +1,9 @@ import csharp -query predicate edges(ControlFlow::Node a, ControlFlow::Node b, string label, string value) { +query predicate edges(ControlFlowNode a, ControlFlowNode b, string label, string value) { exists(ControlFlow::SuccessorType t | a.getEnclosingCallable().hasName("SwitchStatements") and - b = a.getASuccessorByType(t) and + b = a.getASuccessor(t) and label = "semmle.label" and value = t.toString() ) diff --git a/csharp/ql/test/library-tests/dataflow/defuse/defUseEquivalence.ql b/csharp/ql/test/library-tests/dataflow/defuse/defUseEquivalence.ql index f6aaf07485ea..19037a80e6c8 100644 --- a/csharp/ql/test/library-tests/dataflow/defuse/defUseEquivalence.ql +++ b/csharp/ql/test/library-tests/dataflow/defuse/defUseEquivalence.ql @@ -3,11 +3,11 @@ private import semmle.code.csharp.dataflow.internal.BaseSSA /** "Naive" def-use implementation. */ predicate defReaches( - AssignableDefinition def, BaseSsa::SimpleLocalScopeVariable v, ControlFlow::Node cfn + AssignableDefinition def, BaseSsa::SimpleLocalScopeVariable v, ControlFlowNode cfn ) { def.getTarget() = v and cfn = def.getExpr().getAControlFlowNode().getASuccessor() or - exists(ControlFlow::Node mid | defReaches(def, v, mid) | + exists(ControlFlowNode mid | defReaches(def, v, mid) | not mid = any(AssignableDefinition ad | ad.getTarget() = v and ad.isCertain()) .getExpr() diff --git a/csharp/ql/test/library-tests/dataflow/defuse/parameterUseEquivalence.ql b/csharp/ql/test/library-tests/dataflow/defuse/parameterUseEquivalence.ql index 87c26e322591..abb84e3741c3 100644 --- a/csharp/ql/test/library-tests/dataflow/defuse/parameterUseEquivalence.ql +++ b/csharp/ql/test/library-tests/dataflow/defuse/parameterUseEquivalence.ql @@ -2,11 +2,11 @@ import csharp private import semmle.code.csharp.dataflow.internal.BaseSSA /** "Naive" parameter-use implementation. */ -predicate parameterReaches(Parameter p, ControlFlow::Node cfn) { +predicate parameterReaches(Parameter p, ControlFlowNode cfn) { cfn = p.getCallable().getEntryPoint().getASuccessor() and p instanceof BaseSsa::SimpleLocalScopeVariable or - exists(ControlFlow::Node mid | parameterReaches(p, mid) | + exists(ControlFlowNode mid | parameterReaches(p, mid) | not mid = any(AssignableDefinition ad | ad.getTarget() = p and ad.isCertain()) .getExpr() diff --git a/csharp/ql/test/library-tests/dataflow/defuse/useUseEquivalence.ql b/csharp/ql/test/library-tests/dataflow/defuse/useUseEquivalence.ql index f212e48f1c4f..ced1bccdbb2d 100644 --- a/csharp/ql/test/library-tests/dataflow/defuse/useUseEquivalence.ql +++ b/csharp/ql/test/library-tests/dataflow/defuse/useUseEquivalence.ql @@ -3,11 +3,11 @@ private import semmle.code.csharp.dataflow.internal.BaseSSA /** "Naive" use-use implementation. */ predicate useReaches( - LocalScopeVariableRead read, BaseSsa::SimpleLocalScopeVariable v, ControlFlow::Node cfn + LocalScopeVariableRead read, BaseSsa::SimpleLocalScopeVariable v, ControlFlowNode cfn ) { read.getTarget() = v and cfn = read.getAControlFlowNode().getASuccessor() or - exists(ControlFlow::Node mid | useReaches(read, v, mid) | + exists(ControlFlowNode mid | useReaches(read, v, mid) | not mid = any(AssignableDefinition ad | ad.getTarget() = v and ad.isCertain()) .getExpr() @@ -32,10 +32,7 @@ private TLocalScopeVariableReadOrSsaDef getANextReadOrDef(TLocalScopeVariableRea result = TLocalScopeVariableRead(read.getANextRead()) or not exists(read.getANextRead()) and - exists( - Ssa::Definition ssaDef, Ssa::PhiNode phi, ControlFlow::Node cfn, ControlFlow::BasicBlock bb, - int i - | + exists(Ssa::Definition ssaDef, Ssa::PhiNode phi, ControlFlowNode cfn, BasicBlock bb, int i | ssaDef.getARead() = read | phi.getAnInput() = ssaDef and diff --git a/csharp/ql/test/library-tests/dataflow/modulusanalysis/ModulusAnalysis.ql b/csharp/ql/test/library-tests/dataflow/modulusanalysis/ModulusAnalysis.ql index 02ffbc535ce8..7a2dff9c92e0 100644 --- a/csharp/ql/test/library-tests/dataflow/modulusanalysis/ModulusAnalysis.ql +++ b/csharp/ql/test/library-tests/dataflow/modulusanalysis/ModulusAnalysis.ql @@ -3,7 +3,7 @@ import semmle.code.csharp.dataflow.internal.rangeanalysis.RangeUtils import semmle.code.csharp.dataflow.ModulusAnalysis import semmle.code.csharp.dataflow.Bound -from ControlFlow::Nodes::ExprNode e, Bound b, int delta, int mod +from ControlFlowNodes::ExprNode e, Bound b, int delta, int mod where not e.getExpr().fromLibrary() and exprModulus(e, b, delta, mod) diff --git a/csharp/ql/test/library-tests/dataflow/signanalysis/MissingSign.ql b/csharp/ql/test/library-tests/dataflow/signanalysis/MissingSign.ql index 70f9af36494a..b78bc4c784a5 100644 --- a/csharp/ql/test/library-tests/dataflow/signanalysis/MissingSign.ql +++ b/csharp/ql/test/library-tests/dataflow/signanalysis/MissingSign.ql @@ -1,7 +1,7 @@ import csharp import semmle.code.csharp.dataflow.internal.rangeanalysis.SignAnalysisCommon -from ControlFlow::Nodes::ExprNode e +from ControlFlowNodes::ExprNode e where not exists(exprSign(e)) and not e.getExpr() instanceof TypeAccess and diff --git a/csharp/ql/test/library-tests/dataflow/signanalysis/SignAnalysis.ql b/csharp/ql/test/library-tests/dataflow/signanalysis/SignAnalysis.ql index 650d0f6bed42..4bdfd5082a8e 100644 --- a/csharp/ql/test/library-tests/dataflow/signanalysis/SignAnalysis.ql +++ b/csharp/ql/test/library-tests/dataflow/signanalysis/SignAnalysis.ql @@ -1,7 +1,7 @@ import csharp import semmle.code.csharp.dataflow.SignAnalysis -string getASignString(ControlFlow::Nodes::ExprNode e) { +string getASignString(ControlFlowNodes::ExprNode e) { positive(e) and not strictlyPositive(e) and result = "positive" @@ -17,6 +17,6 @@ string getASignString(ControlFlow::Nodes::ExprNode e) { result = "strictlyNegative" } -from ControlFlow::Nodes::ExprNode e +from ControlFlowNodes::ExprNode e where not e.getExpr().fromLibrary() select e, strictconcat(string s | s = getASignString(e) | s, " ") diff --git a/csharp/ql/test/library-tests/dataflow/ssa-large/countssa.ql b/csharp/ql/test/library-tests/dataflow/ssa-large/countssa.ql index bb10b7c9ffaf..94218ca6c7e5 100644 --- a/csharp/ql/test/library-tests/dataflow/ssa-large/countssa.ql +++ b/csharp/ql/test/library-tests/dataflow/ssa-large/countssa.ql @@ -3,6 +3,5 @@ import csharp from int uses, int live where uses = strictcount(Ssa::ExplicitDefinition ssa, AssignableRead read | read = ssa.getARead()) and - live = - strictcount(Ssa::ExplicitDefinition ssa, ControlFlow::BasicBlock bb | ssa.isLiveAtEndOfBlock(bb)) + live = strictcount(Ssa::ExplicitDefinition ssa, BasicBlock bb | ssa.isLiveAtEndOfBlock(bb)) select uses, live diff --git a/csharp/ql/test/library-tests/dataflow/ssa/SSAPhiRead.ql b/csharp/ql/test/library-tests/dataflow/ssa/SSAPhiRead.ql index baa59bc5b677..28cdb3a5af2e 100644 --- a/csharp/ql/test/library-tests/dataflow/ssa/SSAPhiRead.ql +++ b/csharp/ql/test/library-tests/dataflow/ssa/SSAPhiRead.ql @@ -6,8 +6,8 @@ query predicate phiReadNode(RefTest::Ref phi, Ssa::SourceVariable v) { phi.isPhiRead() and phi.getSourceVariable() = v } -query predicate phiReadNodeFirstRead(RefTest::Ref phi, Ssa::SourceVariable v, ControlFlow::Node read) { - exists(RefTest::Ref r, ControlFlow::BasicBlock bb, int i | +query predicate phiReadNodeFirstRead(RefTest::Ref phi, Ssa::SourceVariable v, ControlFlowNode read) { + exists(RefTest::Ref r, BasicBlock bb, int i | phi.isPhiRead() and RefTest::adjacentRefRead(phi, r) and r.accessAt(bb, i, v) and diff --git a/csharp/ql/test/library-tests/goto/Goto1.ql b/csharp/ql/test/library-tests/goto/Goto1.ql index 1a90e6eb1fb6..11639e28bcb9 100644 --- a/csharp/ql/test/library-tests/goto/Goto1.ql +++ b/csharp/ql/test/library-tests/goto/Goto1.ql @@ -1,8 +1,8 @@ import csharp -query predicate edges(ControlFlow::Node node, ControlFlow::Node successor, string attr, string val) { +query predicate edges(ControlFlowNode node, ControlFlowNode successor, string attr, string val) { not node.getAstNode().fromLibrary() and - exists(ControlFlow::SuccessorType t | successor = node.getASuccessorByType(t) | + exists(ControlFlow::SuccessorType t | successor = node.getASuccessor(t) | attr = "semmle.label" and val = t.toString() ) diff --git a/csharp/ql/test/library-tests/obinit/ObInit.ql b/csharp/ql/test/library-tests/obinit/ObInit.ql index cfd21d14b5e0..a6c58b33dad5 100644 --- a/csharp/ql/test/library-tests/obinit/ObInit.ql +++ b/csharp/ql/test/library-tests/obinit/ObInit.ql @@ -1,8 +1,4 @@ import csharp -import semmle.code.csharp.controlflow.internal.ControlFlowGraphImpl -import semmle.code.csharp.controlflow.internal.Completion -import semmle.code.csharp.dataflow.internal.DataFlowPrivate -import semmle.code.csharp.dataflow.internal.DataFlowDispatch query predicate method(ObjectInitMethod m, RefType t) { m.getDeclaringType() = t } @@ -10,19 +6,21 @@ query predicate call(Call c, ObjectInitMethod m, Callable src) { c.getTarget() = m and c.getEnclosingCallable() = src } -predicate scope(Callable callable, AstNode n, int i) { +predicate scope(Callable callable, ControlFlowNode n, int i) { (callable instanceof ObjectInitMethod or callable instanceof Constructor) and - scopeFirst(callable, n) and + n.(ControlFlow::EntryNode).getEnclosingCallable() = callable and i = 0 or - exists(AstNode prev | + exists(ControlFlowNode prev | scope(callable, prev, i - 1) and - succ(prev, n, _) and + n = prev.getASuccessor() and i < 30 ) } -query predicate cfg(Callable callable, AstNode pred, AstNode succ, Completion c, int i) { +query predicate cfg( + Callable callable, ControlFlowNode pred, ControlFlowNode succ, ControlFlow::SuccessorType c, int i +) { scope(callable, pred, i) and - succ(pred, succ, c) + pred.getASuccessor(c) = succ } diff --git a/csharp/ql/test/library-tests/standalone/controlflow/cfg.ql b/csharp/ql/test/library-tests/standalone/controlflow/cfg.ql index f596ac41629a..020863c588d7 100644 --- a/csharp/ql/test/library-tests/standalone/controlflow/cfg.ql +++ b/csharp/ql/test/library-tests/standalone/controlflow/cfg.ql @@ -11,6 +11,6 @@ class UnknownCall extends Call { override string toString() { result = "Call (unknown target)" } } -query predicate edges(ControlFlow::Node n1, ControlFlow::Node n2) { +query predicate edges(ControlFlowNode n1, ControlFlowNode n2) { not n1.getAstNode().fromLibrary() and n2 = n1.getASuccessor() } diff --git a/java/ql/lib/semmle/code/java/ControlFlowGraph.qll b/java/ql/lib/semmle/code/java/ControlFlowGraph.qll index 4ec8ff8450ac..72353de39fcc 100644 --- a/java/ql/lib/semmle/code/java/ControlFlowGraph.qll +++ b/java/ql/lib/semmle/code/java/ControlFlowGraph.qll @@ -91,9 +91,13 @@ private module Ast implements AstSig { class ContinueStmt = J::ContinueStmt; + class GotoStmt extends Stmt { + GotoStmt() { none() } + } + class ReturnStmt = J::ReturnStmt; - class ThrowStmt = J::ThrowStmt; + class Throw = J::ThrowStmt; final private class FinalTryStmt = J::TryStmt; @@ -181,11 +185,37 @@ private module Ast implements AstSig { class LogicalNotExpr = LogNotExpr; + class Assignment = J::Assignment; + + class AssignExpr = J::AssignExpr; + + class CompoundAssignment = J::AssignOp; + + class AssignLogicalAndExpr extends CompoundAssignment { + AssignLogicalAndExpr() { none() } + } + + class AssignLogicalOrExpr extends CompoundAssignment { + AssignLogicalOrExpr() { none() } + } + + class AssignNullCoalescingExpr extends CompoundAssignment { + AssignNullCoalescingExpr() { none() } + } + final private class FinalBooleanLiteral = J::BooleanLiteral; class BooleanLiteral extends FinalBooleanLiteral { boolean getValue() { result = this.getBooleanValue() } } + + final private class FinalInstanceOfExpr = J::InstanceOfExpr; + + class PatternMatchExpr extends FinalInstanceOfExpr { + PatternMatchExpr() { this.isPattern() } + + AstNode getPattern() { result = super.getPattern() } + } } private module Exceptions { @@ -522,14 +552,8 @@ private module Input implements InputSig1, InputSig2 { private string assertThrowNodeTag() { result = "[assert-throw]" } - private string instanceofTrueNodeTag() { result = "[instanceof-true]" } - predicate additionalNode(Ast::AstNode n, string tag, NormalSuccessor t) { n instanceof AssertStmt and tag = assertThrowNodeTag() and t instanceof DirectSuccessor - or - n.(InstanceOfExpr).isPattern() and - tag = instanceofTrueNodeTag() and - t.(BooleanSuccessor).getValue() = true } /** @@ -571,34 +595,6 @@ private module Input implements InputSig1, InputSig2 { /** Holds if there is a local non-abrupt step from `n1` to `n2`. */ predicate step(PreControlFlowNode n1, PreControlFlowNode n2) { - exists(InstanceOfExpr ioe | - // common - n1.isBefore(ioe) and - n2.isBefore(ioe.getExpr()) - or - n1.isAfter(ioe.getExpr()) and - n2.isIn(ioe) - or - // std postorder: - not ioe.isPattern() and - n1.isIn(ioe) and - n2.isAfter(ioe) - or - // pattern case: - ioe.isPattern() and - n1.isIn(ioe) and - n2.isAfterValue(ioe, any(BooleanSuccessor s | s.getValue() = false)) - or - n1.isIn(ioe) and - n2.isAdditional(ioe, instanceofTrueNodeTag()) - or - n1.isAdditional(ioe, instanceofTrueNodeTag()) and - n2.isBefore(ioe.getPattern()) - or - n1.isAfter(ioe.getPattern()) and - n2.isAfterValue(ioe, any(BooleanSuccessor s | s.getValue() = true)) - ) - or exists(AssertStmt assertstmt | n1.isBefore(assertstmt) and n2.isBefore(assertstmt.getExpr()) diff --git a/shared/controlflow/codeql/controlflow/ControlFlowGraph.qll b/shared/controlflow/codeql/controlflow/ControlFlowGraph.qll index ac7c5b59cfe2..94f94c2e129d 100644 --- a/shared/controlflow/codeql/controlflow/ControlFlowGraph.qll +++ b/shared/controlflow/codeql/controlflow/ControlFlowGraph.qll @@ -143,6 +143,13 @@ signature module AstSig { */ class ContinueStmt extends Stmt; + /** + * A `goto` statement. + * + * Goto statements complete abruptly and jump to a labeled statement. + */ + class GotoStmt extends Stmt; + /** * A `return` statement. * @@ -155,11 +162,11 @@ signature module AstSig { } /** - * A `throw` statement. + * A `throw` statement or expression. * - * Throw statements complete abruptly and throw an exception. + * Throw statements/expressions complete abruptly and throw an exception. */ - class ThrowStmt extends Stmt { + class Throw extends AstNode { /** Gets the expression being thrown. */ Expr getExpr(); } @@ -302,11 +309,51 @@ signature module AstSig { /** A logical NOT expression. */ class LogicalNotExpr extends UnaryExpr; + /** + * An assignment expression, either compound or simple. + * + * Examples: + * + * ``` + * x = y + * sum += element + * ``` + */ + class Assignment extends BinaryExpr; + + /** A simple assignment expression, for example `x = y`. */ + class AssignExpr extends Assignment; + + /** A compound assignment expression, for example `x += y` or `x ??= y`. */ + class CompoundAssignment extends Assignment; + + /** A short-circuiting logical AND compound assignment expression. */ + class AssignLogicalAndExpr extends CompoundAssignment; + + /** A short-circuiting logical OR compound assignment expression. */ + class AssignLogicalOrExpr extends CompoundAssignment; + + /** A short-circuiting null-coalescing compound assignment expression. */ + class AssignNullCoalescingExpr extends CompoundAssignment; + /** A boolean literal expression. */ class BooleanLiteral extends Expr { /** Gets the boolean value of this literal. */ boolean getValue(); } + + /** + * A pattern matching expression. + * + * In Java this is `x instanceof Pattern`, and in C# this is `x is Pattern`. + */ + class PatternMatchExpr extends Expr { + /** Gets the expression being matched. */ + Expr getExpr(); + + /** Gets the pattern being matched against. */ + AstNode getPattern(); + } } /** @@ -426,12 +473,14 @@ module Make0 Ast> { or n instanceof ReturnStmt or - n instanceof ThrowStmt + n instanceof Throw or n instanceof BreakStmt or n instanceof ContinueStmt or + n instanceof GotoStmt + or n instanceof Expr and exists(getChild(n, _)) and not Input1::preOrderExpr(n) and @@ -449,11 +498,14 @@ module Make0 Ast> { * is the value that causes the short-circuit. */ private predicate shortCircuiting(BinaryExpr expr, ConditionalSuccessor shortcircuitValue) { - expr instanceof LogicalAndExpr and shortcircuitValue.(BooleanSuccessor).getValue() = false + (expr instanceof LogicalAndExpr or expr instanceof AssignLogicalAndExpr) and + shortcircuitValue.(BooleanSuccessor).getValue() = false or - expr instanceof LogicalOrExpr and shortcircuitValue.(BooleanSuccessor).getValue() = true + (expr instanceof LogicalOrExpr or expr instanceof AssignLogicalOrExpr) and + shortcircuitValue.(BooleanSuccessor).getValue() = true or - expr instanceof NullCoalescingExpr and shortcircuitValue.(NullnessSuccessor).getValue() = true + (expr instanceof NullCoalescingExpr or expr instanceof AssignNullCoalescingExpr) and + shortcircuitValue.(NullnessSuccessor).getValue() = false } /** @@ -463,9 +515,10 @@ module Make0 Ast> { private predicate propagatesValue(AstNode child, AstNode parent) { Input1::propagatesValue(child, parent) or - // For now, the `not postOrInOrder(parent)` is superfluous, as we don't - // have any short-circuiting post-order expressions yet, but this will - // change once we add support for e.g. C#'s `??=`. + // Short-circuiting post-order expressions, i.e. short-circuiting + // compound assignments, e.g. C#'s `??=`, cannot propagate the value of + // the right-hand side to the parent, as the assignment must take place + // in-between, so propagating the value would imply splitting. shortCircuiting(parent, _) and not postOrInOrder(parent) and parent.(BinaryExpr).getRightOperand() = child @@ -535,6 +588,8 @@ module Make0 Ast> { private string loopHeaderTag() { result = "[LoopHeader]" } + private string patternMatchTrueTag() { result = "[match-true]" } + /** * Holds if an additional node tagged with `tag` should be created for * `n`. Edges targeting such nodes are labeled with `t` and therefore `t` @@ -546,6 +601,10 @@ module Make0 Ast> { n instanceof LoopStmt and tag = loopHeaderTag() and t instanceof DirectSuccessor + or + n instanceof PatternMatchExpr and + tag = patternMatchTrueTag() and + t.(BooleanSuccessor).getValue() = true } /** @@ -561,9 +620,11 @@ module Make0 Ast> { or n instanceof ContinueStmt or + n instanceof GotoStmt + or n instanceof ReturnStmt or - n instanceof ThrowStmt + n instanceof Throw or cannotTerminateNormally(n.(BlockStmt).getLastStmt()) or @@ -833,7 +894,7 @@ module Make0 Ast> { override string toString() { result = tag + " " + n } } - final private class EntryNodeImpl extends NodeImpl, TEntryNode { + final class EntryNodeImpl extends NodeImpl, TEntryNode { private Callable c; EntryNodeImpl() { this = TEntryNode(c) } @@ -872,7 +933,7 @@ module Make0 Ast> { } /** A control flow node indicating normal termination of a callable. */ - final private class NormalExitNodeImpl extends AnnotatedExitNodeImpl { + final class NormalExitNodeImpl extends AnnotatedExitNodeImpl { NormalExitNodeImpl() { this = TAnnotatedExitNode(_, true) } } @@ -992,7 +1053,7 @@ module Make0 Ast> { ast instanceof ReturnStmt and c.getSuccessorType() instanceof ReturnSuccessor or - ast instanceof ThrowStmt and + ast instanceof Throw and c.getSuccessorType() instanceof ExceptionSuccessor or ast instanceof BreakStmt and @@ -1000,6 +1061,9 @@ module Make0 Ast> { or ast instanceof ContinueStmt and c.getSuccessorType() instanceof ContinueSuccessor + or + ast instanceof GotoStmt and + c.getSuccessorType() instanceof GotoSuccessor ) and ( not Input1::hasLabel(ast, _) and not c.hasLabel(_) @@ -1020,6 +1084,11 @@ module Make0 Ast> { ) } + private Stmt getAStmtInBlock(AstNode block) { + result = block.(BlockStmt).getStmt(_) or + result = block.(Switch).getStmt(_) + } + /** * Holds if an abrupt completion `c` from within `ast` is caught with * flow continuing at `n`. @@ -1098,6 +1167,16 @@ module Make0 Ast> { Input1::hasLabel(switch, l) ) ) + or + exists(AstNode block, Input1::Label l, Stmt lblstmt | + ast = getAStmtInBlock(block) and + lblstmt = getAStmtInBlock(block) and + not lblstmt instanceof GotoStmt and + Input1::hasLabel(pragma[only_bind_into](lblstmt), l) and + n.isBefore(lblstmt) and + c.getSuccessorType() instanceof GotoSuccessor and + c.hasLabel(l) + ) } /** @@ -1180,9 +1259,12 @@ module Make0 Ast> { Input2::step(n1, n2) or exists(Callable c | + // Allow language-specific overrides for the default entry and exit edges. + not Input2::step(n1, _) and n1.(EntryNodeImpl).getEnclosingCallable() = c and n2.isBefore(callableGetBody(c)) or + not Input2::step(_, n2) and n1.isAfter(callableGetBody(c)) and n2.(NormalExitNodeImpl).getEnclosingCallable() = c or @@ -1214,7 +1296,7 @@ module Make0 Ast> { n1.isAfterValue(binexpr.getLeftOperand(), shortcircuitValue) and n2.isAfterValue(binexpr, shortcircuitValue) or - // short-circuiting operations with side-effects (e.g. `x &&= y`, `x?.Prop = y`) are in post-order: + // short-circuiting operations with side-effects (e.g. `x &&= y`) are in post-order: n1.isAfter(binexpr.getRightOperand()) and n2.isIn(binexpr) or @@ -1249,6 +1331,26 @@ module Make0 Ast> { n2.isAfterValue(boollit, any(BooleanSuccessor t | t.getValue() = boollit.getValue())) ) or + exists(PatternMatchExpr pme | + n1.isBefore(pme) and + n2.isBefore(pme.getExpr()) + or + n1.isAfter(pme.getExpr()) and + n2.isIn(pme) + or + n1.isIn(pme) and + n2.isAfterValue(pme, any(BooleanSuccessor s | s.getValue() = false)) + or + n1.isIn(pme) and + n2.isAdditional(pme, patternMatchTrueTag()) + or + n1.isAdditional(pme, patternMatchTrueTag()) and + n2.isBefore(pme.getPattern()) + or + n1.isAfter(pme.getPattern()) and + n2.isAfterValue(pme, any(BooleanSuccessor s | s.getValue() = true)) + ) + or exists(IfStmt ifstmt | n1.isBefore(ifstmt) and n2.isBefore(ifstmt.getCondition()) @@ -1685,6 +1787,72 @@ module Make0 Ast> { ControlFlowNode getAnExceptionSuccessor() { result = this.getASuccessor(any(ExceptionSuccessor t)) } + + /** + * Holds if this node dominates `that` node. + * + * That is, all paths reaching `that` node from the callable entry + * node (`EntryNode`) must go through this node. + */ + bindingset[this, that] + pragma[inline_late] + predicate dominates(ControlFlowNode that) { + this.strictlyDominates(that) + or + this = that + } + + /** + * Holds if this node strictly dominates `that` node. + * + * That is, all paths reaching `that` node from the callable entry + * node (`EntryNode`) must go through this node (which must be + * different from `that` node). + */ + bindingset[this, that] + pragma[inline_late] + predicate strictlyDominates(ControlFlowNode that) { + this.getBasicBlock().strictlyDominates(that.getBasicBlock()) + or + exists(BasicBlock bb, int i, int j | + bb.getNode(i) = this and + bb.getNode(j) = that and + i < j + ) + } + + /** + * Holds if this node post-dominates `that` node. + * + * That is, all paths reaching the normal callable exit node + * (`NormalExitNode`) from `that` node must go through this node. + */ + bindingset[this, that] + pragma[inline_late] + predicate postDominates(ControlFlowNode that) { + this.strictlyPostDominates(that) + or + this = that + } + + /** + * Holds if this node strictly post-dominates `that` node. + * + * That is, all paths reaching the normal callable exit node + * (`NormalExitNode`) from `that` node must go through this node + * (which must be different from `that` node). + */ + bindingset[this, that] + pragma[inline_late] + predicate strictlyPostDominates(ControlFlowNode that) { + this.getBasicBlock().strictlyPostDominates(that.getBasicBlock()) + or + exists(BasicBlock bb, int i, int j | + bb.getNode(i) = this and + bb.getNode(j) = that and + i > j + ) + } } /** Provides additional classes for interacting with the control flow graph. */ @@ -1704,6 +1872,7 @@ module Make0 Ast> { /** A control flow node indicating the termination of a callable. */ final class ExitNode extends ControlFlowNode, ExitNodeImpl { } + import SuccessorType import Additional } @@ -1757,6 +1926,53 @@ module Make0 Ast> { /** Provides a set of consistency queries. */ module Consistency { + /** Holds if the consistency query `query` has `results` results. */ + query predicate consistencyOverview(string query, int results) { + query = "deadEnd" and results = strictcount(ControlFlowNode node | deadEnd(node)) + or + query = "nonUniqueEnclosingCallable" and + results = + strictcount(AstNode n, int callables | nonUniqueEnclosingCallable(n, callables)) + or + query = "nonUniqueInConditionalContext" and + results = strictcount(AstNode n | nonUniqueInConditionalContext(n)) + or + query = "nonLocalStep" and + results = + strictcount(ControlFlowNode n1, SuccessorType t, ControlFlowNode n2 | + nonLocalStep(n1, t, n2) + ) + or + query = "ambiguousAdditionalNode" and + results = strictcount(AstNode n, string tag | ambiguousAdditionalNode(n, tag)) + or + query = "missingInNodeForPostOrInOrder" and + results = strictcount(AstNode ast | missingInNodeForPostOrInOrder(ast)) + or + query = "multipleSuccessors" and + results = + strictcount(ControlFlowNode node, SuccessorType t, ControlFlowNode successor | + multipleSuccessors(node, t, successor) + ) + or + query = "multipleConditionalSuccessorKinds" and + results = + strictcount(ControlFlowNode node, ConditionalSuccessor t1, ConditionalSuccessor t2, + ControlFlowNode succ1, ControlFlowNode succ2 | + multipleConditionalSuccessorKinds(node, t1, t2, succ1, succ2) + ) + or + query = "directAndConditionalSuccessor" and + results = + strictcount(ControlFlowNode node, ConditionalSuccessor t1, DirectSuccessor t2, + ControlFlowNode succ1, ControlFlowNode succ2 | + directAndConditionalSuccessors(node, t1, t2, succ1, succ2) + ) + or + query = "selfLoop" and + results = strictcount(ControlFlowNode node, SuccessorType t | selfLoop(node, t)) + } + /** * Holds if `node` is lacking a successor. * @@ -1767,6 +1983,11 @@ module Make0 Ast> { not exists(node.getASuccessor(_)) } + /** Holds if `n` does not have a unique enclosing callable. */ + query predicate nonUniqueEnclosingCallable(AstNode n, int callables) { + callables = strictcount(getEnclosingCallable(n)) and callables > 1 + } + /** * Holds if `n` is in a conditional context with multiple condition kinds. * @@ -1888,7 +2109,10 @@ module Make0 Ast> { ControlFlowNode succ1, ControlFlowNode succ2 ) { succ1 = node.getASuccessor(t1) and - succ2 = node.getASuccessor(t2) + succ2 = node.getASuccessor(t2) and + // allow for the pattern match true edge when a pattern match + // expression is not in a conditional context + not succ1.isAdditional(_, patternMatchTrueTag()) } /**