Skip to content

Commit 75075b5

Browse files
committed
wip
1 parent e1afff1 commit 75075b5

8 files changed

Lines changed: 121 additions & 68 deletions

File tree

csharp/ql/lib/semmle/code/csharp/Assignable.qll

Lines changed: 21 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -204,7 +204,7 @@ private class RefArg extends AssignableAccess {
204204
AssignableDefinition getAnAnalyzableRefDef(Parameter p) {
205205
this.isAnalyzable(p) and
206206
result.getTarget() = p and
207-
not result = TImplicitParameterDefinition(_, _)
207+
not result = TImplicitParameterDefinition(_)
208208
}
209209

210210
/**
@@ -272,10 +272,7 @@ module AssignableInternal {
272272
or
273273
def = TAssignOperationDefinition(result)
274274
or
275-
exists(Parameter p |
276-
def = TImplicitParameterDefinition(p, true) and
277-
result = p.getDefaultValue()
278-
)
275+
def = TParameterDefaultDefinition(_, result)
279276
}
280277

281278
/** A local variable declaration at the top-level of a pattern. */
@@ -309,20 +306,21 @@ module AssignableInternal {
309306
not lvde instanceof TopLevelPatternDecl and
310307
not lvde.isOutArgument()
311308
} or
312-
TImplicitParameterDefinition(Parameter p, boolean isDefault) {
309+
TImplicitParameterDefinition(Parameter p) {
313310
exists(Callable c | p = c.getAParameter() |
314311
c.hasBody()
315312
or
316-
// Same as `c.(Constructor).hasInitializer()`, but avoids negative recursion warning
317-
c.getAChildExpr() instanceof @constructor_init_expr
318-
) and
319-
(
320-
isDefault = false
321-
or
322-
p.hasDefaultValue() and
323-
isDefault = true
313+
c.(Constructor).hasInitializer()
324314
)
325315
} or
316+
TParameterDefaultDefinition(Parameter p, Expr default) {
317+
exists(Callable c | p = c.getAParameter() |
318+
c.hasBody()
319+
or
320+
c.(Constructor).hasInitializer()
321+
) and
322+
default = p.getDefaultValue()
323+
} or
326324
TAddressOfDefinition(AddressOfExpr aoe) or
327325
TPatternDefinition(TopLevelPatternDecl tlpd) or
328326
TAssignOperationDefinition(AssignOperation ao) {
@@ -361,7 +359,7 @@ module AssignableInternal {
361359
or
362360
def = any(AssignableDefinitions::InitializerDefinition init | result = init.getAssignable())
363361
or
364-
def = TImplicitParameterDefinition(result, _)
362+
def = TParameterDefaultDefinition(result, _)
365363
}
366364

367365
// Not defined by dispatch in order to avoid too conservative negative recursion error
@@ -681,7 +679,7 @@ module AssignableDefinitions {
681679
class ImplicitParameterDefinition extends AssignableDefinition, TImplicitParameterDefinition {
682680
Parameter p;
683681

684-
ImplicitParameterDefinition() { this = TImplicitParameterDefinition(p, false) }
682+
ImplicitParameterDefinition() { this = TImplicitParameterDefinition(p) }
685683

686684
/** Gets the underlying parameter. */
687685
Parameter getParameter() { result = p }
@@ -702,26 +700,27 @@ module AssignableDefinitions {
702700
/**
703701
* A default value assigned to a parameter.
704702
*/
705-
class ParameterDefaultDefinition extends AssignableDefinition, TImplicitParameterDefinition {
703+
class ParameterDefaultDefinition extends AssignableDefinition, TParameterDefaultDefinition {
706704
Parameter p;
705+
Expr default;
707706

708-
ParameterDefaultDefinition() { this = TImplicitParameterDefinition(p, true) }
707+
ParameterDefaultDefinition() { this = TParameterDefaultDefinition(p, default) }
709708

710709
/** Gets the underlying parameter. */
711710
Parameter getParameter() { result = p }
712711

713712
/** Gets the default value expression for the parameter. */
714-
Expr getDefaultValue() { result = p.getDefaultValue() }
713+
Expr getDefaultValue() { result = default }
715714

716-
override Expr getSource() { result = p.getDefaultValue() }
715+
override Expr getSource() { result = default }
717716

718-
override Expr getElement() { result = p.getDefaultValue() }
717+
override Expr getElement() { result = default }
719718

720719
override Callable getEnclosingCallable() { result = p.getCallable() }
721720

722721
override string toString() { result = p.toString() + " = ..." }
723722

724-
override Location getLocation() { result = p.getDefaultValue().getLocation() }
723+
override Location getLocation() { result = default.getLocation() }
725724
}
726725

727726
/**

csharp/ql/lib/semmle/code/csharp/controlflow/ControlFlowGraph.qll

Lines changed: 24 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -73,16 +73,19 @@ private module Ast implements AstSig<Location> {
7373
private AstNode getParent(AstNode n) { n = getChild(result, _) }
7474

7575
Callable getEnclosingCallable(AstNode node) {
76-
result = node.(ControlFlowElement).getEnclosingCallable()
77-
or
78-
result.(ObjectInitMethod).initializes(getParent*(node))
79-
or
80-
Initializers::staticMemberInitializer(result, getParent*(node))
81-
or
82-
result = node.(Parameter).getCallable()
83-
or
84-
not skipControlFlow(node) and
85-
getParent*(node) = any(Parameter p | result = p.getCallable()).getDefaultValue()
76+
result.isUnboundDeclaration() and
77+
(
78+
result = node.(ControlFlowElement).getEnclosingCallable()
79+
or
80+
result.(ObjectInitMethod).initializes(getParent*(node))
81+
or
82+
Initializers::staticMemberInitializer(result, getParent*(node))
83+
or
84+
result = node.(Parameter).getCallable()
85+
or
86+
not skipControlFlow(node) and
87+
getParent*(node) = any(Parameter p | result = p.getCallable()).getDefaultValue()
88+
)
8689
}
8790

8891
class Callable = CS::Callable;
@@ -97,11 +100,14 @@ private module Ast implements AstSig<Location> {
97100
class Parameter extends ParameterFinal {
98101
Expr getDefaultValue() {
99102
result = super.getDefaultValue() and
100-
getCompilation(result.getFile()) = getCompilation(this.getFile())
103+
getCompilation(result) = getCompilation(this)
101104
}
102105
}
103106

104-
Parameter callableGetParameter(Callable c, int i) { result = c.getParameter(i) }
107+
Parameter callableGetParameter(Callable c, int i) {
108+
not skipControlFlow(result) and
109+
result = c.getParameter(i)
110+
}
105111

106112
class Stmt = CS::Stmt;
107113

@@ -250,9 +256,11 @@ private class CompilationExt extends TCompilationExt {
250256
}
251257

252258
/** Gets the compilation that source file `f` belongs to. */
253-
private CompilationExt getCompilation(File f) {
259+
bindingset[e]
260+
pragma[inline_late]
261+
private CompilationExt getCompilation(Element e) {
254262
exists(Compilation c |
255-
f = c.getAFileCompiled() and
263+
e.getALocation().getFile() = c.getAFileCompiled() and
256264
result = TCompilation(c)
257265
)
258266
or
@@ -438,7 +446,7 @@ private module Input implements InputSig1, InputSig2 {
438446
pragma[nomagic]
439447
Ast::AstNode callableGetBodyPart(Callable c, CallableContext ctx, int index) {
440448
not Ast::skipControlFlow(result) and
441-
ctx = getCompilation(result.getFile()) and
449+
ctx = getCompilation(result) and
442450
(
443451
result = Initializers::initializedInstanceMemberOrder(c, index)
444452
or
@@ -465,7 +473,7 @@ private module Input implements InputSig1, InputSig2 {
465473
pragma[nomagic]
466474
Ast::Parameter callableGetParameter(Callable c, CallableContext ctx, int index) {
467475
result = Ast::callableGetParameter(c, index) and
468-
ctx = getCompilation(result.getFile())
476+
ctx = getCompilation(result)
469477
}
470478

471479
private Expr getQualifier(QualifiableExpr qe) {

csharp/ql/test/library-tests/controlflow/graph/NodeGraph.expected

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5197,7 +5197,9 @@
51975197
| MultiImplementationA.cs:7:33:7:36 | null | MultiImplementationA.cs:7:27:7:37 | throw ...; | |
51985198
| MultiImplementationA.cs:7:41:7:43 | Entry | MultiImplementationA.cs:7:41:7:43 | value | |
51995199
| MultiImplementationA.cs:7:41:7:43 | Exceptional Exit | MultiImplementationA.cs:7:41:7:43 | Exit | |
5200+
| MultiImplementationA.cs:7:41:7:43 | Normal Exit | MultiImplementationA.cs:7:41:7:43 | Exit | |
52005201
| MultiImplementationA.cs:7:41:7:43 | value | MultiImplementationA.cs:7:45:7:59 | {...} | |
5202+
| MultiImplementationA.cs:7:41:7:43 | value | MultiImplementationB.cs:4:43:4:45 | {...} | |
52015203
| MultiImplementationA.cs:7:45:7:59 | {...} | MultiImplementationA.cs:7:47:7:57 | Before throw ...; | |
52025204
| MultiImplementationA.cs:7:47:7:57 | Before throw ...; | MultiImplementationA.cs:7:53:7:56 | null | |
52035205
| MultiImplementationA.cs:7:47:7:57 | throw ...; | MultiImplementationA.cs:7:41:7:43 | Exceptional Exit | exception |
@@ -5221,12 +5223,16 @@
52215223
| MultiImplementationA.cs:13:16:13:20 | Before ... = ... | MultiImplementationA.cs:13:16:13:16 | Before access to field F | |
52225224
| MultiImplementationA.cs:13:20:13:20 | 0 | MultiImplementationA.cs:13:16:13:20 | ... = ... | |
52235225
| MultiImplementationA.cs:14:25:14:25 | i | MultiImplementationA.cs:14:31:14:31 | access to parameter i | |
5226+
| MultiImplementationA.cs:14:25:14:25 | i | MultiImplementationB.cs:12:31:12:40 | Before throw ... | |
52245227
| MultiImplementationA.cs:14:31:14:31 | Entry | MultiImplementationA.cs:14:25:14:25 | i | |
5228+
| MultiImplementationA.cs:14:31:14:31 | Exceptional Exit | MultiImplementationA.cs:14:31:14:31 | Exit | |
52255229
| MultiImplementationA.cs:14:31:14:31 | Normal Exit | MultiImplementationA.cs:14:31:14:31 | Exit | |
52265230
| MultiImplementationA.cs:14:31:14:31 | access to parameter i | MultiImplementationA.cs:14:31:14:31 | Normal Exit | |
52275231
| MultiImplementationA.cs:15:31:15:31 | s | MultiImplementationA.cs:15:40:15:52 | {...} | |
52285232
| MultiImplementationA.cs:15:31:15:31 | s | MultiImplementationA.cs:15:54:15:56 | value | |
5233+
| MultiImplementationA.cs:15:31:15:31 | s | MultiImplementationB.cs:13:40:13:54 | {...} | |
52295234
| MultiImplementationA.cs:15:36:15:38 | Entry | MultiImplementationA.cs:15:31:15:31 | s | |
5235+
| MultiImplementationA.cs:15:36:15:38 | Exceptional Exit | MultiImplementationA.cs:15:36:15:38 | Exit | |
52305236
| MultiImplementationA.cs:15:36:15:38 | Normal Exit | MultiImplementationA.cs:15:36:15:38 | Exit | |
52315237
| MultiImplementationA.cs:15:40:15:52 | {...} | MultiImplementationA.cs:15:42:15:50 | Before return ...; | |
52325238
| MultiImplementationA.cs:15:42:15:50 | Before return ...; | MultiImplementationA.cs:15:49:15:49 | access to parameter s | |
@@ -5235,14 +5241,18 @@
52355241
| MultiImplementationA.cs:15:54:15:56 | Entry | MultiImplementationA.cs:15:31:15:31 | s | |
52365242
| MultiImplementationA.cs:15:54:15:56 | Normal Exit | MultiImplementationA.cs:15:54:15:56 | Exit | |
52375243
| MultiImplementationA.cs:15:54:15:56 | value | MultiImplementationA.cs:15:58:15:60 | {...} | |
5244+
| MultiImplementationA.cs:15:54:15:56 | value | MultiImplementationB.cs:13:60:13:62 | {...} | |
52385245
| MultiImplementationA.cs:15:58:15:60 | {...} | MultiImplementationA.cs:15:54:15:56 | Normal Exit | |
52395246
| MultiImplementationA.cs:16:17:16:18 | Entry | MultiImplementationA.cs:16:24:16:24 | i | |
52405247
| MultiImplementationA.cs:16:17:16:18 | Normal Exit | MultiImplementationA.cs:16:17:16:18 | Exit | |
52415248
| MultiImplementationA.cs:16:24:16:24 | After i [match] | MultiImplementationA.cs:17:5:19:5 | {...} | |
5249+
| MultiImplementationA.cs:16:24:16:24 | After i [match] | MultiImplementationB.cs:15:5:17:5 | {...} | |
52425250
| MultiImplementationA.cs:16:24:16:24 | After i [no-match] | MultiImplementationA.cs:16:28:16:28 | 0 | |
5251+
| MultiImplementationA.cs:16:24:16:24 | After i [no-match] | MultiImplementationB.cs:14:28:14:28 | 1 | |
52435252
| MultiImplementationA.cs:16:24:16:24 | i | MultiImplementationA.cs:16:24:16:24 | After i [match] | match |
52445253
| MultiImplementationA.cs:16:24:16:24 | i | MultiImplementationA.cs:16:24:16:24 | After i [no-match] | no-match |
52455254
| MultiImplementationA.cs:16:28:16:28 | 0 | MultiImplementationA.cs:17:5:19:5 | {...} | |
5255+
| MultiImplementationA.cs:16:28:16:28 | 0 | MultiImplementationB.cs:15:5:17:5 | {...} | |
52465256
| MultiImplementationA.cs:17:5:19:5 | After {...} | MultiImplementationA.cs:16:17:16:18 | Normal Exit | |
52475257
| MultiImplementationA.cs:17:5:19:5 | {...} | MultiImplementationA.cs:18:9:18:22 | M2(...) | |
52485258
| MultiImplementationA.cs:18:9:18:22 | Entry | MultiImplementationA.cs:18:21:18:21 | 0 | |
@@ -5254,11 +5264,13 @@
52545264
| MultiImplementationA.cs:20:12:20:13 | Before call to constructor Object | MultiImplementationA.cs:20:12:20:13 | call to constructor Object | |
52555265
| MultiImplementationA.cs:20:12:20:13 | Before call to method <object initializer> | MultiImplementationA.cs:20:12:20:13 | this access | |
52565266
| MultiImplementationA.cs:20:12:20:13 | Entry | MultiImplementationA.cs:20:19:20:19 | i | |
5267+
| MultiImplementationA.cs:20:12:20:13 | Exceptional Exit | MultiImplementationA.cs:20:12:20:13 | Exit | |
52575268
| MultiImplementationA.cs:20:12:20:13 | Normal Exit | MultiImplementationA.cs:20:12:20:13 | Exit | |
52585269
| MultiImplementationA.cs:20:12:20:13 | call to constructor Object | MultiImplementationA.cs:20:12:20:13 | After call to constructor Object | |
52595270
| MultiImplementationA.cs:20:12:20:13 | call to method <object initializer> | MultiImplementationA.cs:20:12:20:13 | After call to method <object initializer> | |
52605271
| MultiImplementationA.cs:20:12:20:13 | this access | MultiImplementationA.cs:20:12:20:13 | call to method <object initializer> | |
52615272
| MultiImplementationA.cs:20:19:20:19 | i | MultiImplementationA.cs:20:12:20:13 | Before call to method <object initializer> | |
5273+
| MultiImplementationA.cs:20:19:20:19 | i | MultiImplementationB.cs:18:12:18:13 | Before call to method <object initializer> | |
52625274
| MultiImplementationA.cs:20:22:20:31 | After {...} | MultiImplementationA.cs:20:12:20:13 | Normal Exit | |
52635275
| MultiImplementationA.cs:20:22:20:31 | {...} | MultiImplementationA.cs:20:24:20:29 | ...; | |
52645276
| MultiImplementationA.cs:20:24:20:24 | After access to field F | MultiImplementationA.cs:20:28:20:28 | access to parameter i | |
@@ -5285,8 +5297,10 @@
52855297
| MultiImplementationA.cs:22:6:22:7 | Normal Exit | MultiImplementationA.cs:22:6:22:7 | Exit | |
52865298
| MultiImplementationA.cs:22:11:22:13 | {...} | MultiImplementationA.cs:22:6:22:7 | Normal Exit | |
52875299
| MultiImplementationA.cs:23:28:23:35 | Entry | MultiImplementationA.cs:23:44:23:44 | i | |
5300+
| MultiImplementationA.cs:23:28:23:35 | Exceptional Exit | MultiImplementationA.cs:23:28:23:35 | Exit | |
52885301
| MultiImplementationA.cs:23:28:23:35 | Normal Exit | MultiImplementationA.cs:23:28:23:35 | Exit | |
52895302
| MultiImplementationA.cs:23:44:23:44 | i | MultiImplementationA.cs:23:50:23:53 | null | |
5303+
| MultiImplementationA.cs:23:44:23:44 | i | MultiImplementationB.cs:21:50:21:59 | Before throw ... | |
52905304
| MultiImplementationA.cs:23:50:23:53 | null | MultiImplementationA.cs:23:28:23:35 | Normal Exit | |
52915305
| MultiImplementationA.cs:24:16:24:16 | After access to property P | MultiImplementationA.cs:24:34:24:34 | 0 | |
52925306
| MultiImplementationA.cs:24:16:24:16 | Before access to property P | MultiImplementationA.cs:24:16:24:16 | this access | |
@@ -5350,6 +5364,7 @@
53505364
| MultiImplementationB.cs:4:27:4:35 | Before return ...; | MultiImplementationB.cs:4:34:4:34 | 1 | |
53515365
| MultiImplementationB.cs:4:27:4:35 | return ...; | MultiImplementationA.cs:7:21:7:23 | Normal Exit | return |
53525366
| MultiImplementationB.cs:4:34:4:34 | 1 | MultiImplementationB.cs:4:27:4:35 | return ...; | |
5367+
| MultiImplementationB.cs:4:43:4:45 | {...} | MultiImplementationA.cs:7:41:7:43 | Normal Exit | |
53535368
| MultiImplementationB.cs:5:23:5:23 | 2 | MultiImplementationA.cs:8:16:8:16 | Normal Exit | |
53545369
| MultiImplementationB.cs:11:16:11:16 | After access to field F | MultiImplementationB.cs:11:20:11:20 | 1 | |
53555370
| MultiImplementationB.cs:11:16:11:16 | Before access to field F | MultiImplementationB.cs:11:16:11:16 | this access | |
@@ -5359,11 +5374,35 @@
53595374
| MultiImplementationB.cs:11:16:11:20 | After ... = ... | MultiImplementationB.cs:22:32:22:34 | Before ... = ... | |
53605375
| MultiImplementationB.cs:11:16:11:20 | Before ... = ... | MultiImplementationB.cs:11:16:11:16 | Before access to field F | |
53615376
| MultiImplementationB.cs:11:20:11:20 | 1 | MultiImplementationB.cs:11:16:11:20 | ... = ... | |
5377+
| MultiImplementationB.cs:12:31:12:40 | Before throw ... | MultiImplementationB.cs:12:37:12:40 | null | |
5378+
| MultiImplementationB.cs:12:31:12:40 | throw ... | MultiImplementationA.cs:14:31:14:31 | Exceptional Exit | exception |
5379+
| MultiImplementationB.cs:12:37:12:40 | null | MultiImplementationB.cs:12:31:12:40 | throw ... | |
5380+
| MultiImplementationB.cs:13:40:13:54 | {...} | MultiImplementationB.cs:13:42:13:52 | Before throw ...; | |
5381+
| MultiImplementationB.cs:13:42:13:52 | Before throw ...; | MultiImplementationB.cs:13:48:13:51 | null | |
5382+
| MultiImplementationB.cs:13:42:13:52 | throw ...; | MultiImplementationA.cs:15:36:15:38 | Exceptional Exit | exception |
5383+
| MultiImplementationB.cs:13:48:13:51 | null | MultiImplementationB.cs:13:42:13:52 | throw ...; | |
5384+
| MultiImplementationB.cs:13:60:13:62 | {...} | MultiImplementationA.cs:15:54:15:56 | Normal Exit | |
5385+
| MultiImplementationB.cs:14:28:14:28 | 1 | MultiImplementationA.cs:17:5:19:5 | {...} | |
5386+
| MultiImplementationB.cs:14:28:14:28 | 1 | MultiImplementationB.cs:15:5:17:5 | {...} | |
5387+
| MultiImplementationB.cs:15:5:17:5 | After {...} | MultiImplementationA.cs:16:17:16:18 | Normal Exit | |
5388+
| MultiImplementationB.cs:15:5:17:5 | {...} | MultiImplementationB.cs:16:9:16:31 | M2(...) | |
53625389
| MultiImplementationB.cs:16:9:16:31 | Entry | MultiImplementationB.cs:16:21:16:30 | Before throw ... | |
53635390
| MultiImplementationB.cs:16:9:16:31 | Exceptional Exit | MultiImplementationB.cs:16:9:16:31 | Exit | |
5391+
| MultiImplementationB.cs:16:9:16:31 | M2(...) | MultiImplementationB.cs:15:5:17:5 | After {...} | |
53645392
| MultiImplementationB.cs:16:21:16:30 | Before throw ... | MultiImplementationB.cs:16:27:16:30 | null | |
53655393
| MultiImplementationB.cs:16:21:16:30 | throw ... | MultiImplementationB.cs:16:9:16:31 | Exceptional Exit | exception |
53665394
| MultiImplementationB.cs:16:27:16:30 | null | MultiImplementationB.cs:16:21:16:30 | throw ... | |
5395+
| MultiImplementationB.cs:18:12:18:13 | After call to constructor Object | MultiImplementationB.cs:18:22:18:36 | {...} | |
5396+
| MultiImplementationB.cs:18:12:18:13 | After call to method <object initializer> | MultiImplementationB.cs:18:12:18:13 | Before call to constructor Object | |
5397+
| MultiImplementationB.cs:18:12:18:13 | Before call to constructor Object | MultiImplementationB.cs:18:12:18:13 | call to constructor Object | |
5398+
| MultiImplementationB.cs:18:12:18:13 | Before call to method <object initializer> | MultiImplementationB.cs:18:12:18:13 | this access | |
5399+
| MultiImplementationB.cs:18:12:18:13 | call to constructor Object | MultiImplementationB.cs:18:12:18:13 | After call to constructor Object | |
5400+
| MultiImplementationB.cs:18:12:18:13 | call to method <object initializer> | MultiImplementationB.cs:18:12:18:13 | After call to method <object initializer> | |
5401+
| MultiImplementationB.cs:18:12:18:13 | this access | MultiImplementationB.cs:18:12:18:13 | call to method <object initializer> | |
5402+
| MultiImplementationB.cs:18:22:18:36 | {...} | MultiImplementationB.cs:18:24:18:34 | Before throw ...; | |
5403+
| MultiImplementationB.cs:18:24:18:34 | Before throw ...; | MultiImplementationB.cs:18:30:18:33 | null | |
5404+
| MultiImplementationB.cs:18:24:18:34 | throw ...; | MultiImplementationA.cs:20:12:20:13 | Exceptional Exit | exception |
5405+
| MultiImplementationB.cs:18:30:18:33 | null | MultiImplementationB.cs:18:24:18:34 | throw ...; | |
53675406
| MultiImplementationB.cs:19:19:19:22 | After call to constructor C2 | MultiImplementationB.cs:19:27:19:29 | {...} | |
53685407
| MultiImplementationB.cs:19:19:19:22 | Before call to constructor C2 | MultiImplementationB.cs:19:24:19:24 | 1 | |
53695408
| MultiImplementationB.cs:19:19:19:22 | call to constructor C2 | MultiImplementationB.cs:19:19:19:22 | After call to constructor C2 | |
@@ -5373,6 +5412,9 @@
53735412
| MultiImplementationB.cs:20:13:20:23 | Before throw ...; | MultiImplementationB.cs:20:19:20:22 | null | |
53745413
| MultiImplementationB.cs:20:13:20:23 | throw ...; | MultiImplementationA.cs:22:6:22:7 | Exceptional Exit | exception |
53755414
| MultiImplementationB.cs:20:19:20:22 | null | MultiImplementationB.cs:20:13:20:23 | throw ...; | |
5415+
| MultiImplementationB.cs:21:50:21:59 | Before throw ... | MultiImplementationB.cs:21:56:21:59 | null | |
5416+
| MultiImplementationB.cs:21:50:21:59 | throw ... | MultiImplementationA.cs:23:28:23:35 | Exceptional Exit | exception |
5417+
| MultiImplementationB.cs:21:56:21:59 | null | MultiImplementationB.cs:21:50:21:59 | throw ... | |
53765418
| MultiImplementationB.cs:22:16:22:16 | After access to property P | MultiImplementationB.cs:22:34:22:34 | 1 | |
53775419
| MultiImplementationB.cs:22:16:22:16 | Before access to property P | MultiImplementationB.cs:22:16:22:16 | this access | |
53785420
| MultiImplementationB.cs:22:16:22:16 | access to property P | MultiImplementationB.cs:22:16:22:16 | After access to property P | |

0 commit comments

Comments
 (0)