diff --git a/change-notes/1.19/analysis-csharp.md b/change-notes/1.19/analysis-csharp.md index 963bf907622..edf97b5946c 100644 --- a/change-notes/1.19/analysis-csharp.md +++ b/change-notes/1.19/analysis-csharp.md @@ -2,8 +2,10 @@ ## General improvements -* The control flow graph construction now takes simple Boolean conditions on local scope variables into account. For example, in `if (b) x = 0; if (b) x = 1;`, the control flow graph will reflect that taking the `true` (resp. `false`) branch in the first condition implies taking the same branch in the second condition. In effect, the first assignment to `x` will now be identified as being dead. - +* Control flow graph improvements: + * The control flow graph construction now takes simple Boolean conditions on local scope variables into account. For example, in `if (b) x = 0; if (b) x = 1;`, the control flow graph will reflect that taking the `true` (resp. `false`) branch in the first condition implies taking the same branch in the second condition. In effect, the first assignment to `x` will now be identified as being dead. + * Code that is only reachable from a constant failing assertion, such as `Debug.Assert(false)`, is considered to be unreachable. + ## New queries | **Query** | **Tags** | **Purpose** | diff --git a/csharp/ql/src/semmle/code/csharp/commons/Assertions.qll b/csharp/ql/src/semmle/code/csharp/commons/Assertions.qll index f9e94429e55..cccea67e24a 100644 --- a/csharp/ql/src/semmle/code/csharp/commons/Assertions.qll +++ b/csharp/ql/src/semmle/code/csharp/commons/Assertions.qll @@ -1,11 +1,20 @@ /** Provides classes for assertions. */ private import semmle.code.csharp.frameworks.system.Diagnostics private import semmle.code.csharp.frameworks.test.VisualStudio +private import semmle.code.csharp.frameworks.System /** An assertion method. */ abstract class AssertMethod extends Method { /** Gets the index of the parameter being asserted. */ abstract int getAssertionIndex(); + + /** Gets the parameter being asserted. */ + final Parameter getAssertedParameter() { + result = this.getParameter(this.getAssertionIndex()) + } + + /** Gets the exception being thrown if the assertion fails, if any. */ + abstract ExceptionClass getExceptionClass(); } /** A positive assertion method. */ @@ -24,6 +33,36 @@ abstract class AssertNullMethod extends AssertMethod { abstract class AssertNonNullMethod extends AssertMethod { } +/** An assertion, that is, a call to an assertion method. */ +class Assertion extends MethodCall { + private AssertMethod target; + + Assertion() { this.getTarget() = target } + + /** Gets the assertion method targeted by this assertion. */ + AssertMethod getAssertMethod() { result = target } + + /** Gets the expression that this assertion pertains to. */ + Expr getExpr() { + result = this.getArgumentForParameter(target.getAssertedParameter()) + } +} + +/** A trivially failing assertion, for example `Debug.Assert(false)`. */ +class FailingAssertion extends Assertion { + FailingAssertion() { + exists(AssertMethod am, Expr e | + am = this.getAssertMethod() and + e = this.getExpr() | + am instanceof AssertTrueMethod and + e.getValue() = "false" + or + am instanceof AssertFalseMethod and + e.getValue() = "true" + ) + } +} + /** * A `System.Diagnostics.Debug` assertion method. */ @@ -33,6 +72,12 @@ class SystemDiagnosticsDebugAssertTrueMethod extends AssertTrueMethod { } override int getAssertionIndex() { result = 0 } + + override ExceptionClass getExceptionClass() { + // A failing assertion generates a message box, see + // https://docs.microsoft.com/en-us/dotnet/api/system.diagnostics.debug.assert + none() + } } /** A Visual Studio assertion method. */ @@ -42,6 +87,8 @@ class VSTestAssertTrueMethod extends AssertTrueMethod { } override int getAssertionIndex() { result = 0 } + + override AssertFailedExceptionClass getExceptionClass() { any() } } /** A Visual Studio negated assertion method. */ @@ -51,6 +98,8 @@ class VSTestAssertFalseMethod extends AssertFalseMethod { } override int getAssertionIndex() { result = 0 } + + override AssertFailedExceptionClass getExceptionClass() { any() } } /** A Visual Studio `null` assertion method. */ @@ -60,6 +109,8 @@ class VSTestAssertNullMethod extends AssertNullMethod { } override int getAssertionIndex() { result = 0 } + + override AssertFailedExceptionClass getExceptionClass() { any() } } /** A Visual Studio non-`null` assertion method. */ @@ -69,28 +120,50 @@ class VSTestAssertNonNullMethod extends AssertNonNullMethod { } override int getAssertionIndex() { result = 0 } + + override AssertFailedExceptionClass getExceptionClass() { any() } } /** A method that forwards to another assertion method. */ class ForwarderAssertMethod extends AssertMethod { AssertMethod forwardee; - int assertionIndex; + Parameter p; ForwarderAssertMethod() { - exists(AssignableDefinitions::ImplicitParameterDefinition def, ParameterRead pr | - def.getParameter() = this.getParameter(assertionIndex) and - pr = def.getAReachableRead() and - pr.getAControlFlowNode().postDominates(this.getEntryPoint()) and - forwardee.getParameter(forwardee.getAssertionIndex()).getAnAssignedArgument() = pr + p = this.getAParameter() and + strictcount(AssignableDefinition def | def.getTarget() = p) = 1 and + forex(ControlFlowElement body | + body = this.getABody() | + exists(Assertion a | + body = getAnAssertingElement(a) and + a.getExpr() = p.getAnAccess() and + forwardee = a.getAssertMethod() + ) ) } - override int getAssertionIndex() { result = assertionIndex } + override int getAssertionIndex() { result = p.getPosition() } + override ExceptionClass getExceptionClass() { + result = forwardee.getExceptionClass() + } + /** Gets the underlying assertion method that is being forwarded to. */ AssertMethod getUnderlyingAssertMethod() { result = forwardee } } +private ControlFlowElement getAnAssertingElement(Assertion a) { + result = a + or + result = getAnAssertingStmt(a) +} + +private Stmt getAnAssertingStmt(Assertion a) { + result.(ExprStmt).getExpr() = getAnAssertingElement(a) + or + result.(BlockStmt).getFirstStmt() = getAnAssertingElement(a) +} + /** A method that forwards to a positive assertion method. */ class ForwarderAssertTrueMethod extends ForwarderAssertMethod, AssertTrueMethod { ForwarderAssertTrueMethod() { @@ -121,8 +194,5 @@ class ForwarderAssertNonNullMethod extends ForwarderAssertMethod, AssertNonNullM /** Holds if expression `e` appears in an assertion. */ predicate isExprInAssertion(Expr e) { - exists(MethodCall call, AssertMethod assertMethod | - call.getTarget() = assertMethod | - e = call.getArgument(assertMethod.getAssertionIndex()).getAChildExpr*() - ) + e = any(Assertion a).getExpr().getAChildExpr*() } diff --git a/csharp/ql/src/semmle/code/csharp/controlflow/Completion.qll b/csharp/ql/src/semmle/code/csharp/controlflow/Completion.qll index 7c74326ed1f..d1452043216 100644 --- a/csharp/ql/src/semmle/code/csharp/controlflow/Completion.qll +++ b/csharp/ql/src/semmle/code/csharp/controlflow/Completion.qll @@ -59,6 +59,8 @@ private newtype TCompletion = TGotoDefaultCompletion() or TThrowCompletion(ExceptionClass ec) + or + TExitCompletion() /** * A completion of a statement or an expression. @@ -642,3 +644,16 @@ class ThrowCompletion extends Completion, TThrowCompletion { override string toString() { result = "throw(" + getExceptionClass() + ")" } } + +/** + * A completion that represents evaluation of a statement or an + * expression resulting in a program exit, for example + * `System.Environment.Exit(0)`. + * + * An exit completion is different from a `return` completion; the former + * exits the whole application, and exists inside `try` statements skip + * `finally` blocks. + */ +class ExitCompletion extends Completion, TExitCompletion { + override string toString() { result = "exit" } +} diff --git a/csharp/ql/src/semmle/code/csharp/controlflow/ControlFlowGraph.qll b/csharp/ql/src/semmle/code/csharp/controlflow/ControlFlowGraph.qll index 20878834ff6..4856f414964 100644 --- a/csharp/ql/src/semmle/code/csharp/controlflow/ControlFlowGraph.qll +++ b/csharp/ql/src/semmle/code/csharp/controlflow/ControlFlowGraph.qll @@ -785,6 +785,30 @@ module ControlFlow { c.(ThrowCompletion).getExceptionClass() = getExceptionClass() } } + + /** + * An exit control flow successor. + * + * Example: + * + * ``` + * int M(string s) + * { + * if (s == null) + * System.Environment.Exit(0); + * return s.Length; + * } + * ``` + * + * The callable exit node of `M` is an exit successor of the node on line 4. + */ + class ExitSuccessor extends SuccessorType, TExitSuccessor { + override string toString() { result = "exit" } + + override predicate matchesCompletion(Completion c) { + c instanceof ExitCompletion + } + } } private import SuccessorTypes @@ -1386,10 +1410,15 @@ module ControlFlow { result = lastTryStmtFinally(ts, c) and not c instanceof NormalCompletion or - // If there is no `finally` block, last elements are from the body, from - // the blocks of one of the `catch` clauses, or from the last `catch` clause - not ts.hasFinally() and - result = getBlockOrCatchFinallyPred(ts, c) + result = getBlockOrCatchFinallyPred(ts, c) and + ( + // If there is no `finally` block, last elements are from the body, from + // the blocks of one of the `catch` clauses, or from the last `catch` clause + not ts.hasFinally() + or + // Exit completions ignore the `finally` block + c instanceof ExitCompletion + ) ) or cfe = any(SpecificCatchClause scc | @@ -1453,7 +1482,7 @@ module ControlFlow { // Propagate completion from a call to a non-terminating callable cfe = any(NonReturningCall nrc | result = nrc and - c = nrc.getTarget().(NonReturningCallable).getACallCompletion() + c = nrc.getACompletion() ) } @@ -1734,19 +1763,44 @@ module ControlFlow { */ private module NonReturning { private import semmle.code.csharp.ExprOrStmtParent + private import semmle.code.csharp.commons.Assertions private import semmle.code.csharp.frameworks.System - /** - * A call that definitely does not return (conservative analysis). - */ - class NonReturningCall extends Call { - NonReturningCall() { - this.getTarget() instanceof NonReturningCallable - } + /** A call that definitely does not return (conservative analysis). */ + abstract class NonReturningCall extends Call { + /** Gets a valid completion for this non-returning call. */ + abstract Completion getACompletion(); } - /** A callable that does not return. */ - abstract class NonReturningCallable extends Callable { + private class ExitingCall extends NonReturningCall { + ExitingCall() { + this.getTarget() instanceof ExitingCallable + or + exists(AssertMethod m | + m = this.(FailingAssertion).getAssertMethod() | + not exists(m.getExceptionClass()) + ) + } + + override ExitCompletion getACompletion() { any() } + } + + private class ThrowingCall extends NonReturningCall { + private ThrowCompletion c; + + ThrowingCall() { + c = this.getTarget().(ThrowingCallable).getACallCompletion() + or + exists(AssertMethod m | + m = this.(FailingAssertion).getAssertMethod() | + c.getExceptionClass() = m.getExceptionClass() + ) + } + + override ThrowCompletion getACompletion() { result = c } + } + + private abstract class NonReturningCallable extends Callable { NonReturningCallable() { not exists(ReturnStmt ret | ret.getEnclosingCallable() = this) and not hasAccessorAutoImplementation(this, _) and @@ -1756,19 +1810,9 @@ module ControlFlow { v = this.(Accessor).getDeclaration() ) } - - /** Gets a valid completion for a call to this non-returning callable. */ - abstract Completion getACallCompletion(); } - /** - * A callable that exits when called. - */ - private abstract class ExitingCallable extends NonReturningCallable { - override Completion getACallCompletion() { - result instanceof ReturnCompletion - } - } + private abstract class ExitingCallable extends NonReturningCallable { } private class DirectlyExitingCallable extends ExitingCallable { DirectlyExitingCallable() { @@ -1789,7 +1833,8 @@ module ControlFlow { } private ControlFlowElement getAnExitingElement() { - result.(Call).getTarget() instanceof ExitingCallable or + result instanceof ExitingCall + or result = getAnExitingStmt() } @@ -1805,9 +1850,6 @@ module ControlFlow { ) } - /** - * A callable that throws an exception when called. - */ private class ThrowingCallable extends NonReturningCallable { ThrowingCallable() { forex(ControlFlowElement body | @@ -1816,16 +1858,17 @@ module ControlFlow { ) } - override ThrowCompletion getACallCompletion() { + /** Gets a valid completion for a call to this throwing callable. */ + ThrowCompletion getACallCompletion() { this.getABody() = getAThrowingElement(result) } } private ControlFlowElement getAThrowingElement(ThrowCompletion c) { - c = result.(Call).getTarget().(ThrowingCallable).getACallCompletion() + c = result.(ThrowingCall).getACompletion() or result = any(ThrowElement te | - c.(ThrowCompletion).getExceptionClass() = te.getThrownExceptionType() and + c.getExceptionClass() = te.getThrownExceptionType() and // For stub implementations, there may exist proper implementations that are not seen // during compilation, so we conservatively rule those out not isStub(te) @@ -1839,12 +1882,13 @@ module ControlFlow { or result.(BlockStmt).getFirstStmt() = getAThrowingStmt(c) or - exists(IfStmt ifStmt | + exists(IfStmt ifStmt, ThrowCompletion c1, ThrowCompletion c2 | result = ifStmt and - ifStmt.getThen() = getAThrowingElement(_) and - ifStmt.getElse() = getAThrowingElement(_) | - ifStmt.getThen() = getAThrowingElement(c) or - ifStmt.getElse() = getAThrowingElement(c) + ifStmt.getThen() = getAThrowingElement(c1) and + ifStmt.getElse() = getAThrowingElement(c2) | + c = c1 + or + c = c2 ) } @@ -2293,6 +2337,7 @@ module ControlFlow { // Flow from last element of `try` block to first element of `finally` block cfe = lastTryStmtBlock(ts, c) and result = first(ts.getFinally()) and + not c instanceof ExitCompletion and ( c instanceof ThrowCompletion implies @@ -3892,6 +3937,8 @@ module ControlFlow { TExceptionSuccessor(ExceptionClass ec) { exists(ThrowCompletion c | c.getExceptionClass() = ec) } + or + TExitSuccessor() /** Gets a successor node of a given flow type, if any. */ cached diff --git a/csharp/ql/src/semmle/code/csharp/frameworks/test/VisualStudio.qll b/csharp/ql/src/semmle/code/csharp/frameworks/test/VisualStudio.qll index d08576367ee..062b6e584b2 100644 --- a/csharp/ql/src/semmle/code/csharp/frameworks/test/VisualStudio.qll +++ b/csharp/ql/src/semmle/code/csharp/frameworks/test/VisualStudio.qll @@ -107,6 +107,14 @@ class VSTestAssertClass extends Class { } } +/** The `Microsoft.VisualStudio.TestTools.UnitTesting.AssertFailedException` class. */ +class AssertFailedExceptionClass extends ExceptionClass { + AssertFailedExceptionClass() { + this.getNamespace() instanceof VSTestNamespace and + this.hasName("AssertFailedException") + } +} + /** DEPRECATED. Gets the `Microsoft.VisualStudio.TestTools.UnitTesting.Assert` class. */ deprecated VSTestAssertClass getVSTestAssertClass() { any() } diff --git a/csharp/ql/test/library-tests/commons/Assertions/Assertion.expected b/csharp/ql/test/library-tests/commons/Assertions/Assertion.expected new file mode 100644 index 00000000000..ad86b7d0adc --- /dev/null +++ b/csharp/ql/test/library-tests/commons/Assertions/Assertion.expected @@ -0,0 +1,84 @@ +| Assertions.cs:7:44:7:59 | call to method IsTrue | Assertions.cs:7:58:7:58 | access to parameter b | NonConstructedMethod | Microsoft.VisualStudio.TestTools.UnitTesting.AssertFailedException | +| Assertions.cs:7:44:7:59 | call to method IsTrue | Assertions.cs:7:58:7:58 | access to parameter b | RuntimeMethod | Microsoft.VisualStudio.TestTools.UnitTesting.AssertFailedException | +| Assertions.cs:7:44:7:59 | call to method IsTrue | Assertions.cs:7:58:7:58 | access to parameter b | SourceDeclarationMethod | Microsoft.VisualStudio.TestTools.UnitTesting.AssertFailedException | +| Assertions.cs:7:44:7:59 | call to method IsTrue | Assertions.cs:7:58:7:58 | access to parameter b | VSTestAssertTrueMethod | Microsoft.VisualStudio.TestTools.UnitTesting.AssertFailedException | +| Assertions.cs:8:45:8:55 | call to method MyAssert | Assertions.cs:8:54:8:54 | access to parameter b | ForwarderAssertTrueMethod | Microsoft.VisualStudio.TestTools.UnitTesting.AssertFailedException | +| Assertions.cs:8:45:8:55 | call to method MyAssert | Assertions.cs:8:54:8:54 | access to parameter b | NonConstructedMethod | Microsoft.VisualStudio.TestTools.UnitTesting.AssertFailedException | +| Assertions.cs:8:45:8:55 | call to method MyAssert | Assertions.cs:8:54:8:54 | access to parameter b | RuntimeMethod | Microsoft.VisualStudio.TestTools.UnitTesting.AssertFailedException | +| Assertions.cs:8:45:8:55 | call to method MyAssert | Assertions.cs:8:54:8:54 | access to parameter b | SourceDeclarationMethod | Microsoft.VisualStudio.TestTools.UnitTesting.AssertFailedException | +| Assertions.cs:16:9:16:31 | call to method Assert | Assertions.cs:16:22:16:30 | ... != ... | NonConstructedMethod | | +| Assertions.cs:16:9:16:31 | call to method Assert | Assertions.cs:16:22:16:30 | ... != ... | RuntimeMethod | | +| Assertions.cs:16:9:16:31 | call to method Assert | Assertions.cs:16:22:16:30 | ... != ... | SourceDeclarationMethod | | +| Assertions.cs:16:9:16:31 | call to method Assert | Assertions.cs:16:22:16:30 | ... != ... | SystemDiagnosticsDebugAssertTrueMethod | | +| Assertions.cs:17:9:17:24 | call to method IsNull | Assertions.cs:17:23:17:23 | access to local variable s | NonConstructedMethod | Microsoft.VisualStudio.TestTools.UnitTesting.AssertFailedException | +| Assertions.cs:17:9:17:24 | call to method IsNull | Assertions.cs:17:23:17:23 | access to local variable s | RuntimeMethod | Microsoft.VisualStudio.TestTools.UnitTesting.AssertFailedException | +| Assertions.cs:17:9:17:24 | call to method IsNull | Assertions.cs:17:23:17:23 | access to local variable s | SourceDeclarationMethod | Microsoft.VisualStudio.TestTools.UnitTesting.AssertFailedException | +| Assertions.cs:17:9:17:24 | call to method IsNull | Assertions.cs:17:23:17:23 | access to local variable s | VSTestAssertNullMethod | Microsoft.VisualStudio.TestTools.UnitTesting.AssertFailedException | +| Assertions.cs:18:9:18:27 | call to method IsNotNull | Assertions.cs:18:26:18:26 | access to local variable s | NonConstructedMethod | Microsoft.VisualStudio.TestTools.UnitTesting.AssertFailedException | +| Assertions.cs:18:9:18:27 | call to method IsNotNull | Assertions.cs:18:26:18:26 | access to local variable s | RuntimeMethod | Microsoft.VisualStudio.TestTools.UnitTesting.AssertFailedException | +| Assertions.cs:18:9:18:27 | call to method IsNotNull | Assertions.cs:18:26:18:26 | access to local variable s | SourceDeclarationMethod | Microsoft.VisualStudio.TestTools.UnitTesting.AssertFailedException | +| Assertions.cs:18:9:18:27 | call to method IsNotNull | Assertions.cs:18:26:18:26 | access to local variable s | VSTestAssertNonNullMethod | Microsoft.VisualStudio.TestTools.UnitTesting.AssertFailedException | +| Assertions.cs:19:9:19:32 | call to method IsTrue | Assertions.cs:19:23:19:31 | ... == ... | NonConstructedMethod | Microsoft.VisualStudio.TestTools.UnitTesting.AssertFailedException | +| Assertions.cs:19:9:19:32 | call to method IsTrue | Assertions.cs:19:23:19:31 | ... == ... | RuntimeMethod | Microsoft.VisualStudio.TestTools.UnitTesting.AssertFailedException | +| Assertions.cs:19:9:19:32 | call to method IsTrue | Assertions.cs:19:23:19:31 | ... == ... | SourceDeclarationMethod | Microsoft.VisualStudio.TestTools.UnitTesting.AssertFailedException | +| Assertions.cs:19:9:19:32 | call to method IsTrue | Assertions.cs:19:23:19:31 | ... == ... | VSTestAssertTrueMethod | Microsoft.VisualStudio.TestTools.UnitTesting.AssertFailedException | +| Assertions.cs:20:9:20:32 | call to method IsTrue | Assertions.cs:20:23:20:31 | ... != ... | NonConstructedMethod | Microsoft.VisualStudio.TestTools.UnitTesting.AssertFailedException | +| Assertions.cs:20:9:20:32 | call to method IsTrue | Assertions.cs:20:23:20:31 | ... != ... | RuntimeMethod | Microsoft.VisualStudio.TestTools.UnitTesting.AssertFailedException | +| Assertions.cs:20:9:20:32 | call to method IsTrue | Assertions.cs:20:23:20:31 | ... != ... | SourceDeclarationMethod | Microsoft.VisualStudio.TestTools.UnitTesting.AssertFailedException | +| Assertions.cs:20:9:20:32 | call to method IsTrue | Assertions.cs:20:23:20:31 | ... != ... | VSTestAssertTrueMethod | Microsoft.VisualStudio.TestTools.UnitTesting.AssertFailedException | +| Assertions.cs:21:9:21:33 | call to method IsFalse | Assertions.cs:21:24:21:32 | ... != ... | NonConstructedMethod | Microsoft.VisualStudio.TestTools.UnitTesting.AssertFailedException | +| Assertions.cs:21:9:21:33 | call to method IsFalse | Assertions.cs:21:24:21:32 | ... != ... | RuntimeMethod | Microsoft.VisualStudio.TestTools.UnitTesting.AssertFailedException | +| Assertions.cs:21:9:21:33 | call to method IsFalse | Assertions.cs:21:24:21:32 | ... != ... | SourceDeclarationMethod | Microsoft.VisualStudio.TestTools.UnitTesting.AssertFailedException | +| Assertions.cs:21:9:21:33 | call to method IsFalse | Assertions.cs:21:24:21:32 | ... != ... | VSTestAssertFalseMethod | Microsoft.VisualStudio.TestTools.UnitTesting.AssertFailedException | +| Assertions.cs:22:9:22:33 | call to method IsFalse | Assertions.cs:22:24:22:32 | ... == ... | NonConstructedMethod | Microsoft.VisualStudio.TestTools.UnitTesting.AssertFailedException | +| Assertions.cs:22:9:22:33 | call to method IsFalse | Assertions.cs:22:24:22:32 | ... == ... | RuntimeMethod | Microsoft.VisualStudio.TestTools.UnitTesting.AssertFailedException | +| Assertions.cs:22:9:22:33 | call to method IsFalse | Assertions.cs:22:24:22:32 | ... == ... | SourceDeclarationMethod | Microsoft.VisualStudio.TestTools.UnitTesting.AssertFailedException | +| Assertions.cs:22:9:22:33 | call to method IsFalse | Assertions.cs:22:24:22:32 | ... == ... | VSTestAssertFalseMethod | Microsoft.VisualStudio.TestTools.UnitTesting.AssertFailedException | +| Assertions.cs:23:9:23:38 | call to method MyAssert | Assertions.cs:23:29:23:37 | ... == ... | ForwarderAssertTrueMethod | Microsoft.VisualStudio.TestTools.UnitTesting.AssertFailedException | +| Assertions.cs:23:9:23:38 | call to method MyAssert | Assertions.cs:23:29:23:37 | ... == ... | NonConstructedMethod | Microsoft.VisualStudio.TestTools.UnitTesting.AssertFailedException | +| Assertions.cs:23:9:23:38 | call to method MyAssert | Assertions.cs:23:29:23:37 | ... == ... | RuntimeMethod | Microsoft.VisualStudio.TestTools.UnitTesting.AssertFailedException | +| Assertions.cs:23:9:23:38 | call to method MyAssert | Assertions.cs:23:29:23:37 | ... == ... | SourceDeclarationMethod | Microsoft.VisualStudio.TestTools.UnitTesting.AssertFailedException | +| Assertions.cs:24:9:24:39 | call to method MyAssert2 | Assertions.cs:24:30:24:38 | ... == ... | ForwarderAssertTrueMethod | Microsoft.VisualStudio.TestTools.UnitTesting.AssertFailedException | +| Assertions.cs:24:9:24:39 | call to method MyAssert2 | Assertions.cs:24:30:24:38 | ... == ... | NonConstructedMethod | Microsoft.VisualStudio.TestTools.UnitTesting.AssertFailedException | +| Assertions.cs:24:9:24:39 | call to method MyAssert2 | Assertions.cs:24:30:24:38 | ... == ... | RuntimeMethod | Microsoft.VisualStudio.TestTools.UnitTesting.AssertFailedException | +| Assertions.cs:24:9:24:39 | call to method MyAssert2 | Assertions.cs:24:30:24:38 | ... == ... | SourceDeclarationMethod | Microsoft.VisualStudio.TestTools.UnitTesting.AssertFailedException | +| Assertions.cs:29:9:29:27 | call to method Assert | Assertions.cs:29:22:29:26 | false | NonConstructedMethod | | +| Assertions.cs:29:9:29:27 | call to method Assert | Assertions.cs:29:22:29:26 | false | RuntimeMethod | | +| Assertions.cs:29:9:29:27 | call to method Assert | Assertions.cs:29:22:29:26 | false | SourceDeclarationMethod | | +| Assertions.cs:29:9:29:27 | call to method Assert | Assertions.cs:29:22:29:26 | false | SystemDiagnosticsDebugAssertTrueMethod | | +| Assertions.cs:30:9:30:26 | call to method Assert | Assertions.cs:30:22:30:25 | true | NonConstructedMethod | | +| Assertions.cs:30:9:30:26 | call to method Assert | Assertions.cs:30:22:30:25 | true | RuntimeMethod | | +| Assertions.cs:30:9:30:26 | call to method Assert | Assertions.cs:30:22:30:25 | true | SourceDeclarationMethod | | +| Assertions.cs:30:9:30:26 | call to method Assert | Assertions.cs:30:22:30:25 | true | SystemDiagnosticsDebugAssertTrueMethod | | +| Assertions.cs:31:9:31:28 | call to method IsTrue | Assertions.cs:31:23:31:27 | false | NonConstructedMethod | Microsoft.VisualStudio.TestTools.UnitTesting.AssertFailedException | +| Assertions.cs:31:9:31:28 | call to method IsTrue | Assertions.cs:31:23:31:27 | false | RuntimeMethod | Microsoft.VisualStudio.TestTools.UnitTesting.AssertFailedException | +| Assertions.cs:31:9:31:28 | call to method IsTrue | Assertions.cs:31:23:31:27 | false | SourceDeclarationMethod | Microsoft.VisualStudio.TestTools.UnitTesting.AssertFailedException | +| Assertions.cs:31:9:31:28 | call to method IsTrue | Assertions.cs:31:23:31:27 | false | VSTestAssertTrueMethod | Microsoft.VisualStudio.TestTools.UnitTesting.AssertFailedException | +| Assertions.cs:32:9:32:27 | call to method IsTrue | Assertions.cs:32:23:32:26 | true | NonConstructedMethod | Microsoft.VisualStudio.TestTools.UnitTesting.AssertFailedException | +| Assertions.cs:32:9:32:27 | call to method IsTrue | Assertions.cs:32:23:32:26 | true | RuntimeMethod | Microsoft.VisualStudio.TestTools.UnitTesting.AssertFailedException | +| Assertions.cs:32:9:32:27 | call to method IsTrue | Assertions.cs:32:23:32:26 | true | SourceDeclarationMethod | Microsoft.VisualStudio.TestTools.UnitTesting.AssertFailedException | +| Assertions.cs:32:9:32:27 | call to method IsTrue | Assertions.cs:32:23:32:26 | true | VSTestAssertTrueMethod | Microsoft.VisualStudio.TestTools.UnitTesting.AssertFailedException | +| Assertions.cs:33:9:33:28 | call to method IsFalse | Assertions.cs:33:24:33:27 | true | NonConstructedMethod | Microsoft.VisualStudio.TestTools.UnitTesting.AssertFailedException | +| Assertions.cs:33:9:33:28 | call to method IsFalse | Assertions.cs:33:24:33:27 | true | RuntimeMethod | Microsoft.VisualStudio.TestTools.UnitTesting.AssertFailedException | +| Assertions.cs:33:9:33:28 | call to method IsFalse | Assertions.cs:33:24:33:27 | true | SourceDeclarationMethod | Microsoft.VisualStudio.TestTools.UnitTesting.AssertFailedException | +| Assertions.cs:33:9:33:28 | call to method IsFalse | Assertions.cs:33:24:33:27 | true | VSTestAssertFalseMethod | Microsoft.VisualStudio.TestTools.UnitTesting.AssertFailedException | +| Assertions.cs:34:9:34:29 | call to method IsFalse | Assertions.cs:34:24:34:28 | false | NonConstructedMethod | Microsoft.VisualStudio.TestTools.UnitTesting.AssertFailedException | +| Assertions.cs:34:9:34:29 | call to method IsFalse | Assertions.cs:34:24:34:28 | false | RuntimeMethod | Microsoft.VisualStudio.TestTools.UnitTesting.AssertFailedException | +| Assertions.cs:34:9:34:29 | call to method IsFalse | Assertions.cs:34:24:34:28 | false | SourceDeclarationMethod | Microsoft.VisualStudio.TestTools.UnitTesting.AssertFailedException | +| Assertions.cs:34:9:34:29 | call to method IsFalse | Assertions.cs:34:24:34:28 | false | VSTestAssertFalseMethod | Microsoft.VisualStudio.TestTools.UnitTesting.AssertFailedException | +| Assertions.cs:35:9:35:34 | call to method MyAssert | Assertions.cs:35:29:35:33 | false | ForwarderAssertTrueMethod | Microsoft.VisualStudio.TestTools.UnitTesting.AssertFailedException | +| Assertions.cs:35:9:35:34 | call to method MyAssert | Assertions.cs:35:29:35:33 | false | NonConstructedMethod | Microsoft.VisualStudio.TestTools.UnitTesting.AssertFailedException | +| Assertions.cs:35:9:35:34 | call to method MyAssert | Assertions.cs:35:29:35:33 | false | RuntimeMethod | Microsoft.VisualStudio.TestTools.UnitTesting.AssertFailedException | +| Assertions.cs:35:9:35:34 | call to method MyAssert | Assertions.cs:35:29:35:33 | false | SourceDeclarationMethod | Microsoft.VisualStudio.TestTools.UnitTesting.AssertFailedException | +| Assertions.cs:36:9:36:33 | call to method MyAssert | Assertions.cs:36:29:36:32 | true | ForwarderAssertTrueMethod | Microsoft.VisualStudio.TestTools.UnitTesting.AssertFailedException | +| Assertions.cs:36:9:36:33 | call to method MyAssert | Assertions.cs:36:29:36:32 | true | NonConstructedMethod | Microsoft.VisualStudio.TestTools.UnitTesting.AssertFailedException | +| Assertions.cs:36:9:36:33 | call to method MyAssert | Assertions.cs:36:29:36:32 | true | RuntimeMethod | Microsoft.VisualStudio.TestTools.UnitTesting.AssertFailedException | +| Assertions.cs:36:9:36:33 | call to method MyAssert | Assertions.cs:36:29:36:32 | true | SourceDeclarationMethod | Microsoft.VisualStudio.TestTools.UnitTesting.AssertFailedException | +| Assertions.cs:37:9:37:35 | call to method MyAssert2 | Assertions.cs:37:30:37:34 | false | ForwarderAssertTrueMethod | Microsoft.VisualStudio.TestTools.UnitTesting.AssertFailedException | +| Assertions.cs:37:9:37:35 | call to method MyAssert2 | Assertions.cs:37:30:37:34 | false | NonConstructedMethod | Microsoft.VisualStudio.TestTools.UnitTesting.AssertFailedException | +| Assertions.cs:37:9:37:35 | call to method MyAssert2 | Assertions.cs:37:30:37:34 | false | RuntimeMethod | Microsoft.VisualStudio.TestTools.UnitTesting.AssertFailedException | +| Assertions.cs:37:9:37:35 | call to method MyAssert2 | Assertions.cs:37:30:37:34 | false | SourceDeclarationMethod | Microsoft.VisualStudio.TestTools.UnitTesting.AssertFailedException | +| Assertions.cs:38:9:38:34 | call to method MyAssert2 | Assertions.cs:38:30:38:33 | true | ForwarderAssertTrueMethod | Microsoft.VisualStudio.TestTools.UnitTesting.AssertFailedException | +| Assertions.cs:38:9:38:34 | call to method MyAssert2 | Assertions.cs:38:30:38:33 | true | NonConstructedMethod | Microsoft.VisualStudio.TestTools.UnitTesting.AssertFailedException | +| Assertions.cs:38:9:38:34 | call to method MyAssert2 | Assertions.cs:38:30:38:33 | true | RuntimeMethod | Microsoft.VisualStudio.TestTools.UnitTesting.AssertFailedException | +| Assertions.cs:38:9:38:34 | call to method MyAssert2 | Assertions.cs:38:30:38:33 | true | SourceDeclarationMethod | Microsoft.VisualStudio.TestTools.UnitTesting.AssertFailedException | diff --git a/csharp/ql/test/library-tests/commons/Assertions/Assertions.cs b/csharp/ql/test/library-tests/commons/Assertions/Assertions.cs new file mode 100644 index 00000000000..491846e08e8 --- /dev/null +++ b/csharp/ql/test/library-tests/commons/Assertions/Assertions.cs @@ -0,0 +1,42 @@ +using System; +using System.Diagnostics; +using Microsoft.VisualStudio.TestTools.UnitTesting; + +public static class Forwarders +{ + public static void MyAssert(bool b) => Assert.IsTrue(b); + public static void MyAssert2(bool b) => MyAssert(b); +} + +class Assertions +{ + void M() + { + string s = null; + Debug.Assert(s != null); + Assert.IsNull(s); + Assert.IsNotNull(s); + Assert.IsTrue(s == null); + Assert.IsTrue(s != null); + Assert.IsFalse(s != null); + Assert.IsFalse(s == null); + Forwarders.MyAssert(s == null); + Forwarders.MyAssert2(s == null); + } + + void Trivial() + { + Debug.Assert(false); + Debug.Assert(true); + Assert.IsTrue(false); + Assert.IsTrue(true); + Assert.IsFalse(true); + Assert.IsFalse(false); + Forwarders.MyAssert(false); + Forwarders.MyAssert(true); + Forwarders.MyAssert2(false); + Forwarders.MyAssert2(true); + } +} + +// semmle-extractor-options: ${testdir}/../../../resources/stubs/Microsoft.VisualStudio.TestTools.UnitTesting.cs diff --git a/csharp/ql/test/library-tests/commons/Assertions/FailingAssertion.expected b/csharp/ql/test/library-tests/commons/Assertions/FailingAssertion.expected new file mode 100644 index 00000000000..f6d9660c867 --- /dev/null +++ b/csharp/ql/test/library-tests/commons/Assertions/FailingAssertion.expected @@ -0,0 +1,5 @@ +| Assertions.cs:29:9:29:27 | call to method Assert | +| Assertions.cs:31:9:31:28 | call to method IsTrue | +| Assertions.cs:33:9:33:28 | call to method IsFalse | +| Assertions.cs:35:9:35:34 | call to method MyAssert | +| Assertions.cs:37:9:37:35 | call to method MyAssert2 | diff --git a/csharp/ql/test/library-tests/commons/Assertions/FailingAssertion.ql b/csharp/ql/test/library-tests/commons/Assertions/FailingAssertion.ql new file mode 100644 index 00000000000..5f14f4eb756 --- /dev/null +++ b/csharp/ql/test/library-tests/commons/Assertions/FailingAssertion.ql @@ -0,0 +1,4 @@ +import csharp +import semmle.code.csharp.commons.Assertions + +select any(FailingAssertion fa) \ No newline at end of file diff --git a/csharp/ql/test/library-tests/controlflow/graph/BasicBlock.expected b/csharp/ql/test/library-tests/controlflow/graph/BasicBlock.expected index fee1c07c338..3f98400488d 100644 --- a/csharp/ql/test/library-tests/controlflow/graph/BasicBlock.expected +++ b/csharp/ql/test/library-tests/controlflow/graph/BasicBlock.expected @@ -164,35 +164,39 @@ | Conditions.cs:108:13:109:24 | [b (line 102): false] if (...) ... | Conditions.cs:109:17:109:23 | ... = ... | 9 | | Conditions.cs:108:13:109:24 | [b (line 102): true] if (...) ... | Conditions.cs:108:18:108:18 | [b (line 102): true] access to parameter b | 3 | | Conditions.cs:110:16:110:16 | access to local variable x | Conditions.cs:102:12:102:13 | exit M8 | 3 | -| ExitMethods.cs:6:10:6:11 | enter M1 | ExitMethods.cs:6:10:6:11 | exit M1 | 7 | -| ExitMethods.cs:12:10:12:11 | enter M2 | ExitMethods.cs:12:10:12:11 | exit M2 | 7 | -| ExitMethods.cs:18:10:18:11 | enter M3 | ExitMethods.cs:18:10:18:11 | exit M3 | 6 | -| ExitMethods.cs:24:10:24:11 | enter M4 | ExitMethods.cs:24:10:24:11 | exit M4 | 6 | -| ExitMethods.cs:30:10:30:11 | enter M5 | ExitMethods.cs:30:10:30:11 | exit M5 | 6 | -| ExitMethods.cs:36:10:36:11 | enter M6 | ExitMethods.cs:40:13:40:30 | call to method ErrorAlways | 7 | -| ExitMethods.cs:36:10:36:11 | exit M6 | ExitMethods.cs:36:10:36:11 | exit M6 | 1 | -| ExitMethods.cs:42:9:45:9 | [exception: ArgumentException] catch (...) {...} | ExitMethods.cs:42:9:45:9 | [exception: ArgumentException] catch (...) {...} | 1 | -| ExitMethods.cs:42:9:45:9 | [exception: Exception] catch (...) {...} | ExitMethods.cs:42:9:45:9 | [exception: Exception] catch (...) {...} | 1 | -| ExitMethods.cs:43:9:45:9 | {...} | ExitMethods.cs:44:13:44:19 | return ...; | 2 | -| ExitMethods.cs:46:9:49:9 | [exception: Exception] catch (...) {...} | ExitMethods.cs:48:13:48:19 | return ...; | 3 | -| ExitMethods.cs:52:17:52:26 | enter ErrorMaybe | ExitMethods.cs:54:13:54:13 | access to parameter b | 4 | -| ExitMethods.cs:52:17:52:26 | exit ErrorMaybe | ExitMethods.cs:52:17:52:26 | exit ErrorMaybe | 1 | -| ExitMethods.cs:55:19:55:33 | object creation of type Exception | ExitMethods.cs:55:13:55:34 | throw ...; | 2 | -| ExitMethods.cs:58:17:58:27 | enter ErrorAlways | ExitMethods.cs:60:13:60:13 | access to parameter b | 4 | -| ExitMethods.cs:58:17:58:27 | exit ErrorAlways | ExitMethods.cs:58:17:58:27 | exit ErrorAlways | 1 | -| ExitMethods.cs:61:19:61:33 | object creation of type Exception | ExitMethods.cs:61:13:61:34 | throw ...; | 2 | -| ExitMethods.cs:63:41:63:43 | "b" | ExitMethods.cs:63:13:63:45 | throw ...; | 3 | -| ExitMethods.cs:66:10:66:13 | enter Exit | ExitMethods.cs:66:10:66:13 | exit Exit | 6 | -| ExitMethods.cs:71:10:71:24 | enter ApplicationExit | ExitMethods.cs:71:10:71:24 | exit ApplicationExit | 5 | -| ExitMethods.cs:76:13:76:21 | enter ThrowExpr | ExitMethods.cs:78:16:78:25 | ... != ... | 7 | -| ExitMethods.cs:76:13:76:21 | exit ThrowExpr | ExitMethods.cs:76:13:76:21 | exit ThrowExpr | 1 | -| ExitMethods.cs:78:29:78:29 | 1 | ExitMethods.cs:78:9:78:77 | return ...; | 5 | -| ExitMethods.cs:78:69:78:75 | "input" | ExitMethods.cs:78:41:78:76 | throw ... | 3 | -| ExitMethods.cs:81:16:81:34 | enter ExtensionMethodCall | ExitMethods.cs:83:16:83:30 | call to method Contains | 6 | -| ExitMethods.cs:83:9:83:39 | return ...; | ExitMethods.cs:81:16:81:34 | exit ExtensionMethodCall | 2 | -| ExitMethods.cs:83:34:83:34 | 0 | ExitMethods.cs:83:34:83:34 | 0 | 1 | -| ExitMethods.cs:83:38:83:38 | 1 | ExitMethods.cs:83:38:83:38 | 1 | 1 | -| ExitMethods.cs:91:28:91:31 | enter Exit | ExitMethods.cs:91:28:91:31 | exit Exit | 3 | +| ExitMethods.cs:7:10:7:11 | enter M1 | ExitMethods.cs:7:10:7:11 | exit M1 | 7 | +| ExitMethods.cs:13:10:13:11 | enter M2 | ExitMethods.cs:13:10:13:11 | exit M2 | 7 | +| ExitMethods.cs:19:10:19:11 | enter M3 | ExitMethods.cs:19:10:19:11 | exit M3 | 6 | +| ExitMethods.cs:25:10:25:11 | enter M4 | ExitMethods.cs:25:10:25:11 | exit M4 | 6 | +| ExitMethods.cs:31:10:31:11 | enter M5 | ExitMethods.cs:31:10:31:11 | exit M5 | 6 | +| ExitMethods.cs:37:10:37:11 | enter M6 | ExitMethods.cs:41:13:41:30 | call to method ErrorAlways | 7 | +| ExitMethods.cs:37:10:37:11 | exit M6 | ExitMethods.cs:37:10:37:11 | exit M6 | 1 | +| ExitMethods.cs:43:9:46:9 | [exception: ArgumentException] catch (...) {...} | ExitMethods.cs:43:9:46:9 | [exception: ArgumentException] catch (...) {...} | 1 | +| ExitMethods.cs:43:9:46:9 | [exception: Exception] catch (...) {...} | ExitMethods.cs:43:9:46:9 | [exception: Exception] catch (...) {...} | 1 | +| ExitMethods.cs:44:9:46:9 | {...} | ExitMethods.cs:45:13:45:19 | return ...; | 2 | +| ExitMethods.cs:47:9:50:9 | [exception: Exception] catch (...) {...} | ExitMethods.cs:49:13:49:19 | return ...; | 3 | +| ExitMethods.cs:53:17:53:26 | enter ErrorMaybe | ExitMethods.cs:55:13:55:13 | access to parameter b | 4 | +| ExitMethods.cs:53:17:53:26 | exit ErrorMaybe | ExitMethods.cs:53:17:53:26 | exit ErrorMaybe | 1 | +| ExitMethods.cs:56:19:56:33 | object creation of type Exception | ExitMethods.cs:56:13:56:34 | throw ...; | 2 | +| ExitMethods.cs:59:17:59:27 | enter ErrorAlways | ExitMethods.cs:61:13:61:13 | access to parameter b | 4 | +| ExitMethods.cs:59:17:59:27 | exit ErrorAlways | ExitMethods.cs:59:17:59:27 | exit ErrorAlways | 1 | +| ExitMethods.cs:62:19:62:33 | object creation of type Exception | ExitMethods.cs:62:13:62:34 | throw ...; | 2 | +| ExitMethods.cs:64:41:64:43 | "b" | ExitMethods.cs:64:13:64:45 | throw ...; | 3 | +| ExitMethods.cs:67:10:67:13 | enter Exit | ExitMethods.cs:67:10:67:13 | exit Exit | 6 | +| ExitMethods.cs:72:10:72:18 | enter ExitInTry | ExitMethods.cs:72:10:72:18 | exit ExitInTry | 8 | +| ExitMethods.cs:85:10:85:24 | enter ApplicationExit | ExitMethods.cs:85:10:85:24 | exit ApplicationExit | 5 | +| ExitMethods.cs:90:13:90:21 | enter ThrowExpr | ExitMethods.cs:92:16:92:25 | ... != ... | 7 | +| ExitMethods.cs:90:13:90:21 | exit ThrowExpr | ExitMethods.cs:90:13:90:21 | exit ThrowExpr | 1 | +| ExitMethods.cs:92:29:92:29 | 1 | ExitMethods.cs:92:9:92:77 | return ...; | 5 | +| ExitMethods.cs:92:69:92:75 | "input" | ExitMethods.cs:92:41:92:76 | throw ... | 3 | +| ExitMethods.cs:95:16:95:34 | enter ExtensionMethodCall | ExitMethods.cs:97:16:97:30 | call to method Contains | 6 | +| ExitMethods.cs:97:9:97:39 | return ...; | ExitMethods.cs:95:16:95:34 | exit ExtensionMethodCall | 2 | +| ExitMethods.cs:97:34:97:34 | 0 | ExitMethods.cs:97:34:97:34 | 0 | 1 | +| ExitMethods.cs:97:38:97:38 | 1 | ExitMethods.cs:97:38:97:38 | 1 | 1 | +| ExitMethods.cs:100:17:100:32 | enter FailingAssertion | ExitMethods.cs:100:17:100:32 | exit FailingAssertion | 6 | +| ExitMethods.cs:106:17:106:33 | enter FailingAssertion2 | ExitMethods.cs:106:17:106:33 | exit FailingAssertion2 | 6 | +| ExitMethods.cs:112:10:112:20 | enter AssertFalse | ExitMethods.cs:112:10:112:20 | exit AssertFalse | 4 | +| ExitMethods.cs:114:17:114:33 | enter FailingAssertion3 | ExitMethods.cs:114:17:114:33 | exit FailingAssertion3 | 7 | | Extensions.cs:5:23:5:29 | enter ToInt32 | Extensions.cs:5:23:5:29 | exit ToInt32 | 6 | | Extensions.cs:10:24:10:29 | enter ToBool | Extensions.cs:10:24:10:29 | exit ToBool | 7 | | Extensions.cs:15:23:15:33 | enter CallToInt32 | Extensions.cs:15:23:15:33 | exit CallToInt32 | 4 | diff --git a/csharp/ql/test/library-tests/controlflow/graph/BasicBlock.ql b/csharp/ql/test/library-tests/controlflow/graph/BasicBlock.ql index 5e551e4a1ee..7cb2559d9da 100644 --- a/csharp/ql/test/library-tests/controlflow/graph/BasicBlock.ql +++ b/csharp/ql/test/library-tests/controlflow/graph/BasicBlock.ql @@ -1,7 +1,7 @@ import csharp -import semmle.code.csharp.controlflow.BasicBlocks +import Common -from BasicBlock bb +from SourceBasicBlock bb select bb.getFirstNode(), bb.getLastNode(), diff --git a/csharp/ql/test/library-tests/controlflow/graph/BasicBlockDominance.expected b/csharp/ql/test/library-tests/controlflow/graph/BasicBlockDominance.expected index 7109a44b1d9..04c69bbb6c6 100644 --- a/csharp/ql/test/library-tests/controlflow/graph/BasicBlockDominance.expected +++ b/csharp/ql/test/library-tests/controlflow/graph/BasicBlockDominance.expected @@ -360,52 +360,56 @@ | post | Conditions.cs:110:16:110:16 | access to local variable x | Conditions.cs:108:13:109:24 | [b (line 102): false] if (...) ... | | post | Conditions.cs:110:16:110:16 | access to local variable x | Conditions.cs:108:13:109:24 | [b (line 102): true] if (...) ... | | post | Conditions.cs:110:16:110:16 | access to local variable x | Conditions.cs:110:16:110:16 | access to local variable x | -| post | ExitMethods.cs:6:10:6:11 | enter M1 | ExitMethods.cs:6:10:6:11 | enter M1 | -| post | ExitMethods.cs:12:10:12:11 | enter M2 | ExitMethods.cs:12:10:12:11 | enter M2 | -| post | ExitMethods.cs:18:10:18:11 | enter M3 | ExitMethods.cs:18:10:18:11 | enter M3 | -| post | ExitMethods.cs:24:10:24:11 | enter M4 | ExitMethods.cs:24:10:24:11 | enter M4 | -| post | ExitMethods.cs:30:10:30:11 | enter M5 | ExitMethods.cs:30:10:30:11 | enter M5 | -| post | ExitMethods.cs:36:10:36:11 | enter M6 | ExitMethods.cs:36:10:36:11 | enter M6 | -| post | ExitMethods.cs:36:10:36:11 | exit M6 | ExitMethods.cs:36:10:36:11 | enter M6 | -| post | ExitMethods.cs:36:10:36:11 | exit M6 | ExitMethods.cs:36:10:36:11 | exit M6 | -| post | ExitMethods.cs:36:10:36:11 | exit M6 | ExitMethods.cs:42:9:45:9 | [exception: ArgumentException] catch (...) {...} | -| post | ExitMethods.cs:36:10:36:11 | exit M6 | ExitMethods.cs:42:9:45:9 | [exception: Exception] catch (...) {...} | -| post | ExitMethods.cs:36:10:36:11 | exit M6 | ExitMethods.cs:43:9:45:9 | {...} | -| post | ExitMethods.cs:36:10:36:11 | exit M6 | ExitMethods.cs:46:9:49:9 | [exception: Exception] catch (...) {...} | -| post | ExitMethods.cs:42:9:45:9 | [exception: ArgumentException] catch (...) {...} | ExitMethods.cs:42:9:45:9 | [exception: ArgumentException] catch (...) {...} | -| post | ExitMethods.cs:42:9:45:9 | [exception: Exception] catch (...) {...} | ExitMethods.cs:42:9:45:9 | [exception: Exception] catch (...) {...} | -| post | ExitMethods.cs:43:9:45:9 | {...} | ExitMethods.cs:42:9:45:9 | [exception: ArgumentException] catch (...) {...} | -| post | ExitMethods.cs:43:9:45:9 | {...} | ExitMethods.cs:43:9:45:9 | {...} | -| post | ExitMethods.cs:46:9:49:9 | [exception: Exception] catch (...) {...} | ExitMethods.cs:46:9:49:9 | [exception: Exception] catch (...) {...} | -| post | ExitMethods.cs:52:17:52:26 | enter ErrorMaybe | ExitMethods.cs:52:17:52:26 | enter ErrorMaybe | -| post | ExitMethods.cs:52:17:52:26 | exit ErrorMaybe | ExitMethods.cs:52:17:52:26 | enter ErrorMaybe | -| post | ExitMethods.cs:52:17:52:26 | exit ErrorMaybe | ExitMethods.cs:52:17:52:26 | exit ErrorMaybe | -| post | ExitMethods.cs:52:17:52:26 | exit ErrorMaybe | ExitMethods.cs:55:19:55:33 | object creation of type Exception | -| post | ExitMethods.cs:55:19:55:33 | object creation of type Exception | ExitMethods.cs:55:19:55:33 | object creation of type Exception | -| post | ExitMethods.cs:58:17:58:27 | enter ErrorAlways | ExitMethods.cs:58:17:58:27 | enter ErrorAlways | -| post | ExitMethods.cs:58:17:58:27 | exit ErrorAlways | ExitMethods.cs:58:17:58:27 | enter ErrorAlways | -| post | ExitMethods.cs:58:17:58:27 | exit ErrorAlways | ExitMethods.cs:58:17:58:27 | exit ErrorAlways | -| post | ExitMethods.cs:58:17:58:27 | exit ErrorAlways | ExitMethods.cs:61:19:61:33 | object creation of type Exception | -| post | ExitMethods.cs:58:17:58:27 | exit ErrorAlways | ExitMethods.cs:63:41:63:43 | "b" | -| post | ExitMethods.cs:61:19:61:33 | object creation of type Exception | ExitMethods.cs:61:19:61:33 | object creation of type Exception | -| post | ExitMethods.cs:63:41:63:43 | "b" | ExitMethods.cs:63:41:63:43 | "b" | -| post | ExitMethods.cs:66:10:66:13 | enter Exit | ExitMethods.cs:66:10:66:13 | enter Exit | -| post | ExitMethods.cs:71:10:71:24 | enter ApplicationExit | ExitMethods.cs:71:10:71:24 | enter ApplicationExit | -| post | ExitMethods.cs:76:13:76:21 | enter ThrowExpr | ExitMethods.cs:76:13:76:21 | enter ThrowExpr | -| post | ExitMethods.cs:76:13:76:21 | exit ThrowExpr | ExitMethods.cs:76:13:76:21 | enter ThrowExpr | -| post | ExitMethods.cs:76:13:76:21 | exit ThrowExpr | ExitMethods.cs:76:13:76:21 | exit ThrowExpr | -| post | ExitMethods.cs:76:13:76:21 | exit ThrowExpr | ExitMethods.cs:78:29:78:29 | 1 | -| post | ExitMethods.cs:76:13:76:21 | exit ThrowExpr | ExitMethods.cs:78:69:78:75 | "input" | -| post | ExitMethods.cs:78:29:78:29 | 1 | ExitMethods.cs:78:29:78:29 | 1 | -| post | ExitMethods.cs:78:69:78:75 | "input" | ExitMethods.cs:78:69:78:75 | "input" | -| post | ExitMethods.cs:81:16:81:34 | enter ExtensionMethodCall | ExitMethods.cs:81:16:81:34 | enter ExtensionMethodCall | -| post | ExitMethods.cs:83:9:83:39 | return ...; | ExitMethods.cs:81:16:81:34 | enter ExtensionMethodCall | -| post | ExitMethods.cs:83:9:83:39 | return ...; | ExitMethods.cs:83:9:83:39 | return ...; | -| post | ExitMethods.cs:83:9:83:39 | return ...; | ExitMethods.cs:83:34:83:34 | 0 | -| post | ExitMethods.cs:83:9:83:39 | return ...; | ExitMethods.cs:83:38:83:38 | 1 | -| post | ExitMethods.cs:83:34:83:34 | 0 | ExitMethods.cs:83:34:83:34 | 0 | -| post | ExitMethods.cs:83:38:83:38 | 1 | ExitMethods.cs:83:38:83:38 | 1 | -| post | ExitMethods.cs:91:28:91:31 | enter Exit | ExitMethods.cs:91:28:91:31 | enter Exit | +| post | ExitMethods.cs:7:10:7:11 | enter M1 | ExitMethods.cs:7:10:7:11 | enter M1 | +| post | ExitMethods.cs:13:10:13:11 | enter M2 | ExitMethods.cs:13:10:13:11 | enter M2 | +| post | ExitMethods.cs:19:10:19:11 | enter M3 | ExitMethods.cs:19:10:19:11 | enter M3 | +| post | ExitMethods.cs:25:10:25:11 | enter M4 | ExitMethods.cs:25:10:25:11 | enter M4 | +| post | ExitMethods.cs:31:10:31:11 | enter M5 | ExitMethods.cs:31:10:31:11 | enter M5 | +| post | ExitMethods.cs:37:10:37:11 | enter M6 | ExitMethods.cs:37:10:37:11 | enter M6 | +| post | ExitMethods.cs:37:10:37:11 | exit M6 | ExitMethods.cs:37:10:37:11 | enter M6 | +| post | ExitMethods.cs:37:10:37:11 | exit M6 | ExitMethods.cs:37:10:37:11 | exit M6 | +| post | ExitMethods.cs:37:10:37:11 | exit M6 | ExitMethods.cs:43:9:46:9 | [exception: ArgumentException] catch (...) {...} | +| post | ExitMethods.cs:37:10:37:11 | exit M6 | ExitMethods.cs:43:9:46:9 | [exception: Exception] catch (...) {...} | +| post | ExitMethods.cs:37:10:37:11 | exit M6 | ExitMethods.cs:44:9:46:9 | {...} | +| post | ExitMethods.cs:37:10:37:11 | exit M6 | ExitMethods.cs:47:9:50:9 | [exception: Exception] catch (...) {...} | +| post | ExitMethods.cs:43:9:46:9 | [exception: ArgumentException] catch (...) {...} | ExitMethods.cs:43:9:46:9 | [exception: ArgumentException] catch (...) {...} | +| post | ExitMethods.cs:43:9:46:9 | [exception: Exception] catch (...) {...} | ExitMethods.cs:43:9:46:9 | [exception: Exception] catch (...) {...} | +| post | ExitMethods.cs:44:9:46:9 | {...} | ExitMethods.cs:43:9:46:9 | [exception: ArgumentException] catch (...) {...} | +| post | ExitMethods.cs:44:9:46:9 | {...} | ExitMethods.cs:44:9:46:9 | {...} | +| post | ExitMethods.cs:47:9:50:9 | [exception: Exception] catch (...) {...} | ExitMethods.cs:47:9:50:9 | [exception: Exception] catch (...) {...} | +| post | ExitMethods.cs:53:17:53:26 | enter ErrorMaybe | ExitMethods.cs:53:17:53:26 | enter ErrorMaybe | +| post | ExitMethods.cs:53:17:53:26 | exit ErrorMaybe | ExitMethods.cs:53:17:53:26 | enter ErrorMaybe | +| post | ExitMethods.cs:53:17:53:26 | exit ErrorMaybe | ExitMethods.cs:53:17:53:26 | exit ErrorMaybe | +| post | ExitMethods.cs:53:17:53:26 | exit ErrorMaybe | ExitMethods.cs:56:19:56:33 | object creation of type Exception | +| post | ExitMethods.cs:56:19:56:33 | object creation of type Exception | ExitMethods.cs:56:19:56:33 | object creation of type Exception | +| post | ExitMethods.cs:59:17:59:27 | enter ErrorAlways | ExitMethods.cs:59:17:59:27 | enter ErrorAlways | +| post | ExitMethods.cs:59:17:59:27 | exit ErrorAlways | ExitMethods.cs:59:17:59:27 | enter ErrorAlways | +| post | ExitMethods.cs:59:17:59:27 | exit ErrorAlways | ExitMethods.cs:59:17:59:27 | exit ErrorAlways | +| post | ExitMethods.cs:59:17:59:27 | exit ErrorAlways | ExitMethods.cs:62:19:62:33 | object creation of type Exception | +| post | ExitMethods.cs:59:17:59:27 | exit ErrorAlways | ExitMethods.cs:64:41:64:43 | "b" | +| post | ExitMethods.cs:62:19:62:33 | object creation of type Exception | ExitMethods.cs:62:19:62:33 | object creation of type Exception | +| post | ExitMethods.cs:64:41:64:43 | "b" | ExitMethods.cs:64:41:64:43 | "b" | +| post | ExitMethods.cs:67:10:67:13 | enter Exit | ExitMethods.cs:67:10:67:13 | enter Exit | +| post | ExitMethods.cs:72:10:72:18 | enter ExitInTry | ExitMethods.cs:72:10:72:18 | enter ExitInTry | +| post | ExitMethods.cs:85:10:85:24 | enter ApplicationExit | ExitMethods.cs:85:10:85:24 | enter ApplicationExit | +| post | ExitMethods.cs:90:13:90:21 | enter ThrowExpr | ExitMethods.cs:90:13:90:21 | enter ThrowExpr | +| post | ExitMethods.cs:90:13:90:21 | exit ThrowExpr | ExitMethods.cs:90:13:90:21 | enter ThrowExpr | +| post | ExitMethods.cs:90:13:90:21 | exit ThrowExpr | ExitMethods.cs:90:13:90:21 | exit ThrowExpr | +| post | ExitMethods.cs:90:13:90:21 | exit ThrowExpr | ExitMethods.cs:92:29:92:29 | 1 | +| post | ExitMethods.cs:90:13:90:21 | exit ThrowExpr | ExitMethods.cs:92:69:92:75 | "input" | +| post | ExitMethods.cs:92:29:92:29 | 1 | ExitMethods.cs:92:29:92:29 | 1 | +| post | ExitMethods.cs:92:69:92:75 | "input" | ExitMethods.cs:92:69:92:75 | "input" | +| post | ExitMethods.cs:95:16:95:34 | enter ExtensionMethodCall | ExitMethods.cs:95:16:95:34 | enter ExtensionMethodCall | +| post | ExitMethods.cs:97:9:97:39 | return ...; | ExitMethods.cs:95:16:95:34 | enter ExtensionMethodCall | +| post | ExitMethods.cs:97:9:97:39 | return ...; | ExitMethods.cs:97:9:97:39 | return ...; | +| post | ExitMethods.cs:97:9:97:39 | return ...; | ExitMethods.cs:97:34:97:34 | 0 | +| post | ExitMethods.cs:97:9:97:39 | return ...; | ExitMethods.cs:97:38:97:38 | 1 | +| post | ExitMethods.cs:97:34:97:34 | 0 | ExitMethods.cs:97:34:97:34 | 0 | +| post | ExitMethods.cs:97:38:97:38 | 1 | ExitMethods.cs:97:38:97:38 | 1 | +| post | ExitMethods.cs:100:17:100:32 | enter FailingAssertion | ExitMethods.cs:100:17:100:32 | enter FailingAssertion | +| post | ExitMethods.cs:106:17:106:33 | enter FailingAssertion2 | ExitMethods.cs:106:17:106:33 | enter FailingAssertion2 | +| post | ExitMethods.cs:112:10:112:20 | enter AssertFalse | ExitMethods.cs:112:10:112:20 | enter AssertFalse | +| post | ExitMethods.cs:114:17:114:33 | enter FailingAssertion3 | ExitMethods.cs:114:17:114:33 | enter FailingAssertion3 | | post | Extensions.cs:5:23:5:29 | enter ToInt32 | Extensions.cs:5:23:5:29 | enter ToInt32 | | post | Extensions.cs:10:24:10:29 | enter ToBool | Extensions.cs:10:24:10:29 | enter ToBool | | post | Extensions.cs:15:23:15:33 | enter CallToInt32 | Extensions.cs:15:23:15:33 | enter CallToInt32 | @@ -1701,52 +1705,56 @@ | pre | Conditions.cs:108:13:109:24 | [b (line 102): false] if (...) ... | Conditions.cs:108:13:109:24 | [b (line 102): false] if (...) ... | | pre | Conditions.cs:108:13:109:24 | [b (line 102): true] if (...) ... | Conditions.cs:108:13:109:24 | [b (line 102): true] if (...) ... | | pre | Conditions.cs:110:16:110:16 | access to local variable x | Conditions.cs:110:16:110:16 | access to local variable x | -| pre | ExitMethods.cs:6:10:6:11 | enter M1 | ExitMethods.cs:6:10:6:11 | enter M1 | -| pre | ExitMethods.cs:12:10:12:11 | enter M2 | ExitMethods.cs:12:10:12:11 | enter M2 | -| pre | ExitMethods.cs:18:10:18:11 | enter M3 | ExitMethods.cs:18:10:18:11 | enter M3 | -| pre | ExitMethods.cs:24:10:24:11 | enter M4 | ExitMethods.cs:24:10:24:11 | enter M4 | -| pre | ExitMethods.cs:30:10:30:11 | enter M5 | ExitMethods.cs:30:10:30:11 | enter M5 | -| pre | ExitMethods.cs:36:10:36:11 | enter M6 | ExitMethods.cs:36:10:36:11 | enter M6 | -| pre | ExitMethods.cs:36:10:36:11 | enter M6 | ExitMethods.cs:36:10:36:11 | exit M6 | -| pre | ExitMethods.cs:36:10:36:11 | enter M6 | ExitMethods.cs:42:9:45:9 | [exception: ArgumentException] catch (...) {...} | -| pre | ExitMethods.cs:36:10:36:11 | enter M6 | ExitMethods.cs:42:9:45:9 | [exception: Exception] catch (...) {...} | -| pre | ExitMethods.cs:36:10:36:11 | enter M6 | ExitMethods.cs:43:9:45:9 | {...} | -| pre | ExitMethods.cs:36:10:36:11 | enter M6 | ExitMethods.cs:46:9:49:9 | [exception: Exception] catch (...) {...} | -| pre | ExitMethods.cs:36:10:36:11 | exit M6 | ExitMethods.cs:36:10:36:11 | exit M6 | -| pre | ExitMethods.cs:42:9:45:9 | [exception: ArgumentException] catch (...) {...} | ExitMethods.cs:42:9:45:9 | [exception: ArgumentException] catch (...) {...} | -| pre | ExitMethods.cs:42:9:45:9 | [exception: Exception] catch (...) {...} | ExitMethods.cs:42:9:45:9 | [exception: Exception] catch (...) {...} | -| pre | ExitMethods.cs:42:9:45:9 | [exception: Exception] catch (...) {...} | ExitMethods.cs:46:9:49:9 | [exception: Exception] catch (...) {...} | -| pre | ExitMethods.cs:43:9:45:9 | {...} | ExitMethods.cs:43:9:45:9 | {...} | -| pre | ExitMethods.cs:46:9:49:9 | [exception: Exception] catch (...) {...} | ExitMethods.cs:46:9:49:9 | [exception: Exception] catch (...) {...} | -| pre | ExitMethods.cs:52:17:52:26 | enter ErrorMaybe | ExitMethods.cs:52:17:52:26 | enter ErrorMaybe | -| pre | ExitMethods.cs:52:17:52:26 | enter ErrorMaybe | ExitMethods.cs:52:17:52:26 | exit ErrorMaybe | -| pre | ExitMethods.cs:52:17:52:26 | enter ErrorMaybe | ExitMethods.cs:55:19:55:33 | object creation of type Exception | -| pre | ExitMethods.cs:52:17:52:26 | exit ErrorMaybe | ExitMethods.cs:52:17:52:26 | exit ErrorMaybe | -| pre | ExitMethods.cs:55:19:55:33 | object creation of type Exception | ExitMethods.cs:55:19:55:33 | object creation of type Exception | -| pre | ExitMethods.cs:58:17:58:27 | enter ErrorAlways | ExitMethods.cs:58:17:58:27 | enter ErrorAlways | -| pre | ExitMethods.cs:58:17:58:27 | enter ErrorAlways | ExitMethods.cs:58:17:58:27 | exit ErrorAlways | -| pre | ExitMethods.cs:58:17:58:27 | enter ErrorAlways | ExitMethods.cs:61:19:61:33 | object creation of type Exception | -| pre | ExitMethods.cs:58:17:58:27 | enter ErrorAlways | ExitMethods.cs:63:41:63:43 | "b" | -| pre | ExitMethods.cs:58:17:58:27 | exit ErrorAlways | ExitMethods.cs:58:17:58:27 | exit ErrorAlways | -| pre | ExitMethods.cs:61:19:61:33 | object creation of type Exception | ExitMethods.cs:61:19:61:33 | object creation of type Exception | -| pre | ExitMethods.cs:63:41:63:43 | "b" | ExitMethods.cs:63:41:63:43 | "b" | -| pre | ExitMethods.cs:66:10:66:13 | enter Exit | ExitMethods.cs:66:10:66:13 | enter Exit | -| pre | ExitMethods.cs:71:10:71:24 | enter ApplicationExit | ExitMethods.cs:71:10:71:24 | enter ApplicationExit | -| pre | ExitMethods.cs:76:13:76:21 | enter ThrowExpr | ExitMethods.cs:76:13:76:21 | enter ThrowExpr | -| pre | ExitMethods.cs:76:13:76:21 | enter ThrowExpr | ExitMethods.cs:76:13:76:21 | exit ThrowExpr | -| pre | ExitMethods.cs:76:13:76:21 | enter ThrowExpr | ExitMethods.cs:78:29:78:29 | 1 | -| pre | ExitMethods.cs:76:13:76:21 | enter ThrowExpr | ExitMethods.cs:78:69:78:75 | "input" | -| pre | ExitMethods.cs:76:13:76:21 | exit ThrowExpr | ExitMethods.cs:76:13:76:21 | exit ThrowExpr | -| pre | ExitMethods.cs:78:29:78:29 | 1 | ExitMethods.cs:78:29:78:29 | 1 | -| pre | ExitMethods.cs:78:69:78:75 | "input" | ExitMethods.cs:78:69:78:75 | "input" | -| pre | ExitMethods.cs:81:16:81:34 | enter ExtensionMethodCall | ExitMethods.cs:81:16:81:34 | enter ExtensionMethodCall | -| pre | ExitMethods.cs:81:16:81:34 | enter ExtensionMethodCall | ExitMethods.cs:83:9:83:39 | return ...; | -| pre | ExitMethods.cs:81:16:81:34 | enter ExtensionMethodCall | ExitMethods.cs:83:34:83:34 | 0 | -| pre | ExitMethods.cs:81:16:81:34 | enter ExtensionMethodCall | ExitMethods.cs:83:38:83:38 | 1 | -| pre | ExitMethods.cs:83:9:83:39 | return ...; | ExitMethods.cs:83:9:83:39 | return ...; | -| pre | ExitMethods.cs:83:34:83:34 | 0 | ExitMethods.cs:83:34:83:34 | 0 | -| pre | ExitMethods.cs:83:38:83:38 | 1 | ExitMethods.cs:83:38:83:38 | 1 | -| pre | ExitMethods.cs:91:28:91:31 | enter Exit | ExitMethods.cs:91:28:91:31 | enter Exit | +| pre | ExitMethods.cs:7:10:7:11 | enter M1 | ExitMethods.cs:7:10:7:11 | enter M1 | +| pre | ExitMethods.cs:13:10:13:11 | enter M2 | ExitMethods.cs:13:10:13:11 | enter M2 | +| pre | ExitMethods.cs:19:10:19:11 | enter M3 | ExitMethods.cs:19:10:19:11 | enter M3 | +| pre | ExitMethods.cs:25:10:25:11 | enter M4 | ExitMethods.cs:25:10:25:11 | enter M4 | +| pre | ExitMethods.cs:31:10:31:11 | enter M5 | ExitMethods.cs:31:10:31:11 | enter M5 | +| pre | ExitMethods.cs:37:10:37:11 | enter M6 | ExitMethods.cs:37:10:37:11 | enter M6 | +| pre | ExitMethods.cs:37:10:37:11 | enter M6 | ExitMethods.cs:37:10:37:11 | exit M6 | +| pre | ExitMethods.cs:37:10:37:11 | enter M6 | ExitMethods.cs:43:9:46:9 | [exception: ArgumentException] catch (...) {...} | +| pre | ExitMethods.cs:37:10:37:11 | enter M6 | ExitMethods.cs:43:9:46:9 | [exception: Exception] catch (...) {...} | +| pre | ExitMethods.cs:37:10:37:11 | enter M6 | ExitMethods.cs:44:9:46:9 | {...} | +| pre | ExitMethods.cs:37:10:37:11 | enter M6 | ExitMethods.cs:47:9:50:9 | [exception: Exception] catch (...) {...} | +| pre | ExitMethods.cs:37:10:37:11 | exit M6 | ExitMethods.cs:37:10:37:11 | exit M6 | +| pre | ExitMethods.cs:43:9:46:9 | [exception: ArgumentException] catch (...) {...} | ExitMethods.cs:43:9:46:9 | [exception: ArgumentException] catch (...) {...} | +| pre | ExitMethods.cs:43:9:46:9 | [exception: Exception] catch (...) {...} | ExitMethods.cs:43:9:46:9 | [exception: Exception] catch (...) {...} | +| pre | ExitMethods.cs:43:9:46:9 | [exception: Exception] catch (...) {...} | ExitMethods.cs:47:9:50:9 | [exception: Exception] catch (...) {...} | +| pre | ExitMethods.cs:44:9:46:9 | {...} | ExitMethods.cs:44:9:46:9 | {...} | +| pre | ExitMethods.cs:47:9:50:9 | [exception: Exception] catch (...) {...} | ExitMethods.cs:47:9:50:9 | [exception: Exception] catch (...) {...} | +| pre | ExitMethods.cs:53:17:53:26 | enter ErrorMaybe | ExitMethods.cs:53:17:53:26 | enter ErrorMaybe | +| pre | ExitMethods.cs:53:17:53:26 | enter ErrorMaybe | ExitMethods.cs:53:17:53:26 | exit ErrorMaybe | +| pre | ExitMethods.cs:53:17:53:26 | enter ErrorMaybe | ExitMethods.cs:56:19:56:33 | object creation of type Exception | +| pre | ExitMethods.cs:53:17:53:26 | exit ErrorMaybe | ExitMethods.cs:53:17:53:26 | exit ErrorMaybe | +| pre | ExitMethods.cs:56:19:56:33 | object creation of type Exception | ExitMethods.cs:56:19:56:33 | object creation of type Exception | +| pre | ExitMethods.cs:59:17:59:27 | enter ErrorAlways | ExitMethods.cs:59:17:59:27 | enter ErrorAlways | +| pre | ExitMethods.cs:59:17:59:27 | enter ErrorAlways | ExitMethods.cs:59:17:59:27 | exit ErrorAlways | +| pre | ExitMethods.cs:59:17:59:27 | enter ErrorAlways | ExitMethods.cs:62:19:62:33 | object creation of type Exception | +| pre | ExitMethods.cs:59:17:59:27 | enter ErrorAlways | ExitMethods.cs:64:41:64:43 | "b" | +| pre | ExitMethods.cs:59:17:59:27 | exit ErrorAlways | ExitMethods.cs:59:17:59:27 | exit ErrorAlways | +| pre | ExitMethods.cs:62:19:62:33 | object creation of type Exception | ExitMethods.cs:62:19:62:33 | object creation of type Exception | +| pre | ExitMethods.cs:64:41:64:43 | "b" | ExitMethods.cs:64:41:64:43 | "b" | +| pre | ExitMethods.cs:67:10:67:13 | enter Exit | ExitMethods.cs:67:10:67:13 | enter Exit | +| pre | ExitMethods.cs:72:10:72:18 | enter ExitInTry | ExitMethods.cs:72:10:72:18 | enter ExitInTry | +| pre | ExitMethods.cs:85:10:85:24 | enter ApplicationExit | ExitMethods.cs:85:10:85:24 | enter ApplicationExit | +| pre | ExitMethods.cs:90:13:90:21 | enter ThrowExpr | ExitMethods.cs:90:13:90:21 | enter ThrowExpr | +| pre | ExitMethods.cs:90:13:90:21 | enter ThrowExpr | ExitMethods.cs:90:13:90:21 | exit ThrowExpr | +| pre | ExitMethods.cs:90:13:90:21 | enter ThrowExpr | ExitMethods.cs:92:29:92:29 | 1 | +| pre | ExitMethods.cs:90:13:90:21 | enter ThrowExpr | ExitMethods.cs:92:69:92:75 | "input" | +| pre | ExitMethods.cs:90:13:90:21 | exit ThrowExpr | ExitMethods.cs:90:13:90:21 | exit ThrowExpr | +| pre | ExitMethods.cs:92:29:92:29 | 1 | ExitMethods.cs:92:29:92:29 | 1 | +| pre | ExitMethods.cs:92:69:92:75 | "input" | ExitMethods.cs:92:69:92:75 | "input" | +| pre | ExitMethods.cs:95:16:95:34 | enter ExtensionMethodCall | ExitMethods.cs:95:16:95:34 | enter ExtensionMethodCall | +| pre | ExitMethods.cs:95:16:95:34 | enter ExtensionMethodCall | ExitMethods.cs:97:9:97:39 | return ...; | +| pre | ExitMethods.cs:95:16:95:34 | enter ExtensionMethodCall | ExitMethods.cs:97:34:97:34 | 0 | +| pre | ExitMethods.cs:95:16:95:34 | enter ExtensionMethodCall | ExitMethods.cs:97:38:97:38 | 1 | +| pre | ExitMethods.cs:97:9:97:39 | return ...; | ExitMethods.cs:97:9:97:39 | return ...; | +| pre | ExitMethods.cs:97:34:97:34 | 0 | ExitMethods.cs:97:34:97:34 | 0 | +| pre | ExitMethods.cs:97:38:97:38 | 1 | ExitMethods.cs:97:38:97:38 | 1 | +| pre | ExitMethods.cs:100:17:100:32 | enter FailingAssertion | ExitMethods.cs:100:17:100:32 | enter FailingAssertion | +| pre | ExitMethods.cs:106:17:106:33 | enter FailingAssertion2 | ExitMethods.cs:106:17:106:33 | enter FailingAssertion2 | +| pre | ExitMethods.cs:112:10:112:20 | enter AssertFalse | ExitMethods.cs:112:10:112:20 | enter AssertFalse | +| pre | ExitMethods.cs:114:17:114:33 | enter FailingAssertion3 | ExitMethods.cs:114:17:114:33 | enter FailingAssertion3 | | pre | Extensions.cs:5:23:5:29 | enter ToInt32 | Extensions.cs:5:23:5:29 | enter ToInt32 | | pre | Extensions.cs:10:24:10:29 | enter ToBool | Extensions.cs:10:24:10:29 | enter ToBool | | pre | Extensions.cs:15:23:15:33 | enter CallToInt32 | Extensions.cs:15:23:15:33 | enter CallToInt32 | diff --git a/csharp/ql/test/library-tests/controlflow/graph/BasicBlockDominance.ql b/csharp/ql/test/library-tests/controlflow/graph/BasicBlockDominance.ql index 647ed61628a..da013749418 100644 --- a/csharp/ql/test/library-tests/controlflow/graph/BasicBlockDominance.ql +++ b/csharp/ql/test/library-tests/controlflow/graph/BasicBlockDominance.ql @@ -1,7 +1,7 @@ import csharp -import semmle.code.csharp.controlflow.BasicBlocks +import Common -from BasicBlock dom, BasicBlock bb, string s +from SourceBasicBlock dom, SourceBasicBlock bb, string s where dom.dominates(bb) and s = "pre" or diff --git a/csharp/ql/test/library-tests/controlflow/graph/Common.qll b/csharp/ql/test/library-tests/controlflow/graph/Common.qll new file mode 100644 index 00000000000..625bbf242d5 --- /dev/null +++ b/csharp/ql/test/library-tests/controlflow/graph/Common.qll @@ -0,0 +1,25 @@ +import csharp + +class StubFile extends File { + StubFile() { + this.getAbsolutePath().matches("%resources/stubs/%") + } +} + +class SourceControlFlowElement extends ControlFlowElement { + SourceControlFlowElement() { + not this.getLocation().getFile() instanceof StubFile + } +} + +class SourceControlFlowNode extends ControlFlow::Node { + SourceControlFlowNode() { + not this.getLocation().getFile() instanceof StubFile + } +} + +class SourceBasicBlock extends ControlFlow::BasicBlock { + SourceBasicBlock() { + not this.getLocation().getFile() instanceof StubFile + } +} diff --git a/csharp/ql/test/library-tests/controlflow/graph/ConditionBlock.expected b/csharp/ql/test/library-tests/controlflow/graph/ConditionBlock.expected index 85d1641124d..6c29210d9a9 100644 --- a/csharp/ql/test/library-tests/controlflow/graph/ConditionBlock.expected +++ b/csharp/ql/test/library-tests/controlflow/graph/ConditionBlock.expected @@ -155,14 +155,14 @@ | Conditions.cs:105:13:105:13 | access to parameter b | Conditions.cs:108:13:109:24 | [b (line 102): true] if (...) ... | true | | Conditions.cs:107:13:107:24 | [b (line 102): false] ... > ... | Conditions.cs:108:13:109:24 | [b (line 102): false] if (...) ... | true | | Conditions.cs:107:13:107:24 | [b (line 102): true] ... > ... | Conditions.cs:108:13:109:24 | [b (line 102): true] if (...) ... | true | -| ExitMethods.cs:42:9:45:9 | [exception: Exception] catch (...) {...} | ExitMethods.cs:46:9:49:9 | [exception: Exception] catch (...) {...} | false | -| ExitMethods.cs:54:13:54:13 | access to parameter b | ExitMethods.cs:55:19:55:33 | object creation of type Exception | true | -| ExitMethods.cs:60:13:60:13 | access to parameter b | ExitMethods.cs:61:19:61:33 | object creation of type Exception | true | -| ExitMethods.cs:60:13:60:13 | access to parameter b | ExitMethods.cs:63:41:63:43 | "b" | false | -| ExitMethods.cs:78:16:78:25 | ... != ... | ExitMethods.cs:78:29:78:29 | 1 | true | -| ExitMethods.cs:78:16:78:25 | ... != ... | ExitMethods.cs:78:69:78:75 | "input" | false | -| ExitMethods.cs:83:16:83:30 | call to method Contains | ExitMethods.cs:83:34:83:34 | 0 | true | -| ExitMethods.cs:83:16:83:30 | call to method Contains | ExitMethods.cs:83:38:83:38 | 1 | false | +| ExitMethods.cs:43:9:46:9 | [exception: Exception] catch (...) {...} | ExitMethods.cs:47:9:50:9 | [exception: Exception] catch (...) {...} | false | +| ExitMethods.cs:55:13:55:13 | access to parameter b | ExitMethods.cs:56:19:56:33 | object creation of type Exception | true | +| ExitMethods.cs:61:13:61:13 | access to parameter b | ExitMethods.cs:62:19:62:33 | object creation of type Exception | true | +| ExitMethods.cs:61:13:61:13 | access to parameter b | ExitMethods.cs:64:41:64:43 | "b" | false | +| ExitMethods.cs:92:16:92:25 | ... != ... | ExitMethods.cs:92:29:92:29 | 1 | true | +| ExitMethods.cs:92:16:92:25 | ... != ... | ExitMethods.cs:92:69:92:75 | "input" | false | +| ExitMethods.cs:97:16:97:30 | call to method Contains | ExitMethods.cs:97:34:97:34 | 0 | true | +| ExitMethods.cs:97:16:97:30 | call to method Contains | ExitMethods.cs:97:38:97:38 | 1 | false | | Foreach.cs:8:9:9:13 | foreach (... ... in ...) ... | Foreach.cs:6:10:6:11 | exit M1 | true | | Foreach.cs:8:9:9:13 | foreach (... ... in ...) ... | Foreach.cs:8:22:8:24 | String arg | false | | Foreach.cs:14:9:15:13 | foreach (... ... in ...) ... | Foreach.cs:12:10:12:11 | exit M2 | true | diff --git a/csharp/ql/test/library-tests/controlflow/graph/ConditionalFlow.expected b/csharp/ql/test/library-tests/controlflow/graph/ConditionalFlow.expected index 0401681e4d8..3e5ddc8b28a 100644 --- a/csharp/ql/test/library-tests/controlflow/graph/ConditionalFlow.expected +++ b/csharp/ql/test/library-tests/controlflow/graph/ConditionalFlow.expected @@ -116,10 +116,8 @@ | 51 | 17 | Conditions.cs:51:17:51:17 | [b (line 46): true] access to parameter b | true | 52 | 17 | Conditions.cs:52:17:52:20 | [b (line 46): true] ...; | | 51 | 17 | Conditions.cs:51:17:51:17 | access to parameter b | false | 49 | 16 | Conditions.cs:49:16:49:16 | [b (line 46): false] access to parameter x | | 51 | 17 | Conditions.cs:51:17:51:17 | access to parameter b | true | 52 | 17 | Conditions.cs:52:17:52:20 | [b (line 46): true] ...; | -| 54 | 13 | ExitMethods.cs:54:13:54:13 | access to parameter b | false | 52 | 17 | ExitMethods.cs:52:17:52:26 | exit ErrorMaybe | -| 54 | 13 | ExitMethods.cs:54:13:54:13 | access to parameter b | true | 55 | 19 | ExitMethods.cs:55:19:55:33 | object creation of type Exception | -| 60 | 13 | ExitMethods.cs:60:13:60:13 | access to parameter b | false | 63 | 41 | ExitMethods.cs:63:41:63:43 | "b" | -| 60 | 13 | ExitMethods.cs:60:13:60:13 | access to parameter b | true | 61 | 19 | ExitMethods.cs:61:19:61:33 | object creation of type Exception | +| 55 | 13 | ExitMethods.cs:55:13:55:13 | access to parameter b | false | 53 | 17 | ExitMethods.cs:53:17:53:26 | exit ErrorMaybe | +| 55 | 13 | ExitMethods.cs:55:13:55:13 | access to parameter b | true | 56 | 19 | ExitMethods.cs:56:19:56:33 | object creation of type Exception | | 60 | 16 | Conditions.cs:60:16:60:22 | ... > ... | false | 65 | 9 | Conditions.cs:65:9:66:16 | if (...) ... | | 60 | 16 | Conditions.cs:60:16:60:22 | ... > ... | true | 61 | 9 | Conditions.cs:61:9:64:9 | {...} | | 60 | 16 | Conditions.cs:60:16:60:22 | [b (line 57): false] ... > ... | false | 65 | 9 | Conditions.cs:65:9:66:16 | [b (line 57): false] if (...) ... | @@ -128,6 +126,8 @@ | 60 | 16 | Conditions.cs:60:16:60:22 | [b (line 57): true] ... > ... | true | 61 | 9 | Conditions.cs:61:9:64:9 | [b (line 57): true] {...} | | 60 | 17 | BreakInTry.cs:60:17:60:28 | ... == ... | false | 64 | 9 | BreakInTry.cs:64:9:70:9 | {...} | | 60 | 17 | BreakInTry.cs:60:17:60:28 | ... == ... | true | 61 | 17 | BreakInTry.cs:61:17:61:23 | return ...; | +| 61 | 13 | ExitMethods.cs:61:13:61:13 | access to parameter b | false | 64 | 41 | ExitMethods.cs:64:41:64:43 | "b" | +| 61 | 13 | ExitMethods.cs:61:13:61:13 | access to parameter b | true | 62 | 19 | ExitMethods.cs:62:19:62:33 | object creation of type Exception | | 62 | 17 | Conditions.cs:62:17:62:17 | [b (line 57): false] access to parameter b | false | 60 | 16 | Conditions.cs:60:16:60:16 | [b (line 57): false] access to parameter x | | 62 | 17 | Conditions.cs:62:17:62:17 | [b (line 57): true] access to parameter b | true | 63 | 17 | Conditions.cs:63:17:63:20 | [b (line 57): true] ...; | | 62 | 17 | Conditions.cs:62:17:62:17 | access to parameter b | false | 60 | 16 | Conditions.cs:60:16:60:16 | [b (line 57): false] access to parameter x | @@ -148,14 +148,10 @@ | 74 | 13 | cflow.cs:74:13:74:24 | ... > ... | true | 75 | 9 | cflow.cs:75:9:77:9 | {...} | | 76 | 17 | Conditions.cs:76:17:76:17 | access to local variable b | false | 78 | 13 | Conditions.cs:78:13:79:26 | if (...) ... | | 76 | 17 | Conditions.cs:76:17:76:17 | access to local variable b | true | 77 | 17 | Conditions.cs:77:17:77:20 | ...; | -| 78 | 16 | ExitMethods.cs:78:16:78:25 | ... != ... | false | 78 | 69 | ExitMethods.cs:78:69:78:75 | "input" | -| 78 | 16 | ExitMethods.cs:78:16:78:25 | ... != ... | true | 78 | 29 | ExitMethods.cs:78:29:78:29 | 1 | | 78 | 17 | Conditions.cs:78:17:78:21 | ... > ... | false | 74 | 9 | Conditions.cs:74:9:80:9 | foreach (... ... in ...) ... | | 78 | 17 | Conditions.cs:78:17:78:21 | ... > ... | true | 79 | 17 | Conditions.cs:79:17:79:26 | ...; | | 81 | 12 | Conditions.cs:81:12:81:12 | access to local variable b | false | 83 | 16 | Conditions.cs:83:16:83:16 | access to local variable x | | 81 | 12 | Conditions.cs:81:12:81:12 | access to local variable b | true | 82 | 13 | Conditions.cs:82:13:82:16 | ...; | -| 83 | 16 | ExitMethods.cs:83:16:83:30 | call to method Contains | false | 83 | 38 | ExitMethods.cs:83:38:83:38 | 1 | -| 83 | 16 | ExitMethods.cs:83:16:83:30 | call to method Contains | true | 83 | 34 | ExitMethods.cs:83:34:83:34 | 0 | | 84 | 19 | Switch.cs:84:19:84:23 | ... > ... | false | 86 | 22 | Switch.cs:86:22:86:25 | true | | 84 | 19 | Switch.cs:84:19:84:23 | ... > ... | true | 85 | 17 | Switch.cs:85:17:85:22 | break; | | 86 | 13 | cflow.cs:86:13:86:21 | ... != ... | false | 84 | 18 | cflow.cs:84:18:84:19 | exit M2 | @@ -164,6 +160,8 @@ | 86 | 26 | cflow.cs:86:26:86:37 | ... > ... | true | 87 | 13 | cflow.cs:87:13:87:33 | ...; | | 92 | 13 | cflow.cs:92:13:92:27 | call to method Equals | false | 94 | 9 | cflow.cs:94:9:94:29 | ...; | | 92 | 13 | cflow.cs:92:13:92:27 | call to method Equals | true | 93 | 45 | cflow.cs:93:45:93:47 | "s" | +| 92 | 16 | ExitMethods.cs:92:16:92:25 | ... != ... | false | 92 | 69 | ExitMethods.cs:92:69:92:75 | "input" | +| 92 | 16 | ExitMethods.cs:92:16:92:25 | ... != ... | true | 92 | 29 | ExitMethods.cs:92:29:92:29 | 1 | | 92 | 17 | Conditions.cs:92:17:92:17 | access to local variable b | false | 94 | 13 | Conditions.cs:94:13:95:26 | if (...) ... | | 92 | 17 | Conditions.cs:92:17:92:17 | access to local variable b | true | 93 | 17 | Conditions.cs:93:17:93:20 | ...; | | 94 | 17 | Conditions.cs:94:17:94:21 | ... > ... | false | 96 | 13 | Conditions.cs:96:13:97:20 | if (...) ... | @@ -172,6 +170,8 @@ | 96 | 13 | cflow.cs:96:13:96:25 | ... != ... | true | 97 | 13 | cflow.cs:97:13:97:55 | ...; | | 96 | 17 | Conditions.cs:96:17:96:17 | access to local variable b | false | 90 | 9 | Conditions.cs:90:9:98:9 | foreach (... ... in ...) ... | | 96 | 17 | Conditions.cs:96:17:96:17 | access to local variable b | true | 97 | 17 | Conditions.cs:97:17:97:20 | ...; | +| 97 | 16 | ExitMethods.cs:97:16:97:30 | call to method Contains | false | 97 | 38 | ExitMethods.cs:97:38:97:38 | 1 | +| 97 | 16 | ExitMethods.cs:97:16:97:30 | call to method Contains | true | 97 | 34 | ExitMethods.cs:97:34:97:34 | 0 | | 99 | 13 | cflow.cs:99:13:99:25 | ... != ... | false | 102 | 9 | cflow.cs:102:9:103:36 | if (...) ... | | 99 | 13 | cflow.cs:99:13:99:25 | ... != ... | true | 100 | 13 | cflow.cs:100:13:100:42 | ...; | | 102 | 13 | cflow.cs:102:13:102:29 | ... != ... | false | 90 | 18 | cflow.cs:90:18:90:19 | exit M3 | diff --git a/csharp/ql/test/library-tests/controlflow/graph/Dominance.expected b/csharp/ql/test/library-tests/controlflow/graph/Dominance.expected index e585c8de17f..e9b2d47aff5 100644 --- a/csharp/ql/test/library-tests/controlflow/graph/Dominance.expected +++ b/csharp/ql/test/library-tests/controlflow/graph/Dominance.expected @@ -621,92 +621,116 @@ | post | Conditions.cs:110:16:110:16 | access to local variable x | Conditions.cs:107:13:107:24 | [b (line 102): true] ... > ... | | post | Conditions.cs:110:16:110:16 | access to local variable x | Conditions.cs:108:18:108:18 | [b (line 102): true] access to parameter b | | post | Conditions.cs:110:16:110:16 | access to local variable x | Conditions.cs:109:17:109:23 | ... = ... | -| post | ExitMethods.cs:6:10:6:11 | exit M1 | ExitMethods.cs:9:9:9:15 | return ...; | -| post | ExitMethods.cs:7:5:10:5 | {...} | ExitMethods.cs:6:10:6:11 | enter M1 | -| post | ExitMethods.cs:8:9:8:24 | call to method ErrorMaybe | ExitMethods.cs:8:20:8:23 | true | -| post | ExitMethods.cs:8:9:8:25 | ...; | ExitMethods.cs:7:5:10:5 | {...} | -| post | ExitMethods.cs:8:20:8:23 | true | ExitMethods.cs:8:9:8:25 | ...; | -| post | ExitMethods.cs:9:9:9:15 | return ...; | ExitMethods.cs:8:9:8:24 | call to method ErrorMaybe | -| post | ExitMethods.cs:12:10:12:11 | exit M2 | ExitMethods.cs:15:9:15:15 | return ...; | -| post | ExitMethods.cs:13:5:16:5 | {...} | ExitMethods.cs:12:10:12:11 | enter M2 | -| post | ExitMethods.cs:14:9:14:25 | call to method ErrorMaybe | ExitMethods.cs:14:20:14:24 | false | -| post | ExitMethods.cs:14:9:14:26 | ...; | ExitMethods.cs:13:5:16:5 | {...} | -| post | ExitMethods.cs:14:20:14:24 | false | ExitMethods.cs:14:9:14:26 | ...; | -| post | ExitMethods.cs:15:9:15:15 | return ...; | ExitMethods.cs:14:9:14:25 | call to method ErrorMaybe | -| post | ExitMethods.cs:18:10:18:11 | exit M3 | ExitMethods.cs:20:9:20:25 | call to method ErrorAlways | -| post | ExitMethods.cs:19:5:22:5 | {...} | ExitMethods.cs:18:10:18:11 | enter M3 | -| post | ExitMethods.cs:20:9:20:25 | call to method ErrorAlways | ExitMethods.cs:20:21:20:24 | true | -| post | ExitMethods.cs:20:9:20:26 | ...; | ExitMethods.cs:19:5:22:5 | {...} | -| post | ExitMethods.cs:20:21:20:24 | true | ExitMethods.cs:20:9:20:26 | ...; | -| post | ExitMethods.cs:24:10:24:11 | exit M4 | ExitMethods.cs:26:9:26:14 | call to method Exit | -| post | ExitMethods.cs:25:5:28:5 | {...} | ExitMethods.cs:24:10:24:11 | enter M4 | -| post | ExitMethods.cs:26:9:26:14 | call to method Exit | ExitMethods.cs:26:9:26:14 | this access | -| post | ExitMethods.cs:26:9:26:14 | this access | ExitMethods.cs:26:9:26:15 | ...; | -| post | ExitMethods.cs:26:9:26:15 | ...; | ExitMethods.cs:25:5:28:5 | {...} | -| post | ExitMethods.cs:30:10:30:11 | exit M5 | ExitMethods.cs:32:9:32:25 | call to method ApplicationExit | -| post | ExitMethods.cs:31:5:34:5 | {...} | ExitMethods.cs:30:10:30:11 | enter M5 | -| post | ExitMethods.cs:32:9:32:25 | call to method ApplicationExit | ExitMethods.cs:32:9:32:25 | this access | -| post | ExitMethods.cs:32:9:32:25 | this access | ExitMethods.cs:32:9:32:26 | ...; | -| post | ExitMethods.cs:32:9:32:26 | ...; | ExitMethods.cs:31:5:34:5 | {...} | -| post | ExitMethods.cs:36:10:36:11 | exit M6 | ExitMethods.cs:44:13:44:19 | return ...; | -| post | ExitMethods.cs:36:10:36:11 | exit M6 | ExitMethods.cs:48:13:48:19 | return ...; | -| post | ExitMethods.cs:37:5:50:5 | {...} | ExitMethods.cs:36:10:36:11 | enter M6 | -| post | ExitMethods.cs:38:9:49:9 | try {...} ... | ExitMethods.cs:37:5:50:5 | {...} | -| post | ExitMethods.cs:39:9:41:9 | {...} | ExitMethods.cs:38:9:49:9 | try {...} ... | -| post | ExitMethods.cs:40:13:40:30 | call to method ErrorAlways | ExitMethods.cs:40:25:40:29 | false | -| post | ExitMethods.cs:40:13:40:31 | ...; | ExitMethods.cs:39:9:41:9 | {...} | -| post | ExitMethods.cs:40:25:40:29 | false | ExitMethods.cs:40:13:40:31 | ...; | -| post | ExitMethods.cs:43:9:45:9 | {...} | ExitMethods.cs:42:9:45:9 | [exception: ArgumentException] catch (...) {...} | -| post | ExitMethods.cs:44:13:44:19 | return ...; | ExitMethods.cs:43:9:45:9 | {...} | -| post | ExitMethods.cs:47:9:49:9 | {...} | ExitMethods.cs:46:9:49:9 | [exception: Exception] catch (...) {...} | -| post | ExitMethods.cs:48:13:48:19 | return ...; | ExitMethods.cs:47:9:49:9 | {...} | -| post | ExitMethods.cs:52:17:52:26 | exit ErrorMaybe | ExitMethods.cs:54:13:54:13 | access to parameter b | -| post | ExitMethods.cs:52:17:52:26 | exit ErrorMaybe | ExitMethods.cs:55:13:55:34 | throw ...; | -| post | ExitMethods.cs:53:5:56:5 | {...} | ExitMethods.cs:52:17:52:26 | enter ErrorMaybe | -| post | ExitMethods.cs:54:9:55:34 | if (...) ... | ExitMethods.cs:53:5:56:5 | {...} | -| post | ExitMethods.cs:54:13:54:13 | access to parameter b | ExitMethods.cs:54:9:55:34 | if (...) ... | -| post | ExitMethods.cs:55:13:55:34 | throw ...; | ExitMethods.cs:55:19:55:33 | object creation of type Exception | -| post | ExitMethods.cs:58:17:58:27 | exit ErrorAlways | ExitMethods.cs:61:13:61:34 | throw ...; | -| post | ExitMethods.cs:58:17:58:27 | exit ErrorAlways | ExitMethods.cs:63:13:63:45 | throw ...; | -| post | ExitMethods.cs:59:5:64:5 | {...} | ExitMethods.cs:58:17:58:27 | enter ErrorAlways | -| post | ExitMethods.cs:60:9:63:45 | if (...) ... | ExitMethods.cs:59:5:64:5 | {...} | -| post | ExitMethods.cs:60:13:60:13 | access to parameter b | ExitMethods.cs:60:9:63:45 | if (...) ... | -| post | ExitMethods.cs:61:13:61:34 | throw ...; | ExitMethods.cs:61:19:61:33 | object creation of type Exception | -| post | ExitMethods.cs:63:13:63:45 | throw ...; | ExitMethods.cs:63:19:63:44 | object creation of type ArgumentException | -| post | ExitMethods.cs:63:19:63:44 | object creation of type ArgumentException | ExitMethods.cs:63:41:63:43 | "b" | -| post | ExitMethods.cs:66:10:66:13 | exit Exit | ExitMethods.cs:68:9:68:27 | call to method Exit | -| post | ExitMethods.cs:67:5:69:5 | {...} | ExitMethods.cs:66:10:66:13 | enter Exit | -| post | ExitMethods.cs:68:9:68:27 | call to method Exit | ExitMethods.cs:68:26:68:26 | 0 | -| post | ExitMethods.cs:68:9:68:28 | ...; | ExitMethods.cs:67:5:69:5 | {...} | -| post | ExitMethods.cs:68:26:68:26 | 0 | ExitMethods.cs:68:9:68:28 | ...; | -| post | ExitMethods.cs:71:10:71:24 | exit ApplicationExit | ExitMethods.cs:73:9:73:47 | call to method Exit | -| post | ExitMethods.cs:72:5:74:5 | {...} | ExitMethods.cs:71:10:71:24 | enter ApplicationExit | -| post | ExitMethods.cs:73:9:73:47 | call to method Exit | ExitMethods.cs:73:9:73:48 | ...; | -| post | ExitMethods.cs:73:9:73:48 | ...; | ExitMethods.cs:72:5:74:5 | {...} | -| post | ExitMethods.cs:76:13:76:21 | exit ThrowExpr | ExitMethods.cs:78:9:78:77 | return ...; | -| post | ExitMethods.cs:76:13:76:21 | exit ThrowExpr | ExitMethods.cs:78:41:78:76 | throw ... | -| post | ExitMethods.cs:77:5:79:5 | {...} | ExitMethods.cs:76:13:76:21 | enter ThrowExpr | -| post | ExitMethods.cs:78:9:78:77 | return ...; | ExitMethods.cs:78:29:78:37 | ... / ... | -| post | ExitMethods.cs:78:16:78:20 | access to parameter input | ExitMethods.cs:78:16:78:76 | ... ? ... : ... | -| post | ExitMethods.cs:78:16:78:25 | ... != ... | ExitMethods.cs:78:25:78:25 | (...) ... | -| post | ExitMethods.cs:78:16:78:76 | ... ? ... : ... | ExitMethods.cs:77:5:79:5 | {...} | -| post | ExitMethods.cs:78:25:78:25 | 0 | ExitMethods.cs:78:16:78:20 | access to parameter input | -| post | ExitMethods.cs:78:25:78:25 | (...) ... | ExitMethods.cs:78:25:78:25 | 0 | -| post | ExitMethods.cs:78:29:78:29 | (...) ... | ExitMethods.cs:78:29:78:29 | 1 | -| post | ExitMethods.cs:78:29:78:37 | ... / ... | ExitMethods.cs:78:33:78:37 | access to parameter input | -| post | ExitMethods.cs:78:33:78:37 | access to parameter input | ExitMethods.cs:78:29:78:29 | (...) ... | -| post | ExitMethods.cs:78:41:78:76 | throw ... | ExitMethods.cs:78:47:78:76 | object creation of type ArgumentException | -| post | ExitMethods.cs:78:47:78:76 | object creation of type ArgumentException | ExitMethods.cs:78:69:78:75 | "input" | -| post | ExitMethods.cs:81:16:81:34 | exit ExtensionMethodCall | ExitMethods.cs:83:9:83:39 | return ...; | -| post | ExitMethods.cs:82:5:84:5 | {...} | ExitMethods.cs:81:16:81:34 | enter ExtensionMethodCall | -| post | ExitMethods.cs:83:9:83:39 | return ...; | ExitMethods.cs:83:34:83:34 | 0 | -| post | ExitMethods.cs:83:9:83:39 | return ...; | ExitMethods.cs:83:38:83:38 | 1 | -| post | ExitMethods.cs:83:16:83:16 | access to parameter s | ExitMethods.cs:83:16:83:38 | ... ? ... : ... | -| post | ExitMethods.cs:83:16:83:30 | call to method Contains | ExitMethods.cs:83:27:83:29 | - | -| post | ExitMethods.cs:83:16:83:38 | ... ? ... : ... | ExitMethods.cs:82:5:84:5 | {...} | -| post | ExitMethods.cs:83:27:83:29 | - | ExitMethods.cs:83:16:83:16 | access to parameter s | -| post | ExitMethods.cs:91:28:91:31 | exit Exit | ExitMethods.cs:91:35:91:37 | {...} | -| post | ExitMethods.cs:91:35:91:37 | {...} | ExitMethods.cs:91:28:91:31 | enter Exit | +| post | ExitMethods.cs:7:10:7:11 | exit M1 | ExitMethods.cs:10:9:10:15 | return ...; | +| post | ExitMethods.cs:8:5:11:5 | {...} | ExitMethods.cs:7:10:7:11 | enter M1 | +| post | ExitMethods.cs:9:9:9:24 | call to method ErrorMaybe | ExitMethods.cs:9:20:9:23 | true | +| post | ExitMethods.cs:9:9:9:25 | ...; | ExitMethods.cs:8:5:11:5 | {...} | +| post | ExitMethods.cs:9:20:9:23 | true | ExitMethods.cs:9:9:9:25 | ...; | +| post | ExitMethods.cs:10:9:10:15 | return ...; | ExitMethods.cs:9:9:9:24 | call to method ErrorMaybe | +| post | ExitMethods.cs:13:10:13:11 | exit M2 | ExitMethods.cs:16:9:16:15 | return ...; | +| post | ExitMethods.cs:14:5:17:5 | {...} | ExitMethods.cs:13:10:13:11 | enter M2 | +| post | ExitMethods.cs:15:9:15:25 | call to method ErrorMaybe | ExitMethods.cs:15:20:15:24 | false | +| post | ExitMethods.cs:15:9:15:26 | ...; | ExitMethods.cs:14:5:17:5 | {...} | +| post | ExitMethods.cs:15:20:15:24 | false | ExitMethods.cs:15:9:15:26 | ...; | +| post | ExitMethods.cs:16:9:16:15 | return ...; | ExitMethods.cs:15:9:15:25 | call to method ErrorMaybe | +| post | ExitMethods.cs:19:10:19:11 | exit M3 | ExitMethods.cs:21:9:21:25 | call to method ErrorAlways | +| post | ExitMethods.cs:20:5:23:5 | {...} | ExitMethods.cs:19:10:19:11 | enter M3 | +| post | ExitMethods.cs:21:9:21:25 | call to method ErrorAlways | ExitMethods.cs:21:21:21:24 | true | +| post | ExitMethods.cs:21:9:21:26 | ...; | ExitMethods.cs:20:5:23:5 | {...} | +| post | ExitMethods.cs:21:21:21:24 | true | ExitMethods.cs:21:9:21:26 | ...; | +| post | ExitMethods.cs:25:10:25:11 | exit M4 | ExitMethods.cs:27:9:27:14 | call to method Exit | +| post | ExitMethods.cs:26:5:29:5 | {...} | ExitMethods.cs:25:10:25:11 | enter M4 | +| post | ExitMethods.cs:27:9:27:14 | call to method Exit | ExitMethods.cs:27:9:27:14 | this access | +| post | ExitMethods.cs:27:9:27:14 | this access | ExitMethods.cs:27:9:27:15 | ...; | +| post | ExitMethods.cs:27:9:27:15 | ...; | ExitMethods.cs:26:5:29:5 | {...} | +| post | ExitMethods.cs:31:10:31:11 | exit M5 | ExitMethods.cs:33:9:33:25 | call to method ApplicationExit | +| post | ExitMethods.cs:32:5:35:5 | {...} | ExitMethods.cs:31:10:31:11 | enter M5 | +| post | ExitMethods.cs:33:9:33:25 | call to method ApplicationExit | ExitMethods.cs:33:9:33:25 | this access | +| post | ExitMethods.cs:33:9:33:25 | this access | ExitMethods.cs:33:9:33:26 | ...; | +| post | ExitMethods.cs:33:9:33:26 | ...; | ExitMethods.cs:32:5:35:5 | {...} | +| post | ExitMethods.cs:37:10:37:11 | exit M6 | ExitMethods.cs:45:13:45:19 | return ...; | +| post | ExitMethods.cs:37:10:37:11 | exit M6 | ExitMethods.cs:49:13:49:19 | return ...; | +| post | ExitMethods.cs:38:5:51:5 | {...} | ExitMethods.cs:37:10:37:11 | enter M6 | +| post | ExitMethods.cs:39:9:50:9 | try {...} ... | ExitMethods.cs:38:5:51:5 | {...} | +| post | ExitMethods.cs:40:9:42:9 | {...} | ExitMethods.cs:39:9:50:9 | try {...} ... | +| post | ExitMethods.cs:41:13:41:30 | call to method ErrorAlways | ExitMethods.cs:41:25:41:29 | false | +| post | ExitMethods.cs:41:13:41:31 | ...; | ExitMethods.cs:40:9:42:9 | {...} | +| post | ExitMethods.cs:41:25:41:29 | false | ExitMethods.cs:41:13:41:31 | ...; | +| post | ExitMethods.cs:44:9:46:9 | {...} | ExitMethods.cs:43:9:46:9 | [exception: ArgumentException] catch (...) {...} | +| post | ExitMethods.cs:45:13:45:19 | return ...; | ExitMethods.cs:44:9:46:9 | {...} | +| post | ExitMethods.cs:48:9:50:9 | {...} | ExitMethods.cs:47:9:50:9 | [exception: Exception] catch (...) {...} | +| post | ExitMethods.cs:49:13:49:19 | return ...; | ExitMethods.cs:48:9:50:9 | {...} | +| post | ExitMethods.cs:53:17:53:26 | exit ErrorMaybe | ExitMethods.cs:55:13:55:13 | access to parameter b | +| post | ExitMethods.cs:53:17:53:26 | exit ErrorMaybe | ExitMethods.cs:56:13:56:34 | throw ...; | +| post | ExitMethods.cs:54:5:57:5 | {...} | ExitMethods.cs:53:17:53:26 | enter ErrorMaybe | +| post | ExitMethods.cs:55:9:56:34 | if (...) ... | ExitMethods.cs:54:5:57:5 | {...} | +| post | ExitMethods.cs:55:13:55:13 | access to parameter b | ExitMethods.cs:55:9:56:34 | if (...) ... | +| post | ExitMethods.cs:56:13:56:34 | throw ...; | ExitMethods.cs:56:19:56:33 | object creation of type Exception | +| post | ExitMethods.cs:59:17:59:27 | exit ErrorAlways | ExitMethods.cs:62:13:62:34 | throw ...; | +| post | ExitMethods.cs:59:17:59:27 | exit ErrorAlways | ExitMethods.cs:64:13:64:45 | throw ...; | +| post | ExitMethods.cs:60:5:65:5 | {...} | ExitMethods.cs:59:17:59:27 | enter ErrorAlways | +| post | ExitMethods.cs:61:9:64:45 | if (...) ... | ExitMethods.cs:60:5:65:5 | {...} | +| post | ExitMethods.cs:61:13:61:13 | access to parameter b | ExitMethods.cs:61:9:64:45 | if (...) ... | +| post | ExitMethods.cs:62:13:62:34 | throw ...; | ExitMethods.cs:62:19:62:33 | object creation of type Exception | +| post | ExitMethods.cs:64:13:64:45 | throw ...; | ExitMethods.cs:64:19:64:44 | object creation of type ArgumentException | +| post | ExitMethods.cs:64:19:64:44 | object creation of type ArgumentException | ExitMethods.cs:64:41:64:43 | "b" | +| post | ExitMethods.cs:67:10:67:13 | exit Exit | ExitMethods.cs:69:9:69:27 | call to method Exit | +| post | ExitMethods.cs:68:5:70:5 | {...} | ExitMethods.cs:67:10:67:13 | enter Exit | +| post | ExitMethods.cs:69:9:69:27 | call to method Exit | ExitMethods.cs:69:26:69:26 | 0 | +| post | ExitMethods.cs:69:9:69:28 | ...; | ExitMethods.cs:68:5:70:5 | {...} | +| post | ExitMethods.cs:69:26:69:26 | 0 | ExitMethods.cs:69:9:69:28 | ...; | +| post | ExitMethods.cs:72:10:72:18 | exit ExitInTry | ExitMethods.cs:76:13:76:18 | call to method Exit | +| post | ExitMethods.cs:73:5:83:5 | {...} | ExitMethods.cs:72:10:72:18 | enter ExitInTry | +| post | ExitMethods.cs:74:9:82:9 | try {...} ... | ExitMethods.cs:73:5:83:5 | {...} | +| post | ExitMethods.cs:75:9:77:9 | {...} | ExitMethods.cs:74:9:82:9 | try {...} ... | +| post | ExitMethods.cs:76:13:76:18 | call to method Exit | ExitMethods.cs:76:13:76:18 | this access | +| post | ExitMethods.cs:76:13:76:18 | this access | ExitMethods.cs:76:13:76:19 | ...; | +| post | ExitMethods.cs:76:13:76:19 | ...; | ExitMethods.cs:75:9:77:9 | {...} | +| post | ExitMethods.cs:85:10:85:24 | exit ApplicationExit | ExitMethods.cs:87:9:87:47 | call to method Exit | +| post | ExitMethods.cs:86:5:88:5 | {...} | ExitMethods.cs:85:10:85:24 | enter ApplicationExit | +| post | ExitMethods.cs:87:9:87:47 | call to method Exit | ExitMethods.cs:87:9:87:48 | ...; | +| post | ExitMethods.cs:87:9:87:48 | ...; | ExitMethods.cs:86:5:88:5 | {...} | +| post | ExitMethods.cs:90:13:90:21 | exit ThrowExpr | ExitMethods.cs:92:9:92:77 | return ...; | +| post | ExitMethods.cs:90:13:90:21 | exit ThrowExpr | ExitMethods.cs:92:41:92:76 | throw ... | +| post | ExitMethods.cs:91:5:93:5 | {...} | ExitMethods.cs:90:13:90:21 | enter ThrowExpr | +| post | ExitMethods.cs:92:9:92:77 | return ...; | ExitMethods.cs:92:29:92:37 | ... / ... | +| post | ExitMethods.cs:92:16:92:20 | access to parameter input | ExitMethods.cs:92:16:92:76 | ... ? ... : ... | +| post | ExitMethods.cs:92:16:92:25 | ... != ... | ExitMethods.cs:92:25:92:25 | (...) ... | +| post | ExitMethods.cs:92:16:92:76 | ... ? ... : ... | ExitMethods.cs:91:5:93:5 | {...} | +| post | ExitMethods.cs:92:25:92:25 | 0 | ExitMethods.cs:92:16:92:20 | access to parameter input | +| post | ExitMethods.cs:92:25:92:25 | (...) ... | ExitMethods.cs:92:25:92:25 | 0 | +| post | ExitMethods.cs:92:29:92:29 | (...) ... | ExitMethods.cs:92:29:92:29 | 1 | +| post | ExitMethods.cs:92:29:92:37 | ... / ... | ExitMethods.cs:92:33:92:37 | access to parameter input | +| post | ExitMethods.cs:92:33:92:37 | access to parameter input | ExitMethods.cs:92:29:92:29 | (...) ... | +| post | ExitMethods.cs:92:41:92:76 | throw ... | ExitMethods.cs:92:47:92:76 | object creation of type ArgumentException | +| post | ExitMethods.cs:92:47:92:76 | object creation of type ArgumentException | ExitMethods.cs:92:69:92:75 | "input" | +| post | ExitMethods.cs:95:16:95:34 | exit ExtensionMethodCall | ExitMethods.cs:97:9:97:39 | return ...; | +| post | ExitMethods.cs:96:5:98:5 | {...} | ExitMethods.cs:95:16:95:34 | enter ExtensionMethodCall | +| post | ExitMethods.cs:97:9:97:39 | return ...; | ExitMethods.cs:97:34:97:34 | 0 | +| post | ExitMethods.cs:97:9:97:39 | return ...; | ExitMethods.cs:97:38:97:38 | 1 | +| post | ExitMethods.cs:97:16:97:16 | access to parameter s | ExitMethods.cs:97:16:97:38 | ... ? ... : ... | +| post | ExitMethods.cs:97:16:97:30 | call to method Contains | ExitMethods.cs:97:27:97:29 | - | +| post | ExitMethods.cs:97:16:97:38 | ... ? ... : ... | ExitMethods.cs:96:5:98:5 | {...} | +| post | ExitMethods.cs:97:27:97:29 | - | ExitMethods.cs:97:16:97:16 | access to parameter s | +| post | ExitMethods.cs:100:17:100:32 | exit FailingAssertion | ExitMethods.cs:102:9:102:28 | call to method IsTrue | +| post | ExitMethods.cs:101:5:104:5 | {...} | ExitMethods.cs:100:17:100:32 | enter FailingAssertion | +| post | ExitMethods.cs:102:9:102:28 | call to method IsTrue | ExitMethods.cs:102:23:102:27 | false | +| post | ExitMethods.cs:102:9:102:29 | ...; | ExitMethods.cs:101:5:104:5 | {...} | +| post | ExitMethods.cs:102:23:102:27 | false | ExitMethods.cs:102:9:102:29 | ...; | +| post | ExitMethods.cs:106:17:106:33 | exit FailingAssertion2 | ExitMethods.cs:108:9:108:26 | call to method FailingAssertion | +| post | ExitMethods.cs:107:5:110:5 | {...} | ExitMethods.cs:106:17:106:33 | enter FailingAssertion2 | +| post | ExitMethods.cs:108:9:108:26 | call to method FailingAssertion | ExitMethods.cs:108:9:108:26 | this access | +| post | ExitMethods.cs:108:9:108:26 | this access | ExitMethods.cs:108:9:108:27 | ...; | +| post | ExitMethods.cs:108:9:108:27 | ...; | ExitMethods.cs:107:5:110:5 | {...} | +| post | ExitMethods.cs:112:10:112:20 | exit AssertFalse | ExitMethods.cs:112:33:112:49 | call to method IsFalse | +| post | ExitMethods.cs:112:33:112:49 | call to method IsFalse | ExitMethods.cs:112:48:112:48 | access to parameter b | +| post | ExitMethods.cs:112:48:112:48 | access to parameter b | ExitMethods.cs:112:10:112:20 | enter AssertFalse | +| post | ExitMethods.cs:114:17:114:33 | exit FailingAssertion3 | ExitMethods.cs:116:9:116:25 | call to method AssertFalse | +| post | ExitMethods.cs:115:5:118:5 | {...} | ExitMethods.cs:114:17:114:33 | enter FailingAssertion3 | +| post | ExitMethods.cs:116:9:116:25 | call to method AssertFalse | ExitMethods.cs:116:21:116:24 | true | +| post | ExitMethods.cs:116:9:116:25 | this access | ExitMethods.cs:116:9:116:26 | ...; | +| post | ExitMethods.cs:116:9:116:26 | ...; | ExitMethods.cs:115:5:118:5 | {...} | +| post | ExitMethods.cs:116:21:116:24 | true | ExitMethods.cs:116:9:116:25 | this access | | post | Extensions.cs:5:23:5:29 | exit ToInt32 | Extensions.cs:7:9:7:30 | return ...; | | post | Extensions.cs:6:5:8:5 | {...} | Extensions.cs:5:23:5:29 | enter ToInt32 | | post | Extensions.cs:7:9:7:30 | return ...; | Extensions.cs:7:16:7:29 | call to method Parse | @@ -2724,92 +2748,116 @@ | pre | Conditions.cs:109:22:109:23 | "" | Conditions.cs:109:17:109:23 | ... + ... | | pre | Conditions.cs:110:9:110:17 | return ...; | Conditions.cs:102:12:102:13 | exit M8 | | pre | Conditions.cs:110:16:110:16 | access to local variable x | Conditions.cs:110:9:110:17 | return ...; | -| pre | ExitMethods.cs:6:10:6:11 | enter M1 | ExitMethods.cs:7:5:10:5 | {...} | -| pre | ExitMethods.cs:7:5:10:5 | {...} | ExitMethods.cs:8:9:8:25 | ...; | -| pre | ExitMethods.cs:8:9:8:24 | call to method ErrorMaybe | ExitMethods.cs:9:9:9:15 | return ...; | -| pre | ExitMethods.cs:8:9:8:25 | ...; | ExitMethods.cs:8:20:8:23 | true | -| pre | ExitMethods.cs:8:20:8:23 | true | ExitMethods.cs:8:9:8:24 | call to method ErrorMaybe | -| pre | ExitMethods.cs:9:9:9:15 | return ...; | ExitMethods.cs:6:10:6:11 | exit M1 | -| pre | ExitMethods.cs:12:10:12:11 | enter M2 | ExitMethods.cs:13:5:16:5 | {...} | -| pre | ExitMethods.cs:13:5:16:5 | {...} | ExitMethods.cs:14:9:14:26 | ...; | -| pre | ExitMethods.cs:14:9:14:25 | call to method ErrorMaybe | ExitMethods.cs:15:9:15:15 | return ...; | -| pre | ExitMethods.cs:14:9:14:26 | ...; | ExitMethods.cs:14:20:14:24 | false | -| pre | ExitMethods.cs:14:20:14:24 | false | ExitMethods.cs:14:9:14:25 | call to method ErrorMaybe | -| pre | ExitMethods.cs:15:9:15:15 | return ...; | ExitMethods.cs:12:10:12:11 | exit M2 | -| pre | ExitMethods.cs:18:10:18:11 | enter M3 | ExitMethods.cs:19:5:22:5 | {...} | -| pre | ExitMethods.cs:19:5:22:5 | {...} | ExitMethods.cs:20:9:20:26 | ...; | -| pre | ExitMethods.cs:20:9:20:25 | call to method ErrorAlways | ExitMethods.cs:18:10:18:11 | exit M3 | -| pre | ExitMethods.cs:20:9:20:26 | ...; | ExitMethods.cs:20:21:20:24 | true | -| pre | ExitMethods.cs:20:21:20:24 | true | ExitMethods.cs:20:9:20:25 | call to method ErrorAlways | -| pre | ExitMethods.cs:24:10:24:11 | enter M4 | ExitMethods.cs:25:5:28:5 | {...} | -| pre | ExitMethods.cs:25:5:28:5 | {...} | ExitMethods.cs:26:9:26:15 | ...; | -| pre | ExitMethods.cs:26:9:26:14 | call to method Exit | ExitMethods.cs:24:10:24:11 | exit M4 | -| pre | ExitMethods.cs:26:9:26:14 | this access | ExitMethods.cs:26:9:26:14 | call to method Exit | -| pre | ExitMethods.cs:26:9:26:15 | ...; | ExitMethods.cs:26:9:26:14 | this access | -| pre | ExitMethods.cs:30:10:30:11 | enter M5 | ExitMethods.cs:31:5:34:5 | {...} | -| pre | ExitMethods.cs:31:5:34:5 | {...} | ExitMethods.cs:32:9:32:26 | ...; | -| pre | ExitMethods.cs:32:9:32:25 | call to method ApplicationExit | ExitMethods.cs:30:10:30:11 | exit M5 | -| pre | ExitMethods.cs:32:9:32:25 | this access | ExitMethods.cs:32:9:32:25 | call to method ApplicationExit | -| pre | ExitMethods.cs:32:9:32:26 | ...; | ExitMethods.cs:32:9:32:25 | this access | -| pre | ExitMethods.cs:36:10:36:11 | enter M6 | ExitMethods.cs:37:5:50:5 | {...} | -| pre | ExitMethods.cs:37:5:50:5 | {...} | ExitMethods.cs:38:9:49:9 | try {...} ... | -| pre | ExitMethods.cs:38:9:49:9 | try {...} ... | ExitMethods.cs:39:9:41:9 | {...} | -| pre | ExitMethods.cs:39:9:41:9 | {...} | ExitMethods.cs:40:13:40:31 | ...; | -| pre | ExitMethods.cs:40:13:40:30 | call to method ErrorAlways | ExitMethods.cs:42:9:45:9 | [exception: ArgumentException] catch (...) {...} | -| pre | ExitMethods.cs:40:13:40:30 | call to method ErrorAlways | ExitMethods.cs:42:9:45:9 | [exception: Exception] catch (...) {...} | -| pre | ExitMethods.cs:40:13:40:31 | ...; | ExitMethods.cs:40:25:40:29 | false | -| pre | ExitMethods.cs:40:25:40:29 | false | ExitMethods.cs:40:13:40:30 | call to method ErrorAlways | -| pre | ExitMethods.cs:42:9:45:9 | [exception: Exception] catch (...) {...} | ExitMethods.cs:46:9:49:9 | [exception: Exception] catch (...) {...} | -| pre | ExitMethods.cs:43:9:45:9 | {...} | ExitMethods.cs:44:13:44:19 | return ...; | -| pre | ExitMethods.cs:46:9:49:9 | [exception: Exception] catch (...) {...} | ExitMethods.cs:47:9:49:9 | {...} | -| pre | ExitMethods.cs:47:9:49:9 | {...} | ExitMethods.cs:48:13:48:19 | return ...; | -| pre | ExitMethods.cs:52:17:52:26 | enter ErrorMaybe | ExitMethods.cs:53:5:56:5 | {...} | -| pre | ExitMethods.cs:53:5:56:5 | {...} | ExitMethods.cs:54:9:55:34 | if (...) ... | -| pre | ExitMethods.cs:54:9:55:34 | if (...) ... | ExitMethods.cs:54:13:54:13 | access to parameter b | -| pre | ExitMethods.cs:54:13:54:13 | access to parameter b | ExitMethods.cs:52:17:52:26 | exit ErrorMaybe | -| pre | ExitMethods.cs:54:13:54:13 | access to parameter b | ExitMethods.cs:55:19:55:33 | object creation of type Exception | -| pre | ExitMethods.cs:55:19:55:33 | object creation of type Exception | ExitMethods.cs:55:13:55:34 | throw ...; | -| pre | ExitMethods.cs:58:17:58:27 | enter ErrorAlways | ExitMethods.cs:59:5:64:5 | {...} | -| pre | ExitMethods.cs:59:5:64:5 | {...} | ExitMethods.cs:60:9:63:45 | if (...) ... | -| pre | ExitMethods.cs:60:9:63:45 | if (...) ... | ExitMethods.cs:60:13:60:13 | access to parameter b | -| pre | ExitMethods.cs:60:13:60:13 | access to parameter b | ExitMethods.cs:61:19:61:33 | object creation of type Exception | -| pre | ExitMethods.cs:60:13:60:13 | access to parameter b | ExitMethods.cs:63:41:63:43 | "b" | -| pre | ExitMethods.cs:61:19:61:33 | object creation of type Exception | ExitMethods.cs:61:13:61:34 | throw ...; | -| pre | ExitMethods.cs:63:19:63:44 | object creation of type ArgumentException | ExitMethods.cs:63:13:63:45 | throw ...; | -| pre | ExitMethods.cs:63:41:63:43 | "b" | ExitMethods.cs:63:19:63:44 | object creation of type ArgumentException | -| pre | ExitMethods.cs:66:10:66:13 | enter Exit | ExitMethods.cs:67:5:69:5 | {...} | -| pre | ExitMethods.cs:67:5:69:5 | {...} | ExitMethods.cs:68:9:68:28 | ...; | -| pre | ExitMethods.cs:68:9:68:27 | call to method Exit | ExitMethods.cs:66:10:66:13 | exit Exit | -| pre | ExitMethods.cs:68:9:68:28 | ...; | ExitMethods.cs:68:26:68:26 | 0 | -| pre | ExitMethods.cs:68:26:68:26 | 0 | ExitMethods.cs:68:9:68:27 | call to method Exit | -| pre | ExitMethods.cs:71:10:71:24 | enter ApplicationExit | ExitMethods.cs:72:5:74:5 | {...} | -| pre | ExitMethods.cs:72:5:74:5 | {...} | ExitMethods.cs:73:9:73:48 | ...; | -| pre | ExitMethods.cs:73:9:73:47 | call to method Exit | ExitMethods.cs:71:10:71:24 | exit ApplicationExit | -| pre | ExitMethods.cs:73:9:73:48 | ...; | ExitMethods.cs:73:9:73:47 | call to method Exit | -| pre | ExitMethods.cs:76:13:76:21 | enter ThrowExpr | ExitMethods.cs:77:5:79:5 | {...} | -| pre | ExitMethods.cs:77:5:79:5 | {...} | ExitMethods.cs:78:16:78:76 | ... ? ... : ... | -| pre | ExitMethods.cs:78:16:78:20 | access to parameter input | ExitMethods.cs:78:25:78:25 | 0 | -| pre | ExitMethods.cs:78:16:78:25 | ... != ... | ExitMethods.cs:78:29:78:29 | 1 | -| pre | ExitMethods.cs:78:16:78:25 | ... != ... | ExitMethods.cs:78:69:78:75 | "input" | -| pre | ExitMethods.cs:78:16:78:76 | ... ? ... : ... | ExitMethods.cs:78:16:78:20 | access to parameter input | -| pre | ExitMethods.cs:78:25:78:25 | 0 | ExitMethods.cs:78:25:78:25 | (...) ... | -| pre | ExitMethods.cs:78:25:78:25 | (...) ... | ExitMethods.cs:78:16:78:25 | ... != ... | -| pre | ExitMethods.cs:78:29:78:29 | 1 | ExitMethods.cs:78:29:78:29 | (...) ... | -| pre | ExitMethods.cs:78:29:78:29 | (...) ... | ExitMethods.cs:78:33:78:37 | access to parameter input | -| pre | ExitMethods.cs:78:29:78:37 | ... / ... | ExitMethods.cs:78:9:78:77 | return ...; | -| pre | ExitMethods.cs:78:33:78:37 | access to parameter input | ExitMethods.cs:78:29:78:37 | ... / ... | -| pre | ExitMethods.cs:78:47:78:76 | object creation of type ArgumentException | ExitMethods.cs:78:41:78:76 | throw ... | -| pre | ExitMethods.cs:78:69:78:75 | "input" | ExitMethods.cs:78:47:78:76 | object creation of type ArgumentException | -| pre | ExitMethods.cs:81:16:81:34 | enter ExtensionMethodCall | ExitMethods.cs:82:5:84:5 | {...} | -| pre | ExitMethods.cs:82:5:84:5 | {...} | ExitMethods.cs:83:16:83:38 | ... ? ... : ... | -| pre | ExitMethods.cs:83:9:83:39 | return ...; | ExitMethods.cs:81:16:81:34 | exit ExtensionMethodCall | -| pre | ExitMethods.cs:83:16:83:16 | access to parameter s | ExitMethods.cs:83:27:83:29 | - | -| pre | ExitMethods.cs:83:16:83:30 | call to method Contains | ExitMethods.cs:83:34:83:34 | 0 | -| pre | ExitMethods.cs:83:16:83:30 | call to method Contains | ExitMethods.cs:83:38:83:38 | 1 | -| pre | ExitMethods.cs:83:16:83:38 | ... ? ... : ... | ExitMethods.cs:83:16:83:16 | access to parameter s | -| pre | ExitMethods.cs:83:27:83:29 | - | ExitMethods.cs:83:16:83:30 | call to method Contains | -| pre | ExitMethods.cs:91:28:91:31 | enter Exit | ExitMethods.cs:91:35:91:37 | {...} | -| pre | ExitMethods.cs:91:35:91:37 | {...} | ExitMethods.cs:91:28:91:31 | exit Exit | +| pre | ExitMethods.cs:7:10:7:11 | enter M1 | ExitMethods.cs:8:5:11:5 | {...} | +| pre | ExitMethods.cs:8:5:11:5 | {...} | ExitMethods.cs:9:9:9:25 | ...; | +| pre | ExitMethods.cs:9:9:9:24 | call to method ErrorMaybe | ExitMethods.cs:10:9:10:15 | return ...; | +| pre | ExitMethods.cs:9:9:9:25 | ...; | ExitMethods.cs:9:20:9:23 | true | +| pre | ExitMethods.cs:9:20:9:23 | true | ExitMethods.cs:9:9:9:24 | call to method ErrorMaybe | +| pre | ExitMethods.cs:10:9:10:15 | return ...; | ExitMethods.cs:7:10:7:11 | exit M1 | +| pre | ExitMethods.cs:13:10:13:11 | enter M2 | ExitMethods.cs:14:5:17:5 | {...} | +| pre | ExitMethods.cs:14:5:17:5 | {...} | ExitMethods.cs:15:9:15:26 | ...; | +| pre | ExitMethods.cs:15:9:15:25 | call to method ErrorMaybe | ExitMethods.cs:16:9:16:15 | return ...; | +| pre | ExitMethods.cs:15:9:15:26 | ...; | ExitMethods.cs:15:20:15:24 | false | +| pre | ExitMethods.cs:15:20:15:24 | false | ExitMethods.cs:15:9:15:25 | call to method ErrorMaybe | +| pre | ExitMethods.cs:16:9:16:15 | return ...; | ExitMethods.cs:13:10:13:11 | exit M2 | +| pre | ExitMethods.cs:19:10:19:11 | enter M3 | ExitMethods.cs:20:5:23:5 | {...} | +| pre | ExitMethods.cs:20:5:23:5 | {...} | ExitMethods.cs:21:9:21:26 | ...; | +| pre | ExitMethods.cs:21:9:21:25 | call to method ErrorAlways | ExitMethods.cs:19:10:19:11 | exit M3 | +| pre | ExitMethods.cs:21:9:21:26 | ...; | ExitMethods.cs:21:21:21:24 | true | +| pre | ExitMethods.cs:21:21:21:24 | true | ExitMethods.cs:21:9:21:25 | call to method ErrorAlways | +| pre | ExitMethods.cs:25:10:25:11 | enter M4 | ExitMethods.cs:26:5:29:5 | {...} | +| pre | ExitMethods.cs:26:5:29:5 | {...} | ExitMethods.cs:27:9:27:15 | ...; | +| pre | ExitMethods.cs:27:9:27:14 | call to method Exit | ExitMethods.cs:25:10:25:11 | exit M4 | +| pre | ExitMethods.cs:27:9:27:14 | this access | ExitMethods.cs:27:9:27:14 | call to method Exit | +| pre | ExitMethods.cs:27:9:27:15 | ...; | ExitMethods.cs:27:9:27:14 | this access | +| pre | ExitMethods.cs:31:10:31:11 | enter M5 | ExitMethods.cs:32:5:35:5 | {...} | +| pre | ExitMethods.cs:32:5:35:5 | {...} | ExitMethods.cs:33:9:33:26 | ...; | +| pre | ExitMethods.cs:33:9:33:25 | call to method ApplicationExit | ExitMethods.cs:31:10:31:11 | exit M5 | +| pre | ExitMethods.cs:33:9:33:25 | this access | ExitMethods.cs:33:9:33:25 | call to method ApplicationExit | +| pre | ExitMethods.cs:33:9:33:26 | ...; | ExitMethods.cs:33:9:33:25 | this access | +| pre | ExitMethods.cs:37:10:37:11 | enter M6 | ExitMethods.cs:38:5:51:5 | {...} | +| pre | ExitMethods.cs:38:5:51:5 | {...} | ExitMethods.cs:39:9:50:9 | try {...} ... | +| pre | ExitMethods.cs:39:9:50:9 | try {...} ... | ExitMethods.cs:40:9:42:9 | {...} | +| pre | ExitMethods.cs:40:9:42:9 | {...} | ExitMethods.cs:41:13:41:31 | ...; | +| pre | ExitMethods.cs:41:13:41:30 | call to method ErrorAlways | ExitMethods.cs:43:9:46:9 | [exception: ArgumentException] catch (...) {...} | +| pre | ExitMethods.cs:41:13:41:30 | call to method ErrorAlways | ExitMethods.cs:43:9:46:9 | [exception: Exception] catch (...) {...} | +| pre | ExitMethods.cs:41:13:41:31 | ...; | ExitMethods.cs:41:25:41:29 | false | +| pre | ExitMethods.cs:41:25:41:29 | false | ExitMethods.cs:41:13:41:30 | call to method ErrorAlways | +| pre | ExitMethods.cs:43:9:46:9 | [exception: Exception] catch (...) {...} | ExitMethods.cs:47:9:50:9 | [exception: Exception] catch (...) {...} | +| pre | ExitMethods.cs:44:9:46:9 | {...} | ExitMethods.cs:45:13:45:19 | return ...; | +| pre | ExitMethods.cs:47:9:50:9 | [exception: Exception] catch (...) {...} | ExitMethods.cs:48:9:50:9 | {...} | +| pre | ExitMethods.cs:48:9:50:9 | {...} | ExitMethods.cs:49:13:49:19 | return ...; | +| pre | ExitMethods.cs:53:17:53:26 | enter ErrorMaybe | ExitMethods.cs:54:5:57:5 | {...} | +| pre | ExitMethods.cs:54:5:57:5 | {...} | ExitMethods.cs:55:9:56:34 | if (...) ... | +| pre | ExitMethods.cs:55:9:56:34 | if (...) ... | ExitMethods.cs:55:13:55:13 | access to parameter b | +| pre | ExitMethods.cs:55:13:55:13 | access to parameter b | ExitMethods.cs:53:17:53:26 | exit ErrorMaybe | +| pre | ExitMethods.cs:55:13:55:13 | access to parameter b | ExitMethods.cs:56:19:56:33 | object creation of type Exception | +| pre | ExitMethods.cs:56:19:56:33 | object creation of type Exception | ExitMethods.cs:56:13:56:34 | throw ...; | +| pre | ExitMethods.cs:59:17:59:27 | enter ErrorAlways | ExitMethods.cs:60:5:65:5 | {...} | +| pre | ExitMethods.cs:60:5:65:5 | {...} | ExitMethods.cs:61:9:64:45 | if (...) ... | +| pre | ExitMethods.cs:61:9:64:45 | if (...) ... | ExitMethods.cs:61:13:61:13 | access to parameter b | +| pre | ExitMethods.cs:61:13:61:13 | access to parameter b | ExitMethods.cs:62:19:62:33 | object creation of type Exception | +| pre | ExitMethods.cs:61:13:61:13 | access to parameter b | ExitMethods.cs:64:41:64:43 | "b" | +| pre | ExitMethods.cs:62:19:62:33 | object creation of type Exception | ExitMethods.cs:62:13:62:34 | throw ...; | +| pre | ExitMethods.cs:64:19:64:44 | object creation of type ArgumentException | ExitMethods.cs:64:13:64:45 | throw ...; | +| pre | ExitMethods.cs:64:41:64:43 | "b" | ExitMethods.cs:64:19:64:44 | object creation of type ArgumentException | +| pre | ExitMethods.cs:67:10:67:13 | enter Exit | ExitMethods.cs:68:5:70:5 | {...} | +| pre | ExitMethods.cs:68:5:70:5 | {...} | ExitMethods.cs:69:9:69:28 | ...; | +| pre | ExitMethods.cs:69:9:69:27 | call to method Exit | ExitMethods.cs:67:10:67:13 | exit Exit | +| pre | ExitMethods.cs:69:9:69:28 | ...; | ExitMethods.cs:69:26:69:26 | 0 | +| pre | ExitMethods.cs:69:26:69:26 | 0 | ExitMethods.cs:69:9:69:27 | call to method Exit | +| pre | ExitMethods.cs:72:10:72:18 | enter ExitInTry | ExitMethods.cs:73:5:83:5 | {...} | +| pre | ExitMethods.cs:73:5:83:5 | {...} | ExitMethods.cs:74:9:82:9 | try {...} ... | +| pre | ExitMethods.cs:74:9:82:9 | try {...} ... | ExitMethods.cs:75:9:77:9 | {...} | +| pre | ExitMethods.cs:75:9:77:9 | {...} | ExitMethods.cs:76:13:76:19 | ...; | +| pre | ExitMethods.cs:76:13:76:18 | call to method Exit | ExitMethods.cs:72:10:72:18 | exit ExitInTry | +| pre | ExitMethods.cs:76:13:76:18 | this access | ExitMethods.cs:76:13:76:18 | call to method Exit | +| pre | ExitMethods.cs:76:13:76:19 | ...; | ExitMethods.cs:76:13:76:18 | this access | +| pre | ExitMethods.cs:85:10:85:24 | enter ApplicationExit | ExitMethods.cs:86:5:88:5 | {...} | +| pre | ExitMethods.cs:86:5:88:5 | {...} | ExitMethods.cs:87:9:87:48 | ...; | +| pre | ExitMethods.cs:87:9:87:47 | call to method Exit | ExitMethods.cs:85:10:85:24 | exit ApplicationExit | +| pre | ExitMethods.cs:87:9:87:48 | ...; | ExitMethods.cs:87:9:87:47 | call to method Exit | +| pre | ExitMethods.cs:90:13:90:21 | enter ThrowExpr | ExitMethods.cs:91:5:93:5 | {...} | +| pre | ExitMethods.cs:91:5:93:5 | {...} | ExitMethods.cs:92:16:92:76 | ... ? ... : ... | +| pre | ExitMethods.cs:92:16:92:20 | access to parameter input | ExitMethods.cs:92:25:92:25 | 0 | +| pre | ExitMethods.cs:92:16:92:25 | ... != ... | ExitMethods.cs:92:29:92:29 | 1 | +| pre | ExitMethods.cs:92:16:92:25 | ... != ... | ExitMethods.cs:92:69:92:75 | "input" | +| pre | ExitMethods.cs:92:16:92:76 | ... ? ... : ... | ExitMethods.cs:92:16:92:20 | access to parameter input | +| pre | ExitMethods.cs:92:25:92:25 | 0 | ExitMethods.cs:92:25:92:25 | (...) ... | +| pre | ExitMethods.cs:92:25:92:25 | (...) ... | ExitMethods.cs:92:16:92:25 | ... != ... | +| pre | ExitMethods.cs:92:29:92:29 | 1 | ExitMethods.cs:92:29:92:29 | (...) ... | +| pre | ExitMethods.cs:92:29:92:29 | (...) ... | ExitMethods.cs:92:33:92:37 | access to parameter input | +| pre | ExitMethods.cs:92:29:92:37 | ... / ... | ExitMethods.cs:92:9:92:77 | return ...; | +| pre | ExitMethods.cs:92:33:92:37 | access to parameter input | ExitMethods.cs:92:29:92:37 | ... / ... | +| pre | ExitMethods.cs:92:47:92:76 | object creation of type ArgumentException | ExitMethods.cs:92:41:92:76 | throw ... | +| pre | ExitMethods.cs:92:69:92:75 | "input" | ExitMethods.cs:92:47:92:76 | object creation of type ArgumentException | +| pre | ExitMethods.cs:95:16:95:34 | enter ExtensionMethodCall | ExitMethods.cs:96:5:98:5 | {...} | +| pre | ExitMethods.cs:96:5:98:5 | {...} | ExitMethods.cs:97:16:97:38 | ... ? ... : ... | +| pre | ExitMethods.cs:97:9:97:39 | return ...; | ExitMethods.cs:95:16:95:34 | exit ExtensionMethodCall | +| pre | ExitMethods.cs:97:16:97:16 | access to parameter s | ExitMethods.cs:97:27:97:29 | - | +| pre | ExitMethods.cs:97:16:97:30 | call to method Contains | ExitMethods.cs:97:34:97:34 | 0 | +| pre | ExitMethods.cs:97:16:97:30 | call to method Contains | ExitMethods.cs:97:38:97:38 | 1 | +| pre | ExitMethods.cs:97:16:97:38 | ... ? ... : ... | ExitMethods.cs:97:16:97:16 | access to parameter s | +| pre | ExitMethods.cs:97:27:97:29 | - | ExitMethods.cs:97:16:97:30 | call to method Contains | +| pre | ExitMethods.cs:100:17:100:32 | enter FailingAssertion | ExitMethods.cs:101:5:104:5 | {...} | +| pre | ExitMethods.cs:101:5:104:5 | {...} | ExitMethods.cs:102:9:102:29 | ...; | +| pre | ExitMethods.cs:102:9:102:28 | call to method IsTrue | ExitMethods.cs:100:17:100:32 | exit FailingAssertion | +| pre | ExitMethods.cs:102:9:102:29 | ...; | ExitMethods.cs:102:23:102:27 | false | +| pre | ExitMethods.cs:102:23:102:27 | false | ExitMethods.cs:102:9:102:28 | call to method IsTrue | +| pre | ExitMethods.cs:106:17:106:33 | enter FailingAssertion2 | ExitMethods.cs:107:5:110:5 | {...} | +| pre | ExitMethods.cs:107:5:110:5 | {...} | ExitMethods.cs:108:9:108:27 | ...; | +| pre | ExitMethods.cs:108:9:108:26 | call to method FailingAssertion | ExitMethods.cs:106:17:106:33 | exit FailingAssertion2 | +| pre | ExitMethods.cs:108:9:108:26 | this access | ExitMethods.cs:108:9:108:26 | call to method FailingAssertion | +| pre | ExitMethods.cs:108:9:108:27 | ...; | ExitMethods.cs:108:9:108:26 | this access | +| pre | ExitMethods.cs:112:10:112:20 | enter AssertFalse | ExitMethods.cs:112:48:112:48 | access to parameter b | +| pre | ExitMethods.cs:112:33:112:49 | call to method IsFalse | ExitMethods.cs:112:10:112:20 | exit AssertFalse | +| pre | ExitMethods.cs:112:48:112:48 | access to parameter b | ExitMethods.cs:112:33:112:49 | call to method IsFalse | +| pre | ExitMethods.cs:114:17:114:33 | enter FailingAssertion3 | ExitMethods.cs:115:5:118:5 | {...} | +| pre | ExitMethods.cs:115:5:118:5 | {...} | ExitMethods.cs:116:9:116:26 | ...; | +| pre | ExitMethods.cs:116:9:116:25 | call to method AssertFalse | ExitMethods.cs:114:17:114:33 | exit FailingAssertion3 | +| pre | ExitMethods.cs:116:9:116:25 | this access | ExitMethods.cs:116:21:116:24 | true | +| pre | ExitMethods.cs:116:9:116:26 | ...; | ExitMethods.cs:116:9:116:25 | this access | +| pre | ExitMethods.cs:116:21:116:24 | true | ExitMethods.cs:116:9:116:25 | call to method AssertFalse | | pre | Extensions.cs:5:23:5:29 | enter ToInt32 | Extensions.cs:6:5:8:5 | {...} | | pre | Extensions.cs:6:5:8:5 | {...} | Extensions.cs:7:28:7:28 | access to parameter s | | pre | Extensions.cs:7:9:7:30 | return ...; | Extensions.cs:5:23:5:29 | exit ToInt32 | diff --git a/csharp/ql/test/library-tests/controlflow/graph/Dominance.ql b/csharp/ql/test/library-tests/controlflow/graph/Dominance.ql index e1be9ad496c..adc9e496b67 100644 --- a/csharp/ql/test/library-tests/controlflow/graph/Dominance.ql +++ b/csharp/ql/test/library-tests/controlflow/graph/Dominance.ql @@ -1,6 +1,7 @@ import csharp +import Common -from ControlFlow::Node dom, ControlFlow::Node node, string s +from SourceControlFlowNode dom, SourceControlFlowNode node, string s where dom.strictlyDominates(node) and dom.getASuccessor() = node and s = "pre" or diff --git a/csharp/ql/test/library-tests/controlflow/graph/ElementGraph.expected b/csharp/ql/test/library-tests/controlflow/graph/ElementGraph.expected index af12bb66483..8867c45ad34 100644 --- a/csharp/ql/test/library-tests/controlflow/graph/ElementGraph.expected +++ b/csharp/ql/test/library-tests/controlflow/graph/ElementGraph.expected @@ -474,72 +474,88 @@ | Conditions.cs:109:17:109:24 | ...; | Conditions.cs:109:17:109:17 | access to local variable x | semmle.label | successor | | Conditions.cs:109:22:109:23 | "" | Conditions.cs:109:17:109:23 | ... + ... | semmle.label | successor | | Conditions.cs:110:16:110:16 | access to local variable x | Conditions.cs:110:9:110:17 | return ...; | semmle.label | successor | -| ExitMethods.cs:7:5:10:5 | {...} | ExitMethods.cs:8:9:8:25 | ...; | semmle.label | successor | -| ExitMethods.cs:8:9:8:24 | call to method ErrorMaybe | ExitMethods.cs:9:9:9:15 | return ...; | semmle.label | successor | -| ExitMethods.cs:8:9:8:25 | ...; | ExitMethods.cs:8:20:8:23 | true | semmle.label | successor | -| ExitMethods.cs:8:20:8:23 | true | ExitMethods.cs:8:9:8:24 | call to method ErrorMaybe | semmle.label | successor | -| ExitMethods.cs:13:5:16:5 | {...} | ExitMethods.cs:14:9:14:26 | ...; | semmle.label | successor | -| ExitMethods.cs:14:9:14:25 | call to method ErrorMaybe | ExitMethods.cs:15:9:15:15 | return ...; | semmle.label | successor | -| ExitMethods.cs:14:9:14:26 | ...; | ExitMethods.cs:14:20:14:24 | false | semmle.label | successor | -| ExitMethods.cs:14:20:14:24 | false | ExitMethods.cs:14:9:14:25 | call to method ErrorMaybe | semmle.label | successor | -| ExitMethods.cs:19:5:22:5 | {...} | ExitMethods.cs:20:9:20:26 | ...; | semmle.label | successor | -| ExitMethods.cs:20:9:20:26 | ...; | ExitMethods.cs:20:21:20:24 | true | semmle.label | successor | -| ExitMethods.cs:20:21:20:24 | true | ExitMethods.cs:20:9:20:25 | call to method ErrorAlways | semmle.label | successor | -| ExitMethods.cs:25:5:28:5 | {...} | ExitMethods.cs:26:9:26:15 | ...; | semmle.label | successor | -| ExitMethods.cs:26:9:26:14 | this access | ExitMethods.cs:26:9:26:14 | call to method Exit | semmle.label | successor | -| ExitMethods.cs:26:9:26:15 | ...; | ExitMethods.cs:26:9:26:14 | this access | semmle.label | successor | -| ExitMethods.cs:31:5:34:5 | {...} | ExitMethods.cs:32:9:32:26 | ...; | semmle.label | successor | -| ExitMethods.cs:32:9:32:25 | this access | ExitMethods.cs:32:9:32:25 | call to method ApplicationExit | semmle.label | successor | -| ExitMethods.cs:32:9:32:26 | ...; | ExitMethods.cs:32:9:32:25 | this access | semmle.label | successor | -| ExitMethods.cs:37:5:50:5 | {...} | ExitMethods.cs:38:9:49:9 | try {...} ... | semmle.label | successor | -| ExitMethods.cs:38:9:49:9 | try {...} ... | ExitMethods.cs:39:9:41:9 | {...} | semmle.label | successor | -| ExitMethods.cs:39:9:41:9 | {...} | ExitMethods.cs:40:13:40:31 | ...; | semmle.label | successor | -| ExitMethods.cs:40:13:40:30 | call to method ErrorAlways | ExitMethods.cs:42:9:45:9 | catch (...) {...} | semmle.label | exception(ArgumentException) | -| ExitMethods.cs:40:13:40:30 | call to method ErrorAlways | ExitMethods.cs:42:9:45:9 | catch (...) {...} | semmle.label | exception(Exception) | -| ExitMethods.cs:40:13:40:31 | ...; | ExitMethods.cs:40:25:40:29 | false | semmle.label | successor | -| ExitMethods.cs:40:25:40:29 | false | ExitMethods.cs:40:13:40:30 | call to method ErrorAlways | semmle.label | successor | -| ExitMethods.cs:42:9:45:9 | catch (...) {...} | ExitMethods.cs:43:9:45:9 | {...} | semmle.label | match | -| ExitMethods.cs:42:9:45:9 | catch (...) {...} | ExitMethods.cs:46:9:49:9 | catch (...) {...} | semmle.label | no-match | -| ExitMethods.cs:43:9:45:9 | {...} | ExitMethods.cs:44:13:44:19 | return ...; | semmle.label | successor | -| ExitMethods.cs:46:9:49:9 | catch (...) {...} | ExitMethods.cs:47:9:49:9 | {...} | semmle.label | match | -| ExitMethods.cs:47:9:49:9 | {...} | ExitMethods.cs:48:13:48:19 | return ...; | semmle.label | successor | -| ExitMethods.cs:53:5:56:5 | {...} | ExitMethods.cs:54:9:55:34 | if (...) ... | semmle.label | successor | -| ExitMethods.cs:54:9:55:34 | if (...) ... | ExitMethods.cs:54:13:54:13 | access to parameter b | semmle.label | successor | -| ExitMethods.cs:54:13:54:13 | access to parameter b | ExitMethods.cs:55:19:55:33 | object creation of type Exception | semmle.label | true | -| ExitMethods.cs:55:19:55:33 | object creation of type Exception | ExitMethods.cs:55:13:55:34 | throw ...; | semmle.label | successor | -| ExitMethods.cs:59:5:64:5 | {...} | ExitMethods.cs:60:9:63:45 | if (...) ... | semmle.label | successor | -| ExitMethods.cs:60:9:63:45 | if (...) ... | ExitMethods.cs:60:13:60:13 | access to parameter b | semmle.label | successor | -| ExitMethods.cs:60:13:60:13 | access to parameter b | ExitMethods.cs:61:19:61:33 | object creation of type Exception | semmle.label | true | -| ExitMethods.cs:60:13:60:13 | access to parameter b | ExitMethods.cs:63:41:63:43 | "b" | semmle.label | false | -| ExitMethods.cs:61:19:61:33 | object creation of type Exception | ExitMethods.cs:61:13:61:34 | throw ...; | semmle.label | successor | -| ExitMethods.cs:63:19:63:44 | object creation of type ArgumentException | ExitMethods.cs:63:13:63:45 | throw ...; | semmle.label | successor | -| ExitMethods.cs:63:41:63:43 | "b" | ExitMethods.cs:63:19:63:44 | object creation of type ArgumentException | semmle.label | successor | -| ExitMethods.cs:67:5:69:5 | {...} | ExitMethods.cs:68:9:68:28 | ...; | semmle.label | successor | -| ExitMethods.cs:68:9:68:28 | ...; | ExitMethods.cs:68:26:68:26 | 0 | semmle.label | successor | -| ExitMethods.cs:68:26:68:26 | 0 | ExitMethods.cs:68:9:68:27 | call to method Exit | semmle.label | successor | -| ExitMethods.cs:72:5:74:5 | {...} | ExitMethods.cs:73:9:73:48 | ...; | semmle.label | successor | -| ExitMethods.cs:73:9:73:48 | ...; | ExitMethods.cs:73:9:73:47 | call to method Exit | semmle.label | successor | -| ExitMethods.cs:77:5:79:5 | {...} | ExitMethods.cs:78:16:78:76 | ... ? ... : ... | semmle.label | successor | -| ExitMethods.cs:78:16:78:20 | access to parameter input | ExitMethods.cs:78:25:78:25 | 0 | semmle.label | successor | -| ExitMethods.cs:78:16:78:25 | ... != ... | ExitMethods.cs:78:29:78:29 | 1 | semmle.label | true | -| ExitMethods.cs:78:16:78:25 | ... != ... | ExitMethods.cs:78:69:78:75 | "input" | semmle.label | false | -| ExitMethods.cs:78:16:78:76 | ... ? ... : ... | ExitMethods.cs:78:16:78:20 | access to parameter input | semmle.label | successor | -| ExitMethods.cs:78:25:78:25 | 0 | ExitMethods.cs:78:25:78:25 | (...) ... | semmle.label | successor | -| ExitMethods.cs:78:25:78:25 | (...) ... | ExitMethods.cs:78:16:78:25 | ... != ... | semmle.label | successor | -| ExitMethods.cs:78:29:78:29 | 1 | ExitMethods.cs:78:29:78:29 | (...) ... | semmle.label | successor | -| ExitMethods.cs:78:29:78:29 | (...) ... | ExitMethods.cs:78:33:78:37 | access to parameter input | semmle.label | successor | -| ExitMethods.cs:78:29:78:37 | ... / ... | ExitMethods.cs:78:9:78:77 | return ...; | semmle.label | successor | -| ExitMethods.cs:78:33:78:37 | access to parameter input | ExitMethods.cs:78:29:78:37 | ... / ... | semmle.label | successor | -| ExitMethods.cs:78:47:78:76 | object creation of type ArgumentException | ExitMethods.cs:78:41:78:76 | throw ... | semmle.label | successor | -| ExitMethods.cs:78:69:78:75 | "input" | ExitMethods.cs:78:47:78:76 | object creation of type ArgumentException | semmle.label | successor | -| ExitMethods.cs:82:5:84:5 | {...} | ExitMethods.cs:83:16:83:38 | ... ? ... : ... | semmle.label | successor | -| ExitMethods.cs:83:16:83:16 | access to parameter s | ExitMethods.cs:83:27:83:29 | - | semmle.label | successor | -| ExitMethods.cs:83:16:83:30 | call to method Contains | ExitMethods.cs:83:34:83:34 | 0 | semmle.label | true | -| ExitMethods.cs:83:16:83:30 | call to method Contains | ExitMethods.cs:83:38:83:38 | 1 | semmle.label | false | -| ExitMethods.cs:83:16:83:38 | ... ? ... : ... | ExitMethods.cs:83:16:83:16 | access to parameter s | semmle.label | successor | -| ExitMethods.cs:83:27:83:29 | - | ExitMethods.cs:83:16:83:30 | call to method Contains | semmle.label | successor | -| ExitMethods.cs:83:34:83:34 | 0 | ExitMethods.cs:83:9:83:39 | return ...; | semmle.label | successor | -| ExitMethods.cs:83:38:83:38 | 1 | ExitMethods.cs:83:9:83:39 | return ...; | semmle.label | successor | +| ExitMethods.cs:8:5:11:5 | {...} | ExitMethods.cs:9:9:9:25 | ...; | semmle.label | successor | +| ExitMethods.cs:9:9:9:24 | call to method ErrorMaybe | ExitMethods.cs:10:9:10:15 | return ...; | semmle.label | successor | +| ExitMethods.cs:9:9:9:25 | ...; | ExitMethods.cs:9:20:9:23 | true | semmle.label | successor | +| ExitMethods.cs:9:20:9:23 | true | ExitMethods.cs:9:9:9:24 | call to method ErrorMaybe | semmle.label | successor | +| ExitMethods.cs:14:5:17:5 | {...} | ExitMethods.cs:15:9:15:26 | ...; | semmle.label | successor | +| ExitMethods.cs:15:9:15:25 | call to method ErrorMaybe | ExitMethods.cs:16:9:16:15 | return ...; | semmle.label | successor | +| ExitMethods.cs:15:9:15:26 | ...; | ExitMethods.cs:15:20:15:24 | false | semmle.label | successor | +| ExitMethods.cs:15:20:15:24 | false | ExitMethods.cs:15:9:15:25 | call to method ErrorMaybe | semmle.label | successor | +| ExitMethods.cs:20:5:23:5 | {...} | ExitMethods.cs:21:9:21:26 | ...; | semmle.label | successor | +| ExitMethods.cs:21:9:21:26 | ...; | ExitMethods.cs:21:21:21:24 | true | semmle.label | successor | +| ExitMethods.cs:21:21:21:24 | true | ExitMethods.cs:21:9:21:25 | call to method ErrorAlways | semmle.label | successor | +| ExitMethods.cs:26:5:29:5 | {...} | ExitMethods.cs:27:9:27:15 | ...; | semmle.label | successor | +| ExitMethods.cs:27:9:27:14 | this access | ExitMethods.cs:27:9:27:14 | call to method Exit | semmle.label | successor | +| ExitMethods.cs:27:9:27:15 | ...; | ExitMethods.cs:27:9:27:14 | this access | semmle.label | successor | +| ExitMethods.cs:32:5:35:5 | {...} | ExitMethods.cs:33:9:33:26 | ...; | semmle.label | successor | +| ExitMethods.cs:33:9:33:25 | this access | ExitMethods.cs:33:9:33:25 | call to method ApplicationExit | semmle.label | successor | +| ExitMethods.cs:33:9:33:26 | ...; | ExitMethods.cs:33:9:33:25 | this access | semmle.label | successor | +| ExitMethods.cs:38:5:51:5 | {...} | ExitMethods.cs:39:9:50:9 | try {...} ... | semmle.label | successor | +| ExitMethods.cs:39:9:50:9 | try {...} ... | ExitMethods.cs:40:9:42:9 | {...} | semmle.label | successor | +| ExitMethods.cs:40:9:42:9 | {...} | ExitMethods.cs:41:13:41:31 | ...; | semmle.label | successor | +| ExitMethods.cs:41:13:41:30 | call to method ErrorAlways | ExitMethods.cs:43:9:46:9 | catch (...) {...} | semmle.label | exception(ArgumentException) | +| ExitMethods.cs:41:13:41:30 | call to method ErrorAlways | ExitMethods.cs:43:9:46:9 | catch (...) {...} | semmle.label | exception(Exception) | +| ExitMethods.cs:41:13:41:31 | ...; | ExitMethods.cs:41:25:41:29 | false | semmle.label | successor | +| ExitMethods.cs:41:25:41:29 | false | ExitMethods.cs:41:13:41:30 | call to method ErrorAlways | semmle.label | successor | +| ExitMethods.cs:43:9:46:9 | catch (...) {...} | ExitMethods.cs:44:9:46:9 | {...} | semmle.label | match | +| ExitMethods.cs:43:9:46:9 | catch (...) {...} | ExitMethods.cs:47:9:50:9 | catch (...) {...} | semmle.label | no-match | +| ExitMethods.cs:44:9:46:9 | {...} | ExitMethods.cs:45:13:45:19 | return ...; | semmle.label | successor | +| ExitMethods.cs:47:9:50:9 | catch (...) {...} | ExitMethods.cs:48:9:50:9 | {...} | semmle.label | match | +| ExitMethods.cs:48:9:50:9 | {...} | ExitMethods.cs:49:13:49:19 | return ...; | semmle.label | successor | +| ExitMethods.cs:54:5:57:5 | {...} | ExitMethods.cs:55:9:56:34 | if (...) ... | semmle.label | successor | +| ExitMethods.cs:55:9:56:34 | if (...) ... | ExitMethods.cs:55:13:55:13 | access to parameter b | semmle.label | successor | +| ExitMethods.cs:55:13:55:13 | access to parameter b | ExitMethods.cs:56:19:56:33 | object creation of type Exception | semmle.label | true | +| ExitMethods.cs:56:19:56:33 | object creation of type Exception | ExitMethods.cs:56:13:56:34 | throw ...; | semmle.label | successor | +| ExitMethods.cs:60:5:65:5 | {...} | ExitMethods.cs:61:9:64:45 | if (...) ... | semmle.label | successor | +| ExitMethods.cs:61:9:64:45 | if (...) ... | ExitMethods.cs:61:13:61:13 | access to parameter b | semmle.label | successor | +| ExitMethods.cs:61:13:61:13 | access to parameter b | ExitMethods.cs:62:19:62:33 | object creation of type Exception | semmle.label | true | +| ExitMethods.cs:61:13:61:13 | access to parameter b | ExitMethods.cs:64:41:64:43 | "b" | semmle.label | false | +| ExitMethods.cs:62:19:62:33 | object creation of type Exception | ExitMethods.cs:62:13:62:34 | throw ...; | semmle.label | successor | +| ExitMethods.cs:64:19:64:44 | object creation of type ArgumentException | ExitMethods.cs:64:13:64:45 | throw ...; | semmle.label | successor | +| ExitMethods.cs:64:41:64:43 | "b" | ExitMethods.cs:64:19:64:44 | object creation of type ArgumentException | semmle.label | successor | +| ExitMethods.cs:68:5:70:5 | {...} | ExitMethods.cs:69:9:69:28 | ...; | semmle.label | successor | +| ExitMethods.cs:69:9:69:28 | ...; | ExitMethods.cs:69:26:69:26 | 0 | semmle.label | successor | +| ExitMethods.cs:69:26:69:26 | 0 | ExitMethods.cs:69:9:69:27 | call to method Exit | semmle.label | successor | +| ExitMethods.cs:73:5:83:5 | {...} | ExitMethods.cs:74:9:82:9 | try {...} ... | semmle.label | successor | +| ExitMethods.cs:74:9:82:9 | try {...} ... | ExitMethods.cs:75:9:77:9 | {...} | semmle.label | successor | +| ExitMethods.cs:75:9:77:9 | {...} | ExitMethods.cs:76:13:76:19 | ...; | semmle.label | successor | +| ExitMethods.cs:76:13:76:18 | this access | ExitMethods.cs:76:13:76:18 | call to method Exit | semmle.label | successor | +| ExitMethods.cs:76:13:76:19 | ...; | ExitMethods.cs:76:13:76:18 | this access | semmle.label | successor | +| ExitMethods.cs:86:5:88:5 | {...} | ExitMethods.cs:87:9:87:48 | ...; | semmle.label | successor | +| ExitMethods.cs:87:9:87:48 | ...; | ExitMethods.cs:87:9:87:47 | call to method Exit | semmle.label | successor | +| ExitMethods.cs:91:5:93:5 | {...} | ExitMethods.cs:92:16:92:76 | ... ? ... : ... | semmle.label | successor | +| ExitMethods.cs:92:16:92:20 | access to parameter input | ExitMethods.cs:92:25:92:25 | 0 | semmle.label | successor | +| ExitMethods.cs:92:16:92:25 | ... != ... | ExitMethods.cs:92:29:92:29 | 1 | semmle.label | true | +| ExitMethods.cs:92:16:92:25 | ... != ... | ExitMethods.cs:92:69:92:75 | "input" | semmle.label | false | +| ExitMethods.cs:92:16:92:76 | ... ? ... : ... | ExitMethods.cs:92:16:92:20 | access to parameter input | semmle.label | successor | +| ExitMethods.cs:92:25:92:25 | 0 | ExitMethods.cs:92:25:92:25 | (...) ... | semmle.label | successor | +| ExitMethods.cs:92:25:92:25 | (...) ... | ExitMethods.cs:92:16:92:25 | ... != ... | semmle.label | successor | +| ExitMethods.cs:92:29:92:29 | 1 | ExitMethods.cs:92:29:92:29 | (...) ... | semmle.label | successor | +| ExitMethods.cs:92:29:92:29 | (...) ... | ExitMethods.cs:92:33:92:37 | access to parameter input | semmle.label | successor | +| ExitMethods.cs:92:29:92:37 | ... / ... | ExitMethods.cs:92:9:92:77 | return ...; | semmle.label | successor | +| ExitMethods.cs:92:33:92:37 | access to parameter input | ExitMethods.cs:92:29:92:37 | ... / ... | semmle.label | successor | +| ExitMethods.cs:92:47:92:76 | object creation of type ArgumentException | ExitMethods.cs:92:41:92:76 | throw ... | semmle.label | successor | +| ExitMethods.cs:92:69:92:75 | "input" | ExitMethods.cs:92:47:92:76 | object creation of type ArgumentException | semmle.label | successor | +| ExitMethods.cs:96:5:98:5 | {...} | ExitMethods.cs:97:16:97:38 | ... ? ... : ... | semmle.label | successor | +| ExitMethods.cs:97:16:97:16 | access to parameter s | ExitMethods.cs:97:27:97:29 | - | semmle.label | successor | +| ExitMethods.cs:97:16:97:30 | call to method Contains | ExitMethods.cs:97:34:97:34 | 0 | semmle.label | true | +| ExitMethods.cs:97:16:97:30 | call to method Contains | ExitMethods.cs:97:38:97:38 | 1 | semmle.label | false | +| ExitMethods.cs:97:16:97:38 | ... ? ... : ... | ExitMethods.cs:97:16:97:16 | access to parameter s | semmle.label | successor | +| ExitMethods.cs:97:27:97:29 | - | ExitMethods.cs:97:16:97:30 | call to method Contains | semmle.label | successor | +| ExitMethods.cs:97:34:97:34 | 0 | ExitMethods.cs:97:9:97:39 | return ...; | semmle.label | successor | +| ExitMethods.cs:97:38:97:38 | 1 | ExitMethods.cs:97:9:97:39 | return ...; | semmle.label | successor | +| ExitMethods.cs:101:5:104:5 | {...} | ExitMethods.cs:102:9:102:29 | ...; | semmle.label | successor | +| ExitMethods.cs:102:9:102:29 | ...; | ExitMethods.cs:102:23:102:27 | false | semmle.label | successor | +| ExitMethods.cs:102:23:102:27 | false | ExitMethods.cs:102:9:102:28 | call to method IsTrue | semmle.label | successor | +| ExitMethods.cs:107:5:110:5 | {...} | ExitMethods.cs:108:9:108:27 | ...; | semmle.label | successor | +| ExitMethods.cs:108:9:108:26 | this access | ExitMethods.cs:108:9:108:26 | call to method FailingAssertion | semmle.label | successor | +| ExitMethods.cs:108:9:108:27 | ...; | ExitMethods.cs:108:9:108:26 | this access | semmle.label | successor | +| ExitMethods.cs:112:48:112:48 | access to parameter b | ExitMethods.cs:112:33:112:49 | call to method IsFalse | semmle.label | successor | +| ExitMethods.cs:115:5:118:5 | {...} | ExitMethods.cs:116:9:116:26 | ...; | semmle.label | successor | +| ExitMethods.cs:116:9:116:25 | this access | ExitMethods.cs:116:21:116:24 | true | semmle.label | successor | +| ExitMethods.cs:116:9:116:26 | ...; | ExitMethods.cs:116:9:116:25 | this access | semmle.label | successor | +| ExitMethods.cs:116:21:116:24 | true | ExitMethods.cs:116:9:116:25 | call to method AssertFalse | semmle.label | successor | | Extensions.cs:6:5:8:5 | {...} | Extensions.cs:7:28:7:28 | access to parameter s | semmle.label | successor | | Extensions.cs:7:16:7:29 | call to method Parse | Extensions.cs:7:9:7:30 | return ...; | semmle.label | successor | | Extensions.cs:7:28:7:28 | access to parameter s | Extensions.cs:7:16:7:29 | call to method Parse | semmle.label | successor | diff --git a/csharp/ql/test/library-tests/controlflow/graph/ElementGraph.ql b/csharp/ql/test/library-tests/controlflow/graph/ElementGraph.ql index 5c897e08a2b..43d9d9f2a78 100644 --- a/csharp/ql/test/library-tests/controlflow/graph/ElementGraph.ql +++ b/csharp/ql/test/library-tests/controlflow/graph/ElementGraph.ql @@ -1,6 +1,7 @@ import csharp +import Common -query predicate edges(ControlFlowElement node, ControlFlowElement successor, string attr, string val) { +query predicate edges(SourceControlFlowElement node, SourceControlFlowElement successor, string attr, string val) { exists(ControlFlow::SuccessorType t | successor = node.getAControlFlowNode().getASuccessorByType(t).getElement() | attr = "semmle.label" and diff --git a/csharp/ql/test/library-tests/controlflow/graph/EntryElement.expected b/csharp/ql/test/library-tests/controlflow/graph/EntryElement.expected index 7b50af3fe26..bcd5f55c292 100644 --- a/csharp/ql/test/library-tests/controlflow/graph/EntryElement.expected +++ b/csharp/ql/test/library-tests/controlflow/graph/EntryElement.expected @@ -478,86 +478,122 @@ | Conditions.cs:109:22:109:23 | "" | Conditions.cs:109:22:109:23 | "" | | Conditions.cs:110:9:110:17 | return ...; | Conditions.cs:110:16:110:16 | access to local variable x | | Conditions.cs:110:16:110:16 | access to local variable x | Conditions.cs:110:16:110:16 | access to local variable x | -| ExitMethods.cs:7:5:10:5 | {...} | ExitMethods.cs:7:5:10:5 | {...} | -| ExitMethods.cs:8:9:8:24 | call to method ErrorMaybe | ExitMethods.cs:8:20:8:23 | true | -| ExitMethods.cs:8:9:8:25 | ...; | ExitMethods.cs:8:9:8:25 | ...; | -| ExitMethods.cs:8:20:8:23 | true | ExitMethods.cs:8:20:8:23 | true | -| ExitMethods.cs:9:9:9:15 | return ...; | ExitMethods.cs:9:9:9:15 | return ...; | -| ExitMethods.cs:13:5:16:5 | {...} | ExitMethods.cs:13:5:16:5 | {...} | -| ExitMethods.cs:14:9:14:25 | call to method ErrorMaybe | ExitMethods.cs:14:20:14:24 | false | -| ExitMethods.cs:14:9:14:26 | ...; | ExitMethods.cs:14:9:14:26 | ...; | -| ExitMethods.cs:14:20:14:24 | false | ExitMethods.cs:14:20:14:24 | false | -| ExitMethods.cs:15:9:15:15 | return ...; | ExitMethods.cs:15:9:15:15 | return ...; | -| ExitMethods.cs:19:5:22:5 | {...} | ExitMethods.cs:19:5:22:5 | {...} | -| ExitMethods.cs:20:9:20:25 | call to method ErrorAlways | ExitMethods.cs:20:21:20:24 | true | -| ExitMethods.cs:20:9:20:26 | ...; | ExitMethods.cs:20:9:20:26 | ...; | -| ExitMethods.cs:20:21:20:24 | true | ExitMethods.cs:20:21:20:24 | true | -| ExitMethods.cs:21:9:21:15 | return ...; | ExitMethods.cs:21:9:21:15 | return ...; | -| ExitMethods.cs:25:5:28:5 | {...} | ExitMethods.cs:25:5:28:5 | {...} | -| ExitMethods.cs:26:9:26:14 | call to method Exit | ExitMethods.cs:26:9:26:14 | this access | -| ExitMethods.cs:26:9:26:14 | this access | ExitMethods.cs:26:9:26:14 | this access | -| ExitMethods.cs:26:9:26:15 | ...; | ExitMethods.cs:26:9:26:15 | ...; | -| ExitMethods.cs:27:9:27:15 | return ...; | ExitMethods.cs:27:9:27:15 | return ...; | -| ExitMethods.cs:31:5:34:5 | {...} | ExitMethods.cs:31:5:34:5 | {...} | -| ExitMethods.cs:32:9:32:25 | call to method ApplicationExit | ExitMethods.cs:32:9:32:25 | this access | -| ExitMethods.cs:32:9:32:25 | this access | ExitMethods.cs:32:9:32:25 | this access | -| ExitMethods.cs:32:9:32:26 | ...; | ExitMethods.cs:32:9:32:26 | ...; | -| ExitMethods.cs:33:9:33:15 | return ...; | ExitMethods.cs:33:9:33:15 | return ...; | -| ExitMethods.cs:37:5:50:5 | {...} | ExitMethods.cs:37:5:50:5 | {...} | -| ExitMethods.cs:38:9:49:9 | try {...} ... | ExitMethods.cs:38:9:49:9 | try {...} ... | -| ExitMethods.cs:39:9:41:9 | {...} | ExitMethods.cs:39:9:41:9 | {...} | -| ExitMethods.cs:40:13:40:30 | call to method ErrorAlways | ExitMethods.cs:40:25:40:29 | false | -| ExitMethods.cs:40:13:40:31 | ...; | ExitMethods.cs:40:13:40:31 | ...; | -| ExitMethods.cs:40:25:40:29 | false | ExitMethods.cs:40:25:40:29 | false | -| ExitMethods.cs:42:9:45:9 | catch (...) {...} | ExitMethods.cs:42:9:45:9 | catch (...) {...} | -| ExitMethods.cs:43:9:45:9 | {...} | ExitMethods.cs:43:9:45:9 | {...} | -| ExitMethods.cs:44:13:44:19 | return ...; | ExitMethods.cs:44:13:44:19 | return ...; | -| ExitMethods.cs:46:9:49:9 | catch (...) {...} | ExitMethods.cs:46:9:49:9 | catch (...) {...} | -| ExitMethods.cs:47:9:49:9 | {...} | ExitMethods.cs:47:9:49:9 | {...} | -| ExitMethods.cs:48:13:48:19 | return ...; | ExitMethods.cs:48:13:48:19 | return ...; | -| ExitMethods.cs:53:5:56:5 | {...} | ExitMethods.cs:53:5:56:5 | {...} | -| ExitMethods.cs:54:9:55:34 | if (...) ... | ExitMethods.cs:54:9:55:34 | if (...) ... | -| ExitMethods.cs:54:13:54:13 | access to parameter b | ExitMethods.cs:54:13:54:13 | access to parameter b | -| ExitMethods.cs:55:13:55:34 | throw ...; | ExitMethods.cs:55:19:55:33 | object creation of type Exception | -| ExitMethods.cs:55:19:55:33 | object creation of type Exception | ExitMethods.cs:55:19:55:33 | object creation of type Exception | -| ExitMethods.cs:59:5:64:5 | {...} | ExitMethods.cs:59:5:64:5 | {...} | -| ExitMethods.cs:60:9:63:45 | if (...) ... | ExitMethods.cs:60:9:63:45 | if (...) ... | -| ExitMethods.cs:60:13:60:13 | access to parameter b | ExitMethods.cs:60:13:60:13 | access to parameter b | -| ExitMethods.cs:61:13:61:34 | throw ...; | ExitMethods.cs:61:19:61:33 | object creation of type Exception | -| ExitMethods.cs:61:19:61:33 | object creation of type Exception | ExitMethods.cs:61:19:61:33 | object creation of type Exception | -| ExitMethods.cs:63:13:63:45 | throw ...; | ExitMethods.cs:63:41:63:43 | "b" | -| ExitMethods.cs:63:19:63:44 | object creation of type ArgumentException | ExitMethods.cs:63:41:63:43 | "b" | -| ExitMethods.cs:63:41:63:43 | "b" | ExitMethods.cs:63:41:63:43 | "b" | -| ExitMethods.cs:67:5:69:5 | {...} | ExitMethods.cs:67:5:69:5 | {...} | -| ExitMethods.cs:68:9:68:27 | call to method Exit | ExitMethods.cs:68:26:68:26 | 0 | -| ExitMethods.cs:68:9:68:28 | ...; | ExitMethods.cs:68:9:68:28 | ...; | -| ExitMethods.cs:68:26:68:26 | 0 | ExitMethods.cs:68:26:68:26 | 0 | -| ExitMethods.cs:72:5:74:5 | {...} | ExitMethods.cs:72:5:74:5 | {...} | -| ExitMethods.cs:73:9:73:47 | call to method Exit | ExitMethods.cs:73:9:73:47 | call to method Exit | -| ExitMethods.cs:73:9:73:48 | ...; | ExitMethods.cs:73:9:73:48 | ...; | -| ExitMethods.cs:77:5:79:5 | {...} | ExitMethods.cs:77:5:79:5 | {...} | -| ExitMethods.cs:78:9:78:77 | return ...; | ExitMethods.cs:78:16:78:76 | ... ? ... : ... | -| ExitMethods.cs:78:16:78:20 | access to parameter input | ExitMethods.cs:78:16:78:20 | access to parameter input | -| ExitMethods.cs:78:16:78:25 | ... != ... | ExitMethods.cs:78:16:78:20 | access to parameter input | -| ExitMethods.cs:78:16:78:76 | ... ? ... : ... | ExitMethods.cs:78:16:78:76 | ... ? ... : ... | -| ExitMethods.cs:78:25:78:25 | 0 | ExitMethods.cs:78:25:78:25 | 0 | -| ExitMethods.cs:78:25:78:25 | (...) ... | ExitMethods.cs:78:25:78:25 | 0 | -| ExitMethods.cs:78:29:78:29 | 1 | ExitMethods.cs:78:29:78:29 | 1 | -| ExitMethods.cs:78:29:78:29 | (...) ... | ExitMethods.cs:78:29:78:29 | 1 | -| ExitMethods.cs:78:29:78:37 | ... / ... | ExitMethods.cs:78:29:78:29 | 1 | -| ExitMethods.cs:78:33:78:37 | access to parameter input | ExitMethods.cs:78:33:78:37 | access to parameter input | -| ExitMethods.cs:78:41:78:76 | throw ... | ExitMethods.cs:78:69:78:75 | "input" | -| ExitMethods.cs:78:47:78:76 | object creation of type ArgumentException | ExitMethods.cs:78:69:78:75 | "input" | -| ExitMethods.cs:78:69:78:75 | "input" | ExitMethods.cs:78:69:78:75 | "input" | -| ExitMethods.cs:82:5:84:5 | {...} | ExitMethods.cs:82:5:84:5 | {...} | -| ExitMethods.cs:83:9:83:39 | return ...; | ExitMethods.cs:83:16:83:38 | ... ? ... : ... | -| ExitMethods.cs:83:16:83:16 | access to parameter s | ExitMethods.cs:83:16:83:16 | access to parameter s | -| ExitMethods.cs:83:16:83:30 | call to method Contains | ExitMethods.cs:83:16:83:16 | access to parameter s | -| ExitMethods.cs:83:16:83:38 | ... ? ... : ... | ExitMethods.cs:83:16:83:38 | ... ? ... : ... | -| ExitMethods.cs:83:27:83:29 | - | ExitMethods.cs:83:27:83:29 | - | -| ExitMethods.cs:83:34:83:34 | 0 | ExitMethods.cs:83:34:83:34 | 0 | -| ExitMethods.cs:83:38:83:38 | 1 | ExitMethods.cs:83:38:83:38 | 1 | -| ExitMethods.cs:91:35:91:37 | {...} | ExitMethods.cs:91:35:91:37 | {...} | +| ExitMethods.cs:8:5:11:5 | {...} | ExitMethods.cs:8:5:11:5 | {...} | +| ExitMethods.cs:9:9:9:24 | call to method ErrorMaybe | ExitMethods.cs:9:20:9:23 | true | +| ExitMethods.cs:9:9:9:25 | ...; | ExitMethods.cs:9:9:9:25 | ...; | +| ExitMethods.cs:9:20:9:23 | true | ExitMethods.cs:9:20:9:23 | true | +| ExitMethods.cs:10:9:10:15 | return ...; | ExitMethods.cs:10:9:10:15 | return ...; | +| ExitMethods.cs:14:5:17:5 | {...} | ExitMethods.cs:14:5:17:5 | {...} | +| ExitMethods.cs:15:9:15:25 | call to method ErrorMaybe | ExitMethods.cs:15:20:15:24 | false | +| ExitMethods.cs:15:9:15:26 | ...; | ExitMethods.cs:15:9:15:26 | ...; | +| ExitMethods.cs:15:20:15:24 | false | ExitMethods.cs:15:20:15:24 | false | +| ExitMethods.cs:16:9:16:15 | return ...; | ExitMethods.cs:16:9:16:15 | return ...; | +| ExitMethods.cs:20:5:23:5 | {...} | ExitMethods.cs:20:5:23:5 | {...} | +| ExitMethods.cs:21:9:21:25 | call to method ErrorAlways | ExitMethods.cs:21:21:21:24 | true | +| ExitMethods.cs:21:9:21:26 | ...; | ExitMethods.cs:21:9:21:26 | ...; | +| ExitMethods.cs:21:21:21:24 | true | ExitMethods.cs:21:21:21:24 | true | +| ExitMethods.cs:22:9:22:15 | return ...; | ExitMethods.cs:22:9:22:15 | return ...; | +| ExitMethods.cs:26:5:29:5 | {...} | ExitMethods.cs:26:5:29:5 | {...} | +| ExitMethods.cs:27:9:27:14 | call to method Exit | ExitMethods.cs:27:9:27:14 | this access | +| ExitMethods.cs:27:9:27:14 | this access | ExitMethods.cs:27:9:27:14 | this access | +| ExitMethods.cs:27:9:27:15 | ...; | ExitMethods.cs:27:9:27:15 | ...; | +| ExitMethods.cs:28:9:28:15 | return ...; | ExitMethods.cs:28:9:28:15 | return ...; | +| ExitMethods.cs:32:5:35:5 | {...} | ExitMethods.cs:32:5:35:5 | {...} | +| ExitMethods.cs:33:9:33:25 | call to method ApplicationExit | ExitMethods.cs:33:9:33:25 | this access | +| ExitMethods.cs:33:9:33:25 | this access | ExitMethods.cs:33:9:33:25 | this access | +| ExitMethods.cs:33:9:33:26 | ...; | ExitMethods.cs:33:9:33:26 | ...; | +| ExitMethods.cs:34:9:34:15 | return ...; | ExitMethods.cs:34:9:34:15 | return ...; | +| ExitMethods.cs:38:5:51:5 | {...} | ExitMethods.cs:38:5:51:5 | {...} | +| ExitMethods.cs:39:9:50:9 | try {...} ... | ExitMethods.cs:39:9:50:9 | try {...} ... | +| ExitMethods.cs:40:9:42:9 | {...} | ExitMethods.cs:40:9:42:9 | {...} | +| ExitMethods.cs:41:13:41:30 | call to method ErrorAlways | ExitMethods.cs:41:25:41:29 | false | +| ExitMethods.cs:41:13:41:31 | ...; | ExitMethods.cs:41:13:41:31 | ...; | +| ExitMethods.cs:41:25:41:29 | false | ExitMethods.cs:41:25:41:29 | false | +| ExitMethods.cs:43:9:46:9 | catch (...) {...} | ExitMethods.cs:43:9:46:9 | catch (...) {...} | +| ExitMethods.cs:44:9:46:9 | {...} | ExitMethods.cs:44:9:46:9 | {...} | +| ExitMethods.cs:45:13:45:19 | return ...; | ExitMethods.cs:45:13:45:19 | return ...; | +| ExitMethods.cs:47:9:50:9 | catch (...) {...} | ExitMethods.cs:47:9:50:9 | catch (...) {...} | +| ExitMethods.cs:48:9:50:9 | {...} | ExitMethods.cs:48:9:50:9 | {...} | +| ExitMethods.cs:49:13:49:19 | return ...; | ExitMethods.cs:49:13:49:19 | return ...; | +| ExitMethods.cs:54:5:57:5 | {...} | ExitMethods.cs:54:5:57:5 | {...} | +| ExitMethods.cs:55:9:56:34 | if (...) ... | ExitMethods.cs:55:9:56:34 | if (...) ... | +| ExitMethods.cs:55:13:55:13 | access to parameter b | ExitMethods.cs:55:13:55:13 | access to parameter b | +| ExitMethods.cs:56:13:56:34 | throw ...; | ExitMethods.cs:56:19:56:33 | object creation of type Exception | +| ExitMethods.cs:56:19:56:33 | object creation of type Exception | ExitMethods.cs:56:19:56:33 | object creation of type Exception | +| ExitMethods.cs:60:5:65:5 | {...} | ExitMethods.cs:60:5:65:5 | {...} | +| ExitMethods.cs:61:9:64:45 | if (...) ... | ExitMethods.cs:61:9:64:45 | if (...) ... | +| ExitMethods.cs:61:13:61:13 | access to parameter b | ExitMethods.cs:61:13:61:13 | access to parameter b | +| ExitMethods.cs:62:13:62:34 | throw ...; | ExitMethods.cs:62:19:62:33 | object creation of type Exception | +| ExitMethods.cs:62:19:62:33 | object creation of type Exception | ExitMethods.cs:62:19:62:33 | object creation of type Exception | +| ExitMethods.cs:64:13:64:45 | throw ...; | ExitMethods.cs:64:41:64:43 | "b" | +| ExitMethods.cs:64:19:64:44 | object creation of type ArgumentException | ExitMethods.cs:64:41:64:43 | "b" | +| ExitMethods.cs:64:41:64:43 | "b" | ExitMethods.cs:64:41:64:43 | "b" | +| ExitMethods.cs:68:5:70:5 | {...} | ExitMethods.cs:68:5:70:5 | {...} | +| ExitMethods.cs:69:9:69:27 | call to method Exit | ExitMethods.cs:69:26:69:26 | 0 | +| ExitMethods.cs:69:9:69:28 | ...; | ExitMethods.cs:69:9:69:28 | ...; | +| ExitMethods.cs:69:26:69:26 | 0 | ExitMethods.cs:69:26:69:26 | 0 | +| ExitMethods.cs:73:5:83:5 | {...} | ExitMethods.cs:73:5:83:5 | {...} | +| ExitMethods.cs:74:9:82:9 | try {...} ... | ExitMethods.cs:74:9:82:9 | try {...} ... | +| ExitMethods.cs:75:9:77:9 | {...} | ExitMethods.cs:75:9:77:9 | {...} | +| ExitMethods.cs:76:13:76:18 | call to method Exit | ExitMethods.cs:76:13:76:18 | this access | +| ExitMethods.cs:76:13:76:18 | this access | ExitMethods.cs:76:13:76:18 | this access | +| ExitMethods.cs:76:13:76:19 | ...; | ExitMethods.cs:76:13:76:19 | ...; | +| ExitMethods.cs:79:9:82:9 | {...} | ExitMethods.cs:79:9:82:9 | {...} | +| ExitMethods.cs:81:13:81:40 | call to method WriteLine | ExitMethods.cs:81:38:81:39 | "" | +| ExitMethods.cs:81:13:81:41 | ...; | ExitMethods.cs:81:13:81:41 | ...; | +| ExitMethods.cs:81:38:81:39 | "" | ExitMethods.cs:81:38:81:39 | "" | +| ExitMethods.cs:86:5:88:5 | {...} | ExitMethods.cs:86:5:88:5 | {...} | +| ExitMethods.cs:87:9:87:47 | call to method Exit | ExitMethods.cs:87:9:87:47 | call to method Exit | +| ExitMethods.cs:87:9:87:48 | ...; | ExitMethods.cs:87:9:87:48 | ...; | +| ExitMethods.cs:91:5:93:5 | {...} | ExitMethods.cs:91:5:93:5 | {...} | +| ExitMethods.cs:92:9:92:77 | return ...; | ExitMethods.cs:92:16:92:76 | ... ? ... : ... | +| ExitMethods.cs:92:16:92:20 | access to parameter input | ExitMethods.cs:92:16:92:20 | access to parameter input | +| ExitMethods.cs:92:16:92:25 | ... != ... | ExitMethods.cs:92:16:92:20 | access to parameter input | +| ExitMethods.cs:92:16:92:76 | ... ? ... : ... | ExitMethods.cs:92:16:92:76 | ... ? ... : ... | +| ExitMethods.cs:92:25:92:25 | 0 | ExitMethods.cs:92:25:92:25 | 0 | +| ExitMethods.cs:92:25:92:25 | (...) ... | ExitMethods.cs:92:25:92:25 | 0 | +| ExitMethods.cs:92:29:92:29 | 1 | ExitMethods.cs:92:29:92:29 | 1 | +| ExitMethods.cs:92:29:92:29 | (...) ... | ExitMethods.cs:92:29:92:29 | 1 | +| ExitMethods.cs:92:29:92:37 | ... / ... | ExitMethods.cs:92:29:92:29 | 1 | +| ExitMethods.cs:92:33:92:37 | access to parameter input | ExitMethods.cs:92:33:92:37 | access to parameter input | +| ExitMethods.cs:92:41:92:76 | throw ... | ExitMethods.cs:92:69:92:75 | "input" | +| ExitMethods.cs:92:47:92:76 | object creation of type ArgumentException | ExitMethods.cs:92:69:92:75 | "input" | +| ExitMethods.cs:92:69:92:75 | "input" | ExitMethods.cs:92:69:92:75 | "input" | +| ExitMethods.cs:96:5:98:5 | {...} | ExitMethods.cs:96:5:98:5 | {...} | +| ExitMethods.cs:97:9:97:39 | return ...; | ExitMethods.cs:97:16:97:38 | ... ? ... : ... | +| ExitMethods.cs:97:16:97:16 | access to parameter s | ExitMethods.cs:97:16:97:16 | access to parameter s | +| ExitMethods.cs:97:16:97:30 | call to method Contains | ExitMethods.cs:97:16:97:16 | access to parameter s | +| ExitMethods.cs:97:16:97:38 | ... ? ... : ... | ExitMethods.cs:97:16:97:38 | ... ? ... : ... | +| ExitMethods.cs:97:27:97:29 | - | ExitMethods.cs:97:27:97:29 | - | +| ExitMethods.cs:97:34:97:34 | 0 | ExitMethods.cs:97:34:97:34 | 0 | +| ExitMethods.cs:97:38:97:38 | 1 | ExitMethods.cs:97:38:97:38 | 1 | +| ExitMethods.cs:101:5:104:5 | {...} | ExitMethods.cs:101:5:104:5 | {...} | +| ExitMethods.cs:102:9:102:28 | call to method IsTrue | ExitMethods.cs:102:23:102:27 | false | +| ExitMethods.cs:102:9:102:29 | ...; | ExitMethods.cs:102:9:102:29 | ...; | +| ExitMethods.cs:102:23:102:27 | false | ExitMethods.cs:102:23:102:27 | false | +| ExitMethods.cs:103:9:103:18 | ... ...; | ExitMethods.cs:103:9:103:18 | ... ...; | +| ExitMethods.cs:103:13:103:13 | access to local variable x | ExitMethods.cs:103:13:103:13 | access to local variable x | +| ExitMethods.cs:103:13:103:17 | Int32 x = ... | ExitMethods.cs:103:13:103:13 | access to local variable x | +| ExitMethods.cs:103:17:103:17 | 0 | ExitMethods.cs:103:17:103:17 | 0 | +| ExitMethods.cs:107:5:110:5 | {...} | ExitMethods.cs:107:5:110:5 | {...} | +| ExitMethods.cs:108:9:108:26 | call to method FailingAssertion | ExitMethods.cs:108:9:108:26 | this access | +| ExitMethods.cs:108:9:108:26 | this access | ExitMethods.cs:108:9:108:26 | this access | +| ExitMethods.cs:108:9:108:27 | ...; | ExitMethods.cs:108:9:108:27 | ...; | +| ExitMethods.cs:109:9:109:18 | ... ...; | ExitMethods.cs:109:9:109:18 | ... ...; | +| ExitMethods.cs:109:13:109:13 | access to local variable x | ExitMethods.cs:109:13:109:13 | access to local variable x | +| ExitMethods.cs:109:13:109:17 | Int32 x = ... | ExitMethods.cs:109:13:109:13 | access to local variable x | +| ExitMethods.cs:109:17:109:17 | 0 | ExitMethods.cs:109:17:109:17 | 0 | +| ExitMethods.cs:112:33:112:49 | call to method IsFalse | ExitMethods.cs:112:48:112:48 | access to parameter b | +| ExitMethods.cs:112:48:112:48 | access to parameter b | ExitMethods.cs:112:48:112:48 | access to parameter b | +| ExitMethods.cs:115:5:118:5 | {...} | ExitMethods.cs:115:5:118:5 | {...} | +| ExitMethods.cs:116:9:116:25 | call to method AssertFalse | ExitMethods.cs:116:9:116:25 | this access | +| ExitMethods.cs:116:9:116:25 | this access | ExitMethods.cs:116:9:116:25 | this access | +| ExitMethods.cs:116:9:116:26 | ...; | ExitMethods.cs:116:9:116:26 | ...; | +| ExitMethods.cs:116:21:116:24 | true | ExitMethods.cs:116:21:116:24 | true | +| ExitMethods.cs:117:9:117:18 | ... ...; | ExitMethods.cs:117:9:117:18 | ... ...; | +| ExitMethods.cs:117:13:117:13 | access to local variable x | ExitMethods.cs:117:13:117:13 | access to local variable x | +| ExitMethods.cs:117:13:117:17 | Int32 x = ... | ExitMethods.cs:117:13:117:13 | access to local variable x | +| ExitMethods.cs:117:17:117:17 | 0 | ExitMethods.cs:117:17:117:17 | 0 | | Extensions.cs:6:5:8:5 | {...} | Extensions.cs:6:5:8:5 | {...} | | Extensions.cs:7:9:7:30 | return ...; | Extensions.cs:7:28:7:28 | access to parameter s | | Extensions.cs:7:16:7:29 | call to method Parse | Extensions.cs:7:28:7:28 | access to parameter s | diff --git a/csharp/ql/test/library-tests/controlflow/graph/EntryElement.ql b/csharp/ql/test/library-tests/controlflow/graph/EntryElement.ql index 63cbfd32afc..ab5706c1d68 100644 --- a/csharp/ql/test/library-tests/controlflow/graph/EntryElement.ql +++ b/csharp/ql/test/library-tests/controlflow/graph/EntryElement.ql @@ -1,5 +1,6 @@ import csharp +import Common import ControlFlow::Internal -from ControlFlowElement cfe +from SourceControlFlowElement cfe select cfe, first(cfe) diff --git a/csharp/ql/test/library-tests/controlflow/graph/EntryPoint.expected b/csharp/ql/test/library-tests/controlflow/graph/EntryPoint.expected index c29c5cf241c..f218267882b 100644 --- a/csharp/ql/test/library-tests/controlflow/graph/EntryPoint.expected +++ b/csharp/ql/test/library-tests/controlflow/graph/EntryPoint.expected @@ -32,19 +32,23 @@ | Conditions.cs:70:9:70:10 | M6 | Conditions.cs:71:5:84:5 | {...} | | Conditions.cs:86:9:86:10 | M7 | Conditions.cs:87:5:100:5 | {...} | | Conditions.cs:102:12:102:13 | M8 | Conditions.cs:103:5:111:5 | {...} | -| ExitMethods.cs:6:10:6:11 | M1 | ExitMethods.cs:7:5:10:5 | {...} | -| ExitMethods.cs:12:10:12:11 | M2 | ExitMethods.cs:13:5:16:5 | {...} | -| ExitMethods.cs:18:10:18:11 | M3 | ExitMethods.cs:19:5:22:5 | {...} | -| ExitMethods.cs:24:10:24:11 | M4 | ExitMethods.cs:25:5:28:5 | {...} | -| ExitMethods.cs:30:10:30:11 | M5 | ExitMethods.cs:31:5:34:5 | {...} | -| ExitMethods.cs:36:10:36:11 | M6 | ExitMethods.cs:37:5:50:5 | {...} | -| ExitMethods.cs:52:17:52:26 | ErrorMaybe | ExitMethods.cs:53:5:56:5 | {...} | -| ExitMethods.cs:58:17:58:27 | ErrorAlways | ExitMethods.cs:59:5:64:5 | {...} | -| ExitMethods.cs:66:10:66:13 | Exit | ExitMethods.cs:67:5:69:5 | {...} | -| ExitMethods.cs:71:10:71:24 | ApplicationExit | ExitMethods.cs:72:5:74:5 | {...} | -| ExitMethods.cs:76:13:76:21 | ThrowExpr | ExitMethods.cs:77:5:79:5 | {...} | -| ExitMethods.cs:81:16:81:34 | ExtensionMethodCall | ExitMethods.cs:82:5:84:5 | {...} | -| ExitMethods.cs:91:28:91:31 | Exit | ExitMethods.cs:91:35:91:37 | {...} | +| ExitMethods.cs:7:10:7:11 | M1 | ExitMethods.cs:8:5:11:5 | {...} | +| ExitMethods.cs:13:10:13:11 | M2 | ExitMethods.cs:14:5:17:5 | {...} | +| ExitMethods.cs:19:10:19:11 | M3 | ExitMethods.cs:20:5:23:5 | {...} | +| ExitMethods.cs:25:10:25:11 | M4 | ExitMethods.cs:26:5:29:5 | {...} | +| ExitMethods.cs:31:10:31:11 | M5 | ExitMethods.cs:32:5:35:5 | {...} | +| ExitMethods.cs:37:10:37:11 | M6 | ExitMethods.cs:38:5:51:5 | {...} | +| ExitMethods.cs:53:17:53:26 | ErrorMaybe | ExitMethods.cs:54:5:57:5 | {...} | +| ExitMethods.cs:59:17:59:27 | ErrorAlways | ExitMethods.cs:60:5:65:5 | {...} | +| ExitMethods.cs:67:10:67:13 | Exit | ExitMethods.cs:68:5:70:5 | {...} | +| ExitMethods.cs:72:10:72:18 | ExitInTry | ExitMethods.cs:73:5:83:5 | {...} | +| ExitMethods.cs:85:10:85:24 | ApplicationExit | ExitMethods.cs:86:5:88:5 | {...} | +| ExitMethods.cs:90:13:90:21 | ThrowExpr | ExitMethods.cs:91:5:93:5 | {...} | +| ExitMethods.cs:95:16:95:34 | ExtensionMethodCall | ExitMethods.cs:96:5:98:5 | {...} | +| ExitMethods.cs:100:17:100:32 | FailingAssertion | ExitMethods.cs:101:5:104:5 | {...} | +| ExitMethods.cs:106:17:106:33 | FailingAssertion2 | ExitMethods.cs:107:5:110:5 | {...} | +| ExitMethods.cs:112:10:112:20 | AssertFalse | ExitMethods.cs:112:48:112:48 | access to parameter b | +| ExitMethods.cs:114:17:114:33 | FailingAssertion3 | ExitMethods.cs:115:5:118:5 | {...} | | Extensions.cs:5:23:5:29 | ToInt32 | Extensions.cs:6:5:8:5 | {...} | | Extensions.cs:10:24:10:29 | ToBool | Extensions.cs:11:5:13:5 | {...} | | Extensions.cs:15:23:15:33 | CallToInt32 | Extensions.cs:15:48:15:50 | "0" | diff --git a/csharp/ql/test/library-tests/controlflow/graph/EntryPoint.ql b/csharp/ql/test/library-tests/controlflow/graph/EntryPoint.ql index ed04bace741..94ee7f85c16 100644 --- a/csharp/ql/test/library-tests/controlflow/graph/EntryPoint.ql +++ b/csharp/ql/test/library-tests/controlflow/graph/EntryPoint.ql @@ -1,6 +1,7 @@ import csharp import semmle.code.csharp.controlflow.ControlFlowElement +import Common -from Callable c, ControlFlowElement cfn +from Callable c, SourceControlFlowElement cfn where c.getEntryPoint().getASuccessor().getElement() = cfn select c, cfn diff --git a/csharp/ql/test/library-tests/controlflow/graph/ExitElement.expected b/csharp/ql/test/library-tests/controlflow/graph/ExitElement.expected index eca2e509f41..e96a67d12e6 100644 --- a/csharp/ql/test/library-tests/controlflow/graph/ExitElement.expected +++ b/csharp/ql/test/library-tests/controlflow/graph/ExitElement.expected @@ -672,110 +672,151 @@ | Conditions.cs:109:22:109:23 | "" | Conditions.cs:109:22:109:23 | "" | normal | | Conditions.cs:110:9:110:17 | return ...; | Conditions.cs:110:9:110:17 | return ...; | return | | Conditions.cs:110:16:110:16 | access to local variable x | Conditions.cs:110:16:110:16 | access to local variable x | normal | -| ExitMethods.cs:7:5:10:5 | {...} | ExitMethods.cs:9:9:9:15 | return ...; | return | -| ExitMethods.cs:8:9:8:24 | call to method ErrorMaybe | ExitMethods.cs:8:9:8:24 | call to method ErrorMaybe | normal | -| ExitMethods.cs:8:9:8:25 | ...; | ExitMethods.cs:8:9:8:24 | call to method ErrorMaybe | normal | -| ExitMethods.cs:8:20:8:23 | true | ExitMethods.cs:8:20:8:23 | true | normal | -| ExitMethods.cs:9:9:9:15 | return ...; | ExitMethods.cs:9:9:9:15 | return ...; | return | -| ExitMethods.cs:13:5:16:5 | {...} | ExitMethods.cs:15:9:15:15 | return ...; | return | -| ExitMethods.cs:14:9:14:25 | call to method ErrorMaybe | ExitMethods.cs:14:9:14:25 | call to method ErrorMaybe | normal | -| ExitMethods.cs:14:9:14:26 | ...; | ExitMethods.cs:14:9:14:25 | call to method ErrorMaybe | normal | -| ExitMethods.cs:14:20:14:24 | false | ExitMethods.cs:14:20:14:24 | false | normal | -| ExitMethods.cs:15:9:15:15 | return ...; | ExitMethods.cs:15:9:15:15 | return ...; | return | -| ExitMethods.cs:19:5:22:5 | {...} | ExitMethods.cs:20:9:20:25 | call to method ErrorAlways | throw(ArgumentException) | -| ExitMethods.cs:19:5:22:5 | {...} | ExitMethods.cs:20:9:20:25 | call to method ErrorAlways | throw(Exception) | -| ExitMethods.cs:19:5:22:5 | {...} | ExitMethods.cs:21:9:21:15 | return ...; | return | -| ExitMethods.cs:20:9:20:25 | call to method ErrorAlways | ExitMethods.cs:20:9:20:25 | call to method ErrorAlways | throw(ArgumentException) | -| ExitMethods.cs:20:9:20:25 | call to method ErrorAlways | ExitMethods.cs:20:9:20:25 | call to method ErrorAlways | throw(Exception) | -| ExitMethods.cs:20:9:20:26 | ...; | ExitMethods.cs:20:9:20:25 | call to method ErrorAlways | throw(ArgumentException) | -| ExitMethods.cs:20:9:20:26 | ...; | ExitMethods.cs:20:9:20:25 | call to method ErrorAlways | throw(Exception) | -| ExitMethods.cs:20:21:20:24 | true | ExitMethods.cs:20:21:20:24 | true | normal | -| ExitMethods.cs:21:9:21:15 | return ...; | ExitMethods.cs:21:9:21:15 | return ...; | return | -| ExitMethods.cs:25:5:28:5 | {...} | ExitMethods.cs:26:9:26:14 | call to method Exit | return | -| ExitMethods.cs:25:5:28:5 | {...} | ExitMethods.cs:27:9:27:15 | return ...; | return | -| ExitMethods.cs:26:9:26:14 | call to method Exit | ExitMethods.cs:26:9:26:14 | call to method Exit | return | -| ExitMethods.cs:26:9:26:14 | this access | ExitMethods.cs:26:9:26:14 | this access | normal | -| ExitMethods.cs:26:9:26:15 | ...; | ExitMethods.cs:26:9:26:14 | call to method Exit | return | -| ExitMethods.cs:27:9:27:15 | return ...; | ExitMethods.cs:27:9:27:15 | return ...; | return | -| ExitMethods.cs:31:5:34:5 | {...} | ExitMethods.cs:32:9:32:25 | call to method ApplicationExit | return | -| ExitMethods.cs:31:5:34:5 | {...} | ExitMethods.cs:33:9:33:15 | return ...; | return | -| ExitMethods.cs:32:9:32:25 | call to method ApplicationExit | ExitMethods.cs:32:9:32:25 | call to method ApplicationExit | return | -| ExitMethods.cs:32:9:32:25 | this access | ExitMethods.cs:32:9:32:25 | this access | normal | -| ExitMethods.cs:32:9:32:26 | ...; | ExitMethods.cs:32:9:32:25 | call to method ApplicationExit | return | -| ExitMethods.cs:33:9:33:15 | return ...; | ExitMethods.cs:33:9:33:15 | return ...; | return | -| ExitMethods.cs:37:5:50:5 | {...} | ExitMethods.cs:44:13:44:19 | return ...; | return | -| ExitMethods.cs:37:5:50:5 | {...} | ExitMethods.cs:48:13:48:19 | return ...; | return | -| ExitMethods.cs:38:9:49:9 | try {...} ... | ExitMethods.cs:44:13:44:19 | return ...; | return | -| ExitMethods.cs:38:9:49:9 | try {...} ... | ExitMethods.cs:48:13:48:19 | return ...; | return | -| ExitMethods.cs:39:9:41:9 | {...} | ExitMethods.cs:40:13:40:30 | call to method ErrorAlways | throw(ArgumentException) | -| ExitMethods.cs:39:9:41:9 | {...} | ExitMethods.cs:40:13:40:30 | call to method ErrorAlways | throw(Exception) | -| ExitMethods.cs:40:13:40:30 | call to method ErrorAlways | ExitMethods.cs:40:13:40:30 | call to method ErrorAlways | throw(ArgumentException) | -| ExitMethods.cs:40:13:40:30 | call to method ErrorAlways | ExitMethods.cs:40:13:40:30 | call to method ErrorAlways | throw(Exception) | -| ExitMethods.cs:40:13:40:31 | ...; | ExitMethods.cs:40:13:40:30 | call to method ErrorAlways | throw(ArgumentException) | -| ExitMethods.cs:40:13:40:31 | ...; | ExitMethods.cs:40:13:40:30 | call to method ErrorAlways | throw(Exception) | -| ExitMethods.cs:40:25:40:29 | false | ExitMethods.cs:40:25:40:29 | false | normal | -| ExitMethods.cs:42:9:45:9 | catch (...) {...} | ExitMethods.cs:42:9:45:9 | catch (...) {...} | no-match | -| ExitMethods.cs:42:9:45:9 | catch (...) {...} | ExitMethods.cs:44:13:44:19 | return ...; | return | -| ExitMethods.cs:43:9:45:9 | {...} | ExitMethods.cs:44:13:44:19 | return ...; | return | -| ExitMethods.cs:44:13:44:19 | return ...; | ExitMethods.cs:44:13:44:19 | return ...; | return | -| ExitMethods.cs:46:9:49:9 | catch (...) {...} | ExitMethods.cs:48:13:48:19 | return ...; | return | -| ExitMethods.cs:47:9:49:9 | {...} | ExitMethods.cs:48:13:48:19 | return ...; | return | -| ExitMethods.cs:48:13:48:19 | return ...; | ExitMethods.cs:48:13:48:19 | return ...; | return | -| ExitMethods.cs:53:5:56:5 | {...} | ExitMethods.cs:54:13:54:13 | access to parameter b | false/false | -| ExitMethods.cs:53:5:56:5 | {...} | ExitMethods.cs:55:13:55:34 | throw ...; | throw(Exception) | -| ExitMethods.cs:54:9:55:34 | if (...) ... | ExitMethods.cs:54:13:54:13 | access to parameter b | false/false | -| ExitMethods.cs:54:9:55:34 | if (...) ... | ExitMethods.cs:55:13:55:34 | throw ...; | throw(Exception) | -| ExitMethods.cs:54:13:54:13 | access to parameter b | ExitMethods.cs:54:13:54:13 | access to parameter b | false/false | -| ExitMethods.cs:54:13:54:13 | access to parameter b | ExitMethods.cs:54:13:54:13 | access to parameter b | true/true | -| ExitMethods.cs:55:13:55:34 | throw ...; | ExitMethods.cs:55:13:55:34 | throw ...; | throw(Exception) | -| ExitMethods.cs:55:19:55:33 | object creation of type Exception | ExitMethods.cs:55:19:55:33 | object creation of type Exception | normal | -| ExitMethods.cs:59:5:64:5 | {...} | ExitMethods.cs:61:13:61:34 | throw ...; | throw(Exception) | -| ExitMethods.cs:59:5:64:5 | {...} | ExitMethods.cs:63:13:63:45 | throw ...; | throw(ArgumentException) | -| ExitMethods.cs:60:9:63:45 | if (...) ... | ExitMethods.cs:61:13:61:34 | throw ...; | throw(Exception) | -| ExitMethods.cs:60:9:63:45 | if (...) ... | ExitMethods.cs:63:13:63:45 | throw ...; | throw(ArgumentException) | -| ExitMethods.cs:60:13:60:13 | access to parameter b | ExitMethods.cs:60:13:60:13 | access to parameter b | false/false | -| ExitMethods.cs:60:13:60:13 | access to parameter b | ExitMethods.cs:60:13:60:13 | access to parameter b | true/true | -| ExitMethods.cs:61:13:61:34 | throw ...; | ExitMethods.cs:61:13:61:34 | throw ...; | throw(Exception) | -| ExitMethods.cs:61:19:61:33 | object creation of type Exception | ExitMethods.cs:61:19:61:33 | object creation of type Exception | normal | -| ExitMethods.cs:63:13:63:45 | throw ...; | ExitMethods.cs:63:13:63:45 | throw ...; | throw(ArgumentException) | -| ExitMethods.cs:63:19:63:44 | object creation of type ArgumentException | ExitMethods.cs:63:19:63:44 | object creation of type ArgumentException | normal | -| ExitMethods.cs:63:41:63:43 | "b" | ExitMethods.cs:63:41:63:43 | "b" | normal | -| ExitMethods.cs:67:5:69:5 | {...} | ExitMethods.cs:68:9:68:27 | call to method Exit | return | -| ExitMethods.cs:68:9:68:27 | call to method Exit | ExitMethods.cs:68:9:68:27 | call to method Exit | return | -| ExitMethods.cs:68:9:68:28 | ...; | ExitMethods.cs:68:9:68:27 | call to method Exit | return | -| ExitMethods.cs:68:26:68:26 | 0 | ExitMethods.cs:68:26:68:26 | 0 | normal | -| ExitMethods.cs:72:5:74:5 | {...} | ExitMethods.cs:73:9:73:47 | call to method Exit | return | -| ExitMethods.cs:73:9:73:47 | call to method Exit | ExitMethods.cs:73:9:73:47 | call to method Exit | return | -| ExitMethods.cs:73:9:73:48 | ...; | ExitMethods.cs:73:9:73:47 | call to method Exit | return | -| ExitMethods.cs:77:5:79:5 | {...} | ExitMethods.cs:78:9:78:77 | return ...; | return | -| ExitMethods.cs:77:5:79:5 | {...} | ExitMethods.cs:78:41:78:76 | throw ... | throw(ArgumentException) | -| ExitMethods.cs:78:9:78:77 | return ...; | ExitMethods.cs:78:9:78:77 | return ...; | return | -| ExitMethods.cs:78:9:78:77 | return ...; | ExitMethods.cs:78:41:78:76 | throw ... | throw(ArgumentException) | -| ExitMethods.cs:78:16:78:20 | access to parameter input | ExitMethods.cs:78:16:78:20 | access to parameter input | normal | -| ExitMethods.cs:78:16:78:25 | ... != ... | ExitMethods.cs:78:16:78:25 | ... != ... | false/false | -| ExitMethods.cs:78:16:78:25 | ... != ... | ExitMethods.cs:78:16:78:25 | ... != ... | true/true | -| ExitMethods.cs:78:16:78:76 | ... ? ... : ... | ExitMethods.cs:78:29:78:37 | ... / ... | normal | -| ExitMethods.cs:78:16:78:76 | ... ? ... : ... | ExitMethods.cs:78:41:78:76 | throw ... | throw(ArgumentException) | -| ExitMethods.cs:78:25:78:25 | 0 | ExitMethods.cs:78:25:78:25 | 0 | normal | -| ExitMethods.cs:78:25:78:25 | (...) ... | ExitMethods.cs:78:25:78:25 | (...) ... | normal | -| ExitMethods.cs:78:29:78:29 | 1 | ExitMethods.cs:78:29:78:29 | 1 | normal | -| ExitMethods.cs:78:29:78:29 | (...) ... | ExitMethods.cs:78:29:78:29 | (...) ... | normal | -| ExitMethods.cs:78:29:78:37 | ... / ... | ExitMethods.cs:78:29:78:37 | ... / ... | normal | -| ExitMethods.cs:78:33:78:37 | access to parameter input | ExitMethods.cs:78:33:78:37 | access to parameter input | normal | -| ExitMethods.cs:78:41:78:76 | throw ... | ExitMethods.cs:78:41:78:76 | throw ... | throw(ArgumentException) | -| ExitMethods.cs:78:47:78:76 | object creation of type ArgumentException | ExitMethods.cs:78:47:78:76 | object creation of type ArgumentException | normal | -| ExitMethods.cs:78:69:78:75 | "input" | ExitMethods.cs:78:69:78:75 | "input" | normal | -| ExitMethods.cs:82:5:84:5 | {...} | ExitMethods.cs:83:9:83:39 | return ...; | return | -| ExitMethods.cs:83:9:83:39 | return ...; | ExitMethods.cs:83:9:83:39 | return ...; | return | -| ExitMethods.cs:83:16:83:16 | access to parameter s | ExitMethods.cs:83:16:83:16 | access to parameter s | normal | -| ExitMethods.cs:83:16:83:30 | call to method Contains | ExitMethods.cs:83:16:83:30 | call to method Contains | false/false | -| ExitMethods.cs:83:16:83:30 | call to method Contains | ExitMethods.cs:83:16:83:30 | call to method Contains | true/true | -| ExitMethods.cs:83:16:83:38 | ... ? ... : ... | ExitMethods.cs:83:34:83:34 | 0 | normal | -| ExitMethods.cs:83:16:83:38 | ... ? ... : ... | ExitMethods.cs:83:38:83:38 | 1 | normal | -| ExitMethods.cs:83:27:83:29 | - | ExitMethods.cs:83:27:83:29 | - | normal | -| ExitMethods.cs:83:34:83:34 | 0 | ExitMethods.cs:83:34:83:34 | 0 | normal | -| ExitMethods.cs:83:38:83:38 | 1 | ExitMethods.cs:83:38:83:38 | 1 | normal | -| ExitMethods.cs:91:35:91:37 | {...} | ExitMethods.cs:91:35:91:37 | {...} | normal | +| ExitMethods.cs:8:5:11:5 | {...} | ExitMethods.cs:10:9:10:15 | return ...; | return | +| ExitMethods.cs:9:9:9:24 | call to method ErrorMaybe | ExitMethods.cs:9:9:9:24 | call to method ErrorMaybe | normal | +| ExitMethods.cs:9:9:9:25 | ...; | ExitMethods.cs:9:9:9:24 | call to method ErrorMaybe | normal | +| ExitMethods.cs:9:20:9:23 | true | ExitMethods.cs:9:20:9:23 | true | normal | +| ExitMethods.cs:10:9:10:15 | return ...; | ExitMethods.cs:10:9:10:15 | return ...; | return | +| ExitMethods.cs:14:5:17:5 | {...} | ExitMethods.cs:16:9:16:15 | return ...; | return | +| ExitMethods.cs:15:9:15:25 | call to method ErrorMaybe | ExitMethods.cs:15:9:15:25 | call to method ErrorMaybe | normal | +| ExitMethods.cs:15:9:15:26 | ...; | ExitMethods.cs:15:9:15:25 | call to method ErrorMaybe | normal | +| ExitMethods.cs:15:20:15:24 | false | ExitMethods.cs:15:20:15:24 | false | normal | +| ExitMethods.cs:16:9:16:15 | return ...; | ExitMethods.cs:16:9:16:15 | return ...; | return | +| ExitMethods.cs:20:5:23:5 | {...} | ExitMethods.cs:21:9:21:25 | call to method ErrorAlways | throw(ArgumentException) | +| ExitMethods.cs:20:5:23:5 | {...} | ExitMethods.cs:21:9:21:25 | call to method ErrorAlways | throw(Exception) | +| ExitMethods.cs:20:5:23:5 | {...} | ExitMethods.cs:22:9:22:15 | return ...; | return | +| ExitMethods.cs:21:9:21:25 | call to method ErrorAlways | ExitMethods.cs:21:9:21:25 | call to method ErrorAlways | throw(ArgumentException) | +| ExitMethods.cs:21:9:21:25 | call to method ErrorAlways | ExitMethods.cs:21:9:21:25 | call to method ErrorAlways | throw(Exception) | +| ExitMethods.cs:21:9:21:26 | ...; | ExitMethods.cs:21:9:21:25 | call to method ErrorAlways | throw(ArgumentException) | +| ExitMethods.cs:21:9:21:26 | ...; | ExitMethods.cs:21:9:21:25 | call to method ErrorAlways | throw(Exception) | +| ExitMethods.cs:21:21:21:24 | true | ExitMethods.cs:21:21:21:24 | true | normal | +| ExitMethods.cs:22:9:22:15 | return ...; | ExitMethods.cs:22:9:22:15 | return ...; | return | +| ExitMethods.cs:26:5:29:5 | {...} | ExitMethods.cs:27:9:27:14 | call to method Exit | exit | +| ExitMethods.cs:26:5:29:5 | {...} | ExitMethods.cs:28:9:28:15 | return ...; | return | +| ExitMethods.cs:27:9:27:14 | call to method Exit | ExitMethods.cs:27:9:27:14 | call to method Exit | exit | +| ExitMethods.cs:27:9:27:14 | this access | ExitMethods.cs:27:9:27:14 | this access | normal | +| ExitMethods.cs:27:9:27:15 | ...; | ExitMethods.cs:27:9:27:14 | call to method Exit | exit | +| ExitMethods.cs:28:9:28:15 | return ...; | ExitMethods.cs:28:9:28:15 | return ...; | return | +| ExitMethods.cs:32:5:35:5 | {...} | ExitMethods.cs:33:9:33:25 | call to method ApplicationExit | exit | +| ExitMethods.cs:32:5:35:5 | {...} | ExitMethods.cs:34:9:34:15 | return ...; | return | +| ExitMethods.cs:33:9:33:25 | call to method ApplicationExit | ExitMethods.cs:33:9:33:25 | call to method ApplicationExit | exit | +| ExitMethods.cs:33:9:33:25 | this access | ExitMethods.cs:33:9:33:25 | this access | normal | +| ExitMethods.cs:33:9:33:26 | ...; | ExitMethods.cs:33:9:33:25 | call to method ApplicationExit | exit | +| ExitMethods.cs:34:9:34:15 | return ...; | ExitMethods.cs:34:9:34:15 | return ...; | return | +| ExitMethods.cs:38:5:51:5 | {...} | ExitMethods.cs:45:13:45:19 | return ...; | return | +| ExitMethods.cs:38:5:51:5 | {...} | ExitMethods.cs:49:13:49:19 | return ...; | return | +| ExitMethods.cs:39:9:50:9 | try {...} ... | ExitMethods.cs:45:13:45:19 | return ...; | return | +| ExitMethods.cs:39:9:50:9 | try {...} ... | ExitMethods.cs:49:13:49:19 | return ...; | return | +| ExitMethods.cs:40:9:42:9 | {...} | ExitMethods.cs:41:13:41:30 | call to method ErrorAlways | throw(ArgumentException) | +| ExitMethods.cs:40:9:42:9 | {...} | ExitMethods.cs:41:13:41:30 | call to method ErrorAlways | throw(Exception) | +| ExitMethods.cs:41:13:41:30 | call to method ErrorAlways | ExitMethods.cs:41:13:41:30 | call to method ErrorAlways | throw(ArgumentException) | +| ExitMethods.cs:41:13:41:30 | call to method ErrorAlways | ExitMethods.cs:41:13:41:30 | call to method ErrorAlways | throw(Exception) | +| ExitMethods.cs:41:13:41:31 | ...; | ExitMethods.cs:41:13:41:30 | call to method ErrorAlways | throw(ArgumentException) | +| ExitMethods.cs:41:13:41:31 | ...; | ExitMethods.cs:41:13:41:30 | call to method ErrorAlways | throw(Exception) | +| ExitMethods.cs:41:25:41:29 | false | ExitMethods.cs:41:25:41:29 | false | normal | +| ExitMethods.cs:43:9:46:9 | catch (...) {...} | ExitMethods.cs:43:9:46:9 | catch (...) {...} | no-match | +| ExitMethods.cs:43:9:46:9 | catch (...) {...} | ExitMethods.cs:45:13:45:19 | return ...; | return | +| ExitMethods.cs:44:9:46:9 | {...} | ExitMethods.cs:45:13:45:19 | return ...; | return | +| ExitMethods.cs:45:13:45:19 | return ...; | ExitMethods.cs:45:13:45:19 | return ...; | return | +| ExitMethods.cs:47:9:50:9 | catch (...) {...} | ExitMethods.cs:49:13:49:19 | return ...; | return | +| ExitMethods.cs:48:9:50:9 | {...} | ExitMethods.cs:49:13:49:19 | return ...; | return | +| ExitMethods.cs:49:13:49:19 | return ...; | ExitMethods.cs:49:13:49:19 | return ...; | return | +| ExitMethods.cs:54:5:57:5 | {...} | ExitMethods.cs:55:13:55:13 | access to parameter b | false/false | +| ExitMethods.cs:54:5:57:5 | {...} | ExitMethods.cs:56:13:56:34 | throw ...; | throw(Exception) | +| ExitMethods.cs:55:9:56:34 | if (...) ... | ExitMethods.cs:55:13:55:13 | access to parameter b | false/false | +| ExitMethods.cs:55:9:56:34 | if (...) ... | ExitMethods.cs:56:13:56:34 | throw ...; | throw(Exception) | +| ExitMethods.cs:55:13:55:13 | access to parameter b | ExitMethods.cs:55:13:55:13 | access to parameter b | false/false | +| ExitMethods.cs:55:13:55:13 | access to parameter b | ExitMethods.cs:55:13:55:13 | access to parameter b | true/true | +| ExitMethods.cs:56:13:56:34 | throw ...; | ExitMethods.cs:56:13:56:34 | throw ...; | throw(Exception) | +| ExitMethods.cs:56:19:56:33 | object creation of type Exception | ExitMethods.cs:56:19:56:33 | object creation of type Exception | normal | +| ExitMethods.cs:60:5:65:5 | {...} | ExitMethods.cs:62:13:62:34 | throw ...; | throw(Exception) | +| ExitMethods.cs:60:5:65:5 | {...} | ExitMethods.cs:64:13:64:45 | throw ...; | throw(ArgumentException) | +| ExitMethods.cs:61:9:64:45 | if (...) ... | ExitMethods.cs:62:13:62:34 | throw ...; | throw(Exception) | +| ExitMethods.cs:61:9:64:45 | if (...) ... | ExitMethods.cs:64:13:64:45 | throw ...; | throw(ArgumentException) | +| ExitMethods.cs:61:13:61:13 | access to parameter b | ExitMethods.cs:61:13:61:13 | access to parameter b | false/false | +| ExitMethods.cs:61:13:61:13 | access to parameter b | ExitMethods.cs:61:13:61:13 | access to parameter b | true/true | +| ExitMethods.cs:62:13:62:34 | throw ...; | ExitMethods.cs:62:13:62:34 | throw ...; | throw(Exception) | +| ExitMethods.cs:62:19:62:33 | object creation of type Exception | ExitMethods.cs:62:19:62:33 | object creation of type Exception | normal | +| ExitMethods.cs:64:13:64:45 | throw ...; | ExitMethods.cs:64:13:64:45 | throw ...; | throw(ArgumentException) | +| ExitMethods.cs:64:19:64:44 | object creation of type ArgumentException | ExitMethods.cs:64:19:64:44 | object creation of type ArgumentException | normal | +| ExitMethods.cs:64:41:64:43 | "b" | ExitMethods.cs:64:41:64:43 | "b" | normal | +| ExitMethods.cs:68:5:70:5 | {...} | ExitMethods.cs:69:9:69:27 | call to method Exit | exit | +| ExitMethods.cs:69:9:69:27 | call to method Exit | ExitMethods.cs:69:9:69:27 | call to method Exit | exit | +| ExitMethods.cs:69:9:69:28 | ...; | ExitMethods.cs:69:9:69:27 | call to method Exit | exit | +| ExitMethods.cs:69:26:69:26 | 0 | ExitMethods.cs:69:26:69:26 | 0 | normal | +| ExitMethods.cs:73:5:83:5 | {...} | ExitMethods.cs:76:13:76:18 | call to method Exit | exit | +| ExitMethods.cs:73:5:83:5 | {...} | ExitMethods.cs:81:13:81:40 | call to method WriteLine | exit | +| ExitMethods.cs:74:9:82:9 | try {...} ... | ExitMethods.cs:76:13:76:18 | call to method Exit | exit | +| ExitMethods.cs:74:9:82:9 | try {...} ... | ExitMethods.cs:81:13:81:40 | call to method WriteLine | exit | +| ExitMethods.cs:75:9:77:9 | {...} | ExitMethods.cs:76:13:76:18 | call to method Exit | exit | +| ExitMethods.cs:76:13:76:18 | call to method Exit | ExitMethods.cs:76:13:76:18 | call to method Exit | exit | +| ExitMethods.cs:76:13:76:18 | this access | ExitMethods.cs:76:13:76:18 | this access | normal | +| ExitMethods.cs:76:13:76:19 | ...; | ExitMethods.cs:76:13:76:18 | call to method Exit | exit | +| ExitMethods.cs:79:9:82:9 | {...} | ExitMethods.cs:81:13:81:40 | call to method WriteLine | normal | +| ExitMethods.cs:81:13:81:40 | call to method WriteLine | ExitMethods.cs:81:13:81:40 | call to method WriteLine | normal | +| ExitMethods.cs:81:13:81:41 | ...; | ExitMethods.cs:81:13:81:40 | call to method WriteLine | normal | +| ExitMethods.cs:81:38:81:39 | "" | ExitMethods.cs:81:38:81:39 | "" | normal | +| ExitMethods.cs:86:5:88:5 | {...} | ExitMethods.cs:87:9:87:47 | call to method Exit | exit | +| ExitMethods.cs:87:9:87:47 | call to method Exit | ExitMethods.cs:87:9:87:47 | call to method Exit | exit | +| ExitMethods.cs:87:9:87:48 | ...; | ExitMethods.cs:87:9:87:47 | call to method Exit | exit | +| ExitMethods.cs:91:5:93:5 | {...} | ExitMethods.cs:92:9:92:77 | return ...; | return | +| ExitMethods.cs:91:5:93:5 | {...} | ExitMethods.cs:92:41:92:76 | throw ... | throw(ArgumentException) | +| ExitMethods.cs:92:9:92:77 | return ...; | ExitMethods.cs:92:9:92:77 | return ...; | return | +| ExitMethods.cs:92:9:92:77 | return ...; | ExitMethods.cs:92:41:92:76 | throw ... | throw(ArgumentException) | +| ExitMethods.cs:92:16:92:20 | access to parameter input | ExitMethods.cs:92:16:92:20 | access to parameter input | normal | +| ExitMethods.cs:92:16:92:25 | ... != ... | ExitMethods.cs:92:16:92:25 | ... != ... | false/false | +| ExitMethods.cs:92:16:92:25 | ... != ... | ExitMethods.cs:92:16:92:25 | ... != ... | true/true | +| ExitMethods.cs:92:16:92:76 | ... ? ... : ... | ExitMethods.cs:92:29:92:37 | ... / ... | normal | +| ExitMethods.cs:92:16:92:76 | ... ? ... : ... | ExitMethods.cs:92:41:92:76 | throw ... | throw(ArgumentException) | +| ExitMethods.cs:92:25:92:25 | 0 | ExitMethods.cs:92:25:92:25 | 0 | normal | +| ExitMethods.cs:92:25:92:25 | (...) ... | ExitMethods.cs:92:25:92:25 | (...) ... | normal | +| ExitMethods.cs:92:29:92:29 | 1 | ExitMethods.cs:92:29:92:29 | 1 | normal | +| ExitMethods.cs:92:29:92:29 | (...) ... | ExitMethods.cs:92:29:92:29 | (...) ... | normal | +| ExitMethods.cs:92:29:92:37 | ... / ... | ExitMethods.cs:92:29:92:37 | ... / ... | normal | +| ExitMethods.cs:92:33:92:37 | access to parameter input | ExitMethods.cs:92:33:92:37 | access to parameter input | normal | +| ExitMethods.cs:92:41:92:76 | throw ... | ExitMethods.cs:92:41:92:76 | throw ... | throw(ArgumentException) | +| ExitMethods.cs:92:47:92:76 | object creation of type ArgumentException | ExitMethods.cs:92:47:92:76 | object creation of type ArgumentException | normal | +| ExitMethods.cs:92:69:92:75 | "input" | ExitMethods.cs:92:69:92:75 | "input" | normal | +| ExitMethods.cs:96:5:98:5 | {...} | ExitMethods.cs:97:9:97:39 | return ...; | return | +| ExitMethods.cs:97:9:97:39 | return ...; | ExitMethods.cs:97:9:97:39 | return ...; | return | +| ExitMethods.cs:97:16:97:16 | access to parameter s | ExitMethods.cs:97:16:97:16 | access to parameter s | normal | +| ExitMethods.cs:97:16:97:30 | call to method Contains | ExitMethods.cs:97:16:97:30 | call to method Contains | false/false | +| ExitMethods.cs:97:16:97:30 | call to method Contains | ExitMethods.cs:97:16:97:30 | call to method Contains | true/true | +| ExitMethods.cs:97:16:97:38 | ... ? ... : ... | ExitMethods.cs:97:34:97:34 | 0 | normal | +| ExitMethods.cs:97:16:97:38 | ... ? ... : ... | ExitMethods.cs:97:38:97:38 | 1 | normal | +| ExitMethods.cs:97:27:97:29 | - | ExitMethods.cs:97:27:97:29 | - | normal | +| ExitMethods.cs:97:34:97:34 | 0 | ExitMethods.cs:97:34:97:34 | 0 | normal | +| ExitMethods.cs:97:38:97:38 | 1 | ExitMethods.cs:97:38:97:38 | 1 | normal | +| ExitMethods.cs:101:5:104:5 | {...} | ExitMethods.cs:102:9:102:28 | call to method IsTrue | throw(AssertFailedException) | +| ExitMethods.cs:101:5:104:5 | {...} | ExitMethods.cs:103:13:103:17 | Int32 x = ... | normal | +| ExitMethods.cs:102:9:102:28 | call to method IsTrue | ExitMethods.cs:102:9:102:28 | call to method IsTrue | throw(AssertFailedException) | +| ExitMethods.cs:102:9:102:29 | ...; | ExitMethods.cs:102:9:102:28 | call to method IsTrue | throw(AssertFailedException) | +| ExitMethods.cs:102:23:102:27 | false | ExitMethods.cs:102:23:102:27 | false | normal | +| ExitMethods.cs:103:9:103:18 | ... ...; | ExitMethods.cs:103:13:103:17 | Int32 x = ... | normal | +| ExitMethods.cs:103:13:103:13 | access to local variable x | ExitMethods.cs:103:13:103:13 | access to local variable x | normal | +| ExitMethods.cs:103:13:103:17 | Int32 x = ... | ExitMethods.cs:103:13:103:17 | Int32 x = ... | normal | +| ExitMethods.cs:103:17:103:17 | 0 | ExitMethods.cs:103:17:103:17 | 0 | normal | +| ExitMethods.cs:107:5:110:5 | {...} | ExitMethods.cs:108:9:108:26 | call to method FailingAssertion | throw(AssertFailedException) | +| ExitMethods.cs:107:5:110:5 | {...} | ExitMethods.cs:109:13:109:17 | Int32 x = ... | normal | +| ExitMethods.cs:108:9:108:26 | call to method FailingAssertion | ExitMethods.cs:108:9:108:26 | call to method FailingAssertion | throw(AssertFailedException) | +| ExitMethods.cs:108:9:108:26 | this access | ExitMethods.cs:108:9:108:26 | this access | normal | +| ExitMethods.cs:108:9:108:27 | ...; | ExitMethods.cs:108:9:108:26 | call to method FailingAssertion | throw(AssertFailedException) | +| ExitMethods.cs:109:9:109:18 | ... ...; | ExitMethods.cs:109:13:109:17 | Int32 x = ... | normal | +| ExitMethods.cs:109:13:109:13 | access to local variable x | ExitMethods.cs:109:13:109:13 | access to local variable x | normal | +| ExitMethods.cs:109:13:109:17 | Int32 x = ... | ExitMethods.cs:109:13:109:17 | Int32 x = ... | normal | +| ExitMethods.cs:109:17:109:17 | 0 | ExitMethods.cs:109:17:109:17 | 0 | normal | +| ExitMethods.cs:112:33:112:49 | call to method IsFalse | ExitMethods.cs:112:33:112:49 | call to method IsFalse | normal | +| ExitMethods.cs:112:48:112:48 | access to parameter b | ExitMethods.cs:112:48:112:48 | access to parameter b | normal | +| ExitMethods.cs:115:5:118:5 | {...} | ExitMethods.cs:116:9:116:25 | call to method AssertFalse | throw(AssertFailedException) | +| ExitMethods.cs:115:5:118:5 | {...} | ExitMethods.cs:117:13:117:17 | Int32 x = ... | normal | +| ExitMethods.cs:116:9:116:25 | call to method AssertFalse | ExitMethods.cs:116:9:116:25 | call to method AssertFalse | throw(AssertFailedException) | +| ExitMethods.cs:116:9:116:25 | this access | ExitMethods.cs:116:9:116:25 | this access | normal | +| ExitMethods.cs:116:9:116:26 | ...; | ExitMethods.cs:116:9:116:25 | call to method AssertFalse | throw(AssertFailedException) | +| ExitMethods.cs:116:21:116:24 | true | ExitMethods.cs:116:21:116:24 | true | normal | +| ExitMethods.cs:117:9:117:18 | ... ...; | ExitMethods.cs:117:13:117:17 | Int32 x = ... | normal | +| ExitMethods.cs:117:13:117:13 | access to local variable x | ExitMethods.cs:117:13:117:13 | access to local variable x | normal | +| ExitMethods.cs:117:13:117:17 | Int32 x = ... | ExitMethods.cs:117:13:117:17 | Int32 x = ... | normal | +| ExitMethods.cs:117:17:117:17 | 0 | ExitMethods.cs:117:17:117:17 | 0 | normal | | Extensions.cs:6:5:8:5 | {...} | Extensions.cs:7:9:7:30 | return ...; | return | | Extensions.cs:7:9:7:30 | return ...; | Extensions.cs:7:9:7:30 | return ...; | return | | Extensions.cs:7:16:7:29 | call to method Parse | Extensions.cs:7:16:7:29 | call to method Parse | normal | diff --git a/csharp/ql/test/library-tests/controlflow/graph/ExitElement.ql b/csharp/ql/test/library-tests/controlflow/graph/ExitElement.ql index 0a3b9791446..2fd23f74809 100644 --- a/csharp/ql/test/library-tests/controlflow/graph/ExitElement.ql +++ b/csharp/ql/test/library-tests/controlflow/graph/ExitElement.ql @@ -1,6 +1,7 @@ import csharp import ControlFlow::Internal private import semmle.code.csharp.controlflow.Completion +import Common -from ControlFlowElement cfe, Completion c +from SourceControlFlowElement cfe, Completion c select cfe, last(cfe, c), c diff --git a/csharp/ql/test/library-tests/controlflow/graph/ExitMethods.cs b/csharp/ql/test/library-tests/controlflow/graph/ExitMethods.cs index eb991a8c7e9..824ec9022d0 100644 --- a/csharp/ql/test/library-tests/controlflow/graph/ExitMethods.cs +++ b/csharp/ql/test/library-tests/controlflow/graph/ExitMethods.cs @@ -1,5 +1,6 @@ using System; using System.Linq; +using Microsoft.VisualStudio.TestTools.UnitTesting; class ExitMethods { @@ -68,6 +69,19 @@ class ExitMethods Environment.Exit(0); } + void ExitInTry() + { + try + { + Exit(); + } + finally + { + // dead + System.Console.WriteLine(""); + } + } + void ApplicationExit() { System.Windows.Forms.Application.Exit(); @@ -82,12 +96,26 @@ class ExitMethods { return s.Contains('-') ? 0 : 1; } -} -namespace System.Windows.Forms -{ - public class Application + public void FailingAssertion() { - public static void Exit() { } + Assert.IsTrue(false); + var x = 0; // dead + } + + public void FailingAssertion2() + { + FailingAssertion(); + var x = 0; // dead + } + + void AssertFalse(bool b) => Assert.IsFalse(b); + + public void FailingAssertion3() + { + AssertFalse(true); + var x = 0; // dead } } + +// semmle-extractor-options: ${testdir}/../../../resources/stubs/System.Windows.cs ${testdir}/../../../resources/stubs/Microsoft.VisualStudio.TestTools.UnitTesting.cs diff --git a/csharp/ql/test/library-tests/controlflow/graph/NodeGraph.expected b/csharp/ql/test/library-tests/controlflow/graph/NodeGraph.expected index aa7f5cfbcf8..66c8d0bb675 100644 --- a/csharp/ql/test/library-tests/controlflow/graph/NodeGraph.expected +++ b/csharp/ql/test/library-tests/controlflow/graph/NodeGraph.expected @@ -728,104 +728,128 @@ | Conditions.cs:109:22:109:23 | "" | Conditions.cs:109:17:109:23 | ... + ... | semmle.label | successor | | Conditions.cs:110:9:110:17 | return ...; | Conditions.cs:102:12:102:13 | exit M8 | semmle.label | return | | Conditions.cs:110:16:110:16 | access to local variable x | Conditions.cs:110:9:110:17 | return ...; | semmle.label | successor | -| ExitMethods.cs:6:10:6:11 | enter M1 | ExitMethods.cs:7:5:10:5 | {...} | semmle.label | successor | -| ExitMethods.cs:7:5:10:5 | {...} | ExitMethods.cs:8:9:8:25 | ...; | semmle.label | successor | -| ExitMethods.cs:8:9:8:24 | call to method ErrorMaybe | ExitMethods.cs:9:9:9:15 | return ...; | semmle.label | successor | -| ExitMethods.cs:8:9:8:25 | ...; | ExitMethods.cs:8:20:8:23 | true | semmle.label | successor | -| ExitMethods.cs:8:20:8:23 | true | ExitMethods.cs:8:9:8:24 | call to method ErrorMaybe | semmle.label | successor | -| ExitMethods.cs:9:9:9:15 | return ...; | ExitMethods.cs:6:10:6:11 | exit M1 | semmle.label | return | -| ExitMethods.cs:12:10:12:11 | enter M2 | ExitMethods.cs:13:5:16:5 | {...} | semmle.label | successor | -| ExitMethods.cs:13:5:16:5 | {...} | ExitMethods.cs:14:9:14:26 | ...; | semmle.label | successor | -| ExitMethods.cs:14:9:14:25 | call to method ErrorMaybe | ExitMethods.cs:15:9:15:15 | return ...; | semmle.label | successor | -| ExitMethods.cs:14:9:14:26 | ...; | ExitMethods.cs:14:20:14:24 | false | semmle.label | successor | -| ExitMethods.cs:14:20:14:24 | false | ExitMethods.cs:14:9:14:25 | call to method ErrorMaybe | semmle.label | successor | -| ExitMethods.cs:15:9:15:15 | return ...; | ExitMethods.cs:12:10:12:11 | exit M2 | semmle.label | return | -| ExitMethods.cs:18:10:18:11 | enter M3 | ExitMethods.cs:19:5:22:5 | {...} | semmle.label | successor | -| ExitMethods.cs:19:5:22:5 | {...} | ExitMethods.cs:20:9:20:26 | ...; | semmle.label | successor | -| ExitMethods.cs:20:9:20:25 | call to method ErrorAlways | ExitMethods.cs:18:10:18:11 | exit M3 | semmle.label | exception(ArgumentException) | -| ExitMethods.cs:20:9:20:25 | call to method ErrorAlways | ExitMethods.cs:18:10:18:11 | exit M3 | semmle.label | exception(Exception) | -| ExitMethods.cs:20:9:20:26 | ...; | ExitMethods.cs:20:21:20:24 | true | semmle.label | successor | -| ExitMethods.cs:20:21:20:24 | true | ExitMethods.cs:20:9:20:25 | call to method ErrorAlways | semmle.label | successor | -| ExitMethods.cs:24:10:24:11 | enter M4 | ExitMethods.cs:25:5:28:5 | {...} | semmle.label | successor | -| ExitMethods.cs:25:5:28:5 | {...} | ExitMethods.cs:26:9:26:15 | ...; | semmle.label | successor | -| ExitMethods.cs:26:9:26:14 | call to method Exit | ExitMethods.cs:24:10:24:11 | exit M4 | semmle.label | return | -| ExitMethods.cs:26:9:26:14 | this access | ExitMethods.cs:26:9:26:14 | call to method Exit | semmle.label | successor | -| ExitMethods.cs:26:9:26:15 | ...; | ExitMethods.cs:26:9:26:14 | this access | semmle.label | successor | -| ExitMethods.cs:30:10:30:11 | enter M5 | ExitMethods.cs:31:5:34:5 | {...} | semmle.label | successor | -| ExitMethods.cs:31:5:34:5 | {...} | ExitMethods.cs:32:9:32:26 | ...; | semmle.label | successor | -| ExitMethods.cs:32:9:32:25 | call to method ApplicationExit | ExitMethods.cs:30:10:30:11 | exit M5 | semmle.label | return | -| ExitMethods.cs:32:9:32:25 | this access | ExitMethods.cs:32:9:32:25 | call to method ApplicationExit | semmle.label | successor | -| ExitMethods.cs:32:9:32:26 | ...; | ExitMethods.cs:32:9:32:25 | this access | semmle.label | successor | -| ExitMethods.cs:36:10:36:11 | enter M6 | ExitMethods.cs:37:5:50:5 | {...} | semmle.label | successor | -| ExitMethods.cs:37:5:50:5 | {...} | ExitMethods.cs:38:9:49:9 | try {...} ... | semmle.label | successor | -| ExitMethods.cs:38:9:49:9 | try {...} ... | ExitMethods.cs:39:9:41:9 | {...} | semmle.label | successor | -| ExitMethods.cs:39:9:41:9 | {...} | ExitMethods.cs:40:13:40:31 | ...; | semmle.label | successor | -| ExitMethods.cs:40:13:40:30 | call to method ErrorAlways | ExitMethods.cs:42:9:45:9 | [exception: ArgumentException] catch (...) {...} | semmle.label | exception(ArgumentException) | -| ExitMethods.cs:40:13:40:30 | call to method ErrorAlways | ExitMethods.cs:42:9:45:9 | [exception: Exception] catch (...) {...} | semmle.label | exception(Exception) | -| ExitMethods.cs:40:13:40:31 | ...; | ExitMethods.cs:40:25:40:29 | false | semmle.label | successor | -| ExitMethods.cs:40:25:40:29 | false | ExitMethods.cs:40:13:40:30 | call to method ErrorAlways | semmle.label | successor | -| ExitMethods.cs:42:9:45:9 | [exception: ArgumentException] catch (...) {...} | ExitMethods.cs:43:9:45:9 | {...} | semmle.label | match | -| ExitMethods.cs:42:9:45:9 | [exception: Exception] catch (...) {...} | ExitMethods.cs:43:9:45:9 | {...} | semmle.label | match | -| ExitMethods.cs:42:9:45:9 | [exception: Exception] catch (...) {...} | ExitMethods.cs:46:9:49:9 | [exception: Exception] catch (...) {...} | semmle.label | no-match | -| ExitMethods.cs:43:9:45:9 | {...} | ExitMethods.cs:44:13:44:19 | return ...; | semmle.label | successor | -| ExitMethods.cs:44:13:44:19 | return ...; | ExitMethods.cs:36:10:36:11 | exit M6 | semmle.label | return | -| ExitMethods.cs:46:9:49:9 | [exception: Exception] catch (...) {...} | ExitMethods.cs:47:9:49:9 | {...} | semmle.label | match | -| ExitMethods.cs:47:9:49:9 | {...} | ExitMethods.cs:48:13:48:19 | return ...; | semmle.label | successor | -| ExitMethods.cs:48:13:48:19 | return ...; | ExitMethods.cs:36:10:36:11 | exit M6 | semmle.label | return | -| ExitMethods.cs:52:17:52:26 | enter ErrorMaybe | ExitMethods.cs:53:5:56:5 | {...} | semmle.label | successor | -| ExitMethods.cs:53:5:56:5 | {...} | ExitMethods.cs:54:9:55:34 | if (...) ... | semmle.label | successor | -| ExitMethods.cs:54:9:55:34 | if (...) ... | ExitMethods.cs:54:13:54:13 | access to parameter b | semmle.label | successor | -| ExitMethods.cs:54:13:54:13 | access to parameter b | ExitMethods.cs:52:17:52:26 | exit ErrorMaybe | semmle.label | false | -| ExitMethods.cs:54:13:54:13 | access to parameter b | ExitMethods.cs:55:19:55:33 | object creation of type Exception | semmle.label | true | -| ExitMethods.cs:55:13:55:34 | throw ...; | ExitMethods.cs:52:17:52:26 | exit ErrorMaybe | semmle.label | exception(Exception) | -| ExitMethods.cs:55:19:55:33 | object creation of type Exception | ExitMethods.cs:55:13:55:34 | throw ...; | semmle.label | successor | -| ExitMethods.cs:58:17:58:27 | enter ErrorAlways | ExitMethods.cs:59:5:64:5 | {...} | semmle.label | successor | -| ExitMethods.cs:59:5:64:5 | {...} | ExitMethods.cs:60:9:63:45 | if (...) ... | semmle.label | successor | -| ExitMethods.cs:60:9:63:45 | if (...) ... | ExitMethods.cs:60:13:60:13 | access to parameter b | semmle.label | successor | -| ExitMethods.cs:60:13:60:13 | access to parameter b | ExitMethods.cs:61:19:61:33 | object creation of type Exception | semmle.label | true | -| ExitMethods.cs:60:13:60:13 | access to parameter b | ExitMethods.cs:63:41:63:43 | "b" | semmle.label | false | -| ExitMethods.cs:61:13:61:34 | throw ...; | ExitMethods.cs:58:17:58:27 | exit ErrorAlways | semmle.label | exception(Exception) | -| ExitMethods.cs:61:19:61:33 | object creation of type Exception | ExitMethods.cs:61:13:61:34 | throw ...; | semmle.label | successor | -| ExitMethods.cs:63:13:63:45 | throw ...; | ExitMethods.cs:58:17:58:27 | exit ErrorAlways | semmle.label | exception(ArgumentException) | -| ExitMethods.cs:63:19:63:44 | object creation of type ArgumentException | ExitMethods.cs:63:13:63:45 | throw ...; | semmle.label | successor | -| ExitMethods.cs:63:41:63:43 | "b" | ExitMethods.cs:63:19:63:44 | object creation of type ArgumentException | semmle.label | successor | -| ExitMethods.cs:66:10:66:13 | enter Exit | ExitMethods.cs:67:5:69:5 | {...} | semmle.label | successor | -| ExitMethods.cs:67:5:69:5 | {...} | ExitMethods.cs:68:9:68:28 | ...; | semmle.label | successor | -| ExitMethods.cs:68:9:68:27 | call to method Exit | ExitMethods.cs:66:10:66:13 | exit Exit | semmle.label | return | -| ExitMethods.cs:68:9:68:28 | ...; | ExitMethods.cs:68:26:68:26 | 0 | semmle.label | successor | -| ExitMethods.cs:68:26:68:26 | 0 | ExitMethods.cs:68:9:68:27 | call to method Exit | semmle.label | successor | -| ExitMethods.cs:71:10:71:24 | enter ApplicationExit | ExitMethods.cs:72:5:74:5 | {...} | semmle.label | successor | -| ExitMethods.cs:72:5:74:5 | {...} | ExitMethods.cs:73:9:73:48 | ...; | semmle.label | successor | -| ExitMethods.cs:73:9:73:47 | call to method Exit | ExitMethods.cs:71:10:71:24 | exit ApplicationExit | semmle.label | return | -| ExitMethods.cs:73:9:73:48 | ...; | ExitMethods.cs:73:9:73:47 | call to method Exit | semmle.label | successor | -| ExitMethods.cs:76:13:76:21 | enter ThrowExpr | ExitMethods.cs:77:5:79:5 | {...} | semmle.label | successor | -| ExitMethods.cs:77:5:79:5 | {...} | ExitMethods.cs:78:16:78:76 | ... ? ... : ... | semmle.label | successor | -| ExitMethods.cs:78:9:78:77 | return ...; | ExitMethods.cs:76:13:76:21 | exit ThrowExpr | semmle.label | return | -| ExitMethods.cs:78:16:78:20 | access to parameter input | ExitMethods.cs:78:25:78:25 | 0 | semmle.label | successor | -| ExitMethods.cs:78:16:78:25 | ... != ... | ExitMethods.cs:78:29:78:29 | 1 | semmle.label | true | -| ExitMethods.cs:78:16:78:25 | ... != ... | ExitMethods.cs:78:69:78:75 | "input" | semmle.label | false | -| ExitMethods.cs:78:16:78:76 | ... ? ... : ... | ExitMethods.cs:78:16:78:20 | access to parameter input | semmle.label | successor | -| ExitMethods.cs:78:25:78:25 | 0 | ExitMethods.cs:78:25:78:25 | (...) ... | semmle.label | successor | -| ExitMethods.cs:78:25:78:25 | (...) ... | ExitMethods.cs:78:16:78:25 | ... != ... | semmle.label | successor | -| ExitMethods.cs:78:29:78:29 | 1 | ExitMethods.cs:78:29:78:29 | (...) ... | semmle.label | successor | -| ExitMethods.cs:78:29:78:29 | (...) ... | ExitMethods.cs:78:33:78:37 | access to parameter input | semmle.label | successor | -| ExitMethods.cs:78:29:78:37 | ... / ... | ExitMethods.cs:78:9:78:77 | return ...; | semmle.label | successor | -| ExitMethods.cs:78:33:78:37 | access to parameter input | ExitMethods.cs:78:29:78:37 | ... / ... | semmle.label | successor | -| ExitMethods.cs:78:41:78:76 | throw ... | ExitMethods.cs:76:13:76:21 | exit ThrowExpr | semmle.label | exception(ArgumentException) | -| ExitMethods.cs:78:47:78:76 | object creation of type ArgumentException | ExitMethods.cs:78:41:78:76 | throw ... | semmle.label | successor | -| ExitMethods.cs:78:69:78:75 | "input" | ExitMethods.cs:78:47:78:76 | object creation of type ArgumentException | semmle.label | successor | -| ExitMethods.cs:81:16:81:34 | enter ExtensionMethodCall | ExitMethods.cs:82:5:84:5 | {...} | semmle.label | successor | -| ExitMethods.cs:82:5:84:5 | {...} | ExitMethods.cs:83:16:83:38 | ... ? ... : ... | semmle.label | successor | -| ExitMethods.cs:83:9:83:39 | return ...; | ExitMethods.cs:81:16:81:34 | exit ExtensionMethodCall | semmle.label | return | -| ExitMethods.cs:83:16:83:16 | access to parameter s | ExitMethods.cs:83:27:83:29 | - | semmle.label | successor | -| ExitMethods.cs:83:16:83:30 | call to method Contains | ExitMethods.cs:83:34:83:34 | 0 | semmle.label | true | -| ExitMethods.cs:83:16:83:30 | call to method Contains | ExitMethods.cs:83:38:83:38 | 1 | semmle.label | false | -| ExitMethods.cs:83:16:83:38 | ... ? ... : ... | ExitMethods.cs:83:16:83:16 | access to parameter s | semmle.label | successor | -| ExitMethods.cs:83:27:83:29 | - | ExitMethods.cs:83:16:83:30 | call to method Contains | semmle.label | successor | -| ExitMethods.cs:83:34:83:34 | 0 | ExitMethods.cs:83:9:83:39 | return ...; | semmle.label | successor | -| ExitMethods.cs:83:38:83:38 | 1 | ExitMethods.cs:83:9:83:39 | return ...; | semmle.label | successor | -| ExitMethods.cs:91:28:91:31 | enter Exit | ExitMethods.cs:91:35:91:37 | {...} | semmle.label | successor | -| ExitMethods.cs:91:35:91:37 | {...} | ExitMethods.cs:91:28:91:31 | exit Exit | semmle.label | successor | +| ExitMethods.cs:7:10:7:11 | enter M1 | ExitMethods.cs:8:5:11:5 | {...} | semmle.label | successor | +| ExitMethods.cs:8:5:11:5 | {...} | ExitMethods.cs:9:9:9:25 | ...; | semmle.label | successor | +| ExitMethods.cs:9:9:9:24 | call to method ErrorMaybe | ExitMethods.cs:10:9:10:15 | return ...; | semmle.label | successor | +| ExitMethods.cs:9:9:9:25 | ...; | ExitMethods.cs:9:20:9:23 | true | semmle.label | successor | +| ExitMethods.cs:9:20:9:23 | true | ExitMethods.cs:9:9:9:24 | call to method ErrorMaybe | semmle.label | successor | +| ExitMethods.cs:10:9:10:15 | return ...; | ExitMethods.cs:7:10:7:11 | exit M1 | semmle.label | return | +| ExitMethods.cs:13:10:13:11 | enter M2 | ExitMethods.cs:14:5:17:5 | {...} | semmle.label | successor | +| ExitMethods.cs:14:5:17:5 | {...} | ExitMethods.cs:15:9:15:26 | ...; | semmle.label | successor | +| ExitMethods.cs:15:9:15:25 | call to method ErrorMaybe | ExitMethods.cs:16:9:16:15 | return ...; | semmle.label | successor | +| ExitMethods.cs:15:9:15:26 | ...; | ExitMethods.cs:15:20:15:24 | false | semmle.label | successor | +| ExitMethods.cs:15:20:15:24 | false | ExitMethods.cs:15:9:15:25 | call to method ErrorMaybe | semmle.label | successor | +| ExitMethods.cs:16:9:16:15 | return ...; | ExitMethods.cs:13:10:13:11 | exit M2 | semmle.label | return | +| ExitMethods.cs:19:10:19:11 | enter M3 | ExitMethods.cs:20:5:23:5 | {...} | semmle.label | successor | +| ExitMethods.cs:20:5:23:5 | {...} | ExitMethods.cs:21:9:21:26 | ...; | semmle.label | successor | +| ExitMethods.cs:21:9:21:25 | call to method ErrorAlways | ExitMethods.cs:19:10:19:11 | exit M3 | semmle.label | exception(ArgumentException) | +| ExitMethods.cs:21:9:21:25 | call to method ErrorAlways | ExitMethods.cs:19:10:19:11 | exit M3 | semmle.label | exception(Exception) | +| ExitMethods.cs:21:9:21:26 | ...; | ExitMethods.cs:21:21:21:24 | true | semmle.label | successor | +| ExitMethods.cs:21:21:21:24 | true | ExitMethods.cs:21:9:21:25 | call to method ErrorAlways | semmle.label | successor | +| ExitMethods.cs:25:10:25:11 | enter M4 | ExitMethods.cs:26:5:29:5 | {...} | semmle.label | successor | +| ExitMethods.cs:26:5:29:5 | {...} | ExitMethods.cs:27:9:27:15 | ...; | semmle.label | successor | +| ExitMethods.cs:27:9:27:14 | call to method Exit | ExitMethods.cs:25:10:25:11 | exit M4 | semmle.label | exit | +| ExitMethods.cs:27:9:27:14 | this access | ExitMethods.cs:27:9:27:14 | call to method Exit | semmle.label | successor | +| ExitMethods.cs:27:9:27:15 | ...; | ExitMethods.cs:27:9:27:14 | this access | semmle.label | successor | +| ExitMethods.cs:31:10:31:11 | enter M5 | ExitMethods.cs:32:5:35:5 | {...} | semmle.label | successor | +| ExitMethods.cs:32:5:35:5 | {...} | ExitMethods.cs:33:9:33:26 | ...; | semmle.label | successor | +| ExitMethods.cs:33:9:33:25 | call to method ApplicationExit | ExitMethods.cs:31:10:31:11 | exit M5 | semmle.label | exit | +| ExitMethods.cs:33:9:33:25 | this access | ExitMethods.cs:33:9:33:25 | call to method ApplicationExit | semmle.label | successor | +| ExitMethods.cs:33:9:33:26 | ...; | ExitMethods.cs:33:9:33:25 | this access | semmle.label | successor | +| ExitMethods.cs:37:10:37:11 | enter M6 | ExitMethods.cs:38:5:51:5 | {...} | semmle.label | successor | +| ExitMethods.cs:38:5:51:5 | {...} | ExitMethods.cs:39:9:50:9 | try {...} ... | semmle.label | successor | +| ExitMethods.cs:39:9:50:9 | try {...} ... | ExitMethods.cs:40:9:42:9 | {...} | semmle.label | successor | +| ExitMethods.cs:40:9:42:9 | {...} | ExitMethods.cs:41:13:41:31 | ...; | semmle.label | successor | +| ExitMethods.cs:41:13:41:30 | call to method ErrorAlways | ExitMethods.cs:43:9:46:9 | [exception: ArgumentException] catch (...) {...} | semmle.label | exception(ArgumentException) | +| ExitMethods.cs:41:13:41:30 | call to method ErrorAlways | ExitMethods.cs:43:9:46:9 | [exception: Exception] catch (...) {...} | semmle.label | exception(Exception) | +| ExitMethods.cs:41:13:41:31 | ...; | ExitMethods.cs:41:25:41:29 | false | semmle.label | successor | +| ExitMethods.cs:41:25:41:29 | false | ExitMethods.cs:41:13:41:30 | call to method ErrorAlways | semmle.label | successor | +| ExitMethods.cs:43:9:46:9 | [exception: ArgumentException] catch (...) {...} | ExitMethods.cs:44:9:46:9 | {...} | semmle.label | match | +| ExitMethods.cs:43:9:46:9 | [exception: Exception] catch (...) {...} | ExitMethods.cs:44:9:46:9 | {...} | semmle.label | match | +| ExitMethods.cs:43:9:46:9 | [exception: Exception] catch (...) {...} | ExitMethods.cs:47:9:50:9 | [exception: Exception] catch (...) {...} | semmle.label | no-match | +| ExitMethods.cs:44:9:46:9 | {...} | ExitMethods.cs:45:13:45:19 | return ...; | semmle.label | successor | +| ExitMethods.cs:45:13:45:19 | return ...; | ExitMethods.cs:37:10:37:11 | exit M6 | semmle.label | return | +| ExitMethods.cs:47:9:50:9 | [exception: Exception] catch (...) {...} | ExitMethods.cs:48:9:50:9 | {...} | semmle.label | match | +| ExitMethods.cs:48:9:50:9 | {...} | ExitMethods.cs:49:13:49:19 | return ...; | semmle.label | successor | +| ExitMethods.cs:49:13:49:19 | return ...; | ExitMethods.cs:37:10:37:11 | exit M6 | semmle.label | return | +| ExitMethods.cs:53:17:53:26 | enter ErrorMaybe | ExitMethods.cs:54:5:57:5 | {...} | semmle.label | successor | +| ExitMethods.cs:54:5:57:5 | {...} | ExitMethods.cs:55:9:56:34 | if (...) ... | semmle.label | successor | +| ExitMethods.cs:55:9:56:34 | if (...) ... | ExitMethods.cs:55:13:55:13 | access to parameter b | semmle.label | successor | +| ExitMethods.cs:55:13:55:13 | access to parameter b | ExitMethods.cs:53:17:53:26 | exit ErrorMaybe | semmle.label | false | +| ExitMethods.cs:55:13:55:13 | access to parameter b | ExitMethods.cs:56:19:56:33 | object creation of type Exception | semmle.label | true | +| ExitMethods.cs:56:13:56:34 | throw ...; | ExitMethods.cs:53:17:53:26 | exit ErrorMaybe | semmle.label | exception(Exception) | +| ExitMethods.cs:56:19:56:33 | object creation of type Exception | ExitMethods.cs:56:13:56:34 | throw ...; | semmle.label | successor | +| ExitMethods.cs:59:17:59:27 | enter ErrorAlways | ExitMethods.cs:60:5:65:5 | {...} | semmle.label | successor | +| ExitMethods.cs:60:5:65:5 | {...} | ExitMethods.cs:61:9:64:45 | if (...) ... | semmle.label | successor | +| ExitMethods.cs:61:9:64:45 | if (...) ... | ExitMethods.cs:61:13:61:13 | access to parameter b | semmle.label | successor | +| ExitMethods.cs:61:13:61:13 | access to parameter b | ExitMethods.cs:62:19:62:33 | object creation of type Exception | semmle.label | true | +| ExitMethods.cs:61:13:61:13 | access to parameter b | ExitMethods.cs:64:41:64:43 | "b" | semmle.label | false | +| ExitMethods.cs:62:13:62:34 | throw ...; | ExitMethods.cs:59:17:59:27 | exit ErrorAlways | semmle.label | exception(Exception) | +| ExitMethods.cs:62:19:62:33 | object creation of type Exception | ExitMethods.cs:62:13:62:34 | throw ...; | semmle.label | successor | +| ExitMethods.cs:64:13:64:45 | throw ...; | ExitMethods.cs:59:17:59:27 | exit ErrorAlways | semmle.label | exception(ArgumentException) | +| ExitMethods.cs:64:19:64:44 | object creation of type ArgumentException | ExitMethods.cs:64:13:64:45 | throw ...; | semmle.label | successor | +| ExitMethods.cs:64:41:64:43 | "b" | ExitMethods.cs:64:19:64:44 | object creation of type ArgumentException | semmle.label | successor | +| ExitMethods.cs:67:10:67:13 | enter Exit | ExitMethods.cs:68:5:70:5 | {...} | semmle.label | successor | +| ExitMethods.cs:68:5:70:5 | {...} | ExitMethods.cs:69:9:69:28 | ...; | semmle.label | successor | +| ExitMethods.cs:69:9:69:27 | call to method Exit | ExitMethods.cs:67:10:67:13 | exit Exit | semmle.label | exit | +| ExitMethods.cs:69:9:69:28 | ...; | ExitMethods.cs:69:26:69:26 | 0 | semmle.label | successor | +| ExitMethods.cs:69:26:69:26 | 0 | ExitMethods.cs:69:9:69:27 | call to method Exit | semmle.label | successor | +| ExitMethods.cs:72:10:72:18 | enter ExitInTry | ExitMethods.cs:73:5:83:5 | {...} | semmle.label | successor | +| ExitMethods.cs:73:5:83:5 | {...} | ExitMethods.cs:74:9:82:9 | try {...} ... | semmle.label | successor | +| ExitMethods.cs:74:9:82:9 | try {...} ... | ExitMethods.cs:75:9:77:9 | {...} | semmle.label | successor | +| ExitMethods.cs:75:9:77:9 | {...} | ExitMethods.cs:76:13:76:19 | ...; | semmle.label | successor | +| ExitMethods.cs:76:13:76:18 | call to method Exit | ExitMethods.cs:72:10:72:18 | exit ExitInTry | semmle.label | exit | +| ExitMethods.cs:76:13:76:18 | this access | ExitMethods.cs:76:13:76:18 | call to method Exit | semmle.label | successor | +| ExitMethods.cs:76:13:76:19 | ...; | ExitMethods.cs:76:13:76:18 | this access | semmle.label | successor | +| ExitMethods.cs:85:10:85:24 | enter ApplicationExit | ExitMethods.cs:86:5:88:5 | {...} | semmle.label | successor | +| ExitMethods.cs:86:5:88:5 | {...} | ExitMethods.cs:87:9:87:48 | ...; | semmle.label | successor | +| ExitMethods.cs:87:9:87:47 | call to method Exit | ExitMethods.cs:85:10:85:24 | exit ApplicationExit | semmle.label | exit | +| ExitMethods.cs:87:9:87:48 | ...; | ExitMethods.cs:87:9:87:47 | call to method Exit | semmle.label | successor | +| ExitMethods.cs:90:13:90:21 | enter ThrowExpr | ExitMethods.cs:91:5:93:5 | {...} | semmle.label | successor | +| ExitMethods.cs:91:5:93:5 | {...} | ExitMethods.cs:92:16:92:76 | ... ? ... : ... | semmle.label | successor | +| ExitMethods.cs:92:9:92:77 | return ...; | ExitMethods.cs:90:13:90:21 | exit ThrowExpr | semmle.label | return | +| ExitMethods.cs:92:16:92:20 | access to parameter input | ExitMethods.cs:92:25:92:25 | 0 | semmle.label | successor | +| ExitMethods.cs:92:16:92:25 | ... != ... | ExitMethods.cs:92:29:92:29 | 1 | semmle.label | true | +| ExitMethods.cs:92:16:92:25 | ... != ... | ExitMethods.cs:92:69:92:75 | "input" | semmle.label | false | +| ExitMethods.cs:92:16:92:76 | ... ? ... : ... | ExitMethods.cs:92:16:92:20 | access to parameter input | semmle.label | successor | +| ExitMethods.cs:92:25:92:25 | 0 | ExitMethods.cs:92:25:92:25 | (...) ... | semmle.label | successor | +| ExitMethods.cs:92:25:92:25 | (...) ... | ExitMethods.cs:92:16:92:25 | ... != ... | semmle.label | successor | +| ExitMethods.cs:92:29:92:29 | 1 | ExitMethods.cs:92:29:92:29 | (...) ... | semmle.label | successor | +| ExitMethods.cs:92:29:92:29 | (...) ... | ExitMethods.cs:92:33:92:37 | access to parameter input | semmle.label | successor | +| ExitMethods.cs:92:29:92:37 | ... / ... | ExitMethods.cs:92:9:92:77 | return ...; | semmle.label | successor | +| ExitMethods.cs:92:33:92:37 | access to parameter input | ExitMethods.cs:92:29:92:37 | ... / ... | semmle.label | successor | +| ExitMethods.cs:92:41:92:76 | throw ... | ExitMethods.cs:90:13:90:21 | exit ThrowExpr | semmle.label | exception(ArgumentException) | +| ExitMethods.cs:92:47:92:76 | object creation of type ArgumentException | ExitMethods.cs:92:41:92:76 | throw ... | semmle.label | successor | +| ExitMethods.cs:92:69:92:75 | "input" | ExitMethods.cs:92:47:92:76 | object creation of type ArgumentException | semmle.label | successor | +| ExitMethods.cs:95:16:95:34 | enter ExtensionMethodCall | ExitMethods.cs:96:5:98:5 | {...} | semmle.label | successor | +| ExitMethods.cs:96:5:98:5 | {...} | ExitMethods.cs:97:16:97:38 | ... ? ... : ... | semmle.label | successor | +| ExitMethods.cs:97:9:97:39 | return ...; | ExitMethods.cs:95:16:95:34 | exit ExtensionMethodCall | semmle.label | return | +| ExitMethods.cs:97:16:97:16 | access to parameter s | ExitMethods.cs:97:27:97:29 | - | semmle.label | successor | +| ExitMethods.cs:97:16:97:30 | call to method Contains | ExitMethods.cs:97:34:97:34 | 0 | semmle.label | true | +| ExitMethods.cs:97:16:97:30 | call to method Contains | ExitMethods.cs:97:38:97:38 | 1 | semmle.label | false | +| ExitMethods.cs:97:16:97:38 | ... ? ... : ... | ExitMethods.cs:97:16:97:16 | access to parameter s | semmle.label | successor | +| ExitMethods.cs:97:27:97:29 | - | ExitMethods.cs:97:16:97:30 | call to method Contains | semmle.label | successor | +| ExitMethods.cs:97:34:97:34 | 0 | ExitMethods.cs:97:9:97:39 | return ...; | semmle.label | successor | +| ExitMethods.cs:97:38:97:38 | 1 | ExitMethods.cs:97:9:97:39 | return ...; | semmle.label | successor | +| ExitMethods.cs:100:17:100:32 | enter FailingAssertion | ExitMethods.cs:101:5:104:5 | {...} | semmle.label | successor | +| ExitMethods.cs:101:5:104:5 | {...} | ExitMethods.cs:102:9:102:29 | ...; | semmle.label | successor | +| ExitMethods.cs:102:9:102:28 | call to method IsTrue | ExitMethods.cs:100:17:100:32 | exit FailingAssertion | semmle.label | exception(AssertFailedException) | +| ExitMethods.cs:102:9:102:29 | ...; | ExitMethods.cs:102:23:102:27 | false | semmle.label | successor | +| ExitMethods.cs:102:23:102:27 | false | ExitMethods.cs:102:9:102:28 | call to method IsTrue | semmle.label | successor | +| ExitMethods.cs:106:17:106:33 | enter FailingAssertion2 | ExitMethods.cs:107:5:110:5 | {...} | semmle.label | successor | +| ExitMethods.cs:107:5:110:5 | {...} | ExitMethods.cs:108:9:108:27 | ...; | semmle.label | successor | +| ExitMethods.cs:108:9:108:26 | call to method FailingAssertion | ExitMethods.cs:106:17:106:33 | exit FailingAssertion2 | semmle.label | exception(AssertFailedException) | +| ExitMethods.cs:108:9:108:26 | this access | ExitMethods.cs:108:9:108:26 | call to method FailingAssertion | semmle.label | successor | +| ExitMethods.cs:108:9:108:27 | ...; | ExitMethods.cs:108:9:108:26 | this access | semmle.label | successor | +| ExitMethods.cs:112:10:112:20 | enter AssertFalse | ExitMethods.cs:112:48:112:48 | access to parameter b | semmle.label | successor | +| ExitMethods.cs:112:33:112:49 | call to method IsFalse | ExitMethods.cs:112:10:112:20 | exit AssertFalse | semmle.label | successor | +| ExitMethods.cs:112:48:112:48 | access to parameter b | ExitMethods.cs:112:33:112:49 | call to method IsFalse | semmle.label | successor | +| ExitMethods.cs:114:17:114:33 | enter FailingAssertion3 | ExitMethods.cs:115:5:118:5 | {...} | semmle.label | successor | +| ExitMethods.cs:115:5:118:5 | {...} | ExitMethods.cs:116:9:116:26 | ...; | semmle.label | successor | +| ExitMethods.cs:116:9:116:25 | call to method AssertFalse | ExitMethods.cs:114:17:114:33 | exit FailingAssertion3 | semmle.label | exception(AssertFailedException) | +| ExitMethods.cs:116:9:116:25 | this access | ExitMethods.cs:116:21:116:24 | true | semmle.label | successor | +| ExitMethods.cs:116:9:116:26 | ...; | ExitMethods.cs:116:9:116:25 | this access | semmle.label | successor | +| ExitMethods.cs:116:21:116:24 | true | ExitMethods.cs:116:9:116:25 | call to method AssertFalse | semmle.label | successor | | Extensions.cs:5:23:5:29 | enter ToInt32 | Extensions.cs:6:5:8:5 | {...} | semmle.label | successor | | Extensions.cs:6:5:8:5 | {...} | Extensions.cs:7:28:7:28 | access to parameter s | semmle.label | successor | | Extensions.cs:7:9:7:30 | return ...; | Extensions.cs:5:23:5:29 | exit ToInt32 | semmle.label | return | diff --git a/csharp/ql/test/library-tests/controlflow/graph/NodeGraph.ql b/csharp/ql/test/library-tests/controlflow/graph/NodeGraph.ql index 82ce415accd..62e6cef9cab 100644 --- a/csharp/ql/test/library-tests/controlflow/graph/NodeGraph.ql +++ b/csharp/ql/test/library-tests/controlflow/graph/NodeGraph.ql @@ -1,6 +1,7 @@ import csharp +import Common -query predicate edges(ControlFlow::Node node, ControlFlow::Node successor, string attr, string val) { +query predicate edges(SourceControlFlowNode node, SourceControlFlowNode successor, string attr, string val) { exists(ControlFlow::SuccessorType t | successor = node.getASuccessorByType(t) | attr = "semmle.label" and diff --git a/csharp/ql/test/library-tests/filters/ClassifyFiles/VisualStudioTest.cs b/csharp/ql/test/library-tests/filters/ClassifyFiles/VisualStudioTest.cs index 64b8e9bbec9..4a65b690363 100644 --- a/csharp/ql/test/library-tests/filters/ClassifyFiles/VisualStudioTest.cs +++ b/csharp/ql/test/library-tests/filters/ClassifyFiles/VisualStudioTest.cs @@ -1,19 +1,6 @@ using System; using System.Collections.Generic; -namespace Microsoft.VisualStudio.TestTools.UnitTesting -{ - class TestClassAttribute : Attribute - { - public TestClassAttribute() { } - } - - class TestMethodAttribute : Attribute - { - public TestMethodAttribute() { } - } -} - namespace VisualStudioTests { class TestMethodAttribute : Attribute { } // fake @@ -37,3 +24,5 @@ namespace VisualStudioTests } } } + +// semmle-extractor-options: ${testdir}/../../../resources/stubs/Microsoft.VisualStudio.TestTools.UnitTesting.cs diff --git a/csharp/ql/test/library-tests/frameworks/test/Test.expected b/csharp/ql/test/library-tests/frameworks/test/Test.expected index 94a149b06d7..cda5cc1e7af 100644 --- a/csharp/ql/test/library-tests/frameworks/test/Test.expected +++ b/csharp/ql/test/library-tests/frameworks/test/Test.expected @@ -1,8 +1,8 @@ -| VisualStudio.cs:22:11:22:21 | MyTestSuite | TestClass | VSTestClass | -| VisualStudio.cs:25:21:25:25 | Test1 | TestMethod | InstanceCallable | -| VisualStudio.cs:25:21:25:25 | Test1 | TestMethod | VSTestMethod | -| VisualStudio.cs:30:21:30:25 | Test2 | TestMethod | InstanceCallable | -| VisualStudio.cs:30:21:30:25 | Test2 | TestMethod | VSTestMethod | +| VisualStudio.cs:9:11:9:21 | MyTestSuite | TestClass | VSTestClass | +| VisualStudio.cs:12:21:12:25 | Test1 | TestMethod | InstanceCallable | +| VisualStudio.cs:12:21:12:25 | Test1 | TestMethod | VSTestMethod | +| VisualStudio.cs:17:21:17:25 | Test2 | TestMethod | InstanceCallable | +| VisualStudio.cs:17:21:17:25 | Test2 | TestMethod | VSTestMethod | | XUnit.cs:22:11:22:21 | MyTestSuite | TestClass | XUnitTestClass | | XUnit.cs:25:21:25:25 | Test1 | TestMethod | InstanceCallable | | XUnit.cs:25:21:25:25 | Test1 | TestMethod | XUnitTestMethod | diff --git a/csharp/ql/test/library-tests/frameworks/test/VisualStudio.cs b/csharp/ql/test/library-tests/frameworks/test/VisualStudio.cs index 64b8e9bbec9..4a65b690363 100644 --- a/csharp/ql/test/library-tests/frameworks/test/VisualStudio.cs +++ b/csharp/ql/test/library-tests/frameworks/test/VisualStudio.cs @@ -1,19 +1,6 @@ using System; using System.Collections.Generic; -namespace Microsoft.VisualStudio.TestTools.UnitTesting -{ - class TestClassAttribute : Attribute - { - public TestClassAttribute() { } - } - - class TestMethodAttribute : Attribute - { - public TestMethodAttribute() { } - } -} - namespace VisualStudioTests { class TestMethodAttribute : Attribute { } // fake @@ -37,3 +24,5 @@ namespace VisualStudioTests } } } + +// semmle-extractor-options: ${testdir}/../../../resources/stubs/Microsoft.VisualStudio.TestTools.UnitTesting.cs diff --git a/csharp/ql/test/query-tests/Dead Code/Tests/deadcode.cs b/csharp/ql/test/query-tests/Dead Code/Tests/deadcode.cs index edf3a063980..c9297332171 100644 --- a/csharp/ql/test/query-tests/Dead Code/Tests/deadcode.cs +++ b/csharp/ql/test/query-tests/Dead Code/Tests/deadcode.cs @@ -86,19 +86,6 @@ public struct S class C { } // not dead } -namespace Microsoft.VisualStudio.TestTools.UnitTesting -{ - class TestClassAttribute : Attribute - { - public TestClassAttribute() { } - } - - class TestInitializeAttribute : Attribute - { - public TestInitializeAttribute() { } - } -} - [Microsoft.VisualStudio.TestTools.UnitTesting.TestClass] public class VisualStudioTests { @@ -106,4 +93,4 @@ public class VisualStudioTests public void Setup() { } // not dead } -// semmle-extractor-options: /r:System.Dynamic.Runtime.dll /r:System.Linq.Expressions.dll +// semmle-extractor-options: /r:System.Dynamic.Runtime.dll /r:System.Linq.Expressions.dll ${testdir}/../../../resources/stubs/Microsoft.VisualStudio.TestTools.UnitTesting.cs diff --git a/csharp/ql/test/query-tests/Nullness/Assert.cs b/csharp/ql/test/query-tests/Nullness/Assert.cs index 7c50270af2a..d325d852d94 100644 --- a/csharp/ql/test/query-tests/Nullness/Assert.cs +++ b/csharp/ql/test/query-tests/Nullness/Assert.cs @@ -2,17 +2,6 @@ using System; using System.Diagnostics; using Microsoft.VisualStudio.TestTools.UnitTesting; -namespace Microsoft.VisualStudio.TestTools.UnitTesting -{ - public static class Assert - { - public static void IsNull(object o) { } - public static void IsNotNull(object o) { } - public static void IsTrue(bool b) { } - public static void IsFalse(bool b) { } - } -} - class AssertTests { void Fn() @@ -40,3 +29,5 @@ class AssertTests Console.WriteLine(s.Length); } } + +// semmle-extractor-options: ${testdir}/../../resources/stubs/Microsoft.VisualStudio.TestTools.UnitTesting.cs diff --git a/csharp/ql/test/query-tests/Nullness/NullAlways.expected b/csharp/ql/test/query-tests/Nullness/NullAlways.expected index 32240a37e4e..94476960cb2 100644 --- a/csharp/ql/test/query-tests/Nullness/NullAlways.expected +++ b/csharp/ql/test/query-tests/Nullness/NullAlways.expected @@ -12,6 +12,6 @@ | A.cs:194:27:194:36 | access to local variable methodcall | Variable $@ is always null here. | A.cs:189:16:189:25 | methodcall | methodcall | | A.cs:247:31:247:44 | access to local variable eq_call_always | Variable $@ is always null here. | A.cs:241:11:241:24 | eq_call_always | eq_call_always | | A.cs:258:31:258:45 | access to local variable neq_call_always | Variable $@ is always null here. | A.cs:244:11:244:25 | neq_call_always | neq_call_always | -| Assert.cs:25:27:25:27 | access to local variable s | Variable $@ is always null here. | Assert.cs:20:16:20:16 | s | s | -| Assert.cs:31:27:31:27 | access to local variable s | Variable $@ is always null here. | Assert.cs:20:16:20:16 | s | s | -| Assert.cs:37:27:37:27 | access to local variable s | Variable $@ is always null here. | Assert.cs:20:16:20:16 | s | s | +| Assert.cs:14:27:14:27 | access to local variable s | Variable $@ is always null here. | Assert.cs:9:16:9:16 | s | s | +| Assert.cs:20:27:20:27 | access to local variable s | Variable $@ is always null here. | Assert.cs:9:16:9:16 | s | s | +| Assert.cs:26:27:26:27 | access to local variable s | Variable $@ is always null here. | Assert.cs:9:16:9:16 | s | s | diff --git a/csharp/ql/test/query-tests/Security Features/CWE-338/TestInsecureRandomness.cs b/csharp/ql/test/query-tests/Security Features/CWE-338/TestInsecureRandomness.cs index 141852b44f7..8c635f392e5 100644 --- a/csharp/ql/test/query-tests/Security Features/CWE-338/TestInsecureRandomness.cs +++ b/csharp/ql/test/query-tests/Security Features/CWE-338/TestInsecureRandomness.cs @@ -2,19 +2,6 @@ using System; using System.Security.Cryptography; using Microsoft.VisualStudio.TestTools.UnitTesting; -namespace Microsoft.VisualStudio.TestTools.UnitTesting -{ - class TestClassAttribute : Attribute - { - public TestClassAttribute() { } - } - - class TestMethodAttribute : Attribute - { - public TestMethodAttribute() { } - } -} - [TestClass] public class InsecureRandomnessTest { @@ -26,3 +13,5 @@ public class InsecureRandomnessTest Random r = new Random(); } } + +// semmle-extractor-options: ${testdir}/../../../resources/stubs/Microsoft.VisualStudio.TestTools.UnitTesting.cs diff --git a/csharp/ql/test/query-tests/Security Features/CWE-798/HardcodedCredentials.expected b/csharp/ql/test/query-tests/Security Features/CWE-798/HardcodedCredentials.expected index e4b63d2841a..0aa0caa94f6 100644 --- a/csharp/ql/test/query-tests/Security Features/CWE-798/HardcodedCredentials.expected +++ b/csharp/ql/test/query-tests/Security Features/CWE-798/HardcodedCredentials.expected @@ -5,4 +5,4 @@ | HardcodedCredentials.cs:53:13:53:24 | "myPa55word" | The hard-coded value "myPa55word" flows to the $@ parameter in $@. | HardcodedCredentials.cs:53:13:53:24 | "myPa55word" | password | HardcodedCredentials.cs:51:33:53:25 | object creation of type X509Certificate2 | object creation of type X509Certificate2 | | HardcodedCredentials.cs:76:31:76:42 | "myusername" | The hard-coded value "myusername" flows to the $@ parameter in $@. | HardcodedCredentials.cs:76:31:76:42 | "myusername" | username | HardcodedCredentials.cs:76:9:76:57 | call to method CreateUser | call to method CreateUser | | HardcodedCredentials.cs:76:45:76:56 | "mypassword" | The hard-coded value "mypassword" flows to the $@ parameter in $@. | HardcodedCredentials.cs:76:45:76:56 | "mypassword" | password | HardcodedCredentials.cs:76:9:76:57 | call to method CreateUser | call to method CreateUser | -| TestHardcodedCredentials.cs:39:19:39:28 | "username" | The hard-coded value "username" flows to the $@ parameter in $@. | TestHardcodedCredentials.cs:39:19:39:28 | "username" | name | TestHardcodedCredentials.cs:37:31:51:13 | object creation of type MembershipUser | object creation of type MembershipUser | +| TestHardcodedCredentials.cs:26:19:26:28 | "username" | The hard-coded value "username" flows to the $@ parameter in $@. | TestHardcodedCredentials.cs:26:19:26:28 | "username" | name | TestHardcodedCredentials.cs:24:31:38:13 | object creation of type MembershipUser | object creation of type MembershipUser | diff --git a/csharp/ql/test/query-tests/Security Features/CWE-798/TestHardcodedCredentials.cs b/csharp/ql/test/query-tests/Security Features/CWE-798/TestHardcodedCredentials.cs index ffdcba62a5d..2b234ee42f1 100644 --- a/csharp/ql/test/query-tests/Security Features/CWE-798/TestHardcodedCredentials.cs +++ b/csharp/ql/test/query-tests/Security Features/CWE-798/TestHardcodedCredentials.cs @@ -2,19 +2,6 @@ using System; using System.Web.Security; using Microsoft.VisualStudio.TestTools.UnitTesting; -namespace Microsoft.VisualStudio.TestTools.UnitTesting -{ - class TestClassAttribute : Attribute - { - public TestClassAttribute() { } - } - - class TestMethodAttribute : Attribute - { - public TestMethodAttribute() { } - } -} - namespace Moq.Language { class TestReturn @@ -69,3 +56,5 @@ public class HardCodedCredentialsTest Moq.Language.TestReturn.Returns(() => mockUser); } } + +// semmle-extractor-options: ${testdir}/../../../resources/stubs/Microsoft.VisualStudio.TestTools.UnitTesting.cs diff --git a/csharp/ql/test/resources/stubs/Microsoft.VisualStudio.TestTools.UnitTesting.cs b/csharp/ql/test/resources/stubs/Microsoft.VisualStudio.TestTools.UnitTesting.cs new file mode 100644 index 00000000000..6162b2ecb36 --- /dev/null +++ b/csharp/ql/test/resources/stubs/Microsoft.VisualStudio.TestTools.UnitTesting.cs @@ -0,0 +1,29 @@ +using System; + +namespace Microsoft.VisualStudio.TestTools.UnitTesting +{ + public static class Assert + { + public static void IsNull(object o) { } + public static void IsNotNull(object o) { } + public static void IsTrue(bool b) { } + public static void IsFalse(bool b) { } + } + + public class AssertFailedException : Exception { } + + public class TestClassAttribute : Attribute + { + public TestClassAttribute() { } + } + + public class TestMethodAttribute : Attribute + { + public TestMethodAttribute() { } + } + + public class TestInitializeAttribute : Attribute + { + public TestInitializeAttribute() { } + } +} diff --git a/csharp/ql/test/resources/stubs/System.Windows.cs b/csharp/ql/test/resources/stubs/System.Windows.cs index 6ce12ae989c..30ac578acb0 100644 --- a/csharp/ql/test/resources/stubs/System.Windows.cs +++ b/csharp/ql/test/resources/stubs/System.Windows.cs @@ -10,4 +10,9 @@ namespace System.Windows.Forms { public static void Show(string msg, string title) { } } + + public class Application + { + public static void Exit() { } + } }