diff --git a/csharp/ql/src/CSI/NullMaybe.ql b/csharp/ql/src/CSI/NullMaybe.ql index eaacd7fa3da..7bd099e78e9 100644 --- a/csharp/ql/src/CSI/NullMaybe.ql +++ b/csharp/ql/src/CSI/NullMaybe.ql @@ -2,7 +2,7 @@ * @name Dereferenced variable may be null * @description Dereferencing a variable whose value may be 'null' may cause a * 'NullReferenceException'. - * @kind problem + * @kind path-problem * @problem.severity warning * @precision high * @id cs/dereferenced-value-may-be-null @@ -14,7 +14,8 @@ import csharp import semmle.code.csharp.dataflow.Nullness +import PathGraph -from Dereference d, Ssa::SourceVariable v, string msg, Element reason -where d.isFirstMaybeNull(v.getAnSsaDefinition(), msg, reason) -select d, "Variable $@ may be null here " + msg + ".", v, v.toString(), reason, "this" +from Dereference d, PathNode source, PathNode sink, Ssa::SourceVariable v, string msg, Element reason +where d.isFirstMaybeNull(v.getAnSsaDefinition(), source, sink, msg, reason) +select d, source, sink, "Variable $@ may be null here " + msg + ".", v, v.toString(), reason, "this" diff --git a/csharp/ql/src/semmle/code/csharp/Assignable.qll b/csharp/ql/src/semmle/code/csharp/Assignable.qll index e6002f5f9dc..7802396d83d 100644 --- a/csharp/ql/src/semmle/code/csharp/Assignable.qll +++ b/csharp/ql/src/semmle/code/csharp/Assignable.qll @@ -441,6 +441,12 @@ class AssignableDefinition extends TAssignableDefinition { */ Expr getExpr() { none() } + /** + * Gets the underlying element associated with this definition. This is either + * an expression or a parameter. + */ + Element getElement() { result = this.getExpr() } + /** Gets the enclosing callable of this definition. */ Callable getEnclosingCallable() { result = this.getExpr().getEnclosingCallable() } @@ -703,6 +709,8 @@ module AssignableDefinitions { result = p.getCallable().getEntryPoint() } + override Parameter getElement() { result = p } + override Callable getEnclosingCallable() { result = p.getCallable() } diff --git a/csharp/ql/src/semmle/code/csharp/controlflow/Guards.qll b/csharp/ql/src/semmle/code/csharp/controlflow/Guards.qll index 5cf2582f095..a1c112c8057 100644 --- a/csharp/ql/src/semmle/code/csharp/controlflow/Guards.qll +++ b/csharp/ql/src/semmle/code/csharp/controlflow/Guards.qll @@ -578,8 +578,12 @@ module Internal { */ Expr getNullEquivParent(Expr e) { result = any(QualifiableExpr qe | - qe.getQualifier() = e and qe.isConditional() and + ( + e = qe.getQualifier() + or + e = qe.(ExtensionMethodCall).getArgument(0) + ) and ( // The accessed declaration must have a value type in order // for `only if` to hold @@ -690,7 +694,7 @@ module Internal { predicate preControls(PreBasicBlocks::PreBasicBlock bb, AbstractValue v) { exists(AbstractValue v0, Guard g | g.preControlsDirect(bb, v0) | - impliesSteps(g, v0, this, v) + preImpliesSteps(g, v0, this, v) ) } @@ -777,7 +781,7 @@ module Internal { def.nullGuardedReturn(ret, isNull) or exists(NullValue nv | - impliesSteps(ret, retVal, def.getARead(), nv) | + preImpliesSteps(ret, retVal, def.getARead(), nv) | if nv.isNull() then isNull = true else isNull = false ) ) @@ -1119,6 +1123,28 @@ module Internal { def = guarded.getAnSsaQualifier() ) } + + /** + * Holds if the assumption that `g1` has abstract value `v1` implies that + * `g2` has abstract value `v2`, using one step of reasoning. That is, the + * evaluation of `g2` to `v2` dominates the evaluation of `g1` to `v1`. + * + * This predicate relies on the control flow graph. + */ + cached + predicate impliesStep(Guard g1, AbstractValue v1, Guard g2, AbstractValue v2) { + preImpliesStep(g1, v1, g2, v2) + or + forex(ControlFlow::Node cfn | + cfn = g1.getAControlFlowNode() | + exists(Ssa::ExplicitDefinition def | + def.getADefinition().getSource() = g2 | + g1 = def.getAReadAtNode(cfn) and + v1 = g1.getAValue() and + v2 = v1 + ) + ) + } } import Cached @@ -1139,9 +1165,11 @@ module Internal { * Holds if the assumption that `g1` has abstract value `v1` implies that * `g2` has abstract value `v2`, using one step of reasoning. That is, the * evaluation of `g2` to `v2` dominates the evaluation of `g1` to `v1`. + * + * This predicate does not rely on the control flow graph. */ cached - predicate impliesStep(Guard g1, AbstractValue v1, Guard g2, AbstractValue v2) { + predicate preImpliesStep(Guard g1, AbstractValue v1, Guard g2, AbstractValue v2) { g1 = any(BinaryOperation bo | ( bo instanceof BitwiseAndExpr or @@ -1275,6 +1303,26 @@ module Internal { * Holds if the assumption that `g1` has abstract value `v1` implies that * `g2` has abstract value `v2`, using zero or more steps of reasoning. That is, * the evaluation of `g2` to `v2` dominates the evaluation of `g1` to `v1`. + * + * This predicate does not rely on the control flow graph. + */ + predicate preImpliesSteps(Guard g1, AbstractValue v1, Guard g2, AbstractValue v2) { + g1 = g2 and + v1 = v2 and + v1 = g1.getAValue() + or + exists(Expr mid, AbstractValue vMid | + preImpliesSteps(g1, v1, mid, vMid) | + preImpliesStep(mid, vMid, g2, v2) + ) + } + + /** + * Holds if the assumption that `g1` has abstract value `v1` implies that + * `g2` has abstract value `v2`, using zero or more steps of reasoning. That is, + * the evaluation of `g2` to `v2` dominates the evaluation of `g1` to `v1`. + * + * This predicate relies on the control flow graph. */ predicate impliesSteps(Guard g1, AbstractValue v1, Guard g2, AbstractValue v2) { g1 = g2 and diff --git a/csharp/ql/src/semmle/code/csharp/dataflow/Nullness.qll b/csharp/ql/src/semmle/code/csharp/dataflow/Nullness.qll index 5f0f7932b90..26c8fb44e11 100644 --- a/csharp/ql/src/semmle/code/csharp/dataflow/Nullness.qll +++ b/csharp/ql/src/semmle/code/csharp/dataflow/Nullness.qll @@ -147,6 +147,15 @@ private ControlFlowElement getANullCheck(Ssa::Definition def, SuccessorTypes::Co ) } +private predicate isMaybeNullArgument(Ssa::ExplicitDefinition def, MaybeNullExpr arg) { + exists(AssignableDefinitions::ImplicitParameterDefinition pdef, Parameter p | + pdef = def.getADefinition() | + p = pdef.getParameter().getSourceDeclaration() and + p.getAnAssignedArgument() = arg and + not arg.getEnclosingCallable().getEnclosingCallable*() instanceof TestMethod + ) +} + /** Holds if `def` is an SSA definition that may be `null`. */ private predicate defMaybeNull(Ssa::Definition def, string msg, Element reason) { // A variable compared to `null` might be `null` @@ -154,21 +163,20 @@ private predicate defMaybeNull(Ssa::Definition def, string msg, Element reason) de = def.getARead() | reason = de.getANullCheck(_, true) and msg = "as suggested by $@ null check" and - not def instanceof Ssa::PseudoDefinition and + not de = any(Ssa::PseudoDefinition pdef).getARead() and + strictcount(Element e | + e = any(Ssa::Definition def0 | de = def0.getARead()).getElement() + ) = 1 and not nonNullDef(def) and // Don't use a check as reason if there is a `null` assignment - not def.(Ssa::ExplicitDefinition).getADefinition().getSource() instanceof MaybeNullExpr + // or argument + not def.(Ssa::ExplicitDefinition).getADefinition().getSource() instanceof MaybeNullExpr and + not isMaybeNullArgument(def, _) ) or // A parameter might be `null` if there is a `null` argument somewhere - exists(AssignableDefinitions::ImplicitParameterDefinition pdef, Parameter p, MaybeNullExpr arg | - pdef = def.(Ssa::ExplicitDefinition).getADefinition() | - p = pdef.getParameter().getSourceDeclaration() and - p.getAnAssignedArgument() = arg and - reason = arg and - msg = "because of $@ null argument" and - not arg.getEnclosingCallable().getEnclosingCallable*() instanceof TestMethod - ) + isMaybeNullArgument(def, reason) and + msg = "because of $@ null argument" or // If the source of a variable is `null` then the variable may be `null` exists(AssignableDefinition adef | @@ -199,12 +207,12 @@ private predicate defNullImpliesStep(Ssa::Definition def1, BasicBlock bb1, Ssa:: def1.getSourceVariable() = v | def2.(Ssa::PseudoDefinition).getAnInput() = def1 and - def2.definesAt(bb2, _) + bb2 = def2.getBasicBlock() or def2 = def1 and not exists(Ssa::PseudoDefinition def | def.getSourceVariable() = v and - def.definesAt(bb2, _) + bb2 = def.getBasicBlock() ) ) and def1.isLiveAtEndOfBlock(bb1) and @@ -221,13 +229,12 @@ private predicate defNullImpliesStep(Ssa::Definition def1, BasicBlock bb1, Ssa:: * The transitive closure of `defNullImpliesStep()` originating from `defMaybeNull()`. * That is, those basic blocks for which the SSA definition is suspected of being `null`. */ -private predicate defMaybeNullInBlock(Ssa::Definition def, Ssa::SourceVariable v, BasicBlock bb) { +private predicate defMaybeNullInBlock(Ssa::Definition def, BasicBlock bb) { defMaybeNull(def, _, _) and - def.definesAt(bb, _) and - v = def.getSourceVariable() + bb = def.getBasicBlock() or exists(BasicBlock mid, Ssa::Definition midDef | - defMaybeNullInBlock(midDef, v, mid) | + defMaybeNullInBlock(midDef, mid) | defNullImpliesStep(midDef, mid, def, bb) ) } @@ -239,20 +246,167 @@ private predicate defMaybeNullInBlock(Ssa::Definition def, Ssa::SourceVariable v private predicate nullDerefCandidateVariable(Ssa::SourceVariable v) { exists(Ssa::Definition def, BasicBlock bb | potentialNullDereferenceAt(bb, _, def, _) | - defMaybeNullInBlock(def, v, bb) + defMaybeNullInBlock(def, bb) and + v = def.getSourceVariable() ) } -private predicate defMaybeNullInBlockOrigin(Ssa::Definition origin, Ssa::Definition def, BasicBlock bb) { - nullDerefCandidateVariable(def.getSourceVariable()) and - defMaybeNull(def, _, _) and - def.definesAt(bb, _) and - origin = def +private predicate succStep(PathNode pred, Ssa::Definition def, BasicBlock bb) { + defNullImpliesStep(pred.getSsaDefinition(), pred.getBasicBlock(), def, bb) +} + +private predicate succNullArgument(SourcePathNode pred, Ssa::Definition def, BasicBlock bb) { + pred = TSourcePathNode(def, _, _, true) and + bb = def.getBasicBlock() +} + +private predicate succSourceSink(SourcePathNode source, Ssa::Definition def, BasicBlock bb) { + source = TSourcePathNode(def, _, _, false) and + bb = def.getBasicBlock() +} + +private newtype TPathNode = + TSourcePathNode(Ssa::Definition def, string msg, Element reason, boolean isNullArgument) { + nullDerefCandidateVariable(def.getSourceVariable()) and + defMaybeNull(def, msg, reason) and + if isMaybeNullArgument(def, reason) then isNullArgument = true else isNullArgument = false + } or - exists(BasicBlock mid, Ssa::Definition midDef | - defMaybeNullInBlockOrigin(origin, midDef, mid) and - defNullImpliesStep(midDef, mid, def, bb) - ) + TInternalPathNode(Ssa::Definition def, BasicBlock bb) { + succStep(_, def, bb) + or + succNullArgument(_, def, bb) + } + or + TSinkPathNode(Ssa::Definition def, BasicBlock bb, int i, Dereference d) { + potentialNullDereferenceAt(bb, i, def, d) and + ( + succStep(_, def, bb) + or + succNullArgument(_, def, bb) + or + succSourceSink(_, def, bb) + ) + } + +/** + * An SSA definition, which may be `null`, augmented with at basic block which can + * be reached without passing through a `null` check. + */ +abstract class PathNode extends TPathNode { + /** Gets the SSA definition. */ + abstract Ssa::Definition getSsaDefinition(); + + /** Gets the basic block that can be reached without passing through a `null` check. */ + abstract BasicBlock getBasicBlock(); + + /** Gets another node that can be reached from this node. */ + abstract PathNode getASuccessor(); + + /** Gets a textual representation of this node. */ + abstract string toString(); + + /** Gets the location of this node. */ + abstract Location getLocation(); +} + +private class SourcePathNode extends PathNode, TSourcePathNode { + private Ssa::Definition def; + private string msg; + private Element reason; + private boolean isNullArgument; + + SourcePathNode() { this = TSourcePathNode(def, msg, reason, isNullArgument) } + + override Ssa::Definition getSsaDefinition() { result = def } + + override BasicBlock getBasicBlock() { + isNullArgument = false and + result = def.getBasicBlock() + } + + string getMessage() { result = msg } + + Element getReason() { result = reason } + + override PathNode getASuccessor() { + succStep(this, result.getSsaDefinition(), result.getBasicBlock()) + or + succNullArgument(this, result.getSsaDefinition(), result.getBasicBlock()) + or + result instanceof SinkPathNode and + succSourceSink(this, result.getSsaDefinition(), result.getBasicBlock()) + } + + override string toString() { + if isNullArgument = true then + result = reason.toString() + else + result = def.toString() + } + + override Location getLocation() { + if isNullArgument = true then + result = reason.getLocation() + else + result = def.getLocation() + } +} + +private class InternalPathNode extends PathNode, TInternalPathNode { + private Ssa::Definition def; + private BasicBlock bb; + + InternalPathNode() { this = TInternalPathNode(def, bb) } + + override Ssa::Definition getSsaDefinition() { result = def } + + override BasicBlock getBasicBlock() { result = bb } + + override PathNode getASuccessor() { + succStep(this, result.getSsaDefinition(), result.getBasicBlock()) + } + + override string toString() { result = bb.getFirstNode().toString() } + + override Location getLocation() { result = bb.getFirstNode().getLocation() } +} + +private class SinkPathNode extends PathNode, TSinkPathNode { + private Ssa::Definition def; + private BasicBlock bb; + private int i; + private Dereference d; + + SinkPathNode() { this = TSinkPathNode(def, bb, i, d) } + + override Ssa::Definition getSsaDefinition() { result = def } + + override BasicBlock getBasicBlock() { result = bb } + + override PathNode getASuccessor() { none() } + + Dereference getDereference() { result = d } + + override string toString() { result = d.toString() } + + override Location getLocation() { result = d.getLocation() } +} + +/** + * Provides the query predicates needed to include a graph in a path-problem query + * for `Dereference::is[First]MaybeNull()`. + */ +module PathGraph { + query predicate nodes(PathNode n) { + n.getASuccessor*() instanceof SinkPathNode + } + + query predicate edges(PathNode pred, PathNode succ) { + nodes(pred) and + nodes(succ) and + succ = pred.getASuccessor() + } } private Ssa::Definition getAPseudoInput(Ssa::Definition def) { @@ -279,7 +433,7 @@ private predicate defReaches(Ssa::Definition def, AssignableRead ar, boolean alw defReaches(def, mid, always) | ar = mid.getANextRead() and not mid = any(Dereference d | - if always = true then d.isAlwaysNull(def.getSourceVariable()) else d.isMaybeNull(def, _, _) + if always = true then d.isAlwaysNull(def.getSourceVariable()) else d.isMaybeNull(def, _, _, _, _) ) ) } @@ -375,24 +529,16 @@ class Dereference extends G::DereferenceableExpr { defReaches(v.getAnSsaDefinition(), this, true) } - pragma[noinline] - private predicate nullDerefCandidate(Ssa::Definition origin) { - exists(Ssa::Definition ssa, BasicBlock bb | - potentialNullDereferenceAt(bb, _, ssa, this) | - defMaybeNullInBlockOrigin(origin, ssa, bb) - ) - } - /** * Holds if this expression dereferences SSA definition `def`, which may * be `null`. */ - predicate isMaybeNull(Ssa::Definition def, string msg, Element reason) { - exists(Ssa::Definition origin, BasicBlock bb | - this.nullDerefCandidate(origin) and - defMaybeNull(origin, msg, reason) and - potentialNullDereferenceAt(bb, _, def, this) - ) and + predicate isMaybeNull(Ssa::Definition def, SourcePathNode source, SinkPathNode sink, string msg, Element reason) { + source.getASuccessor*() = sink and + msg = source.getMessage() and + reason = source.getReason() and + def = sink.getSsaDefinition() and + this = sink.getDereference() and not this.isAlwaysNull(def.getSourceVariable()) } @@ -401,8 +547,8 @@ class Dereference extends G::DereferenceableExpr { * be `null`, and this expression can be reached from `def` without passing * through another such dereference. */ - predicate isFirstMaybeNull(Ssa::Definition def, string msg, Element reason) { - this.isMaybeNull(def, msg, reason) and + predicate isFirstMaybeNull(Ssa::Definition def, SourcePathNode source, SinkPathNode sink, string msg, Element reason) { + this.isMaybeNull(def, source, sink, msg, reason) and defReaches(def, this, false) } } diff --git a/csharp/ql/src/semmle/code/csharp/dataflow/SSA.qll b/csharp/ql/src/semmle/code/csharp/dataflow/SSA.qll index e1af158d0d4..3abcf4ad10a 100644 --- a/csharp/ql/src/semmle/code/csharp/dataflow/SSA.qll +++ b/csharp/ql/src/semmle/code/csharp/dataflow/SSA.qll @@ -2172,6 +2172,21 @@ module Ssa { definesAt(this, bb, i, _) } + /** Gets the basic block to which this SSA definition belongs. */ + BasicBlock getBasicBlock() { this.definesAt(result, _) } + + /** + * Gets the syntax element associated with this SSA definition, if any. + * This is either an expression, for example `x = 0`, a parameter, or a + * callable. Pseudo nodes have no associated syntax element. + */ + Element getElement() { + exists(BasicBlock bb, int i | + this.definesAt(bb, i) | + result = bb.getNode(i).getElement() + ) + } + /** * Holds if this SSA definition assigns to `out`/`ref` parameter `p`, and the * parameter may remain unchanged throughout the rest of the enclosing callable. @@ -2261,6 +2276,8 @@ module Ssa { isCapturedVariableDefinitionFlowOut(this, cdef) } + override Element getElement() { result = ad.getElement() } + override string toString() { if this.getADefinition() instanceof AssignableDefinitions::ImplicitParameterDefinition then result = getToStringPrefix(this) + "SSA param(" + this.getSourceVariable() + ")" @@ -2304,6 +2321,8 @@ module Ssa { ) } + override Callable getElement() { result = this.getCallable() } + override string toString() { if this.getSourceVariable().getAssignable() instanceof LocalScopeVariable then result = getToStringPrefix(this) + "SSA capture def(" + this.getSourceVariable() + ")" diff --git a/csharp/ql/test/library-tests/controlflow/guards/Implications.expected b/csharp/ql/test/library-tests/controlflow/guards/Implications.expected index 7e78c7d7198..67de6b196c5 100644 --- a/csharp/ql/test/library-tests/controlflow/guards/Implications.expected +++ b/csharp/ql/test/library-tests/controlflow/guards/Implications.expected @@ -251,6 +251,10 @@ | Guards.cs:106:9:106:25 | ... = ... | non-null | Guards.cs:106:22:106:25 | null | non-null | | Guards.cs:106:9:106:25 | ... = ... | null | Guards.cs:106:9:106:18 | access to property Property | null | | Guards.cs:106:9:106:25 | ... = ... | null | Guards.cs:106:22:106:25 | null | null | +| Guards.cs:107:27:107:36 | access to property Property | non-null | Guards.cs:106:22:106:25 | null | non-null | +| Guards.cs:107:27:107:36 | access to property Property | null | Guards.cs:106:22:106:25 | null | null | +| Guards.cs:108:27:108:36 | access to property Property | non-null | Guards.cs:106:22:106:25 | null | non-null | +| Guards.cs:108:27:108:36 | access to property Property | null | Guards.cs:106:22:106:25 | null | null | | Guards.cs:113:13:114:38 | String dummy = ... | non-null | Guards.cs:113:13:113:17 | access to local variable dummy | non-null | | Guards.cs:113:13:114:38 | String dummy = ... | null | Guards.cs:113:13:113:17 | access to local variable dummy | null | | Guards.cs:115:9:115:55 | ... = ... | non-null | Guards.cs:115:9:115:13 | access to local variable dummy | non-null | @@ -261,6 +265,10 @@ | Guards.cs:117:9:117:25 | ... = ... | non-null | Guards.cs:117:22:117:25 | null | non-null | | Guards.cs:117:9:117:25 | ... = ... | null | Guards.cs:117:9:117:18 | access to property Property | null | | Guards.cs:117:9:117:25 | ... = ... | null | Guards.cs:117:22:117:25 | null | null | +| Guards.cs:118:27:118:36 | access to property Property | non-null | Guards.cs:117:22:117:25 | null | non-null | +| Guards.cs:118:27:118:36 | access to property Property | null | Guards.cs:117:22:117:25 | null | null | +| Guards.cs:119:27:119:36 | access to property Property | non-null | Guards.cs:117:22:117:25 | null | non-null | +| Guards.cs:119:27:119:36 | access to property Property | null | Guards.cs:117:22:117:25 | null | null | | Guards.cs:124:13:124:30 | Boolean b1 = ... | false | Guards.cs:124:13:124:14 | access to local variable b1 | false | | Guards.cs:124:13:124:30 | Boolean b1 = ... | true | Guards.cs:124:13:124:14 | access to local variable b1 | true | | Guards.cs:125:13:125:31 | Nullable b2 = ... | non-null | Guards.cs:125:13:125:14 | access to local variable b2 | non-null | diff --git a/csharp/ql/test/query-tests/Nullness/E.cs b/csharp/ql/test/query-tests/Nullness/E.cs index aebc5138f40..6be4074be02 100644 --- a/csharp/ql/test/query-tests/Nullness/E.cs +++ b/csharp/ql/test/query-tests/Nullness/E.cs @@ -260,6 +260,44 @@ public class E i = 0; return i.Value; // GOOD } + + public void Ex22() + { + object o = null; + try + { + o = Make(); + o.ToString(); // GOOD + } + finally + { + if (o != null) + o.ToString(); // GOOD + } + } + + public void Ex23(bool b) + { + if (b) + b.ToString(); + var o = Make(); + o?.ToString(); + o.ToString(); // BAD (maybe) + if (b) + b.ToString(); + } + + public void Ex24(bool b) + { + string s = b ? null : ""; + if (s?.M2() == 0) + { + s.ToString(); // GOOD + } + } + + public bool Field; + string Make() => Field ? null : ""; } public static class Extensions diff --git a/csharp/ql/test/query-tests/Nullness/EqualityCheck.expected b/csharp/ql/test/query-tests/Nullness/EqualityCheck.expected index d14a8ce9554..61b5f7a61bf 100644 --- a/csharp/ql/test/query-tests/Nullness/EqualityCheck.expected +++ b/csharp/ql/test/query-tests/Nullness/EqualityCheck.expected @@ -211,6 +211,10 @@ | E.cs:252:13:252:21 | ... != ... | false | E.cs:252:18:252:21 | null | E.cs:252:13:252:13 | access to parameter i | | E.cs:259:13:259:21 | ... == ... | true | E.cs:259:13:259:13 | access to parameter i | E.cs:259:18:259:21 | null | | E.cs:259:13:259:21 | ... == ... | true | E.cs:259:18:259:21 | null | E.cs:259:13:259:13 | access to parameter i | +| E.cs:274:17:274:25 | ... != ... | false | E.cs:274:17:274:17 | access to local variable o | E.cs:274:22:274:25 | null | +| E.cs:274:17:274:25 | ... != ... | false | E.cs:274:22:274:25 | null | E.cs:274:17:274:17 | access to local variable o | +| E.cs:293:13:293:24 | ... == ... | true | E.cs:293:15:293:19 | call to method M2 | E.cs:293:24:293:24 | (...) ... | +| E.cs:293:13:293:24 | ... == ... | true | E.cs:293:24:293:24 | (...) ... | E.cs:293:15:293:19 | call to method M2 | | Forwarding.cs:59:13:59:21 | ... == ... | true | Forwarding.cs:59:13:59:13 | access to parameter o | Forwarding.cs:59:18:59:21 | null | | Forwarding.cs:59:13:59:21 | ... == ... | true | Forwarding.cs:59:18:59:21 | null | Forwarding.cs:59:13:59:13 | access to parameter o | | Forwarding.cs:78:16:78:39 | call to method ReferenceEquals | true | Forwarding.cs:78:32:78:32 | access to parameter o | Forwarding.cs:78:35:78:38 | null | diff --git a/csharp/ql/test/query-tests/Nullness/Implications.expected b/csharp/ql/test/query-tests/Nullness/Implications.expected index 0ceb07b87bf..aef55ff476c 100644 --- a/csharp/ql/test/query-tests/Nullness/Implications.expected +++ b/csharp/ql/test/query-tests/Nullness/Implications.expected @@ -930,6 +930,8 @@ | D.cs:187:13:187:28 | ... = ... | non-null | D.cs:187:20:187:28 | call to method MkMaybe | non-null | | D.cs:187:13:187:28 | ... = ... | null | D.cs:187:13:187:16 | access to local variable obj3 | null | | D.cs:187:13:187:28 | ... = ... | null | D.cs:187:20:187:28 | call to method MkMaybe | null | +| D.cs:190:9:190:12 | access to local variable obj3 | non-null | D.cs:187:20:187:28 | call to method MkMaybe | non-null | +| D.cs:190:9:190:12 | access to local variable obj3 | null | D.cs:187:20:187:28 | call to method MkMaybe | null | | D.cs:195:13:195:28 | Object o = ... | non-null | D.cs:195:13:195:13 | access to local variable o | non-null | | D.cs:195:13:195:28 | Object o = ... | null | D.cs:195:13:195:13 | access to local variable o | null | | D.cs:196:13:196:13 | access to local variable o | non-null | D.cs:195:17:195:28 | object creation of type Object | non-null | @@ -985,6 +987,8 @@ | D.cs:230:13:230:28 | ... = ... | non-null | D.cs:230:17:230:28 | object creation of type Object | non-null | | D.cs:230:13:230:28 | ... = ... | null | D.cs:230:13:230:13 | access to local variable o | null | | D.cs:230:13:230:28 | ... = ... | null | D.cs:230:17:230:28 | object creation of type Object | null | +| D.cs:232:13:232:13 | access to local variable o | non-null | D.cs:230:17:230:28 | object creation of type Object | non-null | +| D.cs:232:13:232:13 | access to local variable o | null | D.cs:230:17:230:28 | object creation of type Object | null | | D.cs:234:9:234:16 | ... = ... | non-null | D.cs:234:9:234:9 | access to local variable o | non-null | | D.cs:234:9:234:16 | ... = ... | non-null | D.cs:234:13:234:16 | null | non-null | | D.cs:234:9:234:16 | ... = ... | null | D.cs:234:9:234:9 | access to local variable o | null | @@ -993,6 +997,8 @@ | D.cs:236:13:236:18 | ... = ... | non-null | D.cs:236:17:236:18 | "" | non-null | | D.cs:236:13:236:18 | ... = ... | null | D.cs:236:13:236:13 | access to local variable o | null | | D.cs:236:13:236:18 | ... = ... | null | D.cs:236:17:236:18 | "" | null | +| D.cs:238:13:238:13 | access to local variable o | non-null | D.cs:236:17:236:18 | "" | non-null | +| D.cs:238:13:238:13 | access to local variable o | null | D.cs:236:17:236:18 | "" | null | | D.cs:240:9:240:16 | ... = ... | non-null | D.cs:240:9:240:9 | access to local variable o | non-null | | D.cs:240:9:240:16 | ... = ... | non-null | D.cs:240:13:240:16 | null | non-null | | D.cs:240:9:240:16 | ... = ... | null | D.cs:240:9:240:9 | access to local variable o | null | @@ -1410,12 +1416,16 @@ | E.cs:217:13:217:20 | ... = ... | non-null | E.cs:217:17:217:20 | null | non-null | | E.cs:217:13:217:20 | ... = ... | null | E.cs:217:13:217:13 | access to local variable x | null | | E.cs:217:13:217:20 | ... = ... | null | E.cs:217:17:217:20 | null | null | +| E.cs:220:13:220:13 | access to local variable x | non-null | E.cs:217:17:217:20 | null | non-null | +| E.cs:220:13:220:13 | access to local variable x | null | E.cs:217:17:217:20 | null | null | | E.cs:225:13:225:18 | String x = ... | non-null | E.cs:225:13:225:13 | access to local variable x | non-null | | E.cs:225:13:225:18 | String x = ... | null | E.cs:225:13:225:13 | access to local variable x | null | | E.cs:227:13:227:20 | ... = ... | non-null | E.cs:227:13:227:13 | access to local variable x | non-null | | E.cs:227:13:227:20 | ... = ... | non-null | E.cs:227:17:227:20 | null | non-null | | E.cs:227:13:227:20 | ... = ... | null | E.cs:227:13:227:13 | access to local variable x | null | | E.cs:227:13:227:20 | ... = ... | null | E.cs:227:17:227:20 | null | null | +| E.cs:229:13:229:13 | access to local variable x | non-null | E.cs:227:17:227:20 | null | non-null | +| E.cs:229:13:229:13 | access to local variable x | null | E.cs:227:17:227:20 | null | null | | E.cs:245:13:245:22 | access to property HasValue | false | E.cs:245:13:245:13 | access to parameter i | null | | E.cs:245:13:245:22 | access to property HasValue | true | E.cs:245:13:245:13 | access to parameter i | non-null | | E.cs:252:13:252:21 | ... != ... | false | E.cs:252:13:252:13 | access to parameter i | null | @@ -1426,6 +1436,42 @@ | E.cs:260:13:260:17 | ... = ... | non-null | E.cs:260:17:260:17 | (...) ... | non-null | | E.cs:260:13:260:17 | ... = ... | null | E.cs:260:13:260:13 | access to parameter i | null | | E.cs:260:13:260:17 | ... = ... | null | E.cs:260:17:260:17 | (...) ... | null | +| E.cs:266:16:266:23 | Object o = ... | non-null | E.cs:266:16:266:16 | access to local variable o | non-null | +| E.cs:266:16:266:23 | Object o = ... | null | E.cs:266:16:266:16 | access to local variable o | null | +| E.cs:269:13:269:22 | ... = ... | non-null | E.cs:269:13:269:13 | access to local variable o | non-null | +| E.cs:269:13:269:22 | ... = ... | non-null | E.cs:269:17:269:22 | call to method Make | non-null | +| E.cs:269:13:269:22 | ... = ... | null | E.cs:269:13:269:13 | access to local variable o | null | +| E.cs:269:13:269:22 | ... = ... | null | E.cs:269:17:269:22 | call to method Make | null | +| E.cs:270:13:270:13 | access to local variable o | non-null | E.cs:269:17:269:22 | call to method Make | non-null | +| E.cs:270:13:270:13 | access to local variable o | null | E.cs:269:17:269:22 | call to method Make | null | +| E.cs:274:17:274:25 | ... != ... | false | E.cs:274:17:274:17 | access to local variable o | null | +| E.cs:274:17:274:25 | ... != ... | true | E.cs:274:17:274:17 | access to local variable o | non-null | +| E.cs:283:13:283:22 | String o = ... | non-null | E.cs:283:13:283:13 | access to local variable o | non-null | +| E.cs:283:13:283:22 | String o = ... | null | E.cs:283:13:283:13 | access to local variable o | null | +| E.cs:284:9:284:9 | access to local variable o | non-null | E.cs:283:17:283:22 | call to method Make | non-null | +| E.cs:284:9:284:9 | access to local variable o | null | E.cs:283:17:283:22 | call to method Make | null | +| E.cs:284:11:284:21 | call to method ToString | non-null | E.cs:284:9:284:9 | access to local variable o | non-null | +| E.cs:285:9:285:9 | access to local variable o | non-null | E.cs:283:17:283:22 | call to method Make | non-null | +| E.cs:285:9:285:9 | access to local variable o | null | E.cs:283:17:283:22 | call to method Make | null | +| E.cs:292:16:292:32 | String s = ... | non-null | E.cs:292:16:292:16 | access to local variable s | non-null | +| E.cs:292:16:292:32 | String s = ... | null | E.cs:292:16:292:16 | access to local variable s | null | +| E.cs:292:20:292:32 | ... ? ... : ... | non-null | E.cs:292:20:292:20 | access to parameter b | false | +| E.cs:292:20:292:32 | ... ? ... : ... | non-null | E.cs:292:31:292:32 | "" | non-null | +| E.cs:292:20:292:32 | ... ? ... : ... | null | E.cs:292:20:292:20 | access to parameter b | true | +| E.cs:292:20:292:32 | ... ? ... : ... | null | E.cs:292:24:292:27 | null | null | +| E.cs:293:13:293:13 | access to local variable s | non-null | E.cs:292:20:292:20 | access to parameter b | false | +| E.cs:293:13:293:13 | access to local variable s | non-null | E.cs:292:20:292:32 | ... ? ... : ... | non-null | +| E.cs:293:13:293:13 | access to local variable s | null | E.cs:292:20:292:20 | access to parameter b | true | +| E.cs:293:13:293:13 | access to local variable s | null | E.cs:292:20:292:32 | ... ? ... : ... | null | +| E.cs:293:13:293:24 | ... == ... | true | E.cs:293:15:293:19 | call to method M2 | non-null | +| E.cs:293:15:293:19 | call to method M2 | non-null | E.cs:293:13:293:13 | access to local variable s | non-null | +| E.cs:293:15:293:19 | call to method M2 | null | E.cs:293:13:293:13 | access to local variable s | null | +| E.cs:295:13:295:13 | access to local variable s | non-null | E.cs:292:20:292:32 | ... ? ... : ... | non-null | +| E.cs:295:13:295:13 | access to local variable s | null | E.cs:292:20:292:32 | ... ? ... : ... | null | +| E.cs:300:22:300:38 | ... ? ... : ... | non-null | E.cs:300:22:300:26 | access to field Field | false | +| E.cs:300:22:300:38 | ... ? ... : ... | non-null | E.cs:300:37:300:38 | "" | non-null | +| E.cs:300:22:300:38 | ... ? ... : ... | null | E.cs:300:22:300:26 | access to field Field | true | +| E.cs:300:22:300:38 | ... ? ... : ... | null | E.cs:300:30:300:33 | null | null | | Forwarding.cs:7:16:7:23 | String s = ... | non-null | Forwarding.cs:7:16:7:16 | access to local variable s | non-null | | Forwarding.cs:7:16:7:23 | String s = ... | null | Forwarding.cs:7:16:7:16 | access to local variable s | null | | Forwarding.cs:9:13:9:30 | !... | false | Forwarding.cs:9:14:9:30 | call to method IsNullOrEmpty | true | diff --git a/csharp/ql/test/query-tests/Nullness/NullCheck.expected b/csharp/ql/test/query-tests/Nullness/NullCheck.expected index 9b93a84e228..966c9fa5464 100644 --- a/csharp/ql/test/query-tests/Nullness/NullCheck.expected +++ b/csharp/ql/test/query-tests/Nullness/NullCheck.expected @@ -193,6 +193,13 @@ | E.cs:252:13:252:21 | ... != ... | E.cs:252:13:252:13 | access to parameter i | true | false | | E.cs:259:13:259:21 | ... == ... | E.cs:259:13:259:13 | access to parameter i | false | false | | E.cs:259:13:259:21 | ... == ... | E.cs:259:13:259:13 | access to parameter i | true | true | +| E.cs:274:17:274:25 | ... != ... | E.cs:274:17:274:17 | access to local variable o | false | true | +| E.cs:274:17:274:25 | ... != ... | E.cs:274:17:274:17 | access to local variable o | true | false | +| E.cs:284:9:284:9 | access to local variable o | E.cs:284:9:284:9 | access to local variable o | non-null | false | +| E.cs:284:9:284:9 | access to local variable o | E.cs:284:9:284:9 | access to local variable o | null | true | +| E.cs:293:13:293:13 | access to local variable s | E.cs:293:13:293:13 | access to local variable s | non-null | false | +| E.cs:293:13:293:13 | access to local variable s | E.cs:293:13:293:13 | access to local variable s | null | true | +| E.cs:293:13:293:24 | ... == ... | E.cs:293:15:293:19 | call to method M2 | true | false | | Forwarding.cs:9:14:9:30 | call to method IsNullOrEmpty | Forwarding.cs:9:14:9:14 | access to local variable s | false | false | | Forwarding.cs:14:13:14:32 | call to method IsNotNullOrEmpty | Forwarding.cs:14:13:14:13 | access to local variable s | true | false | | Forwarding.cs:19:14:19:23 | call to method IsNull | Forwarding.cs:19:14:19:14 | access to local variable s | false | false | diff --git a/csharp/ql/test/query-tests/Nullness/NullMaybe.expected b/csharp/ql/test/query-tests/Nullness/NullMaybe.expected index b0b000287cb..b6b6f22c2c3 100644 --- a/csharp/ql/test/query-tests/Nullness/NullMaybe.expected +++ b/csharp/ql/test/query-tests/Nullness/NullMaybe.expected @@ -1,73 +1,779 @@ -| C.cs:64:9:64:10 | access to local variable o1 | Variable $@ may be null here because of $@ assignment. | C.cs:62:13:62:14 | o1 | o1 | C.cs:62:13:62:46 | Object o1 = ... | this | -| C.cs:68:9:68:10 | access to local variable o2 | Variable $@ may be null here because of $@ assignment. | C.cs:66:13:66:14 | o2 | o2 | C.cs:66:13:66:46 | Object o2 = ... | this | -| C.cs:96:15:96:15 | access to local variable o | Variable $@ may be null here because of $@ assignment. | C.cs:95:13:95:13 | o | o | C.cs:95:13:95:45 | Object o = ... | this | -| C.cs:104:27:104:30 | access to parameter list | Variable $@ may be null here because of $@ assignment. | C.cs:100:42:100:45 | list | list | C.cs:103:13:103:23 | ... = ... | this | -| C.cs:178:13:178:13 | access to local variable s | Variable $@ may be null here because of $@ assignment. | C.cs:152:13:152:13 | s | s | C.cs:179:13:179:20 | ... = ... | this | -| C.cs:204:13:204:13 | access to local variable s | Variable $@ may be null here because of $@ assignment. | C.cs:186:13:186:13 | s | s | C.cs:205:13:205:20 | ... = ... | this | -| C.cs:224:9:224:9 | access to local variable s | Variable $@ may be null here because of $@ assignment. | C.cs:211:13:211:13 | s | s | C.cs:223:13:223:20 | ... = ... | this | -| C.cs:243:13:243:13 | access to local variable s | Variable $@ may be null here because of $@ assignment. | C.cs:229:16:229:16 | s | s | C.cs:241:24:241:31 | ... = ... | this | -| D.cs:23:9:23:13 | access to parameter param | Variable $@ may be null here because of $@ null argument. | D.cs:21:32:21:36 | param | param | D.cs:17:17:17:20 | null | this | -| D.cs:32:9:32:13 | access to parameter param | Variable $@ may be null here as suggested by $@ null check. | D.cs:26:32:26:36 | param | param | D.cs:28:13:28:25 | ... != ... | this | -| D.cs:62:13:62:14 | access to local variable o5 | Variable $@ may be null here because of $@ assignment. | D.cs:58:13:58:14 | o5 | o5 | D.cs:58:13:58:41 | String o5 = ... | this | -| D.cs:73:13:73:14 | access to local variable o7 | Variable $@ may be null here because of $@ assignment. | D.cs:68:13:68:14 | o7 | o7 | D.cs:68:13:68:34 | String o7 = ... | this | -| D.cs:82:13:82:14 | access to local variable o8 | Variable $@ may be null here because of $@ assignment. | D.cs:75:13:75:14 | o8 | o8 | D.cs:75:13:75:34 | String o8 = ... | this | -| D.cs:84:13:84:14 | access to local variable o8 | Variable $@ may be null here because of $@ assignment. | D.cs:75:13:75:14 | o8 | o8 | D.cs:75:13:75:34 | String o8 = ... | this | -| D.cs:91:13:91:14 | access to local variable xs | Variable $@ may be null here because of $@ assignment. | D.cs:89:15:89:16 | xs | xs | D.cs:89:15:89:44 | Int32[] xs = ... | this | -| D.cs:94:21:94:22 | access to local variable xs | Variable $@ may be null here because of $@ assignment. | D.cs:89:15:89:16 | xs | xs | D.cs:89:15:89:44 | Int32[] xs = ... | this | -| D.cs:98:21:98:22 | access to local variable xs | Variable $@ may be null here because of $@ assignment. | D.cs:89:15:89:16 | xs | xs | D.cs:89:15:89:44 | Int32[] xs = ... | this | -| D.cs:102:31:102:32 | access to local variable xs | Variable $@ may be null here because of $@ assignment. | D.cs:89:15:89:16 | xs | xs | D.cs:89:15:89:44 | Int32[] xs = ... | this | -| D.cs:105:19:105:20 | access to local variable xs | Variable $@ may be null here because of $@ assignment. | D.cs:89:15:89:16 | xs | xs | D.cs:89:15:89:44 | Int32[] xs = ... | this | -| D.cs:134:24:134:24 | access to parameter a | Variable $@ may be null here as suggested by $@ null check. | D.cs:125:35:125:35 | a | a | D.cs:127:20:127:28 | ... == ... | this | -| D.cs:134:24:134:24 | access to parameter a | Variable $@ may be null here as suggested by $@ null check. | D.cs:125:35:125:35 | a | a | D.cs:139:13:139:21 | ... != ... | this | -| D.cs:135:24:135:24 | access to parameter b | Variable $@ may be null here as suggested by $@ null check. | D.cs:125:44:125:44 | b | b | D.cs:128:20:128:28 | ... == ... | this | -| D.cs:145:20:145:20 | access to parameter a | Variable $@ may be null here as suggested by $@ null check. | D.cs:125:35:125:35 | a | a | D.cs:127:20:127:28 | ... == ... | this | -| D.cs:145:20:145:20 | access to parameter a | Variable $@ may be null here as suggested by $@ null check. | D.cs:125:35:125:35 | a | a | D.cs:139:13:139:21 | ... != ... | this | -| D.cs:151:9:151:11 | access to parameter obj | Variable $@ may be null here as suggested by $@ null check. | D.cs:149:36:149:38 | obj | obj | D.cs:152:17:152:27 | ... != ... | this | -| D.cs:171:9:171:11 | access to local variable obj | Variable $@ may be null here because of $@ assignment. | D.cs:163:16:163:18 | obj | obj | D.cs:163:16:163:25 | Object obj = ... | this | -| D.cs:245:13:245:13 | access to local variable o | Variable $@ may be null here because of $@ assignment. | D.cs:228:16:228:16 | o | o | D.cs:240:9:240:16 | ... = ... | this | -| D.cs:247:13:247:13 | access to local variable o | Variable $@ may be null here because of $@ assignment. | D.cs:228:16:228:16 | o | o | D.cs:240:9:240:16 | ... = ... | this | -| D.cs:253:13:253:14 | access to local variable o2 | Variable $@ may be null here because of $@ assignment. | D.cs:249:13:249:14 | o2 | o2 | D.cs:249:13:249:38 | String o2 = ... | this | -| D.cs:267:13:267:13 | access to local variable o | Variable $@ may be null here because of $@ assignment. | D.cs:258:16:258:16 | o | o | D.cs:258:16:258:23 | Object o = ... | this | -| D.cs:291:13:291:13 | access to local variable o | Variable $@ may be null here because of $@ assignment. | D.cs:258:16:258:16 | o | o | D.cs:269:9:269:16 | ... = ... | this | -| D.cs:291:13:291:13 | access to local variable o | Variable $@ may be null here because of $@ assignment. | D.cs:258:16:258:16 | o | o | D.cs:283:17:283:24 | ... = ... | this | -| D.cs:294:13:294:13 | access to local variable o | Variable $@ may be null here because of $@ assignment. | D.cs:258:16:258:16 | o | o | D.cs:269:9:269:16 | ... = ... | this | -| D.cs:294:13:294:13 | access to local variable o | Variable $@ may be null here because of $@ assignment. | D.cs:258:16:258:16 | o | o | D.cs:283:17:283:24 | ... = ... | this | -| D.cs:300:17:300:20 | access to local variable prev | Variable $@ may be null here because of $@ assignment. | D.cs:296:16:296:19 | prev | prev | D.cs:296:16:296:26 | Object prev = ... | this | -| D.cs:313:17:313:17 | access to local variable s | Variable $@ may be null here because of $@ assignment. | D.cs:304:16:304:16 | s | s | D.cs:304:16:304:23 | String s = ... | this | -| D.cs:324:9:324:9 | access to local variable r | Variable $@ may be null here because of $@ assignment. | D.cs:316:16:316:16 | r | r | D.cs:316:16:316:23 | Object r = ... | this | -| D.cs:356:13:356:13 | access to local variable a | Variable $@ may be null here because of $@ assignment. | D.cs:351:15:351:15 | a | a | D.cs:351:15:351:22 | Int32[] a = ... | this | -| D.cs:363:13:363:16 | access to local variable last | Variable $@ may be null here because of $@ assignment. | D.cs:360:20:360:23 | last | last | D.cs:360:20:360:30 | String last = ... | this | -| D.cs:372:13:372:13 | access to local variable b | Variable $@ may be null here because of $@ assignment. | D.cs:366:15:366:15 | b | b | D.cs:366:15:366:47 | Int32[] b = ... | this | -| D.cs:395:20:395:20 | access to parameter a | Variable $@ may be null here as suggested by $@ null check. | D.cs:388:36:388:36 | a | a | D.cs:390:20:390:28 | ... == ... | this | -| D.cs:400:20:400:20 | access to parameter b | Variable $@ may be null here as suggested by $@ null check. | D.cs:388:45:388:45 | b | b | D.cs:397:20:397:28 | ... == ... | this | -| D.cs:410:13:410:13 | access to parameter y | Variable $@ may be null here as suggested by $@ null check. | D.cs:405:45:405:45 | y | y | D.cs:407:27:407:35 | ... == ... | this | -| D.cs:410:13:410:13 | access to parameter y | Variable $@ may be null here as suggested by $@ null check. | D.cs:405:45:405:45 | y | y | D.cs:407:55:407:63 | ... != ... | this | -| D.cs:410:13:410:13 | access to parameter y | Variable $@ may be null here as suggested by $@ null check. | D.cs:405:45:405:45 | y | y | D.cs:411:13:411:21 | ... != ... | this | -| D.cs:412:13:412:13 | access to parameter x | Variable $@ may be null here as suggested by $@ null check. | D.cs:405:35:405:35 | x | x | D.cs:407:14:407:22 | ... != ... | this | -| D.cs:412:13:412:13 | access to parameter x | Variable $@ may be null here as suggested by $@ null check. | D.cs:405:35:405:35 | x | x | D.cs:407:42:407:50 | ... == ... | this | -| D.cs:412:13:412:13 | access to parameter x | Variable $@ may be null here as suggested by $@ null check. | D.cs:405:35:405:35 | x | x | D.cs:409:13:409:21 | ... != ... | this | -| E.cs:12:38:12:39 | access to local variable a2 | Variable $@ may be null here because of $@ assignment. | E.cs:9:18:9:19 | a2 | a2 | E.cs:9:18:9:26 | Int64[][] a2 = ... | this | -| E.cs:14:13:14:14 | access to local variable a3 | Variable $@ may be null here because of $@ assignment. | E.cs:11:16:11:17 | a3 | a3 | E.cs:11:16:11:24 | Int64[] a3 = ... | this | -| E.cs:27:13:27:14 | access to local variable s1 | Variable $@ may be null here because of $@ assignment. | E.cs:19:13:19:14 | s1 | s1 | E.cs:23:13:23:30 | ... = ... | this | -| E.cs:35:9:35:12 | access to local variable last | Variable $@ may be null here because of $@ assignment. | E.cs:32:16:32:19 | last | last | E.cs:32:16:32:26 | String last = ... | this | -| E.cs:43:13:43:16 | access to local variable last | Variable $@ may be null here because of $@ assignment. | E.cs:32:16:32:19 | last | last | E.cs:37:9:37:19 | ... = ... | this | -| E.cs:61:13:61:17 | access to local variable slice | Variable $@ may be null here because of $@ assignment. | E.cs:51:22:51:26 | slice | slice | E.cs:51:22:51:33 | List slice = ... | this | -| E.cs:73:13:73:15 | access to parameter arr | Variable $@ may be null here as suggested by $@ null check. | E.cs:66:40:66:42 | arr | arr | E.cs:70:22:70:32 | ... == ... | this | -| E.cs:112:13:112:16 | access to local variable arr2 | Variable $@ may be null here because of $@ assignment. | E.cs:107:15:107:18 | arr2 | arr2 | E.cs:107:15:107:25 | Int32[] arr2 = ... | this | -| E.cs:125:33:125:35 | access to local variable obj | Variable $@ may be null here because of $@ assignment. | E.cs:119:13:119:15 | obj | obj | E.cs:137:25:137:34 | ... = ... | this | -| E.cs:159:13:159:16 | access to local variable obj2 | Variable $@ may be null here as suggested by $@ null check. | E.cs:152:16:152:19 | obj2 | obj2 | E.cs:153:13:153:24 | ... != ... | this | -| E.cs:167:21:167:21 | access to parameter a | Variable $@ may be null here as suggested by $@ null check. | E.cs:162:28:162:28 | a | a | E.cs:164:17:164:25 | ... == ... | this | -| E.cs:178:13:178:15 | access to parameter obj | Variable $@ may be null here as suggested by $@ null check. | E.cs:173:29:173:31 | obj | obj | E.cs:175:19:175:29 | ... == ... | this | -| E.cs:178:13:178:15 | access to parameter obj | Variable $@ may be null here as suggested by $@ null check. | E.cs:173:29:173:31 | obj | obj | E.cs:180:13:180:23 | ... == ... | this | -| E.cs:186:13:186:15 | access to parameter obj | Variable $@ may be null here as suggested by $@ null check. | E.cs:173:29:173:31 | obj | obj | E.cs:175:19:175:29 | ... == ... | this | -| E.cs:186:13:186:15 | access to parameter obj | Variable $@ may be null here as suggested by $@ null check. | E.cs:173:29:173:31 | obj | obj | E.cs:180:13:180:23 | ... == ... | this | -| E.cs:192:17:192:17 | access to parameter o | Variable $@ may be null here as suggested by $@ null check. | E.cs:190:29:190:29 | o | o | E.cs:193:17:193:17 | access to parameter o | this | -| E.cs:201:11:201:11 | access to local variable o | Variable $@ may be null here because of $@ assignment. | E.cs:198:13:198:13 | o | o | E.cs:198:13:198:29 | String o = ... | this | -| E.cs:203:11:203:11 | access to local variable o | Variable $@ may be null here because of $@ assignment. | E.cs:198:13:198:13 | o | o | E.cs:198:13:198:29 | String o = ... | this | -| E.cs:218:9:218:9 | access to local variable x | Variable $@ may be null here because of $@ assignment. | E.cs:215:13:215:13 | x | x | E.cs:217:13:217:20 | ... = ... | this | -| E.cs:230:9:230:9 | access to local variable x | Variable $@ may be null here because of $@ assignment. | E.cs:225:13:225:13 | x | x | E.cs:227:13:227:20 | ... = ... | this | -| E.cs:235:16:235:16 | access to parameter i | Variable $@ may be null here because it has a nullable type. | E.cs:233:26:233:26 | i | i | E.cs:233:26:233:26 | i | this | -| E.cs:240:21:240:21 | access to parameter i | Variable $@ may be null here because it has a nullable type. | E.cs:238:26:238:26 | i | i | E.cs:238:26:238:26 | i | this | -| GuardedString.cs:35:31:35:31 | access to local variable s | Variable $@ may be null here because of $@ assignment. | GuardedString.cs:7:16:7:16 | s | s | GuardedString.cs:7:16:7:32 | String s = ... | this | -| NullMaybeBad.cs:7:27:7:27 | access to parameter o | Variable $@ may be null here because of $@ null argument. | NullMaybeBad.cs:5:25:5:25 | o | o | NullMaybeBad.cs:13:17:13:20 | null | this | -| StringConcatenation.cs:16:17:16:17 | access to local variable s | Variable $@ may be null here because of $@ assignment. | StringConcatenation.cs:14:16:14:16 | s | s | StringConcatenation.cs:14:16:14:23 | String s = ... | this | +nodes +| A.cs:7:16:7:40 | SSA def(synchronizedAlways) | +| A.cs:8:15:8:32 | access to local variable synchronizedAlways | +| A.cs:10:13:10:30 | access to local variable synchronizedAlways | +| A.cs:16:15:16:30 | SSA def(arrayNull) | +| A.cs:17:9:17:17 | access to local variable arrayNull | +| A.cs:26:15:26:32 | SSA def(arrayAccess) | +| A.cs:27:18:27:35 | SSA def(fieldAccess) | +| A.cs:28:16:28:34 | SSA def(methodAccess) | +| A.cs:29:16:29:32 | SSA def(methodCall) | +| A.cs:31:27:31:37 | access to local variable arrayAccess | +| A.cs:32:27:32:37 | access to local variable fieldAccess | +| A.cs:33:28:33:39 | access to local variable methodAccess | +| A.cs:34:27:34:36 | access to local variable methodCall | +| A.cs:36:27:36:37 | access to local variable arrayAccess | +| A.cs:37:27:37:37 | access to local variable fieldAccess | +| A.cs:38:15:38:26 | access to local variable methodAccess | +| A.cs:39:27:39:36 | access to local variable methodCall | +| A.cs:48:16:48:28 | SSA def(varRef) | +| A.cs:50:9:50:14 | access to local variable varRef | +| Assert.cs:13:9:13:25 | [b (line 7): false] SSA def(s) | +| Assert.cs:13:9:13:25 | [b (line 7): true] SSA def(s) | +| Assert.cs:15:27:15:27 | access to local variable s | +| Assert.cs:15:27:15:27 | access to local variable s | +| Assert.cs:21:9:21:25 | [b (line 7): false] SSA def(s) | +| Assert.cs:21:9:21:25 | [b (line 7): true] SSA def(s) | +| Assert.cs:23:27:23:27 | access to local variable s | +| Assert.cs:23:27:23:27 | access to local variable s | +| Assert.cs:29:9:29:25 | [b (line 7): false] SSA def(s) | +| Assert.cs:29:9:29:25 | [b (line 7): true] SSA def(s) | +| Assert.cs:31:27:31:27 | access to local variable s | +| Assert.cs:31:27:31:27 | access to local variable s | +| Assert.cs:45:9:45:25 | [b (line 7): false] SSA def(s) | +| Assert.cs:45:9:45:25 | [b (line 7): true] SSA def(s) | +| Assert.cs:46:36:46:36 | [b (line 7): false] access to parameter b | +| Assert.cs:46:36:46:36 | [b (line 7): true] access to parameter b | +| Assert.cs:47:27:47:27 | access to local variable s | +| Assert.cs:47:27:47:27 | access to local variable s | +| Assert.cs:49:9:49:25 | SSA def(s) | +| Assert.cs:50:37:50:37 | access to parameter b | +| Assert.cs:51:27:51:27 | access to local variable s | +| B.cs:7:11:7:29 | SSA def(eqCallAlways) | +| B.cs:10:11:10:30 | SSA def(neqCallAlways) | +| B.cs:13:13:13:24 | access to local variable eqCallAlways | +| B.cs:13:13:13:36 | ...; | +| B.cs:15:9:16:26 | if (...) ... | +| B.cs:16:13:16:26 | ...; | +| B.cs:18:9:20:26 | if (...) ... | +| B.cs:18:25:18:27 | {...} | +| B.cs:20:13:20:26 | ...; | +| B.cs:22:9:24:37 | if (...) ... | +| B.cs:24:13:24:25 | access to local variable neqCallAlways | +| C.cs:10:16:10:23 | SSA def(o) | +| C.cs:16:9:19:9 | if (...) ... | +| C.cs:18:13:18:13 | access to local variable o | +| C.cs:40:13:40:35 | SSA def(s) | +| C.cs:42:9:42:9 | access to local variable s | +| C.cs:55:13:55:36 | SSA def(o2) | +| C.cs:57:9:57:10 | access to local variable o2 | +| C.cs:62:13:62:46 | SSA def(o1) | +| C.cs:64:9:64:10 | access to local variable o1 | +| C.cs:66:13:66:46 | SSA def(o2) | +| C.cs:68:9:68:10 | access to local variable o2 | +| C.cs:95:13:95:45 | SSA def(o) | +| C.cs:96:15:96:15 | access to local variable o | +| C.cs:97:13:97:13 | access to local variable o | +| C.cs:103:13:103:23 | SSA def(list) | +| C.cs:104:9:108:9 | foreach (... ... in ...) ... | +| C.cs:104:22:104:22 | Int32 x | +| C.cs:104:27:104:30 | access to parameter list | +| C.cs:104:27:104:30 | access to parameter list | +| C.cs:107:13:107:16 | access to parameter list | +| C.cs:160:9:160:16 | SSA def(s) | +| C.cs:163:13:163:13 | access to local variable s | +| C.cs:168:9:168:16 | SSA def(s) | +| C.cs:171:13:171:13 | access to local variable s | +| C.cs:178:13:178:13 | access to local variable s | +| C.cs:179:13:179:20 | SSA def(s) | +| C.cs:194:9:194:16 | SSA def(s) | +| C.cs:197:13:197:13 | access to local variable s | +| C.cs:198:13:198:20 | [b (line 193): true] SSA def(s) | +| C.cs:204:13:204:13 | access to local variable s | +| C.cs:205:13:205:20 | SSA def(s) | +| C.cs:211:13:211:35 | SSA def(s) | +| C.cs:215:13:215:20 | SSA def(s) | +| C.cs:218:9:219:25 | if (...) ... | +| C.cs:219:13:219:13 | access to local variable s | +| C.cs:223:13:223:20 | SSA def(s) | +| C.cs:224:9:224:9 | access to local variable s | +| C.cs:230:22:230:22 | access to local variable s | +| C.cs:230:33:230:40 | SSA def(s) | +| C.cs:234:9:234:9 | access to local variable s | +| C.cs:236:14:236:21 | SSA def(s) | +| C.cs:236:24:236:24 | access to local variable s | +| C.cs:236:35:236:42 | SSA def(s) | +| C.cs:238:13:238:13 | access to local variable s | +| C.cs:241:24:241:31 | SSA def(s) | +| C.cs:243:13:243:13 | access to local variable s | +| C.cs:249:15:249:22 | SSA def(a) | +| C.cs:250:9:250:9 | access to local variable a | +| C.cs:258:15:258:23 | SSA def(ia) | +| C.cs:259:18:259:26 | SSA def(sa) | +| C.cs:261:9:261:10 | access to local variable ia | +| C.cs:262:20:262:21 | access to local variable sa | +| C.cs:264:9:264:10 | access to local variable ia | +| C.cs:265:16:265:17 | access to local variable sa | +| D.cs:17:17:17:20 | null | +| D.cs:23:9:23:13 | access to parameter param | +| D.cs:26:32:26:36 | SSA param(param) | +| D.cs:32:9:32:13 | access to parameter param | +| D.cs:58:13:58:41 | SSA def(o5) | +| D.cs:61:9:62:26 | if (...) ... | +| D.cs:62:13:62:14 | access to local variable o5 | +| D.cs:68:13:68:34 | SSA def(o7) | +| D.cs:69:13:69:36 | Boolean ok = ... | +| D.cs:73:13:73:14 | access to local variable o7 | +| D.cs:75:13:75:34 | SSA def(o8) | +| D.cs:76:13:76:43 | Int32 track = ... | +| D.cs:76:34:76:35 | 42 | +| D.cs:79:9:80:26 | if (...) ... | +| D.cs:81:9:82:26 | if (...) ... | +| D.cs:82:13:82:14 | access to local variable o8 | +| D.cs:82:13:82:26 | ...; | +| D.cs:83:9:84:26 | if (...) ... | +| D.cs:84:13:84:14 | access to local variable o8 | +| D.cs:89:15:89:44 | SSA def(xs) | +| D.cs:91:13:91:14 | access to local variable xs | +| D.cs:91:13:91:22 | ...; | +| D.cs:93:9:94:30 | if (...) ... | +| D.cs:94:13:94:30 | ...; | +| D.cs:94:21:94:22 | access to local variable xs | +| D.cs:96:9:99:9 | if (...) ... | +| D.cs:97:9:99:9 | {...} | +| D.cs:98:21:98:22 | access to local variable xs | +| D.cs:101:9:102:35 | if (...) ... | +| D.cs:102:13:102:35 | foreach (... ... in ...) ... | +| D.cs:102:31:102:32 | access to local variable xs | +| D.cs:102:31:102:32 | access to local variable xs | +| D.cs:102:35:102:35 | ; | +| D.cs:104:9:106:30 | if (...) ... | +| D.cs:105:19:105:20 | access to local variable xs | +| D.cs:106:17:106:18 | access to local variable xs | +| D.cs:118:9:118:30 | SSA def(x) | +| D.cs:120:13:120:13 | access to local variable x | +| D.cs:125:35:125:35 | SSA param(a) | +| D.cs:125:35:125:35 | SSA param(a) | +| D.cs:125:44:125:44 | SSA param(b) | +| D.cs:127:13:127:43 | Int32 alen = ... | +| D.cs:127:13:127:43 | Int32 alen = ... | +| D.cs:127:32:127:32 | 0 | +| D.cs:127:32:127:32 | 0 | +| D.cs:127:36:127:36 | access to parameter a | +| D.cs:128:13:128:43 | Int32 blen = ... | +| D.cs:128:13:128:43 | Int32 blen = ... | +| D.cs:128:32:128:32 | 0 | +| D.cs:128:32:128:32 | 0 | +| D.cs:128:36:128:36 | access to parameter b | +| D.cs:131:9:137:9 | {...} | +| D.cs:131:9:137:9 | {...} | +| D.cs:132:29:132:29 | access to local variable i | +| D.cs:132:29:132:29 | access to local variable i | +| D.cs:133:13:136:13 | {...} | +| D.cs:133:13:136:13 | {...} | +| D.cs:134:24:134:24 | access to parameter a | +| D.cs:135:24:135:24 | access to parameter b | +| D.cs:138:9:138:18 | ... ...; | +| D.cs:142:13:142:22 | ...; | +| D.cs:143:9:146:9 | for (...;...;...) ... | +| D.cs:143:25:143:25 | access to local variable i | +| D.cs:144:9:146:9 | {...} | +| D.cs:145:20:145:20 | access to parameter a | +| D.cs:149:36:149:38 | SSA param(obj) | +| D.cs:151:9:151:11 | access to parameter obj | +| D.cs:163:16:163:25 | SSA def(obj) | +| D.cs:168:9:170:9 | [exception: Exception] catch (...) {...} | +| D.cs:171:9:171:11 | access to local variable obj | +| D.cs:240:9:240:16 | SSA def(o) | +| D.cs:241:13:241:37 | String other = ... | +| D.cs:241:29:241:32 | null | +| D.cs:241:36:241:37 | "" | +| D.cs:244:9:247:25 | if (...) ... | +| D.cs:245:13:245:13 | access to local variable o | +| D.cs:247:13:247:13 | access to local variable o | +| D.cs:249:13:249:38 | SSA def(o2) | +| D.cs:253:13:253:14 | access to local variable o2 | +| D.cs:258:16:258:23 | SSA def(o) | +| D.cs:266:9:267:25 | if (...) ... | +| D.cs:267:13:267:13 | access to local variable o | +| D.cs:269:9:269:16 | SSA def(o) | +| D.cs:272:25:272:25 | access to local variable i | +| D.cs:272:39:272:39 | access to local variable i | +| D.cs:273:9:288:9 | {...} | +| D.cs:281:13:287:13 | if (...) ... | +| D.cs:283:17:283:24 | SSA def(o) | +| D.cs:285:28:285:30 | {...} | +| D.cs:286:17:286:30 | ...; | +| D.cs:290:9:291:25 | if (...) ... | +| D.cs:291:13:291:13 | access to local variable o | +| D.cs:291:13:291:25 | ...; | +| D.cs:293:9:294:25 | if (...) ... | +| D.cs:294:13:294:13 | access to local variable o | +| D.cs:296:16:296:26 | SSA def(prev) | +| D.cs:297:25:297:25 | access to local variable i | +| D.cs:298:9:302:9 | {...} | +| D.cs:300:17:300:20 | access to local variable prev | +| D.cs:304:16:304:23 | SSA def(s) | +| D.cs:307:13:311:13 | foreach (... ... in ...) ... | +| D.cs:312:13:313:29 | if (...) ... | +| D.cs:313:17:313:17 | access to local variable s | +| D.cs:316:16:316:23 | SSA def(r) | +| D.cs:318:16:318:62 | ... && ... | +| D.cs:318:41:318:44 | access to local variable stat | +| D.cs:324:9:324:9 | access to local variable r | +| D.cs:351:15:351:22 | SSA def(a) | +| D.cs:355:9:356:21 | for (...;...;...) ... | +| D.cs:355:25:355:25 | access to local variable i | +| D.cs:356:13:356:13 | access to local variable a | +| D.cs:356:13:356:21 | ...; | +| D.cs:360:20:360:30 | SSA def(last) | +| D.cs:361:29:361:29 | access to local variable i | +| D.cs:363:13:363:16 | access to local variable last | +| D.cs:366:15:366:47 | SSA def(b) | +| D.cs:370:9:373:9 | for (...;...;...) ... | +| D.cs:370:25:370:25 | access to local variable i | +| D.cs:371:9:373:9 | {...} | +| D.cs:372:13:372:13 | access to local variable b | +| D.cs:378:19:378:28 | SSA def(ioe) | +| D.cs:382:9:385:27 | if (...) ... | +| D.cs:385:13:385:15 | access to local variable ioe | +| D.cs:388:36:388:36 | SSA param(a) | +| D.cs:388:45:388:45 | SSA param(b) | +| D.cs:390:13:390:43 | Int32 alen = ... | +| D.cs:390:13:390:43 | Int32 alen = ... | +| D.cs:390:32:390:32 | 0 | +| D.cs:390:32:390:32 | 0 | +| D.cs:390:36:390:36 | access to parameter a | +| D.cs:393:21:393:21 | access to local variable i | +| D.cs:393:21:393:21 | access to local variable i | +| D.cs:394:9:396:9 | {...} | +| D.cs:394:9:396:9 | {...} | +| D.cs:395:20:395:20 | access to parameter a | +| D.cs:397:9:397:44 | ... ...; | +| D.cs:397:13:397:43 | Int32 blen = ... | +| D.cs:397:32:397:32 | 0 | +| D.cs:398:21:398:21 | access to local variable i | +| D.cs:399:9:401:9 | {...} | +| D.cs:400:20:400:20 | access to parameter b | +| D.cs:405:35:405:35 | SSA param(x) | +| D.cs:405:35:405:35 | SSA param(x) | +| D.cs:405:35:405:35 | SSA param(x) | +| D.cs:405:45:405:45 | SSA param(y) | +| D.cs:405:45:405:45 | SSA param(y) | +| D.cs:405:45:405:45 | SSA param(y) | +| D.cs:407:42:407:63 | ... && ... | +| D.cs:407:42:407:63 | ... && ... | +| D.cs:407:55:407:55 | access to parameter y | +| D.cs:407:55:407:55 | access to parameter y | +| D.cs:409:9:410:25 | if (...) ... | +| D.cs:409:9:410:25 | if (...) ... | +| D.cs:410:13:410:13 | access to parameter y | +| D.cs:411:9:412:25 | if (...) ... | +| D.cs:412:13:412:13 | access to parameter x | +| E.cs:9:18:9:26 | SSA def(a2) | +| E.cs:10:13:10:54 | Boolean haveA2 = ... | +| E.cs:11:16:11:24 | SSA def(a3) | +| E.cs:12:13:12:52 | Boolean haveA3 = ... | +| E.cs:12:38:12:39 | access to local variable a2 | +| E.cs:14:13:14:14 | access to local variable a3 | +| E.cs:23:13:23:30 | SSA def(s1) | +| E.cs:24:13:24:41 | ... = ... | +| E.cs:24:33:24:36 | null | +| E.cs:26:9:27:26 | if (...) ... | +| E.cs:27:13:27:14 | access to local variable s1 | +| E.cs:32:16:32:26 | SSA def(last) | +| E.cs:33:9:34:21 | foreach (... ... in ...) ... | +| E.cs:35:9:35:12 | access to local variable last | +| E.cs:37:9:37:19 | SSA def(last) | +| E.cs:39:9:44:9 | {...} | +| E.cs:40:13:41:25 | foreach (... ... in ...) ... | +| E.cs:43:13:43:16 | access to local variable last | +| E.cs:51:22:51:33 | SSA def(slice) | +| E.cs:53:16:53:19 | access to local variable iter | +| E.cs:54:9:63:9 | {...} | +| E.cs:61:13:61:17 | access to local variable slice | +| E.cs:61:13:61:27 | ...; | +| E.cs:66:40:66:42 | SSA param(arr) | +| E.cs:70:13:70:49 | ... = ... | +| E.cs:70:13:70:50 | ...; | +| E.cs:70:36:70:36 | 0 | +| E.cs:72:9:73:23 | if (...) ... | +| E.cs:73:13:73:15 | access to parameter arr | +| E.cs:107:15:107:25 | SSA def(arr2) | +| E.cs:111:9:112:30 | for (...;...;...) ... | +| E.cs:111:25:111:25 | access to local variable i | +| E.cs:112:13:112:16 | access to local variable arr2 | +| E.cs:112:13:112:30 | ...; | +| E.cs:120:16:120:20 | !... | +| E.cs:121:9:143:9 | {...} | +| E.cs:123:20:123:35 | ... && ... | +| E.cs:123:29:123:29 | access to local variable j | +| E.cs:124:13:142:13 | {...} | +| E.cs:125:33:125:35 | access to local variable obj | +| E.cs:128:21:128:23 | access to local variable obj | +| E.cs:137:25:137:34 | SSA def(obj) | +| E.cs:139:21:139:29 | continue; | +| E.cs:141:17:141:26 | ...; | +| E.cs:152:16:152:26 | SSA def(obj2) | +| E.cs:158:9:159:28 | if (...) ... | +| E.cs:159:13:159:16 | access to local variable obj2 | +| E.cs:162:28:162:28 | SSA param(a) | +| E.cs:164:13:164:40 | Int32 n = ... | +| E.cs:164:29:164:29 | 0 | +| E.cs:165:25:165:25 | access to local variable i | +| E.cs:165:32:165:32 | access to local variable i | +| E.cs:166:9:170:9 | {...} | +| E.cs:167:21:167:21 | access to parameter a | +| E.cs:173:29:173:31 | SSA param(obj) | +| E.cs:173:29:173:31 | SSA param(obj) | +| E.cs:175:14:175:42 | Boolean b2 = ... | +| E.cs:175:33:175:37 | false | +| E.cs:177:9:179:9 | {...} | +| E.cs:178:13:178:15 | access to parameter obj | +| E.cs:180:9:183:9 | if (...) ... | +| E.cs:181:9:183:9 | {...} | +| E.cs:184:9:187:9 | if (...) ... | +| E.cs:186:13:186:15 | access to parameter obj | +| E.cs:190:29:190:29 | SSA param(o) | +| E.cs:192:17:192:17 | access to parameter o | +| E.cs:198:13:198:29 | [b (line 196): false] SSA def(o) | +| E.cs:198:13:198:29 | [b (line 196): true] SSA def(o) | +| E.cs:201:11:201:11 | access to local variable o | +| E.cs:203:11:203:11 | access to local variable o | +| E.cs:206:28:206:28 | SSA param(s) | +| E.cs:210:16:210:16 | access to parameter s | +| E.cs:217:13:217:20 | [b (line 213): true] SSA def(x) | +| E.cs:218:9:218:9 | access to local variable x | +| E.cs:220:13:220:13 | access to local variable x | +| E.cs:227:13:227:20 | [b (line 223): true] SSA def(x) | +| E.cs:229:13:229:13 | access to local variable x | +| E.cs:230:9:230:9 | access to local variable x | +| E.cs:233:26:233:26 | SSA param(i) | +| E.cs:235:16:235:16 | access to parameter i | +| E.cs:238:26:238:26 | SSA param(i) | +| E.cs:240:21:240:21 | access to parameter i | +| E.cs:283:13:283:22 | [b (line 279): false] SSA def(o) | +| E.cs:283:13:283:22 | [b (line 279): true] SSA def(o) | +| E.cs:285:9:285:9 | access to local variable o | +| E.cs:285:9:285:9 | access to local variable o | +| Forwarding.cs:7:16:7:23 | SSA def(s) | +| Forwarding.cs:14:9:17:9 | if (...) ... | +| Forwarding.cs:19:9:22:9 | if (...) ... | +| Forwarding.cs:24:9:27:9 | if (...) ... | +| Forwarding.cs:29:9:32:9 | if (...) ... | +| Forwarding.cs:34:9:37:9 | if (...) ... | +| Forwarding.cs:35:9:37:9 | {...} | +| Forwarding.cs:36:31:36:31 | access to local variable s | +| Forwarding.cs:40:27:40:27 | access to local variable s | +| GuardedString.cs:7:16:7:32 | SSA def(s) | +| GuardedString.cs:14:9:17:9 | if (...) ... | +| GuardedString.cs:19:9:20:40 | if (...) ... | +| GuardedString.cs:19:26:19:26 | 0 | +| GuardedString.cs:22:9:23:40 | if (...) ... | +| GuardedString.cs:22:25:22:25 | 0 | +| GuardedString.cs:25:9:26:40 | if (...) ... | +| GuardedString.cs:25:26:25:26 | 0 | +| GuardedString.cs:28:9:29:40 | if (...) ... | +| GuardedString.cs:28:25:28:26 | 10 | +| GuardedString.cs:31:9:32:40 | if (...) ... | +| GuardedString.cs:31:26:31:27 | 10 | +| GuardedString.cs:34:9:37:40 | if (...) ... | +| GuardedString.cs:34:26:34:26 | 0 | +| GuardedString.cs:35:31:35:31 | access to local variable s | +| NullAlwaysBad.cs:7:29:7:29 | SSA param(s) | +| NullAlwaysBad.cs:9:30:9:30 | access to parameter s | +| NullMaybeBad.cs:7:27:7:27 | access to parameter o | +| NullMaybeBad.cs:13:17:13:20 | null | +| StringConcatenation.cs:14:16:14:23 | SSA def(s) | +| StringConcatenation.cs:15:16:15:16 | access to local variable s | +| StringConcatenation.cs:16:17:16:17 | access to local variable s | +edges +| A.cs:7:16:7:40 | SSA def(synchronizedAlways) | A.cs:8:15:8:32 | access to local variable synchronizedAlways | +| A.cs:7:16:7:40 | SSA def(synchronizedAlways) | A.cs:10:13:10:30 | access to local variable synchronizedAlways | +| A.cs:16:15:16:30 | SSA def(arrayNull) | A.cs:17:9:17:17 | access to local variable arrayNull | +| A.cs:26:15:26:32 | SSA def(arrayAccess) | A.cs:31:27:31:37 | access to local variable arrayAccess | +| A.cs:26:15:26:32 | SSA def(arrayAccess) | A.cs:36:27:36:37 | access to local variable arrayAccess | +| A.cs:27:18:27:35 | SSA def(fieldAccess) | A.cs:32:27:32:37 | access to local variable fieldAccess | +| A.cs:27:18:27:35 | SSA def(fieldAccess) | A.cs:37:27:37:37 | access to local variable fieldAccess | +| A.cs:28:16:28:34 | SSA def(methodAccess) | A.cs:33:28:33:39 | access to local variable methodAccess | +| A.cs:28:16:28:34 | SSA def(methodAccess) | A.cs:38:15:38:26 | access to local variable methodAccess | +| A.cs:29:16:29:32 | SSA def(methodCall) | A.cs:34:27:34:36 | access to local variable methodCall | +| A.cs:29:16:29:32 | SSA def(methodCall) | A.cs:39:27:39:36 | access to local variable methodCall | +| A.cs:48:16:48:28 | SSA def(varRef) | A.cs:50:9:50:14 | access to local variable varRef | +| Assert.cs:13:9:13:25 | [b (line 7): false] SSA def(s) | Assert.cs:15:27:15:27 | access to local variable s | +| Assert.cs:13:9:13:25 | [b (line 7): true] SSA def(s) | Assert.cs:15:27:15:27 | access to local variable s | +| Assert.cs:21:9:21:25 | [b (line 7): false] SSA def(s) | Assert.cs:23:27:23:27 | access to local variable s | +| Assert.cs:21:9:21:25 | [b (line 7): true] SSA def(s) | Assert.cs:23:27:23:27 | access to local variable s | +| Assert.cs:29:9:29:25 | [b (line 7): false] SSA def(s) | Assert.cs:31:27:31:27 | access to local variable s | +| Assert.cs:29:9:29:25 | [b (line 7): true] SSA def(s) | Assert.cs:31:27:31:27 | access to local variable s | +| Assert.cs:45:9:45:25 | [b (line 7): false] SSA def(s) | Assert.cs:46:36:46:36 | [b (line 7): false] access to parameter b | +| Assert.cs:45:9:45:25 | [b (line 7): true] SSA def(s) | Assert.cs:46:36:46:36 | [b (line 7): true] access to parameter b | +| Assert.cs:46:36:46:36 | [b (line 7): false] access to parameter b | Assert.cs:47:27:47:27 | access to local variable s | +| Assert.cs:46:36:46:36 | [b (line 7): true] access to parameter b | Assert.cs:47:27:47:27 | access to local variable s | +| Assert.cs:49:9:49:25 | SSA def(s) | Assert.cs:50:37:50:37 | access to parameter b | +| Assert.cs:50:37:50:37 | access to parameter b | Assert.cs:51:27:51:27 | access to local variable s | +| B.cs:7:11:7:29 | SSA def(eqCallAlways) | B.cs:13:13:13:24 | access to local variable eqCallAlways | +| B.cs:10:11:10:30 | SSA def(neqCallAlways) | B.cs:13:13:13:36 | ...; | +| B.cs:10:11:10:30 | SSA def(neqCallAlways) | B.cs:15:9:16:26 | if (...) ... | +| B.cs:13:13:13:36 | ...; | B.cs:15:9:16:26 | if (...) ... | +| B.cs:15:9:16:26 | if (...) ... | B.cs:16:13:16:26 | ...; | +| B.cs:15:9:16:26 | if (...) ... | B.cs:18:9:20:26 | if (...) ... | +| B.cs:16:13:16:26 | ...; | B.cs:18:9:20:26 | if (...) ... | +| B.cs:18:9:20:26 | if (...) ... | B.cs:18:25:18:27 | {...} | +| B.cs:18:9:20:26 | if (...) ... | B.cs:20:13:20:26 | ...; | +| B.cs:18:25:18:27 | {...} | B.cs:22:9:24:37 | if (...) ... | +| B.cs:20:13:20:26 | ...; | B.cs:22:9:24:37 | if (...) ... | +| B.cs:22:9:24:37 | if (...) ... | B.cs:24:13:24:25 | access to local variable neqCallAlways | +| C.cs:10:16:10:23 | SSA def(o) | C.cs:16:9:19:9 | if (...) ... | +| C.cs:16:9:19:9 | if (...) ... | C.cs:18:13:18:13 | access to local variable o | +| C.cs:40:13:40:35 | SSA def(s) | C.cs:42:9:42:9 | access to local variable s | +| C.cs:55:13:55:36 | SSA def(o2) | C.cs:57:9:57:10 | access to local variable o2 | +| C.cs:62:13:62:46 | SSA def(o1) | C.cs:64:9:64:10 | access to local variable o1 | +| C.cs:66:13:66:46 | SSA def(o2) | C.cs:68:9:68:10 | access to local variable o2 | +| C.cs:95:13:95:45 | SSA def(o) | C.cs:96:15:96:15 | access to local variable o | +| C.cs:95:13:95:45 | SSA def(o) | C.cs:97:13:97:13 | access to local variable o | +| C.cs:103:13:103:23 | SSA def(list) | C.cs:104:27:104:30 | access to parameter list | +| C.cs:103:13:103:23 | SSA def(list) | C.cs:104:27:104:30 | access to parameter list | +| C.cs:104:9:108:9 | foreach (... ... in ...) ... | C.cs:104:22:104:22 | Int32 x | +| C.cs:104:9:108:9 | foreach (... ... in ...) ... | C.cs:107:13:107:16 | access to parameter list | +| C.cs:104:22:104:22 | Int32 x | C.cs:104:9:108:9 | foreach (... ... in ...) ... | +| C.cs:104:27:104:30 | access to parameter list | C.cs:104:9:108:9 | foreach (... ... in ...) ... | +| C.cs:160:9:160:16 | SSA def(s) | C.cs:163:13:163:13 | access to local variable s | +| C.cs:168:9:168:16 | SSA def(s) | C.cs:171:13:171:13 | access to local variable s | +| C.cs:179:13:179:20 | SSA def(s) | C.cs:178:13:178:13 | access to local variable s | +| C.cs:194:9:194:16 | SSA def(s) | C.cs:197:13:197:13 | access to local variable s | +| C.cs:198:13:198:20 | [b (line 193): true] SSA def(s) | C.cs:197:13:197:13 | access to local variable s | +| C.cs:205:13:205:20 | SSA def(s) | C.cs:204:13:204:13 | access to local variable s | +| C.cs:211:13:211:35 | SSA def(s) | C.cs:218:9:219:25 | if (...) ... | +| C.cs:215:13:215:20 | SSA def(s) | C.cs:218:9:219:25 | if (...) ... | +| C.cs:218:9:219:25 | if (...) ... | C.cs:219:13:219:13 | access to local variable s | +| C.cs:223:13:223:20 | SSA def(s) | C.cs:224:9:224:9 | access to local variable s | +| C.cs:230:22:230:22 | access to local variable s | C.cs:234:9:234:9 | access to local variable s | +| C.cs:230:33:230:40 | SSA def(s) | C.cs:230:22:230:22 | access to local variable s | +| C.cs:236:14:236:21 | SSA def(s) | C.cs:236:24:236:24 | access to local variable s | +| C.cs:236:24:236:24 | access to local variable s | C.cs:238:13:238:13 | access to local variable s | +| C.cs:236:35:236:42 | SSA def(s) | C.cs:236:24:236:24 | access to local variable s | +| C.cs:241:24:241:31 | SSA def(s) | C.cs:243:13:243:13 | access to local variable s | +| C.cs:249:15:249:22 | SSA def(a) | C.cs:250:9:250:9 | access to local variable a | +| C.cs:258:15:258:23 | SSA def(ia) | C.cs:261:9:261:10 | access to local variable ia | +| C.cs:258:15:258:23 | SSA def(ia) | C.cs:264:9:264:10 | access to local variable ia | +| C.cs:259:18:259:26 | SSA def(sa) | C.cs:262:20:262:21 | access to local variable sa | +| C.cs:259:18:259:26 | SSA def(sa) | C.cs:265:16:265:17 | access to local variable sa | +| D.cs:17:17:17:20 | null | D.cs:23:9:23:13 | access to parameter param | +| D.cs:26:32:26:36 | SSA param(param) | D.cs:32:9:32:13 | access to parameter param | +| D.cs:58:13:58:41 | SSA def(o5) | D.cs:61:9:62:26 | if (...) ... | +| D.cs:61:9:62:26 | if (...) ... | D.cs:62:13:62:14 | access to local variable o5 | +| D.cs:68:13:68:34 | SSA def(o7) | D.cs:69:13:69:36 | Boolean ok = ... | +| D.cs:69:13:69:36 | Boolean ok = ... | D.cs:73:13:73:14 | access to local variable o7 | +| D.cs:75:13:75:34 | SSA def(o8) | D.cs:76:34:76:35 | 42 | +| D.cs:76:13:76:43 | Int32 track = ... | D.cs:79:9:80:26 | if (...) ... | +| D.cs:76:34:76:35 | 42 | D.cs:76:13:76:43 | Int32 track = ... | +| D.cs:79:9:80:26 | if (...) ... | D.cs:81:9:82:26 | if (...) ... | +| D.cs:81:9:82:26 | if (...) ... | D.cs:82:13:82:14 | access to local variable o8 | +| D.cs:81:9:82:26 | if (...) ... | D.cs:82:13:82:26 | ...; | +| D.cs:81:9:82:26 | if (...) ... | D.cs:83:9:84:26 | if (...) ... | +| D.cs:82:13:82:26 | ...; | D.cs:83:9:84:26 | if (...) ... | +| D.cs:83:9:84:26 | if (...) ... | D.cs:84:13:84:14 | access to local variable o8 | +| D.cs:89:15:89:44 | SSA def(xs) | D.cs:91:13:91:14 | access to local variable xs | +| D.cs:89:15:89:44 | SSA def(xs) | D.cs:91:13:91:22 | ...; | +| D.cs:89:15:89:44 | SSA def(xs) | D.cs:93:9:94:30 | if (...) ... | +| D.cs:91:13:91:22 | ...; | D.cs:93:9:94:30 | if (...) ... | +| D.cs:93:9:94:30 | if (...) ... | D.cs:94:13:94:30 | ...; | +| D.cs:93:9:94:30 | if (...) ... | D.cs:94:21:94:22 | access to local variable xs | +| D.cs:93:9:94:30 | if (...) ... | D.cs:96:9:99:9 | if (...) ... | +| D.cs:94:13:94:30 | ...; | D.cs:96:9:99:9 | if (...) ... | +| D.cs:96:9:99:9 | if (...) ... | D.cs:97:9:99:9 | {...} | +| D.cs:96:9:99:9 | if (...) ... | D.cs:98:21:98:22 | access to local variable xs | +| D.cs:96:9:99:9 | if (...) ... | D.cs:101:9:102:35 | if (...) ... | +| D.cs:97:9:99:9 | {...} | D.cs:101:9:102:35 | if (...) ... | +| D.cs:101:9:102:35 | if (...) ... | D.cs:102:31:102:32 | access to local variable xs | +| D.cs:101:9:102:35 | if (...) ... | D.cs:102:31:102:32 | access to local variable xs | +| D.cs:101:9:102:35 | if (...) ... | D.cs:104:9:106:30 | if (...) ... | +| D.cs:102:13:102:35 | foreach (... ... in ...) ... | D.cs:102:35:102:35 | ; | +| D.cs:102:13:102:35 | foreach (... ... in ...) ... | D.cs:104:9:106:30 | if (...) ... | +| D.cs:102:31:102:32 | access to local variable xs | D.cs:102:13:102:35 | foreach (... ... in ...) ... | +| D.cs:102:35:102:35 | ; | D.cs:102:13:102:35 | foreach (... ... in ...) ... | +| D.cs:104:9:106:30 | if (...) ... | D.cs:105:19:105:20 | access to local variable xs | +| D.cs:104:9:106:30 | if (...) ... | D.cs:106:17:106:18 | access to local variable xs | +| D.cs:118:9:118:30 | SSA def(x) | D.cs:120:13:120:13 | access to local variable x | +| D.cs:125:35:125:35 | SSA param(a) | D.cs:127:32:127:32 | 0 | +| D.cs:125:35:125:35 | SSA param(a) | D.cs:127:32:127:32 | 0 | +| D.cs:125:44:125:44 | SSA param(b) | D.cs:127:32:127:32 | 0 | +| D.cs:125:44:125:44 | SSA param(b) | D.cs:127:36:127:36 | access to parameter a | +| D.cs:127:13:127:43 | Int32 alen = ... | D.cs:128:32:128:32 | 0 | +| D.cs:127:13:127:43 | Int32 alen = ... | D.cs:128:32:128:32 | 0 | +| D.cs:127:13:127:43 | Int32 alen = ... | D.cs:128:36:128:36 | access to parameter b | +| D.cs:127:32:127:32 | 0 | D.cs:127:13:127:43 | Int32 alen = ... | +| D.cs:127:32:127:32 | 0 | D.cs:127:13:127:43 | Int32 alen = ... | +| D.cs:127:36:127:36 | access to parameter a | D.cs:127:13:127:43 | Int32 alen = ... | +| D.cs:128:13:128:43 | Int32 blen = ... | D.cs:131:9:137:9 | {...} | +| D.cs:128:13:128:43 | Int32 blen = ... | D.cs:131:9:137:9 | {...} | +| D.cs:128:13:128:43 | Int32 blen = ... | D.cs:138:9:138:18 | ... ...; | +| D.cs:128:32:128:32 | 0 | D.cs:128:13:128:43 | Int32 blen = ... | +| D.cs:128:32:128:32 | 0 | D.cs:128:13:128:43 | Int32 blen = ... | +| D.cs:128:36:128:36 | access to parameter b | D.cs:128:13:128:43 | Int32 blen = ... | +| D.cs:131:9:137:9 | {...} | D.cs:132:29:132:29 | access to local variable i | +| D.cs:131:9:137:9 | {...} | D.cs:132:29:132:29 | access to local variable i | +| D.cs:132:29:132:29 | access to local variable i | D.cs:133:13:136:13 | {...} | +| D.cs:132:29:132:29 | access to local variable i | D.cs:133:13:136:13 | {...} | +| D.cs:132:29:132:29 | access to local variable i | D.cs:134:24:134:24 | access to parameter a | +| D.cs:132:29:132:29 | access to local variable i | D.cs:135:24:135:24 | access to parameter b | +| D.cs:132:29:132:29 | access to local variable i | D.cs:138:9:138:18 | ... ...; | +| D.cs:133:13:136:13 | {...} | D.cs:132:29:132:29 | access to local variable i | +| D.cs:133:13:136:13 | {...} | D.cs:132:29:132:29 | access to local variable i | +| D.cs:138:9:138:18 | ... ...; | D.cs:142:13:142:22 | ...; | +| D.cs:142:13:142:22 | ...; | D.cs:143:9:146:9 | for (...;...;...) ... | +| D.cs:143:9:146:9 | for (...;...;...) ... | D.cs:143:25:143:25 | access to local variable i | +| D.cs:143:25:143:25 | access to local variable i | D.cs:144:9:146:9 | {...} | +| D.cs:143:25:143:25 | access to local variable i | D.cs:145:20:145:20 | access to parameter a | +| D.cs:144:9:146:9 | {...} | D.cs:143:25:143:25 | access to local variable i | +| D.cs:149:36:149:38 | SSA param(obj) | D.cs:151:9:151:11 | access to parameter obj | +| D.cs:163:16:163:25 | SSA def(obj) | D.cs:168:9:170:9 | [exception: Exception] catch (...) {...} | +| D.cs:168:9:170:9 | [exception: Exception] catch (...) {...} | D.cs:171:9:171:11 | access to local variable obj | +| D.cs:240:9:240:16 | SSA def(o) | D.cs:241:29:241:32 | null | +| D.cs:240:9:240:16 | SSA def(o) | D.cs:241:36:241:37 | "" | +| D.cs:241:13:241:37 | String other = ... | D.cs:244:9:247:25 | if (...) ... | +| D.cs:241:29:241:32 | null | D.cs:241:13:241:37 | String other = ... | +| D.cs:241:36:241:37 | "" | D.cs:241:13:241:37 | String other = ... | +| D.cs:244:9:247:25 | if (...) ... | D.cs:245:13:245:13 | access to local variable o | +| D.cs:244:9:247:25 | if (...) ... | D.cs:247:13:247:13 | access to local variable o | +| D.cs:249:13:249:38 | SSA def(o2) | D.cs:253:13:253:14 | access to local variable o2 | +| D.cs:258:16:258:23 | SSA def(o) | D.cs:266:9:267:25 | if (...) ... | +| D.cs:266:9:267:25 | if (...) ... | D.cs:267:13:267:13 | access to local variable o | +| D.cs:269:9:269:16 | SSA def(o) | D.cs:272:25:272:25 | access to local variable i | +| D.cs:272:25:272:25 | access to local variable i | D.cs:273:9:288:9 | {...} | +| D.cs:272:25:272:25 | access to local variable i | D.cs:290:9:291:25 | if (...) ... | +| D.cs:272:39:272:39 | access to local variable i | D.cs:272:25:272:25 | access to local variable i | +| D.cs:273:9:288:9 | {...} | D.cs:281:13:287:13 | if (...) ... | +| D.cs:281:13:287:13 | if (...) ... | D.cs:272:39:272:39 | access to local variable i | +| D.cs:283:17:283:24 | SSA def(o) | D.cs:285:28:285:30 | {...} | +| D.cs:283:17:283:24 | SSA def(o) | D.cs:286:17:286:30 | ...; | +| D.cs:285:28:285:30 | {...} | D.cs:286:17:286:30 | ...; | +| D.cs:286:17:286:30 | ...; | D.cs:272:39:272:39 | access to local variable i | +| D.cs:290:9:291:25 | if (...) ... | D.cs:291:13:291:13 | access to local variable o | +| D.cs:290:9:291:25 | if (...) ... | D.cs:291:13:291:25 | ...; | +| D.cs:290:9:291:25 | if (...) ... | D.cs:293:9:294:25 | if (...) ... | +| D.cs:291:13:291:25 | ...; | D.cs:293:9:294:25 | if (...) ... | +| D.cs:293:9:294:25 | if (...) ... | D.cs:294:13:294:13 | access to local variable o | +| D.cs:296:16:296:26 | SSA def(prev) | D.cs:297:25:297:25 | access to local variable i | +| D.cs:297:25:297:25 | access to local variable i | D.cs:298:9:302:9 | {...} | +| D.cs:298:9:302:9 | {...} | D.cs:300:17:300:20 | access to local variable prev | +| D.cs:304:16:304:23 | SSA def(s) | D.cs:307:13:311:13 | foreach (... ... in ...) ... | +| D.cs:307:13:311:13 | foreach (... ... in ...) ... | D.cs:312:13:313:29 | if (...) ... | +| D.cs:312:13:313:29 | if (...) ... | D.cs:313:17:313:17 | access to local variable s | +| D.cs:316:16:316:23 | SSA def(r) | D.cs:318:16:318:62 | ... && ... | +| D.cs:318:16:318:62 | ... && ... | D.cs:318:41:318:44 | access to local variable stat | +| D.cs:318:16:318:62 | ... && ... | D.cs:324:9:324:9 | access to local variable r | +| D.cs:318:41:318:44 | access to local variable stat | D.cs:324:9:324:9 | access to local variable r | +| D.cs:351:15:351:22 | SSA def(a) | D.cs:355:9:356:21 | for (...;...;...) ... | +| D.cs:355:9:356:21 | for (...;...;...) ... | D.cs:355:25:355:25 | access to local variable i | +| D.cs:355:25:355:25 | access to local variable i | D.cs:356:13:356:13 | access to local variable a | +| D.cs:355:25:355:25 | access to local variable i | D.cs:356:13:356:21 | ...; | +| D.cs:356:13:356:21 | ...; | D.cs:355:25:355:25 | access to local variable i | +| D.cs:360:20:360:30 | SSA def(last) | D.cs:361:29:361:29 | access to local variable i | +| D.cs:361:29:361:29 | access to local variable i | D.cs:363:13:363:16 | access to local variable last | +| D.cs:366:15:366:47 | SSA def(b) | D.cs:370:9:373:9 | for (...;...;...) ... | +| D.cs:370:9:373:9 | for (...;...;...) ... | D.cs:370:25:370:25 | access to local variable i | +| D.cs:370:25:370:25 | access to local variable i | D.cs:371:9:373:9 | {...} | +| D.cs:370:25:370:25 | access to local variable i | D.cs:372:13:372:13 | access to local variable b | +| D.cs:371:9:373:9 | {...} | D.cs:370:25:370:25 | access to local variable i | +| D.cs:378:19:378:28 | SSA def(ioe) | D.cs:382:9:385:27 | if (...) ... | +| D.cs:382:9:385:27 | if (...) ... | D.cs:385:13:385:15 | access to local variable ioe | +| D.cs:388:36:388:36 | SSA param(a) | D.cs:390:32:390:32 | 0 | +| D.cs:388:45:388:45 | SSA param(b) | D.cs:390:32:390:32 | 0 | +| D.cs:388:45:388:45 | SSA param(b) | D.cs:390:36:390:36 | access to parameter a | +| D.cs:390:13:390:43 | Int32 alen = ... | D.cs:393:21:393:21 | access to local variable i | +| D.cs:390:13:390:43 | Int32 alen = ... | D.cs:393:21:393:21 | access to local variable i | +| D.cs:390:32:390:32 | 0 | D.cs:390:13:390:43 | Int32 alen = ... | +| D.cs:390:32:390:32 | 0 | D.cs:390:13:390:43 | Int32 alen = ... | +| D.cs:390:36:390:36 | access to parameter a | D.cs:390:13:390:43 | Int32 alen = ... | +| D.cs:393:21:393:21 | access to local variable i | D.cs:394:9:396:9 | {...} | +| D.cs:393:21:393:21 | access to local variable i | D.cs:394:9:396:9 | {...} | +| D.cs:393:21:393:21 | access to local variable i | D.cs:395:20:395:20 | access to parameter a | +| D.cs:393:21:393:21 | access to local variable i | D.cs:397:9:397:44 | ... ...; | +| D.cs:394:9:396:9 | {...} | D.cs:393:21:393:21 | access to local variable i | +| D.cs:394:9:396:9 | {...} | D.cs:393:21:393:21 | access to local variable i | +| D.cs:397:9:397:44 | ... ...; | D.cs:397:32:397:32 | 0 | +| D.cs:397:13:397:43 | Int32 blen = ... | D.cs:398:21:398:21 | access to local variable i | +| D.cs:397:32:397:32 | 0 | D.cs:397:13:397:43 | Int32 blen = ... | +| D.cs:398:21:398:21 | access to local variable i | D.cs:399:9:401:9 | {...} | +| D.cs:398:21:398:21 | access to local variable i | D.cs:400:20:400:20 | access to parameter b | +| D.cs:399:9:401:9 | {...} | D.cs:398:21:398:21 | access to local variable i | +| D.cs:405:35:405:35 | SSA param(x) | D.cs:407:42:407:63 | ... && ... | +| D.cs:405:35:405:35 | SSA param(x) | D.cs:407:42:407:63 | ... && ... | +| D.cs:405:35:405:35 | SSA param(x) | D.cs:407:42:407:63 | ... && ... | +| D.cs:405:45:405:45 | SSA param(y) | D.cs:407:42:407:63 | ... && ... | +| D.cs:405:45:405:45 | SSA param(y) | D.cs:407:42:407:63 | ... && ... | +| D.cs:405:45:405:45 | SSA param(y) | D.cs:407:42:407:63 | ... && ... | +| D.cs:407:42:407:63 | ... && ... | D.cs:407:55:407:55 | access to parameter y | +| D.cs:407:42:407:63 | ... && ... | D.cs:407:55:407:55 | access to parameter y | +| D.cs:407:42:407:63 | ... && ... | D.cs:409:9:410:25 | if (...) ... | +| D.cs:407:55:407:55 | access to parameter y | D.cs:409:9:410:25 | if (...) ... | +| D.cs:407:55:407:55 | access to parameter y | D.cs:409:9:410:25 | if (...) ... | +| D.cs:409:9:410:25 | if (...) ... | D.cs:410:13:410:13 | access to parameter y | +| D.cs:409:9:410:25 | if (...) ... | D.cs:411:9:412:25 | if (...) ... | +| D.cs:411:9:412:25 | if (...) ... | D.cs:412:13:412:13 | access to parameter x | +| E.cs:9:18:9:26 | SSA def(a2) | E.cs:10:13:10:54 | Boolean haveA2 = ... | +| E.cs:10:13:10:54 | Boolean haveA2 = ... | E.cs:12:38:12:39 | access to local variable a2 | +| E.cs:11:16:11:24 | SSA def(a3) | E.cs:12:13:12:52 | Boolean haveA3 = ... | +| E.cs:12:13:12:52 | Boolean haveA3 = ... | E.cs:14:13:14:14 | access to local variable a3 | +| E.cs:23:13:23:30 | SSA def(s1) | E.cs:24:33:24:36 | null | +| E.cs:24:13:24:41 | ... = ... | E.cs:26:9:27:26 | if (...) ... | +| E.cs:24:33:24:36 | null | E.cs:24:13:24:41 | ... = ... | +| E.cs:26:9:27:26 | if (...) ... | E.cs:27:13:27:14 | access to local variable s1 | +| E.cs:32:16:32:26 | SSA def(last) | E.cs:33:9:34:21 | foreach (... ... in ...) ... | +| E.cs:33:9:34:21 | foreach (... ... in ...) ... | E.cs:35:9:35:12 | access to local variable last | +| E.cs:37:9:37:19 | SSA def(last) | E.cs:39:9:44:9 | {...} | +| E.cs:39:9:44:9 | {...} | E.cs:40:13:41:25 | foreach (... ... in ...) ... | +| E.cs:40:13:41:25 | foreach (... ... in ...) ... | E.cs:43:13:43:16 | access to local variable last | +| E.cs:51:22:51:33 | SSA def(slice) | E.cs:53:16:53:19 | access to local variable iter | +| E.cs:53:16:53:19 | access to local variable iter | E.cs:54:9:63:9 | {...} | +| E.cs:54:9:63:9 | {...} | E.cs:61:13:61:17 | access to local variable slice | +| E.cs:54:9:63:9 | {...} | E.cs:61:13:61:27 | ...; | +| E.cs:61:13:61:27 | ...; | E.cs:53:16:53:19 | access to local variable iter | +| E.cs:66:40:66:42 | SSA param(arr) | E.cs:70:13:70:50 | ...; | +| E.cs:66:40:66:42 | SSA param(arr) | E.cs:72:9:73:23 | if (...) ... | +| E.cs:70:13:70:49 | ... = ... | E.cs:72:9:73:23 | if (...) ... | +| E.cs:70:13:70:50 | ...; | E.cs:70:36:70:36 | 0 | +| E.cs:70:36:70:36 | 0 | E.cs:70:13:70:49 | ... = ... | +| E.cs:72:9:73:23 | if (...) ... | E.cs:73:13:73:15 | access to parameter arr | +| E.cs:107:15:107:25 | SSA def(arr2) | E.cs:111:9:112:30 | for (...;...;...) ... | +| E.cs:111:9:112:30 | for (...;...;...) ... | E.cs:111:25:111:25 | access to local variable i | +| E.cs:111:25:111:25 | access to local variable i | E.cs:112:13:112:16 | access to local variable arr2 | +| E.cs:111:25:111:25 | access to local variable i | E.cs:112:13:112:30 | ...; | +| E.cs:112:13:112:30 | ...; | E.cs:111:25:111:25 | access to local variable i | +| E.cs:120:16:120:20 | !... | E.cs:121:9:143:9 | {...} | +| E.cs:121:9:143:9 | {...} | E.cs:123:20:123:35 | ... && ... | +| E.cs:123:20:123:35 | ... && ... | E.cs:120:16:120:20 | !... | +| E.cs:123:20:123:35 | ... && ... | E.cs:123:29:123:29 | access to local variable j | +| E.cs:123:29:123:29 | access to local variable j | E.cs:120:16:120:20 | !... | +| E.cs:123:29:123:29 | access to local variable j | E.cs:124:13:142:13 | {...} | +| E.cs:123:29:123:29 | access to local variable j | E.cs:125:33:125:35 | access to local variable obj | +| E.cs:124:13:142:13 | {...} | E.cs:128:21:128:23 | access to local variable obj | +| E.cs:124:13:142:13 | {...} | E.cs:141:17:141:26 | ...; | +| E.cs:137:25:137:34 | SSA def(obj) | E.cs:139:21:139:29 | continue; | +| E.cs:139:21:139:29 | continue; | E.cs:123:20:123:35 | ... && ... | +| E.cs:141:17:141:26 | ...; | E.cs:123:20:123:35 | ... && ... | +| E.cs:152:16:152:26 | SSA def(obj2) | E.cs:158:9:159:28 | if (...) ... | +| E.cs:158:9:159:28 | if (...) ... | E.cs:159:13:159:16 | access to local variable obj2 | +| E.cs:162:28:162:28 | SSA param(a) | E.cs:164:29:164:29 | 0 | +| E.cs:164:13:164:40 | Int32 n = ... | E.cs:165:25:165:25 | access to local variable i | +| E.cs:164:29:164:29 | 0 | E.cs:164:13:164:40 | Int32 n = ... | +| E.cs:165:25:165:25 | access to local variable i | E.cs:166:9:170:9 | {...} | +| E.cs:165:25:165:25 | access to local variable i | E.cs:167:21:167:21 | access to parameter a | +| E.cs:165:32:165:32 | access to local variable i | E.cs:165:25:165:25 | access to local variable i | +| E.cs:166:9:170:9 | {...} | E.cs:165:32:165:32 | access to local variable i | +| E.cs:173:29:173:31 | SSA param(obj) | E.cs:175:33:175:37 | false | +| E.cs:173:29:173:31 | SSA param(obj) | E.cs:175:33:175:37 | false | +| E.cs:175:14:175:42 | Boolean b2 = ... | E.cs:177:9:179:9 | {...} | +| E.cs:175:14:175:42 | Boolean b2 = ... | E.cs:178:13:178:15 | access to parameter obj | +| E.cs:175:14:175:42 | Boolean b2 = ... | E.cs:180:9:183:9 | if (...) ... | +| E.cs:175:33:175:37 | false | E.cs:175:14:175:42 | Boolean b2 = ... | +| E.cs:177:9:179:9 | {...} | E.cs:180:9:183:9 | if (...) ... | +| E.cs:180:9:183:9 | if (...) ... | E.cs:181:9:183:9 | {...} | +| E.cs:181:9:183:9 | {...} | E.cs:184:9:187:9 | if (...) ... | +| E.cs:184:9:187:9 | if (...) ... | E.cs:186:13:186:15 | access to parameter obj | +| E.cs:190:29:190:29 | SSA param(o) | E.cs:192:17:192:17 | access to parameter o | +| E.cs:198:13:198:29 | [b (line 196): false] SSA def(o) | E.cs:203:11:203:11 | access to local variable o | +| E.cs:198:13:198:29 | [b (line 196): true] SSA def(o) | E.cs:201:11:201:11 | access to local variable o | +| E.cs:206:28:206:28 | SSA param(s) | E.cs:210:16:210:16 | access to parameter s | +| E.cs:217:13:217:20 | [b (line 213): true] SSA def(x) | E.cs:218:9:218:9 | access to local variable x | +| E.cs:217:13:217:20 | [b (line 213): true] SSA def(x) | E.cs:220:13:220:13 | access to local variable x | +| E.cs:227:13:227:20 | [b (line 223): true] SSA def(x) | E.cs:229:13:229:13 | access to local variable x | +| E.cs:227:13:227:20 | [b (line 223): true] SSA def(x) | E.cs:230:9:230:9 | access to local variable x | +| E.cs:233:26:233:26 | SSA param(i) | E.cs:235:16:235:16 | access to parameter i | +| E.cs:238:26:238:26 | SSA param(i) | E.cs:240:21:240:21 | access to parameter i | +| E.cs:283:13:283:22 | [b (line 279): false] SSA def(o) | E.cs:285:9:285:9 | access to local variable o | +| E.cs:283:13:283:22 | [b (line 279): true] SSA def(o) | E.cs:285:9:285:9 | access to local variable o | +| Forwarding.cs:7:16:7:23 | SSA def(s) | Forwarding.cs:14:9:17:9 | if (...) ... | +| Forwarding.cs:14:9:17:9 | if (...) ... | Forwarding.cs:19:9:22:9 | if (...) ... | +| Forwarding.cs:19:9:22:9 | if (...) ... | Forwarding.cs:24:9:27:9 | if (...) ... | +| Forwarding.cs:24:9:27:9 | if (...) ... | Forwarding.cs:29:9:32:9 | if (...) ... | +| Forwarding.cs:29:9:32:9 | if (...) ... | Forwarding.cs:34:9:37:9 | if (...) ... | +| Forwarding.cs:34:9:37:9 | if (...) ... | Forwarding.cs:35:9:37:9 | {...} | +| Forwarding.cs:34:9:37:9 | if (...) ... | Forwarding.cs:36:31:36:31 | access to local variable s | +| Forwarding.cs:35:9:37:9 | {...} | Forwarding.cs:40:27:40:27 | access to local variable s | +| GuardedString.cs:7:16:7:32 | SSA def(s) | GuardedString.cs:14:9:17:9 | if (...) ... | +| GuardedString.cs:14:9:17:9 | if (...) ... | GuardedString.cs:19:9:20:40 | if (...) ... | +| GuardedString.cs:19:9:20:40 | if (...) ... | GuardedString.cs:19:26:19:26 | 0 | +| GuardedString.cs:19:26:19:26 | 0 | GuardedString.cs:22:9:23:40 | if (...) ... | +| GuardedString.cs:22:9:23:40 | if (...) ... | GuardedString.cs:22:25:22:25 | 0 | +| GuardedString.cs:22:25:22:25 | 0 | GuardedString.cs:25:9:26:40 | if (...) ... | +| GuardedString.cs:25:9:26:40 | if (...) ... | GuardedString.cs:25:26:25:26 | 0 | +| GuardedString.cs:25:26:25:26 | 0 | GuardedString.cs:28:9:29:40 | if (...) ... | +| GuardedString.cs:28:9:29:40 | if (...) ... | GuardedString.cs:28:25:28:26 | 10 | +| GuardedString.cs:28:25:28:26 | 10 | GuardedString.cs:31:9:32:40 | if (...) ... | +| GuardedString.cs:31:9:32:40 | if (...) ... | GuardedString.cs:31:26:31:27 | 10 | +| GuardedString.cs:31:26:31:27 | 10 | GuardedString.cs:34:9:37:40 | if (...) ... | +| GuardedString.cs:34:9:37:40 | if (...) ... | GuardedString.cs:34:26:34:26 | 0 | +| GuardedString.cs:34:26:34:26 | 0 | GuardedString.cs:35:31:35:31 | access to local variable s | +| NullAlwaysBad.cs:7:29:7:29 | SSA param(s) | NullAlwaysBad.cs:9:30:9:30 | access to parameter s | +| NullMaybeBad.cs:13:17:13:20 | null | NullMaybeBad.cs:7:27:7:27 | access to parameter o | +| StringConcatenation.cs:14:16:14:23 | SSA def(s) | StringConcatenation.cs:15:16:15:16 | access to local variable s | +| StringConcatenation.cs:15:16:15:16 | access to local variable s | StringConcatenation.cs:16:17:16:17 | access to local variable s | +#select +| C.cs:64:9:64:10 | access to local variable o1 | C.cs:62:13:62:46 | SSA def(o1) | C.cs:64:9:64:10 | access to local variable o1 | Variable $@ may be null here because of $@ assignment. | C.cs:62:13:62:14 | o1 | o1 | C.cs:62:13:62:46 | Object o1 = ... | this | +| C.cs:68:9:68:10 | access to local variable o2 | C.cs:66:13:66:46 | SSA def(o2) | C.cs:68:9:68:10 | access to local variable o2 | Variable $@ may be null here because of $@ assignment. | C.cs:66:13:66:14 | o2 | o2 | C.cs:66:13:66:46 | Object o2 = ... | this | +| C.cs:96:15:96:15 | access to local variable o | C.cs:95:13:95:45 | SSA def(o) | C.cs:96:15:96:15 | access to local variable o | Variable $@ may be null here because of $@ assignment. | C.cs:95:13:95:13 | o | o | C.cs:95:13:95:45 | Object o = ... | this | +| C.cs:104:27:104:30 | access to parameter list | C.cs:103:13:103:23 | SSA def(list) | C.cs:104:27:104:30 | access to parameter list | Variable $@ may be null here because of $@ assignment. | C.cs:100:42:100:45 | list | list | C.cs:103:13:103:23 | ... = ... | this | +| C.cs:178:13:178:13 | access to local variable s | C.cs:179:13:179:20 | SSA def(s) | C.cs:178:13:178:13 | access to local variable s | Variable $@ may be null here because of $@ assignment. | C.cs:152:13:152:13 | s | s | C.cs:179:13:179:20 | ... = ... | this | +| C.cs:204:13:204:13 | access to local variable s | C.cs:205:13:205:20 | SSA def(s) | C.cs:204:13:204:13 | access to local variable s | Variable $@ may be null here because of $@ assignment. | C.cs:186:13:186:13 | s | s | C.cs:205:13:205:20 | ... = ... | this | +| C.cs:224:9:224:9 | access to local variable s | C.cs:223:13:223:20 | SSA def(s) | C.cs:224:9:224:9 | access to local variable s | Variable $@ may be null here because of $@ assignment. | C.cs:211:13:211:13 | s | s | C.cs:223:13:223:20 | ... = ... | this | +| C.cs:243:13:243:13 | access to local variable s | C.cs:241:24:241:31 | SSA def(s) | C.cs:243:13:243:13 | access to local variable s | Variable $@ may be null here because of $@ assignment. | C.cs:229:16:229:16 | s | s | C.cs:241:24:241:31 | ... = ... | this | +| D.cs:23:9:23:13 | access to parameter param | D.cs:17:17:17:20 | null | D.cs:23:9:23:13 | access to parameter param | Variable $@ may be null here because of $@ null argument. | D.cs:21:32:21:36 | param | param | D.cs:17:17:17:20 | null | this | +| D.cs:32:9:32:13 | access to parameter param | D.cs:26:32:26:36 | SSA param(param) | D.cs:32:9:32:13 | access to parameter param | Variable $@ may be null here as suggested by $@ null check. | D.cs:26:32:26:36 | param | param | D.cs:28:13:28:25 | ... != ... | this | +| D.cs:62:13:62:14 | access to local variable o5 | D.cs:58:13:58:41 | SSA def(o5) | D.cs:62:13:62:14 | access to local variable o5 | Variable $@ may be null here because of $@ assignment. | D.cs:58:13:58:14 | o5 | o5 | D.cs:58:13:58:41 | String o5 = ... | this | +| D.cs:73:13:73:14 | access to local variable o7 | D.cs:68:13:68:34 | SSA def(o7) | D.cs:73:13:73:14 | access to local variable o7 | Variable $@ may be null here because of $@ assignment. | D.cs:68:13:68:14 | o7 | o7 | D.cs:68:13:68:34 | String o7 = ... | this | +| D.cs:82:13:82:14 | access to local variable o8 | D.cs:75:13:75:34 | SSA def(o8) | D.cs:82:13:82:14 | access to local variable o8 | Variable $@ may be null here because of $@ assignment. | D.cs:75:13:75:14 | o8 | o8 | D.cs:75:13:75:34 | String o8 = ... | this | +| D.cs:84:13:84:14 | access to local variable o8 | D.cs:75:13:75:34 | SSA def(o8) | D.cs:84:13:84:14 | access to local variable o8 | Variable $@ may be null here because of $@ assignment. | D.cs:75:13:75:14 | o8 | o8 | D.cs:75:13:75:34 | String o8 = ... | this | +| D.cs:91:13:91:14 | access to local variable xs | D.cs:89:15:89:44 | SSA def(xs) | D.cs:91:13:91:14 | access to local variable xs | Variable $@ may be null here because of $@ assignment. | D.cs:89:15:89:16 | xs | xs | D.cs:89:15:89:44 | Int32[] xs = ... | this | +| D.cs:94:21:94:22 | access to local variable xs | D.cs:89:15:89:44 | SSA def(xs) | D.cs:94:21:94:22 | access to local variable xs | Variable $@ may be null here because of $@ assignment. | D.cs:89:15:89:16 | xs | xs | D.cs:89:15:89:44 | Int32[] xs = ... | this | +| D.cs:98:21:98:22 | access to local variable xs | D.cs:89:15:89:44 | SSA def(xs) | D.cs:98:21:98:22 | access to local variable xs | Variable $@ may be null here because of $@ assignment. | D.cs:89:15:89:16 | xs | xs | D.cs:89:15:89:44 | Int32[] xs = ... | this | +| D.cs:102:31:102:32 | access to local variable xs | D.cs:89:15:89:44 | SSA def(xs) | D.cs:102:31:102:32 | access to local variable xs | Variable $@ may be null here because of $@ assignment. | D.cs:89:15:89:16 | xs | xs | D.cs:89:15:89:44 | Int32[] xs = ... | this | +| D.cs:105:19:105:20 | access to local variable xs | D.cs:89:15:89:44 | SSA def(xs) | D.cs:105:19:105:20 | access to local variable xs | Variable $@ may be null here because of $@ assignment. | D.cs:89:15:89:16 | xs | xs | D.cs:89:15:89:44 | Int32[] xs = ... | this | +| D.cs:134:24:134:24 | access to parameter a | D.cs:125:35:125:35 | SSA param(a) | D.cs:134:24:134:24 | access to parameter a | Variable $@ may be null here as suggested by $@ null check. | D.cs:125:35:125:35 | a | a | D.cs:127:20:127:28 | ... == ... | this | +| D.cs:134:24:134:24 | access to parameter a | D.cs:125:35:125:35 | SSA param(a) | D.cs:134:24:134:24 | access to parameter a | Variable $@ may be null here as suggested by $@ null check. | D.cs:125:35:125:35 | a | a | D.cs:139:13:139:21 | ... != ... | this | +| D.cs:135:24:135:24 | access to parameter b | D.cs:125:44:125:44 | SSA param(b) | D.cs:135:24:135:24 | access to parameter b | Variable $@ may be null here as suggested by $@ null check. | D.cs:125:44:125:44 | b | b | D.cs:128:20:128:28 | ... == ... | this | +| D.cs:145:20:145:20 | access to parameter a | D.cs:125:35:125:35 | SSA param(a) | D.cs:145:20:145:20 | access to parameter a | Variable $@ may be null here as suggested by $@ null check. | D.cs:125:35:125:35 | a | a | D.cs:127:20:127:28 | ... == ... | this | +| D.cs:145:20:145:20 | access to parameter a | D.cs:125:35:125:35 | SSA param(a) | D.cs:145:20:145:20 | access to parameter a | Variable $@ may be null here as suggested by $@ null check. | D.cs:125:35:125:35 | a | a | D.cs:139:13:139:21 | ... != ... | this | +| D.cs:151:9:151:11 | access to parameter obj | D.cs:149:36:149:38 | SSA param(obj) | D.cs:151:9:151:11 | access to parameter obj | Variable $@ may be null here as suggested by $@ null check. | D.cs:149:36:149:38 | obj | obj | D.cs:152:17:152:27 | ... != ... | this | +| D.cs:171:9:171:11 | access to local variable obj | D.cs:163:16:163:25 | SSA def(obj) | D.cs:171:9:171:11 | access to local variable obj | Variable $@ may be null here because of $@ assignment. | D.cs:163:16:163:18 | obj | obj | D.cs:163:16:163:25 | Object obj = ... | this | +| D.cs:245:13:245:13 | access to local variable o | D.cs:240:9:240:16 | SSA def(o) | D.cs:245:13:245:13 | access to local variable o | Variable $@ may be null here because of $@ assignment. | D.cs:228:16:228:16 | o | o | D.cs:240:9:240:16 | ... = ... | this | +| D.cs:247:13:247:13 | access to local variable o | D.cs:240:9:240:16 | SSA def(o) | D.cs:247:13:247:13 | access to local variable o | Variable $@ may be null here because of $@ assignment. | D.cs:228:16:228:16 | o | o | D.cs:240:9:240:16 | ... = ... | this | +| D.cs:253:13:253:14 | access to local variable o2 | D.cs:249:13:249:38 | SSA def(o2) | D.cs:253:13:253:14 | access to local variable o2 | Variable $@ may be null here because of $@ assignment. | D.cs:249:13:249:14 | o2 | o2 | D.cs:249:13:249:38 | String o2 = ... | this | +| D.cs:267:13:267:13 | access to local variable o | D.cs:258:16:258:23 | SSA def(o) | D.cs:267:13:267:13 | access to local variable o | Variable $@ may be null here because of $@ assignment. | D.cs:258:16:258:16 | o | o | D.cs:258:16:258:23 | Object o = ... | this | +| D.cs:291:13:291:13 | access to local variable o | D.cs:269:9:269:16 | SSA def(o) | D.cs:291:13:291:13 | access to local variable o | Variable $@ may be null here because of $@ assignment. | D.cs:258:16:258:16 | o | o | D.cs:269:9:269:16 | ... = ... | this | +| D.cs:291:13:291:13 | access to local variable o | D.cs:283:17:283:24 | SSA def(o) | D.cs:291:13:291:13 | access to local variable o | Variable $@ may be null here because of $@ assignment. | D.cs:258:16:258:16 | o | o | D.cs:283:17:283:24 | ... = ... | this | +| D.cs:294:13:294:13 | access to local variable o | D.cs:269:9:269:16 | SSA def(o) | D.cs:294:13:294:13 | access to local variable o | Variable $@ may be null here because of $@ assignment. | D.cs:258:16:258:16 | o | o | D.cs:269:9:269:16 | ... = ... | this | +| D.cs:294:13:294:13 | access to local variable o | D.cs:283:17:283:24 | SSA def(o) | D.cs:294:13:294:13 | access to local variable o | Variable $@ may be null here because of $@ assignment. | D.cs:258:16:258:16 | o | o | D.cs:283:17:283:24 | ... = ... | this | +| D.cs:300:17:300:20 | access to local variable prev | D.cs:296:16:296:26 | SSA def(prev) | D.cs:300:17:300:20 | access to local variable prev | Variable $@ may be null here because of $@ assignment. | D.cs:296:16:296:19 | prev | prev | D.cs:296:16:296:26 | Object prev = ... | this | +| D.cs:313:17:313:17 | access to local variable s | D.cs:304:16:304:23 | SSA def(s) | D.cs:313:17:313:17 | access to local variable s | Variable $@ may be null here because of $@ assignment. | D.cs:304:16:304:16 | s | s | D.cs:304:16:304:23 | String s = ... | this | +| D.cs:324:9:324:9 | access to local variable r | D.cs:316:16:316:23 | SSA def(r) | D.cs:324:9:324:9 | access to local variable r | Variable $@ may be null here because of $@ assignment. | D.cs:316:16:316:16 | r | r | D.cs:316:16:316:23 | Object r = ... | this | +| D.cs:356:13:356:13 | access to local variable a | D.cs:351:15:351:22 | SSA def(a) | D.cs:356:13:356:13 | access to local variable a | Variable $@ may be null here because of $@ assignment. | D.cs:351:15:351:15 | a | a | D.cs:351:15:351:22 | Int32[] a = ... | this | +| D.cs:363:13:363:16 | access to local variable last | D.cs:360:20:360:30 | SSA def(last) | D.cs:363:13:363:16 | access to local variable last | Variable $@ may be null here because of $@ assignment. | D.cs:360:20:360:23 | last | last | D.cs:360:20:360:30 | String last = ... | this | +| D.cs:372:13:372:13 | access to local variable b | D.cs:366:15:366:47 | SSA def(b) | D.cs:372:13:372:13 | access to local variable b | Variable $@ may be null here because of $@ assignment. | D.cs:366:15:366:15 | b | b | D.cs:366:15:366:47 | Int32[] b = ... | this | +| D.cs:395:20:395:20 | access to parameter a | D.cs:388:36:388:36 | SSA param(a) | D.cs:395:20:395:20 | access to parameter a | Variable $@ may be null here as suggested by $@ null check. | D.cs:388:36:388:36 | a | a | D.cs:390:20:390:28 | ... == ... | this | +| D.cs:400:20:400:20 | access to parameter b | D.cs:388:45:388:45 | SSA param(b) | D.cs:400:20:400:20 | access to parameter b | Variable $@ may be null here as suggested by $@ null check. | D.cs:388:45:388:45 | b | b | D.cs:397:20:397:28 | ... == ... | this | +| D.cs:410:13:410:13 | access to parameter y | D.cs:405:45:405:45 | SSA param(y) | D.cs:410:13:410:13 | access to parameter y | Variable $@ may be null here as suggested by $@ null check. | D.cs:405:45:405:45 | y | y | D.cs:407:27:407:35 | ... == ... | this | +| D.cs:410:13:410:13 | access to parameter y | D.cs:405:45:405:45 | SSA param(y) | D.cs:410:13:410:13 | access to parameter y | Variable $@ may be null here as suggested by $@ null check. | D.cs:405:45:405:45 | y | y | D.cs:407:55:407:63 | ... != ... | this | +| D.cs:410:13:410:13 | access to parameter y | D.cs:405:45:405:45 | SSA param(y) | D.cs:410:13:410:13 | access to parameter y | Variable $@ may be null here as suggested by $@ null check. | D.cs:405:45:405:45 | y | y | D.cs:411:13:411:21 | ... != ... | this | +| D.cs:412:13:412:13 | access to parameter x | D.cs:405:35:405:35 | SSA param(x) | D.cs:412:13:412:13 | access to parameter x | Variable $@ may be null here as suggested by $@ null check. | D.cs:405:35:405:35 | x | x | D.cs:407:14:407:22 | ... != ... | this | +| D.cs:412:13:412:13 | access to parameter x | D.cs:405:35:405:35 | SSA param(x) | D.cs:412:13:412:13 | access to parameter x | Variable $@ may be null here as suggested by $@ null check. | D.cs:405:35:405:35 | x | x | D.cs:407:42:407:50 | ... == ... | this | +| D.cs:412:13:412:13 | access to parameter x | D.cs:405:35:405:35 | SSA param(x) | D.cs:412:13:412:13 | access to parameter x | Variable $@ may be null here as suggested by $@ null check. | D.cs:405:35:405:35 | x | x | D.cs:409:13:409:21 | ... != ... | this | +| E.cs:12:38:12:39 | access to local variable a2 | E.cs:9:18:9:26 | SSA def(a2) | E.cs:12:38:12:39 | access to local variable a2 | Variable $@ may be null here because of $@ assignment. | E.cs:9:18:9:19 | a2 | a2 | E.cs:9:18:9:26 | Int64[][] a2 = ... | this | +| E.cs:14:13:14:14 | access to local variable a3 | E.cs:11:16:11:24 | SSA def(a3) | E.cs:14:13:14:14 | access to local variable a3 | Variable $@ may be null here because of $@ assignment. | E.cs:11:16:11:17 | a3 | a3 | E.cs:11:16:11:24 | Int64[] a3 = ... | this | +| E.cs:27:13:27:14 | access to local variable s1 | E.cs:23:13:23:30 | SSA def(s1) | E.cs:27:13:27:14 | access to local variable s1 | Variable $@ may be null here because of $@ assignment. | E.cs:19:13:19:14 | s1 | s1 | E.cs:23:13:23:30 | ... = ... | this | +| E.cs:35:9:35:12 | access to local variable last | E.cs:32:16:32:26 | SSA def(last) | E.cs:35:9:35:12 | access to local variable last | Variable $@ may be null here because of $@ assignment. | E.cs:32:16:32:19 | last | last | E.cs:32:16:32:26 | String last = ... | this | +| E.cs:43:13:43:16 | access to local variable last | E.cs:37:9:37:19 | SSA def(last) | E.cs:43:13:43:16 | access to local variable last | Variable $@ may be null here because of $@ assignment. | E.cs:32:16:32:19 | last | last | E.cs:37:9:37:19 | ... = ... | this | +| E.cs:61:13:61:17 | access to local variable slice | E.cs:51:22:51:33 | SSA def(slice) | E.cs:61:13:61:17 | access to local variable slice | Variable $@ may be null here because of $@ assignment. | E.cs:51:22:51:26 | slice | slice | E.cs:51:22:51:33 | List slice = ... | this | +| E.cs:73:13:73:15 | access to parameter arr | E.cs:66:40:66:42 | SSA param(arr) | E.cs:73:13:73:15 | access to parameter arr | Variable $@ may be null here as suggested by $@ null check. | E.cs:66:40:66:42 | arr | arr | E.cs:70:22:70:32 | ... == ... | this | +| E.cs:112:13:112:16 | access to local variable arr2 | E.cs:107:15:107:25 | SSA def(arr2) | E.cs:112:13:112:16 | access to local variable arr2 | Variable $@ may be null here because of $@ assignment. | E.cs:107:15:107:18 | arr2 | arr2 | E.cs:107:15:107:25 | Int32[] arr2 = ... | this | +| E.cs:125:33:125:35 | access to local variable obj | E.cs:137:25:137:34 | SSA def(obj) | E.cs:125:33:125:35 | access to local variable obj | Variable $@ may be null here because of $@ assignment. | E.cs:119:13:119:15 | obj | obj | E.cs:137:25:137:34 | ... = ... | this | +| E.cs:159:13:159:16 | access to local variable obj2 | E.cs:152:16:152:26 | SSA def(obj2) | E.cs:159:13:159:16 | access to local variable obj2 | Variable $@ may be null here as suggested by $@ null check. | E.cs:152:16:152:19 | obj2 | obj2 | E.cs:153:13:153:24 | ... != ... | this | +| E.cs:167:21:167:21 | access to parameter a | E.cs:162:28:162:28 | SSA param(a) | E.cs:167:21:167:21 | access to parameter a | Variable $@ may be null here as suggested by $@ null check. | E.cs:162:28:162:28 | a | a | E.cs:164:17:164:25 | ... == ... | this | +| E.cs:178:13:178:15 | access to parameter obj | E.cs:173:29:173:31 | SSA param(obj) | E.cs:178:13:178:15 | access to parameter obj | Variable $@ may be null here as suggested by $@ null check. | E.cs:173:29:173:31 | obj | obj | E.cs:175:19:175:29 | ... == ... | this | +| E.cs:178:13:178:15 | access to parameter obj | E.cs:173:29:173:31 | SSA param(obj) | E.cs:178:13:178:15 | access to parameter obj | Variable $@ may be null here as suggested by $@ null check. | E.cs:173:29:173:31 | obj | obj | E.cs:180:13:180:23 | ... == ... | this | +| E.cs:186:13:186:15 | access to parameter obj | E.cs:173:29:173:31 | SSA param(obj) | E.cs:186:13:186:15 | access to parameter obj | Variable $@ may be null here as suggested by $@ null check. | E.cs:173:29:173:31 | obj | obj | E.cs:175:19:175:29 | ... == ... | this | +| E.cs:186:13:186:15 | access to parameter obj | E.cs:173:29:173:31 | SSA param(obj) | E.cs:186:13:186:15 | access to parameter obj | Variable $@ may be null here as suggested by $@ null check. | E.cs:173:29:173:31 | obj | obj | E.cs:180:13:180:23 | ... == ... | this | +| E.cs:192:17:192:17 | access to parameter o | E.cs:190:29:190:29 | SSA param(o) | E.cs:192:17:192:17 | access to parameter o | Variable $@ may be null here as suggested by $@ null check. | E.cs:190:29:190:29 | o | o | E.cs:193:17:193:17 | access to parameter o | this | +| E.cs:201:11:201:11 | access to local variable o | E.cs:198:13:198:29 | [b (line 196): true] SSA def(o) | E.cs:201:11:201:11 | access to local variable o | Variable $@ may be null here because of $@ assignment. | E.cs:198:13:198:13 | o | o | E.cs:198:13:198:29 | String o = ... | this | +| E.cs:203:11:203:11 | access to local variable o | E.cs:198:13:198:29 | [b (line 196): false] SSA def(o) | E.cs:203:11:203:11 | access to local variable o | Variable $@ may be null here because of $@ assignment. | E.cs:198:13:198:13 | o | o | E.cs:198:13:198:29 | String o = ... | this | +| E.cs:218:9:218:9 | access to local variable x | E.cs:217:13:217:20 | [b (line 213): true] SSA def(x) | E.cs:218:9:218:9 | access to local variable x | Variable $@ may be null here because of $@ assignment. | E.cs:215:13:215:13 | x | x | E.cs:217:13:217:20 | ... = ... | this | +| E.cs:230:9:230:9 | access to local variable x | E.cs:227:13:227:20 | [b (line 223): true] SSA def(x) | E.cs:230:9:230:9 | access to local variable x | Variable $@ may be null here because of $@ assignment. | E.cs:225:13:225:13 | x | x | E.cs:227:13:227:20 | ... = ... | this | +| E.cs:235:16:235:16 | access to parameter i | E.cs:233:26:233:26 | SSA param(i) | E.cs:235:16:235:16 | access to parameter i | Variable $@ may be null here because it has a nullable type. | E.cs:233:26:233:26 | i | i | E.cs:233:26:233:26 | i | this | +| E.cs:240:21:240:21 | access to parameter i | E.cs:238:26:238:26 | SSA param(i) | E.cs:240:21:240:21 | access to parameter i | Variable $@ may be null here because it has a nullable type. | E.cs:238:26:238:26 | i | i | E.cs:238:26:238:26 | i | this | +| E.cs:285:9:285:9 | access to local variable o | E.cs:283:13:283:22 | [b (line 279): false] SSA def(o) | E.cs:285:9:285:9 | access to local variable o | Variable $@ may be null here as suggested by $@ null check. | E.cs:283:13:283:13 | o | o | E.cs:284:9:284:9 | access to local variable o | this | +| E.cs:285:9:285:9 | access to local variable o | E.cs:283:13:283:22 | [b (line 279): true] SSA def(o) | E.cs:285:9:285:9 | access to local variable o | Variable $@ may be null here as suggested by $@ null check. | E.cs:283:13:283:13 | o | o | E.cs:284:9:284:9 | access to local variable o | this | +| GuardedString.cs:35:31:35:31 | access to local variable s | GuardedString.cs:7:16:7:32 | SSA def(s) | GuardedString.cs:35:31:35:31 | access to local variable s | Variable $@ may be null here because of $@ assignment. | GuardedString.cs:7:16:7:16 | s | s | GuardedString.cs:7:16:7:32 | String s = ... | this | +| NullMaybeBad.cs:7:27:7:27 | access to parameter o | NullMaybeBad.cs:13:17:13:20 | null | NullMaybeBad.cs:7:27:7:27 | access to parameter o | Variable $@ may be null here because of $@ null argument. | NullMaybeBad.cs:5:25:5:25 | o | o | NullMaybeBad.cs:13:17:13:20 | null | this | +| StringConcatenation.cs:16:17:16:17 | access to local variable s | StringConcatenation.cs:14:16:14:23 | SSA def(s) | StringConcatenation.cs:16:17:16:17 | access to local variable s | Variable $@ may be null here because of $@ assignment. | StringConcatenation.cs:14:16:14:16 | s | s | StringConcatenation.cs:14:16:14:23 | String s = ... | this |