Skip to content

Commit 515d6b6

Browse files
committed
C#: Detect constantly failing assertions in the CFG
1 parent acea4dd commit 515d6b6

File tree

6 files changed

+32
-66
lines changed

6 files changed

+32
-66
lines changed

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

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1763,6 +1763,7 @@ module ControlFlow {
17631763
*/
17641764
private module NonReturning {
17651765
private import semmle.code.csharp.ExprOrStmtParent
1766+
private import semmle.code.csharp.commons.Assertions
17661767
private import semmle.code.csharp.frameworks.System
17671768

17681769
/** A call that definitely does not return (conservative analysis). */
@@ -1774,6 +1775,11 @@ module ControlFlow {
17741775
private class ExitingCall extends NonReturningCall {
17751776
ExitingCall() {
17761777
this.getTarget() instanceof ExitingCallable
1778+
or
1779+
exists(AssertMethod m |
1780+
m = this.(FailingAssertion).getAssertMethod() |
1781+
not exists(m.getExceptionClass())
1782+
)
17771783
}
17781784

17791785
override ExitCompletion getACompletion() { any() }
@@ -1784,6 +1790,11 @@ module ControlFlow {
17841790

17851791
ThrowingCall() {
17861792
c = this.getTarget().(ThrowingCallable).getACallCompletion()
1793+
or
1794+
exists(AssertMethod m |
1795+
m = this.(FailingAssertion).getAssertMethod() |
1796+
c.getExceptionClass() = m.getExceptionClass()
1797+
)
17871798
}
17881799

17891800
override ThrowCompletion getACompletion() { result = c }

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

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -193,10 +193,10 @@
193193
| ExitMethods.cs:97:9:97:39 | return ...; | ExitMethods.cs:95:16:95:34 | exit ExtensionMethodCall | 2 |
194194
| ExitMethods.cs:97:34:97:34 | 0 | ExitMethods.cs:97:34:97:34 | 0 | 1 |
195195
| ExitMethods.cs:97:38:97:38 | 1 | ExitMethods.cs:97:38:97:38 | 1 | 1 |
196-
| ExitMethods.cs:100:17:100:32 | enter FailingAssertion | ExitMethods.cs:100:17:100:32 | exit FailingAssertion | 10 |
197-
| ExitMethods.cs:106:17:106:33 | enter FailingAssertion2 | ExitMethods.cs:106:17:106:33 | exit FailingAssertion2 | 10 |
196+
| ExitMethods.cs:100:17:100:32 | enter FailingAssertion | ExitMethods.cs:100:17:100:32 | exit FailingAssertion | 6 |
197+
| ExitMethods.cs:106:17:106:33 | enter FailingAssertion2 | ExitMethods.cs:106:17:106:33 | exit FailingAssertion2 | 6 |
198198
| ExitMethods.cs:112:10:112:20 | enter AssertFalse | ExitMethods.cs:112:10:112:20 | exit AssertFalse | 4 |
199-
| ExitMethods.cs:114:17:114:33 | enter FailingAssertion3 | ExitMethods.cs:114:17:114:33 | exit FailingAssertion3 | 11 |
199+
| ExitMethods.cs:114:17:114:33 | enter FailingAssertion3 | ExitMethods.cs:114:17:114:33 | exit FailingAssertion3 | 7 |
200200
| Extensions.cs:5:23:5:29 | enter ToInt32 | Extensions.cs:5:23:5:29 | exit ToInt32 | 6 |
201201
| Extensions.cs:10:24:10:29 | enter ToBool | Extensions.cs:10:24:10:29 | exit ToBool | 7 |
202202
| Extensions.cs:15:23:15:33 | enter CallToInt32 | Extensions.cs:15:23:15:33 | exit CallToInt32 | 4 |

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

Lines changed: 6 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -712,37 +712,25 @@
712712
| post | ExitMethods.cs:97:16:97:30 | call to method Contains | ExitMethods.cs:97:27:97:29 | - |
713713
| post | ExitMethods.cs:97:16:97:38 | ... ? ... : ... | ExitMethods.cs:96:5:98:5 | {...} |
714714
| post | ExitMethods.cs:97:27:97:29 | - | ExitMethods.cs:97:16:97:16 | access to parameter s |
715-
| post | ExitMethods.cs:100:17:100:32 | exit FailingAssertion | ExitMethods.cs:103:13:103:17 | Int32 x = ... |
715+
| post | ExitMethods.cs:100:17:100:32 | exit FailingAssertion | ExitMethods.cs:102:9:102:28 | call to method IsTrue |
716716
| post | ExitMethods.cs:101:5:104:5 | {...} | ExitMethods.cs:100:17:100:32 | enter FailingAssertion |
717717
| post | ExitMethods.cs:102:9:102:28 | call to method IsTrue | ExitMethods.cs:102:23:102:27 | false |
718718
| post | ExitMethods.cs:102:9:102:29 | ...; | ExitMethods.cs:101:5:104:5 | {...} |
719719
| post | ExitMethods.cs:102:23:102:27 | false | ExitMethods.cs:102:9:102:29 | ...; |
720-
| post | ExitMethods.cs:103:9:103:18 | ... ...; | ExitMethods.cs:102:9:102:28 | call to method IsTrue |
721-
| post | ExitMethods.cs:103:13:103:13 | access to local variable x | ExitMethods.cs:103:9:103:18 | ... ...; |
722-
| post | ExitMethods.cs:103:13:103:17 | Int32 x = ... | ExitMethods.cs:103:17:103:17 | 0 |
723-
| post | ExitMethods.cs:103:17:103:17 | 0 | ExitMethods.cs:103:13:103:13 | access to local variable x |
724-
| post | ExitMethods.cs:106:17:106:33 | exit FailingAssertion2 | ExitMethods.cs:109:13:109:17 | Int32 x = ... |
720+
| post | ExitMethods.cs:106:17:106:33 | exit FailingAssertion2 | ExitMethods.cs:108:9:108:26 | call to method FailingAssertion |
725721
| post | ExitMethods.cs:107:5:110:5 | {...} | ExitMethods.cs:106:17:106:33 | enter FailingAssertion2 |
726722
| post | ExitMethods.cs:108:9:108:26 | call to method FailingAssertion | ExitMethods.cs:108:9:108:26 | this access |
727723
| post | ExitMethods.cs:108:9:108:26 | this access | ExitMethods.cs:108:9:108:27 | ...; |
728724
| post | ExitMethods.cs:108:9:108:27 | ...; | ExitMethods.cs:107:5:110:5 | {...} |
729-
| post | ExitMethods.cs:109:9:109:18 | ... ...; | ExitMethods.cs:108:9:108:26 | call to method FailingAssertion |
730-
| post | ExitMethods.cs:109:13:109:13 | access to local variable x | ExitMethods.cs:109:9:109:18 | ... ...; |
731-
| post | ExitMethods.cs:109:13:109:17 | Int32 x = ... | ExitMethods.cs:109:17:109:17 | 0 |
732-
| post | ExitMethods.cs:109:17:109:17 | 0 | ExitMethods.cs:109:13:109:13 | access to local variable x |
733725
| post | ExitMethods.cs:112:10:112:20 | exit AssertFalse | ExitMethods.cs:112:33:112:49 | call to method IsFalse |
734726
| post | ExitMethods.cs:112:33:112:49 | call to method IsFalse | ExitMethods.cs:112:48:112:48 | access to parameter b |
735727
| post | ExitMethods.cs:112:48:112:48 | access to parameter b | ExitMethods.cs:112:10:112:20 | enter AssertFalse |
736-
| post | ExitMethods.cs:114:17:114:33 | exit FailingAssertion3 | ExitMethods.cs:117:13:117:17 | Int32 x = ... |
728+
| post | ExitMethods.cs:114:17:114:33 | exit FailingAssertion3 | ExitMethods.cs:116:9:116:25 | call to method AssertFalse |
737729
| post | ExitMethods.cs:115:5:118:5 | {...} | ExitMethods.cs:114:17:114:33 | enter FailingAssertion3 |
738730
| post | ExitMethods.cs:116:9:116:25 | call to method AssertFalse | ExitMethods.cs:116:21:116:24 | true |
739731
| post | ExitMethods.cs:116:9:116:25 | this access | ExitMethods.cs:116:9:116:26 | ...; |
740732
| post | ExitMethods.cs:116:9:116:26 | ...; | ExitMethods.cs:115:5:118:5 | {...} |
741733
| post | ExitMethods.cs:116:21:116:24 | true | ExitMethods.cs:116:9:116:25 | this access |
742-
| post | ExitMethods.cs:117:9:117:18 | ... ...; | ExitMethods.cs:116:9:116:25 | call to method AssertFalse |
743-
| post | ExitMethods.cs:117:13:117:13 | access to local variable x | ExitMethods.cs:117:9:117:18 | ... ...; |
744-
| post | ExitMethods.cs:117:13:117:17 | Int32 x = ... | ExitMethods.cs:117:17:117:17 | 0 |
745-
| post | ExitMethods.cs:117:17:117:17 | 0 | ExitMethods.cs:117:13:117:13 | access to local variable x |
746734
| post | Extensions.cs:5:23:5:29 | exit ToInt32 | Extensions.cs:7:9:7:30 | return ...; |
747735
| post | Extensions.cs:6:5:8:5 | {...} | Extensions.cs:5:23:5:29 | enter ToInt32 |
748736
| post | Extensions.cs:7:9:7:30 | return ...; | Extensions.cs:7:16:7:29 | call to method Parse |
@@ -2853,35 +2841,23 @@
28532841
| pre | ExitMethods.cs:97:27:97:29 | - | ExitMethods.cs:97:16:97:30 | call to method Contains |
28542842
| pre | ExitMethods.cs:100:17:100:32 | enter FailingAssertion | ExitMethods.cs:101:5:104:5 | {...} |
28552843
| pre | ExitMethods.cs:101:5:104:5 | {...} | ExitMethods.cs:102:9:102:29 | ...; |
2856-
| pre | ExitMethods.cs:102:9:102:28 | call to method IsTrue | ExitMethods.cs:103:9:103:18 | ... ...; |
2844+
| pre | ExitMethods.cs:102:9:102:28 | call to method IsTrue | ExitMethods.cs:100:17:100:32 | exit FailingAssertion |
28572845
| pre | ExitMethods.cs:102:9:102:29 | ...; | ExitMethods.cs:102:23:102:27 | false |
28582846
| pre | ExitMethods.cs:102:23:102:27 | false | ExitMethods.cs:102:9:102:28 | call to method IsTrue |
2859-
| pre | ExitMethods.cs:103:9:103:18 | ... ...; | ExitMethods.cs:103:13:103:13 | access to local variable x |
2860-
| pre | ExitMethods.cs:103:13:103:13 | access to local variable x | ExitMethods.cs:103:17:103:17 | 0 |
2861-
| pre | ExitMethods.cs:103:13:103:17 | Int32 x = ... | ExitMethods.cs:100:17:100:32 | exit FailingAssertion |
2862-
| pre | ExitMethods.cs:103:17:103:17 | 0 | ExitMethods.cs:103:13:103:17 | Int32 x = ... |
28632847
| pre | ExitMethods.cs:106:17:106:33 | enter FailingAssertion2 | ExitMethods.cs:107:5:110:5 | {...} |
28642848
| pre | ExitMethods.cs:107:5:110:5 | {...} | ExitMethods.cs:108:9:108:27 | ...; |
2865-
| pre | ExitMethods.cs:108:9:108:26 | call to method FailingAssertion | ExitMethods.cs:109:9:109:18 | ... ...; |
2849+
| pre | ExitMethods.cs:108:9:108:26 | call to method FailingAssertion | ExitMethods.cs:106:17:106:33 | exit FailingAssertion2 |
28662850
| pre | ExitMethods.cs:108:9:108:26 | this access | ExitMethods.cs:108:9:108:26 | call to method FailingAssertion |
28672851
| pre | ExitMethods.cs:108:9:108:27 | ...; | ExitMethods.cs:108:9:108:26 | this access |
2868-
| pre | ExitMethods.cs:109:9:109:18 | ... ...; | ExitMethods.cs:109:13:109:13 | access to local variable x |
2869-
| pre | ExitMethods.cs:109:13:109:13 | access to local variable x | ExitMethods.cs:109:17:109:17 | 0 |
2870-
| pre | ExitMethods.cs:109:13:109:17 | Int32 x = ... | ExitMethods.cs:106:17:106:33 | exit FailingAssertion2 |
2871-
| pre | ExitMethods.cs:109:17:109:17 | 0 | ExitMethods.cs:109:13:109:17 | Int32 x = ... |
28722852
| pre | ExitMethods.cs:112:10:112:20 | enter AssertFalse | ExitMethods.cs:112:48:112:48 | access to parameter b |
28732853
| pre | ExitMethods.cs:112:33:112:49 | call to method IsFalse | ExitMethods.cs:112:10:112:20 | exit AssertFalse |
28742854
| pre | ExitMethods.cs:112:48:112:48 | access to parameter b | ExitMethods.cs:112:33:112:49 | call to method IsFalse |
28752855
| pre | ExitMethods.cs:114:17:114:33 | enter FailingAssertion3 | ExitMethods.cs:115:5:118:5 | {...} |
28762856
| pre | ExitMethods.cs:115:5:118:5 | {...} | ExitMethods.cs:116:9:116:26 | ...; |
2877-
| pre | ExitMethods.cs:116:9:116:25 | call to method AssertFalse | ExitMethods.cs:117:9:117:18 | ... ...; |
2857+
| pre | ExitMethods.cs:116:9:116:25 | call to method AssertFalse | ExitMethods.cs:114:17:114:33 | exit FailingAssertion3 |
28782858
| pre | ExitMethods.cs:116:9:116:25 | this access | ExitMethods.cs:116:21:116:24 | true |
28792859
| pre | ExitMethods.cs:116:9:116:26 | ...; | ExitMethods.cs:116:9:116:25 | this access |
28802860
| pre | ExitMethods.cs:116:21:116:24 | true | ExitMethods.cs:116:9:116:25 | call to method AssertFalse |
2881-
| pre | ExitMethods.cs:117:9:117:18 | ... ...; | ExitMethods.cs:117:13:117:13 | access to local variable x |
2882-
| pre | ExitMethods.cs:117:13:117:13 | access to local variable x | ExitMethods.cs:117:17:117:17 | 0 |
2883-
| pre | ExitMethods.cs:117:13:117:17 | Int32 x = ... | ExitMethods.cs:114:17:114:33 | exit FailingAssertion3 |
2884-
| pre | ExitMethods.cs:117:17:117:17 | 0 | ExitMethods.cs:117:13:117:17 | Int32 x = ... |
28852861
| pre | Extensions.cs:5:23:5:29 | enter ToInt32 | Extensions.cs:6:5:8:5 | {...} |
28862862
| pre | Extensions.cs:6:5:8:5 | {...} | Extensions.cs:7:28:7:28 | access to parameter s |
28872863
| pre | Extensions.cs:7:9:7:30 | return ...; | Extensions.cs:5:23:5:29 | exit ToInt32 |

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

Lines changed: 0 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -546,28 +546,16 @@
546546
| ExitMethods.cs:97:34:97:34 | 0 | ExitMethods.cs:97:9:97:39 | return ...; | semmle.label | successor |
547547
| ExitMethods.cs:97:38:97:38 | 1 | ExitMethods.cs:97:9:97:39 | return ...; | semmle.label | successor |
548548
| ExitMethods.cs:101:5:104:5 | {...} | ExitMethods.cs:102:9:102:29 | ...; | semmle.label | successor |
549-
| ExitMethods.cs:102:9:102:28 | call to method IsTrue | ExitMethods.cs:103:9:103:18 | ... ...; | semmle.label | successor |
550549
| ExitMethods.cs:102:9:102:29 | ...; | ExitMethods.cs:102:23:102:27 | false | semmle.label | successor |
551550
| ExitMethods.cs:102:23:102:27 | false | ExitMethods.cs:102:9:102:28 | call to method IsTrue | semmle.label | successor |
552-
| ExitMethods.cs:103:9:103:18 | ... ...; | ExitMethods.cs:103:13:103:13 | access to local variable x | semmle.label | successor |
553-
| ExitMethods.cs:103:13:103:13 | access to local variable x | ExitMethods.cs:103:17:103:17 | 0 | semmle.label | successor |
554-
| ExitMethods.cs:103:17:103:17 | 0 | ExitMethods.cs:103:13:103:17 | Int32 x = ... | semmle.label | successor |
555551
| ExitMethods.cs:107:5:110:5 | {...} | ExitMethods.cs:108:9:108:27 | ...; | semmle.label | successor |
556-
| ExitMethods.cs:108:9:108:26 | call to method FailingAssertion | ExitMethods.cs:109:9:109:18 | ... ...; | semmle.label | successor |
557552
| ExitMethods.cs:108:9:108:26 | this access | ExitMethods.cs:108:9:108:26 | call to method FailingAssertion | semmle.label | successor |
558553
| ExitMethods.cs:108:9:108:27 | ...; | ExitMethods.cs:108:9:108:26 | this access | semmle.label | successor |
559-
| ExitMethods.cs:109:9:109:18 | ... ...; | ExitMethods.cs:109:13:109:13 | access to local variable x | semmle.label | successor |
560-
| ExitMethods.cs:109:13:109:13 | access to local variable x | ExitMethods.cs:109:17:109:17 | 0 | semmle.label | successor |
561-
| ExitMethods.cs:109:17:109:17 | 0 | ExitMethods.cs:109:13:109:17 | Int32 x = ... | semmle.label | successor |
562554
| ExitMethods.cs:112:48:112:48 | access to parameter b | ExitMethods.cs:112:33:112:49 | call to method IsFalse | semmle.label | successor |
563555
| ExitMethods.cs:115:5:118:5 | {...} | ExitMethods.cs:116:9:116:26 | ...; | semmle.label | successor |
564-
| ExitMethods.cs:116:9:116:25 | call to method AssertFalse | ExitMethods.cs:117:9:117:18 | ... ...; | semmle.label | successor |
565556
| ExitMethods.cs:116:9:116:25 | this access | ExitMethods.cs:116:21:116:24 | true | semmle.label | successor |
566557
| ExitMethods.cs:116:9:116:26 | ...; | ExitMethods.cs:116:9:116:25 | this access | semmle.label | successor |
567558
| ExitMethods.cs:116:21:116:24 | true | ExitMethods.cs:116:9:116:25 | call to method AssertFalse | semmle.label | successor |
568-
| ExitMethods.cs:117:9:117:18 | ... ...; | ExitMethods.cs:117:13:117:13 | access to local variable x | semmle.label | successor |
569-
| ExitMethods.cs:117:13:117:13 | access to local variable x | ExitMethods.cs:117:17:117:17 | 0 | semmle.label | successor |
570-
| ExitMethods.cs:117:17:117:17 | 0 | ExitMethods.cs:117:13:117:17 | Int32 x = ... | semmle.label | successor |
571559
| Extensions.cs:6:5:8:5 | {...} | Extensions.cs:7:28:7:28 | access to parameter s | semmle.label | successor |
572560
| Extensions.cs:7:16:7:29 | call to method Parse | Extensions.cs:7:9:7:30 | return ...; | semmle.label | successor |
573561
| Extensions.cs:7:28:7:28 | access to parameter s | Extensions.cs:7:16:7:29 | call to method Parse | semmle.label | successor |

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

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -787,28 +787,31 @@
787787
| ExitMethods.cs:97:27:97:29 | - | ExitMethods.cs:97:27:97:29 | - | normal |
788788
| ExitMethods.cs:97:34:97:34 | 0 | ExitMethods.cs:97:34:97:34 | 0 | normal |
789789
| ExitMethods.cs:97:38:97:38 | 1 | ExitMethods.cs:97:38:97:38 | 1 | normal |
790+
| ExitMethods.cs:101:5:104:5 | {...} | ExitMethods.cs:102:9:102:28 | call to method IsTrue | throw(AssertFailedException) |
790791
| ExitMethods.cs:101:5:104:5 | {...} | ExitMethods.cs:103:13:103:17 | Int32 x = ... | normal |
791-
| ExitMethods.cs:102:9:102:28 | call to method IsTrue | ExitMethods.cs:102:9:102:28 | call to method IsTrue | normal |
792-
| ExitMethods.cs:102:9:102:29 | ...; | ExitMethods.cs:102:9:102:28 | call to method IsTrue | normal |
792+
| ExitMethods.cs:102:9:102:28 | call to method IsTrue | ExitMethods.cs:102:9:102:28 | call to method IsTrue | throw(AssertFailedException) |
793+
| ExitMethods.cs:102:9:102:29 | ...; | ExitMethods.cs:102:9:102:28 | call to method IsTrue | throw(AssertFailedException) |
793794
| ExitMethods.cs:102:23:102:27 | false | ExitMethods.cs:102:23:102:27 | false | normal |
794795
| ExitMethods.cs:103:9:103:18 | ... ...; | ExitMethods.cs:103:13:103:17 | Int32 x = ... | normal |
795796
| ExitMethods.cs:103:13:103:13 | access to local variable x | ExitMethods.cs:103:13:103:13 | access to local variable x | normal |
796797
| ExitMethods.cs:103:13:103:17 | Int32 x = ... | ExitMethods.cs:103:13:103:17 | Int32 x = ... | normal |
797798
| ExitMethods.cs:103:17:103:17 | 0 | ExitMethods.cs:103:17:103:17 | 0 | normal |
799+
| ExitMethods.cs:107:5:110:5 | {...} | ExitMethods.cs:108:9:108:26 | call to method FailingAssertion | throw(AssertFailedException) |
798800
| ExitMethods.cs:107:5:110:5 | {...} | ExitMethods.cs:109:13:109:17 | Int32 x = ... | normal |
799-
| ExitMethods.cs:108:9:108:26 | call to method FailingAssertion | ExitMethods.cs:108:9:108:26 | call to method FailingAssertion | normal |
801+
| ExitMethods.cs:108:9:108:26 | call to method FailingAssertion | ExitMethods.cs:108:9:108:26 | call to method FailingAssertion | throw(AssertFailedException) |
800802
| ExitMethods.cs:108:9:108:26 | this access | ExitMethods.cs:108:9:108:26 | this access | normal |
801-
| ExitMethods.cs:108:9:108:27 | ...; | ExitMethods.cs:108:9:108:26 | call to method FailingAssertion | normal |
803+
| ExitMethods.cs:108:9:108:27 | ...; | ExitMethods.cs:108:9:108:26 | call to method FailingAssertion | throw(AssertFailedException) |
802804
| ExitMethods.cs:109:9:109:18 | ... ...; | ExitMethods.cs:109:13:109:17 | Int32 x = ... | normal |
803805
| ExitMethods.cs:109:13:109:13 | access to local variable x | ExitMethods.cs:109:13:109:13 | access to local variable x | normal |
804806
| ExitMethods.cs:109:13:109:17 | Int32 x = ... | ExitMethods.cs:109:13:109:17 | Int32 x = ... | normal |
805807
| ExitMethods.cs:109:17:109:17 | 0 | ExitMethods.cs:109:17:109:17 | 0 | normal |
806808
| ExitMethods.cs:112:33:112:49 | call to method IsFalse | ExitMethods.cs:112:33:112:49 | call to method IsFalse | normal |
807809
| ExitMethods.cs:112:48:112:48 | access to parameter b | ExitMethods.cs:112:48:112:48 | access to parameter b | normal |
810+
| ExitMethods.cs:115:5:118:5 | {...} | ExitMethods.cs:116:9:116:25 | call to method AssertFalse | throw(AssertFailedException) |
808811
| ExitMethods.cs:115:5:118:5 | {...} | ExitMethods.cs:117:13:117:17 | Int32 x = ... | normal |
809-
| ExitMethods.cs:116:9:116:25 | call to method AssertFalse | ExitMethods.cs:116:9:116:25 | call to method AssertFalse | normal |
812+
| ExitMethods.cs:116:9:116:25 | call to method AssertFalse | ExitMethods.cs:116:9:116:25 | call to method AssertFalse | throw(AssertFailedException) |
810813
| ExitMethods.cs:116:9:116:25 | this access | ExitMethods.cs:116:9:116:25 | this access | normal |
811-
| ExitMethods.cs:116:9:116:26 | ...; | ExitMethods.cs:116:9:116:25 | call to method AssertFalse | normal |
814+
| ExitMethods.cs:116:9:116:26 | ...; | ExitMethods.cs:116:9:116:25 | call to method AssertFalse | throw(AssertFailedException) |
812815
| ExitMethods.cs:116:21:116:24 | true | ExitMethods.cs:116:21:116:24 | true | normal |
813816
| ExitMethods.cs:117:9:117:18 | ... ...; | ExitMethods.cs:117:13:117:17 | Int32 x = ... | normal |
814817
| ExitMethods.cs:117:13:117:13 | access to local variable x | ExitMethods.cs:117:13:117:13 | access to local variable x | normal |

0 commit comments

Comments
 (0)