C#: Fix a bug and generalize guards implication logic

This commit is contained in:
Tom Hvitved
2018-12-03 15:33:00 +01:00
parent d25bd598db
commit 4739a6334e
7 changed files with 310 additions and 23 deletions

View File

@@ -956,13 +956,13 @@ module Internal {
*/
private predicate guardImpliesNotEqual(Expr guard, AbstractValue vGuard, PreSsa::Definition def, AbstractValue vDef) {
relevantEq(def, vDef) and
exists(DereferenceableExpr de |
de = def.getARead() |
exists(AssignableRead ar |
ar = def.getARead() |
// For example:
// if (de == null); vGuard = TBooleanValue(false); vDef = TNullValue(true)
// but not
// if (de == "abc"); vGuard = TBooleanValue(false); vDef = TNullValue(false)
guard = getAnEqualityCheckVal(de, vGuard.getDualValue(), vDef) and
guard = getAnEqualityCheckVal(ar, vGuard.getDualValue(), vDef) and
vDef.isSingleton()
or
// For example:
@@ -970,13 +970,13 @@ module Internal {
// or
// if (de == null); vGuard = TBooleanValue(true); vDef = TNullValue(false)
exists(NullValue nv |
guard = de.getANullCheck(vGuard, any(boolean b | nv = TNullValue(b))) |
guard = ar.(DereferenceableExpr).getANullCheck(vGuard, any(boolean b | nv = TNullValue(b))) |
vDef = nv.getDualValue()
)
or
// For example:
// if (de == null); vGuard = TBooleanValue(true); vDef = TNullValue(false)
guard = getAnEqualityCheckVal(de, vGuard, vDef.getDualValue())
// if (de == false); vGuard = TBooleanValue(true); vDef = TBooleanValue(true)
guard = getAnEqualityCheckVal(ar, vGuard, vDef.getDualValue())
)
}
@@ -1040,7 +1040,7 @@ module Internal {
* Holds if `e` has abstract value `v` and may be assigned to `def` without going
* through back edges, and all other possible ultimate definitions of `def` do not
* have abstract value `v`. The trivial case where `def` is an explicit update with
* source `e is excluded.
* source `e` is excluded.
*/
private predicate uniqueValue(PreSsa::Definition def, Expr e, AbstractValue v) {
possibleValue(def, false, e, v) and
@@ -1178,30 +1178,41 @@ module Internal {
polarity = false
)
or
exists(ConditionalExpr cond, boolean branch, BoolLiteral boolLit, boolean b |
b = boolLit.getBoolValue() and
exists(ConditionalExpr cond, boolean branch, Expr e, AbstractValue v |
e = v.getAnExpr() and
(
cond.getThen() = boolLit and branch = true
cond.getThen() = e and branch = true
or
cond.getElse() = boolLit and branch = false
cond.getElse() = e and branch = false
)
|
g1 = cond and
v1 = TBooleanValue(b.booleanNot()) and
v1 = v.getDualValue() and
(
// g1 === g2 ? e : ...;
g2 = cond.getCondition() and
v2 = TBooleanValue(branch.booleanNot())
or
// g1 === ... ? g2 : e
g2 = cond.getThen() and
branch = false and
v2 = v1
or
// g1 === g2 ? ... : e
g2 = cond.getElse() and
branch = true and
v2 = v1
)
)
or
v1 = g1.getAValue() and
v1 = any(MatchValue mv |
mv.isMatch() and
g2 = g1 and
v2.getAnExpr() = mv.getCaseStmt().(ConstCase).getExpr() and
v1 != v2
)
or
exists(boolean isNull |
g1 = g2.(DereferenceableExpr).getANullCheck(v1, isNull) |
v2 = any(NullValue nv | if nv.isNull() then isNull = true else isNull = false) and
@@ -1238,15 +1249,16 @@ module Internal {
)
or
exists(PreSsa::Definition def, AbstractValue v |
// If `def = g2 ? v : ...` or `def = g2 ? ... : v` then a guard `g1`
// proving `def != v` ensures that `g2` evaluates to `b2`.
// If for example `def = g2 ? v : ...`, then a guard `g1` proving `def != v`
// ensures that `g2` evaluates to `false`.
conditionalAssignVal(g2, v2.getDualValue(), def, v) and
guardImpliesNotEqual(g1, v1, def, v)
)
or
exists(PreSsa::Definition def, Expr e, AbstractValue v |
// If `def = g2 ? v : ...` and all other assignments to `def` are different from
// `v` then a guard proving `def == v` ensures that `g2` evaluates to `v2`.
// If for example `def = g2 ? v : ...` and all other assignments to `def` are
// different from `v`, then a guard proving `def == v` ensures that `g2`
// evaluates to `true`.
uniqueValue(def, e, v) and
guardImpliesEqual(g1, v1, def, v) and
g2.preControlsDirect(any(PreBasicBlocks::PreBasicBlock bb | e = bb.getAnElement()), v2) and

View File

@@ -190,7 +190,8 @@ private predicate defMaybeNull(Ssa::Definition def, string msg, Element reason)
/**
* Holds if `def1` being `null` in basic block `bb1` implies that `def2` might
* be null in basic block `bb2`. The SSA definitions share the same source variable.
* be `null` in basic block `bb2`. The SSA definitions share the same source
* variable.
*/
private predicate defNullImpliesStep(Ssa::Definition def1, BasicBlock bb1, Ssa::Definition def2, BasicBlock bb2) {
exists(Ssa::SourceVariable v |
@@ -374,10 +375,6 @@ class Dereference extends G::DereferenceableExpr {
defReaches(v.getAnSsaDefinition(), this, true)
}
/**
* Holds if assignable access `aa` is the first dereference of an assignable
* in a block, where it is suspected of being `null`.
*/
pragma[noinline]
private predicate nullDerefCandidate(Ssa::Definition origin) {
exists(Ssa::Definition ssa, BasicBlock bb |

View File

@@ -209,4 +209,57 @@ public class Guards
}
}
}
void M18(bool b1)
{
var b2 = true;
if (b1)
b2 = false;
switch (b2)
{
case true :
return;
return;
}
}
void M19(bool b1)
{
var b2 = false;
if (b1)
b2 = true;
switch (b2)
{
case true :
return;
return;
}
}
void M20(bool b)
{
var i = 0;
if (b)
i = 1;
switch (i)
{
case 1 :
return;
return;
}
}
enum E { A, B, C }
void M21(bool b)
{
var e = E.A;
if (b)
e = E.B;
switch (e)
{
case E.B :
return;
return;
}
}
}

View File

@@ -1,5 +1,9 @@
| Assert.cs:9:16:9:32 | String s = ... | non-null | Assert.cs:9:16:9:16 | access to local variable s | non-null |
| Assert.cs:9:16:9:32 | String s = ... | null | Assert.cs:9:16:9:16 | access to local variable s | null |
| Assert.cs:9:20:9:32 | ... ? ... : ... | non-null | Assert.cs:9:20:9:20 | access to parameter b | false |
| Assert.cs:9:20:9:32 | ... ? ... : ... | non-null | Assert.cs:9:31:9:32 | "" | non-null |
| Assert.cs:9:20:9:32 | ... ? ... : ... | null | Assert.cs:9:20:9:20 | access to parameter b | true |
| Assert.cs:9:20:9:32 | ... ? ... : ... | null | Assert.cs:9:24:9:27 | null | null |
| Assert.cs:10:22:10:22 | access to local variable s | non-null | Assert.cs:9:20:9:32 | ... ? ... : ... | non-null |
| Assert.cs:10:22:10:22 | access to local variable s | null | Assert.cs:9:20:9:32 | ... ? ... : ... | null |
| Assert.cs:10:22:10:30 | ... != ... | false | Assert.cs:9:20:9:20 | access to parameter b | true |
@@ -10,18 +14,30 @@
| Assert.cs:11:27:11:27 | access to local variable s | null | Assert.cs:9:20:9:32 | ... ? ... : ... | null |
| Assert.cs:16:16:16:32 | String s = ... | non-null | Assert.cs:16:16:16:16 | access to local variable s | non-null |
| Assert.cs:16:16:16:32 | String s = ... | null | Assert.cs:16:16:16:16 | access to local variable s | null |
| Assert.cs:16:20:16:32 | ... ? ... : ... | non-null | Assert.cs:16:20:16:20 | access to parameter b | false |
| Assert.cs:16:20:16:32 | ... ? ... : ... | non-null | Assert.cs:16:31:16:32 | "" | non-null |
| Assert.cs:16:20:16:32 | ... ? ... : ... | null | Assert.cs:16:20:16:20 | access to parameter b | true |
| Assert.cs:16:20:16:32 | ... ? ... : ... | null | Assert.cs:16:24:16:27 | null | null |
| Assert.cs:17:23:17:23 | access to local variable s | non-null | Assert.cs:16:20:16:32 | ... ? ... : ... | non-null |
| Assert.cs:17:23:17:23 | access to local variable s | null | Assert.cs:16:20:16:32 | ... ? ... : ... | null |
| Assert.cs:18:27:18:27 | access to local variable s | non-null | Assert.cs:16:20:16:32 | ... ? ... : ... | non-null |
| Assert.cs:18:27:18:27 | access to local variable s | null | Assert.cs:16:20:16:32 | ... ? ... : ... | null |
| Assert.cs:23:16:23:32 | String s = ... | non-null | Assert.cs:23:16:23:16 | access to local variable s | non-null |
| Assert.cs:23:16:23:32 | String s = ... | null | Assert.cs:23:16:23:16 | access to local variable s | null |
| Assert.cs:23:20:23:32 | ... ? ... : ... | non-null | Assert.cs:23:20:23:20 | access to parameter b | false |
| Assert.cs:23:20:23:32 | ... ? ... : ... | non-null | Assert.cs:23:31:23:32 | "" | non-null |
| Assert.cs:23:20:23:32 | ... ? ... : ... | null | Assert.cs:23:20:23:20 | access to parameter b | true |
| Assert.cs:23:20:23:32 | ... ? ... : ... | null | Assert.cs:23:24:23:27 | null | null |
| Assert.cs:24:26:24:26 | access to local variable s | non-null | Assert.cs:23:20:23:32 | ... ? ... : ... | non-null |
| Assert.cs:24:26:24:26 | access to local variable s | null | Assert.cs:23:20:23:32 | ... ? ... : ... | null |
| Assert.cs:25:27:25:27 | access to local variable s | non-null | Assert.cs:23:20:23:32 | ... ? ... : ... | non-null |
| Assert.cs:25:27:25:27 | access to local variable s | null | Assert.cs:23:20:23:32 | ... ? ... : ... | null |
| Assert.cs:30:16:30:32 | String s = ... | non-null | Assert.cs:30:16:30:16 | access to local variable s | non-null |
| Assert.cs:30:16:30:32 | String s = ... | null | Assert.cs:30:16:30:16 | access to local variable s | null |
| Assert.cs:30:20:30:32 | ... ? ... : ... | non-null | Assert.cs:30:20:30:20 | access to parameter b | false |
| Assert.cs:30:20:30:32 | ... ? ... : ... | non-null | Assert.cs:30:31:30:32 | "" | non-null |
| Assert.cs:30:20:30:32 | ... ? ... : ... | null | Assert.cs:30:20:30:20 | access to parameter b | true |
| Assert.cs:30:20:30:32 | ... ? ... : ... | null | Assert.cs:30:24:30:27 | null | null |
| Assert.cs:31:23:31:23 | access to local variable s | non-null | Assert.cs:30:20:30:32 | ... ? ... : ... | non-null |
| Assert.cs:31:23:31:23 | access to local variable s | null | Assert.cs:30:20:30:32 | ... ? ... : ... | null |
| Assert.cs:31:23:31:31 | ... == ... | false | Assert.cs:30:20:30:20 | access to parameter b | false |
@@ -32,6 +48,10 @@
| Assert.cs:32:27:32:27 | access to local variable s | null | Assert.cs:30:20:30:32 | ... ? ... : ... | null |
| Assert.cs:37:16:37:32 | String s = ... | non-null | Assert.cs:37:16:37:16 | access to local variable s | non-null |
| Assert.cs:37:16:37:32 | String s = ... | null | Assert.cs:37:16:37:16 | access to local variable s | null |
| Assert.cs:37:20:37:32 | ... ? ... : ... | non-null | Assert.cs:37:20:37:20 | access to parameter b | false |
| Assert.cs:37:20:37:32 | ... ? ... : ... | non-null | Assert.cs:37:31:37:32 | "" | non-null |
| Assert.cs:37:20:37:32 | ... ? ... : ... | null | Assert.cs:37:20:37:20 | access to parameter b | true |
| Assert.cs:37:20:37:32 | ... ? ... : ... | null | Assert.cs:37:24:37:27 | null | null |
| Assert.cs:38:23:38:23 | access to local variable s | non-null | Assert.cs:37:20:37:32 | ... ? ... : ... | non-null |
| Assert.cs:38:23:38:23 | access to local variable s | null | Assert.cs:37:20:37:32 | ... ? ... : ... | null |
| Assert.cs:38:23:38:31 | ... != ... | false | Assert.cs:37:20:37:20 | access to parameter b | true |
@@ -42,6 +62,10 @@
| Assert.cs:39:27:39:27 | access to local variable s | null | Assert.cs:37:20:37:32 | ... ? ... : ... | null |
| Assert.cs:44:16:44:32 | String s = ... | non-null | Assert.cs:44:16:44:16 | access to local variable s | non-null |
| Assert.cs:44:16:44:32 | String s = ... | null | Assert.cs:44:16:44:16 | access to local variable s | null |
| Assert.cs:44:20:44:32 | ... ? ... : ... | non-null | Assert.cs:44:20:44:20 | access to parameter b | false |
| Assert.cs:44:20:44:32 | ... ? ... : ... | non-null | Assert.cs:44:31:44:32 | "" | non-null |
| Assert.cs:44:20:44:32 | ... ? ... : ... | null | Assert.cs:44:20:44:20 | access to parameter b | true |
| Assert.cs:44:20:44:32 | ... ? ... : ... | null | Assert.cs:44:24:44:27 | null | null |
| Assert.cs:45:24:45:24 | access to local variable s | non-null | Assert.cs:44:20:44:32 | ... ? ... : ... | non-null |
| Assert.cs:45:24:45:24 | access to local variable s | null | Assert.cs:44:20:44:32 | ... ? ... : ... | null |
| Assert.cs:45:24:45:32 | ... != ... | false | Assert.cs:44:20:44:20 | access to parameter b | true |
@@ -52,6 +76,10 @@
| Assert.cs:46:27:46:27 | access to local variable s | null | Assert.cs:44:20:44:32 | ... ? ... : ... | null |
| Assert.cs:51:16:51:32 | String s = ... | non-null | Assert.cs:51:16:51:16 | access to local variable s | non-null |
| Assert.cs:51:16:51:32 | String s = ... | null | Assert.cs:51:16:51:16 | access to local variable s | null |
| Assert.cs:51:20:51:32 | ... ? ... : ... | non-null | Assert.cs:51:20:51:20 | access to parameter b | false |
| Assert.cs:51:20:51:32 | ... ? ... : ... | non-null | Assert.cs:51:31:51:32 | "" | non-null |
| Assert.cs:51:20:51:32 | ... ? ... : ... | null | Assert.cs:51:20:51:20 | access to parameter b | true |
| Assert.cs:51:20:51:32 | ... ? ... : ... | null | Assert.cs:51:24:51:27 | null | null |
| Assert.cs:52:24:52:24 | access to local variable s | non-null | Assert.cs:51:20:51:32 | ... ? ... : ... | non-null |
| Assert.cs:52:24:52:24 | access to local variable s | null | Assert.cs:51:20:51:32 | ... ? ... : ... | null |
| Assert.cs:52:24:52:32 | ... == ... | false | Assert.cs:51:20:51:20 | access to parameter b | false |
@@ -62,6 +90,10 @@
| Assert.cs:53:27:53:27 | access to local variable s | null | Assert.cs:51:20:51:32 | ... ? ... : ... | null |
| Assert.cs:58:16:58:32 | String s = ... | non-null | Assert.cs:58:16:58:16 | access to local variable s | non-null |
| Assert.cs:58:16:58:32 | String s = ... | null | Assert.cs:58:16:58:16 | access to local variable s | null |
| Assert.cs:58:20:58:32 | ... ? ... : ... | non-null | Assert.cs:58:20:58:20 | access to parameter b | false |
| Assert.cs:58:20:58:32 | ... ? ... : ... | non-null | Assert.cs:58:31:58:32 | "" | non-null |
| Assert.cs:58:20:58:32 | ... ? ... : ... | null | Assert.cs:58:20:58:20 | access to parameter b | true |
| Assert.cs:58:20:58:32 | ... ? ... : ... | null | Assert.cs:58:24:58:27 | null | null |
| Assert.cs:59:23:59:23 | access to local variable s | non-null | Assert.cs:58:20:58:32 | ... ? ... : ... | non-null |
| Assert.cs:59:23:59:23 | access to local variable s | null | Assert.cs:58:20:58:32 | ... ? ... : ... | null |
| Assert.cs:59:23:59:31 | ... != ... | false | Assert.cs:58:20:58:20 | access to parameter b | true |
@@ -74,6 +106,10 @@
| Assert.cs:60:27:60:27 | access to local variable s | null | Assert.cs:58:20:58:32 | ... ? ... : ... | null |
| Assert.cs:65:16:65:32 | String s = ... | non-null | Assert.cs:65:16:65:16 | access to local variable s | non-null |
| Assert.cs:65:16:65:32 | String s = ... | null | Assert.cs:65:16:65:16 | access to local variable s | null |
| Assert.cs:65:20:65:32 | ... ? ... : ... | non-null | Assert.cs:65:20:65:20 | access to parameter b | false |
| Assert.cs:65:20:65:32 | ... ? ... : ... | non-null | Assert.cs:65:31:65:32 | "" | non-null |
| Assert.cs:65:20:65:32 | ... ? ... : ... | null | Assert.cs:65:20:65:20 | access to parameter b | true |
| Assert.cs:65:20:65:32 | ... ? ... : ... | null | Assert.cs:65:24:65:27 | null | null |
| Assert.cs:66:24:66:24 | access to local variable s | non-null | Assert.cs:65:20:65:32 | ... ? ... : ... | non-null |
| Assert.cs:66:24:66:24 | access to local variable s | null | Assert.cs:65:20:65:32 | ... ? ... : ... | null |
| Assert.cs:66:24:66:32 | ... == ... | false | Assert.cs:65:20:65:20 | access to parameter b | false |
@@ -86,6 +122,10 @@
| Assert.cs:67:27:67:27 | access to local variable s | null | Assert.cs:65:20:65:32 | ... ? ... : ... | null |
| Assert.cs:72:16:72:32 | String s = ... | non-null | Assert.cs:72:16:72:16 | access to local variable s | non-null |
| Assert.cs:72:16:72:32 | String s = ... | null | Assert.cs:72:16:72:16 | access to local variable s | null |
| Assert.cs:72:20:72:32 | ... ? ... : ... | non-null | Assert.cs:72:20:72:20 | access to parameter b | false |
| Assert.cs:72:20:72:32 | ... ? ... : ... | non-null | Assert.cs:72:31:72:32 | "" | non-null |
| Assert.cs:72:20:72:32 | ... ? ... : ... | null | Assert.cs:72:20:72:20 | access to parameter b | true |
| Assert.cs:72:20:72:32 | ... ? ... : ... | null | Assert.cs:72:24:72:27 | null | null |
| Assert.cs:73:23:73:23 | access to local variable s | non-null | Assert.cs:72:20:72:32 | ... ? ... : ... | non-null |
| Assert.cs:73:23:73:23 | access to local variable s | null | Assert.cs:72:20:72:32 | ... ? ... : ... | null |
| Assert.cs:73:23:73:31 | ... == ... | false | Assert.cs:72:20:72:20 | access to parameter b | false |
@@ -98,6 +138,10 @@
| Assert.cs:74:27:74:27 | access to local variable s | null | Assert.cs:72:20:72:32 | ... ? ... : ... | null |
| Assert.cs:79:16:79:32 | String s = ... | non-null | Assert.cs:79:16:79:16 | access to local variable s | non-null |
| Assert.cs:79:16:79:32 | String s = ... | null | Assert.cs:79:16:79:16 | access to local variable s | null |
| Assert.cs:79:20:79:32 | ... ? ... : ... | non-null | Assert.cs:79:20:79:20 | access to parameter b | false |
| Assert.cs:79:20:79:32 | ... ? ... : ... | non-null | Assert.cs:79:31:79:32 | "" | non-null |
| Assert.cs:79:20:79:32 | ... ? ... : ... | null | Assert.cs:79:20:79:20 | access to parameter b | true |
| Assert.cs:79:20:79:32 | ... ? ... : ... | null | Assert.cs:79:24:79:27 | null | null |
| Assert.cs:80:24:80:24 | access to local variable s | non-null | Assert.cs:79:20:79:32 | ... ? ... : ... | non-null |
| Assert.cs:80:24:80:24 | access to local variable s | null | Assert.cs:79:20:79:32 | ... ? ... : ... | null |
| Assert.cs:80:24:80:32 | ... != ... | false | Assert.cs:79:20:79:20 | access to parameter b | true |
@@ -274,6 +318,25 @@
| Guards.cs:197:13:197:29 | !... | true | Guards.cs:197:14:197:29 | call to method NullTestWrong | false |
| Guards.cs:203:13:203:21 | ... != ... | false | Guards.cs:203:13:203:13 | access to parameter o | null |
| Guards.cs:203:13:203:21 | ... != ... | true | Guards.cs:203:13:203:13 | access to parameter o | non-null |
| Guards.cs:215:13:215:21 | Boolean b2 = ... | false | Guards.cs:215:13:215:14 | access to local variable b2 | false |
| Guards.cs:215:13:215:21 | Boolean b2 = ... | true | Guards.cs:215:13:215:14 | access to local variable b2 | true |
| Guards.cs:217:13:217:22 | ... = ... | false | Guards.cs:217:13:217:14 | access to local variable b2 | false |
| Guards.cs:217:13:217:22 | ... = ... | true | Guards.cs:217:13:217:14 | access to local variable b2 | true |
| Guards.cs:218:17:218:18 | access to local variable b2 | match case ...: | Guards.cs:216:13:216:14 | access to parameter b1 | false |
| Guards.cs:218:17:218:18 | access to local variable b2 | match case ...: | Guards.cs:218:17:218:18 | access to local variable b2 | true |
| Guards.cs:228:13:228:22 | Boolean b2 = ... | false | Guards.cs:228:13:228:14 | access to local variable b2 | false |
| Guards.cs:228:13:228:22 | Boolean b2 = ... | true | Guards.cs:228:13:228:14 | access to local variable b2 | true |
| Guards.cs:230:13:230:21 | ... = ... | false | Guards.cs:230:13:230:14 | access to local variable b2 | false |
| Guards.cs:230:13:230:21 | ... = ... | true | Guards.cs:230:13:230:14 | access to local variable b2 | true |
| Guards.cs:231:17:231:18 | access to local variable b2 | match case ...: | Guards.cs:229:13:229:14 | access to parameter b1 | true |
| Guards.cs:231:17:231:18 | access to local variable b2 | match case ...: | Guards.cs:231:17:231:18 | access to local variable b2 | true |
| Guards.cs:231:17:231:18 | access to local variable b2 | non-match case ...: | Guards.cs:229:13:229:14 | access to parameter b1 | false |
| Guards.cs:244:17:244:17 | access to local variable i | match case ...: | Guards.cs:242:13:242:13 | access to parameter b | true |
| Guards.cs:244:17:244:17 | access to local variable i | match case ...: | Guards.cs:244:17:244:17 | access to local variable i | 1 |
| Guards.cs:244:17:244:17 | access to local variable i | non-match case ...: | Guards.cs:242:13:242:13 | access to parameter b | false |
| Guards.cs:258:17:258:17 | access to local variable e | match case ...: | Guards.cs:256:13:256:13 | access to parameter b | true |
| Guards.cs:258:17:258:17 | access to local variable e | match case ...: | Guards.cs:258:17:258:17 | access to local variable e | 1 |
| Guards.cs:258:17:258:17 | access to local variable e | non-match case ...: | Guards.cs:256:13:256:13 | access to parameter b | false |
| Splitting.cs:12:17:12:25 | ... != ... | false | Splitting.cs:12:17:12:17 | access to parameter o | null |
| Splitting.cs:12:17:12:25 | ... != ... | true | Splitting.cs:12:17:12:17 | access to parameter o | non-null |
| Splitting.cs:22:17:22:25 | ... != ... | false | Splitting.cs:22:17:22:17 | access to parameter o | null |

View File

@@ -77,7 +77,7 @@ public class D
if (track == 2)
o8.ToString(); // GOOD
if (track != 42)
o8.ToString(); // GOOD (false positive)
o8.ToString(); // GOOD
if (track < 42)
o8.ToString(); // GOOD (false positive)
if (track <= 41)

View File

@@ -78,6 +78,10 @@
| A.cs:78:9:78:16 | ... = ... | null | A.cs:78:15:78:16 | (...) ... | null |
| Assert.cs:9:16:9:32 | String s = ... | non-null | Assert.cs:9:16:9:16 | access to local variable s | non-null |
| Assert.cs:9:16:9:32 | String s = ... | null | Assert.cs:9:16:9:16 | access to local variable s | null |
| Assert.cs:9:20:9:32 | ... ? ... : ... | non-null | Assert.cs:9:20:9:20 | access to parameter b | false |
| Assert.cs:9:20:9:32 | ... ? ... : ... | non-null | Assert.cs:9:31:9:32 | "" | non-null |
| Assert.cs:9:20:9:32 | ... ? ... : ... | null | Assert.cs:9:20:9:20 | access to parameter b | true |
| Assert.cs:9:20:9:32 | ... ? ... : ... | null | Assert.cs:9:24:9:27 | null | null |
| Assert.cs:10:22:10:22 | access to local variable s | non-null | Assert.cs:9:20:9:32 | ... ? ... : ... | non-null |
| Assert.cs:10:22:10:22 | access to local variable s | null | Assert.cs:9:20:9:32 | ... ? ... : ... | null |
| Assert.cs:10:22:10:30 | ... != ... | false | Assert.cs:9:20:9:20 | access to parameter b | true |
@@ -90,6 +94,10 @@
| Assert.cs:13:9:13:25 | ... = ... | non-null | Assert.cs:13:13:13:25 | ... ? ... : ... | non-null |
| Assert.cs:13:9:13:25 | ... = ... | null | Assert.cs:13:9:13:9 | access to local variable s | null |
| Assert.cs:13:9:13:25 | ... = ... | null | Assert.cs:13:13:13:25 | ... ? ... : ... | null |
| Assert.cs:13:13:13:25 | ... ? ... : ... | non-null | Assert.cs:13:13:13:13 | access to parameter b | false |
| Assert.cs:13:13:13:25 | ... ? ... : ... | non-null | Assert.cs:13:24:13:25 | "" | non-null |
| Assert.cs:13:13:13:25 | ... ? ... : ... | null | Assert.cs:13:13:13:13 | access to parameter b | true |
| Assert.cs:13:13:13:25 | ... ? ... : ... | null | Assert.cs:13:17:13:20 | null | null |
| Assert.cs:14:23:14:23 | access to local variable s | non-null | Assert.cs:13:13:13:25 | ... ? ... : ... | non-null |
| Assert.cs:14:23:14:23 | access to local variable s | null | Assert.cs:13:13:13:25 | ... ? ... : ... | null |
| Assert.cs:15:27:15:27 | access to local variable s | non-null | Assert.cs:13:13:13:25 | ... ? ... : ... | non-null |
@@ -98,6 +106,10 @@
| Assert.cs:17:9:17:25 | ... = ... | non-null | Assert.cs:17:13:17:25 | ... ? ... : ... | non-null |
| Assert.cs:17:9:17:25 | ... = ... | null | Assert.cs:17:9:17:9 | access to local variable s | null |
| Assert.cs:17:9:17:25 | ... = ... | null | Assert.cs:17:13:17:25 | ... ? ... : ... | null |
| Assert.cs:17:13:17:25 | ... ? ... : ... | non-null | Assert.cs:17:13:17:13 | access to parameter b | false |
| Assert.cs:17:13:17:25 | ... ? ... : ... | non-null | Assert.cs:17:24:17:25 | "" | non-null |
| Assert.cs:17:13:17:25 | ... ? ... : ... | null | Assert.cs:17:13:17:13 | access to parameter b | true |
| Assert.cs:17:13:17:25 | ... ? ... : ... | null | Assert.cs:17:17:17:20 | null | null |
| Assert.cs:18:26:18:26 | access to local variable s | non-null | Assert.cs:17:13:17:25 | ... ? ... : ... | non-null |
| Assert.cs:18:26:18:26 | access to local variable s | null | Assert.cs:17:13:17:25 | ... ? ... : ... | null |
| Assert.cs:19:27:19:27 | access to local variable s | non-null | Assert.cs:17:13:17:25 | ... ? ... : ... | non-null |
@@ -106,6 +118,10 @@
| Assert.cs:21:9:21:25 | ... = ... | non-null | Assert.cs:21:13:21:25 | ... ? ... : ... | non-null |
| Assert.cs:21:9:21:25 | ... = ... | null | Assert.cs:21:9:21:9 | access to local variable s | null |
| Assert.cs:21:9:21:25 | ... = ... | null | Assert.cs:21:13:21:25 | ... ? ... : ... | null |
| Assert.cs:21:13:21:25 | ... ? ... : ... | non-null | Assert.cs:21:13:21:13 | access to parameter b | false |
| Assert.cs:21:13:21:25 | ... ? ... : ... | non-null | Assert.cs:21:24:21:25 | "" | non-null |
| Assert.cs:21:13:21:25 | ... ? ... : ... | null | Assert.cs:21:13:21:13 | access to parameter b | true |
| Assert.cs:21:13:21:25 | ... ? ... : ... | null | Assert.cs:21:17:21:20 | null | null |
| Assert.cs:22:23:22:23 | access to local variable s | non-null | Assert.cs:21:13:21:25 | ... ? ... : ... | non-null |
| Assert.cs:22:23:22:23 | access to local variable s | null | Assert.cs:21:13:21:25 | ... ? ... : ... | null |
| Assert.cs:22:23:22:31 | ... == ... | false | Assert.cs:21:13:21:13 | access to parameter b | false |
@@ -118,6 +134,10 @@
| Assert.cs:25:9:25:25 | ... = ... | non-null | Assert.cs:25:13:25:25 | ... ? ... : ... | non-null |
| Assert.cs:25:9:25:25 | ... = ... | null | Assert.cs:25:9:25:9 | access to local variable s | null |
| Assert.cs:25:9:25:25 | ... = ... | null | Assert.cs:25:13:25:25 | ... ? ... : ... | null |
| Assert.cs:25:13:25:25 | ... ? ... : ... | non-null | Assert.cs:25:13:25:13 | access to parameter b | false |
| Assert.cs:25:13:25:25 | ... ? ... : ... | non-null | Assert.cs:25:24:25:25 | "" | non-null |
| Assert.cs:25:13:25:25 | ... ? ... : ... | null | Assert.cs:25:13:25:13 | access to parameter b | true |
| Assert.cs:25:13:25:25 | ... ? ... : ... | null | Assert.cs:25:17:25:20 | null | null |
| Assert.cs:26:23:26:23 | access to local variable s | non-null | Assert.cs:25:13:25:25 | ... ? ... : ... | non-null |
| Assert.cs:26:23:26:23 | access to local variable s | null | Assert.cs:25:13:25:25 | ... ? ... : ... | null |
| Assert.cs:26:23:26:31 | ... != ... | false | Assert.cs:25:13:25:13 | access to parameter b | true |
@@ -130,6 +150,10 @@
| Assert.cs:29:9:29:25 | ... = ... | non-null | Assert.cs:29:13:29:25 | ... ? ... : ... | non-null |
| Assert.cs:29:9:29:25 | ... = ... | null | Assert.cs:29:9:29:9 | access to local variable s | null |
| Assert.cs:29:9:29:25 | ... = ... | null | Assert.cs:29:13:29:25 | ... ? ... : ... | null |
| Assert.cs:29:13:29:25 | ... ? ... : ... | non-null | Assert.cs:29:13:29:13 | access to parameter b | false |
| Assert.cs:29:13:29:25 | ... ? ... : ... | non-null | Assert.cs:29:24:29:25 | "" | non-null |
| Assert.cs:29:13:29:25 | ... ? ... : ... | null | Assert.cs:29:13:29:13 | access to parameter b | true |
| Assert.cs:29:13:29:25 | ... ? ... : ... | null | Assert.cs:29:17:29:20 | null | null |
| Assert.cs:30:24:30:24 | access to local variable s | non-null | Assert.cs:29:13:29:25 | ... ? ... : ... | non-null |
| Assert.cs:30:24:30:24 | access to local variable s | null | Assert.cs:29:13:29:25 | ... ? ... : ... | null |
| Assert.cs:30:24:30:32 | ... != ... | false | Assert.cs:29:13:29:13 | access to parameter b | true |
@@ -142,6 +166,10 @@
| Assert.cs:33:9:33:25 | ... = ... | non-null | Assert.cs:33:13:33:25 | ... ? ... : ... | non-null |
| Assert.cs:33:9:33:25 | ... = ... | null | Assert.cs:33:9:33:9 | access to local variable s | null |
| Assert.cs:33:9:33:25 | ... = ... | null | Assert.cs:33:13:33:25 | ... ? ... : ... | null |
| Assert.cs:33:13:33:25 | ... ? ... : ... | non-null | Assert.cs:33:13:33:13 | access to parameter b | false |
| Assert.cs:33:13:33:25 | ... ? ... : ... | non-null | Assert.cs:33:24:33:25 | "" | non-null |
| Assert.cs:33:13:33:25 | ... ? ... : ... | null | Assert.cs:33:13:33:13 | access to parameter b | true |
| Assert.cs:33:13:33:25 | ... ? ... : ... | null | Assert.cs:33:17:33:20 | null | null |
| Assert.cs:34:24:34:24 | access to local variable s | non-null | Assert.cs:33:13:33:25 | ... ? ... : ... | non-null |
| Assert.cs:34:24:34:24 | access to local variable s | null | Assert.cs:33:13:33:25 | ... ? ... : ... | null |
| Assert.cs:34:24:34:32 | ... == ... | false | Assert.cs:33:13:33:13 | access to parameter b | false |
@@ -154,6 +182,10 @@
| Assert.cs:37:9:37:25 | ... = ... | non-null | Assert.cs:37:13:37:25 | ... ? ... : ... | non-null |
| Assert.cs:37:9:37:25 | ... = ... | null | Assert.cs:37:9:37:9 | access to local variable s | null |
| Assert.cs:37:9:37:25 | ... = ... | null | Assert.cs:37:13:37:25 | ... ? ... : ... | null |
| Assert.cs:37:13:37:25 | ... ? ... : ... | non-null | Assert.cs:37:13:37:13 | access to parameter b | false |
| Assert.cs:37:13:37:25 | ... ? ... : ... | non-null | Assert.cs:37:24:37:25 | "" | non-null |
| Assert.cs:37:13:37:25 | ... ? ... : ... | null | Assert.cs:37:13:37:13 | access to parameter b | true |
| Assert.cs:37:13:37:25 | ... ? ... : ... | null | Assert.cs:37:17:37:20 | null | null |
| Assert.cs:38:23:38:23 | access to local variable s | non-null | Assert.cs:37:13:37:25 | ... ? ... : ... | non-null |
| Assert.cs:38:23:38:23 | access to local variable s | null | Assert.cs:37:13:37:25 | ... ? ... : ... | null |
| Assert.cs:38:23:38:31 | ... != ... | false | Assert.cs:37:13:37:13 | access to parameter b | true |
@@ -168,6 +200,10 @@
| Assert.cs:41:9:41:25 | ... = ... | non-null | Assert.cs:41:13:41:25 | ... ? ... : ... | non-null |
| Assert.cs:41:9:41:25 | ... = ... | null | Assert.cs:41:9:41:9 | access to local variable s | null |
| Assert.cs:41:9:41:25 | ... = ... | null | Assert.cs:41:13:41:25 | ... ? ... : ... | null |
| Assert.cs:41:13:41:25 | ... ? ... : ... | non-null | Assert.cs:41:13:41:13 | access to parameter b | false |
| Assert.cs:41:13:41:25 | ... ? ... : ... | non-null | Assert.cs:41:24:41:25 | "" | non-null |
| Assert.cs:41:13:41:25 | ... ? ... : ... | null | Assert.cs:41:13:41:13 | access to parameter b | true |
| Assert.cs:41:13:41:25 | ... ? ... : ... | null | Assert.cs:41:17:41:20 | null | null |
| Assert.cs:42:24:42:24 | access to local variable s | non-null | Assert.cs:41:13:41:25 | ... ? ... : ... | non-null |
| Assert.cs:42:24:42:24 | access to local variable s | null | Assert.cs:41:13:41:25 | ... ? ... : ... | null |
| Assert.cs:42:24:42:32 | ... == ... | false | Assert.cs:41:13:41:13 | access to parameter b | false |
@@ -182,6 +218,10 @@
| Assert.cs:45:9:45:25 | ... = ... | non-null | Assert.cs:45:13:45:25 | ... ? ... : ... | non-null |
| Assert.cs:45:9:45:25 | ... = ... | null | Assert.cs:45:9:45:9 | access to local variable s | null |
| Assert.cs:45:9:45:25 | ... = ... | null | Assert.cs:45:13:45:25 | ... ? ... : ... | null |
| Assert.cs:45:13:45:25 | ... ? ... : ... | non-null | Assert.cs:45:13:45:13 | access to parameter b | false |
| Assert.cs:45:13:45:25 | ... ? ... : ... | non-null | Assert.cs:45:24:45:25 | "" | non-null |
| Assert.cs:45:13:45:25 | ... ? ... : ... | null | Assert.cs:45:13:45:13 | access to parameter b | true |
| Assert.cs:45:13:45:25 | ... ? ... : ... | null | Assert.cs:45:17:45:20 | null | null |
| Assert.cs:46:23:46:23 | access to local variable s | non-null | Assert.cs:45:13:45:25 | ... ? ... : ... | non-null |
| Assert.cs:46:23:46:23 | access to local variable s | null | Assert.cs:45:13:45:25 | ... ? ... : ... | null |
| Assert.cs:46:23:46:31 | ... == ... | false | Assert.cs:45:13:45:13 | access to parameter b | false |
@@ -196,6 +236,10 @@
| Assert.cs:49:9:49:25 | ... = ... | non-null | Assert.cs:49:13:49:25 | ... ? ... : ... | non-null |
| Assert.cs:49:9:49:25 | ... = ... | null | Assert.cs:49:9:49:9 | access to local variable s | null |
| Assert.cs:49:9:49:25 | ... = ... | null | Assert.cs:49:13:49:25 | ... ? ... : ... | null |
| Assert.cs:49:13:49:25 | ... ? ... : ... | non-null | Assert.cs:49:13:49:13 | access to parameter b | false |
| Assert.cs:49:13:49:25 | ... ? ... : ... | non-null | Assert.cs:49:24:49:25 | "" | non-null |
| Assert.cs:49:13:49:25 | ... ? ... : ... | null | Assert.cs:49:13:49:13 | access to parameter b | true |
| Assert.cs:49:13:49:25 | ... ? ... : ... | null | Assert.cs:49:17:49:20 | null | null |
| Assert.cs:50:24:50:24 | access to local variable s | non-null | Assert.cs:49:13:49:25 | ... ? ... : ... | non-null |
| Assert.cs:50:24:50:24 | access to local variable s | null | Assert.cs:49:13:49:25 | ... ? ... : ... | null |
| Assert.cs:50:24:50:32 | ... != ... | false | Assert.cs:49:13:49:13 | access to parameter b | true |
@@ -292,6 +336,10 @@
| C.cs:34:13:34:21 | ... == ... | true | C.cs:34:13:34:13 | access to parameter o | null |
| C.cs:40:13:40:35 | String s = ... | non-null | C.cs:40:13:40:13 | access to local variable s | non-null |
| C.cs:40:13:40:35 | String s = ... | null | C.cs:40:13:40:13 | access to local variable s | null |
| C.cs:40:17:40:35 | ... ? ... : ... | non-null | C.cs:40:17:40:23 | call to method Maybe | false |
| C.cs:40:17:40:35 | ... ? ... : ... | non-null | C.cs:40:34:40:35 | "" | non-null |
| C.cs:40:17:40:35 | ... ? ... : ... | null | C.cs:40:17:40:23 | call to method Maybe | true |
| C.cs:40:17:40:35 | ... ? ... : ... | null | C.cs:40:27:40:30 | null | null |
| C.cs:41:22:41:22 | access to local variable s | non-null | C.cs:40:17:40:35 | ... ? ... : ... | non-null |
| C.cs:41:22:41:22 | access to local variable s | null | C.cs:40:17:40:35 | ... ? ... : ... | null |
| C.cs:41:22:41:30 | ... == ... | false | C.cs:40:17:40:23 | call to method Maybe | false |
@@ -304,6 +352,10 @@
| C.cs:44:9:44:31 | ... = ... | non-null | C.cs:44:13:44:31 | ... ? ... : ... | non-null |
| C.cs:44:9:44:31 | ... = ... | null | C.cs:44:9:44:9 | access to local variable s | null |
| C.cs:44:9:44:31 | ... = ... | null | C.cs:44:13:44:31 | ... ? ... : ... | null |
| C.cs:44:13:44:31 | ... ? ... : ... | non-null | C.cs:44:13:44:19 | call to method Maybe | false |
| C.cs:44:13:44:31 | ... ? ... : ... | non-null | C.cs:44:30:44:31 | "" | non-null |
| C.cs:44:13:44:31 | ... ? ... : ... | null | C.cs:44:13:44:19 | call to method Maybe | true |
| C.cs:44:13:44:31 | ... ? ... : ... | null | C.cs:44:23:44:26 | null | null |
| C.cs:45:22:45:22 | access to local variable s | non-null | C.cs:44:13:44:31 | ... ? ... : ... | non-null |
| C.cs:45:22:45:22 | access to local variable s | null | C.cs:44:13:44:31 | ... ? ... : ... | null |
| C.cs:45:22:45:30 | ... != ... | false | C.cs:44:13:44:19 | call to method Maybe | true |
@@ -320,24 +372,40 @@
| C.cs:53:9:53:10 | access to local variable o1 | null | C.cs:51:18:51:29 | object creation of type Object | null |
| C.cs:55:13:55:36 | String o2 = ... | non-null | C.cs:55:13:55:14 | access to local variable o2 | non-null |
| C.cs:55:13:55:36 | String o2 = ... | null | C.cs:55:13:55:14 | access to local variable o2 | null |
| C.cs:55:18:55:36 | ... ? ... : ... | non-null | C.cs:55:18:55:24 | call to method Maybe | false |
| C.cs:55:18:55:36 | ... ? ... : ... | non-null | C.cs:55:35:55:36 | "" | non-null |
| C.cs:55:18:55:36 | ... ? ... : ... | null | C.cs:55:18:55:24 | call to method Maybe | true |
| C.cs:55:18:55:36 | ... ? ... : ... | null | C.cs:55:28:55:31 | null | null |
| C.cs:56:23:56:24 | access to local variable o2 | non-null | C.cs:55:18:55:36 | ... ? ... : ... | non-null |
| C.cs:56:23:56:24 | access to local variable o2 | null | C.cs:55:18:55:36 | ... ? ... : ... | null |
| C.cs:57:9:57:10 | access to local variable o2 | non-null | C.cs:55:18:55:36 | ... ? ... : ... | non-null |
| C.cs:57:9:57:10 | access to local variable o2 | null | C.cs:55:18:55:36 | ... ? ... : ... | null |
| C.cs:62:13:62:46 | Object o1 = ... | non-null | C.cs:62:13:62:14 | access to local variable o1 | non-null |
| C.cs:62:13:62:46 | Object o1 = ... | null | C.cs:62:13:62:14 | access to local variable o1 | null |
| C.cs:62:18:62:46 | ... ? ... : ... | non-null | C.cs:62:18:62:24 | call to method Maybe | false |
| C.cs:62:18:62:46 | ... ? ... : ... | non-null | C.cs:62:35:62:46 | object creation of type Object | non-null |
| C.cs:62:18:62:46 | ... ? ... : ... | null | C.cs:62:18:62:24 | call to method Maybe | true |
| C.cs:62:18:62:46 | ... ? ... : ... | null | C.cs:62:28:62:31 | null | null |
| C.cs:63:23:63:24 | access to local variable o1 | non-null | C.cs:62:18:62:46 | ... ? ... : ... | non-null |
| C.cs:63:23:63:24 | access to local variable o1 | null | C.cs:62:18:62:46 | ... ? ... : ... | null |
| C.cs:64:9:64:10 | access to local variable o1 | non-null | C.cs:62:18:62:46 | ... ? ... : ... | non-null |
| C.cs:64:9:64:10 | access to local variable o1 | null | C.cs:62:18:62:46 | ... ? ... : ... | null |
| C.cs:66:13:66:46 | Object o2 = ... | non-null | C.cs:66:13:66:14 | access to local variable o2 | non-null |
| C.cs:66:13:66:46 | Object o2 = ... | null | C.cs:66:13:66:14 | access to local variable o2 | null |
| C.cs:66:18:66:46 | ... ? ... : ... | non-null | C.cs:66:18:66:24 | call to method Maybe | false |
| C.cs:66:18:66:46 | ... ? ... : ... | non-null | C.cs:66:35:66:46 | object creation of type Object | non-null |
| C.cs:66:18:66:46 | ... ? ... : ... | null | C.cs:66:18:66:24 | call to method Maybe | true |
| C.cs:66:18:66:46 | ... ? ... : ... | null | C.cs:66:28:66:31 | null | null |
| C.cs:67:23:67:24 | access to local variable o1 | non-null | C.cs:62:18:62:46 | ... ? ... : ... | non-null |
| C.cs:67:23:67:24 | access to local variable o1 | null | C.cs:62:18:62:46 | ... ? ... : ... | null |
| C.cs:68:9:68:10 | access to local variable o2 | non-null | C.cs:66:18:66:46 | ... ? ... : ... | non-null |
| C.cs:68:9:68:10 | access to local variable o2 | null | C.cs:66:18:66:46 | ... ? ... : ... | null |
| C.cs:70:13:70:46 | Object o3 = ... | non-null | C.cs:70:13:70:14 | access to local variable o3 | non-null |
| C.cs:70:13:70:46 | Object o3 = ... | null | C.cs:70:13:70:14 | access to local variable o3 | null |
| C.cs:70:18:70:46 | ... ? ... : ... | non-null | C.cs:70:18:70:24 | call to method Maybe | false |
| C.cs:70:18:70:46 | ... ? ... : ... | non-null | C.cs:70:35:70:46 | object creation of type Object | non-null |
| C.cs:70:18:70:46 | ... ? ... : ... | null | C.cs:70:18:70:24 | call to method Maybe | true |
| C.cs:70:18:70:46 | ... ? ... : ... | null | C.cs:70:28:70:31 | null | null |
| C.cs:71:26:71:27 | access to local variable o3 | non-null | C.cs:70:18:70:46 | ... ? ... : ... | non-null |
| C.cs:71:26:71:27 | access to local variable o3 | null | C.cs:70:18:70:46 | ... ? ... : ... | null |
| C.cs:72:9:72:10 | access to local variable o3 | non-null | C.cs:70:18:70:46 | ... ? ... : ... | non-null |
@@ -367,6 +435,10 @@
| C.cs:90:13:90:13 | access to local variable o | null | C.cs:88:20:88:23 | null | null |
| C.cs:95:13:95:45 | Object o = ... | non-null | C.cs:95:13:95:13 | access to local variable o | non-null |
| C.cs:95:13:95:45 | Object o = ... | null | C.cs:95:13:95:13 | access to local variable o | null |
| C.cs:95:17:95:45 | ... ? ... : ... | non-null | C.cs:95:17:95:23 | call to method Maybe | false |
| C.cs:95:17:95:45 | ... ? ... : ... | non-null | C.cs:95:34:95:45 | object creation of type Object | non-null |
| C.cs:95:17:95:45 | ... ? ... : ... | null | C.cs:95:17:95:23 | call to method Maybe | true |
| C.cs:95:17:95:45 | ... ? ... : ... | null | C.cs:95:27:95:30 | null | null |
| C.cs:96:15:96:15 | access to local variable o | non-null | C.cs:95:17:95:45 | ... ? ... : ... | non-null |
| C.cs:96:15:96:15 | access to local variable o | null | C.cs:95:17:95:45 | ... ? ... : ... | null |
| C.cs:97:13:97:13 | access to local variable o | non-null | C.cs:95:17:95:45 | ... ? ... : ... | non-null |
@@ -385,6 +457,8 @@
| C.cs:114:22:114:36 | ... == ... | true | C.cs:114:22:114:28 | access to local variable colours | null |
| C.cs:114:22:114:59 | ... \|\| ... | false | C.cs:114:22:114:36 | ... == ... | false |
| C.cs:114:22:114:59 | ... \|\| ... | false | C.cs:114:41:114:59 | ... == ... | false |
| C.cs:114:22:114:90 | ... ? ... : ... | null | C.cs:114:22:114:59 | ... \|\| ... | false |
| C.cs:114:22:114:90 | ... ? ... : ... | null | C.cs:114:73:114:90 | call to method ToString | null |
| C.cs:114:41:114:47 | access to local variable colours | non-null | C.cs:113:26:113:29 | null | non-null |
| C.cs:114:41:114:47 | access to local variable colours | null | C.cs:113:26:113:29 | null | null |
| C.cs:114:73:114:79 | access to local variable colours | non-null | C.cs:113:26:113:29 | null | non-null |
@@ -511,6 +585,10 @@
| C.cs:205:13:205:20 | ... = ... | null | C.cs:205:17:205:20 | null | null |
| C.cs:211:13:211:35 | String s = ... | non-null | C.cs:211:13:211:13 | access to local variable s | non-null |
| C.cs:211:13:211:35 | String s = ... | null | C.cs:211:13:211:13 | access to local variable s | null |
| C.cs:211:17:211:35 | ... ? ... : ... | non-null | C.cs:211:17:211:23 | call to method Maybe | false |
| C.cs:211:17:211:35 | ... ? ... : ... | non-null | C.cs:211:34:211:35 | "" | non-null |
| C.cs:211:17:211:35 | ... ? ... : ... | null | C.cs:211:17:211:23 | call to method Maybe | true |
| C.cs:211:17:211:35 | ... ? ... : ... | null | C.cs:211:27:211:30 | null | null |
| C.cs:212:13:212:13 | access to local variable s | non-null | C.cs:211:17:211:35 | ... ? ... : ... | non-null |
| C.cs:212:13:212:13 | access to local variable s | null | C.cs:211:17:211:35 | ... ? ... : ... | null |
| C.cs:212:13:212:21 | ... != ... | false | C.cs:211:17:211:23 | call to method Maybe | true |
@@ -613,6 +691,10 @@
| D.cs:39:16:39:24 | ... == ... | true | D.cs:39:16:39:16 | access to parameter x | null |
| D.cs:44:13:44:44 | Object o1 = ... | non-null | D.cs:44:13:44:14 | access to local variable o1 | non-null |
| D.cs:44:13:44:44 | Object o1 = ... | null | D.cs:44:13:44:14 | access to local variable o1 | null |
| D.cs:44:18:44:44 | ... ? ... : ... | non-null | D.cs:44:18:44:22 | access to field maybe | false |
| D.cs:44:18:44:44 | ... ? ... : ... | non-null | D.cs:44:33:44:44 | object creation of type Object | non-null |
| D.cs:44:18:44:44 | ... ? ... : ... | null | D.cs:44:18:44:22 | access to field maybe | true |
| D.cs:44:18:44:44 | ... ? ... : ... | null | D.cs:44:26:44:29 | null | null |
| D.cs:45:13:45:14 | access to local variable o1 | non-null | D.cs:44:18:44:44 | ... ? ... : ... | non-null |
| D.cs:45:13:45:14 | access to local variable o1 | null | D.cs:44:18:44:44 | ... ? ... : ... | null |
| D.cs:45:13:45:22 | ... != ... | false | D.cs:44:18:44:22 | access to field maybe | true |
@@ -623,6 +705,10 @@
| D.cs:45:25:45:26 | access to local variable o1 | null | D.cs:44:18:44:44 | ... ? ... : ... | null |
| D.cs:47:13:47:34 | String o2 = ... | non-null | D.cs:47:13:47:14 | access to local variable o2 | non-null |
| D.cs:47:13:47:34 | String o2 = ... | null | D.cs:47:13:47:14 | access to local variable o2 | null |
| D.cs:47:18:47:34 | ... ? ... : ... | non-null | D.cs:47:18:47:22 | access to field maybe | false |
| D.cs:47:18:47:34 | ... ? ... : ... | non-null | D.cs:47:33:47:34 | "" | non-null |
| D.cs:47:18:47:34 | ... ? ... : ... | null | D.cs:47:18:47:22 | access to field maybe | true |
| D.cs:47:18:47:34 | ... ? ... : ... | null | D.cs:47:26:47:29 | null | null |
| D.cs:48:13:48:14 | access to local variable o2 | non-null | D.cs:47:18:47:34 | ... ? ... : ... | non-null |
| D.cs:48:13:48:14 | access to local variable o2 | null | D.cs:47:18:47:34 | ... ? ... : ... | null |
| D.cs:48:13:48:24 | ... is ... | false | D.cs:47:18:47:22 | access to field maybe | true |
@@ -639,10 +725,18 @@
| D.cs:51:14:51:35 | ... = ... | non-null | D.cs:51:19:51:35 | ... ? ... : ... | non-null |
| D.cs:51:14:51:35 | ... = ... | null | D.cs:51:14:51:15 | access to local variable o3 | null |
| D.cs:51:14:51:35 | ... = ... | null | D.cs:51:19:51:35 | ... ? ... : ... | null |
| D.cs:51:19:51:35 | ... ? ... : ... | non-null | D.cs:51:19:51:23 | access to field maybe | false |
| D.cs:51:19:51:35 | ... ? ... : ... | non-null | D.cs:51:34:51:35 | "" | non-null |
| D.cs:51:19:51:35 | ... ? ... : ... | null | D.cs:51:19:51:23 | access to field maybe | true |
| D.cs:51:19:51:35 | ... ? ... : ... | null | D.cs:51:27:51:30 | null | null |
| D.cs:52:13:52:14 | access to local variable o3 | non-null | D.cs:51:19:51:35 | ... ? ... : ... | non-null |
| D.cs:52:13:52:14 | access to local variable o3 | null | D.cs:51:19:51:35 | ... ? ... : ... | null |
| D.cs:54:13:54:34 | String o4 = ... | non-null | D.cs:54:13:54:14 | access to local variable o4 | non-null |
| D.cs:54:13:54:34 | String o4 = ... | null | D.cs:54:13:54:14 | access to local variable o4 | null |
| D.cs:54:18:54:34 | ... ? ... : ... | non-null | D.cs:54:18:54:22 | access to field maybe | false |
| D.cs:54:18:54:34 | ... ? ... : ... | non-null | D.cs:54:33:54:34 | "" | non-null |
| D.cs:54:18:54:34 | ... ? ... : ... | null | D.cs:54:18:54:22 | access to field maybe | true |
| D.cs:54:18:54:34 | ... ? ... : ... | null | D.cs:54:26:54:29 | null | null |
| D.cs:55:13:55:42 | ... != ... | false | D.cs:55:14:55:32 | ... && ... | false |
| D.cs:55:13:55:42 | ... != ... | true | D.cs:55:14:55:32 | ... && ... | true |
| D.cs:55:14:55:32 | ... && ... | true | D.cs:55:14:55:18 | ... > ... | true |
@@ -657,6 +751,10 @@
| D.cs:56:13:56:14 | access to local variable o4 | null | D.cs:54:18:54:34 | ... ? ... : ... | null |
| D.cs:58:13:58:41 | String o5 = ... | non-null | D.cs:58:13:58:14 | access to local variable o5 | non-null |
| D.cs:58:13:58:41 | String o5 = ... | null | D.cs:58:13:58:14 | access to local variable o5 | null |
| D.cs:58:18:58:41 | ... ? ... : ... | non-null | D.cs:58:19:58:28 | ... != ... | true |
| D.cs:58:18:58:41 | ... ? ... : ... | non-null | D.cs:58:33:58:34 | "" | non-null |
| D.cs:58:18:58:41 | ... ? ... : ... | null | D.cs:58:19:58:28 | ... != ... | false |
| D.cs:58:18:58:41 | ... ? ... : ... | null | D.cs:58:38:58:41 | null | null |
| D.cs:58:19:58:20 | access to local variable o4 | non-null | D.cs:54:18:54:34 | ... ? ... : ... | non-null |
| D.cs:58:19:58:20 | access to local variable o4 | null | D.cs:54:18:54:34 | ... ? ... : ... | null |
| D.cs:58:19:58:28 | ... != ... | false | D.cs:54:18:54:22 | access to field maybe | true |
@@ -681,6 +779,10 @@
| D.cs:62:13:62:14 | access to local variable o5 | null | D.cs:58:18:58:41 | ... ? ... : ... | null |
| D.cs:64:13:64:34 | String o6 = ... | non-null | D.cs:64:13:64:14 | access to local variable o6 | non-null |
| D.cs:64:13:64:34 | String o6 = ... | null | D.cs:64:13:64:14 | access to local variable o6 | null |
| D.cs:64:18:64:34 | ... ? ... : ... | non-null | D.cs:64:18:64:22 | access to field maybe | false |
| D.cs:64:18:64:34 | ... ? ... : ... | non-null | D.cs:64:33:64:34 | "" | non-null |
| D.cs:64:18:64:34 | ... ? ... : ... | null | D.cs:64:18:64:22 | access to field maybe | true |
| D.cs:64:18:64:34 | ... ? ... : ... | null | D.cs:64:26:64:29 | null | null |
| D.cs:65:13:65:29 | !... | false | D.cs:65:14:65:29 | call to method CustomIsNull | true |
| D.cs:65:13:65:29 | !... | true | D.cs:65:14:65:29 | call to method CustomIsNull | false |
| D.cs:65:14:65:29 | call to method CustomIsNull | false | D.cs:64:18:64:22 | access to field maybe | false |
@@ -693,6 +795,10 @@
| D.cs:66:13:66:14 | access to local variable o6 | null | D.cs:64:18:64:34 | ... ? ... : ... | null |
| D.cs:68:13:68:34 | String o7 = ... | non-null | D.cs:68:13:68:14 | access to local variable o7 | non-null |
| D.cs:68:13:68:34 | String o7 = ... | null | D.cs:68:13:68:14 | access to local variable o7 | null |
| D.cs:68:18:68:34 | ... ? ... : ... | non-null | D.cs:68:18:68:22 | access to field maybe | false |
| D.cs:68:18:68:34 | ... ? ... : ... | non-null | D.cs:68:33:68:34 | "" | non-null |
| D.cs:68:18:68:34 | ... ? ... : ... | null | D.cs:68:18:68:22 | access to field maybe | true |
| D.cs:68:18:68:34 | ... ? ... : ... | null | D.cs:68:26:68:29 | null | null |
| D.cs:69:13:69:36 | Boolean ok = ... | false | D.cs:69:13:69:14 | access to local variable ok | false |
| D.cs:69:13:69:36 | Boolean ok = ... | true | D.cs:69:13:69:14 | access to local variable ok | true |
| D.cs:69:18:69:19 | access to local variable o7 | non-null | D.cs:68:18:68:34 | ... ? ... : ... | non-null |
@@ -711,16 +817,22 @@
| D.cs:73:13:73:14 | access to local variable o7 | null | D.cs:68:18:68:34 | ... ? ... : ... | null |
| D.cs:75:13:75:34 | String o8 = ... | non-null | D.cs:75:13:75:14 | access to local variable o8 | non-null |
| D.cs:75:13:75:34 | String o8 = ... | null | D.cs:75:13:75:14 | access to local variable o8 | null |
| D.cs:75:18:75:34 | ... ? ... : ... | non-null | D.cs:75:18:75:22 | access to field maybe | false |
| D.cs:75:18:75:34 | ... ? ... : ... | non-null | D.cs:75:33:75:34 | "" | non-null |
| D.cs:75:18:75:34 | ... ? ... : ... | null | D.cs:75:18:75:22 | access to field maybe | true |
| D.cs:75:18:75:34 | ... ? ... : ... | null | D.cs:75:26:75:29 | null | null |
| D.cs:76:21:76:22 | access to local variable o8 | non-null | D.cs:75:18:75:34 | ... ? ... : ... | non-null |
| D.cs:76:21:76:22 | access to local variable o8 | null | D.cs:75:18:75:34 | ... ? ... : ... | null |
| D.cs:76:21:76:30 | ... == ... | false | D.cs:75:18:75:22 | access to field maybe | false |
| D.cs:76:21:76:30 | ... == ... | false | D.cs:76:21:76:22 | access to local variable o8 | non-null |
| D.cs:76:21:76:30 | ... == ... | true | D.cs:75:18:75:22 | access to field maybe | true |
| D.cs:76:21:76:30 | ... == ... | true | D.cs:76:21:76:22 | access to local variable o8 | null |
| D.cs:77:13:77:22 | ... == ... | false | D.cs:76:21:76:30 | ... == ... | true |
| D.cs:77:13:77:22 | ... == ... | true | D.cs:76:21:76:30 | ... == ... | false |
| D.cs:78:13:78:14 | access to local variable o8 | non-null | D.cs:75:18:75:34 | ... ? ... : ... | non-null |
| D.cs:78:13:78:14 | access to local variable o8 | null | D.cs:75:18:75:34 | ... ? ... : ... | null |
| D.cs:79:13:79:23 | ... != ... | false | D.cs:76:21:76:30 | ... == ... | true |
| D.cs:79:13:79:23 | ... != ... | true | D.cs:76:21:76:30 | ... == ... | false |
| D.cs:80:13:80:14 | access to local variable o8 | non-null | D.cs:75:18:75:34 | ... ? ... : ... | non-null |
| D.cs:80:13:80:14 | access to local variable o8 | null | D.cs:75:18:75:34 | ... ? ... : ... | null |
| D.cs:82:13:82:14 | access to local variable o8 | non-null | D.cs:75:18:75:34 | ... ? ... : ... | non-null |
@@ -729,6 +841,10 @@
| D.cs:84:13:84:14 | access to local variable o8 | null | D.cs:75:18:75:34 | ... ? ... : ... | null |
| D.cs:89:15:89:44 | Int32[] xs = ... | non-null | D.cs:89:15:89:16 | access to local variable xs | non-null |
| D.cs:89:15:89:44 | Int32[] xs = ... | null | D.cs:89:15:89:16 | access to local variable xs | null |
| D.cs:89:20:89:44 | ... ? ... : ... | non-null | D.cs:89:20:89:24 | access to field maybe | false |
| D.cs:89:20:89:44 | ... ? ... : ... | non-null | D.cs:89:35:89:44 | array creation of type Int32[] | non-null |
| D.cs:89:20:89:44 | ... ? ... : ... | null | D.cs:89:20:89:24 | access to field maybe | true |
| D.cs:89:20:89:44 | ... ? ... : ... | null | D.cs:89:28:89:31 | null | null |
| D.cs:91:13:91:14 | access to local variable xs | non-null | D.cs:89:20:89:44 | ... ? ... : ... | non-null |
| D.cs:91:13:91:14 | access to local variable xs | null | D.cs:89:20:89:44 | ... ? ... : ... | null |
| D.cs:94:13:94:29 | ... = ... | false | D.cs:94:13:94:17 | access to field maybe | false |
@@ -759,6 +875,10 @@
| D.cs:111:21:111:22 | access to local variable xs | null | D.cs:89:20:89:44 | ... ? ... : ... | null |
| D.cs:117:13:117:32 | String x = ... | non-null | D.cs:117:13:117:13 | access to local variable x | non-null |
| D.cs:117:13:117:32 | String x = ... | null | D.cs:117:13:117:13 | access to local variable x | null |
| D.cs:117:17:117:32 | ... ? ... : ... | non-null | D.cs:117:17:117:17 | access to parameter b | false |
| D.cs:117:17:117:32 | ... ? ... : ... | non-null | D.cs:117:28:117:32 | "abc" | non-null |
| D.cs:117:17:117:32 | ... ? ... : ... | null | D.cs:117:17:117:17 | access to parameter b | true |
| D.cs:117:17:117:32 | ... ? ... : ... | null | D.cs:117:21:117:24 | null | null |
| D.cs:118:9:118:30 | ... = ... | non-null | D.cs:118:9:118:9 | access to local variable x | non-null |
| D.cs:118:9:118:30 | ... = ... | non-null | D.cs:118:13:118:30 | ... ? ... : ... | non-null |
| D.cs:118:9:118:30 | ... = ... | null | D.cs:118:9:118:9 | access to local variable x | null |
@@ -769,6 +889,8 @@
| D.cs:118:13:118:21 | ... == ... | false | D.cs:118:13:118:13 | access to local variable x | non-null |
| D.cs:118:13:118:21 | ... == ... | true | D.cs:117:17:117:17 | access to parameter b | true |
| D.cs:118:13:118:21 | ... == ... | true | D.cs:118:13:118:13 | access to local variable x | null |
| D.cs:118:13:118:30 | ... ? ... : ... | null | D.cs:118:13:118:21 | ... == ... | false |
| D.cs:118:13:118:30 | ... ? ... : ... | null | D.cs:118:30:118:30 | access to local variable x | null |
| D.cs:118:30:118:30 | access to local variable x | non-null | D.cs:117:17:117:32 | ... ? ... : ... | non-null |
| D.cs:118:30:118:30 | access to local variable x | null | D.cs:117:17:117:32 | ... ? ... : ... | null |
| D.cs:119:13:119:13 | access to local variable x | non-null | D.cs:118:13:118:30 | ... ? ... : ... | non-null |
@@ -828,6 +950,8 @@
| D.cs:212:18:212:18 | access to local variable n | null | D.cs:211:20:211:23 | null | null |
| D.cs:212:18:212:26 | ... == ... | false | D.cs:212:18:212:18 | access to local variable n | non-null |
| D.cs:212:18:212:26 | ... == ... | true | D.cs:212:18:212:18 | access to local variable n | null |
| D.cs:212:18:212:45 | ... ? ... : ... | null | D.cs:212:18:212:26 | ... == ... | false |
| D.cs:212:18:212:45 | ... ? ... : ... | null | D.cs:212:45:212:45 | access to local variable n | null |
| D.cs:212:45:212:45 | access to local variable n | non-null | D.cs:211:20:211:23 | null | non-null |
| D.cs:212:45:212:45 | access to local variable n | null | D.cs:211:20:211:23 | null | null |
| D.cs:213:9:213:10 | access to local variable o2 | non-null | D.cs:212:18:212:45 | ... ? ... : ... | non-null |
@@ -875,6 +999,10 @@
| D.cs:240:9:240:16 | ... = ... | null | D.cs:240:13:240:16 | null | null |
| D.cs:241:13:241:37 | String other = ... | non-null | D.cs:241:13:241:17 | access to local variable other | non-null |
| D.cs:241:13:241:37 | String other = ... | null | D.cs:241:13:241:17 | access to local variable other | null |
| D.cs:241:21:241:37 | ... ? ... : ... | non-null | D.cs:241:21:241:25 | access to field maybe | false |
| D.cs:241:21:241:37 | ... ? ... : ... | non-null | D.cs:241:36:241:37 | "" | non-null |
| D.cs:241:21:241:37 | ... ? ... : ... | null | D.cs:241:21:241:25 | access to field maybe | true |
| D.cs:241:21:241:37 | ... ? ... : ... | null | D.cs:241:29:241:32 | null | null |
| D.cs:242:13:242:17 | access to local variable other | non-null | D.cs:241:21:241:37 | ... ? ... : ... | non-null |
| D.cs:242:13:242:17 | access to local variable other | null | D.cs:241:21:241:37 | ... ? ... : ... | null |
| D.cs:242:13:242:25 | ... == ... | false | D.cs:241:21:241:25 | access to field maybe | false |
@@ -893,6 +1021,10 @@
| D.cs:244:13:244:25 | ... != ... | true | D.cs:244:13:244:17 | access to local variable other | non-null |
| D.cs:249:13:249:38 | String o2 = ... | non-null | D.cs:249:13:249:14 | access to local variable o2 | non-null |
| D.cs:249:13:249:38 | String o2 = ... | null | D.cs:249:13:249:14 | access to local variable o2 | null |
| D.cs:249:18:249:38 | ... ? ... : ... | non-null | D.cs:249:19:249:25 | ... < ... | false |
| D.cs:249:18:249:38 | ... ? ... : ... | non-null | D.cs:249:37:249:38 | "" | non-null |
| D.cs:249:18:249:38 | ... ? ... : ... | null | D.cs:249:19:249:25 | ... < ... | true |
| D.cs:249:18:249:38 | ... ? ... : ... | null | D.cs:249:30:249:33 | null | null |
| D.cs:251:13:251:19 | ... = ... | non-null | D.cs:251:13:251:14 | access to local variable o2 | non-null |
| D.cs:251:13:251:19 | ... = ... | non-null | D.cs:251:18:251:19 | "" | non-null |
| D.cs:251:13:251:19 | ... = ... | null | D.cs:251:13:251:14 | access to local variable o2 | null |
@@ -999,6 +1131,10 @@
| D.cs:362:17:362:28 | ... = ... | null | D.cs:362:24:362:28 | "abc" | null |
| D.cs:366:15:366:47 | Int32[] b = ... | non-null | D.cs:366:15:366:15 | access to local variable b | non-null |
| D.cs:366:15:366:47 | Int32[] b = ... | null | D.cs:366:15:366:15 | access to local variable b | null |
| D.cs:366:19:366:47 | ... ? ... : ... | non-null | D.cs:366:19:366:23 | access to field maybe | false |
| D.cs:366:19:366:47 | ... ? ... : ... | non-null | D.cs:366:34:366:47 | array creation of type Int32[] | non-null |
| D.cs:366:19:366:47 | ... ? ... : ... | null | D.cs:366:19:366:23 | access to field maybe | true |
| D.cs:366:19:366:47 | ... ? ... : ... | null | D.cs:366:27:366:30 | null | null |
| D.cs:367:13:367:56 | ... && ... | true | D.cs:367:13:367:21 | ... > ... | true |
| D.cs:367:13:367:56 | ... && ... | true | D.cs:367:27:367:55 | ... \|\| ... | true |
| D.cs:367:27:367:27 | access to local variable b | non-null | D.cs:366:19:366:47 | ... ? ... : ... | non-null |
@@ -1078,8 +1214,16 @@
| E.cs:13:13:13:18 | access to local variable haveA3 | true | E.cs:12:22:12:52 | ... && ... | true |
| E.cs:19:13:19:30 | String s1 = ... | non-null | E.cs:19:13:19:14 | access to local variable s1 | non-null |
| E.cs:19:13:19:30 | String s1 = ... | null | E.cs:19:13:19:14 | access to local variable s1 | null |
| E.cs:19:18:19:30 | ... ? ... : ... | non-null | E.cs:19:18:19:18 | access to parameter x | false |
| E.cs:19:18:19:30 | ... ? ... : ... | non-null | E.cs:19:29:19:30 | "" | non-null |
| E.cs:19:18:19:30 | ... ? ... : ... | null | E.cs:19:18:19:18 | access to parameter x | true |
| E.cs:19:18:19:30 | ... ? ... : ... | null | E.cs:19:22:19:25 | null | null |
| E.cs:20:13:20:41 | String s2 = ... | non-null | E.cs:20:13:20:14 | access to local variable s2 | non-null |
| E.cs:20:13:20:41 | String s2 = ... | null | E.cs:20:13:20:14 | access to local variable s2 | null |
| E.cs:20:18:20:41 | ... ? ... : ... | non-null | E.cs:20:19:20:28 | ... == ... | false |
| E.cs:20:18:20:41 | ... ? ... : ... | non-null | E.cs:20:40:20:41 | "" | non-null |
| E.cs:20:18:20:41 | ... ? ... : ... | null | E.cs:20:19:20:28 | ... == ... | true |
| E.cs:20:18:20:41 | ... ? ... : ... | null | E.cs:20:33:20:36 | null | null |
| E.cs:20:19:20:20 | access to local variable s1 | non-null | E.cs:19:18:19:30 | ... ? ... : ... | non-null |
| E.cs:20:19:20:20 | access to local variable s1 | null | E.cs:19:18:19:30 | ... ? ... : ... | null |
| E.cs:20:19:20:28 | ... == ... | false | E.cs:19:18:19:18 | access to parameter x | false |
@@ -1096,10 +1240,18 @@
| E.cs:23:13:23:30 | ... = ... | non-null | E.cs:23:18:23:30 | ... ? ... : ... | non-null |
| E.cs:23:13:23:30 | ... = ... | null | E.cs:23:13:23:14 | access to local variable s1 | null |
| E.cs:23:13:23:30 | ... = ... | null | E.cs:23:18:23:30 | ... ? ... : ... | null |
| E.cs:23:18:23:30 | ... ? ... : ... | non-null | E.cs:23:18:23:18 | access to parameter y | false |
| E.cs:23:18:23:30 | ... ? ... : ... | non-null | E.cs:23:29:23:30 | "" | non-null |
| E.cs:23:18:23:30 | ... ? ... : ... | null | E.cs:23:18:23:18 | access to parameter y | true |
| E.cs:23:18:23:30 | ... ? ... : ... | null | E.cs:23:22:23:25 | null | null |
| E.cs:24:13:24:41 | ... = ... | non-null | E.cs:24:13:24:14 | access to local variable s2 | non-null |
| E.cs:24:13:24:41 | ... = ... | non-null | E.cs:24:18:24:41 | ... ? ... : ... | non-null |
| E.cs:24:13:24:41 | ... = ... | null | E.cs:24:13:24:14 | access to local variable s2 | null |
| E.cs:24:13:24:41 | ... = ... | null | E.cs:24:18:24:41 | ... ? ... : ... | null |
| E.cs:24:18:24:41 | ... ? ... : ... | non-null | E.cs:24:19:24:28 | ... == ... | false |
| E.cs:24:18:24:41 | ... ? ... : ... | non-null | E.cs:24:40:24:41 | "" | non-null |
| E.cs:24:18:24:41 | ... ? ... : ... | null | E.cs:24:19:24:28 | ... == ... | true |
| E.cs:24:18:24:41 | ... ? ... : ... | null | E.cs:24:33:24:36 | null | null |
| E.cs:24:19:24:20 | access to local variable s1 | non-null | E.cs:23:18:23:30 | ... ? ... : ... | non-null |
| E.cs:24:19:24:20 | access to local variable s1 | null | E.cs:23:18:23:30 | ... ? ... : ... | null |
| E.cs:24:19:24:28 | ... == ... | false | E.cs:23:18:23:18 | access to parameter y | false |
@@ -1158,6 +1310,9 @@
| E.cs:90:17:90:27 | access to local variable switchguard | match case ...: | E.cs:83:29:83:30 | access to parameter b1 | true |
| E.cs:90:17:90:27 | access to local variable switchguard | match case ...: | E.cs:85:18:85:29 | ... != ... | true |
| E.cs:90:17:90:27 | access to local variable switchguard | match case ...: | E.cs:85:34:85:35 | access to parameter b2 | true |
| E.cs:90:17:90:27 | access to local variable switchguard | match case ...: | E.cs:90:17:90:27 | access to local variable switchguard | 1 |
| E.cs:90:17:90:27 | access to local variable switchguard | match case ...: | E.cs:90:17:90:27 | access to local variable switchguard | 2 |
| E.cs:90:17:90:27 | access to local variable switchguard | match case ...: | E.cs:90:17:90:27 | access to local variable switchguard | 3 |
| E.cs:107:15:107:25 | Int32[] arr2 = ... | non-null | E.cs:107:15:107:18 | access to local variable arr2 | non-null |
| E.cs:107:15:107:25 | Int32[] arr2 = ... | null | E.cs:107:15:107:18 | access to local variable arr2 | null |
| E.cs:109:13:109:39 | ... = ... | non-null | E.cs:109:13:109:16 | access to local variable arr2 | non-null |
@@ -1237,6 +1392,10 @@
| E.cs:193:19:193:29 | call to method ToString | non-null | E.cs:193:17:193:17 | access to parameter o | non-null |
| E.cs:198:13:198:29 | String o = ... | non-null | E.cs:198:13:198:13 | access to local variable o | non-null |
| E.cs:198:13:198:29 | String o = ... | null | E.cs:198:13:198:13 | access to local variable o | null |
| E.cs:198:17:198:29 | ... ? ... : ... | non-null | E.cs:198:17:198:17 | access to parameter b | false |
| E.cs:198:17:198:29 | ... ? ... : ... | non-null | E.cs:198:28:198:29 | "" | non-null |
| E.cs:198:17:198:29 | ... ? ... : ... | null | E.cs:198:17:198:17 | access to parameter b | true |
| E.cs:198:17:198:29 | ... ? ... : ... | null | E.cs:198:21:198:24 | null | null |
| E.cs:199:9:199:9 | access to local variable o | non-null | E.cs:198:17:198:29 | ... ? ... : ... | non-null |
| E.cs:199:9:199:9 | access to local variable o | null | E.cs:198:17:198:29 | ... ? ... : ... | null |
| E.cs:201:11:201:11 | access to local variable o | non-null | E.cs:198:17:198:29 | ... ? ... : ... | non-null |
@@ -1337,6 +1496,10 @@
| Forwarding.cs:83:16:83:24 | ... != ... | true | Forwarding.cs:83:16:83:16 | access to parameter o | non-null |
| GuardedString.cs:7:16:7:32 | String s = ... | non-null | GuardedString.cs:7:16:7:16 | access to local variable s | non-null |
| GuardedString.cs:7:16:7:32 | String s = ... | null | GuardedString.cs:7:16:7:16 | access to local variable s | null |
| GuardedString.cs:7:20:7:32 | ... ? ... : ... | non-null | GuardedString.cs:7:20:7:20 | access to parameter b | false |
| GuardedString.cs:7:20:7:32 | ... ? ... : ... | non-null | GuardedString.cs:7:31:7:32 | "" | non-null |
| GuardedString.cs:7:20:7:32 | ... ? ... : ... | null | GuardedString.cs:7:20:7:20 | access to parameter b | true |
| GuardedString.cs:7:20:7:32 | ... ? ... : ... | null | GuardedString.cs:7:24:7:27 | null | null |
| GuardedString.cs:9:13:9:36 | !... | false | GuardedString.cs:9:14:9:36 | call to method IsNullOrEmpty | true |
| GuardedString.cs:9:13:9:36 | !... | true | GuardedString.cs:9:14:9:36 | call to method IsNullOrEmpty | false |
| GuardedString.cs:9:14:9:36 | call to method IsNullOrEmpty | false | GuardedString.cs:7:20:7:20 | access to parameter b | false |

View File

@@ -10,7 +10,6 @@
| 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:80:13:80: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: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 |