diff --git a/change-notes/1.22/analysis-csharp.md b/change-notes/1.22/analysis-csharp.md index b2f38bf76c1..6bb62ac5023 100644 --- a/change-notes/1.22/analysis-csharp.md +++ b/change-notes/1.22/analysis-csharp.md @@ -41,5 +41,6 @@ - The new predicate `ConstructedGeneric.getAnnotatedTypeArgument()` gets the annotated type of a type argument - The new predicate `TypeParameterConstraints.getAnAnnotatedTypeConstraint()` gets a type constraint with type annotations * The new class `SuppressNullableWarningExpr` models suppress-nullable-warning expressions such as `x!` +* The data-flow library (and taint-tracking library) now supports flow through fields. All existing configurations will have field-flow enabled by default, but it can be disabled by adding `override int fieldFlowBranchLimit() { result = 0 }` to the configuration class. Field assignments, `this.Foo = x`, object initializers, `new C() { Foo = x }`, and field initializers `int Foo = 0` are supported. ## Changes to autobuilder diff --git a/cpp/ql/src/semmle/code/cpp/dataflow/internal/DataFlowImpl.qll b/cpp/ql/src/semmle/code/cpp/dataflow/internal/DataFlowImpl.qll index 796c20b35e3..931ab2e63f1 100644 --- a/cpp/ql/src/semmle/code/cpp/dataflow/internal/DataFlowImpl.qll +++ b/cpp/ql/src/semmle/code/cpp/dataflow/internal/DataFlowImpl.qll @@ -278,10 +278,9 @@ private predicate nodeCandFwd1(Node node, boolean stored, Configuration config) ) or // read - exists(Node mid, Content f | - nodeCandFwd1(mid, true, config) and - read(mid, f, node) and - storeCandFwd1(f, unbind(config)) and + exists(Content f | + nodeCandFwd1Read(f, node, config) and + storeCandFwd1(f, config) and (stored = false or stored = true) and not inBarrier(node, config) ) @@ -308,9 +307,18 @@ private predicate nodeCandFwd1(Node node, boolean stored, Configuration config) ) } +pragma[nomagic] +private predicate nodeCandFwd1Read(Content f, Node node, Configuration config) { + exists(Node mid | + nodeCandFwd1(mid, true, config) and + read(mid, f, node) + ) +} + /** * Holds if `f` is the target of a store in the flow covered by `nodeCandFwd1`. */ +pragma[noinline] private predicate storeCandFwd1(Content f, Configuration config) { exists(Node mid, Node node | not fullBarrier(node, config) and @@ -358,10 +366,9 @@ private predicate nodeCand1(Node node, boolean stored, Configuration config) { ) or // store - exists(Node mid, Content f | - store(node, f, mid) and - readCand1(f, unbind(config)) and - nodeCand1(mid, true, config) and + exists(Content f | + nodeCand1Store(f, node, config) and + readCand1(f, config) and (stored = false or stored = true) ) or @@ -398,6 +405,7 @@ private predicate nodeCand1(Node node, boolean stored, Configuration config) { /** * Holds if `f` is the target of a read in the flow covered by `nodeCand1`. */ +pragma[noinline] private predicate readCand1(Content f, Configuration config) { exists(Node mid, Node node | useFieldFlow(config) and @@ -408,6 +416,15 @@ private predicate readCand1(Content f, Configuration config) { ) } +pragma[nomagic] +private predicate nodeCand1Store(Content f, Node node, Configuration config) { + exists(Node mid | + nodeCand1(mid, true, config) and + storeCandFwd1(f, unbind(config)) and + store(node, f, mid) + ) +} + private predicate throughFlowNodeCand(Node node, Configuration config) { nodeCand1(node, false, config) and not fullBarrier(node, config) and @@ -669,10 +686,9 @@ private predicate nodeCandFwd2(Node node, boolean fromArg, boolean stored, Confi ) or // read - exists(Node mid, Content f | - nodeCandFwd2(mid, fromArg, true, config) and - read(mid, f, node) and - storeCandFwd2(f, unbind(config)) and + exists(Content f | + nodeCandFwd2Read(f, node, fromArg, config) and + storeCandFwd2(f, config) and (stored = false or stored = true) ) or @@ -695,6 +711,7 @@ private predicate nodeCandFwd2(Node node, boolean fromArg, boolean stored, Confi /** * Holds if `f` is the target of a store in the flow covered by `nodeCandFwd2`. */ +pragma[noinline] private predicate storeCandFwd2(Content f, Configuration config) { exists(Node mid, Node node | useFieldFlow(config) and @@ -705,6 +722,15 @@ private predicate storeCandFwd2(Content f, Configuration config) { ) } +pragma[nomagic] +private predicate nodeCandFwd2Read(Content f, Node node, boolean fromArg, Configuration config) { + exists(Node mid | + nodeCandFwd2(mid, fromArg, true, config) and + read(mid, f, node) and + readCand1(f, unbind(config)) + ) +} + /** * Holds if `node` is part of a path from a source to a sink in the given * configuration taking simple call contexts into consideration. @@ -742,10 +768,9 @@ private predicate nodeCand2(Node node, boolean toReturn, boolean stored, Configu ) or // store - exists(Node mid, Content f | - store(node, f, mid) and - readCand2(f, unbind(config)) and - nodeCand2(mid, toReturn, true, config) and + exists(Content f | + nodeCand2Store(f, node, toReturn, config) and + readCand2(f, config) and (stored = false or stored = true) ) or @@ -776,6 +801,7 @@ private predicate nodeCand2(Node node, boolean toReturn, boolean stored, Configu /** * Holds if `f` is the target of a read in the flow covered by `nodeCand2`. */ +pragma[noinline] private predicate readCand2(Content f, Configuration config) { exists(Node mid, Node node | useFieldFlow(config) and @@ -786,16 +812,21 @@ private predicate readCand2(Content f, Configuration config) { ) } -pragma[nomagic] -private predicate storeCand(Content f, Configuration conf) { - exists(Node n1, Node n2 | - store(n1, f, n2) and - nodeCand2(n1, _, _, conf) and - nodeCand2(n2, _, _, unbind(conf)) +pragma[noinline] +private predicate nodeCand2Store(Content f, Node node, boolean toReturn, Configuration config) { + exists(Node mid | + store(node, f, mid) and + nodeCand2(mid, toReturn, true, config) ) } -private predicate readCand(Content f, Configuration conf) { readCand2(f, conf) } +pragma[nomagic] +private predicate storeCand(Content f, Configuration conf) { + exists(Node node | + nodeCand2Store(f, node, _, conf) and + nodeCand2(node, _, _, conf) + ) +} /** * Holds if `f` is the target of both a store and a read in the path graph @@ -804,7 +835,7 @@ private predicate readCand(Content f, Configuration conf) { readCand2(f, conf) } pragma[noinline] private predicate readStoreCand(Content f, Configuration conf) { storeCand(f, conf) and - readCand(f, conf) + readCand2(f, conf) } private predicate nodeCand(Node node, Configuration config) { nodeCand2(node, _, _, config) } @@ -1030,15 +1061,13 @@ private predicate flowCandFwd0(Node node, boolean fromArg, AccessPathFront apf, apf.headUsesContent(f) ) or - exists(Node mid, Content f, AccessPathFront apf0 | - flowCandFwd(mid, fromArg, apf0, config) and - read(mid, f, node) and - nodeCand(node, config) and - apf0.headUsesContent(f) and - consCandFwd(f, apf, unbind(config)) + exists(Content f | + flowCandFwdRead(f, node, fromArg, config) and + consCandFwd(f, apf, config) ) } +pragma[noinline] private predicate consCandFwd(Content f, AccessPathFront apf, Configuration config) { exists(Node mid, Node n | flowCandFwd(mid, _, apf, config) and @@ -1049,6 +1078,16 @@ private predicate consCandFwd(Content f, AccessPathFront apf, Configuration conf ) } +pragma[nomagic] +private predicate flowCandFwdRead(Content f, Node node, boolean fromArg, Configuration config) { + exists(Node mid, AccessPathFront apf | + flowCandFwd(mid, fromArg, apf, config) and + read(mid, f, node) and + apf.headUsesContent(f) and + nodeCand(node, unbind(config)) + ) +} + /** * Holds if data can flow from a source to `node` with the given `apf` and * from there flow to a sink. @@ -1139,6 +1178,7 @@ private predicate flowCandRead( ) } +pragma[nomagic] private predicate flowCandStore( Node node, Content f, boolean toReturn, AccessPathFront apf0, Configuration config ) { @@ -1148,6 +1188,7 @@ private predicate flowCandStore( ) } +pragma[noinline] private predicate consCand(Content f, AccessPathFront apf, Configuration config) { consCandFwd(f, apf, config) and exists(Node n, AccessPathFront apf0 | @@ -1672,6 +1713,7 @@ private predicate pathStep(PathNodeMid mid, Node node, CallContext cc, AccessPat valuePathThroughCallable(mid, node, cc) and ap = mid.getAp() } +pragma[noinline] private predicate contentReadStep(PathNodeMid mid, Node node, AccessPath ap) { exists(Content f, AccessPath ap0 | ap0 = mid.getAp() and diff --git a/cpp/ql/src/semmle/code/cpp/dataflow/internal/DataFlowImpl2.qll b/cpp/ql/src/semmle/code/cpp/dataflow/internal/DataFlowImpl2.qll index 796c20b35e3..931ab2e63f1 100644 --- a/cpp/ql/src/semmle/code/cpp/dataflow/internal/DataFlowImpl2.qll +++ b/cpp/ql/src/semmle/code/cpp/dataflow/internal/DataFlowImpl2.qll @@ -278,10 +278,9 @@ private predicate nodeCandFwd1(Node node, boolean stored, Configuration config) ) or // read - exists(Node mid, Content f | - nodeCandFwd1(mid, true, config) and - read(mid, f, node) and - storeCandFwd1(f, unbind(config)) and + exists(Content f | + nodeCandFwd1Read(f, node, config) and + storeCandFwd1(f, config) and (stored = false or stored = true) and not inBarrier(node, config) ) @@ -308,9 +307,18 @@ private predicate nodeCandFwd1(Node node, boolean stored, Configuration config) ) } +pragma[nomagic] +private predicate nodeCandFwd1Read(Content f, Node node, Configuration config) { + exists(Node mid | + nodeCandFwd1(mid, true, config) and + read(mid, f, node) + ) +} + /** * Holds if `f` is the target of a store in the flow covered by `nodeCandFwd1`. */ +pragma[noinline] private predicate storeCandFwd1(Content f, Configuration config) { exists(Node mid, Node node | not fullBarrier(node, config) and @@ -358,10 +366,9 @@ private predicate nodeCand1(Node node, boolean stored, Configuration config) { ) or // store - exists(Node mid, Content f | - store(node, f, mid) and - readCand1(f, unbind(config)) and - nodeCand1(mid, true, config) and + exists(Content f | + nodeCand1Store(f, node, config) and + readCand1(f, config) and (stored = false or stored = true) ) or @@ -398,6 +405,7 @@ private predicate nodeCand1(Node node, boolean stored, Configuration config) { /** * Holds if `f` is the target of a read in the flow covered by `nodeCand1`. */ +pragma[noinline] private predicate readCand1(Content f, Configuration config) { exists(Node mid, Node node | useFieldFlow(config) and @@ -408,6 +416,15 @@ private predicate readCand1(Content f, Configuration config) { ) } +pragma[nomagic] +private predicate nodeCand1Store(Content f, Node node, Configuration config) { + exists(Node mid | + nodeCand1(mid, true, config) and + storeCandFwd1(f, unbind(config)) and + store(node, f, mid) + ) +} + private predicate throughFlowNodeCand(Node node, Configuration config) { nodeCand1(node, false, config) and not fullBarrier(node, config) and @@ -669,10 +686,9 @@ private predicate nodeCandFwd2(Node node, boolean fromArg, boolean stored, Confi ) or // read - exists(Node mid, Content f | - nodeCandFwd2(mid, fromArg, true, config) and - read(mid, f, node) and - storeCandFwd2(f, unbind(config)) and + exists(Content f | + nodeCandFwd2Read(f, node, fromArg, config) and + storeCandFwd2(f, config) and (stored = false or stored = true) ) or @@ -695,6 +711,7 @@ private predicate nodeCandFwd2(Node node, boolean fromArg, boolean stored, Confi /** * Holds if `f` is the target of a store in the flow covered by `nodeCandFwd2`. */ +pragma[noinline] private predicate storeCandFwd2(Content f, Configuration config) { exists(Node mid, Node node | useFieldFlow(config) and @@ -705,6 +722,15 @@ private predicate storeCandFwd2(Content f, Configuration config) { ) } +pragma[nomagic] +private predicate nodeCandFwd2Read(Content f, Node node, boolean fromArg, Configuration config) { + exists(Node mid | + nodeCandFwd2(mid, fromArg, true, config) and + read(mid, f, node) and + readCand1(f, unbind(config)) + ) +} + /** * Holds if `node` is part of a path from a source to a sink in the given * configuration taking simple call contexts into consideration. @@ -742,10 +768,9 @@ private predicate nodeCand2(Node node, boolean toReturn, boolean stored, Configu ) or // store - exists(Node mid, Content f | - store(node, f, mid) and - readCand2(f, unbind(config)) and - nodeCand2(mid, toReturn, true, config) and + exists(Content f | + nodeCand2Store(f, node, toReturn, config) and + readCand2(f, config) and (stored = false or stored = true) ) or @@ -776,6 +801,7 @@ private predicate nodeCand2(Node node, boolean toReturn, boolean stored, Configu /** * Holds if `f` is the target of a read in the flow covered by `nodeCand2`. */ +pragma[noinline] private predicate readCand2(Content f, Configuration config) { exists(Node mid, Node node | useFieldFlow(config) and @@ -786,16 +812,21 @@ private predicate readCand2(Content f, Configuration config) { ) } -pragma[nomagic] -private predicate storeCand(Content f, Configuration conf) { - exists(Node n1, Node n2 | - store(n1, f, n2) and - nodeCand2(n1, _, _, conf) and - nodeCand2(n2, _, _, unbind(conf)) +pragma[noinline] +private predicate nodeCand2Store(Content f, Node node, boolean toReturn, Configuration config) { + exists(Node mid | + store(node, f, mid) and + nodeCand2(mid, toReturn, true, config) ) } -private predicate readCand(Content f, Configuration conf) { readCand2(f, conf) } +pragma[nomagic] +private predicate storeCand(Content f, Configuration conf) { + exists(Node node | + nodeCand2Store(f, node, _, conf) and + nodeCand2(node, _, _, conf) + ) +} /** * Holds if `f` is the target of both a store and a read in the path graph @@ -804,7 +835,7 @@ private predicate readCand(Content f, Configuration conf) { readCand2(f, conf) } pragma[noinline] private predicate readStoreCand(Content f, Configuration conf) { storeCand(f, conf) and - readCand(f, conf) + readCand2(f, conf) } private predicate nodeCand(Node node, Configuration config) { nodeCand2(node, _, _, config) } @@ -1030,15 +1061,13 @@ private predicate flowCandFwd0(Node node, boolean fromArg, AccessPathFront apf, apf.headUsesContent(f) ) or - exists(Node mid, Content f, AccessPathFront apf0 | - flowCandFwd(mid, fromArg, apf0, config) and - read(mid, f, node) and - nodeCand(node, config) and - apf0.headUsesContent(f) and - consCandFwd(f, apf, unbind(config)) + exists(Content f | + flowCandFwdRead(f, node, fromArg, config) and + consCandFwd(f, apf, config) ) } +pragma[noinline] private predicate consCandFwd(Content f, AccessPathFront apf, Configuration config) { exists(Node mid, Node n | flowCandFwd(mid, _, apf, config) and @@ -1049,6 +1078,16 @@ private predicate consCandFwd(Content f, AccessPathFront apf, Configuration conf ) } +pragma[nomagic] +private predicate flowCandFwdRead(Content f, Node node, boolean fromArg, Configuration config) { + exists(Node mid, AccessPathFront apf | + flowCandFwd(mid, fromArg, apf, config) and + read(mid, f, node) and + apf.headUsesContent(f) and + nodeCand(node, unbind(config)) + ) +} + /** * Holds if data can flow from a source to `node` with the given `apf` and * from there flow to a sink. @@ -1139,6 +1178,7 @@ private predicate flowCandRead( ) } +pragma[nomagic] private predicate flowCandStore( Node node, Content f, boolean toReturn, AccessPathFront apf0, Configuration config ) { @@ -1148,6 +1188,7 @@ private predicate flowCandStore( ) } +pragma[noinline] private predicate consCand(Content f, AccessPathFront apf, Configuration config) { consCandFwd(f, apf, config) and exists(Node n, AccessPathFront apf0 | @@ -1672,6 +1713,7 @@ private predicate pathStep(PathNodeMid mid, Node node, CallContext cc, AccessPat valuePathThroughCallable(mid, node, cc) and ap = mid.getAp() } +pragma[noinline] private predicate contentReadStep(PathNodeMid mid, Node node, AccessPath ap) { exists(Content f, AccessPath ap0 | ap0 = mid.getAp() and diff --git a/cpp/ql/src/semmle/code/cpp/dataflow/internal/DataFlowImpl3.qll b/cpp/ql/src/semmle/code/cpp/dataflow/internal/DataFlowImpl3.qll index 796c20b35e3..931ab2e63f1 100644 --- a/cpp/ql/src/semmle/code/cpp/dataflow/internal/DataFlowImpl3.qll +++ b/cpp/ql/src/semmle/code/cpp/dataflow/internal/DataFlowImpl3.qll @@ -278,10 +278,9 @@ private predicate nodeCandFwd1(Node node, boolean stored, Configuration config) ) or // read - exists(Node mid, Content f | - nodeCandFwd1(mid, true, config) and - read(mid, f, node) and - storeCandFwd1(f, unbind(config)) and + exists(Content f | + nodeCandFwd1Read(f, node, config) and + storeCandFwd1(f, config) and (stored = false or stored = true) and not inBarrier(node, config) ) @@ -308,9 +307,18 @@ private predicate nodeCandFwd1(Node node, boolean stored, Configuration config) ) } +pragma[nomagic] +private predicate nodeCandFwd1Read(Content f, Node node, Configuration config) { + exists(Node mid | + nodeCandFwd1(mid, true, config) and + read(mid, f, node) + ) +} + /** * Holds if `f` is the target of a store in the flow covered by `nodeCandFwd1`. */ +pragma[noinline] private predicate storeCandFwd1(Content f, Configuration config) { exists(Node mid, Node node | not fullBarrier(node, config) and @@ -358,10 +366,9 @@ private predicate nodeCand1(Node node, boolean stored, Configuration config) { ) or // store - exists(Node mid, Content f | - store(node, f, mid) and - readCand1(f, unbind(config)) and - nodeCand1(mid, true, config) and + exists(Content f | + nodeCand1Store(f, node, config) and + readCand1(f, config) and (stored = false or stored = true) ) or @@ -398,6 +405,7 @@ private predicate nodeCand1(Node node, boolean stored, Configuration config) { /** * Holds if `f` is the target of a read in the flow covered by `nodeCand1`. */ +pragma[noinline] private predicate readCand1(Content f, Configuration config) { exists(Node mid, Node node | useFieldFlow(config) and @@ -408,6 +416,15 @@ private predicate readCand1(Content f, Configuration config) { ) } +pragma[nomagic] +private predicate nodeCand1Store(Content f, Node node, Configuration config) { + exists(Node mid | + nodeCand1(mid, true, config) and + storeCandFwd1(f, unbind(config)) and + store(node, f, mid) + ) +} + private predicate throughFlowNodeCand(Node node, Configuration config) { nodeCand1(node, false, config) and not fullBarrier(node, config) and @@ -669,10 +686,9 @@ private predicate nodeCandFwd2(Node node, boolean fromArg, boolean stored, Confi ) or // read - exists(Node mid, Content f | - nodeCandFwd2(mid, fromArg, true, config) and - read(mid, f, node) and - storeCandFwd2(f, unbind(config)) and + exists(Content f | + nodeCandFwd2Read(f, node, fromArg, config) and + storeCandFwd2(f, config) and (stored = false or stored = true) ) or @@ -695,6 +711,7 @@ private predicate nodeCandFwd2(Node node, boolean fromArg, boolean stored, Confi /** * Holds if `f` is the target of a store in the flow covered by `nodeCandFwd2`. */ +pragma[noinline] private predicate storeCandFwd2(Content f, Configuration config) { exists(Node mid, Node node | useFieldFlow(config) and @@ -705,6 +722,15 @@ private predicate storeCandFwd2(Content f, Configuration config) { ) } +pragma[nomagic] +private predicate nodeCandFwd2Read(Content f, Node node, boolean fromArg, Configuration config) { + exists(Node mid | + nodeCandFwd2(mid, fromArg, true, config) and + read(mid, f, node) and + readCand1(f, unbind(config)) + ) +} + /** * Holds if `node` is part of a path from a source to a sink in the given * configuration taking simple call contexts into consideration. @@ -742,10 +768,9 @@ private predicate nodeCand2(Node node, boolean toReturn, boolean stored, Configu ) or // store - exists(Node mid, Content f | - store(node, f, mid) and - readCand2(f, unbind(config)) and - nodeCand2(mid, toReturn, true, config) and + exists(Content f | + nodeCand2Store(f, node, toReturn, config) and + readCand2(f, config) and (stored = false or stored = true) ) or @@ -776,6 +801,7 @@ private predicate nodeCand2(Node node, boolean toReturn, boolean stored, Configu /** * Holds if `f` is the target of a read in the flow covered by `nodeCand2`. */ +pragma[noinline] private predicate readCand2(Content f, Configuration config) { exists(Node mid, Node node | useFieldFlow(config) and @@ -786,16 +812,21 @@ private predicate readCand2(Content f, Configuration config) { ) } -pragma[nomagic] -private predicate storeCand(Content f, Configuration conf) { - exists(Node n1, Node n2 | - store(n1, f, n2) and - nodeCand2(n1, _, _, conf) and - nodeCand2(n2, _, _, unbind(conf)) +pragma[noinline] +private predicate nodeCand2Store(Content f, Node node, boolean toReturn, Configuration config) { + exists(Node mid | + store(node, f, mid) and + nodeCand2(mid, toReturn, true, config) ) } -private predicate readCand(Content f, Configuration conf) { readCand2(f, conf) } +pragma[nomagic] +private predicate storeCand(Content f, Configuration conf) { + exists(Node node | + nodeCand2Store(f, node, _, conf) and + nodeCand2(node, _, _, conf) + ) +} /** * Holds if `f` is the target of both a store and a read in the path graph @@ -804,7 +835,7 @@ private predicate readCand(Content f, Configuration conf) { readCand2(f, conf) } pragma[noinline] private predicate readStoreCand(Content f, Configuration conf) { storeCand(f, conf) and - readCand(f, conf) + readCand2(f, conf) } private predicate nodeCand(Node node, Configuration config) { nodeCand2(node, _, _, config) } @@ -1030,15 +1061,13 @@ private predicate flowCandFwd0(Node node, boolean fromArg, AccessPathFront apf, apf.headUsesContent(f) ) or - exists(Node mid, Content f, AccessPathFront apf0 | - flowCandFwd(mid, fromArg, apf0, config) and - read(mid, f, node) and - nodeCand(node, config) and - apf0.headUsesContent(f) and - consCandFwd(f, apf, unbind(config)) + exists(Content f | + flowCandFwdRead(f, node, fromArg, config) and + consCandFwd(f, apf, config) ) } +pragma[noinline] private predicate consCandFwd(Content f, AccessPathFront apf, Configuration config) { exists(Node mid, Node n | flowCandFwd(mid, _, apf, config) and @@ -1049,6 +1078,16 @@ private predicate consCandFwd(Content f, AccessPathFront apf, Configuration conf ) } +pragma[nomagic] +private predicate flowCandFwdRead(Content f, Node node, boolean fromArg, Configuration config) { + exists(Node mid, AccessPathFront apf | + flowCandFwd(mid, fromArg, apf, config) and + read(mid, f, node) and + apf.headUsesContent(f) and + nodeCand(node, unbind(config)) + ) +} + /** * Holds if data can flow from a source to `node` with the given `apf` and * from there flow to a sink. @@ -1139,6 +1178,7 @@ private predicate flowCandRead( ) } +pragma[nomagic] private predicate flowCandStore( Node node, Content f, boolean toReturn, AccessPathFront apf0, Configuration config ) { @@ -1148,6 +1188,7 @@ private predicate flowCandStore( ) } +pragma[noinline] private predicate consCand(Content f, AccessPathFront apf, Configuration config) { consCandFwd(f, apf, config) and exists(Node n, AccessPathFront apf0 | @@ -1672,6 +1713,7 @@ private predicate pathStep(PathNodeMid mid, Node node, CallContext cc, AccessPat valuePathThroughCallable(mid, node, cc) and ap = mid.getAp() } +pragma[noinline] private predicate contentReadStep(PathNodeMid mid, Node node, AccessPath ap) { exists(Content f, AccessPath ap0 | ap0 = mid.getAp() and diff --git a/cpp/ql/src/semmle/code/cpp/dataflow/internal/DataFlowImpl4.qll b/cpp/ql/src/semmle/code/cpp/dataflow/internal/DataFlowImpl4.qll index 796c20b35e3..931ab2e63f1 100644 --- a/cpp/ql/src/semmle/code/cpp/dataflow/internal/DataFlowImpl4.qll +++ b/cpp/ql/src/semmle/code/cpp/dataflow/internal/DataFlowImpl4.qll @@ -278,10 +278,9 @@ private predicate nodeCandFwd1(Node node, boolean stored, Configuration config) ) or // read - exists(Node mid, Content f | - nodeCandFwd1(mid, true, config) and - read(mid, f, node) and - storeCandFwd1(f, unbind(config)) and + exists(Content f | + nodeCandFwd1Read(f, node, config) and + storeCandFwd1(f, config) and (stored = false or stored = true) and not inBarrier(node, config) ) @@ -308,9 +307,18 @@ private predicate nodeCandFwd1(Node node, boolean stored, Configuration config) ) } +pragma[nomagic] +private predicate nodeCandFwd1Read(Content f, Node node, Configuration config) { + exists(Node mid | + nodeCandFwd1(mid, true, config) and + read(mid, f, node) + ) +} + /** * Holds if `f` is the target of a store in the flow covered by `nodeCandFwd1`. */ +pragma[noinline] private predicate storeCandFwd1(Content f, Configuration config) { exists(Node mid, Node node | not fullBarrier(node, config) and @@ -358,10 +366,9 @@ private predicate nodeCand1(Node node, boolean stored, Configuration config) { ) or // store - exists(Node mid, Content f | - store(node, f, mid) and - readCand1(f, unbind(config)) and - nodeCand1(mid, true, config) and + exists(Content f | + nodeCand1Store(f, node, config) and + readCand1(f, config) and (stored = false or stored = true) ) or @@ -398,6 +405,7 @@ private predicate nodeCand1(Node node, boolean stored, Configuration config) { /** * Holds if `f` is the target of a read in the flow covered by `nodeCand1`. */ +pragma[noinline] private predicate readCand1(Content f, Configuration config) { exists(Node mid, Node node | useFieldFlow(config) and @@ -408,6 +416,15 @@ private predicate readCand1(Content f, Configuration config) { ) } +pragma[nomagic] +private predicate nodeCand1Store(Content f, Node node, Configuration config) { + exists(Node mid | + nodeCand1(mid, true, config) and + storeCandFwd1(f, unbind(config)) and + store(node, f, mid) + ) +} + private predicate throughFlowNodeCand(Node node, Configuration config) { nodeCand1(node, false, config) and not fullBarrier(node, config) and @@ -669,10 +686,9 @@ private predicate nodeCandFwd2(Node node, boolean fromArg, boolean stored, Confi ) or // read - exists(Node mid, Content f | - nodeCandFwd2(mid, fromArg, true, config) and - read(mid, f, node) and - storeCandFwd2(f, unbind(config)) and + exists(Content f | + nodeCandFwd2Read(f, node, fromArg, config) and + storeCandFwd2(f, config) and (stored = false or stored = true) ) or @@ -695,6 +711,7 @@ private predicate nodeCandFwd2(Node node, boolean fromArg, boolean stored, Confi /** * Holds if `f` is the target of a store in the flow covered by `nodeCandFwd2`. */ +pragma[noinline] private predicate storeCandFwd2(Content f, Configuration config) { exists(Node mid, Node node | useFieldFlow(config) and @@ -705,6 +722,15 @@ private predicate storeCandFwd2(Content f, Configuration config) { ) } +pragma[nomagic] +private predicate nodeCandFwd2Read(Content f, Node node, boolean fromArg, Configuration config) { + exists(Node mid | + nodeCandFwd2(mid, fromArg, true, config) and + read(mid, f, node) and + readCand1(f, unbind(config)) + ) +} + /** * Holds if `node` is part of a path from a source to a sink in the given * configuration taking simple call contexts into consideration. @@ -742,10 +768,9 @@ private predicate nodeCand2(Node node, boolean toReturn, boolean stored, Configu ) or // store - exists(Node mid, Content f | - store(node, f, mid) and - readCand2(f, unbind(config)) and - nodeCand2(mid, toReturn, true, config) and + exists(Content f | + nodeCand2Store(f, node, toReturn, config) and + readCand2(f, config) and (stored = false or stored = true) ) or @@ -776,6 +801,7 @@ private predicate nodeCand2(Node node, boolean toReturn, boolean stored, Configu /** * Holds if `f` is the target of a read in the flow covered by `nodeCand2`. */ +pragma[noinline] private predicate readCand2(Content f, Configuration config) { exists(Node mid, Node node | useFieldFlow(config) and @@ -786,16 +812,21 @@ private predicate readCand2(Content f, Configuration config) { ) } -pragma[nomagic] -private predicate storeCand(Content f, Configuration conf) { - exists(Node n1, Node n2 | - store(n1, f, n2) and - nodeCand2(n1, _, _, conf) and - nodeCand2(n2, _, _, unbind(conf)) +pragma[noinline] +private predicate nodeCand2Store(Content f, Node node, boolean toReturn, Configuration config) { + exists(Node mid | + store(node, f, mid) and + nodeCand2(mid, toReturn, true, config) ) } -private predicate readCand(Content f, Configuration conf) { readCand2(f, conf) } +pragma[nomagic] +private predicate storeCand(Content f, Configuration conf) { + exists(Node node | + nodeCand2Store(f, node, _, conf) and + nodeCand2(node, _, _, conf) + ) +} /** * Holds if `f` is the target of both a store and a read in the path graph @@ -804,7 +835,7 @@ private predicate readCand(Content f, Configuration conf) { readCand2(f, conf) } pragma[noinline] private predicate readStoreCand(Content f, Configuration conf) { storeCand(f, conf) and - readCand(f, conf) + readCand2(f, conf) } private predicate nodeCand(Node node, Configuration config) { nodeCand2(node, _, _, config) } @@ -1030,15 +1061,13 @@ private predicate flowCandFwd0(Node node, boolean fromArg, AccessPathFront apf, apf.headUsesContent(f) ) or - exists(Node mid, Content f, AccessPathFront apf0 | - flowCandFwd(mid, fromArg, apf0, config) and - read(mid, f, node) and - nodeCand(node, config) and - apf0.headUsesContent(f) and - consCandFwd(f, apf, unbind(config)) + exists(Content f | + flowCandFwdRead(f, node, fromArg, config) and + consCandFwd(f, apf, config) ) } +pragma[noinline] private predicate consCandFwd(Content f, AccessPathFront apf, Configuration config) { exists(Node mid, Node n | flowCandFwd(mid, _, apf, config) and @@ -1049,6 +1078,16 @@ private predicate consCandFwd(Content f, AccessPathFront apf, Configuration conf ) } +pragma[nomagic] +private predicate flowCandFwdRead(Content f, Node node, boolean fromArg, Configuration config) { + exists(Node mid, AccessPathFront apf | + flowCandFwd(mid, fromArg, apf, config) and + read(mid, f, node) and + apf.headUsesContent(f) and + nodeCand(node, unbind(config)) + ) +} + /** * Holds if data can flow from a source to `node` with the given `apf` and * from there flow to a sink. @@ -1139,6 +1178,7 @@ private predicate flowCandRead( ) } +pragma[nomagic] private predicate flowCandStore( Node node, Content f, boolean toReturn, AccessPathFront apf0, Configuration config ) { @@ -1148,6 +1188,7 @@ private predicate flowCandStore( ) } +pragma[noinline] private predicate consCand(Content f, AccessPathFront apf, Configuration config) { consCandFwd(f, apf, config) and exists(Node n, AccessPathFront apf0 | @@ -1672,6 +1713,7 @@ private predicate pathStep(PathNodeMid mid, Node node, CallContext cc, AccessPat valuePathThroughCallable(mid, node, cc) and ap = mid.getAp() } +pragma[noinline] private predicate contentReadStep(PathNodeMid mid, Node node, AccessPath ap) { exists(Content f, AccessPath ap0 | ap0 = mid.getAp() and diff --git a/cpp/ql/src/semmle/code/cpp/ir/dataflow/internal/DataFlowImpl.qll b/cpp/ql/src/semmle/code/cpp/ir/dataflow/internal/DataFlowImpl.qll index 796c20b35e3..931ab2e63f1 100644 --- a/cpp/ql/src/semmle/code/cpp/ir/dataflow/internal/DataFlowImpl.qll +++ b/cpp/ql/src/semmle/code/cpp/ir/dataflow/internal/DataFlowImpl.qll @@ -278,10 +278,9 @@ private predicate nodeCandFwd1(Node node, boolean stored, Configuration config) ) or // read - exists(Node mid, Content f | - nodeCandFwd1(mid, true, config) and - read(mid, f, node) and - storeCandFwd1(f, unbind(config)) and + exists(Content f | + nodeCandFwd1Read(f, node, config) and + storeCandFwd1(f, config) and (stored = false or stored = true) and not inBarrier(node, config) ) @@ -308,9 +307,18 @@ private predicate nodeCandFwd1(Node node, boolean stored, Configuration config) ) } +pragma[nomagic] +private predicate nodeCandFwd1Read(Content f, Node node, Configuration config) { + exists(Node mid | + nodeCandFwd1(mid, true, config) and + read(mid, f, node) + ) +} + /** * Holds if `f` is the target of a store in the flow covered by `nodeCandFwd1`. */ +pragma[noinline] private predicate storeCandFwd1(Content f, Configuration config) { exists(Node mid, Node node | not fullBarrier(node, config) and @@ -358,10 +366,9 @@ private predicate nodeCand1(Node node, boolean stored, Configuration config) { ) or // store - exists(Node mid, Content f | - store(node, f, mid) and - readCand1(f, unbind(config)) and - nodeCand1(mid, true, config) and + exists(Content f | + nodeCand1Store(f, node, config) and + readCand1(f, config) and (stored = false or stored = true) ) or @@ -398,6 +405,7 @@ private predicate nodeCand1(Node node, boolean stored, Configuration config) { /** * Holds if `f` is the target of a read in the flow covered by `nodeCand1`. */ +pragma[noinline] private predicate readCand1(Content f, Configuration config) { exists(Node mid, Node node | useFieldFlow(config) and @@ -408,6 +416,15 @@ private predicate readCand1(Content f, Configuration config) { ) } +pragma[nomagic] +private predicate nodeCand1Store(Content f, Node node, Configuration config) { + exists(Node mid | + nodeCand1(mid, true, config) and + storeCandFwd1(f, unbind(config)) and + store(node, f, mid) + ) +} + private predicate throughFlowNodeCand(Node node, Configuration config) { nodeCand1(node, false, config) and not fullBarrier(node, config) and @@ -669,10 +686,9 @@ private predicate nodeCandFwd2(Node node, boolean fromArg, boolean stored, Confi ) or // read - exists(Node mid, Content f | - nodeCandFwd2(mid, fromArg, true, config) and - read(mid, f, node) and - storeCandFwd2(f, unbind(config)) and + exists(Content f | + nodeCandFwd2Read(f, node, fromArg, config) and + storeCandFwd2(f, config) and (stored = false or stored = true) ) or @@ -695,6 +711,7 @@ private predicate nodeCandFwd2(Node node, boolean fromArg, boolean stored, Confi /** * Holds if `f` is the target of a store in the flow covered by `nodeCandFwd2`. */ +pragma[noinline] private predicate storeCandFwd2(Content f, Configuration config) { exists(Node mid, Node node | useFieldFlow(config) and @@ -705,6 +722,15 @@ private predicate storeCandFwd2(Content f, Configuration config) { ) } +pragma[nomagic] +private predicate nodeCandFwd2Read(Content f, Node node, boolean fromArg, Configuration config) { + exists(Node mid | + nodeCandFwd2(mid, fromArg, true, config) and + read(mid, f, node) and + readCand1(f, unbind(config)) + ) +} + /** * Holds if `node` is part of a path from a source to a sink in the given * configuration taking simple call contexts into consideration. @@ -742,10 +768,9 @@ private predicate nodeCand2(Node node, boolean toReturn, boolean stored, Configu ) or // store - exists(Node mid, Content f | - store(node, f, mid) and - readCand2(f, unbind(config)) and - nodeCand2(mid, toReturn, true, config) and + exists(Content f | + nodeCand2Store(f, node, toReturn, config) and + readCand2(f, config) and (stored = false or stored = true) ) or @@ -776,6 +801,7 @@ private predicate nodeCand2(Node node, boolean toReturn, boolean stored, Configu /** * Holds if `f` is the target of a read in the flow covered by `nodeCand2`. */ +pragma[noinline] private predicate readCand2(Content f, Configuration config) { exists(Node mid, Node node | useFieldFlow(config) and @@ -786,16 +812,21 @@ private predicate readCand2(Content f, Configuration config) { ) } -pragma[nomagic] -private predicate storeCand(Content f, Configuration conf) { - exists(Node n1, Node n2 | - store(n1, f, n2) and - nodeCand2(n1, _, _, conf) and - nodeCand2(n2, _, _, unbind(conf)) +pragma[noinline] +private predicate nodeCand2Store(Content f, Node node, boolean toReturn, Configuration config) { + exists(Node mid | + store(node, f, mid) and + nodeCand2(mid, toReturn, true, config) ) } -private predicate readCand(Content f, Configuration conf) { readCand2(f, conf) } +pragma[nomagic] +private predicate storeCand(Content f, Configuration conf) { + exists(Node node | + nodeCand2Store(f, node, _, conf) and + nodeCand2(node, _, _, conf) + ) +} /** * Holds if `f` is the target of both a store and a read in the path graph @@ -804,7 +835,7 @@ private predicate readCand(Content f, Configuration conf) { readCand2(f, conf) } pragma[noinline] private predicate readStoreCand(Content f, Configuration conf) { storeCand(f, conf) and - readCand(f, conf) + readCand2(f, conf) } private predicate nodeCand(Node node, Configuration config) { nodeCand2(node, _, _, config) } @@ -1030,15 +1061,13 @@ private predicate flowCandFwd0(Node node, boolean fromArg, AccessPathFront apf, apf.headUsesContent(f) ) or - exists(Node mid, Content f, AccessPathFront apf0 | - flowCandFwd(mid, fromArg, apf0, config) and - read(mid, f, node) and - nodeCand(node, config) and - apf0.headUsesContent(f) and - consCandFwd(f, apf, unbind(config)) + exists(Content f | + flowCandFwdRead(f, node, fromArg, config) and + consCandFwd(f, apf, config) ) } +pragma[noinline] private predicate consCandFwd(Content f, AccessPathFront apf, Configuration config) { exists(Node mid, Node n | flowCandFwd(mid, _, apf, config) and @@ -1049,6 +1078,16 @@ private predicate consCandFwd(Content f, AccessPathFront apf, Configuration conf ) } +pragma[nomagic] +private predicate flowCandFwdRead(Content f, Node node, boolean fromArg, Configuration config) { + exists(Node mid, AccessPathFront apf | + flowCandFwd(mid, fromArg, apf, config) and + read(mid, f, node) and + apf.headUsesContent(f) and + nodeCand(node, unbind(config)) + ) +} + /** * Holds if data can flow from a source to `node` with the given `apf` and * from there flow to a sink. @@ -1139,6 +1178,7 @@ private predicate flowCandRead( ) } +pragma[nomagic] private predicate flowCandStore( Node node, Content f, boolean toReturn, AccessPathFront apf0, Configuration config ) { @@ -1148,6 +1188,7 @@ private predicate flowCandStore( ) } +pragma[noinline] private predicate consCand(Content f, AccessPathFront apf, Configuration config) { consCandFwd(f, apf, config) and exists(Node n, AccessPathFront apf0 | @@ -1672,6 +1713,7 @@ private predicate pathStep(PathNodeMid mid, Node node, CallContext cc, AccessPat valuePathThroughCallable(mid, node, cc) and ap = mid.getAp() } +pragma[noinline] private predicate contentReadStep(PathNodeMid mid, Node node, AccessPath ap) { exists(Content f, AccessPath ap0 | ap0 = mid.getAp() and diff --git a/cpp/ql/src/semmle/code/cpp/ir/dataflow/internal/DataFlowImpl2.qll b/cpp/ql/src/semmle/code/cpp/ir/dataflow/internal/DataFlowImpl2.qll index 796c20b35e3..931ab2e63f1 100644 --- a/cpp/ql/src/semmle/code/cpp/ir/dataflow/internal/DataFlowImpl2.qll +++ b/cpp/ql/src/semmle/code/cpp/ir/dataflow/internal/DataFlowImpl2.qll @@ -278,10 +278,9 @@ private predicate nodeCandFwd1(Node node, boolean stored, Configuration config) ) or // read - exists(Node mid, Content f | - nodeCandFwd1(mid, true, config) and - read(mid, f, node) and - storeCandFwd1(f, unbind(config)) and + exists(Content f | + nodeCandFwd1Read(f, node, config) and + storeCandFwd1(f, config) and (stored = false or stored = true) and not inBarrier(node, config) ) @@ -308,9 +307,18 @@ private predicate nodeCandFwd1(Node node, boolean stored, Configuration config) ) } +pragma[nomagic] +private predicate nodeCandFwd1Read(Content f, Node node, Configuration config) { + exists(Node mid | + nodeCandFwd1(mid, true, config) and + read(mid, f, node) + ) +} + /** * Holds if `f` is the target of a store in the flow covered by `nodeCandFwd1`. */ +pragma[noinline] private predicate storeCandFwd1(Content f, Configuration config) { exists(Node mid, Node node | not fullBarrier(node, config) and @@ -358,10 +366,9 @@ private predicate nodeCand1(Node node, boolean stored, Configuration config) { ) or // store - exists(Node mid, Content f | - store(node, f, mid) and - readCand1(f, unbind(config)) and - nodeCand1(mid, true, config) and + exists(Content f | + nodeCand1Store(f, node, config) and + readCand1(f, config) and (stored = false or stored = true) ) or @@ -398,6 +405,7 @@ private predicate nodeCand1(Node node, boolean stored, Configuration config) { /** * Holds if `f` is the target of a read in the flow covered by `nodeCand1`. */ +pragma[noinline] private predicate readCand1(Content f, Configuration config) { exists(Node mid, Node node | useFieldFlow(config) and @@ -408,6 +416,15 @@ private predicate readCand1(Content f, Configuration config) { ) } +pragma[nomagic] +private predicate nodeCand1Store(Content f, Node node, Configuration config) { + exists(Node mid | + nodeCand1(mid, true, config) and + storeCandFwd1(f, unbind(config)) and + store(node, f, mid) + ) +} + private predicate throughFlowNodeCand(Node node, Configuration config) { nodeCand1(node, false, config) and not fullBarrier(node, config) and @@ -669,10 +686,9 @@ private predicate nodeCandFwd2(Node node, boolean fromArg, boolean stored, Confi ) or // read - exists(Node mid, Content f | - nodeCandFwd2(mid, fromArg, true, config) and - read(mid, f, node) and - storeCandFwd2(f, unbind(config)) and + exists(Content f | + nodeCandFwd2Read(f, node, fromArg, config) and + storeCandFwd2(f, config) and (stored = false or stored = true) ) or @@ -695,6 +711,7 @@ private predicate nodeCandFwd2(Node node, boolean fromArg, boolean stored, Confi /** * Holds if `f` is the target of a store in the flow covered by `nodeCandFwd2`. */ +pragma[noinline] private predicate storeCandFwd2(Content f, Configuration config) { exists(Node mid, Node node | useFieldFlow(config) and @@ -705,6 +722,15 @@ private predicate storeCandFwd2(Content f, Configuration config) { ) } +pragma[nomagic] +private predicate nodeCandFwd2Read(Content f, Node node, boolean fromArg, Configuration config) { + exists(Node mid | + nodeCandFwd2(mid, fromArg, true, config) and + read(mid, f, node) and + readCand1(f, unbind(config)) + ) +} + /** * Holds if `node` is part of a path from a source to a sink in the given * configuration taking simple call contexts into consideration. @@ -742,10 +768,9 @@ private predicate nodeCand2(Node node, boolean toReturn, boolean stored, Configu ) or // store - exists(Node mid, Content f | - store(node, f, mid) and - readCand2(f, unbind(config)) and - nodeCand2(mid, toReturn, true, config) and + exists(Content f | + nodeCand2Store(f, node, toReturn, config) and + readCand2(f, config) and (stored = false or stored = true) ) or @@ -776,6 +801,7 @@ private predicate nodeCand2(Node node, boolean toReturn, boolean stored, Configu /** * Holds if `f` is the target of a read in the flow covered by `nodeCand2`. */ +pragma[noinline] private predicate readCand2(Content f, Configuration config) { exists(Node mid, Node node | useFieldFlow(config) and @@ -786,16 +812,21 @@ private predicate readCand2(Content f, Configuration config) { ) } -pragma[nomagic] -private predicate storeCand(Content f, Configuration conf) { - exists(Node n1, Node n2 | - store(n1, f, n2) and - nodeCand2(n1, _, _, conf) and - nodeCand2(n2, _, _, unbind(conf)) +pragma[noinline] +private predicate nodeCand2Store(Content f, Node node, boolean toReturn, Configuration config) { + exists(Node mid | + store(node, f, mid) and + nodeCand2(mid, toReturn, true, config) ) } -private predicate readCand(Content f, Configuration conf) { readCand2(f, conf) } +pragma[nomagic] +private predicate storeCand(Content f, Configuration conf) { + exists(Node node | + nodeCand2Store(f, node, _, conf) and + nodeCand2(node, _, _, conf) + ) +} /** * Holds if `f` is the target of both a store and a read in the path graph @@ -804,7 +835,7 @@ private predicate readCand(Content f, Configuration conf) { readCand2(f, conf) } pragma[noinline] private predicate readStoreCand(Content f, Configuration conf) { storeCand(f, conf) and - readCand(f, conf) + readCand2(f, conf) } private predicate nodeCand(Node node, Configuration config) { nodeCand2(node, _, _, config) } @@ -1030,15 +1061,13 @@ private predicate flowCandFwd0(Node node, boolean fromArg, AccessPathFront apf, apf.headUsesContent(f) ) or - exists(Node mid, Content f, AccessPathFront apf0 | - flowCandFwd(mid, fromArg, apf0, config) and - read(mid, f, node) and - nodeCand(node, config) and - apf0.headUsesContent(f) and - consCandFwd(f, apf, unbind(config)) + exists(Content f | + flowCandFwdRead(f, node, fromArg, config) and + consCandFwd(f, apf, config) ) } +pragma[noinline] private predicate consCandFwd(Content f, AccessPathFront apf, Configuration config) { exists(Node mid, Node n | flowCandFwd(mid, _, apf, config) and @@ -1049,6 +1078,16 @@ private predicate consCandFwd(Content f, AccessPathFront apf, Configuration conf ) } +pragma[nomagic] +private predicate flowCandFwdRead(Content f, Node node, boolean fromArg, Configuration config) { + exists(Node mid, AccessPathFront apf | + flowCandFwd(mid, fromArg, apf, config) and + read(mid, f, node) and + apf.headUsesContent(f) and + nodeCand(node, unbind(config)) + ) +} + /** * Holds if data can flow from a source to `node` with the given `apf` and * from there flow to a sink. @@ -1139,6 +1178,7 @@ private predicate flowCandRead( ) } +pragma[nomagic] private predicate flowCandStore( Node node, Content f, boolean toReturn, AccessPathFront apf0, Configuration config ) { @@ -1148,6 +1188,7 @@ private predicate flowCandStore( ) } +pragma[noinline] private predicate consCand(Content f, AccessPathFront apf, Configuration config) { consCandFwd(f, apf, config) and exists(Node n, AccessPathFront apf0 | @@ -1672,6 +1713,7 @@ private predicate pathStep(PathNodeMid mid, Node node, CallContext cc, AccessPat valuePathThroughCallable(mid, node, cc) and ap = mid.getAp() } +pragma[noinline] private predicate contentReadStep(PathNodeMid mid, Node node, AccessPath ap) { exists(Content f, AccessPath ap0 | ap0 = mid.getAp() and diff --git a/cpp/ql/src/semmle/code/cpp/ir/dataflow/internal/DataFlowImpl3.qll b/cpp/ql/src/semmle/code/cpp/ir/dataflow/internal/DataFlowImpl3.qll index 796c20b35e3..931ab2e63f1 100644 --- a/cpp/ql/src/semmle/code/cpp/ir/dataflow/internal/DataFlowImpl3.qll +++ b/cpp/ql/src/semmle/code/cpp/ir/dataflow/internal/DataFlowImpl3.qll @@ -278,10 +278,9 @@ private predicate nodeCandFwd1(Node node, boolean stored, Configuration config) ) or // read - exists(Node mid, Content f | - nodeCandFwd1(mid, true, config) and - read(mid, f, node) and - storeCandFwd1(f, unbind(config)) and + exists(Content f | + nodeCandFwd1Read(f, node, config) and + storeCandFwd1(f, config) and (stored = false or stored = true) and not inBarrier(node, config) ) @@ -308,9 +307,18 @@ private predicate nodeCandFwd1(Node node, boolean stored, Configuration config) ) } +pragma[nomagic] +private predicate nodeCandFwd1Read(Content f, Node node, Configuration config) { + exists(Node mid | + nodeCandFwd1(mid, true, config) and + read(mid, f, node) + ) +} + /** * Holds if `f` is the target of a store in the flow covered by `nodeCandFwd1`. */ +pragma[noinline] private predicate storeCandFwd1(Content f, Configuration config) { exists(Node mid, Node node | not fullBarrier(node, config) and @@ -358,10 +366,9 @@ private predicate nodeCand1(Node node, boolean stored, Configuration config) { ) or // store - exists(Node mid, Content f | - store(node, f, mid) and - readCand1(f, unbind(config)) and - nodeCand1(mid, true, config) and + exists(Content f | + nodeCand1Store(f, node, config) and + readCand1(f, config) and (stored = false or stored = true) ) or @@ -398,6 +405,7 @@ private predicate nodeCand1(Node node, boolean stored, Configuration config) { /** * Holds if `f` is the target of a read in the flow covered by `nodeCand1`. */ +pragma[noinline] private predicate readCand1(Content f, Configuration config) { exists(Node mid, Node node | useFieldFlow(config) and @@ -408,6 +416,15 @@ private predicate readCand1(Content f, Configuration config) { ) } +pragma[nomagic] +private predicate nodeCand1Store(Content f, Node node, Configuration config) { + exists(Node mid | + nodeCand1(mid, true, config) and + storeCandFwd1(f, unbind(config)) and + store(node, f, mid) + ) +} + private predicate throughFlowNodeCand(Node node, Configuration config) { nodeCand1(node, false, config) and not fullBarrier(node, config) and @@ -669,10 +686,9 @@ private predicate nodeCandFwd2(Node node, boolean fromArg, boolean stored, Confi ) or // read - exists(Node mid, Content f | - nodeCandFwd2(mid, fromArg, true, config) and - read(mid, f, node) and - storeCandFwd2(f, unbind(config)) and + exists(Content f | + nodeCandFwd2Read(f, node, fromArg, config) and + storeCandFwd2(f, config) and (stored = false or stored = true) ) or @@ -695,6 +711,7 @@ private predicate nodeCandFwd2(Node node, boolean fromArg, boolean stored, Confi /** * Holds if `f` is the target of a store in the flow covered by `nodeCandFwd2`. */ +pragma[noinline] private predicate storeCandFwd2(Content f, Configuration config) { exists(Node mid, Node node | useFieldFlow(config) and @@ -705,6 +722,15 @@ private predicate storeCandFwd2(Content f, Configuration config) { ) } +pragma[nomagic] +private predicate nodeCandFwd2Read(Content f, Node node, boolean fromArg, Configuration config) { + exists(Node mid | + nodeCandFwd2(mid, fromArg, true, config) and + read(mid, f, node) and + readCand1(f, unbind(config)) + ) +} + /** * Holds if `node` is part of a path from a source to a sink in the given * configuration taking simple call contexts into consideration. @@ -742,10 +768,9 @@ private predicate nodeCand2(Node node, boolean toReturn, boolean stored, Configu ) or // store - exists(Node mid, Content f | - store(node, f, mid) and - readCand2(f, unbind(config)) and - nodeCand2(mid, toReturn, true, config) and + exists(Content f | + nodeCand2Store(f, node, toReturn, config) and + readCand2(f, config) and (stored = false or stored = true) ) or @@ -776,6 +801,7 @@ private predicate nodeCand2(Node node, boolean toReturn, boolean stored, Configu /** * Holds if `f` is the target of a read in the flow covered by `nodeCand2`. */ +pragma[noinline] private predicate readCand2(Content f, Configuration config) { exists(Node mid, Node node | useFieldFlow(config) and @@ -786,16 +812,21 @@ private predicate readCand2(Content f, Configuration config) { ) } -pragma[nomagic] -private predicate storeCand(Content f, Configuration conf) { - exists(Node n1, Node n2 | - store(n1, f, n2) and - nodeCand2(n1, _, _, conf) and - nodeCand2(n2, _, _, unbind(conf)) +pragma[noinline] +private predicate nodeCand2Store(Content f, Node node, boolean toReturn, Configuration config) { + exists(Node mid | + store(node, f, mid) and + nodeCand2(mid, toReturn, true, config) ) } -private predicate readCand(Content f, Configuration conf) { readCand2(f, conf) } +pragma[nomagic] +private predicate storeCand(Content f, Configuration conf) { + exists(Node node | + nodeCand2Store(f, node, _, conf) and + nodeCand2(node, _, _, conf) + ) +} /** * Holds if `f` is the target of both a store and a read in the path graph @@ -804,7 +835,7 @@ private predicate readCand(Content f, Configuration conf) { readCand2(f, conf) } pragma[noinline] private predicate readStoreCand(Content f, Configuration conf) { storeCand(f, conf) and - readCand(f, conf) + readCand2(f, conf) } private predicate nodeCand(Node node, Configuration config) { nodeCand2(node, _, _, config) } @@ -1030,15 +1061,13 @@ private predicate flowCandFwd0(Node node, boolean fromArg, AccessPathFront apf, apf.headUsesContent(f) ) or - exists(Node mid, Content f, AccessPathFront apf0 | - flowCandFwd(mid, fromArg, apf0, config) and - read(mid, f, node) and - nodeCand(node, config) and - apf0.headUsesContent(f) and - consCandFwd(f, apf, unbind(config)) + exists(Content f | + flowCandFwdRead(f, node, fromArg, config) and + consCandFwd(f, apf, config) ) } +pragma[noinline] private predicate consCandFwd(Content f, AccessPathFront apf, Configuration config) { exists(Node mid, Node n | flowCandFwd(mid, _, apf, config) and @@ -1049,6 +1078,16 @@ private predicate consCandFwd(Content f, AccessPathFront apf, Configuration conf ) } +pragma[nomagic] +private predicate flowCandFwdRead(Content f, Node node, boolean fromArg, Configuration config) { + exists(Node mid, AccessPathFront apf | + flowCandFwd(mid, fromArg, apf, config) and + read(mid, f, node) and + apf.headUsesContent(f) and + nodeCand(node, unbind(config)) + ) +} + /** * Holds if data can flow from a source to `node` with the given `apf` and * from there flow to a sink. @@ -1139,6 +1178,7 @@ private predicate flowCandRead( ) } +pragma[nomagic] private predicate flowCandStore( Node node, Content f, boolean toReturn, AccessPathFront apf0, Configuration config ) { @@ -1148,6 +1188,7 @@ private predicate flowCandStore( ) } +pragma[noinline] private predicate consCand(Content f, AccessPathFront apf, Configuration config) { consCandFwd(f, apf, config) and exists(Node n, AccessPathFront apf0 | @@ -1672,6 +1713,7 @@ private predicate pathStep(PathNodeMid mid, Node node, CallContext cc, AccessPat valuePathThroughCallable(mid, node, cc) and ap = mid.getAp() } +pragma[noinline] private predicate contentReadStep(PathNodeMid mid, Node node, AccessPath ap) { exists(Content f, AccessPath ap0 | ap0 = mid.getAp() and diff --git a/cpp/ql/src/semmle/code/cpp/ir/dataflow/internal/DataFlowImpl4.qll b/cpp/ql/src/semmle/code/cpp/ir/dataflow/internal/DataFlowImpl4.qll index 796c20b35e3..931ab2e63f1 100644 --- a/cpp/ql/src/semmle/code/cpp/ir/dataflow/internal/DataFlowImpl4.qll +++ b/cpp/ql/src/semmle/code/cpp/ir/dataflow/internal/DataFlowImpl4.qll @@ -278,10 +278,9 @@ private predicate nodeCandFwd1(Node node, boolean stored, Configuration config) ) or // read - exists(Node mid, Content f | - nodeCandFwd1(mid, true, config) and - read(mid, f, node) and - storeCandFwd1(f, unbind(config)) and + exists(Content f | + nodeCandFwd1Read(f, node, config) and + storeCandFwd1(f, config) and (stored = false or stored = true) and not inBarrier(node, config) ) @@ -308,9 +307,18 @@ private predicate nodeCandFwd1(Node node, boolean stored, Configuration config) ) } +pragma[nomagic] +private predicate nodeCandFwd1Read(Content f, Node node, Configuration config) { + exists(Node mid | + nodeCandFwd1(mid, true, config) and + read(mid, f, node) + ) +} + /** * Holds if `f` is the target of a store in the flow covered by `nodeCandFwd1`. */ +pragma[noinline] private predicate storeCandFwd1(Content f, Configuration config) { exists(Node mid, Node node | not fullBarrier(node, config) and @@ -358,10 +366,9 @@ private predicate nodeCand1(Node node, boolean stored, Configuration config) { ) or // store - exists(Node mid, Content f | - store(node, f, mid) and - readCand1(f, unbind(config)) and - nodeCand1(mid, true, config) and + exists(Content f | + nodeCand1Store(f, node, config) and + readCand1(f, config) and (stored = false or stored = true) ) or @@ -398,6 +405,7 @@ private predicate nodeCand1(Node node, boolean stored, Configuration config) { /** * Holds if `f` is the target of a read in the flow covered by `nodeCand1`. */ +pragma[noinline] private predicate readCand1(Content f, Configuration config) { exists(Node mid, Node node | useFieldFlow(config) and @@ -408,6 +416,15 @@ private predicate readCand1(Content f, Configuration config) { ) } +pragma[nomagic] +private predicate nodeCand1Store(Content f, Node node, Configuration config) { + exists(Node mid | + nodeCand1(mid, true, config) and + storeCandFwd1(f, unbind(config)) and + store(node, f, mid) + ) +} + private predicate throughFlowNodeCand(Node node, Configuration config) { nodeCand1(node, false, config) and not fullBarrier(node, config) and @@ -669,10 +686,9 @@ private predicate nodeCandFwd2(Node node, boolean fromArg, boolean stored, Confi ) or // read - exists(Node mid, Content f | - nodeCandFwd2(mid, fromArg, true, config) and - read(mid, f, node) and - storeCandFwd2(f, unbind(config)) and + exists(Content f | + nodeCandFwd2Read(f, node, fromArg, config) and + storeCandFwd2(f, config) and (stored = false or stored = true) ) or @@ -695,6 +711,7 @@ private predicate nodeCandFwd2(Node node, boolean fromArg, boolean stored, Confi /** * Holds if `f` is the target of a store in the flow covered by `nodeCandFwd2`. */ +pragma[noinline] private predicate storeCandFwd2(Content f, Configuration config) { exists(Node mid, Node node | useFieldFlow(config) and @@ -705,6 +722,15 @@ private predicate storeCandFwd2(Content f, Configuration config) { ) } +pragma[nomagic] +private predicate nodeCandFwd2Read(Content f, Node node, boolean fromArg, Configuration config) { + exists(Node mid | + nodeCandFwd2(mid, fromArg, true, config) and + read(mid, f, node) and + readCand1(f, unbind(config)) + ) +} + /** * Holds if `node` is part of a path from a source to a sink in the given * configuration taking simple call contexts into consideration. @@ -742,10 +768,9 @@ private predicate nodeCand2(Node node, boolean toReturn, boolean stored, Configu ) or // store - exists(Node mid, Content f | - store(node, f, mid) and - readCand2(f, unbind(config)) and - nodeCand2(mid, toReturn, true, config) and + exists(Content f | + nodeCand2Store(f, node, toReturn, config) and + readCand2(f, config) and (stored = false or stored = true) ) or @@ -776,6 +801,7 @@ private predicate nodeCand2(Node node, boolean toReturn, boolean stored, Configu /** * Holds if `f` is the target of a read in the flow covered by `nodeCand2`. */ +pragma[noinline] private predicate readCand2(Content f, Configuration config) { exists(Node mid, Node node | useFieldFlow(config) and @@ -786,16 +812,21 @@ private predicate readCand2(Content f, Configuration config) { ) } -pragma[nomagic] -private predicate storeCand(Content f, Configuration conf) { - exists(Node n1, Node n2 | - store(n1, f, n2) and - nodeCand2(n1, _, _, conf) and - nodeCand2(n2, _, _, unbind(conf)) +pragma[noinline] +private predicate nodeCand2Store(Content f, Node node, boolean toReturn, Configuration config) { + exists(Node mid | + store(node, f, mid) and + nodeCand2(mid, toReturn, true, config) ) } -private predicate readCand(Content f, Configuration conf) { readCand2(f, conf) } +pragma[nomagic] +private predicate storeCand(Content f, Configuration conf) { + exists(Node node | + nodeCand2Store(f, node, _, conf) and + nodeCand2(node, _, _, conf) + ) +} /** * Holds if `f` is the target of both a store and a read in the path graph @@ -804,7 +835,7 @@ private predicate readCand(Content f, Configuration conf) { readCand2(f, conf) } pragma[noinline] private predicate readStoreCand(Content f, Configuration conf) { storeCand(f, conf) and - readCand(f, conf) + readCand2(f, conf) } private predicate nodeCand(Node node, Configuration config) { nodeCand2(node, _, _, config) } @@ -1030,15 +1061,13 @@ private predicate flowCandFwd0(Node node, boolean fromArg, AccessPathFront apf, apf.headUsesContent(f) ) or - exists(Node mid, Content f, AccessPathFront apf0 | - flowCandFwd(mid, fromArg, apf0, config) and - read(mid, f, node) and - nodeCand(node, config) and - apf0.headUsesContent(f) and - consCandFwd(f, apf, unbind(config)) + exists(Content f | + flowCandFwdRead(f, node, fromArg, config) and + consCandFwd(f, apf, config) ) } +pragma[noinline] private predicate consCandFwd(Content f, AccessPathFront apf, Configuration config) { exists(Node mid, Node n | flowCandFwd(mid, _, apf, config) and @@ -1049,6 +1078,16 @@ private predicate consCandFwd(Content f, AccessPathFront apf, Configuration conf ) } +pragma[nomagic] +private predicate flowCandFwdRead(Content f, Node node, boolean fromArg, Configuration config) { + exists(Node mid, AccessPathFront apf | + flowCandFwd(mid, fromArg, apf, config) and + read(mid, f, node) and + apf.headUsesContent(f) and + nodeCand(node, unbind(config)) + ) +} + /** * Holds if data can flow from a source to `node` with the given `apf` and * from there flow to a sink. @@ -1139,6 +1178,7 @@ private predicate flowCandRead( ) } +pragma[nomagic] private predicate flowCandStore( Node node, Content f, boolean toReturn, AccessPathFront apf0, Configuration config ) { @@ -1148,6 +1188,7 @@ private predicate flowCandStore( ) } +pragma[noinline] private predicate consCand(Content f, AccessPathFront apf, Configuration config) { consCandFwd(f, apf, config) and exists(Node n, AccessPathFront apf0 | @@ -1672,6 +1713,7 @@ private predicate pathStep(PathNodeMid mid, Node node, CallContext cc, AccessPat valuePathThroughCallable(mid, node, cc) and ap = mid.getAp() } +pragma[noinline] private predicate contentReadStep(PathNodeMid mid, Node node, AccessPath ap) { exists(Content f, AccessPath ap0 | ap0 = mid.getAp() and diff --git a/csharp/ql/src/Security Features/CWE-838/InappropriateEncoding.ql b/csharp/ql/src/Security Features/CWE-838/InappropriateEncoding.ql index ef9b433cd94..93d7e09cb0c 100644 --- a/csharp/ql/src/Security Features/CWE-838/InappropriateEncoding.ql +++ b/csharp/ql/src/Security Features/CWE-838/InappropriateEncoding.ql @@ -11,7 +11,6 @@ */ import csharp -import DataFlow import semmle.code.csharp.frameworks.System import semmle.code.csharp.frameworks.system.Net import semmle.code.csharp.frameworks.system.Web @@ -20,13 +19,15 @@ import semmle.code.csharp.security.dataflow.SqlInjection import semmle.code.csharp.security.dataflow.XSS import semmle.code.csharp.security.dataflow.UrlRedirect import semmle.code.csharp.security.Sanitizers -import semmle.code.csharp.dataflow.DataFlow::DataFlow::PathGraph +import semmle.code.csharp.dataflow.DataFlow2::DataFlow2 +import semmle.code.csharp.dataflow.DataFlow2::DataFlow2::PathGraph +import semmle.code.csharp.dataflow.TaintTracking2 /** * A configuration for specifying expressions that must be * encoded, along with a set of potential valid encoded values. */ -abstract class RequiresEncodingConfiguration extends TaintTracking::Configuration { +abstract class RequiresEncodingConfiguration extends TaintTracking2::Configuration { bindingset[this] RequiresEncodingConfiguration() { any() } @@ -61,6 +62,8 @@ abstract class RequiresEncodingConfiguration extends TaintTracking::Configuratio override predicate isSink(Node sink) { this.requiresEncoding(sink) } override predicate isSanitizer(Node sanitizer) { this.isPossibleEncodedValue(sanitizer.asExpr()) } + + override int fieldFlowBranchLimit() { result = 0 } } /** An encoded value, for example a call to `HttpServerUtility.HtmlEncode`. */ diff --git a/csharp/ql/src/semmle/code/csharp/AnnotatedType.qll b/csharp/ql/src/semmle/code/csharp/AnnotatedType.qll index 95ee13229b7..faa6b04dd55 100644 --- a/csharp/ql/src/semmle/code/csharp/AnnotatedType.qll +++ b/csharp/ql/src/semmle/code/csharp/AnnotatedType.qll @@ -182,7 +182,8 @@ class AnnotatedType extends TAnnotatedType { /** Gets a textual representation of this annotated type. */ string toString() { - result = annotations.getTypePrefix() + getUnderlyingType().toStringWithTypes() + annotations.getTypeSuffix() + result = annotations.getTypePrefix() + getUnderlyingType().toStringWithTypes() + + annotations.getTypeSuffix() } /** Gets the location of this annotated type. */ diff --git a/csharp/ql/src/semmle/code/csharp/Assignable.qll b/csharp/ql/src/semmle/code/csharp/Assignable.qll index 798789f8fbb..41e8ddad87a 100644 --- a/csharp/ql/src/semmle/code/csharp/Assignable.qll +++ b/csharp/ql/src/semmle/code/csharp/Assignable.qll @@ -726,7 +726,7 @@ module AssignableDefinitions { class InitializerDefinition extends AssignmentDefinition { private Assignable fieldOrProp; - InitializerDefinition() { this.getAssignment().getParent() = fieldOrProp} + InitializerDefinition() { this.getAssignment().getParent() = fieldOrProp } /** Gets the assignable (field or property) being initialized. */ Assignable getAssignable() { result = fieldOrProp } diff --git a/csharp/ql/src/semmle/code/csharp/Callable.qll b/csharp/ql/src/semmle/code/csharp/Callable.qll index 03e56f5d9d2..f3ef15d59f7 100644 --- a/csharp/ql/src/semmle/code/csharp/Callable.qll +++ b/csharp/ql/src/semmle/code/csharp/Callable.qll @@ -26,14 +26,10 @@ class Callable extends DotNet::Callable, Parameterizable, ExprOrStmtParent, @cal final AnnotatedType getAnnotatedReturnType() { result.appliesTo(this) } /** DEPRECATED: Use `getAnnotatedReturnType().isRef()` instead. */ - deprecated predicate returnsRef() { - this.getAnnotatedReturnType().isRef() - } + deprecated predicate returnsRef() { this.getAnnotatedReturnType().isRef() } /** DEPRECATED: Use `getAnnotatedReturnType().isReadonlyRef()` instead. */ - deprecated predicate returnsRefReadonly() { - this.getAnnotatedReturnType().isReadonlyRef() - } + deprecated predicate returnsRefReadonly() { this.getAnnotatedReturnType().isReadonlyRef() } override Callable getSourceDeclaration() { result = Parameterizable.super.getSourceDeclaration() } diff --git a/csharp/ql/src/semmle/code/csharp/Property.qll b/csharp/ql/src/semmle/code/csharp/Property.qll index c8bc4f0c72c..d1f15e1152a 100644 --- a/csharp/ql/src/semmle/code/csharp/Property.qll +++ b/csharp/ql/src/semmle/code/csharp/Property.qll @@ -203,6 +203,18 @@ class Property extends DotNet::Property, DeclarationWithGetSetAccessors, @proper */ Expr getInitializer() { result = this.getChildExpr(1).getChildExpr(0) } + /** + * Holds if this property has an initial value. For example, the initial + * value of `P` on line 2 is `20` in + * + * ``` + * class C { + * public int P { get; set; } = 20; + * } + * ``` + */ + predicate hasInitializer() { exists(this.getInitializer()) } + /** * Gets the expression body of this property, if any. For example, the expression * body of `P` on line 2 is `20` in diff --git a/csharp/ql/src/semmle/code/csharp/Variable.qll b/csharp/ql/src/semmle/code/csharp/Variable.qll index b3f59ca78f6..0d1d462f888 100644 --- a/csharp/ql/src/semmle/code/csharp/Variable.qll +++ b/csharp/ql/src/semmle/code/csharp/Variable.qll @@ -364,9 +364,30 @@ class LocalConstant extends LocalVariable, @local_constant { */ class Field extends Variable, AssignableMember, Attributable, TopLevelExprParent, DotNet::Field, @field { - /** Gets the initializer of this field, if any. */ + /** + * Gets the initial value of this field, if any. For example, the initial + * value of `F` on line 2 is `20` in + * + * ``` + * class C { + * public int F = 20; + * } + * ``` + */ override Expr getInitializer() { result = this.getChildExpr(0).getChildExpr(0) } + /** + * Holds if this field has an initial value. For example, the initial + * value of `F` on line 2 is `20` in + * + * ``` + * class C { + * public int F = 20; + * } + * ``` + */ + predicate hasInitializer() { exists(this.getInitializer()) } + /** Holds if this field is `volatile`. */ predicate isVolatile() { this.hasModifier("volatile") } diff --git a/csharp/ql/src/semmle/code/csharp/controlflow/BasicBlocks.qll b/csharp/ql/src/semmle/code/csharp/controlflow/BasicBlocks.qll index 978f89e3a4e..a3508c8d307 100644 --- a/csharp/ql/src/semmle/code/csharp/controlflow/BasicBlocks.qll +++ b/csharp/ql/src/semmle/code/csharp/controlflow/BasicBlocks.qll @@ -75,7 +75,7 @@ class BasicBlock extends TBasicBlockStart { ControlFlow::Node getLastNode() { result = getNode(length() - 1) } /** Gets the callable that this basic block belongs to. */ - Callable getCallable() { result = this.getAPredecessor().getCallable() } + final Callable getCallable() { result = this.getFirstNode().getEnclosingCallable() } /** Gets the length of this basic block. */ int length() { result = strictcount(getANode()) } @@ -346,8 +346,6 @@ private import Internal */ class EntryBasicBlock extends BasicBlock { EntryBasicBlock() { entryBB(this) } - - override Callable getCallable() { result.getEntryPoint() = this.getFirstNode() } } /** Holds if `bb` is an entry basic block. */ diff --git a/csharp/ql/src/semmle/code/csharp/controlflow/ControlFlowGraph.qll b/csharp/ql/src/semmle/code/csharp/controlflow/ControlFlowGraph.qll index f36089b2d12..628947c1b5e 100644 --- a/csharp/ql/src/semmle/code/csharp/controlflow/ControlFlowGraph.qll +++ b/csharp/ql/src/semmle/code/csharp/controlflow/ControlFlowGraph.qll @@ -287,7 +287,11 @@ module ControlFlow { ElementNode() { this = TElementNode(cfe, splits) } - override Callable getEnclosingCallable() { result = cfe.getEnclosingCallable() } + override Callable getEnclosingCallable() { + result = cfe.getEnclosingCallable() + or + result = this.getASplit().(InitializerSplitting::InitializerSplitImpl).getConstructor() + } override ControlFlowElement getElement() { result = cfe } @@ -1750,11 +1754,38 @@ module ControlFlow { cfe = last(result.(JumpStmt).getChild(0), c) and c instanceof NormalCompletion or - // Flow from constructor initializer to first element of constructor body - cfe = any(ConstructorInitializer ci | - c instanceof SimpleCompletion and - result = first(ci.getConstructor().getBody()) + exists(ConstructorInitializer ci, Constructor con | + cfe = last(ci, c) and + con = ci.getConstructor() and + c instanceof NormalCompletion + | + // Flow from constructor initializer to first member initializer + exists(InitializerSplitting::InitializedInstanceMember m | + InitializerSplitting::constructorInitializeOrder(con, m, 0) + | + result = first(m.getInitializer()) ) + or + // Flow from constructor initializer to first element of constructor body + not InitializerSplitting::constructorInitializeOrder(con, _, _) and + result = first(con.getBody()) + ) + or + exists(Constructor con, InitializerSplitting::InitializedInstanceMember m, int i | + cfe = last(m.getInitializer(), c) and + c instanceof NormalCompletion and + InitializerSplitting::constructorInitializeOrder(con, m, i) + | + // Flow from one member initializer to the next + exists(InitializerSplitting::InitializedInstanceMember next | + InitializerSplitting::constructorInitializeOrder(con, next, i + 1) and + result = first(next.getInitializer()) + ) + or + // Flow from last member initializer to constructor body + m = InitializerSplitting::lastConstructorInitializer(con) and + result = first(con.getBody()) + ) or // Flow from element with `goto` completion to first element of relevant // target @@ -1831,11 +1862,18 @@ module ControlFlow { p = any(Callable c | if exists(c.(Constructor).getInitializer()) then result = first(c.(Constructor).getInitializer()) - else result = first(c.getBody()) + else + if InitializerSplitting::constructorInitializes(c, _) + then + result = first(any(InitializerSplitting::InitializedInstanceMember m | + InitializerSplitting::constructorInitializeOrder(c, m, 0) + ).getInitializer()) + else result = first(c.getBody()) ) or expr_parent_top_level_adjusted(any(Expr e | result = first(e)), _, p) and - not p instanceof Callable + not p instanceof Callable and + not p instanceof InitializerSplitting::InitializedInstanceMember } /** @@ -1845,6 +1883,12 @@ module ControlFlow { Callable succExit(ControlFlowElement cfe, Completion c) { cfe = last(result.getBody(), c) and not c instanceof GotoCompletion + or + exists(InitializerSplitting::InitializedInstanceMember m | + m = InitializerSplitting::lastConstructorInitializer(result) and + cfe = last(m.getInitializer(), c) and + not result.hasBody() + ) } } import Successor diff --git a/csharp/ql/src/semmle/code/csharp/controlflow/internal/Splitting.qll b/csharp/ql/src/semmle/code/csharp/controlflow/internal/Splitting.qll index abb6c62c749..7b752ea747e 100644 --- a/csharp/ql/src/semmle/code/csharp/controlflow/internal/Splitting.qll +++ b/csharp/ql/src/semmle/code/csharp/controlflow/internal/Splitting.qll @@ -6,10 +6,8 @@ import csharp private import semmle.code.csharp.controlflow.internal.Completion -private import semmle.code.csharp.controlflow.internal.PreBasicBlocks private import semmle.code.csharp.controlflow.internal.PreSsa as PreSsa private import semmle.code.csharp.controlflow.ControlFlowGraph::ControlFlow::Internal::Successor -private import semmle.code.csharp.controlflow.Guards as Guards private import ControlFlow private import SuccessorTypes @@ -28,12 +26,14 @@ private module Cached { cached newtype TSplitKind = + TInitializerSplitKind() or TFinallySplitKind() or TExceptionHandlerSplitKind() or TBooleanSplitKind(BooleanSplitting::BooleanSplitSubKind kind) { kind.startsSplit(_) } cached newtype TSplit = + TInitializerSplit(Constructor c) { InitializerSplitting::constructorInitializes(c, _) } or TFinallySplit(FinallySplitting::FinallySplitType type) or TExceptionHandlerSplit(ExceptionClass ec) or TBooleanSplit(BooleanSplitting::BooleanSplitSubKind kind, boolean branch) { @@ -51,6 +51,8 @@ private module Cached { case2aFromRank(pred, predSplits, succ, tail, c, rnk + 1) and head = case2aSomeAtRank(pred, predSplits, succ, c, rnk) ) + or + succEntrySplitsCons(_, _, head, tail, _) } cached @@ -118,11 +120,14 @@ abstract class SplitKind extends TSplitKind { } /** - * Holds if this split kind should be included when constructing the control - * flow graph for callable `c`. For performance reasons, the number of splits - * is restricted by the `maxSplits()` predicate. + * Holds if this split kind is enabled for control flow element `cfe`. For + * performance reasons, the number of splits is restricted by the `maxSplits()` + * predicate. */ - private predicate isEnabled(Callable c) { this.getRank(c) <= maxSplits() } + predicate isEnabled(ControlFlowElement cfe) { + this.appliesTo(cfe) and + this.getRank(cfe.getEnclosingCallable()) <= maxSplits() + } /** * Gets the rank of this split kind among all the split kinds that apply to @@ -130,8 +135,7 @@ abstract class SplitKind extends TSplitKind { * `getListOrder()`. */ int getListRank(ControlFlowElement cfe) { - this.appliesTo(cfe) and - this.isEnabled(cfe.getEnclosingCallable()) and + this.isEnabled(cfe) and this = rank[result](SplitKind sk | sk.appliesTo(cfe) | sk order by sk.getListOrder()) } @@ -153,6 +157,14 @@ abstract class SplitInternal extends SplitImpl { */ abstract predicate hasEntry(ControlFlowElement pred, ControlFlowElement succ, Completion c); + /** + * Holds if this split is entered when control passes from `c` to the entry point + * `succ`. + * + * Invariant: `hasEntry(c, succ) implies succ = Successor::succEntry(c)`. + */ + abstract predicate hasEntry(Callable c, ControlFlowElement succ); + /** * Holds if this split is left when control passes from `pred` to `succ` with * completion `c`. @@ -163,11 +175,11 @@ abstract class SplitInternal extends SplitImpl { /** * Holds if this split is left when control passes from `pred` out of the enclosing - * callable with completion `c`. + * callable `result` with completion `c`. * - * Invariant: `hasExit(pred, c) implies pred.getEnclosingCallable() = Successor::succExit(pred, c)` + * Invariant: `succ = hasExit(pred, c) implies succ = Successor::succExit(pred, c)` */ - abstract predicate hasExit(ControlFlowElement pred, Completion c); + abstract Callable hasExit(ControlFlowElement pred, Completion c); /** * Holds if this split is maintained when control passes from `pred` to `succ` with @@ -181,10 +193,197 @@ abstract class SplitInternal extends SplitImpl { final predicate appliesTo(ControlFlowElement cfe) { this.hasEntry(_, cfe, _) or + this.hasEntry(_, cfe) + or exists(ControlFlowElement pred | this.appliesTo(pred) | this.hasSuccessor(pred, cfe, _)) } } +module InitializerSplitting { + private import semmle.code.csharp.ExprOrStmtParent + + /** + * A non-static member with an initializer, for example a field `int Field = 0`. + */ + class InitializedInstanceMember extends Member { + private AssignExpr ae; + + InitializedInstanceMember() { + not this.isStatic() and + expr_parent_top_level_adjusted(ae, _, this) + } + + /** Gets the initializer expression. */ + AssignExpr getInitializer() { result = ae } + + /** + * Gets a control flow element that is a syntactic descendant of the + * initializer expression. + */ + ControlFlowElement getAnInitializerDescendant() { + result = ae + or + result = this.getAnInitializerDescendant().getAChild() + } + } + + /** + * Holds if `c` is a non-static constructor that performs the initialization + * of member `m`. + */ + predicate constructorInitializes(Constructor c, InitializedInstanceMember m) { + c = c.getSourceDeclaration() and + not c.isStatic() and + c.getDeclaringType().hasMember(m) and + ( + not c.hasInitializer() + or + // Members belonging to the base class are initialized via calls to the + // base constructor + c.getInitializer().isBase() and + m.getDeclaringType() = c.getDeclaringType() + ) + } + + /** + * Holds if `m` is the `i`th member initialized by non-static constructor `c`. + */ + predicate constructorInitializeOrder(Constructor c, InitializedInstanceMember m, int i) { + constructorInitializes(c, m) and + m = rank[i + 1](InitializedInstanceMember m0 | + constructorInitializes(c, m0) + | + m0 + order by + m0.getLocation().getStartLine(), m0.getLocation().getStartColumn(), + m0.getLocation().getFile().getAbsolutePath() + ) + } + + /** Gets the last member initialized by non-static constructor `c`. */ + InitializedInstanceMember lastConstructorInitializer(Constructor c) { + exists(int i | + constructorInitializeOrder(c, result, i) and + not constructorInitializeOrder(c, _, i + 1) + ) + } + + /** + * A split for non-static member initializers belonging to a given non-static + * constructor. For example, in + * + * ``` + * class C + * { + * int Field1 = 0; + * int Field2 = Field1 + 1; + * int Field3; + * + * public C() + * { + * Field3 = 2; + * } + * + * public C(int i) + * { + * Field3 = 3; + * } + * } + * ``` + * + * the initializer expressions `Field1 = 0` and `Field2 = Field1 + 1` are split + * on the two constructors. This is in order to generate CFGs for the two + * constructors that mimic + * + * ``` + * public C() + * { + * Field1 = 0; + * Field2 = Field1 + 1; + * Field3 = 2; + * } + * ``` + * + * and + * + * ``` + * public C() + * { + * Field1 = 0; + * Field2 = Field1 + 1; + * Field3 = 3; + * } + * ``` + * + * respectively. + */ + class InitializerSplitImpl extends SplitImpl, TInitializerSplit { + private Constructor c; + + InitializerSplitImpl() { this = TInitializerSplit(c) } + + /** Gets the constructor. */ + Constructor getConstructor() { result = c } + + override string toString() { result = "" } + } + + private class InitializerSplitKind extends SplitKind, TInitializerSplitKind { + override int getListOrder() { result = 0 } + + override predicate isEnabled(ControlFlowElement cfe) { this.appliesTo(cfe) } + + override string toString() { result = "Initializer" } + } + + int getNextListOrder() { result = 1 } + + private class InitializerSplitInternal extends SplitInternal, InitializerSplitImpl { + override InitializerSplitKind getKind() { any() } + + override predicate hasEntry(ControlFlowElement pred, ControlFlowElement succ, Completion c) { + exists(ConstructorInitializer ci | + pred = last(ci, c) and + succ = succ(pred, c) and + succ = any(InitializedInstanceMember m).getAnInitializerDescendant() and + this.getConstructor() = ci.getConstructor() + ) + } + + override predicate hasEntry(Callable c, ControlFlowElement succ) { + succ = succEntry(c) and + c = this.getConstructor() and + succ = any(InitializedInstanceMember m).getAnInitializerDescendant() + } + + override predicate hasExit(ControlFlowElement pred, ControlFlowElement succ, Completion c) { + this.appliesTo(pred) and + succ = succ(pred, c) and + not succ = any(InitializedInstanceMember m).getAnInitializerDescendant() and + succ.getEnclosingCallable() = this.getConstructor() + } + + override Callable hasExit(ControlFlowElement pred, Completion c) { + this.appliesTo(pred) and + result = succExit(pred, c) and + result = this.getConstructor() + } + + override predicate hasSuccessor(ControlFlowElement pred, ControlFlowElement succ, Completion c) { + this.appliesTo(pred) and + succ = succ(pred, c) and + succ = any(InitializedInstanceMember m | constructorInitializes(this.getConstructor(), m)) + .getAnInitializerDescendant() + } + } +} + +pragma[noinline] +private ControlFlowElement getAChild(ControlFlowElement cfe, Callable c) { + result = cfe.getAChild() and + c = result.getEnclosingCallable() +} + module FinallySplitting { /** * The type of a split `finally` node. @@ -208,12 +407,6 @@ module FinallySplitting { } } - pragma[noinline] - private ControlFlowElement getAChild(ControlFlowElement cfe, Callable c) { - result = cfe.getAChild() and - c = result.getEnclosingCallable() - } - /** * Gets a descendant that belongs to the `finally` block of try statement * `try`. @@ -294,11 +487,13 @@ module FinallySplitting { } private class FinallySplitKind extends SplitKind, TFinallySplitKind { - override int getListOrder() { result = 0 } + override int getListOrder() { result = InitializerSplitting::getNextListOrder() } override string toString() { result = "Finally" } } + int getNextListOrder() { result = InitializerSplitting::getNextListOrder() + 1 } + private class FinallySplitInternal extends SplitInternal, FinallySplitImpl { override FinallySplitKind getKind() { any() } @@ -316,6 +511,8 @@ module FinallySplitting { ) } + override predicate hasEntry(Callable c, ControlFlowElement succ) { none() } + /** * Holds if this split applies to control flow element `pred`, where `pred` * is a valid predecessor. @@ -366,8 +563,8 @@ module FinallySplitting { ) } - override predicate hasExit(ControlFlowElement pred, Completion c) { - exists(succExit(pred, c)) and + override Callable hasExit(ControlFlowElement pred, Completion c) { + result = succExit(pred, c) and ( exit(pred, c) or @@ -445,11 +642,13 @@ module ExceptionHandlerSplitting { } private class ExceptionHandlerSplitKind extends SplitKind, TExceptionHandlerSplitKind { - override int getListOrder() { result = 1 } + override int getListOrder() { result = FinallySplitting::getNextListOrder() } override string toString() { result = "ExceptionHandler" } } + int getNextListOrder() { result = FinallySplitting::getNextListOrder() + 1 } + private class ExceptionHandlerSplitInternal extends SplitInternal, ExceptionHandlerSplitImpl { override ExceptionHandlerSplitKind getKind() { any() } @@ -461,6 +660,8 @@ module ExceptionHandlerSplitting { ) } + override predicate hasEntry(Callable c, ControlFlowElement succ) { none() } + /** * Holds if this split applies to catch clause `scc`. The parameter `match` * indicates whether the catch clause `scc` may match the exception type of @@ -539,10 +740,10 @@ module ExceptionHandlerSplitting { ) } - override predicate hasExit(ControlFlowElement pred, Completion c) { + override Callable hasExit(ControlFlowElement pred, Completion c) { // Exit out from last `catch` clause (no catch clauses match) this.hasLastExit(pred, c) and - exists(succExit(pred, c)) + result = succExit(pred, c) } override predicate hasSuccessor(ControlFlowElement pred, ControlFlowElement succ, Completion c) { @@ -720,6 +921,27 @@ module BooleanSplitting { } } + private int getListOrder(BooleanSplitSubKind kind) { + exists(Callable c, int r | c = kind.getEnclosingCallable() | + result = r + ExceptionHandlerSplitting::getNextListOrder() - 1 and + kind = rank[r](BooleanSplitSubKind kind0 | + kind0.getEnclosingCallable() = c and + kind0.startsSplit(_) + | + kind0 + order by + kind0.getLocation().getStartLine(), kind0.getLocation().getStartColumn(), + kind0.toString() + ) + ) + } + + int getNextListOrder() { + result = max(int i | + i = getListOrder(_) + 1 or i = ExceptionHandlerSplitting::getNextListOrder() + ) + } + private class BooleanSplitKind extends SplitKind, TBooleanSplitKind { private BooleanSplitSubKind kind; @@ -728,20 +950,7 @@ module BooleanSplitting { /** Gets the sub kind of this Boolean split kind. */ BooleanSplitSubKind getSubKind() { result = kind } - override int getListOrder() { - exists(Callable c, int r | c = kind.getEnclosingCallable() | - result = r + 1 and // start the ordering from 2 - kind = rank[r](BooleanSplitSubKind kind0 | - kind0.getEnclosingCallable() = c and - kind0.startsSplit(_) - | - kind0 - order by - kind0.getLocation().getStartLine(), kind0.getLocation().getStartColumn(), - kind0.toString() - ) - ) - } + override int getListOrder() { result = getListOrder(kind) } override string toString() { result = kind.toString() } } @@ -755,6 +964,8 @@ module BooleanSplitting { this.getBranch() = c.getInnerCompletion().(BooleanCompletion).getValue() } + override predicate hasEntry(Callable c, ControlFlowElement succ) { none() } + private ConditionBlock getACorrelatedCondition(boolean inverted) { this.getSubKind().correlatesConditions(_, result, inverted) } @@ -787,10 +998,10 @@ module BooleanSplitting { ) } - override predicate hasExit(ControlFlowElement pred, Completion c) { + override Callable hasExit(ControlFlowElement pred, Completion c) { exists(PreBasicBlock bb | this.appliesToBlock(bb, c) | pred = bb.getLastElement() and - exists(succExit(pred, c)) + result = succExit(pred, c) ) } @@ -830,6 +1041,26 @@ class Splits extends TSplits { } } +private predicate succEntrySplitsFromRank( + @top_level_exprorstmt_parent pred, ControlFlowElement succ, Splits splits, int rnk +) { + splits = TSplitsNil() and + succ = succEntry(pred) and + rnk = 0 + or + exists(SplitInternal head, Splits tail | succEntrySplitsCons(pred, succ, head, tail, rnk) | + splits = TSplitsCons(head, tail) + ) +} + +private predicate succEntrySplitsCons( + Callable pred, ControlFlowElement succ, SplitInternal head, Splits tail, int rnk +) { + succEntrySplitsFromRank(pred, succ, tail, rnk - 1) and + head.hasEntry(pred, succ) and + rnk = head.getKind().getListRank(succ) +} + /** * Holds if `succ` with splits `succSplits` is the first element that is executed * when entering callable `pred`. @@ -838,9 +1069,16 @@ pragma[noinline] predicate succEntrySplits( @top_level_exprorstmt_parent pred, ControlFlowElement succ, Splits succSplits, SuccessorType t ) { - succ = succEntry(pred) and - t instanceof NormalSuccessor and - succSplits = TSplitsNil() // initially no splits + exists(int rnk | + succ = succEntry(pred) and + t instanceof NormalSuccessor and + succEntrySplitsFromRank(pred, succ, succSplits, rnk) + | + rnk = 0 and + not any(SplitInternal split).hasEntry(pred, succ) + or + rnk = max(SplitInternal split | split.hasEntry(pred, succ) | split.getKind().getListRank(succ)) + ) } /** @@ -853,7 +1091,7 @@ predicate succExitSplits(ControlFlowElement pred, Splits predSplits, Callable su t.matchesCompletion(c) and succ = succExit(pred, c) and forall(SplitInternal predSplit | predSplit = predSplits.getASplit() | - predSplit.hasExit(pred, c) + succ = predSplit.hasExit(pred, c) ) ) } diff --git a/csharp/ql/src/semmle/code/csharp/dataflow/internal/ControlFlowReachability.qll b/csharp/ql/src/semmle/code/csharp/dataflow/internal/ControlFlowReachability.qll index 01e88a1f91c..b05595c32c3 100644 --- a/csharp/ql/src/semmle/code/csharp/dataflow/internal/ControlFlowReachability.qll +++ b/csharp/ql/src/semmle/code/csharp/dataflow/internal/ControlFlowReachability.qll @@ -87,6 +87,16 @@ abstract class ControlFlowReachabilityConfiguration extends string { none() } + pragma[nomagic] + private predicate reachesBasicBlockExprBase( + Expr e1, Expr e2, ControlFlowElement scope, boolean exactScope, boolean isSuccessor, + ControlFlow::Nodes::ElementNode cfn1, int i, ControlFlow::BasicBlock bb + ) { + this.candidate(e1, e2, scope, exactScope, isSuccessor) and + cfn1 = e1.getAControlFlowNode() and + bb.getNode(i) = cfn1 + } + pragma[nomagic] private predicate reachesBasicBlockExprRec( Expr e1, Expr e2, ControlFlowElement scope, boolean exactScope, boolean isSuccessor, @@ -108,9 +118,7 @@ abstract class ControlFlowReachabilityConfiguration extends string { Expr e1, Expr e2, ControlFlowElement scope, boolean exactScope, boolean isSuccessor, ControlFlow::Nodes::ElementNode cfn1, ControlFlow::BasicBlock bb ) { - this.candidate(e1, e2, scope, exactScope, isSuccessor) and - cfn1 = e1.getAControlFlowNode() and - bb = cfn1.getBasicBlock() + this.reachesBasicBlockExprBase(e1, e2, scope, exactScope, isSuccessor, cfn1, _, bb) or this.candidate(e1, e2, scope, exactScope, isSuccessor) and exists(ControlFlowElement scope0, boolean exactScope0 | @@ -120,6 +128,16 @@ abstract class ControlFlowReachabilityConfiguration extends string { ) } + pragma[nomagic] + private predicate reachesBasicBlockDefinitionBase( + Expr e, AssignableDefinition def, ControlFlowElement scope, boolean exactScope, + boolean isSuccessor, ControlFlow::Nodes::ElementNode cfn, int i, ControlFlow::BasicBlock bb + ) { + this.candidateDef(e, def, scope, exactScope, isSuccessor) and + cfn = e.getAControlFlowNode() and + bb.getNode(i) = cfn + } + pragma[nomagic] private predicate reachesBasicBlockDefinitionRec( Expr e, AssignableDefinition def, ControlFlowElement scope, boolean exactScope, @@ -141,9 +159,7 @@ abstract class ControlFlowReachabilityConfiguration extends string { Expr e, AssignableDefinition def, ControlFlowElement scope, boolean exactScope, boolean isSuccessor, ControlFlow::Nodes::ElementNode cfn, ControlFlow::BasicBlock bb ) { - this.candidateDef(e, def, scope, exactScope, isSuccessor) and - cfn = e.getAControlFlowNode() and - bb = cfn.getBasicBlock() + this.reachesBasicBlockDefinitionBase(e, def, scope, exactScope, isSuccessor, cfn, _, bb) or this.candidateDef(e, def, scope, exactScope, isSuccessor) and exists(ControlFlowElement scope0, boolean exactScope0 | @@ -158,7 +174,18 @@ abstract class ControlFlowReachabilityConfiguration extends string { * control-flow node for `e1` and `cfn2` is a control-flow node for `e2`. */ predicate hasExprPath(Expr e1, ControlFlow::Node cfn1, Expr e2, ControlFlow::Node cfn2) { - exists(ControlFlow::BasicBlock bb | this.reachesBasicBlockExpr(e1, e2, _, _, _, cfn1, bb) | + exists(ControlFlow::BasicBlock bb, boolean isSuccessor, int i, int j | + this.reachesBasicBlockExprBase(e1, e2, _, _, isSuccessor, cfn1, i, bb) and + cfn2 = bb.getNode(j) and + cfn2 = e2.getAControlFlowNode() + | + isSuccessor = true and j > i + or + isSuccessor = false and i > j + ) + or + exists(ControlFlow::BasicBlock bb | + this.reachesBasicBlockExprRec(e1, e2, _, _, _, cfn1, bb) and cfn2 = bb.getANode() and cfn2 = e2.getAControlFlowNode() ) @@ -171,7 +198,18 @@ abstract class ControlFlowReachabilityConfiguration extends string { predicate hasDefPath( Expr e, ControlFlow::Node cfn, AssignableDefinition def, ControlFlow::Node cfnDef ) { - exists(ControlFlow::BasicBlock bb | this.reachesBasicBlockDefinition(e, def, _, _, _, cfn, bb) | + exists(ControlFlow::BasicBlock bb, boolean isSuccessor, int i, int j | + this.reachesBasicBlockDefinitionBase(e, def, _, _, isSuccessor, cfn, i, bb) and + cfnDef = bb.getNode(j) and + def.getAControlFlowNode() = cfnDef + | + isSuccessor = true and j > i + or + isSuccessor = false and i > j + ) + or + exists(ControlFlow::BasicBlock bb | + this.reachesBasicBlockDefinitionRec(e, def, _, _, _, cfn, bb) and def.getAControlFlowNode() = cfnDef and cfnDef = bb.getANode() ) diff --git a/csharp/ql/src/semmle/code/csharp/dataflow/internal/DataFlowDispatch.qll b/csharp/ql/src/semmle/code/csharp/dataflow/internal/DataFlowDispatch.qll index 1346fe65e2b..7ad04949c82 100644 --- a/csharp/ql/src/semmle/code/csharp/dataflow/internal/DataFlowDispatch.qll +++ b/csharp/ql/src/semmle/code/csharp/dataflow/internal/DataFlowDispatch.qll @@ -107,7 +107,7 @@ private module Cached { /** Gets a viable run-time target for the call `call`. */ cached - DotNet::Callable viableImpl(DataFlowCall call) { result = call.getARuntimeTarget() } + DataFlowCallable viableImpl(DataFlowCall call) { result = call.getARuntimeTarget() } /** * Gets a viable run-time target for the delegate call `call`, requiring @@ -122,7 +122,7 @@ private module Cached { * targets of call `call` in `c`. */ cached - predicate reducedViableImplInCallContext(DataFlowCall call, DotNet::Callable c, DataFlowCall ctx) { + predicate reducedViableImplInCallContext(DataFlowCall call, DataFlowCallable c, DataFlowCall ctx) { c = viableImpl(ctx) and c = call.getEnclosingCallable() and exists(CallContext cc | exists(viableDelegateCallable(call, cc)) | @@ -153,7 +153,7 @@ private module Cached { * returned to. */ cached - predicate reducedViableImplInReturn(DotNet::Callable c, DataFlowCall call) { + predicate reducedViableImplInReturn(DataFlowCallable c, DataFlowCall call) { exists(int tgts, int ctxtgts | c = viableImpl(call) and ctxtgts = strictcount(DataFlowCall ctx | c = viableImplInCallContext(call, ctx)) and @@ -168,7 +168,7 @@ private module Cached { * flow from the result to `call` restricts the possible context `ctx`. */ cached - DotNet::Callable prunedViableImplInCallContextReverse(DataFlowCall call, DataFlowCall ctx) { + DataFlowCallable prunedViableImplInCallContextReverse(DataFlowCall call, DataFlowCall ctx) { result = viableImplInCallContext(call, ctx) and reducedViableImplInReturn(result, call) } @@ -285,6 +285,8 @@ class ImplicitCapturedReturnKind extends ReturnKind, TImplicitCapturedReturnKind override string toString() { result = "captured " + v } } +class DataFlowCallable = DotNet::Callable; + /** A call relevant for data flow. */ abstract class DataFlowCall extends TDataFlowCall { /** @@ -292,7 +294,7 @@ abstract class DataFlowCall extends TDataFlowCall { * declaration, and if the callable has both CIL and source code, only * the source code version is returned. */ - abstract DotNet::Callable getARuntimeTarget(); + abstract DataFlowCallable getARuntimeTarget(); /** Gets the control flow node where this call happens, if any. */ abstract ControlFlow::Nodes::ElementNode getControlFlowNode(); @@ -301,7 +303,7 @@ abstract class DataFlowCall extends TDataFlowCall { abstract DataFlow::Node getNode(); /** Gets the enclosing callable of this call. */ - abstract DotNet::Callable getEnclosingCallable(); + abstract DataFlowCallable getEnclosingCallable(); /** Gets the underlying expression, if any. */ final DotNet::Expr getExpr() { result = this.getNode().asExpr() } @@ -387,7 +389,7 @@ class ImplicitDelegateDataFlowCall extends DelegateDataFlowCall, TImplicitDelega * call `c` targeting a library callable. For example, `M` is the `0`th * argument of `new Lazy(M)`. */ - predicate isArgumentOf(DataFlowCall c, int i) { + predicate isArgumentOf(NonDelegateDataFlowCall c, int i) { exists(ImplicitDelegateOutNode out | out.getControlFlowNode() = cfn | out.isArgumentOf(c, i)) } @@ -415,7 +417,7 @@ class ImplicitDelegateDataFlowCall extends DelegateDataFlowCall, TImplicitDelega * a single call for performance reasons. */ class TransitiveCapturedDataFlowCall extends DataFlowCall, TTransitiveCapturedCall { - ControlFlow::Nodes::ElementNode cfn; + private ControlFlow::Nodes::ElementNode cfn; TransitiveCapturedDataFlowCall() { this = TTransitiveCapturedCall(cfn) } diff --git a/csharp/ql/src/semmle/code/csharp/dataflow/internal/DataFlowImpl.qll b/csharp/ql/src/semmle/code/csharp/dataflow/internal/DataFlowImpl.qll index 796c20b35e3..931ab2e63f1 100644 --- a/csharp/ql/src/semmle/code/csharp/dataflow/internal/DataFlowImpl.qll +++ b/csharp/ql/src/semmle/code/csharp/dataflow/internal/DataFlowImpl.qll @@ -278,10 +278,9 @@ private predicate nodeCandFwd1(Node node, boolean stored, Configuration config) ) or // read - exists(Node mid, Content f | - nodeCandFwd1(mid, true, config) and - read(mid, f, node) and - storeCandFwd1(f, unbind(config)) and + exists(Content f | + nodeCandFwd1Read(f, node, config) and + storeCandFwd1(f, config) and (stored = false or stored = true) and not inBarrier(node, config) ) @@ -308,9 +307,18 @@ private predicate nodeCandFwd1(Node node, boolean stored, Configuration config) ) } +pragma[nomagic] +private predicate nodeCandFwd1Read(Content f, Node node, Configuration config) { + exists(Node mid | + nodeCandFwd1(mid, true, config) and + read(mid, f, node) + ) +} + /** * Holds if `f` is the target of a store in the flow covered by `nodeCandFwd1`. */ +pragma[noinline] private predicate storeCandFwd1(Content f, Configuration config) { exists(Node mid, Node node | not fullBarrier(node, config) and @@ -358,10 +366,9 @@ private predicate nodeCand1(Node node, boolean stored, Configuration config) { ) or // store - exists(Node mid, Content f | - store(node, f, mid) and - readCand1(f, unbind(config)) and - nodeCand1(mid, true, config) and + exists(Content f | + nodeCand1Store(f, node, config) and + readCand1(f, config) and (stored = false or stored = true) ) or @@ -398,6 +405,7 @@ private predicate nodeCand1(Node node, boolean stored, Configuration config) { /** * Holds if `f` is the target of a read in the flow covered by `nodeCand1`. */ +pragma[noinline] private predicate readCand1(Content f, Configuration config) { exists(Node mid, Node node | useFieldFlow(config) and @@ -408,6 +416,15 @@ private predicate readCand1(Content f, Configuration config) { ) } +pragma[nomagic] +private predicate nodeCand1Store(Content f, Node node, Configuration config) { + exists(Node mid | + nodeCand1(mid, true, config) and + storeCandFwd1(f, unbind(config)) and + store(node, f, mid) + ) +} + private predicate throughFlowNodeCand(Node node, Configuration config) { nodeCand1(node, false, config) and not fullBarrier(node, config) and @@ -669,10 +686,9 @@ private predicate nodeCandFwd2(Node node, boolean fromArg, boolean stored, Confi ) or // read - exists(Node mid, Content f | - nodeCandFwd2(mid, fromArg, true, config) and - read(mid, f, node) and - storeCandFwd2(f, unbind(config)) and + exists(Content f | + nodeCandFwd2Read(f, node, fromArg, config) and + storeCandFwd2(f, config) and (stored = false or stored = true) ) or @@ -695,6 +711,7 @@ private predicate nodeCandFwd2(Node node, boolean fromArg, boolean stored, Confi /** * Holds if `f` is the target of a store in the flow covered by `nodeCandFwd2`. */ +pragma[noinline] private predicate storeCandFwd2(Content f, Configuration config) { exists(Node mid, Node node | useFieldFlow(config) and @@ -705,6 +722,15 @@ private predicate storeCandFwd2(Content f, Configuration config) { ) } +pragma[nomagic] +private predicate nodeCandFwd2Read(Content f, Node node, boolean fromArg, Configuration config) { + exists(Node mid | + nodeCandFwd2(mid, fromArg, true, config) and + read(mid, f, node) and + readCand1(f, unbind(config)) + ) +} + /** * Holds if `node` is part of a path from a source to a sink in the given * configuration taking simple call contexts into consideration. @@ -742,10 +768,9 @@ private predicate nodeCand2(Node node, boolean toReturn, boolean stored, Configu ) or // store - exists(Node mid, Content f | - store(node, f, mid) and - readCand2(f, unbind(config)) and - nodeCand2(mid, toReturn, true, config) and + exists(Content f | + nodeCand2Store(f, node, toReturn, config) and + readCand2(f, config) and (stored = false or stored = true) ) or @@ -776,6 +801,7 @@ private predicate nodeCand2(Node node, boolean toReturn, boolean stored, Configu /** * Holds if `f` is the target of a read in the flow covered by `nodeCand2`. */ +pragma[noinline] private predicate readCand2(Content f, Configuration config) { exists(Node mid, Node node | useFieldFlow(config) and @@ -786,16 +812,21 @@ private predicate readCand2(Content f, Configuration config) { ) } -pragma[nomagic] -private predicate storeCand(Content f, Configuration conf) { - exists(Node n1, Node n2 | - store(n1, f, n2) and - nodeCand2(n1, _, _, conf) and - nodeCand2(n2, _, _, unbind(conf)) +pragma[noinline] +private predicate nodeCand2Store(Content f, Node node, boolean toReturn, Configuration config) { + exists(Node mid | + store(node, f, mid) and + nodeCand2(mid, toReturn, true, config) ) } -private predicate readCand(Content f, Configuration conf) { readCand2(f, conf) } +pragma[nomagic] +private predicate storeCand(Content f, Configuration conf) { + exists(Node node | + nodeCand2Store(f, node, _, conf) and + nodeCand2(node, _, _, conf) + ) +} /** * Holds if `f` is the target of both a store and a read in the path graph @@ -804,7 +835,7 @@ private predicate readCand(Content f, Configuration conf) { readCand2(f, conf) } pragma[noinline] private predicate readStoreCand(Content f, Configuration conf) { storeCand(f, conf) and - readCand(f, conf) + readCand2(f, conf) } private predicate nodeCand(Node node, Configuration config) { nodeCand2(node, _, _, config) } @@ -1030,15 +1061,13 @@ private predicate flowCandFwd0(Node node, boolean fromArg, AccessPathFront apf, apf.headUsesContent(f) ) or - exists(Node mid, Content f, AccessPathFront apf0 | - flowCandFwd(mid, fromArg, apf0, config) and - read(mid, f, node) and - nodeCand(node, config) and - apf0.headUsesContent(f) and - consCandFwd(f, apf, unbind(config)) + exists(Content f | + flowCandFwdRead(f, node, fromArg, config) and + consCandFwd(f, apf, config) ) } +pragma[noinline] private predicate consCandFwd(Content f, AccessPathFront apf, Configuration config) { exists(Node mid, Node n | flowCandFwd(mid, _, apf, config) and @@ -1049,6 +1078,16 @@ private predicate consCandFwd(Content f, AccessPathFront apf, Configuration conf ) } +pragma[nomagic] +private predicate flowCandFwdRead(Content f, Node node, boolean fromArg, Configuration config) { + exists(Node mid, AccessPathFront apf | + flowCandFwd(mid, fromArg, apf, config) and + read(mid, f, node) and + apf.headUsesContent(f) and + nodeCand(node, unbind(config)) + ) +} + /** * Holds if data can flow from a source to `node` with the given `apf` and * from there flow to a sink. @@ -1139,6 +1178,7 @@ private predicate flowCandRead( ) } +pragma[nomagic] private predicate flowCandStore( Node node, Content f, boolean toReturn, AccessPathFront apf0, Configuration config ) { @@ -1148,6 +1188,7 @@ private predicate flowCandStore( ) } +pragma[noinline] private predicate consCand(Content f, AccessPathFront apf, Configuration config) { consCandFwd(f, apf, config) and exists(Node n, AccessPathFront apf0 | @@ -1672,6 +1713,7 @@ private predicate pathStep(PathNodeMid mid, Node node, CallContext cc, AccessPat valuePathThroughCallable(mid, node, cc) and ap = mid.getAp() } +pragma[noinline] private predicate contentReadStep(PathNodeMid mid, Node node, AccessPath ap) { exists(Content f, AccessPath ap0 | ap0 = mid.getAp() and diff --git a/csharp/ql/src/semmle/code/csharp/dataflow/internal/DataFlowImpl2.qll b/csharp/ql/src/semmle/code/csharp/dataflow/internal/DataFlowImpl2.qll index 796c20b35e3..931ab2e63f1 100644 --- a/csharp/ql/src/semmle/code/csharp/dataflow/internal/DataFlowImpl2.qll +++ b/csharp/ql/src/semmle/code/csharp/dataflow/internal/DataFlowImpl2.qll @@ -278,10 +278,9 @@ private predicate nodeCandFwd1(Node node, boolean stored, Configuration config) ) or // read - exists(Node mid, Content f | - nodeCandFwd1(mid, true, config) and - read(mid, f, node) and - storeCandFwd1(f, unbind(config)) and + exists(Content f | + nodeCandFwd1Read(f, node, config) and + storeCandFwd1(f, config) and (stored = false or stored = true) and not inBarrier(node, config) ) @@ -308,9 +307,18 @@ private predicate nodeCandFwd1(Node node, boolean stored, Configuration config) ) } +pragma[nomagic] +private predicate nodeCandFwd1Read(Content f, Node node, Configuration config) { + exists(Node mid | + nodeCandFwd1(mid, true, config) and + read(mid, f, node) + ) +} + /** * Holds if `f` is the target of a store in the flow covered by `nodeCandFwd1`. */ +pragma[noinline] private predicate storeCandFwd1(Content f, Configuration config) { exists(Node mid, Node node | not fullBarrier(node, config) and @@ -358,10 +366,9 @@ private predicate nodeCand1(Node node, boolean stored, Configuration config) { ) or // store - exists(Node mid, Content f | - store(node, f, mid) and - readCand1(f, unbind(config)) and - nodeCand1(mid, true, config) and + exists(Content f | + nodeCand1Store(f, node, config) and + readCand1(f, config) and (stored = false or stored = true) ) or @@ -398,6 +405,7 @@ private predicate nodeCand1(Node node, boolean stored, Configuration config) { /** * Holds if `f` is the target of a read in the flow covered by `nodeCand1`. */ +pragma[noinline] private predicate readCand1(Content f, Configuration config) { exists(Node mid, Node node | useFieldFlow(config) and @@ -408,6 +416,15 @@ private predicate readCand1(Content f, Configuration config) { ) } +pragma[nomagic] +private predicate nodeCand1Store(Content f, Node node, Configuration config) { + exists(Node mid | + nodeCand1(mid, true, config) and + storeCandFwd1(f, unbind(config)) and + store(node, f, mid) + ) +} + private predicate throughFlowNodeCand(Node node, Configuration config) { nodeCand1(node, false, config) and not fullBarrier(node, config) and @@ -669,10 +686,9 @@ private predicate nodeCandFwd2(Node node, boolean fromArg, boolean stored, Confi ) or // read - exists(Node mid, Content f | - nodeCandFwd2(mid, fromArg, true, config) and - read(mid, f, node) and - storeCandFwd2(f, unbind(config)) and + exists(Content f | + nodeCandFwd2Read(f, node, fromArg, config) and + storeCandFwd2(f, config) and (stored = false or stored = true) ) or @@ -695,6 +711,7 @@ private predicate nodeCandFwd2(Node node, boolean fromArg, boolean stored, Confi /** * Holds if `f` is the target of a store in the flow covered by `nodeCandFwd2`. */ +pragma[noinline] private predicate storeCandFwd2(Content f, Configuration config) { exists(Node mid, Node node | useFieldFlow(config) and @@ -705,6 +722,15 @@ private predicate storeCandFwd2(Content f, Configuration config) { ) } +pragma[nomagic] +private predicate nodeCandFwd2Read(Content f, Node node, boolean fromArg, Configuration config) { + exists(Node mid | + nodeCandFwd2(mid, fromArg, true, config) and + read(mid, f, node) and + readCand1(f, unbind(config)) + ) +} + /** * Holds if `node` is part of a path from a source to a sink in the given * configuration taking simple call contexts into consideration. @@ -742,10 +768,9 @@ private predicate nodeCand2(Node node, boolean toReturn, boolean stored, Configu ) or // store - exists(Node mid, Content f | - store(node, f, mid) and - readCand2(f, unbind(config)) and - nodeCand2(mid, toReturn, true, config) and + exists(Content f | + nodeCand2Store(f, node, toReturn, config) and + readCand2(f, config) and (stored = false or stored = true) ) or @@ -776,6 +801,7 @@ private predicate nodeCand2(Node node, boolean toReturn, boolean stored, Configu /** * Holds if `f` is the target of a read in the flow covered by `nodeCand2`. */ +pragma[noinline] private predicate readCand2(Content f, Configuration config) { exists(Node mid, Node node | useFieldFlow(config) and @@ -786,16 +812,21 @@ private predicate readCand2(Content f, Configuration config) { ) } -pragma[nomagic] -private predicate storeCand(Content f, Configuration conf) { - exists(Node n1, Node n2 | - store(n1, f, n2) and - nodeCand2(n1, _, _, conf) and - nodeCand2(n2, _, _, unbind(conf)) +pragma[noinline] +private predicate nodeCand2Store(Content f, Node node, boolean toReturn, Configuration config) { + exists(Node mid | + store(node, f, mid) and + nodeCand2(mid, toReturn, true, config) ) } -private predicate readCand(Content f, Configuration conf) { readCand2(f, conf) } +pragma[nomagic] +private predicate storeCand(Content f, Configuration conf) { + exists(Node node | + nodeCand2Store(f, node, _, conf) and + nodeCand2(node, _, _, conf) + ) +} /** * Holds if `f` is the target of both a store and a read in the path graph @@ -804,7 +835,7 @@ private predicate readCand(Content f, Configuration conf) { readCand2(f, conf) } pragma[noinline] private predicate readStoreCand(Content f, Configuration conf) { storeCand(f, conf) and - readCand(f, conf) + readCand2(f, conf) } private predicate nodeCand(Node node, Configuration config) { nodeCand2(node, _, _, config) } @@ -1030,15 +1061,13 @@ private predicate flowCandFwd0(Node node, boolean fromArg, AccessPathFront apf, apf.headUsesContent(f) ) or - exists(Node mid, Content f, AccessPathFront apf0 | - flowCandFwd(mid, fromArg, apf0, config) and - read(mid, f, node) and - nodeCand(node, config) and - apf0.headUsesContent(f) and - consCandFwd(f, apf, unbind(config)) + exists(Content f | + flowCandFwdRead(f, node, fromArg, config) and + consCandFwd(f, apf, config) ) } +pragma[noinline] private predicate consCandFwd(Content f, AccessPathFront apf, Configuration config) { exists(Node mid, Node n | flowCandFwd(mid, _, apf, config) and @@ -1049,6 +1078,16 @@ private predicate consCandFwd(Content f, AccessPathFront apf, Configuration conf ) } +pragma[nomagic] +private predicate flowCandFwdRead(Content f, Node node, boolean fromArg, Configuration config) { + exists(Node mid, AccessPathFront apf | + flowCandFwd(mid, fromArg, apf, config) and + read(mid, f, node) and + apf.headUsesContent(f) and + nodeCand(node, unbind(config)) + ) +} + /** * Holds if data can flow from a source to `node` with the given `apf` and * from there flow to a sink. @@ -1139,6 +1178,7 @@ private predicate flowCandRead( ) } +pragma[nomagic] private predicate flowCandStore( Node node, Content f, boolean toReturn, AccessPathFront apf0, Configuration config ) { @@ -1148,6 +1188,7 @@ private predicate flowCandStore( ) } +pragma[noinline] private predicate consCand(Content f, AccessPathFront apf, Configuration config) { consCandFwd(f, apf, config) and exists(Node n, AccessPathFront apf0 | @@ -1672,6 +1713,7 @@ private predicate pathStep(PathNodeMid mid, Node node, CallContext cc, AccessPat valuePathThroughCallable(mid, node, cc) and ap = mid.getAp() } +pragma[noinline] private predicate contentReadStep(PathNodeMid mid, Node node, AccessPath ap) { exists(Content f, AccessPath ap0 | ap0 = mid.getAp() and diff --git a/csharp/ql/src/semmle/code/csharp/dataflow/internal/DataFlowImpl3.qll b/csharp/ql/src/semmle/code/csharp/dataflow/internal/DataFlowImpl3.qll index 796c20b35e3..931ab2e63f1 100644 --- a/csharp/ql/src/semmle/code/csharp/dataflow/internal/DataFlowImpl3.qll +++ b/csharp/ql/src/semmle/code/csharp/dataflow/internal/DataFlowImpl3.qll @@ -278,10 +278,9 @@ private predicate nodeCandFwd1(Node node, boolean stored, Configuration config) ) or // read - exists(Node mid, Content f | - nodeCandFwd1(mid, true, config) and - read(mid, f, node) and - storeCandFwd1(f, unbind(config)) and + exists(Content f | + nodeCandFwd1Read(f, node, config) and + storeCandFwd1(f, config) and (stored = false or stored = true) and not inBarrier(node, config) ) @@ -308,9 +307,18 @@ private predicate nodeCandFwd1(Node node, boolean stored, Configuration config) ) } +pragma[nomagic] +private predicate nodeCandFwd1Read(Content f, Node node, Configuration config) { + exists(Node mid | + nodeCandFwd1(mid, true, config) and + read(mid, f, node) + ) +} + /** * Holds if `f` is the target of a store in the flow covered by `nodeCandFwd1`. */ +pragma[noinline] private predicate storeCandFwd1(Content f, Configuration config) { exists(Node mid, Node node | not fullBarrier(node, config) and @@ -358,10 +366,9 @@ private predicate nodeCand1(Node node, boolean stored, Configuration config) { ) or // store - exists(Node mid, Content f | - store(node, f, mid) and - readCand1(f, unbind(config)) and - nodeCand1(mid, true, config) and + exists(Content f | + nodeCand1Store(f, node, config) and + readCand1(f, config) and (stored = false or stored = true) ) or @@ -398,6 +405,7 @@ private predicate nodeCand1(Node node, boolean stored, Configuration config) { /** * Holds if `f` is the target of a read in the flow covered by `nodeCand1`. */ +pragma[noinline] private predicate readCand1(Content f, Configuration config) { exists(Node mid, Node node | useFieldFlow(config) and @@ -408,6 +416,15 @@ private predicate readCand1(Content f, Configuration config) { ) } +pragma[nomagic] +private predicate nodeCand1Store(Content f, Node node, Configuration config) { + exists(Node mid | + nodeCand1(mid, true, config) and + storeCandFwd1(f, unbind(config)) and + store(node, f, mid) + ) +} + private predicate throughFlowNodeCand(Node node, Configuration config) { nodeCand1(node, false, config) and not fullBarrier(node, config) and @@ -669,10 +686,9 @@ private predicate nodeCandFwd2(Node node, boolean fromArg, boolean stored, Confi ) or // read - exists(Node mid, Content f | - nodeCandFwd2(mid, fromArg, true, config) and - read(mid, f, node) and - storeCandFwd2(f, unbind(config)) and + exists(Content f | + nodeCandFwd2Read(f, node, fromArg, config) and + storeCandFwd2(f, config) and (stored = false or stored = true) ) or @@ -695,6 +711,7 @@ private predicate nodeCandFwd2(Node node, boolean fromArg, boolean stored, Confi /** * Holds if `f` is the target of a store in the flow covered by `nodeCandFwd2`. */ +pragma[noinline] private predicate storeCandFwd2(Content f, Configuration config) { exists(Node mid, Node node | useFieldFlow(config) and @@ -705,6 +722,15 @@ private predicate storeCandFwd2(Content f, Configuration config) { ) } +pragma[nomagic] +private predicate nodeCandFwd2Read(Content f, Node node, boolean fromArg, Configuration config) { + exists(Node mid | + nodeCandFwd2(mid, fromArg, true, config) and + read(mid, f, node) and + readCand1(f, unbind(config)) + ) +} + /** * Holds if `node` is part of a path from a source to a sink in the given * configuration taking simple call contexts into consideration. @@ -742,10 +768,9 @@ private predicate nodeCand2(Node node, boolean toReturn, boolean stored, Configu ) or // store - exists(Node mid, Content f | - store(node, f, mid) and - readCand2(f, unbind(config)) and - nodeCand2(mid, toReturn, true, config) and + exists(Content f | + nodeCand2Store(f, node, toReturn, config) and + readCand2(f, config) and (stored = false or stored = true) ) or @@ -776,6 +801,7 @@ private predicate nodeCand2(Node node, boolean toReturn, boolean stored, Configu /** * Holds if `f` is the target of a read in the flow covered by `nodeCand2`. */ +pragma[noinline] private predicate readCand2(Content f, Configuration config) { exists(Node mid, Node node | useFieldFlow(config) and @@ -786,16 +812,21 @@ private predicate readCand2(Content f, Configuration config) { ) } -pragma[nomagic] -private predicate storeCand(Content f, Configuration conf) { - exists(Node n1, Node n2 | - store(n1, f, n2) and - nodeCand2(n1, _, _, conf) and - nodeCand2(n2, _, _, unbind(conf)) +pragma[noinline] +private predicate nodeCand2Store(Content f, Node node, boolean toReturn, Configuration config) { + exists(Node mid | + store(node, f, mid) and + nodeCand2(mid, toReturn, true, config) ) } -private predicate readCand(Content f, Configuration conf) { readCand2(f, conf) } +pragma[nomagic] +private predicate storeCand(Content f, Configuration conf) { + exists(Node node | + nodeCand2Store(f, node, _, conf) and + nodeCand2(node, _, _, conf) + ) +} /** * Holds if `f` is the target of both a store and a read in the path graph @@ -804,7 +835,7 @@ private predicate readCand(Content f, Configuration conf) { readCand2(f, conf) } pragma[noinline] private predicate readStoreCand(Content f, Configuration conf) { storeCand(f, conf) and - readCand(f, conf) + readCand2(f, conf) } private predicate nodeCand(Node node, Configuration config) { nodeCand2(node, _, _, config) } @@ -1030,15 +1061,13 @@ private predicate flowCandFwd0(Node node, boolean fromArg, AccessPathFront apf, apf.headUsesContent(f) ) or - exists(Node mid, Content f, AccessPathFront apf0 | - flowCandFwd(mid, fromArg, apf0, config) and - read(mid, f, node) and - nodeCand(node, config) and - apf0.headUsesContent(f) and - consCandFwd(f, apf, unbind(config)) + exists(Content f | + flowCandFwdRead(f, node, fromArg, config) and + consCandFwd(f, apf, config) ) } +pragma[noinline] private predicate consCandFwd(Content f, AccessPathFront apf, Configuration config) { exists(Node mid, Node n | flowCandFwd(mid, _, apf, config) and @@ -1049,6 +1078,16 @@ private predicate consCandFwd(Content f, AccessPathFront apf, Configuration conf ) } +pragma[nomagic] +private predicate flowCandFwdRead(Content f, Node node, boolean fromArg, Configuration config) { + exists(Node mid, AccessPathFront apf | + flowCandFwd(mid, fromArg, apf, config) and + read(mid, f, node) and + apf.headUsesContent(f) and + nodeCand(node, unbind(config)) + ) +} + /** * Holds if data can flow from a source to `node` with the given `apf` and * from there flow to a sink. @@ -1139,6 +1178,7 @@ private predicate flowCandRead( ) } +pragma[nomagic] private predicate flowCandStore( Node node, Content f, boolean toReturn, AccessPathFront apf0, Configuration config ) { @@ -1148,6 +1188,7 @@ private predicate flowCandStore( ) } +pragma[noinline] private predicate consCand(Content f, AccessPathFront apf, Configuration config) { consCandFwd(f, apf, config) and exists(Node n, AccessPathFront apf0 | @@ -1672,6 +1713,7 @@ private predicate pathStep(PathNodeMid mid, Node node, CallContext cc, AccessPat valuePathThroughCallable(mid, node, cc) and ap = mid.getAp() } +pragma[noinline] private predicate contentReadStep(PathNodeMid mid, Node node, AccessPath ap) { exists(Content f, AccessPath ap0 | ap0 = mid.getAp() and diff --git a/csharp/ql/src/semmle/code/csharp/dataflow/internal/DataFlowImpl4.qll b/csharp/ql/src/semmle/code/csharp/dataflow/internal/DataFlowImpl4.qll index 796c20b35e3..931ab2e63f1 100644 --- a/csharp/ql/src/semmle/code/csharp/dataflow/internal/DataFlowImpl4.qll +++ b/csharp/ql/src/semmle/code/csharp/dataflow/internal/DataFlowImpl4.qll @@ -278,10 +278,9 @@ private predicate nodeCandFwd1(Node node, boolean stored, Configuration config) ) or // read - exists(Node mid, Content f | - nodeCandFwd1(mid, true, config) and - read(mid, f, node) and - storeCandFwd1(f, unbind(config)) and + exists(Content f | + nodeCandFwd1Read(f, node, config) and + storeCandFwd1(f, config) and (stored = false or stored = true) and not inBarrier(node, config) ) @@ -308,9 +307,18 @@ private predicate nodeCandFwd1(Node node, boolean stored, Configuration config) ) } +pragma[nomagic] +private predicate nodeCandFwd1Read(Content f, Node node, Configuration config) { + exists(Node mid | + nodeCandFwd1(mid, true, config) and + read(mid, f, node) + ) +} + /** * Holds if `f` is the target of a store in the flow covered by `nodeCandFwd1`. */ +pragma[noinline] private predicate storeCandFwd1(Content f, Configuration config) { exists(Node mid, Node node | not fullBarrier(node, config) and @@ -358,10 +366,9 @@ private predicate nodeCand1(Node node, boolean stored, Configuration config) { ) or // store - exists(Node mid, Content f | - store(node, f, mid) and - readCand1(f, unbind(config)) and - nodeCand1(mid, true, config) and + exists(Content f | + nodeCand1Store(f, node, config) and + readCand1(f, config) and (stored = false or stored = true) ) or @@ -398,6 +405,7 @@ private predicate nodeCand1(Node node, boolean stored, Configuration config) { /** * Holds if `f` is the target of a read in the flow covered by `nodeCand1`. */ +pragma[noinline] private predicate readCand1(Content f, Configuration config) { exists(Node mid, Node node | useFieldFlow(config) and @@ -408,6 +416,15 @@ private predicate readCand1(Content f, Configuration config) { ) } +pragma[nomagic] +private predicate nodeCand1Store(Content f, Node node, Configuration config) { + exists(Node mid | + nodeCand1(mid, true, config) and + storeCandFwd1(f, unbind(config)) and + store(node, f, mid) + ) +} + private predicate throughFlowNodeCand(Node node, Configuration config) { nodeCand1(node, false, config) and not fullBarrier(node, config) and @@ -669,10 +686,9 @@ private predicate nodeCandFwd2(Node node, boolean fromArg, boolean stored, Confi ) or // read - exists(Node mid, Content f | - nodeCandFwd2(mid, fromArg, true, config) and - read(mid, f, node) and - storeCandFwd2(f, unbind(config)) and + exists(Content f | + nodeCandFwd2Read(f, node, fromArg, config) and + storeCandFwd2(f, config) and (stored = false or stored = true) ) or @@ -695,6 +711,7 @@ private predicate nodeCandFwd2(Node node, boolean fromArg, boolean stored, Confi /** * Holds if `f` is the target of a store in the flow covered by `nodeCandFwd2`. */ +pragma[noinline] private predicate storeCandFwd2(Content f, Configuration config) { exists(Node mid, Node node | useFieldFlow(config) and @@ -705,6 +722,15 @@ private predicate storeCandFwd2(Content f, Configuration config) { ) } +pragma[nomagic] +private predicate nodeCandFwd2Read(Content f, Node node, boolean fromArg, Configuration config) { + exists(Node mid | + nodeCandFwd2(mid, fromArg, true, config) and + read(mid, f, node) and + readCand1(f, unbind(config)) + ) +} + /** * Holds if `node` is part of a path from a source to a sink in the given * configuration taking simple call contexts into consideration. @@ -742,10 +768,9 @@ private predicate nodeCand2(Node node, boolean toReturn, boolean stored, Configu ) or // store - exists(Node mid, Content f | - store(node, f, mid) and - readCand2(f, unbind(config)) and - nodeCand2(mid, toReturn, true, config) and + exists(Content f | + nodeCand2Store(f, node, toReturn, config) and + readCand2(f, config) and (stored = false or stored = true) ) or @@ -776,6 +801,7 @@ private predicate nodeCand2(Node node, boolean toReturn, boolean stored, Configu /** * Holds if `f` is the target of a read in the flow covered by `nodeCand2`. */ +pragma[noinline] private predicate readCand2(Content f, Configuration config) { exists(Node mid, Node node | useFieldFlow(config) and @@ -786,16 +812,21 @@ private predicate readCand2(Content f, Configuration config) { ) } -pragma[nomagic] -private predicate storeCand(Content f, Configuration conf) { - exists(Node n1, Node n2 | - store(n1, f, n2) and - nodeCand2(n1, _, _, conf) and - nodeCand2(n2, _, _, unbind(conf)) +pragma[noinline] +private predicate nodeCand2Store(Content f, Node node, boolean toReturn, Configuration config) { + exists(Node mid | + store(node, f, mid) and + nodeCand2(mid, toReturn, true, config) ) } -private predicate readCand(Content f, Configuration conf) { readCand2(f, conf) } +pragma[nomagic] +private predicate storeCand(Content f, Configuration conf) { + exists(Node node | + nodeCand2Store(f, node, _, conf) and + nodeCand2(node, _, _, conf) + ) +} /** * Holds if `f` is the target of both a store and a read in the path graph @@ -804,7 +835,7 @@ private predicate readCand(Content f, Configuration conf) { readCand2(f, conf) } pragma[noinline] private predicate readStoreCand(Content f, Configuration conf) { storeCand(f, conf) and - readCand(f, conf) + readCand2(f, conf) } private predicate nodeCand(Node node, Configuration config) { nodeCand2(node, _, _, config) } @@ -1030,15 +1061,13 @@ private predicate flowCandFwd0(Node node, boolean fromArg, AccessPathFront apf, apf.headUsesContent(f) ) or - exists(Node mid, Content f, AccessPathFront apf0 | - flowCandFwd(mid, fromArg, apf0, config) and - read(mid, f, node) and - nodeCand(node, config) and - apf0.headUsesContent(f) and - consCandFwd(f, apf, unbind(config)) + exists(Content f | + flowCandFwdRead(f, node, fromArg, config) and + consCandFwd(f, apf, config) ) } +pragma[noinline] private predicate consCandFwd(Content f, AccessPathFront apf, Configuration config) { exists(Node mid, Node n | flowCandFwd(mid, _, apf, config) and @@ -1049,6 +1078,16 @@ private predicate consCandFwd(Content f, AccessPathFront apf, Configuration conf ) } +pragma[nomagic] +private predicate flowCandFwdRead(Content f, Node node, boolean fromArg, Configuration config) { + exists(Node mid, AccessPathFront apf | + flowCandFwd(mid, fromArg, apf, config) and + read(mid, f, node) and + apf.headUsesContent(f) and + nodeCand(node, unbind(config)) + ) +} + /** * Holds if data can flow from a source to `node` with the given `apf` and * from there flow to a sink. @@ -1139,6 +1178,7 @@ private predicate flowCandRead( ) } +pragma[nomagic] private predicate flowCandStore( Node node, Content f, boolean toReturn, AccessPathFront apf0, Configuration config ) { @@ -1148,6 +1188,7 @@ private predicate flowCandStore( ) } +pragma[noinline] private predicate consCand(Content f, AccessPathFront apf, Configuration config) { consCandFwd(f, apf, config) and exists(Node n, AccessPathFront apf0 | @@ -1672,6 +1713,7 @@ private predicate pathStep(PathNodeMid mid, Node node, CallContext cc, AccessPat valuePathThroughCallable(mid, node, cc) and ap = mid.getAp() } +pragma[noinline] private predicate contentReadStep(PathNodeMid mid, Node node, AccessPath ap) { exists(Content f, AccessPath ap0 | ap0 = mid.getAp() and diff --git a/csharp/ql/src/semmle/code/csharp/dataflow/internal/DataFlowImpl5.qll b/csharp/ql/src/semmle/code/csharp/dataflow/internal/DataFlowImpl5.qll index 796c20b35e3..931ab2e63f1 100644 --- a/csharp/ql/src/semmle/code/csharp/dataflow/internal/DataFlowImpl5.qll +++ b/csharp/ql/src/semmle/code/csharp/dataflow/internal/DataFlowImpl5.qll @@ -278,10 +278,9 @@ private predicate nodeCandFwd1(Node node, boolean stored, Configuration config) ) or // read - exists(Node mid, Content f | - nodeCandFwd1(mid, true, config) and - read(mid, f, node) and - storeCandFwd1(f, unbind(config)) and + exists(Content f | + nodeCandFwd1Read(f, node, config) and + storeCandFwd1(f, config) and (stored = false or stored = true) and not inBarrier(node, config) ) @@ -308,9 +307,18 @@ private predicate nodeCandFwd1(Node node, boolean stored, Configuration config) ) } +pragma[nomagic] +private predicate nodeCandFwd1Read(Content f, Node node, Configuration config) { + exists(Node mid | + nodeCandFwd1(mid, true, config) and + read(mid, f, node) + ) +} + /** * Holds if `f` is the target of a store in the flow covered by `nodeCandFwd1`. */ +pragma[noinline] private predicate storeCandFwd1(Content f, Configuration config) { exists(Node mid, Node node | not fullBarrier(node, config) and @@ -358,10 +366,9 @@ private predicate nodeCand1(Node node, boolean stored, Configuration config) { ) or // store - exists(Node mid, Content f | - store(node, f, mid) and - readCand1(f, unbind(config)) and - nodeCand1(mid, true, config) and + exists(Content f | + nodeCand1Store(f, node, config) and + readCand1(f, config) and (stored = false or stored = true) ) or @@ -398,6 +405,7 @@ private predicate nodeCand1(Node node, boolean stored, Configuration config) { /** * Holds if `f` is the target of a read in the flow covered by `nodeCand1`. */ +pragma[noinline] private predicate readCand1(Content f, Configuration config) { exists(Node mid, Node node | useFieldFlow(config) and @@ -408,6 +416,15 @@ private predicate readCand1(Content f, Configuration config) { ) } +pragma[nomagic] +private predicate nodeCand1Store(Content f, Node node, Configuration config) { + exists(Node mid | + nodeCand1(mid, true, config) and + storeCandFwd1(f, unbind(config)) and + store(node, f, mid) + ) +} + private predicate throughFlowNodeCand(Node node, Configuration config) { nodeCand1(node, false, config) and not fullBarrier(node, config) and @@ -669,10 +686,9 @@ private predicate nodeCandFwd2(Node node, boolean fromArg, boolean stored, Confi ) or // read - exists(Node mid, Content f | - nodeCandFwd2(mid, fromArg, true, config) and - read(mid, f, node) and - storeCandFwd2(f, unbind(config)) and + exists(Content f | + nodeCandFwd2Read(f, node, fromArg, config) and + storeCandFwd2(f, config) and (stored = false or stored = true) ) or @@ -695,6 +711,7 @@ private predicate nodeCandFwd2(Node node, boolean fromArg, boolean stored, Confi /** * Holds if `f` is the target of a store in the flow covered by `nodeCandFwd2`. */ +pragma[noinline] private predicate storeCandFwd2(Content f, Configuration config) { exists(Node mid, Node node | useFieldFlow(config) and @@ -705,6 +722,15 @@ private predicate storeCandFwd2(Content f, Configuration config) { ) } +pragma[nomagic] +private predicate nodeCandFwd2Read(Content f, Node node, boolean fromArg, Configuration config) { + exists(Node mid | + nodeCandFwd2(mid, fromArg, true, config) and + read(mid, f, node) and + readCand1(f, unbind(config)) + ) +} + /** * Holds if `node` is part of a path from a source to a sink in the given * configuration taking simple call contexts into consideration. @@ -742,10 +768,9 @@ private predicate nodeCand2(Node node, boolean toReturn, boolean stored, Configu ) or // store - exists(Node mid, Content f | - store(node, f, mid) and - readCand2(f, unbind(config)) and - nodeCand2(mid, toReturn, true, config) and + exists(Content f | + nodeCand2Store(f, node, toReturn, config) and + readCand2(f, config) and (stored = false or stored = true) ) or @@ -776,6 +801,7 @@ private predicate nodeCand2(Node node, boolean toReturn, boolean stored, Configu /** * Holds if `f` is the target of a read in the flow covered by `nodeCand2`. */ +pragma[noinline] private predicate readCand2(Content f, Configuration config) { exists(Node mid, Node node | useFieldFlow(config) and @@ -786,16 +812,21 @@ private predicate readCand2(Content f, Configuration config) { ) } -pragma[nomagic] -private predicate storeCand(Content f, Configuration conf) { - exists(Node n1, Node n2 | - store(n1, f, n2) and - nodeCand2(n1, _, _, conf) and - nodeCand2(n2, _, _, unbind(conf)) +pragma[noinline] +private predicate nodeCand2Store(Content f, Node node, boolean toReturn, Configuration config) { + exists(Node mid | + store(node, f, mid) and + nodeCand2(mid, toReturn, true, config) ) } -private predicate readCand(Content f, Configuration conf) { readCand2(f, conf) } +pragma[nomagic] +private predicate storeCand(Content f, Configuration conf) { + exists(Node node | + nodeCand2Store(f, node, _, conf) and + nodeCand2(node, _, _, conf) + ) +} /** * Holds if `f` is the target of both a store and a read in the path graph @@ -804,7 +835,7 @@ private predicate readCand(Content f, Configuration conf) { readCand2(f, conf) } pragma[noinline] private predicate readStoreCand(Content f, Configuration conf) { storeCand(f, conf) and - readCand(f, conf) + readCand2(f, conf) } private predicate nodeCand(Node node, Configuration config) { nodeCand2(node, _, _, config) } @@ -1030,15 +1061,13 @@ private predicate flowCandFwd0(Node node, boolean fromArg, AccessPathFront apf, apf.headUsesContent(f) ) or - exists(Node mid, Content f, AccessPathFront apf0 | - flowCandFwd(mid, fromArg, apf0, config) and - read(mid, f, node) and - nodeCand(node, config) and - apf0.headUsesContent(f) and - consCandFwd(f, apf, unbind(config)) + exists(Content f | + flowCandFwdRead(f, node, fromArg, config) and + consCandFwd(f, apf, config) ) } +pragma[noinline] private predicate consCandFwd(Content f, AccessPathFront apf, Configuration config) { exists(Node mid, Node n | flowCandFwd(mid, _, apf, config) and @@ -1049,6 +1078,16 @@ private predicate consCandFwd(Content f, AccessPathFront apf, Configuration conf ) } +pragma[nomagic] +private predicate flowCandFwdRead(Content f, Node node, boolean fromArg, Configuration config) { + exists(Node mid, AccessPathFront apf | + flowCandFwd(mid, fromArg, apf, config) and + read(mid, f, node) and + apf.headUsesContent(f) and + nodeCand(node, unbind(config)) + ) +} + /** * Holds if data can flow from a source to `node` with the given `apf` and * from there flow to a sink. @@ -1139,6 +1178,7 @@ private predicate flowCandRead( ) } +pragma[nomagic] private predicate flowCandStore( Node node, Content f, boolean toReturn, AccessPathFront apf0, Configuration config ) { @@ -1148,6 +1188,7 @@ private predicate flowCandStore( ) } +pragma[noinline] private predicate consCand(Content f, AccessPathFront apf, Configuration config) { consCandFwd(f, apf, config) and exists(Node n, AccessPathFront apf0 | @@ -1672,6 +1713,7 @@ private predicate pathStep(PathNodeMid mid, Node node, CallContext cc, AccessPat valuePathThroughCallable(mid, node, cc) and ap = mid.getAp() } +pragma[noinline] private predicate contentReadStep(PathNodeMid mid, Node node, AccessPath ap) { exists(Content f, AccessPath ap0 | ap0 = mid.getAp() and diff --git a/csharp/ql/src/semmle/code/csharp/dataflow/internal/DataFlowPrivate.qll b/csharp/ql/src/semmle/code/csharp/dataflow/internal/DataFlowPrivate.qll index 15c7b055d97..4068f4c3b98 100644 --- a/csharp/ql/src/semmle/code/csharp/dataflow/internal/DataFlowPrivate.qll +++ b/csharp/ql/src/semmle/code/csharp/dataflow/internal/DataFlowPrivate.qll @@ -7,6 +7,7 @@ private import DataFlowImplCommon private import ControlFlowReachability private import DelegateDataFlow private import semmle.code.csharp.Caching +private import semmle.code.csharp.ExprOrStmtParent private import semmle.code.csharp.dataflow.LibraryTypeDataFlow private import semmle.code.csharp.dispatch.Dispatch private import semmle.code.csharp.frameworks.EntityFramework @@ -14,7 +15,7 @@ private import semmle.code.csharp.frameworks.NHibernate /** Calculation of the relative order in which `this` references are read. */ private module ThisFlow { - class BasicBlock = ControlFlow::BasicBlock; + private class BasicBlock = ControlFlow::BasicBlock; /** Holds if `n` is a `this` access at control flow node `cfn`. */ private predicate thisAccess(Node n, ControlFlow::Node cfn) { @@ -220,6 +221,54 @@ module LocalFlow { } } +/** An argument of a C# call. */ +private class Argument extends Expr { + private Expr call; + + private int arg; + + Argument() { + call = any(DispatchCall dc | + this = dc.getArgument(arg) + or + this = dc.getQualifier() and arg = -1 and not dc.getAStaticTarget().(Modifiable).isStatic() + ).getCall() + or + this = call.(DelegateCall).getArgument(arg) + } + + /** Holds if this expression is the `i`th argument of `c`. */ + predicate isArgumentOf(Expr c, int i) { c = call and i = arg } +} + +/** + * Holds if `e` is an assignment of `src` to a non-static field or field-like + * property `f` of `q`. + */ +private predicate instanceFieldLikeAssign(Expr e, FieldLike f, Expr src, Expr q) { + exists(FieldLikeAccess fa, AssignableDefinition def | + def.getTargetAccess() = fa and + f = fa.getTarget() and + not f.isStatic() and + src = def.getSource() and + q = fa.getQualifier() and + e = def.getExpr() + ) +} + +/** + * Holds if `oc` has an object initializer that assigns `src` to non-static field or + * field-like property `f`. + */ +private predicate instanceFieldLikeInit(ObjectCreation oc, FieldLike f, Expr src) { + exists(MemberInitializer mi | + mi = oc.getInitializer().(ObjectInitializer).getAMemberInitializer() and + f = mi.getInitializedMember() and + not f.isStatic() and + src = mi.getRValue() + ) +} + /** A collection of cached types and predicates to be evaluated in the same stage. */ cached private module Cached { @@ -247,7 +296,19 @@ private module Cached { cfn.getElement() instanceof DelegateArgumentToLibraryCallable and any(DelegateArgumentConfiguration x).hasExprPath(_, cfn, _, call) } or - TMallocNode(ControlFlow::Nodes::ElementNode cfn) { cfn.getElement() instanceof ObjectCreation } + TMallocNode(ControlFlow::Nodes::ElementNode cfn) { cfn.getElement() instanceof ObjectCreation } or + TArgumentPostCallNode(ControlFlow::Nodes::ElementNode cfn) { + exists(Argument a, Type t | + a = cfn.getElement() and + t = a.stripCasts().getType() + | + t instanceof RefType or + t = any(TypeParameter tp | not tp.isValueType()) + ) + } or + TStoreTargetNode(ControlFlow::Nodes::ElementNode cfn) { + instanceFieldLikeAssign(_, _, _, cfn.getElement()) + } /** * This is the local flow predicate that's used as a building block in global @@ -266,14 +327,18 @@ private module Cached { or // Flow from read to next read exists(ControlFlow::Node cfnFrom, ControlFlow::Node cfnTo | - Ssa::Internal::adjacentReadPairSameVar(cfnFrom, cfnTo) - | - nodeFrom = TExprNode(cfnFrom) and + Ssa::Internal::adjacentReadPairSameVar(cfnFrom, cfnTo) and nodeTo = TExprNode(cfnTo) + | + nodeFrom = TExprNode(cfnFrom) + or + cfnFrom = nodeFrom.(PostUpdateNode).getPreUpdateNode().getControlFlowNode() ) or ThisFlow::adjacentThisRefs(nodeFrom, nodeTo) or + ThisFlow::adjacentThisRefs(nodeFrom.(PostUpdateNode).getPreUpdateNode(), nodeTo) + or // Flow into SSA pseudo definition exists(Ssa::Definition def, Ssa::PseudoDefinition pseudo | LocalFlow::localFlowSsaInput(nodeFrom, def) @@ -308,6 +373,39 @@ private module Cached { predicate jumpStepImpl(ExprNode pred, ExprNode succ) { pred.(NonLocalJumpNode).getAJumpSuccessor(true) = succ } + + cached + newtype TContent = TFieldLikeContent(FieldLike f) { not f.isStatic() } + + /** + * Holds if data can flow from `node1` to `node2` via an assignment to + * content `c`. + */ + cached + predicate storeStepImpl(ExprNode node1, Content c, PostUpdateNode node2) { + exists(StoreStepConfiguration x, Node preNode2 | + preNode2 = node2.getPreUpdateNode() and + x.hasNodePath(node1, preNode2) and + instanceFieldLikeAssign(_, c.(FieldLikeContent).getField(), node1.asExpr(), preNode2.asExpr()) + ) + or + exists(StoreStepConfiguration x | + x.hasNodePath(node1, node2) and + instanceFieldLikeInit(node2.(ObjectCreationNode).getExpr(), c.(FieldLikeContent).getField(), + node1.asExpr()) + ) + } + + /** + * Holds if data can flow from `node1` to `node2` via a read of content `c`. + */ + cached + predicate readStepImpl(Node node1, Content c, Node node2) { + exists(ReadStepConfiguration x | + x.hasNodePath(node1, node2) and + c.(FieldLikeContent).getField() = node2.asExpr().(FieldLikeRead).getTarget() + ) + } } import Cached @@ -359,7 +457,7 @@ private module ParameterNodes { override DotNet::Parameter getParameter() { result = parameter } - override predicate isParameterOf(DotNet::Callable c, int i) { c.getParameter(i) = parameter } + override predicate isParameterOf(DataFlowCallable c, int i) { c.getParameter(i) = parameter } override DotNet::Callable getEnclosingCallable() { result = parameter.getCallable() } @@ -379,7 +477,7 @@ private module ParameterNodes { /** Gets the callable containing this implicit instance parameter. */ Callable getCallable() { result = callable } - override predicate isParameterOf(DotNet::Callable c, int pos) { callable = c and pos = -1 } + override predicate isParameterOf(DataFlowCallable c, int pos) { callable = c and pos = -1 } override Callable getEnclosingCallable() { result = callable } @@ -406,7 +504,7 @@ private module ParameterNodes { // `getParameter()` is explicitly *not* overriden to return `parameter`, // as that would otherwise enable tainted parameters to accidentally be // used by users of the library - override predicate isParameterOf(DotNet::Callable c, int i) { + override predicate isParameterOf(DataFlowCallable c, int i) { c = parameter.getCallable() and // we model tainted parameters as if they had been extra parameters after // the actual parameters @@ -483,7 +581,7 @@ private module ParameterNodes { /** Gets the captured variable that this implicit parameter models. */ LocalScopeVariable getVariable() { result = def.getVariable() } - override predicate isParameterOf(DotNet::Callable c, int i) { + override predicate isParameterOf(DataFlowCallable c, int i) { i = getParameterPosition(def) and c = this.getEnclosingCallable() } @@ -491,6 +589,16 @@ private module ParameterNodes { } import ParameterNodes +/** A data flow node that represents a call argument. */ +abstract class ArgumentNode extends Node { + /** Holds if this argument occurs at the given position in the given call. */ + cached + abstract predicate argumentOf(DataFlowCall call, int pos); + + /** Gets the call in which this node is an argument. */ + final DataFlowCall getCall() { this.argumentOf(result, _) } +} + private module ArgumentNodes { class DelegateArgumentConfiguration extends ControlFlowReachabilityConfiguration { DelegateArgumentConfiguration() { this = "DelegateArgumentConfiguration" } @@ -508,9 +616,9 @@ private module ArgumentNodes { } /** - * Holds if `arg` is an argument of the call `call`, which resolves to a - * library callable that is known to forward `arg` into the `i`th parameter - * of a supplied delegate `delegate`. + * Holds if `arg` is an argument of a call, which resolves to a library callable + * that is known to forward `arg` into the `i`th parameter of a supplied + * delegate `delegate`. * * For example, in * @@ -521,9 +629,9 @@ private module ArgumentNodes { * `arg = x`, `i = 0`, `call = x.Select(Foo)`, and `delegate = Foo`. */ private predicate flowIntoCallableLibraryCall( - DataFlowCall call, Node arg, ImplicitDelegateDataFlowCall delegate, int i + ExplicitArgumentNode arg, ImplicitDelegateDataFlowCall delegate, int i ) { - exists(int j, boolean preservesValue | + exists(DataFlowCall call, int j, boolean preservesValue | preservesValue = true and i = j or preservesValue = false and i = j + delegate.getNumberOfDelegateParameters() @@ -548,68 +656,47 @@ private module ArgumentNodes { ) } - private DotNet::Expr getArgument(DotNet::Expr call, int i) { - call = any(DispatchCall dc | - result = dc.getArgument(i) - or - result = dc.getQualifier() and i = -1 and not dc.getAStaticTarget().(Modifiable).isStatic() - ).getCall() - or - result = call.(DelegateCall).getArgument(i) - or - result = call.(CIL::Call).getArgument(i) - } - private class ArgumentConfiguration extends ControlFlowReachabilityConfiguration { ArgumentConfiguration() { this = "ArgumentConfiguration" } override predicate candidate( Expr e1, Expr e2, ControlFlowElement scope, boolean exactScope, boolean isSuccessor ) { - e1 = getArgument(e2, _) and + e1.(Argument).isArgumentOf(e2, _) and exactScope = false and scope = e2 and isSuccessor = true } } - /** A data flow node that represents a call argument. */ - abstract class ArgumentNode extends Node { - /** Holds if this argument occurs at the given position in the given call. */ - cached - abstract predicate argumentOf(DataFlowCall call, int pos); - - /** Gets the call in which this node is an argument. */ - final DataFlowCall getCall() { this.argumentOf(result, _) } - } - /** A data flow node that represents an explicit call argument. */ private class ExplicitArgumentNode extends ArgumentNode { - private DataFlowCall c; - - private int i; - ExplicitArgumentNode() { - exists(DotNet::Expr e, DotNet::Expr arg | - arg = this.asExpr() and - e = c.getExpr() and - arg = getArgument(e, i) - | - any(ArgumentConfiguration x) - .hasExprPath(_, this.getControlFlowNode(), _, c.getControlFlowNode()) - or - // No CFG splitting in CIL - e instanceof CIL::Expr and - arg instanceof CIL::Expr - ) + this.asExpr() instanceof Argument or - flowIntoCallableLibraryCall(_, this, c, i) + this.asExpr() = any(CIL::Call call).getAnArgument() + or + libraryFlowDelegateCallIn(_, _, this.asExpr(), _, _, _) + or + this.(ImplicitDelegateOutNode).isArgumentOf(_, _) } override predicate argumentOf(DataFlowCall call, int pos) { Stages::DataFlowStage::forceCachingInSameStage() and - call = c and - pos = i + exists(ArgumentConfiguration x, Expr c, Argument arg | + arg = this.asExpr() and + c = call.getExpr() and + arg.isArgumentOf(c, pos) and + x.hasExprPath(_, this.getControlFlowNode(), _, call.getControlFlowNode()) + ) + or + exists(CIL::Call c, CIL::Expr arg | + arg = this.asExpr() and + c = call.getExpr() and + arg = c.getArgument(pos) + ) + or + flowIntoCallableLibraryCall(this, call, pos) } } @@ -704,13 +791,13 @@ private module ArgumentNodes { } import ArgumentNodes -private module ReturnNodes { - /** A data flow node that represents a value returned by a callable. */ - abstract class ReturnNode extends Node { - /** Gets the kind of this return node. */ - abstract ReturnKind getKind(); - } +/** A data flow node that represents a value returned by a callable. */ +abstract class ReturnNode extends Node { + /** Gets the kind of this return node. */ + abstract ReturnKind getKind(); +} +private module ReturnNodes { /** * A data flow node that represents an expression returned by a callable, * either using a (`yield`) `return` statement or an expression body (`=>`). @@ -817,14 +904,14 @@ private module ReturnNodes { } import ReturnNodes -private module OutNodes { - /** A data flow node that represents the output of a call. */ - abstract class OutNode extends Node { - /** Gets the underlying call. */ - cached - abstract DataFlowCall getCall(); - } +/** A data flow node that represents the output of a call. */ +abstract class OutNode extends Node { + /** Gets the underlying call. */ + cached + abstract DataFlowCall getCall(); +} +private module OutNodes { private DataFlowCall csharpCall(Expr e, ControlFlow::Node cfn) { e = any(DispatchCall dc | result = TNonDelegateCall(cfn, dc)).getCall() or result = TExplicitDelegateCall(cfn, e) @@ -988,14 +1075,23 @@ predicate flowOutOfDelegateLibraryCall( private class FieldLike extends Assignable, Modifiable { FieldLike() { this instanceof Field or - this = any(TrivialProperty p | not p.isOverridableOrImplementable()) + this = any(Property p | + not p.isOverridableOrImplementable() and + ( + p.isAutoImplemented() + or + p.matchesHandle(any(CIL::TrivialProperty tp)) + ) + ) } } -private class FieldLikeRead extends AssignableRead { - FieldLikeRead() { this.getTarget() instanceof FieldLike } +private class FieldLikeAccess extends AssignableAccess, QualifiableExpr { + FieldLikeAccess() { this.getTarget() instanceof FieldLike } } +private class FieldLikeRead extends FieldLikeAccess, AssignableRead { } + /** * Holds if the field-like read `flr` is not completely determined by explicit * SSA updates. @@ -1035,41 +1131,73 @@ private class StaticFieldLikeJumpNode extends NonLocalJumpNode, ExprNode { predicate jumpStep = jumpStepImpl/2; -private newtype TContent = TContentStub() - -/** A reference contained in an object. A stub implementation, for now. */ -// stub implementation +/** + * A reference contained in an object. Currently limited to instance fields + * and field-like instance properties. + */ class Content extends TContent { - /** Gets a textual representation of this element. */ - string toString() { result = "stub" } + /** Gets a textual representation of this content. */ + abstract string toString(); - Location getLocation() { result instanceof EmptyLocation } + abstract Location getLocation(); /** Gets the type of the object containing this content. */ - RefType getContainerType() { none() } + abstract Type getContainerType(); /** Gets the type of this content. */ - Type getType() { none() } + abstract Type getType(); } -/** - * Holds if data can flow from `node1` to `node2` via an assignment to `f`. - * Thus, `node2` references an object with a field `f` that contains the - * value of `node1`. - */ -predicate storeStep(Node node1, Content f, PostUpdateNode node2) { - none() // stub implementation +private class FieldLikeContent extends Content, TFieldLikeContent { + private FieldLike f; + + FieldLikeContent() { this = TFieldLikeContent(f) } + + FieldLike getField() { result = f } + + override string toString() { result = f.toString() } + + override Location getLocation() { result = f.getLocation() } + + override Type getContainerType() { result = f.getDeclaringType() } + + override Type getType() { result = f.getType() } } -/** - * Holds if data can flow from `node1` to `node2` via a read of `f`. - * Thus, `node1` references an object with a field `f` whose value ends up in - * `node2`. - */ -predicate readStep(Node node1, Content f, Node node2) { - none() // stub implementation +private class StoreStepConfiguration extends ControlFlowReachabilityConfiguration { + StoreStepConfiguration() { this = "StoreStepConfiguration" } + + override predicate candidate( + Expr e1, Expr e2, ControlFlowElement scope, boolean exactScope, boolean isSuccessor + ) { + exactScope = false and + isSuccessor = false and + instanceFieldLikeAssign(scope, _, e1, e2) + or + exactScope = false and + isSuccessor = false and + instanceFieldLikeInit(e2, _, e1) and + scope = e2 + } } +predicate storeStep = storeStepImpl/3; + +private class ReadStepConfiguration extends ControlFlowReachabilityConfiguration { + ReadStepConfiguration() { this = "ReadStepConfiguration" } + + override predicate candidate( + Expr e1, Expr e2, ControlFlowElement scope, boolean exactScope, boolean isSuccessor + ) { + exactScope = false and + isSuccessor = true and + e1 = e2.(FieldLikeRead).getQualifier() and + scope = e2 + } +} + +predicate readStep = readStepImpl/3; + private predicate suppressUnusedType(DotNet::Type t) { any() } /** @@ -1078,7 +1206,10 @@ private predicate suppressUnusedType(DotNet::Type t) { any() } * Type-based pruning is disabled for now, so this is a stub implementation. */ bindingset[t] -Type getErasedRepr(DotNet::Type t) { suppressUnusedType(t) and result instanceof ObjectType } // stub implementation +DotNet::Type getErasedRepr(DotNet::Type t) { + // stub implementation + suppressUnusedType(t) and result instanceof ObjectType +} /** Gets a string representation of a type returned by `getErasedRepr`. */ bindingset[t] @@ -1102,21 +1233,62 @@ predicate compatibleTypes(DotNet::Type t1, DotNet::Type t2) { * This can be either the argument to a callable after the callable returns * (which might have mutated the argument), or the qualifier of a field after * an update to the field. + * + * Nodes corresponding to AST elements, for example `ExprNode`, usually refer + * to the value before the update with the exception of `ObjectCreation`, + * which represents the value after the constructor has run. */ -class PostUpdateNode extends Node { - PostUpdateNode() { none() } // stub implementation - +abstract class PostUpdateNode extends Node { /** Gets the node before the state update. */ - Node getPreUpdateNode() { none() } // stub implementation + abstract Node getPreUpdateNode(); } +private module PostUpdateNodes { + class ObjectCreationNode extends PostUpdateNode, ExprNode, TExprNode { + ObjectCreationNode() { exists(ObjectCreation oc | this = TExprNode(oc.getAControlFlowNode())) } + + override MallocNode getPreUpdateNode() { this = TExprNode(result.getControlFlowNode()) } + } + + private class ArgumentPostCallNode extends PostUpdateNode, TArgumentPostCallNode { + private ControlFlow::Nodes::ElementNode cfn; + + ArgumentPostCallNode() { this = TArgumentPostCallNode(cfn) } + + override ExprNode getPreUpdateNode() { cfn = result.getControlFlowNode() } + + override Callable getEnclosingCallable() { result = cfn.getEnclosingCallable() } + + override Type getType() { result = cfn.getElement().(Expr).getType() } + + override Location getLocation() { result = cfn.getLocation() } + + override string toString() { result = "[post] " + cfn.toString() } + } + + private class StoreTargetNode extends PostUpdateNode, TStoreTargetNode { + private ControlFlow::Nodes::ElementNode cfn; + + StoreTargetNode() { this = TStoreTargetNode(cfn) } + + override ExprNode getPreUpdateNode() { cfn = result.getControlFlowNode() } + + override Callable getEnclosingCallable() { result = cfn.getEnclosingCallable() } + + override Type getType() { result = cfn.getElement().(Expr).getType() } + + override Location getLocation() { result = cfn.getLocation() } + + override string toString() { result = "[post] " + cfn.toString() } + } +} +private import PostUpdateNodes + /** A node that performs a type cast. */ class CastNode extends ExprNode { CastNode() { this.getExpr() instanceof CastExpr } } -class DataFlowCallable = DotNet::Callable; - class DataFlowExpr = DotNet::Expr; class DataFlowType = DotNet::Type; diff --git a/csharp/ql/src/semmle/code/csharp/dataflow/internal/DataFlowPublic.qll b/csharp/ql/src/semmle/code/csharp/dataflow/internal/DataFlowPublic.qll index 559fc79026b..0b16b66630f 100644 --- a/csharp/ql/src/semmle/code/csharp/dataflow/internal/DataFlowPublic.qll +++ b/csharp/ql/src/semmle/code/csharp/dataflow/internal/DataFlowPublic.qll @@ -1,6 +1,7 @@ private import csharp private import cil private import dotnet +private import DataFlowDispatch private import DataFlowPrivate private import semmle.code.csharp.Caching private import semmle.code.csharp.controlflow.Guards @@ -34,7 +35,7 @@ class Node extends TNode { /** Gets the enclosing callable of this node. */ cached - DotNet::Callable getEnclosingCallable() { none() } + DataFlowCallable getEnclosingCallable() { none() } /** Gets the control flow node corresponding to this node, if any. */ cached @@ -88,7 +89,7 @@ class ExprNode extends Node { result = cfn.getElement() } - override DotNet::Callable getEnclosingCallable() { + override DataFlowCallable getEnclosingCallable() { Stages::DataFlowStage::forceCachingInSameStage() and result = this.getExpr().getEnclosingCallable() } @@ -136,7 +137,7 @@ class ParameterNode extends Node { * Holds if this node is the parameter of callable `c` at the specified * (zero-based) position. */ - predicate isParameterOf(DotNet::Callable c, int i) { none() } + predicate isParameterOf(DataFlowCallable c, int i) { none() } } /** Gets a node corresponding to expression `e`. */ diff --git a/csharp/ql/src/semmle/code/csharp/dispatch/Dispatch.qll b/csharp/ql/src/semmle/code/csharp/dispatch/Dispatch.qll index a673d4a6e51..dc658b43471 100644 --- a/csharp/ql/src/semmle/code/csharp/dispatch/Dispatch.qll +++ b/csharp/ql/src/semmle/code/csharp/dispatch/Dispatch.qll @@ -83,6 +83,9 @@ private module Internal { cached Expr getQualifier(DispatchCall dc) { result = dc.(DispatchCallImpl).getQualifier() } + cached + Callable getAStaticTarget(DispatchCall dc) { result = dc.(DispatchCallImpl).getAStaticTarget() } + cached RuntimeCallable getADynamicTarget(DispatchCall dc) { result = dc.(DispatchCallImpl).getADynamicTarget() @@ -90,8 +93,6 @@ private module Internal { } import Cached - Callable getAStaticTarget(DispatchCall dc) { result = dc.(DispatchCallImpl).getAStaticTarget() } - /** * Holds if `mc` is a reflection call to a method named `name`, where * `object` is the object on which to invoke the method (`null` if a diff --git a/csharp/ql/src/semmle/code/csharp/exprs/Call.qll b/csharp/ql/src/semmle/code/csharp/exprs/Call.qll index 809a819da6e..f71c231c020 100644 --- a/csharp/ql/src/semmle/code/csharp/exprs/Call.qll +++ b/csharp/ql/src/semmle/code/csharp/exprs/Call.qll @@ -385,14 +385,16 @@ class VirtualMethodCall extends MethodCall { * `this(0)` (line 8) in * * ``` - * class A { - * public A() { } + * class A + * { + * public A() { } * } * - * class B : A { - * public B(int x) : base() { } + * class B : A + * { + * public B(int x) : base() { } * - * public B() : this(0) { } + * public B() : this(0) { } * } * ``` */ @@ -403,19 +405,64 @@ class ConstructorInitializer extends Call, @constructor_init_expr { override string toString() { result = "call to constructor " + this.getTarget().getName() } + private ValueOrRefType getTargetType() { + result = this.getTarget().getDeclaringType().getSourceDeclaration() + } + + private ValueOrRefType getConstructorType() { + result = this.getConstructor().getDeclaringType().getSourceDeclaration() + } + + /** + * Holds if this initialier is a `this` initializer, for example `this(0)` + * in + * + * ``` + * class A + * { + * A(int i) { } + * A() : this(0) { } + * } + * ``` + */ + predicate isThis() { + this.getTargetType() = this.getConstructorType() + } + + /** + * Holds if this initialier is a `base` initializer, for example `base(0)` + * in + * + * ``` + * class A + * { + * A(int i) { } + * } + * + * class B : A + * { + * B() : base(0) { } + * } + * ``` + */ + predicate isBase() { + this.getTargetType() != this.getConstructorType() + } + /** * Gets the constructor that this initializer call belongs to. For example, * the initializer call `base()` on line 7 belongs to the constructor `B` * on line 6 in * * ``` - * class A { - * public A() { } + * class A + * { + * public A() { } * } * - * class B : A { - * public B() - * : base() { } + * class B : A + * { + * public B() : base() { } * } * ``` */ diff --git a/csharp/ql/src/semmle/code/csharp/exprs/Expr.qll b/csharp/ql/src/semmle/code/csharp/exprs/Expr.qll index 24cba70aef3..6fa563b99ef 100644 --- a/csharp/ql/src/semmle/code/csharp/exprs/Expr.qll +++ b/csharp/ql/src/semmle/code/csharp/exprs/Expr.qll @@ -45,9 +45,7 @@ class Expr extends DotNet::Expr, ControlFlowElement, @expr { override Type getType() { expressions(this, _, getTypeRef(result)) } /** Gets the annotated type of this expression. */ - final AnnotatedType getAnnotatedType() { - result.appliesTo(this) - } + final AnnotatedType getAnnotatedType() { result.appliesTo(this) } /** Gets the value of this expression, if any */ override string getValue() { expr_value(this, result) } diff --git a/csharp/ql/test/library-tests/controlflow/graph/BasicBlock.expected b/csharp/ql/test/library-tests/controlflow/graph/BasicBlock.expected index 78c0baecc23..e50ae0156aa 100644 --- a/csharp/ql/test/library-tests/controlflow/graph/BasicBlock.expected +++ b/csharp/ql/test/library-tests/controlflow/graph/BasicBlock.expected @@ -277,11 +277,14 @@ | Foreach.cs:36:10:36:11 | exit M6 | Foreach.cs:36:10:36:11 | exit M6 | 1 | | Foreach.cs:38:9:39:11 | foreach (... ... in ...) ... | Foreach.cs:38:9:39:11 | foreach (... ... in ...) ... | 1 | | Foreach.cs:38:26:38:26 | String x | Foreach.cs:39:11:39:11 | ; | 4 | -| Initializers.cs:3:9:3:9 | this access | Initializers.cs:3:9:3:17 | ... = ... | 5 | -| Initializers.cs:4:9:4:9 | this access | Initializers.cs:4:25:4:31 | ... = ... | 6 | -| Initializers.cs:6:5:6:16 | enter Initializers | Initializers.cs:6:5:6:16 | exit Initializers | 3 | -| Initializers.cs:8:10:8:10 | enter M | Initializers.cs:8:10:8:10 | exit M | 20 | -| Initializers.cs:14:20:14:20 | 1 | Initializers.cs:14:16:14:20 | ... = ... | 2 | +| Initializers.cs:6:5:6:16 | enter Initializers | Initializers.cs:6:5:6:16 | exit Initializers | 14 | +| Initializers.cs:8:5:8:16 | enter Initializers | Initializers.cs:8:5:8:16 | exit Initializers | 14 | +| Initializers.cs:10:10:10:10 | enter M | Initializers.cs:10:10:10:10 | exit M | 20 | +| Initializers.cs:16:20:16:20 | 1 | Initializers.cs:16:16:16:20 | ... = ... | 2 | +| Initializers.cs:18:11:18:23 | enter NoConstructor | Initializers.cs:18:11:18:23 | exit NoConstructor | 8 | +| Initializers.cs:29:9:29:11 | enter Sub | Initializers.cs:29:9:29:11 | exit Sub | 11 | +| Initializers.cs:31:9:31:11 | enter Sub | Initializers.cs:31:9:31:11 | exit Sub | 8 | +| Initializers.cs:33:9:33:11 | enter Sub | Initializers.cs:33:9:33:11 | exit Sub | 18 | | NullCoalescing.cs:3:9:3:10 | enter M1 | NullCoalescing.cs:3:23:3:23 | access to parameter i | 3 | | NullCoalescing.cs:3:9:3:10 | exit M1 | NullCoalescing.cs:3:9:3:10 | exit M1 | 1 | | NullCoalescing.cs:3:28:3:28 | 0 | NullCoalescing.cs:3:28:3:28 | 0 | 1 | diff --git a/csharp/ql/test/library-tests/controlflow/graph/BasicBlockDominance.expected b/csharp/ql/test/library-tests/controlflow/graph/BasicBlockDominance.expected index 07e9f8cd03b..d9a38d7806c 100644 --- a/csharp/ql/test/library-tests/controlflow/graph/BasicBlockDominance.expected +++ b/csharp/ql/test/library-tests/controlflow/graph/BasicBlockDominance.expected @@ -564,11 +564,14 @@ | post | Foreach.cs:38:9:39:11 | foreach (... ... in ...) ... | Foreach.cs:38:9:39:11 | foreach (... ... in ...) ... | | post | Foreach.cs:38:9:39:11 | foreach (... ... in ...) ... | Foreach.cs:38:26:38:26 | String x | | post | Foreach.cs:38:26:38:26 | String x | Foreach.cs:38:26:38:26 | String x | -| post | Initializers.cs:3:9:3:9 | this access | Initializers.cs:3:9:3:9 | this access | -| post | Initializers.cs:4:9:4:9 | this access | Initializers.cs:4:9:4:9 | this access | | post | Initializers.cs:6:5:6:16 | enter Initializers | Initializers.cs:6:5:6:16 | enter Initializers | -| post | Initializers.cs:8:10:8:10 | enter M | Initializers.cs:8:10:8:10 | enter M | -| post | Initializers.cs:14:20:14:20 | 1 | Initializers.cs:14:20:14:20 | 1 | +| post | Initializers.cs:8:5:8:16 | enter Initializers | Initializers.cs:8:5:8:16 | enter Initializers | +| post | Initializers.cs:10:10:10:10 | enter M | Initializers.cs:10:10:10:10 | enter M | +| post | Initializers.cs:16:20:16:20 | 1 | Initializers.cs:16:20:16:20 | 1 | +| post | Initializers.cs:18:11:18:23 | enter NoConstructor | Initializers.cs:18:11:18:23 | enter NoConstructor | +| post | Initializers.cs:29:9:29:11 | enter Sub | Initializers.cs:29:9:29:11 | enter Sub | +| post | Initializers.cs:31:9:31:11 | enter Sub | Initializers.cs:31:9:31:11 | enter Sub | +| post | Initializers.cs:33:9:33:11 | enter Sub | Initializers.cs:33:9:33:11 | enter Sub | | post | NullCoalescing.cs:3:9:3:10 | enter M1 | NullCoalescing.cs:3:9:3:10 | enter M1 | | post | NullCoalescing.cs:3:9:3:10 | exit M1 | NullCoalescing.cs:3:9:3:10 | enter M1 | | post | NullCoalescing.cs:3:9:3:10 | exit M1 | NullCoalescing.cs:3:9:3:10 | exit M1 | @@ -2111,11 +2114,14 @@ | pre | Foreach.cs:38:9:39:11 | foreach (... ... in ...) ... | Foreach.cs:38:9:39:11 | foreach (... ... in ...) ... | | pre | Foreach.cs:38:9:39:11 | foreach (... ... in ...) ... | Foreach.cs:38:26:38:26 | String x | | pre | Foreach.cs:38:26:38:26 | String x | Foreach.cs:38:26:38:26 | String x | -| pre | Initializers.cs:3:9:3:9 | this access | Initializers.cs:3:9:3:9 | this access | -| pre | Initializers.cs:4:9:4:9 | this access | Initializers.cs:4:9:4:9 | this access | | pre | Initializers.cs:6:5:6:16 | enter Initializers | Initializers.cs:6:5:6:16 | enter Initializers | -| pre | Initializers.cs:8:10:8:10 | enter M | Initializers.cs:8:10:8:10 | enter M | -| pre | Initializers.cs:14:20:14:20 | 1 | Initializers.cs:14:20:14:20 | 1 | +| pre | Initializers.cs:8:5:8:16 | enter Initializers | Initializers.cs:8:5:8:16 | enter Initializers | +| pre | Initializers.cs:10:10:10:10 | enter M | Initializers.cs:10:10:10:10 | enter M | +| pre | Initializers.cs:16:20:16:20 | 1 | Initializers.cs:16:20:16:20 | 1 | +| pre | Initializers.cs:18:11:18:23 | enter NoConstructor | Initializers.cs:18:11:18:23 | enter NoConstructor | +| pre | Initializers.cs:29:9:29:11 | enter Sub | Initializers.cs:29:9:29:11 | enter Sub | +| pre | Initializers.cs:31:9:31:11 | enter Sub | Initializers.cs:31:9:31:11 | enter Sub | +| pre | Initializers.cs:33:9:33:11 | enter Sub | Initializers.cs:33:9:33:11 | enter Sub | | pre | NullCoalescing.cs:3:9:3:10 | enter M1 | NullCoalescing.cs:3:9:3:10 | enter M1 | | pre | NullCoalescing.cs:3:9:3:10 | enter M1 | NullCoalescing.cs:3:9:3:10 | exit M1 | | pre | NullCoalescing.cs:3:9:3:10 | enter M1 | NullCoalescing.cs:3:28:3:28 | 0 | diff --git a/csharp/ql/test/library-tests/controlflow/graph/Dominance.expected b/csharp/ql/test/library-tests/controlflow/graph/Dominance.expected index 3ea59f590bf..e1fdf6698a6 100644 --- a/csharp/ql/test/library-tests/controlflow/graph/Dominance.expected +++ b/csharp/ql/test/library-tests/controlflow/graph/Dominance.expected @@ -1203,37 +1203,93 @@ | post | Foreach.cs:38:33:38:33 | Int32 y | Foreach.cs:38:26:38:26 | String x | | post | Foreach.cs:38:39:38:42 | access to parameter args | Foreach.cs:37:5:40:5 | {...} | | post | Foreach.cs:39:11:39:11 | ; | Foreach.cs:38:18:38:34 | (..., ...) | +| post | Initializers.cs:3:9:3:9 | this access | Initializers.cs:6:5:6:16 | enter Initializers | +| post | Initializers.cs:3:9:3:9 | this access | Initializers.cs:8:5:8:16 | enter Initializers | +| post | Initializers.cs:3:9:3:17 | ... = ... | Initializers.cs:3:13:3:17 | ... + ... | | post | Initializers.cs:3:9:3:17 | ... = ... | Initializers.cs:3:13:3:17 | ... + ... | | post | Initializers.cs:3:13:3:13 | access to field H | Initializers.cs:3:9:3:9 | this access | +| post | Initializers.cs:3:13:3:13 | access to field H | Initializers.cs:3:9:3:9 | this access | +| post | Initializers.cs:3:13:3:17 | ... + ... | Initializers.cs:3:17:3:17 | 1 | | post | Initializers.cs:3:13:3:17 | ... + ... | Initializers.cs:3:17:3:17 | 1 | | post | Initializers.cs:3:17:3:17 | 1 | Initializers.cs:3:13:3:13 | access to field H | +| post | Initializers.cs:3:17:3:17 | 1 | Initializers.cs:3:13:3:13 | access to field H | | post | Initializers.cs:4:9:4:9 | access to property G | Initializers.cs:4:27:4:31 | ... + ... | +| post | Initializers.cs:4:9:4:9 | access to property G | Initializers.cs:4:27:4:31 | ... + ... | +| post | Initializers.cs:4:9:4:9 | this access | Initializers.cs:3:9:3:17 | ... = ... | +| post | Initializers.cs:4:9:4:9 | this access | Initializers.cs:3:9:3:17 | ... = ... | +| post | Initializers.cs:4:25:4:31 | ... = ... | Initializers.cs:4:9:4:9 | access to property G | | post | Initializers.cs:4:25:4:31 | ... = ... | Initializers.cs:4:9:4:9 | access to property G | | post | Initializers.cs:4:27:4:27 | access to field H | Initializers.cs:4:9:4:9 | this access | +| post | Initializers.cs:4:27:4:27 | access to field H | Initializers.cs:4:9:4:9 | this access | +| post | Initializers.cs:4:27:4:31 | ... + ... | Initializers.cs:4:31:4:31 | 2 | | post | Initializers.cs:4:27:4:31 | ... + ... | Initializers.cs:4:31:4:31 | 2 | | post | Initializers.cs:4:31:4:31 | 2 | Initializers.cs:4:27:4:27 | access to field H | -| post | Initializers.cs:6:5:6:16 | exit Initializers | Initializers.cs:6:28:6:30 | {...} | -| post | Initializers.cs:6:28:6:30 | {...} | Initializers.cs:6:5:6:16 | enter Initializers | -| post | Initializers.cs:8:10:8:10 | exit M | Initializers.cs:11:13:11:63 | Initializers[] iz = ... | -| post | Initializers.cs:9:5:12:5 | {...} | Initializers.cs:8:10:8:10 | enter M | -| post | Initializers.cs:10:9:10:54 | ... ...; | Initializers.cs:9:5:12:5 | {...} | -| post | Initializers.cs:10:13:10:53 | Initializers i = ... | Initializers.cs:10:38:10:53 | { ..., ... } | -| post | Initializers.cs:10:17:10:53 | object creation of type Initializers | Initializers.cs:10:34:10:35 | "" | -| post | Initializers.cs:10:34:10:35 | "" | Initializers.cs:10:9:10:54 | ... ...; | -| post | Initializers.cs:10:38:10:53 | { ..., ... } | Initializers.cs:10:47:10:51 | ... = ... | -| post | Initializers.cs:10:40:10:44 | ... = ... | Initializers.cs:10:44:10:44 | 0 | -| post | Initializers.cs:10:44:10:44 | 0 | Initializers.cs:10:17:10:53 | object creation of type Initializers | -| post | Initializers.cs:10:47:10:47 | access to property G | Initializers.cs:10:51:10:51 | 1 | -| post | Initializers.cs:10:47:10:51 | ... = ... | Initializers.cs:10:47:10:47 | access to property G | -| post | Initializers.cs:10:51:10:51 | 1 | Initializers.cs:10:40:10:44 | ... = ... | -| post | Initializers.cs:11:9:11:64 | ... ...; | Initializers.cs:10:13:10:53 | Initializers i = ... | -| post | Initializers.cs:11:13:11:63 | Initializers[] iz = ... | Initializers.cs:11:37:11:63 | { ..., ... } | -| post | Initializers.cs:11:18:11:63 | array creation of type Initializers[] | Initializers.cs:11:9:11:64 | ... ...; | -| post | Initializers.cs:11:37:11:63 | { ..., ... } | Initializers.cs:11:42:11:61 | object creation of type Initializers | -| post | Initializers.cs:11:39:11:39 | access to local variable i | Initializers.cs:11:18:11:63 | array creation of type Initializers[] | -| post | Initializers.cs:11:42:11:61 | object creation of type Initializers | Initializers.cs:11:59:11:60 | "" | -| post | Initializers.cs:11:59:11:60 | "" | Initializers.cs:11:39:11:39 | access to local variable i | -| post | Initializers.cs:14:16:14:20 | ... = ... | Initializers.cs:14:20:14:20 | 1 | +| post | Initializers.cs:4:31:4:31 | 2 | Initializers.cs:4:27:4:27 | access to field H | +| post | Initializers.cs:6:5:6:16 | exit Initializers | Initializers.cs:6:20:6:22 | {...} | +| post | Initializers.cs:6:20:6:22 | {...} | Initializers.cs:4:25:4:31 | ... = ... | +| post | Initializers.cs:8:5:8:16 | exit Initializers | Initializers.cs:8:28:8:30 | {...} | +| post | Initializers.cs:8:28:8:30 | {...} | Initializers.cs:4:25:4:31 | ... = ... | +| post | Initializers.cs:10:10:10:10 | exit M | Initializers.cs:13:13:13:63 | Initializers[] iz = ... | +| post | Initializers.cs:11:5:14:5 | {...} | Initializers.cs:10:10:10:10 | enter M | +| post | Initializers.cs:12:9:12:54 | ... ...; | Initializers.cs:11:5:14:5 | {...} | +| post | Initializers.cs:12:13:12:53 | Initializers i = ... | Initializers.cs:12:38:12:53 | { ..., ... } | +| post | Initializers.cs:12:17:12:53 | object creation of type Initializers | Initializers.cs:12:34:12:35 | "" | +| post | Initializers.cs:12:34:12:35 | "" | Initializers.cs:12:9:12:54 | ... ...; | +| post | Initializers.cs:12:38:12:53 | { ..., ... } | Initializers.cs:12:47:12:51 | ... = ... | +| post | Initializers.cs:12:40:12:44 | ... = ... | Initializers.cs:12:44:12:44 | 0 | +| post | Initializers.cs:12:44:12:44 | 0 | Initializers.cs:12:17:12:53 | object creation of type Initializers | +| post | Initializers.cs:12:47:12:47 | access to property G | Initializers.cs:12:51:12:51 | 1 | +| post | Initializers.cs:12:47:12:51 | ... = ... | Initializers.cs:12:47:12:47 | access to property G | +| post | Initializers.cs:12:51:12:51 | 1 | Initializers.cs:12:40:12:44 | ... = ... | +| post | Initializers.cs:13:9:13:64 | ... ...; | Initializers.cs:12:13:12:53 | Initializers i = ... | +| post | Initializers.cs:13:13:13:63 | Initializers[] iz = ... | Initializers.cs:13:37:13:63 | { ..., ... } | +| post | Initializers.cs:13:18:13:63 | array creation of type Initializers[] | Initializers.cs:13:9:13:64 | ... ...; | +| post | Initializers.cs:13:37:13:63 | { ..., ... } | Initializers.cs:13:42:13:61 | object creation of type Initializers | +| post | Initializers.cs:13:39:13:39 | access to local variable i | Initializers.cs:13:18:13:63 | array creation of type Initializers[] | +| post | Initializers.cs:13:42:13:61 | object creation of type Initializers | Initializers.cs:13:59:13:60 | "" | +| post | Initializers.cs:13:59:13:60 | "" | Initializers.cs:13:39:13:39 | access to local variable i | +| post | Initializers.cs:16:16:16:20 | ... = ... | Initializers.cs:16:20:16:20 | 1 | +| post | Initializers.cs:18:11:18:23 | exit NoConstructor | Initializers.cs:21:23:21:27 | ... = ... | +| post | Initializers.cs:20:23:20:23 | this access | Initializers.cs:18:11:18:23 | enter NoConstructor | +| post | Initializers.cs:20:23:20:23 | this access | Initializers.cs:33:9:33:11 | enter Sub | +| post | Initializers.cs:20:23:20:27 | ... = ... | Initializers.cs:20:27:20:27 | 0 | +| post | Initializers.cs:20:23:20:27 | ... = ... | Initializers.cs:20:27:20:27 | 0 | +| post | Initializers.cs:20:27:20:27 | 0 | Initializers.cs:20:23:20:23 | this access | +| post | Initializers.cs:20:27:20:27 | 0 | Initializers.cs:20:23:20:23 | this access | +| post | Initializers.cs:21:23:21:23 | this access | Initializers.cs:20:23:20:27 | ... = ... | +| post | Initializers.cs:21:23:21:23 | this access | Initializers.cs:20:23:20:27 | ... = ... | +| post | Initializers.cs:21:23:21:27 | ... = ... | Initializers.cs:21:27:21:27 | 1 | +| post | Initializers.cs:21:23:21:27 | ... = ... | Initializers.cs:21:27:21:27 | 1 | +| post | Initializers.cs:21:27:21:27 | 1 | Initializers.cs:21:23:21:23 | this access | +| post | Initializers.cs:21:27:21:27 | 1 | Initializers.cs:21:23:21:23 | this access | +| post | Initializers.cs:26:13:26:13 | this access | Initializers.cs:21:23:21:27 | ... = ... | +| post | Initializers.cs:26:13:26:13 | this access | Initializers.cs:29:17:29:20 | call to constructor NoConstructor | +| post | Initializers.cs:26:13:26:17 | ... = ... | Initializers.cs:26:17:26:17 | 2 | +| post | Initializers.cs:26:13:26:17 | ... = ... | Initializers.cs:26:17:26:17 | 2 | +| post | Initializers.cs:26:17:26:17 | 2 | Initializers.cs:26:13:26:13 | this access | +| post | Initializers.cs:26:17:26:17 | 2 | Initializers.cs:26:13:26:13 | this access | +| post | Initializers.cs:29:9:29:11 | exit Sub | Initializers.cs:29:26:29:30 | ... = ... | +| post | Initializers.cs:29:17:29:20 | call to constructor NoConstructor | Initializers.cs:29:9:29:11 | enter Sub | +| post | Initializers.cs:29:24:29:33 | {...} | Initializers.cs:26:13:26:17 | ... = ... | +| post | Initializers.cs:29:26:29:26 | this access | Initializers.cs:29:26:29:31 | ...; | +| post | Initializers.cs:29:26:29:30 | ... = ... | Initializers.cs:29:30:29:30 | 3 | +| post | Initializers.cs:29:26:29:31 | ...; | Initializers.cs:29:24:29:33 | {...} | +| post | Initializers.cs:29:30:29:30 | 3 | Initializers.cs:29:26:29:26 | this access | +| post | Initializers.cs:31:9:31:11 | exit Sub | Initializers.cs:31:31:31:35 | ... = ... | +| post | Initializers.cs:31:22:31:25 | call to constructor Sub | Initializers.cs:31:9:31:11 | enter Sub | +| post | Initializers.cs:31:29:31:38 | {...} | Initializers.cs:31:22:31:25 | call to constructor Sub | +| post | Initializers.cs:31:31:31:31 | this access | Initializers.cs:31:31:31:36 | ...; | +| post | Initializers.cs:31:31:31:35 | ... = ... | Initializers.cs:31:35:31:35 | access to parameter i | +| post | Initializers.cs:31:31:31:36 | ...; | Initializers.cs:31:29:31:38 | {...} | +| post | Initializers.cs:31:35:31:35 | access to parameter i | Initializers.cs:31:31:31:31 | this access | +| post | Initializers.cs:33:9:33:11 | exit Sub | Initializers.cs:33:29:33:37 | ... = ... | +| post | Initializers.cs:33:27:33:40 | {...} | Initializers.cs:26:13:26:17 | ... = ... | +| post | Initializers.cs:33:29:33:29 | this access | Initializers.cs:33:29:33:38 | ...; | +| post | Initializers.cs:33:29:33:37 | ... = ... | Initializers.cs:33:33:33:37 | ... + ... | +| post | Initializers.cs:33:29:33:38 | ...; | Initializers.cs:33:27:33:40 | {...} | +| post | Initializers.cs:33:33:33:33 | access to parameter i | Initializers.cs:33:29:33:29 | this access | +| post | Initializers.cs:33:33:33:37 | ... + ... | Initializers.cs:33:37:33:37 | access to parameter j | +| post | Initializers.cs:33:37:33:37 | access to parameter j | Initializers.cs:33:33:33:33 | access to parameter i | | post | NullCoalescing.cs:3:9:3:10 | exit M1 | NullCoalescing.cs:3:23:3:23 | access to parameter i | | post | NullCoalescing.cs:3:9:3:10 | exit M1 | NullCoalescing.cs:3:28:3:28 | 0 | | post | NullCoalescing.cs:3:23:3:23 | access to parameter i | NullCoalescing.cs:3:23:3:28 | ... ?? ... | @@ -3743,36 +3799,92 @@ | pre | Foreach.cs:38:33:38:33 | Int32 y | Foreach.cs:38:18:38:34 | (..., ...) | | pre | Foreach.cs:38:39:38:42 | access to parameter args | Foreach.cs:38:9:39:11 | foreach (... ... in ...) ... | | pre | Initializers.cs:3:9:3:9 | this access | Initializers.cs:3:13:3:13 | access to field H | +| pre | Initializers.cs:3:9:3:9 | this access | Initializers.cs:3:13:3:13 | access to field H | +| pre | Initializers.cs:3:9:3:17 | ... = ... | Initializers.cs:4:9:4:9 | this access | +| pre | Initializers.cs:3:9:3:17 | ... = ... | Initializers.cs:4:9:4:9 | this access | +| pre | Initializers.cs:3:13:3:13 | access to field H | Initializers.cs:3:17:3:17 | 1 | | pre | Initializers.cs:3:13:3:13 | access to field H | Initializers.cs:3:17:3:17 | 1 | | pre | Initializers.cs:3:13:3:17 | ... + ... | Initializers.cs:3:9:3:17 | ... = ... | +| pre | Initializers.cs:3:13:3:17 | ... + ... | Initializers.cs:3:9:3:17 | ... = ... | +| pre | Initializers.cs:3:17:3:17 | 1 | Initializers.cs:3:13:3:17 | ... + ... | | pre | Initializers.cs:3:17:3:17 | 1 | Initializers.cs:3:13:3:17 | ... + ... | | pre | Initializers.cs:4:9:4:9 | access to property G | Initializers.cs:4:25:4:31 | ... = ... | +| pre | Initializers.cs:4:9:4:9 | access to property G | Initializers.cs:4:25:4:31 | ... = ... | | pre | Initializers.cs:4:9:4:9 | this access | Initializers.cs:4:27:4:27 | access to field H | +| pre | Initializers.cs:4:9:4:9 | this access | Initializers.cs:4:27:4:27 | access to field H | +| pre | Initializers.cs:4:25:4:31 | ... = ... | Initializers.cs:6:20:6:22 | {...} | +| pre | Initializers.cs:4:25:4:31 | ... = ... | Initializers.cs:8:28:8:30 | {...} | +| pre | Initializers.cs:4:27:4:27 | access to field H | Initializers.cs:4:31:4:31 | 2 | | pre | Initializers.cs:4:27:4:27 | access to field H | Initializers.cs:4:31:4:31 | 2 | | pre | Initializers.cs:4:27:4:31 | ... + ... | Initializers.cs:4:9:4:9 | access to property G | +| pre | Initializers.cs:4:27:4:31 | ... + ... | Initializers.cs:4:9:4:9 | access to property G | | pre | Initializers.cs:4:31:4:31 | 2 | Initializers.cs:4:27:4:31 | ... + ... | -| pre | Initializers.cs:6:5:6:16 | enter Initializers | Initializers.cs:6:28:6:30 | {...} | -| pre | Initializers.cs:6:28:6:30 | {...} | Initializers.cs:6:5:6:16 | exit Initializers | -| pre | Initializers.cs:8:10:8:10 | enter M | Initializers.cs:9:5:12:5 | {...} | -| pre | Initializers.cs:9:5:12:5 | {...} | Initializers.cs:10:9:10:54 | ... ...; | -| pre | Initializers.cs:10:9:10:54 | ... ...; | Initializers.cs:10:34:10:35 | "" | -| pre | Initializers.cs:10:13:10:53 | Initializers i = ... | Initializers.cs:11:9:11:64 | ... ...; | -| pre | Initializers.cs:10:17:10:53 | object creation of type Initializers | Initializers.cs:10:44:10:44 | 0 | -| pre | Initializers.cs:10:34:10:35 | "" | Initializers.cs:10:17:10:53 | object creation of type Initializers | -| pre | Initializers.cs:10:38:10:53 | { ..., ... } | Initializers.cs:10:13:10:53 | Initializers i = ... | -| pre | Initializers.cs:10:40:10:44 | ... = ... | Initializers.cs:10:51:10:51 | 1 | -| pre | Initializers.cs:10:44:10:44 | 0 | Initializers.cs:10:40:10:44 | ... = ... | -| pre | Initializers.cs:10:47:10:47 | access to property G | Initializers.cs:10:47:10:51 | ... = ... | -| pre | Initializers.cs:10:47:10:51 | ... = ... | Initializers.cs:10:38:10:53 | { ..., ... } | -| pre | Initializers.cs:10:51:10:51 | 1 | Initializers.cs:10:47:10:47 | access to property G | -| pre | Initializers.cs:11:9:11:64 | ... ...; | Initializers.cs:11:18:11:63 | array creation of type Initializers[] | -| pre | Initializers.cs:11:13:11:63 | Initializers[] iz = ... | Initializers.cs:8:10:8:10 | exit M | -| pre | Initializers.cs:11:18:11:63 | array creation of type Initializers[] | Initializers.cs:11:39:11:39 | access to local variable i | -| pre | Initializers.cs:11:37:11:63 | { ..., ... } | Initializers.cs:11:13:11:63 | Initializers[] iz = ... | -| pre | Initializers.cs:11:39:11:39 | access to local variable i | Initializers.cs:11:59:11:60 | "" | -| pre | Initializers.cs:11:42:11:61 | object creation of type Initializers | Initializers.cs:11:37:11:63 | { ..., ... } | -| pre | Initializers.cs:11:59:11:60 | "" | Initializers.cs:11:42:11:61 | object creation of type Initializers | -| pre | Initializers.cs:14:20:14:20 | 1 | Initializers.cs:14:16:14:20 | ... = ... | +| pre | Initializers.cs:4:31:4:31 | 2 | Initializers.cs:4:27:4:31 | ... + ... | +| pre | Initializers.cs:6:5:6:16 | enter Initializers | Initializers.cs:3:9:3:9 | this access | +| pre | Initializers.cs:6:20:6:22 | {...} | Initializers.cs:6:5:6:16 | exit Initializers | +| pre | Initializers.cs:8:5:8:16 | enter Initializers | Initializers.cs:3:9:3:9 | this access | +| pre | Initializers.cs:8:28:8:30 | {...} | Initializers.cs:8:5:8:16 | exit Initializers | +| pre | Initializers.cs:10:10:10:10 | enter M | Initializers.cs:11:5:14:5 | {...} | +| pre | Initializers.cs:11:5:14:5 | {...} | Initializers.cs:12:9:12:54 | ... ...; | +| pre | Initializers.cs:12:9:12:54 | ... ...; | Initializers.cs:12:34:12:35 | "" | +| pre | Initializers.cs:12:13:12:53 | Initializers i = ... | Initializers.cs:13:9:13:64 | ... ...; | +| pre | Initializers.cs:12:17:12:53 | object creation of type Initializers | Initializers.cs:12:44:12:44 | 0 | +| pre | Initializers.cs:12:34:12:35 | "" | Initializers.cs:12:17:12:53 | object creation of type Initializers | +| pre | Initializers.cs:12:38:12:53 | { ..., ... } | Initializers.cs:12:13:12:53 | Initializers i = ... | +| pre | Initializers.cs:12:40:12:44 | ... = ... | Initializers.cs:12:51:12:51 | 1 | +| pre | Initializers.cs:12:44:12:44 | 0 | Initializers.cs:12:40:12:44 | ... = ... | +| pre | Initializers.cs:12:47:12:47 | access to property G | Initializers.cs:12:47:12:51 | ... = ... | +| pre | Initializers.cs:12:47:12:51 | ... = ... | Initializers.cs:12:38:12:53 | { ..., ... } | +| pre | Initializers.cs:12:51:12:51 | 1 | Initializers.cs:12:47:12:47 | access to property G | +| pre | Initializers.cs:13:9:13:64 | ... ...; | Initializers.cs:13:18:13:63 | array creation of type Initializers[] | +| pre | Initializers.cs:13:13:13:63 | Initializers[] iz = ... | Initializers.cs:10:10:10:10 | exit M | +| pre | Initializers.cs:13:18:13:63 | array creation of type Initializers[] | Initializers.cs:13:39:13:39 | access to local variable i | +| pre | Initializers.cs:13:37:13:63 | { ..., ... } | Initializers.cs:13:13:13:63 | Initializers[] iz = ... | +| pre | Initializers.cs:13:39:13:39 | access to local variable i | Initializers.cs:13:59:13:60 | "" | +| pre | Initializers.cs:13:42:13:61 | object creation of type Initializers | Initializers.cs:13:37:13:63 | { ..., ... } | +| pre | Initializers.cs:13:59:13:60 | "" | Initializers.cs:13:42:13:61 | object creation of type Initializers | +| pre | Initializers.cs:16:20:16:20 | 1 | Initializers.cs:16:16:16:20 | ... = ... | +| pre | Initializers.cs:18:11:18:23 | enter NoConstructor | Initializers.cs:20:23:20:23 | this access | +| pre | Initializers.cs:20:23:20:23 | this access | Initializers.cs:20:27:20:27 | 0 | +| pre | Initializers.cs:20:23:20:23 | this access | Initializers.cs:20:27:20:27 | 0 | +| pre | Initializers.cs:20:23:20:27 | ... = ... | Initializers.cs:21:23:21:23 | this access | +| pre | Initializers.cs:20:23:20:27 | ... = ... | Initializers.cs:21:23:21:23 | this access | +| pre | Initializers.cs:20:27:20:27 | 0 | Initializers.cs:20:23:20:27 | ... = ... | +| pre | Initializers.cs:20:27:20:27 | 0 | Initializers.cs:20:23:20:27 | ... = ... | +| pre | Initializers.cs:21:23:21:23 | this access | Initializers.cs:21:27:21:27 | 1 | +| pre | Initializers.cs:21:23:21:23 | this access | Initializers.cs:21:27:21:27 | 1 | +| pre | Initializers.cs:21:23:21:27 | ... = ... | Initializers.cs:18:11:18:23 | exit NoConstructor | +| pre | Initializers.cs:21:23:21:27 | ... = ... | Initializers.cs:26:13:26:13 | this access | +| pre | Initializers.cs:21:27:21:27 | 1 | Initializers.cs:21:23:21:27 | ... = ... | +| pre | Initializers.cs:21:27:21:27 | 1 | Initializers.cs:21:23:21:27 | ... = ... | +| pre | Initializers.cs:26:13:26:13 | this access | Initializers.cs:26:17:26:17 | 2 | +| pre | Initializers.cs:26:13:26:13 | this access | Initializers.cs:26:17:26:17 | 2 | +| pre | Initializers.cs:26:13:26:17 | ... = ... | Initializers.cs:29:24:29:33 | {...} | +| pre | Initializers.cs:26:13:26:17 | ... = ... | Initializers.cs:33:27:33:40 | {...} | +| pre | Initializers.cs:26:17:26:17 | 2 | Initializers.cs:26:13:26:17 | ... = ... | +| pre | Initializers.cs:26:17:26:17 | 2 | Initializers.cs:26:13:26:17 | ... = ... | +| pre | Initializers.cs:29:9:29:11 | enter Sub | Initializers.cs:29:17:29:20 | call to constructor NoConstructor | +| pre | Initializers.cs:29:17:29:20 | call to constructor NoConstructor | Initializers.cs:26:13:26:13 | this access | +| pre | Initializers.cs:29:24:29:33 | {...} | Initializers.cs:29:26:29:31 | ...; | +| pre | Initializers.cs:29:26:29:26 | this access | Initializers.cs:29:30:29:30 | 3 | +| pre | Initializers.cs:29:26:29:30 | ... = ... | Initializers.cs:29:9:29:11 | exit Sub | +| pre | Initializers.cs:29:26:29:31 | ...; | Initializers.cs:29:26:29:26 | this access | +| pre | Initializers.cs:29:30:29:30 | 3 | Initializers.cs:29:26:29:30 | ... = ... | +| pre | Initializers.cs:31:9:31:11 | enter Sub | Initializers.cs:31:22:31:25 | call to constructor Sub | +| pre | Initializers.cs:31:22:31:25 | call to constructor Sub | Initializers.cs:31:29:31:38 | {...} | +| pre | Initializers.cs:31:29:31:38 | {...} | Initializers.cs:31:31:31:36 | ...; | +| pre | Initializers.cs:31:31:31:31 | this access | Initializers.cs:31:35:31:35 | access to parameter i | +| pre | Initializers.cs:31:31:31:35 | ... = ... | Initializers.cs:31:9:31:11 | exit Sub | +| pre | Initializers.cs:31:31:31:36 | ...; | Initializers.cs:31:31:31:31 | this access | +| pre | Initializers.cs:31:35:31:35 | access to parameter i | Initializers.cs:31:31:31:35 | ... = ... | +| pre | Initializers.cs:33:9:33:11 | enter Sub | Initializers.cs:20:23:20:23 | this access | +| pre | Initializers.cs:33:27:33:40 | {...} | Initializers.cs:33:29:33:38 | ...; | +| pre | Initializers.cs:33:29:33:29 | this access | Initializers.cs:33:33:33:33 | access to parameter i | +| pre | Initializers.cs:33:29:33:37 | ... = ... | Initializers.cs:33:9:33:11 | exit Sub | +| pre | Initializers.cs:33:29:33:38 | ...; | Initializers.cs:33:29:33:29 | this access | +| pre | Initializers.cs:33:33:33:33 | access to parameter i | Initializers.cs:33:37:33:37 | access to parameter j | +| pre | Initializers.cs:33:33:33:37 | ... + ... | Initializers.cs:33:29:33:37 | ... = ... | +| pre | Initializers.cs:33:37:33:37 | access to parameter j | Initializers.cs:33:33:33:37 | ... + ... | | pre | NullCoalescing.cs:3:9:3:10 | enter M1 | NullCoalescing.cs:3:23:3:28 | ... ?? ... | | pre | NullCoalescing.cs:3:23:3:23 | access to parameter i | NullCoalescing.cs:3:9:3:10 | exit M1 | | pre | NullCoalescing.cs:3:23:3:23 | access to parameter i | NullCoalescing.cs:3:28:3:28 | 0 | diff --git a/csharp/ql/test/library-tests/controlflow/graph/ElementGraph.expected b/csharp/ql/test/library-tests/controlflow/graph/ElementGraph.expected index 60768b374a2..96a1b73c377 100644 --- a/csharp/ql/test/library-tests/controlflow/graph/ElementGraph.expected +++ b/csharp/ql/test/library-tests/controlflow/graph/ElementGraph.expected @@ -941,32 +941,61 @@ | Foreach.cs:38:39:38:42 | access to parameter args | Foreach.cs:38:9:39:11 | foreach (... ... in ...) ... | semmle.label | successor | | Foreach.cs:39:11:39:11 | ; | Foreach.cs:38:9:39:11 | foreach (... ... in ...) ... | semmle.label | successor | | Initializers.cs:3:9:3:9 | this access | Initializers.cs:3:13:3:13 | access to field H | semmle.label | successor | +| Initializers.cs:3:9:3:17 | ... = ... | Initializers.cs:4:9:4:9 | this access | semmle.label | successor | | Initializers.cs:3:13:3:13 | access to field H | Initializers.cs:3:17:3:17 | 1 | semmle.label | successor | | Initializers.cs:3:13:3:17 | ... + ... | Initializers.cs:3:9:3:17 | ... = ... | semmle.label | successor | | Initializers.cs:3:17:3:17 | 1 | Initializers.cs:3:13:3:17 | ... + ... | semmle.label | successor | | Initializers.cs:4:9:4:9 | access to property G | Initializers.cs:4:25:4:31 | ... = ... | semmle.label | successor | | Initializers.cs:4:9:4:9 | this access | Initializers.cs:4:27:4:27 | access to field H | semmle.label | successor | +| Initializers.cs:4:25:4:31 | ... = ... | Initializers.cs:6:20:6:22 | {...} | semmle.label | successor | +| Initializers.cs:4:25:4:31 | ... = ... | Initializers.cs:8:28:8:30 | {...} | semmle.label | successor | | Initializers.cs:4:27:4:27 | access to field H | Initializers.cs:4:31:4:31 | 2 | semmle.label | successor | | Initializers.cs:4:27:4:31 | ... + ... | Initializers.cs:4:9:4:9 | access to property G | semmle.label | successor | | Initializers.cs:4:31:4:31 | 2 | Initializers.cs:4:27:4:31 | ... + ... | semmle.label | successor | -| Initializers.cs:9:5:12:5 | {...} | Initializers.cs:10:9:10:54 | ... ...; | semmle.label | successor | -| Initializers.cs:10:9:10:54 | ... ...; | Initializers.cs:10:34:10:35 | "" | semmle.label | successor | -| Initializers.cs:10:13:10:53 | Initializers i = ... | Initializers.cs:11:9:11:64 | ... ...; | semmle.label | successor | -| Initializers.cs:10:17:10:53 | object creation of type Initializers | Initializers.cs:10:44:10:44 | 0 | semmle.label | successor | -| Initializers.cs:10:34:10:35 | "" | Initializers.cs:10:17:10:53 | object creation of type Initializers | semmle.label | successor | -| Initializers.cs:10:38:10:53 | { ..., ... } | Initializers.cs:10:13:10:53 | Initializers i = ... | semmle.label | successor | -| Initializers.cs:10:40:10:44 | ... = ... | Initializers.cs:10:51:10:51 | 1 | semmle.label | successor | -| Initializers.cs:10:44:10:44 | 0 | Initializers.cs:10:40:10:44 | ... = ... | semmle.label | successor | -| Initializers.cs:10:47:10:47 | access to property G | Initializers.cs:10:47:10:51 | ... = ... | semmle.label | successor | -| Initializers.cs:10:47:10:51 | ... = ... | Initializers.cs:10:38:10:53 | { ..., ... } | semmle.label | successor | -| Initializers.cs:10:51:10:51 | 1 | Initializers.cs:10:47:10:47 | access to property G | semmle.label | successor | -| Initializers.cs:11:9:11:64 | ... ...; | Initializers.cs:11:18:11:63 | array creation of type Initializers[] | semmle.label | successor | -| Initializers.cs:11:18:11:63 | array creation of type Initializers[] | Initializers.cs:11:39:11:39 | access to local variable i | semmle.label | successor | -| Initializers.cs:11:37:11:63 | { ..., ... } | Initializers.cs:11:13:11:63 | Initializers[] iz = ... | semmle.label | successor | -| Initializers.cs:11:39:11:39 | access to local variable i | Initializers.cs:11:59:11:60 | "" | semmle.label | successor | -| Initializers.cs:11:42:11:61 | object creation of type Initializers | Initializers.cs:11:37:11:63 | { ..., ... } | semmle.label | successor | -| Initializers.cs:11:59:11:60 | "" | Initializers.cs:11:42:11:61 | object creation of type Initializers | semmle.label | successor | -| Initializers.cs:14:20:14:20 | 1 | Initializers.cs:14:16:14:20 | ... = ... | semmle.label | successor | +| Initializers.cs:11:5:14:5 | {...} | Initializers.cs:12:9:12:54 | ... ...; | semmle.label | successor | +| Initializers.cs:12:9:12:54 | ... ...; | Initializers.cs:12:34:12:35 | "" | semmle.label | successor | +| Initializers.cs:12:13:12:53 | Initializers i = ... | Initializers.cs:13:9:13:64 | ... ...; | semmle.label | successor | +| Initializers.cs:12:17:12:53 | object creation of type Initializers | Initializers.cs:12:44:12:44 | 0 | semmle.label | successor | +| Initializers.cs:12:34:12:35 | "" | Initializers.cs:12:17:12:53 | object creation of type Initializers | semmle.label | successor | +| Initializers.cs:12:38:12:53 | { ..., ... } | Initializers.cs:12:13:12:53 | Initializers i = ... | semmle.label | successor | +| Initializers.cs:12:40:12:44 | ... = ... | Initializers.cs:12:51:12:51 | 1 | semmle.label | successor | +| Initializers.cs:12:44:12:44 | 0 | Initializers.cs:12:40:12:44 | ... = ... | semmle.label | successor | +| Initializers.cs:12:47:12:47 | access to property G | Initializers.cs:12:47:12:51 | ... = ... | semmle.label | successor | +| Initializers.cs:12:47:12:51 | ... = ... | Initializers.cs:12:38:12:53 | { ..., ... } | semmle.label | successor | +| Initializers.cs:12:51:12:51 | 1 | Initializers.cs:12:47:12:47 | access to property G | semmle.label | successor | +| Initializers.cs:13:9:13:64 | ... ...; | Initializers.cs:13:18:13:63 | array creation of type Initializers[] | semmle.label | successor | +| Initializers.cs:13:18:13:63 | array creation of type Initializers[] | Initializers.cs:13:39:13:39 | access to local variable i | semmle.label | successor | +| Initializers.cs:13:37:13:63 | { ..., ... } | Initializers.cs:13:13:13:63 | Initializers[] iz = ... | semmle.label | successor | +| Initializers.cs:13:39:13:39 | access to local variable i | Initializers.cs:13:59:13:60 | "" | semmle.label | successor | +| Initializers.cs:13:42:13:61 | object creation of type Initializers | Initializers.cs:13:37:13:63 | { ..., ... } | semmle.label | successor | +| Initializers.cs:13:59:13:60 | "" | Initializers.cs:13:42:13:61 | object creation of type Initializers | semmle.label | successor | +| Initializers.cs:16:20:16:20 | 1 | Initializers.cs:16:16:16:20 | ... = ... | semmle.label | successor | +| Initializers.cs:20:23:20:23 | this access | Initializers.cs:20:27:20:27 | 0 | semmle.label | successor | +| Initializers.cs:20:23:20:27 | ... = ... | Initializers.cs:21:23:21:23 | this access | semmle.label | successor | +| Initializers.cs:20:27:20:27 | 0 | Initializers.cs:20:23:20:27 | ... = ... | semmle.label | successor | +| Initializers.cs:21:23:21:23 | this access | Initializers.cs:21:27:21:27 | 1 | semmle.label | successor | +| Initializers.cs:21:23:21:27 | ... = ... | Initializers.cs:26:13:26:13 | this access | semmle.label | successor | +| Initializers.cs:21:27:21:27 | 1 | Initializers.cs:21:23:21:27 | ... = ... | semmle.label | successor | +| Initializers.cs:26:13:26:13 | this access | Initializers.cs:26:17:26:17 | 2 | semmle.label | successor | +| Initializers.cs:26:13:26:17 | ... = ... | Initializers.cs:29:24:29:33 | {...} | semmle.label | successor | +| Initializers.cs:26:13:26:17 | ... = ... | Initializers.cs:33:27:33:40 | {...} | semmle.label | successor | +| Initializers.cs:26:17:26:17 | 2 | Initializers.cs:26:13:26:17 | ... = ... | semmle.label | successor | +| Initializers.cs:29:17:29:20 | call to constructor NoConstructor | Initializers.cs:26:13:26:13 | this access | semmle.label | successor | +| Initializers.cs:29:24:29:33 | {...} | Initializers.cs:29:26:29:31 | ...; | semmle.label | successor | +| Initializers.cs:29:26:29:26 | this access | Initializers.cs:29:30:29:30 | 3 | semmle.label | successor | +| Initializers.cs:29:26:29:31 | ...; | Initializers.cs:29:26:29:26 | this access | semmle.label | successor | +| Initializers.cs:29:30:29:30 | 3 | Initializers.cs:29:26:29:30 | ... = ... | semmle.label | successor | +| Initializers.cs:31:22:31:25 | call to constructor Sub | Initializers.cs:31:29:31:38 | {...} | semmle.label | successor | +| Initializers.cs:31:29:31:38 | {...} | Initializers.cs:31:31:31:36 | ...; | semmle.label | successor | +| Initializers.cs:31:31:31:31 | this access | Initializers.cs:31:35:31:35 | access to parameter i | semmle.label | successor | +| Initializers.cs:31:31:31:36 | ...; | Initializers.cs:31:31:31:31 | this access | semmle.label | successor | +| Initializers.cs:31:35:31:35 | access to parameter i | Initializers.cs:31:31:31:35 | ... = ... | semmle.label | successor | +| Initializers.cs:33:27:33:40 | {...} | Initializers.cs:33:29:33:38 | ...; | semmle.label | successor | +| Initializers.cs:33:29:33:29 | this access | Initializers.cs:33:33:33:33 | access to parameter i | semmle.label | successor | +| Initializers.cs:33:29:33:38 | ...; | Initializers.cs:33:29:33:29 | this access | semmle.label | successor | +| Initializers.cs:33:33:33:33 | access to parameter i | Initializers.cs:33:37:33:37 | access to parameter j | semmle.label | successor | +| Initializers.cs:33:33:33:37 | ... + ... | Initializers.cs:33:29:33:37 | ... = ... | semmle.label | successor | +| Initializers.cs:33:37:33:37 | access to parameter j | Initializers.cs:33:33:33:37 | ... + ... | semmle.label | successor | | NullCoalescing.cs:3:23:3:23 | access to parameter i | NullCoalescing.cs:3:28:3:28 | 0 | semmle.label | null | | NullCoalescing.cs:3:23:3:28 | ... ?? ... | NullCoalescing.cs:3:23:3:23 | access to parameter i | semmle.label | successor | | NullCoalescing.cs:5:24:5:43 | ... ? ... : ... | NullCoalescing.cs:5:25:5:34 | ... ?? ... | semmle.label | successor | diff --git a/csharp/ql/test/library-tests/controlflow/graph/EnclosingCallable.expected b/csharp/ql/test/library-tests/controlflow/graph/EnclosingCallable.expected new file mode 100644 index 00000000000..ac93b968bef --- /dev/null +++ b/csharp/ql/test/library-tests/controlflow/graph/EnclosingCallable.expected @@ -0,0 +1,3494 @@ +nodeEnclosing +| AccessorCalls.cs:5:23:5:25 | enter get_Item | AccessorCalls.cs:5:23:5:25 | get_Item | +| AccessorCalls.cs:5:23:5:25 | exit get_Item | AccessorCalls.cs:5:23:5:25 | get_Item | +| AccessorCalls.cs:5:30:5:30 | access to parameter i | AccessorCalls.cs:5:23:5:25 | get_Item | +| AccessorCalls.cs:5:33:5:35 | enter set_Item | AccessorCalls.cs:5:33:5:35 | set_Item | +| AccessorCalls.cs:5:33:5:35 | exit set_Item | AccessorCalls.cs:5:33:5:35 | set_Item | +| AccessorCalls.cs:5:37:5:39 | {...} | AccessorCalls.cs:5:33:5:35 | set_Item | +| AccessorCalls.cs:7:32:7:34 | enter add_Event | AccessorCalls.cs:7:32:7:34 | add_Event | +| AccessorCalls.cs:7:32:7:34 | exit add_Event | AccessorCalls.cs:7:32:7:34 | add_Event | +| AccessorCalls.cs:7:36:7:38 | {...} | AccessorCalls.cs:7:32:7:34 | add_Event | +| AccessorCalls.cs:7:40:7:45 | enter remove_Event | AccessorCalls.cs:7:40:7:45 | remove_Event | +| AccessorCalls.cs:7:40:7:45 | exit remove_Event | AccessorCalls.cs:7:40:7:45 | remove_Event | +| AccessorCalls.cs:7:47:7:49 | {...} | AccessorCalls.cs:7:40:7:45 | remove_Event | +| AccessorCalls.cs:10:10:10:11 | enter M1 | AccessorCalls.cs:10:10:10:11 | M1 | +| AccessorCalls.cs:10:10:10:11 | exit M1 | AccessorCalls.cs:10:10:10:11 | M1 | +| AccessorCalls.cs:11:5:17:5 | {...} | AccessorCalls.cs:10:10:10:11 | M1 | +| AccessorCalls.cs:12:9:12:12 | this access | AccessorCalls.cs:10:10:10:11 | M1 | +| AccessorCalls.cs:12:9:12:31 | ... = ... | AccessorCalls.cs:10:10:10:11 | M1 | +| AccessorCalls.cs:12:9:12:32 | ...; | AccessorCalls.cs:10:10:10:11 | M1 | +| AccessorCalls.cs:12:22:12:25 | this access | AccessorCalls.cs:10:10:10:11 | M1 | +| AccessorCalls.cs:12:22:12:31 | access to field Field | AccessorCalls.cs:10:10:10:11 | M1 | +| AccessorCalls.cs:13:9:13:12 | this access | AccessorCalls.cs:10:10:10:11 | M1 | +| AccessorCalls.cs:13:9:13:17 | access to property Prop | AccessorCalls.cs:10:10:10:11 | M1 | +| AccessorCalls.cs:13:9:13:29 | ... = ... | AccessorCalls.cs:10:10:10:11 | M1 | +| AccessorCalls.cs:13:9:13:30 | ...; | AccessorCalls.cs:10:10:10:11 | M1 | +| AccessorCalls.cs:13:21:13:24 | this access | AccessorCalls.cs:10:10:10:11 | M1 | +| AccessorCalls.cs:13:21:13:29 | access to property Prop | AccessorCalls.cs:10:10:10:11 | M1 | +| AccessorCalls.cs:14:9:14:12 | this access | AccessorCalls.cs:10:10:10:11 | M1 | +| AccessorCalls.cs:14:9:14:15 | access to indexer | AccessorCalls.cs:10:10:10:11 | M1 | +| AccessorCalls.cs:14:9:14:25 | ... = ... | AccessorCalls.cs:10:10:10:11 | M1 | +| AccessorCalls.cs:14:9:14:26 | ...; | AccessorCalls.cs:10:10:10:11 | M1 | +| AccessorCalls.cs:14:14:14:14 | 0 | AccessorCalls.cs:10:10:10:11 | M1 | +| AccessorCalls.cs:14:19:14:22 | this access | AccessorCalls.cs:10:10:10:11 | M1 | +| AccessorCalls.cs:14:19:14:25 | access to indexer | AccessorCalls.cs:10:10:10:11 | M1 | +| AccessorCalls.cs:14:24:14:24 | 1 | AccessorCalls.cs:10:10:10:11 | M1 | +| AccessorCalls.cs:15:9:15:12 | this access | AccessorCalls.cs:10:10:10:11 | M1 | +| AccessorCalls.cs:15:9:15:18 | access to event Event | AccessorCalls.cs:10:10:10:11 | M1 | +| AccessorCalls.cs:15:9:15:23 | ... += ... | AccessorCalls.cs:10:10:10:11 | M1 | +| AccessorCalls.cs:15:9:15:24 | ...; | AccessorCalls.cs:10:10:10:11 | M1 | +| AccessorCalls.cs:15:23:15:23 | access to parameter e | AccessorCalls.cs:10:10:10:11 | M1 | +| AccessorCalls.cs:16:9:16:12 | this access | AccessorCalls.cs:10:10:10:11 | M1 | +| AccessorCalls.cs:16:9:16:18 | access to event Event | AccessorCalls.cs:10:10:10:11 | M1 | +| AccessorCalls.cs:16:9:16:23 | ... -= ... | AccessorCalls.cs:10:10:10:11 | M1 | +| AccessorCalls.cs:16:9:16:24 | ...; | AccessorCalls.cs:10:10:10:11 | M1 | +| AccessorCalls.cs:16:23:16:23 | access to parameter e | AccessorCalls.cs:10:10:10:11 | M1 | +| AccessorCalls.cs:19:10:19:11 | enter M2 | AccessorCalls.cs:19:10:19:11 | M2 | +| AccessorCalls.cs:19:10:19:11 | exit M2 | AccessorCalls.cs:19:10:19:11 | M2 | +| AccessorCalls.cs:20:5:26:5 | {...} | AccessorCalls.cs:19:10:19:11 | M2 | +| AccessorCalls.cs:21:9:21:12 | this access | AccessorCalls.cs:19:10:19:11 | M2 | +| AccessorCalls.cs:21:9:21:14 | access to field x | AccessorCalls.cs:19:10:19:11 | M2 | +| AccessorCalls.cs:21:9:21:35 | ... = ... | AccessorCalls.cs:19:10:19:11 | M2 | +| AccessorCalls.cs:21:9:21:36 | ...; | AccessorCalls.cs:19:10:19:11 | M2 | +| AccessorCalls.cs:21:24:21:27 | this access | AccessorCalls.cs:19:10:19:11 | M2 | +| AccessorCalls.cs:21:24:21:29 | access to field x | AccessorCalls.cs:19:10:19:11 | M2 | +| AccessorCalls.cs:21:24:21:35 | access to field Field | AccessorCalls.cs:19:10:19:11 | M2 | +| AccessorCalls.cs:22:9:22:12 | this access | AccessorCalls.cs:19:10:19:11 | M2 | +| AccessorCalls.cs:22:9:22:14 | access to field x | AccessorCalls.cs:19:10:19:11 | M2 | +| AccessorCalls.cs:22:9:22:19 | access to property Prop | AccessorCalls.cs:19:10:19:11 | M2 | +| AccessorCalls.cs:22:9:22:33 | ... = ... | AccessorCalls.cs:19:10:19:11 | M2 | +| AccessorCalls.cs:22:9:22:34 | ...; | AccessorCalls.cs:19:10:19:11 | M2 | +| AccessorCalls.cs:22:23:22:26 | this access | AccessorCalls.cs:19:10:19:11 | M2 | +| AccessorCalls.cs:22:23:22:28 | access to field x | AccessorCalls.cs:19:10:19:11 | M2 | +| AccessorCalls.cs:22:23:22:33 | access to property Prop | AccessorCalls.cs:19:10:19:11 | M2 | +| AccessorCalls.cs:23:9:23:12 | this access | AccessorCalls.cs:19:10:19:11 | M2 | +| AccessorCalls.cs:23:9:23:14 | access to field x | AccessorCalls.cs:19:10:19:11 | M2 | +| AccessorCalls.cs:23:9:23:17 | access to indexer | AccessorCalls.cs:19:10:19:11 | M2 | +| AccessorCalls.cs:23:9:23:29 | ... = ... | AccessorCalls.cs:19:10:19:11 | M2 | +| AccessorCalls.cs:23:9:23:30 | ...; | AccessorCalls.cs:19:10:19:11 | M2 | +| AccessorCalls.cs:23:16:23:16 | 0 | AccessorCalls.cs:19:10:19:11 | M2 | +| AccessorCalls.cs:23:21:23:24 | this access | AccessorCalls.cs:19:10:19:11 | M2 | +| AccessorCalls.cs:23:21:23:26 | access to field x | AccessorCalls.cs:19:10:19:11 | M2 | +| AccessorCalls.cs:23:21:23:29 | access to indexer | AccessorCalls.cs:19:10:19:11 | M2 | +| AccessorCalls.cs:23:28:23:28 | 1 | AccessorCalls.cs:19:10:19:11 | M2 | +| AccessorCalls.cs:24:9:24:12 | this access | AccessorCalls.cs:19:10:19:11 | M2 | +| AccessorCalls.cs:24:9:24:14 | access to field x | AccessorCalls.cs:19:10:19:11 | M2 | +| AccessorCalls.cs:24:9:24:20 | access to event Event | AccessorCalls.cs:19:10:19:11 | M2 | +| AccessorCalls.cs:24:9:24:25 | ... += ... | AccessorCalls.cs:19:10:19:11 | M2 | +| AccessorCalls.cs:24:9:24:26 | ...; | AccessorCalls.cs:19:10:19:11 | M2 | +| AccessorCalls.cs:24:25:24:25 | access to parameter e | AccessorCalls.cs:19:10:19:11 | M2 | +| AccessorCalls.cs:25:9:25:12 | this access | AccessorCalls.cs:19:10:19:11 | M2 | +| AccessorCalls.cs:25:9:25:14 | access to field x | AccessorCalls.cs:19:10:19:11 | M2 | +| AccessorCalls.cs:25:9:25:20 | access to event Event | AccessorCalls.cs:19:10:19:11 | M2 | +| AccessorCalls.cs:25:9:25:25 | ... -= ... | AccessorCalls.cs:19:10:19:11 | M2 | +| AccessorCalls.cs:25:9:25:26 | ...; | AccessorCalls.cs:19:10:19:11 | M2 | +| AccessorCalls.cs:25:25:25:25 | access to parameter e | AccessorCalls.cs:19:10:19:11 | M2 | +| AccessorCalls.cs:28:10:28:11 | enter M3 | AccessorCalls.cs:28:10:28:11 | M3 | +| AccessorCalls.cs:28:10:28:11 | exit M3 | AccessorCalls.cs:28:10:28:11 | M3 | +| AccessorCalls.cs:29:5:33:5 | {...} | AccessorCalls.cs:28:10:28:11 | M3 | +| AccessorCalls.cs:30:9:30:12 | this access | AccessorCalls.cs:28:10:28:11 | M3 | +| AccessorCalls.cs:30:9:30:18 | access to field Field | AccessorCalls.cs:28:10:28:11 | M3 | +| AccessorCalls.cs:30:9:30:20 | ...++ | AccessorCalls.cs:28:10:28:11 | M3 | +| AccessorCalls.cs:30:9:30:21 | ...; | AccessorCalls.cs:28:10:28:11 | M3 | +| AccessorCalls.cs:31:9:31:12 | this access | AccessorCalls.cs:28:10:28:11 | M3 | +| AccessorCalls.cs:31:9:31:17 | access to property Prop | AccessorCalls.cs:28:10:28:11 | M3 | +| AccessorCalls.cs:31:9:31:19 | ...++ | AccessorCalls.cs:28:10:28:11 | M3 | +| AccessorCalls.cs:31:9:31:20 | ...; | AccessorCalls.cs:28:10:28:11 | M3 | +| AccessorCalls.cs:32:9:32:12 | this access | AccessorCalls.cs:28:10:28:11 | M3 | +| AccessorCalls.cs:32:9:32:15 | access to indexer | AccessorCalls.cs:28:10:28:11 | M3 | +| AccessorCalls.cs:32:9:32:17 | ...++ | AccessorCalls.cs:28:10:28:11 | M3 | +| AccessorCalls.cs:32:9:32:18 | ...; | AccessorCalls.cs:28:10:28:11 | M3 | +| AccessorCalls.cs:32:14:32:14 | 0 | AccessorCalls.cs:28:10:28:11 | M3 | +| AccessorCalls.cs:35:10:35:11 | enter M4 | AccessorCalls.cs:35:10:35:11 | M4 | +| AccessorCalls.cs:35:10:35:11 | exit M4 | AccessorCalls.cs:35:10:35:11 | M4 | +| AccessorCalls.cs:36:5:40:5 | {...} | AccessorCalls.cs:35:10:35:11 | M4 | +| AccessorCalls.cs:37:9:37:12 | this access | AccessorCalls.cs:35:10:35:11 | M4 | +| AccessorCalls.cs:37:9:37:14 | access to field x | AccessorCalls.cs:35:10:35:11 | M4 | +| AccessorCalls.cs:37:9:37:20 | access to field Field | AccessorCalls.cs:35:10:35:11 | M4 | +| AccessorCalls.cs:37:9:37:22 | ...++ | AccessorCalls.cs:35:10:35:11 | M4 | +| AccessorCalls.cs:37:9:37:23 | ...; | AccessorCalls.cs:35:10:35:11 | M4 | +| AccessorCalls.cs:38:9:38:12 | this access | AccessorCalls.cs:35:10:35:11 | M4 | +| AccessorCalls.cs:38:9:38:14 | access to field x | AccessorCalls.cs:35:10:35:11 | M4 | +| AccessorCalls.cs:38:9:38:19 | access to property Prop | AccessorCalls.cs:35:10:35:11 | M4 | +| AccessorCalls.cs:38:9:38:21 | ...++ | AccessorCalls.cs:35:10:35:11 | M4 | +| AccessorCalls.cs:38:9:38:22 | ...; | AccessorCalls.cs:35:10:35:11 | M4 | +| AccessorCalls.cs:39:9:39:12 | this access | AccessorCalls.cs:35:10:35:11 | M4 | +| AccessorCalls.cs:39:9:39:14 | access to field x | AccessorCalls.cs:35:10:35:11 | M4 | +| AccessorCalls.cs:39:9:39:17 | access to indexer | AccessorCalls.cs:35:10:35:11 | M4 | +| AccessorCalls.cs:39:9:39:19 | ...++ | AccessorCalls.cs:35:10:35:11 | M4 | +| AccessorCalls.cs:39:9:39:20 | ...; | AccessorCalls.cs:35:10:35:11 | M4 | +| AccessorCalls.cs:39:16:39:16 | 0 | AccessorCalls.cs:35:10:35:11 | M4 | +| AccessorCalls.cs:42:10:42:11 | enter M5 | AccessorCalls.cs:42:10:42:11 | M5 | +| AccessorCalls.cs:42:10:42:11 | exit M5 | AccessorCalls.cs:42:10:42:11 | M5 | +| AccessorCalls.cs:43:5:47:5 | {...} | AccessorCalls.cs:42:10:42:11 | M5 | +| AccessorCalls.cs:44:9:44:12 | this access | AccessorCalls.cs:42:10:42:11 | M5 | +| AccessorCalls.cs:44:9:44:12 | this access | AccessorCalls.cs:42:10:42:11 | M5 | +| AccessorCalls.cs:44:9:44:18 | access to field Field | AccessorCalls.cs:42:10:42:11 | M5 | +| AccessorCalls.cs:44:9:44:32 | ... + ... | AccessorCalls.cs:42:10:42:11 | M5 | +| AccessorCalls.cs:44:9:44:32 | ... = ... | AccessorCalls.cs:42:10:42:11 | M5 | +| AccessorCalls.cs:44:9:44:33 | ...; | AccessorCalls.cs:42:10:42:11 | M5 | +| AccessorCalls.cs:44:23:44:26 | this access | AccessorCalls.cs:42:10:42:11 | M5 | +| AccessorCalls.cs:44:23:44:32 | access to field Field | AccessorCalls.cs:42:10:42:11 | M5 | +| AccessorCalls.cs:45:9:45:12 | this access | AccessorCalls.cs:42:10:42:11 | M5 | +| AccessorCalls.cs:45:9:45:12 | this access | AccessorCalls.cs:42:10:42:11 | M5 | +| AccessorCalls.cs:45:9:45:17 | access to property Prop | AccessorCalls.cs:42:10:42:11 | M5 | +| AccessorCalls.cs:45:9:45:17 | access to property Prop | AccessorCalls.cs:42:10:42:11 | M5 | +| AccessorCalls.cs:45:9:45:30 | ... + ... | AccessorCalls.cs:42:10:42:11 | M5 | +| AccessorCalls.cs:45:9:45:30 | ... = ... | AccessorCalls.cs:42:10:42:11 | M5 | +| AccessorCalls.cs:45:9:45:31 | ...; | AccessorCalls.cs:42:10:42:11 | M5 | +| AccessorCalls.cs:45:22:45:25 | this access | AccessorCalls.cs:42:10:42:11 | M5 | +| AccessorCalls.cs:45:22:45:30 | access to property Prop | AccessorCalls.cs:42:10:42:11 | M5 | +| AccessorCalls.cs:46:9:46:12 | this access | AccessorCalls.cs:42:10:42:11 | M5 | +| AccessorCalls.cs:46:9:46:12 | this access | AccessorCalls.cs:42:10:42:11 | M5 | +| AccessorCalls.cs:46:9:46:15 | access to indexer | AccessorCalls.cs:42:10:42:11 | M5 | +| AccessorCalls.cs:46:9:46:15 | access to indexer | AccessorCalls.cs:42:10:42:11 | M5 | +| AccessorCalls.cs:46:9:46:26 | ... + ... | AccessorCalls.cs:42:10:42:11 | M5 | +| AccessorCalls.cs:46:9:46:26 | ... = ... | AccessorCalls.cs:42:10:42:11 | M5 | +| AccessorCalls.cs:46:9:46:27 | ...; | AccessorCalls.cs:42:10:42:11 | M5 | +| AccessorCalls.cs:46:14:46:14 | 0 | AccessorCalls.cs:42:10:42:11 | M5 | +| AccessorCalls.cs:46:14:46:14 | 0 | AccessorCalls.cs:42:10:42:11 | M5 | +| AccessorCalls.cs:46:20:46:23 | this access | AccessorCalls.cs:42:10:42:11 | M5 | +| AccessorCalls.cs:46:20:46:26 | access to indexer | AccessorCalls.cs:42:10:42:11 | M5 | +| AccessorCalls.cs:46:25:46:25 | 0 | AccessorCalls.cs:42:10:42:11 | M5 | +| AccessorCalls.cs:49:10:49:11 | enter M6 | AccessorCalls.cs:49:10:49:11 | M6 | +| AccessorCalls.cs:49:10:49:11 | exit M6 | AccessorCalls.cs:49:10:49:11 | M6 | +| AccessorCalls.cs:50:5:54:5 | {...} | AccessorCalls.cs:49:10:49:11 | M6 | +| AccessorCalls.cs:51:9:51:12 | this access | AccessorCalls.cs:49:10:49:11 | M6 | +| AccessorCalls.cs:51:9:51:12 | this access | AccessorCalls.cs:49:10:49:11 | M6 | +| AccessorCalls.cs:51:9:51:14 | access to field x | AccessorCalls.cs:49:10:49:11 | M6 | +| AccessorCalls.cs:51:9:51:14 | access to field x | AccessorCalls.cs:49:10:49:11 | M6 | +| AccessorCalls.cs:51:9:51:20 | access to field Field | AccessorCalls.cs:49:10:49:11 | M6 | +| AccessorCalls.cs:51:9:51:36 | ... + ... | AccessorCalls.cs:49:10:49:11 | M6 | +| AccessorCalls.cs:51:9:51:36 | ... = ... | AccessorCalls.cs:49:10:49:11 | M6 | +| AccessorCalls.cs:51:9:51:37 | ...; | AccessorCalls.cs:49:10:49:11 | M6 | +| AccessorCalls.cs:51:25:51:28 | this access | AccessorCalls.cs:49:10:49:11 | M6 | +| AccessorCalls.cs:51:25:51:30 | access to field x | AccessorCalls.cs:49:10:49:11 | M6 | +| AccessorCalls.cs:51:25:51:36 | access to field Field | AccessorCalls.cs:49:10:49:11 | M6 | +| AccessorCalls.cs:52:9:52:12 | this access | AccessorCalls.cs:49:10:49:11 | M6 | +| AccessorCalls.cs:52:9:52:12 | this access | AccessorCalls.cs:49:10:49:11 | M6 | +| AccessorCalls.cs:52:9:52:14 | access to field x | AccessorCalls.cs:49:10:49:11 | M6 | +| AccessorCalls.cs:52:9:52:14 | access to field x | AccessorCalls.cs:49:10:49:11 | M6 | +| AccessorCalls.cs:52:9:52:19 | access to property Prop | AccessorCalls.cs:49:10:49:11 | M6 | +| AccessorCalls.cs:52:9:52:19 | access to property Prop | AccessorCalls.cs:49:10:49:11 | M6 | +| AccessorCalls.cs:52:9:52:34 | ... + ... | AccessorCalls.cs:49:10:49:11 | M6 | +| AccessorCalls.cs:52:9:52:34 | ... = ... | AccessorCalls.cs:49:10:49:11 | M6 | +| AccessorCalls.cs:52:9:52:35 | ...; | AccessorCalls.cs:49:10:49:11 | M6 | +| AccessorCalls.cs:52:24:52:27 | this access | AccessorCalls.cs:49:10:49:11 | M6 | +| AccessorCalls.cs:52:24:52:29 | access to field x | AccessorCalls.cs:49:10:49:11 | M6 | +| AccessorCalls.cs:52:24:52:34 | access to property Prop | AccessorCalls.cs:49:10:49:11 | M6 | +| AccessorCalls.cs:53:9:53:12 | this access | AccessorCalls.cs:49:10:49:11 | M6 | +| AccessorCalls.cs:53:9:53:12 | this access | AccessorCalls.cs:49:10:49:11 | M6 | +| AccessorCalls.cs:53:9:53:14 | access to field x | AccessorCalls.cs:49:10:49:11 | M6 | +| AccessorCalls.cs:53:9:53:14 | access to field x | AccessorCalls.cs:49:10:49:11 | M6 | +| AccessorCalls.cs:53:9:53:17 | access to indexer | AccessorCalls.cs:49:10:49:11 | M6 | +| AccessorCalls.cs:53:9:53:17 | access to indexer | AccessorCalls.cs:49:10:49:11 | M6 | +| AccessorCalls.cs:53:9:53:30 | ... + ... | AccessorCalls.cs:49:10:49:11 | M6 | +| AccessorCalls.cs:53:9:53:30 | ... = ... | AccessorCalls.cs:49:10:49:11 | M6 | +| AccessorCalls.cs:53:9:53:31 | ...; | AccessorCalls.cs:49:10:49:11 | M6 | +| AccessorCalls.cs:53:16:53:16 | 0 | AccessorCalls.cs:49:10:49:11 | M6 | +| AccessorCalls.cs:53:16:53:16 | 0 | AccessorCalls.cs:49:10:49:11 | M6 | +| AccessorCalls.cs:53:22:53:25 | this access | AccessorCalls.cs:49:10:49:11 | M6 | +| AccessorCalls.cs:53:22:53:27 | access to field x | AccessorCalls.cs:49:10:49:11 | M6 | +| AccessorCalls.cs:53:22:53:30 | access to indexer | AccessorCalls.cs:49:10:49:11 | M6 | +| AccessorCalls.cs:53:29:53:29 | 0 | AccessorCalls.cs:49:10:49:11 | M6 | +| AccessorCalls.cs:56:10:56:11 | enter M7 | AccessorCalls.cs:56:10:56:11 | M7 | +| AccessorCalls.cs:56:10:56:11 | exit M7 | AccessorCalls.cs:56:10:56:11 | M7 | +| AccessorCalls.cs:57:5:59:5 | {...} | AccessorCalls.cs:56:10:56:11 | M7 | +| AccessorCalls.cs:58:9:58:45 | (..., ...) | AccessorCalls.cs:56:10:56:11 | M7 | +| AccessorCalls.cs:58:9:58:85 | ... = ... | AccessorCalls.cs:56:10:56:11 | M7 | +| AccessorCalls.cs:58:9:58:86 | ...; | AccessorCalls.cs:56:10:56:11 | M7 | +| AccessorCalls.cs:58:10:58:13 | this access | AccessorCalls.cs:56:10:56:11 | M7 | +| AccessorCalls.cs:58:22:58:25 | this access | AccessorCalls.cs:56:10:56:11 | M7 | +| AccessorCalls.cs:58:22:58:30 | access to property Prop | AccessorCalls.cs:56:10:56:11 | M7 | +| AccessorCalls.cs:58:33:58:44 | (..., ...) | AccessorCalls.cs:56:10:56:11 | M7 | +| AccessorCalls.cs:58:37:58:40 | this access | AccessorCalls.cs:56:10:56:11 | M7 | +| AccessorCalls.cs:58:37:58:43 | access to indexer | AccessorCalls.cs:56:10:56:11 | M7 | +| AccessorCalls.cs:58:42:58:42 | 0 | AccessorCalls.cs:56:10:56:11 | M7 | +| AccessorCalls.cs:58:49:58:85 | (..., ...) | AccessorCalls.cs:56:10:56:11 | M7 | +| AccessorCalls.cs:58:50:58:53 | this access | AccessorCalls.cs:56:10:56:11 | M7 | +| AccessorCalls.cs:58:50:58:59 | access to field Field | AccessorCalls.cs:56:10:56:11 | M7 | +| AccessorCalls.cs:58:62:58:65 | this access | AccessorCalls.cs:56:10:56:11 | M7 | +| AccessorCalls.cs:58:62:58:70 | access to property Prop | AccessorCalls.cs:56:10:56:11 | M7 | +| AccessorCalls.cs:58:73:58:84 | (..., ...) | AccessorCalls.cs:56:10:56:11 | M7 | +| AccessorCalls.cs:58:74:58:74 | 0 | AccessorCalls.cs:56:10:56:11 | M7 | +| AccessorCalls.cs:58:77:58:80 | this access | AccessorCalls.cs:56:10:56:11 | M7 | +| AccessorCalls.cs:58:77:58:83 | access to indexer | AccessorCalls.cs:56:10:56:11 | M7 | +| AccessorCalls.cs:58:82:58:82 | 1 | AccessorCalls.cs:56:10:56:11 | M7 | +| AccessorCalls.cs:61:10:61:11 | enter M8 | AccessorCalls.cs:61:10:61:11 | M8 | +| AccessorCalls.cs:61:10:61:11 | exit M8 | AccessorCalls.cs:61:10:61:11 | M8 | +| AccessorCalls.cs:62:5:64:5 | {...} | AccessorCalls.cs:61:10:61:11 | M8 | +| AccessorCalls.cs:63:9:63:51 | (..., ...) | AccessorCalls.cs:61:10:61:11 | M8 | +| AccessorCalls.cs:63:9:63:97 | ... = ... | AccessorCalls.cs:61:10:61:11 | M8 | +| AccessorCalls.cs:63:9:63:98 | ...; | AccessorCalls.cs:61:10:61:11 | M8 | +| AccessorCalls.cs:63:10:63:13 | this access | AccessorCalls.cs:61:10:61:11 | M8 | +| AccessorCalls.cs:63:10:63:15 | access to field x | AccessorCalls.cs:61:10:61:11 | M8 | +| AccessorCalls.cs:63:24:63:27 | this access | AccessorCalls.cs:61:10:61:11 | M8 | +| AccessorCalls.cs:63:24:63:29 | access to field x | AccessorCalls.cs:61:10:61:11 | M8 | +| AccessorCalls.cs:63:24:63:34 | access to property Prop | AccessorCalls.cs:61:10:61:11 | M8 | +| AccessorCalls.cs:63:37:63:50 | (..., ...) | AccessorCalls.cs:61:10:61:11 | M8 | +| AccessorCalls.cs:63:41:63:44 | this access | AccessorCalls.cs:61:10:61:11 | M8 | +| AccessorCalls.cs:63:41:63:46 | access to field x | AccessorCalls.cs:61:10:61:11 | M8 | +| AccessorCalls.cs:63:41:63:49 | access to indexer | AccessorCalls.cs:61:10:61:11 | M8 | +| AccessorCalls.cs:63:48:63:48 | 0 | AccessorCalls.cs:61:10:61:11 | M8 | +| AccessorCalls.cs:63:55:63:97 | (..., ...) | AccessorCalls.cs:61:10:61:11 | M8 | +| AccessorCalls.cs:63:56:63:59 | this access | AccessorCalls.cs:61:10:61:11 | M8 | +| AccessorCalls.cs:63:56:63:61 | access to field x | AccessorCalls.cs:61:10:61:11 | M8 | +| AccessorCalls.cs:63:56:63:67 | access to field Field | AccessorCalls.cs:61:10:61:11 | M8 | +| AccessorCalls.cs:63:70:63:73 | this access | AccessorCalls.cs:61:10:61:11 | M8 | +| AccessorCalls.cs:63:70:63:75 | access to field x | AccessorCalls.cs:61:10:61:11 | M8 | +| AccessorCalls.cs:63:70:63:80 | access to property Prop | AccessorCalls.cs:61:10:61:11 | M8 | +| AccessorCalls.cs:63:83:63:96 | (..., ...) | AccessorCalls.cs:61:10:61:11 | M8 | +| AccessorCalls.cs:63:84:63:84 | 0 | AccessorCalls.cs:61:10:61:11 | M8 | +| AccessorCalls.cs:63:87:63:90 | this access | AccessorCalls.cs:61:10:61:11 | M8 | +| AccessorCalls.cs:63:87:63:92 | access to field x | AccessorCalls.cs:61:10:61:11 | M8 | +| AccessorCalls.cs:63:87:63:95 | access to indexer | AccessorCalls.cs:61:10:61:11 | M8 | +| AccessorCalls.cs:63:94:63:94 | 1 | AccessorCalls.cs:61:10:61:11 | M8 | +| AccessorCalls.cs:66:10:66:11 | enter M9 | AccessorCalls.cs:66:10:66:11 | M9 | +| AccessorCalls.cs:66:10:66:11 | exit M9 | AccessorCalls.cs:66:10:66:11 | M9 | +| AccessorCalls.cs:67:5:74:5 | {...} | AccessorCalls.cs:66:10:66:11 | M9 | +| AccessorCalls.cs:68:9:68:22 | ... ...; | AccessorCalls.cs:66:10:66:11 | M9 | +| AccessorCalls.cs:68:17:68:21 | dynamic d = ... | AccessorCalls.cs:66:10:66:11 | M9 | +| AccessorCalls.cs:68:21:68:21 | access to parameter o | AccessorCalls.cs:66:10:66:11 | M9 | +| AccessorCalls.cs:69:9:69:9 | access to local variable d | AccessorCalls.cs:66:10:66:11 | M9 | +| AccessorCalls.cs:69:9:69:20 | dynamic access to member MaybeProp1 | AccessorCalls.cs:66:10:66:11 | M9 | +| AccessorCalls.cs:69:9:69:35 | ... = ... | AccessorCalls.cs:66:10:66:11 | M9 | +| AccessorCalls.cs:69:9:69:36 | ...; | AccessorCalls.cs:66:10:66:11 | M9 | +| AccessorCalls.cs:69:24:69:24 | access to local variable d | AccessorCalls.cs:66:10:66:11 | M9 | +| AccessorCalls.cs:69:24:69:35 | dynamic access to member MaybeProp2 | AccessorCalls.cs:66:10:66:11 | M9 | +| AccessorCalls.cs:70:9:70:9 | access to local variable d | AccessorCalls.cs:66:10:66:11 | M9 | +| AccessorCalls.cs:70:9:70:19 | dynamic access to member MaybeProp | AccessorCalls.cs:66:10:66:11 | M9 | +| AccessorCalls.cs:70:9:70:21 | dynamic call to operator ++ | AccessorCalls.cs:66:10:66:11 | M9 | +| AccessorCalls.cs:70:9:70:22 | ...; | AccessorCalls.cs:66:10:66:11 | M9 | +| AccessorCalls.cs:71:9:71:9 | access to local variable d | AccessorCalls.cs:66:10:66:11 | M9 | +| AccessorCalls.cs:71:9:71:9 | access to local variable d | AccessorCalls.cs:66:10:66:11 | M9 | +| AccessorCalls.cs:71:9:71:20 | dynamic access to member MaybeEvent | AccessorCalls.cs:66:10:66:11 | M9 | +| AccessorCalls.cs:71:9:71:20 | dynamic access to member MaybeEvent | AccessorCalls.cs:66:10:66:11 | M9 | +| AccessorCalls.cs:71:9:71:25 | ... = ... | AccessorCalls.cs:66:10:66:11 | M9 | +| AccessorCalls.cs:71:9:71:25 | dynamic call to operator + | AccessorCalls.cs:66:10:66:11 | M9 | +| AccessorCalls.cs:71:9:71:26 | ...; | AccessorCalls.cs:66:10:66:11 | M9 | +| AccessorCalls.cs:71:25:71:25 | access to parameter e | AccessorCalls.cs:66:10:66:11 | M9 | +| AccessorCalls.cs:72:9:72:9 | access to local variable d | AccessorCalls.cs:66:10:66:11 | M9 | +| AccessorCalls.cs:72:9:72:9 | access to local variable d | AccessorCalls.cs:66:10:66:11 | M9 | +| AccessorCalls.cs:72:9:72:12 | dynamic access to element | AccessorCalls.cs:66:10:66:11 | M9 | +| AccessorCalls.cs:72:9:72:12 | dynamic access to element | AccessorCalls.cs:66:10:66:11 | M9 | +| AccessorCalls.cs:72:9:72:20 | ... = ... | AccessorCalls.cs:66:10:66:11 | M9 | +| AccessorCalls.cs:72:9:72:20 | dynamic call to operator + | AccessorCalls.cs:66:10:66:11 | M9 | +| AccessorCalls.cs:72:9:72:21 | ...; | AccessorCalls.cs:66:10:66:11 | M9 | +| AccessorCalls.cs:72:11:72:11 | 0 | AccessorCalls.cs:66:10:66:11 | M9 | +| AccessorCalls.cs:72:11:72:11 | 0 | AccessorCalls.cs:66:10:66:11 | M9 | +| AccessorCalls.cs:72:17:72:17 | access to local variable d | AccessorCalls.cs:66:10:66:11 | M9 | +| AccessorCalls.cs:72:17:72:20 | dynamic access to element | AccessorCalls.cs:66:10:66:11 | M9 | +| AccessorCalls.cs:72:19:72:19 | 1 | AccessorCalls.cs:66:10:66:11 | M9 | +| AccessorCalls.cs:73:9:73:44 | (..., ...) | AccessorCalls.cs:66:10:66:11 | M9 | +| AccessorCalls.cs:73:9:73:83 | ... = ... | AccessorCalls.cs:66:10:66:11 | M9 | +| AccessorCalls.cs:73:9:73:84 | ...; | AccessorCalls.cs:66:10:66:11 | M9 | +| AccessorCalls.cs:73:10:73:10 | access to local variable d | AccessorCalls.cs:66:10:66:11 | M9 | +| AccessorCalls.cs:73:10:73:21 | dynamic access to member MaybeProp1 | AccessorCalls.cs:66:10:66:11 | M9 | +| AccessorCalls.cs:73:24:73:27 | this access | AccessorCalls.cs:66:10:66:11 | M9 | +| AccessorCalls.cs:73:24:73:32 | access to property Prop | AccessorCalls.cs:66:10:66:11 | M9 | +| AccessorCalls.cs:73:35:73:43 | (..., ...) | AccessorCalls.cs:66:10:66:11 | M9 | +| AccessorCalls.cs:73:39:73:39 | access to local variable d | AccessorCalls.cs:66:10:66:11 | M9 | +| AccessorCalls.cs:73:39:73:42 | dynamic access to element | AccessorCalls.cs:66:10:66:11 | M9 | +| AccessorCalls.cs:73:41:73:41 | 0 | AccessorCalls.cs:66:10:66:11 | M9 | +| AccessorCalls.cs:73:48:73:83 | (..., ...) | AccessorCalls.cs:66:10:66:11 | M9 | +| AccessorCalls.cs:73:49:73:49 | access to local variable d | AccessorCalls.cs:66:10:66:11 | M9 | +| AccessorCalls.cs:73:49:73:60 | dynamic access to member MaybeProp1 | AccessorCalls.cs:66:10:66:11 | M9 | +| AccessorCalls.cs:73:63:73:66 | this access | AccessorCalls.cs:66:10:66:11 | M9 | +| AccessorCalls.cs:73:63:73:71 | access to property Prop | AccessorCalls.cs:66:10:66:11 | M9 | +| AccessorCalls.cs:73:74:73:82 | (..., ...) | AccessorCalls.cs:66:10:66:11 | M9 | +| AccessorCalls.cs:73:75:73:75 | 0 | AccessorCalls.cs:66:10:66:11 | M9 | +| AccessorCalls.cs:73:78:73:78 | access to local variable d | AccessorCalls.cs:66:10:66:11 | M9 | +| AccessorCalls.cs:73:78:73:81 | dynamic access to element | AccessorCalls.cs:66:10:66:11 | M9 | +| AccessorCalls.cs:73:80:73:80 | 1 | AccessorCalls.cs:66:10:66:11 | M9 | +| ArrayCreation.cs:3:11:3:12 | enter M1 | ArrayCreation.cs:3:11:3:12 | M1 | +| ArrayCreation.cs:3:11:3:12 | exit M1 | ArrayCreation.cs:3:11:3:12 | M1 | +| ArrayCreation.cs:3:19:3:28 | array creation of type Int32[] | ArrayCreation.cs:3:11:3:12 | M1 | +| ArrayCreation.cs:3:27:3:27 | 0 | ArrayCreation.cs:3:11:3:12 | M1 | +| ArrayCreation.cs:5:12:5:13 | enter M2 | ArrayCreation.cs:5:12:5:13 | M2 | +| ArrayCreation.cs:5:12:5:13 | exit M2 | ArrayCreation.cs:5:12:5:13 | M2 | +| ArrayCreation.cs:5:20:5:32 | array creation of type Int32[,] | ArrayCreation.cs:5:12:5:13 | M2 | +| ArrayCreation.cs:5:28:5:28 | 0 | ArrayCreation.cs:5:12:5:13 | M2 | +| ArrayCreation.cs:5:31:5:31 | 1 | ArrayCreation.cs:5:12:5:13 | M2 | +| ArrayCreation.cs:7:11:7:12 | enter M3 | ArrayCreation.cs:7:11:7:12 | M3 | +| ArrayCreation.cs:7:11:7:12 | exit M3 | ArrayCreation.cs:7:11:7:12 | M3 | +| ArrayCreation.cs:7:19:7:36 | array creation of type Int32[] | ArrayCreation.cs:7:11:7:12 | M3 | +| ArrayCreation.cs:7:29:7:36 | { ..., ... } | ArrayCreation.cs:7:11:7:12 | M3 | +| ArrayCreation.cs:7:31:7:31 | 0 | ArrayCreation.cs:7:11:7:12 | M3 | +| ArrayCreation.cs:7:34:7:34 | 1 | ArrayCreation.cs:7:11:7:12 | M3 | +| ArrayCreation.cs:9:12:9:13 | enter M4 | ArrayCreation.cs:9:12:9:13 | M4 | +| ArrayCreation.cs:9:12:9:13 | exit M4 | ArrayCreation.cs:9:12:9:13 | M4 | +| ArrayCreation.cs:9:20:9:52 | array creation of type Int32[,] | ArrayCreation.cs:9:12:9:13 | M4 | +| ArrayCreation.cs:9:31:9:52 | { ..., ... } | ArrayCreation.cs:9:12:9:13 | M4 | +| ArrayCreation.cs:9:33:9:40 | { ..., ... } | ArrayCreation.cs:9:12:9:13 | M4 | +| ArrayCreation.cs:9:35:9:35 | 0 | ArrayCreation.cs:9:12:9:13 | M4 | +| ArrayCreation.cs:9:38:9:38 | 1 | ArrayCreation.cs:9:12:9:13 | M4 | +| ArrayCreation.cs:9:43:9:50 | { ..., ... } | ArrayCreation.cs:9:12:9:13 | M4 | +| ArrayCreation.cs:9:45:9:45 | 2 | ArrayCreation.cs:9:12:9:13 | M4 | +| ArrayCreation.cs:9:48:9:48 | 3 | ArrayCreation.cs:9:12:9:13 | M4 | +| Assignments.cs:3:10:3:10 | enter M | Assignments.cs:3:10:3:10 | M | +| Assignments.cs:3:10:3:10 | exit M | Assignments.cs:3:10:3:10 | M | +| Assignments.cs:4:5:15:5 | {...} | Assignments.cs:3:10:3:10 | M | +| Assignments.cs:5:9:5:18 | ... ...; | Assignments.cs:3:10:3:10 | M | +| Assignments.cs:5:13:5:17 | Int32 x = ... | Assignments.cs:3:10:3:10 | M | +| Assignments.cs:5:17:5:17 | 0 | Assignments.cs:3:10:3:10 | M | +| Assignments.cs:6:9:6:9 | access to local variable x | Assignments.cs:3:10:3:10 | M | +| Assignments.cs:6:9:6:14 | ... + ... | Assignments.cs:3:10:3:10 | M | +| Assignments.cs:6:9:6:14 | ... = ... | Assignments.cs:3:10:3:10 | M | +| Assignments.cs:6:9:6:15 | ...; | Assignments.cs:3:10:3:10 | M | +| Assignments.cs:6:14:6:14 | 1 | Assignments.cs:3:10:3:10 | M | +| Assignments.cs:8:9:8:22 | ... ...; | Assignments.cs:3:10:3:10 | M | +| Assignments.cs:8:17:8:21 | dynamic d = ... | Assignments.cs:3:10:3:10 | M | +| Assignments.cs:8:21:8:21 | 0 | Assignments.cs:3:10:3:10 | M | +| Assignments.cs:8:21:8:21 | (...) ... | Assignments.cs:3:10:3:10 | M | +| Assignments.cs:9:9:9:9 | access to local variable d | Assignments.cs:3:10:3:10 | M | +| Assignments.cs:9:9:9:14 | ... = ... | Assignments.cs:3:10:3:10 | M | +| Assignments.cs:9:9:9:14 | dynamic call to operator - | Assignments.cs:3:10:3:10 | M | +| Assignments.cs:9:9:9:15 | ...; | Assignments.cs:3:10:3:10 | M | +| Assignments.cs:9:14:9:14 | 2 | Assignments.cs:3:10:3:10 | M | +| Assignments.cs:11:9:11:34 | ... ...; | Assignments.cs:3:10:3:10 | M | +| Assignments.cs:11:13:11:33 | Assignments a = ... | Assignments.cs:3:10:3:10 | M | +| Assignments.cs:11:17:11:33 | object creation of type Assignments | Assignments.cs:3:10:3:10 | M | +| Assignments.cs:12:9:12:9 | access to local variable a | Assignments.cs:3:10:3:10 | M | +| Assignments.cs:12:9:12:17 | ... = ... | Assignments.cs:3:10:3:10 | M | +| Assignments.cs:12:9:12:17 | call to operator + | Assignments.cs:3:10:3:10 | M | +| Assignments.cs:12:9:12:18 | ...; | Assignments.cs:3:10:3:10 | M | +| Assignments.cs:12:14:12:17 | this access | Assignments.cs:3:10:3:10 | M | +| Assignments.cs:14:9:14:13 | access to event Event | Assignments.cs:3:10:3:10 | M | +| Assignments.cs:14:9:14:13 | this access | Assignments.cs:3:10:3:10 | M | +| Assignments.cs:14:9:14:35 | ... += ... | Assignments.cs:3:10:3:10 | M | +| Assignments.cs:14:9:14:36 | ...; | Assignments.cs:3:10:3:10 | M | +| Assignments.cs:14:18:14:35 | (...) => ... | Assignments.cs:3:10:3:10 | M | +| Assignments.cs:14:18:14:35 | enter (...) => ... | Assignments.cs:14:18:14:35 | (...) => ... | +| Assignments.cs:14:18:14:35 | exit (...) => ... | Assignments.cs:14:18:14:35 | (...) => ... | +| Assignments.cs:14:33:14:35 | {...} | Assignments.cs:14:18:14:35 | (...) => ... | +| Assignments.cs:17:40:17:40 | enter + | Assignments.cs:17:40:17:40 | + | +| Assignments.cs:17:40:17:40 | exit + | Assignments.cs:17:40:17:40 | + | +| Assignments.cs:18:5:20:5 | {...} | Assignments.cs:17:40:17:40 | + | +| Assignments.cs:19:9:19:17 | return ...; | Assignments.cs:17:40:17:40 | + | +| Assignments.cs:19:16:19:16 | access to parameter x | Assignments.cs:17:40:17:40 | + | +| BreakInTry.cs:3:10:3:11 | enter M1 | BreakInTry.cs:3:10:3:11 | M1 | +| BreakInTry.cs:3:10:3:11 | exit M1 | BreakInTry.cs:3:10:3:11 | M1 | +| BreakInTry.cs:4:5:18:5 | {...} | BreakInTry.cs:3:10:3:11 | M1 | +| BreakInTry.cs:5:9:17:9 | try {...} ... | BreakInTry.cs:3:10:3:11 | M1 | +| BreakInTry.cs:6:9:12:9 | {...} | BreakInTry.cs:3:10:3:11 | M1 | +| BreakInTry.cs:7:13:11:13 | foreach (... ... in ...) ... | BreakInTry.cs:3:10:3:11 | M1 | +| BreakInTry.cs:7:26:7:28 | String arg | BreakInTry.cs:3:10:3:11 | M1 | +| BreakInTry.cs:7:33:7:36 | access to parameter args | BreakInTry.cs:3:10:3:11 | M1 | +| BreakInTry.cs:8:13:11:13 | {...} | BreakInTry.cs:3:10:3:11 | M1 | +| BreakInTry.cs:9:17:10:26 | if (...) ... | BreakInTry.cs:3:10:3:11 | M1 | +| BreakInTry.cs:9:21:9:23 | access to local variable arg | BreakInTry.cs:3:10:3:11 | M1 | +| BreakInTry.cs:9:21:9:31 | ... == ... | BreakInTry.cs:3:10:3:11 | M1 | +| BreakInTry.cs:9:28:9:31 | null | BreakInTry.cs:3:10:3:11 | M1 | +| BreakInTry.cs:10:21:10:26 | break; | BreakInTry.cs:3:10:3:11 | M1 | +| BreakInTry.cs:14:9:17:9 | {...} | BreakInTry.cs:3:10:3:11 | M1 | +| BreakInTry.cs:15:13:16:17 | if (...) ... | BreakInTry.cs:3:10:3:11 | M1 | +| BreakInTry.cs:15:17:15:20 | access to parameter args | BreakInTry.cs:3:10:3:11 | M1 | +| BreakInTry.cs:15:17:15:28 | ... == ... | BreakInTry.cs:3:10:3:11 | M1 | +| BreakInTry.cs:15:25:15:28 | null | BreakInTry.cs:3:10:3:11 | M1 | +| BreakInTry.cs:16:17:16:17 | ; | BreakInTry.cs:3:10:3:11 | M1 | +| BreakInTry.cs:20:10:20:11 | enter M2 | BreakInTry.cs:20:10:20:11 | M2 | +| BreakInTry.cs:20:10:20:11 | exit M2 | BreakInTry.cs:20:10:20:11 | M2 | +| BreakInTry.cs:21:5:36:5 | {...} | BreakInTry.cs:20:10:20:11 | M2 | +| BreakInTry.cs:22:9:34:9 | foreach (... ... in ...) ... | BreakInTry.cs:20:10:20:11 | M2 | +| BreakInTry.cs:22:22:22:24 | String arg | BreakInTry.cs:20:10:20:11 | M2 | +| BreakInTry.cs:22:29:22:32 | access to parameter args | BreakInTry.cs:20:10:20:11 | M2 | +| BreakInTry.cs:23:9:34:9 | {...} | BreakInTry.cs:20:10:20:11 | M2 | +| BreakInTry.cs:24:13:33:13 | try {...} ... | BreakInTry.cs:20:10:20:11 | M2 | +| BreakInTry.cs:25:13:28:13 | {...} | BreakInTry.cs:20:10:20:11 | M2 | +| BreakInTry.cs:26:17:27:26 | if (...) ... | BreakInTry.cs:20:10:20:11 | M2 | +| BreakInTry.cs:26:21:26:23 | access to local variable arg | BreakInTry.cs:20:10:20:11 | M2 | +| BreakInTry.cs:26:21:26:31 | ... == ... | BreakInTry.cs:20:10:20:11 | M2 | +| BreakInTry.cs:26:28:26:31 | null | BreakInTry.cs:20:10:20:11 | M2 | +| BreakInTry.cs:27:21:27:26 | break; | BreakInTry.cs:20:10:20:11 | M2 | +| BreakInTry.cs:30:13:33:13 | [finally: break] {...} | BreakInTry.cs:20:10:20:11 | M2 | +| BreakInTry.cs:30:13:33:13 | {...} | BreakInTry.cs:20:10:20:11 | M2 | +| BreakInTry.cs:31:17:32:21 | [finally: break] if (...) ... | BreakInTry.cs:20:10:20:11 | M2 | +| BreakInTry.cs:31:17:32:21 | if (...) ... | BreakInTry.cs:20:10:20:11 | M2 | +| BreakInTry.cs:31:21:31:24 | [finally: break] access to parameter args | BreakInTry.cs:20:10:20:11 | M2 | +| BreakInTry.cs:31:21:31:24 | access to parameter args | BreakInTry.cs:20:10:20:11 | M2 | +| BreakInTry.cs:31:21:31:32 | ... == ... | BreakInTry.cs:20:10:20:11 | M2 | +| BreakInTry.cs:31:21:31:32 | [finally: break] ... == ... | BreakInTry.cs:20:10:20:11 | M2 | +| BreakInTry.cs:31:29:31:32 | [finally: break] null | BreakInTry.cs:20:10:20:11 | M2 | +| BreakInTry.cs:31:29:31:32 | null | BreakInTry.cs:20:10:20:11 | M2 | +| BreakInTry.cs:32:21:32:21 | ; | BreakInTry.cs:20:10:20:11 | M2 | +| BreakInTry.cs:32:21:32:21 | [finally: break] ; | BreakInTry.cs:20:10:20:11 | M2 | +| BreakInTry.cs:35:7:35:7 | ; | BreakInTry.cs:20:10:20:11 | M2 | +| BreakInTry.cs:38:10:38:11 | enter M3 | BreakInTry.cs:38:10:38:11 | M3 | +| BreakInTry.cs:38:10:38:11 | exit M3 | BreakInTry.cs:38:10:38:11 | M3 | +| BreakInTry.cs:39:5:54:5 | {...} | BreakInTry.cs:38:10:38:11 | M3 | +| BreakInTry.cs:40:9:52:9 | try {...} ... | BreakInTry.cs:38:10:38:11 | M3 | +| BreakInTry.cs:41:9:44:9 | {...} | BreakInTry.cs:38:10:38:11 | M3 | +| BreakInTry.cs:42:13:43:23 | if (...) ... | BreakInTry.cs:38:10:38:11 | M3 | +| BreakInTry.cs:42:17:42:20 | access to parameter args | BreakInTry.cs:38:10:38:11 | M3 | +| BreakInTry.cs:42:17:42:28 | ... == ... | BreakInTry.cs:38:10:38:11 | M3 | +| BreakInTry.cs:42:25:42:28 | null | BreakInTry.cs:38:10:38:11 | M3 | +| BreakInTry.cs:43:17:43:23 | return ...; | BreakInTry.cs:38:10:38:11 | M3 | +| BreakInTry.cs:46:9:52:9 | [finally: return] {...} | BreakInTry.cs:38:10:38:11 | M3 | +| BreakInTry.cs:46:9:52:9 | {...} | BreakInTry.cs:38:10:38:11 | M3 | +| BreakInTry.cs:47:13:51:13 | [finally: return] foreach (... ... in ...) ... | BreakInTry.cs:38:10:38:11 | M3 | +| BreakInTry.cs:47:13:51:13 | foreach (... ... in ...) ... | BreakInTry.cs:38:10:38:11 | M3 | +| BreakInTry.cs:47:26:47:28 | String arg | BreakInTry.cs:38:10:38:11 | M3 | +| BreakInTry.cs:47:26:47:28 | [finally: return] String arg | BreakInTry.cs:38:10:38:11 | M3 | +| BreakInTry.cs:47:33:47:36 | [finally: return] access to parameter args | BreakInTry.cs:38:10:38:11 | M3 | +| BreakInTry.cs:47:33:47:36 | access to parameter args | BreakInTry.cs:38:10:38:11 | M3 | +| BreakInTry.cs:48:13:51:13 | [finally: return] {...} | BreakInTry.cs:38:10:38:11 | M3 | +| BreakInTry.cs:48:13:51:13 | {...} | BreakInTry.cs:38:10:38:11 | M3 | +| BreakInTry.cs:49:17:50:26 | [finally: return] if (...) ... | BreakInTry.cs:38:10:38:11 | M3 | +| BreakInTry.cs:49:17:50:26 | if (...) ... | BreakInTry.cs:38:10:38:11 | M3 | +| BreakInTry.cs:49:21:49:23 | [finally: return] access to local variable arg | BreakInTry.cs:38:10:38:11 | M3 | +| BreakInTry.cs:49:21:49:23 | access to local variable arg | BreakInTry.cs:38:10:38:11 | M3 | +| BreakInTry.cs:49:21:49:31 | ... == ... | BreakInTry.cs:38:10:38:11 | M3 | +| BreakInTry.cs:49:21:49:31 | [finally: return] ... == ... | BreakInTry.cs:38:10:38:11 | M3 | +| BreakInTry.cs:49:28:49:31 | [finally: return] null | BreakInTry.cs:38:10:38:11 | M3 | +| BreakInTry.cs:49:28:49:31 | null | BreakInTry.cs:38:10:38:11 | M3 | +| BreakInTry.cs:50:21:50:26 | [finally: return] break; | BreakInTry.cs:38:10:38:11 | M3 | +| BreakInTry.cs:50:21:50:26 | break; | BreakInTry.cs:38:10:38:11 | M3 | +| BreakInTry.cs:53:7:53:7 | ; | BreakInTry.cs:38:10:38:11 | M3 | +| BreakInTry.cs:56:10:56:11 | enter M4 | BreakInTry.cs:56:10:56:11 | M4 | +| BreakInTry.cs:56:10:56:11 | exit M4 | BreakInTry.cs:56:10:56:11 | M4 | +| BreakInTry.cs:57:5:71:5 | {...} | BreakInTry.cs:56:10:56:11 | M4 | +| BreakInTry.cs:58:9:70:9 | try {...} ... | BreakInTry.cs:56:10:56:11 | M4 | +| BreakInTry.cs:59:9:62:9 | {...} | BreakInTry.cs:56:10:56:11 | M4 | +| BreakInTry.cs:60:13:61:23 | if (...) ... | BreakInTry.cs:56:10:56:11 | M4 | +| BreakInTry.cs:60:17:60:20 | access to parameter args | BreakInTry.cs:56:10:56:11 | M4 | +| BreakInTry.cs:60:17:60:28 | ... == ... | BreakInTry.cs:56:10:56:11 | M4 | +| BreakInTry.cs:60:25:60:28 | null | BreakInTry.cs:56:10:56:11 | M4 | +| BreakInTry.cs:61:17:61:23 | return ...; | BreakInTry.cs:56:10:56:11 | M4 | +| BreakInTry.cs:64:9:70:9 | [finally: return] {...} | BreakInTry.cs:56:10:56:11 | M4 | +| BreakInTry.cs:64:9:70:9 | {...} | BreakInTry.cs:56:10:56:11 | M4 | +| BreakInTry.cs:65:13:69:13 | [finally: return] foreach (... ... in ...) ... | BreakInTry.cs:56:10:56:11 | M4 | +| BreakInTry.cs:65:13:69:13 | foreach (... ... in ...) ... | BreakInTry.cs:56:10:56:11 | M4 | +| BreakInTry.cs:65:26:65:28 | String arg | BreakInTry.cs:56:10:56:11 | M4 | +| BreakInTry.cs:65:26:65:28 | [finally: return] String arg | BreakInTry.cs:56:10:56:11 | M4 | +| BreakInTry.cs:65:33:65:36 | [finally: return] access to parameter args | BreakInTry.cs:56:10:56:11 | M4 | +| BreakInTry.cs:65:33:65:36 | access to parameter args | BreakInTry.cs:56:10:56:11 | M4 | +| BreakInTry.cs:66:13:69:13 | [finally: return] {...} | BreakInTry.cs:56:10:56:11 | M4 | +| BreakInTry.cs:66:13:69:13 | {...} | BreakInTry.cs:56:10:56:11 | M4 | +| BreakInTry.cs:67:17:68:26 | [finally: return] if (...) ... | BreakInTry.cs:56:10:56:11 | M4 | +| BreakInTry.cs:67:17:68:26 | if (...) ... | BreakInTry.cs:56:10:56:11 | M4 | +| BreakInTry.cs:67:21:67:23 | [finally: return] access to local variable arg | BreakInTry.cs:56:10:56:11 | M4 | +| BreakInTry.cs:67:21:67:23 | access to local variable arg | BreakInTry.cs:56:10:56:11 | M4 | +| BreakInTry.cs:67:21:67:31 | ... == ... | BreakInTry.cs:56:10:56:11 | M4 | +| BreakInTry.cs:67:21:67:31 | [finally: return] ... == ... | BreakInTry.cs:56:10:56:11 | M4 | +| BreakInTry.cs:67:28:67:31 | [finally: return] null | BreakInTry.cs:56:10:56:11 | M4 | +| BreakInTry.cs:67:28:67:31 | null | BreakInTry.cs:56:10:56:11 | M4 | +| BreakInTry.cs:68:21:68:26 | [finally: return] break; | BreakInTry.cs:56:10:56:11 | M4 | +| BreakInTry.cs:68:21:68:26 | break; | BreakInTry.cs:56:10:56:11 | M4 | +| CatchInFinally.cs:5:10:5:11 | enter M1 | CatchInFinally.cs:5:10:5:11 | M1 | +| CatchInFinally.cs:5:10:5:11 | exit M1 | CatchInFinally.cs:5:10:5:11 | M1 | +| CatchInFinally.cs:6:5:28:5 | {...} | CatchInFinally.cs:5:10:5:11 | M1 | +| CatchInFinally.cs:7:9:27:9 | try {...} ... | CatchInFinally.cs:5:10:5:11 | M1 | +| CatchInFinally.cs:8:9:11:9 | {...} | CatchInFinally.cs:5:10:5:11 | M1 | +| CatchInFinally.cs:9:13:10:50 | if (...) ... | CatchInFinally.cs:5:10:5:11 | M1 | +| CatchInFinally.cs:9:17:9:20 | access to parameter args | CatchInFinally.cs:5:10:5:11 | M1 | +| CatchInFinally.cs:9:17:9:28 | ... == ... | CatchInFinally.cs:5:10:5:11 | M1 | +| CatchInFinally.cs:9:25:9:28 | null | CatchInFinally.cs:5:10:5:11 | M1 | +| CatchInFinally.cs:10:17:10:50 | throw ...; | CatchInFinally.cs:5:10:5:11 | M1 | +| CatchInFinally.cs:10:23:10:49 | object creation of type ArgumentNullException | CatchInFinally.cs:5:10:5:11 | M1 | +| CatchInFinally.cs:13:9:27:9 | [finally: exception(ArgumentNullException)] {...} | CatchInFinally.cs:5:10:5:11 | M1 | +| CatchInFinally.cs:13:9:27:9 | [finally: exception(Exception)] {...} | CatchInFinally.cs:5:10:5:11 | M1 | +| CatchInFinally.cs:13:9:27:9 | {...} | CatchInFinally.cs:5:10:5:11 | M1 | +| CatchInFinally.cs:14:13:26:13 | [finally: exception(ArgumentNullException)] try {...} ... | CatchInFinally.cs:5:10:5:11 | M1 | +| CatchInFinally.cs:14:13:26:13 | [finally: exception(Exception)] try {...} ... | CatchInFinally.cs:5:10:5:11 | M1 | +| CatchInFinally.cs:14:13:26:13 | try {...} ... | CatchInFinally.cs:5:10:5:11 | M1 | +| CatchInFinally.cs:15:13:18:13 | [finally: exception(ArgumentNullException)] {...} | CatchInFinally.cs:5:10:5:11 | M1 | +| CatchInFinally.cs:15:13:18:13 | [finally: exception(Exception)] {...} | CatchInFinally.cs:5:10:5:11 | M1 | +| CatchInFinally.cs:15:13:18:13 | {...} | CatchInFinally.cs:5:10:5:11 | M1 | +| CatchInFinally.cs:16:17:17:45 | [finally: exception(ArgumentNullException)] if (...) ... | CatchInFinally.cs:5:10:5:11 | M1 | +| CatchInFinally.cs:16:17:17:45 | [finally: exception(Exception)] if (...) ... | CatchInFinally.cs:5:10:5:11 | M1 | +| CatchInFinally.cs:16:17:17:45 | if (...) ... | CatchInFinally.cs:5:10:5:11 | M1 | +| CatchInFinally.cs:16:21:16:24 | [finally: exception(ArgumentNullException)] access to parameter args | CatchInFinally.cs:5:10:5:11 | M1 | +| CatchInFinally.cs:16:21:16:24 | [finally: exception(Exception)] access to parameter args | CatchInFinally.cs:5:10:5:11 | M1 | +| CatchInFinally.cs:16:21:16:24 | access to parameter args | CatchInFinally.cs:5:10:5:11 | M1 | +| CatchInFinally.cs:16:21:16:31 | [finally: exception(ArgumentNullException)] access to property Length | CatchInFinally.cs:5:10:5:11 | M1 | +| CatchInFinally.cs:16:21:16:31 | [finally: exception(Exception)] access to property Length | CatchInFinally.cs:5:10:5:11 | M1 | +| CatchInFinally.cs:16:21:16:31 | access to property Length | CatchInFinally.cs:5:10:5:11 | M1 | +| CatchInFinally.cs:16:21:16:36 | ... == ... | CatchInFinally.cs:5:10:5:11 | M1 | +| CatchInFinally.cs:16:21:16:36 | [finally: exception(ArgumentNullException)] ... == ... | CatchInFinally.cs:5:10:5:11 | M1 | +| CatchInFinally.cs:16:21:16:36 | [finally: exception(Exception)] ... == ... | CatchInFinally.cs:5:10:5:11 | M1 | +| CatchInFinally.cs:16:36:16:36 | 1 | CatchInFinally.cs:5:10:5:11 | M1 | +| CatchInFinally.cs:16:36:16:36 | [finally: exception(ArgumentNullException)] 1 | CatchInFinally.cs:5:10:5:11 | M1 | +| CatchInFinally.cs:16:36:16:36 | [finally: exception(Exception)] 1 | CatchInFinally.cs:5:10:5:11 | M1 | +| CatchInFinally.cs:17:21:17:45 | [finally: exception(ArgumentNullException)] throw ...; | CatchInFinally.cs:5:10:5:11 | M1 | +| CatchInFinally.cs:17:21:17:45 | [finally: exception(Exception)] throw ...; | CatchInFinally.cs:5:10:5:11 | M1 | +| CatchInFinally.cs:17:21:17:45 | throw ...; | CatchInFinally.cs:5:10:5:11 | M1 | +| CatchInFinally.cs:17:27:17:44 | [finally: exception(ArgumentNullException)] object creation of type Exception | CatchInFinally.cs:5:10:5:11 | M1 | +| CatchInFinally.cs:17:27:17:44 | [finally: exception(Exception)] object creation of type Exception | CatchInFinally.cs:5:10:5:11 | M1 | +| CatchInFinally.cs:17:27:17:44 | object creation of type Exception | CatchInFinally.cs:5:10:5:11 | M1 | +| CatchInFinally.cs:17:41:17:43 | "1" | CatchInFinally.cs:5:10:5:11 | M1 | +| CatchInFinally.cs:17:41:17:43 | [finally: exception(ArgumentNullException)] "1" | CatchInFinally.cs:5:10:5:11 | M1 | +| CatchInFinally.cs:17:41:17:43 | [finally: exception(Exception)] "1" | CatchInFinally.cs:5:10:5:11 | M1 | +| CatchInFinally.cs:19:13:22:13 | [exception: Exception] catch (...) {...} | CatchInFinally.cs:5:10:5:11 | M1 | +| CatchInFinally.cs:19:13:22:13 | [exception: NullReferenceException] catch (...) {...} | CatchInFinally.cs:5:10:5:11 | M1 | +| CatchInFinally.cs:19:13:22:13 | [finally: exception(ArgumentNullException), exception: Exception] catch (...) {...} | CatchInFinally.cs:5:10:5:11 | M1 | +| CatchInFinally.cs:19:13:22:13 | [finally: exception(ArgumentNullException), exception: NullReferenceException] catch (...) {...} | CatchInFinally.cs:5:10:5:11 | M1 | +| CatchInFinally.cs:19:13:22:13 | [finally: exception(Exception), exception: Exception] catch (...) {...} | CatchInFinally.cs:5:10:5:11 | M1 | +| CatchInFinally.cs:19:13:22:13 | [finally: exception(Exception), exception: NullReferenceException] catch (...) {...} | CatchInFinally.cs:5:10:5:11 | M1 | +| CatchInFinally.cs:19:30:19:30 | [exception: Exception] Exception e | CatchInFinally.cs:5:10:5:11 | M1 | +| CatchInFinally.cs:19:30:19:30 | [exception: NullReferenceException] Exception e | CatchInFinally.cs:5:10:5:11 | M1 | +| CatchInFinally.cs:19:30:19:30 | [finally: exception(ArgumentNullException), exception: Exception] Exception e | CatchInFinally.cs:5:10:5:11 | M1 | +| CatchInFinally.cs:19:30:19:30 | [finally: exception(ArgumentNullException), exception: NullReferenceException] Exception e | CatchInFinally.cs:5:10:5:11 | M1 | +| CatchInFinally.cs:19:30:19:30 | [finally: exception(Exception), exception: Exception] Exception e | CatchInFinally.cs:5:10:5:11 | M1 | +| CatchInFinally.cs:19:30:19:30 | [finally: exception(Exception), exception: NullReferenceException] Exception e | CatchInFinally.cs:5:10:5:11 | M1 | +| CatchInFinally.cs:19:39:19:39 | [exception: Exception] access to local variable e | CatchInFinally.cs:5:10:5:11 | M1 | +| CatchInFinally.cs:19:39:19:39 | [exception: NullReferenceException] access to local variable e | CatchInFinally.cs:5:10:5:11 | M1 | +| CatchInFinally.cs:19:39:19:39 | [finally: exception(ArgumentNullException), exception: Exception] access to local variable e | CatchInFinally.cs:5:10:5:11 | M1 | +| CatchInFinally.cs:19:39:19:39 | [finally: exception(ArgumentNullException), exception: NullReferenceException] access to local variable e | CatchInFinally.cs:5:10:5:11 | M1 | +| CatchInFinally.cs:19:39:19:39 | [finally: exception(Exception), exception: Exception] access to local variable e | CatchInFinally.cs:5:10:5:11 | M1 | +| CatchInFinally.cs:19:39:19:39 | [finally: exception(Exception), exception: NullReferenceException] access to local variable e | CatchInFinally.cs:5:10:5:11 | M1 | +| CatchInFinally.cs:19:39:19:47 | [exception: Exception] access to property Message | CatchInFinally.cs:5:10:5:11 | M1 | +| CatchInFinally.cs:19:39:19:47 | [exception: NullReferenceException] access to property Message | CatchInFinally.cs:5:10:5:11 | M1 | +| CatchInFinally.cs:19:39:19:47 | [finally: exception(ArgumentNullException), exception: Exception] access to property Message | CatchInFinally.cs:5:10:5:11 | M1 | +| CatchInFinally.cs:19:39:19:47 | [finally: exception(ArgumentNullException), exception: NullReferenceException] access to property Message | CatchInFinally.cs:5:10:5:11 | M1 | +| CatchInFinally.cs:19:39:19:47 | [finally: exception(Exception), exception: Exception] access to property Message | CatchInFinally.cs:5:10:5:11 | M1 | +| CatchInFinally.cs:19:39:19:47 | [finally: exception(Exception), exception: NullReferenceException] access to property Message | CatchInFinally.cs:5:10:5:11 | M1 | +| CatchInFinally.cs:19:39:19:54 | [exception: Exception] ... == ... | CatchInFinally.cs:5:10:5:11 | M1 | +| CatchInFinally.cs:19:39:19:54 | [exception: NullReferenceException] ... == ... | CatchInFinally.cs:5:10:5:11 | M1 | +| CatchInFinally.cs:19:39:19:54 | [finally: exception(ArgumentNullException), exception: Exception] ... == ... | CatchInFinally.cs:5:10:5:11 | M1 | +| CatchInFinally.cs:19:39:19:54 | [finally: exception(ArgumentNullException), exception: NullReferenceException] ... == ... | CatchInFinally.cs:5:10:5:11 | M1 | +| CatchInFinally.cs:19:39:19:54 | [finally: exception(Exception), exception: Exception] ... == ... | CatchInFinally.cs:5:10:5:11 | M1 | +| CatchInFinally.cs:19:39:19:54 | [finally: exception(Exception), exception: NullReferenceException] ... == ... | CatchInFinally.cs:5:10:5:11 | M1 | +| CatchInFinally.cs:19:52:19:54 | [exception: Exception] "1" | CatchInFinally.cs:5:10:5:11 | M1 | +| CatchInFinally.cs:19:52:19:54 | [exception: NullReferenceException] "1" | CatchInFinally.cs:5:10:5:11 | M1 | +| CatchInFinally.cs:19:52:19:54 | [finally: exception(ArgumentNullException), exception: Exception] "1" | CatchInFinally.cs:5:10:5:11 | M1 | +| CatchInFinally.cs:19:52:19:54 | [finally: exception(ArgumentNullException), exception: NullReferenceException] "1" | CatchInFinally.cs:5:10:5:11 | M1 | +| CatchInFinally.cs:19:52:19:54 | [finally: exception(Exception), exception: Exception] "1" | CatchInFinally.cs:5:10:5:11 | M1 | +| CatchInFinally.cs:19:52:19:54 | [finally: exception(Exception), exception: NullReferenceException] "1" | CatchInFinally.cs:5:10:5:11 | M1 | +| CatchInFinally.cs:20:13:22:13 | [finally: exception(ArgumentNullException)] {...} | CatchInFinally.cs:5:10:5:11 | M1 | +| CatchInFinally.cs:20:13:22:13 | [finally: exception(Exception)] {...} | CatchInFinally.cs:5:10:5:11 | M1 | +| CatchInFinally.cs:20:13:22:13 | {...} | CatchInFinally.cs:5:10:5:11 | M1 | +| CatchInFinally.cs:21:17:21:42 | [finally: exception(ArgumentNullException)] call to method WriteLine | CatchInFinally.cs:5:10:5:11 | M1 | +| CatchInFinally.cs:21:17:21:42 | [finally: exception(Exception)] call to method WriteLine | CatchInFinally.cs:5:10:5:11 | M1 | +| CatchInFinally.cs:21:17:21:42 | call to method WriteLine | CatchInFinally.cs:5:10:5:11 | M1 | +| CatchInFinally.cs:21:17:21:43 | ...; | CatchInFinally.cs:5:10:5:11 | M1 | +| CatchInFinally.cs:21:17:21:43 | [finally: exception(ArgumentNullException)] ...; | CatchInFinally.cs:5:10:5:11 | M1 | +| CatchInFinally.cs:21:17:21:43 | [finally: exception(Exception)] ...; | CatchInFinally.cs:5:10:5:11 | M1 | +| CatchInFinally.cs:21:35:21:38 | [finally: exception(ArgumentNullException)] access to parameter args | CatchInFinally.cs:5:10:5:11 | M1 | +| CatchInFinally.cs:21:35:21:38 | [finally: exception(Exception)] access to parameter args | CatchInFinally.cs:5:10:5:11 | M1 | +| CatchInFinally.cs:21:35:21:38 | access to parameter args | CatchInFinally.cs:5:10:5:11 | M1 | +| CatchInFinally.cs:21:35:21:41 | [finally: exception(ArgumentNullException)] access to array element | CatchInFinally.cs:5:10:5:11 | M1 | +| CatchInFinally.cs:21:35:21:41 | [finally: exception(Exception)] access to array element | CatchInFinally.cs:5:10:5:11 | M1 | +| CatchInFinally.cs:21:35:21:41 | access to array element | CatchInFinally.cs:5:10:5:11 | M1 | +| CatchInFinally.cs:21:40:21:40 | 0 | CatchInFinally.cs:5:10:5:11 | M1 | +| CatchInFinally.cs:21:40:21:40 | [finally: exception(ArgumentNullException)] 0 | CatchInFinally.cs:5:10:5:11 | M1 | +| CatchInFinally.cs:21:40:21:40 | [finally: exception(Exception)] 0 | CatchInFinally.cs:5:10:5:11 | M1 | +| CatchInFinally.cs:23:13:26:13 | [finally: exception(ArgumentNullException)] catch {...} | CatchInFinally.cs:5:10:5:11 | M1 | +| CatchInFinally.cs:23:13:26:13 | [finally: exception(Exception)] catch {...} | CatchInFinally.cs:5:10:5:11 | M1 | +| CatchInFinally.cs:23:13:26:13 | catch {...} | CatchInFinally.cs:5:10:5:11 | M1 | +| CatchInFinally.cs:24:13:26:13 | [finally: exception(ArgumentNullException)] {...} | CatchInFinally.cs:5:10:5:11 | M1 | +| CatchInFinally.cs:24:13:26:13 | [finally: exception(Exception)] {...} | CatchInFinally.cs:5:10:5:11 | M1 | +| CatchInFinally.cs:24:13:26:13 | {...} | CatchInFinally.cs:5:10:5:11 | M1 | +| CatchInFinally.cs:25:17:25:37 | [finally: exception(ArgumentNullException)] call to method WriteLine | CatchInFinally.cs:5:10:5:11 | M1 | +| CatchInFinally.cs:25:17:25:37 | [finally: exception(Exception)] call to method WriteLine | CatchInFinally.cs:5:10:5:11 | M1 | +| CatchInFinally.cs:25:17:25:37 | call to method WriteLine | CatchInFinally.cs:5:10:5:11 | M1 | +| CatchInFinally.cs:25:17:25:38 | ...; | CatchInFinally.cs:5:10:5:11 | M1 | +| CatchInFinally.cs:25:17:25:38 | [finally: exception(ArgumentNullException)] ...; | CatchInFinally.cs:5:10:5:11 | M1 | +| CatchInFinally.cs:25:17:25:38 | [finally: exception(Exception)] ...; | CatchInFinally.cs:5:10:5:11 | M1 | +| CatchInFinally.cs:25:35:25:36 | "" | CatchInFinally.cs:5:10:5:11 | M1 | +| CatchInFinally.cs:25:35:25:36 | [finally: exception(ArgumentNullException)] "" | CatchInFinally.cs:5:10:5:11 | M1 | +| CatchInFinally.cs:25:35:25:36 | [finally: exception(Exception)] "" | CatchInFinally.cs:5:10:5:11 | M1 | +| CatchInFinally.cs:34:24:34:25 | enter M2 | CatchInFinally.cs:34:24:34:25 | M2 | +| CatchInFinally.cs:34:24:34:25 | exit M2 | CatchInFinally.cs:34:24:34:25 | M2 | +| CatchInFinally.cs:35:5:51:5 | {...} | CatchInFinally.cs:34:24:34:25 | M2 | +| CatchInFinally.cs:36:9:50:9 | try {...} ... | CatchInFinally.cs:34:24:34:25 | M2 | +| CatchInFinally.cs:37:9:39:9 | {...} | CatchInFinally.cs:34:24:34:25 | M2 | +| CatchInFinally.cs:38:13:38:43 | if (...) ... | CatchInFinally.cs:34:24:34:25 | M2 | +| CatchInFinally.cs:38:17:38:18 | access to parameter b1 | CatchInFinally.cs:34:24:34:25 | M2 | +| CatchInFinally.cs:38:21:38:43 | [b1 (line 34): true] throw ...; | CatchInFinally.cs:34:24:34:25 | M2 | +| CatchInFinally.cs:38:27:38:42 | [b1 (line 34): true] object creation of type ExceptionA | CatchInFinally.cs:34:24:34:25 | M2 | +| CatchInFinally.cs:41:9:50:9 | [b1 (line 34): false] {...} | CatchInFinally.cs:34:24:34:25 | M2 | +| CatchInFinally.cs:41:9:50:9 | [finally: exception(Exception), b1 (line 34): true] {...} | CatchInFinally.cs:34:24:34:25 | M2 | +| CatchInFinally.cs:41:9:50:9 | [finally: exception(ExceptionA), b1 (line 34): true] {...} | CatchInFinally.cs:34:24:34:25 | M2 | +| CatchInFinally.cs:42:13:49:13 | [b1 (line 34): false] try {...} ... | CatchInFinally.cs:34:24:34:25 | M2 | +| CatchInFinally.cs:42:13:49:13 | [finally: exception(Exception), b1 (line 34): true] try {...} ... | CatchInFinally.cs:34:24:34:25 | M2 | +| CatchInFinally.cs:42:13:49:13 | [finally: exception(ExceptionA), b1 (line 34): true] try {...} ... | CatchInFinally.cs:34:24:34:25 | M2 | +| CatchInFinally.cs:43:13:45:13 | [b1 (line 34): false] {...} | CatchInFinally.cs:34:24:34:25 | M2 | +| CatchInFinally.cs:43:13:45:13 | [finally: exception(Exception), b1 (line 34): true] {...} | CatchInFinally.cs:34:24:34:25 | M2 | +| CatchInFinally.cs:43:13:45:13 | [finally: exception(ExceptionA), b1 (line 34): true] {...} | CatchInFinally.cs:34:24:34:25 | M2 | +| CatchInFinally.cs:44:17:44:47 | [b1 (line 34): false] if (...) ... | CatchInFinally.cs:34:24:34:25 | M2 | +| CatchInFinally.cs:44:17:44:47 | [finally: exception(Exception), b1 (line 34): true] if (...) ... | CatchInFinally.cs:34:24:34:25 | M2 | +| CatchInFinally.cs:44:17:44:47 | [finally: exception(ExceptionA), b1 (line 34): true] if (...) ... | CatchInFinally.cs:34:24:34:25 | M2 | +| CatchInFinally.cs:44:21:44:22 | [b1 (line 34): false] access to parameter b2 | CatchInFinally.cs:34:24:34:25 | M2 | +| CatchInFinally.cs:44:21:44:22 | [finally: exception(Exception), b1 (line 34): true] access to parameter b2 | CatchInFinally.cs:34:24:34:25 | M2 | +| CatchInFinally.cs:44:21:44:22 | [finally: exception(ExceptionA), b1 (line 34): true] access to parameter b2 | CatchInFinally.cs:34:24:34:25 | M2 | +| CatchInFinally.cs:44:25:44:47 | [b1 (line 34): false, b2 (line 34): true] throw ...; | CatchInFinally.cs:34:24:34:25 | M2 | +| CatchInFinally.cs:44:25:44:47 | [finally: exception(Exception), b1 (line 34): true, b2 (line 34): true] throw ...; | CatchInFinally.cs:34:24:34:25 | M2 | +| CatchInFinally.cs:44:25:44:47 | [finally: exception(ExceptionA), b1 (line 34): true, b2 (line 34): true] throw ...; | CatchInFinally.cs:34:24:34:25 | M2 | +| CatchInFinally.cs:44:31:44:46 | [b1 (line 34): false, b2 (line 34): true] object creation of type ExceptionB | CatchInFinally.cs:34:24:34:25 | M2 | +| CatchInFinally.cs:44:31:44:46 | [finally: exception(Exception), b1 (line 34): true, b2 (line 34): true] object creation of type ExceptionB | CatchInFinally.cs:34:24:34:25 | M2 | +| CatchInFinally.cs:44:31:44:46 | [finally: exception(ExceptionA), b1 (line 34): true, b2 (line 34): true] object creation of type ExceptionB | CatchInFinally.cs:34:24:34:25 | M2 | +| CatchInFinally.cs:46:13:49:13 | [exception: Exception, b1 (line 34): false, b2 (line 34): true] catch (...) {...} | CatchInFinally.cs:34:24:34:25 | M2 | +| CatchInFinally.cs:46:13:49:13 | [exception: ExceptionB, b1 (line 34): false, b2 (line 34): true] catch (...) {...} | CatchInFinally.cs:34:24:34:25 | M2 | +| CatchInFinally.cs:46:13:49:13 | [finally: exception(Exception), exception: Exception, b1 (line 34): true, b2 (line 34): true] catch (...) {...} | CatchInFinally.cs:34:24:34:25 | M2 | +| CatchInFinally.cs:46:13:49:13 | [finally: exception(Exception), exception: ExceptionB, b1 (line 34): true, b2 (line 34): true] catch (...) {...} | CatchInFinally.cs:34:24:34:25 | M2 | +| CatchInFinally.cs:46:13:49:13 | [finally: exception(ExceptionA), exception: Exception, b1 (line 34): true, b2 (line 34): true] catch (...) {...} | CatchInFinally.cs:34:24:34:25 | M2 | +| CatchInFinally.cs:46:13:49:13 | [finally: exception(ExceptionA), exception: ExceptionB, b1 (line 34): true, b2 (line 34): true] catch (...) {...} | CatchInFinally.cs:34:24:34:25 | M2 | +| CatchInFinally.cs:46:38:46:39 | [exception: Exception, b1 (line 34): false, b2 (line 34): true] access to parameter b2 | CatchInFinally.cs:34:24:34:25 | M2 | +| CatchInFinally.cs:46:38:46:39 | [exception: ExceptionB, b1 (line 34): false, b2 (line 34): true] access to parameter b2 | CatchInFinally.cs:34:24:34:25 | M2 | +| CatchInFinally.cs:46:38:46:39 | [finally: exception(Exception), exception: Exception, b1 (line 34): true, b2 (line 34): true] access to parameter b2 | CatchInFinally.cs:34:24:34:25 | M2 | +| CatchInFinally.cs:46:38:46:39 | [finally: exception(Exception), exception: ExceptionB, b1 (line 34): true, b2 (line 34): true] access to parameter b2 | CatchInFinally.cs:34:24:34:25 | M2 | +| CatchInFinally.cs:46:38:46:39 | [finally: exception(ExceptionA), exception: Exception, b1 (line 34): true, b2 (line 34): true] access to parameter b2 | CatchInFinally.cs:34:24:34:25 | M2 | +| CatchInFinally.cs:46:38:46:39 | [finally: exception(ExceptionA), exception: ExceptionB, b1 (line 34): true, b2 (line 34): true] access to parameter b2 | CatchInFinally.cs:34:24:34:25 | M2 | +| CatchInFinally.cs:47:13:49:13 | [b1 (line 34): false] {...} | CatchInFinally.cs:34:24:34:25 | M2 | +| CatchInFinally.cs:47:13:49:13 | [finally: exception(Exception), b1 (line 34): true] {...} | CatchInFinally.cs:34:24:34:25 | M2 | +| CatchInFinally.cs:47:13:49:13 | [finally: exception(ExceptionA), b1 (line 34): true] {...} | CatchInFinally.cs:34:24:34:25 | M2 | +| CatchInFinally.cs:48:17:48:47 | [b1 (line 34): false] if (...) ... | CatchInFinally.cs:34:24:34:25 | M2 | +| CatchInFinally.cs:48:17:48:47 | [finally: exception(Exception), b1 (line 34): true] if (...) ... | CatchInFinally.cs:34:24:34:25 | M2 | +| CatchInFinally.cs:48:17:48:47 | [finally: exception(ExceptionA), b1 (line 34): true] if (...) ... | CatchInFinally.cs:34:24:34:25 | M2 | +| CatchInFinally.cs:48:21:48:22 | [b1 (line 34): false] access to parameter b1 | CatchInFinally.cs:34:24:34:25 | M2 | +| CatchInFinally.cs:48:21:48:22 | [finally: exception(Exception), b1 (line 34): true] access to parameter b1 | CatchInFinally.cs:34:24:34:25 | M2 | +| CatchInFinally.cs:48:21:48:22 | [finally: exception(ExceptionA), b1 (line 34): true] access to parameter b1 | CatchInFinally.cs:34:24:34:25 | M2 | +| CatchInFinally.cs:48:25:48:47 | [finally: exception(Exception)] throw ...; | CatchInFinally.cs:34:24:34:25 | M2 | +| CatchInFinally.cs:48:25:48:47 | [finally: exception(ExceptionA)] throw ...; | CatchInFinally.cs:34:24:34:25 | M2 | +| CatchInFinally.cs:48:31:48:46 | [finally: exception(Exception)] object creation of type ExceptionC | CatchInFinally.cs:34:24:34:25 | M2 | +| CatchInFinally.cs:48:31:48:46 | [finally: exception(ExceptionA)] object creation of type ExceptionC | CatchInFinally.cs:34:24:34:25 | M2 | +| CompileTimeOperators.cs:5:9:5:15 | enter Default | CompileTimeOperators.cs:5:9:5:15 | Default | +| CompileTimeOperators.cs:5:9:5:15 | exit Default | CompileTimeOperators.cs:5:9:5:15 | Default | +| CompileTimeOperators.cs:6:5:8:5 | {...} | CompileTimeOperators.cs:5:9:5:15 | Default | +| CompileTimeOperators.cs:7:9:7:28 | return ...; | CompileTimeOperators.cs:5:9:5:15 | Default | +| CompileTimeOperators.cs:7:16:7:27 | default(...) | CompileTimeOperators.cs:5:9:5:15 | Default | +| CompileTimeOperators.cs:10:9:10:14 | enter Sizeof | CompileTimeOperators.cs:10:9:10:14 | Sizeof | +| CompileTimeOperators.cs:10:9:10:14 | exit Sizeof | CompileTimeOperators.cs:10:9:10:14 | Sizeof | +| CompileTimeOperators.cs:11:5:13:5 | {...} | CompileTimeOperators.cs:10:9:10:14 | Sizeof | +| CompileTimeOperators.cs:12:9:12:27 | return ...; | CompileTimeOperators.cs:10:9:10:14 | Sizeof | +| CompileTimeOperators.cs:12:16:12:26 | sizeof(..) | CompileTimeOperators.cs:10:9:10:14 | Sizeof | +| CompileTimeOperators.cs:15:10:15:15 | enter Typeof | CompileTimeOperators.cs:15:10:15:15 | Typeof | +| CompileTimeOperators.cs:15:10:15:15 | exit Typeof | CompileTimeOperators.cs:15:10:15:15 | Typeof | +| CompileTimeOperators.cs:16:5:18:5 | {...} | CompileTimeOperators.cs:15:10:15:15 | Typeof | +| CompileTimeOperators.cs:17:9:17:27 | return ...; | CompileTimeOperators.cs:15:10:15:15 | Typeof | +| CompileTimeOperators.cs:17:16:17:26 | typeof(...) | CompileTimeOperators.cs:15:10:15:15 | Typeof | +| CompileTimeOperators.cs:20:12:20:17 | enter Nameof | CompileTimeOperators.cs:20:12:20:17 | Nameof | +| CompileTimeOperators.cs:20:12:20:17 | exit Nameof | CompileTimeOperators.cs:20:12:20:17 | Nameof | +| CompileTimeOperators.cs:21:5:23:5 | {...} | CompileTimeOperators.cs:20:12:20:17 | Nameof | +| CompileTimeOperators.cs:22:9:22:25 | return ...; | CompileTimeOperators.cs:20:12:20:17 | Nameof | +| CompileTimeOperators.cs:22:16:22:24 | nameof(...) | CompileTimeOperators.cs:20:12:20:17 | Nameof | +| CompileTimeOperators.cs:28:10:28:10 | enter M | CompileTimeOperators.cs:28:10:28:10 | M | +| CompileTimeOperators.cs:28:10:28:10 | exit M | CompileTimeOperators.cs:28:10:28:10 | M | +| CompileTimeOperators.cs:29:5:41:5 | {...} | CompileTimeOperators.cs:28:10:28:10 | M | +| CompileTimeOperators.cs:30:9:38:9 | try {...} ... | CompileTimeOperators.cs:28:10:28:10 | M | +| CompileTimeOperators.cs:31:9:34:9 | {...} | CompileTimeOperators.cs:28:10:28:10 | M | +| CompileTimeOperators.cs:32:13:32:21 | goto ...; | CompileTimeOperators.cs:28:10:28:10 | M | +| CompileTimeOperators.cs:36:9:38:9 | [finally: goto(End)] {...} | CompileTimeOperators.cs:28:10:28:10 | M | +| CompileTimeOperators.cs:37:13:37:40 | [finally: goto(End)] call to method WriteLine | CompileTimeOperators.cs:28:10:28:10 | M | +| CompileTimeOperators.cs:37:13:37:41 | [finally: goto(End)] ...; | CompileTimeOperators.cs:28:10:28:10 | M | +| CompileTimeOperators.cs:37:31:37:39 | [finally: goto(End)] "Finally" | CompileTimeOperators.cs:28:10:28:10 | M | +| CompileTimeOperators.cs:40:9:40:11 | End: | CompileTimeOperators.cs:28:10:28:10 | M | +| CompileTimeOperators.cs:40:14:40:37 | call to method WriteLine | CompileTimeOperators.cs:28:10:28:10 | M | +| CompileTimeOperators.cs:40:14:40:38 | ...; | CompileTimeOperators.cs:28:10:28:10 | M | +| CompileTimeOperators.cs:40:32:40:36 | "End" | CompileTimeOperators.cs:28:10:28:10 | M | +| ConditionalAccess.cs:3:12:3:13 | enter M1 | ConditionalAccess.cs:3:12:3:13 | M1 | +| ConditionalAccess.cs:3:12:3:13 | exit M1 | ConditionalAccess.cs:3:12:3:13 | M1 | +| ConditionalAccess.cs:3:26:3:26 | access to parameter i | ConditionalAccess.cs:3:12:3:13 | M1 | +| ConditionalAccess.cs:3:28:3:38 | call to method ToString | ConditionalAccess.cs:3:12:3:13 | M1 | +| ConditionalAccess.cs:3:40:3:49 | call to method ToLower | ConditionalAccess.cs:3:12:3:13 | M1 | +| ConditionalAccess.cs:5:10:5:11 | enter M2 | ConditionalAccess.cs:5:10:5:11 | M2 | +| ConditionalAccess.cs:5:10:5:11 | exit M2 | ConditionalAccess.cs:5:10:5:11 | M2 | +| ConditionalAccess.cs:5:26:5:26 | access to parameter s | ConditionalAccess.cs:5:10:5:11 | M2 | +| ConditionalAccess.cs:5:28:5:34 | access to property Length | ConditionalAccess.cs:5:10:5:11 | M2 | +| ConditionalAccess.cs:7:10:7:11 | enter M3 | ConditionalAccess.cs:7:10:7:11 | M3 | +| ConditionalAccess.cs:7:10:7:11 | exit M3 | ConditionalAccess.cs:7:10:7:11 | M3 | +| ConditionalAccess.cs:7:39:7:40 | access to parameter s1 | ConditionalAccess.cs:7:10:7:11 | M3 | +| ConditionalAccess.cs:7:39:7:46 | ... ?? ... | ConditionalAccess.cs:7:10:7:11 | M3 | +| ConditionalAccess.cs:7:45:7:46 | access to parameter s2 | ConditionalAccess.cs:7:10:7:11 | M3 | +| ConditionalAccess.cs:7:49:7:55 | access to property Length | ConditionalAccess.cs:7:10:7:11 | M3 | +| ConditionalAccess.cs:9:9:9:10 | enter M4 | ConditionalAccess.cs:9:9:9:10 | M4 | +| ConditionalAccess.cs:9:9:9:10 | exit M4 | ConditionalAccess.cs:9:9:9:10 | M4 | +| ConditionalAccess.cs:9:25:9:25 | access to parameter s | ConditionalAccess.cs:9:9:9:10 | M4 | +| ConditionalAccess.cs:9:25:9:38 | ... ?? ... | ConditionalAccess.cs:9:9:9:10 | M4 | +| ConditionalAccess.cs:9:27:9:33 | access to property Length | ConditionalAccess.cs:9:9:9:10 | M4 | +| ConditionalAccess.cs:9:38:9:38 | 0 | ConditionalAccess.cs:9:9:9:10 | M4 | +| ConditionalAccess.cs:11:9:11:10 | enter M5 | ConditionalAccess.cs:11:9:11:10 | M5 | +| ConditionalAccess.cs:11:9:11:10 | exit M5 | ConditionalAccess.cs:11:9:11:10 | M5 | +| ConditionalAccess.cs:12:5:17:5 | {...} | ConditionalAccess.cs:11:9:11:10 | M5 | +| ConditionalAccess.cs:13:9:16:21 | if (...) ... | ConditionalAccess.cs:11:9:11:10 | M5 | +| ConditionalAccess.cs:13:13:13:13 | access to parameter s | ConditionalAccess.cs:11:9:11:10 | M5 | +| ConditionalAccess.cs:13:13:13:25 | ... > ... | ConditionalAccess.cs:11:9:11:10 | M5 | +| ConditionalAccess.cs:13:15:13:21 | access to property Length | ConditionalAccess.cs:11:9:11:10 | M5 | +| ConditionalAccess.cs:13:25:13:25 | 0 | ConditionalAccess.cs:11:9:11:10 | M5 | +| ConditionalAccess.cs:13:25:13:25 | (...) ... | ConditionalAccess.cs:11:9:11:10 | M5 | +| ConditionalAccess.cs:14:13:14:21 | return ...; | ConditionalAccess.cs:11:9:11:10 | M5 | +| ConditionalAccess.cs:14:20:14:20 | 0 | ConditionalAccess.cs:11:9:11:10 | M5 | +| ConditionalAccess.cs:16:13:16:21 | return ...; | ConditionalAccess.cs:11:9:11:10 | M5 | +| ConditionalAccess.cs:16:20:16:20 | 1 | ConditionalAccess.cs:11:9:11:10 | M5 | +| ConditionalAccess.cs:19:12:19:13 | enter M6 | ConditionalAccess.cs:19:12:19:13 | M6 | +| ConditionalAccess.cs:19:12:19:13 | exit M6 | ConditionalAccess.cs:19:12:19:13 | M6 | +| ConditionalAccess.cs:19:40:19:41 | access to parameter s1 | ConditionalAccess.cs:19:12:19:13 | M6 | +| ConditionalAccess.cs:19:43:19:60 | call to method CommaJoinWith | ConditionalAccess.cs:19:12:19:13 | M6 | +| ConditionalAccess.cs:19:58:19:59 | access to parameter s2 | ConditionalAccess.cs:19:12:19:13 | M6 | +| ConditionalAccess.cs:21:10:21:11 | enter M7 | ConditionalAccess.cs:21:10:21:11 | M7 | +| ConditionalAccess.cs:21:10:21:11 | exit M7 | ConditionalAccess.cs:21:10:21:11 | M7 | +| ConditionalAccess.cs:22:5:26:5 | {...} | ConditionalAccess.cs:21:10:21:11 | M7 | +| ConditionalAccess.cs:23:9:23:39 | ... ...; | ConditionalAccess.cs:21:10:21:11 | M7 | +| ConditionalAccess.cs:23:13:23:38 | Nullable j = ... | ConditionalAccess.cs:21:10:21:11 | M7 | +| ConditionalAccess.cs:23:18:23:29 | (...) ... | ConditionalAccess.cs:21:10:21:11 | M7 | +| ConditionalAccess.cs:23:26:23:29 | null | ConditionalAccess.cs:21:10:21:11 | M7 | +| ConditionalAccess.cs:24:9:24:38 | ... ...; | ConditionalAccess.cs:21:10:21:11 | M7 | +| ConditionalAccess.cs:24:13:24:37 | String s = ... | ConditionalAccess.cs:21:10:21:11 | M7 | +| ConditionalAccess.cs:24:18:24:24 | (...) ... | ConditionalAccess.cs:21:10:21:11 | M7 | +| ConditionalAccess.cs:24:24:24:24 | access to parameter i | ConditionalAccess.cs:21:10:21:11 | M7 | +| ConditionalAccess.cs:24:27:24:37 | call to method ToString | ConditionalAccess.cs:21:10:21:11 | M7 | +| ConditionalAccess.cs:25:9:25:32 | ... = ... | ConditionalAccess.cs:21:10:21:11 | M7 | +| ConditionalAccess.cs:25:9:25:33 | ...; | ConditionalAccess.cs:21:10:21:11 | M7 | +| ConditionalAccess.cs:25:13:25:14 | "" | ConditionalAccess.cs:21:10:21:11 | M7 | +| ConditionalAccess.cs:25:16:25:32 | call to method CommaJoinWith | ConditionalAccess.cs:21:10:21:11 | M7 | +| ConditionalAccess.cs:25:31:25:31 | access to local variable s | ConditionalAccess.cs:21:10:21:11 | M7 | +| ConditionalAccess.cs:31:26:31:38 | enter CommaJoinWith | ConditionalAccess.cs:31:26:31:38 | CommaJoinWith | +| ConditionalAccess.cs:31:26:31:38 | exit CommaJoinWith | ConditionalAccess.cs:31:26:31:38 | CommaJoinWith | +| ConditionalAccess.cs:31:70:31:71 | access to parameter s1 | ConditionalAccess.cs:31:26:31:38 | CommaJoinWith | +| ConditionalAccess.cs:31:70:31:78 | ... + ... | ConditionalAccess.cs:31:26:31:38 | CommaJoinWith | +| ConditionalAccess.cs:31:70:31:83 | ... + ... | ConditionalAccess.cs:31:26:31:38 | CommaJoinWith | +| ConditionalAccess.cs:31:75:31:78 | ", " | ConditionalAccess.cs:31:26:31:38 | CommaJoinWith | +| ConditionalAccess.cs:31:82:31:83 | access to parameter s2 | ConditionalAccess.cs:31:26:31:38 | CommaJoinWith | +| Conditions.cs:3:10:3:19 | enter IncrOrDecr | Conditions.cs:3:10:3:19 | IncrOrDecr | +| Conditions.cs:3:10:3:19 | exit IncrOrDecr | Conditions.cs:3:10:3:19 | IncrOrDecr | +| Conditions.cs:4:5:9:5 | {...} | Conditions.cs:3:10:3:19 | IncrOrDecr | +| Conditions.cs:5:9:6:16 | if (...) ... | Conditions.cs:3:10:3:19 | IncrOrDecr | +| Conditions.cs:5:13:5:15 | access to parameter inc | Conditions.cs:3:10:3:19 | IncrOrDecr | +| Conditions.cs:6:13:6:13 | [inc (line 3): true] access to parameter x | Conditions.cs:3:10:3:19 | IncrOrDecr | +| Conditions.cs:6:13:6:15 | [inc (line 3): true] ...++ | Conditions.cs:3:10:3:19 | IncrOrDecr | +| Conditions.cs:6:13:6:16 | [inc (line 3): true] ...; | Conditions.cs:3:10:3:19 | IncrOrDecr | +| Conditions.cs:7:9:8:16 | [inc (line 3): false] if (...) ... | Conditions.cs:3:10:3:19 | IncrOrDecr | +| Conditions.cs:7:9:8:16 | [inc (line 3): true] if (...) ... | Conditions.cs:3:10:3:19 | IncrOrDecr | +| Conditions.cs:7:13:7:16 | [inc (line 3): false] !... | Conditions.cs:3:10:3:19 | IncrOrDecr | +| Conditions.cs:7:13:7:16 | [inc (line 3): true] !... | Conditions.cs:3:10:3:19 | IncrOrDecr | +| Conditions.cs:7:14:7:16 | [inc (line 3): false] access to parameter inc | Conditions.cs:3:10:3:19 | IncrOrDecr | +| Conditions.cs:7:14:7:16 | [inc (line 3): true] access to parameter inc | Conditions.cs:3:10:3:19 | IncrOrDecr | +| Conditions.cs:8:13:8:13 | access to parameter x | Conditions.cs:3:10:3:19 | IncrOrDecr | +| Conditions.cs:8:13:8:15 | ...-- | Conditions.cs:3:10:3:19 | IncrOrDecr | +| Conditions.cs:8:13:8:16 | ...; | Conditions.cs:3:10:3:19 | IncrOrDecr | +| Conditions.cs:11:9:11:10 | enter M1 | Conditions.cs:11:9:11:10 | M1 | +| Conditions.cs:11:9:11:10 | exit M1 | Conditions.cs:11:9:11:10 | M1 | +| Conditions.cs:12:5:20:5 | {...} | Conditions.cs:11:9:11:10 | M1 | +| Conditions.cs:13:9:13:18 | ... ...; | Conditions.cs:11:9:11:10 | M1 | +| Conditions.cs:13:13:13:17 | Int32 x = ... | Conditions.cs:11:9:11:10 | M1 | +| Conditions.cs:13:17:13:17 | 0 | Conditions.cs:11:9:11:10 | M1 | +| Conditions.cs:14:9:15:16 | if (...) ... | Conditions.cs:11:9:11:10 | M1 | +| Conditions.cs:14:13:14:13 | access to parameter b | Conditions.cs:11:9:11:10 | M1 | +| Conditions.cs:15:13:15:13 | [b (line 11): true] access to local variable x | Conditions.cs:11:9:11:10 | M1 | +| Conditions.cs:15:13:15:15 | [b (line 11): true] ...++ | Conditions.cs:11:9:11:10 | M1 | +| Conditions.cs:15:13:15:16 | [b (line 11): true] ...; | Conditions.cs:11:9:11:10 | M1 | +| Conditions.cs:16:9:18:20 | [b (line 11): false] if (...) ... | Conditions.cs:11:9:11:10 | M1 | +| Conditions.cs:16:9:18:20 | [b (line 11): true] if (...) ... | Conditions.cs:11:9:11:10 | M1 | +| Conditions.cs:16:13:16:13 | [b (line 11): false] access to local variable x | Conditions.cs:11:9:11:10 | M1 | +| Conditions.cs:16:13:16:13 | [b (line 11): true] access to local variable x | Conditions.cs:11:9:11:10 | M1 | +| Conditions.cs:16:13:16:17 | [b (line 11): false] ... > ... | Conditions.cs:11:9:11:10 | M1 | +| Conditions.cs:16:13:16:17 | [b (line 11): true] ... > ... | Conditions.cs:11:9:11:10 | M1 | +| Conditions.cs:16:17:16:17 | [b (line 11): false] 0 | Conditions.cs:11:9:11:10 | M1 | +| Conditions.cs:16:17:16:17 | [b (line 11): true] 0 | Conditions.cs:11:9:11:10 | M1 | +| Conditions.cs:17:13:18:20 | [b (line 11): false] if (...) ... | Conditions.cs:11:9:11:10 | M1 | +| Conditions.cs:17:13:18:20 | [b (line 11): true] if (...) ... | Conditions.cs:11:9:11:10 | M1 | +| Conditions.cs:17:17:17:18 | [b (line 11): false] !... | Conditions.cs:11:9:11:10 | M1 | +| Conditions.cs:17:17:17:18 | [b (line 11): true] !... | Conditions.cs:11:9:11:10 | M1 | +| Conditions.cs:17:18:17:18 | [b (line 11): false] access to parameter b | Conditions.cs:11:9:11:10 | M1 | +| Conditions.cs:17:18:17:18 | [b (line 11): true] access to parameter b | Conditions.cs:11:9:11:10 | M1 | +| Conditions.cs:18:17:18:17 | access to local variable x | Conditions.cs:11:9:11:10 | M1 | +| Conditions.cs:18:17:18:19 | ...-- | Conditions.cs:11:9:11:10 | M1 | +| Conditions.cs:18:17:18:20 | ...; | Conditions.cs:11:9:11:10 | M1 | +| Conditions.cs:19:9:19:17 | return ...; | Conditions.cs:11:9:11:10 | M1 | +| Conditions.cs:19:16:19:16 | access to local variable x | Conditions.cs:11:9:11:10 | M1 | +| Conditions.cs:22:9:22:10 | enter M2 | Conditions.cs:22:9:22:10 | M2 | +| Conditions.cs:22:9:22:10 | exit M2 | Conditions.cs:22:9:22:10 | M2 | +| Conditions.cs:23:5:31:5 | {...} | Conditions.cs:22:9:22:10 | M2 | +| Conditions.cs:24:9:24:18 | ... ...; | Conditions.cs:22:9:22:10 | M2 | +| Conditions.cs:24:13:24:17 | Int32 x = ... | Conditions.cs:22:9:22:10 | M2 | +| Conditions.cs:24:17:24:17 | 0 | Conditions.cs:22:9:22:10 | M2 | +| Conditions.cs:25:9:27:20 | if (...) ... | Conditions.cs:22:9:22:10 | M2 | +| Conditions.cs:25:13:25:14 | access to parameter b1 | Conditions.cs:22:9:22:10 | M2 | +| Conditions.cs:26:13:27:20 | if (...) ... | Conditions.cs:22:9:22:10 | M2 | +| Conditions.cs:26:17:26:18 | access to parameter b2 | Conditions.cs:22:9:22:10 | M2 | +| Conditions.cs:27:17:27:17 | [b2 (line 22): true] access to local variable x | Conditions.cs:22:9:22:10 | M2 | +| Conditions.cs:27:17:27:19 | [b2 (line 22): true] ...++ | Conditions.cs:22:9:22:10 | M2 | +| Conditions.cs:27:17:27:20 | [b2 (line 22): true] ...; | Conditions.cs:22:9:22:10 | M2 | +| Conditions.cs:28:9:29:16 | [b2 (line 22): false] if (...) ... | Conditions.cs:22:9:22:10 | M2 | +| Conditions.cs:28:9:29:16 | [b2 (line 22): true] if (...) ... | Conditions.cs:22:9:22:10 | M2 | +| Conditions.cs:28:9:29:16 | if (...) ... | Conditions.cs:22:9:22:10 | M2 | +| Conditions.cs:28:13:28:14 | [b2 (line 22): false] access to parameter b2 | Conditions.cs:22:9:22:10 | M2 | +| Conditions.cs:28:13:28:14 | [b2 (line 22): true] access to parameter b2 | Conditions.cs:22:9:22:10 | M2 | +| Conditions.cs:28:13:28:14 | access to parameter b2 | Conditions.cs:22:9:22:10 | M2 | +| Conditions.cs:29:13:29:13 | access to local variable x | Conditions.cs:22:9:22:10 | M2 | +| Conditions.cs:29:13:29:15 | ...++ | Conditions.cs:22:9:22:10 | M2 | +| Conditions.cs:29:13:29:16 | ...; | Conditions.cs:22:9:22:10 | M2 | +| Conditions.cs:30:9:30:17 | return ...; | Conditions.cs:22:9:22:10 | M2 | +| Conditions.cs:30:16:30:16 | access to local variable x | Conditions.cs:22:9:22:10 | M2 | +| Conditions.cs:33:9:33:10 | enter M3 | Conditions.cs:33:9:33:10 | M3 | +| Conditions.cs:33:9:33:10 | exit M3 | Conditions.cs:33:9:33:10 | M3 | +| Conditions.cs:34:5:44:5 | {...} | Conditions.cs:33:9:33:10 | M3 | +| Conditions.cs:35:9:35:18 | ... ...; | Conditions.cs:33:9:33:10 | M3 | +| Conditions.cs:35:13:35:17 | Int32 x = ... | Conditions.cs:33:9:33:10 | M3 | +| Conditions.cs:35:17:35:17 | 0 | Conditions.cs:33:9:33:10 | M3 | +| Conditions.cs:36:9:36:23 | ... ...; | Conditions.cs:33:9:33:10 | M3 | +| Conditions.cs:36:13:36:22 | Boolean b2 = ... | Conditions.cs:33:9:33:10 | M3 | +| Conditions.cs:36:18:36:22 | false | Conditions.cs:33:9:33:10 | M3 | +| Conditions.cs:37:9:38:20 | if (...) ... | Conditions.cs:33:9:33:10 | M3 | +| Conditions.cs:37:13:37:14 | access to parameter b1 | Conditions.cs:33:9:33:10 | M3 | +| Conditions.cs:38:13:38:19 | ... = ... | Conditions.cs:33:9:33:10 | M3 | +| Conditions.cs:38:13:38:20 | ...; | Conditions.cs:33:9:33:10 | M3 | +| Conditions.cs:38:18:38:19 | access to parameter b1 | Conditions.cs:33:9:33:10 | M3 | +| Conditions.cs:39:9:40:16 | if (...) ... | Conditions.cs:33:9:33:10 | M3 | +| Conditions.cs:39:13:39:14 | access to local variable b2 | Conditions.cs:33:9:33:10 | M3 | +| Conditions.cs:40:13:40:13 | [b2 (line 39): true] access to local variable x | Conditions.cs:33:9:33:10 | M3 | +| Conditions.cs:40:13:40:15 | [b2 (line 39): true] ...++ | Conditions.cs:33:9:33:10 | M3 | +| Conditions.cs:40:13:40:16 | [b2 (line 39): true] ...; | Conditions.cs:33:9:33:10 | M3 | +| Conditions.cs:41:9:42:16 | [b2 (line 39): false] if (...) ... | Conditions.cs:33:9:33:10 | M3 | +| Conditions.cs:41:9:42:16 | [b2 (line 39): true] if (...) ... | Conditions.cs:33:9:33:10 | M3 | +| Conditions.cs:41:13:41:14 | [b2 (line 39): false] access to local variable b2 | Conditions.cs:33:9:33:10 | M3 | +| Conditions.cs:41:13:41:14 | [b2 (line 39): true] access to local variable b2 | Conditions.cs:33:9:33:10 | M3 | +| Conditions.cs:42:13:42:13 | access to local variable x | Conditions.cs:33:9:33:10 | M3 | +| Conditions.cs:42:13:42:15 | ...++ | Conditions.cs:33:9:33:10 | M3 | +| Conditions.cs:42:13:42:16 | ...; | Conditions.cs:33:9:33:10 | M3 | +| Conditions.cs:43:9:43:17 | return ...; | Conditions.cs:33:9:33:10 | M3 | +| Conditions.cs:43:16:43:16 | access to local variable x | Conditions.cs:33:9:33:10 | M3 | +| Conditions.cs:46:9:46:10 | enter M4 | Conditions.cs:46:9:46:10 | M4 | +| Conditions.cs:46:9:46:10 | exit M4 | Conditions.cs:46:9:46:10 | M4 | +| Conditions.cs:47:5:55:5 | {...} | Conditions.cs:46:9:46:10 | M4 | +| Conditions.cs:48:9:48:18 | ... ...; | Conditions.cs:46:9:46:10 | M4 | +| Conditions.cs:48:13:48:17 | Int32 y = ... | Conditions.cs:46:9:46:10 | M4 | +| Conditions.cs:48:17:48:17 | 0 | Conditions.cs:46:9:46:10 | M4 | +| Conditions.cs:49:9:53:9 | while (...) ... | Conditions.cs:46:9:46:10 | M4 | +| Conditions.cs:49:16:49:16 | [b (line 46): false] access to parameter x | Conditions.cs:46:9:46:10 | M4 | +| Conditions.cs:49:16:49:16 | [b (line 46): true] access to parameter x | Conditions.cs:46:9:46:10 | M4 | +| Conditions.cs:49:16:49:16 | access to parameter x | Conditions.cs:46:9:46:10 | M4 | +| Conditions.cs:49:16:49:18 | ...-- | Conditions.cs:46:9:46:10 | M4 | +| Conditions.cs:49:16:49:18 | [b (line 46): false] ...-- | Conditions.cs:46:9:46:10 | M4 | +| Conditions.cs:49:16:49:18 | [b (line 46): true] ...-- | Conditions.cs:46:9:46:10 | M4 | +| Conditions.cs:49:16:49:22 | ... > ... | Conditions.cs:46:9:46:10 | M4 | +| Conditions.cs:49:16:49:22 | [b (line 46): false] ... > ... | Conditions.cs:46:9:46:10 | M4 | +| Conditions.cs:49:16:49:22 | [b (line 46): true] ... > ... | Conditions.cs:46:9:46:10 | M4 | +| Conditions.cs:49:22:49:22 | 0 | Conditions.cs:46:9:46:10 | M4 | +| Conditions.cs:49:22:49:22 | [b (line 46): false] 0 | Conditions.cs:46:9:46:10 | M4 | +| Conditions.cs:49:22:49:22 | [b (line 46): true] 0 | Conditions.cs:46:9:46:10 | M4 | +| Conditions.cs:50:9:53:9 | [b (line 46): false] {...} | Conditions.cs:46:9:46:10 | M4 | +| Conditions.cs:50:9:53:9 | [b (line 46): true] {...} | Conditions.cs:46:9:46:10 | M4 | +| Conditions.cs:50:9:53:9 | {...} | Conditions.cs:46:9:46:10 | M4 | +| Conditions.cs:51:13:52:20 | [b (line 46): false] if (...) ... | Conditions.cs:46:9:46:10 | M4 | +| Conditions.cs:51:13:52:20 | [b (line 46): true] if (...) ... | Conditions.cs:46:9:46:10 | M4 | +| Conditions.cs:51:13:52:20 | if (...) ... | Conditions.cs:46:9:46:10 | M4 | +| Conditions.cs:51:17:51:17 | [b (line 46): false] access to parameter b | Conditions.cs:46:9:46:10 | M4 | +| Conditions.cs:51:17:51:17 | [b (line 46): true] access to parameter b | Conditions.cs:46:9:46:10 | M4 | +| Conditions.cs:51:17:51:17 | access to parameter b | Conditions.cs:46:9:46:10 | M4 | +| Conditions.cs:52:17:52:17 | [b (line 46): true] access to local variable y | Conditions.cs:46:9:46:10 | M4 | +| Conditions.cs:52:17:52:19 | [b (line 46): true] ...++ | Conditions.cs:46:9:46:10 | M4 | +| Conditions.cs:52:17:52:20 | [b (line 46): true] ...; | Conditions.cs:46:9:46:10 | M4 | +| Conditions.cs:54:9:54:17 | return ...; | Conditions.cs:46:9:46:10 | M4 | +| Conditions.cs:54:16:54:16 | access to local variable y | Conditions.cs:46:9:46:10 | M4 | +| Conditions.cs:57:9:57:10 | enter M5 | Conditions.cs:57:9:57:10 | M5 | +| Conditions.cs:57:9:57:10 | exit M5 | Conditions.cs:57:9:57:10 | M5 | +| Conditions.cs:58:5:68:5 | {...} | Conditions.cs:57:9:57:10 | M5 | +| Conditions.cs:59:9:59:18 | ... ...; | Conditions.cs:57:9:57:10 | M5 | +| Conditions.cs:59:13:59:17 | Int32 y = ... | Conditions.cs:57:9:57:10 | M5 | +| Conditions.cs:59:17:59:17 | 0 | Conditions.cs:57:9:57:10 | M5 | +| Conditions.cs:60:9:64:9 | while (...) ... | Conditions.cs:57:9:57:10 | M5 | +| Conditions.cs:60:16:60:16 | [b (line 57): false] access to parameter x | Conditions.cs:57:9:57:10 | M5 | +| Conditions.cs:60:16:60:16 | [b (line 57): true] access to parameter x | Conditions.cs:57:9:57:10 | M5 | +| Conditions.cs:60:16:60:16 | access to parameter x | Conditions.cs:57:9:57:10 | M5 | +| Conditions.cs:60:16:60:18 | ...-- | Conditions.cs:57:9:57:10 | M5 | +| Conditions.cs:60:16:60:18 | [b (line 57): false] ...-- | Conditions.cs:57:9:57:10 | M5 | +| Conditions.cs:60:16:60:18 | [b (line 57): true] ...-- | Conditions.cs:57:9:57:10 | M5 | +| Conditions.cs:60:16:60:22 | ... > ... | Conditions.cs:57:9:57:10 | M5 | +| Conditions.cs:60:16:60:22 | [b (line 57): false] ... > ... | Conditions.cs:57:9:57:10 | M5 | +| Conditions.cs:60:16:60:22 | [b (line 57): true] ... > ... | Conditions.cs:57:9:57:10 | M5 | +| Conditions.cs:60:22:60:22 | 0 | Conditions.cs:57:9:57:10 | M5 | +| Conditions.cs:60:22:60:22 | [b (line 57): false] 0 | Conditions.cs:57:9:57:10 | M5 | +| Conditions.cs:60:22:60:22 | [b (line 57): true] 0 | Conditions.cs:57:9:57:10 | M5 | +| Conditions.cs:61:9:64:9 | [b (line 57): false] {...} | Conditions.cs:57:9:57:10 | M5 | +| Conditions.cs:61:9:64:9 | [b (line 57): true] {...} | Conditions.cs:57:9:57:10 | M5 | +| Conditions.cs:61:9:64:9 | {...} | Conditions.cs:57:9:57:10 | M5 | +| Conditions.cs:62:13:63:20 | [b (line 57): false] if (...) ... | Conditions.cs:57:9:57:10 | M5 | +| Conditions.cs:62:13:63:20 | [b (line 57): true] if (...) ... | Conditions.cs:57:9:57:10 | M5 | +| Conditions.cs:62:13:63:20 | if (...) ... | Conditions.cs:57:9:57:10 | M5 | +| Conditions.cs:62:17:62:17 | [b (line 57): false] access to parameter b | Conditions.cs:57:9:57:10 | M5 | +| Conditions.cs:62:17:62:17 | [b (line 57): true] access to parameter b | Conditions.cs:57:9:57:10 | M5 | +| Conditions.cs:62:17:62:17 | access to parameter b | Conditions.cs:57:9:57:10 | M5 | +| Conditions.cs:63:17:63:17 | [b (line 57): true] access to local variable y | Conditions.cs:57:9:57:10 | M5 | +| Conditions.cs:63:17:63:19 | [b (line 57): true] ...++ | Conditions.cs:57:9:57:10 | M5 | +| Conditions.cs:63:17:63:20 | [b (line 57): true] ...; | Conditions.cs:57:9:57:10 | M5 | +| Conditions.cs:65:9:66:16 | [b (line 57): false] if (...) ... | Conditions.cs:57:9:57:10 | M5 | +| Conditions.cs:65:9:66:16 | [b (line 57): true] if (...) ... | Conditions.cs:57:9:57:10 | M5 | +| Conditions.cs:65:9:66:16 | if (...) ... | Conditions.cs:57:9:57:10 | M5 | +| Conditions.cs:65:13:65:13 | [b (line 57): false] access to parameter b | Conditions.cs:57:9:57:10 | M5 | +| Conditions.cs:65:13:65:13 | [b (line 57): true] access to parameter b | Conditions.cs:57:9:57:10 | M5 | +| Conditions.cs:65:13:65:13 | access to parameter b | Conditions.cs:57:9:57:10 | M5 | +| Conditions.cs:66:13:66:13 | access to local variable y | Conditions.cs:57:9:57:10 | M5 | +| Conditions.cs:66:13:66:15 | ...++ | Conditions.cs:57:9:57:10 | M5 | +| Conditions.cs:66:13:66:16 | ...; | Conditions.cs:57:9:57:10 | M5 | +| Conditions.cs:67:9:67:17 | return ...; | Conditions.cs:57:9:57:10 | M5 | +| Conditions.cs:67:16:67:16 | access to local variable y | Conditions.cs:57:9:57:10 | M5 | +| Conditions.cs:70:9:70:10 | enter M6 | Conditions.cs:70:9:70:10 | M6 | +| Conditions.cs:70:9:70:10 | exit M6 | Conditions.cs:70:9:70:10 | M6 | +| Conditions.cs:71:5:84:5 | {...} | Conditions.cs:70:9:70:10 | M6 | +| Conditions.cs:72:9:72:30 | ... ...; | Conditions.cs:70:9:70:10 | M6 | +| Conditions.cs:72:13:72:29 | Boolean b = ... | Conditions.cs:70:9:70:10 | M6 | +| Conditions.cs:72:17:72:18 | access to parameter ss | Conditions.cs:70:9:70:10 | M6 | +| Conditions.cs:72:17:72:25 | access to property Length | Conditions.cs:70:9:70:10 | M6 | +| Conditions.cs:72:17:72:29 | ... > ... | Conditions.cs:70:9:70:10 | M6 | +| Conditions.cs:72:29:72:29 | 0 | Conditions.cs:70:9:70:10 | M6 | +| Conditions.cs:73:9:73:18 | ... ...; | Conditions.cs:70:9:70:10 | M6 | +| Conditions.cs:73:13:73:17 | Int32 x = ... | Conditions.cs:70:9:70:10 | M6 | +| Conditions.cs:73:17:73:17 | 0 | Conditions.cs:70:9:70:10 | M6 | +| Conditions.cs:74:9:80:9 | foreach (... ... in ...) ... | Conditions.cs:70:9:70:10 | M6 | +| Conditions.cs:74:27:74:28 | access to parameter ss | Conditions.cs:70:9:70:10 | M6 | +| Conditions.cs:75:9:80:9 | {...} | Conditions.cs:70:9:70:10 | M6 | +| Conditions.cs:76:13:77:20 | if (...) ... | Conditions.cs:70:9:70:10 | M6 | +| Conditions.cs:76:17:76:17 | access to local variable b | Conditions.cs:70:9:70:10 | M6 | +| Conditions.cs:77:17:77:17 | access to local variable x | Conditions.cs:70:9:70:10 | M6 | +| Conditions.cs:77:17:77:19 | ...++ | Conditions.cs:70:9:70:10 | M6 | +| Conditions.cs:77:17:77:20 | ...; | Conditions.cs:70:9:70:10 | M6 | +| Conditions.cs:78:13:79:26 | if (...) ... | Conditions.cs:70:9:70:10 | M6 | +| Conditions.cs:78:17:78:17 | access to local variable x | Conditions.cs:70:9:70:10 | M6 | +| Conditions.cs:78:17:78:21 | ... > ... | Conditions.cs:70:9:70:10 | M6 | +| Conditions.cs:78:21:78:21 | 0 | Conditions.cs:70:9:70:10 | M6 | +| Conditions.cs:79:17:79:25 | ... = ... | Conditions.cs:70:9:70:10 | M6 | +| Conditions.cs:79:17:79:26 | ...; | Conditions.cs:70:9:70:10 | M6 | +| Conditions.cs:79:21:79:25 | false | Conditions.cs:70:9:70:10 | M6 | +| Conditions.cs:81:9:82:16 | if (...) ... | Conditions.cs:70:9:70:10 | M6 | +| Conditions.cs:81:12:81:12 | access to local variable b | Conditions.cs:70:9:70:10 | M6 | +| Conditions.cs:82:13:82:13 | access to local variable x | Conditions.cs:70:9:70:10 | M6 | +| Conditions.cs:82:13:82:15 | ...++ | Conditions.cs:70:9:70:10 | M6 | +| Conditions.cs:82:13:82:16 | ...; | Conditions.cs:70:9:70:10 | M6 | +| Conditions.cs:83:9:83:17 | return ...; | Conditions.cs:70:9:70:10 | M6 | +| Conditions.cs:83:16:83:16 | access to local variable x | Conditions.cs:70:9:70:10 | M6 | +| Conditions.cs:86:9:86:10 | enter M7 | Conditions.cs:86:9:86:10 | M7 | +| Conditions.cs:86:9:86:10 | exit M7 | Conditions.cs:86:9:86:10 | M7 | +| Conditions.cs:87:5:100:5 | {...} | Conditions.cs:86:9:86:10 | M7 | +| Conditions.cs:88:9:88:30 | ... ...; | Conditions.cs:86:9:86:10 | M7 | +| Conditions.cs:88:13:88:29 | Boolean b = ... | Conditions.cs:86:9:86:10 | M7 | +| Conditions.cs:88:17:88:18 | access to parameter ss | Conditions.cs:86:9:86:10 | M7 | +| Conditions.cs:88:17:88:25 | access to property Length | Conditions.cs:86:9:86:10 | M7 | +| Conditions.cs:88:17:88:29 | ... > ... | Conditions.cs:86:9:86:10 | M7 | +| Conditions.cs:88:29:88:29 | 0 | Conditions.cs:86:9:86:10 | M7 | +| Conditions.cs:89:9:89:18 | ... ...; | Conditions.cs:86:9:86:10 | M7 | +| Conditions.cs:89:13:89:17 | Int32 x = ... | Conditions.cs:86:9:86:10 | M7 | +| Conditions.cs:89:17:89:17 | 0 | Conditions.cs:86:9:86:10 | M7 | +| Conditions.cs:90:9:98:9 | foreach (... ... in ...) ... | Conditions.cs:86:9:86:10 | M7 | +| Conditions.cs:90:27:90:28 | access to parameter ss | Conditions.cs:86:9:86:10 | M7 | +| Conditions.cs:91:9:98:9 | {...} | Conditions.cs:86:9:86:10 | M7 | +| Conditions.cs:92:13:93:20 | if (...) ... | Conditions.cs:86:9:86:10 | M7 | +| Conditions.cs:92:17:92:17 | access to local variable b | Conditions.cs:86:9:86:10 | M7 | +| Conditions.cs:93:17:93:17 | access to local variable x | Conditions.cs:86:9:86:10 | M7 | +| Conditions.cs:93:17:93:19 | ...++ | Conditions.cs:86:9:86:10 | M7 | +| Conditions.cs:93:17:93:20 | ...; | Conditions.cs:86:9:86:10 | M7 | +| Conditions.cs:94:13:95:26 | if (...) ... | Conditions.cs:86:9:86:10 | M7 | +| Conditions.cs:94:17:94:17 | access to local variable x | Conditions.cs:86:9:86:10 | M7 | +| Conditions.cs:94:17:94:21 | ... > ... | Conditions.cs:86:9:86:10 | M7 | +| Conditions.cs:94:21:94:21 | 0 | Conditions.cs:86:9:86:10 | M7 | +| Conditions.cs:95:17:95:25 | ... = ... | Conditions.cs:86:9:86:10 | M7 | +| Conditions.cs:95:17:95:26 | ...; | Conditions.cs:86:9:86:10 | M7 | +| Conditions.cs:95:21:95:25 | false | Conditions.cs:86:9:86:10 | M7 | +| Conditions.cs:96:13:97:20 | if (...) ... | Conditions.cs:86:9:86:10 | M7 | +| Conditions.cs:96:17:96:17 | access to local variable b | Conditions.cs:86:9:86:10 | M7 | +| Conditions.cs:97:17:97:17 | access to local variable x | Conditions.cs:86:9:86:10 | M7 | +| Conditions.cs:97:17:97:19 | ...++ | Conditions.cs:86:9:86:10 | M7 | +| Conditions.cs:97:17:97:20 | ...; | Conditions.cs:86:9:86:10 | M7 | +| Conditions.cs:99:9:99:17 | return ...; | Conditions.cs:86:9:86:10 | M7 | +| Conditions.cs:99:16:99:16 | access to local variable x | Conditions.cs:86:9:86:10 | M7 | +| Conditions.cs:102:12:102:13 | enter M8 | Conditions.cs:102:12:102:13 | M8 | +| Conditions.cs:102:12:102:13 | exit M8 | Conditions.cs:102:12:102:13 | M8 | +| Conditions.cs:103:5:111:5 | {...} | Conditions.cs:102:12:102:13 | M8 | +| Conditions.cs:104:9:104:29 | ... ...; | Conditions.cs:102:12:102:13 | M8 | +| Conditions.cs:104:13:104:28 | String x = ... | Conditions.cs:102:12:102:13 | M8 | +| Conditions.cs:104:17:104:17 | access to parameter b | Conditions.cs:102:12:102:13 | M8 | +| Conditions.cs:104:17:104:28 | call to method ToString | Conditions.cs:102:12:102:13 | M8 | +| Conditions.cs:105:9:106:20 | if (...) ... | Conditions.cs:102:12:102:13 | M8 | +| Conditions.cs:105:13:105:13 | access to parameter b | Conditions.cs:102:12:102:13 | M8 | +| Conditions.cs:106:13:106:13 | [b (line 102): true] access to local variable x | Conditions.cs:102:12:102:13 | M8 | +| Conditions.cs:106:13:106:19 | [b (line 102): true] ... + ... | Conditions.cs:102:12:102:13 | M8 | +| Conditions.cs:106:13:106:19 | [b (line 102): true] ... = ... | Conditions.cs:102:12:102:13 | M8 | +| Conditions.cs:106:13:106:20 | [b (line 102): true] ...; | Conditions.cs:102:12:102:13 | M8 | +| Conditions.cs:106:18:106:19 | [b (line 102): true] "" | Conditions.cs:102:12:102:13 | M8 | +| Conditions.cs:107:9:109:24 | [b (line 102): false] if (...) ... | Conditions.cs:102:12:102:13 | M8 | +| Conditions.cs:107:9:109:24 | [b (line 102): true] if (...) ... | Conditions.cs:102:12:102:13 | M8 | +| Conditions.cs:107:13:107:13 | [b (line 102): false] access to local variable x | Conditions.cs:102:12:102:13 | M8 | +| Conditions.cs:107:13:107:13 | [b (line 102): true] access to local variable x | Conditions.cs:102:12:102:13 | M8 | +| Conditions.cs:107:13:107:20 | [b (line 102): false] access to property Length | Conditions.cs:102:12:102:13 | M8 | +| Conditions.cs:107:13:107:20 | [b (line 102): true] access to property Length | Conditions.cs:102:12:102:13 | M8 | +| Conditions.cs:107:13:107:24 | [b (line 102): false] ... > ... | Conditions.cs:102:12:102:13 | M8 | +| Conditions.cs:107:13:107:24 | [b (line 102): true] ... > ... | Conditions.cs:102:12:102:13 | M8 | +| Conditions.cs:107:24:107:24 | [b (line 102): false] 0 | Conditions.cs:102:12:102:13 | M8 | +| Conditions.cs:107:24:107:24 | [b (line 102): true] 0 | Conditions.cs:102:12:102:13 | M8 | +| Conditions.cs:108:13:109:24 | [b (line 102): false] if (...) ... | Conditions.cs:102:12:102:13 | M8 | +| Conditions.cs:108:13:109:24 | [b (line 102): true] if (...) ... | Conditions.cs:102:12:102:13 | M8 | +| Conditions.cs:108:17:108:18 | [b (line 102): false] !... | Conditions.cs:102:12:102:13 | M8 | +| Conditions.cs:108:17:108:18 | [b (line 102): true] !... | Conditions.cs:102:12:102:13 | M8 | +| Conditions.cs:108:18:108:18 | [b (line 102): false] access to parameter b | Conditions.cs:102:12:102:13 | M8 | +| Conditions.cs:108:18:108:18 | [b (line 102): true] access to parameter b | Conditions.cs:102:12:102:13 | M8 | +| Conditions.cs:109:17:109:17 | access to local variable x | Conditions.cs:102:12:102:13 | M8 | +| Conditions.cs:109:17:109:23 | ... + ... | Conditions.cs:102:12:102:13 | M8 | +| Conditions.cs:109:17:109:23 | ... = ... | Conditions.cs:102:12:102:13 | M8 | +| Conditions.cs:109:17:109:24 | ...; | Conditions.cs:102:12:102:13 | M8 | +| Conditions.cs:109:22:109:23 | "" | Conditions.cs:102:12:102:13 | M8 | +| Conditions.cs:110:9:110:17 | return ...; | Conditions.cs:102:12:102:13 | M8 | +| Conditions.cs:110:16:110:16 | access to local variable x | Conditions.cs:102:12:102:13 | M8 | +| Conditions.cs:113:10:113:11 | enter M9 | Conditions.cs:113:10:113:11 | M9 | +| Conditions.cs:113:10:113:11 | exit M9 | Conditions.cs:113:10:113:11 | M9 | +| Conditions.cs:114:5:124:5 | {...} | Conditions.cs:113:10:113:11 | M9 | +| Conditions.cs:115:9:115:24 | ... ...; | Conditions.cs:113:10:113:11 | M9 | +| Conditions.cs:115:16:115:23 | String s = ... | Conditions.cs:113:10:113:11 | M9 | +| Conditions.cs:115:20:115:23 | null | Conditions.cs:113:10:113:11 | M9 | +| Conditions.cs:116:9:123:9 | for (...;...;...) ... | Conditions.cs:113:10:113:11 | M9 | +| Conditions.cs:116:17:116:21 | Int32 i = ... | Conditions.cs:113:10:113:11 | M9 | +| Conditions.cs:116:21:116:21 | 0 | Conditions.cs:113:10:113:11 | M9 | +| Conditions.cs:116:24:116:24 | access to local variable i | Conditions.cs:113:10:113:11 | M9 | +| Conditions.cs:116:24:116:38 | ... < ... | Conditions.cs:113:10:113:11 | M9 | +| Conditions.cs:116:28:116:31 | access to parameter args | Conditions.cs:113:10:113:11 | M9 | +| Conditions.cs:116:28:116:38 | access to property Length | Conditions.cs:113:10:113:11 | M9 | +| Conditions.cs:116:41:116:41 | access to local variable i | Conditions.cs:113:10:113:11 | M9 | +| Conditions.cs:116:41:116:43 | ...++ | Conditions.cs:113:10:113:11 | M9 | +| Conditions.cs:117:9:123:9 | {...} | Conditions.cs:113:10:113:11 | M9 | +| Conditions.cs:118:13:118:44 | ... ...; | Conditions.cs:113:10:113:11 | M9 | +| Conditions.cs:118:17:118:43 | Boolean last = ... | Conditions.cs:113:10:113:11 | M9 | +| Conditions.cs:118:24:118:24 | access to local variable i | Conditions.cs:113:10:113:11 | M9 | +| Conditions.cs:118:24:118:43 | ... == ... | Conditions.cs:113:10:113:11 | M9 | +| Conditions.cs:118:29:118:32 | access to parameter args | Conditions.cs:113:10:113:11 | M9 | +| Conditions.cs:118:29:118:39 | access to property Length | Conditions.cs:113:10:113:11 | M9 | +| Conditions.cs:118:29:118:43 | ... - ... | Conditions.cs:113:10:113:11 | M9 | +| Conditions.cs:118:43:118:43 | 1 | Conditions.cs:113:10:113:11 | M9 | +| Conditions.cs:119:13:120:23 | if (...) ... | Conditions.cs:113:10:113:11 | M9 | +| Conditions.cs:119:17:119:21 | !... | Conditions.cs:113:10:113:11 | M9 | +| Conditions.cs:119:18:119:21 | access to local variable last | Conditions.cs:113:10:113:11 | M9 | +| Conditions.cs:120:17:120:22 | [last (line 118): false] ... = ... | Conditions.cs:113:10:113:11 | M9 | +| Conditions.cs:120:17:120:23 | [last (line 118): false] ...; | Conditions.cs:113:10:113:11 | M9 | +| Conditions.cs:120:21:120:22 | [last (line 118): false] "" | Conditions.cs:113:10:113:11 | M9 | +| Conditions.cs:121:13:122:25 | [last (line 118): false] if (...) ... | Conditions.cs:113:10:113:11 | M9 | +| Conditions.cs:121:13:122:25 | [last (line 118): true] if (...) ... | Conditions.cs:113:10:113:11 | M9 | +| Conditions.cs:121:17:121:20 | [last (line 118): false] access to local variable last | Conditions.cs:113:10:113:11 | M9 | +| Conditions.cs:121:17:121:20 | [last (line 118): true] access to local variable last | Conditions.cs:113:10:113:11 | M9 | +| Conditions.cs:122:17:122:24 | ... = ... | Conditions.cs:113:10:113:11 | M9 | +| Conditions.cs:122:17:122:25 | ...; | Conditions.cs:113:10:113:11 | M9 | +| Conditions.cs:122:21:122:24 | null | Conditions.cs:113:10:113:11 | M9 | +| Conditions.cs:129:10:129:12 | enter M10 | Conditions.cs:129:10:129:12 | M10 | +| Conditions.cs:130:5:141:5 | {...} | Conditions.cs:129:10:129:12 | M10 | +| Conditions.cs:131:9:140:9 | while (...) ... | Conditions.cs:129:10:129:12 | M10 | +| Conditions.cs:131:16:131:19 | [Field1 (line 129): false] true | Conditions.cs:129:10:129:12 | M10 | +| Conditions.cs:131:16:131:19 | [Field1 (line 129): true, Field2 (line 129): false] true | Conditions.cs:129:10:129:12 | M10 | +| Conditions.cs:131:16:131:19 | [Field1 (line 129): true, Field2 (line 129): true] true | Conditions.cs:129:10:129:12 | M10 | +| Conditions.cs:131:16:131:19 | true | Conditions.cs:129:10:129:12 | M10 | +| Conditions.cs:132:9:140:9 | [Field1 (line 129): false] {...} | Conditions.cs:129:10:129:12 | M10 | +| Conditions.cs:132:9:140:9 | [Field1 (line 129): true, Field2 (line 129): false] {...} | Conditions.cs:129:10:129:12 | M10 | +| Conditions.cs:132:9:140:9 | [Field1 (line 129): true, Field2 (line 129): true] {...} | Conditions.cs:129:10:129:12 | M10 | +| Conditions.cs:132:9:140:9 | {...} | Conditions.cs:129:10:129:12 | M10 | +| Conditions.cs:133:13:139:13 | [Field1 (line 129): false] if (...) ... | Conditions.cs:129:10:129:12 | M10 | +| Conditions.cs:133:13:139:13 | [Field1 (line 129): true, Field2 (line 129): false] if (...) ... | Conditions.cs:129:10:129:12 | M10 | +| Conditions.cs:133:13:139:13 | [Field1 (line 129): true, Field2 (line 129): true] if (...) ... | Conditions.cs:129:10:129:12 | M10 | +| Conditions.cs:133:13:139:13 | if (...) ... | Conditions.cs:129:10:129:12 | M10 | +| Conditions.cs:133:17:133:22 | [Field1 (line 129): false] access to field Field1 | Conditions.cs:129:10:129:12 | M10 | +| Conditions.cs:133:17:133:22 | [Field1 (line 129): false] this access | Conditions.cs:129:10:129:12 | M10 | +| Conditions.cs:133:17:133:22 | [Field1 (line 129): true, Field2 (line 129): false] access to field Field1 | Conditions.cs:129:10:129:12 | M10 | +| Conditions.cs:133:17:133:22 | [Field1 (line 129): true, Field2 (line 129): false] this access | Conditions.cs:129:10:129:12 | M10 | +| Conditions.cs:133:17:133:22 | [Field1 (line 129): true, Field2 (line 129): true] access to field Field1 | Conditions.cs:129:10:129:12 | M10 | +| Conditions.cs:133:17:133:22 | [Field1 (line 129): true, Field2 (line 129): true] this access | Conditions.cs:129:10:129:12 | M10 | +| Conditions.cs:133:17:133:22 | access to field Field1 | Conditions.cs:129:10:129:12 | M10 | +| Conditions.cs:133:17:133:22 | this access | Conditions.cs:129:10:129:12 | M10 | +| Conditions.cs:134:13:139:13 | [Field1 (line 129): true, Field2 (line 129): false] {...} | Conditions.cs:129:10:129:12 | M10 | +| Conditions.cs:134:13:139:13 | [Field1 (line 129): true, Field2 (line 129): true] {...} | Conditions.cs:129:10:129:12 | M10 | +| Conditions.cs:134:13:139:13 | [Field1 (line 129): true] {...} | Conditions.cs:129:10:129:12 | M10 | +| Conditions.cs:135:17:138:17 | [Field1 (line 129): true, Field2 (line 129): false] if (...) ... | Conditions.cs:129:10:129:12 | M10 | +| Conditions.cs:135:17:138:17 | [Field1 (line 129): true, Field2 (line 129): true] if (...) ... | Conditions.cs:129:10:129:12 | M10 | +| Conditions.cs:135:17:138:17 | [Field1 (line 129): true] if (...) ... | Conditions.cs:129:10:129:12 | M10 | +| Conditions.cs:135:21:135:26 | [Field1 (line 129): true, Field2 (line 129): false] access to field Field2 | Conditions.cs:129:10:129:12 | M10 | +| Conditions.cs:135:21:135:26 | [Field1 (line 129): true, Field2 (line 129): false] this access | Conditions.cs:129:10:129:12 | M10 | +| Conditions.cs:135:21:135:26 | [Field1 (line 129): true, Field2 (line 129): true] access to field Field2 | Conditions.cs:129:10:129:12 | M10 | +| Conditions.cs:135:21:135:26 | [Field1 (line 129): true, Field2 (line 129): true] this access | Conditions.cs:129:10:129:12 | M10 | +| Conditions.cs:135:21:135:26 | [Field1 (line 129): true] access to field Field2 | Conditions.cs:129:10:129:12 | M10 | +| Conditions.cs:135:21:135:26 | [Field1 (line 129): true] this access | Conditions.cs:129:10:129:12 | M10 | +| Conditions.cs:136:17:138:17 | [Field1 (line 129): true, Field2 (line 129): true] {...} | Conditions.cs:129:10:129:12 | M10 | +| Conditions.cs:137:21:137:26 | [Field1 (line 129): true, Field2 (line 129): true] access to field Field1 | Conditions.cs:129:10:129:12 | M10 | +| Conditions.cs:137:21:137:26 | [Field1 (line 129): true, Field2 (line 129): true] this access | Conditions.cs:129:10:129:12 | M10 | +| Conditions.cs:137:21:137:37 | [Field1 (line 129): true, Field2 (line 129): true] call to method ToString | Conditions.cs:129:10:129:12 | M10 | +| Conditions.cs:137:21:137:38 | [Field1 (line 129): true, Field2 (line 129): true] ...; | Conditions.cs:129:10:129:12 | M10 | +| ExitMethods.cs:7:10:7:11 | enter M1 | ExitMethods.cs:7:10:7:11 | M1 | +| ExitMethods.cs:7:10:7:11 | exit M1 | ExitMethods.cs:7:10:7:11 | M1 | +| ExitMethods.cs:8:5:11:5 | {...} | ExitMethods.cs:7:10:7:11 | M1 | +| ExitMethods.cs:9:9:9:24 | call to method ErrorMaybe | ExitMethods.cs:7:10:7:11 | M1 | +| ExitMethods.cs:9:9:9:25 | ...; | ExitMethods.cs:7:10:7:11 | M1 | +| ExitMethods.cs:9:20:9:23 | true | ExitMethods.cs:7:10:7:11 | M1 | +| ExitMethods.cs:10:9:10:15 | return ...; | ExitMethods.cs:7:10:7:11 | M1 | +| ExitMethods.cs:13:10:13:11 | enter M2 | ExitMethods.cs:13:10:13:11 | M2 | +| ExitMethods.cs:13:10:13:11 | exit M2 | ExitMethods.cs:13:10:13:11 | M2 | +| ExitMethods.cs:14:5:17:5 | {...} | ExitMethods.cs:13:10:13:11 | M2 | +| ExitMethods.cs:15:9:15:25 | call to method ErrorMaybe | ExitMethods.cs:13:10:13:11 | M2 | +| ExitMethods.cs:15:9:15:26 | ...; | ExitMethods.cs:13:10:13:11 | M2 | +| ExitMethods.cs:15:20:15:24 | false | ExitMethods.cs:13:10:13:11 | M2 | +| ExitMethods.cs:16:9:16:15 | return ...; | ExitMethods.cs:13:10:13:11 | M2 | +| ExitMethods.cs:19:10:19:11 | enter M3 | ExitMethods.cs:19:10:19:11 | M3 | +| ExitMethods.cs:19:10:19:11 | exit M3 | ExitMethods.cs:19:10:19:11 | M3 | +| ExitMethods.cs:20:5:23:5 | {...} | ExitMethods.cs:19:10:19:11 | M3 | +| ExitMethods.cs:21:9:21:25 | call to method ErrorAlways | ExitMethods.cs:19:10:19:11 | M3 | +| ExitMethods.cs:21:9:21:26 | ...; | ExitMethods.cs:19:10:19:11 | M3 | +| ExitMethods.cs:21:21:21:24 | true | ExitMethods.cs:19:10:19:11 | M3 | +| ExitMethods.cs:25:10:25:11 | enter M4 | ExitMethods.cs:25:10:25:11 | M4 | +| ExitMethods.cs:25:10:25:11 | exit M4 | ExitMethods.cs:25:10:25:11 | M4 | +| ExitMethods.cs:26:5:29:5 | {...} | ExitMethods.cs:25:10:25:11 | M4 | +| ExitMethods.cs:27:9:27:14 | call to method Exit | ExitMethods.cs:25:10:25:11 | M4 | +| ExitMethods.cs:27:9:27:14 | this access | ExitMethods.cs:25:10:25:11 | M4 | +| ExitMethods.cs:27:9:27:15 | ...; | ExitMethods.cs:25:10:25:11 | M4 | +| ExitMethods.cs:31:10:31:11 | enter M5 | ExitMethods.cs:31:10:31:11 | M5 | +| ExitMethods.cs:31:10:31:11 | exit M5 | ExitMethods.cs:31:10:31:11 | M5 | +| ExitMethods.cs:32:5:35:5 | {...} | ExitMethods.cs:31:10:31:11 | M5 | +| ExitMethods.cs:33:9:33:25 | call to method ApplicationExit | ExitMethods.cs:31:10:31:11 | M5 | +| ExitMethods.cs:33:9:33:25 | this access | ExitMethods.cs:31:10:31:11 | M5 | +| ExitMethods.cs:33:9:33:26 | ...; | ExitMethods.cs:31:10:31:11 | M5 | +| ExitMethods.cs:37:10:37:11 | enter M6 | ExitMethods.cs:37:10:37:11 | M6 | +| ExitMethods.cs:37:10:37:11 | exit M6 | ExitMethods.cs:37:10:37:11 | M6 | +| ExitMethods.cs:38:5:51:5 | {...} | ExitMethods.cs:37:10:37:11 | M6 | +| ExitMethods.cs:39:9:50:9 | try {...} ... | ExitMethods.cs:37:10:37:11 | M6 | +| ExitMethods.cs:40:9:42:9 | {...} | ExitMethods.cs:37:10:37:11 | M6 | +| ExitMethods.cs:41:13:41:30 | call to method ErrorAlways | ExitMethods.cs:37:10:37:11 | M6 | +| ExitMethods.cs:41:13:41:31 | ...; | ExitMethods.cs:37:10:37:11 | M6 | +| ExitMethods.cs:41:25:41:29 | false | ExitMethods.cs:37:10:37:11 | M6 | +| ExitMethods.cs:43:9:46:9 | [exception: ArgumentException] catch (...) {...} | ExitMethods.cs:37:10:37:11 | M6 | +| ExitMethods.cs:43:9:46:9 | [exception: Exception] catch (...) {...} | ExitMethods.cs:37:10:37:11 | M6 | +| ExitMethods.cs:44:9:46:9 | {...} | ExitMethods.cs:37:10:37:11 | M6 | +| ExitMethods.cs:45:13:45:19 | return ...; | ExitMethods.cs:37:10:37:11 | M6 | +| ExitMethods.cs:47:9:50:9 | [exception: Exception] catch (...) {...} | ExitMethods.cs:37:10:37:11 | M6 | +| ExitMethods.cs:48:9:50:9 | {...} | ExitMethods.cs:37:10:37:11 | M6 | +| ExitMethods.cs:49:13:49:19 | return ...; | ExitMethods.cs:37:10:37:11 | M6 | +| ExitMethods.cs:53:10:53:11 | enter M7 | ExitMethods.cs:53:10:53:11 | M7 | +| ExitMethods.cs:53:10:53:11 | exit M7 | ExitMethods.cs:53:10:53:11 | M7 | +| ExitMethods.cs:54:5:57:5 | {...} | ExitMethods.cs:53:10:53:11 | M7 | +| ExitMethods.cs:55:9:55:22 | call to method ErrorAlways2 | ExitMethods.cs:53:10:53:11 | M7 | +| ExitMethods.cs:55:9:55:23 | ...; | ExitMethods.cs:53:10:53:11 | M7 | +| ExitMethods.cs:59:10:59:11 | enter M8 | ExitMethods.cs:59:10:59:11 | M8 | +| ExitMethods.cs:59:10:59:11 | exit M8 | ExitMethods.cs:59:10:59:11 | M8 | +| ExitMethods.cs:60:5:63:5 | {...} | ExitMethods.cs:59:10:59:11 | M8 | +| ExitMethods.cs:61:9:61:22 | call to method ErrorAlways3 | ExitMethods.cs:59:10:59:11 | M8 | +| ExitMethods.cs:61:9:61:23 | ...; | ExitMethods.cs:59:10:59:11 | M8 | +| ExitMethods.cs:65:17:65:26 | enter ErrorMaybe | ExitMethods.cs:65:17:65:26 | ErrorMaybe | +| ExitMethods.cs:65:17:65:26 | exit ErrorMaybe | ExitMethods.cs:65:17:65:26 | ErrorMaybe | +| ExitMethods.cs:66:5:69:5 | {...} | ExitMethods.cs:65:17:65:26 | ErrorMaybe | +| ExitMethods.cs:67:9:68:34 | if (...) ... | ExitMethods.cs:65:17:65:26 | ErrorMaybe | +| ExitMethods.cs:67:13:67:13 | access to parameter b | ExitMethods.cs:65:17:65:26 | ErrorMaybe | +| ExitMethods.cs:68:13:68:34 | throw ...; | ExitMethods.cs:65:17:65:26 | ErrorMaybe | +| ExitMethods.cs:68:19:68:33 | object creation of type Exception | ExitMethods.cs:65:17:65:26 | ErrorMaybe | +| ExitMethods.cs:71:17:71:27 | enter ErrorAlways | ExitMethods.cs:71:17:71:27 | ErrorAlways | +| ExitMethods.cs:71:17:71:27 | exit ErrorAlways | ExitMethods.cs:71:17:71:27 | ErrorAlways | +| ExitMethods.cs:72:5:77:5 | {...} | ExitMethods.cs:71:17:71:27 | ErrorAlways | +| ExitMethods.cs:73:9:76:45 | if (...) ... | ExitMethods.cs:71:17:71:27 | ErrorAlways | +| ExitMethods.cs:73:13:73:13 | access to parameter b | ExitMethods.cs:71:17:71:27 | ErrorAlways | +| ExitMethods.cs:74:13:74:34 | throw ...; | ExitMethods.cs:71:17:71:27 | ErrorAlways | +| ExitMethods.cs:74:19:74:33 | object creation of type Exception | ExitMethods.cs:71:17:71:27 | ErrorAlways | +| ExitMethods.cs:76:13:76:45 | throw ...; | ExitMethods.cs:71:17:71:27 | ErrorAlways | +| ExitMethods.cs:76:19:76:44 | object creation of type ArgumentException | ExitMethods.cs:71:17:71:27 | ErrorAlways | +| ExitMethods.cs:76:41:76:43 | "b" | ExitMethods.cs:71:17:71:27 | ErrorAlways | +| ExitMethods.cs:79:17:79:28 | enter ErrorAlways2 | ExitMethods.cs:79:17:79:28 | ErrorAlways2 | +| ExitMethods.cs:79:17:79:28 | exit ErrorAlways2 | ExitMethods.cs:79:17:79:28 | ErrorAlways2 | +| ExitMethods.cs:80:5:82:5 | {...} | ExitMethods.cs:79:17:79:28 | ErrorAlways2 | +| ExitMethods.cs:81:9:81:30 | throw ...; | ExitMethods.cs:79:17:79:28 | ErrorAlways2 | +| ExitMethods.cs:81:15:81:29 | object creation of type Exception | ExitMethods.cs:79:17:79:28 | ErrorAlways2 | +| ExitMethods.cs:84:17:84:28 | enter ErrorAlways3 | ExitMethods.cs:84:17:84:28 | ErrorAlways3 | +| ExitMethods.cs:84:17:84:28 | exit ErrorAlways3 | ExitMethods.cs:84:17:84:28 | ErrorAlways3 | +| ExitMethods.cs:84:35:84:55 | throw ... | ExitMethods.cs:84:17:84:28 | ErrorAlways3 | +| ExitMethods.cs:84:41:84:55 | object creation of type Exception | ExitMethods.cs:84:17:84:28 | ErrorAlways3 | +| ExitMethods.cs:86:10:86:13 | enter Exit | ExitMethods.cs:86:10:86:13 | Exit | +| ExitMethods.cs:86:10:86:13 | exit Exit | ExitMethods.cs:86:10:86:13 | Exit | +| ExitMethods.cs:87:5:89:5 | {...} | ExitMethods.cs:86:10:86:13 | Exit | +| ExitMethods.cs:88:9:88:27 | call to method Exit | ExitMethods.cs:86:10:86:13 | Exit | +| ExitMethods.cs:88:9:88:28 | ...; | ExitMethods.cs:86:10:86:13 | Exit | +| ExitMethods.cs:88:26:88:26 | 0 | ExitMethods.cs:86:10:86:13 | Exit | +| ExitMethods.cs:91:10:91:18 | enter ExitInTry | ExitMethods.cs:91:10:91:18 | ExitInTry | +| ExitMethods.cs:91:10:91:18 | exit ExitInTry | ExitMethods.cs:91:10:91:18 | ExitInTry | +| ExitMethods.cs:92:5:102:5 | {...} | ExitMethods.cs:91:10:91:18 | ExitInTry | +| ExitMethods.cs:93:9:101:9 | try {...} ... | ExitMethods.cs:91:10:91:18 | ExitInTry | +| ExitMethods.cs:94:9:96:9 | {...} | ExitMethods.cs:91:10:91:18 | ExitInTry | +| ExitMethods.cs:95:13:95:18 | call to method Exit | ExitMethods.cs:91:10:91:18 | ExitInTry | +| ExitMethods.cs:95:13:95:18 | this access | ExitMethods.cs:91:10:91:18 | ExitInTry | +| ExitMethods.cs:95:13:95:19 | ...; | ExitMethods.cs:91:10:91:18 | ExitInTry | +| ExitMethods.cs:104:10:104:24 | enter ApplicationExit | ExitMethods.cs:104:10:104:24 | ApplicationExit | +| ExitMethods.cs:104:10:104:24 | exit ApplicationExit | ExitMethods.cs:104:10:104:24 | ApplicationExit | +| ExitMethods.cs:105:5:107:5 | {...} | ExitMethods.cs:104:10:104:24 | ApplicationExit | +| ExitMethods.cs:106:9:106:47 | call to method Exit | ExitMethods.cs:104:10:104:24 | ApplicationExit | +| ExitMethods.cs:106:9:106:48 | ...; | ExitMethods.cs:104:10:104:24 | ApplicationExit | +| ExitMethods.cs:109:13:109:21 | enter ThrowExpr | ExitMethods.cs:109:13:109:21 | ThrowExpr | +| ExitMethods.cs:109:13:109:21 | exit ThrowExpr | ExitMethods.cs:109:13:109:21 | ThrowExpr | +| ExitMethods.cs:110:5:112:5 | {...} | ExitMethods.cs:109:13:109:21 | ThrowExpr | +| ExitMethods.cs:111:9:111:77 | return ...; | ExitMethods.cs:109:13:109:21 | ThrowExpr | +| ExitMethods.cs:111:16:111:20 | access to parameter input | ExitMethods.cs:109:13:109:21 | ThrowExpr | +| ExitMethods.cs:111:16:111:25 | ... != ... | ExitMethods.cs:109:13:109:21 | ThrowExpr | +| ExitMethods.cs:111:16:111:76 | ... ? ... : ... | ExitMethods.cs:109:13:109:21 | ThrowExpr | +| ExitMethods.cs:111:25:111:25 | 0 | ExitMethods.cs:109:13:109:21 | ThrowExpr | +| ExitMethods.cs:111:25:111:25 | (...) ... | ExitMethods.cs:109:13:109:21 | ThrowExpr | +| ExitMethods.cs:111:29:111:29 | 1 | ExitMethods.cs:109:13:109:21 | ThrowExpr | +| ExitMethods.cs:111:29:111:29 | (...) ... | ExitMethods.cs:109:13:109:21 | ThrowExpr | +| ExitMethods.cs:111:29:111:37 | ... / ... | ExitMethods.cs:109:13:109:21 | ThrowExpr | +| ExitMethods.cs:111:33:111:37 | access to parameter input | ExitMethods.cs:109:13:109:21 | ThrowExpr | +| ExitMethods.cs:111:41:111:76 | throw ... | ExitMethods.cs:109:13:109:21 | ThrowExpr | +| ExitMethods.cs:111:47:111:76 | object creation of type ArgumentException | ExitMethods.cs:109:13:109:21 | ThrowExpr | +| ExitMethods.cs:111:69:111:75 | "input" | ExitMethods.cs:109:13:109:21 | ThrowExpr | +| ExitMethods.cs:114:16:114:34 | enter ExtensionMethodCall | ExitMethods.cs:114:16:114:34 | ExtensionMethodCall | +| ExitMethods.cs:114:16:114:34 | exit ExtensionMethodCall | ExitMethods.cs:114:16:114:34 | ExtensionMethodCall | +| ExitMethods.cs:115:5:117:5 | {...} | ExitMethods.cs:114:16:114:34 | ExtensionMethodCall | +| ExitMethods.cs:116:9:116:39 | return ...; | ExitMethods.cs:114:16:114:34 | ExtensionMethodCall | +| ExitMethods.cs:116:16:116:16 | access to parameter s | ExitMethods.cs:114:16:114:34 | ExtensionMethodCall | +| ExitMethods.cs:116:16:116:30 | call to method Contains | ExitMethods.cs:114:16:114:34 | ExtensionMethodCall | +| ExitMethods.cs:116:16:116:38 | ... ? ... : ... | ExitMethods.cs:114:16:114:34 | ExtensionMethodCall | +| ExitMethods.cs:116:27:116:29 | - | ExitMethods.cs:114:16:114:34 | ExtensionMethodCall | +| ExitMethods.cs:116:34:116:34 | 0 | ExitMethods.cs:114:16:114:34 | ExtensionMethodCall | +| ExitMethods.cs:116:38:116:38 | 1 | ExitMethods.cs:114:16:114:34 | ExtensionMethodCall | +| ExitMethods.cs:119:17:119:32 | enter FailingAssertion | ExitMethods.cs:119:17:119:32 | FailingAssertion | +| ExitMethods.cs:119:17:119:32 | exit FailingAssertion | ExitMethods.cs:119:17:119:32 | FailingAssertion | +| ExitMethods.cs:120:5:123:5 | {...} | ExitMethods.cs:119:17:119:32 | FailingAssertion | +| ExitMethods.cs:121:9:121:28 | call to method IsTrue | ExitMethods.cs:119:17:119:32 | FailingAssertion | +| ExitMethods.cs:121:9:121:29 | ...; | ExitMethods.cs:119:17:119:32 | FailingAssertion | +| ExitMethods.cs:121:23:121:27 | false | ExitMethods.cs:119:17:119:32 | FailingAssertion | +| ExitMethods.cs:125:17:125:33 | enter FailingAssertion2 | ExitMethods.cs:125:17:125:33 | FailingAssertion2 | +| ExitMethods.cs:125:17:125:33 | exit FailingAssertion2 | ExitMethods.cs:125:17:125:33 | FailingAssertion2 | +| ExitMethods.cs:126:5:129:5 | {...} | ExitMethods.cs:125:17:125:33 | FailingAssertion2 | +| ExitMethods.cs:127:9:127:26 | call to method FailingAssertion | ExitMethods.cs:125:17:125:33 | FailingAssertion2 | +| ExitMethods.cs:127:9:127:26 | this access | ExitMethods.cs:125:17:125:33 | FailingAssertion2 | +| ExitMethods.cs:127:9:127:27 | ...; | ExitMethods.cs:125:17:125:33 | FailingAssertion2 | +| ExitMethods.cs:131:10:131:20 | enter AssertFalse | ExitMethods.cs:131:10:131:20 | AssertFalse | +| ExitMethods.cs:131:10:131:20 | exit AssertFalse | ExitMethods.cs:131:10:131:20 | AssertFalse | +| ExitMethods.cs:131:33:131:49 | call to method IsFalse | ExitMethods.cs:131:10:131:20 | AssertFalse | +| ExitMethods.cs:131:48:131:48 | access to parameter b | ExitMethods.cs:131:10:131:20 | AssertFalse | +| ExitMethods.cs:133:17:133:33 | enter FailingAssertion3 | ExitMethods.cs:133:17:133:33 | FailingAssertion3 | +| ExitMethods.cs:133:17:133:33 | exit FailingAssertion3 | ExitMethods.cs:133:17:133:33 | FailingAssertion3 | +| ExitMethods.cs:134:5:137:5 | {...} | ExitMethods.cs:133:17:133:33 | FailingAssertion3 | +| ExitMethods.cs:135:9:135:25 | call to method AssertFalse | ExitMethods.cs:133:17:133:33 | FailingAssertion3 | +| ExitMethods.cs:135:9:135:25 | this access | ExitMethods.cs:133:17:133:33 | FailingAssertion3 | +| ExitMethods.cs:135:9:135:26 | ...; | ExitMethods.cs:133:17:133:33 | FailingAssertion3 | +| ExitMethods.cs:135:21:135:24 | true | ExitMethods.cs:133:17:133:33 | FailingAssertion3 | +| Extensions.cs:5:23:5:29 | enter ToInt32 | Extensions.cs:5:23:5:29 | ToInt32 | +| Extensions.cs:5:23:5:29 | exit ToInt32 | Extensions.cs:5:23:5:29 | ToInt32 | +| Extensions.cs:6:5:8:5 | {...} | Extensions.cs:5:23:5:29 | ToInt32 | +| Extensions.cs:7:9:7:30 | return ...; | Extensions.cs:5:23:5:29 | ToInt32 | +| Extensions.cs:7:16:7:29 | call to method Parse | Extensions.cs:5:23:5:29 | ToInt32 | +| Extensions.cs:7:28:7:28 | access to parameter s | Extensions.cs:5:23:5:29 | ToInt32 | +| Extensions.cs:10:24:10:29 | enter ToBool | Extensions.cs:10:24:10:29 | ToBool | +| Extensions.cs:10:24:10:29 | exit ToBool | Extensions.cs:10:24:10:29 | ToBool | +| Extensions.cs:11:5:13:5 | {...} | Extensions.cs:10:24:10:29 | ToBool | +| Extensions.cs:12:9:12:20 | return ...; | Extensions.cs:10:24:10:29 | ToBool | +| Extensions.cs:12:16:12:16 | access to parameter f | Extensions.cs:10:24:10:29 | ToBool | +| Extensions.cs:12:16:12:19 | delegate call | Extensions.cs:10:24:10:29 | ToBool | +| Extensions.cs:12:18:12:18 | access to parameter s | Extensions.cs:10:24:10:29 | ToBool | +| Extensions.cs:15:23:15:33 | enter CallToInt32 | Extensions.cs:15:23:15:33 | CallToInt32 | +| Extensions.cs:15:23:15:33 | exit CallToInt32 | Extensions.cs:15:23:15:33 | CallToInt32 | +| Extensions.cs:15:40:15:51 | call to method ToInt32 | Extensions.cs:15:23:15:33 | CallToInt32 | +| Extensions.cs:15:48:15:50 | "0" | Extensions.cs:15:23:15:33 | CallToInt32 | +| Extensions.cs:20:17:20:20 | enter Main | Extensions.cs:20:17:20:20 | Main | +| Extensions.cs:20:17:20:20 | exit Main | Extensions.cs:20:17:20:20 | Main | +| Extensions.cs:21:5:26:5 | {...} | Extensions.cs:20:17:20:20 | Main | +| Extensions.cs:22:9:22:9 | access to parameter s | Extensions.cs:20:17:20:20 | Main | +| Extensions.cs:22:9:22:19 | call to method ToInt32 | Extensions.cs:20:17:20:20 | Main | +| Extensions.cs:22:9:22:20 | ...; | Extensions.cs:20:17:20:20 | Main | +| Extensions.cs:23:9:23:30 | call to method ToInt32 | Extensions.cs:20:17:20:20 | Main | +| Extensions.cs:23:9:23:31 | ...; | Extensions.cs:20:17:20:20 | Main | +| Extensions.cs:23:28:23:29 | "" | Extensions.cs:20:17:20:20 | Main | +| Extensions.cs:24:9:24:45 | call to method ToBool | Extensions.cs:20:17:20:20 | Main | +| Extensions.cs:24:9:24:46 | ...; | Extensions.cs:20:17:20:20 | Main | +| Extensions.cs:24:27:24:32 | "true" | Extensions.cs:20:17:20:20 | Main | +| Extensions.cs:24:35:24:44 | access to method Parse | Extensions.cs:20:17:20:20 | Main | +| Extensions.cs:24:35:24:44 | delegate creation of type Func | Extensions.cs:20:17:20:20 | Main | +| Extensions.cs:25:9:25:14 | "true" | Extensions.cs:20:17:20:20 | Main | +| Extensions.cs:25:9:25:33 | call to method ToBool | Extensions.cs:20:17:20:20 | Main | +| Extensions.cs:25:9:25:34 | ...; | Extensions.cs:20:17:20:20 | Main | +| Extensions.cs:25:23:25:32 | access to method Parse | Extensions.cs:20:17:20:20 | Main | +| Extensions.cs:25:23:25:32 | delegate creation of type Func | Extensions.cs:20:17:20:20 | Main | +| Foreach.cs:6:10:6:11 | enter M1 | Foreach.cs:6:10:6:11 | M1 | +| Foreach.cs:6:10:6:11 | exit M1 | Foreach.cs:6:10:6:11 | M1 | +| Foreach.cs:7:5:10:5 | {...} | Foreach.cs:6:10:6:11 | M1 | +| Foreach.cs:8:9:9:13 | foreach (... ... in ...) ... | Foreach.cs:6:10:6:11 | M1 | +| Foreach.cs:8:22:8:24 | String arg | Foreach.cs:6:10:6:11 | M1 | +| Foreach.cs:8:29:8:32 | access to parameter args | Foreach.cs:6:10:6:11 | M1 | +| Foreach.cs:9:13:9:13 | ; | Foreach.cs:6:10:6:11 | M1 | +| Foreach.cs:12:10:12:11 | enter M2 | Foreach.cs:12:10:12:11 | M2 | +| Foreach.cs:12:10:12:11 | exit M2 | Foreach.cs:12:10:12:11 | M2 | +| Foreach.cs:13:5:16:5 | {...} | Foreach.cs:12:10:12:11 | M2 | +| Foreach.cs:14:9:15:13 | foreach (... ... in ...) ... | Foreach.cs:12:10:12:11 | M2 | +| Foreach.cs:14:27:14:30 | access to parameter args | Foreach.cs:12:10:12:11 | M2 | +| Foreach.cs:15:13:15:13 | ; | Foreach.cs:12:10:12:11 | M2 | +| Foreach.cs:18:10:18:11 | enter M3 | Foreach.cs:18:10:18:11 | M3 | +| Foreach.cs:18:10:18:11 | exit M3 | Foreach.cs:18:10:18:11 | M3 | +| Foreach.cs:19:5:22:5 | {...} | Foreach.cs:18:10:18:11 | M3 | +| Foreach.cs:20:9:21:11 | foreach (... ... in ...) ... | Foreach.cs:18:10:18:11 | M3 | +| Foreach.cs:20:22:20:22 | String x | Foreach.cs:18:10:18:11 | M3 | +| Foreach.cs:20:27:20:27 | access to parameter e | Foreach.cs:18:10:18:11 | M3 | +| Foreach.cs:20:27:20:68 | ... ?? ... | Foreach.cs:18:10:18:11 | M3 | +| Foreach.cs:20:29:20:38 | call to method ToArray | Foreach.cs:18:10:18:11 | M3 | +| Foreach.cs:20:43:20:68 | call to method Empty | Foreach.cs:18:10:18:11 | M3 | +| Foreach.cs:21:11:21:11 | ; | Foreach.cs:18:10:18:11 | M3 | +| Foreach.cs:24:10:24:11 | enter M4 | Foreach.cs:24:10:24:11 | M4 | +| Foreach.cs:24:10:24:11 | exit M4 | Foreach.cs:24:10:24:11 | M4 | +| Foreach.cs:25:5:28:5 | {...} | Foreach.cs:24:10:24:11 | M4 | +| Foreach.cs:26:9:27:11 | foreach (... ... in ...) ... | Foreach.cs:24:10:24:11 | M4 | +| Foreach.cs:26:18:26:31 | (..., ...) | Foreach.cs:24:10:24:11 | M4 | +| Foreach.cs:26:23:26:23 | String x | Foreach.cs:24:10:24:11 | M4 | +| Foreach.cs:26:30:26:30 | Int32 y | Foreach.cs:24:10:24:11 | M4 | +| Foreach.cs:26:36:26:39 | access to parameter args | Foreach.cs:24:10:24:11 | M4 | +| Foreach.cs:27:11:27:11 | ; | Foreach.cs:24:10:24:11 | M4 | +| Foreach.cs:30:10:30:11 | enter M5 | Foreach.cs:30:10:30:11 | M5 | +| Foreach.cs:30:10:30:11 | exit M5 | Foreach.cs:30:10:30:11 | M5 | +| Foreach.cs:31:5:34:5 | {...} | Foreach.cs:30:10:30:11 | M5 | +| Foreach.cs:32:9:33:11 | foreach (... ... in ...) ... | Foreach.cs:30:10:30:11 | M5 | +| Foreach.cs:32:18:32:27 | (..., ...) | Foreach.cs:30:10:30:11 | M5 | +| Foreach.cs:32:23:32:23 | String x | Foreach.cs:30:10:30:11 | M5 | +| Foreach.cs:32:26:32:26 | Int32 y | Foreach.cs:30:10:30:11 | M5 | +| Foreach.cs:32:32:32:35 | access to parameter args | Foreach.cs:30:10:30:11 | M5 | +| Foreach.cs:33:11:33:11 | ; | Foreach.cs:30:10:30:11 | M5 | +| Foreach.cs:36:10:36:11 | enter M6 | Foreach.cs:36:10:36:11 | M6 | +| Foreach.cs:36:10:36:11 | exit M6 | Foreach.cs:36:10:36:11 | M6 | +| Foreach.cs:37:5:40:5 | {...} | Foreach.cs:36:10:36:11 | M6 | +| Foreach.cs:38:9:39:11 | foreach (... ... in ...) ... | Foreach.cs:36:10:36:11 | M6 | +| Foreach.cs:38:18:38:34 | (..., ...) | Foreach.cs:36:10:36:11 | M6 | +| Foreach.cs:38:26:38:26 | String x | Foreach.cs:36:10:36:11 | M6 | +| Foreach.cs:38:33:38:33 | Int32 y | Foreach.cs:36:10:36:11 | M6 | +| Foreach.cs:38:39:38:42 | access to parameter args | Foreach.cs:36:10:36:11 | M6 | +| Foreach.cs:39:11:39:11 | ; | Foreach.cs:36:10:36:11 | M6 | +| Initializers.cs:3:9:3:9 | this access | Initializers.cs:6:5:6:16 | Initializers | +| Initializers.cs:3:9:3:9 | this access | Initializers.cs:8:5:8:16 | Initializers | +| Initializers.cs:3:9:3:17 | ... = ... | Initializers.cs:6:5:6:16 | Initializers | +| Initializers.cs:3:9:3:17 | ... = ... | Initializers.cs:8:5:8:16 | Initializers | +| Initializers.cs:3:13:3:13 | access to field H | Initializers.cs:6:5:6:16 | Initializers | +| Initializers.cs:3:13:3:13 | access to field H | Initializers.cs:8:5:8:16 | Initializers | +| Initializers.cs:3:13:3:17 | ... + ... | Initializers.cs:6:5:6:16 | Initializers | +| Initializers.cs:3:13:3:17 | ... + ... | Initializers.cs:8:5:8:16 | Initializers | +| Initializers.cs:3:17:3:17 | 1 | Initializers.cs:6:5:6:16 | Initializers | +| Initializers.cs:3:17:3:17 | 1 | Initializers.cs:8:5:8:16 | Initializers | +| Initializers.cs:4:9:4:9 | access to property G | Initializers.cs:6:5:6:16 | Initializers | +| Initializers.cs:4:9:4:9 | access to property G | Initializers.cs:8:5:8:16 | Initializers | +| Initializers.cs:4:9:4:9 | this access | Initializers.cs:6:5:6:16 | Initializers | +| Initializers.cs:4:9:4:9 | this access | Initializers.cs:8:5:8:16 | Initializers | +| Initializers.cs:4:25:4:31 | ... = ... | Initializers.cs:6:5:6:16 | Initializers | +| Initializers.cs:4:25:4:31 | ... = ... | Initializers.cs:8:5:8:16 | Initializers | +| Initializers.cs:4:27:4:27 | access to field H | Initializers.cs:6:5:6:16 | Initializers | +| Initializers.cs:4:27:4:27 | access to field H | Initializers.cs:8:5:8:16 | Initializers | +| Initializers.cs:4:27:4:31 | ... + ... | Initializers.cs:6:5:6:16 | Initializers | +| Initializers.cs:4:27:4:31 | ... + ... | Initializers.cs:8:5:8:16 | Initializers | +| Initializers.cs:4:31:4:31 | 2 | Initializers.cs:6:5:6:16 | Initializers | +| Initializers.cs:4:31:4:31 | 2 | Initializers.cs:8:5:8:16 | Initializers | +| Initializers.cs:6:5:6:16 | enter Initializers | Initializers.cs:6:5:6:16 | Initializers | +| Initializers.cs:6:5:6:16 | exit Initializers | Initializers.cs:6:5:6:16 | Initializers | +| Initializers.cs:6:20:6:22 | {...} | Initializers.cs:6:5:6:16 | Initializers | +| Initializers.cs:8:5:8:16 | enter Initializers | Initializers.cs:8:5:8:16 | Initializers | +| Initializers.cs:8:5:8:16 | exit Initializers | Initializers.cs:8:5:8:16 | Initializers | +| Initializers.cs:8:28:8:30 | {...} | Initializers.cs:8:5:8:16 | Initializers | +| Initializers.cs:10:10:10:10 | enter M | Initializers.cs:10:10:10:10 | M | +| Initializers.cs:10:10:10:10 | exit M | Initializers.cs:10:10:10:10 | M | +| Initializers.cs:11:5:14:5 | {...} | Initializers.cs:10:10:10:10 | M | +| Initializers.cs:12:9:12:54 | ... ...; | Initializers.cs:10:10:10:10 | M | +| Initializers.cs:12:13:12:53 | Initializers i = ... | Initializers.cs:10:10:10:10 | M | +| Initializers.cs:12:17:12:53 | object creation of type Initializers | Initializers.cs:10:10:10:10 | M | +| Initializers.cs:12:34:12:35 | "" | Initializers.cs:10:10:10:10 | M | +| Initializers.cs:12:38:12:53 | { ..., ... } | Initializers.cs:10:10:10:10 | M | +| Initializers.cs:12:40:12:44 | ... = ... | Initializers.cs:10:10:10:10 | M | +| Initializers.cs:12:44:12:44 | 0 | Initializers.cs:10:10:10:10 | M | +| Initializers.cs:12:47:12:47 | access to property G | Initializers.cs:10:10:10:10 | M | +| Initializers.cs:12:47:12:51 | ... = ... | Initializers.cs:10:10:10:10 | M | +| Initializers.cs:12:51:12:51 | 1 | Initializers.cs:10:10:10:10 | M | +| Initializers.cs:13:9:13:64 | ... ...; | Initializers.cs:10:10:10:10 | M | +| Initializers.cs:13:13:13:63 | Initializers[] iz = ... | Initializers.cs:10:10:10:10 | M | +| Initializers.cs:13:18:13:63 | array creation of type Initializers[] | Initializers.cs:10:10:10:10 | M | +| Initializers.cs:13:37:13:63 | { ..., ... } | Initializers.cs:10:10:10:10 | M | +| Initializers.cs:13:39:13:39 | access to local variable i | Initializers.cs:10:10:10:10 | M | +| Initializers.cs:13:42:13:61 | object creation of type Initializers | Initializers.cs:10:10:10:10 | M | +| Initializers.cs:13:59:13:60 | "" | Initializers.cs:10:10:10:10 | M | +| Initializers.cs:18:11:18:23 | enter NoConstructor | Initializers.cs:18:11:18:23 | NoConstructor | +| Initializers.cs:18:11:18:23 | exit NoConstructor | Initializers.cs:18:11:18:23 | NoConstructor | +| Initializers.cs:20:23:20:23 | this access | Initializers.cs:18:11:18:23 | NoConstructor | +| Initializers.cs:20:23:20:23 | this access | Initializers.cs:33:9:33:11 | Sub | +| Initializers.cs:20:23:20:27 | ... = ... | Initializers.cs:18:11:18:23 | NoConstructor | +| Initializers.cs:20:23:20:27 | ... = ... | Initializers.cs:33:9:33:11 | Sub | +| Initializers.cs:20:27:20:27 | 0 | Initializers.cs:18:11:18:23 | NoConstructor | +| Initializers.cs:20:27:20:27 | 0 | Initializers.cs:33:9:33:11 | Sub | +| Initializers.cs:21:23:21:23 | this access | Initializers.cs:18:11:18:23 | NoConstructor | +| Initializers.cs:21:23:21:23 | this access | Initializers.cs:33:9:33:11 | Sub | +| Initializers.cs:21:23:21:27 | ... = ... | Initializers.cs:18:11:18:23 | NoConstructor | +| Initializers.cs:21:23:21:27 | ... = ... | Initializers.cs:33:9:33:11 | Sub | +| Initializers.cs:21:27:21:27 | 1 | Initializers.cs:18:11:18:23 | NoConstructor | +| Initializers.cs:21:27:21:27 | 1 | Initializers.cs:33:9:33:11 | Sub | +| Initializers.cs:26:13:26:13 | this access | Initializers.cs:29:9:29:11 | Sub | +| Initializers.cs:26:13:26:13 | this access | Initializers.cs:33:9:33:11 | Sub | +| Initializers.cs:26:13:26:17 | ... = ... | Initializers.cs:29:9:29:11 | Sub | +| Initializers.cs:26:13:26:17 | ... = ... | Initializers.cs:33:9:33:11 | Sub | +| Initializers.cs:26:17:26:17 | 2 | Initializers.cs:29:9:29:11 | Sub | +| Initializers.cs:26:17:26:17 | 2 | Initializers.cs:33:9:33:11 | Sub | +| Initializers.cs:29:9:29:11 | enter Sub | Initializers.cs:29:9:29:11 | Sub | +| Initializers.cs:29:9:29:11 | exit Sub | Initializers.cs:29:9:29:11 | Sub | +| Initializers.cs:29:17:29:20 | call to constructor NoConstructor | Initializers.cs:29:9:29:11 | Sub | +| Initializers.cs:29:24:29:33 | {...} | Initializers.cs:29:9:29:11 | Sub | +| Initializers.cs:29:26:29:26 | this access | Initializers.cs:29:9:29:11 | Sub | +| Initializers.cs:29:26:29:30 | ... = ... | Initializers.cs:29:9:29:11 | Sub | +| Initializers.cs:29:26:29:31 | ...; | Initializers.cs:29:9:29:11 | Sub | +| Initializers.cs:29:30:29:30 | 3 | Initializers.cs:29:9:29:11 | Sub | +| Initializers.cs:31:9:31:11 | enter Sub | Initializers.cs:31:9:31:11 | Sub | +| Initializers.cs:31:9:31:11 | exit Sub | Initializers.cs:31:9:31:11 | Sub | +| Initializers.cs:31:22:31:25 | call to constructor Sub | Initializers.cs:31:9:31:11 | Sub | +| Initializers.cs:31:29:31:38 | {...} | Initializers.cs:31:9:31:11 | Sub | +| Initializers.cs:31:31:31:31 | this access | Initializers.cs:31:9:31:11 | Sub | +| Initializers.cs:31:31:31:35 | ... = ... | Initializers.cs:31:9:31:11 | Sub | +| Initializers.cs:31:31:31:36 | ...; | Initializers.cs:31:9:31:11 | Sub | +| Initializers.cs:31:35:31:35 | access to parameter i | Initializers.cs:31:9:31:11 | Sub | +| Initializers.cs:33:9:33:11 | enter Sub | Initializers.cs:33:9:33:11 | Sub | +| Initializers.cs:33:9:33:11 | exit Sub | Initializers.cs:33:9:33:11 | Sub | +| Initializers.cs:33:27:33:40 | {...} | Initializers.cs:33:9:33:11 | Sub | +| Initializers.cs:33:29:33:29 | this access | Initializers.cs:33:9:33:11 | Sub | +| Initializers.cs:33:29:33:37 | ... = ... | Initializers.cs:33:9:33:11 | Sub | +| Initializers.cs:33:29:33:38 | ...; | Initializers.cs:33:9:33:11 | Sub | +| Initializers.cs:33:33:33:33 | access to parameter i | Initializers.cs:33:9:33:11 | Sub | +| Initializers.cs:33:33:33:37 | ... + ... | Initializers.cs:33:9:33:11 | Sub | +| Initializers.cs:33:37:33:37 | access to parameter j | Initializers.cs:33:9:33:11 | Sub | +| NullCoalescing.cs:3:9:3:10 | enter M1 | NullCoalescing.cs:3:9:3:10 | M1 | +| NullCoalescing.cs:3:9:3:10 | exit M1 | NullCoalescing.cs:3:9:3:10 | M1 | +| NullCoalescing.cs:3:23:3:23 | access to parameter i | NullCoalescing.cs:3:9:3:10 | M1 | +| NullCoalescing.cs:3:23:3:28 | ... ?? ... | NullCoalescing.cs:3:9:3:10 | M1 | +| NullCoalescing.cs:3:28:3:28 | 0 | NullCoalescing.cs:3:9:3:10 | M1 | +| NullCoalescing.cs:5:9:5:10 | enter M2 | NullCoalescing.cs:5:9:5:10 | M2 | +| NullCoalescing.cs:5:9:5:10 | exit M2 | NullCoalescing.cs:5:9:5:10 | M2 | +| NullCoalescing.cs:5:24:5:43 | ... ? ... : ... | NullCoalescing.cs:5:9:5:10 | M2 | +| NullCoalescing.cs:5:25:5:25 | access to parameter b | NullCoalescing.cs:5:9:5:10 | M2 | +| NullCoalescing.cs:5:25:5:34 | ... ?? ... | NullCoalescing.cs:5:9:5:10 | M2 | +| NullCoalescing.cs:5:30:5:34 | false | NullCoalescing.cs:5:9:5:10 | M2 | +| NullCoalescing.cs:5:39:5:39 | 0 | NullCoalescing.cs:5:9:5:10 | M2 | +| NullCoalescing.cs:5:43:5:43 | 1 | NullCoalescing.cs:5:9:5:10 | M2 | +| NullCoalescing.cs:7:12:7:13 | enter M3 | NullCoalescing.cs:7:12:7:13 | M3 | +| NullCoalescing.cs:7:12:7:13 | exit M3 | NullCoalescing.cs:7:12:7:13 | M3 | +| NullCoalescing.cs:7:40:7:41 | access to parameter s1 | NullCoalescing.cs:7:12:7:13 | M3 | +| NullCoalescing.cs:7:40:7:53 | ... ?? ... | NullCoalescing.cs:7:12:7:13 | M3 | +| NullCoalescing.cs:7:46:7:47 | access to parameter s2 | NullCoalescing.cs:7:12:7:13 | M3 | +| NullCoalescing.cs:7:46:7:53 | ... ?? ... | NullCoalescing.cs:7:12:7:13 | M3 | +| NullCoalescing.cs:7:52:7:53 | "" | NullCoalescing.cs:7:12:7:13 | M3 | +| NullCoalescing.cs:9:12:9:13 | enter M4 | NullCoalescing.cs:9:12:9:13 | M4 | +| NullCoalescing.cs:9:12:9:13 | exit M4 | NullCoalescing.cs:9:12:9:13 | M4 | +| NullCoalescing.cs:9:36:9:58 | ... ?? ... | NullCoalescing.cs:9:12:9:13 | M4 | +| NullCoalescing.cs:9:37:9:37 | access to parameter b | NullCoalescing.cs:9:12:9:13 | M4 | +| NullCoalescing.cs:9:37:9:45 | ... ? ... : ... | NullCoalescing.cs:9:12:9:13 | M4 | +| NullCoalescing.cs:9:41:9:41 | access to parameter s | NullCoalescing.cs:9:12:9:13 | M4 | +| NullCoalescing.cs:9:45:9:45 | access to parameter s | NullCoalescing.cs:9:12:9:13 | M4 | +| NullCoalescing.cs:9:51:9:52 | "" | NullCoalescing.cs:9:12:9:13 | M4 | +| NullCoalescing.cs:9:51:9:58 | ... ?? ... | NullCoalescing.cs:9:12:9:13 | M4 | +| NullCoalescing.cs:11:9:11:10 | enter M5 | NullCoalescing.cs:11:9:11:10 | M5 | +| NullCoalescing.cs:11:9:11:10 | exit M5 | NullCoalescing.cs:11:9:11:10 | M5 | +| NullCoalescing.cs:11:43:11:68 | ... ? ... : ... | NullCoalescing.cs:11:9:11:10 | M5 | +| NullCoalescing.cs:11:44:11:45 | access to parameter b1 | NullCoalescing.cs:11:9:11:10 | M5 | +| NullCoalescing.cs:11:44:11:59 | ... ?? ... | NullCoalescing.cs:11:9:11:10 | M5 | +| NullCoalescing.cs:11:51:11:52 | access to parameter b2 | NullCoalescing.cs:11:9:11:10 | M5 | +| NullCoalescing.cs:11:51:11:58 | ... && ... | NullCoalescing.cs:11:9:11:10 | M5 | +| NullCoalescing.cs:11:57:11:58 | access to parameter b3 | NullCoalescing.cs:11:9:11:10 | M5 | +| NullCoalescing.cs:11:64:11:64 | 0 | NullCoalescing.cs:11:9:11:10 | M5 | +| NullCoalescing.cs:11:68:11:68 | 1 | NullCoalescing.cs:11:9:11:10 | M5 | +| NullCoalescing.cs:13:10:13:11 | enter M6 | NullCoalescing.cs:13:10:13:11 | M6 | +| NullCoalescing.cs:13:10:13:11 | exit M6 | NullCoalescing.cs:13:10:13:11 | M6 | +| NullCoalescing.cs:14:5:18:5 | {...} | NullCoalescing.cs:13:10:13:11 | M6 | +| NullCoalescing.cs:15:9:15:32 | ... ...; | NullCoalescing.cs:13:10:13:11 | M6 | +| NullCoalescing.cs:15:13:15:31 | Int32 j = ... | NullCoalescing.cs:13:10:13:11 | M6 | +| NullCoalescing.cs:15:17:15:26 | (...) ... | NullCoalescing.cs:13:10:13:11 | M6 | +| NullCoalescing.cs:15:17:15:31 | ... ?? ... | NullCoalescing.cs:13:10:13:11 | M6 | +| NullCoalescing.cs:15:23:15:26 | null | NullCoalescing.cs:13:10:13:11 | M6 | +| NullCoalescing.cs:15:31:15:31 | 0 | NullCoalescing.cs:13:10:13:11 | M6 | +| NullCoalescing.cs:16:9:16:26 | ... ...; | NullCoalescing.cs:13:10:13:11 | M6 | +| NullCoalescing.cs:16:13:16:25 | String s = ... | NullCoalescing.cs:13:10:13:11 | M6 | +| NullCoalescing.cs:16:17:16:18 | "" | NullCoalescing.cs:13:10:13:11 | M6 | +| NullCoalescing.cs:16:17:16:25 | ... ?? ... | NullCoalescing.cs:13:10:13:11 | M6 | +| NullCoalescing.cs:17:9:17:24 | ... = ... | NullCoalescing.cs:13:10:13:11 | M6 | +| NullCoalescing.cs:17:9:17:25 | ...; | NullCoalescing.cs:13:10:13:11 | M6 | +| NullCoalescing.cs:17:13:17:19 | (...) ... | NullCoalescing.cs:13:10:13:11 | M6 | +| NullCoalescing.cs:17:13:17:24 | ... ?? ... | NullCoalescing.cs:13:10:13:11 | M6 | +| NullCoalescing.cs:17:19:17:19 | access to parameter i | NullCoalescing.cs:13:10:13:11 | M6 | +| Patterns.cs:5:10:5:13 | enter Test | Patterns.cs:5:10:5:13 | Test | +| Patterns.cs:5:10:5:13 | exit Test | Patterns.cs:5:10:5:13 | Test | +| Patterns.cs:6:5:43:5 | {...} | Patterns.cs:5:10:5:13 | Test | +| Patterns.cs:7:9:7:24 | ... ...; | Patterns.cs:5:10:5:13 | Test | +| Patterns.cs:7:16:7:23 | Object o = ... | Patterns.cs:5:10:5:13 | Test | +| Patterns.cs:7:20:7:23 | null | Patterns.cs:5:10:5:13 | Test | +| Patterns.cs:8:9:18:9 | if (...) ... | Patterns.cs:5:10:5:13 | Test | +| Patterns.cs:8:13:8:13 | access to local variable o | Patterns.cs:5:10:5:13 | Test | +| Patterns.cs:8:13:8:23 | ... is ... | Patterns.cs:5:10:5:13 | Test | +| Patterns.cs:8:18:8:23 | Int32 i1 | Patterns.cs:5:10:5:13 | Test | +| Patterns.cs:9:9:11:9 | {...} | Patterns.cs:5:10:5:13 | Test | +| Patterns.cs:10:13:10:42 | call to method WriteLine | Patterns.cs:5:10:5:13 | Test | +| Patterns.cs:10:13:10:43 | ...; | Patterns.cs:5:10:5:13 | Test | +| Patterns.cs:10:31:10:41 | $"..." | Patterns.cs:5:10:5:13 | Test | +| Patterns.cs:10:33:10:36 | "int " | Patterns.cs:5:10:5:13 | Test | +| Patterns.cs:10:38:10:39 | access to local variable i1 | Patterns.cs:5:10:5:13 | Test | +| Patterns.cs:12:14:18:9 | if (...) ... | Patterns.cs:5:10:5:13 | Test | +| Patterns.cs:12:18:12:18 | access to local variable o | Patterns.cs:5:10:5:13 | Test | +| Patterns.cs:12:18:12:31 | ... is ... | Patterns.cs:5:10:5:13 | Test | +| Patterns.cs:12:23:12:31 | String s1 | Patterns.cs:5:10:5:13 | Test | +| Patterns.cs:13:9:15:9 | {...} | Patterns.cs:5:10:5:13 | Test | +| Patterns.cs:14:13:14:45 | call to method WriteLine | Patterns.cs:5:10:5:13 | Test | +| Patterns.cs:14:13:14:46 | ...; | Patterns.cs:5:10:5:13 | Test | +| Patterns.cs:14:31:14:44 | $"..." | Patterns.cs:5:10:5:13 | Test | +| Patterns.cs:14:33:14:39 | "string " | Patterns.cs:5:10:5:13 | Test | +| Patterns.cs:14:41:14:42 | access to local variable s1 | Patterns.cs:5:10:5:13 | Test | +| Patterns.cs:16:14:18:9 | if (...) ... | Patterns.cs:5:10:5:13 | Test | +| Patterns.cs:16:18:16:18 | access to local variable o | Patterns.cs:5:10:5:13 | Test | +| Patterns.cs:16:18:16:28 | ... is ... | Patterns.cs:5:10:5:13 | Test | +| Patterns.cs:16:23:16:28 | Object v1 | Patterns.cs:5:10:5:13 | Test | +| Patterns.cs:17:9:18:9 | {...} | Patterns.cs:5:10:5:13 | Test | +| Patterns.cs:20:9:38:9 | switch (...) {...} | Patterns.cs:5:10:5:13 | Test | +| Patterns.cs:20:17:20:17 | access to local variable o | Patterns.cs:5:10:5:13 | Test | +| Patterns.cs:22:13:22:23 | case ...: | Patterns.cs:5:10:5:13 | Test | +| Patterns.cs:22:18:22:22 | "xyz" | Patterns.cs:5:10:5:13 | Test | +| Patterns.cs:23:17:23:22 | break; | Patterns.cs:5:10:5:13 | Test | +| Patterns.cs:24:13:24:36 | case ...: | Patterns.cs:5:10:5:13 | Test | +| Patterns.cs:24:18:24:23 | Int32 i2 | Patterns.cs:5:10:5:13 | Test | +| Patterns.cs:24:30:24:31 | access to local variable i2 | Patterns.cs:5:10:5:13 | Test | +| Patterns.cs:24:30:24:35 | ... > ... | Patterns.cs:5:10:5:13 | Test | +| Patterns.cs:24:35:24:35 | 0 | Patterns.cs:5:10:5:13 | Test | +| Patterns.cs:25:17:25:51 | call to method WriteLine | Patterns.cs:5:10:5:13 | Test | +| Patterns.cs:25:17:25:52 | ...; | Patterns.cs:5:10:5:13 | Test | +| Patterns.cs:25:35:25:50 | $"..." | Patterns.cs:5:10:5:13 | Test | +| Patterns.cs:25:37:25:45 | "positive " | Patterns.cs:5:10:5:13 | Test | +| Patterns.cs:25:47:25:48 | access to local variable i2 | Patterns.cs:5:10:5:13 | Test | +| Patterns.cs:26:17:26:22 | break; | Patterns.cs:5:10:5:13 | Test | +| Patterns.cs:27:13:27:24 | case ...: | Patterns.cs:5:10:5:13 | Test | +| Patterns.cs:27:18:27:23 | Int32 i3 | Patterns.cs:5:10:5:13 | Test | +| Patterns.cs:28:17:28:46 | call to method WriteLine | Patterns.cs:5:10:5:13 | Test | +| Patterns.cs:28:17:28:47 | ...; | Patterns.cs:5:10:5:13 | Test | +| Patterns.cs:28:35:28:45 | $"..." | Patterns.cs:5:10:5:13 | Test | +| Patterns.cs:28:37:28:40 | "int " | Patterns.cs:5:10:5:13 | Test | +| Patterns.cs:28:42:28:43 | access to local variable i3 | Patterns.cs:5:10:5:13 | Test | +| Patterns.cs:29:17:29:22 | break; | Patterns.cs:5:10:5:13 | Test | +| Patterns.cs:30:13:30:27 | case ...: | Patterns.cs:5:10:5:13 | Test | +| Patterns.cs:30:18:30:26 | String s2 | Patterns.cs:5:10:5:13 | Test | +| Patterns.cs:31:17:31:49 | call to method WriteLine | Patterns.cs:5:10:5:13 | Test | +| Patterns.cs:31:17:31:50 | ...; | Patterns.cs:5:10:5:13 | Test | +| Patterns.cs:31:35:31:48 | $"..." | Patterns.cs:5:10:5:13 | Test | +| Patterns.cs:31:37:31:43 | "string " | Patterns.cs:5:10:5:13 | Test | +| Patterns.cs:31:45:31:46 | access to local variable s2 | Patterns.cs:5:10:5:13 | Test | +| Patterns.cs:32:17:32:22 | break; | Patterns.cs:5:10:5:13 | Test | +| Patterns.cs:33:13:33:24 | case ...: | Patterns.cs:5:10:5:13 | Test | +| Patterns.cs:33:18:33:23 | Object v2 | Patterns.cs:5:10:5:13 | Test | +| Patterns.cs:34:17:34:22 | break; | Patterns.cs:5:10:5:13 | Test | +| Patterns.cs:35:13:35:20 | default: | Patterns.cs:5:10:5:13 | Test | +| Patterns.cs:36:17:36:51 | call to method WriteLine | Patterns.cs:5:10:5:13 | Test | +| Patterns.cs:36:17:36:52 | ...; | Patterns.cs:5:10:5:13 | Test | +| Patterns.cs:36:35:36:50 | "Something else" | Patterns.cs:5:10:5:13 | Test | +| Patterns.cs:37:17:37:22 | break; | Patterns.cs:5:10:5:13 | Test | +| Patterns.cs:40:9:42:9 | switch (...) {...} | Patterns.cs:5:10:5:13 | Test | +| Patterns.cs:40:17:40:17 | access to local variable o | Patterns.cs:5:10:5:13 | Test | +| Qualifiers.cs:7:16:7:21 | enter Method | Qualifiers.cs:7:16:7:21 | Method | +| Qualifiers.cs:7:16:7:21 | exit Method | Qualifiers.cs:7:16:7:21 | Method | +| Qualifiers.cs:7:28:7:31 | null | Qualifiers.cs:7:16:7:21 | Method | +| Qualifiers.cs:8:23:8:34 | enter StaticMethod | Qualifiers.cs:8:23:8:34 | StaticMethod | +| Qualifiers.cs:8:23:8:34 | exit StaticMethod | Qualifiers.cs:8:23:8:34 | StaticMethod | +| Qualifiers.cs:8:41:8:44 | null | Qualifiers.cs:8:23:8:34 | StaticMethod | +| Qualifiers.cs:10:10:10:10 | enter M | Qualifiers.cs:10:10:10:10 | M | +| Qualifiers.cs:10:10:10:10 | exit M | Qualifiers.cs:10:10:10:10 | M | +| Qualifiers.cs:11:5:31:5 | {...} | Qualifiers.cs:10:10:10:10 | M | +| Qualifiers.cs:12:9:12:22 | ... ...; | Qualifiers.cs:10:10:10:10 | M | +| Qualifiers.cs:12:13:12:21 | Qualifiers q = ... | Qualifiers.cs:10:10:10:10 | M | +| Qualifiers.cs:12:17:12:21 | access to field Field | Qualifiers.cs:10:10:10:10 | M | +| Qualifiers.cs:12:17:12:21 | this access | Qualifiers.cs:10:10:10:10 | M | +| Qualifiers.cs:13:9:13:20 | ... = ... | Qualifiers.cs:10:10:10:10 | M | +| Qualifiers.cs:13:9:13:21 | ...; | Qualifiers.cs:10:10:10:10 | M | +| Qualifiers.cs:13:13:13:20 | access to property Property | Qualifiers.cs:10:10:10:10 | M | +| Qualifiers.cs:13:13:13:20 | this access | Qualifiers.cs:10:10:10:10 | M | +| Qualifiers.cs:14:9:14:20 | ... = ... | Qualifiers.cs:10:10:10:10 | M | +| Qualifiers.cs:14:9:14:21 | ...; | Qualifiers.cs:10:10:10:10 | M | +| Qualifiers.cs:14:13:14:20 | call to method Method | Qualifiers.cs:10:10:10:10 | M | +| Qualifiers.cs:14:13:14:20 | this access | Qualifiers.cs:10:10:10:10 | M | +| Qualifiers.cs:16:9:16:22 | ... = ... | Qualifiers.cs:10:10:10:10 | M | +| Qualifiers.cs:16:9:16:23 | ...; | Qualifiers.cs:10:10:10:10 | M | +| Qualifiers.cs:16:13:16:16 | this access | Qualifiers.cs:10:10:10:10 | M | +| Qualifiers.cs:16:13:16:22 | access to field Field | Qualifiers.cs:10:10:10:10 | M | +| Qualifiers.cs:17:9:17:25 | ... = ... | Qualifiers.cs:10:10:10:10 | M | +| Qualifiers.cs:17:9:17:26 | ...; | Qualifiers.cs:10:10:10:10 | M | +| Qualifiers.cs:17:13:17:16 | this access | Qualifiers.cs:10:10:10:10 | M | +| Qualifiers.cs:17:13:17:25 | access to property Property | Qualifiers.cs:10:10:10:10 | M | +| Qualifiers.cs:18:9:18:25 | ... = ... | Qualifiers.cs:10:10:10:10 | M | +| Qualifiers.cs:18:9:18:26 | ...; | Qualifiers.cs:10:10:10:10 | M | +| Qualifiers.cs:18:13:18:16 | this access | Qualifiers.cs:10:10:10:10 | M | +| Qualifiers.cs:18:13:18:25 | call to method Method | Qualifiers.cs:10:10:10:10 | M | +| Qualifiers.cs:20:9:20:23 | ... = ... | Qualifiers.cs:10:10:10:10 | M | +| Qualifiers.cs:20:9:20:24 | ...; | Qualifiers.cs:10:10:10:10 | M | +| Qualifiers.cs:20:13:20:23 | access to field StaticField | Qualifiers.cs:10:10:10:10 | M | +| Qualifiers.cs:21:9:21:26 | ... = ... | Qualifiers.cs:10:10:10:10 | M | +| Qualifiers.cs:21:9:21:27 | ...; | Qualifiers.cs:10:10:10:10 | M | +| Qualifiers.cs:21:13:21:26 | access to property StaticProperty | Qualifiers.cs:10:10:10:10 | M | +| Qualifiers.cs:22:9:22:26 | ... = ... | Qualifiers.cs:10:10:10:10 | M | +| Qualifiers.cs:22:9:22:27 | ...; | Qualifiers.cs:10:10:10:10 | M | +| Qualifiers.cs:22:13:22:26 | call to method StaticMethod | Qualifiers.cs:10:10:10:10 | M | +| Qualifiers.cs:24:9:24:34 | ... = ... | Qualifiers.cs:10:10:10:10 | M | +| Qualifiers.cs:24:9:24:35 | ...; | Qualifiers.cs:10:10:10:10 | M | +| Qualifiers.cs:24:13:24:34 | access to field StaticField | Qualifiers.cs:10:10:10:10 | M | +| Qualifiers.cs:25:9:25:37 | ... = ... | Qualifiers.cs:10:10:10:10 | M | +| Qualifiers.cs:25:9:25:38 | ...; | Qualifiers.cs:10:10:10:10 | M | +| Qualifiers.cs:25:13:25:37 | access to property StaticProperty | Qualifiers.cs:10:10:10:10 | M | +| Qualifiers.cs:26:9:26:37 | ... = ... | Qualifiers.cs:10:10:10:10 | M | +| Qualifiers.cs:26:9:26:38 | ...; | Qualifiers.cs:10:10:10:10 | M | +| Qualifiers.cs:26:13:26:37 | call to method StaticMethod | Qualifiers.cs:10:10:10:10 | M | +| Qualifiers.cs:28:9:28:40 | ... = ... | Qualifiers.cs:10:10:10:10 | M | +| Qualifiers.cs:28:9:28:41 | ...; | Qualifiers.cs:10:10:10:10 | M | +| Qualifiers.cs:28:13:28:34 | access to field StaticField | Qualifiers.cs:10:10:10:10 | M | +| Qualifiers.cs:28:13:28:40 | access to field Field | Qualifiers.cs:10:10:10:10 | M | +| Qualifiers.cs:29:9:29:46 | ... = ... | Qualifiers.cs:10:10:10:10 | M | +| Qualifiers.cs:29:9:29:47 | ...; | Qualifiers.cs:10:10:10:10 | M | +| Qualifiers.cs:29:13:29:37 | access to property StaticProperty | Qualifiers.cs:10:10:10:10 | M | +| Qualifiers.cs:29:13:29:46 | access to property Property | Qualifiers.cs:10:10:10:10 | M | +| Qualifiers.cs:30:9:30:46 | ... = ... | Qualifiers.cs:10:10:10:10 | M | +| Qualifiers.cs:30:9:30:47 | ...; | Qualifiers.cs:10:10:10:10 | M | +| Qualifiers.cs:30:13:30:37 | call to method StaticMethod | Qualifiers.cs:10:10:10:10 | M | +| Qualifiers.cs:30:13:30:46 | call to method Method | Qualifiers.cs:10:10:10:10 | M | +| Switch.cs:5:10:5:11 | enter M1 | Switch.cs:5:10:5:11 | M1 | +| Switch.cs:5:10:5:11 | exit M1 | Switch.cs:5:10:5:11 | M1 | +| Switch.cs:6:5:8:5 | {...} | Switch.cs:5:10:5:11 | M1 | +| Switch.cs:7:9:7:22 | switch (...) {...} | Switch.cs:5:10:5:11 | M1 | +| Switch.cs:7:17:7:17 | access to parameter o | Switch.cs:5:10:5:11 | M1 | +| Switch.cs:10:10:10:11 | enter M2 | Switch.cs:10:10:10:11 | M2 | +| Switch.cs:10:10:10:11 | exit M2 | Switch.cs:10:10:10:11 | M2 | +| Switch.cs:11:5:33:5 | {...} | Switch.cs:10:10:10:11 | M2 | +| Switch.cs:12:9:32:9 | switch (...) {...} | Switch.cs:10:10:10:11 | M2 | +| Switch.cs:12:17:12:17 | access to parameter o | Switch.cs:10:10:10:11 | M2 | +| Switch.cs:14:13:14:21 | case ...: | Switch.cs:10:10:10:11 | M2 | +| Switch.cs:14:18:14:20 | "a" | Switch.cs:10:10:10:11 | M2 | +| Switch.cs:15:17:15:23 | return ...; | Switch.cs:10:10:10:11 | M2 | +| Switch.cs:16:13:16:19 | case ...: | Switch.cs:10:10:10:11 | M2 | +| Switch.cs:16:18:16:18 | 0 | Switch.cs:10:10:10:11 | M2 | +| Switch.cs:17:17:17:38 | throw ...; | Switch.cs:10:10:10:11 | M2 | +| Switch.cs:17:23:17:37 | object creation of type Exception | Switch.cs:10:10:10:11 | M2 | +| Switch.cs:18:13:18:22 | case ...: | Switch.cs:10:10:10:11 | M2 | +| Switch.cs:18:18:18:21 | null | Switch.cs:10:10:10:11 | M2 | +| Switch.cs:19:17:19:29 | goto default; | Switch.cs:10:10:10:11 | M2 | +| Switch.cs:20:13:20:23 | case ...: | Switch.cs:10:10:10:11 | M2 | +| Switch.cs:20:18:20:22 | Int32 i | Switch.cs:10:10:10:11 | M2 | +| Switch.cs:21:17:22:27 | if (...) ... | Switch.cs:10:10:10:11 | M2 | +| Switch.cs:21:21:21:21 | access to parameter o | Switch.cs:10:10:10:11 | M2 | +| Switch.cs:21:21:21:29 | ... == ... | Switch.cs:10:10:10:11 | M2 | +| Switch.cs:21:26:21:29 | null | Switch.cs:10:10:10:11 | M2 | +| Switch.cs:22:21:22:27 | return ...; | Switch.cs:10:10:10:11 | M2 | +| Switch.cs:23:17:23:28 | goto case ...; | Switch.cs:10:10:10:11 | M2 | +| Switch.cs:23:27:23:27 | 0 | Switch.cs:10:10:10:11 | M2 | +| Switch.cs:24:13:24:56 | case ...: | Switch.cs:10:10:10:11 | M2 | +| Switch.cs:24:18:24:25 | String s | Switch.cs:10:10:10:11 | M2 | +| Switch.cs:24:32:24:32 | access to local variable s | Switch.cs:10:10:10:11 | M2 | +| Switch.cs:24:32:24:39 | access to property Length | Switch.cs:10:10:10:11 | M2 | +| Switch.cs:24:32:24:43 | ... > ... | Switch.cs:10:10:10:11 | M2 | +| Switch.cs:24:32:24:55 | ... && ... | Switch.cs:10:10:10:11 | M2 | +| Switch.cs:24:43:24:43 | 0 | Switch.cs:10:10:10:11 | M2 | +| Switch.cs:24:48:24:48 | access to local variable s | Switch.cs:10:10:10:11 | M2 | +| Switch.cs:24:48:24:55 | ... != ... | Switch.cs:10:10:10:11 | M2 | +| Switch.cs:24:53:24:55 | "a" | Switch.cs:10:10:10:11 | M2 | +| Switch.cs:25:17:25:36 | call to method WriteLine | Switch.cs:10:10:10:11 | M2 | +| Switch.cs:25:17:25:37 | ...; | Switch.cs:10:10:10:11 | M2 | +| Switch.cs:25:35:25:35 | access to local variable s | Switch.cs:10:10:10:11 | M2 | +| Switch.cs:26:17:26:23 | return ...; | Switch.cs:10:10:10:11 | M2 | +| Switch.cs:27:13:27:39 | case ...: | Switch.cs:10:10:10:11 | M2 | +| Switch.cs:27:18:27:25 | Double d | Switch.cs:10:10:10:11 | M2 | +| Switch.cs:27:32:27:38 | call to method Throw | Switch.cs:10:10:10:11 | M2 | +| Switch.cs:28:17:28:21 | Label: | Switch.cs:10:10:10:11 | M2 | +| Switch.cs:29:17:29:23 | return ...; | Switch.cs:10:10:10:11 | M2 | +| Switch.cs:30:13:30:20 | default: | Switch.cs:10:10:10:11 | M2 | +| Switch.cs:31:17:31:27 | goto ...; | Switch.cs:10:10:10:11 | M2 | +| Switch.cs:35:10:35:11 | enter M3 | Switch.cs:35:10:35:11 | M3 | +| Switch.cs:35:10:35:11 | exit M3 | Switch.cs:35:10:35:11 | M3 | +| Switch.cs:36:5:42:5 | {...} | Switch.cs:35:10:35:11 | M3 | +| Switch.cs:37:9:41:9 | switch (...) {...} | Switch.cs:35:10:35:11 | M3 | +| Switch.cs:37:17:37:23 | call to method Throw | Switch.cs:35:10:35:11 | M3 | +| Switch.cs:44:10:44:11 | enter M4 | Switch.cs:44:10:44:11 | M4 | +| Switch.cs:44:10:44:11 | exit M4 | Switch.cs:44:10:44:11 | M4 | +| Switch.cs:45:5:53:5 | {...} | Switch.cs:44:10:44:11 | M4 | +| Switch.cs:46:9:52:9 | switch (...) {...} | Switch.cs:44:10:44:11 | M4 | +| Switch.cs:46:17:46:17 | access to parameter o | Switch.cs:44:10:44:11 | M4 | +| Switch.cs:48:13:48:23 | case ...: | Switch.cs:44:10:44:11 | M4 | +| Switch.cs:48:18:48:20 | access to type Int32 | Switch.cs:44:10:44:11 | M4 | +| Switch.cs:49:17:49:22 | break; | Switch.cs:44:10:44:11 | M4 | +| Switch.cs:50:13:50:39 | case ...: | Switch.cs:44:10:44:11 | M4 | +| Switch.cs:50:18:50:21 | access to type Boolean | Switch.cs:44:10:44:11 | M4 | +| Switch.cs:50:30:50:30 | access to parameter o | Switch.cs:44:10:44:11 | M4 | +| Switch.cs:50:30:50:38 | ... != ... | Switch.cs:44:10:44:11 | M4 | +| Switch.cs:50:35:50:38 | null | Switch.cs:44:10:44:11 | M4 | +| Switch.cs:51:17:51:22 | break; | Switch.cs:44:10:44:11 | M4 | +| Switch.cs:55:10:55:11 | enter M5 | Switch.cs:55:10:55:11 | M5 | +| Switch.cs:55:10:55:11 | exit M5 | Switch.cs:55:10:55:11 | M5 | +| Switch.cs:56:5:64:5 | {...} | Switch.cs:55:10:55:11 | M5 | +| Switch.cs:57:9:63:9 | switch (...) {...} | Switch.cs:55:10:55:11 | M5 | +| Switch.cs:57:17:57:17 | 1 | Switch.cs:55:10:55:11 | M5 | +| Switch.cs:57:17:57:21 | ... + ... | Switch.cs:55:10:55:11 | M5 | +| Switch.cs:57:21:57:21 | 2 | Switch.cs:55:10:55:11 | M5 | +| Switch.cs:59:13:59:20 | case ...: | Switch.cs:55:10:55:11 | M5 | +| Switch.cs:59:18:59:18 | 2 | Switch.cs:55:10:55:11 | M5 | +| Switch.cs:61:13:61:20 | case ...: | Switch.cs:55:10:55:11 | M5 | +| Switch.cs:61:18:61:18 | 3 | Switch.cs:55:10:55:11 | M5 | +| Switch.cs:62:15:62:20 | break; | Switch.cs:55:10:55:11 | M5 | +| Switch.cs:66:10:66:11 | enter M6 | Switch.cs:66:10:66:11 | M6 | +| Switch.cs:66:10:66:11 | exit M6 | Switch.cs:66:10:66:11 | M6 | +| Switch.cs:67:5:75:5 | {...} | Switch.cs:66:10:66:11 | M6 | +| Switch.cs:68:9:74:9 | switch (...) {...} | Switch.cs:66:10:66:11 | M6 | +| Switch.cs:68:17:68:25 | (...) ... | Switch.cs:66:10:66:11 | M6 | +| Switch.cs:68:25:68:25 | access to parameter s | Switch.cs:66:10:66:11 | M6 | +| Switch.cs:70:13:70:24 | case ...: | Switch.cs:66:10:66:11 | M6 | +| Switch.cs:70:18:70:20 | access to type Int32 | Switch.cs:66:10:66:11 | M6 | +| Switch.cs:72:13:72:21 | case ...: | Switch.cs:66:10:66:11 | M6 | +| Switch.cs:72:18:72:19 | "" | Switch.cs:66:10:66:11 | M6 | +| Switch.cs:73:15:73:20 | break; | Switch.cs:66:10:66:11 | M6 | +| Switch.cs:77:10:77:11 | enter M7 | Switch.cs:77:10:77:11 | M7 | +| Switch.cs:77:10:77:11 | exit M7 | Switch.cs:77:10:77:11 | M7 | +| Switch.cs:78:5:89:5 | {...} | Switch.cs:77:10:77:11 | M7 | +| Switch.cs:79:9:87:9 | switch (...) {...} | Switch.cs:77:10:77:11 | M7 | +| Switch.cs:79:17:79:17 | access to parameter i | Switch.cs:77:10:77:11 | M7 | +| Switch.cs:81:13:81:20 | case ...: | Switch.cs:77:10:77:11 | M7 | +| Switch.cs:81:18:81:18 | 1 | Switch.cs:77:10:77:11 | M7 | +| Switch.cs:82:15:82:26 | return ...; | Switch.cs:77:10:77:11 | M7 | +| Switch.cs:82:22:82:25 | true | Switch.cs:77:10:77:11 | M7 | +| Switch.cs:83:13:83:20 | case ...: | Switch.cs:77:10:77:11 | M7 | +| Switch.cs:83:18:83:18 | 2 | Switch.cs:77:10:77:11 | M7 | +| Switch.cs:84:15:85:22 | if (...) ... | Switch.cs:77:10:77:11 | M7 | +| Switch.cs:84:19:84:19 | access to parameter j | Switch.cs:77:10:77:11 | M7 | +| Switch.cs:84:19:84:23 | ... > ... | Switch.cs:77:10:77:11 | M7 | +| Switch.cs:84:23:84:23 | 2 | Switch.cs:77:10:77:11 | M7 | +| Switch.cs:85:17:85:22 | break; | Switch.cs:77:10:77:11 | M7 | +| Switch.cs:86:15:86:26 | return ...; | Switch.cs:77:10:77:11 | M7 | +| Switch.cs:86:22:86:25 | true | Switch.cs:77:10:77:11 | M7 | +| Switch.cs:88:9:88:21 | return ...; | Switch.cs:77:10:77:11 | M7 | +| Switch.cs:88:16:88:20 | false | Switch.cs:77:10:77:11 | M7 | +| Switch.cs:91:10:91:11 | enter M8 | Switch.cs:91:10:91:11 | M8 | +| Switch.cs:91:10:91:11 | exit M8 | Switch.cs:91:10:91:11 | M8 | +| Switch.cs:92:5:99:5 | {...} | Switch.cs:91:10:91:11 | M8 | +| Switch.cs:93:9:97:9 | switch (...) {...} | Switch.cs:91:10:91:11 | M8 | +| Switch.cs:93:17:93:17 | access to parameter o | Switch.cs:91:10:91:11 | M8 | +| Switch.cs:95:13:95:24 | case ...: | Switch.cs:91:10:91:11 | M8 | +| Switch.cs:95:18:95:20 | access to type Int32 | Switch.cs:91:10:91:11 | M8 | +| Switch.cs:96:15:96:26 | return ...; | Switch.cs:91:10:91:11 | M8 | +| Switch.cs:96:22:96:25 | true | Switch.cs:91:10:91:11 | M8 | +| Switch.cs:98:9:98:21 | return ...; | Switch.cs:91:10:91:11 | M8 | +| Switch.cs:98:16:98:20 | false | Switch.cs:91:10:91:11 | M8 | +| Switch.cs:101:9:101:10 | enter M9 | Switch.cs:101:9:101:10 | M9 | +| Switch.cs:101:9:101:10 | exit M9 | Switch.cs:101:9:101:10 | M9 | +| Switch.cs:102:5:109:5 | {...} | Switch.cs:101:9:101:10 | M9 | +| Switch.cs:103:9:107:9 | switch (...) {...} | Switch.cs:101:9:101:10 | M9 | +| Switch.cs:103:17:103:17 | access to parameter s | Switch.cs:101:9:101:10 | M9 | +| Switch.cs:103:19:103:25 | access to property Length | Switch.cs:101:9:101:10 | M9 | +| Switch.cs:105:13:105:20 | case ...: | Switch.cs:101:9:101:10 | M9 | +| Switch.cs:105:18:105:18 | 0 | Switch.cs:101:9:101:10 | M9 | +| Switch.cs:105:22:105:30 | return ...; | Switch.cs:101:9:101:10 | M9 | +| Switch.cs:105:29:105:29 | 0 | Switch.cs:101:9:101:10 | M9 | +| Switch.cs:106:13:106:20 | case ...: | Switch.cs:101:9:101:10 | M9 | +| Switch.cs:106:18:106:18 | 1 | Switch.cs:101:9:101:10 | M9 | +| Switch.cs:106:22:106:30 | return ...; | Switch.cs:101:9:101:10 | M9 | +| Switch.cs:106:29:106:29 | 1 | Switch.cs:101:9:101:10 | M9 | +| Switch.cs:108:9:108:18 | return ...; | Switch.cs:101:9:101:10 | M9 | +| Switch.cs:108:16:108:17 | -... | Switch.cs:101:9:101:10 | M9 | +| Switch.cs:108:17:108:17 | 1 | Switch.cs:101:9:101:10 | M9 | +| Switch.cs:111:17:111:21 | enter Throw | Switch.cs:111:17:111:21 | Throw | +| Switch.cs:111:17:111:21 | exit Throw | Switch.cs:111:17:111:21 | Throw | +| Switch.cs:111:28:111:48 | throw ... | Switch.cs:111:17:111:21 | Throw | +| Switch.cs:111:34:111:48 | object creation of type Exception | Switch.cs:111:17:111:21 | Throw | +| Switch.cs:113:9:113:11 | enter M10 | Switch.cs:113:9:113:11 | M10 | +| Switch.cs:113:9:113:11 | exit M10 | Switch.cs:113:9:113:11 | M10 | +| Switch.cs:114:5:121:5 | {...} | Switch.cs:113:9:113:11 | M10 | +| Switch.cs:115:9:119:9 | switch (...) {...} | Switch.cs:113:9:113:11 | M10 | +| Switch.cs:115:17:115:17 | access to parameter s | Switch.cs:113:9:113:11 | M10 | +| Switch.cs:115:17:115:24 | access to property Length | Switch.cs:113:9:113:11 | M10 | +| Switch.cs:117:13:117:34 | case ...: | Switch.cs:113:9:113:11 | M10 | +| Switch.cs:117:18:117:18 | 3 | Switch.cs:113:9:113:11 | M10 | +| Switch.cs:117:25:117:25 | access to parameter s | Switch.cs:113:9:113:11 | M10 | +| Switch.cs:117:25:117:32 | ... == ... | Switch.cs:113:9:113:11 | M10 | +| Switch.cs:117:28:117:32 | "foo" | Switch.cs:113:9:113:11 | M10 | +| Switch.cs:117:36:117:44 | return ...; | Switch.cs:113:9:113:11 | M10 | +| Switch.cs:117:43:117:43 | 1 | Switch.cs:113:9:113:11 | M10 | +| Switch.cs:118:13:118:33 | case ...: | Switch.cs:113:9:113:11 | M10 | +| Switch.cs:118:18:118:18 | 2 | Switch.cs:113:9:113:11 | M10 | +| Switch.cs:118:25:118:25 | access to parameter s | Switch.cs:113:9:113:11 | M10 | +| Switch.cs:118:25:118:31 | ... == ... | Switch.cs:113:9:113:11 | M10 | +| Switch.cs:118:28:118:31 | "fu" | Switch.cs:113:9:113:11 | M10 | +| Switch.cs:118:35:118:43 | return ...; | Switch.cs:113:9:113:11 | M10 | +| Switch.cs:118:42:118:42 | 2 | Switch.cs:113:9:113:11 | M10 | +| Switch.cs:120:9:120:18 | return ...; | Switch.cs:113:9:113:11 | M10 | +| Switch.cs:120:16:120:17 | -... | Switch.cs:113:9:113:11 | M10 | +| Switch.cs:120:17:120:17 | 1 | Switch.cs:113:9:113:11 | M10 | +| Switch.cs:123:10:123:12 | enter M11 | Switch.cs:123:10:123:12 | M11 | +| Switch.cs:123:10:123:12 | exit M11 | Switch.cs:123:10:123:12 | M11 | +| Switch.cs:124:5:127:5 | {...} | Switch.cs:123:10:123:12 | M11 | +| Switch.cs:125:9:126:19 | if (...) ... | Switch.cs:123:10:123:12 | M11 | +| Switch.cs:125:13:125:13 | access to parameter o | Switch.cs:123:10:123:12 | M11 | +| Switch.cs:125:13:125:48 | ... switch { ... } | Switch.cs:123:10:123:12 | M11 | +| Switch.cs:125:24:125:29 | Boolean b | Switch.cs:123:10:123:12 | M11 | +| Switch.cs:125:24:125:34 | ... => ... | Switch.cs:123:10:123:12 | M11 | +| Switch.cs:125:34:125:34 | access to local variable b | Switch.cs:123:10:123:12 | M11 | +| Switch.cs:125:37:125:37 | _ | Switch.cs:123:10:123:12 | M11 | +| Switch.cs:125:37:125:46 | ... => ... | Switch.cs:123:10:123:12 | M11 | +| Switch.cs:125:42:125:46 | false | Switch.cs:123:10:123:12 | M11 | +| Switch.cs:126:13:126:19 | return ...; | Switch.cs:123:10:123:12 | M11 | +| Switch.cs:129:12:129:14 | enter M12 | Switch.cs:129:12:129:14 | M12 | +| Switch.cs:129:12:129:14 | exit M12 | Switch.cs:129:12:129:14 | M12 | +| Switch.cs:130:5:132:5 | {...} | Switch.cs:129:12:129:14 | M12 | +| Switch.cs:131:9:131:67 | return ...; | Switch.cs:129:12:129:14 | M12 | +| Switch.cs:131:17:131:17 | access to parameter o | Switch.cs:129:12:129:14 | M12 | +| Switch.cs:131:17:131:53 | ... switch { ... } | Switch.cs:129:12:129:14 | M12 | +| Switch.cs:131:28:131:35 | String s | Switch.cs:129:12:129:14 | M12 | +| Switch.cs:131:28:131:40 | ... => ... | Switch.cs:129:12:129:14 | M12 | +| Switch.cs:131:40:131:40 | access to local variable s | Switch.cs:129:12:129:14 | M12 | +| Switch.cs:131:43:131:43 | _ | Switch.cs:129:12:129:14 | M12 | +| Switch.cs:131:43:131:51 | ... => ... | Switch.cs:129:12:129:14 | M12 | +| Switch.cs:131:48:131:51 | null | Switch.cs:129:12:129:14 | M12 | +| Switch.cs:131:56:131:66 | call to method ToString | Switch.cs:129:12:129:14 | M12 | +| TypeAccesses.cs:3:10:3:10 | enter M | TypeAccesses.cs:3:10:3:10 | M | +| TypeAccesses.cs:3:10:3:10 | exit M | TypeAccesses.cs:3:10:3:10 | M | +| TypeAccesses.cs:4:5:9:5 | {...} | TypeAccesses.cs:3:10:3:10 | M | +| TypeAccesses.cs:5:9:5:26 | ... ...; | TypeAccesses.cs:3:10:3:10 | M | +| TypeAccesses.cs:5:13:5:25 | String s = ... | TypeAccesses.cs:3:10:3:10 | M | +| TypeAccesses.cs:5:17:5:25 | (...) ... | TypeAccesses.cs:3:10:3:10 | M | +| TypeAccesses.cs:5:25:5:25 | access to parameter o | TypeAccesses.cs:3:10:3:10 | M | +| TypeAccesses.cs:6:9:6:23 | ... = ... | TypeAccesses.cs:3:10:3:10 | M | +| TypeAccesses.cs:6:9:6:24 | ...; | TypeAccesses.cs:3:10:3:10 | M | +| TypeAccesses.cs:6:13:6:13 | access to parameter o | TypeAccesses.cs:3:10:3:10 | M | +| TypeAccesses.cs:6:13:6:23 | ... as ... | TypeAccesses.cs:3:10:3:10 | M | +| TypeAccesses.cs:7:9:7:25 | if (...) ... | TypeAccesses.cs:3:10:3:10 | M | +| TypeAccesses.cs:7:13:7:13 | access to parameter o | TypeAccesses.cs:3:10:3:10 | M | +| TypeAccesses.cs:7:13:7:22 | ... is ... | TypeAccesses.cs:3:10:3:10 | M | +| TypeAccesses.cs:7:18:7:22 | Int32 j | TypeAccesses.cs:3:10:3:10 | M | +| TypeAccesses.cs:7:25:7:25 | ; | TypeAccesses.cs:3:10:3:10 | M | +| TypeAccesses.cs:8:9:8:28 | ... ...; | TypeAccesses.cs:3:10:3:10 | M | +| TypeAccesses.cs:8:13:8:27 | Type t = ... | TypeAccesses.cs:3:10:3:10 | M | +| TypeAccesses.cs:8:17:8:27 | typeof(...) | TypeAccesses.cs:3:10:3:10 | M | +| VarDecls.cs:5:18:5:19 | enter M1 | VarDecls.cs:5:18:5:19 | M1 | +| VarDecls.cs:5:18:5:19 | exit M1 | VarDecls.cs:5:18:5:19 | M1 | +| VarDecls.cs:6:5:11:5 | {...} | VarDecls.cs:5:18:5:19 | M1 | +| VarDecls.cs:7:9:10:9 | fixed(...) { ... } | VarDecls.cs:5:18:5:19 | M1 | +| VarDecls.cs:7:22:7:36 | Char* c1 = ... | VarDecls.cs:5:18:5:19 | M1 | +| VarDecls.cs:7:27:7:33 | access to parameter strings | VarDecls.cs:5:18:5:19 | M1 | +| VarDecls.cs:7:27:7:36 | access to array element | VarDecls.cs:5:18:5:19 | M1 | +| VarDecls.cs:7:35:7:35 | 0 | VarDecls.cs:5:18:5:19 | M1 | +| VarDecls.cs:7:39:7:53 | Char* c2 = ... | VarDecls.cs:5:18:5:19 | M1 | +| VarDecls.cs:7:44:7:50 | access to parameter strings | VarDecls.cs:5:18:5:19 | M1 | +| VarDecls.cs:7:44:7:53 | access to array element | VarDecls.cs:5:18:5:19 | M1 | +| VarDecls.cs:7:52:7:52 | 1 | VarDecls.cs:5:18:5:19 | M1 | +| VarDecls.cs:8:9:10:9 | {...} | VarDecls.cs:5:18:5:19 | M1 | +| VarDecls.cs:9:13:9:29 | return ...; | VarDecls.cs:5:18:5:19 | M1 | +| VarDecls.cs:9:20:9:28 | (...) ... | VarDecls.cs:5:18:5:19 | M1 | +| VarDecls.cs:9:27:9:28 | access to local variable c1 | VarDecls.cs:5:18:5:19 | M1 | +| VarDecls.cs:13:12:13:13 | enter M2 | VarDecls.cs:13:12:13:13 | M2 | +| VarDecls.cs:13:12:13:13 | exit M2 | VarDecls.cs:13:12:13:13 | M2 | +| VarDecls.cs:14:5:17:5 | {...} | VarDecls.cs:13:12:13:13 | M2 | +| VarDecls.cs:15:9:15:30 | ... ...; | VarDecls.cs:13:12:13:13 | M2 | +| VarDecls.cs:15:16:15:21 | String s1 = ... | VarDecls.cs:13:12:13:13 | M2 | +| VarDecls.cs:15:21:15:21 | access to parameter s | VarDecls.cs:13:12:13:13 | M2 | +| VarDecls.cs:15:24:15:29 | String s2 = ... | VarDecls.cs:13:12:13:13 | M2 | +| VarDecls.cs:15:29:15:29 | access to parameter s | VarDecls.cs:13:12:13:13 | M2 | +| VarDecls.cs:16:9:16:23 | return ...; | VarDecls.cs:13:12:13:13 | M2 | +| VarDecls.cs:16:16:16:17 | access to local variable s1 | VarDecls.cs:13:12:13:13 | M2 | +| VarDecls.cs:16:16:16:22 | ... + ... | VarDecls.cs:13:12:13:13 | M2 | +| VarDecls.cs:16:21:16:22 | access to local variable s2 | VarDecls.cs:13:12:13:13 | M2 | +| VarDecls.cs:19:7:19:8 | enter M3 | VarDecls.cs:19:7:19:8 | M3 | +| VarDecls.cs:19:7:19:8 | exit M3 | VarDecls.cs:19:7:19:8 | M3 | +| VarDecls.cs:20:5:26:5 | {...} | VarDecls.cs:19:7:19:8 | M3 | +| VarDecls.cs:21:9:22:13 | using (...) {...} | VarDecls.cs:19:7:19:8 | M3 | +| VarDecls.cs:21:16:21:22 | object creation of type C | VarDecls.cs:19:7:19:8 | M3 | +| VarDecls.cs:22:13:22:13 | ; | VarDecls.cs:19:7:19:8 | M3 | +| VarDecls.cs:24:9:25:29 | using (...) {...} | VarDecls.cs:19:7:19:8 | M3 | +| VarDecls.cs:24:18:24:28 | C x = ... | VarDecls.cs:19:7:19:8 | M3 | +| VarDecls.cs:24:22:24:28 | object creation of type C | VarDecls.cs:19:7:19:8 | M3 | +| VarDecls.cs:24:31:24:41 | C y = ... | VarDecls.cs:19:7:19:8 | M3 | +| VarDecls.cs:24:35:24:41 | object creation of type C | VarDecls.cs:19:7:19:8 | M3 | +| VarDecls.cs:25:13:25:29 | return ...; | VarDecls.cs:19:7:19:8 | M3 | +| VarDecls.cs:25:20:25:20 | access to parameter b | VarDecls.cs:19:7:19:8 | M3 | +| VarDecls.cs:25:20:25:28 | ... ? ... : ... | VarDecls.cs:19:7:19:8 | M3 | +| VarDecls.cs:25:24:25:24 | access to local variable x | VarDecls.cs:19:7:19:8 | M3 | +| VarDecls.cs:25:28:25:28 | access to local variable y | VarDecls.cs:19:7:19:8 | M3 | +| VarDecls.cs:28:41:28:47 | enter Dispose | VarDecls.cs:28:41:28:47 | Dispose | +| VarDecls.cs:28:41:28:47 | exit Dispose | VarDecls.cs:28:41:28:47 | Dispose | +| VarDecls.cs:28:51:28:53 | {...} | VarDecls.cs:28:41:28:47 | Dispose | +| cflow.cs:5:17:5:20 | enter Main | cflow.cs:5:17:5:20 | Main | +| cflow.cs:5:17:5:20 | exit Main | cflow.cs:5:17:5:20 | Main | +| cflow.cs:6:5:35:5 | {...} | cflow.cs:5:17:5:20 | Main | +| cflow.cs:7:9:7:28 | ... ...; | cflow.cs:5:17:5:20 | Main | +| cflow.cs:7:13:7:27 | Int32 a = ... | cflow.cs:5:17:5:20 | Main | +| cflow.cs:7:17:7:20 | access to parameter args | cflow.cs:5:17:5:20 | Main | +| cflow.cs:7:17:7:27 | access to property Length | cflow.cs:5:17:5:20 | Main | +| cflow.cs:9:9:9:39 | ... = ... | cflow.cs:5:17:5:20 | Main | +| cflow.cs:9:9:9:40 | ...; | cflow.cs:5:17:5:20 | Main | +| cflow.cs:9:13:9:29 | object creation of type ControlFlow | cflow.cs:5:17:5:20 | Main | +| cflow.cs:9:13:9:39 | call to method Switch | cflow.cs:5:17:5:20 | Main | +| cflow.cs:9:38:9:38 | access to local variable a | cflow.cs:5:17:5:20 | Main | +| cflow.cs:11:9:12:49 | if (...) ... | cflow.cs:5:17:5:20 | Main | +| cflow.cs:11:13:11:13 | access to local variable a | cflow.cs:5:17:5:20 | Main | +| cflow.cs:11:13:11:17 | ... > ... | cflow.cs:5:17:5:20 | Main | +| cflow.cs:11:17:11:17 | 3 | cflow.cs:5:17:5:20 | Main | +| cflow.cs:12:13:12:48 | call to method WriteLine | cflow.cs:5:17:5:20 | Main | +| cflow.cs:12:13:12:49 | ...; | cflow.cs:5:17:5:20 | Main | +| cflow.cs:12:31:12:47 | "more than a few" | cflow.cs:5:17:5:20 | Main | +| cflow.cs:14:9:17:9 | while (...) ... | cflow.cs:5:17:5:20 | Main | +| cflow.cs:14:16:14:16 | access to local variable a | cflow.cs:5:17:5:20 | Main | +| cflow.cs:14:16:14:20 | ... > ... | cflow.cs:5:17:5:20 | Main | +| cflow.cs:14:20:14:20 | 0 | cflow.cs:5:17:5:20 | Main | +| cflow.cs:15:9:17:9 | {...} | cflow.cs:5:17:5:20 | Main | +| cflow.cs:16:13:16:40 | call to method WriteLine | cflow.cs:5:17:5:20 | Main | +| cflow.cs:16:13:16:41 | ...; | cflow.cs:5:17:5:20 | Main | +| cflow.cs:16:31:16:31 | access to local variable a | cflow.cs:5:17:5:20 | Main | +| cflow.cs:16:31:16:33 | ...-- | cflow.cs:5:17:5:20 | Main | +| cflow.cs:16:31:16:39 | ... * ... | cflow.cs:5:17:5:20 | Main | +| cflow.cs:16:37:16:39 | 100 | cflow.cs:5:17:5:20 | Main | +| cflow.cs:19:9:22:25 | do ... while (...); | cflow.cs:5:17:5:20 | Main | +| cflow.cs:20:9:22:9 | {...} | cflow.cs:5:17:5:20 | Main | +| cflow.cs:21:13:21:35 | call to method WriteLine | cflow.cs:5:17:5:20 | Main | +| cflow.cs:21:13:21:36 | ...; | cflow.cs:5:17:5:20 | Main | +| cflow.cs:21:31:21:34 | -... | cflow.cs:5:17:5:20 | Main | +| cflow.cs:21:32:21:32 | access to local variable a | cflow.cs:5:17:5:20 | Main | +| cflow.cs:21:32:21:34 | ...++ | cflow.cs:5:17:5:20 | Main | +| cflow.cs:22:18:22:18 | access to local variable a | cflow.cs:5:17:5:20 | Main | +| cflow.cs:22:18:22:23 | ... < ... | cflow.cs:5:17:5:20 | Main | +| cflow.cs:22:22:22:23 | 10 | cflow.cs:5:17:5:20 | Main | +| cflow.cs:24:9:34:9 | for (...;...;...) ... | cflow.cs:5:17:5:20 | Main | +| cflow.cs:24:18:24:22 | Int32 i = ... | cflow.cs:5:17:5:20 | Main | +| cflow.cs:24:22:24:22 | 1 | cflow.cs:5:17:5:20 | Main | +| cflow.cs:24:25:24:25 | access to local variable i | cflow.cs:5:17:5:20 | Main | +| cflow.cs:24:25:24:31 | ... <= ... | cflow.cs:5:17:5:20 | Main | +| cflow.cs:24:30:24:31 | 20 | cflow.cs:5:17:5:20 | Main | +| cflow.cs:24:34:24:34 | access to local variable i | cflow.cs:5:17:5:20 | Main | +| cflow.cs:24:34:24:36 | ...++ | cflow.cs:5:17:5:20 | Main | +| cflow.cs:25:9:34:9 | {...} | cflow.cs:5:17:5:20 | Main | +| cflow.cs:26:13:33:37 | if (...) ... | cflow.cs:5:17:5:20 | Main | +| cflow.cs:26:17:26:17 | access to local variable i | cflow.cs:5:17:5:20 | Main | +| cflow.cs:26:17:26:21 | ... % ... | cflow.cs:5:17:5:20 | Main | +| cflow.cs:26:17:26:26 | ... == ... | cflow.cs:5:17:5:20 | Main | +| cflow.cs:26:17:26:40 | ... && ... | cflow.cs:5:17:5:20 | Main | +| cflow.cs:26:21:26:21 | 3 | cflow.cs:5:17:5:20 | Main | +| cflow.cs:26:26:26:26 | 0 | cflow.cs:5:17:5:20 | Main | +| cflow.cs:26:31:26:31 | access to local variable i | cflow.cs:5:17:5:20 | Main | +| cflow.cs:26:31:26:35 | ... % ... | cflow.cs:5:17:5:20 | Main | +| cflow.cs:26:31:26:40 | ... == ... | cflow.cs:5:17:5:20 | Main | +| cflow.cs:26:35:26:35 | 5 | cflow.cs:5:17:5:20 | Main | +| cflow.cs:26:40:26:40 | 0 | cflow.cs:5:17:5:20 | Main | +| cflow.cs:27:17:27:45 | call to method WriteLine | cflow.cs:5:17:5:20 | Main | +| cflow.cs:27:17:27:46 | ...; | cflow.cs:5:17:5:20 | Main | +| cflow.cs:27:35:27:44 | "FizzBuzz" | cflow.cs:5:17:5:20 | Main | +| cflow.cs:28:18:33:37 | if (...) ... | cflow.cs:5:17:5:20 | Main | +| cflow.cs:28:22:28:22 | access to local variable i | cflow.cs:5:17:5:20 | Main | +| cflow.cs:28:22:28:26 | ... % ... | cflow.cs:5:17:5:20 | Main | +| cflow.cs:28:22:28:31 | ... == ... | cflow.cs:5:17:5:20 | Main | +| cflow.cs:28:26:28:26 | 3 | cflow.cs:5:17:5:20 | Main | +| cflow.cs:28:31:28:31 | 0 | cflow.cs:5:17:5:20 | Main | +| cflow.cs:29:17:29:41 | call to method WriteLine | cflow.cs:5:17:5:20 | Main | +| cflow.cs:29:17:29:42 | ...; | cflow.cs:5:17:5:20 | Main | +| cflow.cs:29:35:29:40 | "Fizz" | cflow.cs:5:17:5:20 | Main | +| cflow.cs:30:18:33:37 | if (...) ... | cflow.cs:5:17:5:20 | Main | +| cflow.cs:30:22:30:22 | access to local variable i | cflow.cs:5:17:5:20 | Main | +| cflow.cs:30:22:30:26 | ... % ... | cflow.cs:5:17:5:20 | Main | +| cflow.cs:30:22:30:31 | ... == ... | cflow.cs:5:17:5:20 | Main | +| cflow.cs:30:26:30:26 | 5 | cflow.cs:5:17:5:20 | Main | +| cflow.cs:30:31:30:31 | 0 | cflow.cs:5:17:5:20 | Main | +| cflow.cs:31:17:31:41 | call to method WriteLine | cflow.cs:5:17:5:20 | Main | +| cflow.cs:31:17:31:42 | ...; | cflow.cs:5:17:5:20 | Main | +| cflow.cs:31:35:31:40 | "Buzz" | cflow.cs:5:17:5:20 | Main | +| cflow.cs:33:17:33:36 | call to method WriteLine | cflow.cs:5:17:5:20 | Main | +| cflow.cs:33:17:33:37 | ...; | cflow.cs:5:17:5:20 | Main | +| cflow.cs:33:35:33:35 | access to local variable i | cflow.cs:5:17:5:20 | Main | +| cflow.cs:37:17:37:22 | enter Switch | cflow.cs:37:17:37:22 | Switch | +| cflow.cs:37:17:37:22 | exit Switch | cflow.cs:37:17:37:22 | Switch | +| cflow.cs:38:5:68:5 | {...} | cflow.cs:37:17:37:22 | Switch | +| cflow.cs:39:9:50:9 | switch (...) {...} | cflow.cs:37:17:37:22 | Switch | +| cflow.cs:39:17:39:17 | access to parameter a | cflow.cs:37:17:37:22 | Switch | +| cflow.cs:41:13:41:19 | case ...: | cflow.cs:37:17:37:22 | Switch | +| cflow.cs:41:18:41:18 | 1 | cflow.cs:37:17:37:22 | Switch | +| cflow.cs:42:17:42:38 | call to method WriteLine | cflow.cs:37:17:37:22 | Switch | +| cflow.cs:42:17:42:39 | ...; | cflow.cs:37:17:37:22 | Switch | +| cflow.cs:42:35:42:37 | "1" | cflow.cs:37:17:37:22 | Switch | +| cflow.cs:43:17:43:28 | goto case ...; | cflow.cs:37:17:37:22 | Switch | +| cflow.cs:43:27:43:27 | 2 | cflow.cs:37:17:37:22 | Switch | +| cflow.cs:44:13:44:19 | case ...: | cflow.cs:37:17:37:22 | Switch | +| cflow.cs:44:18:44:18 | 2 | cflow.cs:37:17:37:22 | Switch | +| cflow.cs:45:17:45:38 | call to method WriteLine | cflow.cs:37:17:37:22 | Switch | +| cflow.cs:45:17:45:39 | ...; | cflow.cs:37:17:37:22 | Switch | +| cflow.cs:45:35:45:37 | "2" | cflow.cs:37:17:37:22 | Switch | +| cflow.cs:46:17:46:28 | goto case ...; | cflow.cs:37:17:37:22 | Switch | +| cflow.cs:46:27:46:27 | 1 | cflow.cs:37:17:37:22 | Switch | +| cflow.cs:47:13:47:19 | case ...: | cflow.cs:37:17:37:22 | Switch | +| cflow.cs:47:18:47:18 | 3 | cflow.cs:37:17:37:22 | Switch | +| cflow.cs:48:17:48:38 | call to method WriteLine | cflow.cs:37:17:37:22 | Switch | +| cflow.cs:48:17:48:39 | ...; | cflow.cs:37:17:37:22 | Switch | +| cflow.cs:48:35:48:37 | "3" | cflow.cs:37:17:37:22 | Switch | +| cflow.cs:49:17:49:22 | break; | cflow.cs:37:17:37:22 | Switch | +| cflow.cs:51:9:59:9 | switch (...) {...} | cflow.cs:37:17:37:22 | Switch | +| cflow.cs:51:17:51:17 | access to parameter a | cflow.cs:37:17:37:22 | Switch | +| cflow.cs:53:13:53:20 | case ...: | cflow.cs:37:17:37:22 | Switch | +| cflow.cs:53:18:53:19 | 42 | cflow.cs:37:17:37:22 | Switch | +| cflow.cs:54:17:54:47 | call to method WriteLine | cflow.cs:37:17:37:22 | Switch | +| cflow.cs:54:17:54:48 | ...; | cflow.cs:37:17:37:22 | Switch | +| cflow.cs:54:35:54:46 | "The answer" | cflow.cs:37:17:37:22 | Switch | +| cflow.cs:55:17:55:22 | break; | cflow.cs:37:17:37:22 | Switch | +| cflow.cs:56:13:56:20 | default: | cflow.cs:37:17:37:22 | Switch | +| cflow.cs:57:17:57:51 | call to method WriteLine | cflow.cs:37:17:37:22 | Switch | +| cflow.cs:57:17:57:52 | ...; | cflow.cs:37:17:37:22 | Switch | +| cflow.cs:57:35:57:50 | "Not the answer" | cflow.cs:37:17:37:22 | Switch | +| cflow.cs:58:17:58:22 | break; | cflow.cs:37:17:37:22 | Switch | +| cflow.cs:60:9:66:9 | switch (...) {...} | cflow.cs:37:17:37:22 | Switch | +| cflow.cs:60:17:60:32 | call to method Parse | cflow.cs:37:17:37:22 | Switch | +| cflow.cs:60:27:60:31 | access to field Field | cflow.cs:37:17:37:22 | Switch | +| cflow.cs:60:27:60:31 | this access | cflow.cs:37:17:37:22 | Switch | +| cflow.cs:62:13:62:19 | case ...: | cflow.cs:37:17:37:22 | Switch | +| cflow.cs:62:18:62:18 | 0 | cflow.cs:37:17:37:22 | Switch | +| cflow.cs:63:17:64:55 | if (...) ... | cflow.cs:37:17:37:22 | Switch | +| cflow.cs:63:21:63:34 | !... | cflow.cs:37:17:37:22 | Switch | +| cflow.cs:63:23:63:27 | access to field Field | cflow.cs:37:17:37:22 | Switch | +| cflow.cs:63:23:63:27 | this access | cflow.cs:37:17:37:22 | Switch | +| cflow.cs:63:23:63:33 | ... == ... | cflow.cs:37:17:37:22 | Switch | +| cflow.cs:63:32:63:33 | "" | cflow.cs:37:17:37:22 | Switch | +| cflow.cs:64:21:64:55 | throw ...; | cflow.cs:37:17:37:22 | Switch | +| cflow.cs:64:27:64:54 | object creation of type NullReferenceException | cflow.cs:37:17:37:22 | Switch | +| cflow.cs:65:17:65:22 | break; | cflow.cs:37:17:37:22 | Switch | +| cflow.cs:67:9:67:17 | return ...; | cflow.cs:37:17:37:22 | Switch | +| cflow.cs:67:16:67:16 | access to parameter a | cflow.cs:37:17:37:22 | Switch | +| cflow.cs:70:18:70:18 | enter M | cflow.cs:70:18:70:18 | M | +| cflow.cs:70:18:70:18 | exit M | cflow.cs:70:18:70:18 | M | +| cflow.cs:71:5:82:5 | {...} | cflow.cs:70:18:70:18 | M | +| cflow.cs:72:9:73:19 | if (...) ... | cflow.cs:70:18:70:18 | M | +| cflow.cs:72:13:72:13 | access to parameter s | cflow.cs:70:18:70:18 | M | +| cflow.cs:72:13:72:21 | ... == ... | cflow.cs:70:18:70:18 | M | +| cflow.cs:72:18:72:21 | null | cflow.cs:70:18:70:18 | M | +| cflow.cs:73:13:73:19 | return ...; | cflow.cs:70:18:70:18 | M | +| cflow.cs:74:9:81:9 | if (...) ... | cflow.cs:70:18:70:18 | M | +| cflow.cs:74:13:74:13 | access to parameter s | cflow.cs:70:18:70:18 | M | +| cflow.cs:74:13:74:20 | access to property Length | cflow.cs:70:18:70:18 | M | +| cflow.cs:74:13:74:24 | ... > ... | cflow.cs:70:18:70:18 | M | +| cflow.cs:74:24:74:24 | 0 | cflow.cs:70:18:70:18 | M | +| cflow.cs:75:9:77:9 | {...} | cflow.cs:70:18:70:18 | M | +| cflow.cs:76:13:76:32 | call to method WriteLine | cflow.cs:70:18:70:18 | M | +| cflow.cs:76:13:76:33 | ...; | cflow.cs:70:18:70:18 | M | +| cflow.cs:76:31:76:31 | access to parameter s | cflow.cs:70:18:70:18 | M | +| cflow.cs:79:9:81:9 | {...} | cflow.cs:70:18:70:18 | M | +| cflow.cs:80:13:80:47 | call to method WriteLine | cflow.cs:70:18:70:18 | M | +| cflow.cs:80:13:80:48 | ...; | cflow.cs:70:18:70:18 | M | +| cflow.cs:80:31:80:46 | "" | cflow.cs:70:18:70:18 | M | +| cflow.cs:84:18:84:19 | enter M2 | cflow.cs:84:18:84:19 | M2 | +| cflow.cs:84:18:84:19 | exit M2 | cflow.cs:84:18:84:19 | M2 | +| cflow.cs:85:5:88:5 | {...} | cflow.cs:84:18:84:19 | M2 | +| cflow.cs:86:9:87:33 | if (...) ... | cflow.cs:84:18:84:19 | M2 | +| cflow.cs:86:13:86:13 | access to parameter s | cflow.cs:84:18:84:19 | M2 | +| cflow.cs:86:13:86:21 | ... != ... | cflow.cs:84:18:84:19 | M2 | +| cflow.cs:86:13:86:37 | ... && ... | cflow.cs:84:18:84:19 | M2 | +| cflow.cs:86:18:86:21 | null | cflow.cs:84:18:84:19 | M2 | +| cflow.cs:86:26:86:26 | access to parameter s | cflow.cs:84:18:84:19 | M2 | +| cflow.cs:86:26:86:33 | access to property Length | cflow.cs:84:18:84:19 | M2 | +| cflow.cs:86:26:86:37 | ... > ... | cflow.cs:84:18:84:19 | M2 | +| cflow.cs:86:37:86:37 | 0 | cflow.cs:84:18:84:19 | M2 | +| cflow.cs:87:13:87:32 | call to method WriteLine | cflow.cs:84:18:84:19 | M2 | +| cflow.cs:87:13:87:33 | ...; | cflow.cs:84:18:84:19 | M2 | +| cflow.cs:87:31:87:31 | access to parameter s | cflow.cs:84:18:84:19 | M2 | +| cflow.cs:90:18:90:19 | enter M3 | cflow.cs:90:18:90:19 | M3 | +| cflow.cs:90:18:90:19 | exit M3 | cflow.cs:90:18:90:19 | M3 | +| cflow.cs:91:5:104:5 | {...} | cflow.cs:90:18:90:19 | M3 | +| cflow.cs:92:9:93:49 | if (...) ... | cflow.cs:90:18:90:19 | M3 | +| cflow.cs:92:13:92:27 | call to method Equals | cflow.cs:90:18:90:19 | M3 | +| cflow.cs:92:20:92:20 | access to parameter s | cflow.cs:90:18:90:19 | M3 | +| cflow.cs:92:23:92:26 | null | cflow.cs:90:18:90:19 | M3 | +| cflow.cs:93:13:93:49 | throw ...; | cflow.cs:90:18:90:19 | M3 | +| cflow.cs:93:19:93:48 | object creation of type ArgumentNullException | cflow.cs:90:18:90:19 | M3 | +| cflow.cs:93:45:93:47 | "s" | cflow.cs:90:18:90:19 | M3 | +| cflow.cs:94:9:94:28 | call to method WriteLine | cflow.cs:90:18:90:19 | M3 | +| cflow.cs:94:9:94:29 | ...; | cflow.cs:90:18:90:19 | M3 | +| cflow.cs:94:27:94:27 | access to parameter s | cflow.cs:90:18:90:19 | M3 | +| cflow.cs:96:9:97:55 | if (...) ... | cflow.cs:90:18:90:19 | M3 | +| cflow.cs:96:13:96:17 | access to field Field | cflow.cs:90:18:90:19 | M3 | +| cflow.cs:96:13:96:17 | this access | cflow.cs:90:18:90:19 | M3 | +| cflow.cs:96:13:96:25 | ... != ... | cflow.cs:90:18:90:19 | M3 | +| cflow.cs:96:22:96:25 | null | cflow.cs:90:18:90:19 | M3 | +| cflow.cs:97:13:97:54 | call to method WriteLine | cflow.cs:90:18:90:19 | M3 | +| cflow.cs:97:13:97:55 | ...; | cflow.cs:90:18:90:19 | M3 | +| cflow.cs:97:31:97:47 | object creation of type ControlFlow | cflow.cs:90:18:90:19 | M3 | +| cflow.cs:97:31:97:53 | access to field Field | cflow.cs:90:18:90:19 | M3 | +| cflow.cs:99:9:100:42 | if (...) ... | cflow.cs:90:18:90:19 | M3 | +| cflow.cs:99:13:99:17 | access to field Field | cflow.cs:90:18:90:19 | M3 | +| cflow.cs:99:13:99:17 | this access | cflow.cs:90:18:90:19 | M3 | +| cflow.cs:99:13:99:25 | ... != ... | cflow.cs:90:18:90:19 | M3 | +| cflow.cs:99:22:99:25 | null | cflow.cs:90:18:90:19 | M3 | +| cflow.cs:100:13:100:41 | call to method WriteLine | cflow.cs:90:18:90:19 | M3 | +| cflow.cs:100:13:100:42 | ...; | cflow.cs:90:18:90:19 | M3 | +| cflow.cs:100:31:100:34 | this access | cflow.cs:90:18:90:19 | M3 | +| cflow.cs:100:31:100:40 | access to field Field | cflow.cs:90:18:90:19 | M3 | +| cflow.cs:102:9:103:36 | if (...) ... | cflow.cs:90:18:90:19 | M3 | +| cflow.cs:102:13:102:16 | this access | cflow.cs:90:18:90:19 | M3 | +| cflow.cs:102:13:102:21 | access to property Prop | cflow.cs:90:18:90:19 | M3 | +| cflow.cs:102:13:102:29 | ... != ... | cflow.cs:90:18:90:19 | M3 | +| cflow.cs:102:26:102:29 | null | cflow.cs:90:18:90:19 | M3 | +| cflow.cs:103:13:103:35 | call to method WriteLine | cflow.cs:90:18:90:19 | M3 | +| cflow.cs:103:13:103:36 | ...; | cflow.cs:90:18:90:19 | M3 | +| cflow.cs:103:31:103:34 | access to property Prop | cflow.cs:90:18:90:19 | M3 | +| cflow.cs:103:31:103:34 | this access | cflow.cs:90:18:90:19 | M3 | +| cflow.cs:106:18:106:19 | enter M4 | cflow.cs:106:18:106:19 | M4 | +| cflow.cs:106:18:106:19 | exit M4 | cflow.cs:106:18:106:19 | M4 | +| cflow.cs:107:5:117:5 | {...} | cflow.cs:106:18:106:19 | M4 | +| cflow.cs:108:9:115:9 | if (...) ... | cflow.cs:106:18:106:19 | M4 | +| cflow.cs:108:13:108:13 | access to parameter s | cflow.cs:106:18:106:19 | M4 | +| cflow.cs:108:13:108:21 | ... != ... | cflow.cs:106:18:106:19 | M4 | +| cflow.cs:108:18:108:21 | null | cflow.cs:106:18:106:19 | M4 | +| cflow.cs:109:9:115:9 | {...} | cflow.cs:106:18:106:19 | M4 | +| cflow.cs:110:13:113:13 | while (...) ... | cflow.cs:106:18:106:19 | M4 | +| cflow.cs:110:20:110:23 | true | cflow.cs:106:18:106:19 | M4 | +| cflow.cs:111:13:113:13 | {...} | cflow.cs:106:18:106:19 | M4 | +| cflow.cs:112:17:112:36 | call to method WriteLine | cflow.cs:106:18:106:19 | M4 | +| cflow.cs:112:17:112:37 | ...; | cflow.cs:106:18:106:19 | M4 | +| cflow.cs:112:35:112:35 | access to parameter s | cflow.cs:106:18:106:19 | M4 | +| cflow.cs:116:9:116:28 | call to method WriteLine | cflow.cs:106:18:106:19 | M4 | +| cflow.cs:116:9:116:29 | ...; | cflow.cs:106:18:106:19 | M4 | +| cflow.cs:116:27:116:27 | access to parameter s | cflow.cs:106:18:106:19 | M4 | +| cflow.cs:119:20:119:21 | enter M5 | cflow.cs:119:20:119:21 | M5 | +| cflow.cs:119:20:119:21 | exit M5 | cflow.cs:119:20:119:21 | M5 | +| cflow.cs:120:5:124:5 | {...} | cflow.cs:119:20:119:21 | M5 | +| cflow.cs:121:9:121:18 | ... ...; | cflow.cs:119:20:119:21 | M5 | +| cflow.cs:121:13:121:17 | String x = ... | cflow.cs:119:20:119:21 | M5 | +| cflow.cs:121:17:121:17 | access to parameter s | cflow.cs:119:20:119:21 | M5 | +| cflow.cs:122:9:122:19 | ... = ... | cflow.cs:119:20:119:21 | M5 | +| cflow.cs:122:9:122:20 | ...; | cflow.cs:119:20:119:21 | M5 | +| cflow.cs:122:13:122:13 | access to local variable x | cflow.cs:119:20:119:21 | M5 | +| cflow.cs:122:13:122:19 | ... + ... | cflow.cs:119:20:119:21 | M5 | +| cflow.cs:122:17:122:19 | " " | cflow.cs:119:20:119:21 | M5 | +| cflow.cs:123:9:123:17 | return ...; | cflow.cs:119:20:119:21 | M5 | +| cflow.cs:123:16:123:16 | access to local variable x | cflow.cs:119:20:119:21 | M5 | +| cflow.cs:127:19:127:21 | enter get_Prop | cflow.cs:127:19:127:21 | get_Prop | +| cflow.cs:127:19:127:21 | exit get_Prop | cflow.cs:127:19:127:21 | get_Prop | +| cflow.cs:127:23:127:60 | {...} | cflow.cs:127:19:127:21 | get_Prop | +| cflow.cs:127:25:127:58 | return ...; | cflow.cs:127:19:127:21 | get_Prop | +| cflow.cs:127:32:127:36 | access to field Field | cflow.cs:127:19:127:21 | get_Prop | +| cflow.cs:127:32:127:36 | this access | cflow.cs:127:19:127:21 | get_Prop | +| cflow.cs:127:32:127:44 | ... == ... | cflow.cs:127:19:127:21 | get_Prop | +| cflow.cs:127:32:127:57 | ... ? ... : ... | cflow.cs:127:19:127:21 | get_Prop | +| cflow.cs:127:41:127:44 | null | cflow.cs:127:19:127:21 | get_Prop | +| cflow.cs:127:48:127:49 | "" | cflow.cs:127:19:127:21 | get_Prop | +| cflow.cs:127:53:127:57 | access to field Field | cflow.cs:127:19:127:21 | get_Prop | +| cflow.cs:127:53:127:57 | this access | cflow.cs:127:19:127:21 | get_Prop | +| cflow.cs:127:62:127:64 | enter set_Prop | cflow.cs:127:62:127:64 | set_Prop | +| cflow.cs:127:62:127:64 | exit set_Prop | cflow.cs:127:62:127:64 | set_Prop | +| cflow.cs:127:66:127:83 | {...} | cflow.cs:127:62:127:64 | set_Prop | +| cflow.cs:127:68:127:72 | this access | cflow.cs:127:62:127:64 | set_Prop | +| cflow.cs:127:68:127:80 | ... = ... | cflow.cs:127:62:127:64 | set_Prop | +| cflow.cs:127:68:127:81 | ...; | cflow.cs:127:62:127:64 | set_Prop | +| cflow.cs:127:76:127:80 | access to parameter value | cflow.cs:127:62:127:64 | set_Prop | +| cflow.cs:129:5:129:15 | enter ControlFlow | cflow.cs:129:5:129:15 | ControlFlow | +| cflow.cs:129:5:129:15 | exit ControlFlow | cflow.cs:129:5:129:15 | ControlFlow | +| cflow.cs:130:5:132:5 | {...} | cflow.cs:129:5:129:15 | ControlFlow | +| cflow.cs:131:9:131:13 | this access | cflow.cs:129:5:129:15 | ControlFlow | +| cflow.cs:131:9:131:17 | ... = ... | cflow.cs:129:5:129:15 | ControlFlow | +| cflow.cs:131:9:131:18 | ...; | cflow.cs:129:5:129:15 | ControlFlow | +| cflow.cs:131:17:131:17 | access to parameter s | cflow.cs:129:5:129:15 | ControlFlow | +| cflow.cs:134:5:134:15 | enter ControlFlow | cflow.cs:134:5:134:15 | ControlFlow | +| cflow.cs:134:5:134:15 | exit ControlFlow | cflow.cs:134:5:134:15 | ControlFlow | +| cflow.cs:134:26:134:29 | call to constructor ControlFlow | cflow.cs:134:5:134:15 | ControlFlow | +| cflow.cs:134:31:134:31 | (...) ... | cflow.cs:134:5:134:15 | ControlFlow | +| cflow.cs:134:31:134:31 | access to parameter i | cflow.cs:134:5:134:15 | ControlFlow | +| cflow.cs:134:31:134:36 | ... + ... | cflow.cs:134:5:134:15 | ControlFlow | +| cflow.cs:134:35:134:36 | "" | cflow.cs:134:5:134:15 | ControlFlow | +| cflow.cs:134:39:134:41 | {...} | cflow.cs:134:5:134:15 | ControlFlow | +| cflow.cs:136:12:136:22 | enter ControlFlow | cflow.cs:136:12:136:22 | ControlFlow | +| cflow.cs:136:12:136:22 | exit ControlFlow | cflow.cs:136:12:136:22 | ControlFlow | +| cflow.cs:136:28:136:31 | call to constructor ControlFlow | cflow.cs:136:12:136:22 | ControlFlow | +| cflow.cs:136:33:136:33 | 0 | cflow.cs:136:12:136:22 | ControlFlow | +| cflow.cs:136:33:136:37 | ... + ... | cflow.cs:136:12:136:22 | ControlFlow | +| cflow.cs:136:37:136:37 | 1 | cflow.cs:136:12:136:22 | ControlFlow | +| cflow.cs:136:40:136:42 | {...} | cflow.cs:136:12:136:22 | ControlFlow | +| cflow.cs:138:40:138:40 | enter + | cflow.cs:138:40:138:40 | + | +| cflow.cs:138:40:138:40 | exit + | cflow.cs:138:40:138:40 | + | +| cflow.cs:139:5:142:5 | {...} | cflow.cs:138:40:138:40 | + | +| cflow.cs:140:9:140:28 | call to method WriteLine | cflow.cs:138:40:138:40 | + | +| cflow.cs:140:9:140:29 | ...; | cflow.cs:138:40:138:40 | + | +| cflow.cs:140:27:140:27 | access to parameter x | cflow.cs:138:40:138:40 | + | +| cflow.cs:141:9:141:17 | return ...; | cflow.cs:138:40:138:40 | + | +| cflow.cs:141:16:141:16 | access to parameter y | cflow.cs:138:40:138:40 | + | +| cflow.cs:144:33:144:35 | enter get_Item | cflow.cs:144:33:144:35 | get_Item | +| cflow.cs:144:33:144:35 | exit get_Item | cflow.cs:144:33:144:35 | get_Item | +| cflow.cs:144:37:144:54 | {...} | cflow.cs:144:33:144:35 | get_Item | +| cflow.cs:144:39:144:52 | return ...; | cflow.cs:144:33:144:35 | get_Item | +| cflow.cs:144:46:144:46 | (...) ... | cflow.cs:144:33:144:35 | get_Item | +| cflow.cs:144:46:144:46 | access to parameter i | cflow.cs:144:33:144:35 | get_Item | +| cflow.cs:144:46:144:51 | ... + ... | cflow.cs:144:33:144:35 | get_Item | +| cflow.cs:144:50:144:51 | "" | cflow.cs:144:33:144:35 | get_Item | +| cflow.cs:144:56:144:58 | enter set_Item | cflow.cs:144:56:144:58 | set_Item | +| cflow.cs:144:56:144:58 | exit set_Item | cflow.cs:144:56:144:58 | set_Item | +| cflow.cs:144:60:144:62 | {...} | cflow.cs:144:56:144:58 | set_Item | +| cflow.cs:146:10:146:19 | enter TryFinally | cflow.cs:146:10:146:19 | TryFinally | +| cflow.cs:146:10:146:19 | exit TryFinally | cflow.cs:146:10:146:19 | TryFinally | +| cflow.cs:147:5:255:5 | {...} | cflow.cs:146:10:146:19 | TryFinally | +| cflow.cs:148:9:155:9 | try {...} ... | cflow.cs:146:10:146:19 | TryFinally | +| cflow.cs:149:9:151:9 | {...} | cflow.cs:146:10:146:19 | TryFinally | +| cflow.cs:150:13:150:37 | call to method WriteLine | cflow.cs:146:10:146:19 | TryFinally | +| cflow.cs:150:13:150:38 | ...; | cflow.cs:146:10:146:19 | TryFinally | +| cflow.cs:150:31:150:36 | "Try1" | cflow.cs:146:10:146:19 | TryFinally | +| cflow.cs:153:9:155:9 | [finally: exception(Exception)] {...} | cflow.cs:146:10:146:19 | TryFinally | +| cflow.cs:153:9:155:9 | [finally: exception(OutOfMemoryException)] {...} | cflow.cs:146:10:146:19 | TryFinally | +| cflow.cs:153:9:155:9 | {...} | cflow.cs:146:10:146:19 | TryFinally | +| cflow.cs:154:13:154:40 | [finally: exception(Exception)] call to method WriteLine | cflow.cs:146:10:146:19 | TryFinally | +| cflow.cs:154:13:154:40 | [finally: exception(OutOfMemoryException)] call to method WriteLine | cflow.cs:146:10:146:19 | TryFinally | +| cflow.cs:154:13:154:40 | call to method WriteLine | cflow.cs:146:10:146:19 | TryFinally | +| cflow.cs:154:13:154:41 | ...; | cflow.cs:146:10:146:19 | TryFinally | +| cflow.cs:154:13:154:41 | [finally: exception(Exception)] ...; | cflow.cs:146:10:146:19 | TryFinally | +| cflow.cs:154:13:154:41 | [finally: exception(OutOfMemoryException)] ...; | cflow.cs:146:10:146:19 | TryFinally | +| cflow.cs:154:31:154:39 | "Finally" | cflow.cs:146:10:146:19 | TryFinally | +| cflow.cs:154:31:154:39 | [finally: exception(Exception)] "Finally" | cflow.cs:146:10:146:19 | TryFinally | +| cflow.cs:154:31:154:39 | [finally: exception(OutOfMemoryException)] "Finally" | cflow.cs:146:10:146:19 | TryFinally | +| cflow.cs:157:9:187:9 | try {...} ... | cflow.cs:146:10:146:19 | TryFinally | +| cflow.cs:158:9:161:9 | {...} | cflow.cs:146:10:146:19 | TryFinally | +| cflow.cs:159:13:159:37 | call to method WriteLine | cflow.cs:146:10:146:19 | TryFinally | +| cflow.cs:159:13:159:38 | ...; | cflow.cs:146:10:146:19 | TryFinally | +| cflow.cs:159:31:159:36 | "Try2" | cflow.cs:146:10:146:19 | TryFinally | +| cflow.cs:160:13:160:19 | return ...; | cflow.cs:146:10:146:19 | TryFinally | +| cflow.cs:162:9:165:9 | [exception: Exception] catch (...) {...} | cflow.cs:146:10:146:19 | TryFinally | +| cflow.cs:162:9:165:9 | [exception: OutOfMemoryException] catch (...) {...} | cflow.cs:146:10:146:19 | TryFinally | +| cflow.cs:162:38:162:39 | [exception: Exception] IOException ex | cflow.cs:146:10:146:19 | TryFinally | +| cflow.cs:162:48:162:51 | [exception: Exception] true | cflow.cs:146:10:146:19 | TryFinally | +| cflow.cs:163:9:165:9 | {...} | cflow.cs:146:10:146:19 | TryFinally | +| cflow.cs:164:13:164:18 | throw ...; | cflow.cs:146:10:146:19 | TryFinally | +| cflow.cs:166:9:176:9 | [exception: Exception] catch (...) {...} | cflow.cs:146:10:146:19 | TryFinally | +| cflow.cs:166:9:176:9 | [exception: OutOfMemoryException] catch (...) {...} | cflow.cs:146:10:146:19 | TryFinally | +| cflow.cs:166:41:166:42 | [exception: Exception] ArgumentException ex | cflow.cs:146:10:146:19 | TryFinally | +| cflow.cs:167:9:176:9 | {...} | cflow.cs:146:10:146:19 | TryFinally | +| cflow.cs:168:13:175:13 | try {...} ... | cflow.cs:146:10:146:19 | TryFinally | +| cflow.cs:169:13:171:13 | {...} | cflow.cs:146:10:146:19 | TryFinally | +| cflow.cs:170:17:170:32 | if (...) ... | cflow.cs:146:10:146:19 | TryFinally | +| cflow.cs:170:21:170:24 | true | cflow.cs:146:10:146:19 | TryFinally | +| cflow.cs:170:27:170:32 | throw ...; | cflow.cs:146:10:146:19 | TryFinally | +| cflow.cs:173:13:175:13 | [finally: exception(ArgumentException)] {...} | cflow.cs:146:10:146:19 | TryFinally | +| cflow.cs:174:17:174:44 | [finally: exception(ArgumentException)] throw ...; | cflow.cs:146:10:146:19 | TryFinally | +| cflow.cs:174:23:174:43 | [finally: exception(ArgumentException)] object creation of type Exception | cflow.cs:146:10:146:19 | TryFinally | +| cflow.cs:174:37:174:42 | [finally: exception(ArgumentException)] "Boo!" | cflow.cs:146:10:146:19 | TryFinally | +| cflow.cs:177:9:179:9 | [exception: Exception] catch (...) {...} | cflow.cs:146:10:146:19 | TryFinally | +| cflow.cs:177:9:179:9 | [exception: OutOfMemoryException] catch (...) {...} | cflow.cs:146:10:146:19 | TryFinally | +| cflow.cs:178:9:179:9 | {...} | cflow.cs:146:10:146:19 | TryFinally | +| cflow.cs:185:9:187:9 | [finally: exception(Exception)] {...} | cflow.cs:146:10:146:19 | TryFinally | +| cflow.cs:185:9:187:9 | [finally: exception(IOException)] {...} | cflow.cs:146:10:146:19 | TryFinally | +| cflow.cs:185:9:187:9 | [finally: return] {...} | cflow.cs:146:10:146:19 | TryFinally | +| cflow.cs:185:9:187:9 | {...} | cflow.cs:146:10:146:19 | TryFinally | +| cflow.cs:186:13:186:40 | [finally: exception(Exception)] call to method WriteLine | cflow.cs:146:10:146:19 | TryFinally | +| cflow.cs:186:13:186:40 | [finally: exception(IOException)] call to method WriteLine | cflow.cs:146:10:146:19 | TryFinally | +| cflow.cs:186:13:186:40 | [finally: return] call to method WriteLine | cflow.cs:146:10:146:19 | TryFinally | +| cflow.cs:186:13:186:40 | call to method WriteLine | cflow.cs:146:10:146:19 | TryFinally | +| cflow.cs:186:13:186:41 | ...; | cflow.cs:146:10:146:19 | TryFinally | +| cflow.cs:186:13:186:41 | [finally: exception(Exception)] ...; | cflow.cs:146:10:146:19 | TryFinally | +| cflow.cs:186:13:186:41 | [finally: exception(IOException)] ...; | cflow.cs:146:10:146:19 | TryFinally | +| cflow.cs:186:13:186:41 | [finally: return] ...; | cflow.cs:146:10:146:19 | TryFinally | +| cflow.cs:186:31:186:39 | "Finally" | cflow.cs:146:10:146:19 | TryFinally | +| cflow.cs:186:31:186:39 | [finally: exception(Exception)] "Finally" | cflow.cs:146:10:146:19 | TryFinally | +| cflow.cs:186:31:186:39 | [finally: exception(IOException)] "Finally" | cflow.cs:146:10:146:19 | TryFinally | +| cflow.cs:186:31:186:39 | [finally: return] "Finally" | cflow.cs:146:10:146:19 | TryFinally | +| cflow.cs:189:9:204:9 | try {...} ... | cflow.cs:146:10:146:19 | TryFinally | +| cflow.cs:190:9:193:9 | {...} | cflow.cs:146:10:146:19 | TryFinally | +| cflow.cs:191:13:191:37 | call to method WriteLine | cflow.cs:146:10:146:19 | TryFinally | +| cflow.cs:191:13:191:38 | ...; | cflow.cs:146:10:146:19 | TryFinally | +| cflow.cs:191:31:191:36 | "Try3" | cflow.cs:146:10:146:19 | TryFinally | +| cflow.cs:192:13:192:19 | return ...; | cflow.cs:146:10:146:19 | TryFinally | +| cflow.cs:194:9:197:9 | [exception: Exception] catch (...) {...} | cflow.cs:146:10:146:19 | TryFinally | +| cflow.cs:194:9:197:9 | [exception: OutOfMemoryException] catch (...) {...} | cflow.cs:146:10:146:19 | TryFinally | +| cflow.cs:194:38:194:39 | [exception: Exception] IOException ex | cflow.cs:146:10:146:19 | TryFinally | +| cflow.cs:194:48:194:51 | [exception: Exception] true | cflow.cs:146:10:146:19 | TryFinally | +| cflow.cs:195:9:197:9 | {...} | cflow.cs:146:10:146:19 | TryFinally | +| cflow.cs:196:13:196:18 | throw ...; | cflow.cs:146:10:146:19 | TryFinally | +| cflow.cs:198:9:200:9 | [exception: Exception] catch (...) {...} | cflow.cs:146:10:146:19 | TryFinally | +| cflow.cs:198:9:200:9 | [exception: OutOfMemoryException] catch (...) {...} | cflow.cs:146:10:146:19 | TryFinally | +| cflow.cs:198:26:198:26 | [exception: Exception] Exception e | cflow.cs:146:10:146:19 | TryFinally | +| cflow.cs:198:26:198:26 | [exception: OutOfMemoryException] Exception e | cflow.cs:146:10:146:19 | TryFinally | +| cflow.cs:198:35:198:35 | [exception: Exception] access to local variable e | cflow.cs:146:10:146:19 | TryFinally | +| cflow.cs:198:35:198:35 | [exception: OutOfMemoryException] access to local variable e | cflow.cs:146:10:146:19 | TryFinally | +| cflow.cs:198:35:198:43 | [exception: Exception] access to property Message | cflow.cs:146:10:146:19 | TryFinally | +| cflow.cs:198:35:198:43 | [exception: OutOfMemoryException] access to property Message | cflow.cs:146:10:146:19 | TryFinally | +| cflow.cs:198:35:198:51 | [exception: Exception] ... != ... | cflow.cs:146:10:146:19 | TryFinally | +| cflow.cs:198:35:198:51 | [exception: OutOfMemoryException] ... != ... | cflow.cs:146:10:146:19 | TryFinally | +| cflow.cs:198:48:198:51 | [exception: Exception] null | cflow.cs:146:10:146:19 | TryFinally | +| cflow.cs:198:48:198:51 | [exception: OutOfMemoryException] null | cflow.cs:146:10:146:19 | TryFinally | +| cflow.cs:199:9:200:9 | {...} | cflow.cs:146:10:146:19 | TryFinally | +| cflow.cs:202:9:204:9 | [finally: exception(Exception)] {...} | cflow.cs:146:10:146:19 | TryFinally | +| cflow.cs:202:9:204:9 | [finally: exception(IOException)] {...} | cflow.cs:146:10:146:19 | TryFinally | +| cflow.cs:202:9:204:9 | [finally: exception(OutOfMemoryException)] {...} | cflow.cs:146:10:146:19 | TryFinally | +| cflow.cs:202:9:204:9 | [finally: return] {...} | cflow.cs:146:10:146:19 | TryFinally | +| cflow.cs:202:9:204:9 | {...} | cflow.cs:146:10:146:19 | TryFinally | +| cflow.cs:203:13:203:40 | [finally: exception(Exception)] call to method WriteLine | cflow.cs:146:10:146:19 | TryFinally | +| cflow.cs:203:13:203:40 | [finally: exception(IOException)] call to method WriteLine | cflow.cs:146:10:146:19 | TryFinally | +| cflow.cs:203:13:203:40 | [finally: exception(OutOfMemoryException)] call to method WriteLine | cflow.cs:146:10:146:19 | TryFinally | +| cflow.cs:203:13:203:40 | [finally: return] call to method WriteLine | cflow.cs:146:10:146:19 | TryFinally | +| cflow.cs:203:13:203:40 | call to method WriteLine | cflow.cs:146:10:146:19 | TryFinally | +| cflow.cs:203:13:203:41 | ...; | cflow.cs:146:10:146:19 | TryFinally | +| cflow.cs:203:13:203:41 | [finally: exception(Exception)] ...; | cflow.cs:146:10:146:19 | TryFinally | +| cflow.cs:203:13:203:41 | [finally: exception(IOException)] ...; | cflow.cs:146:10:146:19 | TryFinally | +| cflow.cs:203:13:203:41 | [finally: exception(OutOfMemoryException)] ...; | cflow.cs:146:10:146:19 | TryFinally | +| cflow.cs:203:13:203:41 | [finally: return] ...; | cflow.cs:146:10:146:19 | TryFinally | +| cflow.cs:203:31:203:39 | "Finally" | cflow.cs:146:10:146:19 | TryFinally | +| cflow.cs:203:31:203:39 | [finally: exception(Exception)] "Finally" | cflow.cs:146:10:146:19 | TryFinally | +| cflow.cs:203:31:203:39 | [finally: exception(IOException)] "Finally" | cflow.cs:146:10:146:19 | TryFinally | +| cflow.cs:203:31:203:39 | [finally: exception(OutOfMemoryException)] "Finally" | cflow.cs:146:10:146:19 | TryFinally | +| cflow.cs:203:31:203:39 | [finally: return] "Finally" | cflow.cs:146:10:146:19 | TryFinally | +| cflow.cs:206:9:206:19 | ... ...; | cflow.cs:146:10:146:19 | TryFinally | +| cflow.cs:206:13:206:18 | Int32 i = ... | cflow.cs:146:10:146:19 | TryFinally | +| cflow.cs:206:17:206:18 | 10 | cflow.cs:146:10:146:19 | TryFinally | +| cflow.cs:207:9:230:9 | while (...) ... | cflow.cs:146:10:146:19 | TryFinally | +| cflow.cs:207:16:207:16 | access to local variable i | cflow.cs:146:10:146:19 | TryFinally | +| cflow.cs:207:16:207:20 | ... > ... | cflow.cs:146:10:146:19 | TryFinally | +| cflow.cs:207:20:207:20 | 0 | cflow.cs:146:10:146:19 | TryFinally | +| cflow.cs:208:9:230:9 | {...} | cflow.cs:146:10:146:19 | TryFinally | +| cflow.cs:209:13:229:13 | try {...} ... | cflow.cs:146:10:146:19 | TryFinally | +| cflow.cs:210:13:217:13 | {...} | cflow.cs:146:10:146:19 | TryFinally | +| cflow.cs:211:17:212:27 | if (...) ... | cflow.cs:146:10:146:19 | TryFinally | +| cflow.cs:211:21:211:21 | access to local variable i | cflow.cs:146:10:146:19 | TryFinally | +| cflow.cs:211:21:211:26 | ... == ... | cflow.cs:146:10:146:19 | TryFinally | +| cflow.cs:211:26:211:26 | 0 | cflow.cs:146:10:146:19 | TryFinally | +| cflow.cs:212:21:212:27 | return ...; | cflow.cs:146:10:146:19 | TryFinally | +| cflow.cs:213:17:214:29 | if (...) ... | cflow.cs:146:10:146:19 | TryFinally | +| cflow.cs:213:21:213:21 | access to local variable i | cflow.cs:146:10:146:19 | TryFinally | +| cflow.cs:213:21:213:26 | ... == ... | cflow.cs:146:10:146:19 | TryFinally | +| cflow.cs:213:26:213:26 | 1 | cflow.cs:146:10:146:19 | TryFinally | +| cflow.cs:214:21:214:29 | continue; | cflow.cs:146:10:146:19 | TryFinally | +| cflow.cs:215:17:216:26 | if (...) ... | cflow.cs:146:10:146:19 | TryFinally | +| cflow.cs:215:21:215:21 | access to local variable i | cflow.cs:146:10:146:19 | TryFinally | +| cflow.cs:215:21:215:26 | ... == ... | cflow.cs:146:10:146:19 | TryFinally | +| cflow.cs:215:26:215:26 | 2 | cflow.cs:146:10:146:19 | TryFinally | +| cflow.cs:216:21:216:26 | break; | cflow.cs:146:10:146:19 | TryFinally | +| cflow.cs:219:13:229:13 | [finally: break] {...} | cflow.cs:146:10:146:19 | TryFinally | +| cflow.cs:219:13:229:13 | [finally: continue] {...} | cflow.cs:146:10:146:19 | TryFinally | +| cflow.cs:219:13:229:13 | [finally: return] {...} | cflow.cs:146:10:146:19 | TryFinally | +| cflow.cs:219:13:229:13 | {...} | cflow.cs:146:10:146:19 | TryFinally | +| cflow.cs:220:17:228:17 | [finally: break] try {...} ... | cflow.cs:146:10:146:19 | TryFinally | +| cflow.cs:220:17:228:17 | [finally: continue] try {...} ... | cflow.cs:146:10:146:19 | TryFinally | +| cflow.cs:220:17:228:17 | [finally: return] try {...} ... | cflow.cs:146:10:146:19 | TryFinally | +| cflow.cs:220:17:228:17 | try {...} ... | cflow.cs:146:10:146:19 | TryFinally | +| cflow.cs:221:17:224:17 | [finally: break] {...} | cflow.cs:146:10:146:19 | TryFinally | +| cflow.cs:221:17:224:17 | [finally: continue] {...} | cflow.cs:146:10:146:19 | TryFinally | +| cflow.cs:221:17:224:17 | [finally: return] {...} | cflow.cs:146:10:146:19 | TryFinally | +| cflow.cs:221:17:224:17 | {...} | cflow.cs:146:10:146:19 | TryFinally | +| cflow.cs:222:21:223:46 | [finally: break] if (...) ... | cflow.cs:146:10:146:19 | TryFinally | +| cflow.cs:222:21:223:46 | [finally: continue] if (...) ... | cflow.cs:146:10:146:19 | TryFinally | +| cflow.cs:222:21:223:46 | [finally: return] if (...) ... | cflow.cs:146:10:146:19 | TryFinally | +| cflow.cs:222:21:223:46 | if (...) ... | cflow.cs:146:10:146:19 | TryFinally | +| cflow.cs:222:25:222:25 | [finally: break] access to local variable i | cflow.cs:146:10:146:19 | TryFinally | +| cflow.cs:222:25:222:25 | [finally: continue] access to local variable i | cflow.cs:146:10:146:19 | TryFinally | +| cflow.cs:222:25:222:25 | [finally: return] access to local variable i | cflow.cs:146:10:146:19 | TryFinally | +| cflow.cs:222:25:222:25 | access to local variable i | cflow.cs:146:10:146:19 | TryFinally | +| cflow.cs:222:25:222:30 | ... == ... | cflow.cs:146:10:146:19 | TryFinally | +| cflow.cs:222:25:222:30 | [finally: break] ... == ... | cflow.cs:146:10:146:19 | TryFinally | +| cflow.cs:222:25:222:30 | [finally: continue] ... == ... | cflow.cs:146:10:146:19 | TryFinally | +| cflow.cs:222:25:222:30 | [finally: return] ... == ... | cflow.cs:146:10:146:19 | TryFinally | +| cflow.cs:222:30:222:30 | 3 | cflow.cs:146:10:146:19 | TryFinally | +| cflow.cs:222:30:222:30 | [finally: break] 3 | cflow.cs:146:10:146:19 | TryFinally | +| cflow.cs:222:30:222:30 | [finally: continue] 3 | cflow.cs:146:10:146:19 | TryFinally | +| cflow.cs:222:30:222:30 | [finally: return] 3 | cflow.cs:146:10:146:19 | TryFinally | +| cflow.cs:223:25:223:46 | [finally: break] throw ...; | cflow.cs:146:10:146:19 | TryFinally | +| cflow.cs:223:25:223:46 | [finally: continue] throw ...; | cflow.cs:146:10:146:19 | TryFinally | +| cflow.cs:223:25:223:46 | [finally: return] throw ...; | cflow.cs:146:10:146:19 | TryFinally | +| cflow.cs:223:25:223:46 | throw ...; | cflow.cs:146:10:146:19 | TryFinally | +| cflow.cs:223:31:223:45 | [finally: break] object creation of type Exception | cflow.cs:146:10:146:19 | TryFinally | +| cflow.cs:223:31:223:45 | [finally: continue] object creation of type Exception | cflow.cs:146:10:146:19 | TryFinally | +| cflow.cs:223:31:223:45 | [finally: return] object creation of type Exception | cflow.cs:146:10:146:19 | TryFinally | +| cflow.cs:223:31:223:45 | object creation of type Exception | cflow.cs:146:10:146:19 | TryFinally | +| cflow.cs:226:17:228:17 | [finally: break] {...} | cflow.cs:146:10:146:19 | TryFinally | +| cflow.cs:226:17:228:17 | [finally: continue] {...} | cflow.cs:146:10:146:19 | TryFinally | +| cflow.cs:226:17:228:17 | [finally: exception(Exception)] {...} | cflow.cs:146:10:146:19 | TryFinally | +| cflow.cs:226:17:228:17 | [finally: return] {...} | cflow.cs:146:10:146:19 | TryFinally | +| cflow.cs:226:17:228:17 | {...} | cflow.cs:146:10:146:19 | TryFinally | +| cflow.cs:227:21:227:21 | [finally: break] access to local variable i | cflow.cs:146:10:146:19 | TryFinally | +| cflow.cs:227:21:227:21 | [finally: continue] access to local variable i | cflow.cs:146:10:146:19 | TryFinally | +| cflow.cs:227:21:227:21 | [finally: exception(Exception)] access to local variable i | cflow.cs:146:10:146:19 | TryFinally | +| cflow.cs:227:21:227:21 | [finally: return] access to local variable i | cflow.cs:146:10:146:19 | TryFinally | +| cflow.cs:227:21:227:21 | access to local variable i | cflow.cs:146:10:146:19 | TryFinally | +| cflow.cs:227:21:227:23 | ...-- | cflow.cs:146:10:146:19 | TryFinally | +| cflow.cs:227:21:227:23 | [finally: break] ...-- | cflow.cs:146:10:146:19 | TryFinally | +| cflow.cs:227:21:227:23 | [finally: continue] ...-- | cflow.cs:146:10:146:19 | TryFinally | +| cflow.cs:227:21:227:23 | [finally: exception(Exception)] ...-- | cflow.cs:146:10:146:19 | TryFinally | +| cflow.cs:227:21:227:23 | [finally: return] ...-- | cflow.cs:146:10:146:19 | TryFinally | +| cflow.cs:227:21:227:24 | ...; | cflow.cs:146:10:146:19 | TryFinally | +| cflow.cs:227:21:227:24 | [finally: break] ...; | cflow.cs:146:10:146:19 | TryFinally | +| cflow.cs:227:21:227:24 | [finally: continue] ...; | cflow.cs:146:10:146:19 | TryFinally | +| cflow.cs:227:21:227:24 | [finally: exception(Exception)] ...; | cflow.cs:146:10:146:19 | TryFinally | +| cflow.cs:227:21:227:24 | [finally: return] ...; | cflow.cs:146:10:146:19 | TryFinally | +| cflow.cs:232:9:245:9 | try {...} ... | cflow.cs:146:10:146:19 | TryFinally | +| cflow.cs:233:9:238:9 | {...} | cflow.cs:146:10:146:19 | TryFinally | +| cflow.cs:234:13:235:23 | if (...) ... | cflow.cs:146:10:146:19 | TryFinally | +| cflow.cs:234:17:234:21 | access to field Field | cflow.cs:146:10:146:19 | TryFinally | +| cflow.cs:234:17:234:21 | this access | cflow.cs:146:10:146:19 | TryFinally | +| cflow.cs:234:17:234:28 | access to property Length | cflow.cs:146:10:146:19 | TryFinally | +| cflow.cs:234:17:234:33 | ... == ... | cflow.cs:146:10:146:19 | TryFinally | +| cflow.cs:234:33:234:33 | 0 | cflow.cs:146:10:146:19 | TryFinally | +| cflow.cs:235:17:235:23 | return ...; | cflow.cs:146:10:146:19 | TryFinally | +| cflow.cs:236:13:237:49 | if (...) ... | cflow.cs:146:10:146:19 | TryFinally | +| cflow.cs:236:17:236:21 | access to field Field | cflow.cs:146:10:146:19 | TryFinally | +| cflow.cs:236:17:236:21 | this access | cflow.cs:146:10:146:19 | TryFinally | +| cflow.cs:236:17:236:28 | access to property Length | cflow.cs:146:10:146:19 | TryFinally | +| cflow.cs:236:17:236:33 | ... == ... | cflow.cs:146:10:146:19 | TryFinally | +| cflow.cs:236:33:236:33 | 1 | cflow.cs:146:10:146:19 | TryFinally | +| cflow.cs:237:17:237:49 | throw ...; | cflow.cs:146:10:146:19 | TryFinally | +| cflow.cs:237:23:237:48 | object creation of type OutOfMemoryException | cflow.cs:146:10:146:19 | TryFinally | +| cflow.cs:240:9:245:9 | [finally: exception(Exception)] {...} | cflow.cs:146:10:146:19 | TryFinally | +| cflow.cs:240:9:245:9 | [finally: exception(NullReferenceException)] {...} | cflow.cs:146:10:146:19 | TryFinally | +| cflow.cs:240:9:245:9 | [finally: exception(OutOfMemoryException)] {...} | cflow.cs:146:10:146:19 | TryFinally | +| cflow.cs:240:9:245:9 | [finally: return] {...} | cflow.cs:146:10:146:19 | TryFinally | +| cflow.cs:240:9:245:9 | {...} | cflow.cs:146:10:146:19 | TryFinally | +| cflow.cs:241:13:242:41 | [finally: exception(Exception)] if (...) ... | cflow.cs:146:10:146:19 | TryFinally | +| cflow.cs:241:13:242:41 | [finally: exception(NullReferenceException)] if (...) ... | cflow.cs:146:10:146:19 | TryFinally | +| cflow.cs:241:13:242:41 | [finally: exception(OutOfMemoryException)] if (...) ... | cflow.cs:146:10:146:19 | TryFinally | +| cflow.cs:241:13:242:41 | [finally: return] if (...) ... | cflow.cs:146:10:146:19 | TryFinally | +| cflow.cs:241:13:242:41 | if (...) ... | cflow.cs:146:10:146:19 | TryFinally | +| cflow.cs:241:17:241:36 | !... | cflow.cs:146:10:146:19 | TryFinally | +| cflow.cs:241:17:241:36 | [finally: exception(Exception)] !... | cflow.cs:146:10:146:19 | TryFinally | +| cflow.cs:241:17:241:36 | [finally: exception(NullReferenceException)] !... | cflow.cs:146:10:146:19 | TryFinally | +| cflow.cs:241:17:241:36 | [finally: exception(OutOfMemoryException)] !... | cflow.cs:146:10:146:19 | TryFinally | +| cflow.cs:241:17:241:36 | [finally: return] !... | cflow.cs:146:10:146:19 | TryFinally | +| cflow.cs:241:19:241:23 | [finally: exception(Exception)] access to field Field | cflow.cs:146:10:146:19 | TryFinally | +| cflow.cs:241:19:241:23 | [finally: exception(Exception)] this access | cflow.cs:146:10:146:19 | TryFinally | +| cflow.cs:241:19:241:23 | [finally: exception(NullReferenceException)] access to field Field | cflow.cs:146:10:146:19 | TryFinally | +| cflow.cs:241:19:241:23 | [finally: exception(NullReferenceException)] this access | cflow.cs:146:10:146:19 | TryFinally | +| cflow.cs:241:19:241:23 | [finally: exception(OutOfMemoryException)] access to field Field | cflow.cs:146:10:146:19 | TryFinally | +| cflow.cs:241:19:241:23 | [finally: exception(OutOfMemoryException)] this access | cflow.cs:146:10:146:19 | TryFinally | +| cflow.cs:241:19:241:23 | [finally: return] access to field Field | cflow.cs:146:10:146:19 | TryFinally | +| cflow.cs:241:19:241:23 | [finally: return] this access | cflow.cs:146:10:146:19 | TryFinally | +| cflow.cs:241:19:241:23 | access to field Field | cflow.cs:146:10:146:19 | TryFinally | +| cflow.cs:241:19:241:23 | this access | cflow.cs:146:10:146:19 | TryFinally | +| cflow.cs:241:19:241:30 | [finally: exception(Exception)] access to property Length | cflow.cs:146:10:146:19 | TryFinally | +| cflow.cs:241:19:241:30 | [finally: exception(NullReferenceException)] access to property Length | cflow.cs:146:10:146:19 | TryFinally | +| cflow.cs:241:19:241:30 | [finally: exception(OutOfMemoryException)] access to property Length | cflow.cs:146:10:146:19 | TryFinally | +| cflow.cs:241:19:241:30 | [finally: return] access to property Length | cflow.cs:146:10:146:19 | TryFinally | +| cflow.cs:241:19:241:30 | access to property Length | cflow.cs:146:10:146:19 | TryFinally | +| cflow.cs:241:19:241:35 | ... == ... | cflow.cs:146:10:146:19 | TryFinally | +| cflow.cs:241:19:241:35 | [finally: exception(Exception)] ... == ... | cflow.cs:146:10:146:19 | TryFinally | +| cflow.cs:241:19:241:35 | [finally: exception(NullReferenceException)] ... == ... | cflow.cs:146:10:146:19 | TryFinally | +| cflow.cs:241:19:241:35 | [finally: exception(OutOfMemoryException)] ... == ... | cflow.cs:146:10:146:19 | TryFinally | +| cflow.cs:241:19:241:35 | [finally: return] ... == ... | cflow.cs:146:10:146:19 | TryFinally | +| cflow.cs:241:35:241:35 | 0 | cflow.cs:146:10:146:19 | TryFinally | +| cflow.cs:241:35:241:35 | [finally: exception(Exception)] 0 | cflow.cs:146:10:146:19 | TryFinally | +| cflow.cs:241:35:241:35 | [finally: exception(NullReferenceException)] 0 | cflow.cs:146:10:146:19 | TryFinally | +| cflow.cs:241:35:241:35 | [finally: exception(OutOfMemoryException)] 0 | cflow.cs:146:10:146:19 | TryFinally | +| cflow.cs:241:35:241:35 | [finally: return] 0 | cflow.cs:146:10:146:19 | TryFinally | +| cflow.cs:242:17:242:40 | [finally: exception(Exception)] call to method WriteLine | cflow.cs:146:10:146:19 | TryFinally | +| cflow.cs:242:17:242:40 | [finally: exception(NullReferenceException)] call to method WriteLine | cflow.cs:146:10:146:19 | TryFinally | +| cflow.cs:242:17:242:40 | [finally: exception(OutOfMemoryException)] call to method WriteLine | cflow.cs:146:10:146:19 | TryFinally | +| cflow.cs:242:17:242:40 | [finally: return] call to method WriteLine | cflow.cs:146:10:146:19 | TryFinally | +| cflow.cs:242:17:242:40 | call to method WriteLine | cflow.cs:146:10:146:19 | TryFinally | +| cflow.cs:242:17:242:41 | ...; | cflow.cs:146:10:146:19 | TryFinally | +| cflow.cs:242:17:242:41 | [finally: exception(Exception)] ...; | cflow.cs:146:10:146:19 | TryFinally | +| cflow.cs:242:17:242:41 | [finally: exception(NullReferenceException)] ...; | cflow.cs:146:10:146:19 | TryFinally | +| cflow.cs:242:17:242:41 | [finally: exception(OutOfMemoryException)] ...; | cflow.cs:146:10:146:19 | TryFinally | +| cflow.cs:242:17:242:41 | [finally: return] ...; | cflow.cs:146:10:146:19 | TryFinally | +| cflow.cs:242:35:242:39 | [finally: exception(Exception)] access to field Field | cflow.cs:146:10:146:19 | TryFinally | +| cflow.cs:242:35:242:39 | [finally: exception(Exception)] this access | cflow.cs:146:10:146:19 | TryFinally | +| cflow.cs:242:35:242:39 | [finally: exception(NullReferenceException)] access to field Field | cflow.cs:146:10:146:19 | TryFinally | +| cflow.cs:242:35:242:39 | [finally: exception(NullReferenceException)] this access | cflow.cs:146:10:146:19 | TryFinally | +| cflow.cs:242:35:242:39 | [finally: exception(OutOfMemoryException)] access to field Field | cflow.cs:146:10:146:19 | TryFinally | +| cflow.cs:242:35:242:39 | [finally: exception(OutOfMemoryException)] this access | cflow.cs:146:10:146:19 | TryFinally | +| cflow.cs:242:35:242:39 | [finally: return] access to field Field | cflow.cs:146:10:146:19 | TryFinally | +| cflow.cs:242:35:242:39 | [finally: return] this access | cflow.cs:146:10:146:19 | TryFinally | +| cflow.cs:242:35:242:39 | access to field Field | cflow.cs:146:10:146:19 | TryFinally | +| cflow.cs:242:35:242:39 | this access | cflow.cs:146:10:146:19 | TryFinally | +| cflow.cs:243:13:244:37 | [finally: exception(Exception)] if (...) ... | cflow.cs:146:10:146:19 | TryFinally | +| cflow.cs:243:13:244:37 | [finally: exception(NullReferenceException)] if (...) ... | cflow.cs:146:10:146:19 | TryFinally | +| cflow.cs:243:13:244:37 | [finally: exception(OutOfMemoryException)] if (...) ... | cflow.cs:146:10:146:19 | TryFinally | +| cflow.cs:243:13:244:37 | [finally: return] if (...) ... | cflow.cs:146:10:146:19 | TryFinally | +| cflow.cs:243:13:244:37 | if (...) ... | cflow.cs:146:10:146:19 | TryFinally | +| cflow.cs:243:17:243:21 | [finally: exception(Exception)] access to field Field | cflow.cs:146:10:146:19 | TryFinally | +| cflow.cs:243:17:243:21 | [finally: exception(Exception)] this access | cflow.cs:146:10:146:19 | TryFinally | +| cflow.cs:243:17:243:21 | [finally: exception(NullReferenceException)] access to field Field | cflow.cs:146:10:146:19 | TryFinally | +| cflow.cs:243:17:243:21 | [finally: exception(NullReferenceException)] this access | cflow.cs:146:10:146:19 | TryFinally | +| cflow.cs:243:17:243:21 | [finally: exception(OutOfMemoryException)] access to field Field | cflow.cs:146:10:146:19 | TryFinally | +| cflow.cs:243:17:243:21 | [finally: exception(OutOfMemoryException)] this access | cflow.cs:146:10:146:19 | TryFinally | +| cflow.cs:243:17:243:21 | [finally: return] access to field Field | cflow.cs:146:10:146:19 | TryFinally | +| cflow.cs:243:17:243:21 | [finally: return] this access | cflow.cs:146:10:146:19 | TryFinally | +| cflow.cs:243:17:243:21 | access to field Field | cflow.cs:146:10:146:19 | TryFinally | +| cflow.cs:243:17:243:21 | this access | cflow.cs:146:10:146:19 | TryFinally | +| cflow.cs:243:17:243:28 | [finally: exception(Exception)] access to property Length | cflow.cs:146:10:146:19 | TryFinally | +| cflow.cs:243:17:243:28 | [finally: exception(NullReferenceException)] access to property Length | cflow.cs:146:10:146:19 | TryFinally | +| cflow.cs:243:17:243:28 | [finally: exception(OutOfMemoryException)] access to property Length | cflow.cs:146:10:146:19 | TryFinally | +| cflow.cs:243:17:243:28 | [finally: return] access to property Length | cflow.cs:146:10:146:19 | TryFinally | +| cflow.cs:243:17:243:28 | access to property Length | cflow.cs:146:10:146:19 | TryFinally | +| cflow.cs:243:17:243:32 | ... > ... | cflow.cs:146:10:146:19 | TryFinally | +| cflow.cs:243:17:243:32 | [finally: exception(Exception)] ... > ... | cflow.cs:146:10:146:19 | TryFinally | +| cflow.cs:243:17:243:32 | [finally: exception(NullReferenceException)] ... > ... | cflow.cs:146:10:146:19 | TryFinally | +| cflow.cs:243:17:243:32 | [finally: exception(OutOfMemoryException)] ... > ... | cflow.cs:146:10:146:19 | TryFinally | +| cflow.cs:243:17:243:32 | [finally: return] ... > ... | cflow.cs:146:10:146:19 | TryFinally | +| cflow.cs:243:32:243:32 | 0 | cflow.cs:146:10:146:19 | TryFinally | +| cflow.cs:243:32:243:32 | [finally: exception(Exception)] 0 | cflow.cs:146:10:146:19 | TryFinally | +| cflow.cs:243:32:243:32 | [finally: exception(NullReferenceException)] 0 | cflow.cs:146:10:146:19 | TryFinally | +| cflow.cs:243:32:243:32 | [finally: exception(OutOfMemoryException)] 0 | cflow.cs:146:10:146:19 | TryFinally | +| cflow.cs:243:32:243:32 | [finally: return] 0 | cflow.cs:146:10:146:19 | TryFinally | +| cflow.cs:244:17:244:36 | [finally: exception(Exception)] call to method WriteLine | cflow.cs:146:10:146:19 | TryFinally | +| cflow.cs:244:17:244:36 | [finally: exception(NullReferenceException)] call to method WriteLine | cflow.cs:146:10:146:19 | TryFinally | +| cflow.cs:244:17:244:36 | [finally: exception(OutOfMemoryException)] call to method WriteLine | cflow.cs:146:10:146:19 | TryFinally | +| cflow.cs:244:17:244:36 | [finally: return] call to method WriteLine | cflow.cs:146:10:146:19 | TryFinally | +| cflow.cs:244:17:244:36 | call to method WriteLine | cflow.cs:146:10:146:19 | TryFinally | +| cflow.cs:244:17:244:37 | ...; | cflow.cs:146:10:146:19 | TryFinally | +| cflow.cs:244:17:244:37 | [finally: exception(Exception)] ...; | cflow.cs:146:10:146:19 | TryFinally | +| cflow.cs:244:17:244:37 | [finally: exception(NullReferenceException)] ...; | cflow.cs:146:10:146:19 | TryFinally | +| cflow.cs:244:17:244:37 | [finally: exception(OutOfMemoryException)] ...; | cflow.cs:146:10:146:19 | TryFinally | +| cflow.cs:244:17:244:37 | [finally: return] ...; | cflow.cs:146:10:146:19 | TryFinally | +| cflow.cs:244:35:244:35 | 1 | cflow.cs:146:10:146:19 | TryFinally | +| cflow.cs:244:35:244:35 | [finally: exception(Exception)] 1 | cflow.cs:146:10:146:19 | TryFinally | +| cflow.cs:244:35:244:35 | [finally: exception(NullReferenceException)] 1 | cflow.cs:146:10:146:19 | TryFinally | +| cflow.cs:244:35:244:35 | [finally: exception(OutOfMemoryException)] 1 | cflow.cs:146:10:146:19 | TryFinally | +| cflow.cs:244:35:244:35 | [finally: return] 1 | cflow.cs:146:10:146:19 | TryFinally | +| cflow.cs:247:9:254:9 | try {...} ... | cflow.cs:146:10:146:19 | TryFinally | +| cflow.cs:248:9:250:9 | {...} | cflow.cs:146:10:146:19 | TryFinally | +| cflow.cs:249:13:249:41 | ... ...; | cflow.cs:146:10:146:19 | TryFinally | +| cflow.cs:249:17:249:40 | Double temp = ... | cflow.cs:146:10:146:19 | TryFinally | +| cflow.cs:249:24:249:24 | 0 | cflow.cs:146:10:146:19 | TryFinally | +| cflow.cs:249:24:249:24 | (...) ... | cflow.cs:146:10:146:19 | TryFinally | +| cflow.cs:249:24:249:40 | ... / ... | cflow.cs:146:10:146:19 | TryFinally | +| cflow.cs:249:28:249:40 | access to constant E | cflow.cs:146:10:146:19 | TryFinally | +| cflow.cs:257:10:257:12 | enter For | cflow.cs:257:10:257:12 | For | +| cflow.cs:257:10:257:12 | exit For | cflow.cs:257:10:257:12 | For | +| cflow.cs:258:5:288:5 | {...} | cflow.cs:257:10:257:12 | For | +| cflow.cs:259:9:259:18 | ... ...; | cflow.cs:257:10:257:12 | For | +| cflow.cs:259:13:259:17 | Int32 x = ... | cflow.cs:257:10:257:12 | For | +| cflow.cs:259:17:259:17 | 0 | cflow.cs:257:10:257:12 | For | +| cflow.cs:260:9:261:33 | for (...;...;...) ... | cflow.cs:257:10:257:12 | For | +| cflow.cs:260:16:260:16 | access to local variable x | cflow.cs:257:10:257:12 | For | +| cflow.cs:260:16:260:21 | ... < ... | cflow.cs:257:10:257:12 | For | +| cflow.cs:260:20:260:21 | 10 | cflow.cs:257:10:257:12 | For | +| cflow.cs:260:24:260:26 | ++... | cflow.cs:257:10:257:12 | For | +| cflow.cs:260:26:260:26 | access to local variable x | cflow.cs:257:10:257:12 | For | +| cflow.cs:261:13:261:32 | call to method WriteLine | cflow.cs:257:10:257:12 | For | +| cflow.cs:261:13:261:33 | ...; | cflow.cs:257:10:257:12 | For | +| cflow.cs:261:31:261:31 | access to local variable x | cflow.cs:257:10:257:12 | For | +| cflow.cs:263:9:268:9 | for (...;...;...) ... | cflow.cs:257:10:257:12 | For | +| cflow.cs:263:18:263:18 | access to local variable x | cflow.cs:257:10:257:12 | For | +| cflow.cs:263:18:263:20 | ...++ | cflow.cs:257:10:257:12 | For | +| cflow.cs:264:9:268:9 | {...} | cflow.cs:257:10:257:12 | For | +| cflow.cs:265:13:265:32 | call to method WriteLine | cflow.cs:257:10:257:12 | For | +| cflow.cs:265:13:265:33 | ...; | cflow.cs:257:10:257:12 | For | +| cflow.cs:265:31:265:31 | access to local variable x | cflow.cs:257:10:257:12 | For | +| cflow.cs:266:13:267:22 | if (...) ... | cflow.cs:257:10:257:12 | For | +| cflow.cs:266:17:266:17 | access to local variable x | cflow.cs:257:10:257:12 | For | +| cflow.cs:266:17:266:22 | ... > ... | cflow.cs:257:10:257:12 | For | +| cflow.cs:266:21:266:22 | 20 | cflow.cs:257:10:257:12 | For | +| cflow.cs:267:17:267:22 | break; | cflow.cs:257:10:257:12 | For | +| cflow.cs:270:9:276:9 | for (...;...;...) ... | cflow.cs:257:10:257:12 | For | +| cflow.cs:271:9:276:9 | {...} | cflow.cs:257:10:257:12 | For | +| cflow.cs:272:13:272:32 | call to method WriteLine | cflow.cs:257:10:257:12 | For | +| cflow.cs:272:13:272:33 | ...; | cflow.cs:257:10:257:12 | For | +| cflow.cs:272:31:272:31 | access to local variable x | cflow.cs:257:10:257:12 | For | +| cflow.cs:273:13:273:13 | access to local variable x | cflow.cs:257:10:257:12 | For | +| cflow.cs:273:13:273:15 | ...++ | cflow.cs:257:10:257:12 | For | +| cflow.cs:273:13:273:16 | ...; | cflow.cs:257:10:257:12 | For | +| cflow.cs:274:13:275:22 | if (...) ... | cflow.cs:257:10:257:12 | For | +| cflow.cs:274:17:274:17 | access to local variable x | cflow.cs:257:10:257:12 | For | +| cflow.cs:274:17:274:22 | ... > ... | cflow.cs:257:10:257:12 | For | +| cflow.cs:274:21:274:22 | 30 | cflow.cs:257:10:257:12 | For | +| cflow.cs:275:17:275:22 | break; | cflow.cs:257:10:257:12 | For | +| cflow.cs:278:9:282:9 | for (...;...;...) ... | cflow.cs:257:10:257:12 | For | +| cflow.cs:278:16:278:16 | access to local variable x | cflow.cs:257:10:257:12 | For | +| cflow.cs:278:16:278:21 | ... < ... | cflow.cs:257:10:257:12 | For | +| cflow.cs:278:20:278:21 | 40 | cflow.cs:257:10:257:12 | For | +| cflow.cs:279:9:282:9 | {...} | cflow.cs:257:10:257:12 | For | +| cflow.cs:280:13:280:32 | call to method WriteLine | cflow.cs:257:10:257:12 | For | +| cflow.cs:280:13:280:33 | ...; | cflow.cs:257:10:257:12 | For | +| cflow.cs:280:31:280:31 | access to local variable x | cflow.cs:257:10:257:12 | For | +| cflow.cs:281:13:281:13 | access to local variable x | cflow.cs:257:10:257:12 | For | +| cflow.cs:281:13:281:15 | ...++ | cflow.cs:257:10:257:12 | For | +| cflow.cs:281:13:281:16 | ...; | cflow.cs:257:10:257:12 | For | +| cflow.cs:284:9:287:9 | for (...;...;...) ... | cflow.cs:257:10:257:12 | For | +| cflow.cs:284:18:284:22 | Int32 i = ... | cflow.cs:257:10:257:12 | For | +| cflow.cs:284:22:284:22 | 0 | cflow.cs:257:10:257:12 | For | +| cflow.cs:284:25:284:29 | Int32 j = ... | cflow.cs:257:10:257:12 | For | +| cflow.cs:284:29:284:29 | 0 | cflow.cs:257:10:257:12 | For | +| cflow.cs:284:32:284:32 | access to local variable i | cflow.cs:257:10:257:12 | For | +| cflow.cs:284:32:284:36 | ... + ... | cflow.cs:257:10:257:12 | For | +| cflow.cs:284:32:284:41 | ... < ... | cflow.cs:257:10:257:12 | For | +| cflow.cs:284:36:284:36 | access to local variable j | cflow.cs:257:10:257:12 | For | +| cflow.cs:284:40:284:41 | 10 | cflow.cs:257:10:257:12 | For | +| cflow.cs:284:44:284:44 | access to local variable i | cflow.cs:257:10:257:12 | For | +| cflow.cs:284:44:284:46 | ...++ | cflow.cs:257:10:257:12 | For | +| cflow.cs:284:49:284:49 | access to local variable j | cflow.cs:257:10:257:12 | For | +| cflow.cs:284:49:284:51 | ...++ | cflow.cs:257:10:257:12 | For | +| cflow.cs:285:9:287:9 | {...} | cflow.cs:257:10:257:12 | For | +| cflow.cs:286:13:286:36 | call to method WriteLine | cflow.cs:257:10:257:12 | For | +| cflow.cs:286:13:286:37 | ...; | cflow.cs:257:10:257:12 | For | +| cflow.cs:286:31:286:31 | access to local variable i | cflow.cs:257:10:257:12 | For | +| cflow.cs:286:31:286:35 | ... + ... | cflow.cs:257:10:257:12 | For | +| cflow.cs:286:35:286:35 | access to local variable j | cflow.cs:257:10:257:12 | For | +| cflow.cs:290:10:290:16 | enter Lambdas | cflow.cs:290:10:290:16 | Lambdas | +| cflow.cs:290:10:290:16 | exit Lambdas | cflow.cs:290:10:290:16 | Lambdas | +| cflow.cs:291:5:294:5 | {...} | cflow.cs:290:10:290:16 | Lambdas | +| cflow.cs:292:9:292:38 | ... ...; | cflow.cs:290:10:290:16 | Lambdas | +| cflow.cs:292:24:292:37 | Func y = ... | cflow.cs:290:10:290:16 | Lambdas | +| cflow.cs:292:28:292:37 | (...) => ... | cflow.cs:290:10:290:16 | Lambdas | +| cflow.cs:292:28:292:37 | enter (...) => ... | cflow.cs:292:28:292:37 | (...) => ... | +| cflow.cs:292:28:292:37 | exit (...) => ... | cflow.cs:292:28:292:37 | (...) => ... | +| cflow.cs:292:33:292:33 | access to parameter x | cflow.cs:292:28:292:37 | (...) => ... | +| cflow.cs:292:33:292:37 | ... + ... | cflow.cs:292:28:292:37 | (...) => ... | +| cflow.cs:292:37:292:37 | 1 | cflow.cs:292:28:292:37 | (...) => ... | +| cflow.cs:293:9:293:62 | ... ...; | cflow.cs:290:10:290:16 | Lambdas | +| cflow.cs:293:24:293:61 | Func z = ... | cflow.cs:290:10:290:16 | Lambdas | +| cflow.cs:293:28:293:61 | delegate(...) { ... } | cflow.cs:290:10:290:16 | Lambdas | +| cflow.cs:293:28:293:61 | enter delegate(...) { ... } | cflow.cs:293:28:293:61 | delegate(...) { ... } | +| cflow.cs:293:28:293:61 | exit delegate(...) { ... } | cflow.cs:293:28:293:61 | delegate(...) { ... } | +| cflow.cs:293:45:293:61 | {...} | cflow.cs:293:28:293:61 | delegate(...) { ... } | +| cflow.cs:293:47:293:59 | return ...; | cflow.cs:293:28:293:61 | delegate(...) { ... } | +| cflow.cs:293:54:293:54 | access to parameter x | cflow.cs:293:28:293:61 | delegate(...) { ... } | +| cflow.cs:293:54:293:58 | ... + ... | cflow.cs:293:28:293:61 | delegate(...) { ... } | +| cflow.cs:293:58:293:58 | 1 | cflow.cs:293:28:293:61 | delegate(...) { ... } | +| cflow.cs:296:10:296:18 | enter LogicalOr | cflow.cs:296:10:296:18 | LogicalOr | +| cflow.cs:296:10:296:18 | exit LogicalOr | cflow.cs:296:10:296:18 | LogicalOr | +| cflow.cs:297:5:302:5 | {...} | cflow.cs:296:10:296:18 | LogicalOr | +| cflow.cs:298:9:301:52 | if (...) ... | cflow.cs:296:10:296:18 | LogicalOr | +| cflow.cs:298:13:298:13 | 1 | cflow.cs:296:10:296:18 | LogicalOr | +| cflow.cs:298:13:298:18 | ... == ... | cflow.cs:296:10:296:18 | LogicalOr | +| cflow.cs:298:13:298:28 | ... \|\| ... | cflow.cs:296:10:296:18 | LogicalOr | +| cflow.cs:298:13:298:50 | ... \|\| ... | cflow.cs:296:10:296:18 | LogicalOr | +| cflow.cs:298:18:298:18 | 2 | cflow.cs:296:10:296:18 | LogicalOr | +| cflow.cs:298:23:298:23 | 2 | cflow.cs:296:10:296:18 | LogicalOr | +| cflow.cs:298:23:298:28 | ... == ... | cflow.cs:296:10:296:18 | LogicalOr | +| cflow.cs:298:28:298:28 | 3 | cflow.cs:296:10:296:18 | LogicalOr | +| cflow.cs:298:34:298:34 | 1 | cflow.cs:296:10:296:18 | LogicalOr | +| cflow.cs:298:34:298:39 | ... == ... | cflow.cs:296:10:296:18 | LogicalOr | +| cflow.cs:298:34:298:49 | ... && ... | cflow.cs:296:10:296:18 | LogicalOr | +| cflow.cs:298:39:298:39 | 3 | cflow.cs:296:10:296:18 | LogicalOr | +| cflow.cs:301:13:301:51 | call to method WriteLine | cflow.cs:296:10:296:18 | LogicalOr | +| cflow.cs:301:13:301:52 | ...; | cflow.cs:296:10:296:18 | LogicalOr | +| cflow.cs:301:31:301:50 | "This should happen" | cflow.cs:296:10:296:18 | LogicalOr | +| cflow.cs:304:10:304:17 | enter Booleans | cflow.cs:304:10:304:17 | Booleans | +| cflow.cs:304:10:304:17 | exit Booleans | cflow.cs:304:10:304:17 | Booleans | +| cflow.cs:305:5:317:5 | {...} | cflow.cs:304:10:304:17 | Booleans | +| cflow.cs:306:9:306:57 | ... ...; | cflow.cs:304:10:304:17 | Booleans | +| cflow.cs:306:13:306:56 | Boolean b = ... | cflow.cs:304:10:304:17 | Booleans | +| cflow.cs:306:17:306:21 | access to field Field | cflow.cs:304:10:304:17 | Booleans | +| cflow.cs:306:17:306:21 | this access | cflow.cs:304:10:304:17 | Booleans | +| cflow.cs:306:17:306:28 | access to property Length | cflow.cs:304:10:304:17 | Booleans | +| cflow.cs:306:17:306:32 | ... > ... | cflow.cs:304:10:304:17 | Booleans | +| cflow.cs:306:17:306:56 | ... && ... | cflow.cs:304:10:304:17 | Booleans | +| cflow.cs:306:32:306:32 | 0 | cflow.cs:304:10:304:17 | Booleans | +| cflow.cs:306:37:306:56 | !... | cflow.cs:304:10:304:17 | Booleans | +| cflow.cs:306:39:306:43 | access to field Field | cflow.cs:304:10:304:17 | Booleans | +| cflow.cs:306:39:306:43 | this access | cflow.cs:304:10:304:17 | Booleans | +| cflow.cs:306:39:306:50 | access to property Length | cflow.cs:304:10:304:17 | Booleans | +| cflow.cs:306:39:306:55 | ... == ... | cflow.cs:304:10:304:17 | Booleans | +| cflow.cs:306:55:306:55 | 1 | cflow.cs:304:10:304:17 | Booleans | +| cflow.cs:308:9:309:49 | if (...) ... | cflow.cs:304:10:304:17 | Booleans | +| cflow.cs:308:13:308:47 | !... | cflow.cs:304:10:304:17 | Booleans | +| cflow.cs:308:15:308:19 | access to field Field | cflow.cs:304:10:304:17 | Booleans | +| cflow.cs:308:15:308:19 | this access | cflow.cs:304:10:304:17 | Booleans | +| cflow.cs:308:15:308:26 | access to property Length | cflow.cs:304:10:304:17 | Booleans | +| cflow.cs:308:15:308:31 | ... == ... | cflow.cs:304:10:304:17 | Booleans | +| cflow.cs:308:15:308:46 | ... ? ... : ... | cflow.cs:304:10:304:17 | Booleans | +| cflow.cs:308:31:308:31 | 0 | cflow.cs:304:10:304:17 | Booleans | +| cflow.cs:308:35:308:39 | false | cflow.cs:304:10:304:17 | Booleans | +| cflow.cs:308:43:308:46 | true | cflow.cs:304:10:304:17 | Booleans | +| cflow.cs:309:13:309:48 | ... = ... | cflow.cs:304:10:304:17 | Booleans | +| cflow.cs:309:13:309:49 | ...; | cflow.cs:304:10:304:17 | Booleans | +| cflow.cs:309:17:309:21 | access to field Field | cflow.cs:304:10:304:17 | Booleans | +| cflow.cs:309:17:309:21 | this access | cflow.cs:304:10:304:17 | Booleans | +| cflow.cs:309:17:309:28 | access to property Length | cflow.cs:304:10:304:17 | Booleans | +| cflow.cs:309:17:309:33 | ... == ... | cflow.cs:304:10:304:17 | Booleans | +| cflow.cs:309:17:309:48 | ... ? ... : ... | cflow.cs:304:10:304:17 | Booleans | +| cflow.cs:309:33:309:33 | 0 | cflow.cs:304:10:304:17 | Booleans | +| cflow.cs:309:37:309:41 | false | cflow.cs:304:10:304:17 | Booleans | +| cflow.cs:309:45:309:48 | true | cflow.cs:304:10:304:17 | Booleans | +| cflow.cs:311:9:316:9 | if (...) ... | cflow.cs:304:10:304:17 | Booleans | +| cflow.cs:311:13:311:32 | !... | cflow.cs:304:10:304:17 | Booleans | +| cflow.cs:311:13:311:62 | ... \|\| ... | cflow.cs:304:10:304:17 | Booleans | +| cflow.cs:311:15:311:19 | access to field Field | cflow.cs:304:10:304:17 | Booleans | +| cflow.cs:311:15:311:19 | this access | cflow.cs:304:10:304:17 | Booleans | +| cflow.cs:311:15:311:26 | access to property Length | cflow.cs:304:10:304:17 | Booleans | +| cflow.cs:311:15:311:31 | ... == ... | cflow.cs:304:10:304:17 | Booleans | +| cflow.cs:311:31:311:31 | 0 | cflow.cs:304:10:304:17 | Booleans | +| cflow.cs:311:37:311:62 | !... | cflow.cs:304:10:304:17 | Booleans | +| cflow.cs:311:38:311:62 | !... | cflow.cs:304:10:304:17 | Booleans | +| cflow.cs:311:40:311:44 | access to field Field | cflow.cs:304:10:304:17 | Booleans | +| cflow.cs:311:40:311:44 | this access | cflow.cs:304:10:304:17 | Booleans | +| cflow.cs:311:40:311:51 | access to property Length | cflow.cs:304:10:304:17 | Booleans | +| cflow.cs:311:40:311:56 | ... == ... | cflow.cs:304:10:304:17 | Booleans | +| cflow.cs:311:40:311:61 | ... && ... | cflow.cs:304:10:304:17 | Booleans | +| cflow.cs:311:56:311:56 | 1 | cflow.cs:304:10:304:17 | Booleans | +| cflow.cs:311:61:311:61 | access to local variable b | cflow.cs:304:10:304:17 | Booleans | +| cflow.cs:312:9:316:9 | {...} | cflow.cs:304:10:304:17 | Booleans | +| cflow.cs:313:13:315:13 | {...} | cflow.cs:304:10:304:17 | Booleans | +| cflow.cs:314:17:314:38 | throw ...; | cflow.cs:304:10:304:17 | Booleans | +| cflow.cs:314:23:314:37 | object creation of type Exception | cflow.cs:304:10:304:17 | Booleans | +| cflow.cs:319:10:319:11 | enter Do | cflow.cs:319:10:319:11 | Do | +| cflow.cs:319:10:319:11 | exit Do | cflow.cs:319:10:319:11 | Do | +| cflow.cs:320:5:333:5 | {...} | cflow.cs:319:10:319:11 | Do | +| cflow.cs:321:9:332:36 | do ... while (...); | cflow.cs:319:10:319:11 | Do | +| cflow.cs:322:9:332:9 | {...} | cflow.cs:319:10:319:11 | Do | +| cflow.cs:323:13:323:17 | access to field Field | cflow.cs:319:10:319:11 | Do | +| cflow.cs:323:13:323:17 | this access | cflow.cs:319:10:319:11 | Do | +| cflow.cs:323:13:323:17 | this access | cflow.cs:319:10:319:11 | Do | +| cflow.cs:323:13:323:24 | ... + ... | cflow.cs:319:10:319:11 | Do | +| cflow.cs:323:13:323:24 | ... = ... | cflow.cs:319:10:319:11 | Do | +| cflow.cs:323:13:323:25 | ...; | cflow.cs:319:10:319:11 | Do | +| cflow.cs:323:22:323:24 | "a" | cflow.cs:319:10:319:11 | Do | +| cflow.cs:324:13:327:13 | if (...) ... | cflow.cs:319:10:319:11 | Do | +| cflow.cs:324:17:324:21 | access to field Field | cflow.cs:319:10:319:11 | Do | +| cflow.cs:324:17:324:21 | this access | cflow.cs:319:10:319:11 | Do | +| cflow.cs:324:17:324:28 | access to property Length | cflow.cs:319:10:319:11 | Do | +| cflow.cs:324:17:324:32 | ... > ... | cflow.cs:319:10:319:11 | Do | +| cflow.cs:324:32:324:32 | 0 | cflow.cs:319:10:319:11 | Do | +| cflow.cs:325:13:327:13 | {...} | cflow.cs:319:10:319:11 | Do | +| cflow.cs:326:17:326:25 | continue; | cflow.cs:319:10:319:11 | Do | +| cflow.cs:328:13:331:13 | if (...) ... | cflow.cs:319:10:319:11 | Do | +| cflow.cs:328:17:328:21 | access to field Field | cflow.cs:319:10:319:11 | Do | +| cflow.cs:328:17:328:21 | this access | cflow.cs:319:10:319:11 | Do | +| cflow.cs:328:17:328:28 | access to property Length | cflow.cs:319:10:319:11 | Do | +| cflow.cs:328:17:328:32 | ... < ... | cflow.cs:319:10:319:11 | Do | +| cflow.cs:328:32:328:32 | 0 | cflow.cs:319:10:319:11 | Do | +| cflow.cs:329:13:331:13 | {...} | cflow.cs:319:10:319:11 | Do | +| cflow.cs:330:17:330:22 | break; | cflow.cs:319:10:319:11 | Do | +| cflow.cs:332:18:332:22 | access to field Field | cflow.cs:319:10:319:11 | Do | +| cflow.cs:332:18:332:22 | this access | cflow.cs:319:10:319:11 | Do | +| cflow.cs:332:18:332:29 | access to property Length | cflow.cs:319:10:319:11 | Do | +| cflow.cs:332:18:332:34 | ... < ... | cflow.cs:319:10:319:11 | Do | +| cflow.cs:332:33:332:34 | 10 | cflow.cs:319:10:319:11 | Do | +| cflow.cs:335:10:335:16 | enter Foreach | cflow.cs:335:10:335:16 | Foreach | +| cflow.cs:335:10:335:16 | exit Foreach | cflow.cs:335:10:335:16 | Foreach | +| cflow.cs:336:5:349:5 | {...} | cflow.cs:335:10:335:16 | Foreach | +| cflow.cs:337:9:348:9 | foreach (... ... in ...) ... | cflow.cs:335:10:335:16 | Foreach | +| cflow.cs:337:22:337:22 | String x | cflow.cs:335:10:335:16 | Foreach | +| cflow.cs:337:27:337:64 | call to method Repeat | cflow.cs:335:10:335:16 | Foreach | +| cflow.cs:337:57:337:59 | "a" | cflow.cs:335:10:335:16 | Foreach | +| cflow.cs:337:62:337:63 | 10 | cflow.cs:335:10:335:16 | Foreach | +| cflow.cs:338:9:348:9 | {...} | cflow.cs:335:10:335:16 | Foreach | +| cflow.cs:339:13:339:17 | access to field Field | cflow.cs:335:10:335:16 | Foreach | +| cflow.cs:339:13:339:17 | this access | cflow.cs:335:10:335:16 | Foreach | +| cflow.cs:339:13:339:17 | this access | cflow.cs:335:10:335:16 | Foreach | +| cflow.cs:339:13:339:22 | ... + ... | cflow.cs:335:10:335:16 | Foreach | +| cflow.cs:339:13:339:22 | ... = ... | cflow.cs:335:10:335:16 | Foreach | +| cflow.cs:339:13:339:23 | ...; | cflow.cs:335:10:335:16 | Foreach | +| cflow.cs:339:22:339:22 | access to local variable x | cflow.cs:335:10:335:16 | Foreach | +| cflow.cs:340:13:343:13 | if (...) ... | cflow.cs:335:10:335:16 | Foreach | +| cflow.cs:340:17:340:21 | access to field Field | cflow.cs:335:10:335:16 | Foreach | +| cflow.cs:340:17:340:21 | this access | cflow.cs:335:10:335:16 | Foreach | +| cflow.cs:340:17:340:28 | access to property Length | cflow.cs:335:10:335:16 | Foreach | +| cflow.cs:340:17:340:32 | ... > ... | cflow.cs:335:10:335:16 | Foreach | +| cflow.cs:340:32:340:32 | 0 | cflow.cs:335:10:335:16 | Foreach | +| cflow.cs:341:13:343:13 | {...} | cflow.cs:335:10:335:16 | Foreach | +| cflow.cs:342:17:342:25 | continue; | cflow.cs:335:10:335:16 | Foreach | +| cflow.cs:344:13:347:13 | if (...) ... | cflow.cs:335:10:335:16 | Foreach | +| cflow.cs:344:17:344:21 | access to field Field | cflow.cs:335:10:335:16 | Foreach | +| cflow.cs:344:17:344:21 | this access | cflow.cs:335:10:335:16 | Foreach | +| cflow.cs:344:17:344:28 | access to property Length | cflow.cs:335:10:335:16 | Foreach | +| cflow.cs:344:17:344:32 | ... < ... | cflow.cs:335:10:335:16 | Foreach | +| cflow.cs:344:32:344:32 | 0 | cflow.cs:335:10:335:16 | Foreach | +| cflow.cs:345:13:347:13 | {...} | cflow.cs:335:10:335:16 | Foreach | +| cflow.cs:346:17:346:22 | break; | cflow.cs:335:10:335:16 | Foreach | +| cflow.cs:351:10:351:13 | enter Goto | cflow.cs:351:10:351:13 | Goto | +| cflow.cs:351:10:351:13 | exit Goto | cflow.cs:351:10:351:13 | Goto | +| cflow.cs:352:5:370:5 | {...} | cflow.cs:351:10:351:13 | Goto | +| cflow.cs:353:9:353:13 | Label: | cflow.cs:351:10:351:13 | Goto | +| cflow.cs:353:16:353:45 | if (...) ... | cflow.cs:351:10:351:13 | Goto | +| cflow.cs:353:20:353:40 | !... | cflow.cs:351:10:351:13 | Goto | +| cflow.cs:353:21:353:40 | !... | cflow.cs:351:10:351:13 | Goto | +| cflow.cs:353:23:353:27 | access to field Field | cflow.cs:351:10:351:13 | Goto | +| cflow.cs:353:23:353:27 | this access | cflow.cs:351:10:351:13 | Goto | +| cflow.cs:353:23:353:34 | access to property Length | cflow.cs:351:10:351:13 | Goto | +| cflow.cs:353:23:353:39 | ... == ... | cflow.cs:351:10:351:13 | Goto | +| cflow.cs:353:39:353:39 | 0 | cflow.cs:351:10:351:13 | Goto | +| cflow.cs:353:43:353:45 | {...} | cflow.cs:351:10:351:13 | Goto | +| cflow.cs:355:9:355:41 | if (...) ... | cflow.cs:351:10:351:13 | Goto | +| cflow.cs:355:13:355:17 | access to field Field | cflow.cs:351:10:351:13 | Goto | +| cflow.cs:355:13:355:17 | this access | cflow.cs:351:10:351:13 | Goto | +| cflow.cs:355:13:355:24 | access to property Length | cflow.cs:351:10:351:13 | Goto | +| cflow.cs:355:13:355:28 | ... > ... | cflow.cs:351:10:351:13 | Goto | +| cflow.cs:355:28:355:28 | 0 | cflow.cs:351:10:351:13 | Goto | +| cflow.cs:355:31:355:41 | goto ...; | cflow.cs:351:10:351:13 | Goto | +| cflow.cs:357:9:369:9 | switch (...) {...} | cflow.cs:351:10:351:13 | Goto | +| cflow.cs:357:17:357:21 | access to field Field | cflow.cs:351:10:351:13 | Goto | +| cflow.cs:357:17:357:21 | this access | cflow.cs:351:10:351:13 | Goto | +| cflow.cs:357:17:357:28 | access to property Length | cflow.cs:351:10:351:13 | Goto | +| cflow.cs:357:17:357:32 | ... + ... | cflow.cs:351:10:351:13 | Goto | +| cflow.cs:357:32:357:32 | 3 | cflow.cs:351:10:351:13 | Goto | +| cflow.cs:359:13:359:19 | case ...: | cflow.cs:351:10:351:13 | Goto | +| cflow.cs:359:18:359:18 | 0 | cflow.cs:351:10:351:13 | Goto | +| cflow.cs:360:17:360:29 | goto default; | cflow.cs:351:10:351:13 | Goto | +| cflow.cs:361:13:361:19 | case ...: | cflow.cs:351:10:351:13 | Goto | +| cflow.cs:361:18:361:18 | 1 | cflow.cs:351:10:351:13 | Goto | +| cflow.cs:362:17:362:36 | call to method WriteLine | cflow.cs:351:10:351:13 | Goto | +| cflow.cs:362:17:362:37 | ...; | cflow.cs:351:10:351:13 | Goto | +| cflow.cs:362:35:362:35 | 1 | cflow.cs:351:10:351:13 | Goto | +| cflow.cs:363:17:363:22 | break; | cflow.cs:351:10:351:13 | Goto | +| cflow.cs:364:13:364:19 | case ...: | cflow.cs:351:10:351:13 | Goto | +| cflow.cs:364:18:364:18 | 2 | cflow.cs:351:10:351:13 | Goto | +| cflow.cs:365:17:365:27 | goto ...; | cflow.cs:351:10:351:13 | Goto | +| cflow.cs:366:13:366:20 | default: | cflow.cs:351:10:351:13 | Goto | +| cflow.cs:367:17:367:36 | call to method WriteLine | cflow.cs:351:10:351:13 | Goto | +| cflow.cs:367:17:367:37 | ...; | cflow.cs:351:10:351:13 | Goto | +| cflow.cs:367:35:367:35 | 0 | cflow.cs:351:10:351:13 | Goto | +| cflow.cs:368:17:368:22 | break; | cflow.cs:351:10:351:13 | Goto | +| cflow.cs:372:49:372:53 | enter Yield | cflow.cs:372:49:372:53 | Yield | +| cflow.cs:372:49:372:53 | exit Yield | cflow.cs:372:49:372:53 | Yield | +| cflow.cs:373:5:388:5 | {...} | cflow.cs:372:49:372:53 | Yield | +| cflow.cs:374:9:374:23 | yield return ...; | cflow.cs:372:49:372:53 | Yield | +| cflow.cs:374:22:374:22 | 0 | cflow.cs:372:49:372:53 | Yield | +| cflow.cs:375:9:378:9 | for (...;...;...) ... | cflow.cs:372:49:372:53 | Yield | +| cflow.cs:375:18:375:22 | Int32 i = ... | cflow.cs:372:49:372:53 | Yield | +| cflow.cs:375:22:375:22 | 1 | cflow.cs:372:49:372:53 | Yield | +| cflow.cs:375:25:375:25 | access to local variable i | cflow.cs:372:49:372:53 | Yield | +| cflow.cs:375:25:375:30 | ... < ... | cflow.cs:372:49:372:53 | Yield | +| cflow.cs:375:29:375:30 | 10 | cflow.cs:372:49:372:53 | Yield | +| cflow.cs:375:33:375:33 | access to local variable i | cflow.cs:372:49:372:53 | Yield | +| cflow.cs:375:33:375:35 | ...++ | cflow.cs:372:49:372:53 | Yield | +| cflow.cs:376:9:378:9 | {...} | cflow.cs:372:49:372:53 | Yield | +| cflow.cs:377:13:377:27 | yield return ...; | cflow.cs:372:49:372:53 | Yield | +| cflow.cs:377:26:377:26 | access to local variable i | cflow.cs:372:49:372:53 | Yield | +| cflow.cs:379:9:387:9 | try {...} ... | cflow.cs:372:49:372:53 | Yield | +| cflow.cs:380:9:383:9 | {...} | cflow.cs:372:49:372:53 | Yield | +| cflow.cs:381:13:381:24 | yield break; | cflow.cs:372:49:372:53 | Yield | +| cflow.cs:385:9:387:9 | [finally: return] {...} | cflow.cs:372:49:372:53 | Yield | +| cflow.cs:386:13:386:41 | [finally: return] call to method WriteLine | cflow.cs:372:49:372:53 | Yield | +| cflow.cs:386:13:386:42 | [finally: return] ...; | cflow.cs:372:49:372:53 | Yield | +| cflow.cs:386:31:386:40 | [finally: return] "not dead" | cflow.cs:372:49:372:53 | Yield | +| cflow.cs:393:5:393:18 | enter ControlFlowSub | cflow.cs:393:5:393:18 | ControlFlowSub | +| cflow.cs:393:5:393:18 | exit ControlFlowSub | cflow.cs:393:5:393:18 | ControlFlowSub | +| cflow.cs:393:24:393:27 | call to constructor ControlFlow | cflow.cs:393:5:393:18 | ControlFlowSub | +| cflow.cs:393:31:393:33 | {...} | cflow.cs:393:5:393:18 | ControlFlowSub | +| cflow.cs:395:5:395:18 | enter ControlFlowSub | cflow.cs:395:5:395:18 | ControlFlowSub | +| cflow.cs:395:5:395:18 | exit ControlFlowSub | cflow.cs:395:5:395:18 | ControlFlowSub | +| cflow.cs:395:32:395:35 | call to constructor ControlFlowSub | cflow.cs:395:5:395:18 | ControlFlowSub | +| cflow.cs:395:39:395:41 | {...} | cflow.cs:395:5:395:18 | ControlFlowSub | +| cflow.cs:397:5:397:18 | enter ControlFlowSub | cflow.cs:397:5:397:18 | ControlFlowSub | +| cflow.cs:397:5:397:18 | exit ControlFlowSub | cflow.cs:397:5:397:18 | ControlFlowSub | +| cflow.cs:397:29:397:32 | call to constructor ControlFlowSub | cflow.cs:397:5:397:18 | ControlFlowSub | +| cflow.cs:397:34:397:34 | access to parameter i | cflow.cs:397:5:397:18 | ControlFlowSub | +| cflow.cs:397:34:397:45 | call to method ToString | cflow.cs:397:5:397:18 | ControlFlowSub | +| cflow.cs:397:48:397:50 | {...} | cflow.cs:397:5:397:18 | ControlFlowSub | +| cflow.cs:402:10:402:10 | enter M | cflow.cs:402:10:402:10 | M | +| cflow.cs:402:10:402:10 | exit M | cflow.cs:402:10:402:10 | M | +| cflow.cs:403:5:414:5 | {...} | cflow.cs:402:10:402:10 | M | +| cflow.cs:404:9:412:9 | try {...} ... | cflow.cs:402:10:402:10 | M | +| cflow.cs:405:9:407:9 | {...} | cflow.cs:402:10:402:10 | M | +| cflow.cs:406:13:406:36 | call to method WriteLine | cflow.cs:402:10:402:10 | M | +| cflow.cs:406:13:406:37 | ...; | cflow.cs:402:10:402:10 | M | +| cflow.cs:406:31:406:35 | "Try" | cflow.cs:402:10:402:10 | M | +| cflow.cs:409:9:412:9 | [finally: exception(Exception)] {...} | cflow.cs:402:10:402:10 | M | +| cflow.cs:409:9:412:9 | [finally: exception(OutOfMemoryException)] {...} | cflow.cs:402:10:402:10 | M | +| cflow.cs:409:9:412:9 | {...} | cflow.cs:402:10:402:10 | M | +| cflow.cs:410:13:410:44 | [finally: exception(Exception)] throw ...; | cflow.cs:402:10:402:10 | M | +| cflow.cs:410:13:410:44 | [finally: exception(OutOfMemoryException)] throw ...; | cflow.cs:402:10:402:10 | M | +| cflow.cs:410:13:410:44 | throw ...; | cflow.cs:402:10:402:10 | M | +| cflow.cs:410:19:410:43 | [finally: exception(Exception)] object creation of type ArgumentException | cflow.cs:402:10:402:10 | M | +| cflow.cs:410:19:410:43 | [finally: exception(OutOfMemoryException)] object creation of type ArgumentException | cflow.cs:402:10:402:10 | M | +| cflow.cs:410:19:410:43 | object creation of type ArgumentException | cflow.cs:402:10:402:10 | M | +| cflow.cs:410:41:410:42 | "" | cflow.cs:402:10:402:10 | M | +| cflow.cs:410:41:410:42 | [finally: exception(Exception)] "" | cflow.cs:402:10:402:10 | M | +| cflow.cs:410:41:410:42 | [finally: exception(OutOfMemoryException)] "" | cflow.cs:402:10:402:10 | M | +| cflow.cs:419:12:419:12 | enter M | cflow.cs:419:12:419:12 | M | +| cflow.cs:419:12:419:12 | exit M | cflow.cs:419:12:419:12 | M | +| cflow.cs:419:38:419:38 | access to parameter f | cflow.cs:419:12:419:12 | M | +| cflow.cs:419:38:419:41 | delegate call | cflow.cs:419:12:419:12 | M | +| cflow.cs:419:40:419:40 | 0 | cflow.cs:419:12:419:12 | M | +| cflow.cs:424:5:424:25 | enter NegationInConstructor | cflow.cs:424:5:424:25 | NegationInConstructor | +| cflow.cs:424:5:424:25 | exit NegationInConstructor | cflow.cs:424:5:424:25 | NegationInConstructor | +| cflow.cs:424:52:424:54 | {...} | cflow.cs:424:5:424:25 | NegationInConstructor | +| cflow.cs:426:10:426:10 | enter M | cflow.cs:426:10:426:10 | M | +| cflow.cs:426:10:426:10 | exit M | cflow.cs:426:10:426:10 | M | +| cflow.cs:427:5:429:5 | {...} | cflow.cs:426:10:426:10 | M | +| cflow.cs:428:9:428:72 | object creation of type NegationInConstructor | cflow.cs:426:10:426:10 | M | +| cflow.cs:428:9:428:73 | ...; | cflow.cs:426:10:426:10 | M | +| cflow.cs:428:38:428:38 | 0 | cflow.cs:426:10:426:10 | M | +| cflow.cs:428:44:428:51 | !... | cflow.cs:426:10:426:10 | M | +| cflow.cs:428:44:428:64 | ... && ... | cflow.cs:426:10:426:10 | M | +| cflow.cs:428:46:428:46 | access to parameter i | cflow.cs:426:10:426:10 | M | +| cflow.cs:428:46:428:50 | ... > ... | cflow.cs:426:10:426:10 | M | +| cflow.cs:428:50:428:50 | 0 | cflow.cs:426:10:426:10 | M | +| cflow.cs:428:56:428:56 | access to parameter s | cflow.cs:426:10:426:10 | M | +| cflow.cs:428:56:428:64 | ... != ... | cflow.cs:426:10:426:10 | M | +| cflow.cs:428:61:428:64 | null | cflow.cs:426:10:426:10 | M | +| cflow.cs:428:70:428:71 | "" | cflow.cs:426:10:426:10 | M | +blockEnclosing +| AccessorCalls.cs:5:23:5:25 | enter get_Item | AccessorCalls.cs:5:23:5:25 | get_Item | +| AccessorCalls.cs:5:33:5:35 | enter set_Item | AccessorCalls.cs:5:33:5:35 | set_Item | +| AccessorCalls.cs:7:32:7:34 | enter add_Event | AccessorCalls.cs:7:32:7:34 | add_Event | +| AccessorCalls.cs:7:40:7:45 | enter remove_Event | AccessorCalls.cs:7:40:7:45 | remove_Event | +| AccessorCalls.cs:10:10:10:11 | enter M1 | AccessorCalls.cs:10:10:10:11 | M1 | +| AccessorCalls.cs:19:10:19:11 | enter M2 | AccessorCalls.cs:19:10:19:11 | M2 | +| AccessorCalls.cs:28:10:28:11 | enter M3 | AccessorCalls.cs:28:10:28:11 | M3 | +| AccessorCalls.cs:35:10:35:11 | enter M4 | AccessorCalls.cs:35:10:35:11 | M4 | +| AccessorCalls.cs:42:10:42:11 | enter M5 | AccessorCalls.cs:42:10:42:11 | M5 | +| AccessorCalls.cs:49:10:49:11 | enter M6 | AccessorCalls.cs:49:10:49:11 | M6 | +| AccessorCalls.cs:56:10:56:11 | enter M7 | AccessorCalls.cs:56:10:56:11 | M7 | +| AccessorCalls.cs:61:10:61:11 | enter M8 | AccessorCalls.cs:61:10:61:11 | M8 | +| AccessorCalls.cs:66:10:66:11 | enter M9 | AccessorCalls.cs:66:10:66:11 | M9 | +| ArrayCreation.cs:3:11:3:12 | enter M1 | ArrayCreation.cs:3:11:3:12 | M1 | +| ArrayCreation.cs:5:12:5:13 | enter M2 | ArrayCreation.cs:5:12:5:13 | M2 | +| ArrayCreation.cs:7:11:7:12 | enter M3 | ArrayCreation.cs:7:11:7:12 | M3 | +| ArrayCreation.cs:9:12:9:13 | enter M4 | ArrayCreation.cs:9:12:9:13 | M4 | +| Assignments.cs:3:10:3:10 | enter M | Assignments.cs:3:10:3:10 | M | +| Assignments.cs:14:18:14:35 | enter (...) => ... | Assignments.cs:14:18:14:35 | (...) => ... | +| Assignments.cs:17:40:17:40 | enter + | Assignments.cs:17:40:17:40 | + | +| BreakInTry.cs:3:10:3:11 | enter M1 | BreakInTry.cs:3:10:3:11 | M1 | +| BreakInTry.cs:3:10:3:11 | exit M1 | BreakInTry.cs:3:10:3:11 | M1 | +| BreakInTry.cs:7:13:11:13 | foreach (... ... in ...) ... | BreakInTry.cs:3:10:3:11 | M1 | +| BreakInTry.cs:7:26:7:28 | String arg | BreakInTry.cs:3:10:3:11 | M1 | +| BreakInTry.cs:10:21:10:26 | break; | BreakInTry.cs:3:10:3:11 | M1 | +| BreakInTry.cs:14:9:17:9 | {...} | BreakInTry.cs:3:10:3:11 | M1 | +| BreakInTry.cs:16:17:16:17 | ; | BreakInTry.cs:3:10:3:11 | M1 | +| BreakInTry.cs:20:10:20:11 | enter M2 | BreakInTry.cs:20:10:20:11 | M2 | +| BreakInTry.cs:22:9:34:9 | foreach (... ... in ...) ... | BreakInTry.cs:20:10:20:11 | M2 | +| BreakInTry.cs:22:22:22:24 | String arg | BreakInTry.cs:20:10:20:11 | M2 | +| BreakInTry.cs:27:21:27:26 | break; | BreakInTry.cs:20:10:20:11 | M2 | +| BreakInTry.cs:30:13:33:13 | {...} | BreakInTry.cs:20:10:20:11 | M2 | +| BreakInTry.cs:32:21:32:21 | ; | BreakInTry.cs:20:10:20:11 | M2 | +| BreakInTry.cs:32:21:32:21 | [finally: break] ; | BreakInTry.cs:20:10:20:11 | M2 | +| BreakInTry.cs:35:7:35:7 | ; | BreakInTry.cs:20:10:20:11 | M2 | +| BreakInTry.cs:38:10:38:11 | enter M3 | BreakInTry.cs:38:10:38:11 | M3 | +| BreakInTry.cs:38:10:38:11 | exit M3 | BreakInTry.cs:38:10:38:11 | M3 | +| BreakInTry.cs:43:17:43:23 | return ...; | BreakInTry.cs:38:10:38:11 | M3 | +| BreakInTry.cs:46:9:52:9 | {...} | BreakInTry.cs:38:10:38:11 | M3 | +| BreakInTry.cs:47:13:51:13 | [finally: return] foreach (... ... in ...) ... | BreakInTry.cs:38:10:38:11 | M3 | +| BreakInTry.cs:47:13:51:13 | foreach (... ... in ...) ... | BreakInTry.cs:38:10:38:11 | M3 | +| BreakInTry.cs:47:26:47:28 | String arg | BreakInTry.cs:38:10:38:11 | M3 | +| BreakInTry.cs:47:26:47:28 | [finally: return] String arg | BreakInTry.cs:38:10:38:11 | M3 | +| BreakInTry.cs:50:21:50:26 | [finally: return] break; | BreakInTry.cs:38:10:38:11 | M3 | +| BreakInTry.cs:50:21:50:26 | break; | BreakInTry.cs:38:10:38:11 | M3 | +| BreakInTry.cs:53:7:53:7 | ; | BreakInTry.cs:38:10:38:11 | M3 | +| BreakInTry.cs:56:10:56:11 | enter M4 | BreakInTry.cs:56:10:56:11 | M4 | +| BreakInTry.cs:56:10:56:11 | exit M4 | BreakInTry.cs:56:10:56:11 | M4 | +| BreakInTry.cs:61:17:61:23 | return ...; | BreakInTry.cs:56:10:56:11 | M4 | +| BreakInTry.cs:64:9:70:9 | {...} | BreakInTry.cs:56:10:56:11 | M4 | +| BreakInTry.cs:65:13:69:13 | [finally: return] foreach (... ... in ...) ... | BreakInTry.cs:56:10:56:11 | M4 | +| BreakInTry.cs:65:13:69:13 | foreach (... ... in ...) ... | BreakInTry.cs:56:10:56:11 | M4 | +| BreakInTry.cs:65:26:65:28 | String arg | BreakInTry.cs:56:10:56:11 | M4 | +| BreakInTry.cs:65:26:65:28 | [finally: return] String arg | BreakInTry.cs:56:10:56:11 | M4 | +| BreakInTry.cs:68:21:68:26 | [finally: return] break; | BreakInTry.cs:56:10:56:11 | M4 | +| BreakInTry.cs:68:21:68:26 | break; | BreakInTry.cs:56:10:56:11 | M4 | +| CatchInFinally.cs:5:10:5:11 | enter M1 | CatchInFinally.cs:5:10:5:11 | M1 | +| CatchInFinally.cs:5:10:5:11 | exit M1 | CatchInFinally.cs:5:10:5:11 | M1 | +| CatchInFinally.cs:10:17:10:50 | throw ...; | CatchInFinally.cs:5:10:5:11 | M1 | +| CatchInFinally.cs:10:23:10:49 | object creation of type ArgumentNullException | CatchInFinally.cs:5:10:5:11 | M1 | +| CatchInFinally.cs:13:9:27:9 | [finally: exception(Exception)] {...} | CatchInFinally.cs:5:10:5:11 | M1 | +| CatchInFinally.cs:13:9:27:9 | {...} | CatchInFinally.cs:5:10:5:11 | M1 | +| CatchInFinally.cs:16:36:16:36 | 1 | CatchInFinally.cs:5:10:5:11 | M1 | +| CatchInFinally.cs:16:36:16:36 | [finally: exception(ArgumentNullException)] 1 | CatchInFinally.cs:5:10:5:11 | M1 | +| CatchInFinally.cs:16:36:16:36 | [finally: exception(Exception)] 1 | CatchInFinally.cs:5:10:5:11 | M1 | +| CatchInFinally.cs:17:21:17:45 | [finally: exception(ArgumentNullException)] throw ...; | CatchInFinally.cs:5:10:5:11 | M1 | +| CatchInFinally.cs:17:21:17:45 | [finally: exception(Exception)] throw ...; | CatchInFinally.cs:5:10:5:11 | M1 | +| CatchInFinally.cs:17:21:17:45 | throw ...; | CatchInFinally.cs:5:10:5:11 | M1 | +| CatchInFinally.cs:17:41:17:43 | "1" | CatchInFinally.cs:5:10:5:11 | M1 | +| CatchInFinally.cs:17:41:17:43 | [finally: exception(ArgumentNullException)] "1" | CatchInFinally.cs:5:10:5:11 | M1 | +| CatchInFinally.cs:17:41:17:43 | [finally: exception(Exception)] "1" | CatchInFinally.cs:5:10:5:11 | M1 | +| CatchInFinally.cs:19:13:22:13 | [exception: Exception] catch (...) {...} | CatchInFinally.cs:5:10:5:11 | M1 | +| CatchInFinally.cs:19:13:22:13 | [exception: NullReferenceException] catch (...) {...} | CatchInFinally.cs:5:10:5:11 | M1 | +| CatchInFinally.cs:19:13:22:13 | [finally: exception(ArgumentNullException), exception: Exception] catch (...) {...} | CatchInFinally.cs:5:10:5:11 | M1 | +| CatchInFinally.cs:19:13:22:13 | [finally: exception(ArgumentNullException), exception: NullReferenceException] catch (...) {...} | CatchInFinally.cs:5:10:5:11 | M1 | +| CatchInFinally.cs:19:13:22:13 | [finally: exception(Exception), exception: Exception] catch (...) {...} | CatchInFinally.cs:5:10:5:11 | M1 | +| CatchInFinally.cs:19:13:22:13 | [finally: exception(Exception), exception: NullReferenceException] catch (...) {...} | CatchInFinally.cs:5:10:5:11 | M1 | +| CatchInFinally.cs:20:13:22:13 | [finally: exception(ArgumentNullException)] {...} | CatchInFinally.cs:5:10:5:11 | M1 | +| CatchInFinally.cs:20:13:22:13 | [finally: exception(Exception)] {...} | CatchInFinally.cs:5:10:5:11 | M1 | +| CatchInFinally.cs:20:13:22:13 | {...} | CatchInFinally.cs:5:10:5:11 | M1 | +| CatchInFinally.cs:23:13:26:13 | [finally: exception(ArgumentNullException)] catch {...} | CatchInFinally.cs:5:10:5:11 | M1 | +| CatchInFinally.cs:23:13:26:13 | [finally: exception(Exception)] catch {...} | CatchInFinally.cs:5:10:5:11 | M1 | +| CatchInFinally.cs:23:13:26:13 | catch {...} | CatchInFinally.cs:5:10:5:11 | M1 | +| CatchInFinally.cs:34:24:34:25 | enter M2 | CatchInFinally.cs:34:24:34:25 | M2 | +| CatchInFinally.cs:34:24:34:25 | exit M2 | CatchInFinally.cs:34:24:34:25 | M2 | +| CatchInFinally.cs:38:21:38:43 | [b1 (line 34): true] throw ...; | CatchInFinally.cs:34:24:34:25 | M2 | +| CatchInFinally.cs:38:27:38:42 | [b1 (line 34): true] object creation of type ExceptionA | CatchInFinally.cs:34:24:34:25 | M2 | +| CatchInFinally.cs:41:9:50:9 | [b1 (line 34): false] {...} | CatchInFinally.cs:34:24:34:25 | M2 | +| CatchInFinally.cs:41:9:50:9 | [finally: exception(Exception), b1 (line 34): true] {...} | CatchInFinally.cs:34:24:34:25 | M2 | +| CatchInFinally.cs:44:25:44:47 | [b1 (line 34): false, b2 (line 34): true] throw ...; | CatchInFinally.cs:34:24:34:25 | M2 | +| CatchInFinally.cs:44:25:44:47 | [finally: exception(Exception), b1 (line 34): true, b2 (line 34): true] throw ...; | CatchInFinally.cs:34:24:34:25 | M2 | +| CatchInFinally.cs:44:25:44:47 | [finally: exception(ExceptionA), b1 (line 34): true, b2 (line 34): true] throw ...; | CatchInFinally.cs:34:24:34:25 | M2 | +| CatchInFinally.cs:44:31:44:46 | [b1 (line 34): false, b2 (line 34): true] object creation of type ExceptionB | CatchInFinally.cs:34:24:34:25 | M2 | +| CatchInFinally.cs:44:31:44:46 | [finally: exception(Exception), b1 (line 34): true, b2 (line 34): true] object creation of type ExceptionB | CatchInFinally.cs:34:24:34:25 | M2 | +| CatchInFinally.cs:44:31:44:46 | [finally: exception(ExceptionA), b1 (line 34): true, b2 (line 34): true] object creation of type ExceptionB | CatchInFinally.cs:34:24:34:25 | M2 | +| CatchInFinally.cs:46:13:49:13 | [exception: Exception, b1 (line 34): false, b2 (line 34): true] catch (...) {...} | CatchInFinally.cs:34:24:34:25 | M2 | +| CatchInFinally.cs:46:13:49:13 | [finally: exception(Exception), exception: Exception, b1 (line 34): true, b2 (line 34): true] catch (...) {...} | CatchInFinally.cs:34:24:34:25 | M2 | +| CatchInFinally.cs:46:13:49:13 | [finally: exception(ExceptionA), exception: Exception, b1 (line 34): true, b2 (line 34): true] catch (...) {...} | CatchInFinally.cs:34:24:34:25 | M2 | +| CatchInFinally.cs:46:38:46:39 | [exception: Exception, b1 (line 34): false, b2 (line 34): true] access to parameter b2 | CatchInFinally.cs:34:24:34:25 | M2 | +| CatchInFinally.cs:46:38:46:39 | [finally: exception(Exception), exception: Exception, b1 (line 34): true, b2 (line 34): true] access to parameter b2 | CatchInFinally.cs:34:24:34:25 | M2 | +| CatchInFinally.cs:46:38:46:39 | [finally: exception(ExceptionA), exception: Exception, b1 (line 34): true, b2 (line 34): true] access to parameter b2 | CatchInFinally.cs:34:24:34:25 | M2 | +| CatchInFinally.cs:47:13:49:13 | [b1 (line 34): false] {...} | CatchInFinally.cs:34:24:34:25 | M2 | +| CatchInFinally.cs:47:13:49:13 | [finally: exception(Exception), b1 (line 34): true] {...} | CatchInFinally.cs:34:24:34:25 | M2 | +| CatchInFinally.cs:47:13:49:13 | [finally: exception(ExceptionA), b1 (line 34): true] {...} | CatchInFinally.cs:34:24:34:25 | M2 | +| CompileTimeOperators.cs:5:9:5:15 | enter Default | CompileTimeOperators.cs:5:9:5:15 | Default | +| CompileTimeOperators.cs:10:9:10:14 | enter Sizeof | CompileTimeOperators.cs:10:9:10:14 | Sizeof | +| CompileTimeOperators.cs:15:10:15:15 | enter Typeof | CompileTimeOperators.cs:15:10:15:15 | Typeof | +| CompileTimeOperators.cs:20:12:20:17 | enter Nameof | CompileTimeOperators.cs:20:12:20:17 | Nameof | +| CompileTimeOperators.cs:28:10:28:10 | enter M | CompileTimeOperators.cs:28:10:28:10 | M | +| ConditionalAccess.cs:3:12:3:13 | enter M1 | ConditionalAccess.cs:3:12:3:13 | M1 | +| ConditionalAccess.cs:3:12:3:13 | exit M1 | ConditionalAccess.cs:3:12:3:13 | M1 | +| ConditionalAccess.cs:3:28:3:38 | call to method ToString | ConditionalAccess.cs:3:12:3:13 | M1 | +| ConditionalAccess.cs:3:40:3:49 | call to method ToLower | ConditionalAccess.cs:3:12:3:13 | M1 | +| ConditionalAccess.cs:5:10:5:11 | enter M2 | ConditionalAccess.cs:5:10:5:11 | M2 | +| ConditionalAccess.cs:5:10:5:11 | exit M2 | ConditionalAccess.cs:5:10:5:11 | M2 | +| ConditionalAccess.cs:5:28:5:34 | access to property Length | ConditionalAccess.cs:5:10:5:11 | M2 | +| ConditionalAccess.cs:7:10:7:11 | enter M3 | ConditionalAccess.cs:7:10:7:11 | M3 | +| ConditionalAccess.cs:7:10:7:11 | exit M3 | ConditionalAccess.cs:7:10:7:11 | M3 | +| ConditionalAccess.cs:7:45:7:46 | access to parameter s2 | ConditionalAccess.cs:7:10:7:11 | M3 | +| ConditionalAccess.cs:7:49:7:55 | access to property Length | ConditionalAccess.cs:7:10:7:11 | M3 | +| ConditionalAccess.cs:9:9:9:10 | enter M4 | ConditionalAccess.cs:9:9:9:10 | M4 | +| ConditionalAccess.cs:9:9:9:10 | exit M4 | ConditionalAccess.cs:9:9:9:10 | M4 | +| ConditionalAccess.cs:9:27:9:33 | access to property Length | ConditionalAccess.cs:9:9:9:10 | M4 | +| ConditionalAccess.cs:9:38:9:38 | 0 | ConditionalAccess.cs:9:9:9:10 | M4 | +| ConditionalAccess.cs:11:9:11:10 | enter M5 | ConditionalAccess.cs:11:9:11:10 | M5 | +| ConditionalAccess.cs:11:9:11:10 | exit M5 | ConditionalAccess.cs:11:9:11:10 | M5 | +| ConditionalAccess.cs:13:15:13:21 | access to property Length | ConditionalAccess.cs:11:9:11:10 | M5 | +| ConditionalAccess.cs:13:25:13:25 | 0 | ConditionalAccess.cs:11:9:11:10 | M5 | +| ConditionalAccess.cs:14:20:14:20 | 0 | ConditionalAccess.cs:11:9:11:10 | M5 | +| ConditionalAccess.cs:16:20:16:20 | 1 | ConditionalAccess.cs:11:9:11:10 | M5 | +| ConditionalAccess.cs:19:12:19:13 | enter M6 | ConditionalAccess.cs:19:12:19:13 | M6 | +| ConditionalAccess.cs:19:12:19:13 | exit M6 | ConditionalAccess.cs:19:12:19:13 | M6 | +| ConditionalAccess.cs:19:58:19:59 | access to parameter s2 | ConditionalAccess.cs:19:12:19:13 | M6 | +| ConditionalAccess.cs:21:10:21:11 | enter M7 | ConditionalAccess.cs:21:10:21:11 | M7 | +| ConditionalAccess.cs:31:26:31:38 | enter CommaJoinWith | ConditionalAccess.cs:31:26:31:38 | CommaJoinWith | +| Conditions.cs:3:10:3:19 | enter IncrOrDecr | Conditions.cs:3:10:3:19 | IncrOrDecr | +| Conditions.cs:3:10:3:19 | exit IncrOrDecr | Conditions.cs:3:10:3:19 | IncrOrDecr | +| Conditions.cs:6:13:6:16 | [inc (line 3): true] ...; | Conditions.cs:3:10:3:19 | IncrOrDecr | +| Conditions.cs:7:9:8:16 | [inc (line 3): false] if (...) ... | Conditions.cs:3:10:3:19 | IncrOrDecr | +| Conditions.cs:11:9:11:10 | enter M1 | Conditions.cs:11:9:11:10 | M1 | +| Conditions.cs:15:13:15:16 | [b (line 11): true] ...; | Conditions.cs:11:9:11:10 | M1 | +| Conditions.cs:16:9:18:20 | [b (line 11): false] if (...) ... | Conditions.cs:11:9:11:10 | M1 | +| Conditions.cs:17:13:18:20 | [b (line 11): false] if (...) ... | Conditions.cs:11:9:11:10 | M1 | +| Conditions.cs:17:13:18:20 | [b (line 11): true] if (...) ... | Conditions.cs:11:9:11:10 | M1 | +| Conditions.cs:19:16:19:16 | access to local variable x | Conditions.cs:11:9:11:10 | M1 | +| Conditions.cs:22:9:22:10 | enter M2 | Conditions.cs:22:9:22:10 | M2 | +| Conditions.cs:26:13:27:20 | if (...) ... | Conditions.cs:22:9:22:10 | M2 | +| Conditions.cs:27:17:27:20 | [b2 (line 22): true] ...; | Conditions.cs:22:9:22:10 | M2 | +| Conditions.cs:28:9:29:16 | [b2 (line 22): false] if (...) ... | Conditions.cs:22:9:22:10 | M2 | +| Conditions.cs:28:9:29:16 | if (...) ... | Conditions.cs:22:9:22:10 | M2 | +| Conditions.cs:29:13:29:16 | ...; | Conditions.cs:22:9:22:10 | M2 | +| Conditions.cs:30:16:30:16 | access to local variable x | Conditions.cs:22:9:22:10 | M2 | +| Conditions.cs:33:9:33:10 | enter M3 | Conditions.cs:33:9:33:10 | M3 | +| Conditions.cs:38:13:38:20 | ...; | Conditions.cs:33:9:33:10 | M3 | +| Conditions.cs:39:9:40:16 | if (...) ... | Conditions.cs:33:9:33:10 | M3 | +| Conditions.cs:40:13:40:16 | [b2 (line 39): true] ...; | Conditions.cs:33:9:33:10 | M3 | +| Conditions.cs:41:9:42:16 | [b2 (line 39): false] if (...) ... | Conditions.cs:33:9:33:10 | M3 | +| Conditions.cs:43:16:43:16 | access to local variable x | Conditions.cs:33:9:33:10 | M3 | +| Conditions.cs:46:9:46:10 | enter M4 | Conditions.cs:46:9:46:10 | M4 | +| Conditions.cs:49:16:49:16 | [b (line 46): false] access to parameter x | Conditions.cs:46:9:46:10 | M4 | +| Conditions.cs:50:9:53:9 | [b (line 46): false] {...} | Conditions.cs:46:9:46:10 | M4 | +| Conditions.cs:50:9:53:9 | [b (line 46): true] {...} | Conditions.cs:46:9:46:10 | M4 | +| Conditions.cs:50:9:53:9 | {...} | Conditions.cs:46:9:46:10 | M4 | +| Conditions.cs:52:17:52:20 | [b (line 46): true] ...; | Conditions.cs:46:9:46:10 | M4 | +| Conditions.cs:54:16:54:16 | access to local variable y | Conditions.cs:46:9:46:10 | M4 | +| Conditions.cs:57:9:57:10 | enter M5 | Conditions.cs:57:9:57:10 | M5 | +| Conditions.cs:60:16:60:16 | [b (line 57): false] access to parameter x | Conditions.cs:57:9:57:10 | M5 | +| Conditions.cs:61:9:64:9 | [b (line 57): false] {...} | Conditions.cs:57:9:57:10 | M5 | +| Conditions.cs:61:9:64:9 | [b (line 57): true] {...} | Conditions.cs:57:9:57:10 | M5 | +| Conditions.cs:61:9:64:9 | {...} | Conditions.cs:57:9:57:10 | M5 | +| Conditions.cs:63:17:63:20 | [b (line 57): true] ...; | Conditions.cs:57:9:57:10 | M5 | +| Conditions.cs:65:9:66:16 | [b (line 57): false] if (...) ... | Conditions.cs:57:9:57:10 | M5 | +| Conditions.cs:65:9:66:16 | [b (line 57): true] if (...) ... | Conditions.cs:57:9:57:10 | M5 | +| Conditions.cs:65:9:66:16 | if (...) ... | Conditions.cs:57:9:57:10 | M5 | +| Conditions.cs:66:13:66:16 | ...; | Conditions.cs:57:9:57:10 | M5 | +| Conditions.cs:67:16:67:16 | access to local variable y | Conditions.cs:57:9:57:10 | M5 | +| Conditions.cs:70:9:70:10 | enter M6 | Conditions.cs:70:9:70:10 | M6 | +| Conditions.cs:74:9:80:9 | foreach (... ... in ...) ... | Conditions.cs:70:9:70:10 | M6 | +| Conditions.cs:75:9:80:9 | {...} | Conditions.cs:70:9:70:10 | M6 | +| Conditions.cs:77:17:77:20 | ...; | Conditions.cs:70:9:70:10 | M6 | +| Conditions.cs:78:13:79:26 | if (...) ... | Conditions.cs:70:9:70:10 | M6 | +| Conditions.cs:79:17:79:26 | ...; | Conditions.cs:70:9:70:10 | M6 | +| Conditions.cs:81:9:82:16 | if (...) ... | Conditions.cs:70:9:70:10 | M6 | +| Conditions.cs:82:13:82:16 | ...; | Conditions.cs:70:9:70:10 | M6 | +| Conditions.cs:83:16:83:16 | access to local variable x | Conditions.cs:70:9:70:10 | M6 | +| Conditions.cs:86:9:86:10 | enter M7 | Conditions.cs:86:9:86:10 | M7 | +| Conditions.cs:90:9:98:9 | foreach (... ... in ...) ... | Conditions.cs:86:9:86:10 | M7 | +| Conditions.cs:91:9:98:9 | {...} | Conditions.cs:86:9:86:10 | M7 | +| Conditions.cs:93:17:93:20 | ...; | Conditions.cs:86:9:86:10 | M7 | +| Conditions.cs:94:13:95:26 | if (...) ... | Conditions.cs:86:9:86:10 | M7 | +| Conditions.cs:95:17:95:26 | ...; | Conditions.cs:86:9:86:10 | M7 | +| Conditions.cs:96:13:97:20 | if (...) ... | Conditions.cs:86:9:86:10 | M7 | +| Conditions.cs:97:17:97:20 | ...; | Conditions.cs:86:9:86:10 | M7 | +| Conditions.cs:99:16:99:16 | access to local variable x | Conditions.cs:86:9:86:10 | M7 | +| Conditions.cs:102:12:102:13 | enter M8 | Conditions.cs:102:12:102:13 | M8 | +| Conditions.cs:106:13:106:20 | [b (line 102): true] ...; | Conditions.cs:102:12:102:13 | M8 | +| Conditions.cs:107:9:109:24 | [b (line 102): false] if (...) ... | Conditions.cs:102:12:102:13 | M8 | +| Conditions.cs:108:13:109:24 | [b (line 102): false] if (...) ... | Conditions.cs:102:12:102:13 | M8 | +| Conditions.cs:108:13:109:24 | [b (line 102): true] if (...) ... | Conditions.cs:102:12:102:13 | M8 | +| Conditions.cs:110:16:110:16 | access to local variable x | Conditions.cs:102:12:102:13 | M8 | +| Conditions.cs:113:10:113:11 | enter M9 | Conditions.cs:113:10:113:11 | M9 | +| Conditions.cs:113:10:113:11 | exit M9 | Conditions.cs:113:10:113:11 | M9 | +| Conditions.cs:116:24:116:24 | access to local variable i | Conditions.cs:113:10:113:11 | M9 | +| Conditions.cs:116:41:116:41 | access to local variable i | Conditions.cs:113:10:113:11 | M9 | +| Conditions.cs:117:9:123:9 | {...} | Conditions.cs:113:10:113:11 | M9 | +| Conditions.cs:120:17:120:23 | [last (line 118): false] ...; | Conditions.cs:113:10:113:11 | M9 | +| Conditions.cs:121:13:122:25 | [last (line 118): true] if (...) ... | Conditions.cs:113:10:113:11 | M9 | +| Conditions.cs:129:10:129:12 | enter M10 | Conditions.cs:129:10:129:12 | M10 | +| Conditions.cs:131:16:131:19 | [Field1 (line 129): false] true | Conditions.cs:129:10:129:12 | M10 | +| Conditions.cs:131:16:131:19 | [Field1 (line 129): true, Field2 (line 129): false] true | Conditions.cs:129:10:129:12 | M10 | +| Conditions.cs:134:13:139:13 | [Field1 (line 129): true] {...} | Conditions.cs:129:10:129:12 | M10 | +| Conditions.cs:136:17:138:17 | [Field1 (line 129): true, Field2 (line 129): true] {...} | Conditions.cs:129:10:129:12 | M10 | +| ExitMethods.cs:7:10:7:11 | enter M1 | ExitMethods.cs:7:10:7:11 | M1 | +| ExitMethods.cs:13:10:13:11 | enter M2 | ExitMethods.cs:13:10:13:11 | M2 | +| ExitMethods.cs:19:10:19:11 | enter M3 | ExitMethods.cs:19:10:19:11 | M3 | +| ExitMethods.cs:25:10:25:11 | enter M4 | ExitMethods.cs:25:10:25:11 | M4 | +| ExitMethods.cs:31:10:31:11 | enter M5 | ExitMethods.cs:31:10:31:11 | M5 | +| ExitMethods.cs:37:10:37:11 | enter M6 | ExitMethods.cs:37:10:37:11 | M6 | +| ExitMethods.cs:37:10:37:11 | exit M6 | ExitMethods.cs:37:10:37:11 | M6 | +| ExitMethods.cs:43:9:46:9 | [exception: ArgumentException] catch (...) {...} | ExitMethods.cs:37:10:37:11 | M6 | +| ExitMethods.cs:43:9:46:9 | [exception: Exception] catch (...) {...} | ExitMethods.cs:37:10:37:11 | M6 | +| ExitMethods.cs:44:9:46:9 | {...} | ExitMethods.cs:37:10:37:11 | M6 | +| ExitMethods.cs:47:9:50:9 | [exception: Exception] catch (...) {...} | ExitMethods.cs:37:10:37:11 | M6 | +| ExitMethods.cs:53:10:53:11 | enter M7 | ExitMethods.cs:53:10:53:11 | M7 | +| ExitMethods.cs:59:10:59:11 | enter M8 | ExitMethods.cs:59:10:59:11 | M8 | +| ExitMethods.cs:65:17:65:26 | enter ErrorMaybe | ExitMethods.cs:65:17:65:26 | ErrorMaybe | +| ExitMethods.cs:65:17:65:26 | exit ErrorMaybe | ExitMethods.cs:65:17:65:26 | ErrorMaybe | +| ExitMethods.cs:68:19:68:33 | object creation of type Exception | ExitMethods.cs:65:17:65:26 | ErrorMaybe | +| ExitMethods.cs:71:17:71:27 | enter ErrorAlways | ExitMethods.cs:71:17:71:27 | ErrorAlways | +| ExitMethods.cs:71:17:71:27 | exit ErrorAlways | ExitMethods.cs:71:17:71:27 | ErrorAlways | +| ExitMethods.cs:74:19:74:33 | object creation of type Exception | ExitMethods.cs:71:17:71:27 | ErrorAlways | +| ExitMethods.cs:76:41:76:43 | "b" | ExitMethods.cs:71:17:71:27 | ErrorAlways | +| ExitMethods.cs:79:17:79:28 | enter ErrorAlways2 | ExitMethods.cs:79:17:79:28 | ErrorAlways2 | +| ExitMethods.cs:84:17:84:28 | enter ErrorAlways3 | ExitMethods.cs:84:17:84:28 | ErrorAlways3 | +| ExitMethods.cs:86:10:86:13 | enter Exit | ExitMethods.cs:86:10:86:13 | Exit | +| ExitMethods.cs:91:10:91:18 | enter ExitInTry | ExitMethods.cs:91:10:91:18 | ExitInTry | +| ExitMethods.cs:104:10:104:24 | enter ApplicationExit | ExitMethods.cs:104:10:104:24 | ApplicationExit | +| ExitMethods.cs:109:13:109:21 | enter ThrowExpr | ExitMethods.cs:109:13:109:21 | ThrowExpr | +| ExitMethods.cs:109:13:109:21 | exit ThrowExpr | ExitMethods.cs:109:13:109:21 | ThrowExpr | +| ExitMethods.cs:111:29:111:29 | 1 | ExitMethods.cs:109:13:109:21 | ThrowExpr | +| ExitMethods.cs:111:69:111:75 | "input" | ExitMethods.cs:109:13:109:21 | ThrowExpr | +| ExitMethods.cs:114:16:114:34 | enter ExtensionMethodCall | ExitMethods.cs:114:16:114:34 | ExtensionMethodCall | +| ExitMethods.cs:116:9:116:39 | return ...; | ExitMethods.cs:114:16:114:34 | ExtensionMethodCall | +| ExitMethods.cs:116:34:116:34 | 0 | ExitMethods.cs:114:16:114:34 | ExtensionMethodCall | +| ExitMethods.cs:116:38:116:38 | 1 | ExitMethods.cs:114:16:114:34 | ExtensionMethodCall | +| ExitMethods.cs:119:17:119:32 | enter FailingAssertion | ExitMethods.cs:119:17:119:32 | FailingAssertion | +| ExitMethods.cs:125:17:125:33 | enter FailingAssertion2 | ExitMethods.cs:125:17:125:33 | FailingAssertion2 | +| ExitMethods.cs:131:10:131:20 | enter AssertFalse | ExitMethods.cs:131:10:131:20 | AssertFalse | +| ExitMethods.cs:133:17:133:33 | enter FailingAssertion3 | ExitMethods.cs:133:17:133:33 | FailingAssertion3 | +| Extensions.cs:5:23:5:29 | enter ToInt32 | Extensions.cs:5:23:5:29 | ToInt32 | +| Extensions.cs:10:24:10:29 | enter ToBool | Extensions.cs:10:24:10:29 | ToBool | +| Extensions.cs:15:23:15:33 | enter CallToInt32 | Extensions.cs:15:23:15:33 | CallToInt32 | +| Extensions.cs:20:17:20:20 | enter Main | Extensions.cs:20:17:20:20 | Main | +| Foreach.cs:6:10:6:11 | enter M1 | Foreach.cs:6:10:6:11 | M1 | +| Foreach.cs:6:10:6:11 | exit M1 | Foreach.cs:6:10:6:11 | M1 | +| Foreach.cs:8:9:9:13 | foreach (... ... in ...) ... | Foreach.cs:6:10:6:11 | M1 | +| Foreach.cs:8:22:8:24 | String arg | Foreach.cs:6:10:6:11 | M1 | +| Foreach.cs:12:10:12:11 | enter M2 | Foreach.cs:12:10:12:11 | M2 | +| Foreach.cs:12:10:12:11 | exit M2 | Foreach.cs:12:10:12:11 | M2 | +| Foreach.cs:14:9:15:13 | foreach (... ... in ...) ... | Foreach.cs:12:10:12:11 | M2 | +| Foreach.cs:15:13:15:13 | ; | Foreach.cs:12:10:12:11 | M2 | +| Foreach.cs:18:10:18:11 | enter M3 | Foreach.cs:18:10:18:11 | M3 | +| Foreach.cs:18:10:18:11 | exit M3 | Foreach.cs:18:10:18:11 | M3 | +| Foreach.cs:20:9:21:11 | foreach (... ... in ...) ... | Foreach.cs:18:10:18:11 | M3 | +| Foreach.cs:20:22:20:22 | String x | Foreach.cs:18:10:18:11 | M3 | +| Foreach.cs:20:29:20:38 | call to method ToArray | Foreach.cs:18:10:18:11 | M3 | +| Foreach.cs:20:43:20:68 | call to method Empty | Foreach.cs:18:10:18:11 | M3 | +| Foreach.cs:24:10:24:11 | enter M4 | Foreach.cs:24:10:24:11 | M4 | +| Foreach.cs:24:10:24:11 | exit M4 | Foreach.cs:24:10:24:11 | M4 | +| Foreach.cs:26:9:27:11 | foreach (... ... in ...) ... | Foreach.cs:24:10:24:11 | M4 | +| Foreach.cs:26:23:26:23 | String x | Foreach.cs:24:10:24:11 | M4 | +| Foreach.cs:30:10:30:11 | enter M5 | Foreach.cs:30:10:30:11 | M5 | +| Foreach.cs:30:10:30:11 | exit M5 | Foreach.cs:30:10:30:11 | M5 | +| Foreach.cs:32:9:33:11 | foreach (... ... in ...) ... | Foreach.cs:30:10:30:11 | M5 | +| Foreach.cs:32:23:32:23 | String x | Foreach.cs:30:10:30:11 | M5 | +| Foreach.cs:36:10:36:11 | enter M6 | Foreach.cs:36:10:36:11 | M6 | +| Foreach.cs:36:10:36:11 | exit M6 | Foreach.cs:36:10:36:11 | M6 | +| Foreach.cs:38:9:39:11 | foreach (... ... in ...) ... | Foreach.cs:36:10:36:11 | M6 | +| Foreach.cs:38:26:38:26 | String x | Foreach.cs:36:10:36:11 | M6 | +| Initializers.cs:6:5:6:16 | enter Initializers | Initializers.cs:6:5:6:16 | Initializers | +| Initializers.cs:8:5:8:16 | enter Initializers | Initializers.cs:8:5:8:16 | Initializers | +| Initializers.cs:10:10:10:10 | enter M | Initializers.cs:10:10:10:10 | M | +| Initializers.cs:18:11:18:23 | enter NoConstructor | Initializers.cs:18:11:18:23 | NoConstructor | +| Initializers.cs:29:9:29:11 | enter Sub | Initializers.cs:29:9:29:11 | Sub | +| Initializers.cs:31:9:31:11 | enter Sub | Initializers.cs:31:9:31:11 | Sub | +| Initializers.cs:33:9:33:11 | enter Sub | Initializers.cs:33:9:33:11 | Sub | +| NullCoalescing.cs:3:9:3:10 | enter M1 | NullCoalescing.cs:3:9:3:10 | M1 | +| NullCoalescing.cs:3:9:3:10 | exit M1 | NullCoalescing.cs:3:9:3:10 | M1 | +| NullCoalescing.cs:3:28:3:28 | 0 | NullCoalescing.cs:3:9:3:10 | M1 | +| NullCoalescing.cs:5:9:5:10 | enter M2 | NullCoalescing.cs:5:9:5:10 | M2 | +| NullCoalescing.cs:5:9:5:10 | exit M2 | NullCoalescing.cs:5:9:5:10 | M2 | +| NullCoalescing.cs:5:30:5:34 | false | NullCoalescing.cs:5:9:5:10 | M2 | +| NullCoalescing.cs:5:39:5:39 | 0 | NullCoalescing.cs:5:9:5:10 | M2 | +| NullCoalescing.cs:5:43:5:43 | 1 | NullCoalescing.cs:5:9:5:10 | M2 | +| NullCoalescing.cs:7:12:7:13 | enter M3 | NullCoalescing.cs:7:12:7:13 | M3 | +| NullCoalescing.cs:7:12:7:13 | exit M3 | NullCoalescing.cs:7:12:7:13 | M3 | +| NullCoalescing.cs:7:46:7:53 | ... ?? ... | NullCoalescing.cs:7:12:7:13 | M3 | +| NullCoalescing.cs:7:52:7:53 | "" | NullCoalescing.cs:7:12:7:13 | M3 | +| NullCoalescing.cs:9:12:9:13 | enter M4 | NullCoalescing.cs:9:12:9:13 | M4 | +| NullCoalescing.cs:9:12:9:13 | exit M4 | NullCoalescing.cs:9:12:9:13 | M4 | +| NullCoalescing.cs:9:41:9:41 | access to parameter s | NullCoalescing.cs:9:12:9:13 | M4 | +| NullCoalescing.cs:9:45:9:45 | access to parameter s | NullCoalescing.cs:9:12:9:13 | M4 | +| NullCoalescing.cs:9:51:9:58 | ... ?? ... | NullCoalescing.cs:9:12:9:13 | M4 | +| NullCoalescing.cs:11:9:11:10 | enter M5 | NullCoalescing.cs:11:9:11:10 | M5 | +| NullCoalescing.cs:11:9:11:10 | exit M5 | NullCoalescing.cs:11:9:11:10 | M5 | +| NullCoalescing.cs:11:51:11:58 | ... && ... | NullCoalescing.cs:11:9:11:10 | M5 | +| NullCoalescing.cs:11:57:11:58 | access to parameter b3 | NullCoalescing.cs:11:9:11:10 | M5 | +| NullCoalescing.cs:11:64:11:64 | 0 | NullCoalescing.cs:11:9:11:10 | M5 | +| NullCoalescing.cs:11:68:11:68 | 1 | NullCoalescing.cs:11:9:11:10 | M5 | +| NullCoalescing.cs:13:10:13:11 | enter M6 | NullCoalescing.cs:13:10:13:11 | M6 | +| Patterns.cs:5:10:5:13 | enter Test | Patterns.cs:5:10:5:13 | Test | +| Patterns.cs:9:9:11:9 | {...} | Patterns.cs:5:10:5:13 | Test | +| Patterns.cs:12:14:18:9 | if (...) ... | Patterns.cs:5:10:5:13 | Test | +| Patterns.cs:13:9:15:9 | {...} | Patterns.cs:5:10:5:13 | Test | +| Patterns.cs:16:14:18:9 | if (...) ... | Patterns.cs:5:10:5:13 | Test | +| Patterns.cs:17:9:18:9 | {...} | Patterns.cs:5:10:5:13 | Test | +| Patterns.cs:20:9:38:9 | switch (...) {...} | Patterns.cs:5:10:5:13 | Test | +| Patterns.cs:23:17:23:22 | break; | Patterns.cs:5:10:5:13 | Test | +| Patterns.cs:24:13:24:36 | case ...: | Patterns.cs:5:10:5:13 | Test | +| Patterns.cs:24:30:24:31 | access to local variable i2 | Patterns.cs:5:10:5:13 | Test | +| Patterns.cs:25:17:25:52 | ...; | Patterns.cs:5:10:5:13 | Test | +| Patterns.cs:27:13:27:24 | case ...: | Patterns.cs:5:10:5:13 | Test | +| Patterns.cs:28:17:28:47 | ...; | Patterns.cs:5:10:5:13 | Test | +| Patterns.cs:30:13:30:27 | case ...: | Patterns.cs:5:10:5:13 | Test | +| Patterns.cs:31:17:31:50 | ...; | Patterns.cs:5:10:5:13 | Test | +| Patterns.cs:33:13:33:24 | case ...: | Patterns.cs:5:10:5:13 | Test | +| Patterns.cs:34:17:34:22 | break; | Patterns.cs:5:10:5:13 | Test | +| Patterns.cs:35:13:35:20 | default: | Patterns.cs:5:10:5:13 | Test | +| Patterns.cs:40:9:42:9 | switch (...) {...} | Patterns.cs:5:10:5:13 | Test | +| Qualifiers.cs:7:16:7:21 | enter Method | Qualifiers.cs:7:16:7:21 | Method | +| Qualifiers.cs:8:23:8:34 | enter StaticMethod | Qualifiers.cs:8:23:8:34 | StaticMethod | +| Qualifiers.cs:10:10:10:10 | enter M | Qualifiers.cs:10:10:10:10 | M | +| Switch.cs:5:10:5:11 | enter M1 | Switch.cs:5:10:5:11 | M1 | +| Switch.cs:10:10:10:11 | enter M2 | Switch.cs:10:10:10:11 | M2 | +| Switch.cs:10:10:10:11 | exit M2 | Switch.cs:10:10:10:11 | M2 | +| Switch.cs:15:17:15:23 | return ...; | Switch.cs:10:10:10:11 | M2 | +| Switch.cs:16:13:16:19 | case ...: | Switch.cs:10:10:10:11 | M2 | +| Switch.cs:17:23:17:37 | object creation of type Exception | Switch.cs:10:10:10:11 | M2 | +| Switch.cs:18:13:18:22 | case ...: | Switch.cs:10:10:10:11 | M2 | +| Switch.cs:19:17:19:29 | goto default; | Switch.cs:10:10:10:11 | M2 | +| Switch.cs:20:13:20:23 | case ...: | Switch.cs:10:10:10:11 | M2 | +| Switch.cs:21:17:22:27 | if (...) ... | Switch.cs:10:10:10:11 | M2 | +| Switch.cs:22:21:22:27 | return ...; | Switch.cs:10:10:10:11 | M2 | +| Switch.cs:23:27:23:27 | 0 | Switch.cs:10:10:10:11 | M2 | +| Switch.cs:24:13:24:56 | case ...: | Switch.cs:10:10:10:11 | M2 | +| Switch.cs:24:32:24:55 | ... && ... | Switch.cs:10:10:10:11 | M2 | +| Switch.cs:24:48:24:48 | access to local variable s | Switch.cs:10:10:10:11 | M2 | +| Switch.cs:25:17:25:37 | ...; | Switch.cs:10:10:10:11 | M2 | +| Switch.cs:27:13:27:39 | case ...: | Switch.cs:10:10:10:11 | M2 | +| Switch.cs:27:32:27:38 | call to method Throw | Switch.cs:10:10:10:11 | M2 | +| Switch.cs:30:13:30:20 | default: | Switch.cs:10:10:10:11 | M2 | +| Switch.cs:35:10:35:11 | enter M3 | Switch.cs:35:10:35:11 | M3 | +| Switch.cs:44:10:44:11 | enter M4 | Switch.cs:44:10:44:11 | M4 | +| Switch.cs:44:10:44:11 | exit M4 | Switch.cs:44:10:44:11 | M4 | +| Switch.cs:49:17:49:22 | break; | Switch.cs:44:10:44:11 | M4 | +| Switch.cs:50:13:50:39 | case ...: | Switch.cs:44:10:44:11 | M4 | +| Switch.cs:50:30:50:30 | access to parameter o | Switch.cs:44:10:44:11 | M4 | +| Switch.cs:51:17:51:22 | break; | Switch.cs:44:10:44:11 | M4 | +| Switch.cs:55:10:55:11 | enter M5 | Switch.cs:55:10:55:11 | M5 | +| Switch.cs:66:10:66:11 | enter M6 | Switch.cs:66:10:66:11 | M6 | +| Switch.cs:66:10:66:11 | exit M6 | Switch.cs:66:10:66:11 | M6 | +| Switch.cs:73:15:73:20 | break; | Switch.cs:66:10:66:11 | M6 | +| Switch.cs:77:10:77:11 | enter M7 | Switch.cs:77:10:77:11 | M7 | +| Switch.cs:77:10:77:11 | exit M7 | Switch.cs:77:10:77:11 | M7 | +| Switch.cs:82:22:82:25 | true | Switch.cs:77:10:77:11 | M7 | +| Switch.cs:83:13:83:20 | case ...: | Switch.cs:77:10:77:11 | M7 | +| Switch.cs:84:15:85:22 | if (...) ... | Switch.cs:77:10:77:11 | M7 | +| Switch.cs:85:17:85:22 | break; | Switch.cs:77:10:77:11 | M7 | +| Switch.cs:86:22:86:25 | true | Switch.cs:77:10:77:11 | M7 | +| Switch.cs:88:16:88:20 | false | Switch.cs:77:10:77:11 | M7 | +| Switch.cs:91:10:91:11 | enter M8 | Switch.cs:91:10:91:11 | M8 | +| Switch.cs:91:10:91:11 | exit M8 | Switch.cs:91:10:91:11 | M8 | +| Switch.cs:96:22:96:25 | true | Switch.cs:91:10:91:11 | M8 | +| Switch.cs:98:16:98:20 | false | Switch.cs:91:10:91:11 | M8 | +| Switch.cs:101:9:101:10 | enter M9 | Switch.cs:101:9:101:10 | M9 | +| Switch.cs:101:9:101:10 | exit M9 | Switch.cs:101:9:101:10 | M9 | +| Switch.cs:103:19:103:25 | access to property Length | Switch.cs:101:9:101:10 | M9 | +| Switch.cs:105:13:105:20 | case ...: | Switch.cs:101:9:101:10 | M9 | +| Switch.cs:105:29:105:29 | 0 | Switch.cs:101:9:101:10 | M9 | +| Switch.cs:106:13:106:20 | case ...: | Switch.cs:101:9:101:10 | M9 | +| Switch.cs:106:29:106:29 | 1 | Switch.cs:101:9:101:10 | M9 | +| Switch.cs:108:17:108:17 | 1 | Switch.cs:101:9:101:10 | M9 | +| Switch.cs:111:17:111:21 | enter Throw | Switch.cs:111:17:111:21 | Throw | +| Switch.cs:113:9:113:11 | enter M10 | Switch.cs:113:9:113:11 | M10 | +| Switch.cs:113:9:113:11 | exit M10 | Switch.cs:113:9:113:11 | M10 | +| Switch.cs:117:25:117:25 | access to parameter s | Switch.cs:113:9:113:11 | M10 | +| Switch.cs:117:43:117:43 | 1 | Switch.cs:113:9:113:11 | M10 | +| Switch.cs:118:13:118:33 | case ...: | Switch.cs:113:9:113:11 | M10 | +| Switch.cs:118:25:118:25 | access to parameter s | Switch.cs:113:9:113:11 | M10 | +| Switch.cs:118:42:118:42 | 2 | Switch.cs:113:9:113:11 | M10 | +| Switch.cs:120:17:120:17 | 1 | Switch.cs:113:9:113:11 | M10 | +| Switch.cs:123:10:123:12 | enter M11 | Switch.cs:123:10:123:12 | M11 | +| Switch.cs:123:10:123:12 | exit M11 | Switch.cs:123:10:123:12 | M11 | +| Switch.cs:125:34:125:34 | access to local variable b | Switch.cs:123:10:123:12 | M11 | +| Switch.cs:125:37:125:46 | ... => ... | Switch.cs:123:10:123:12 | M11 | +| Switch.cs:126:13:126:19 | return ...; | Switch.cs:123:10:123:12 | M11 | +| Switch.cs:129:12:129:14 | enter M12 | Switch.cs:129:12:129:14 | M12 | +| Switch.cs:131:9:131:67 | return ...; | Switch.cs:129:12:129:14 | M12 | +| Switch.cs:131:40:131:40 | access to local variable s | Switch.cs:129:12:129:14 | M12 | +| Switch.cs:131:43:131:51 | ... => ... | Switch.cs:129:12:129:14 | M12 | +| Switch.cs:131:56:131:66 | call to method ToString | Switch.cs:129:12:129:14 | M12 | +| TypeAccesses.cs:3:10:3:10 | enter M | TypeAccesses.cs:3:10:3:10 | M | +| TypeAccesses.cs:7:25:7:25 | ; | TypeAccesses.cs:3:10:3:10 | M | +| TypeAccesses.cs:8:9:8:28 | ... ...; | TypeAccesses.cs:3:10:3:10 | M | +| VarDecls.cs:5:18:5:19 | enter M1 | VarDecls.cs:5:18:5:19 | M1 | +| VarDecls.cs:13:12:13:13 | enter M2 | VarDecls.cs:13:12:13:13 | M2 | +| VarDecls.cs:19:7:19:8 | enter M3 | VarDecls.cs:19:7:19:8 | M3 | +| VarDecls.cs:25:13:25:29 | return ...; | VarDecls.cs:19:7:19:8 | M3 | +| VarDecls.cs:25:24:25:24 | access to local variable x | VarDecls.cs:19:7:19:8 | M3 | +| VarDecls.cs:25:28:25:28 | access to local variable y | VarDecls.cs:19:7:19:8 | M3 | +| VarDecls.cs:28:41:28:47 | enter Dispose | VarDecls.cs:28:41:28:47 | Dispose | +| cflow.cs:5:17:5:20 | enter Main | cflow.cs:5:17:5:20 | Main | +| cflow.cs:5:17:5:20 | exit Main | cflow.cs:5:17:5:20 | Main | +| cflow.cs:12:13:12:49 | ...; | cflow.cs:5:17:5:20 | Main | +| cflow.cs:14:9:17:9 | while (...) ... | cflow.cs:5:17:5:20 | Main | +| cflow.cs:14:16:14:16 | access to local variable a | cflow.cs:5:17:5:20 | Main | +| cflow.cs:15:9:17:9 | {...} | cflow.cs:5:17:5:20 | Main | +| cflow.cs:19:9:22:25 | do ... while (...); | cflow.cs:5:17:5:20 | Main | +| cflow.cs:20:9:22:9 | {...} | cflow.cs:5:17:5:20 | Main | +| cflow.cs:24:9:34:9 | for (...;...;...) ... | cflow.cs:5:17:5:20 | Main | +| cflow.cs:24:25:24:25 | access to local variable i | cflow.cs:5:17:5:20 | Main | +| cflow.cs:24:34:24:34 | access to local variable i | cflow.cs:5:17:5:20 | Main | +| cflow.cs:25:9:34:9 | {...} | cflow.cs:5:17:5:20 | Main | +| cflow.cs:26:31:26:31 | access to local variable i | cflow.cs:5:17:5:20 | Main | +| cflow.cs:27:17:27:46 | ...; | cflow.cs:5:17:5:20 | Main | +| cflow.cs:28:18:33:37 | if (...) ... | cflow.cs:5:17:5:20 | Main | +| cflow.cs:29:17:29:42 | ...; | cflow.cs:5:17:5:20 | Main | +| cflow.cs:30:18:33:37 | if (...) ... | cflow.cs:5:17:5:20 | Main | +| cflow.cs:31:17:31:42 | ...; | cflow.cs:5:17:5:20 | Main | +| cflow.cs:33:17:33:37 | ...; | cflow.cs:5:17:5:20 | Main | +| cflow.cs:37:17:37:22 | enter Switch | cflow.cs:37:17:37:22 | Switch | +| cflow.cs:37:17:37:22 | exit Switch | cflow.cs:37:17:37:22 | Switch | +| cflow.cs:41:13:41:19 | case ...: | cflow.cs:37:17:37:22 | Switch | +| cflow.cs:42:17:42:39 | ...; | cflow.cs:37:17:37:22 | Switch | +| cflow.cs:44:13:44:19 | case ...: | cflow.cs:37:17:37:22 | Switch | +| cflow.cs:45:17:45:39 | ...; | cflow.cs:37:17:37:22 | Switch | +| cflow.cs:47:13:47:19 | case ...: | cflow.cs:37:17:37:22 | Switch | +| cflow.cs:48:17:48:39 | ...; | cflow.cs:37:17:37:22 | Switch | +| cflow.cs:51:9:59:9 | switch (...) {...} | cflow.cs:37:17:37:22 | Switch | +| cflow.cs:54:17:54:48 | ...; | cflow.cs:37:17:37:22 | Switch | +| cflow.cs:56:13:56:20 | default: | cflow.cs:37:17:37:22 | Switch | +| cflow.cs:60:9:66:9 | switch (...) {...} | cflow.cs:37:17:37:22 | Switch | +| cflow.cs:63:17:64:55 | if (...) ... | cflow.cs:37:17:37:22 | Switch | +| cflow.cs:64:27:64:54 | object creation of type NullReferenceException | cflow.cs:37:17:37:22 | Switch | +| cflow.cs:65:17:65:22 | break; | cflow.cs:37:17:37:22 | Switch | +| cflow.cs:67:16:67:16 | access to parameter a | cflow.cs:37:17:37:22 | Switch | +| cflow.cs:70:18:70:18 | enter M | cflow.cs:70:18:70:18 | M | +| cflow.cs:70:18:70:18 | exit M | cflow.cs:70:18:70:18 | M | +| cflow.cs:73:13:73:19 | return ...; | cflow.cs:70:18:70:18 | M | +| cflow.cs:74:9:81:9 | if (...) ... | cflow.cs:70:18:70:18 | M | +| cflow.cs:75:9:77:9 | {...} | cflow.cs:70:18:70:18 | M | +| cflow.cs:79:9:81:9 | {...} | cflow.cs:70:18:70:18 | M | +| cflow.cs:84:18:84:19 | enter M2 | cflow.cs:84:18:84:19 | M2 | +| cflow.cs:84:18:84:19 | exit M2 | cflow.cs:84:18:84:19 | M2 | +| cflow.cs:86:26:86:26 | access to parameter s | cflow.cs:84:18:84:19 | M2 | +| cflow.cs:87:13:87:33 | ...; | cflow.cs:84:18:84:19 | M2 | +| cflow.cs:90:18:90:19 | enter M3 | cflow.cs:90:18:90:19 | M3 | +| cflow.cs:90:18:90:19 | exit M3 | cflow.cs:90:18:90:19 | M3 | +| cflow.cs:93:45:93:47 | "s" | cflow.cs:90:18:90:19 | M3 | +| cflow.cs:94:9:94:29 | ...; | cflow.cs:90:18:90:19 | M3 | +| cflow.cs:97:13:97:55 | ...; | cflow.cs:90:18:90:19 | M3 | +| cflow.cs:99:9:100:42 | if (...) ... | cflow.cs:90:18:90:19 | M3 | +| cflow.cs:100:13:100:42 | ...; | cflow.cs:90:18:90:19 | M3 | +| cflow.cs:102:9:103:36 | if (...) ... | cflow.cs:90:18:90:19 | M3 | +| cflow.cs:103:13:103:36 | ...; | cflow.cs:90:18:90:19 | M3 | +| cflow.cs:106:18:106:19 | enter M4 | cflow.cs:106:18:106:19 | M4 | +| cflow.cs:109:9:115:9 | {...} | cflow.cs:106:18:106:19 | M4 | +| cflow.cs:110:20:110:23 | true | cflow.cs:106:18:106:19 | M4 | +| cflow.cs:116:9:116:29 | ...; | cflow.cs:106:18:106:19 | M4 | +| cflow.cs:119:20:119:21 | enter M5 | cflow.cs:119:20:119:21 | M5 | +| cflow.cs:127:19:127:21 | enter get_Prop | cflow.cs:127:19:127:21 | get_Prop | +| cflow.cs:127:25:127:58 | return ...; | cflow.cs:127:19:127:21 | get_Prop | +| cflow.cs:127:48:127:49 | "" | cflow.cs:127:19:127:21 | get_Prop | +| cflow.cs:127:53:127:57 | this access | cflow.cs:127:19:127:21 | get_Prop | +| cflow.cs:127:62:127:64 | enter set_Prop | cflow.cs:127:62:127:64 | set_Prop | +| cflow.cs:129:5:129:15 | enter ControlFlow | cflow.cs:129:5:129:15 | ControlFlow | +| cflow.cs:134:5:134:15 | enter ControlFlow | cflow.cs:134:5:134:15 | ControlFlow | +| cflow.cs:136:12:136:22 | enter ControlFlow | cflow.cs:136:12:136:22 | ControlFlow | +| cflow.cs:138:40:138:40 | enter + | cflow.cs:138:40:138:40 | + | +| cflow.cs:144:33:144:35 | enter get_Item | cflow.cs:144:33:144:35 | get_Item | +| cflow.cs:144:56:144:58 | enter set_Item | cflow.cs:144:56:144:58 | set_Item | +| cflow.cs:146:10:146:19 | enter TryFinally | cflow.cs:146:10:146:19 | TryFinally | +| cflow.cs:146:10:146:19 | exit TryFinally | cflow.cs:146:10:146:19 | TryFinally | +| cflow.cs:150:13:150:37 | call to method WriteLine | cflow.cs:146:10:146:19 | TryFinally | +| cflow.cs:153:9:155:9 | [finally: exception(Exception)] {...} | cflow.cs:146:10:146:19 | TryFinally | +| cflow.cs:153:9:155:9 | [finally: exception(OutOfMemoryException)] {...} | cflow.cs:146:10:146:19 | TryFinally | +| cflow.cs:153:9:155:9 | {...} | cflow.cs:146:10:146:19 | TryFinally | +| cflow.cs:159:13:159:37 | call to method WriteLine | cflow.cs:146:10:146:19 | TryFinally | +| cflow.cs:160:13:160:19 | return ...; | cflow.cs:146:10:146:19 | TryFinally | +| cflow.cs:162:9:165:9 | [exception: Exception] catch (...) {...} | cflow.cs:146:10:146:19 | TryFinally | +| cflow.cs:162:9:165:9 | [exception: OutOfMemoryException] catch (...) {...} | cflow.cs:146:10:146:19 | TryFinally | +| cflow.cs:162:38:162:39 | [exception: Exception] IOException ex | cflow.cs:146:10:146:19 | TryFinally | +| cflow.cs:166:9:176:9 | [exception: Exception] catch (...) {...} | cflow.cs:146:10:146:19 | TryFinally | +| cflow.cs:166:41:166:42 | [exception: Exception] ArgumentException ex | cflow.cs:146:10:146:19 | TryFinally | +| cflow.cs:177:9:179:9 | [exception: Exception] catch (...) {...} | cflow.cs:146:10:146:19 | TryFinally | +| cflow.cs:178:9:179:9 | {...} | cflow.cs:146:10:146:19 | TryFinally | +| cflow.cs:191:13:191:37 | call to method WriteLine | cflow.cs:146:10:146:19 | TryFinally | +| cflow.cs:192:13:192:19 | return ...; | cflow.cs:146:10:146:19 | TryFinally | +| cflow.cs:194:9:197:9 | [exception: Exception] catch (...) {...} | cflow.cs:146:10:146:19 | TryFinally | +| cflow.cs:194:9:197:9 | [exception: OutOfMemoryException] catch (...) {...} | cflow.cs:146:10:146:19 | TryFinally | +| cflow.cs:194:38:194:39 | [exception: Exception] IOException ex | cflow.cs:146:10:146:19 | TryFinally | +| cflow.cs:198:9:200:9 | [exception: Exception] catch (...) {...} | cflow.cs:146:10:146:19 | TryFinally | +| cflow.cs:199:9:200:9 | {...} | cflow.cs:146:10:146:19 | TryFinally | +| cflow.cs:202:9:204:9 | [finally: exception(Exception)] {...} | cflow.cs:146:10:146:19 | TryFinally | +| cflow.cs:202:9:204:9 | [finally: exception(OutOfMemoryException)] {...} | cflow.cs:146:10:146:19 | TryFinally | +| cflow.cs:207:16:207:16 | access to local variable i | cflow.cs:146:10:146:19 | TryFinally | +| cflow.cs:208:9:230:9 | {...} | cflow.cs:146:10:146:19 | TryFinally | +| cflow.cs:212:21:212:27 | return ...; | cflow.cs:146:10:146:19 | TryFinally | +| cflow.cs:213:17:214:29 | if (...) ... | cflow.cs:146:10:146:19 | TryFinally | +| cflow.cs:214:21:214:29 | continue; | cflow.cs:146:10:146:19 | TryFinally | +| cflow.cs:215:17:216:26 | if (...) ... | cflow.cs:146:10:146:19 | TryFinally | +| cflow.cs:216:21:216:26 | break; | cflow.cs:146:10:146:19 | TryFinally | +| cflow.cs:219:13:229:13 | {...} | cflow.cs:146:10:146:19 | TryFinally | +| cflow.cs:223:25:223:46 | [finally: break] throw ...; | cflow.cs:146:10:146:19 | TryFinally | +| cflow.cs:223:25:223:46 | [finally: continue] throw ...; | cflow.cs:146:10:146:19 | TryFinally | +| cflow.cs:223:25:223:46 | [finally: return] throw ...; | cflow.cs:146:10:146:19 | TryFinally | +| cflow.cs:223:25:223:46 | throw ...; | cflow.cs:146:10:146:19 | TryFinally | +| cflow.cs:223:31:223:45 | [finally: break] object creation of type Exception | cflow.cs:146:10:146:19 | TryFinally | +| cflow.cs:223:31:223:45 | [finally: continue] object creation of type Exception | cflow.cs:146:10:146:19 | TryFinally | +| cflow.cs:223:31:223:45 | [finally: return] object creation of type Exception | cflow.cs:146:10:146:19 | TryFinally | +| cflow.cs:223:31:223:45 | object creation of type Exception | cflow.cs:146:10:146:19 | TryFinally | +| cflow.cs:226:17:228:17 | [finally: break] {...} | cflow.cs:146:10:146:19 | TryFinally | +| cflow.cs:226:17:228:17 | [finally: continue] {...} | cflow.cs:146:10:146:19 | TryFinally | +| cflow.cs:226:17:228:17 | [finally: exception(Exception)] {...} | cflow.cs:146:10:146:19 | TryFinally | +| cflow.cs:226:17:228:17 | [finally: return] {...} | cflow.cs:146:10:146:19 | TryFinally | +| cflow.cs:226:17:228:17 | {...} | cflow.cs:146:10:146:19 | TryFinally | +| cflow.cs:232:9:245:9 | try {...} ... | cflow.cs:146:10:146:19 | TryFinally | +| cflow.cs:234:17:234:28 | access to property Length | cflow.cs:146:10:146:19 | TryFinally | +| cflow.cs:234:33:234:33 | 0 | cflow.cs:146:10:146:19 | TryFinally | +| cflow.cs:235:17:235:23 | return ...; | cflow.cs:146:10:146:19 | TryFinally | +| cflow.cs:236:13:237:49 | if (...) ... | cflow.cs:146:10:146:19 | TryFinally | +| cflow.cs:236:17:236:28 | access to property Length | cflow.cs:146:10:146:19 | TryFinally | +| cflow.cs:236:33:236:33 | 1 | cflow.cs:146:10:146:19 | TryFinally | +| cflow.cs:237:17:237:49 | throw ...; | cflow.cs:146:10:146:19 | TryFinally | +| cflow.cs:237:23:237:48 | object creation of type OutOfMemoryException | cflow.cs:146:10:146:19 | TryFinally | +| cflow.cs:240:9:245:9 | [finally: exception(Exception)] {...} | cflow.cs:146:10:146:19 | TryFinally | +| cflow.cs:240:9:245:9 | [finally: exception(NullReferenceException)] {...} | cflow.cs:146:10:146:19 | TryFinally | +| cflow.cs:240:9:245:9 | {...} | cflow.cs:146:10:146:19 | TryFinally | +| cflow.cs:242:17:242:41 | ...; | cflow.cs:146:10:146:19 | TryFinally | +| cflow.cs:242:17:242:41 | [finally: exception(Exception)] ...; | cflow.cs:146:10:146:19 | TryFinally | +| cflow.cs:242:17:242:41 | [finally: exception(NullReferenceException)] ...; | cflow.cs:146:10:146:19 | TryFinally | +| cflow.cs:242:17:242:41 | [finally: exception(OutOfMemoryException)] ...; | cflow.cs:146:10:146:19 | TryFinally | +| cflow.cs:242:17:242:41 | [finally: return] ...; | cflow.cs:146:10:146:19 | TryFinally | +| cflow.cs:243:13:244:37 | [finally: exception(Exception)] if (...) ... | cflow.cs:146:10:146:19 | TryFinally | +| cflow.cs:243:13:244:37 | [finally: exception(NullReferenceException)] if (...) ... | cflow.cs:146:10:146:19 | TryFinally | +| cflow.cs:243:13:244:37 | [finally: exception(OutOfMemoryException)] if (...) ... | cflow.cs:146:10:146:19 | TryFinally | +| cflow.cs:243:13:244:37 | [finally: return] if (...) ... | cflow.cs:146:10:146:19 | TryFinally | +| cflow.cs:243:13:244:37 | if (...) ... | cflow.cs:146:10:146:19 | TryFinally | +| cflow.cs:244:17:244:37 | ...; | cflow.cs:146:10:146:19 | TryFinally | +| cflow.cs:244:17:244:37 | [finally: exception(Exception)] ...; | cflow.cs:146:10:146:19 | TryFinally | +| cflow.cs:244:17:244:37 | [finally: exception(NullReferenceException)] ...; | cflow.cs:146:10:146:19 | TryFinally | +| cflow.cs:244:17:244:37 | [finally: exception(OutOfMemoryException)] ...; | cflow.cs:146:10:146:19 | TryFinally | +| cflow.cs:244:17:244:37 | [finally: return] ...; | cflow.cs:146:10:146:19 | TryFinally | +| cflow.cs:247:9:254:9 | try {...} ... | cflow.cs:146:10:146:19 | TryFinally | +| cflow.cs:257:10:257:12 | enter For | cflow.cs:257:10:257:12 | For | +| cflow.cs:257:10:257:12 | exit For | cflow.cs:257:10:257:12 | For | +| cflow.cs:260:16:260:16 | access to local variable x | cflow.cs:257:10:257:12 | For | +| cflow.cs:261:13:261:33 | ...; | cflow.cs:257:10:257:12 | For | +| cflow.cs:263:9:268:9 | for (...;...;...) ... | cflow.cs:257:10:257:12 | For | +| cflow.cs:263:18:263:18 | access to local variable x | cflow.cs:257:10:257:12 | For | +| cflow.cs:264:9:268:9 | {...} | cflow.cs:257:10:257:12 | For | +| cflow.cs:267:17:267:22 | break; | cflow.cs:257:10:257:12 | For | +| cflow.cs:271:9:276:9 | {...} | cflow.cs:257:10:257:12 | For | +| cflow.cs:275:17:275:22 | break; | cflow.cs:257:10:257:12 | For | +| cflow.cs:278:16:278:16 | access to local variable x | cflow.cs:257:10:257:12 | For | +| cflow.cs:279:9:282:9 | {...} | cflow.cs:257:10:257:12 | For | +| cflow.cs:284:9:287:9 | for (...;...;...) ... | cflow.cs:257:10:257:12 | For | +| cflow.cs:284:32:284:32 | access to local variable i | cflow.cs:257:10:257:12 | For | +| cflow.cs:285:9:287:9 | {...} | cflow.cs:257:10:257:12 | For | +| cflow.cs:290:10:290:16 | enter Lambdas | cflow.cs:290:10:290:16 | Lambdas | +| cflow.cs:292:28:292:37 | enter (...) => ... | cflow.cs:292:28:292:37 | (...) => ... | +| cflow.cs:293:28:293:61 | enter delegate(...) { ... } | cflow.cs:293:28:293:61 | delegate(...) { ... } | +| cflow.cs:296:10:296:18 | enter LogicalOr | cflow.cs:296:10:296:18 | LogicalOr | +| cflow.cs:304:10:304:17 | enter Booleans | cflow.cs:304:10:304:17 | Booleans | +| cflow.cs:304:10:304:17 | exit Booleans | cflow.cs:304:10:304:17 | Booleans | +| cflow.cs:306:13:306:56 | Boolean b = ... | cflow.cs:304:10:304:17 | Booleans | +| cflow.cs:306:37:306:56 | !... | cflow.cs:304:10:304:17 | Booleans | +| cflow.cs:308:35:308:39 | false | cflow.cs:304:10:304:17 | Booleans | +| cflow.cs:308:43:308:46 | true | cflow.cs:304:10:304:17 | Booleans | +| cflow.cs:309:13:309:48 | ... = ... | cflow.cs:304:10:304:17 | Booleans | +| cflow.cs:309:37:309:41 | false | cflow.cs:304:10:304:17 | Booleans | +| cflow.cs:309:45:309:48 | true | cflow.cs:304:10:304:17 | Booleans | +| cflow.cs:311:9:316:9 | if (...) ... | cflow.cs:304:10:304:17 | Booleans | +| cflow.cs:311:37:311:62 | !... | cflow.cs:304:10:304:17 | Booleans | +| cflow.cs:311:61:311:61 | access to local variable b | cflow.cs:304:10:304:17 | Booleans | +| cflow.cs:312:9:316:9 | {...} | cflow.cs:304:10:304:17 | Booleans | +| cflow.cs:319:10:319:11 | enter Do | cflow.cs:319:10:319:11 | Do | +| cflow.cs:319:10:319:11 | exit Do | cflow.cs:319:10:319:11 | Do | +| cflow.cs:322:9:332:9 | {...} | cflow.cs:319:10:319:11 | Do | +| cflow.cs:325:13:327:13 | {...} | cflow.cs:319:10:319:11 | Do | +| cflow.cs:328:13:331:13 | if (...) ... | cflow.cs:319:10:319:11 | Do | +| cflow.cs:329:13:331:13 | {...} | cflow.cs:319:10:319:11 | Do | +| cflow.cs:332:18:332:22 | this access | cflow.cs:319:10:319:11 | Do | +| cflow.cs:335:10:335:16 | enter Foreach | cflow.cs:335:10:335:16 | Foreach | +| cflow.cs:335:10:335:16 | exit Foreach | cflow.cs:335:10:335:16 | Foreach | +| cflow.cs:337:9:348:9 | foreach (... ... in ...) ... | cflow.cs:335:10:335:16 | Foreach | +| cflow.cs:337:22:337:22 | String x | cflow.cs:335:10:335:16 | Foreach | +| cflow.cs:341:13:343:13 | {...} | cflow.cs:335:10:335:16 | Foreach | +| cflow.cs:344:13:347:13 | if (...) ... | cflow.cs:335:10:335:16 | Foreach | +| cflow.cs:345:13:347:13 | {...} | cflow.cs:335:10:335:16 | Foreach | +| cflow.cs:351:10:351:13 | enter Goto | cflow.cs:351:10:351:13 | Goto | +| cflow.cs:351:10:351:13 | exit Goto | cflow.cs:351:10:351:13 | Goto | +| cflow.cs:353:9:353:13 | Label: | cflow.cs:351:10:351:13 | Goto | +| cflow.cs:353:43:353:45 | {...} | cflow.cs:351:10:351:13 | Goto | +| cflow.cs:355:9:355:41 | if (...) ... | cflow.cs:351:10:351:13 | Goto | +| cflow.cs:355:31:355:41 | goto ...; | cflow.cs:351:10:351:13 | Goto | +| cflow.cs:357:9:369:9 | switch (...) {...} | cflow.cs:351:10:351:13 | Goto | +| cflow.cs:360:17:360:29 | goto default; | cflow.cs:351:10:351:13 | Goto | +| cflow.cs:361:13:361:19 | case ...: | cflow.cs:351:10:351:13 | Goto | +| cflow.cs:362:17:362:37 | ...; | cflow.cs:351:10:351:13 | Goto | +| cflow.cs:364:13:364:19 | case ...: | cflow.cs:351:10:351:13 | Goto | +| cflow.cs:365:17:365:27 | goto ...; | cflow.cs:351:10:351:13 | Goto | +| cflow.cs:366:13:366:20 | default: | cflow.cs:351:10:351:13 | Goto | +| cflow.cs:372:49:372:53 | enter Yield | cflow.cs:372:49:372:53 | Yield | +| cflow.cs:375:25:375:25 | access to local variable i | cflow.cs:372:49:372:53 | Yield | +| cflow.cs:376:9:378:9 | {...} | cflow.cs:372:49:372:53 | Yield | +| cflow.cs:379:9:387:9 | try {...} ... | cflow.cs:372:49:372:53 | Yield | +| cflow.cs:393:5:393:18 | enter ControlFlowSub | cflow.cs:393:5:393:18 | ControlFlowSub | +| cflow.cs:395:5:395:18 | enter ControlFlowSub | cflow.cs:395:5:395:18 | ControlFlowSub | +| cflow.cs:397:5:397:18 | enter ControlFlowSub | cflow.cs:397:5:397:18 | ControlFlowSub | +| cflow.cs:402:10:402:10 | enter M | cflow.cs:402:10:402:10 | M | +| cflow.cs:402:10:402:10 | exit M | cflow.cs:402:10:402:10 | M | +| cflow.cs:406:13:406:36 | call to method WriteLine | cflow.cs:402:10:402:10 | M | +| cflow.cs:409:9:412:9 | [finally: exception(Exception)] {...} | cflow.cs:402:10:402:10 | M | +| cflow.cs:409:9:412:9 | [finally: exception(OutOfMemoryException)] {...} | cflow.cs:402:10:402:10 | M | +| cflow.cs:409:9:412:9 | {...} | cflow.cs:402:10:402:10 | M | +| cflow.cs:419:12:419:12 | enter M | cflow.cs:419:12:419:12 | M | +| cflow.cs:424:5:424:25 | enter NegationInConstructor | cflow.cs:424:5:424:25 | NegationInConstructor | +| cflow.cs:426:10:426:10 | enter M | cflow.cs:426:10:426:10 | M | +| cflow.cs:428:56:428:56 | access to parameter s | cflow.cs:426:10:426:10 | M | +| cflow.cs:428:70:428:71 | "" | cflow.cs:426:10:426:10 | M | diff --git a/csharp/ql/test/library-tests/controlflow/graph/EnclosingCallable.ql b/csharp/ql/test/library-tests/controlflow/graph/EnclosingCallable.ql new file mode 100644 index 00000000000..a57395982f2 --- /dev/null +++ b/csharp/ql/test/library-tests/controlflow/graph/EnclosingCallable.ql @@ -0,0 +1,8 @@ +import csharp +import Common + +query predicate nodeEnclosing(SourceControlFlowNode n, Callable c) { c = n.getEnclosingCallable() } + +query predicate blockEnclosing(SourceBasicBlock bb, Callable c) { + c = bb.getCallable() +} diff --git a/csharp/ql/test/library-tests/controlflow/graph/EntryElement.expected b/csharp/ql/test/library-tests/controlflow/graph/EntryElement.expected index 9d8ba39d311..1f85cb57912 100644 --- a/csharp/ql/test/library-tests/controlflow/graph/EntryElement.expected +++ b/csharp/ql/test/library-tests/controlflow/graph/EntryElement.expected @@ -1016,27 +1016,62 @@ | Initializers.cs:4:27:4:27 | access to field H | Initializers.cs:4:27:4:27 | access to field H | | Initializers.cs:4:27:4:31 | ... + ... | Initializers.cs:4:27:4:27 | access to field H | | Initializers.cs:4:31:4:31 | 2 | Initializers.cs:4:31:4:31 | 2 | -| Initializers.cs:6:28:6:30 | {...} | Initializers.cs:6:28:6:30 | {...} | -| Initializers.cs:9:5:12:5 | {...} | Initializers.cs:9:5:12:5 | {...} | -| Initializers.cs:10:9:10:54 | ... ...; | Initializers.cs:10:9:10:54 | ... ...; | -| Initializers.cs:10:13:10:53 | Initializers i = ... | Initializers.cs:10:34:10:35 | "" | -| Initializers.cs:10:17:10:53 | object creation of type Initializers | Initializers.cs:10:34:10:35 | "" | -| Initializers.cs:10:34:10:35 | "" | Initializers.cs:10:34:10:35 | "" | -| Initializers.cs:10:38:10:53 | { ..., ... } | Initializers.cs:10:44:10:44 | 0 | -| Initializers.cs:10:40:10:44 | ... = ... | Initializers.cs:10:44:10:44 | 0 | -| Initializers.cs:10:44:10:44 | 0 | Initializers.cs:10:44:10:44 | 0 | -| Initializers.cs:10:47:10:51 | ... = ... | Initializers.cs:10:51:10:51 | 1 | -| Initializers.cs:10:51:10:51 | 1 | Initializers.cs:10:51:10:51 | 1 | -| Initializers.cs:11:9:11:64 | ... ...; | Initializers.cs:11:9:11:64 | ... ...; | -| Initializers.cs:11:13:11:63 | Initializers[] iz = ... | Initializers.cs:11:18:11:63 | array creation of type Initializers[] | -| Initializers.cs:11:18:11:63 | 2 | Initializers.cs:11:18:11:63 | 2 | -| Initializers.cs:11:18:11:63 | array creation of type Initializers[] | Initializers.cs:11:18:11:63 | array creation of type Initializers[] | -| Initializers.cs:11:37:11:63 | { ..., ... } | Initializers.cs:11:39:11:39 | access to local variable i | -| Initializers.cs:11:39:11:39 | access to local variable i | Initializers.cs:11:39:11:39 | access to local variable i | -| Initializers.cs:11:42:11:61 | object creation of type Initializers | Initializers.cs:11:59:11:60 | "" | -| Initializers.cs:11:59:11:60 | "" | Initializers.cs:11:59:11:60 | "" | -| Initializers.cs:14:16:14:20 | ... = ... | Initializers.cs:14:20:14:20 | 1 | -| Initializers.cs:14:20:14:20 | 1 | Initializers.cs:14:20:14:20 | 1 | +| Initializers.cs:6:20:6:22 | {...} | Initializers.cs:6:20:6:22 | {...} | +| Initializers.cs:8:28:8:30 | {...} | Initializers.cs:8:28:8:30 | {...} | +| Initializers.cs:11:5:14:5 | {...} | Initializers.cs:11:5:14:5 | {...} | +| Initializers.cs:12:9:12:54 | ... ...; | Initializers.cs:12:9:12:54 | ... ...; | +| Initializers.cs:12:13:12:53 | Initializers i = ... | Initializers.cs:12:34:12:35 | "" | +| Initializers.cs:12:17:12:53 | object creation of type Initializers | Initializers.cs:12:34:12:35 | "" | +| Initializers.cs:12:34:12:35 | "" | Initializers.cs:12:34:12:35 | "" | +| Initializers.cs:12:38:12:53 | { ..., ... } | Initializers.cs:12:44:12:44 | 0 | +| Initializers.cs:12:40:12:44 | ... = ... | Initializers.cs:12:44:12:44 | 0 | +| Initializers.cs:12:44:12:44 | 0 | Initializers.cs:12:44:12:44 | 0 | +| Initializers.cs:12:47:12:51 | ... = ... | Initializers.cs:12:51:12:51 | 1 | +| Initializers.cs:12:51:12:51 | 1 | Initializers.cs:12:51:12:51 | 1 | +| Initializers.cs:13:9:13:64 | ... ...; | Initializers.cs:13:9:13:64 | ... ...; | +| Initializers.cs:13:13:13:63 | Initializers[] iz = ... | Initializers.cs:13:18:13:63 | array creation of type Initializers[] | +| Initializers.cs:13:18:13:63 | 2 | Initializers.cs:13:18:13:63 | 2 | +| Initializers.cs:13:18:13:63 | array creation of type Initializers[] | Initializers.cs:13:18:13:63 | array creation of type Initializers[] | +| Initializers.cs:13:37:13:63 | { ..., ... } | Initializers.cs:13:39:13:39 | access to local variable i | +| Initializers.cs:13:39:13:39 | access to local variable i | Initializers.cs:13:39:13:39 | access to local variable i | +| Initializers.cs:13:42:13:61 | object creation of type Initializers | Initializers.cs:13:59:13:60 | "" | +| Initializers.cs:13:59:13:60 | "" | Initializers.cs:13:59:13:60 | "" | +| Initializers.cs:16:16:16:20 | ... = ... | Initializers.cs:16:20:16:20 | 1 | +| Initializers.cs:16:20:16:20 | 1 | Initializers.cs:16:20:16:20 | 1 | +| Initializers.cs:20:23:20:23 | access to field F | Initializers.cs:20:23:20:23 | this access | +| Initializers.cs:20:23:20:23 | this access | Initializers.cs:20:23:20:23 | this access | +| Initializers.cs:20:23:20:27 | ... = ... | Initializers.cs:20:23:20:23 | this access | +| Initializers.cs:20:27:20:27 | 0 | Initializers.cs:20:27:20:27 | 0 | +| Initializers.cs:21:23:21:23 | access to field G | Initializers.cs:21:23:21:23 | this access | +| Initializers.cs:21:23:21:23 | this access | Initializers.cs:21:23:21:23 | this access | +| Initializers.cs:21:23:21:27 | ... = ... | Initializers.cs:21:23:21:23 | this access | +| Initializers.cs:21:27:21:27 | 1 | Initializers.cs:21:27:21:27 | 1 | +| Initializers.cs:26:13:26:13 | access to field H | Initializers.cs:26:13:26:13 | this access | +| Initializers.cs:26:13:26:13 | this access | Initializers.cs:26:13:26:13 | this access | +| Initializers.cs:26:13:26:17 | ... = ... | Initializers.cs:26:13:26:13 | this access | +| Initializers.cs:26:17:26:17 | 2 | Initializers.cs:26:17:26:17 | 2 | +| Initializers.cs:29:17:29:20 | call to constructor NoConstructor | Initializers.cs:29:17:29:20 | call to constructor NoConstructor | +| Initializers.cs:29:24:29:33 | {...} | Initializers.cs:29:24:29:33 | {...} | +| Initializers.cs:29:26:29:26 | access to field I | Initializers.cs:29:26:29:26 | this access | +| Initializers.cs:29:26:29:26 | this access | Initializers.cs:29:26:29:26 | this access | +| Initializers.cs:29:26:29:30 | ... = ... | Initializers.cs:29:26:29:26 | this access | +| Initializers.cs:29:26:29:31 | ...; | Initializers.cs:29:26:29:31 | ...; | +| Initializers.cs:29:30:29:30 | 3 | Initializers.cs:29:30:29:30 | 3 | +| Initializers.cs:31:22:31:25 | call to constructor Sub | Initializers.cs:31:22:31:25 | call to constructor Sub | +| Initializers.cs:31:29:31:38 | {...} | Initializers.cs:31:29:31:38 | {...} | +| Initializers.cs:31:31:31:31 | access to field I | Initializers.cs:31:31:31:31 | this access | +| Initializers.cs:31:31:31:31 | this access | Initializers.cs:31:31:31:31 | this access | +| Initializers.cs:31:31:31:35 | ... = ... | Initializers.cs:31:31:31:31 | this access | +| Initializers.cs:31:31:31:36 | ...; | Initializers.cs:31:31:31:36 | ...; | +| Initializers.cs:31:35:31:35 | access to parameter i | Initializers.cs:31:35:31:35 | access to parameter i | +| Initializers.cs:33:27:33:40 | {...} | Initializers.cs:33:27:33:40 | {...} | +| Initializers.cs:33:29:33:29 | access to field I | Initializers.cs:33:29:33:29 | this access | +| Initializers.cs:33:29:33:29 | this access | Initializers.cs:33:29:33:29 | this access | +| Initializers.cs:33:29:33:37 | ... = ... | Initializers.cs:33:29:33:29 | this access | +| Initializers.cs:33:29:33:38 | ...; | Initializers.cs:33:29:33:38 | ...; | +| Initializers.cs:33:33:33:33 | access to parameter i | Initializers.cs:33:33:33:33 | access to parameter i | +| Initializers.cs:33:33:33:37 | ... + ... | Initializers.cs:33:33:33:33 | access to parameter i | +| Initializers.cs:33:37:33:37 | access to parameter j | Initializers.cs:33:37:33:37 | access to parameter j | | NullCoalescing.cs:3:23:3:23 | access to parameter i | NullCoalescing.cs:3:23:3:23 | access to parameter i | | NullCoalescing.cs:3:23:3:28 | ... ?? ... | NullCoalescing.cs:3:23:3:28 | ... ?? ... | | NullCoalescing.cs:3:28:3:28 | 0 | NullCoalescing.cs:3:28:3:28 | 0 | diff --git a/csharp/ql/test/library-tests/controlflow/graph/EntryPoint.expected b/csharp/ql/test/library-tests/controlflow/graph/EntryPoint.expected index 4fad08aaa17..8dfa3308580 100644 --- a/csharp/ql/test/library-tests/controlflow/graph/EntryPoint.expected +++ b/csharp/ql/test/library-tests/controlflow/graph/EntryPoint.expected @@ -79,8 +79,13 @@ | Foreach.cs:24:10:24:11 | M4 | Foreach.cs:25:5:28:5 | {...} | | Foreach.cs:30:10:30:11 | M5 | Foreach.cs:31:5:34:5 | {...} | | Foreach.cs:36:10:36:11 | M6 | Foreach.cs:37:5:40:5 | {...} | -| Initializers.cs:6:5:6:16 | Initializers | Initializers.cs:6:28:6:30 | {...} | -| Initializers.cs:8:10:8:10 | M | Initializers.cs:9:5:12:5 | {...} | +| Initializers.cs:6:5:6:16 | Initializers | Initializers.cs:3:9:3:9 | this access | +| Initializers.cs:8:5:8:16 | Initializers | Initializers.cs:3:9:3:9 | this access | +| Initializers.cs:10:10:10:10 | M | Initializers.cs:11:5:14:5 | {...} | +| Initializers.cs:18:11:18:23 | NoConstructor | Initializers.cs:20:23:20:23 | this access | +| Initializers.cs:29:9:29:11 | Sub | Initializers.cs:29:17:29:20 | call to constructor NoConstructor | +| Initializers.cs:31:9:31:11 | Sub | Initializers.cs:31:22:31:25 | call to constructor Sub | +| Initializers.cs:33:9:33:11 | Sub | Initializers.cs:20:23:20:23 | this access | | NullCoalescing.cs:3:9:3:10 | M1 | NullCoalescing.cs:3:23:3:28 | ... ?? ... | | NullCoalescing.cs:5:9:5:10 | M2 | NullCoalescing.cs:5:24:5:43 | ... ? ... : ... | | NullCoalescing.cs:7:12:7:13 | M3 | NullCoalescing.cs:7:40:7:53 | ... ?? ... | diff --git a/csharp/ql/test/library-tests/controlflow/graph/ExitElement.expected b/csharp/ql/test/library-tests/controlflow/graph/ExitElement.expected index 101ef7230e3..a025386fa5a 100644 --- a/csharp/ql/test/library-tests/controlflow/graph/ExitElement.expected +++ b/csharp/ql/test/library-tests/controlflow/graph/ExitElement.expected @@ -1313,27 +1313,62 @@ | Initializers.cs:4:27:4:27 | access to field H | Initializers.cs:4:27:4:27 | access to field H | normal | | Initializers.cs:4:27:4:31 | ... + ... | Initializers.cs:4:27:4:31 | ... + ... | normal | | Initializers.cs:4:31:4:31 | 2 | Initializers.cs:4:31:4:31 | 2 | normal | -| Initializers.cs:6:28:6:30 | {...} | Initializers.cs:6:28:6:30 | {...} | normal | -| Initializers.cs:9:5:12:5 | {...} | Initializers.cs:11:13:11:63 | Initializers[] iz = ... | normal | -| Initializers.cs:10:9:10:54 | ... ...; | Initializers.cs:10:13:10:53 | Initializers i = ... | normal | -| Initializers.cs:10:13:10:53 | Initializers i = ... | Initializers.cs:10:13:10:53 | Initializers i = ... | normal | -| Initializers.cs:10:17:10:53 | object creation of type Initializers | Initializers.cs:10:38:10:53 | { ..., ... } | normal | -| Initializers.cs:10:34:10:35 | "" | Initializers.cs:10:34:10:35 | "" | normal | -| Initializers.cs:10:38:10:53 | { ..., ... } | Initializers.cs:10:38:10:53 | { ..., ... } | normal | -| Initializers.cs:10:40:10:44 | ... = ... | Initializers.cs:10:40:10:44 | ... = ... | normal | -| Initializers.cs:10:44:10:44 | 0 | Initializers.cs:10:44:10:44 | 0 | normal | -| Initializers.cs:10:47:10:51 | ... = ... | Initializers.cs:10:47:10:51 | ... = ... | normal | -| Initializers.cs:10:51:10:51 | 1 | Initializers.cs:10:51:10:51 | 1 | normal | -| Initializers.cs:11:9:11:64 | ... ...; | Initializers.cs:11:13:11:63 | Initializers[] iz = ... | normal | -| Initializers.cs:11:13:11:63 | Initializers[] iz = ... | Initializers.cs:11:13:11:63 | Initializers[] iz = ... | normal | -| Initializers.cs:11:18:11:63 | 2 | Initializers.cs:11:18:11:63 | 2 | normal | -| Initializers.cs:11:18:11:63 | array creation of type Initializers[] | Initializers.cs:11:37:11:63 | { ..., ... } | normal | -| Initializers.cs:11:37:11:63 | { ..., ... } | Initializers.cs:11:37:11:63 | { ..., ... } | normal | -| Initializers.cs:11:39:11:39 | access to local variable i | Initializers.cs:11:39:11:39 | access to local variable i | normal | -| Initializers.cs:11:42:11:61 | object creation of type Initializers | Initializers.cs:11:42:11:61 | object creation of type Initializers | normal | -| Initializers.cs:11:59:11:60 | "" | Initializers.cs:11:59:11:60 | "" | normal | -| Initializers.cs:14:16:14:20 | ... = ... | Initializers.cs:14:16:14:20 | ... = ... | normal | -| Initializers.cs:14:20:14:20 | 1 | Initializers.cs:14:20:14:20 | 1 | normal | +| Initializers.cs:6:20:6:22 | {...} | Initializers.cs:6:20:6:22 | {...} | normal | +| Initializers.cs:8:28:8:30 | {...} | Initializers.cs:8:28:8:30 | {...} | normal | +| Initializers.cs:11:5:14:5 | {...} | Initializers.cs:13:13:13:63 | Initializers[] iz = ... | normal | +| Initializers.cs:12:9:12:54 | ... ...; | Initializers.cs:12:13:12:53 | Initializers i = ... | normal | +| Initializers.cs:12:13:12:53 | Initializers i = ... | Initializers.cs:12:13:12:53 | Initializers i = ... | normal | +| Initializers.cs:12:17:12:53 | object creation of type Initializers | Initializers.cs:12:38:12:53 | { ..., ... } | normal | +| Initializers.cs:12:34:12:35 | "" | Initializers.cs:12:34:12:35 | "" | normal | +| Initializers.cs:12:38:12:53 | { ..., ... } | Initializers.cs:12:38:12:53 | { ..., ... } | normal | +| Initializers.cs:12:40:12:44 | ... = ... | Initializers.cs:12:40:12:44 | ... = ... | normal | +| Initializers.cs:12:44:12:44 | 0 | Initializers.cs:12:44:12:44 | 0 | normal | +| Initializers.cs:12:47:12:51 | ... = ... | Initializers.cs:12:47:12:51 | ... = ... | normal | +| Initializers.cs:12:51:12:51 | 1 | Initializers.cs:12:51:12:51 | 1 | normal | +| Initializers.cs:13:9:13:64 | ... ...; | Initializers.cs:13:13:13:63 | Initializers[] iz = ... | normal | +| Initializers.cs:13:13:13:63 | Initializers[] iz = ... | Initializers.cs:13:13:13:63 | Initializers[] iz = ... | normal | +| Initializers.cs:13:18:13:63 | 2 | Initializers.cs:13:18:13:63 | 2 | normal | +| Initializers.cs:13:18:13:63 | array creation of type Initializers[] | Initializers.cs:13:37:13:63 | { ..., ... } | normal | +| Initializers.cs:13:37:13:63 | { ..., ... } | Initializers.cs:13:37:13:63 | { ..., ... } | normal | +| Initializers.cs:13:39:13:39 | access to local variable i | Initializers.cs:13:39:13:39 | access to local variable i | normal | +| Initializers.cs:13:42:13:61 | object creation of type Initializers | Initializers.cs:13:42:13:61 | object creation of type Initializers | normal | +| Initializers.cs:13:59:13:60 | "" | Initializers.cs:13:59:13:60 | "" | normal | +| Initializers.cs:16:16:16:20 | ... = ... | Initializers.cs:16:16:16:20 | ... = ... | normal | +| Initializers.cs:16:20:16:20 | 1 | Initializers.cs:16:20:16:20 | 1 | normal | +| Initializers.cs:20:23:20:23 | access to field F | Initializers.cs:20:23:20:23 | this access | normal | +| Initializers.cs:20:23:20:23 | this access | Initializers.cs:20:23:20:23 | this access | normal | +| Initializers.cs:20:23:20:27 | ... = ... | Initializers.cs:20:23:20:27 | ... = ... | normal | +| Initializers.cs:20:27:20:27 | 0 | Initializers.cs:20:27:20:27 | 0 | normal | +| Initializers.cs:21:23:21:23 | access to field G | Initializers.cs:21:23:21:23 | this access | normal | +| Initializers.cs:21:23:21:23 | this access | Initializers.cs:21:23:21:23 | this access | normal | +| Initializers.cs:21:23:21:27 | ... = ... | Initializers.cs:21:23:21:27 | ... = ... | normal | +| Initializers.cs:21:27:21:27 | 1 | Initializers.cs:21:27:21:27 | 1 | normal | +| Initializers.cs:26:13:26:13 | access to field H | Initializers.cs:26:13:26:13 | this access | normal | +| Initializers.cs:26:13:26:13 | this access | Initializers.cs:26:13:26:13 | this access | normal | +| Initializers.cs:26:13:26:17 | ... = ... | Initializers.cs:26:13:26:17 | ... = ... | normal | +| Initializers.cs:26:17:26:17 | 2 | Initializers.cs:26:17:26:17 | 2 | normal | +| Initializers.cs:29:17:29:20 | call to constructor NoConstructor | Initializers.cs:29:17:29:20 | call to constructor NoConstructor | normal | +| Initializers.cs:29:24:29:33 | {...} | Initializers.cs:29:26:29:30 | ... = ... | normal | +| Initializers.cs:29:26:29:26 | access to field I | Initializers.cs:29:26:29:26 | this access | normal | +| Initializers.cs:29:26:29:26 | this access | Initializers.cs:29:26:29:26 | this access | normal | +| Initializers.cs:29:26:29:30 | ... = ... | Initializers.cs:29:26:29:30 | ... = ... | normal | +| Initializers.cs:29:26:29:31 | ...; | Initializers.cs:29:26:29:30 | ... = ... | normal | +| Initializers.cs:29:30:29:30 | 3 | Initializers.cs:29:30:29:30 | 3 | normal | +| Initializers.cs:31:22:31:25 | call to constructor Sub | Initializers.cs:31:22:31:25 | call to constructor Sub | normal | +| Initializers.cs:31:29:31:38 | {...} | Initializers.cs:31:31:31:35 | ... = ... | normal | +| Initializers.cs:31:31:31:31 | access to field I | Initializers.cs:31:31:31:31 | this access | normal | +| Initializers.cs:31:31:31:31 | this access | Initializers.cs:31:31:31:31 | this access | normal | +| Initializers.cs:31:31:31:35 | ... = ... | Initializers.cs:31:31:31:35 | ... = ... | normal | +| Initializers.cs:31:31:31:36 | ...; | Initializers.cs:31:31:31:35 | ... = ... | normal | +| Initializers.cs:31:35:31:35 | access to parameter i | Initializers.cs:31:35:31:35 | access to parameter i | normal | +| Initializers.cs:33:27:33:40 | {...} | Initializers.cs:33:29:33:37 | ... = ... | normal | +| Initializers.cs:33:29:33:29 | access to field I | Initializers.cs:33:29:33:29 | this access | normal | +| Initializers.cs:33:29:33:29 | this access | Initializers.cs:33:29:33:29 | this access | normal | +| Initializers.cs:33:29:33:37 | ... = ... | Initializers.cs:33:29:33:37 | ... = ... | normal | +| Initializers.cs:33:29:33:38 | ...; | Initializers.cs:33:29:33:37 | ... = ... | normal | +| Initializers.cs:33:33:33:33 | access to parameter i | Initializers.cs:33:33:33:33 | access to parameter i | normal | +| Initializers.cs:33:33:33:37 | ... + ... | Initializers.cs:33:33:33:37 | ... + ... | normal | +| Initializers.cs:33:37:33:37 | access to parameter j | Initializers.cs:33:37:33:37 | access to parameter j | normal | | NullCoalescing.cs:3:23:3:23 | access to parameter i | NullCoalescing.cs:3:23:3:23 | access to parameter i | non-null | | NullCoalescing.cs:3:23:3:23 | access to parameter i | NullCoalescing.cs:3:23:3:23 | access to parameter i | null | | NullCoalescing.cs:3:23:3:28 | ... ?? ... | NullCoalescing.cs:3:23:3:23 | access to parameter i | non-null | diff --git a/csharp/ql/test/library-tests/controlflow/graph/Initializers.cs b/csharp/ql/test/library-tests/controlflow/graph/Initializers.cs index df1fe8422dd..1f690e778a4 100644 --- a/csharp/ql/test/library-tests/controlflow/graph/Initializers.cs +++ b/csharp/ql/test/library-tests/controlflow/graph/Initializers.cs @@ -3,6 +3,8 @@ class Initializers int F = H + 1; int G { get; set; } = H + 2; + Initializers() { } + Initializers(string s) { } void M() @@ -12,4 +14,22 @@ class Initializers } static int H = 1; + + class NoConstructor + { + protected int F = 0; + protected int G = 1; + } + + class Sub : NoConstructor + { + int H = 2; + int I; + + Sub() : base() { I = 3; } + + Sub(int i) : this() { I = i; } + + Sub(int i, int j) { I = i + j; } + } } diff --git a/csharp/ql/test/library-tests/controlflow/graph/NodeGraph.expected b/csharp/ql/test/library-tests/controlflow/graph/NodeGraph.expected index 93711f6463a..ca2fcbc88bd 100644 --- a/csharp/ql/test/library-tests/controlflow/graph/NodeGraph.expected +++ b/csharp/ql/test/library-tests/controlflow/graph/NodeGraph.expected @@ -1358,36 +1358,92 @@ | Foreach.cs:38:39:38:42 | access to parameter args | Foreach.cs:38:9:39:11 | foreach (... ... in ...) ... | semmle.label | successor | | Foreach.cs:39:11:39:11 | ; | Foreach.cs:38:9:39:11 | foreach (... ... in ...) ... | semmle.label | successor | | Initializers.cs:3:9:3:9 | this access | Initializers.cs:3:13:3:13 | access to field H | semmle.label | successor | +| Initializers.cs:3:9:3:9 | this access | Initializers.cs:3:13:3:13 | access to field H | semmle.label | successor | +| Initializers.cs:3:9:3:17 | ... = ... | Initializers.cs:4:9:4:9 | this access | semmle.label | successor | +| Initializers.cs:3:9:3:17 | ... = ... | Initializers.cs:4:9:4:9 | this access | semmle.label | successor | +| Initializers.cs:3:13:3:13 | access to field H | Initializers.cs:3:17:3:17 | 1 | semmle.label | successor | | Initializers.cs:3:13:3:13 | access to field H | Initializers.cs:3:17:3:17 | 1 | semmle.label | successor | | Initializers.cs:3:13:3:17 | ... + ... | Initializers.cs:3:9:3:17 | ... = ... | semmle.label | successor | +| Initializers.cs:3:13:3:17 | ... + ... | Initializers.cs:3:9:3:17 | ... = ... | semmle.label | successor | +| Initializers.cs:3:17:3:17 | 1 | Initializers.cs:3:13:3:17 | ... + ... | semmle.label | successor | | Initializers.cs:3:17:3:17 | 1 | Initializers.cs:3:13:3:17 | ... + ... | semmle.label | successor | | Initializers.cs:4:9:4:9 | access to property G | Initializers.cs:4:25:4:31 | ... = ... | semmle.label | successor | +| Initializers.cs:4:9:4:9 | access to property G | Initializers.cs:4:25:4:31 | ... = ... | semmle.label | successor | | Initializers.cs:4:9:4:9 | this access | Initializers.cs:4:27:4:27 | access to field H | semmle.label | successor | +| Initializers.cs:4:9:4:9 | this access | Initializers.cs:4:27:4:27 | access to field H | semmle.label | successor | +| Initializers.cs:4:25:4:31 | ... = ... | Initializers.cs:6:20:6:22 | {...} | semmle.label | successor | +| Initializers.cs:4:25:4:31 | ... = ... | Initializers.cs:8:28:8:30 | {...} | semmle.label | successor | +| Initializers.cs:4:27:4:27 | access to field H | Initializers.cs:4:31:4:31 | 2 | semmle.label | successor | | Initializers.cs:4:27:4:27 | access to field H | Initializers.cs:4:31:4:31 | 2 | semmle.label | successor | | Initializers.cs:4:27:4:31 | ... + ... | Initializers.cs:4:9:4:9 | access to property G | semmle.label | successor | +| Initializers.cs:4:27:4:31 | ... + ... | Initializers.cs:4:9:4:9 | access to property G | semmle.label | successor | | Initializers.cs:4:31:4:31 | 2 | Initializers.cs:4:27:4:31 | ... + ... | semmle.label | successor | -| Initializers.cs:6:5:6:16 | enter Initializers | Initializers.cs:6:28:6:30 | {...} | semmle.label | successor | -| Initializers.cs:6:28:6:30 | {...} | Initializers.cs:6:5:6:16 | exit Initializers | semmle.label | successor | -| Initializers.cs:8:10:8:10 | enter M | Initializers.cs:9:5:12:5 | {...} | semmle.label | successor | -| Initializers.cs:9:5:12:5 | {...} | Initializers.cs:10:9:10:54 | ... ...; | semmle.label | successor | -| Initializers.cs:10:9:10:54 | ... ...; | Initializers.cs:10:34:10:35 | "" | semmle.label | successor | -| Initializers.cs:10:13:10:53 | Initializers i = ... | Initializers.cs:11:9:11:64 | ... ...; | semmle.label | successor | -| Initializers.cs:10:17:10:53 | object creation of type Initializers | Initializers.cs:10:44:10:44 | 0 | semmle.label | successor | -| Initializers.cs:10:34:10:35 | "" | Initializers.cs:10:17:10:53 | object creation of type Initializers | semmle.label | successor | -| Initializers.cs:10:38:10:53 | { ..., ... } | Initializers.cs:10:13:10:53 | Initializers i = ... | semmle.label | successor | -| Initializers.cs:10:40:10:44 | ... = ... | Initializers.cs:10:51:10:51 | 1 | semmle.label | successor | -| Initializers.cs:10:44:10:44 | 0 | Initializers.cs:10:40:10:44 | ... = ... | semmle.label | successor | -| Initializers.cs:10:47:10:47 | access to property G | Initializers.cs:10:47:10:51 | ... = ... | semmle.label | successor | -| Initializers.cs:10:47:10:51 | ... = ... | Initializers.cs:10:38:10:53 | { ..., ... } | semmle.label | successor | -| Initializers.cs:10:51:10:51 | 1 | Initializers.cs:10:47:10:47 | access to property G | semmle.label | successor | -| Initializers.cs:11:9:11:64 | ... ...; | Initializers.cs:11:18:11:63 | array creation of type Initializers[] | semmle.label | successor | -| Initializers.cs:11:13:11:63 | Initializers[] iz = ... | Initializers.cs:8:10:8:10 | exit M | semmle.label | successor | -| Initializers.cs:11:18:11:63 | array creation of type Initializers[] | Initializers.cs:11:39:11:39 | access to local variable i | semmle.label | successor | -| Initializers.cs:11:37:11:63 | { ..., ... } | Initializers.cs:11:13:11:63 | Initializers[] iz = ... | semmle.label | successor | -| Initializers.cs:11:39:11:39 | access to local variable i | Initializers.cs:11:59:11:60 | "" | semmle.label | successor | -| Initializers.cs:11:42:11:61 | object creation of type Initializers | Initializers.cs:11:37:11:63 | { ..., ... } | semmle.label | successor | -| Initializers.cs:11:59:11:60 | "" | Initializers.cs:11:42:11:61 | object creation of type Initializers | semmle.label | successor | -| Initializers.cs:14:20:14:20 | 1 | Initializers.cs:14:16:14:20 | ... = ... | semmle.label | successor | +| Initializers.cs:4:31:4:31 | 2 | Initializers.cs:4:27:4:31 | ... + ... | semmle.label | successor | +| Initializers.cs:6:5:6:16 | enter Initializers | Initializers.cs:3:9:3:9 | this access | semmle.label | successor | +| Initializers.cs:6:20:6:22 | {...} | Initializers.cs:6:5:6:16 | exit Initializers | semmle.label | successor | +| Initializers.cs:8:5:8:16 | enter Initializers | Initializers.cs:3:9:3:9 | this access | semmle.label | successor | +| Initializers.cs:8:28:8:30 | {...} | Initializers.cs:8:5:8:16 | exit Initializers | semmle.label | successor | +| Initializers.cs:10:10:10:10 | enter M | Initializers.cs:11:5:14:5 | {...} | semmle.label | successor | +| Initializers.cs:11:5:14:5 | {...} | Initializers.cs:12:9:12:54 | ... ...; | semmle.label | successor | +| Initializers.cs:12:9:12:54 | ... ...; | Initializers.cs:12:34:12:35 | "" | semmle.label | successor | +| Initializers.cs:12:13:12:53 | Initializers i = ... | Initializers.cs:13:9:13:64 | ... ...; | semmle.label | successor | +| Initializers.cs:12:17:12:53 | object creation of type Initializers | Initializers.cs:12:44:12:44 | 0 | semmle.label | successor | +| Initializers.cs:12:34:12:35 | "" | Initializers.cs:12:17:12:53 | object creation of type Initializers | semmle.label | successor | +| Initializers.cs:12:38:12:53 | { ..., ... } | Initializers.cs:12:13:12:53 | Initializers i = ... | semmle.label | successor | +| Initializers.cs:12:40:12:44 | ... = ... | Initializers.cs:12:51:12:51 | 1 | semmle.label | successor | +| Initializers.cs:12:44:12:44 | 0 | Initializers.cs:12:40:12:44 | ... = ... | semmle.label | successor | +| Initializers.cs:12:47:12:47 | access to property G | Initializers.cs:12:47:12:51 | ... = ... | semmle.label | successor | +| Initializers.cs:12:47:12:51 | ... = ... | Initializers.cs:12:38:12:53 | { ..., ... } | semmle.label | successor | +| Initializers.cs:12:51:12:51 | 1 | Initializers.cs:12:47:12:47 | access to property G | semmle.label | successor | +| Initializers.cs:13:9:13:64 | ... ...; | Initializers.cs:13:18:13:63 | array creation of type Initializers[] | semmle.label | successor | +| Initializers.cs:13:13:13:63 | Initializers[] iz = ... | Initializers.cs:10:10:10:10 | exit M | semmle.label | successor | +| Initializers.cs:13:18:13:63 | array creation of type Initializers[] | Initializers.cs:13:39:13:39 | access to local variable i | semmle.label | successor | +| Initializers.cs:13:37:13:63 | { ..., ... } | Initializers.cs:13:13:13:63 | Initializers[] iz = ... | semmle.label | successor | +| Initializers.cs:13:39:13:39 | access to local variable i | Initializers.cs:13:59:13:60 | "" | semmle.label | successor | +| Initializers.cs:13:42:13:61 | object creation of type Initializers | Initializers.cs:13:37:13:63 | { ..., ... } | semmle.label | successor | +| Initializers.cs:13:59:13:60 | "" | Initializers.cs:13:42:13:61 | object creation of type Initializers | semmle.label | successor | +| Initializers.cs:16:20:16:20 | 1 | Initializers.cs:16:16:16:20 | ... = ... | semmle.label | successor | +| Initializers.cs:18:11:18:23 | enter NoConstructor | Initializers.cs:20:23:20:23 | this access | semmle.label | successor | +| Initializers.cs:20:23:20:23 | this access | Initializers.cs:20:27:20:27 | 0 | semmle.label | successor | +| Initializers.cs:20:23:20:23 | this access | Initializers.cs:20:27:20:27 | 0 | semmle.label | successor | +| Initializers.cs:20:23:20:27 | ... = ... | Initializers.cs:21:23:21:23 | this access | semmle.label | successor | +| Initializers.cs:20:23:20:27 | ... = ... | Initializers.cs:21:23:21:23 | this access | semmle.label | successor | +| Initializers.cs:20:27:20:27 | 0 | Initializers.cs:20:23:20:27 | ... = ... | semmle.label | successor | +| Initializers.cs:20:27:20:27 | 0 | Initializers.cs:20:23:20:27 | ... = ... | semmle.label | successor | +| Initializers.cs:21:23:21:23 | this access | Initializers.cs:21:27:21:27 | 1 | semmle.label | successor | +| Initializers.cs:21:23:21:23 | this access | Initializers.cs:21:27:21:27 | 1 | semmle.label | successor | +| Initializers.cs:21:23:21:27 | ... = ... | Initializers.cs:18:11:18:23 | exit NoConstructor | semmle.label | successor | +| Initializers.cs:21:23:21:27 | ... = ... | Initializers.cs:26:13:26:13 | this access | semmle.label | successor | +| Initializers.cs:21:27:21:27 | 1 | Initializers.cs:21:23:21:27 | ... = ... | semmle.label | successor | +| Initializers.cs:21:27:21:27 | 1 | Initializers.cs:21:23:21:27 | ... = ... | semmle.label | successor | +| Initializers.cs:26:13:26:13 | this access | Initializers.cs:26:17:26:17 | 2 | semmle.label | successor | +| Initializers.cs:26:13:26:13 | this access | Initializers.cs:26:17:26:17 | 2 | semmle.label | successor | +| Initializers.cs:26:13:26:17 | ... = ... | Initializers.cs:29:24:29:33 | {...} | semmle.label | successor | +| Initializers.cs:26:13:26:17 | ... = ... | Initializers.cs:33:27:33:40 | {...} | semmle.label | successor | +| Initializers.cs:26:17:26:17 | 2 | Initializers.cs:26:13:26:17 | ... = ... | semmle.label | successor | +| Initializers.cs:26:17:26:17 | 2 | Initializers.cs:26:13:26:17 | ... = ... | semmle.label | successor | +| Initializers.cs:29:9:29:11 | enter Sub | Initializers.cs:29:17:29:20 | call to constructor NoConstructor | semmle.label | successor | +| Initializers.cs:29:17:29:20 | call to constructor NoConstructor | Initializers.cs:26:13:26:13 | this access | semmle.label | successor | +| Initializers.cs:29:24:29:33 | {...} | Initializers.cs:29:26:29:31 | ...; | semmle.label | successor | +| Initializers.cs:29:26:29:26 | this access | Initializers.cs:29:30:29:30 | 3 | semmle.label | successor | +| Initializers.cs:29:26:29:30 | ... = ... | Initializers.cs:29:9:29:11 | exit Sub | semmle.label | successor | +| Initializers.cs:29:26:29:31 | ...; | Initializers.cs:29:26:29:26 | this access | semmle.label | successor | +| Initializers.cs:29:30:29:30 | 3 | Initializers.cs:29:26:29:30 | ... = ... | semmle.label | successor | +| Initializers.cs:31:9:31:11 | enter Sub | Initializers.cs:31:22:31:25 | call to constructor Sub | semmle.label | successor | +| Initializers.cs:31:22:31:25 | call to constructor Sub | Initializers.cs:31:29:31:38 | {...} | semmle.label | successor | +| Initializers.cs:31:29:31:38 | {...} | Initializers.cs:31:31:31:36 | ...; | semmle.label | successor | +| Initializers.cs:31:31:31:31 | this access | Initializers.cs:31:35:31:35 | access to parameter i | semmle.label | successor | +| Initializers.cs:31:31:31:35 | ... = ... | Initializers.cs:31:9:31:11 | exit Sub | semmle.label | successor | +| Initializers.cs:31:31:31:36 | ...; | Initializers.cs:31:31:31:31 | this access | semmle.label | successor | +| Initializers.cs:31:35:31:35 | access to parameter i | Initializers.cs:31:31:31:35 | ... = ... | semmle.label | successor | +| Initializers.cs:33:9:33:11 | enter Sub | Initializers.cs:20:23:20:23 | this access | semmle.label | successor | +| Initializers.cs:33:27:33:40 | {...} | Initializers.cs:33:29:33:38 | ...; | semmle.label | successor | +| Initializers.cs:33:29:33:29 | this access | Initializers.cs:33:33:33:33 | access to parameter i | semmle.label | successor | +| Initializers.cs:33:29:33:37 | ... = ... | Initializers.cs:33:9:33:11 | exit Sub | semmle.label | successor | +| Initializers.cs:33:29:33:38 | ...; | Initializers.cs:33:29:33:29 | this access | semmle.label | successor | +| Initializers.cs:33:33:33:33 | access to parameter i | Initializers.cs:33:37:33:37 | access to parameter j | semmle.label | successor | +| Initializers.cs:33:33:33:37 | ... + ... | Initializers.cs:33:29:33:37 | ... = ... | semmle.label | successor | +| Initializers.cs:33:37:33:37 | access to parameter j | Initializers.cs:33:33:33:37 | ... + ... | semmle.label | successor | | NullCoalescing.cs:3:9:3:10 | enter M1 | NullCoalescing.cs:3:23:3:28 | ... ?? ... | semmle.label | successor | | NullCoalescing.cs:3:23:3:23 | access to parameter i | NullCoalescing.cs:3:9:3:10 | exit M1 | semmle.label | non-null | | NullCoalescing.cs:3:23:3:23 | access to parameter i | NullCoalescing.cs:3:28:3:28 | 0 | semmle.label | null | diff --git a/csharp/ql/test/library-tests/csharp7/LocalTaintFlow.expected b/csharp/ql/test/library-tests/csharp7/LocalTaintFlow.expected index 62d250d065a..d2e9e6a5b57 100644 --- a/csharp/ql/test/library-tests/csharp7/LocalTaintFlow.expected +++ b/csharp/ql/test/library-tests/csharp7/LocalTaintFlow.expected @@ -1,9 +1,15 @@ +| CSharp7.cs:9:9:9:9 | [post] this access | CSharp7.cs:10:9:10:9 | this access | +| CSharp7.cs:9:9:9:9 | this access | CSharp7.cs:10:9:10:9 | this access | +| CSharp7.cs:10:9:10:9 | [post] this access | CSharp7.cs:11:9:11:9 | this access | +| CSharp7.cs:10:9:10:9 | this access | CSharp7.cs:11:9:11:9 | this access | +| CSharp7.cs:16:9:16:13 | [post] this access | CSharp7.cs:25:39:25:43 | this access | +| CSharp7.cs:16:9:16:13 | this access | CSharp7.cs:25:39:25:43 | this access | | CSharp7.cs:17:9:17:11 | this | CSharp7.cs:17:18:17:22 | this access | | CSharp7.cs:21:9:21:11 | this | CSharp7.cs:21:16:21:20 | this access | | CSharp7.cs:22:9:22:11 | this | CSharp7.cs:22:16:22:20 | this access | | CSharp7.cs:22:9:22:11 | value | CSharp7.cs:22:9:22:11 | value | | CSharp7.cs:22:9:22:11 | value | CSharp7.cs:22:24:22:28 | access to parameter value | -| CSharp7.cs:25:5:25:27 | this | CSharp7.cs:25:39:25:43 | this access | +| CSharp7.cs:25:5:25:27 | this | CSharp7.cs:16:9:16:13 | this access | | CSharp7.cs:26:6:26:28 | this | CSharp7.cs:26:35:26:39 | this access | | CSharp7.cs:31:19:31:19 | i | CSharp7.cs:31:19:31:19 | i | | CSharp7.cs:31:19:31:19 | i | CSharp7.cs:33:16:33:16 | access to parameter i | @@ -17,22 +23,29 @@ | CSharp7.cs:44:19:44:19 | x | CSharp7.cs:46:13:46:13 | access to parameter x | | CSharp7.cs:46:13:46:13 | access to parameter x | CSharp7.cs:46:9:46:13 | SSA def(y) | | CSharp7.cs:49:10:49:10 | this | CSharp7.cs:51:9:51:24 | this access | +| CSharp7.cs:51:9:51:24 | [post] this access | CSharp7.cs:52:9:52:21 | this access | | CSharp7.cs:51:9:51:24 | this access | CSharp7.cs:52:9:52:21 | this access | | CSharp7.cs:51:22:51:23 | SSA def(t1) | CSharp7.cs:53:18:53:19 | access to local variable t1 | +| CSharp7.cs:52:9:52:21 | [post] this access | CSharp7.cs:54:9:54:17 | this access | | CSharp7.cs:52:9:52:21 | this access | CSharp7.cs:54:9:54:17 | this access | | CSharp7.cs:52:19:52:20 | SSA def(t2) | CSharp7.cs:56:14:56:15 | access to local variable t2 | +| CSharp7.cs:54:9:54:17 | [post] this access | CSharp7.cs:57:9:57:32 | this access | | CSharp7.cs:54:9:54:17 | this access | CSharp7.cs:57:9:57:32 | this access | | CSharp7.cs:54:15:54:16 | SSA def(t1) | CSharp7.cs:55:14:55:15 | access to local variable t1 | | CSharp7.cs:57:30:57:31 | SSA def(t4) | CSharp7.cs:58:18:58:19 | access to local variable t4 | | CSharp7.cs:66:17:66:17 | 1 | CSharp7.cs:66:16:66:21 | (..., ...) | | CSharp7.cs:66:20:66:20 | 2 | CSharp7.cs:66:16:66:21 | (..., ...) | | CSharp7.cs:69:10:69:20 | this | CSharp7.cs:71:26:71:28 | this access | +| CSharp7.cs:71:26:71:28 | [post] this access | CSharp7.cs:72:17:72:19 | this access | | CSharp7.cs:71:26:71:28 | this access | CSharp7.cs:72:17:72:19 | this access | | CSharp7.cs:72:13:72:19 | SSA def(z) | CSharp7.cs:75:16:75:16 | access to local variable z | +| CSharp7.cs:72:17:72:19 | [post] this access | CSharp7.cs:73:18:73:20 | this access | | CSharp7.cs:72:17:72:19 | call to method F | CSharp7.cs:72:13:72:19 | SSA def(z) | | CSharp7.cs:72:17:72:19 | this access | CSharp7.cs:73:18:73:20 | this access | +| CSharp7.cs:73:18:73:20 | [post] this access | CSharp7.cs:74:13:74:15 | this access | | CSharp7.cs:73:18:73:20 | this access | CSharp7.cs:74:13:74:15 | this access | | CSharp7.cs:74:13:74:15 | call to method F | CSharp7.cs:74:13:74:21 | access to field Item1 | +| CSharp7.cs:75:16:75:16 | [post] access to local variable z | CSharp7.cs:77:39:77:39 | access to local variable z | | CSharp7.cs:75:16:75:16 | access to local variable z | CSharp7.cs:77:39:77:39 | access to local variable z | | CSharp7.cs:75:28:75:28 | 1 | CSharp7.cs:75:27:75:35 | (..., ...) | | CSharp7.cs:75:31:75:31 | 2 | CSharp7.cs:75:27:75:35 | (..., ...) | @@ -99,6 +112,7 @@ | CSharp7.cs:114:61:114:66 | (..., ...) | CSharp7.cs:114:49:114:67 | (..., ...) | | CSharp7.cs:114:62:114:62 | 0 | CSharp7.cs:114:61:114:66 | (..., ...) | | CSharp7.cs:114:65:114:65 | 1 | CSharp7.cs:114:61:114:66 | (..., ...) | +| CSharp7.cs:118:9:118:10 | [post] access to local variable m2 | CSharp7.cs:119:19:119:20 | access to local variable m2 | | CSharp7.cs:118:9:118:10 | access to local variable m2 | CSharp7.cs:119:19:119:20 | access to local variable m2 | | CSharp7.cs:119:19:119:20 | access to local variable m2 | CSharp7.cs:119:19:119:26 | access to field Item1 | | CSharp7.cs:123:28:123:36 | "DefUse3" | CSharp7.cs:123:22:123:36 | ... = ... | @@ -139,7 +153,9 @@ | CSharp7.cs:178:25:178:25 | s | CSharp7.cs:178:31:178:31 | access to parameter s | | CSharp7.cs:179:25:179:25 | s | CSharp7.cs:179:25:179:25 | s | | CSharp7.cs:179:25:179:25 | s | CSharp7.cs:179:37:179:37 | access to parameter s | +| CSharp7.cs:181:23:181:25 | [post] access to local variable src | CSharp7.cs:182:23:182:25 | access to local variable src | | CSharp7.cs:181:23:181:25 | access to local variable src | CSharp7.cs:182:23:182:25 | access to local variable src | +| CSharp7.cs:182:23:182:25 | [post] access to local variable src | CSharp7.cs:183:23:183:25 | access to local variable src | | CSharp7.cs:182:23:182:25 | access to local variable src | CSharp7.cs:183:23:183:25 | access to local variable src | | CSharp7.cs:189:10:189:11 | this | CSharp7.cs:198:14:198:23 | this access | | CSharp7.cs:191:13:191:18 | SSA def(v1) | CSharp7.cs:192:26:192:27 | access to local variable v1 | @@ -155,7 +171,9 @@ | CSharp7.cs:195:14:195:21 | access to array element | CSharp7.cs:195:9:195:21 | SSA def(r1) | | CSharp7.cs:196:26:196:30 | access to local variable array | CSharp7.cs:196:26:196:33 | access to array element | | CSharp7.cs:197:26:197:27 | access to local variable r1 | CSharp7.cs:199:33:199:34 | access to local variable r1 | +| CSharp7.cs:198:14:198:23 | [post] this access | CSharp7.cs:199:26:199:35 | this access | | CSharp7.cs:198:14:198:23 | this access | CSharp7.cs:199:26:199:35 | this access | +| CSharp7.cs:199:26:199:35 | [post] this access | CSharp7.cs:200:9:200:18 | this access | | CSharp7.cs:199:26:199:35 | this access | CSharp7.cs:200:9:200:18 | this access | | CSharp7.cs:199:33:199:34 | access to local variable r1 | CSharp7.cs:200:16:200:17 | access to local variable r1 | | CSharp7.cs:203:24:203:24 | p | CSharp7.cs:203:24:203:24 | p | @@ -166,8 +184,11 @@ | CSharp7.cs:217:17:217:17 | 0 | CSharp7.cs:217:16:217:23 | (..., ...) | | CSharp7.cs:217:20:217:22 | 0 | CSharp7.cs:217:16:217:23 | (..., ...) | | CSharp7.cs:220:10:220:13 | this | CSharp7.cs:222:13:222:20 | this access | +| CSharp7.cs:222:13:222:20 | [post] this access | CSharp7.cs:223:18:223:25 | this access | | CSharp7.cs:222:13:222:20 | this access | CSharp7.cs:223:18:223:25 | this access | +| CSharp7.cs:223:18:223:25 | [post] this access | CSharp7.cs:224:22:224:29 | this access | | CSharp7.cs:223:18:223:25 | this access | CSharp7.cs:224:22:224:29 | this access | +| CSharp7.cs:224:22:224:29 | [post] this access | CSharp7.cs:225:22:225:33 | this access | | CSharp7.cs:224:22:224:29 | this access | CSharp7.cs:225:22:225:33 | this access | | CSharp7.cs:233:16:233:23 | SSA def(o) | CSharp7.cs:234:13:234:13 | access to local variable o | | CSharp7.cs:233:20:233:23 | null | CSharp7.cs:233:16:233:23 | SSA def(o) | diff --git a/csharp/ql/test/library-tests/csharp8/NullableRefTypes.ql b/csharp/ql/test/library-tests/csharp8/NullableRefTypes.ql index c61ed0af712..f9bda91b349 100644 --- a/csharp/ql/test/library-tests/csharp8/NullableRefTypes.ql +++ b/csharp/ql/test/library-tests/csharp8/NullableRefTypes.ql @@ -56,4 +56,3 @@ query predicate annotatedTypeConstraints(TypeParameter p, AnnotatedType t) { t = p.getConstraints().getAnAnnotatedTypeConstraint() and t.getLocation() instanceof SourceLocation } - diff --git a/csharp/ql/test/library-tests/dataflow/fields/A.cs b/csharp/ql/test/library-tests/dataflow/fields/A.cs new file mode 100644 index 00000000000..415fad0449e --- /dev/null +++ b/csharp/ql/test/library-tests/dataflow/fields/A.cs @@ -0,0 +1,163 @@ +public class A +{ + public void M1() + { + var c = new C(); + var b = B.Make(c); + Sink(b.c); // flow + } + + public void M2() + { + var b = new B(); + b.Set(new C1()); + Sink(b.Get()); // flow + Sink((new B(new C())).Get()); // flow + } + + public void M3() + { + var b1 = new B(); + B b2; + b2 = SetOnB(b1, new C2()); + Sink(b1.c); // no flow + Sink(b2.c); // flow + } + + public void M4() + { + var b1 = new B(); + B b2; + b2 = SetOnBWrap(b1, new C2()); + Sink(b1.c); // no flow + Sink(b2.c); // flow + } + + public B SetOnBWrap(B b1, C c) + { + var b2 = SetOnB(b1, c); + return R() ? b1 : b2; + } + + public B SetOnB(B b1, C c) + { + if (R()) + { + B b2 = new B(); + b2.Set(c); + return b2; + } + return b1; + } + + public void M5() + { + var a = new A(); + C1 c1 = new C1(); + c1.a = a; + M6(c1); + } + public void M6(C c) + { + if (c is C1) + { + Sink(((C1)c).a); // flow + } + C cc; + if (c is C2) + { + cc = (C2)c; + } + else + { + cc = new C1(); + } + if (cc is C1) + { + Sink(((C1)cc).a); // no flow, stopped by cast to C2 (FALSE POSITIVE, no type pruning yet) + } + } + + public void M7(B b) + { + b.Set(new C()); + } + public void M8() + { + var b = new B(); + M7(b); + Sink(b.c); // flow + } + + public class D + { + public B b; + public D(B b, bool x) + { + b.c = new C(); + this.b = x ? b : new B(); + } + } + + public void M9() + { + var b = new B(); + var d = new D(b, R()); + Sink(d.b); // flow x2 + Sink(d.b.c); // flow + Sink(b.c); // flow + } + + public void M10() + { + var b = new B(); + var l1 = new MyList(b, new MyList(null, null)); + var l2 = new MyList(null, l1); + var l3 = new MyList(null, l2); + Sink(l3.head); // no flow, b is nested beneath at least one .next + Sink(l3.next.head); // flow, the precise nesting depth isn't tracked + Sink(l3.next.next.head); // flow + Sink(l3.next.next.next.head); // no flow + for (var l = l3; l != null; l = l.next) + { + Sink(l.head); // flow + } + } + + public static void Sink(object o) { } + public bool R() { return this.GetHashCode() % 10 > 5; } + + public class C { } + public class C1 : C + { + public A a; + } + public class C2 : C { } + + public class B + { + public C c; + public B() { } + public B(C c) + { + this.c = c; + } + public void Set(C c) { this.c = c; } + public C Get() { return this.c; } + public static B Make(C c) + { + return new B(c); + } + } + + public class MyList + { + public B head; + public MyList next; + public MyList(B head, MyList next) + { + this.head = head; + this.next = next; + } + } +} diff --git a/csharp/ql/test/library-tests/dataflow/fields/B.cs b/csharp/ql/test/library-tests/dataflow/fields/B.cs new file mode 100644 index 00000000000..4ccdf48cd2c --- /dev/null +++ b/csharp/ql/test/library-tests/dataflow/fields/B.cs @@ -0,0 +1,44 @@ +public class B +{ + public void M1() + { + var e = new Elem(); + var b1 = new Box1(e, null); + var b2 = new Box2(b1); + Sink(b2.box1.elem1); // flow + Sink(b2.box1.elem2); // FP due to flow in M2 below + } + + public void M2() + { + var e = new Elem(); + var b1 = new Box1(null, e); + var b2 = new Box2(b1); + Sink(b2.box1.elem1); // FP due to flow in M1 above + Sink(b2.box1.elem2); // flow + } + + public static void Sink(object o) { } + + public class Elem { } + + public class Box1 + { + public Elem elem1; + public Elem elem2; + public Box1(Elem e1, Elem e2) + { + this.elem1 = e1; + this.elem2 = e2; + } + } + + public class Box2 + { + public Box1 box1; + public Box2(Box1 b1) + { + this.box1 = b1; + } + } +} diff --git a/csharp/ql/test/library-tests/dataflow/fields/C.cs b/csharp/ql/test/library-tests/dataflow/fields/C.cs new file mode 100644 index 00000000000..da7b5f14fee --- /dev/null +++ b/csharp/ql/test/library-tests/dataflow/fields/C.cs @@ -0,0 +1,34 @@ +public class C +{ + private Elem s1 = new Elem(); + private readonly Elem s2 = new Elem(); + private Elem s3; + private static Elem s4 = new Elem(); + private Elem s5 { get; set; } = new Elem(); + private Elem s6 { get => new Elem(); set { } } + + void M1() + { + C c = new C(); + c.M2(); + } + + private C() + { + this.s3 = new Elem(); + } + + public void M2() + { + Sink(s1); + Sink(s2); + Sink(s3); + Sink(s4); + Sink(s5); + Sink(s6); + } + + public static void Sink(object o) { } + + public class Elem { } +} diff --git a/csharp/ql/test/library-tests/dataflow/fields/D.cs b/csharp/ql/test/library-tests/dataflow/fields/D.cs new file mode 100644 index 00000000000..505f56bd388 --- /dev/null +++ b/csharp/ql/test/library-tests/dataflow/fields/D.cs @@ -0,0 +1,51 @@ +public class D +{ + object AutoProp { get; set; } + + object trivialPropField; + object TrivialProp + { + get { return this.trivialPropField; } + set { this.trivialPropField = value; } + } + + object ComplexProp + { + get { return this.trivialPropField; } + set { this.TrivialProp = value; } + } + + static D Create(object o1, object o2, object o3) + { + var ret = new D(); + ret.AutoProp = o1; + ret.TrivialProp = o2; + ret.ComplexProp = o3; + return ret; + } + + private void M() + { + var o = new object(); + + var d = Create(o, null, null); + Sink(d.AutoProp); // flow + Sink(d.TrivialProp); // no flow + Sink(d.trivialPropField); // no flow + Sink(d.ComplexProp); // no flow + + d = Create(null, o, null); + Sink(d.AutoProp); // no flow + Sink(d.TrivialProp); // flow + Sink(d.trivialPropField); // flow + Sink(d.ComplexProp); // flow + + d = Create(null, null, o); + Sink(d.AutoProp); // no flow + Sink(d.TrivialProp); // flow + Sink(d.trivialPropField); // flow + Sink(d.ComplexProp); // flow + } + + public static void Sink(object o) { } +} diff --git a/csharp/ql/test/library-tests/dataflow/fields/E.cs b/csharp/ql/test/library-tests/dataflow/fields/E.cs new file mode 100644 index 00000000000..45ee1994256 --- /dev/null +++ b/csharp/ql/test/library-tests/dataflow/fields/E.cs @@ -0,0 +1,32 @@ +public class E +{ + struct S + { + public object Field; + } + + static S CreateS(object o) + { + var ret = new S(); + ret.Field = o; + return ret; + } + + static void NotASetter(S s, object o) + { + s.Field = o; + } + + private void M() + { + var o = new object(); + var s = CreateS(o); + Sink(s.Field); // flow + + s = new S(); + NotASetter(s, o); + Sink(s.Field); // no flow + } + + public static void Sink(object o) { } +} diff --git a/csharp/ql/test/library-tests/dataflow/fields/F.cs b/csharp/ql/test/library-tests/dataflow/fields/F.cs new file mode 100644 index 00000000000..81076f72a93 --- /dev/null +++ b/csharp/ql/test/library-tests/dataflow/fields/F.cs @@ -0,0 +1,29 @@ +public class F +{ + object Field1; + object Field2; + + static F Create(object o1, object o2) => new F() { Field1 = o1, Field2 = o2 }; + + private void M() + { + var o = new object(); + var f = Create(o, null); + Sink(f.Field1); // flow + Sink(f.Field2); // no flow + + f = Create(null, o); + Sink(f.Field1); // no flow + Sink(f.Field2); // flow + + f = new F() { Field1 = o }; + Sink(f.Field1); // flow + Sink(f.Field2); // no flow + + f = new F() { Field2 = o }; + Sink(f.Field1); // no flow + Sink(f.Field2); // flow + } + + public static void Sink(object o) { } +} diff --git a/csharp/ql/test/library-tests/dataflow/fields/FieldFlow.expected b/csharp/ql/test/library-tests/dataflow/fields/FieldFlow.expected new file mode 100644 index 00000000000..76c7766839d --- /dev/null +++ b/csharp/ql/test/library-tests/dataflow/fields/FieldFlow.expected @@ -0,0 +1,197 @@ +edges +| A.cs:5:17:5:23 | object creation of type C | A.cs:6:24:6:24 | access to local variable c | +| A.cs:6:17:6:25 | call to method Make [c, ... (1)] | A.cs:7:14:7:14 | access to local variable b [c, ... (1)] | +| A.cs:6:24:6:24 | access to local variable c | A.cs:6:17:6:25 | call to method Make [c, ... (1)] | +| A.cs:7:14:7:14 | access to local variable b [c, ... (1)] | A.cs:7:14:7:16 | access to field c | +| A.cs:13:9:13:9 | [post] access to local variable b [c, ... (1)] | A.cs:14:14:14:14 | access to local variable b [c, ... (1)] | +| A.cs:13:15:13:22 | object creation of type C1 | A.cs:13:9:13:9 | [post] access to local variable b [c, ... (1)] | +| A.cs:14:14:14:14 | access to local variable b [c, ... (1)] | A.cs:14:14:14:20 | call to method Get | +| A.cs:15:15:15:28 | object creation of type B [c, ... (1)] | A.cs:15:14:15:35 | call to method Get | +| A.cs:15:21:15:27 | object creation of type C | A.cs:15:15:15:28 | object creation of type B [c, ... (1)] | +| A.cs:22:14:22:33 | call to method SetOnB [c, ... (1)] | A.cs:24:14:24:15 | access to local variable b2 [c, ... (1)] | +| A.cs:22:25:22:32 | object creation of type C2 | A.cs:22:14:22:33 | call to method SetOnB [c, ... (1)] | +| A.cs:24:14:24:15 | access to local variable b2 [c, ... (1)] | A.cs:24:14:24:17 | access to field c | +| A.cs:31:14:31:37 | call to method SetOnBWrap [c, ... (1)] | A.cs:33:14:33:15 | access to local variable b2 [c, ... (1)] | +| A.cs:31:29:31:36 | object creation of type C2 | A.cs:31:14:31:37 | call to method SetOnBWrap [c, ... (1)] | +| A.cs:33:14:33:15 | access to local variable b2 [c, ... (1)] | A.cs:33:14:33:17 | access to field c | +| A.cs:55:17:55:23 | object creation of type A | A.cs:57:16:57:16 | access to local variable a | +| A.cs:57:9:57:10 | [post] access to local variable c1 [a, ... (1)] | A.cs:58:12:58:13 | access to local variable c1 [a, ... (1)] | +| A.cs:57:16:57:16 | access to local variable a | A.cs:57:9:57:10 | [post] access to local variable c1 [a, ... (1)] | +| A.cs:58:12:58:13 | access to local variable c1 [a, ... (1)] | A.cs:60:22:60:22 | c [a, ... (1)] | +| A.cs:60:22:60:22 | c [a, ... (1)] | A.cs:64:19:64:23 | (...) ... [a, ... (1)] | +| A.cs:60:22:60:22 | c [a, ... (1)] | A.cs:69:18:69:22 | (...) ... [a, ... (1)] | +| A.cs:64:19:64:23 | (...) ... [a, ... (1)] | A.cs:64:18:64:26 | access to field a | +| A.cs:69:18:69:22 | (...) ... [a, ... (1)] | A.cs:77:19:77:24 | (...) ... [a, ... (1)] | +| A.cs:77:19:77:24 | (...) ... [a, ... (1)] | A.cs:77:18:77:27 | access to field a | +| A.cs:83:9:83:9 | [post] access to parameter b [c, ... (1)] | A.cs:88:12:88:12 | [post] access to local variable b [c, ... (1)] | +| A.cs:83:15:83:21 | object creation of type C | A.cs:83:9:83:9 | [post] access to parameter b [c, ... (1)] | +| A.cs:88:12:88:12 | [post] access to local variable b [c, ... (1)] | A.cs:89:14:89:14 | access to local variable b [c, ... (1)] | +| A.cs:89:14:89:14 | access to local variable b [c, ... (1)] | A.cs:89:14:89:16 | access to field c | +| A.cs:97:13:97:13 | [post] access to parameter b [c, ... (1)] | A.cs:98:22:98:36 | ... ? ... : ... [c, ... (1)] | +| A.cs:97:13:97:13 | [post] access to parameter b [c, ... (1)] | A.cs:105:23:105:23 | [post] access to local variable b [c, ... (1)] | +| A.cs:97:19:97:25 | object creation of type C | A.cs:97:13:97:13 | [post] access to parameter b [c, ... (1)] | +| A.cs:98:13:98:16 | [post] this access [b, ... (1)] | A.cs:105:17:105:29 | object creation of type D [b, ... (1)] | +| A.cs:98:13:98:16 | [post] this access [b, ... (2)] | A.cs:105:17:105:29 | object creation of type D [b, ... (2)] | +| A.cs:98:22:98:36 | ... ? ... : ... | A.cs:98:13:98:16 | [post] this access [b, ... (1)] | +| A.cs:98:22:98:36 | ... ? ... : ... [c, ... (1)] | A.cs:98:13:98:16 | [post] this access [b, ... (2)] | +| A.cs:98:30:98:36 | object creation of type B | A.cs:98:22:98:36 | ... ? ... : ... | +| A.cs:104:17:104:23 | object creation of type B | A.cs:105:23:105:23 | access to local variable b | +| A.cs:105:17:105:29 | object creation of type D [b, ... (1)] | A.cs:106:14:106:14 | access to local variable d [b, ... (1)] | +| A.cs:105:17:105:29 | object creation of type D [b, ... (2)] | A.cs:106:14:106:14 | access to local variable d [b, ... (2)] | +| A.cs:105:17:105:29 | object creation of type D [b, ... (2)] | A.cs:107:14:107:14 | access to local variable d [b, ... (2)] | +| A.cs:105:23:105:23 | [post] access to local variable b [c, ... (1)] | A.cs:108:14:108:14 | access to local variable b [c, ... (1)] | +| A.cs:105:23:105:23 | access to local variable b | A.cs:105:17:105:29 | object creation of type D [b, ... (1)] | +| A.cs:106:14:106:14 | access to local variable d [b, ... (1)] | A.cs:106:14:106:16 | access to field b | +| A.cs:106:14:106:14 | access to local variable d [b, ... (2)] | A.cs:106:14:106:16 | access to field b [c, ... (1)] | +| A.cs:106:14:106:16 | access to field b [c, ... (1)] | A.cs:107:14:107:16 | access to field b [c, ... (1)] | +| A.cs:107:14:107:14 | access to local variable d [b, ... (2)] | A.cs:107:14:107:16 | access to field b [c, ... (1)] | +| A.cs:107:14:107:16 | access to field b [c, ... (1)] | A.cs:107:14:107:18 | access to field c | +| A.cs:108:14:108:14 | access to local variable b [c, ... (1)] | A.cs:108:14:108:16 | access to field c | +| A.cs:113:17:113:23 | object creation of type B | A.cs:114:29:114:29 | access to local variable b | +| A.cs:114:18:114:54 | object creation of type MyList [head, ... (1)] | A.cs:115:35:115:36 | access to local variable l1 [head, ... (1)] | +| A.cs:114:29:114:29 | access to local variable b | A.cs:114:18:114:54 | object creation of type MyList [head, ... (1)] | +| A.cs:115:18:115:37 | object creation of type MyList [next, ... (2)] | A.cs:116:35:116:36 | access to local variable l2 [next, ... (2)] | +| A.cs:115:35:115:36 | access to local variable l1 [head, ... (1)] | A.cs:115:18:115:37 | object creation of type MyList [next, ... (2)] | +| A.cs:116:18:116:37 | object creation of type MyList [next, ... (3)] | A.cs:118:14:118:15 | access to local variable l3 [next, ... (3)] | +| A.cs:116:18:116:37 | object creation of type MyList [next, ... (3)] | A.cs:119:14:119:15 | access to local variable l3 [next, ... (3)] | +| A.cs:116:18:116:37 | object creation of type MyList [next, ... (3)] | A.cs:121:41:121:41 | access to local variable l [next, ... (3)] | +| A.cs:116:35:116:36 | access to local variable l2 [next, ... (2)] | A.cs:116:18:116:37 | object creation of type MyList [next, ... (3)] | +| A.cs:118:14:118:15 | access to local variable l3 [next, ... (3)] | A.cs:118:14:118:20 | access to field next [next, ... (2)] | +| A.cs:118:14:118:20 | access to field next [next, ... (2)] | A.cs:119:14:119:20 | access to field next [next, ... (2)] | +| A.cs:119:14:119:15 | access to local variable l3 [next, ... (3)] | A.cs:119:14:119:20 | access to field next [next, ... (2)] | +| A.cs:119:14:119:20 | access to field next [next, ... (2)] | A.cs:119:14:119:25 | access to field next [head, ... (1)] | +| A.cs:119:14:119:25 | access to field next [head, ... (1)] | A.cs:119:14:119:30 | access to field head | +| A.cs:121:41:121:41 | access to local variable l [next, ... (2)] | A.cs:121:41:121:46 | access to field next [head, ... (1)] | +| A.cs:121:41:121:41 | access to local variable l [next, ... (3)] | A.cs:121:41:121:46 | access to field next [next, ... (2)] | +| A.cs:121:41:121:46 | access to field next [head, ... (1)] | A.cs:123:18:123:18 | access to local variable l [head, ... (1)] | +| A.cs:121:41:121:46 | access to field next [next, ... (2)] | A.cs:121:41:121:41 | access to local variable l [next, ... (2)] | +| A.cs:123:18:123:18 | access to local variable l [head, ... (1)] | A.cs:123:18:123:23 | access to field head | +| B.cs:5:17:5:26 | object creation of type Elem | B.cs:6:27:6:27 | access to local variable e | +| B.cs:6:18:6:34 | object creation of type Box1 [elem1, ... (1)] | B.cs:7:27:7:28 | access to local variable b1 [elem1, ... (1)] | +| B.cs:6:27:6:27 | access to local variable e | B.cs:6:18:6:34 | object creation of type Box1 [elem1, ... (1)] | +| B.cs:7:18:7:29 | object creation of type Box2 [box1, ... (2)] | B.cs:8:14:8:15 | access to local variable b2 [box1, ... (2)] | +| B.cs:7:18:7:29 | object creation of type Box2 [box1, ... (2)] | B.cs:9:14:9:15 | access to local variable b2 [box1, ... (2)] | +| B.cs:7:27:7:28 | access to local variable b1 [elem1, ... (1)] | B.cs:7:18:7:29 | object creation of type Box2 [box1, ... (2)] | +| B.cs:8:14:8:15 | access to local variable b2 [box1, ... (2)] | B.cs:8:14:8:20 | access to field box1 [elem1, ... (1)] | +| B.cs:8:14:8:15 | access to local variable b2 [box1, ... (2)] | B.cs:8:14:8:20 | access to field box1 [elem2, ... (1)] | +| B.cs:8:14:8:20 | access to field box1 [elem1, ... (1)] | B.cs:8:14:8:26 | access to field elem1 | +| B.cs:8:14:8:20 | access to field box1 [elem2, ... (1)] | B.cs:9:14:9:20 | access to field box1 [elem2, ... (1)] | +| B.cs:9:14:9:15 | access to local variable b2 [box1, ... (2)] | B.cs:9:14:9:20 | access to field box1 [elem2, ... (1)] | +| B.cs:9:14:9:20 | access to field box1 [elem2, ... (1)] | B.cs:9:14:9:26 | access to field elem2 | +| B.cs:14:17:14:26 | object creation of type Elem | B.cs:15:33:15:33 | access to local variable e | +| B.cs:15:18:15:34 | object creation of type Box1 [elem2, ... (1)] | B.cs:16:27:16:28 | access to local variable b1 [elem2, ... (1)] | +| B.cs:15:33:15:33 | access to local variable e | B.cs:15:18:15:34 | object creation of type Box1 [elem2, ... (1)] | +| B.cs:16:18:16:29 | object creation of type Box2 [box1, ... (2)] | B.cs:17:14:17:15 | access to local variable b2 [box1, ... (2)] | +| B.cs:16:18:16:29 | object creation of type Box2 [box1, ... (2)] | B.cs:18:14:18:15 | access to local variable b2 [box1, ... (2)] | +| B.cs:16:27:16:28 | access to local variable b1 [elem2, ... (1)] | B.cs:16:18:16:29 | object creation of type Box2 [box1, ... (2)] | +| B.cs:17:14:17:15 | access to local variable b2 [box1, ... (2)] | B.cs:17:14:17:20 | access to field box1 [elem1, ... (1)] | +| B.cs:17:14:17:15 | access to local variable b2 [box1, ... (2)] | B.cs:17:14:17:20 | access to field box1 [elem2, ... (1)] | +| B.cs:17:14:17:20 | access to field box1 [elem1, ... (1)] | B.cs:17:14:17:26 | access to field elem1 | +| B.cs:17:14:17:20 | access to field box1 [elem2, ... (1)] | B.cs:18:14:18:20 | access to field box1 [elem2, ... (1)] | +| B.cs:18:14:18:15 | access to local variable b2 [box1, ... (2)] | B.cs:18:14:18:20 | access to field box1 [elem2, ... (1)] | +| B.cs:18:14:18:20 | access to field box1 [elem2, ... (1)] | B.cs:18:14:18:26 | access to field elem2 | +| C.cs:3:18:3:19 | [post] this access [s1, ... (1)] | C.cs:12:15:12:21 | object creation of type C [s1, ... (1)] | +| C.cs:3:23:3:32 | object creation of type Elem | C.cs:3:18:3:19 | [post] this access [s1, ... (1)] | +| C.cs:4:27:4:28 | [post] this access [s2, ... (1)] | C.cs:12:15:12:21 | object creation of type C [s2, ... (1)] | +| C.cs:4:32:4:41 | object creation of type Elem | C.cs:4:27:4:28 | [post] this access [s2, ... (1)] | +| C.cs:6:30:6:39 | object creation of type Elem | C.cs:26:14:26:15 | access to field s4 | +| C.cs:7:18:7:19 | [post] this access [s5, ... (1)] | C.cs:12:15:12:21 | object creation of type C [s5, ... (1)] | +| C.cs:7:18:7:19 | [post] this access [s5, ... (1)] | C.cs:12:15:12:21 | object creation of type C [s5, ... (1)] | +| C.cs:7:37:7:46 | object creation of type Elem | C.cs:7:18:7:19 | [post] this access [s5, ... (1)] | +| C.cs:7:37:7:46 | object creation of type Elem | C.cs:7:18:7:19 | [post] this access [s5, ... (1)] | +| C.cs:8:30:8:39 | object creation of type Elem | C.cs:28:14:28:15 | access to property s6 | +| C.cs:12:15:12:21 | object creation of type C [s1, ... (1)] | C.cs:13:9:13:9 | access to local variable c [s1, ... (1)] | +| C.cs:12:15:12:21 | object creation of type C [s2, ... (1)] | C.cs:13:9:13:9 | access to local variable c [s2, ... (1)] | +| C.cs:12:15:12:21 | object creation of type C [s3, ... (1)] | C.cs:13:9:13:9 | access to local variable c [s3, ... (1)] | +| C.cs:12:15:12:21 | object creation of type C [s5, ... (1)] | C.cs:13:9:13:9 | access to local variable c [s5, ... (1)] | +| C.cs:13:9:13:9 | access to local variable c [s1, ... (1)] | C.cs:21:17:21:18 | this [s1, ... (1)] | +| C.cs:13:9:13:9 | access to local variable c [s2, ... (1)] | C.cs:21:17:21:18 | this [s2, ... (1)] | +| C.cs:13:9:13:9 | access to local variable c [s3, ... (1)] | C.cs:21:17:21:18 | this [s3, ... (1)] | +| C.cs:13:9:13:9 | access to local variable c [s5, ... (1)] | C.cs:21:17:21:18 | this [s5, ... (1)] | +| C.cs:18:9:18:12 | [post] this access [s3, ... (1)] | C.cs:12:15:12:21 | object creation of type C [s3, ... (1)] | +| C.cs:18:19:18:28 | object creation of type Elem | C.cs:18:9:18:12 | [post] this access [s3, ... (1)] | +| C.cs:21:17:21:18 | this [s1, ... (1)] | C.cs:23:14:23:15 | this access [s1, ... (1)] | +| C.cs:21:17:21:18 | this [s2, ... (1)] | C.cs:24:14:24:15 | this access [s2, ... (1)] | +| C.cs:21:17:21:18 | this [s3, ... (1)] | C.cs:25:14:25:15 | this access [s3, ... (1)] | +| C.cs:21:17:21:18 | this [s5, ... (1)] | C.cs:27:14:27:15 | this access [s5, ... (1)] | +| C.cs:23:14:23:15 | this access [s1, ... (1)] | C.cs:23:14:23:15 | access to field s1 | +| C.cs:24:14:24:15 | this access [s2, ... (1)] | C.cs:24:14:24:15 | access to field s2 | +| C.cs:25:14:25:15 | this access [s3, ... (1)] | C.cs:25:14:25:15 | access to field s3 | +| C.cs:27:14:27:15 | this access [s5, ... (1)] | C.cs:27:14:27:15 | access to property s5 | +| D.cs:29:17:29:28 | object creation of type Object | D.cs:31:24:31:24 | access to local variable o | +| D.cs:29:17:29:28 | object creation of type Object | D.cs:37:26:37:26 | access to local variable o | +| D.cs:29:17:29:28 | object creation of type Object | D.cs:43:32:43:32 | access to local variable o | +| D.cs:31:17:31:37 | call to method Create [AutoProp, ... (1)] | D.cs:32:14:32:14 | access to local variable d [AutoProp, ... (1)] | +| D.cs:31:24:31:24 | access to local variable o | D.cs:31:17:31:37 | call to method Create [AutoProp, ... (1)] | +| D.cs:32:14:32:14 | access to local variable d [AutoProp, ... (1)] | D.cs:32:14:32:23 | access to property AutoProp | +| D.cs:37:13:37:33 | call to method Create [trivialPropField, ... (1)] | D.cs:39:14:39:14 | access to local variable d [trivialPropField, ... (1)] | +| D.cs:37:13:37:33 | call to method Create [trivialPropField, ... (1)] | D.cs:40:14:40:14 | access to local variable d [trivialPropField, ... (1)] | +| D.cs:37:13:37:33 | call to method Create [trivialPropField, ... (1)] | D.cs:41:14:41:14 | access to local variable d [trivialPropField, ... (1)] | +| D.cs:37:26:37:26 | access to local variable o | D.cs:37:13:37:33 | call to method Create [trivialPropField, ... (1)] | +| D.cs:39:14:39:14 | access to local variable d [trivialPropField, ... (1)] | D.cs:39:14:39:26 | access to property TrivialProp | +| D.cs:40:14:40:14 | access to local variable d [trivialPropField, ... (1)] | D.cs:40:14:40:31 | access to field trivialPropField | +| D.cs:41:14:41:14 | access to local variable d [trivialPropField, ... (1)] | D.cs:41:14:41:26 | access to property ComplexProp | +| D.cs:43:13:43:33 | call to method Create [trivialPropField, ... (1)] | D.cs:45:14:45:14 | access to local variable d [trivialPropField, ... (1)] | +| D.cs:43:13:43:33 | call to method Create [trivialPropField, ... (1)] | D.cs:46:14:46:14 | access to local variable d [trivialPropField, ... (1)] | +| D.cs:43:13:43:33 | call to method Create [trivialPropField, ... (1)] | D.cs:47:14:47:14 | access to local variable d [trivialPropField, ... (1)] | +| D.cs:43:32:43:32 | access to local variable o | D.cs:43:13:43:33 | call to method Create [trivialPropField, ... (1)] | +| D.cs:45:14:45:14 | access to local variable d [trivialPropField, ... (1)] | D.cs:45:14:45:26 | access to property TrivialProp | +| D.cs:46:14:46:14 | access to local variable d [trivialPropField, ... (1)] | D.cs:46:14:46:31 | access to field trivialPropField | +| D.cs:47:14:47:14 | access to local variable d [trivialPropField, ... (1)] | D.cs:47:14:47:26 | access to property ComplexProp | +| E.cs:22:17:22:28 | object creation of type Object | E.cs:23:25:23:25 | access to local variable o | +| E.cs:23:17:23:26 | call to method CreateS [Field, ... (1)] | E.cs:24:14:24:14 | access to local variable s [Field, ... (1)] | +| E.cs:23:25:23:25 | access to local variable o | E.cs:23:17:23:26 | call to method CreateS [Field, ... (1)] | +| E.cs:24:14:24:14 | access to local variable s [Field, ... (1)] | E.cs:24:14:24:20 | access to field Field | +| F.cs:10:17:10:28 | object creation of type Object | F.cs:11:24:11:24 | access to local variable o | +| F.cs:10:17:10:28 | object creation of type Object | F.cs:15:26:15:26 | access to local variable o | +| F.cs:10:17:10:28 | object creation of type Object | F.cs:19:32:19:32 | access to local variable o | +| F.cs:10:17:10:28 | object creation of type Object | F.cs:23:32:23:32 | access to local variable o | +| F.cs:11:17:11:31 | call to method Create [Field1, ... (1)] | F.cs:12:14:12:14 | access to local variable f [Field1, ... (1)] | +| F.cs:11:24:11:24 | access to local variable o | F.cs:11:17:11:31 | call to method Create [Field1, ... (1)] | +| F.cs:12:14:12:14 | access to local variable f [Field1, ... (1)] | F.cs:12:14:12:21 | access to field Field1 | +| F.cs:15:13:15:27 | call to method Create [Field2, ... (1)] | F.cs:17:14:17:14 | access to local variable f [Field2, ... (1)] | +| F.cs:15:26:15:26 | access to local variable o | F.cs:15:13:15:27 | call to method Create [Field2, ... (1)] | +| F.cs:17:14:17:14 | access to local variable f [Field2, ... (1)] | F.cs:17:14:17:21 | access to field Field2 | +| F.cs:19:13:19:34 | object creation of type F [Field1, ... (1)] | F.cs:20:14:20:14 | access to local variable f [Field1, ... (1)] | +| F.cs:19:32:19:32 | access to local variable o | F.cs:19:13:19:34 | object creation of type F [Field1, ... (1)] | +| F.cs:20:14:20:14 | access to local variable f [Field1, ... (1)] | F.cs:20:14:20:21 | access to field Field1 | +| F.cs:23:13:23:34 | object creation of type F [Field2, ... (1)] | F.cs:25:14:25:14 | access to local variable f [Field2, ... (1)] | +| F.cs:23:32:23:32 | access to local variable o | F.cs:23:13:23:34 | object creation of type F [Field2, ... (1)] | +| F.cs:25:14:25:14 | access to local variable f [Field2, ... (1)] | F.cs:25:14:25:21 | access to field Field2 | +#select +| A.cs:7:14:7:16 | access to field c | A.cs:5:17:5:23 | object creation of type C | A.cs:7:14:7:16 | access to field c | $@ | A.cs:5:17:5:23 | object creation of type C | object creation of type C | +| A.cs:14:14:14:20 | call to method Get | A.cs:13:15:13:22 | object creation of type C1 | A.cs:14:14:14:20 | call to method Get | $@ | A.cs:13:15:13:22 | object creation of type C1 | object creation of type C1 | +| A.cs:15:14:15:35 | call to method Get | A.cs:15:21:15:27 | object creation of type C | A.cs:15:14:15:35 | call to method Get | $@ | A.cs:15:21:15:27 | object creation of type C | object creation of type C | +| A.cs:24:14:24:17 | access to field c | A.cs:22:25:22:32 | object creation of type C2 | A.cs:24:14:24:17 | access to field c | $@ | A.cs:22:25:22:32 | object creation of type C2 | object creation of type C2 | +| A.cs:33:14:33:17 | access to field c | A.cs:31:29:31:36 | object creation of type C2 | A.cs:33:14:33:17 | access to field c | $@ | A.cs:31:29:31:36 | object creation of type C2 | object creation of type C2 | +| A.cs:64:18:64:26 | access to field a | A.cs:55:17:55:23 | object creation of type A | A.cs:64:18:64:26 | access to field a | $@ | A.cs:55:17:55:23 | object creation of type A | object creation of type A | +| A.cs:77:18:77:27 | access to field a | A.cs:55:17:55:23 | object creation of type A | A.cs:77:18:77:27 | access to field a | $@ | A.cs:55:17:55:23 | object creation of type A | object creation of type A | +| A.cs:89:14:89:16 | access to field c | A.cs:83:15:83:21 | object creation of type C | A.cs:89:14:89:16 | access to field c | $@ | A.cs:83:15:83:21 | object creation of type C | object creation of type C | +| A.cs:106:14:106:16 | access to field b | A.cs:98:30:98:36 | object creation of type B | A.cs:106:14:106:16 | access to field b | $@ | A.cs:98:30:98:36 | object creation of type B | object creation of type B | +| A.cs:106:14:106:16 | access to field b | A.cs:104:17:104:23 | object creation of type B | A.cs:106:14:106:16 | access to field b | $@ | A.cs:104:17:104:23 | object creation of type B | object creation of type B | +| A.cs:107:14:107:18 | access to field c | A.cs:97:19:97:25 | object creation of type C | A.cs:107:14:107:18 | access to field c | $@ | A.cs:97:19:97:25 | object creation of type C | object creation of type C | +| A.cs:108:14:108:16 | access to field c | A.cs:97:19:97:25 | object creation of type C | A.cs:108:14:108:16 | access to field c | $@ | A.cs:97:19:97:25 | object creation of type C | object creation of type C | +| A.cs:119:14:119:30 | access to field head | A.cs:113:17:113:23 | object creation of type B | A.cs:119:14:119:30 | access to field head | $@ | A.cs:113:17:113:23 | object creation of type B | object creation of type B | +| A.cs:123:18:123:23 | access to field head | A.cs:113:17:113:23 | object creation of type B | A.cs:123:18:123:23 | access to field head | $@ | A.cs:113:17:113:23 | object creation of type B | object creation of type B | +| B.cs:8:14:8:26 | access to field elem1 | B.cs:5:17:5:26 | object creation of type Elem | B.cs:8:14:8:26 | access to field elem1 | $@ | B.cs:5:17:5:26 | object creation of type Elem | object creation of type Elem | +| B.cs:9:14:9:26 | access to field elem2 | B.cs:5:17:5:26 | object creation of type Elem | B.cs:9:14:9:26 | access to field elem2 | $@ | B.cs:5:17:5:26 | object creation of type Elem | object creation of type Elem | +| B.cs:17:14:17:26 | access to field elem1 | B.cs:14:17:14:26 | object creation of type Elem | B.cs:17:14:17:26 | access to field elem1 | $@ | B.cs:14:17:14:26 | object creation of type Elem | object creation of type Elem | +| B.cs:18:14:18:26 | access to field elem2 | B.cs:14:17:14:26 | object creation of type Elem | B.cs:18:14:18:26 | access to field elem2 | $@ | B.cs:14:17:14:26 | object creation of type Elem | object creation of type Elem | +| C.cs:23:14:23:15 | access to field s1 | C.cs:3:23:3:32 | object creation of type Elem | C.cs:23:14:23:15 | access to field s1 | $@ | C.cs:3:23:3:32 | object creation of type Elem | object creation of type Elem | +| C.cs:24:14:24:15 | access to field s2 | C.cs:4:32:4:41 | object creation of type Elem | C.cs:24:14:24:15 | access to field s2 | $@ | C.cs:4:32:4:41 | object creation of type Elem | object creation of type Elem | +| C.cs:25:14:25:15 | access to field s3 | C.cs:18:19:18:28 | object creation of type Elem | C.cs:25:14:25:15 | access to field s3 | $@ | C.cs:18:19:18:28 | object creation of type Elem | object creation of type Elem | +| C.cs:26:14:26:15 | access to field s4 | C.cs:6:30:6:39 | object creation of type Elem | C.cs:26:14:26:15 | access to field s4 | $@ | C.cs:6:30:6:39 | object creation of type Elem | object creation of type Elem | +| C.cs:27:14:27:15 | access to property s5 | C.cs:7:37:7:46 | object creation of type Elem | C.cs:27:14:27:15 | access to property s5 | $@ | C.cs:7:37:7:46 | object creation of type Elem | object creation of type Elem | +| C.cs:28:14:28:15 | access to property s6 | C.cs:8:30:8:39 | object creation of type Elem | C.cs:28:14:28:15 | access to property s6 | $@ | C.cs:8:30:8:39 | object creation of type Elem | object creation of type Elem | +| D.cs:32:14:32:23 | access to property AutoProp | D.cs:29:17:29:28 | object creation of type Object | D.cs:32:14:32:23 | access to property AutoProp | $@ | D.cs:29:17:29:28 | object creation of type Object | object creation of type Object | +| D.cs:39:14:39:26 | access to property TrivialProp | D.cs:29:17:29:28 | object creation of type Object | D.cs:39:14:39:26 | access to property TrivialProp | $@ | D.cs:29:17:29:28 | object creation of type Object | object creation of type Object | +| D.cs:40:14:40:31 | access to field trivialPropField | D.cs:29:17:29:28 | object creation of type Object | D.cs:40:14:40:31 | access to field trivialPropField | $@ | D.cs:29:17:29:28 | object creation of type Object | object creation of type Object | +| D.cs:41:14:41:26 | access to property ComplexProp | D.cs:29:17:29:28 | object creation of type Object | D.cs:41:14:41:26 | access to property ComplexProp | $@ | D.cs:29:17:29:28 | object creation of type Object | object creation of type Object | +| D.cs:45:14:45:26 | access to property TrivialProp | D.cs:29:17:29:28 | object creation of type Object | D.cs:45:14:45:26 | access to property TrivialProp | $@ | D.cs:29:17:29:28 | object creation of type Object | object creation of type Object | +| D.cs:46:14:46:31 | access to field trivialPropField | D.cs:29:17:29:28 | object creation of type Object | D.cs:46:14:46:31 | access to field trivialPropField | $@ | D.cs:29:17:29:28 | object creation of type Object | object creation of type Object | +| D.cs:47:14:47:26 | access to property ComplexProp | D.cs:29:17:29:28 | object creation of type Object | D.cs:47:14:47:26 | access to property ComplexProp | $@ | D.cs:29:17:29:28 | object creation of type Object | object creation of type Object | +| E.cs:24:14:24:20 | access to field Field | E.cs:22:17:22:28 | object creation of type Object | E.cs:24:14:24:20 | access to field Field | $@ | E.cs:22:17:22:28 | object creation of type Object | object creation of type Object | +| F.cs:12:14:12:21 | access to field Field1 | F.cs:10:17:10:28 | object creation of type Object | F.cs:12:14:12:21 | access to field Field1 | $@ | F.cs:10:17:10:28 | object creation of type Object | object creation of type Object | +| F.cs:17:14:17:21 | access to field Field2 | F.cs:10:17:10:28 | object creation of type Object | F.cs:17:14:17:21 | access to field Field2 | $@ | F.cs:10:17:10:28 | object creation of type Object | object creation of type Object | +| F.cs:20:14:20:21 | access to field Field1 | F.cs:10:17:10:28 | object creation of type Object | F.cs:20:14:20:21 | access to field Field1 | $@ | F.cs:10:17:10:28 | object creation of type Object | object creation of type Object | +| F.cs:25:14:25:21 | access to field Field2 | F.cs:10:17:10:28 | object creation of type Object | F.cs:25:14:25:21 | access to field Field2 | $@ | F.cs:10:17:10:28 | object creation of type Object | object creation of type Object | diff --git a/csharp/ql/test/library-tests/dataflow/fields/FieldFlow.ql b/csharp/ql/test/library-tests/dataflow/fields/FieldFlow.ql new file mode 100644 index 00000000000..9d1a7f807fd --- /dev/null +++ b/csharp/ql/test/library-tests/dataflow/fields/FieldFlow.ql @@ -0,0 +1,23 @@ +/** + * @kind path-problem + */ + +import csharp +import DataFlow::PathGraph + +class Conf extends DataFlow::Configuration { + Conf() { this = "FieldFlowConf" } + + override predicate isSource(DataFlow::Node src) { src.asExpr() instanceof ObjectCreation } + + override predicate isSink(DataFlow::Node sink) { + exists(MethodCall mc | + mc.getTarget().hasName("Sink") and + mc.getAnArgument() = sink.asExpr() + ) + } +} + +from DataFlow::PathNode source, DataFlow::PathNode sink, Conf conf +where conf.hasFlowPath(source, sink) +select sink, source, sink, "$@", source, source.toString() diff --git a/csharp/ql/test/library-tests/dataflow/global/DataFlowEdges.ql b/csharp/ql/test/library-tests/dataflow/global/DataFlowEdges.ql index c4ac354f332..d6d43ededd0 100644 --- a/csharp/ql/test/library-tests/dataflow/global/DataFlowEdges.ql +++ b/csharp/ql/test/library-tests/dataflow/global/DataFlowEdges.ql @@ -1,12 +1,17 @@ import csharp import DataFlow +import semmle.code.csharp.dataflow.internal.DataFlowPrivate class ConfigAny extends Configuration { ConfigAny() { this = "ConfigAny" } - override predicate isSource(Node source) { any() } + override predicate isSource(Node source) { + source instanceof PostUpdateNode implies source.asExpr() instanceof ObjectCreation + } - override predicate isSink(Node sink) { any() } + override predicate isSink(Node sink) { + sink instanceof PostUpdateNode implies sink.asExpr() instanceof ObjectCreation + } } query predicate edges(PathNode a, PathNode b) { a.getASuccessor() = b } diff --git a/csharp/ql/test/library-tests/dataflow/global/TaintTrackingEdges.ql b/csharp/ql/test/library-tests/dataflow/global/TaintTrackingEdges.ql index 39e6e099de4..163130bea8f 100644 --- a/csharp/ql/test/library-tests/dataflow/global/TaintTrackingEdges.ql +++ b/csharp/ql/test/library-tests/dataflow/global/TaintTrackingEdges.ql @@ -1,12 +1,17 @@ import csharp import DataFlow +import semmle.code.csharp.dataflow.internal.DataFlowPrivate class ConfigAny extends TaintTracking::Configuration { ConfigAny() { this = "ConfigAny" } - override predicate isSource(Node source) { any() } + override predicate isSource(Node source) { + source instanceof PostUpdateNode implies source.asExpr() instanceof ObjectCreation + } - override predicate isSink(Node sink) { any() } + override predicate isSink(Node sink) { + sink instanceof PostUpdateNode implies sink.asExpr() instanceof ObjectCreation + } } query predicate edges(PathNode a, PathNode b) { a.getASuccessor() = b } diff --git a/csharp/ql/test/library-tests/dataflow/local/Common.qll b/csharp/ql/test/library-tests/dataflow/local/Common.qll index 2bc92ca0d61..298c02c38fa 100644 --- a/csharp/ql/test/library-tests/dataflow/local/Common.qll +++ b/csharp/ql/test/library-tests/dataflow/local/Common.qll @@ -12,9 +12,7 @@ class MyFlowSource extends DataFlow::Node { or this.asParameter().hasName("tainted") or - exists(Expr e | - this = TImplicitDelegateOutNode(e.getAControlFlowNode(), _) - | + exists(Expr e | this = TImplicitDelegateOutNode(e.getAControlFlowNode(), _) | e.(DelegateCreation).getArgument().(MethodAccess).getTarget().hasName("TaintedMethod") or e.(LambdaExpr).getExpressionBody().(StringLiteral).getValue() = "taint source" ) diff --git a/csharp/ql/test/library-tests/dataflow/local/DataFlowStep.expected b/csharp/ql/test/library-tests/dataflow/local/DataFlowStep.expected index 6209b8cd78e..18539c41520 100644 --- a/csharp/ql/test/library-tests/dataflow/local/DataFlowStep.expected +++ b/csharp/ql/test/library-tests/dataflow/local/DataFlowStep.expected @@ -18,38 +18,50 @@ | LocalDataFlow.cs:49:30:49:30 | b | LocalDataFlow.cs:96:21:96:21 | access to parameter b | | LocalDataFlow.cs:52:13:52:34 | SSA def(sink0) | LocalDataFlow.cs:53:15:53:19 | access to local variable sink0 | | LocalDataFlow.cs:52:21:52:34 | "taint source" | LocalDataFlow.cs:52:13:52:34 | SSA def(sink0) | +| LocalDataFlow.cs:53:15:53:19 | [post] access to local variable sink0 | LocalDataFlow.cs:61:18:61:22 | access to local variable sink0 | | LocalDataFlow.cs:53:15:53:19 | access to local variable sink0 | LocalDataFlow.cs:61:18:61:22 | access to local variable sink0 | | LocalDataFlow.cs:56:13:56:25 | SSA def(nonSink0) | LocalDataFlow.cs:57:15:57:22 | access to local variable nonSink0 | | LocalDataFlow.cs:56:24:56:25 | "" | LocalDataFlow.cs:56:13:56:25 | SSA def(nonSink0) | +| LocalDataFlow.cs:57:15:57:22 | [post] access to local variable nonSink0 | LocalDataFlow.cs:65:9:65:16 | access to local variable nonSink0 | | LocalDataFlow.cs:57:15:57:22 | access to local variable nonSink0 | LocalDataFlow.cs:65:9:65:16 | access to local variable nonSink0 | | LocalDataFlow.cs:60:13:60:25 | SSA def(sink1) | LocalDataFlow.cs:61:9:61:13 | access to local variable sink1 | | LocalDataFlow.cs:60:21:60:25 | "abc" | LocalDataFlow.cs:60:13:60:25 | SSA def(sink1) | | LocalDataFlow.cs:61:9:61:22 | ... + ... | LocalDataFlow.cs:61:9:61:22 | SSA def(sink1) | | LocalDataFlow.cs:61:9:61:22 | SSA def(sink1) | LocalDataFlow.cs:62:15:62:19 | access to local variable sink1 | | LocalDataFlow.cs:61:18:61:22 | access to local variable sink0 | LocalDataFlow.cs:204:20:204:24 | access to local variable sink0 | +| LocalDataFlow.cs:62:15:62:19 | [post] access to local variable sink1 | LocalDataFlow.cs:70:23:70:27 | access to local variable sink1 | | LocalDataFlow.cs:62:15:62:19 | access to local variable sink1 | LocalDataFlow.cs:70:23:70:27 | access to local variable sink1 | | LocalDataFlow.cs:65:9:65:25 | ... + ... | LocalDataFlow.cs:65:9:65:25 | SSA def(nonSink0) | | LocalDataFlow.cs:65:9:65:25 | SSA def(nonSink0) | LocalDataFlow.cs:66:15:66:22 | access to local variable nonSink0 | +| LocalDataFlow.cs:66:15:66:22 | [post] access to local variable nonSink0 | LocalDataFlow.cs:75:24:75:31 | access to local variable nonSink0 | | LocalDataFlow.cs:66:15:66:22 | access to local variable nonSink0 | LocalDataFlow.cs:75:24:75:31 | access to local variable nonSink0 | | LocalDataFlow.cs:69:13:69:51 | SSA def(sink2) | LocalDataFlow.cs:70:9:70:13 | access to local variable sink2 | | LocalDataFlow.cs:69:21:69:51 | object creation of type Dictionary | LocalDataFlow.cs:69:13:69:51 | SSA def(sink2) | +| LocalDataFlow.cs:70:9:70:13 | [post] access to local variable sink2 | LocalDataFlow.cs:71:15:71:19 | access to local variable sink2 | | LocalDataFlow.cs:70:9:70:13 | access to local variable sink2 | LocalDataFlow.cs:71:15:71:19 | access to local variable sink2 | | LocalDataFlow.cs:70:23:70:27 | access to local variable sink1 | LocalDataFlow.cs:76:18:76:22 | access to local variable sink1 | | LocalDataFlow.cs:74:13:74:55 | SSA def(nonSink1) | LocalDataFlow.cs:75:9:75:16 | access to local variable nonSink1 | | LocalDataFlow.cs:74:24:74:55 | object creation of type Dictionary | LocalDataFlow.cs:74:13:74:55 | SSA def(nonSink1) | +| LocalDataFlow.cs:75:9:75:16 | [post] access to local variable nonSink1 | LocalDataFlow.cs:76:9:76:16 | access to local variable nonSink1 | | LocalDataFlow.cs:75:9:75:16 | access to local variable nonSink1 | LocalDataFlow.cs:76:9:76:16 | access to local variable nonSink1 | +| LocalDataFlow.cs:75:24:75:31 | [post] access to local variable nonSink0 | LocalDataFlow.cs:84:20:84:27 | access to local variable nonSink0 | | LocalDataFlow.cs:75:24:75:31 | access to local variable nonSink0 | LocalDataFlow.cs:84:20:84:27 | access to local variable nonSink0 | +| LocalDataFlow.cs:76:9:76:16 | [post] access to local variable nonSink1 | LocalDataFlow.cs:77:15:77:22 | access to local variable nonSink1 | | LocalDataFlow.cs:76:9:76:16 | access to local variable nonSink1 | LocalDataFlow.cs:77:15:77:22 | access to local variable nonSink1 | +| LocalDataFlow.cs:76:18:76:22 | [post] access to local variable sink1 | LocalDataFlow.cs:80:21:80:25 | access to local variable sink1 | | LocalDataFlow.cs:76:18:76:22 | access to local variable sink1 | LocalDataFlow.cs:80:21:80:25 | access to local variable sink1 | | LocalDataFlow.cs:80:13:80:32 | SSA def(sink5) | LocalDataFlow.cs:81:15:81:19 | access to local variable sink5 | | LocalDataFlow.cs:80:21:80:25 | access to local variable sink1 | LocalDataFlow.cs:204:33:204:37 | access to local variable sink1 | | LocalDataFlow.cs:80:21:80:32 | ... + ... | LocalDataFlow.cs:80:13:80:32 | SSA def(sink5) | +| LocalDataFlow.cs:81:15:81:19 | [post] access to local variable sink5 | LocalDataFlow.cs:88:22:88:26 | access to local variable sink5 | | LocalDataFlow.cs:81:15:81:19 | access to local variable sink5 | LocalDataFlow.cs:88:22:88:26 | access to local variable sink5 | | LocalDataFlow.cs:84:9:84:36 | SSA def(nonSink0) | LocalDataFlow.cs:85:15:85:22 | access to local variable nonSink0 | | LocalDataFlow.cs:84:20:84:36 | ... + ... | LocalDataFlow.cs:84:9:84:36 | SSA def(nonSink0) | +| LocalDataFlow.cs:85:15:85:22 | [post] access to local variable nonSink0 | LocalDataFlow.cs:92:21:92:28 | access to local variable nonSink0 | | LocalDataFlow.cs:85:15:85:22 | access to local variable nonSink0 | LocalDataFlow.cs:92:21:92:28 | access to local variable nonSink0 | | LocalDataFlow.cs:88:13:88:27 | SSA def(sink6) | LocalDataFlow.cs:89:15:89:19 | access to local variable sink6 | | LocalDataFlow.cs:88:22:88:26 | access to local variable sink5 | LocalDataFlow.cs:88:13:88:27 | SSA def(sink6) | +| LocalDataFlow.cs:89:15:89:19 | [post] access to local variable sink6 | LocalDataFlow.cs:96:31:96:35 | [b (line 49): false] access to local variable sink6 | | LocalDataFlow.cs:89:15:89:19 | access to local variable sink6 | LocalDataFlow.cs:96:31:96:35 | [b (line 49): false] access to local variable sink6 | | LocalDataFlow.cs:92:9:92:29 | SSA def(nonSink0) | LocalDataFlow.cs:93:15:93:22 | access to local variable nonSink0 | | LocalDataFlow.cs:92:21:92:28 | access to local variable nonSink0 | LocalDataFlow.cs:92:9:92:29 | SSA def(nonSink0) | @@ -69,10 +81,12 @@ | LocalDataFlow.cs:100:20:100:36 | [b (line 49): true] ... ? ... : ... | LocalDataFlow.cs:100:9:100:36 | SSA def(nonSink0) | | LocalDataFlow.cs:100:24:100:28 | "abc" | LocalDataFlow.cs:100:20:100:36 | [b (line 49): true] ... ? ... : ... | | LocalDataFlow.cs:100:32:100:36 | "def" | LocalDataFlow.cs:100:20:100:36 | [b (line 49): false] ... ? ... : ... | +| LocalDataFlow.cs:101:15:101:22 | [post] access to local variable nonSink0 | LocalDataFlow.cs:108:32:108:39 | access to local variable nonSink0 | | LocalDataFlow.cs:101:15:101:22 | access to local variable nonSink0 | LocalDataFlow.cs:108:32:108:39 | access to local variable nonSink0 | | LocalDataFlow.cs:104:13:104:33 | SSA def(sink8) | LocalDataFlow.cs:105:15:105:19 | access to local variable sink8 | | LocalDataFlow.cs:104:21:104:33 | (...) ... | LocalDataFlow.cs:104:13:104:33 | SSA def(sink8) | | LocalDataFlow.cs:104:29:104:33 | access to local variable sink7 | LocalDataFlow.cs:104:21:104:33 | (...) ... | +| LocalDataFlow.cs:105:15:105:19 | [post] access to local variable sink8 | LocalDataFlow.cs:112:21:112:25 | access to local variable sink8 | | LocalDataFlow.cs:105:15:105:19 | access to local variable sink8 | LocalDataFlow.cs:112:21:112:25 | access to local variable sink8 | | LocalDataFlow.cs:108:13:108:39 | SSA def(nonSink3) | LocalDataFlow.cs:109:15:109:22 | access to local variable nonSink3 | | LocalDataFlow.cs:108:24:108:39 | (...) ... | LocalDataFlow.cs:108:13:108:39 | SSA def(nonSink3) | @@ -82,6 +96,7 @@ | LocalDataFlow.cs:112:21:112:25 | access to local variable sink8 | LocalDataFlow.cs:112:21:112:35 | ... as ... | | LocalDataFlow.cs:112:21:112:25 | access to local variable sink8 | LocalDataFlow.cs:200:22:200:26 | access to local variable sink8 | | LocalDataFlow.cs:112:21:112:35 | ... as ... | LocalDataFlow.cs:112:13:112:35 | SSA def(sink9) | +| LocalDataFlow.cs:113:15:113:19 | [post] access to local variable sink9 | LocalDataFlow.cs:120:37:120:41 | access to local variable sink9 | | LocalDataFlow.cs:113:15:113:19 | access to local variable sink9 | LocalDataFlow.cs:120:37:120:41 | access to local variable sink9 | | LocalDataFlow.cs:116:9:116:37 | SSA def(nonSink3) | LocalDataFlow.cs:117:15:117:22 | access to local variable nonSink3 | | LocalDataFlow.cs:116:20:116:27 | access to local variable nonSink0 | LocalDataFlow.cs:116:20:116:37 | ... as ... | @@ -90,55 +105,74 @@ | LocalDataFlow.cs:120:13:120:43 | SSA def(sink10) | LocalDataFlow.cs:121:15:121:20 | access to local variable sink10 | | LocalDataFlow.cs:120:22:120:43 | array creation of type Object[] | LocalDataFlow.cs:120:13:120:43 | SSA def(sink10) | | LocalDataFlow.cs:120:37:120:41 | access to local variable sink9 | LocalDataFlow.cs:128:61:128:65 | access to local variable sink9 | +| LocalDataFlow.cs:121:15:121:20 | [post] access to local variable sink10 | LocalDataFlow.cs:218:22:218:27 | access to local variable sink10 | | LocalDataFlow.cs:121:15:121:20 | access to local variable sink10 | LocalDataFlow.cs:218:22:218:27 | access to local variable sink10 | | LocalDataFlow.cs:124:13:124:42 | SSA def(nonSink4) | LocalDataFlow.cs:125:15:125:22 | access to local variable nonSink4 | | LocalDataFlow.cs:124:24:124:42 | array creation of type Object[] | LocalDataFlow.cs:124:13:124:42 | SSA def(nonSink4) | | LocalDataFlow.cs:124:39:124:40 | 42 | LocalDataFlow.cs:124:39:124:40 | (...) ... | +| LocalDataFlow.cs:125:15:125:22 | [post] access to local variable nonSink4 | LocalDataFlow.cs:222:20:222:27 | access to local variable nonSink4 | | LocalDataFlow.cs:125:15:125:22 | access to local variable nonSink4 | LocalDataFlow.cs:222:20:222:27 | access to local variable nonSink4 | | LocalDataFlow.cs:128:13:128:69 | SSA def(sink11) | LocalDataFlow.cs:129:15:129:20 | access to local variable sink11 | | LocalDataFlow.cs:128:22:128:69 | object creation of type Dictionary | LocalDataFlow.cs:128:13:128:69 | SSA def(sink11) | +| LocalDataFlow.cs:128:61:128:65 | [post] access to local variable sink9 | LocalDataFlow.cs:132:55:132:59 | access to local variable sink9 | | LocalDataFlow.cs:128:61:128:65 | access to local variable sink9 | LocalDataFlow.cs:132:55:132:59 | access to local variable sink9 | +| LocalDataFlow.cs:129:15:129:20 | [post] access to local variable sink11 | LocalDataFlow.cs:136:22:136:27 | access to local variable sink11 | | LocalDataFlow.cs:129:15:129:20 | access to local variable sink11 | LocalDataFlow.cs:136:22:136:27 | access to local variable sink11 | | LocalDataFlow.cs:132:9:132:67 | SSA def(nonSink1) | LocalDataFlow.cs:133:15:133:22 | access to local variable nonSink1 | | LocalDataFlow.cs:132:20:132:67 | object creation of type Dictionary | LocalDataFlow.cs:132:9:132:67 | SSA def(nonSink1) | +| LocalDataFlow.cs:132:55:132:59 | [post] access to local variable sink9 | LocalDataFlow.cs:144:34:144:38 | access to local variable sink9 | | LocalDataFlow.cs:132:55:132:59 | access to local variable sink9 | LocalDataFlow.cs:144:34:144:38 | access to local variable sink9 | +| LocalDataFlow.cs:133:15:133:22 | [post] access to local variable nonSink1 | LocalDataFlow.cs:140:20:140:27 | access to local variable nonSink1 | | LocalDataFlow.cs:133:15:133:22 | access to local variable nonSink1 | LocalDataFlow.cs:140:20:140:27 | access to local variable nonSink1 | | LocalDataFlow.cs:136:13:136:55 | SSA def(sink14) | LocalDataFlow.cs:137:15:137:20 | access to local variable sink14 | +| LocalDataFlow.cs:136:22:136:27 | [post] access to local variable sink11 | LocalDataFlow.cs:210:22:210:27 | access to local variable sink11 | | LocalDataFlow.cs:136:22:136:27 | access to local variable sink11 | LocalDataFlow.cs:210:22:210:27 | access to local variable sink11 | | LocalDataFlow.cs:136:22:136:55 | call to method First | LocalDataFlow.cs:136:13:136:55 | SSA def(sink14) | | LocalDataFlow.cs:136:35:136:35 | x | LocalDataFlow.cs:136:40:136:40 | access to parameter x | | LocalDataFlow.cs:136:40:136:40 | access to parameter x | LocalDataFlow.cs:136:40:136:46 | access to property Value | | LocalDataFlow.cs:140:9:140:55 | SSA def(nonSink3) | LocalDataFlow.cs:206:33:206:40 | access to local variable nonSink3 | +| LocalDataFlow.cs:140:20:140:27 | [post] access to local variable nonSink1 | LocalDataFlow.cs:141:15:141:22 | access to local variable nonSink1 | | LocalDataFlow.cs:140:20:140:27 | access to local variable nonSink1 | LocalDataFlow.cs:141:15:141:22 | access to local variable nonSink1 | | LocalDataFlow.cs:140:20:140:55 | (...) ... | LocalDataFlow.cs:140:9:140:55 | SSA def(nonSink3) | | LocalDataFlow.cs:140:20:140:55 | call to method First | LocalDataFlow.cs:140:20:140:55 | (...) ... | | LocalDataFlow.cs:140:35:140:35 | x | LocalDataFlow.cs:140:40:140:40 | access to parameter x | | LocalDataFlow.cs:140:40:140:40 | access to parameter x | LocalDataFlow.cs:140:40:140:46 | access to property Value | +| LocalDataFlow.cs:141:15:141:22 | [post] access to local variable nonSink1 | LocalDataFlow.cs:214:20:214:27 | access to local variable nonSink1 | | LocalDataFlow.cs:141:15:141:22 | access to local variable nonSink1 | LocalDataFlow.cs:214:20:214:27 | access to local variable nonSink1 | | LocalDataFlow.cs:144:13:144:39 | SSA def(sink15) | LocalDataFlow.cs:145:15:145:20 | access to local variable sink15 | | LocalDataFlow.cs:144:22:144:39 | call to method Parse | LocalDataFlow.cs:144:13:144:39 | SSA def(sink15) | +| LocalDataFlow.cs:144:34:144:38 | [post] access to local variable sink9 | LocalDataFlow.cs:147:37:147:41 | access to local variable sink9 | | LocalDataFlow.cs:144:34:144:38 | access to local variable sink9 | LocalDataFlow.cs:147:37:147:41 | access to local variable sink9 | | LocalDataFlow.cs:145:15:145:20 | access to local variable sink15 | LocalDataFlow.cs:196:22:196:27 | access to local variable sink15 | | LocalDataFlow.cs:147:13:147:56 | SSA def(sink16) | LocalDataFlow.cs:148:15:148:20 | access to local variable sink16 | | LocalDataFlow.cs:147:22:147:56 | call to method TryParse | LocalDataFlow.cs:147:13:147:56 | SSA def(sink16) | +| LocalDataFlow.cs:147:37:147:41 | [post] access to local variable sink9 | LocalDataFlow.cs:149:44:149:48 | access to local variable sink9 | | LocalDataFlow.cs:147:37:147:41 | access to local variable sink9 | LocalDataFlow.cs:149:44:149:48 | access to local variable sink9 | | LocalDataFlow.cs:149:13:149:49 | SSA def(sink17) | LocalDataFlow.cs:150:15:150:20 | access to local variable sink17 | +| LocalDataFlow.cs:149:22:149:29 | [post] access to local variable nonSink0 | LocalDataFlow.cs:151:36:151:43 | access to local variable nonSink0 | | LocalDataFlow.cs:149:22:149:29 | access to local variable nonSink0 | LocalDataFlow.cs:151:36:151:43 | access to local variable nonSink0 | | LocalDataFlow.cs:149:22:149:49 | call to method Replace | LocalDataFlow.cs:149:13:149:49 | SSA def(sink17) | +| LocalDataFlow.cs:149:44:149:48 | [post] access to local variable sink9 | LocalDataFlow.cs:151:46:151:50 | access to local variable sink9 | | LocalDataFlow.cs:149:44:149:48 | access to local variable sink9 | LocalDataFlow.cs:151:46:151:50 | access to local variable sink9 | | LocalDataFlow.cs:151:13:151:51 | SSA def(sink18) | LocalDataFlow.cs:152:15:152:20 | access to local variable sink18 | | LocalDataFlow.cs:151:22:151:51 | call to method Format | LocalDataFlow.cs:151:13:151:51 | SSA def(sink18) | +| LocalDataFlow.cs:151:36:151:43 | [post] access to local variable nonSink0 | LocalDataFlow.cs:153:44:153:51 | access to local variable nonSink0 | | LocalDataFlow.cs:151:36:151:43 | access to local variable nonSink0 | LocalDataFlow.cs:153:44:153:51 | access to local variable nonSink0 | +| LocalDataFlow.cs:151:46:151:50 | [post] access to local variable sink9 | LocalDataFlow.cs:155:33:155:37 | access to local variable sink9 | | LocalDataFlow.cs:151:46:151:50 | access to local variable sink9 | LocalDataFlow.cs:155:33:155:37 | access to local variable sink9 | +| LocalDataFlow.cs:152:15:152:20 | [post] access to local variable sink18 | LocalDataFlow.cs:153:36:153:41 | access to local variable sink18 | | LocalDataFlow.cs:152:15:152:20 | access to local variable sink18 | LocalDataFlow.cs:153:36:153:41 | access to local variable sink18 | | LocalDataFlow.cs:153:13:153:52 | SSA def(sink19) | LocalDataFlow.cs:154:15:154:20 | access to local variable sink19 | | LocalDataFlow.cs:153:22:153:52 | call to method Format | LocalDataFlow.cs:153:13:153:52 | SSA def(sink19) | +| LocalDataFlow.cs:153:44:153:51 | [post] access to local variable nonSink0 | LocalDataFlow.cs:172:32:172:39 | access to local variable nonSink0 | | LocalDataFlow.cs:153:44:153:51 | access to local variable nonSink0 | LocalDataFlow.cs:172:32:172:39 | access to local variable nonSink0 | | LocalDataFlow.cs:155:13:155:38 | SSA def(sink45) | LocalDataFlow.cs:156:15:156:20 | access to local variable sink45 | | LocalDataFlow.cs:155:22:155:38 | call to method Parse | LocalDataFlow.cs:155:13:155:38 | SSA def(sink45) | +| LocalDataFlow.cs:155:33:155:37 | [post] access to local variable sink9 | LocalDataFlow.cs:158:36:158:40 | access to local variable sink9 | | LocalDataFlow.cs:155:33:155:37 | access to local variable sink9 | LocalDataFlow.cs:158:36:158:40 | access to local variable sink9 | | LocalDataFlow.cs:158:13:158:56 | SSA def(sink46) | LocalDataFlow.cs:159:15:159:20 | access to local variable sink46 | | LocalDataFlow.cs:158:22:158:56 | call to method TryParse | LocalDataFlow.cs:158:13:158:56 | SSA def(sink46) | +| LocalDataFlow.cs:158:36:158:40 | [post] access to local variable sink9 | LocalDataFlow.cs:198:22:198:26 | access to local variable sink9 | | LocalDataFlow.cs:158:36:158:40 | access to local variable sink9 | LocalDataFlow.cs:198:22:198:26 | access to local variable sink9 | | LocalDataFlow.cs:159:15:159:20 | access to local variable sink46 | LocalDataFlow.cs:160:37:160:42 | access to local variable sink46 | | LocalDataFlow.cs:160:13:160:43 | SSA def(sink47) | LocalDataFlow.cs:161:15:161:20 | access to local variable sink47 | @@ -147,32 +181,42 @@ | LocalDataFlow.cs:162:13:162:46 | SSA def(sink49) | LocalDataFlow.cs:163:15:163:20 | access to local variable sink49 | | LocalDataFlow.cs:162:22:162:46 | call to method Concat | LocalDataFlow.cs:162:13:162:46 | SSA def(sink49) | | LocalDataFlow.cs:162:40:162:45 | access to local variable sink47 | LocalDataFlow.cs:162:40:162:45 | (...) ... | +| LocalDataFlow.cs:163:15:163:20 | [post] access to local variable sink49 | LocalDataFlow.cs:164:34:164:39 | access to local variable sink49 | | LocalDataFlow.cs:163:15:163:20 | access to local variable sink49 | LocalDataFlow.cs:164:34:164:39 | access to local variable sink49 | | LocalDataFlow.cs:164:13:164:40 | SSA def(sink50) | LocalDataFlow.cs:165:15:165:20 | access to local variable sink50 | | LocalDataFlow.cs:164:22:164:40 | call to method Copy | LocalDataFlow.cs:164:13:164:40 | SSA def(sink50) | | LocalDataFlow.cs:164:34:164:39 | access to local variable sink49 | LocalDataFlow.cs:164:22:164:40 | call to method Copy | +| LocalDataFlow.cs:165:15:165:20 | [post] access to local variable sink50 | LocalDataFlow.cs:166:44:166:49 | access to local variable sink50 | | LocalDataFlow.cs:165:15:165:20 | access to local variable sink50 | LocalDataFlow.cs:166:44:166:49 | access to local variable sink50 | | LocalDataFlow.cs:166:13:166:54 | SSA def(sink51) | LocalDataFlow.cs:167:15:167:20 | access to local variable sink51 | | LocalDataFlow.cs:166:22:166:54 | call to method Join | LocalDataFlow.cs:166:13:166:54 | SSA def(sink51) | +| LocalDataFlow.cs:167:15:167:20 | [post] access to local variable sink51 | LocalDataFlow.cs:168:35:168:40 | access to local variable sink51 | | LocalDataFlow.cs:167:15:167:20 | access to local variable sink51 | LocalDataFlow.cs:168:35:168:40 | access to local variable sink51 | | LocalDataFlow.cs:168:13:168:41 | SSA def(sink52) | LocalDataFlow.cs:169:15:169:20 | access to local variable sink52 | | LocalDataFlow.cs:168:22:168:41 | call to method Insert | LocalDataFlow.cs:168:13:168:41 | SSA def(sink52) | | LocalDataFlow.cs:172:9:172:40 | SSA def(nonSink2) | LocalDataFlow.cs:173:15:173:22 | access to local variable nonSink2 | | LocalDataFlow.cs:172:20:172:40 | call to method Parse | LocalDataFlow.cs:172:9:172:40 | SSA def(nonSink2) | +| LocalDataFlow.cs:172:32:172:39 | [post] access to local variable nonSink0 | LocalDataFlow.cs:174:39:174:46 | access to local variable nonSink0 | | LocalDataFlow.cs:172:32:172:39 | access to local variable nonSink0 | LocalDataFlow.cs:174:39:174:46 | access to local variable nonSink0 | | LocalDataFlow.cs:174:13:174:61 | SSA def(nonSink7) | LocalDataFlow.cs:175:15:175:22 | access to local variable nonSink7 | | LocalDataFlow.cs:174:24:174:61 | call to method TryParse | LocalDataFlow.cs:174:13:174:61 | SSA def(nonSink7) | +| LocalDataFlow.cs:174:39:174:46 | [post] access to local variable nonSink0 | LocalDataFlow.cs:176:20:176:27 | access to local variable nonSink0 | | LocalDataFlow.cs:174:39:174:46 | access to local variable nonSink0 | LocalDataFlow.cs:176:20:176:27 | access to local variable nonSink0 | | LocalDataFlow.cs:176:9:176:50 | SSA def(nonSink0) | LocalDataFlow.cs:177:15:177:22 | access to local variable nonSink0 | +| LocalDataFlow.cs:176:20:176:27 | [post] access to local variable nonSink0 | LocalDataFlow.cs:176:42:176:49 | access to local variable nonSink0 | | LocalDataFlow.cs:176:20:176:27 | access to local variable nonSink0 | LocalDataFlow.cs:176:42:176:49 | access to local variable nonSink0 | | LocalDataFlow.cs:176:20:176:50 | call to method Replace | LocalDataFlow.cs:176:9:176:50 | SSA def(nonSink0) | +| LocalDataFlow.cs:177:15:177:22 | [post] access to local variable nonSink0 | LocalDataFlow.cs:178:34:178:41 | access to local variable nonSink0 | | LocalDataFlow.cs:177:15:177:22 | access to local variable nonSink0 | LocalDataFlow.cs:178:34:178:41 | access to local variable nonSink0 | | LocalDataFlow.cs:178:9:178:52 | SSA def(nonSink0) | LocalDataFlow.cs:179:15:179:22 | access to local variable nonSink0 | | LocalDataFlow.cs:178:20:178:52 | call to method Format | LocalDataFlow.cs:178:9:178:52 | SSA def(nonSink0) | +| LocalDataFlow.cs:178:34:178:41 | [post] access to local variable nonSink0 | LocalDataFlow.cs:178:44:178:51 | access to local variable nonSink0 | | LocalDataFlow.cs:178:34:178:41 | access to local variable nonSink0 | LocalDataFlow.cs:178:44:178:51 | access to local variable nonSink0 | +| LocalDataFlow.cs:179:15:179:22 | [post] access to local variable nonSink0 | LocalDataFlow.cs:180:31:180:38 | access to local variable nonSink0 | | LocalDataFlow.cs:179:15:179:22 | access to local variable nonSink0 | LocalDataFlow.cs:180:31:180:38 | access to local variable nonSink0 | | LocalDataFlow.cs:180:9:180:39 | SSA def(nonSink7) | LocalDataFlow.cs:181:15:181:22 | access to local variable nonSink7 | | LocalDataFlow.cs:180:20:180:39 | call to method Parse | LocalDataFlow.cs:180:9:180:39 | SSA def(nonSink7) | +| LocalDataFlow.cs:180:31:180:38 | [post] access to local variable nonSink0 | LocalDataFlow.cs:182:34:182:41 | access to local variable nonSink0 | | LocalDataFlow.cs:180:31:180:38 | access to local variable nonSink0 | LocalDataFlow.cs:182:34:182:41 | access to local variable nonSink0 | | LocalDataFlow.cs:182:9:182:57 | SSA def(nonSink7) | LocalDataFlow.cs:183:15:183:22 | access to local variable nonSink7 | | LocalDataFlow.cs:182:20:182:57 | call to method TryParse | LocalDataFlow.cs:182:9:182:57 | SSA def(nonSink7) | @@ -183,13 +227,16 @@ | LocalDataFlow.cs:186:9:186:46 | SSA def(nonSink0) | LocalDataFlow.cs:187:15:187:22 | access to local variable nonSink0 | | LocalDataFlow.cs:186:20:186:46 | call to method Concat | LocalDataFlow.cs:186:9:186:46 | SSA def(nonSink0) | | LocalDataFlow.cs:186:38:186:45 | access to local variable nonSink7 | LocalDataFlow.cs:186:38:186:45 | (...) ... | +| LocalDataFlow.cs:187:15:187:22 | [post] access to local variable nonSink0 | LocalDataFlow.cs:188:32:188:39 | access to local variable nonSink0 | | LocalDataFlow.cs:187:15:187:22 | access to local variable nonSink0 | LocalDataFlow.cs:188:32:188:39 | access to local variable nonSink0 | | LocalDataFlow.cs:188:9:188:40 | SSA def(nonSink0) | LocalDataFlow.cs:189:15:189:22 | access to local variable nonSink0 | | LocalDataFlow.cs:188:20:188:40 | call to method Copy | LocalDataFlow.cs:188:9:188:40 | SSA def(nonSink0) | | LocalDataFlow.cs:188:32:188:39 | access to local variable nonSink0 | LocalDataFlow.cs:188:20:188:40 | call to method Copy | +| LocalDataFlow.cs:189:15:189:22 | [post] access to local variable nonSink0 | LocalDataFlow.cs:190:42:190:49 | access to local variable nonSink0 | | LocalDataFlow.cs:189:15:189:22 | access to local variable nonSink0 | LocalDataFlow.cs:190:42:190:49 | access to local variable nonSink0 | | LocalDataFlow.cs:190:9:190:54 | SSA def(nonSink0) | LocalDataFlow.cs:191:15:191:22 | access to local variable nonSink0 | | LocalDataFlow.cs:190:20:190:54 | call to method Join | LocalDataFlow.cs:190:9:190:54 | SSA def(nonSink0) | +| LocalDataFlow.cs:191:15:191:22 | [post] access to local variable nonSink0 | LocalDataFlow.cs:192:33:192:40 | access to local variable nonSink0 | | LocalDataFlow.cs:191:15:191:22 | access to local variable nonSink0 | LocalDataFlow.cs:192:33:192:40 | access to local variable nonSink0 | | LocalDataFlow.cs:192:9:192:41 | SSA def(nonSink0) | LocalDataFlow.cs:193:15:193:22 | access to local variable nonSink0 | | LocalDataFlow.cs:192:20:192:41 | call to method Insert | LocalDataFlow.cs:192:9:192:41 | SSA def(nonSink0) | @@ -199,22 +246,28 @@ | LocalDataFlow.cs:198:13:198:40 | SSA def(sink21) | LocalDataFlow.cs:199:15:199:20 | access to local variable sink21 | | LocalDataFlow.cs:198:22:198:40 | call to method Equals | LocalDataFlow.cs:198:13:198:40 | SSA def(sink21) | | LocalDataFlow.cs:200:13:200:45 | SSA def(sink22) | LocalDataFlow.cs:201:15:201:20 | access to local variable sink22 | +| LocalDataFlow.cs:200:22:200:26 | [post] access to local variable sink8 | LocalDataFlow.cs:206:20:206:24 | access to local variable sink8 | | LocalDataFlow.cs:200:22:200:26 | access to local variable sink8 | LocalDataFlow.cs:206:20:206:24 | access to local variable sink8 | | LocalDataFlow.cs:200:22:200:45 | call to method Equals | LocalDataFlow.cs:200:13:200:45 | SSA def(sink22) | | LocalDataFlow.cs:200:43:200:44 | 41 | LocalDataFlow.cs:200:35:200:44 | (...) ... | | LocalDataFlow.cs:204:9:204:38 | SSA def(nonSink7) | LocalDataFlow.cs:205:15:205:22 | access to local variable nonSink7 | +| LocalDataFlow.cs:204:20:204:24 | [post] access to local variable sink0 | LocalDataFlow.cs:411:30:411:34 | access to local variable sink0 | | LocalDataFlow.cs:204:20:204:24 | access to local variable sink0 | LocalDataFlow.cs:411:30:411:34 | access to local variable sink0 | | LocalDataFlow.cs:204:20:204:38 | call to method Equals | LocalDataFlow.cs:204:9:204:38 | SSA def(nonSink7) | +| LocalDataFlow.cs:204:33:204:37 | [post] access to local variable sink1 | LocalDataFlow.cs:320:22:320:26 | access to local variable sink1 | | LocalDataFlow.cs:204:33:204:37 | access to local variable sink1 | LocalDataFlow.cs:320:22:320:26 | access to local variable sink1 | | LocalDataFlow.cs:206:9:206:41 | SSA def(nonSink7) | LocalDataFlow.cs:207:15:207:22 | access to local variable nonSink7 | | LocalDataFlow.cs:206:20:206:41 | call to method Equals | LocalDataFlow.cs:206:9:206:41 | SSA def(nonSink7) | | LocalDataFlow.cs:207:15:207:22 | access to local variable nonSink7 | LocalDataFlow.cs:230:20:230:27 | access to local variable nonSink7 | | LocalDataFlow.cs:210:13:210:31 | SSA def(sink23) | LocalDataFlow.cs:211:15:211:20 | access to local variable sink23 | | LocalDataFlow.cs:210:22:210:31 | access to indexer | LocalDataFlow.cs:210:13:210:31 | SSA def(sink23) | +| LocalDataFlow.cs:211:15:211:20 | [post] access to local variable sink23 | LocalDataFlow.cs:234:37:234:42 | access to local variable sink23 | | LocalDataFlow.cs:211:15:211:20 | access to local variable sink23 | LocalDataFlow.cs:234:37:234:42 | access to local variable sink23 | | LocalDataFlow.cs:214:9:214:31 | SSA def(nonSink0) | LocalDataFlow.cs:215:15:215:22 | access to local variable nonSink0 | +| LocalDataFlow.cs:214:20:214:27 | [post] access to local variable nonSink1 | LocalDataFlow.cs:328:9:328:16 | access to local variable nonSink1 | | LocalDataFlow.cs:214:20:214:27 | access to local variable nonSink1 | LocalDataFlow.cs:328:9:328:16 | access to local variable nonSink1 | | LocalDataFlow.cs:214:20:214:31 | access to indexer | LocalDataFlow.cs:214:9:214:31 | SSA def(nonSink0) | +| LocalDataFlow.cs:215:15:215:22 | [post] access to local variable nonSink0 | LocalDataFlow.cs:246:39:246:46 | access to local variable nonSink0 | | LocalDataFlow.cs:215:15:215:22 | access to local variable nonSink0 | LocalDataFlow.cs:246:39:246:46 | access to local variable nonSink0 | | LocalDataFlow.cs:218:13:218:30 | SSA def(sink24) | LocalDataFlow.cs:219:15:219:20 | access to local variable sink24 | | LocalDataFlow.cs:218:22:218:27 | access to local variable sink10 | LocalDataFlow.cs:363:32:363:37 | access to local variable sink10 | @@ -228,83 +281,109 @@ | LocalDataFlow.cs:230:20:230:36 | ... \|\| ... | LocalDataFlow.cs:230:9:230:36 | SSA def(nonSink7) | | LocalDataFlow.cs:234:13:234:43 | SSA def(sink26) | LocalDataFlow.cs:235:15:235:20 | access to local variable sink26 | | LocalDataFlow.cs:234:22:234:43 | object creation of type Uri | LocalDataFlow.cs:234:13:234:43 | SSA def(sink26) | +| LocalDataFlow.cs:235:15:235:20 | [post] access to local variable sink26 | LocalDataFlow.cs:236:22:236:27 | access to local variable sink26 | | LocalDataFlow.cs:235:15:235:20 | access to local variable sink26 | LocalDataFlow.cs:236:22:236:27 | access to local variable sink26 | | LocalDataFlow.cs:236:13:236:38 | SSA def(sink27) | LocalDataFlow.cs:237:15:237:20 | access to local variable sink27 | +| LocalDataFlow.cs:236:22:236:27 | [post] access to local variable sink26 | LocalDataFlow.cs:238:22:238:27 | access to local variable sink26 | | LocalDataFlow.cs:236:22:236:27 | access to local variable sink26 | LocalDataFlow.cs:238:22:238:27 | access to local variable sink26 | | LocalDataFlow.cs:236:22:236:38 | call to method ToString | LocalDataFlow.cs:236:13:236:38 | SSA def(sink27) | | LocalDataFlow.cs:238:13:238:40 | SSA def(sink28) | LocalDataFlow.cs:239:15:239:20 | access to local variable sink28 | +| LocalDataFlow.cs:238:22:238:27 | [post] access to local variable sink26 | LocalDataFlow.cs:240:22:240:27 | access to local variable sink26 | | LocalDataFlow.cs:238:22:238:27 | access to local variable sink26 | LocalDataFlow.cs:240:22:240:27 | access to local variable sink26 | | LocalDataFlow.cs:238:22:238:40 | access to property PathAndQuery | LocalDataFlow.cs:238:13:238:40 | SSA def(sink28) | | LocalDataFlow.cs:240:13:240:33 | SSA def(sink29) | LocalDataFlow.cs:241:15:241:20 | access to local variable sink29 | +| LocalDataFlow.cs:240:22:240:27 | [post] access to local variable sink26 | LocalDataFlow.cs:242:22:242:27 | access to local variable sink26 | | LocalDataFlow.cs:240:22:240:27 | access to local variable sink26 | LocalDataFlow.cs:242:22:242:27 | access to local variable sink26 | | LocalDataFlow.cs:240:22:240:33 | access to property Query | LocalDataFlow.cs:240:13:240:33 | SSA def(sink29) | | LocalDataFlow.cs:242:13:242:42 | SSA def(sink30) | LocalDataFlow.cs:243:15:243:20 | access to local variable sink30 | | LocalDataFlow.cs:242:22:242:42 | access to property OriginalString | LocalDataFlow.cs:242:13:242:42 | SSA def(sink30) | +| LocalDataFlow.cs:243:15:243:20 | [post] access to local variable sink30 | LocalDataFlow.cs:258:49:258:54 | access to local variable sink30 | | LocalDataFlow.cs:243:15:243:20 | access to local variable sink30 | LocalDataFlow.cs:258:49:258:54 | access to local variable sink30 | | LocalDataFlow.cs:246:13:246:47 | SSA def(nonSink8) | LocalDataFlow.cs:247:15:247:22 | access to local variable nonSink8 | | LocalDataFlow.cs:246:24:246:47 | object creation of type Uri | LocalDataFlow.cs:246:13:246:47 | SSA def(nonSink8) | +| LocalDataFlow.cs:247:15:247:22 | [post] access to local variable nonSink8 | LocalDataFlow.cs:248:20:248:27 | access to local variable nonSink8 | | LocalDataFlow.cs:247:15:247:22 | access to local variable nonSink8 | LocalDataFlow.cs:248:20:248:27 | access to local variable nonSink8 | | LocalDataFlow.cs:248:9:248:38 | SSA def(nonSink0) | LocalDataFlow.cs:249:15:249:22 | access to local variable nonSink0 | +| LocalDataFlow.cs:248:20:248:27 | [post] access to local variable nonSink8 | LocalDataFlow.cs:250:20:250:27 | access to local variable nonSink8 | | LocalDataFlow.cs:248:20:248:27 | access to local variable nonSink8 | LocalDataFlow.cs:250:20:250:27 | access to local variable nonSink8 | | LocalDataFlow.cs:248:20:248:38 | call to method ToString | LocalDataFlow.cs:248:9:248:38 | SSA def(nonSink0) | | LocalDataFlow.cs:250:9:250:40 | SSA def(nonSink0) | LocalDataFlow.cs:251:15:251:22 | access to local variable nonSink0 | +| LocalDataFlow.cs:250:20:250:27 | [post] access to local variable nonSink8 | LocalDataFlow.cs:252:20:252:27 | access to local variable nonSink8 | | LocalDataFlow.cs:250:20:250:27 | access to local variable nonSink8 | LocalDataFlow.cs:252:20:252:27 | access to local variable nonSink8 | | LocalDataFlow.cs:250:20:250:40 | access to property PathAndQuery | LocalDataFlow.cs:250:9:250:40 | SSA def(nonSink0) | | LocalDataFlow.cs:252:9:252:33 | SSA def(nonSink0) | LocalDataFlow.cs:253:15:253:22 | access to local variable nonSink0 | +| LocalDataFlow.cs:252:20:252:27 | [post] access to local variable nonSink8 | LocalDataFlow.cs:254:20:254:27 | access to local variable nonSink8 | | LocalDataFlow.cs:252:20:252:27 | access to local variable nonSink8 | LocalDataFlow.cs:254:20:254:27 | access to local variable nonSink8 | | LocalDataFlow.cs:252:20:252:33 | access to property Query | LocalDataFlow.cs:252:9:252:33 | SSA def(nonSink0) | | LocalDataFlow.cs:254:9:254:42 | SSA def(nonSink0) | LocalDataFlow.cs:255:15:255:22 | access to local variable nonSink0 | | LocalDataFlow.cs:254:20:254:42 | access to property OriginalString | LocalDataFlow.cs:254:9:254:42 | SSA def(nonSink0) | +| LocalDataFlow.cs:255:15:255:22 | [post] access to local variable nonSink0 | LocalDataFlow.cs:264:51:264:58 | access to local variable nonSink0 | | LocalDataFlow.cs:255:15:255:22 | access to local variable nonSink0 | LocalDataFlow.cs:264:51:264:58 | access to local variable nonSink0 | | LocalDataFlow.cs:258:13:258:55 | SSA def(sink31) | LocalDataFlow.cs:259:15:259:20 | access to local variable sink31 | | LocalDataFlow.cs:258:22:258:55 | object creation of type StringReader | LocalDataFlow.cs:258:13:258:55 | SSA def(sink31) | +| LocalDataFlow.cs:259:15:259:20 | [post] access to local variable sink31 | LocalDataFlow.cs:260:22:260:27 | access to local variable sink31 | | LocalDataFlow.cs:259:15:259:20 | access to local variable sink31 | LocalDataFlow.cs:260:22:260:27 | access to local variable sink31 | | LocalDataFlow.cs:260:13:260:39 | SSA def(sink32) | LocalDataFlow.cs:261:15:261:20 | access to local variable sink32 | | LocalDataFlow.cs:260:22:260:39 | call to method ReadToEnd | LocalDataFlow.cs:260:13:260:39 | SSA def(sink32) | +| LocalDataFlow.cs:261:15:261:20 | [post] access to local variable sink32 | LocalDataFlow.cs:270:30:270:35 | access to local variable sink32 | | LocalDataFlow.cs:261:15:261:20 | access to local variable sink32 | LocalDataFlow.cs:270:30:270:35 | access to local variable sink32 | | LocalDataFlow.cs:264:13:264:59 | SSA def(nonSink9) | LocalDataFlow.cs:265:15:265:22 | access to local variable nonSink9 | | LocalDataFlow.cs:264:24:264:59 | object creation of type StringReader | LocalDataFlow.cs:264:13:264:59 | SSA def(nonSink9) | +| LocalDataFlow.cs:265:15:265:22 | [post] access to local variable nonSink9 | LocalDataFlow.cs:266:20:266:27 | access to local variable nonSink9 | | LocalDataFlow.cs:265:15:265:22 | access to local variable nonSink9 | LocalDataFlow.cs:266:20:266:27 | access to local variable nonSink9 | | LocalDataFlow.cs:266:9:266:39 | SSA def(nonSink0) | LocalDataFlow.cs:267:15:267:22 | access to local variable nonSink0 | | LocalDataFlow.cs:266:20:266:39 | call to method ReadToEnd | LocalDataFlow.cs:266:9:266:39 | SSA def(nonSink0) | +| LocalDataFlow.cs:267:15:267:22 | [post] access to local variable nonSink0 | LocalDataFlow.cs:276:28:276:35 | access to local variable nonSink0 | | LocalDataFlow.cs:267:15:267:22 | access to local variable nonSink0 | LocalDataFlow.cs:276:28:276:35 | access to local variable nonSink0 | | LocalDataFlow.cs:270:13:270:127 | SSA def(sink33) | LocalDataFlow.cs:271:15:271:20 | access to local variable sink33 | | LocalDataFlow.cs:270:22:270:127 | (...) ... | LocalDataFlow.cs:270:13:270:127 | SSA def(sink33) | | LocalDataFlow.cs:270:30:270:119 | call to method Insert | LocalDataFlow.cs:270:30:270:127 | call to method Clone | | LocalDataFlow.cs:270:30:270:127 | call to method Clone | LocalDataFlow.cs:270:22:270:127 | (...) ... | +| LocalDataFlow.cs:271:15:271:20 | [post] access to local variable sink33 | LocalDataFlow.cs:272:22:272:27 | access to local variable sink33 | | LocalDataFlow.cs:271:15:271:20 | access to local variable sink33 | LocalDataFlow.cs:272:22:272:27 | access to local variable sink33 | | LocalDataFlow.cs:272:13:272:63 | SSA def(sink48) | LocalDataFlow.cs:273:15:273:20 | access to local variable sink48 | +| LocalDataFlow.cs:272:22:272:27 | [post] access to local variable sink33 | LocalDataFlow.cs:282:40:282:45 | access to local variable sink33 | | LocalDataFlow.cs:272:22:272:27 | access to local variable sink33 | LocalDataFlow.cs:282:40:282:45 | access to local variable sink33 | | LocalDataFlow.cs:272:22:272:63 | call to method Split | LocalDataFlow.cs:272:13:272:63 | SSA def(sink48) | | LocalDataFlow.cs:276:9:276:127 | SSA def(nonSink0) | LocalDataFlow.cs:277:15:277:22 | access to local variable nonSink0 | | LocalDataFlow.cs:276:20:276:127 | (...) ... | LocalDataFlow.cs:276:9:276:127 | SSA def(nonSink0) | | LocalDataFlow.cs:276:28:276:119 | call to method Insert | LocalDataFlow.cs:276:28:276:127 | call to method Clone | | LocalDataFlow.cs:276:28:276:127 | call to method Clone | LocalDataFlow.cs:276:20:276:127 | (...) ... | +| LocalDataFlow.cs:277:15:277:22 | [post] access to local variable nonSink0 | LocalDataFlow.cs:278:25:278:32 | access to local variable nonSink0 | | LocalDataFlow.cs:277:15:277:22 | access to local variable nonSink0 | LocalDataFlow.cs:278:25:278:32 | access to local variable nonSink0 | | LocalDataFlow.cs:278:13:278:68 | SSA def(nonSink15) | LocalDataFlow.cs:279:15:279:23 | access to local variable nonSink15 | +| LocalDataFlow.cs:278:25:278:32 | [post] access to local variable nonSink0 | LocalDataFlow.cs:291:43:291:50 | access to local variable nonSink0 | | LocalDataFlow.cs:278:25:278:32 | access to local variable nonSink0 | LocalDataFlow.cs:291:43:291:50 | access to local variable nonSink0 | | LocalDataFlow.cs:278:25:278:68 | call to method Split | LocalDataFlow.cs:278:13:278:68 | SSA def(nonSink15) | | LocalDataFlow.cs:282:13:282:46 | SSA def(sink34) | LocalDataFlow.cs:283:15:283:20 | access to local variable sink34 | | LocalDataFlow.cs:282:22:282:46 | object creation of type StringBuilder | LocalDataFlow.cs:282:13:282:46 | SSA def(sink34) | +| LocalDataFlow.cs:283:15:283:20 | [post] access to local variable sink34 | LocalDataFlow.cs:284:22:284:27 | access to local variable sink34 | | LocalDataFlow.cs:283:15:283:20 | access to local variable sink34 | LocalDataFlow.cs:284:22:284:27 | access to local variable sink34 | | LocalDataFlow.cs:284:13:284:38 | SSA def(sink35) | LocalDataFlow.cs:285:15:285:20 | access to local variable sink35 | | LocalDataFlow.cs:284:22:284:38 | call to method ToString | LocalDataFlow.cs:284:13:284:38 | SSA def(sink35) | +| LocalDataFlow.cs:285:15:285:20 | [post] access to local variable sink35 | LocalDataFlow.cs:287:27:287:32 | access to local variable sink35 | | LocalDataFlow.cs:285:15:285:20 | access to local variable sink35 | LocalDataFlow.cs:287:27:287:32 | access to local variable sink35 | | LocalDataFlow.cs:286:13:286:42 | SSA def(sink36) | LocalDataFlow.cs:287:9:287:14 | access to local variable sink36 | | LocalDataFlow.cs:286:22:286:42 | object creation of type StringBuilder | LocalDataFlow.cs:286:13:286:42 | SSA def(sink36) | +| LocalDataFlow.cs:287:9:287:14 | [post] access to local variable sink36 | LocalDataFlow.cs:288:15:288:20 | access to local variable sink36 | | LocalDataFlow.cs:287:9:287:14 | access to local variable sink36 | LocalDataFlow.cs:288:15:288:20 | access to local variable sink36 | | LocalDataFlow.cs:291:13:291:51 | SSA def(nonSink10) | LocalDataFlow.cs:292:15:292:23 | access to local variable nonSink10 | | LocalDataFlow.cs:291:25:291:51 | object creation of type StringBuilder | LocalDataFlow.cs:291:13:291:51 | SSA def(nonSink10) | +| LocalDataFlow.cs:292:15:292:23 | [post] access to local variable nonSink10 | LocalDataFlow.cs:293:20:293:28 | access to local variable nonSink10 | | LocalDataFlow.cs:292:15:292:23 | access to local variable nonSink10 | LocalDataFlow.cs:293:20:293:28 | access to local variable nonSink10 | | LocalDataFlow.cs:293:9:293:39 | SSA def(nonSink0) | LocalDataFlow.cs:294:15:294:22 | access to local variable nonSink0 | +| LocalDataFlow.cs:293:20:293:28 | [post] access to local variable nonSink10 | LocalDataFlow.cs:295:9:295:17 | access to local variable nonSink10 | | LocalDataFlow.cs:293:20:293:28 | access to local variable nonSink10 | LocalDataFlow.cs:295:9:295:17 | access to local variable nonSink10 | | LocalDataFlow.cs:293:20:293:39 | call to method ToString | LocalDataFlow.cs:293:9:293:39 | SSA def(nonSink0) | +| LocalDataFlow.cs:294:15:294:22 | [post] access to local variable nonSink0 | LocalDataFlow.cs:295:30:295:37 | access to local variable nonSink0 | | LocalDataFlow.cs:294:15:294:22 | access to local variable nonSink0 | LocalDataFlow.cs:295:30:295:37 | access to local variable nonSink0 | +| LocalDataFlow.cs:295:9:295:17 | [post] access to local variable nonSink10 | LocalDataFlow.cs:296:15:296:23 | access to local variable nonSink10 | | LocalDataFlow.cs:295:9:295:17 | access to local variable nonSink10 | LocalDataFlow.cs:296:15:296:23 | access to local variable nonSink10 | | LocalDataFlow.cs:299:13:299:52 | SSA def(sink40) | LocalDataFlow.cs:300:15:300:20 | access to local variable sink40 | | LocalDataFlow.cs:299:22:299:52 | object creation of type Lazy | LocalDataFlow.cs:299:13:299:52 | SSA def(sink40) | | LocalDataFlow.cs:299:39:299:51 | [output] delegate creation of type Func | LocalDataFlow.cs:299:22:299:52 | object creation of type Lazy | | LocalDataFlow.cs:299:39:299:51 | this access | LocalDataFlow.cs:309:42:309:57 | this access | +| LocalDataFlow.cs:300:15:300:20 | [post] access to local variable sink40 | LocalDataFlow.cs:301:22:301:27 | access to local variable sink40 | | LocalDataFlow.cs:300:15:300:20 | access to local variable sink40 | LocalDataFlow.cs:301:22:301:27 | access to local variable sink40 | | LocalDataFlow.cs:301:13:301:33 | SSA def(sink41) | LocalDataFlow.cs:302:15:302:20 | access to local variable sink41 | | LocalDataFlow.cs:301:22:301:27 | access to local variable sink40 | LocalDataFlow.cs:301:22:301:33 | access to property Value | @@ -312,6 +391,7 @@ | LocalDataFlow.cs:303:13:303:59 | SSA def(sink42) | LocalDataFlow.cs:304:15:304:20 | access to local variable sink42 | | LocalDataFlow.cs:303:22:303:59 | object creation of type Lazy | LocalDataFlow.cs:303:13:303:59 | SSA def(sink42) | | LocalDataFlow.cs:303:39:303:58 | [output] (...) => ... | LocalDataFlow.cs:303:22:303:59 | object creation of type Lazy | +| LocalDataFlow.cs:304:15:304:20 | [post] access to local variable sink42 | LocalDataFlow.cs:305:22:305:27 | access to local variable sink42 | | LocalDataFlow.cs:304:15:304:20 | access to local variable sink42 | LocalDataFlow.cs:305:22:305:27 | access to local variable sink42 | | LocalDataFlow.cs:305:13:305:33 | SSA def(sink43) | LocalDataFlow.cs:306:15:306:20 | access to local variable sink43 | | LocalDataFlow.cs:305:22:305:27 | access to local variable sink42 | LocalDataFlow.cs:305:22:305:33 | access to property Value | @@ -319,6 +399,7 @@ | LocalDataFlow.cs:309:13:309:58 | SSA def(nonSink12) | LocalDataFlow.cs:310:15:310:23 | access to local variable nonSink12 | | LocalDataFlow.cs:309:25:309:58 | object creation of type Lazy | LocalDataFlow.cs:309:13:309:58 | SSA def(nonSink12) | | LocalDataFlow.cs:309:42:309:57 | [output] delegate creation of type Func | LocalDataFlow.cs:309:25:309:58 | object creation of type Lazy | +| LocalDataFlow.cs:310:15:310:23 | [post] access to local variable nonSink12 | LocalDataFlow.cs:311:20:311:28 | access to local variable nonSink12 | | LocalDataFlow.cs:310:15:310:23 | access to local variable nonSink12 | LocalDataFlow.cs:311:20:311:28 | access to local variable nonSink12 | | LocalDataFlow.cs:311:9:311:34 | SSA def(nonSink0) | LocalDataFlow.cs:312:15:312:22 | access to local variable nonSink0 | | LocalDataFlow.cs:311:20:311:28 | access to local variable nonSink12 | LocalDataFlow.cs:311:20:311:34 | access to property Value | @@ -326,29 +407,42 @@ | LocalDataFlow.cs:313:9:313:46 | SSA def(nonSink12) | LocalDataFlow.cs:314:15:314:23 | access to local variable nonSink12 | | LocalDataFlow.cs:313:21:313:46 | object creation of type Lazy | LocalDataFlow.cs:313:9:313:46 | SSA def(nonSink12) | | LocalDataFlow.cs:313:38:313:45 | [output] (...) => ... | LocalDataFlow.cs:313:21:313:46 | object creation of type Lazy | +| LocalDataFlow.cs:314:15:314:23 | [post] access to local variable nonSink12 | LocalDataFlow.cs:315:20:315:28 | access to local variable nonSink12 | | LocalDataFlow.cs:314:15:314:23 | access to local variable nonSink12 | LocalDataFlow.cs:315:20:315:28 | access to local variable nonSink12 | | LocalDataFlow.cs:315:9:315:34 | SSA def(nonSink0) | LocalDataFlow.cs:316:15:316:22 | access to local variable nonSink0 | | LocalDataFlow.cs:315:20:315:28 | access to local variable nonSink12 | LocalDataFlow.cs:315:20:315:34 | access to property Value | | LocalDataFlow.cs:315:20:315:34 | access to property Value | LocalDataFlow.cs:315:9:315:34 | SSA def(nonSink0) | +| LocalDataFlow.cs:316:15:316:22 | [post] access to local variable nonSink0 | LocalDataFlow.cs:328:26:328:33 | access to local variable nonSink0 | | LocalDataFlow.cs:316:15:316:22 | access to local variable nonSink0 | LocalDataFlow.cs:328:26:328:33 | access to local variable nonSink0 | | LocalDataFlow.cs:319:13:319:49 | SSA def(sink3) | LocalDataFlow.cs:320:9:320:13 | access to local variable sink3 | | LocalDataFlow.cs:319:21:319:49 | object creation of type Dictionary | LocalDataFlow.cs:319:13:319:49 | SSA def(sink3) | +| LocalDataFlow.cs:320:9:320:13 | [post] access to local variable sink3 | LocalDataFlow.cs:321:15:321:19 | access to local variable sink3 | | LocalDataFlow.cs:320:9:320:13 | access to local variable sink3 | LocalDataFlow.cs:321:15:321:19 | access to local variable sink3 | +| LocalDataFlow.cs:320:22:320:26 | [post] access to local variable sink1 | LocalDataFlow.cs:329:22:329:26 | access to local variable sink1 | | LocalDataFlow.cs:320:22:320:26 | access to local variable sink1 | LocalDataFlow.cs:329:22:329:26 | access to local variable sink1 | +| LocalDataFlow.cs:321:15:321:19 | [post] access to local variable sink3 | LocalDataFlow.cs:322:22:322:26 | access to local variable sink3 | | LocalDataFlow.cs:321:15:321:19 | access to local variable sink3 | LocalDataFlow.cs:322:22:322:26 | access to local variable sink3 | | LocalDataFlow.cs:322:13:322:33 | SSA def(sink12) | LocalDataFlow.cs:323:15:323:20 | access to local variable sink12 | +| LocalDataFlow.cs:322:22:322:26 | [post] access to local variable sink3 | LocalDataFlow.cs:369:57:369:61 | access to local variable sink3 | | LocalDataFlow.cs:322:22:322:26 | access to local variable sink3 | LocalDataFlow.cs:369:57:369:61 | access to local variable sink3 | | LocalDataFlow.cs:322:22:322:33 | access to property Values | LocalDataFlow.cs:322:13:322:33 | SSA def(sink12) | +| LocalDataFlow.cs:323:15:323:20 | [post] access to local variable sink12 | LocalDataFlow.cs:324:22:324:27 | access to local variable sink12 | | LocalDataFlow.cs:323:15:323:20 | access to local variable sink12 | LocalDataFlow.cs:324:22:324:27 | access to local variable sink12 | | LocalDataFlow.cs:324:13:324:37 | SSA def(sink13) | LocalDataFlow.cs:325:15:325:20 | access to local variable sink13 | | LocalDataFlow.cs:324:22:324:37 | call to method Reverse | LocalDataFlow.cs:324:13:324:37 | SSA def(sink13) | +| LocalDataFlow.cs:328:9:328:16 | [post] access to local variable nonSink1 | LocalDataFlow.cs:329:9:329:16 | access to local variable nonSink1 | | LocalDataFlow.cs:328:9:328:16 | access to local variable nonSink1 | LocalDataFlow.cs:329:9:329:16 | access to local variable nonSink1 | +| LocalDataFlow.cs:329:9:329:16 | [post] access to local variable nonSink1 | LocalDataFlow.cs:330:15:330:22 | access to local variable nonSink1 | | LocalDataFlow.cs:329:9:329:16 | access to local variable nonSink1 | LocalDataFlow.cs:330:15:330:22 | access to local variable nonSink1 | +| LocalDataFlow.cs:329:22:329:26 | [post] access to local variable sink1 | LocalDataFlow.cs:403:30:403:34 | access to local variable sink1 | | LocalDataFlow.cs:329:22:329:26 | access to local variable sink1 | LocalDataFlow.cs:403:30:403:34 | access to local variable sink1 | +| LocalDataFlow.cs:330:15:330:22 | [post] access to local variable nonSink1 | LocalDataFlow.cs:331:24:331:31 | access to local variable nonSink1 | | LocalDataFlow.cs:330:15:330:22 | access to local variable nonSink1 | LocalDataFlow.cs:331:24:331:31 | access to local variable nonSink1 | | LocalDataFlow.cs:331:13:331:38 | SSA def(nonSink5) | LocalDataFlow.cs:332:15:332:22 | access to local variable nonSink5 | +| LocalDataFlow.cs:331:24:331:31 | [post] access to local variable nonSink1 | LocalDataFlow.cs:383:63:383:70 | access to local variable nonSink1 | | LocalDataFlow.cs:331:24:331:31 | access to local variable nonSink1 | LocalDataFlow.cs:383:63:383:70 | access to local variable nonSink1 | | LocalDataFlow.cs:331:24:331:38 | access to property Values | LocalDataFlow.cs:331:13:331:38 | SSA def(nonSink5) | +| LocalDataFlow.cs:332:15:332:22 | [post] access to local variable nonSink5 | LocalDataFlow.cs:333:24:333:31 | access to local variable nonSink5 | | LocalDataFlow.cs:332:15:332:22 | access to local variable nonSink5 | LocalDataFlow.cs:333:24:333:31 | access to local variable nonSink5 | | LocalDataFlow.cs:333:13:333:41 | SSA def(nonSink6) | LocalDataFlow.cs:334:15:334:22 | access to local variable nonSink6 | | LocalDataFlow.cs:333:24:333:41 | call to method Reverse | LocalDataFlow.cs:333:13:333:41 | SSA def(nonSink6) | @@ -356,10 +450,13 @@ | LocalDataFlow.cs:337:13:337:52 | SSA qualifier def(taintedDataContract.AList) | LocalDataFlow.cs:340:22:340:46 | access to property AList | | LocalDataFlow.cs:337:35:337:52 | object creation of type DataContract | LocalDataFlow.cs:337:13:337:52 | SSA def(taintedDataContract) | | LocalDataFlow.cs:338:13:338:48 | SSA def(sink53) | LocalDataFlow.cs:339:15:339:20 | access to local variable sink53 | +| LocalDataFlow.cs:338:22:338:40 | [post] access to local variable taintedDataContract | LocalDataFlow.cs:340:22:340:40 | access to local variable taintedDataContract | | LocalDataFlow.cs:338:22:338:40 | access to local variable taintedDataContract | LocalDataFlow.cs:340:22:340:40 | access to local variable taintedDataContract | | LocalDataFlow.cs:338:22:338:48 | access to property AString | LocalDataFlow.cs:338:13:338:48 | SSA def(sink53) | | LocalDataFlow.cs:340:13:340:57 | SSA def(sink54) | LocalDataFlow.cs:341:15:341:20 | access to local variable sink54 | +| LocalDataFlow.cs:340:22:340:40 | [post] access to local variable taintedDataContract | LocalDataFlow.cs:347:20:347:38 | access to local variable taintedDataContract | | LocalDataFlow.cs:340:22:340:40 | access to local variable taintedDataContract | LocalDataFlow.cs:347:20:347:38 | access to local variable taintedDataContract | +| LocalDataFlow.cs:340:22:340:46 | [post] access to property AList | LocalDataFlow.cs:349:20:349:44 | access to property AList | | LocalDataFlow.cs:340:22:340:46 | access to property AList | LocalDataFlow.cs:349:20:349:44 | access to property AList | | LocalDataFlow.cs:340:22:340:57 | access to property AString | LocalDataFlow.cs:340:13:340:57 | SSA def(sink54) | | LocalDataFlow.cs:344:13:344:55 | SSA def(nonTaintedDataContract) | LocalDataFlow.cs:345:20:345:41 | access to local variable nonTaintedDataContract | @@ -367,6 +464,7 @@ | LocalDataFlow.cs:345:9:345:49 | SSA def(nonSink0) | LocalDataFlow.cs:346:15:346:22 | access to local variable nonSink0 | | LocalDataFlow.cs:345:20:345:49 | access to property AString | LocalDataFlow.cs:345:9:345:49 | SSA def(nonSink0) | | LocalDataFlow.cs:347:9:347:44 | SSA def(nonSink2) | LocalDataFlow.cs:348:15:348:22 | access to local variable nonSink2 | +| LocalDataFlow.cs:347:20:347:38 | [post] access to local variable taintedDataContract | LocalDataFlow.cs:349:20:349:38 | access to local variable taintedDataContract | | LocalDataFlow.cs:347:20:347:38 | access to local variable taintedDataContract | LocalDataFlow.cs:349:20:349:38 | access to local variable taintedDataContract | | LocalDataFlow.cs:347:20:347:44 | access to property AnInt | LocalDataFlow.cs:347:9:347:44 | SSA def(nonSink2) | | LocalDataFlow.cs:349:9:349:53 | SSA def(nonSink2) | LocalDataFlow.cs:350:15:350:22 | access to local variable nonSink2 | @@ -383,6 +481,7 @@ | LocalDataFlow.cs:363:32:363:37 | access to local variable sink10 | LocalDataFlow.cs:365:30:365:35 | access to local variable sink10 | | LocalDataFlow.cs:365:21:365:51 | SSA def(sink62) | LocalDataFlow.cs:366:15:366:20 | access to local variable sink62 | | LocalDataFlow.cs:365:30:365:51 | call to method GetEnumerator | LocalDataFlow.cs:365:21:365:51 | SSA def(sink62) | +| LocalDataFlow.cs:366:15:366:20 | [post] access to local variable sink62 | LocalDataFlow.cs:367:22:367:27 | access to local variable sink62 | | LocalDataFlow.cs:366:15:366:20 | access to local variable sink62 | LocalDataFlow.cs:367:22:367:27 | access to local variable sink62 | | LocalDataFlow.cs:367:13:367:35 | SSA def(sink63) | LocalDataFlow.cs:368:15:368:20 | access to local variable sink63 | | LocalDataFlow.cs:367:22:367:27 | access to local variable sink62 | LocalDataFlow.cs:367:22:367:35 | access to property Current | @@ -390,6 +489,7 @@ | LocalDataFlow.cs:369:48:369:77 | SSA def(sink64) | LocalDataFlow.cs:370:15:370:20 | access to local variable sink64 | | LocalDataFlow.cs:369:57:369:77 | (...) ... | LocalDataFlow.cs:369:48:369:77 | SSA def(sink64) | | LocalDataFlow.cs:369:57:369:77 | call to method GetEnumerator | LocalDataFlow.cs:369:57:369:77 | (...) ... | +| LocalDataFlow.cs:370:15:370:20 | [post] access to local variable sink64 | LocalDataFlow.cs:371:22:371:27 | access to local variable sink64 | | LocalDataFlow.cs:370:15:370:20 | access to local variable sink64 | LocalDataFlow.cs:371:22:371:27 | access to local variable sink64 | | LocalDataFlow.cs:371:13:371:35 | SSA def(sink65) | LocalDataFlow.cs:372:15:372:20 | access to local variable sink65 | | LocalDataFlow.cs:371:22:371:27 | access to local variable sink64 | LocalDataFlow.cs:371:22:371:35 | access to property Current | @@ -402,6 +502,7 @@ | LocalDataFlow.cs:377:35:377:42 | access to local variable nonSink4 | LocalDataFlow.cs:379:33:379:40 | access to local variable nonSink4 | | LocalDataFlow.cs:379:21:379:56 | SSA def(nonSink18) | LocalDataFlow.cs:380:15:380:23 | access to local variable nonSink18 | | LocalDataFlow.cs:379:33:379:56 | call to method GetEnumerator | LocalDataFlow.cs:379:21:379:56 | SSA def(nonSink18) | +| LocalDataFlow.cs:380:15:380:23 | [post] access to local variable nonSink18 | LocalDataFlow.cs:381:20:381:28 | access to local variable nonSink18 | | LocalDataFlow.cs:380:15:380:23 | access to local variable nonSink18 | LocalDataFlow.cs:381:20:381:28 | access to local variable nonSink18 | | LocalDataFlow.cs:381:9:381:36 | SSA def(nonSink3) | LocalDataFlow.cs:382:15:382:22 | access to local variable nonSink3 | | LocalDataFlow.cs:381:20:381:28 | access to local variable nonSink18 | LocalDataFlow.cs:381:20:381:36 | access to property Current | @@ -409,6 +510,7 @@ | LocalDataFlow.cs:383:51:383:86 | SSA def(nonSink19) | LocalDataFlow.cs:384:15:384:23 | access to local variable nonSink19 | | LocalDataFlow.cs:383:63:383:86 | (...) ... | LocalDataFlow.cs:383:51:383:86 | SSA def(nonSink19) | | LocalDataFlow.cs:383:63:383:86 | call to method GetEnumerator | LocalDataFlow.cs:383:63:383:86 | (...) ... | +| LocalDataFlow.cs:384:15:384:23 | [post] access to local variable nonSink19 | LocalDataFlow.cs:385:25:385:33 | access to local variable nonSink19 | | LocalDataFlow.cs:384:15:384:23 | access to local variable nonSink19 | LocalDataFlow.cs:385:25:385:33 | access to local variable nonSink19 | | LocalDataFlow.cs:385:13:385:41 | SSA def(nonSink20) | LocalDataFlow.cs:386:15:386:23 | access to local variable nonSink20 | | LocalDataFlow.cs:385:25:385:33 | access to local variable nonSink19 | LocalDataFlow.cs:385:25:385:41 | access to property Current | @@ -420,6 +522,7 @@ | LocalDataFlow.cs:391:13:391:51 | SSA def(sink67) | LocalDataFlow.cs:392:15:392:20 | access to local variable sink67 | | LocalDataFlow.cs:391:22:391:51 | call to method Run | LocalDataFlow.cs:391:13:391:51 | SSA def(sink67) | | LocalDataFlow.cs:391:31:391:50 | [output] (...) => ... | LocalDataFlow.cs:391:22:391:51 | call to method Run | +| LocalDataFlow.cs:392:15:392:20 | [post] access to local variable sink67 | LocalDataFlow.cs:393:28:393:33 | access to local variable sink67 | | LocalDataFlow.cs:392:15:392:20 | access to local variable sink67 | LocalDataFlow.cs:393:28:393:33 | access to local variable sink67 | | LocalDataFlow.cs:393:13:393:33 | SSA def(sink68) | LocalDataFlow.cs:394:15:394:20 | access to local variable sink68 | | LocalDataFlow.cs:393:22:393:33 | await ... | LocalDataFlow.cs:393:13:393:33 | SSA def(sink68) | @@ -427,23 +530,28 @@ | LocalDataFlow.cs:397:13:397:42 | SSA def(nonSink21) | LocalDataFlow.cs:398:15:398:23 | access to local variable nonSink21 | | LocalDataFlow.cs:397:25:397:42 | call to method Run | LocalDataFlow.cs:397:13:397:42 | SSA def(nonSink21) | | LocalDataFlow.cs:397:34:397:41 | [output] (...) => ... | LocalDataFlow.cs:397:25:397:42 | call to method Run | +| LocalDataFlow.cs:398:15:398:23 | [post] access to local variable nonSink21 | LocalDataFlow.cs:399:26:399:34 | access to local variable nonSink21 | | LocalDataFlow.cs:398:15:398:23 | access to local variable nonSink21 | LocalDataFlow.cs:399:26:399:34 | access to local variable nonSink21 | | LocalDataFlow.cs:399:9:399:34 | SSA def(nonSink0) | LocalDataFlow.cs:400:15:400:22 | access to local variable nonSink0 | | LocalDataFlow.cs:399:20:399:34 | await ... | LocalDataFlow.cs:399:9:399:34 | SSA def(nonSink0) | | LocalDataFlow.cs:399:26:399:34 | access to local variable nonSink21 | LocalDataFlow.cs:399:20:399:34 | await ... | +| LocalDataFlow.cs:400:15:400:22 | [post] access to local variable nonSink0 | LocalDataFlow.cs:407:28:407:35 | access to local variable nonSink0 | | LocalDataFlow.cs:400:15:400:22 | access to local variable nonSink0 | LocalDataFlow.cs:407:28:407:35 | access to local variable nonSink0 | | LocalDataFlow.cs:403:13:403:36 | SSA def(sink69) | LocalDataFlow.cs:404:15:404:20 | access to local variable sink69 | | LocalDataFlow.cs:403:22:403:36 | $"..." | LocalDataFlow.cs:403:13:403:36 | SSA def(sink69) | | LocalDataFlow.cs:407:9:407:37 | SSA def(nonSink0) | LocalDataFlow.cs:408:15:408:22 | access to local variable nonSink0 | | LocalDataFlow.cs:407:20:407:37 | $"..." | LocalDataFlow.cs:407:9:407:37 | SSA def(nonSink0) | +| LocalDataFlow.cs:408:15:408:22 | [post] access to local variable nonSink0 | LocalDataFlow.cs:415:31:415:38 | access to local variable nonSink0 | | LocalDataFlow.cs:408:15:408:22 | access to local variable nonSink0 | LocalDataFlow.cs:415:31:415:38 | access to local variable nonSink0 | | LocalDataFlow.cs:411:13:411:34 | SSA def(sink70) | LocalDataFlow.cs:412:15:412:20 | access to local variable sink70 | | LocalDataFlow.cs:411:22:411:34 | ... = ... | LocalDataFlow.cs:411:13:411:34 | SSA def(sink70) | | LocalDataFlow.cs:411:30:411:34 | access to local variable sink0 | LocalDataFlow.cs:411:22:411:34 | ... = ... | +| LocalDataFlow.cs:412:15:412:20 | [post] access to local variable sink70 | LocalDataFlow.cs:419:13:419:18 | access to local variable sink70 | | LocalDataFlow.cs:412:15:412:20 | access to local variable sink70 | LocalDataFlow.cs:419:13:419:18 | access to local variable sink70 | | LocalDataFlow.cs:415:9:415:38 | SSA def(nonSink0) | LocalDataFlow.cs:416:15:416:22 | access to local variable nonSink0 | | LocalDataFlow.cs:415:20:415:38 | ... = ... | LocalDataFlow.cs:415:9:415:38 | SSA def(nonSink0) | | LocalDataFlow.cs:415:31:415:38 | access to local variable nonSink0 | LocalDataFlow.cs:415:20:415:38 | ... = ... | +| LocalDataFlow.cs:416:15:416:22 | [post] access to local variable nonSink0 | LocalDataFlow.cs:423:13:423:20 | access to local variable nonSink0 | | LocalDataFlow.cs:416:15:416:22 | access to local variable nonSink0 | LocalDataFlow.cs:423:13:423:20 | access to local variable nonSink0 | | LocalDataFlow.cs:419:13:419:18 | access to local variable sink70 | LocalDataFlow.cs:419:23:419:35 | SSA def(sink71) | | LocalDataFlow.cs:419:13:419:18 | access to local variable sink70 | LocalDataFlow.cs:427:17:427:22 | access to local variable sink70 | @@ -467,20 +575,30 @@ | SSA.cs:8:13:8:30 | SSA def(ssaSink0) | SSA.cs:9:15:9:22 | access to local variable ssaSink0 | | SSA.cs:8:24:8:30 | access to parameter tainted | SSA.cs:8:13:8:30 | SSA def(ssaSink0) | | SSA.cs:8:24:8:30 | access to parameter tainted | SSA.cs:58:27:58:33 | access to parameter tainted | +| SSA.cs:9:15:9:22 | [post] access to local variable ssaSink0 | SSA.cs:16:13:16:20 | access to local variable ssaSink0 | | SSA.cs:9:15:9:22 | access to local variable ssaSink0 | SSA.cs:16:13:16:20 | access to local variable ssaSink0 | | SSA.cs:12:13:12:33 | SSA def(nonSink0) | SSA.cs:13:15:13:22 | access to local variable nonSink0 | | SSA.cs:12:24:12:33 | access to parameter nonTainted | SSA.cs:12:13:12:33 | SSA def(nonSink0) | | SSA.cs:12:24:12:33 | access to parameter nonTainted | SSA.cs:23:13:23:22 | access to parameter nonTainted | +| SSA.cs:13:15:13:22 | [post] access to local variable nonSink0 | SSA.cs:19:13:19:20 | access to local variable nonSink0 | | SSA.cs:13:15:13:22 | access to local variable nonSink0 | SSA.cs:19:13:19:20 | access to local variable nonSink0 | +| SSA.cs:16:13:16:20 | [post] access to local variable ssaSink0 | SSA.cs:24:24:24:31 | access to local variable ssaSink0 | +| SSA.cs:16:13:16:20 | [post] access to local variable ssaSink0 | SSA.cs:37:24:37:31 | access to local variable ssaSink0 | +| SSA.cs:16:13:16:20 | [post] access to local variable ssaSink0 | SSA.cs:91:24:91:31 | access to local variable ssaSink0 | +| SSA.cs:16:13:16:20 | [post] access to local variable ssaSink0 | SSA.cs:117:36:117:43 | access to local variable ssaSink0 | | SSA.cs:16:13:16:20 | access to local variable ssaSink0 | SSA.cs:24:24:24:31 | access to local variable ssaSink0 | | SSA.cs:16:13:16:20 | access to local variable ssaSink0 | SSA.cs:37:24:37:31 | access to local variable ssaSink0 | | SSA.cs:16:13:16:20 | access to local variable ssaSink0 | SSA.cs:91:24:91:31 | access to local variable ssaSink0 | | SSA.cs:16:13:16:20 | access to local variable ssaSink0 | SSA.cs:117:36:117:43 | access to local variable ssaSink0 | +| SSA.cs:19:13:19:20 | [post] access to local variable nonSink0 | SSA.cs:30:24:30:31 | access to local variable nonSink0 | +| SSA.cs:19:13:19:20 | [post] access to local variable nonSink0 | SSA.cs:49:24:49:31 | access to local variable nonSink0 | +| SSA.cs:19:13:19:20 | [post] access to local variable nonSink0 | SSA.cs:63:23:63:30 | access to local variable nonSink0 | | SSA.cs:19:13:19:20 | access to local variable nonSink0 | SSA.cs:30:24:30:31 | access to local variable nonSink0 | | SSA.cs:19:13:19:20 | access to local variable nonSink0 | SSA.cs:49:24:49:31 | access to local variable nonSink0 | | SSA.cs:19:13:19:20 | access to local variable nonSink0 | SSA.cs:63:23:63:30 | access to local variable nonSink0 | | SSA.cs:22:16:22:28 | SSA def(ssaSink1) | SSA.cs:25:9:25:24 | SSA phi(ssaSink1) | | SSA.cs:22:27:22:28 | "" | SSA.cs:22:16:22:28 | SSA def(ssaSink1) | +| SSA.cs:23:13:23:22 | [post] access to parameter nonTainted | SSA.cs:29:13:29:22 | access to parameter nonTainted | | SSA.cs:23:13:23:22 | access to parameter nonTainted | SSA.cs:29:13:29:22 | access to parameter nonTainted | | SSA.cs:24:13:24:31 | SSA def(ssaSink1) | SSA.cs:25:9:25:24 | SSA phi(ssaSink1) | | SSA.cs:24:24:24:31 | access to local variable ssaSink0 | SSA.cs:24:13:24:31 | SSA def(ssaSink1) | @@ -490,6 +608,7 @@ | SSA.cs:25:9:25:24 | SSA phi(ssaSink1) | SSA.cs:25:15:25:22 | access to local variable ssaSink1 | | SSA.cs:28:16:28:28 | SSA def(nonSink1) | SSA.cs:31:9:31:24 | SSA phi(nonSink1) | | SSA.cs:28:27:28:28 | "" | SSA.cs:28:16:28:28 | SSA def(nonSink1) | +| SSA.cs:29:13:29:22 | [post] access to parameter nonTainted | SSA.cs:35:13:35:22 | access to parameter nonTainted | | SSA.cs:29:13:29:22 | access to parameter nonTainted | SSA.cs:35:13:35:22 | access to parameter nonTainted | | SSA.cs:30:13:30:31 | SSA def(nonSink1) | SSA.cs:31:9:31:24 | SSA phi(nonSink1) | | SSA.cs:30:24:30:31 | access to local variable nonSink0 | SSA.cs:30:13:30:31 | SSA def(nonSink1) | @@ -498,6 +617,8 @@ | SSA.cs:31:9:31:24 | SSA phi(nonSink1) | SSA.cs:31:15:31:22 | access to local variable nonSink1 | | SSA.cs:34:16:34:28 | SSA def(ssaSink2) | SSA.cs:43:9:43:24 | SSA phi(ssaSink2) | | SSA.cs:34:27:34:28 | "" | SSA.cs:34:16:34:28 | SSA def(ssaSink2) | +| SSA.cs:35:13:35:22 | [post] access to parameter nonTainted | SSA.cs:38:17:38:26 | access to parameter nonTainted | +| SSA.cs:35:13:35:22 | [post] access to parameter nonTainted | SSA.cs:47:13:47:22 | access to parameter nonTainted | | SSA.cs:35:13:35:22 | access to parameter nonTainted | SSA.cs:38:17:38:26 | access to parameter nonTainted | | SSA.cs:35:13:35:22 | access to parameter nonTainted | SSA.cs:47:13:47:22 | access to parameter nonTainted | | SSA.cs:37:13:37:31 | SSA def(ssaSink2) | SSA.cs:39:21:39:28 | access to local variable ssaSink2 | @@ -505,18 +626,22 @@ | SSA.cs:37:24:37:31 | access to local variable ssaSink0 | SSA.cs:37:13:37:31 | SSA def(ssaSink2) | | SSA.cs:37:24:37:31 | access to local variable ssaSink0 | SSA.cs:91:24:91:31 | access to local variable ssaSink0 | | SSA.cs:37:24:37:31 | access to local variable ssaSink0 | SSA.cs:117:36:117:43 | access to local variable ssaSink0 | +| SSA.cs:38:17:38:26 | [post] access to parameter nonTainted | SSA.cs:47:13:47:22 | access to parameter nonTainted | | SSA.cs:38:17:38:26 | access to parameter nonTainted | SSA.cs:47:13:47:22 | access to parameter nonTainted | | SSA.cs:39:21:39:28 | access to local variable ssaSink2 | SSA.cs:43:9:43:24 | SSA phi(ssaSink2) | | SSA.cs:41:21:41:28 | access to local variable ssaSink2 | SSA.cs:43:9:43:24 | SSA phi(ssaSink2) | | SSA.cs:43:9:43:24 | SSA phi(ssaSink2) | SSA.cs:43:15:43:22 | access to local variable ssaSink2 | | SSA.cs:46:16:46:28 | SSA def(nonSink2) | SSA.cs:55:9:55:24 | SSA phi(nonSink2) | | SSA.cs:46:27:46:28 | "" | SSA.cs:46:16:46:28 | SSA def(nonSink2) | +| SSA.cs:47:13:47:22 | [post] access to parameter nonTainted | SSA.cs:50:17:50:26 | access to parameter nonTainted | +| SSA.cs:47:13:47:22 | [post] access to parameter nonTainted | SSA.cs:89:13:89:22 | access to parameter nonTainted | | SSA.cs:47:13:47:22 | access to parameter nonTainted | SSA.cs:50:17:50:26 | access to parameter nonTainted | | SSA.cs:47:13:47:22 | access to parameter nonTainted | SSA.cs:89:13:89:22 | access to parameter nonTainted | | SSA.cs:49:13:49:31 | SSA def(nonSink2) | SSA.cs:51:21:51:28 | access to local variable nonSink2 | | SSA.cs:49:13:49:31 | SSA def(nonSink2) | SSA.cs:53:21:53:28 | access to local variable nonSink2 | | SSA.cs:49:24:49:31 | access to local variable nonSink0 | SSA.cs:49:13:49:31 | SSA def(nonSink2) | | SSA.cs:49:24:49:31 | access to local variable nonSink0 | SSA.cs:63:23:63:30 | access to local variable nonSink0 | +| SSA.cs:50:17:50:26 | [post] access to parameter nonTainted | SSA.cs:89:13:89:22 | access to parameter nonTainted | | SSA.cs:50:17:50:26 | access to parameter nonTainted | SSA.cs:89:13:89:22 | access to parameter nonTainted | | SSA.cs:51:21:51:28 | access to local variable nonSink2 | SSA.cs:55:9:55:24 | SSA phi(nonSink2) | | SSA.cs:53:21:53:28 | access to local variable nonSink2 | SSA.cs:55:9:55:24 | SSA phi(nonSink2) | @@ -529,6 +654,7 @@ | SSA.cs:63:23:63:30 | SSA def(nonSink0) | SSA.cs:64:15:64:22 | access to local variable nonSink0 | | SSA.cs:63:23:63:30 | access to local variable nonSink0 | SSA.cs:63:23:63:30 | SSA def(nonSink0) | | SSA.cs:67:9:67:12 | this access | SSA.cs:68:23:68:26 | this access | +| SSA.cs:67:9:67:14 | [post] access to field S | SSA.cs:68:23:68:28 | access to field S | | SSA.cs:67:9:67:14 | access to field S | SSA.cs:68:23:68:28 | access to field S | | SSA.cs:67:9:67:38 | SSA def(this.S.SsaFieldSink0) | SSA.cs:68:23:68:28 | SSA qualifier def(this.S.SsaFieldSink0) | | SSA.cs:67:32:67:38 | access to parameter tainted | SSA.cs:67:9:67:38 | SSA def(this.S.SsaFieldSink0) | @@ -540,6 +666,7 @@ | SSA.cs:69:15:69:18 | this access | SSA.cs:72:9:72:12 | this access | | SSA.cs:69:15:69:20 | access to field S | SSA.cs:72:9:72:14 | access to field S | | SSA.cs:72:9:72:12 | this access | SSA.cs:73:23:73:26 | this access | +| SSA.cs:72:9:72:14 | [post] access to field S | SSA.cs:73:23:73:28 | access to field S | | SSA.cs:72:9:72:14 | access to field S | SSA.cs:73:23:73:28 | access to field S | | SSA.cs:72:9:72:36 | SSA def(this.S.SsaFieldNonSink0) | SSA.cs:73:23:73:28 | SSA qualifier def(this.S.SsaFieldNonSink0) | | SSA.cs:72:35:72:36 | "" | SSA.cs:72:9:72:36 | SSA def(this.S.SsaFieldNonSink0) | @@ -553,9 +680,12 @@ | SSA.cs:77:20:77:26 | access to parameter tainted | SSA.cs:77:9:77:26 | SSA def(nonSink0) | | SSA.cs:77:20:77:26 | access to parameter tainted | SSA.cs:80:35:80:41 | access to parameter tainted | | SSA.cs:78:21:78:28 | SSA def(nonSink0) | SSA.cs:79:15:79:22 | access to local variable nonSink0 | +| SSA.cs:79:15:79:22 | [post] access to local variable nonSink0 | SSA.cs:104:24:104:31 | access to local variable nonSink0 | +| SSA.cs:79:15:79:22 | [post] access to local variable nonSink0 | SSA.cs:130:39:130:46 | access to local variable nonSink0 | | SSA.cs:79:15:79:22 | access to local variable nonSink0 | SSA.cs:104:24:104:31 | access to local variable nonSink0 | | SSA.cs:79:15:79:22 | access to local variable nonSink0 | SSA.cs:130:39:130:46 | access to local variable nonSink0 | | SSA.cs:80:9:80:12 | this access | SSA.cs:81:21:81:24 | this access | +| SSA.cs:80:9:80:14 | [post] access to field S | SSA.cs:81:21:81:26 | access to field S | | SSA.cs:80:9:80:14 | access to field S | SSA.cs:81:21:81:26 | access to field S | | SSA.cs:80:35:80:41 | access to parameter tainted | SSA.cs:83:35:83:41 | access to parameter tainted | | SSA.cs:81:21:81:24 | this access | SSA.cs:82:15:82:18 | this access | @@ -567,17 +697,21 @@ | SSA.cs:83:35:83:41 | access to parameter tainted | SSA.cs:83:9:83:41 | SSA def(this.S.SsaFieldNonSink0) | | SSA.cs:84:9:84:14 | SSA call def(this.S) | SSA.cs:85:15:85:20 | access to field S | | SSA.cs:84:9:84:14 | SSA qualifier def(this.S.SsaFieldNonSink0) | SSA.cs:85:15:85:37 | access to field SsaFieldNonSink0 | +| SSA.cs:84:9:84:14 | [post] this access | SSA.cs:85:15:85:18 | this access | | SSA.cs:84:9:84:14 | this access | SSA.cs:85:15:85:18 | this access | | SSA.cs:85:15:85:18 | this access | SSA.cs:114:9:114:12 | this access | | SSA.cs:85:15:85:20 | access to field S | SSA.cs:114:9:114:14 | access to field S | | SSA.cs:88:16:88:28 | SSA def(ssaSink4) | SSA.cs:97:9:97:32 | SSA phi(ssaSink4) | | SSA.cs:88:27:88:28 | "" | SSA.cs:88:16:88:28 | SSA def(ssaSink4) | +| SSA.cs:89:13:89:22 | [post] access to parameter nonTainted | SSA.cs:92:17:92:26 | access to parameter nonTainted | +| SSA.cs:89:13:89:22 | [post] access to parameter nonTainted | SSA.cs:102:13:102:22 | access to parameter nonTainted | | SSA.cs:89:13:89:22 | access to parameter nonTainted | SSA.cs:92:17:92:26 | access to parameter nonTainted | | SSA.cs:89:13:89:22 | access to parameter nonTainted | SSA.cs:102:13:102:22 | access to parameter nonTainted | | SSA.cs:91:13:91:31 | SSA def(ssaSink4) | SSA.cs:93:21:93:28 | access to local variable ssaSink4 | | SSA.cs:91:13:91:31 | SSA def(ssaSink4) | SSA.cs:95:21:95:28 | access to local variable ssaSink4 | | SSA.cs:91:24:91:31 | access to local variable ssaSink0 | SSA.cs:91:13:91:31 | SSA def(ssaSink4) | | SSA.cs:91:24:91:31 | access to local variable ssaSink0 | SSA.cs:117:36:117:43 | access to local variable ssaSink0 | +| SSA.cs:92:17:92:26 | [post] access to parameter nonTainted | SSA.cs:102:13:102:22 | access to parameter nonTainted | | SSA.cs:92:17:92:26 | access to parameter nonTainted | SSA.cs:102:13:102:22 | access to parameter nonTainted | | SSA.cs:93:21:93:28 | access to local variable ssaSink4 | SSA.cs:97:9:97:32 | SSA phi(ssaSink4) | | SSA.cs:95:21:95:28 | access to local variable ssaSink4 | SSA.cs:97:9:97:32 | SSA phi(ssaSink4) | @@ -586,12 +720,15 @@ | SSA.cs:97:23:97:30 | access to local variable ssaSink4 | SSA.cs:97:23:97:30 | SSA def(ssaSink4) | | SSA.cs:101:16:101:28 | SSA def(nonSink3) | SSA.cs:110:9:110:32 | SSA phi(nonSink3) | | SSA.cs:101:27:101:28 | "" | SSA.cs:101:16:101:28 | SSA def(nonSink3) | +| SSA.cs:102:13:102:22 | [post] access to parameter nonTainted | SSA.cs:105:17:105:26 | access to parameter nonTainted | +| SSA.cs:102:13:102:22 | [post] access to parameter nonTainted | SSA.cs:115:13:115:22 | access to parameter nonTainted | | SSA.cs:102:13:102:22 | access to parameter nonTainted | SSA.cs:105:17:105:26 | access to parameter nonTainted | | SSA.cs:102:13:102:22 | access to parameter nonTainted | SSA.cs:115:13:115:22 | access to parameter nonTainted | | SSA.cs:104:13:104:31 | SSA def(nonSink3) | SSA.cs:106:21:106:28 | access to local variable nonSink3 | | SSA.cs:104:13:104:31 | SSA def(nonSink3) | SSA.cs:108:21:108:28 | access to local variable nonSink3 | | SSA.cs:104:24:104:31 | access to local variable nonSink0 | SSA.cs:104:13:104:31 | SSA def(nonSink3) | | SSA.cs:104:24:104:31 | access to local variable nonSink0 | SSA.cs:130:39:130:46 | access to local variable nonSink0 | +| SSA.cs:105:17:105:26 | [post] access to parameter nonTainted | SSA.cs:115:13:115:22 | access to parameter nonTainted | | SSA.cs:105:17:105:26 | access to parameter nonTainted | SSA.cs:115:13:115:22 | access to parameter nonTainted | | SSA.cs:106:21:106:28 | access to local variable nonSink3 | SSA.cs:110:9:110:32 | SSA phi(nonSink3) | | SSA.cs:108:21:108:28 | access to local variable nonSink3 | SSA.cs:110:9:110:32 | SSA phi(nonSink3) | @@ -600,19 +737,26 @@ | SSA.cs:110:23:110:30 | access to local variable nonSink3 | SSA.cs:110:23:110:30 | SSA def(nonSink3) | | SSA.cs:114:9:114:12 | this access | SSA.cs:117:13:117:16 | this access | | SSA.cs:114:9:114:12 | this access | SSA.cs:123:23:123:26 | this access | +| SSA.cs:114:9:114:14 | [post] access to field S | SSA.cs:117:13:117:18 | access to field S | +| SSA.cs:114:9:114:14 | [post] access to field S | SSA.cs:123:23:123:28 | access to field S | | SSA.cs:114:9:114:14 | access to field S | SSA.cs:117:13:117:18 | access to field S | | SSA.cs:114:9:114:14 | access to field S | SSA.cs:123:23:123:28 | access to field S | | SSA.cs:114:9:114:33 | SSA def(this.S.SsaFieldSink1) | SSA.cs:123:9:123:30 | SSA phi(this.S.SsaFieldSink1) | | SSA.cs:114:32:114:33 | "" | SSA.cs:114:9:114:33 | SSA def(this.S.SsaFieldSink1) | +| SSA.cs:115:13:115:22 | [post] access to parameter nonTainted | SSA.cs:118:17:118:26 | access to parameter nonTainted | +| SSA.cs:115:13:115:22 | [post] access to parameter nonTainted | SSA.cs:128:13:128:22 | access to parameter nonTainted | | SSA.cs:115:13:115:22 | access to parameter nonTainted | SSA.cs:118:17:118:26 | access to parameter nonTainted | | SSA.cs:115:13:115:22 | access to parameter nonTainted | SSA.cs:128:13:128:22 | access to parameter nonTainted | | SSA.cs:117:13:117:16 | this access | SSA.cs:119:21:119:24 | this access | | SSA.cs:117:13:117:16 | this access | SSA.cs:121:21:121:24 | this access | +| SSA.cs:117:13:117:18 | [post] access to field S | SSA.cs:119:21:119:26 | access to field S | +| SSA.cs:117:13:117:18 | [post] access to field S | SSA.cs:121:21:121:26 | access to field S | | SSA.cs:117:13:117:18 | access to field S | SSA.cs:119:21:119:26 | access to field S | | SSA.cs:117:13:117:18 | access to field S | SSA.cs:121:21:121:26 | access to field S | | SSA.cs:117:13:117:43 | SSA def(this.S.SsaFieldSink1) | SSA.cs:119:21:119:40 | access to field SsaFieldSink1 | | SSA.cs:117:13:117:43 | SSA def(this.S.SsaFieldSink1) | SSA.cs:121:21:121:40 | access to field SsaFieldSink1 | | SSA.cs:117:36:117:43 | access to local variable ssaSink0 | SSA.cs:117:13:117:43 | SSA def(this.S.SsaFieldSink1) | +| SSA.cs:118:17:118:26 | [post] access to parameter nonTainted | SSA.cs:128:13:128:22 | access to parameter nonTainted | | SSA.cs:118:17:118:26 | access to parameter nonTainted | SSA.cs:128:13:128:22 | access to parameter nonTainted | | SSA.cs:119:21:119:24 | this access | SSA.cs:123:23:123:26 | this access | | SSA.cs:119:21:119:26 | access to field S | SSA.cs:123:23:123:28 | access to field S | @@ -629,13 +773,18 @@ | SSA.cs:124:15:124:20 | access to field S | SSA.cs:127:9:127:14 | access to field S | | SSA.cs:127:9:127:12 | this access | SSA.cs:130:13:130:16 | this access | | SSA.cs:127:9:127:12 | this access | SSA.cs:136:23:136:26 | this access | +| SSA.cs:127:9:127:14 | [post] access to field S | SSA.cs:130:13:130:18 | access to field S | +| SSA.cs:127:9:127:14 | [post] access to field S | SSA.cs:136:23:136:28 | access to field S | | SSA.cs:127:9:127:14 | access to field S | SSA.cs:130:13:130:18 | access to field S | | SSA.cs:127:9:127:14 | access to field S | SSA.cs:136:23:136:28 | access to field S | | SSA.cs:127:9:127:36 | SSA def(this.S.SsaFieldNonSink0) | SSA.cs:136:9:136:30 | SSA phi(this.S.SsaFieldNonSink0) | | SSA.cs:127:35:127:36 | "" | SSA.cs:127:9:127:36 | SSA def(this.S.SsaFieldNonSink0) | +| SSA.cs:128:13:128:22 | [post] access to parameter nonTainted | SSA.cs:131:17:131:26 | access to parameter nonTainted | | SSA.cs:128:13:128:22 | access to parameter nonTainted | SSA.cs:131:17:131:26 | access to parameter nonTainted | | SSA.cs:130:13:130:16 | this access | SSA.cs:132:21:132:24 | this access | | SSA.cs:130:13:130:16 | this access | SSA.cs:134:21:134:24 | this access | +| SSA.cs:130:13:130:18 | [post] access to field S | SSA.cs:132:21:132:26 | access to field S | +| SSA.cs:130:13:130:18 | [post] access to field S | SSA.cs:134:21:134:26 | access to field S | | SSA.cs:130:13:130:18 | access to field S | SSA.cs:132:21:132:26 | access to field S | | SSA.cs:130:13:130:18 | access to field S | SSA.cs:134:21:134:26 | access to field S | | SSA.cs:130:13:130:46 | SSA def(this.S.SsaFieldNonSink0) | SSA.cs:132:21:132:43 | access to field SsaFieldNonSink0 | @@ -675,7 +824,9 @@ | SSA.cs:173:24:173:30 | access to parameter tainted | SSA.cs:173:13:173:30 | SSA def(ssaSink5) | | SSA.cs:174:20:174:20 | SSA phi(i) | SSA.cs:174:20:174:20 | access to parameter i | | SSA.cs:174:20:174:22 | SSA def(i) | SSA.cs:174:20:174:20 | SSA phi(i) | +| SSA.cs:176:21:176:28 | [post] access to local variable ssaSink5 | SSA.cs:177:21:177:28 | access to local variable ssaSink5 | | SSA.cs:176:21:176:28 | access to local variable ssaSink5 | SSA.cs:177:21:177:28 | access to local variable ssaSink5 | +| SSA.cs:177:21:177:28 | [post] access to local variable ssaSink5 | SSA.cs:176:21:176:28 | access to local variable ssaSink5 | | SSA.cs:177:21:177:28 | access to local variable ssaSink5 | SSA.cs:176:21:176:28 | access to local variable ssaSink5 | | SSA.cs:177:21:177:28 | access to local variable ssaSink5 | SSA.cs:180:9:180:24 | SSA phi(ssaSink5) | | SSA.cs:180:9:180:24 | SSA phi(ssaSink5) | SSA.cs:180:15:180:22 | access to local variable ssaSink5 | @@ -687,8 +838,10 @@ | Splitting.cs:6:13:6:13 | access to parameter b | Splitting.cs:13:13:13:13 | [b (line 3): false] access to parameter b | | Splitting.cs:6:13:6:13 | access to parameter b | Splitting.cs:13:13:13:13 | [b (line 3): true] access to parameter b | | Splitting.cs:8:19:8:19 | [b (line 3): true] access to local variable x | Splitting.cs:9:17:9:17 | [b (line 3): true] access to local variable x | +| Splitting.cs:8:19:8:19 | [post] [b (line 3): true] access to local variable x | Splitting.cs:9:17:9:17 | [b (line 3): true] access to local variable x | | Splitting.cs:9:17:9:17 | [b (line 3): true] access to local variable x | Splitting.cs:12:15:12:15 | [b (line 3): true] access to local variable x | | Splitting.cs:12:15:12:15 | [b (line 3): true] access to local variable x | Splitting.cs:14:19:14:19 | access to local variable x | +| Splitting.cs:12:15:12:15 | [post] [b (line 3): true] access to local variable x | Splitting.cs:14:19:14:19 | access to local variable x | | Splitting.cs:17:18:17:18 | b | Splitting.cs:20:13:20:13 | access to parameter b | | Splitting.cs:19:13:19:18 | SSA def(x) | Splitting.cs:22:19:22:19 | [b (line 17): true] access to local variable x | | Splitting.cs:19:13:19:18 | SSA def(x) | Splitting.cs:25:15:25:15 | [b (line 17): false] access to local variable x | @@ -699,6 +852,8 @@ | Splitting.cs:23:17:23:30 | [b (line 17): true] "taint source" | Splitting.cs:23:13:23:30 | [b (line 17): true] SSA def(x) | | Splitting.cs:25:15:25:15 | [b (line 17): false] access to local variable x | Splitting.cs:29:19:29:19 | access to local variable x | | Splitting.cs:25:15:25:15 | [b (line 17): true] access to local variable x | Splitting.cs:27:19:27:19 | access to local variable x | +| Splitting.cs:25:15:25:15 | [post] [b (line 17): false] access to local variable x | Splitting.cs:29:19:29:19 | access to local variable x | +| Splitting.cs:25:15:25:15 | [post] [b (line 17): true] access to local variable x | Splitting.cs:27:19:27:19 | access to local variable x | | Splitting.cs:32:18:32:18 | b | Splitting.cs:35:13:35:13 | access to parameter b | | Splitting.cs:35:13:35:13 | access to parameter b | Splitting.cs:39:15:39:15 | [b (line 32): false] access to parameter b | | Splitting.cs:35:13:35:13 | access to parameter b | Splitting.cs:39:15:39:15 | [b (line 32): true] access to parameter b | @@ -708,6 +863,8 @@ | Splitting.cs:37:13:37:15 | [b (line 32): true] "b" | Splitting.cs:37:9:37:15 | [b (line 32): true] SSA def(x) | | Splitting.cs:38:15:38:15 | [b (line 32): false] access to local variable x | Splitting.cs:40:23:40:23 | [b (line 32): false] access to local variable x | | Splitting.cs:38:15:38:15 | [b (line 32): true] access to local variable x | Splitting.cs:39:19:39:19 | [b (line 32): true] access to local variable x | +| Splitting.cs:38:15:38:15 | [post] [b (line 32): false] access to local variable x | Splitting.cs:40:23:40:23 | [b (line 32): false] access to local variable x | +| Splitting.cs:38:15:38:15 | [post] [b (line 32): true] access to local variable x | Splitting.cs:39:19:39:19 | [b (line 32): true] access to local variable x | | Splitting.cs:39:15:39:15 | [b (line 32): false] access to parameter b | Splitting.cs:42:13:42:13 | [b (line 32): false] access to parameter b | | Splitting.cs:39:15:39:15 | [b (line 32): true] access to parameter b | Splitting.cs:42:13:42:13 | [b (line 32): true] access to parameter b | | Splitting.cs:39:19:39:19 | [b (line 32): true] access to local variable x | Splitting.cs:39:15:39:25 | [b (line 32): true] ... ? ... : ... | diff --git a/csharp/ql/test/library-tests/dataflow/local/TaintTrackingStep.expected b/csharp/ql/test/library-tests/dataflow/local/TaintTrackingStep.expected index 095439122e9..b90192b138e 100644 --- a/csharp/ql/test/library-tests/dataflow/local/TaintTrackingStep.expected +++ b/csharp/ql/test/library-tests/dataflow/local/TaintTrackingStep.expected @@ -19,9 +19,11 @@ | LocalDataFlow.cs:49:30:49:30 | b | LocalDataFlow.cs:96:21:96:21 | access to parameter b | | LocalDataFlow.cs:52:13:52:34 | SSA def(sink0) | LocalDataFlow.cs:53:15:53:19 | access to local variable sink0 | | LocalDataFlow.cs:52:21:52:34 | "taint source" | LocalDataFlow.cs:52:13:52:34 | SSA def(sink0) | +| LocalDataFlow.cs:53:15:53:19 | [post] access to local variable sink0 | LocalDataFlow.cs:61:18:61:22 | access to local variable sink0 | | LocalDataFlow.cs:53:15:53:19 | access to local variable sink0 | LocalDataFlow.cs:61:18:61:22 | access to local variable sink0 | | LocalDataFlow.cs:56:13:56:25 | SSA def(nonSink0) | LocalDataFlow.cs:57:15:57:22 | access to local variable nonSink0 | | LocalDataFlow.cs:56:24:56:25 | "" | LocalDataFlow.cs:56:13:56:25 | SSA def(nonSink0) | +| LocalDataFlow.cs:57:15:57:22 | [post] access to local variable nonSink0 | LocalDataFlow.cs:65:9:65:16 | access to local variable nonSink0 | | LocalDataFlow.cs:57:15:57:22 | access to local variable nonSink0 | LocalDataFlow.cs:65:9:65:16 | access to local variable nonSink0 | | LocalDataFlow.cs:60:13:60:25 | SSA def(sink1) | LocalDataFlow.cs:61:9:61:13 | access to local variable sink1 | | LocalDataFlow.cs:60:21:60:25 | "abc" | LocalDataFlow.cs:60:13:60:25 | SSA def(sink1) | @@ -30,14 +32,17 @@ | LocalDataFlow.cs:61:9:61:22 | SSA def(sink1) | LocalDataFlow.cs:62:15:62:19 | access to local variable sink1 | | LocalDataFlow.cs:61:18:61:22 | access to local variable sink0 | LocalDataFlow.cs:61:9:61:22 | ... + ... | | LocalDataFlow.cs:61:18:61:22 | access to local variable sink0 | LocalDataFlow.cs:204:20:204:24 | access to local variable sink0 | +| LocalDataFlow.cs:62:15:62:19 | [post] access to local variable sink1 | LocalDataFlow.cs:70:23:70:27 | access to local variable sink1 | | LocalDataFlow.cs:62:15:62:19 | access to local variable sink1 | LocalDataFlow.cs:70:23:70:27 | access to local variable sink1 | | LocalDataFlow.cs:65:9:65:16 | access to local variable nonSink0 | LocalDataFlow.cs:65:9:65:25 | ... + ... | | LocalDataFlow.cs:65:9:65:25 | ... + ... | LocalDataFlow.cs:65:9:65:25 | SSA def(nonSink0) | | LocalDataFlow.cs:65:9:65:25 | SSA def(nonSink0) | LocalDataFlow.cs:66:15:66:22 | access to local variable nonSink0 | | LocalDataFlow.cs:65:21:65:25 | "abc" | LocalDataFlow.cs:65:9:65:25 | ... + ... | +| LocalDataFlow.cs:66:15:66:22 | [post] access to local variable nonSink0 | LocalDataFlow.cs:75:24:75:31 | access to local variable nonSink0 | | LocalDataFlow.cs:66:15:66:22 | access to local variable nonSink0 | LocalDataFlow.cs:75:24:75:31 | access to local variable nonSink0 | | LocalDataFlow.cs:69:13:69:51 | SSA def(sink2) | LocalDataFlow.cs:70:9:70:13 | access to local variable sink2 | | LocalDataFlow.cs:69:21:69:51 | object creation of type Dictionary | LocalDataFlow.cs:69:13:69:51 | SSA def(sink2) | +| LocalDataFlow.cs:70:9:70:13 | [post] access to local variable sink2 | LocalDataFlow.cs:71:15:71:19 | access to local variable sink2 | | LocalDataFlow.cs:70:9:70:13 | access to local variable sink2 | LocalDataFlow.cs:70:9:70:16 | access to indexer | | LocalDataFlow.cs:70:9:70:13 | access to local variable sink2 | LocalDataFlow.cs:71:15:71:19 | access to local variable sink2 | | LocalDataFlow.cs:70:23:70:27 | access to local variable sink1 | LocalDataFlow.cs:70:9:70:13 | access to local variable sink2 | @@ -45,12 +50,16 @@ | LocalDataFlow.cs:70:23:70:27 | access to local variable sink1 | LocalDataFlow.cs:76:18:76:22 | access to local variable sink1 | | LocalDataFlow.cs:74:13:74:55 | SSA def(nonSink1) | LocalDataFlow.cs:75:9:75:16 | access to local variable nonSink1 | | LocalDataFlow.cs:74:24:74:55 | object creation of type Dictionary | LocalDataFlow.cs:74:13:74:55 | SSA def(nonSink1) | +| LocalDataFlow.cs:75:9:75:16 | [post] access to local variable nonSink1 | LocalDataFlow.cs:76:9:76:16 | access to local variable nonSink1 | | LocalDataFlow.cs:75:9:75:16 | access to local variable nonSink1 | LocalDataFlow.cs:75:9:75:20 | access to indexer | | LocalDataFlow.cs:75:9:75:16 | access to local variable nonSink1 | LocalDataFlow.cs:76:9:76:16 | access to local variable nonSink1 | +| LocalDataFlow.cs:75:24:75:31 | [post] access to local variable nonSink0 | LocalDataFlow.cs:84:20:84:27 | access to local variable nonSink0 | | LocalDataFlow.cs:75:24:75:31 | access to local variable nonSink0 | LocalDataFlow.cs:75:9:75:16 | access to local variable nonSink1 | | LocalDataFlow.cs:75:24:75:31 | access to local variable nonSink0 | LocalDataFlow.cs:84:20:84:27 | access to local variable nonSink0 | +| LocalDataFlow.cs:76:9:76:16 | [post] access to local variable nonSink1 | LocalDataFlow.cs:77:15:77:22 | access to local variable nonSink1 | | LocalDataFlow.cs:76:9:76:16 | access to local variable nonSink1 | LocalDataFlow.cs:76:9:76:23 | access to indexer | | LocalDataFlow.cs:76:9:76:16 | access to local variable nonSink1 | LocalDataFlow.cs:77:15:77:22 | access to local variable nonSink1 | +| LocalDataFlow.cs:76:18:76:22 | [post] access to local variable sink1 | LocalDataFlow.cs:80:21:80:25 | access to local variable sink1 | | LocalDataFlow.cs:76:18:76:22 | access to local variable sink1 | LocalDataFlow.cs:80:21:80:25 | access to local variable sink1 | | LocalDataFlow.cs:76:27:76:28 | "" | LocalDataFlow.cs:76:9:76:16 | access to local variable nonSink1 | | LocalDataFlow.cs:80:13:80:32 | SSA def(sink5) | LocalDataFlow.cs:81:15:81:19 | access to local variable sink5 | @@ -58,14 +67,17 @@ | LocalDataFlow.cs:80:21:80:25 | access to local variable sink1 | LocalDataFlow.cs:204:33:204:37 | access to local variable sink1 | | LocalDataFlow.cs:80:21:80:32 | ... + ... | LocalDataFlow.cs:80:13:80:32 | SSA def(sink5) | | LocalDataFlow.cs:80:29:80:32 | "ok" | LocalDataFlow.cs:80:21:80:32 | ... + ... | +| LocalDataFlow.cs:81:15:81:19 | [post] access to local variable sink5 | LocalDataFlow.cs:88:22:88:26 | access to local variable sink5 | | LocalDataFlow.cs:81:15:81:19 | access to local variable sink5 | LocalDataFlow.cs:88:22:88:26 | access to local variable sink5 | | LocalDataFlow.cs:84:9:84:36 | SSA def(nonSink0) | LocalDataFlow.cs:85:15:85:22 | access to local variable nonSink0 | | LocalDataFlow.cs:84:20:84:27 | access to local variable nonSink0 | LocalDataFlow.cs:84:20:84:36 | ... + ... | | LocalDataFlow.cs:84:20:84:36 | ... + ... | LocalDataFlow.cs:84:9:84:36 | SSA def(nonSink0) | | LocalDataFlow.cs:84:31:84:36 | "test" | LocalDataFlow.cs:84:20:84:36 | ... + ... | +| LocalDataFlow.cs:85:15:85:22 | [post] access to local variable nonSink0 | LocalDataFlow.cs:92:21:92:28 | access to local variable nonSink0 | | LocalDataFlow.cs:85:15:85:22 | access to local variable nonSink0 | LocalDataFlow.cs:92:21:92:28 | access to local variable nonSink0 | | LocalDataFlow.cs:88:13:88:27 | SSA def(sink6) | LocalDataFlow.cs:89:15:89:19 | access to local variable sink6 | | LocalDataFlow.cs:88:22:88:26 | access to local variable sink5 | LocalDataFlow.cs:88:13:88:27 | SSA def(sink6) | +| LocalDataFlow.cs:89:15:89:19 | [post] access to local variable sink6 | LocalDataFlow.cs:96:31:96:35 | [b (line 49): false] access to local variable sink6 | | LocalDataFlow.cs:89:15:89:19 | access to local variable sink6 | LocalDataFlow.cs:96:31:96:35 | [b (line 49): false] access to local variable sink6 | | LocalDataFlow.cs:92:9:92:29 | SSA def(nonSink0) | LocalDataFlow.cs:93:15:93:22 | access to local variable nonSink0 | | LocalDataFlow.cs:92:21:92:28 | access to local variable nonSink0 | LocalDataFlow.cs:92:9:92:29 | SSA def(nonSink0) | @@ -88,10 +100,12 @@ | LocalDataFlow.cs:100:20:100:36 | [b (line 49): true] ... ? ... : ... | LocalDataFlow.cs:100:9:100:36 | SSA def(nonSink0) | | LocalDataFlow.cs:100:24:100:28 | "abc" | LocalDataFlow.cs:100:20:100:36 | [b (line 49): true] ... ? ... : ... | | LocalDataFlow.cs:100:32:100:36 | "def" | LocalDataFlow.cs:100:20:100:36 | [b (line 49): false] ... ? ... : ... | +| LocalDataFlow.cs:101:15:101:22 | [post] access to local variable nonSink0 | LocalDataFlow.cs:108:32:108:39 | access to local variable nonSink0 | | LocalDataFlow.cs:101:15:101:22 | access to local variable nonSink0 | LocalDataFlow.cs:108:32:108:39 | access to local variable nonSink0 | | LocalDataFlow.cs:104:13:104:33 | SSA def(sink8) | LocalDataFlow.cs:105:15:105:19 | access to local variable sink8 | | LocalDataFlow.cs:104:21:104:33 | (...) ... | LocalDataFlow.cs:104:13:104:33 | SSA def(sink8) | | LocalDataFlow.cs:104:29:104:33 | access to local variable sink7 | LocalDataFlow.cs:104:21:104:33 | (...) ... | +| LocalDataFlow.cs:105:15:105:19 | [post] access to local variable sink8 | LocalDataFlow.cs:112:21:112:25 | access to local variable sink8 | | LocalDataFlow.cs:105:15:105:19 | access to local variable sink8 | LocalDataFlow.cs:112:21:112:25 | access to local variable sink8 | | LocalDataFlow.cs:108:13:108:39 | SSA def(nonSink3) | LocalDataFlow.cs:109:15:109:22 | access to local variable nonSink3 | | LocalDataFlow.cs:108:24:108:39 | (...) ... | LocalDataFlow.cs:108:13:108:39 | SSA def(nonSink3) | @@ -101,6 +115,7 @@ | LocalDataFlow.cs:112:21:112:25 | access to local variable sink8 | LocalDataFlow.cs:112:21:112:35 | ... as ... | | LocalDataFlow.cs:112:21:112:25 | access to local variable sink8 | LocalDataFlow.cs:200:22:200:26 | access to local variable sink8 | | LocalDataFlow.cs:112:21:112:35 | ... as ... | LocalDataFlow.cs:112:13:112:35 | SSA def(sink9) | +| LocalDataFlow.cs:113:15:113:19 | [post] access to local variable sink9 | LocalDataFlow.cs:120:37:120:41 | access to local variable sink9 | | LocalDataFlow.cs:113:15:113:19 | access to local variable sink9 | LocalDataFlow.cs:120:37:120:41 | access to local variable sink9 | | LocalDataFlow.cs:116:9:116:37 | SSA def(nonSink3) | LocalDataFlow.cs:117:15:117:22 | access to local variable nonSink3 | | LocalDataFlow.cs:116:20:116:27 | access to local variable nonSink0 | LocalDataFlow.cs:116:20:116:37 | ... as ... | @@ -110,23 +125,30 @@ | LocalDataFlow.cs:120:22:120:43 | array creation of type Object[] | LocalDataFlow.cs:120:13:120:43 | SSA def(sink10) | | LocalDataFlow.cs:120:37:120:41 | access to local variable sink9 | LocalDataFlow.cs:120:22:120:43 | array creation of type Object[] | | LocalDataFlow.cs:120:37:120:41 | access to local variable sink9 | LocalDataFlow.cs:128:61:128:65 | access to local variable sink9 | +| LocalDataFlow.cs:121:15:121:20 | [post] access to local variable sink10 | LocalDataFlow.cs:218:22:218:27 | access to local variable sink10 | | LocalDataFlow.cs:121:15:121:20 | access to local variable sink10 | LocalDataFlow.cs:218:22:218:27 | access to local variable sink10 | | LocalDataFlow.cs:124:13:124:42 | SSA def(nonSink4) | LocalDataFlow.cs:125:15:125:22 | access to local variable nonSink4 | | LocalDataFlow.cs:124:24:124:42 | array creation of type Object[] | LocalDataFlow.cs:124:13:124:42 | SSA def(nonSink4) | | LocalDataFlow.cs:124:39:124:40 | 42 | LocalDataFlow.cs:124:39:124:40 | (...) ... | | LocalDataFlow.cs:124:39:124:40 | (...) ... | LocalDataFlow.cs:124:24:124:42 | array creation of type Object[] | +| LocalDataFlow.cs:125:15:125:22 | [post] access to local variable nonSink4 | LocalDataFlow.cs:222:20:222:27 | access to local variable nonSink4 | | LocalDataFlow.cs:125:15:125:22 | access to local variable nonSink4 | LocalDataFlow.cs:222:20:222:27 | access to local variable nonSink4 | | LocalDataFlow.cs:128:13:128:69 | SSA def(sink11) | LocalDataFlow.cs:129:15:129:20 | access to local variable sink11 | | LocalDataFlow.cs:128:22:128:69 | object creation of type Dictionary | LocalDataFlow.cs:128:13:128:69 | SSA def(sink11) | +| LocalDataFlow.cs:128:61:128:65 | [post] access to local variable sink9 | LocalDataFlow.cs:132:55:132:59 | access to local variable sink9 | | LocalDataFlow.cs:128:61:128:65 | access to local variable sink9 | LocalDataFlow.cs:128:22:128:69 | object creation of type Dictionary | | LocalDataFlow.cs:128:61:128:65 | access to local variable sink9 | LocalDataFlow.cs:132:55:132:59 | access to local variable sink9 | +| LocalDataFlow.cs:129:15:129:20 | [post] access to local variable sink11 | LocalDataFlow.cs:136:22:136:27 | access to local variable sink11 | | LocalDataFlow.cs:129:15:129:20 | access to local variable sink11 | LocalDataFlow.cs:136:22:136:27 | access to local variable sink11 | | LocalDataFlow.cs:132:9:132:67 | SSA def(nonSink1) | LocalDataFlow.cs:133:15:133:22 | access to local variable nonSink1 | | LocalDataFlow.cs:132:20:132:67 | object creation of type Dictionary | LocalDataFlow.cs:132:9:132:67 | SSA def(nonSink1) | +| LocalDataFlow.cs:132:55:132:59 | [post] access to local variable sink9 | LocalDataFlow.cs:144:34:144:38 | access to local variable sink9 | | LocalDataFlow.cs:132:55:132:59 | access to local variable sink9 | LocalDataFlow.cs:144:34:144:38 | access to local variable sink9 | | LocalDataFlow.cs:132:62:132:63 | "" | LocalDataFlow.cs:132:20:132:67 | object creation of type Dictionary | +| LocalDataFlow.cs:133:15:133:22 | [post] access to local variable nonSink1 | LocalDataFlow.cs:140:20:140:27 | access to local variable nonSink1 | | LocalDataFlow.cs:133:15:133:22 | access to local variable nonSink1 | LocalDataFlow.cs:140:20:140:27 | access to local variable nonSink1 | | LocalDataFlow.cs:136:13:136:55 | SSA def(sink14) | LocalDataFlow.cs:137:15:137:20 | access to local variable sink14 | +| LocalDataFlow.cs:136:22:136:27 | [post] access to local variable sink11 | LocalDataFlow.cs:210:22:210:27 | access to local variable sink11 | | LocalDataFlow.cs:136:22:136:27 | access to local variable sink11 | LocalDataFlow.cs:136:22:136:55 | call to method First | | LocalDataFlow.cs:136:22:136:27 | access to local variable sink11 | LocalDataFlow.cs:210:22:210:27 | access to local variable sink11 | | LocalDataFlow.cs:136:22:136:55 | call to method First | LocalDataFlow.cs:136:13:136:55 | SSA def(sink14) | @@ -135,6 +157,7 @@ | LocalDataFlow.cs:136:40:136:40 | access to parameter x | LocalDataFlow.cs:136:40:136:46 | access to property Value | | LocalDataFlow.cs:136:40:136:46 | access to property Value | LocalDataFlow.cs:136:40:136:54 | ... != ... | | LocalDataFlow.cs:140:9:140:55 | SSA def(nonSink3) | LocalDataFlow.cs:206:33:206:40 | access to local variable nonSink3 | +| LocalDataFlow.cs:140:20:140:27 | [post] access to local variable nonSink1 | LocalDataFlow.cs:141:15:141:22 | access to local variable nonSink1 | | LocalDataFlow.cs:140:20:140:27 | access to local variable nonSink1 | LocalDataFlow.cs:140:20:140:55 | call to method First | | LocalDataFlow.cs:140:20:140:27 | access to local variable nonSink1 | LocalDataFlow.cs:141:15:141:22 | access to local variable nonSink1 | | LocalDataFlow.cs:140:20:140:55 | (...) ... | LocalDataFlow.cs:140:9:140:55 | SSA def(nonSink3) | @@ -143,40 +166,51 @@ | LocalDataFlow.cs:140:35:140:35 | x | LocalDataFlow.cs:140:40:140:40 | access to parameter x | | LocalDataFlow.cs:140:40:140:40 | access to parameter x | LocalDataFlow.cs:140:40:140:46 | access to property Value | | LocalDataFlow.cs:140:40:140:46 | access to property Value | LocalDataFlow.cs:140:40:140:54 | ... != ... | +| LocalDataFlow.cs:141:15:141:22 | [post] access to local variable nonSink1 | LocalDataFlow.cs:214:20:214:27 | access to local variable nonSink1 | | LocalDataFlow.cs:141:15:141:22 | access to local variable nonSink1 | LocalDataFlow.cs:214:20:214:27 | access to local variable nonSink1 | | LocalDataFlow.cs:144:13:144:39 | SSA def(sink15) | LocalDataFlow.cs:145:15:145:20 | access to local variable sink15 | | LocalDataFlow.cs:144:22:144:39 | call to method Parse | LocalDataFlow.cs:144:13:144:39 | SSA def(sink15) | +| LocalDataFlow.cs:144:34:144:38 | [post] access to local variable sink9 | LocalDataFlow.cs:147:37:147:41 | access to local variable sink9 | | LocalDataFlow.cs:144:34:144:38 | access to local variable sink9 | LocalDataFlow.cs:144:22:144:39 | call to method Parse | | LocalDataFlow.cs:144:34:144:38 | access to local variable sink9 | LocalDataFlow.cs:147:37:147:41 | access to local variable sink9 | | LocalDataFlow.cs:145:15:145:20 | access to local variable sink15 | LocalDataFlow.cs:196:22:196:27 | access to local variable sink15 | | LocalDataFlow.cs:147:13:147:56 | SSA def(sink16) | LocalDataFlow.cs:148:15:148:20 | access to local variable sink16 | | LocalDataFlow.cs:147:22:147:56 | call to method TryParse | LocalDataFlow.cs:147:13:147:56 | SSA def(sink16) | +| LocalDataFlow.cs:147:37:147:41 | [post] access to local variable sink9 | LocalDataFlow.cs:149:44:149:48 | access to local variable sink9 | | LocalDataFlow.cs:147:37:147:41 | access to local variable sink9 | LocalDataFlow.cs:147:22:147:56 | call to method TryParse | | LocalDataFlow.cs:147:37:147:41 | access to local variable sink9 | LocalDataFlow.cs:149:44:149:48 | access to local variable sink9 | | LocalDataFlow.cs:149:13:149:49 | SSA def(sink17) | LocalDataFlow.cs:150:15:150:20 | access to local variable sink17 | +| LocalDataFlow.cs:149:22:149:29 | [post] access to local variable nonSink0 | LocalDataFlow.cs:151:36:151:43 | access to local variable nonSink0 | | LocalDataFlow.cs:149:22:149:29 | access to local variable nonSink0 | LocalDataFlow.cs:149:22:149:49 | call to method Replace | | LocalDataFlow.cs:149:22:149:29 | access to local variable nonSink0 | LocalDataFlow.cs:151:36:151:43 | access to local variable nonSink0 | | LocalDataFlow.cs:149:22:149:49 | call to method Replace | LocalDataFlow.cs:149:13:149:49 | SSA def(sink17) | +| LocalDataFlow.cs:149:44:149:48 | [post] access to local variable sink9 | LocalDataFlow.cs:151:46:151:50 | access to local variable sink9 | | LocalDataFlow.cs:149:44:149:48 | access to local variable sink9 | LocalDataFlow.cs:149:22:149:49 | call to method Replace | | LocalDataFlow.cs:149:44:149:48 | access to local variable sink9 | LocalDataFlow.cs:151:46:151:50 | access to local variable sink9 | | LocalDataFlow.cs:151:13:151:51 | SSA def(sink18) | LocalDataFlow.cs:152:15:152:20 | access to local variable sink18 | | LocalDataFlow.cs:151:22:151:51 | call to method Format | LocalDataFlow.cs:151:13:151:51 | SSA def(sink18) | +| LocalDataFlow.cs:151:36:151:43 | [post] access to local variable nonSink0 | LocalDataFlow.cs:153:44:153:51 | access to local variable nonSink0 | | LocalDataFlow.cs:151:36:151:43 | access to local variable nonSink0 | LocalDataFlow.cs:151:22:151:51 | call to method Format | | LocalDataFlow.cs:151:36:151:43 | access to local variable nonSink0 | LocalDataFlow.cs:153:44:153:51 | access to local variable nonSink0 | +| LocalDataFlow.cs:151:46:151:50 | [post] access to local variable sink9 | LocalDataFlow.cs:155:33:155:37 | access to local variable sink9 | | LocalDataFlow.cs:151:46:151:50 | access to local variable sink9 | LocalDataFlow.cs:151:22:151:51 | call to method Format | | LocalDataFlow.cs:151:46:151:50 | access to local variable sink9 | LocalDataFlow.cs:155:33:155:37 | access to local variable sink9 | +| LocalDataFlow.cs:152:15:152:20 | [post] access to local variable sink18 | LocalDataFlow.cs:153:36:153:41 | access to local variable sink18 | | LocalDataFlow.cs:152:15:152:20 | access to local variable sink18 | LocalDataFlow.cs:153:36:153:41 | access to local variable sink18 | | LocalDataFlow.cs:153:13:153:52 | SSA def(sink19) | LocalDataFlow.cs:154:15:154:20 | access to local variable sink19 | | LocalDataFlow.cs:153:22:153:52 | call to method Format | LocalDataFlow.cs:153:13:153:52 | SSA def(sink19) | | LocalDataFlow.cs:153:36:153:41 | access to local variable sink18 | LocalDataFlow.cs:153:22:153:52 | call to method Format | +| LocalDataFlow.cs:153:44:153:51 | [post] access to local variable nonSink0 | LocalDataFlow.cs:172:32:172:39 | access to local variable nonSink0 | | LocalDataFlow.cs:153:44:153:51 | access to local variable nonSink0 | LocalDataFlow.cs:153:22:153:52 | call to method Format | | LocalDataFlow.cs:153:44:153:51 | access to local variable nonSink0 | LocalDataFlow.cs:172:32:172:39 | access to local variable nonSink0 | | LocalDataFlow.cs:155:13:155:38 | SSA def(sink45) | LocalDataFlow.cs:156:15:156:20 | access to local variable sink45 | | LocalDataFlow.cs:155:22:155:38 | call to method Parse | LocalDataFlow.cs:155:13:155:38 | SSA def(sink45) | +| LocalDataFlow.cs:155:33:155:37 | [post] access to local variable sink9 | LocalDataFlow.cs:158:36:158:40 | access to local variable sink9 | | LocalDataFlow.cs:155:33:155:37 | access to local variable sink9 | LocalDataFlow.cs:155:22:155:38 | call to method Parse | | LocalDataFlow.cs:155:33:155:37 | access to local variable sink9 | LocalDataFlow.cs:158:36:158:40 | access to local variable sink9 | | LocalDataFlow.cs:158:13:158:56 | SSA def(sink46) | LocalDataFlow.cs:159:15:159:20 | access to local variable sink46 | | LocalDataFlow.cs:158:22:158:56 | call to method TryParse | LocalDataFlow.cs:158:13:158:56 | SSA def(sink46) | +| LocalDataFlow.cs:158:36:158:40 | [post] access to local variable sink9 | LocalDataFlow.cs:198:22:198:26 | access to local variable sink9 | | LocalDataFlow.cs:158:36:158:40 | access to local variable sink9 | LocalDataFlow.cs:158:22:158:56 | call to method TryParse | | LocalDataFlow.cs:158:36:158:40 | access to local variable sink9 | LocalDataFlow.cs:198:22:198:26 | access to local variable sink9 | | LocalDataFlow.cs:159:15:159:20 | access to local variable sink46 | LocalDataFlow.cs:160:37:160:42 | access to local variable sink46 | @@ -189,10 +223,12 @@ | LocalDataFlow.cs:162:36:162:37 | "" | LocalDataFlow.cs:162:22:162:46 | call to method Concat | | LocalDataFlow.cs:162:40:162:45 | (...) ... | LocalDataFlow.cs:162:22:162:46 | call to method Concat | | LocalDataFlow.cs:162:40:162:45 | access to local variable sink47 | LocalDataFlow.cs:162:40:162:45 | (...) ... | +| LocalDataFlow.cs:163:15:163:20 | [post] access to local variable sink49 | LocalDataFlow.cs:164:34:164:39 | access to local variable sink49 | | LocalDataFlow.cs:163:15:163:20 | access to local variable sink49 | LocalDataFlow.cs:164:34:164:39 | access to local variable sink49 | | LocalDataFlow.cs:164:13:164:40 | SSA def(sink50) | LocalDataFlow.cs:165:15:165:20 | access to local variable sink50 | | LocalDataFlow.cs:164:22:164:40 | call to method Copy | LocalDataFlow.cs:164:13:164:40 | SSA def(sink50) | | LocalDataFlow.cs:164:34:164:39 | access to local variable sink49 | LocalDataFlow.cs:164:22:164:40 | call to method Copy | +| LocalDataFlow.cs:165:15:165:20 | [post] access to local variable sink50 | LocalDataFlow.cs:166:44:166:49 | access to local variable sink50 | | LocalDataFlow.cs:165:15:165:20 | access to local variable sink50 | LocalDataFlow.cs:166:44:166:49 | access to local variable sink50 | | LocalDataFlow.cs:166:13:166:54 | SSA def(sink51) | LocalDataFlow.cs:167:15:167:20 | access to local variable sink51 | | LocalDataFlow.cs:166:22:166:54 | call to method Join | LocalDataFlow.cs:166:13:166:54 | SSA def(sink51) | @@ -200,6 +236,7 @@ | LocalDataFlow.cs:166:40:166:41 | "" | LocalDataFlow.cs:166:22:166:54 | call to method Join | | LocalDataFlow.cs:166:44:166:49 | access to local variable sink50 | LocalDataFlow.cs:166:22:166:54 | call to method Join | | LocalDataFlow.cs:166:52:166:53 | "" | LocalDataFlow.cs:166:22:166:54 | call to method Join | +| LocalDataFlow.cs:167:15:167:20 | [post] access to local variable sink51 | LocalDataFlow.cs:168:35:168:40 | access to local variable sink51 | | LocalDataFlow.cs:167:15:167:20 | access to local variable sink51 | LocalDataFlow.cs:168:35:168:40 | access to local variable sink51 | | LocalDataFlow.cs:168:13:168:41 | SSA def(sink52) | LocalDataFlow.cs:169:15:169:20 | access to local variable sink52 | | LocalDataFlow.cs:168:22:168:23 | "" | LocalDataFlow.cs:168:22:168:41 | call to method Insert | @@ -207,26 +244,33 @@ | LocalDataFlow.cs:168:35:168:40 | access to local variable sink51 | LocalDataFlow.cs:168:22:168:41 | call to method Insert | | LocalDataFlow.cs:172:9:172:40 | SSA def(nonSink2) | LocalDataFlow.cs:173:15:173:22 | access to local variable nonSink2 | | LocalDataFlow.cs:172:20:172:40 | call to method Parse | LocalDataFlow.cs:172:9:172:40 | SSA def(nonSink2) | +| LocalDataFlow.cs:172:32:172:39 | [post] access to local variable nonSink0 | LocalDataFlow.cs:174:39:174:46 | access to local variable nonSink0 | | LocalDataFlow.cs:172:32:172:39 | access to local variable nonSink0 | LocalDataFlow.cs:172:20:172:40 | call to method Parse | | LocalDataFlow.cs:172:32:172:39 | access to local variable nonSink0 | LocalDataFlow.cs:174:39:174:46 | access to local variable nonSink0 | | LocalDataFlow.cs:174:13:174:61 | SSA def(nonSink7) | LocalDataFlow.cs:175:15:175:22 | access to local variable nonSink7 | | LocalDataFlow.cs:174:24:174:61 | call to method TryParse | LocalDataFlow.cs:174:13:174:61 | SSA def(nonSink7) | +| LocalDataFlow.cs:174:39:174:46 | [post] access to local variable nonSink0 | LocalDataFlow.cs:176:20:176:27 | access to local variable nonSink0 | | LocalDataFlow.cs:174:39:174:46 | access to local variable nonSink0 | LocalDataFlow.cs:174:24:174:61 | call to method TryParse | | LocalDataFlow.cs:174:39:174:46 | access to local variable nonSink0 | LocalDataFlow.cs:176:20:176:27 | access to local variable nonSink0 | | LocalDataFlow.cs:176:9:176:50 | SSA def(nonSink0) | LocalDataFlow.cs:177:15:177:22 | access to local variable nonSink0 | +| LocalDataFlow.cs:176:20:176:27 | [post] access to local variable nonSink0 | LocalDataFlow.cs:176:42:176:49 | access to local variable nonSink0 | | LocalDataFlow.cs:176:20:176:27 | access to local variable nonSink0 | LocalDataFlow.cs:176:20:176:50 | call to method Replace | | LocalDataFlow.cs:176:20:176:27 | access to local variable nonSink0 | LocalDataFlow.cs:176:42:176:49 | access to local variable nonSink0 | | LocalDataFlow.cs:176:20:176:50 | call to method Replace | LocalDataFlow.cs:176:9:176:50 | SSA def(nonSink0) | | LocalDataFlow.cs:176:42:176:49 | access to local variable nonSink0 | LocalDataFlow.cs:176:20:176:50 | call to method Replace | +| LocalDataFlow.cs:177:15:177:22 | [post] access to local variable nonSink0 | LocalDataFlow.cs:178:34:178:41 | access to local variable nonSink0 | | LocalDataFlow.cs:177:15:177:22 | access to local variable nonSink0 | LocalDataFlow.cs:178:34:178:41 | access to local variable nonSink0 | | LocalDataFlow.cs:178:9:178:52 | SSA def(nonSink0) | LocalDataFlow.cs:179:15:179:22 | access to local variable nonSink0 | | LocalDataFlow.cs:178:20:178:52 | call to method Format | LocalDataFlow.cs:178:9:178:52 | SSA def(nonSink0) | +| LocalDataFlow.cs:178:34:178:41 | [post] access to local variable nonSink0 | LocalDataFlow.cs:178:44:178:51 | access to local variable nonSink0 | | LocalDataFlow.cs:178:34:178:41 | access to local variable nonSink0 | LocalDataFlow.cs:178:20:178:52 | call to method Format | | LocalDataFlow.cs:178:34:178:41 | access to local variable nonSink0 | LocalDataFlow.cs:178:44:178:51 | access to local variable nonSink0 | | LocalDataFlow.cs:178:44:178:51 | access to local variable nonSink0 | LocalDataFlow.cs:178:20:178:52 | call to method Format | +| LocalDataFlow.cs:179:15:179:22 | [post] access to local variable nonSink0 | LocalDataFlow.cs:180:31:180:38 | access to local variable nonSink0 | | LocalDataFlow.cs:179:15:179:22 | access to local variable nonSink0 | LocalDataFlow.cs:180:31:180:38 | access to local variable nonSink0 | | LocalDataFlow.cs:180:9:180:39 | SSA def(nonSink7) | LocalDataFlow.cs:181:15:181:22 | access to local variable nonSink7 | | LocalDataFlow.cs:180:20:180:39 | call to method Parse | LocalDataFlow.cs:180:9:180:39 | SSA def(nonSink7) | +| LocalDataFlow.cs:180:31:180:38 | [post] access to local variable nonSink0 | LocalDataFlow.cs:182:34:182:41 | access to local variable nonSink0 | | LocalDataFlow.cs:180:31:180:38 | access to local variable nonSink0 | LocalDataFlow.cs:180:20:180:39 | call to method Parse | | LocalDataFlow.cs:180:31:180:38 | access to local variable nonSink0 | LocalDataFlow.cs:182:34:182:41 | access to local variable nonSink0 | | LocalDataFlow.cs:182:9:182:57 | SSA def(nonSink7) | LocalDataFlow.cs:183:15:183:22 | access to local variable nonSink7 | @@ -242,10 +286,12 @@ | LocalDataFlow.cs:186:34:186:35 | "" | LocalDataFlow.cs:186:20:186:46 | call to method Concat | | LocalDataFlow.cs:186:38:186:45 | (...) ... | LocalDataFlow.cs:186:20:186:46 | call to method Concat | | LocalDataFlow.cs:186:38:186:45 | access to local variable nonSink7 | LocalDataFlow.cs:186:38:186:45 | (...) ... | +| LocalDataFlow.cs:187:15:187:22 | [post] access to local variable nonSink0 | LocalDataFlow.cs:188:32:188:39 | access to local variable nonSink0 | | LocalDataFlow.cs:187:15:187:22 | access to local variable nonSink0 | LocalDataFlow.cs:188:32:188:39 | access to local variable nonSink0 | | LocalDataFlow.cs:188:9:188:40 | SSA def(nonSink0) | LocalDataFlow.cs:189:15:189:22 | access to local variable nonSink0 | | LocalDataFlow.cs:188:20:188:40 | call to method Copy | LocalDataFlow.cs:188:9:188:40 | SSA def(nonSink0) | | LocalDataFlow.cs:188:32:188:39 | access to local variable nonSink0 | LocalDataFlow.cs:188:20:188:40 | call to method Copy | +| LocalDataFlow.cs:189:15:189:22 | [post] access to local variable nonSink0 | LocalDataFlow.cs:190:42:190:49 | access to local variable nonSink0 | | LocalDataFlow.cs:189:15:189:22 | access to local variable nonSink0 | LocalDataFlow.cs:190:42:190:49 | access to local variable nonSink0 | | LocalDataFlow.cs:190:9:190:54 | SSA def(nonSink0) | LocalDataFlow.cs:191:15:191:22 | access to local variable nonSink0 | | LocalDataFlow.cs:190:20:190:54 | call to method Join | LocalDataFlow.cs:190:9:190:54 | SSA def(nonSink0) | @@ -253,6 +299,7 @@ | LocalDataFlow.cs:190:38:190:39 | "" | LocalDataFlow.cs:190:20:190:54 | call to method Join | | LocalDataFlow.cs:190:42:190:49 | access to local variable nonSink0 | LocalDataFlow.cs:190:20:190:54 | call to method Join | | LocalDataFlow.cs:190:52:190:53 | "" | LocalDataFlow.cs:190:20:190:54 | call to method Join | +| LocalDataFlow.cs:191:15:191:22 | [post] access to local variable nonSink0 | LocalDataFlow.cs:192:33:192:40 | access to local variable nonSink0 | | LocalDataFlow.cs:191:15:191:22 | access to local variable nonSink0 | LocalDataFlow.cs:192:33:192:40 | access to local variable nonSink0 | | LocalDataFlow.cs:192:9:192:41 | SSA def(nonSink0) | LocalDataFlow.cs:193:15:193:22 | access to local variable nonSink0 | | LocalDataFlow.cs:192:20:192:21 | "" | LocalDataFlow.cs:192:20:192:41 | call to method Insert | @@ -266,13 +313,16 @@ | LocalDataFlow.cs:198:22:198:26 | access to local variable sink9 | LocalDataFlow.cs:198:22:198:40 | call to method Equals | | LocalDataFlow.cs:198:22:198:40 | call to method Equals | LocalDataFlow.cs:198:13:198:40 | SSA def(sink21) | | LocalDataFlow.cs:200:13:200:45 | SSA def(sink22) | LocalDataFlow.cs:201:15:201:20 | access to local variable sink22 | +| LocalDataFlow.cs:200:22:200:26 | [post] access to local variable sink8 | LocalDataFlow.cs:206:20:206:24 | access to local variable sink8 | | LocalDataFlow.cs:200:22:200:26 | access to local variable sink8 | LocalDataFlow.cs:200:22:200:45 | call to method Equals | | LocalDataFlow.cs:200:22:200:26 | access to local variable sink8 | LocalDataFlow.cs:206:20:206:24 | access to local variable sink8 | | LocalDataFlow.cs:200:22:200:45 | call to method Equals | LocalDataFlow.cs:200:13:200:45 | SSA def(sink22) | | LocalDataFlow.cs:200:43:200:44 | 41 | LocalDataFlow.cs:200:35:200:44 | (...) ... | | LocalDataFlow.cs:204:9:204:38 | SSA def(nonSink7) | LocalDataFlow.cs:205:15:205:22 | access to local variable nonSink7 | +| LocalDataFlow.cs:204:20:204:24 | [post] access to local variable sink0 | LocalDataFlow.cs:411:30:411:34 | access to local variable sink0 | | LocalDataFlow.cs:204:20:204:24 | access to local variable sink0 | LocalDataFlow.cs:411:30:411:34 | access to local variable sink0 | | LocalDataFlow.cs:204:20:204:38 | call to method Equals | LocalDataFlow.cs:204:9:204:38 | SSA def(nonSink7) | +| LocalDataFlow.cs:204:33:204:37 | [post] access to local variable sink1 | LocalDataFlow.cs:320:22:320:26 | access to local variable sink1 | | LocalDataFlow.cs:204:33:204:37 | access to local variable sink1 | LocalDataFlow.cs:320:22:320:26 | access to local variable sink1 | | LocalDataFlow.cs:206:9:206:41 | SSA def(nonSink7) | LocalDataFlow.cs:207:15:207:22 | access to local variable nonSink7 | | LocalDataFlow.cs:206:20:206:41 | call to method Equals | LocalDataFlow.cs:206:9:206:41 | SSA def(nonSink7) | @@ -280,11 +330,14 @@ | LocalDataFlow.cs:210:13:210:31 | SSA def(sink23) | LocalDataFlow.cs:211:15:211:20 | access to local variable sink23 | | LocalDataFlow.cs:210:22:210:27 | access to local variable sink11 | LocalDataFlow.cs:210:22:210:31 | access to indexer | | LocalDataFlow.cs:210:22:210:31 | access to indexer | LocalDataFlow.cs:210:13:210:31 | SSA def(sink23) | +| LocalDataFlow.cs:211:15:211:20 | [post] access to local variable sink23 | LocalDataFlow.cs:234:37:234:42 | access to local variable sink23 | | LocalDataFlow.cs:211:15:211:20 | access to local variable sink23 | LocalDataFlow.cs:234:37:234:42 | access to local variable sink23 | | LocalDataFlow.cs:214:9:214:31 | SSA def(nonSink0) | LocalDataFlow.cs:215:15:215:22 | access to local variable nonSink0 | +| LocalDataFlow.cs:214:20:214:27 | [post] access to local variable nonSink1 | LocalDataFlow.cs:328:9:328:16 | access to local variable nonSink1 | | LocalDataFlow.cs:214:20:214:27 | access to local variable nonSink1 | LocalDataFlow.cs:214:20:214:31 | access to indexer | | LocalDataFlow.cs:214:20:214:27 | access to local variable nonSink1 | LocalDataFlow.cs:328:9:328:16 | access to local variable nonSink1 | | LocalDataFlow.cs:214:20:214:31 | access to indexer | LocalDataFlow.cs:214:9:214:31 | SSA def(nonSink0) | +| LocalDataFlow.cs:215:15:215:22 | [post] access to local variable nonSink0 | LocalDataFlow.cs:246:39:246:46 | access to local variable nonSink0 | | LocalDataFlow.cs:215:15:215:22 | access to local variable nonSink0 | LocalDataFlow.cs:246:39:246:46 | access to local variable nonSink0 | | LocalDataFlow.cs:218:13:218:30 | SSA def(sink24) | LocalDataFlow.cs:219:15:219:20 | access to local variable sink24 | | LocalDataFlow.cs:218:22:218:27 | access to local variable sink10 | LocalDataFlow.cs:218:22:218:30 | access to array element | @@ -305,58 +358,72 @@ | LocalDataFlow.cs:234:13:234:43 | SSA def(sink26) | LocalDataFlow.cs:235:15:235:20 | access to local variable sink26 | | LocalDataFlow.cs:234:22:234:43 | object creation of type Uri | LocalDataFlow.cs:234:13:234:43 | SSA def(sink26) | | LocalDataFlow.cs:234:37:234:42 | access to local variable sink23 | LocalDataFlow.cs:234:22:234:43 | object creation of type Uri | +| LocalDataFlow.cs:235:15:235:20 | [post] access to local variable sink26 | LocalDataFlow.cs:236:22:236:27 | access to local variable sink26 | | LocalDataFlow.cs:235:15:235:20 | access to local variable sink26 | LocalDataFlow.cs:236:22:236:27 | access to local variable sink26 | | LocalDataFlow.cs:236:13:236:38 | SSA def(sink27) | LocalDataFlow.cs:237:15:237:20 | access to local variable sink27 | +| LocalDataFlow.cs:236:22:236:27 | [post] access to local variable sink26 | LocalDataFlow.cs:238:22:238:27 | access to local variable sink26 | | LocalDataFlow.cs:236:22:236:27 | access to local variable sink26 | LocalDataFlow.cs:236:22:236:38 | call to method ToString | | LocalDataFlow.cs:236:22:236:27 | access to local variable sink26 | LocalDataFlow.cs:238:22:238:27 | access to local variable sink26 | | LocalDataFlow.cs:236:22:236:38 | call to method ToString | LocalDataFlow.cs:236:13:236:38 | SSA def(sink27) | | LocalDataFlow.cs:238:13:238:40 | SSA def(sink28) | LocalDataFlow.cs:239:15:239:20 | access to local variable sink28 | +| LocalDataFlow.cs:238:22:238:27 | [post] access to local variable sink26 | LocalDataFlow.cs:240:22:240:27 | access to local variable sink26 | | LocalDataFlow.cs:238:22:238:27 | access to local variable sink26 | LocalDataFlow.cs:238:22:238:40 | access to property PathAndQuery | | LocalDataFlow.cs:238:22:238:27 | access to local variable sink26 | LocalDataFlow.cs:240:22:240:27 | access to local variable sink26 | | LocalDataFlow.cs:238:22:238:40 | access to property PathAndQuery | LocalDataFlow.cs:238:13:238:40 | SSA def(sink28) | | LocalDataFlow.cs:240:13:240:33 | SSA def(sink29) | LocalDataFlow.cs:241:15:241:20 | access to local variable sink29 | +| LocalDataFlow.cs:240:22:240:27 | [post] access to local variable sink26 | LocalDataFlow.cs:242:22:242:27 | access to local variable sink26 | | LocalDataFlow.cs:240:22:240:27 | access to local variable sink26 | LocalDataFlow.cs:240:22:240:33 | access to property Query | | LocalDataFlow.cs:240:22:240:27 | access to local variable sink26 | LocalDataFlow.cs:242:22:242:27 | access to local variable sink26 | | LocalDataFlow.cs:240:22:240:33 | access to property Query | LocalDataFlow.cs:240:13:240:33 | SSA def(sink29) | | LocalDataFlow.cs:242:13:242:42 | SSA def(sink30) | LocalDataFlow.cs:243:15:243:20 | access to local variable sink30 | | LocalDataFlow.cs:242:22:242:27 | access to local variable sink26 | LocalDataFlow.cs:242:22:242:42 | access to property OriginalString | | LocalDataFlow.cs:242:22:242:42 | access to property OriginalString | LocalDataFlow.cs:242:13:242:42 | SSA def(sink30) | +| LocalDataFlow.cs:243:15:243:20 | [post] access to local variable sink30 | LocalDataFlow.cs:258:49:258:54 | access to local variable sink30 | | LocalDataFlow.cs:243:15:243:20 | access to local variable sink30 | LocalDataFlow.cs:258:49:258:54 | access to local variable sink30 | | LocalDataFlow.cs:246:13:246:47 | SSA def(nonSink8) | LocalDataFlow.cs:247:15:247:22 | access to local variable nonSink8 | | LocalDataFlow.cs:246:24:246:47 | object creation of type Uri | LocalDataFlow.cs:246:13:246:47 | SSA def(nonSink8) | | LocalDataFlow.cs:246:39:246:46 | access to local variable nonSink0 | LocalDataFlow.cs:246:24:246:47 | object creation of type Uri | +| LocalDataFlow.cs:247:15:247:22 | [post] access to local variable nonSink8 | LocalDataFlow.cs:248:20:248:27 | access to local variable nonSink8 | | LocalDataFlow.cs:247:15:247:22 | access to local variable nonSink8 | LocalDataFlow.cs:248:20:248:27 | access to local variable nonSink8 | | LocalDataFlow.cs:248:9:248:38 | SSA def(nonSink0) | LocalDataFlow.cs:249:15:249:22 | access to local variable nonSink0 | +| LocalDataFlow.cs:248:20:248:27 | [post] access to local variable nonSink8 | LocalDataFlow.cs:250:20:250:27 | access to local variable nonSink8 | | LocalDataFlow.cs:248:20:248:27 | access to local variable nonSink8 | LocalDataFlow.cs:248:20:248:38 | call to method ToString | | LocalDataFlow.cs:248:20:248:27 | access to local variable nonSink8 | LocalDataFlow.cs:250:20:250:27 | access to local variable nonSink8 | | LocalDataFlow.cs:248:20:248:38 | call to method ToString | LocalDataFlow.cs:248:9:248:38 | SSA def(nonSink0) | | LocalDataFlow.cs:250:9:250:40 | SSA def(nonSink0) | LocalDataFlow.cs:251:15:251:22 | access to local variable nonSink0 | +| LocalDataFlow.cs:250:20:250:27 | [post] access to local variable nonSink8 | LocalDataFlow.cs:252:20:252:27 | access to local variable nonSink8 | | LocalDataFlow.cs:250:20:250:27 | access to local variable nonSink8 | LocalDataFlow.cs:250:20:250:40 | access to property PathAndQuery | | LocalDataFlow.cs:250:20:250:27 | access to local variable nonSink8 | LocalDataFlow.cs:252:20:252:27 | access to local variable nonSink8 | | LocalDataFlow.cs:250:20:250:40 | access to property PathAndQuery | LocalDataFlow.cs:250:9:250:40 | SSA def(nonSink0) | | LocalDataFlow.cs:252:9:252:33 | SSA def(nonSink0) | LocalDataFlow.cs:253:15:253:22 | access to local variable nonSink0 | +| LocalDataFlow.cs:252:20:252:27 | [post] access to local variable nonSink8 | LocalDataFlow.cs:254:20:254:27 | access to local variable nonSink8 | | LocalDataFlow.cs:252:20:252:27 | access to local variable nonSink8 | LocalDataFlow.cs:252:20:252:33 | access to property Query | | LocalDataFlow.cs:252:20:252:27 | access to local variable nonSink8 | LocalDataFlow.cs:254:20:254:27 | access to local variable nonSink8 | | LocalDataFlow.cs:252:20:252:33 | access to property Query | LocalDataFlow.cs:252:9:252:33 | SSA def(nonSink0) | | LocalDataFlow.cs:254:9:254:42 | SSA def(nonSink0) | LocalDataFlow.cs:255:15:255:22 | access to local variable nonSink0 | | LocalDataFlow.cs:254:20:254:27 | access to local variable nonSink8 | LocalDataFlow.cs:254:20:254:42 | access to property OriginalString | | LocalDataFlow.cs:254:20:254:42 | access to property OriginalString | LocalDataFlow.cs:254:9:254:42 | SSA def(nonSink0) | +| LocalDataFlow.cs:255:15:255:22 | [post] access to local variable nonSink0 | LocalDataFlow.cs:264:51:264:58 | access to local variable nonSink0 | | LocalDataFlow.cs:255:15:255:22 | access to local variable nonSink0 | LocalDataFlow.cs:264:51:264:58 | access to local variable nonSink0 | | LocalDataFlow.cs:258:13:258:55 | SSA def(sink31) | LocalDataFlow.cs:259:15:259:20 | access to local variable sink31 | | LocalDataFlow.cs:258:22:258:55 | object creation of type StringReader | LocalDataFlow.cs:258:13:258:55 | SSA def(sink31) | | LocalDataFlow.cs:258:49:258:54 | access to local variable sink30 | LocalDataFlow.cs:258:22:258:55 | object creation of type StringReader | +| LocalDataFlow.cs:259:15:259:20 | [post] access to local variable sink31 | LocalDataFlow.cs:260:22:260:27 | access to local variable sink31 | | LocalDataFlow.cs:259:15:259:20 | access to local variable sink31 | LocalDataFlow.cs:260:22:260:27 | access to local variable sink31 | | LocalDataFlow.cs:260:13:260:39 | SSA def(sink32) | LocalDataFlow.cs:261:15:261:20 | access to local variable sink32 | | LocalDataFlow.cs:260:22:260:27 | access to local variable sink31 | LocalDataFlow.cs:260:22:260:39 | call to method ReadToEnd | | LocalDataFlow.cs:260:22:260:39 | call to method ReadToEnd | LocalDataFlow.cs:260:13:260:39 | SSA def(sink32) | +| LocalDataFlow.cs:261:15:261:20 | [post] access to local variable sink32 | LocalDataFlow.cs:270:30:270:35 | access to local variable sink32 | | LocalDataFlow.cs:261:15:261:20 | access to local variable sink32 | LocalDataFlow.cs:270:30:270:35 | access to local variable sink32 | | LocalDataFlow.cs:264:13:264:59 | SSA def(nonSink9) | LocalDataFlow.cs:265:15:265:22 | access to local variable nonSink9 | | LocalDataFlow.cs:264:24:264:59 | object creation of type StringReader | LocalDataFlow.cs:264:13:264:59 | SSA def(nonSink9) | | LocalDataFlow.cs:264:51:264:58 | access to local variable nonSink0 | LocalDataFlow.cs:264:24:264:59 | object creation of type StringReader | +| LocalDataFlow.cs:265:15:265:22 | [post] access to local variable nonSink9 | LocalDataFlow.cs:266:20:266:27 | access to local variable nonSink9 | | LocalDataFlow.cs:265:15:265:22 | access to local variable nonSink9 | LocalDataFlow.cs:266:20:266:27 | access to local variable nonSink9 | | LocalDataFlow.cs:266:9:266:39 | SSA def(nonSink0) | LocalDataFlow.cs:267:15:267:22 | access to local variable nonSink0 | | LocalDataFlow.cs:266:20:266:27 | access to local variable nonSink9 | LocalDataFlow.cs:266:20:266:39 | call to method ReadToEnd | | LocalDataFlow.cs:266:20:266:39 | call to method ReadToEnd | LocalDataFlow.cs:266:9:266:39 | SSA def(nonSink0) | +| LocalDataFlow.cs:267:15:267:22 | [post] access to local variable nonSink0 | LocalDataFlow.cs:276:28:276:35 | access to local variable nonSink0 | | LocalDataFlow.cs:267:15:267:22 | access to local variable nonSink0 | LocalDataFlow.cs:276:28:276:35 | access to local variable nonSink0 | | LocalDataFlow.cs:270:13:270:127 | SSA def(sink33) | LocalDataFlow.cs:271:15:271:20 | access to local variable sink33 | | LocalDataFlow.cs:270:22:270:127 | (...) ... | LocalDataFlow.cs:270:13:270:127 | SSA def(sink33) | @@ -370,8 +437,10 @@ | LocalDataFlow.cs:270:30:270:127 | call to method Clone | LocalDataFlow.cs:270:22:270:127 | (...) ... | | LocalDataFlow.cs:270:102:270:104 | "b" | LocalDataFlow.cs:270:30:270:105 | call to method Replace | | LocalDataFlow.cs:270:117:270:118 | "" | LocalDataFlow.cs:270:30:270:119 | call to method Insert | +| LocalDataFlow.cs:271:15:271:20 | [post] access to local variable sink33 | LocalDataFlow.cs:272:22:272:27 | access to local variable sink33 | | LocalDataFlow.cs:271:15:271:20 | access to local variable sink33 | LocalDataFlow.cs:272:22:272:27 | access to local variable sink33 | | LocalDataFlow.cs:272:13:272:63 | SSA def(sink48) | LocalDataFlow.cs:273:15:273:20 | access to local variable sink48 | +| LocalDataFlow.cs:272:22:272:27 | [post] access to local variable sink33 | LocalDataFlow.cs:282:40:282:45 | access to local variable sink33 | | LocalDataFlow.cs:272:22:272:27 | access to local variable sink33 | LocalDataFlow.cs:272:22:272:39 | call to method Normalize | | LocalDataFlow.cs:272:22:272:27 | access to local variable sink33 | LocalDataFlow.cs:282:40:282:45 | access to local variable sink33 | | LocalDataFlow.cs:272:22:272:39 | call to method Normalize | LocalDataFlow.cs:272:22:272:52 | call to method Remove | @@ -389,8 +458,10 @@ | LocalDataFlow.cs:276:28:276:127 | call to method Clone | LocalDataFlow.cs:276:20:276:127 | (...) ... | | LocalDataFlow.cs:276:102:276:104 | "b" | LocalDataFlow.cs:276:28:276:105 | call to method Replace | | LocalDataFlow.cs:276:117:276:118 | "" | LocalDataFlow.cs:276:28:276:119 | call to method Insert | +| LocalDataFlow.cs:277:15:277:22 | [post] access to local variable nonSink0 | LocalDataFlow.cs:278:25:278:32 | access to local variable nonSink0 | | LocalDataFlow.cs:277:15:277:22 | access to local variable nonSink0 | LocalDataFlow.cs:278:25:278:32 | access to local variable nonSink0 | | LocalDataFlow.cs:278:13:278:68 | SSA def(nonSink15) | LocalDataFlow.cs:279:15:279:23 | access to local variable nonSink15 | +| LocalDataFlow.cs:278:25:278:32 | [post] access to local variable nonSink0 | LocalDataFlow.cs:291:43:291:50 | access to local variable nonSink0 | | LocalDataFlow.cs:278:25:278:32 | access to local variable nonSink0 | LocalDataFlow.cs:278:25:278:44 | call to method Normalize | | LocalDataFlow.cs:278:25:278:32 | access to local variable nonSink0 | LocalDataFlow.cs:291:43:291:50 | access to local variable nonSink0 | | LocalDataFlow.cs:278:25:278:44 | call to method Normalize | LocalDataFlow.cs:278:25:278:57 | call to method Remove | @@ -399,31 +470,39 @@ | LocalDataFlow.cs:282:13:282:46 | SSA def(sink34) | LocalDataFlow.cs:283:15:283:20 | access to local variable sink34 | | LocalDataFlow.cs:282:22:282:46 | object creation of type StringBuilder | LocalDataFlow.cs:282:13:282:46 | SSA def(sink34) | | LocalDataFlow.cs:282:40:282:45 | access to local variable sink33 | LocalDataFlow.cs:282:22:282:46 | object creation of type StringBuilder | +| LocalDataFlow.cs:283:15:283:20 | [post] access to local variable sink34 | LocalDataFlow.cs:284:22:284:27 | access to local variable sink34 | | LocalDataFlow.cs:283:15:283:20 | access to local variable sink34 | LocalDataFlow.cs:284:22:284:27 | access to local variable sink34 | | LocalDataFlow.cs:284:13:284:38 | SSA def(sink35) | LocalDataFlow.cs:285:15:285:20 | access to local variable sink35 | | LocalDataFlow.cs:284:22:284:27 | access to local variable sink34 | LocalDataFlow.cs:284:22:284:38 | call to method ToString | | LocalDataFlow.cs:284:22:284:38 | call to method ToString | LocalDataFlow.cs:284:13:284:38 | SSA def(sink35) | +| LocalDataFlow.cs:285:15:285:20 | [post] access to local variable sink35 | LocalDataFlow.cs:287:27:287:32 | access to local variable sink35 | | LocalDataFlow.cs:285:15:285:20 | access to local variable sink35 | LocalDataFlow.cs:287:27:287:32 | access to local variable sink35 | | LocalDataFlow.cs:286:13:286:42 | SSA def(sink36) | LocalDataFlow.cs:287:9:287:14 | access to local variable sink36 | | LocalDataFlow.cs:286:22:286:42 | object creation of type StringBuilder | LocalDataFlow.cs:286:13:286:42 | SSA def(sink36) | | LocalDataFlow.cs:286:40:286:41 | "" | LocalDataFlow.cs:286:22:286:42 | object creation of type StringBuilder | +| LocalDataFlow.cs:287:9:287:14 | [post] access to local variable sink36 | LocalDataFlow.cs:288:15:288:20 | access to local variable sink36 | | LocalDataFlow.cs:287:9:287:14 | access to local variable sink36 | LocalDataFlow.cs:288:15:288:20 | access to local variable sink36 | | LocalDataFlow.cs:287:27:287:32 | access to local variable sink35 | LocalDataFlow.cs:287:9:287:14 | access to local variable sink36 | | LocalDataFlow.cs:291:13:291:51 | SSA def(nonSink10) | LocalDataFlow.cs:292:15:292:23 | access to local variable nonSink10 | | LocalDataFlow.cs:291:25:291:51 | object creation of type StringBuilder | LocalDataFlow.cs:291:13:291:51 | SSA def(nonSink10) | | LocalDataFlow.cs:291:43:291:50 | access to local variable nonSink0 | LocalDataFlow.cs:291:25:291:51 | object creation of type StringBuilder | +| LocalDataFlow.cs:292:15:292:23 | [post] access to local variable nonSink10 | LocalDataFlow.cs:293:20:293:28 | access to local variable nonSink10 | | LocalDataFlow.cs:292:15:292:23 | access to local variable nonSink10 | LocalDataFlow.cs:293:20:293:28 | access to local variable nonSink10 | | LocalDataFlow.cs:293:9:293:39 | SSA def(nonSink0) | LocalDataFlow.cs:294:15:294:22 | access to local variable nonSink0 | +| LocalDataFlow.cs:293:20:293:28 | [post] access to local variable nonSink10 | LocalDataFlow.cs:295:9:295:17 | access to local variable nonSink10 | | LocalDataFlow.cs:293:20:293:28 | access to local variable nonSink10 | LocalDataFlow.cs:293:20:293:39 | call to method ToString | | LocalDataFlow.cs:293:20:293:28 | access to local variable nonSink10 | LocalDataFlow.cs:295:9:295:17 | access to local variable nonSink10 | | LocalDataFlow.cs:293:20:293:39 | call to method ToString | LocalDataFlow.cs:293:9:293:39 | SSA def(nonSink0) | +| LocalDataFlow.cs:294:15:294:22 | [post] access to local variable nonSink0 | LocalDataFlow.cs:295:30:295:37 | access to local variable nonSink0 | | LocalDataFlow.cs:294:15:294:22 | access to local variable nonSink0 | LocalDataFlow.cs:295:30:295:37 | access to local variable nonSink0 | +| LocalDataFlow.cs:295:9:295:17 | [post] access to local variable nonSink10 | LocalDataFlow.cs:296:15:296:23 | access to local variable nonSink10 | | LocalDataFlow.cs:295:9:295:17 | access to local variable nonSink10 | LocalDataFlow.cs:296:15:296:23 | access to local variable nonSink10 | | LocalDataFlow.cs:295:30:295:37 | access to local variable nonSink0 | LocalDataFlow.cs:295:9:295:17 | access to local variable nonSink10 | | LocalDataFlow.cs:299:13:299:52 | SSA def(sink40) | LocalDataFlow.cs:300:15:300:20 | access to local variable sink40 | | LocalDataFlow.cs:299:22:299:52 | object creation of type Lazy | LocalDataFlow.cs:299:13:299:52 | SSA def(sink40) | | LocalDataFlow.cs:299:39:299:51 | [output] delegate creation of type Func | LocalDataFlow.cs:299:22:299:52 | object creation of type Lazy | | LocalDataFlow.cs:299:39:299:51 | this access | LocalDataFlow.cs:309:42:309:57 | this access | +| LocalDataFlow.cs:300:15:300:20 | [post] access to local variable sink40 | LocalDataFlow.cs:301:22:301:27 | access to local variable sink40 | | LocalDataFlow.cs:300:15:300:20 | access to local variable sink40 | LocalDataFlow.cs:301:22:301:27 | access to local variable sink40 | | LocalDataFlow.cs:301:13:301:33 | SSA def(sink41) | LocalDataFlow.cs:302:15:302:20 | access to local variable sink41 | | LocalDataFlow.cs:301:22:301:27 | access to local variable sink40 | LocalDataFlow.cs:301:22:301:33 | access to property Value | @@ -431,6 +510,7 @@ | LocalDataFlow.cs:303:13:303:59 | SSA def(sink42) | LocalDataFlow.cs:304:15:304:20 | access to local variable sink42 | | LocalDataFlow.cs:303:22:303:59 | object creation of type Lazy | LocalDataFlow.cs:303:13:303:59 | SSA def(sink42) | | LocalDataFlow.cs:303:39:303:58 | [output] (...) => ... | LocalDataFlow.cs:303:22:303:59 | object creation of type Lazy | +| LocalDataFlow.cs:304:15:304:20 | [post] access to local variable sink42 | LocalDataFlow.cs:305:22:305:27 | access to local variable sink42 | | LocalDataFlow.cs:304:15:304:20 | access to local variable sink42 | LocalDataFlow.cs:305:22:305:27 | access to local variable sink42 | | LocalDataFlow.cs:305:13:305:33 | SSA def(sink43) | LocalDataFlow.cs:306:15:306:20 | access to local variable sink43 | | LocalDataFlow.cs:305:22:305:27 | access to local variable sink42 | LocalDataFlow.cs:305:22:305:33 | access to property Value | @@ -438,6 +518,7 @@ | LocalDataFlow.cs:309:13:309:58 | SSA def(nonSink12) | LocalDataFlow.cs:310:15:310:23 | access to local variable nonSink12 | | LocalDataFlow.cs:309:25:309:58 | object creation of type Lazy | LocalDataFlow.cs:309:13:309:58 | SSA def(nonSink12) | | LocalDataFlow.cs:309:42:309:57 | [output] delegate creation of type Func | LocalDataFlow.cs:309:25:309:58 | object creation of type Lazy | +| LocalDataFlow.cs:310:15:310:23 | [post] access to local variable nonSink12 | LocalDataFlow.cs:311:20:311:28 | access to local variable nonSink12 | | LocalDataFlow.cs:310:15:310:23 | access to local variable nonSink12 | LocalDataFlow.cs:311:20:311:28 | access to local variable nonSink12 | | LocalDataFlow.cs:311:9:311:34 | SSA def(nonSink0) | LocalDataFlow.cs:312:15:312:22 | access to local variable nonSink0 | | LocalDataFlow.cs:311:20:311:28 | access to local variable nonSink12 | LocalDataFlow.cs:311:20:311:34 | access to property Value | @@ -445,35 +526,48 @@ | LocalDataFlow.cs:313:9:313:46 | SSA def(nonSink12) | LocalDataFlow.cs:314:15:314:23 | access to local variable nonSink12 | | LocalDataFlow.cs:313:21:313:46 | object creation of type Lazy | LocalDataFlow.cs:313:9:313:46 | SSA def(nonSink12) | | LocalDataFlow.cs:313:38:313:45 | [output] (...) => ... | LocalDataFlow.cs:313:21:313:46 | object creation of type Lazy | +| LocalDataFlow.cs:314:15:314:23 | [post] access to local variable nonSink12 | LocalDataFlow.cs:315:20:315:28 | access to local variable nonSink12 | | LocalDataFlow.cs:314:15:314:23 | access to local variable nonSink12 | LocalDataFlow.cs:315:20:315:28 | access to local variable nonSink12 | | LocalDataFlow.cs:315:9:315:34 | SSA def(nonSink0) | LocalDataFlow.cs:316:15:316:22 | access to local variable nonSink0 | | LocalDataFlow.cs:315:20:315:28 | access to local variable nonSink12 | LocalDataFlow.cs:315:20:315:34 | access to property Value | | LocalDataFlow.cs:315:20:315:34 | access to property Value | LocalDataFlow.cs:315:9:315:34 | SSA def(nonSink0) | +| LocalDataFlow.cs:316:15:316:22 | [post] access to local variable nonSink0 | LocalDataFlow.cs:328:26:328:33 | access to local variable nonSink0 | | LocalDataFlow.cs:316:15:316:22 | access to local variable nonSink0 | LocalDataFlow.cs:328:26:328:33 | access to local variable nonSink0 | | LocalDataFlow.cs:319:13:319:49 | SSA def(sink3) | LocalDataFlow.cs:320:9:320:13 | access to local variable sink3 | | LocalDataFlow.cs:319:21:319:49 | object creation of type Dictionary | LocalDataFlow.cs:319:13:319:49 | SSA def(sink3) | +| LocalDataFlow.cs:320:9:320:13 | [post] access to local variable sink3 | LocalDataFlow.cs:321:15:321:19 | access to local variable sink3 | | LocalDataFlow.cs:320:9:320:13 | access to local variable sink3 | LocalDataFlow.cs:321:15:321:19 | access to local variable sink3 | +| LocalDataFlow.cs:320:22:320:26 | [post] access to local variable sink1 | LocalDataFlow.cs:329:22:329:26 | access to local variable sink1 | | LocalDataFlow.cs:320:22:320:26 | access to local variable sink1 | LocalDataFlow.cs:320:9:320:13 | access to local variable sink3 | | LocalDataFlow.cs:320:22:320:26 | access to local variable sink1 | LocalDataFlow.cs:329:22:329:26 | access to local variable sink1 | +| LocalDataFlow.cs:321:15:321:19 | [post] access to local variable sink3 | LocalDataFlow.cs:322:22:322:26 | access to local variable sink3 | | LocalDataFlow.cs:321:15:321:19 | access to local variable sink3 | LocalDataFlow.cs:322:22:322:26 | access to local variable sink3 | | LocalDataFlow.cs:322:13:322:33 | SSA def(sink12) | LocalDataFlow.cs:323:15:323:20 | access to local variable sink12 | +| LocalDataFlow.cs:322:22:322:26 | [post] access to local variable sink3 | LocalDataFlow.cs:369:57:369:61 | access to local variable sink3 | | LocalDataFlow.cs:322:22:322:26 | access to local variable sink3 | LocalDataFlow.cs:322:22:322:33 | access to property Values | | LocalDataFlow.cs:322:22:322:26 | access to local variable sink3 | LocalDataFlow.cs:369:57:369:61 | access to local variable sink3 | | LocalDataFlow.cs:322:22:322:33 | access to property Values | LocalDataFlow.cs:322:13:322:33 | SSA def(sink12) | +| LocalDataFlow.cs:323:15:323:20 | [post] access to local variable sink12 | LocalDataFlow.cs:324:22:324:27 | access to local variable sink12 | | LocalDataFlow.cs:323:15:323:20 | access to local variable sink12 | LocalDataFlow.cs:324:22:324:27 | access to local variable sink12 | | LocalDataFlow.cs:324:13:324:37 | SSA def(sink13) | LocalDataFlow.cs:325:15:325:20 | access to local variable sink13 | | LocalDataFlow.cs:324:22:324:27 | access to local variable sink12 | LocalDataFlow.cs:324:22:324:37 | call to method Reverse | | LocalDataFlow.cs:324:22:324:37 | call to method Reverse | LocalDataFlow.cs:324:13:324:37 | SSA def(sink13) | +| LocalDataFlow.cs:328:9:328:16 | [post] access to local variable nonSink1 | LocalDataFlow.cs:329:9:329:16 | access to local variable nonSink1 | | LocalDataFlow.cs:328:9:328:16 | access to local variable nonSink1 | LocalDataFlow.cs:329:9:329:16 | access to local variable nonSink1 | | LocalDataFlow.cs:328:26:328:33 | access to local variable nonSink0 | LocalDataFlow.cs:328:9:328:16 | access to local variable nonSink1 | +| LocalDataFlow.cs:329:9:329:16 | [post] access to local variable nonSink1 | LocalDataFlow.cs:330:15:330:22 | access to local variable nonSink1 | | LocalDataFlow.cs:329:9:329:16 | access to local variable nonSink1 | LocalDataFlow.cs:330:15:330:22 | access to local variable nonSink1 | +| LocalDataFlow.cs:329:22:329:26 | [post] access to local variable sink1 | LocalDataFlow.cs:403:30:403:34 | access to local variable sink1 | | LocalDataFlow.cs:329:22:329:26 | access to local variable sink1 | LocalDataFlow.cs:403:30:403:34 | access to local variable sink1 | | LocalDataFlow.cs:329:29:329:30 | "" | LocalDataFlow.cs:329:9:329:16 | access to local variable nonSink1 | +| LocalDataFlow.cs:330:15:330:22 | [post] access to local variable nonSink1 | LocalDataFlow.cs:331:24:331:31 | access to local variable nonSink1 | | LocalDataFlow.cs:330:15:330:22 | access to local variable nonSink1 | LocalDataFlow.cs:331:24:331:31 | access to local variable nonSink1 | | LocalDataFlow.cs:331:13:331:38 | SSA def(nonSink5) | LocalDataFlow.cs:332:15:332:22 | access to local variable nonSink5 | +| LocalDataFlow.cs:331:24:331:31 | [post] access to local variable nonSink1 | LocalDataFlow.cs:383:63:383:70 | access to local variable nonSink1 | | LocalDataFlow.cs:331:24:331:31 | access to local variable nonSink1 | LocalDataFlow.cs:331:24:331:38 | access to property Values | | LocalDataFlow.cs:331:24:331:31 | access to local variable nonSink1 | LocalDataFlow.cs:383:63:383:70 | access to local variable nonSink1 | | LocalDataFlow.cs:331:24:331:38 | access to property Values | LocalDataFlow.cs:331:13:331:38 | SSA def(nonSink5) | +| LocalDataFlow.cs:332:15:332:22 | [post] access to local variable nonSink5 | LocalDataFlow.cs:333:24:333:31 | access to local variable nonSink5 | | LocalDataFlow.cs:332:15:332:22 | access to local variable nonSink5 | LocalDataFlow.cs:333:24:333:31 | access to local variable nonSink5 | | LocalDataFlow.cs:333:13:333:41 | SSA def(nonSink6) | LocalDataFlow.cs:334:15:334:22 | access to local variable nonSink6 | | LocalDataFlow.cs:333:24:333:31 | access to local variable nonSink5 | LocalDataFlow.cs:333:24:333:41 | call to method Reverse | @@ -482,12 +576,15 @@ | LocalDataFlow.cs:337:13:337:52 | SSA qualifier def(taintedDataContract.AList) | LocalDataFlow.cs:340:22:340:46 | access to property AList | | LocalDataFlow.cs:337:35:337:52 | object creation of type DataContract | LocalDataFlow.cs:337:13:337:52 | SSA def(taintedDataContract) | | LocalDataFlow.cs:338:13:338:48 | SSA def(sink53) | LocalDataFlow.cs:339:15:339:20 | access to local variable sink53 | +| LocalDataFlow.cs:338:22:338:40 | [post] access to local variable taintedDataContract | LocalDataFlow.cs:340:22:340:40 | access to local variable taintedDataContract | | LocalDataFlow.cs:338:22:338:40 | access to local variable taintedDataContract | LocalDataFlow.cs:338:22:338:48 | access to property AString | | LocalDataFlow.cs:338:22:338:40 | access to local variable taintedDataContract | LocalDataFlow.cs:340:22:340:40 | access to local variable taintedDataContract | | LocalDataFlow.cs:338:22:338:48 | access to property AString | LocalDataFlow.cs:338:13:338:48 | SSA def(sink53) | | LocalDataFlow.cs:340:13:340:57 | SSA def(sink54) | LocalDataFlow.cs:341:15:341:20 | access to local variable sink54 | +| LocalDataFlow.cs:340:22:340:40 | [post] access to local variable taintedDataContract | LocalDataFlow.cs:347:20:347:38 | access to local variable taintedDataContract | | LocalDataFlow.cs:340:22:340:40 | access to local variable taintedDataContract | LocalDataFlow.cs:340:22:340:46 | access to property AList | | LocalDataFlow.cs:340:22:340:40 | access to local variable taintedDataContract | LocalDataFlow.cs:347:20:347:38 | access to local variable taintedDataContract | +| LocalDataFlow.cs:340:22:340:46 | [post] access to property AList | LocalDataFlow.cs:349:20:349:44 | access to property AList | | LocalDataFlow.cs:340:22:340:46 | access to property AList | LocalDataFlow.cs:340:22:340:49 | access to indexer | | LocalDataFlow.cs:340:22:340:46 | access to property AList | LocalDataFlow.cs:349:20:349:44 | access to property AList | | LocalDataFlow.cs:340:22:340:49 | access to indexer | LocalDataFlow.cs:340:22:340:57 | access to property AString | @@ -498,6 +595,7 @@ | LocalDataFlow.cs:345:20:345:41 | access to local variable nonTaintedDataContract | LocalDataFlow.cs:345:20:345:49 | access to property AString | | LocalDataFlow.cs:345:20:345:49 | access to property AString | LocalDataFlow.cs:345:9:345:49 | SSA def(nonSink0) | | LocalDataFlow.cs:347:9:347:44 | SSA def(nonSink2) | LocalDataFlow.cs:348:15:348:22 | access to local variable nonSink2 | +| LocalDataFlow.cs:347:20:347:38 | [post] access to local variable taintedDataContract | LocalDataFlow.cs:349:20:349:38 | access to local variable taintedDataContract | | LocalDataFlow.cs:347:20:347:38 | access to local variable taintedDataContract | LocalDataFlow.cs:349:20:349:38 | access to local variable taintedDataContract | | LocalDataFlow.cs:347:20:347:44 | access to property AnInt | LocalDataFlow.cs:347:9:347:44 | SSA def(nonSink2) | | LocalDataFlow.cs:349:9:349:53 | SSA def(nonSink2) | LocalDataFlow.cs:350:15:350:22 | access to local variable nonSink2 | @@ -520,6 +618,7 @@ | LocalDataFlow.cs:365:21:365:51 | SSA def(sink62) | LocalDataFlow.cs:366:15:366:20 | access to local variable sink62 | | LocalDataFlow.cs:365:30:365:35 | access to local variable sink10 | LocalDataFlow.cs:365:30:365:51 | call to method GetEnumerator | | LocalDataFlow.cs:365:30:365:51 | call to method GetEnumerator | LocalDataFlow.cs:365:21:365:51 | SSA def(sink62) | +| LocalDataFlow.cs:366:15:366:20 | [post] access to local variable sink62 | LocalDataFlow.cs:367:22:367:27 | access to local variable sink62 | | LocalDataFlow.cs:366:15:366:20 | access to local variable sink62 | LocalDataFlow.cs:367:22:367:27 | access to local variable sink62 | | LocalDataFlow.cs:367:13:367:35 | SSA def(sink63) | LocalDataFlow.cs:368:15:368:20 | access to local variable sink63 | | LocalDataFlow.cs:367:22:367:27 | access to local variable sink62 | LocalDataFlow.cs:367:22:367:35 | access to property Current | @@ -528,6 +627,7 @@ | LocalDataFlow.cs:369:57:369:61 | access to local variable sink3 | LocalDataFlow.cs:369:57:369:77 | call to method GetEnumerator | | LocalDataFlow.cs:369:57:369:77 | (...) ... | LocalDataFlow.cs:369:48:369:77 | SSA def(sink64) | | LocalDataFlow.cs:369:57:369:77 | call to method GetEnumerator | LocalDataFlow.cs:369:57:369:77 | (...) ... | +| LocalDataFlow.cs:370:15:370:20 | [post] access to local variable sink64 | LocalDataFlow.cs:371:22:371:27 | access to local variable sink64 | | LocalDataFlow.cs:370:15:370:20 | access to local variable sink64 | LocalDataFlow.cs:371:22:371:27 | access to local variable sink64 | | LocalDataFlow.cs:371:13:371:35 | SSA def(sink65) | LocalDataFlow.cs:372:15:372:20 | access to local variable sink65 | | LocalDataFlow.cs:371:22:371:27 | access to local variable sink64 | LocalDataFlow.cs:371:22:371:35 | access to property Current | @@ -542,6 +642,7 @@ | LocalDataFlow.cs:379:21:379:56 | SSA def(nonSink18) | LocalDataFlow.cs:380:15:380:23 | access to local variable nonSink18 | | LocalDataFlow.cs:379:33:379:40 | access to local variable nonSink4 | LocalDataFlow.cs:379:33:379:56 | call to method GetEnumerator | | LocalDataFlow.cs:379:33:379:56 | call to method GetEnumerator | LocalDataFlow.cs:379:21:379:56 | SSA def(nonSink18) | +| LocalDataFlow.cs:380:15:380:23 | [post] access to local variable nonSink18 | LocalDataFlow.cs:381:20:381:28 | access to local variable nonSink18 | | LocalDataFlow.cs:380:15:380:23 | access to local variable nonSink18 | LocalDataFlow.cs:381:20:381:28 | access to local variable nonSink18 | | LocalDataFlow.cs:381:9:381:36 | SSA def(nonSink3) | LocalDataFlow.cs:382:15:382:22 | access to local variable nonSink3 | | LocalDataFlow.cs:381:20:381:28 | access to local variable nonSink18 | LocalDataFlow.cs:381:20:381:36 | access to property Current | @@ -550,6 +651,7 @@ | LocalDataFlow.cs:383:63:383:70 | access to local variable nonSink1 | LocalDataFlow.cs:383:63:383:86 | call to method GetEnumerator | | LocalDataFlow.cs:383:63:383:86 | (...) ... | LocalDataFlow.cs:383:51:383:86 | SSA def(nonSink19) | | LocalDataFlow.cs:383:63:383:86 | call to method GetEnumerator | LocalDataFlow.cs:383:63:383:86 | (...) ... | +| LocalDataFlow.cs:384:15:384:23 | [post] access to local variable nonSink19 | LocalDataFlow.cs:385:25:385:33 | access to local variable nonSink19 | | LocalDataFlow.cs:384:15:384:23 | access to local variable nonSink19 | LocalDataFlow.cs:385:25:385:33 | access to local variable nonSink19 | | LocalDataFlow.cs:385:13:385:41 | SSA def(nonSink20) | LocalDataFlow.cs:386:15:386:23 | access to local variable nonSink20 | | LocalDataFlow.cs:385:25:385:33 | access to local variable nonSink19 | LocalDataFlow.cs:385:25:385:41 | access to property Current | @@ -561,6 +663,7 @@ | LocalDataFlow.cs:391:13:391:51 | SSA def(sink67) | LocalDataFlow.cs:392:15:392:20 | access to local variable sink67 | | LocalDataFlow.cs:391:22:391:51 | call to method Run | LocalDataFlow.cs:391:13:391:51 | SSA def(sink67) | | LocalDataFlow.cs:391:31:391:50 | [output] (...) => ... | LocalDataFlow.cs:391:22:391:51 | call to method Run | +| LocalDataFlow.cs:392:15:392:20 | [post] access to local variable sink67 | LocalDataFlow.cs:393:28:393:33 | access to local variable sink67 | | LocalDataFlow.cs:392:15:392:20 | access to local variable sink67 | LocalDataFlow.cs:393:28:393:33 | access to local variable sink67 | | LocalDataFlow.cs:393:13:393:33 | SSA def(sink68) | LocalDataFlow.cs:394:15:394:20 | access to local variable sink68 | | LocalDataFlow.cs:393:22:393:33 | await ... | LocalDataFlow.cs:393:13:393:33 | SSA def(sink68) | @@ -568,10 +671,12 @@ | LocalDataFlow.cs:397:13:397:42 | SSA def(nonSink21) | LocalDataFlow.cs:398:15:398:23 | access to local variable nonSink21 | | LocalDataFlow.cs:397:25:397:42 | call to method Run | LocalDataFlow.cs:397:13:397:42 | SSA def(nonSink21) | | LocalDataFlow.cs:397:34:397:41 | [output] (...) => ... | LocalDataFlow.cs:397:25:397:42 | call to method Run | +| LocalDataFlow.cs:398:15:398:23 | [post] access to local variable nonSink21 | LocalDataFlow.cs:399:26:399:34 | access to local variable nonSink21 | | LocalDataFlow.cs:398:15:398:23 | access to local variable nonSink21 | LocalDataFlow.cs:399:26:399:34 | access to local variable nonSink21 | | LocalDataFlow.cs:399:9:399:34 | SSA def(nonSink0) | LocalDataFlow.cs:400:15:400:22 | access to local variable nonSink0 | | LocalDataFlow.cs:399:20:399:34 | await ... | LocalDataFlow.cs:399:9:399:34 | SSA def(nonSink0) | | LocalDataFlow.cs:399:26:399:34 | access to local variable nonSink21 | LocalDataFlow.cs:399:20:399:34 | await ... | +| LocalDataFlow.cs:400:15:400:22 | [post] access to local variable nonSink0 | LocalDataFlow.cs:407:28:407:35 | access to local variable nonSink0 | | LocalDataFlow.cs:400:15:400:22 | access to local variable nonSink0 | LocalDataFlow.cs:407:28:407:35 | access to local variable nonSink0 | | LocalDataFlow.cs:403:13:403:36 | SSA def(sink69) | LocalDataFlow.cs:404:15:404:20 | access to local variable sink69 | | LocalDataFlow.cs:403:22:403:36 | $"..." | LocalDataFlow.cs:403:13:403:36 | SSA def(sink69) | @@ -581,14 +686,17 @@ | LocalDataFlow.cs:407:20:407:37 | $"..." | LocalDataFlow.cs:407:9:407:37 | SSA def(nonSink0) | | LocalDataFlow.cs:407:22:407:26 | "test " | LocalDataFlow.cs:407:20:407:37 | $"..." | | LocalDataFlow.cs:407:28:407:35 | access to local variable nonSink0 | LocalDataFlow.cs:407:20:407:37 | $"..." | +| LocalDataFlow.cs:408:15:408:22 | [post] access to local variable nonSink0 | LocalDataFlow.cs:415:31:415:38 | access to local variable nonSink0 | | LocalDataFlow.cs:408:15:408:22 | access to local variable nonSink0 | LocalDataFlow.cs:415:31:415:38 | access to local variable nonSink0 | | LocalDataFlow.cs:411:13:411:34 | SSA def(sink70) | LocalDataFlow.cs:412:15:412:20 | access to local variable sink70 | | LocalDataFlow.cs:411:22:411:34 | ... = ... | LocalDataFlow.cs:411:13:411:34 | SSA def(sink70) | | LocalDataFlow.cs:411:30:411:34 | access to local variable sink0 | LocalDataFlow.cs:411:22:411:34 | ... = ... | +| LocalDataFlow.cs:412:15:412:20 | [post] access to local variable sink70 | LocalDataFlow.cs:419:13:419:18 | access to local variable sink70 | | LocalDataFlow.cs:412:15:412:20 | access to local variable sink70 | LocalDataFlow.cs:419:13:419:18 | access to local variable sink70 | | LocalDataFlow.cs:415:9:415:38 | SSA def(nonSink0) | LocalDataFlow.cs:416:15:416:22 | access to local variable nonSink0 | | LocalDataFlow.cs:415:20:415:38 | ... = ... | LocalDataFlow.cs:415:9:415:38 | SSA def(nonSink0) | | LocalDataFlow.cs:415:31:415:38 | access to local variable nonSink0 | LocalDataFlow.cs:415:20:415:38 | ... = ... | +| LocalDataFlow.cs:416:15:416:22 | [post] access to local variable nonSink0 | LocalDataFlow.cs:423:13:423:20 | access to local variable nonSink0 | | LocalDataFlow.cs:416:15:416:22 | access to local variable nonSink0 | LocalDataFlow.cs:423:13:423:20 | access to local variable nonSink0 | | LocalDataFlow.cs:419:13:419:18 | access to local variable sink70 | LocalDataFlow.cs:419:23:419:35 | SSA def(sink71) | | LocalDataFlow.cs:419:13:419:18 | access to local variable sink70 | LocalDataFlow.cs:427:17:427:22 | access to local variable sink70 | @@ -617,20 +725,30 @@ | SSA.cs:8:13:8:30 | SSA def(ssaSink0) | SSA.cs:9:15:9:22 | access to local variable ssaSink0 | | SSA.cs:8:24:8:30 | access to parameter tainted | SSA.cs:8:13:8:30 | SSA def(ssaSink0) | | SSA.cs:8:24:8:30 | access to parameter tainted | SSA.cs:58:27:58:33 | access to parameter tainted | +| SSA.cs:9:15:9:22 | [post] access to local variable ssaSink0 | SSA.cs:16:13:16:20 | access to local variable ssaSink0 | | SSA.cs:9:15:9:22 | access to local variable ssaSink0 | SSA.cs:16:13:16:20 | access to local variable ssaSink0 | | SSA.cs:12:13:12:33 | SSA def(nonSink0) | SSA.cs:13:15:13:22 | access to local variable nonSink0 | | SSA.cs:12:24:12:33 | access to parameter nonTainted | SSA.cs:12:13:12:33 | SSA def(nonSink0) | | SSA.cs:12:24:12:33 | access to parameter nonTainted | SSA.cs:23:13:23:22 | access to parameter nonTainted | +| SSA.cs:13:15:13:22 | [post] access to local variable nonSink0 | SSA.cs:19:13:19:20 | access to local variable nonSink0 | | SSA.cs:13:15:13:22 | access to local variable nonSink0 | SSA.cs:19:13:19:20 | access to local variable nonSink0 | +| SSA.cs:16:13:16:20 | [post] access to local variable ssaSink0 | SSA.cs:24:24:24:31 | access to local variable ssaSink0 | +| SSA.cs:16:13:16:20 | [post] access to local variable ssaSink0 | SSA.cs:37:24:37:31 | access to local variable ssaSink0 | +| SSA.cs:16:13:16:20 | [post] access to local variable ssaSink0 | SSA.cs:91:24:91:31 | access to local variable ssaSink0 | +| SSA.cs:16:13:16:20 | [post] access to local variable ssaSink0 | SSA.cs:117:36:117:43 | access to local variable ssaSink0 | | SSA.cs:16:13:16:20 | access to local variable ssaSink0 | SSA.cs:24:24:24:31 | access to local variable ssaSink0 | | SSA.cs:16:13:16:20 | access to local variable ssaSink0 | SSA.cs:37:24:37:31 | access to local variable ssaSink0 | | SSA.cs:16:13:16:20 | access to local variable ssaSink0 | SSA.cs:91:24:91:31 | access to local variable ssaSink0 | | SSA.cs:16:13:16:20 | access to local variable ssaSink0 | SSA.cs:117:36:117:43 | access to local variable ssaSink0 | +| SSA.cs:19:13:19:20 | [post] access to local variable nonSink0 | SSA.cs:30:24:30:31 | access to local variable nonSink0 | +| SSA.cs:19:13:19:20 | [post] access to local variable nonSink0 | SSA.cs:49:24:49:31 | access to local variable nonSink0 | +| SSA.cs:19:13:19:20 | [post] access to local variable nonSink0 | SSA.cs:63:23:63:30 | access to local variable nonSink0 | | SSA.cs:19:13:19:20 | access to local variable nonSink0 | SSA.cs:30:24:30:31 | access to local variable nonSink0 | | SSA.cs:19:13:19:20 | access to local variable nonSink0 | SSA.cs:49:24:49:31 | access to local variable nonSink0 | | SSA.cs:19:13:19:20 | access to local variable nonSink0 | SSA.cs:63:23:63:30 | access to local variable nonSink0 | | SSA.cs:22:16:22:28 | SSA def(ssaSink1) | SSA.cs:25:9:25:24 | SSA phi(ssaSink1) | | SSA.cs:22:27:22:28 | "" | SSA.cs:22:16:22:28 | SSA def(ssaSink1) | +| SSA.cs:23:13:23:22 | [post] access to parameter nonTainted | SSA.cs:29:13:29:22 | access to parameter nonTainted | | SSA.cs:23:13:23:22 | access to parameter nonTainted | SSA.cs:29:13:29:22 | access to parameter nonTainted | | SSA.cs:23:13:23:29 | access to property Length | SSA.cs:23:13:23:33 | ... > ... | | SSA.cs:24:13:24:31 | SSA def(ssaSink1) | SSA.cs:25:9:25:24 | SSA phi(ssaSink1) | @@ -641,6 +759,7 @@ | SSA.cs:25:9:25:24 | SSA phi(ssaSink1) | SSA.cs:25:15:25:22 | access to local variable ssaSink1 | | SSA.cs:28:16:28:28 | SSA def(nonSink1) | SSA.cs:31:9:31:24 | SSA phi(nonSink1) | | SSA.cs:28:27:28:28 | "" | SSA.cs:28:16:28:28 | SSA def(nonSink1) | +| SSA.cs:29:13:29:22 | [post] access to parameter nonTainted | SSA.cs:35:13:35:22 | access to parameter nonTainted | | SSA.cs:29:13:29:22 | access to parameter nonTainted | SSA.cs:35:13:35:22 | access to parameter nonTainted | | SSA.cs:29:13:29:29 | access to property Length | SSA.cs:29:13:29:33 | ... > ... | | SSA.cs:30:13:30:31 | SSA def(nonSink1) | SSA.cs:31:9:31:24 | SSA phi(nonSink1) | @@ -650,6 +769,8 @@ | SSA.cs:31:9:31:24 | SSA phi(nonSink1) | SSA.cs:31:15:31:22 | access to local variable nonSink1 | | SSA.cs:34:16:34:28 | SSA def(ssaSink2) | SSA.cs:43:9:43:24 | SSA phi(ssaSink2) | | SSA.cs:34:27:34:28 | "" | SSA.cs:34:16:34:28 | SSA def(ssaSink2) | +| SSA.cs:35:13:35:22 | [post] access to parameter nonTainted | SSA.cs:38:17:38:26 | access to parameter nonTainted | +| SSA.cs:35:13:35:22 | [post] access to parameter nonTainted | SSA.cs:47:13:47:22 | access to parameter nonTainted | | SSA.cs:35:13:35:22 | access to parameter nonTainted | SSA.cs:38:17:38:26 | access to parameter nonTainted | | SSA.cs:35:13:35:22 | access to parameter nonTainted | SSA.cs:47:13:47:22 | access to parameter nonTainted | | SSA.cs:35:13:35:29 | access to property Length | SSA.cs:35:13:35:33 | ... > ... | @@ -658,6 +779,7 @@ | SSA.cs:37:24:37:31 | access to local variable ssaSink0 | SSA.cs:37:13:37:31 | SSA def(ssaSink2) | | SSA.cs:37:24:37:31 | access to local variable ssaSink0 | SSA.cs:91:24:91:31 | access to local variable ssaSink0 | | SSA.cs:37:24:37:31 | access to local variable ssaSink0 | SSA.cs:117:36:117:43 | access to local variable ssaSink0 | +| SSA.cs:38:17:38:26 | [post] access to parameter nonTainted | SSA.cs:47:13:47:22 | access to parameter nonTainted | | SSA.cs:38:17:38:26 | access to parameter nonTainted | SSA.cs:47:13:47:22 | access to parameter nonTainted | | SSA.cs:38:17:38:33 | access to property Length | SSA.cs:38:17:38:37 | ... > ... | | SSA.cs:39:21:39:28 | access to local variable ssaSink2 | SSA.cs:43:9:43:24 | SSA phi(ssaSink2) | @@ -665,6 +787,8 @@ | SSA.cs:43:9:43:24 | SSA phi(ssaSink2) | SSA.cs:43:15:43:22 | access to local variable ssaSink2 | | SSA.cs:46:16:46:28 | SSA def(nonSink2) | SSA.cs:55:9:55:24 | SSA phi(nonSink2) | | SSA.cs:46:27:46:28 | "" | SSA.cs:46:16:46:28 | SSA def(nonSink2) | +| SSA.cs:47:13:47:22 | [post] access to parameter nonTainted | SSA.cs:50:17:50:26 | access to parameter nonTainted | +| SSA.cs:47:13:47:22 | [post] access to parameter nonTainted | SSA.cs:89:13:89:22 | access to parameter nonTainted | | SSA.cs:47:13:47:22 | access to parameter nonTainted | SSA.cs:50:17:50:26 | access to parameter nonTainted | | SSA.cs:47:13:47:22 | access to parameter nonTainted | SSA.cs:89:13:89:22 | access to parameter nonTainted | | SSA.cs:47:13:47:29 | access to property Length | SSA.cs:47:13:47:33 | ... > ... | @@ -672,6 +796,7 @@ | SSA.cs:49:13:49:31 | SSA def(nonSink2) | SSA.cs:53:21:53:28 | access to local variable nonSink2 | | SSA.cs:49:24:49:31 | access to local variable nonSink0 | SSA.cs:49:13:49:31 | SSA def(nonSink2) | | SSA.cs:49:24:49:31 | access to local variable nonSink0 | SSA.cs:63:23:63:30 | access to local variable nonSink0 | +| SSA.cs:50:17:50:26 | [post] access to parameter nonTainted | SSA.cs:89:13:89:22 | access to parameter nonTainted | | SSA.cs:50:17:50:26 | access to parameter nonTainted | SSA.cs:89:13:89:22 | access to parameter nonTainted | | SSA.cs:50:17:50:33 | access to property Length | SSA.cs:50:17:50:37 | ... > ... | | SSA.cs:51:21:51:28 | access to local variable nonSink2 | SSA.cs:55:9:55:24 | SSA phi(nonSink2) | @@ -685,6 +810,7 @@ | SSA.cs:63:23:63:30 | SSA def(nonSink0) | SSA.cs:64:15:64:22 | access to local variable nonSink0 | | SSA.cs:63:23:63:30 | access to local variable nonSink0 | SSA.cs:63:23:63:30 | SSA def(nonSink0) | | SSA.cs:67:9:67:12 | this access | SSA.cs:68:23:68:26 | this access | +| SSA.cs:67:9:67:14 | [post] access to field S | SSA.cs:68:23:68:28 | access to field S | | SSA.cs:67:9:67:14 | access to field S | SSA.cs:68:23:68:28 | access to field S | | SSA.cs:67:9:67:38 | SSA def(this.S.SsaFieldSink0) | SSA.cs:68:23:68:28 | SSA qualifier def(this.S.SsaFieldSink0) | | SSA.cs:67:32:67:38 | access to parameter tainted | SSA.cs:67:9:67:38 | SSA def(this.S.SsaFieldSink0) | @@ -696,6 +822,7 @@ | SSA.cs:69:15:69:18 | this access | SSA.cs:72:9:72:12 | this access | | SSA.cs:69:15:69:20 | access to field S | SSA.cs:72:9:72:14 | access to field S | | SSA.cs:72:9:72:12 | this access | SSA.cs:73:23:73:26 | this access | +| SSA.cs:72:9:72:14 | [post] access to field S | SSA.cs:73:23:73:28 | access to field S | | SSA.cs:72:9:72:14 | access to field S | SSA.cs:73:23:73:28 | access to field S | | SSA.cs:72:9:72:36 | SSA def(this.S.SsaFieldNonSink0) | SSA.cs:73:23:73:28 | SSA qualifier def(this.S.SsaFieldNonSink0) | | SSA.cs:72:35:72:36 | "" | SSA.cs:72:9:72:36 | SSA def(this.S.SsaFieldNonSink0) | @@ -709,9 +836,12 @@ | SSA.cs:77:20:77:26 | access to parameter tainted | SSA.cs:77:9:77:26 | SSA def(nonSink0) | | SSA.cs:77:20:77:26 | access to parameter tainted | SSA.cs:80:35:80:41 | access to parameter tainted | | SSA.cs:78:21:78:28 | SSA def(nonSink0) | SSA.cs:79:15:79:22 | access to local variable nonSink0 | +| SSA.cs:79:15:79:22 | [post] access to local variable nonSink0 | SSA.cs:104:24:104:31 | access to local variable nonSink0 | +| SSA.cs:79:15:79:22 | [post] access to local variable nonSink0 | SSA.cs:130:39:130:46 | access to local variable nonSink0 | | SSA.cs:79:15:79:22 | access to local variable nonSink0 | SSA.cs:104:24:104:31 | access to local variable nonSink0 | | SSA.cs:79:15:79:22 | access to local variable nonSink0 | SSA.cs:130:39:130:46 | access to local variable nonSink0 | | SSA.cs:80:9:80:12 | this access | SSA.cs:81:21:81:24 | this access | +| SSA.cs:80:9:80:14 | [post] access to field S | SSA.cs:81:21:81:26 | access to field S | | SSA.cs:80:9:80:14 | access to field S | SSA.cs:81:21:81:26 | access to field S | | SSA.cs:80:35:80:41 | access to parameter tainted | SSA.cs:83:35:83:41 | access to parameter tainted | | SSA.cs:81:21:81:24 | this access | SSA.cs:82:15:82:18 | this access | @@ -723,11 +853,14 @@ | SSA.cs:83:35:83:41 | access to parameter tainted | SSA.cs:83:9:83:41 | SSA def(this.S.SsaFieldNonSink0) | | SSA.cs:84:9:84:14 | SSA call def(this.S) | SSA.cs:85:15:85:20 | access to field S | | SSA.cs:84:9:84:14 | SSA qualifier def(this.S.SsaFieldNonSink0) | SSA.cs:85:15:85:37 | access to field SsaFieldNonSink0 | +| SSA.cs:84:9:84:14 | [post] this access | SSA.cs:85:15:85:18 | this access | | SSA.cs:84:9:84:14 | this access | SSA.cs:85:15:85:18 | this access | | SSA.cs:85:15:85:18 | this access | SSA.cs:114:9:114:12 | this access | | SSA.cs:85:15:85:20 | access to field S | SSA.cs:114:9:114:14 | access to field S | | SSA.cs:88:16:88:28 | SSA def(ssaSink4) | SSA.cs:97:9:97:32 | SSA phi(ssaSink4) | | SSA.cs:88:27:88:28 | "" | SSA.cs:88:16:88:28 | SSA def(ssaSink4) | +| SSA.cs:89:13:89:22 | [post] access to parameter nonTainted | SSA.cs:92:17:92:26 | access to parameter nonTainted | +| SSA.cs:89:13:89:22 | [post] access to parameter nonTainted | SSA.cs:102:13:102:22 | access to parameter nonTainted | | SSA.cs:89:13:89:22 | access to parameter nonTainted | SSA.cs:92:17:92:26 | access to parameter nonTainted | | SSA.cs:89:13:89:22 | access to parameter nonTainted | SSA.cs:102:13:102:22 | access to parameter nonTainted | | SSA.cs:89:13:89:29 | access to property Length | SSA.cs:89:13:89:33 | ... > ... | @@ -735,6 +868,7 @@ | SSA.cs:91:13:91:31 | SSA def(ssaSink4) | SSA.cs:95:21:95:28 | access to local variable ssaSink4 | | SSA.cs:91:24:91:31 | access to local variable ssaSink0 | SSA.cs:91:13:91:31 | SSA def(ssaSink4) | | SSA.cs:91:24:91:31 | access to local variable ssaSink0 | SSA.cs:117:36:117:43 | access to local variable ssaSink0 | +| SSA.cs:92:17:92:26 | [post] access to parameter nonTainted | SSA.cs:102:13:102:22 | access to parameter nonTainted | | SSA.cs:92:17:92:26 | access to parameter nonTainted | SSA.cs:102:13:102:22 | access to parameter nonTainted | | SSA.cs:92:17:92:33 | access to property Length | SSA.cs:92:17:92:37 | ... > ... | | SSA.cs:93:21:93:28 | access to local variable ssaSink4 | SSA.cs:97:9:97:32 | SSA phi(ssaSink4) | @@ -744,6 +878,8 @@ | SSA.cs:97:23:97:30 | access to local variable ssaSink4 | SSA.cs:97:23:97:30 | SSA def(ssaSink4) | | SSA.cs:101:16:101:28 | SSA def(nonSink3) | SSA.cs:110:9:110:32 | SSA phi(nonSink3) | | SSA.cs:101:27:101:28 | "" | SSA.cs:101:16:101:28 | SSA def(nonSink3) | +| SSA.cs:102:13:102:22 | [post] access to parameter nonTainted | SSA.cs:105:17:105:26 | access to parameter nonTainted | +| SSA.cs:102:13:102:22 | [post] access to parameter nonTainted | SSA.cs:115:13:115:22 | access to parameter nonTainted | | SSA.cs:102:13:102:22 | access to parameter nonTainted | SSA.cs:105:17:105:26 | access to parameter nonTainted | | SSA.cs:102:13:102:22 | access to parameter nonTainted | SSA.cs:115:13:115:22 | access to parameter nonTainted | | SSA.cs:102:13:102:29 | access to property Length | SSA.cs:102:13:102:33 | ... > ... | @@ -751,6 +887,7 @@ | SSA.cs:104:13:104:31 | SSA def(nonSink3) | SSA.cs:108:21:108:28 | access to local variable nonSink3 | | SSA.cs:104:24:104:31 | access to local variable nonSink0 | SSA.cs:104:13:104:31 | SSA def(nonSink3) | | SSA.cs:104:24:104:31 | access to local variable nonSink0 | SSA.cs:130:39:130:46 | access to local variable nonSink0 | +| SSA.cs:105:17:105:26 | [post] access to parameter nonTainted | SSA.cs:115:13:115:22 | access to parameter nonTainted | | SSA.cs:105:17:105:26 | access to parameter nonTainted | SSA.cs:115:13:115:22 | access to parameter nonTainted | | SSA.cs:105:17:105:33 | access to property Length | SSA.cs:105:17:105:37 | ... > ... | | SSA.cs:106:21:106:28 | access to local variable nonSink3 | SSA.cs:110:9:110:32 | SSA phi(nonSink3) | @@ -760,20 +897,27 @@ | SSA.cs:110:23:110:30 | access to local variable nonSink3 | SSA.cs:110:23:110:30 | SSA def(nonSink3) | | SSA.cs:114:9:114:12 | this access | SSA.cs:117:13:117:16 | this access | | SSA.cs:114:9:114:12 | this access | SSA.cs:123:23:123:26 | this access | +| SSA.cs:114:9:114:14 | [post] access to field S | SSA.cs:117:13:117:18 | access to field S | +| SSA.cs:114:9:114:14 | [post] access to field S | SSA.cs:123:23:123:28 | access to field S | | SSA.cs:114:9:114:14 | access to field S | SSA.cs:117:13:117:18 | access to field S | | SSA.cs:114:9:114:14 | access to field S | SSA.cs:123:23:123:28 | access to field S | | SSA.cs:114:9:114:33 | SSA def(this.S.SsaFieldSink1) | SSA.cs:123:9:123:30 | SSA phi(this.S.SsaFieldSink1) | | SSA.cs:114:32:114:33 | "" | SSA.cs:114:9:114:33 | SSA def(this.S.SsaFieldSink1) | +| SSA.cs:115:13:115:22 | [post] access to parameter nonTainted | SSA.cs:118:17:118:26 | access to parameter nonTainted | +| SSA.cs:115:13:115:22 | [post] access to parameter nonTainted | SSA.cs:128:13:128:22 | access to parameter nonTainted | | SSA.cs:115:13:115:22 | access to parameter nonTainted | SSA.cs:118:17:118:26 | access to parameter nonTainted | | SSA.cs:115:13:115:22 | access to parameter nonTainted | SSA.cs:128:13:128:22 | access to parameter nonTainted | | SSA.cs:115:13:115:29 | access to property Length | SSA.cs:115:13:115:33 | ... > ... | | SSA.cs:117:13:117:16 | this access | SSA.cs:119:21:119:24 | this access | | SSA.cs:117:13:117:16 | this access | SSA.cs:121:21:121:24 | this access | +| SSA.cs:117:13:117:18 | [post] access to field S | SSA.cs:119:21:119:26 | access to field S | +| SSA.cs:117:13:117:18 | [post] access to field S | SSA.cs:121:21:121:26 | access to field S | | SSA.cs:117:13:117:18 | access to field S | SSA.cs:119:21:119:26 | access to field S | | SSA.cs:117:13:117:18 | access to field S | SSA.cs:121:21:121:26 | access to field S | | SSA.cs:117:13:117:43 | SSA def(this.S.SsaFieldSink1) | SSA.cs:119:21:119:40 | access to field SsaFieldSink1 | | SSA.cs:117:13:117:43 | SSA def(this.S.SsaFieldSink1) | SSA.cs:121:21:121:40 | access to field SsaFieldSink1 | | SSA.cs:117:36:117:43 | access to local variable ssaSink0 | SSA.cs:117:13:117:43 | SSA def(this.S.SsaFieldSink1) | +| SSA.cs:118:17:118:26 | [post] access to parameter nonTainted | SSA.cs:128:13:128:22 | access to parameter nonTainted | | SSA.cs:118:17:118:26 | access to parameter nonTainted | SSA.cs:128:13:128:22 | access to parameter nonTainted | | SSA.cs:118:17:118:33 | access to property Length | SSA.cs:118:17:118:37 | ... > ... | | SSA.cs:119:21:119:24 | this access | SSA.cs:123:23:123:26 | this access | @@ -791,14 +935,19 @@ | SSA.cs:124:15:124:20 | access to field S | SSA.cs:127:9:127:14 | access to field S | | SSA.cs:127:9:127:12 | this access | SSA.cs:130:13:130:16 | this access | | SSA.cs:127:9:127:12 | this access | SSA.cs:136:23:136:26 | this access | +| SSA.cs:127:9:127:14 | [post] access to field S | SSA.cs:130:13:130:18 | access to field S | +| SSA.cs:127:9:127:14 | [post] access to field S | SSA.cs:136:23:136:28 | access to field S | | SSA.cs:127:9:127:14 | access to field S | SSA.cs:130:13:130:18 | access to field S | | SSA.cs:127:9:127:14 | access to field S | SSA.cs:136:23:136:28 | access to field S | | SSA.cs:127:9:127:36 | SSA def(this.S.SsaFieldNonSink0) | SSA.cs:136:9:136:30 | SSA phi(this.S.SsaFieldNonSink0) | | SSA.cs:127:35:127:36 | "" | SSA.cs:127:9:127:36 | SSA def(this.S.SsaFieldNonSink0) | +| SSA.cs:128:13:128:22 | [post] access to parameter nonTainted | SSA.cs:131:17:131:26 | access to parameter nonTainted | | SSA.cs:128:13:128:22 | access to parameter nonTainted | SSA.cs:131:17:131:26 | access to parameter nonTainted | | SSA.cs:128:13:128:29 | access to property Length | SSA.cs:128:13:128:33 | ... > ... | | SSA.cs:130:13:130:16 | this access | SSA.cs:132:21:132:24 | this access | | SSA.cs:130:13:130:16 | this access | SSA.cs:134:21:134:24 | this access | +| SSA.cs:130:13:130:18 | [post] access to field S | SSA.cs:132:21:132:26 | access to field S | +| SSA.cs:130:13:130:18 | [post] access to field S | SSA.cs:134:21:134:26 | access to field S | | SSA.cs:130:13:130:18 | access to field S | SSA.cs:132:21:132:26 | access to field S | | SSA.cs:130:13:130:18 | access to field S | SSA.cs:134:21:134:26 | access to field S | | SSA.cs:130:13:130:46 | SSA def(this.S.SsaFieldNonSink0) | SSA.cs:132:21:132:43 | access to field SsaFieldNonSink0 | @@ -847,7 +996,9 @@ | SSA.cs:174:20:174:20 | SSA phi(i) | SSA.cs:174:20:174:20 | access to parameter i | | SSA.cs:174:20:174:22 | ...-- | SSA.cs:174:20:174:26 | ... > ... | | SSA.cs:174:20:174:22 | SSA def(i) | SSA.cs:174:20:174:20 | SSA phi(i) | +| SSA.cs:176:21:176:28 | [post] access to local variable ssaSink5 | SSA.cs:177:21:177:28 | access to local variable ssaSink5 | | SSA.cs:176:21:176:28 | access to local variable ssaSink5 | SSA.cs:177:21:177:28 | access to local variable ssaSink5 | +| SSA.cs:177:21:177:28 | [post] access to local variable ssaSink5 | SSA.cs:176:21:176:28 | access to local variable ssaSink5 | | SSA.cs:177:21:177:28 | access to local variable ssaSink5 | SSA.cs:176:21:176:28 | access to local variable ssaSink5 | | SSA.cs:177:21:177:28 | access to local variable ssaSink5 | SSA.cs:180:9:180:24 | SSA phi(ssaSink5) | | SSA.cs:180:9:180:24 | SSA phi(ssaSink5) | SSA.cs:180:15:180:22 | access to local variable ssaSink5 | @@ -861,9 +1012,11 @@ | Splitting.cs:6:13:6:13 | access to parameter b | Splitting.cs:13:13:13:13 | [b (line 3): false] access to parameter b | | Splitting.cs:6:13:6:13 | access to parameter b | Splitting.cs:13:13:13:13 | [b (line 3): true] access to parameter b | | Splitting.cs:8:19:8:19 | [b (line 3): true] access to local variable x | Splitting.cs:9:17:9:17 | [b (line 3): true] access to local variable x | +| Splitting.cs:8:19:8:19 | [post] [b (line 3): true] access to local variable x | Splitting.cs:9:17:9:17 | [b (line 3): true] access to local variable x | | Splitting.cs:9:17:9:17 | [b (line 3): true] access to local variable x | Splitting.cs:9:17:9:25 | [b (line 3): true] ... == ... | | Splitting.cs:9:17:9:17 | [b (line 3): true] access to local variable x | Splitting.cs:12:15:12:15 | [b (line 3): true] access to local variable x | | Splitting.cs:12:15:12:15 | [b (line 3): true] access to local variable x | Splitting.cs:14:19:14:19 | access to local variable x | +| Splitting.cs:12:15:12:15 | [post] [b (line 3): true] access to local variable x | Splitting.cs:14:19:14:19 | access to local variable x | | Splitting.cs:17:18:17:18 | b | Splitting.cs:17:18:17:18 | b | | Splitting.cs:17:18:17:18 | b | Splitting.cs:20:13:20:13 | access to parameter b | | Splitting.cs:19:13:19:18 | SSA def(x) | Splitting.cs:22:19:22:19 | [b (line 17): true] access to local variable x | @@ -875,6 +1028,8 @@ | Splitting.cs:23:17:23:30 | [b (line 17): true] "taint source" | Splitting.cs:23:13:23:30 | [b (line 17): true] SSA def(x) | | Splitting.cs:25:15:25:15 | [b (line 17): false] access to local variable x | Splitting.cs:29:19:29:19 | access to local variable x | | Splitting.cs:25:15:25:15 | [b (line 17): true] access to local variable x | Splitting.cs:27:19:27:19 | access to local variable x | +| Splitting.cs:25:15:25:15 | [post] [b (line 17): false] access to local variable x | Splitting.cs:29:19:29:19 | access to local variable x | +| Splitting.cs:25:15:25:15 | [post] [b (line 17): true] access to local variable x | Splitting.cs:27:19:27:19 | access to local variable x | | Splitting.cs:32:18:32:18 | b | Splitting.cs:32:18:32:18 | b | | Splitting.cs:32:18:32:18 | b | Splitting.cs:35:13:35:13 | access to parameter b | | Splitting.cs:35:13:35:13 | access to parameter b | Splitting.cs:39:15:39:15 | [b (line 32): false] access to parameter b | @@ -885,6 +1040,8 @@ | Splitting.cs:37:13:37:15 | [b (line 32): true] "b" | Splitting.cs:37:9:37:15 | [b (line 32): true] SSA def(x) | | Splitting.cs:38:15:38:15 | [b (line 32): false] access to local variable x | Splitting.cs:40:23:40:23 | [b (line 32): false] access to local variable x | | Splitting.cs:38:15:38:15 | [b (line 32): true] access to local variable x | Splitting.cs:39:19:39:19 | [b (line 32): true] access to local variable x | +| Splitting.cs:38:15:38:15 | [post] [b (line 32): false] access to local variable x | Splitting.cs:40:23:40:23 | [b (line 32): false] access to local variable x | +| Splitting.cs:38:15:38:15 | [post] [b (line 32): true] access to local variable x | Splitting.cs:39:19:39:19 | [b (line 32): true] access to local variable x | | Splitting.cs:39:15:39:15 | [b (line 32): false] access to parameter b | Splitting.cs:39:15:39:25 | [b (line 32): false] ... ? ... : ... | | Splitting.cs:39:15:39:15 | [b (line 32): false] access to parameter b | Splitting.cs:42:13:42:13 | [b (line 32): false] access to parameter b | | Splitting.cs:39:15:39:15 | [b (line 32): true] access to parameter b | Splitting.cs:39:15:39:25 | [b (line 32): true] ... ? ... : ... | diff --git a/java/ql/src/semmle/code/java/dataflow/internal/DataFlowImpl.qll b/java/ql/src/semmle/code/java/dataflow/internal/DataFlowImpl.qll index 796c20b35e3..931ab2e63f1 100644 --- a/java/ql/src/semmle/code/java/dataflow/internal/DataFlowImpl.qll +++ b/java/ql/src/semmle/code/java/dataflow/internal/DataFlowImpl.qll @@ -278,10 +278,9 @@ private predicate nodeCandFwd1(Node node, boolean stored, Configuration config) ) or // read - exists(Node mid, Content f | - nodeCandFwd1(mid, true, config) and - read(mid, f, node) and - storeCandFwd1(f, unbind(config)) and + exists(Content f | + nodeCandFwd1Read(f, node, config) and + storeCandFwd1(f, config) and (stored = false or stored = true) and not inBarrier(node, config) ) @@ -308,9 +307,18 @@ private predicate nodeCandFwd1(Node node, boolean stored, Configuration config) ) } +pragma[nomagic] +private predicate nodeCandFwd1Read(Content f, Node node, Configuration config) { + exists(Node mid | + nodeCandFwd1(mid, true, config) and + read(mid, f, node) + ) +} + /** * Holds if `f` is the target of a store in the flow covered by `nodeCandFwd1`. */ +pragma[noinline] private predicate storeCandFwd1(Content f, Configuration config) { exists(Node mid, Node node | not fullBarrier(node, config) and @@ -358,10 +366,9 @@ private predicate nodeCand1(Node node, boolean stored, Configuration config) { ) or // store - exists(Node mid, Content f | - store(node, f, mid) and - readCand1(f, unbind(config)) and - nodeCand1(mid, true, config) and + exists(Content f | + nodeCand1Store(f, node, config) and + readCand1(f, config) and (stored = false or stored = true) ) or @@ -398,6 +405,7 @@ private predicate nodeCand1(Node node, boolean stored, Configuration config) { /** * Holds if `f` is the target of a read in the flow covered by `nodeCand1`. */ +pragma[noinline] private predicate readCand1(Content f, Configuration config) { exists(Node mid, Node node | useFieldFlow(config) and @@ -408,6 +416,15 @@ private predicate readCand1(Content f, Configuration config) { ) } +pragma[nomagic] +private predicate nodeCand1Store(Content f, Node node, Configuration config) { + exists(Node mid | + nodeCand1(mid, true, config) and + storeCandFwd1(f, unbind(config)) and + store(node, f, mid) + ) +} + private predicate throughFlowNodeCand(Node node, Configuration config) { nodeCand1(node, false, config) and not fullBarrier(node, config) and @@ -669,10 +686,9 @@ private predicate nodeCandFwd2(Node node, boolean fromArg, boolean stored, Confi ) or // read - exists(Node mid, Content f | - nodeCandFwd2(mid, fromArg, true, config) and - read(mid, f, node) and - storeCandFwd2(f, unbind(config)) and + exists(Content f | + nodeCandFwd2Read(f, node, fromArg, config) and + storeCandFwd2(f, config) and (stored = false or stored = true) ) or @@ -695,6 +711,7 @@ private predicate nodeCandFwd2(Node node, boolean fromArg, boolean stored, Confi /** * Holds if `f` is the target of a store in the flow covered by `nodeCandFwd2`. */ +pragma[noinline] private predicate storeCandFwd2(Content f, Configuration config) { exists(Node mid, Node node | useFieldFlow(config) and @@ -705,6 +722,15 @@ private predicate storeCandFwd2(Content f, Configuration config) { ) } +pragma[nomagic] +private predicate nodeCandFwd2Read(Content f, Node node, boolean fromArg, Configuration config) { + exists(Node mid | + nodeCandFwd2(mid, fromArg, true, config) and + read(mid, f, node) and + readCand1(f, unbind(config)) + ) +} + /** * Holds if `node` is part of a path from a source to a sink in the given * configuration taking simple call contexts into consideration. @@ -742,10 +768,9 @@ private predicate nodeCand2(Node node, boolean toReturn, boolean stored, Configu ) or // store - exists(Node mid, Content f | - store(node, f, mid) and - readCand2(f, unbind(config)) and - nodeCand2(mid, toReturn, true, config) and + exists(Content f | + nodeCand2Store(f, node, toReturn, config) and + readCand2(f, config) and (stored = false or stored = true) ) or @@ -776,6 +801,7 @@ private predicate nodeCand2(Node node, boolean toReturn, boolean stored, Configu /** * Holds if `f` is the target of a read in the flow covered by `nodeCand2`. */ +pragma[noinline] private predicate readCand2(Content f, Configuration config) { exists(Node mid, Node node | useFieldFlow(config) and @@ -786,16 +812,21 @@ private predicate readCand2(Content f, Configuration config) { ) } -pragma[nomagic] -private predicate storeCand(Content f, Configuration conf) { - exists(Node n1, Node n2 | - store(n1, f, n2) and - nodeCand2(n1, _, _, conf) and - nodeCand2(n2, _, _, unbind(conf)) +pragma[noinline] +private predicate nodeCand2Store(Content f, Node node, boolean toReturn, Configuration config) { + exists(Node mid | + store(node, f, mid) and + nodeCand2(mid, toReturn, true, config) ) } -private predicate readCand(Content f, Configuration conf) { readCand2(f, conf) } +pragma[nomagic] +private predicate storeCand(Content f, Configuration conf) { + exists(Node node | + nodeCand2Store(f, node, _, conf) and + nodeCand2(node, _, _, conf) + ) +} /** * Holds if `f` is the target of both a store and a read in the path graph @@ -804,7 +835,7 @@ private predicate readCand(Content f, Configuration conf) { readCand2(f, conf) } pragma[noinline] private predicate readStoreCand(Content f, Configuration conf) { storeCand(f, conf) and - readCand(f, conf) + readCand2(f, conf) } private predicate nodeCand(Node node, Configuration config) { nodeCand2(node, _, _, config) } @@ -1030,15 +1061,13 @@ private predicate flowCandFwd0(Node node, boolean fromArg, AccessPathFront apf, apf.headUsesContent(f) ) or - exists(Node mid, Content f, AccessPathFront apf0 | - flowCandFwd(mid, fromArg, apf0, config) and - read(mid, f, node) and - nodeCand(node, config) and - apf0.headUsesContent(f) and - consCandFwd(f, apf, unbind(config)) + exists(Content f | + flowCandFwdRead(f, node, fromArg, config) and + consCandFwd(f, apf, config) ) } +pragma[noinline] private predicate consCandFwd(Content f, AccessPathFront apf, Configuration config) { exists(Node mid, Node n | flowCandFwd(mid, _, apf, config) and @@ -1049,6 +1078,16 @@ private predicate consCandFwd(Content f, AccessPathFront apf, Configuration conf ) } +pragma[nomagic] +private predicate flowCandFwdRead(Content f, Node node, boolean fromArg, Configuration config) { + exists(Node mid, AccessPathFront apf | + flowCandFwd(mid, fromArg, apf, config) and + read(mid, f, node) and + apf.headUsesContent(f) and + nodeCand(node, unbind(config)) + ) +} + /** * Holds if data can flow from a source to `node` with the given `apf` and * from there flow to a sink. @@ -1139,6 +1178,7 @@ private predicate flowCandRead( ) } +pragma[nomagic] private predicate flowCandStore( Node node, Content f, boolean toReturn, AccessPathFront apf0, Configuration config ) { @@ -1148,6 +1188,7 @@ private predicate flowCandStore( ) } +pragma[noinline] private predicate consCand(Content f, AccessPathFront apf, Configuration config) { consCandFwd(f, apf, config) and exists(Node n, AccessPathFront apf0 | @@ -1672,6 +1713,7 @@ private predicate pathStep(PathNodeMid mid, Node node, CallContext cc, AccessPat valuePathThroughCallable(mid, node, cc) and ap = mid.getAp() } +pragma[noinline] private predicate contentReadStep(PathNodeMid mid, Node node, AccessPath ap) { exists(Content f, AccessPath ap0 | ap0 = mid.getAp() and diff --git a/java/ql/src/semmle/code/java/dataflow/internal/DataFlowImpl2.qll b/java/ql/src/semmle/code/java/dataflow/internal/DataFlowImpl2.qll index 796c20b35e3..931ab2e63f1 100644 --- a/java/ql/src/semmle/code/java/dataflow/internal/DataFlowImpl2.qll +++ b/java/ql/src/semmle/code/java/dataflow/internal/DataFlowImpl2.qll @@ -278,10 +278,9 @@ private predicate nodeCandFwd1(Node node, boolean stored, Configuration config) ) or // read - exists(Node mid, Content f | - nodeCandFwd1(mid, true, config) and - read(mid, f, node) and - storeCandFwd1(f, unbind(config)) and + exists(Content f | + nodeCandFwd1Read(f, node, config) and + storeCandFwd1(f, config) and (stored = false or stored = true) and not inBarrier(node, config) ) @@ -308,9 +307,18 @@ private predicate nodeCandFwd1(Node node, boolean stored, Configuration config) ) } +pragma[nomagic] +private predicate nodeCandFwd1Read(Content f, Node node, Configuration config) { + exists(Node mid | + nodeCandFwd1(mid, true, config) and + read(mid, f, node) + ) +} + /** * Holds if `f` is the target of a store in the flow covered by `nodeCandFwd1`. */ +pragma[noinline] private predicate storeCandFwd1(Content f, Configuration config) { exists(Node mid, Node node | not fullBarrier(node, config) and @@ -358,10 +366,9 @@ private predicate nodeCand1(Node node, boolean stored, Configuration config) { ) or // store - exists(Node mid, Content f | - store(node, f, mid) and - readCand1(f, unbind(config)) and - nodeCand1(mid, true, config) and + exists(Content f | + nodeCand1Store(f, node, config) and + readCand1(f, config) and (stored = false or stored = true) ) or @@ -398,6 +405,7 @@ private predicate nodeCand1(Node node, boolean stored, Configuration config) { /** * Holds if `f` is the target of a read in the flow covered by `nodeCand1`. */ +pragma[noinline] private predicate readCand1(Content f, Configuration config) { exists(Node mid, Node node | useFieldFlow(config) and @@ -408,6 +416,15 @@ private predicate readCand1(Content f, Configuration config) { ) } +pragma[nomagic] +private predicate nodeCand1Store(Content f, Node node, Configuration config) { + exists(Node mid | + nodeCand1(mid, true, config) and + storeCandFwd1(f, unbind(config)) and + store(node, f, mid) + ) +} + private predicate throughFlowNodeCand(Node node, Configuration config) { nodeCand1(node, false, config) and not fullBarrier(node, config) and @@ -669,10 +686,9 @@ private predicate nodeCandFwd2(Node node, boolean fromArg, boolean stored, Confi ) or // read - exists(Node mid, Content f | - nodeCandFwd2(mid, fromArg, true, config) and - read(mid, f, node) and - storeCandFwd2(f, unbind(config)) and + exists(Content f | + nodeCandFwd2Read(f, node, fromArg, config) and + storeCandFwd2(f, config) and (stored = false or stored = true) ) or @@ -695,6 +711,7 @@ private predicate nodeCandFwd2(Node node, boolean fromArg, boolean stored, Confi /** * Holds if `f` is the target of a store in the flow covered by `nodeCandFwd2`. */ +pragma[noinline] private predicate storeCandFwd2(Content f, Configuration config) { exists(Node mid, Node node | useFieldFlow(config) and @@ -705,6 +722,15 @@ private predicate storeCandFwd2(Content f, Configuration config) { ) } +pragma[nomagic] +private predicate nodeCandFwd2Read(Content f, Node node, boolean fromArg, Configuration config) { + exists(Node mid | + nodeCandFwd2(mid, fromArg, true, config) and + read(mid, f, node) and + readCand1(f, unbind(config)) + ) +} + /** * Holds if `node` is part of a path from a source to a sink in the given * configuration taking simple call contexts into consideration. @@ -742,10 +768,9 @@ private predicate nodeCand2(Node node, boolean toReturn, boolean stored, Configu ) or // store - exists(Node mid, Content f | - store(node, f, mid) and - readCand2(f, unbind(config)) and - nodeCand2(mid, toReturn, true, config) and + exists(Content f | + nodeCand2Store(f, node, toReturn, config) and + readCand2(f, config) and (stored = false or stored = true) ) or @@ -776,6 +801,7 @@ private predicate nodeCand2(Node node, boolean toReturn, boolean stored, Configu /** * Holds if `f` is the target of a read in the flow covered by `nodeCand2`. */ +pragma[noinline] private predicate readCand2(Content f, Configuration config) { exists(Node mid, Node node | useFieldFlow(config) and @@ -786,16 +812,21 @@ private predicate readCand2(Content f, Configuration config) { ) } -pragma[nomagic] -private predicate storeCand(Content f, Configuration conf) { - exists(Node n1, Node n2 | - store(n1, f, n2) and - nodeCand2(n1, _, _, conf) and - nodeCand2(n2, _, _, unbind(conf)) +pragma[noinline] +private predicate nodeCand2Store(Content f, Node node, boolean toReturn, Configuration config) { + exists(Node mid | + store(node, f, mid) and + nodeCand2(mid, toReturn, true, config) ) } -private predicate readCand(Content f, Configuration conf) { readCand2(f, conf) } +pragma[nomagic] +private predicate storeCand(Content f, Configuration conf) { + exists(Node node | + nodeCand2Store(f, node, _, conf) and + nodeCand2(node, _, _, conf) + ) +} /** * Holds if `f` is the target of both a store and a read in the path graph @@ -804,7 +835,7 @@ private predicate readCand(Content f, Configuration conf) { readCand2(f, conf) } pragma[noinline] private predicate readStoreCand(Content f, Configuration conf) { storeCand(f, conf) and - readCand(f, conf) + readCand2(f, conf) } private predicate nodeCand(Node node, Configuration config) { nodeCand2(node, _, _, config) } @@ -1030,15 +1061,13 @@ private predicate flowCandFwd0(Node node, boolean fromArg, AccessPathFront apf, apf.headUsesContent(f) ) or - exists(Node mid, Content f, AccessPathFront apf0 | - flowCandFwd(mid, fromArg, apf0, config) and - read(mid, f, node) and - nodeCand(node, config) and - apf0.headUsesContent(f) and - consCandFwd(f, apf, unbind(config)) + exists(Content f | + flowCandFwdRead(f, node, fromArg, config) and + consCandFwd(f, apf, config) ) } +pragma[noinline] private predicate consCandFwd(Content f, AccessPathFront apf, Configuration config) { exists(Node mid, Node n | flowCandFwd(mid, _, apf, config) and @@ -1049,6 +1078,16 @@ private predicate consCandFwd(Content f, AccessPathFront apf, Configuration conf ) } +pragma[nomagic] +private predicate flowCandFwdRead(Content f, Node node, boolean fromArg, Configuration config) { + exists(Node mid, AccessPathFront apf | + flowCandFwd(mid, fromArg, apf, config) and + read(mid, f, node) and + apf.headUsesContent(f) and + nodeCand(node, unbind(config)) + ) +} + /** * Holds if data can flow from a source to `node` with the given `apf` and * from there flow to a sink. @@ -1139,6 +1178,7 @@ private predicate flowCandRead( ) } +pragma[nomagic] private predicate flowCandStore( Node node, Content f, boolean toReturn, AccessPathFront apf0, Configuration config ) { @@ -1148,6 +1188,7 @@ private predicate flowCandStore( ) } +pragma[noinline] private predicate consCand(Content f, AccessPathFront apf, Configuration config) { consCandFwd(f, apf, config) and exists(Node n, AccessPathFront apf0 | @@ -1672,6 +1713,7 @@ private predicate pathStep(PathNodeMid mid, Node node, CallContext cc, AccessPat valuePathThroughCallable(mid, node, cc) and ap = mid.getAp() } +pragma[noinline] private predicate contentReadStep(PathNodeMid mid, Node node, AccessPath ap) { exists(Content f, AccessPath ap0 | ap0 = mid.getAp() and diff --git a/java/ql/src/semmle/code/java/dataflow/internal/DataFlowImpl3.qll b/java/ql/src/semmle/code/java/dataflow/internal/DataFlowImpl3.qll index 796c20b35e3..931ab2e63f1 100644 --- a/java/ql/src/semmle/code/java/dataflow/internal/DataFlowImpl3.qll +++ b/java/ql/src/semmle/code/java/dataflow/internal/DataFlowImpl3.qll @@ -278,10 +278,9 @@ private predicate nodeCandFwd1(Node node, boolean stored, Configuration config) ) or // read - exists(Node mid, Content f | - nodeCandFwd1(mid, true, config) and - read(mid, f, node) and - storeCandFwd1(f, unbind(config)) and + exists(Content f | + nodeCandFwd1Read(f, node, config) and + storeCandFwd1(f, config) and (stored = false or stored = true) and not inBarrier(node, config) ) @@ -308,9 +307,18 @@ private predicate nodeCandFwd1(Node node, boolean stored, Configuration config) ) } +pragma[nomagic] +private predicate nodeCandFwd1Read(Content f, Node node, Configuration config) { + exists(Node mid | + nodeCandFwd1(mid, true, config) and + read(mid, f, node) + ) +} + /** * Holds if `f` is the target of a store in the flow covered by `nodeCandFwd1`. */ +pragma[noinline] private predicate storeCandFwd1(Content f, Configuration config) { exists(Node mid, Node node | not fullBarrier(node, config) and @@ -358,10 +366,9 @@ private predicate nodeCand1(Node node, boolean stored, Configuration config) { ) or // store - exists(Node mid, Content f | - store(node, f, mid) and - readCand1(f, unbind(config)) and - nodeCand1(mid, true, config) and + exists(Content f | + nodeCand1Store(f, node, config) and + readCand1(f, config) and (stored = false or stored = true) ) or @@ -398,6 +405,7 @@ private predicate nodeCand1(Node node, boolean stored, Configuration config) { /** * Holds if `f` is the target of a read in the flow covered by `nodeCand1`. */ +pragma[noinline] private predicate readCand1(Content f, Configuration config) { exists(Node mid, Node node | useFieldFlow(config) and @@ -408,6 +416,15 @@ private predicate readCand1(Content f, Configuration config) { ) } +pragma[nomagic] +private predicate nodeCand1Store(Content f, Node node, Configuration config) { + exists(Node mid | + nodeCand1(mid, true, config) and + storeCandFwd1(f, unbind(config)) and + store(node, f, mid) + ) +} + private predicate throughFlowNodeCand(Node node, Configuration config) { nodeCand1(node, false, config) and not fullBarrier(node, config) and @@ -669,10 +686,9 @@ private predicate nodeCandFwd2(Node node, boolean fromArg, boolean stored, Confi ) or // read - exists(Node mid, Content f | - nodeCandFwd2(mid, fromArg, true, config) and - read(mid, f, node) and - storeCandFwd2(f, unbind(config)) and + exists(Content f | + nodeCandFwd2Read(f, node, fromArg, config) and + storeCandFwd2(f, config) and (stored = false or stored = true) ) or @@ -695,6 +711,7 @@ private predicate nodeCandFwd2(Node node, boolean fromArg, boolean stored, Confi /** * Holds if `f` is the target of a store in the flow covered by `nodeCandFwd2`. */ +pragma[noinline] private predicate storeCandFwd2(Content f, Configuration config) { exists(Node mid, Node node | useFieldFlow(config) and @@ -705,6 +722,15 @@ private predicate storeCandFwd2(Content f, Configuration config) { ) } +pragma[nomagic] +private predicate nodeCandFwd2Read(Content f, Node node, boolean fromArg, Configuration config) { + exists(Node mid | + nodeCandFwd2(mid, fromArg, true, config) and + read(mid, f, node) and + readCand1(f, unbind(config)) + ) +} + /** * Holds if `node` is part of a path from a source to a sink in the given * configuration taking simple call contexts into consideration. @@ -742,10 +768,9 @@ private predicate nodeCand2(Node node, boolean toReturn, boolean stored, Configu ) or // store - exists(Node mid, Content f | - store(node, f, mid) and - readCand2(f, unbind(config)) and - nodeCand2(mid, toReturn, true, config) and + exists(Content f | + nodeCand2Store(f, node, toReturn, config) and + readCand2(f, config) and (stored = false or stored = true) ) or @@ -776,6 +801,7 @@ private predicate nodeCand2(Node node, boolean toReturn, boolean stored, Configu /** * Holds if `f` is the target of a read in the flow covered by `nodeCand2`. */ +pragma[noinline] private predicate readCand2(Content f, Configuration config) { exists(Node mid, Node node | useFieldFlow(config) and @@ -786,16 +812,21 @@ private predicate readCand2(Content f, Configuration config) { ) } -pragma[nomagic] -private predicate storeCand(Content f, Configuration conf) { - exists(Node n1, Node n2 | - store(n1, f, n2) and - nodeCand2(n1, _, _, conf) and - nodeCand2(n2, _, _, unbind(conf)) +pragma[noinline] +private predicate nodeCand2Store(Content f, Node node, boolean toReturn, Configuration config) { + exists(Node mid | + store(node, f, mid) and + nodeCand2(mid, toReturn, true, config) ) } -private predicate readCand(Content f, Configuration conf) { readCand2(f, conf) } +pragma[nomagic] +private predicate storeCand(Content f, Configuration conf) { + exists(Node node | + nodeCand2Store(f, node, _, conf) and + nodeCand2(node, _, _, conf) + ) +} /** * Holds if `f` is the target of both a store and a read in the path graph @@ -804,7 +835,7 @@ private predicate readCand(Content f, Configuration conf) { readCand2(f, conf) } pragma[noinline] private predicate readStoreCand(Content f, Configuration conf) { storeCand(f, conf) and - readCand(f, conf) + readCand2(f, conf) } private predicate nodeCand(Node node, Configuration config) { nodeCand2(node, _, _, config) } @@ -1030,15 +1061,13 @@ private predicate flowCandFwd0(Node node, boolean fromArg, AccessPathFront apf, apf.headUsesContent(f) ) or - exists(Node mid, Content f, AccessPathFront apf0 | - flowCandFwd(mid, fromArg, apf0, config) and - read(mid, f, node) and - nodeCand(node, config) and - apf0.headUsesContent(f) and - consCandFwd(f, apf, unbind(config)) + exists(Content f | + flowCandFwdRead(f, node, fromArg, config) and + consCandFwd(f, apf, config) ) } +pragma[noinline] private predicate consCandFwd(Content f, AccessPathFront apf, Configuration config) { exists(Node mid, Node n | flowCandFwd(mid, _, apf, config) and @@ -1049,6 +1078,16 @@ private predicate consCandFwd(Content f, AccessPathFront apf, Configuration conf ) } +pragma[nomagic] +private predicate flowCandFwdRead(Content f, Node node, boolean fromArg, Configuration config) { + exists(Node mid, AccessPathFront apf | + flowCandFwd(mid, fromArg, apf, config) and + read(mid, f, node) and + apf.headUsesContent(f) and + nodeCand(node, unbind(config)) + ) +} + /** * Holds if data can flow from a source to `node` with the given `apf` and * from there flow to a sink. @@ -1139,6 +1178,7 @@ private predicate flowCandRead( ) } +pragma[nomagic] private predicate flowCandStore( Node node, Content f, boolean toReturn, AccessPathFront apf0, Configuration config ) { @@ -1148,6 +1188,7 @@ private predicate flowCandStore( ) } +pragma[noinline] private predicate consCand(Content f, AccessPathFront apf, Configuration config) { consCandFwd(f, apf, config) and exists(Node n, AccessPathFront apf0 | @@ -1672,6 +1713,7 @@ private predicate pathStep(PathNodeMid mid, Node node, CallContext cc, AccessPat valuePathThroughCallable(mid, node, cc) and ap = mid.getAp() } +pragma[noinline] private predicate contentReadStep(PathNodeMid mid, Node node, AccessPath ap) { exists(Content f, AccessPath ap0 | ap0 = mid.getAp() and diff --git a/java/ql/src/semmle/code/java/dataflow/internal/DataFlowImpl4.qll b/java/ql/src/semmle/code/java/dataflow/internal/DataFlowImpl4.qll index 796c20b35e3..931ab2e63f1 100644 --- a/java/ql/src/semmle/code/java/dataflow/internal/DataFlowImpl4.qll +++ b/java/ql/src/semmle/code/java/dataflow/internal/DataFlowImpl4.qll @@ -278,10 +278,9 @@ private predicate nodeCandFwd1(Node node, boolean stored, Configuration config) ) or // read - exists(Node mid, Content f | - nodeCandFwd1(mid, true, config) and - read(mid, f, node) and - storeCandFwd1(f, unbind(config)) and + exists(Content f | + nodeCandFwd1Read(f, node, config) and + storeCandFwd1(f, config) and (stored = false or stored = true) and not inBarrier(node, config) ) @@ -308,9 +307,18 @@ private predicate nodeCandFwd1(Node node, boolean stored, Configuration config) ) } +pragma[nomagic] +private predicate nodeCandFwd1Read(Content f, Node node, Configuration config) { + exists(Node mid | + nodeCandFwd1(mid, true, config) and + read(mid, f, node) + ) +} + /** * Holds if `f` is the target of a store in the flow covered by `nodeCandFwd1`. */ +pragma[noinline] private predicate storeCandFwd1(Content f, Configuration config) { exists(Node mid, Node node | not fullBarrier(node, config) and @@ -358,10 +366,9 @@ private predicate nodeCand1(Node node, boolean stored, Configuration config) { ) or // store - exists(Node mid, Content f | - store(node, f, mid) and - readCand1(f, unbind(config)) and - nodeCand1(mid, true, config) and + exists(Content f | + nodeCand1Store(f, node, config) and + readCand1(f, config) and (stored = false or stored = true) ) or @@ -398,6 +405,7 @@ private predicate nodeCand1(Node node, boolean stored, Configuration config) { /** * Holds if `f` is the target of a read in the flow covered by `nodeCand1`. */ +pragma[noinline] private predicate readCand1(Content f, Configuration config) { exists(Node mid, Node node | useFieldFlow(config) and @@ -408,6 +416,15 @@ private predicate readCand1(Content f, Configuration config) { ) } +pragma[nomagic] +private predicate nodeCand1Store(Content f, Node node, Configuration config) { + exists(Node mid | + nodeCand1(mid, true, config) and + storeCandFwd1(f, unbind(config)) and + store(node, f, mid) + ) +} + private predicate throughFlowNodeCand(Node node, Configuration config) { nodeCand1(node, false, config) and not fullBarrier(node, config) and @@ -669,10 +686,9 @@ private predicate nodeCandFwd2(Node node, boolean fromArg, boolean stored, Confi ) or // read - exists(Node mid, Content f | - nodeCandFwd2(mid, fromArg, true, config) and - read(mid, f, node) and - storeCandFwd2(f, unbind(config)) and + exists(Content f | + nodeCandFwd2Read(f, node, fromArg, config) and + storeCandFwd2(f, config) and (stored = false or stored = true) ) or @@ -695,6 +711,7 @@ private predicate nodeCandFwd2(Node node, boolean fromArg, boolean stored, Confi /** * Holds if `f` is the target of a store in the flow covered by `nodeCandFwd2`. */ +pragma[noinline] private predicate storeCandFwd2(Content f, Configuration config) { exists(Node mid, Node node | useFieldFlow(config) and @@ -705,6 +722,15 @@ private predicate storeCandFwd2(Content f, Configuration config) { ) } +pragma[nomagic] +private predicate nodeCandFwd2Read(Content f, Node node, boolean fromArg, Configuration config) { + exists(Node mid | + nodeCandFwd2(mid, fromArg, true, config) and + read(mid, f, node) and + readCand1(f, unbind(config)) + ) +} + /** * Holds if `node` is part of a path from a source to a sink in the given * configuration taking simple call contexts into consideration. @@ -742,10 +768,9 @@ private predicate nodeCand2(Node node, boolean toReturn, boolean stored, Configu ) or // store - exists(Node mid, Content f | - store(node, f, mid) and - readCand2(f, unbind(config)) and - nodeCand2(mid, toReturn, true, config) and + exists(Content f | + nodeCand2Store(f, node, toReturn, config) and + readCand2(f, config) and (stored = false or stored = true) ) or @@ -776,6 +801,7 @@ private predicate nodeCand2(Node node, boolean toReturn, boolean stored, Configu /** * Holds if `f` is the target of a read in the flow covered by `nodeCand2`. */ +pragma[noinline] private predicate readCand2(Content f, Configuration config) { exists(Node mid, Node node | useFieldFlow(config) and @@ -786,16 +812,21 @@ private predicate readCand2(Content f, Configuration config) { ) } -pragma[nomagic] -private predicate storeCand(Content f, Configuration conf) { - exists(Node n1, Node n2 | - store(n1, f, n2) and - nodeCand2(n1, _, _, conf) and - nodeCand2(n2, _, _, unbind(conf)) +pragma[noinline] +private predicate nodeCand2Store(Content f, Node node, boolean toReturn, Configuration config) { + exists(Node mid | + store(node, f, mid) and + nodeCand2(mid, toReturn, true, config) ) } -private predicate readCand(Content f, Configuration conf) { readCand2(f, conf) } +pragma[nomagic] +private predicate storeCand(Content f, Configuration conf) { + exists(Node node | + nodeCand2Store(f, node, _, conf) and + nodeCand2(node, _, _, conf) + ) +} /** * Holds if `f` is the target of both a store and a read in the path graph @@ -804,7 +835,7 @@ private predicate readCand(Content f, Configuration conf) { readCand2(f, conf) } pragma[noinline] private predicate readStoreCand(Content f, Configuration conf) { storeCand(f, conf) and - readCand(f, conf) + readCand2(f, conf) } private predicate nodeCand(Node node, Configuration config) { nodeCand2(node, _, _, config) } @@ -1030,15 +1061,13 @@ private predicate flowCandFwd0(Node node, boolean fromArg, AccessPathFront apf, apf.headUsesContent(f) ) or - exists(Node mid, Content f, AccessPathFront apf0 | - flowCandFwd(mid, fromArg, apf0, config) and - read(mid, f, node) and - nodeCand(node, config) and - apf0.headUsesContent(f) and - consCandFwd(f, apf, unbind(config)) + exists(Content f | + flowCandFwdRead(f, node, fromArg, config) and + consCandFwd(f, apf, config) ) } +pragma[noinline] private predicate consCandFwd(Content f, AccessPathFront apf, Configuration config) { exists(Node mid, Node n | flowCandFwd(mid, _, apf, config) and @@ -1049,6 +1078,16 @@ private predicate consCandFwd(Content f, AccessPathFront apf, Configuration conf ) } +pragma[nomagic] +private predicate flowCandFwdRead(Content f, Node node, boolean fromArg, Configuration config) { + exists(Node mid, AccessPathFront apf | + flowCandFwd(mid, fromArg, apf, config) and + read(mid, f, node) and + apf.headUsesContent(f) and + nodeCand(node, unbind(config)) + ) +} + /** * Holds if data can flow from a source to `node` with the given `apf` and * from there flow to a sink. @@ -1139,6 +1178,7 @@ private predicate flowCandRead( ) } +pragma[nomagic] private predicate flowCandStore( Node node, Content f, boolean toReturn, AccessPathFront apf0, Configuration config ) { @@ -1148,6 +1188,7 @@ private predicate flowCandStore( ) } +pragma[noinline] private predicate consCand(Content f, AccessPathFront apf, Configuration config) { consCandFwd(f, apf, config) and exists(Node n, AccessPathFront apf0 | @@ -1672,6 +1713,7 @@ private predicate pathStep(PathNodeMid mid, Node node, CallContext cc, AccessPat valuePathThroughCallable(mid, node, cc) and ap = mid.getAp() } +pragma[noinline] private predicate contentReadStep(PathNodeMid mid, Node node, AccessPath ap) { exists(Content f, AccessPath ap0 | ap0 = mid.getAp() and diff --git a/java/ql/src/semmle/code/java/dataflow/internal/DataFlowImpl5.qll b/java/ql/src/semmle/code/java/dataflow/internal/DataFlowImpl5.qll index 796c20b35e3..931ab2e63f1 100644 --- a/java/ql/src/semmle/code/java/dataflow/internal/DataFlowImpl5.qll +++ b/java/ql/src/semmle/code/java/dataflow/internal/DataFlowImpl5.qll @@ -278,10 +278,9 @@ private predicate nodeCandFwd1(Node node, boolean stored, Configuration config) ) or // read - exists(Node mid, Content f | - nodeCandFwd1(mid, true, config) and - read(mid, f, node) and - storeCandFwd1(f, unbind(config)) and + exists(Content f | + nodeCandFwd1Read(f, node, config) and + storeCandFwd1(f, config) and (stored = false or stored = true) and not inBarrier(node, config) ) @@ -308,9 +307,18 @@ private predicate nodeCandFwd1(Node node, boolean stored, Configuration config) ) } +pragma[nomagic] +private predicate nodeCandFwd1Read(Content f, Node node, Configuration config) { + exists(Node mid | + nodeCandFwd1(mid, true, config) and + read(mid, f, node) + ) +} + /** * Holds if `f` is the target of a store in the flow covered by `nodeCandFwd1`. */ +pragma[noinline] private predicate storeCandFwd1(Content f, Configuration config) { exists(Node mid, Node node | not fullBarrier(node, config) and @@ -358,10 +366,9 @@ private predicate nodeCand1(Node node, boolean stored, Configuration config) { ) or // store - exists(Node mid, Content f | - store(node, f, mid) and - readCand1(f, unbind(config)) and - nodeCand1(mid, true, config) and + exists(Content f | + nodeCand1Store(f, node, config) and + readCand1(f, config) and (stored = false or stored = true) ) or @@ -398,6 +405,7 @@ private predicate nodeCand1(Node node, boolean stored, Configuration config) { /** * Holds if `f` is the target of a read in the flow covered by `nodeCand1`. */ +pragma[noinline] private predicate readCand1(Content f, Configuration config) { exists(Node mid, Node node | useFieldFlow(config) and @@ -408,6 +416,15 @@ private predicate readCand1(Content f, Configuration config) { ) } +pragma[nomagic] +private predicate nodeCand1Store(Content f, Node node, Configuration config) { + exists(Node mid | + nodeCand1(mid, true, config) and + storeCandFwd1(f, unbind(config)) and + store(node, f, mid) + ) +} + private predicate throughFlowNodeCand(Node node, Configuration config) { nodeCand1(node, false, config) and not fullBarrier(node, config) and @@ -669,10 +686,9 @@ private predicate nodeCandFwd2(Node node, boolean fromArg, boolean stored, Confi ) or // read - exists(Node mid, Content f | - nodeCandFwd2(mid, fromArg, true, config) and - read(mid, f, node) and - storeCandFwd2(f, unbind(config)) and + exists(Content f | + nodeCandFwd2Read(f, node, fromArg, config) and + storeCandFwd2(f, config) and (stored = false or stored = true) ) or @@ -695,6 +711,7 @@ private predicate nodeCandFwd2(Node node, boolean fromArg, boolean stored, Confi /** * Holds if `f` is the target of a store in the flow covered by `nodeCandFwd2`. */ +pragma[noinline] private predicate storeCandFwd2(Content f, Configuration config) { exists(Node mid, Node node | useFieldFlow(config) and @@ -705,6 +722,15 @@ private predicate storeCandFwd2(Content f, Configuration config) { ) } +pragma[nomagic] +private predicate nodeCandFwd2Read(Content f, Node node, boolean fromArg, Configuration config) { + exists(Node mid | + nodeCandFwd2(mid, fromArg, true, config) and + read(mid, f, node) and + readCand1(f, unbind(config)) + ) +} + /** * Holds if `node` is part of a path from a source to a sink in the given * configuration taking simple call contexts into consideration. @@ -742,10 +768,9 @@ private predicate nodeCand2(Node node, boolean toReturn, boolean stored, Configu ) or // store - exists(Node mid, Content f | - store(node, f, mid) and - readCand2(f, unbind(config)) and - nodeCand2(mid, toReturn, true, config) and + exists(Content f | + nodeCand2Store(f, node, toReturn, config) and + readCand2(f, config) and (stored = false or stored = true) ) or @@ -776,6 +801,7 @@ private predicate nodeCand2(Node node, boolean toReturn, boolean stored, Configu /** * Holds if `f` is the target of a read in the flow covered by `nodeCand2`. */ +pragma[noinline] private predicate readCand2(Content f, Configuration config) { exists(Node mid, Node node | useFieldFlow(config) and @@ -786,16 +812,21 @@ private predicate readCand2(Content f, Configuration config) { ) } -pragma[nomagic] -private predicate storeCand(Content f, Configuration conf) { - exists(Node n1, Node n2 | - store(n1, f, n2) and - nodeCand2(n1, _, _, conf) and - nodeCand2(n2, _, _, unbind(conf)) +pragma[noinline] +private predicate nodeCand2Store(Content f, Node node, boolean toReturn, Configuration config) { + exists(Node mid | + store(node, f, mid) and + nodeCand2(mid, toReturn, true, config) ) } -private predicate readCand(Content f, Configuration conf) { readCand2(f, conf) } +pragma[nomagic] +private predicate storeCand(Content f, Configuration conf) { + exists(Node node | + nodeCand2Store(f, node, _, conf) and + nodeCand2(node, _, _, conf) + ) +} /** * Holds if `f` is the target of both a store and a read in the path graph @@ -804,7 +835,7 @@ private predicate readCand(Content f, Configuration conf) { readCand2(f, conf) } pragma[noinline] private predicate readStoreCand(Content f, Configuration conf) { storeCand(f, conf) and - readCand(f, conf) + readCand2(f, conf) } private predicate nodeCand(Node node, Configuration config) { nodeCand2(node, _, _, config) } @@ -1030,15 +1061,13 @@ private predicate flowCandFwd0(Node node, boolean fromArg, AccessPathFront apf, apf.headUsesContent(f) ) or - exists(Node mid, Content f, AccessPathFront apf0 | - flowCandFwd(mid, fromArg, apf0, config) and - read(mid, f, node) and - nodeCand(node, config) and - apf0.headUsesContent(f) and - consCandFwd(f, apf, unbind(config)) + exists(Content f | + flowCandFwdRead(f, node, fromArg, config) and + consCandFwd(f, apf, config) ) } +pragma[noinline] private predicate consCandFwd(Content f, AccessPathFront apf, Configuration config) { exists(Node mid, Node n | flowCandFwd(mid, _, apf, config) and @@ -1049,6 +1078,16 @@ private predicate consCandFwd(Content f, AccessPathFront apf, Configuration conf ) } +pragma[nomagic] +private predicate flowCandFwdRead(Content f, Node node, boolean fromArg, Configuration config) { + exists(Node mid, AccessPathFront apf | + flowCandFwd(mid, fromArg, apf, config) and + read(mid, f, node) and + apf.headUsesContent(f) and + nodeCand(node, unbind(config)) + ) +} + /** * Holds if data can flow from a source to `node` with the given `apf` and * from there flow to a sink. @@ -1139,6 +1178,7 @@ private predicate flowCandRead( ) } +pragma[nomagic] private predicate flowCandStore( Node node, Content f, boolean toReturn, AccessPathFront apf0, Configuration config ) { @@ -1148,6 +1188,7 @@ private predicate flowCandStore( ) } +pragma[noinline] private predicate consCand(Content f, AccessPathFront apf, Configuration config) { consCandFwd(f, apf, config) and exists(Node n, AccessPathFront apf0 | @@ -1672,6 +1713,7 @@ private predicate pathStep(PathNodeMid mid, Node node, CallContext cc, AccessPat valuePathThroughCallable(mid, node, cc) and ap = mid.getAp() } +pragma[noinline] private predicate contentReadStep(PathNodeMid mid, Node node, AccessPath ap) { exists(Content f, AccessPath ap0 | ap0 = mid.getAp() and