From 26f3b40d3591ec07806bdf1438df6e95030bd2c3 Mon Sep 17 00:00:00 2001 From: Vasco-jofra <11303847+Vasco-jofra@users.noreply.github.com> Date: Sat, 14 Jun 2025 00:13:03 +0200 Subject: [PATCH 001/308] Add lodash GroupBy as taint step --- .../javascript/frameworks/LodashUnderscore.qll | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/javascript/ql/lib/semmle/javascript/frameworks/LodashUnderscore.qll b/javascript/ql/lib/semmle/javascript/frameworks/LodashUnderscore.qll index 7c2e6aa37a58..202586227375 100644 --- a/javascript/ql/lib/semmle/javascript/frameworks/LodashUnderscore.qll +++ b/javascript/ql/lib/semmle/javascript/frameworks/LodashUnderscore.qll @@ -341,6 +341,18 @@ module LodashUnderscore { preservesValue = true } } + + private class LodashGroupBy extends DataFlow::SummarizedCallable { + LodashGroupBy() { this = "_.groupBy" } + + override DataFlow::CallNode getACall() { result = member("groupBy").getACall() } + + override predicate propagatesFlow(string input, string output, boolean preservesValue) { + input = "Argument[0]" and + output = ["Argument[1].Parameter[0]", "ReturnValue"] and + preservesValue = false + } + } } /** From 8c4dbca23c895b28fab9f256ce0c2b042b7174f6 Mon Sep 17 00:00:00 2001 From: Vasco-jofra <11303847+Vasco-jofra@users.noreply.github.com> Date: Sun, 15 Jun 2025 17:59:49 +0200 Subject: [PATCH 002/308] Improve data flow in the async library --- .../dataflow/internal/FlowSummaryPrivate.qll | 2 + .../javascript/frameworks/AsyncPackage.qll | 147 +++++++++++++----- .../AsyncPackage/AsyncTaintTracking.expected | 32 ++-- .../frameworks/AsyncPackage/map.js | 13 ++ .../frameworks/AsyncPackage/waterfall.js | 10 +- 5 files changed, 158 insertions(+), 46 deletions(-) diff --git a/javascript/ql/lib/semmle/javascript/dataflow/internal/FlowSummaryPrivate.qll b/javascript/ql/lib/semmle/javascript/dataflow/internal/FlowSummaryPrivate.qll index 31f5f16bbfb1..6315b34b0a4f 100644 --- a/javascript/ql/lib/semmle/javascript/dataflow/internal/FlowSummaryPrivate.qll +++ b/javascript/ql/lib/semmle/javascript/dataflow/internal/FlowSummaryPrivate.qll @@ -94,6 +94,8 @@ private string encodeContentAux(ContentSet cs, string arg) { cs = ContentSet::iteratorElement() and result = "IteratorElement" or cs = ContentSet::iteratorError() and result = "IteratorError" + or + cs = ContentSet::anyProperty() and result = "AnyMember" ) or cs = getPromiseContent(arg) and diff --git a/javascript/ql/lib/semmle/javascript/frameworks/AsyncPackage.qll b/javascript/ql/lib/semmle/javascript/frameworks/AsyncPackage.qll index 4dc60d447653..eacc69585ed5 100644 --- a/javascript/ql/lib/semmle/javascript/frameworks/AsyncPackage.qll +++ b/javascript/ql/lib/semmle/javascript/frameworks/AsyncPackage.qll @@ -15,14 +15,15 @@ module AsyncPackage { } /** - * Gets a reference to the given member or one of its `Limit` or `Series` variants. + * Gets `Limit` or `Series` name variants for a given member name. * - * For example, `memberVariant("map")` finds references to `map`, `mapLimit`, and `mapSeries`. + * For example, `memberNameVariant("map")` returns `map`, `mapLimit`, and `mapSeries`. */ - DataFlow::SourceNode memberVariant(string name) { - result = member(name) or - result = member(name + "Limit") or - result = member(name + "Series") + bindingset[name] + string memberNameVariant(string name) { + result = name or + result = name + "Limit" or + result = name + "Series" } /** @@ -101,22 +102,47 @@ module AsyncPackage { */ class IterationCall extends DataFlow::InvokeNode { string name; + int iteratorCallbackIndex; + int finalCallbackIndex; IterationCall() { - this = memberVariant(name).getACall() and - name = - [ - "concat", "detect", "each", "eachOf", "forEach", "forEachOf", "every", "filter", - "groupBy", "map", "mapValues", "reduce", "reduceRight", "reject", "some", "sortBy", - "transform" - ] + ( + ( + name = + memberNameVariant([ + "concat", "detect", "each", "eachOf", "forEach", "forEachOf", "every", "filter", + "groupBy", "map", "mapValues", "reject", "some", "sortBy", + ]) and + if name.matches("%Limit") + then ( + iteratorCallbackIndex = 2 and finalCallbackIndex = 3 + ) else ( + iteratorCallbackIndex = 1 and finalCallbackIndex = 2 + ) + ) + or + name = ["reduce", "reduceRight", "transform"] and + iteratorCallbackIndex = 2 and + finalCallbackIndex = 3 + ) and + this = member(name).getACall() } /** - * Gets the name of the iteration call, without the `Limit` or `Series` suffix. + * Gets the name of the iteration call */ string getName() { result = name } + /** + * Gets the iterator callback index + */ + int getIteratorCallbackIndex() { result = iteratorCallbackIndex } + + /** + * Gets the final callback index + */ + int getFinalCallbackIndex() { result = finalCallbackIndex } + /** * Gets the node holding the collection being iterated over. */ @@ -125,26 +151,73 @@ module AsyncPackage { /** * Gets the node holding the function being called for each element in the collection. */ - DataFlow::Node getIteratorCallback() { result = this.getArgument(this.getNumArgument() - 2) } + DataFlow::FunctionNode getIteratorCallback() { + result = this.getCallback(iteratorCallbackIndex) + } /** - * Gets the node holding the function being invoked after iteration is complete. + * Gets the node holding the function being invoked after iteration is complete. (may not exist) */ - DataFlow::Node getFinalCallback() { result = this.getArgument(this.getNumArgument() - 1) } + DataFlow::FunctionNode getFinalCallback() { result = this.getCallback(finalCallbackIndex) } + } + + /** + * An IterationCall with its iterator callback at index 1 + */ + private class IterationCallCallbacksFirstArg extends IterationCall { + IterationCallCallbacksFirstArg() { this.getIteratorCallbackIndex() = 1 } + } + + /** + * An IterationCall with its iterator callback at index 2 + */ + private class IterationCallCallbacksSecondArg extends IterationCall { + IterationCallCallbacksSecondArg() { this.getIteratorCallbackIndex() = 2 } + } + + /** + * The model with the iteratorCallbackIndex abstracted + */ + bindingset[iteratorCallbackIndex] + private predicate iterationCallPropagatesFlow( + string input, string output, boolean preservesValue, int iteratorCallbackIndex + ) { + preservesValue = true and + input = "Argument[0]." + ["ArrayElement", "SetElement", "IteratorElement", "AnyMember"] and + output = "Argument[" + iteratorCallbackIndex + "].Parameter[0]" } /** - * A taint step from the collection into the iterator callback of an iteration call. + * A taint step from the collection into the iterator callback (at index 1) of an iteration call. * * For example: `data -> item` in `async.each(data, (item, cb) => {})`. */ - private class IterationInputTaintStep extends TaintTracking::SharedTaintStep { - override predicate step(DataFlow::Node pred, DataFlow::Node succ) { - exists(DataFlow::FunctionNode iteratee, IterationCall call | - iteratee = call.getIteratorCallback() and // Require a closure to avoid spurious call/return mismatch. - pred = call.getCollection() and // TODO: needs a flow summary to ensure ArrayElement content is unfolded - succ = iteratee.getParameter(0) - ) + class IterationCallCallbacksFirstArgFlowSummary extends DataFlow::SummarizedCallable { + IterationCallCallbacksFirstArgFlowSummary() { this = "async.[IterationCallCallbacksFirstArg]" } + + override DataFlow::InvokeNode getACallSimple() { + result instanceof IterationCallCallbacksFirstArg + } + + override predicate propagatesFlow(string input, string output, boolean preservesValue) { + iterationCallPropagatesFlow(input, output, preservesValue, 1) + } + } + + /** + * A taint step from the collection into the iterator callback (at index 2) of an iteration call. + * + * For example: `data -> item` in `async.eachLimit(data, 1, (item, cb) => {})`. + */ + class IterationCallCallbacksSecondArgFlowSummary extends DataFlow::SummarizedCallable { + IterationCallCallbacksSecondArgFlowSummary() { this = "async.[IterationCallCallbackSecondArg]" } + + override DataFlow::InvokeNode getACallSimple() { + result instanceof IterationCallCallbacksSecondArg + } + + override predicate propagatesFlow(string input, string output, boolean preservesValue) { + iterationCallPropagatesFlow(input, output, preservesValue, 2) } } @@ -152,14 +225,14 @@ module AsyncPackage { * A taint step from the return value of an iterator callback to the result of the iteration * call. * - * For example: `item + taint()` -> result` in `async.map(data, (item, cb) => cb(null, item + taint()), (err, result) => {})`. + * For example: `item + taint() -> result` in `async.map(data, (item, cb) => cb(null, item + taint()), (err, result) => {})`. */ private class IterationOutputTaintStep extends TaintTracking::SharedTaintStep { override predicate step(DataFlow::Node pred, DataFlow::Node succ) { exists( DataFlow::FunctionNode iteratee, DataFlow::FunctionNode final, int i, IterationCall call | - iteratee = call.getIteratorCallback().getALocalSource() and + iteratee = call.getIteratorCallback() and final = call.getFinalCallback() and // Require a closure to avoid spurious call/return mismatch. pred = getLastParameter(iteratee).getACall().getArgument(i) and succ = final.getParameter(i) and @@ -175,14 +248,18 @@ module AsyncPackage { * * For example: `data -> result` in `async.sortBy(data, orderingFn, (err, result) => {})`. */ - private class IterationPreserveTaintStep extends TaintTracking::SharedTaintStep { - override predicate step(DataFlow::Node pred, DataFlow::Node succ) { - exists(DataFlow::FunctionNode final, IterationCall call | - final = call.getFinalCallback() and // Require a closure to avoid spurious call/return mismatch. - pred = call.getCollection() and - succ = final.getParameter(1) and - call.getName() = "sortBy" - ) + class IterationPreserveTaintStepFlowSummary extends DataFlow::SummarizedCallable { + IterationPreserveTaintStepFlowSummary() { this = "async.sortBy" } + + override DataFlow::InvokeNode getACallSimple() { + result instanceof IterationCall and + result.(IterationCall).getName() = "sortBy" + } + + override predicate propagatesFlow(string input, string output, boolean preservesValue) { + preservesValue = false and + input = "Argument[0]." + ["ArrayElement", "SetElement", "IteratorElement", "AnyMember"] and + output = "Argument[2].Parameter[1]" } } } diff --git a/javascript/ql/test/library-tests/frameworks/AsyncPackage/AsyncTaintTracking.expected b/javascript/ql/test/library-tests/frameworks/AsyncPackage/AsyncTaintTracking.expected index 168f5ec5ace4..95ee8fe452b8 100644 --- a/javascript/ql/test/library-tests/frameworks/AsyncPackage/AsyncTaintTracking.expected +++ b/javascript/ql/test/library-tests/frameworks/AsyncPackage/AsyncTaintTracking.expected @@ -1,12 +1,24 @@ legacyDataFlowDifference -| each.js:11:9:11:16 | source() | each.js:13:12:13:15 | item | only flow with OLD data flow library | -| map.js:10:13:10:20 | source() | map.js:12:14:12:17 | item | only flow with OLD data flow library | -| map.js:26:13:26:20 | source() | map.js:28:27:28:32 | result | only flow with OLD data flow library | -| sortBy.js:10:22:10:29 | source() | sortBy.js:12:27:12:32 | result | only flow with OLD data flow library | +| each.js:11:9:11:16 | source() | each.js:13:12:13:15 | item | only flow with NEW data flow library | +| map.js:14:13:14:20 | source() | map.js:16:14:16:17 | item | only flow with NEW data flow library | +| map.js:30:13:30:20 | source() | map.js:32:27:32:32 | result | only flow with NEW data flow library | +| map.js:40:13:40:20 | source() | map.js:11:10:11:10 | x | only flow with NEW data flow library | +| map.js:42:12:42:19 | source() | map.js:11:10:11:10 | x | only flow with NEW data flow library | +| map.js:44:16:44:23 | source() | map.js:11:10:11:10 | x | only flow with NEW data flow library | +| map.js:46:18:46:25 | source() | map.js:11:10:11:10 | x | only flow with NEW data flow library | +| sortBy.js:10:22:10:29 | source() | sortBy.js:12:27:12:32 | result | only flow with NEW data flow library | #select -| map.js:20:19:20:26 | source() | map.js:23:27:23:32 | result | -| waterfall.js:8:30:8:37 | source() | waterfall.js:11:12:11:16 | taint | -| waterfall.js:8:30:8:37 | source() | waterfall.js:20:10:20:14 | taint | -| waterfall.js:28:18:28:25 | source() | waterfall.js:39:10:39:12 | err | -| waterfall.js:46:22:46:29 | source() | waterfall.js:49:12:49:16 | taint | -| waterfall.js:46:22:46:29 | source() | waterfall.js:55:10:55:14 | taint | +| each.js:11:9:11:16 | source() | each.js:13:12:13:15 | item | +| map.js:14:13:14:20 | source() | map.js:16:14:16:17 | item | +| map.js:24:19:24:26 | source() | map.js:27:27:27:32 | result | +| map.js:30:13:30:20 | source() | map.js:32:27:32:32 | result | +| map.js:40:13:40:20 | source() | map.js:11:10:11:10 | x | +| map.js:42:12:42:19 | source() | map.js:11:10:11:10 | x | +| map.js:44:16:44:23 | source() | map.js:11:10:11:10 | x | +| map.js:46:18:46:25 | source() | map.js:11:10:11:10 | x | +| sortBy.js:10:22:10:29 | source() | sortBy.js:12:27:12:32 | result | +| waterfall.js:16:30:16:37 | source() | waterfall.js:19:12:19:16 | taint | +| waterfall.js:16:30:16:37 | source() | waterfall.js:28:10:28:14 | taint | +| waterfall.js:36:18:36:25 | source() | waterfall.js:47:10:47:12 | err | +| waterfall.js:54:22:54:29 | source() | waterfall.js:57:12:57:16 | taint | +| waterfall.js:54:22:54:29 | source() | waterfall.js:63:10:63:14 | taint | diff --git a/javascript/ql/test/library-tests/frameworks/AsyncPackage/map.js b/javascript/ql/test/library-tests/frameworks/AsyncPackage/map.js index ed7e64b01fae..b1e9ecc883b6 100644 --- a/javascript/ql/test/library-tests/frameworks/AsyncPackage/map.js +++ b/javascript/ql/test/library-tests/frameworks/AsyncPackage/map.js @@ -7,6 +7,10 @@ function sink(x) { console.log(x) } +function call_sink(x) { + sink(x) +} + async_.map([source()], (item, cb) => { sink(item), // NOT OK @@ -32,3 +36,12 @@ async_.map(['safe'], (item, cb) => cb(null, item), (err, result) => sink(result) // OK ); + +async_.map([source()], call_sink) // NOT OK + +async_.map(source().prop, call_sink) // NOT OK + +async_.map({a: source()}, call_sink) // NOT OK + +async_.mapLimit([source()], 1, call_sink) // NOT OK + diff --git a/javascript/ql/test/library-tests/frameworks/AsyncPackage/waterfall.js b/javascript/ql/test/library-tests/frameworks/AsyncPackage/waterfall.js index 439ac48674a6..8554d048d988 100644 --- a/javascript/ql/test/library-tests/frameworks/AsyncPackage/waterfall.js +++ b/javascript/ql/test/library-tests/frameworks/AsyncPackage/waterfall.js @@ -1,7 +1,15 @@ let async_ = require('async'); let waterfall = require('a-sync-waterfall'); -var source, sink, somethingWrong; +function source() { + return 'TAINT' +} + +function sink(x) { + console.log(x) +} + +var somethingWrong; async_.waterfall([ function(callback) { From 575da5c31c8909a99a64dc20571bb7c23aa22635 Mon Sep 17 00:00:00 2001 From: Vasco-jofra <11303847+Vasco-jofra@users.noreply.github.com> Date: Thu, 26 Jun 2025 10:10:52 +0200 Subject: [PATCH 003/308] Merge SummarizedCallable into single class --- .../javascript/frameworks/AsyncPackage.qll | 75 ++++++------------- 1 file changed, 23 insertions(+), 52 deletions(-) diff --git a/javascript/ql/lib/semmle/javascript/frameworks/AsyncPackage.qll b/javascript/ql/lib/semmle/javascript/frameworks/AsyncPackage.qll index eacc69585ed5..db2487ce46a0 100644 --- a/javascript/ql/lib/semmle/javascript/frameworks/AsyncPackage.qll +++ b/javascript/ql/lib/semmle/javascript/frameworks/AsyncPackage.qll @@ -14,13 +14,24 @@ module AsyncPackage { result = DataFlow::moduleMember("async-es", name) } + /** + * Gets a reference to the given member or one of its `Limit` or `Series` variants. + * + * For example, `memberVariant("map")` finds references to `map`, `mapLimit`, and `mapSeries`. + */ + DataFlow::SourceNode memberVariant(string name) { + result = member(name) or + result = member(name + "Limit") or + result = member(name + "Series") + } + /** * Gets `Limit` or `Series` name variants for a given member name. * * For example, `memberNameVariant("map")` returns `map`, `mapLimit`, and `mapSeries`. */ bindingset[name] - string memberNameVariant(string name) { + private string memberNameVariant(string name) { result = name or result = name + "Limit" or result = name + "Series" @@ -161,63 +172,23 @@ module AsyncPackage { DataFlow::FunctionNode getFinalCallback() { result = this.getCallback(finalCallbackIndex) } } - /** - * An IterationCall with its iterator callback at index 1 - */ - private class IterationCallCallbacksFirstArg extends IterationCall { - IterationCallCallbacksFirstArg() { this.getIteratorCallbackIndex() = 1 } - } - - /** - * An IterationCall with its iterator callback at index 2 - */ - private class IterationCallCallbacksSecondArg extends IterationCall { - IterationCallCallbacksSecondArg() { this.getIteratorCallbackIndex() = 2 } - } - - /** - * The model with the iteratorCallbackIndex abstracted - */ - bindingset[iteratorCallbackIndex] - private predicate iterationCallPropagatesFlow( - string input, string output, boolean preservesValue, int iteratorCallbackIndex - ) { - preservesValue = true and - input = "Argument[0]." + ["ArrayElement", "SetElement", "IteratorElement", "AnyMember"] and - output = "Argument[" + iteratorCallbackIndex + "].Parameter[0]" - } + private class IterationCallFlowSummary extends DataFlow::SummarizedCallable { + private int callbackArgIndex; - /** - * A taint step from the collection into the iterator callback (at index 1) of an iteration call. - * - * For example: `data -> item` in `async.each(data, (item, cb) => {})`. - */ - class IterationCallCallbacksFirstArgFlowSummary extends DataFlow::SummarizedCallable { - IterationCallCallbacksFirstArgFlowSummary() { this = "async.[IterationCallCallbacksFirstArg]" } - - override DataFlow::InvokeNode getACallSimple() { - result instanceof IterationCallCallbacksFirstArg + IterationCallFlowSummary() { + this = "async.IteratorCall(callbackArgIndex=" + callbackArgIndex + ")" and + callbackArgIndex in [1 .. 3] } - override predicate propagatesFlow(string input, string output, boolean preservesValue) { - iterationCallPropagatesFlow(input, output, preservesValue, 1) - } - } - - /** - * A taint step from the collection into the iterator callback (at index 2) of an iteration call. - * - * For example: `data -> item` in `async.eachLimit(data, 1, (item, cb) => {})`. - */ - class IterationCallCallbacksSecondArgFlowSummary extends DataFlow::SummarizedCallable { - IterationCallCallbacksSecondArgFlowSummary() { this = "async.[IterationCallCallbackSecondArg]" } - override DataFlow::InvokeNode getACallSimple() { - result instanceof IterationCallCallbacksSecondArg + result instanceof IterationCall and + result.(IterationCall).getIteratorCallbackIndex() = callbackArgIndex } override predicate propagatesFlow(string input, string output, boolean preservesValue) { - iterationCallPropagatesFlow(input, output, preservesValue, 2) + preservesValue = true and + input = "Argument[0]." + ["ArrayElement", "SetElement", "IteratorElement", "AnyMember"] and + output = "Argument[" + callbackArgIndex + "].Parameter[0]" } } @@ -248,7 +219,7 @@ module AsyncPackage { * * For example: `data -> result` in `async.sortBy(data, orderingFn, (err, result) => {})`. */ - class IterationPreserveTaintStepFlowSummary extends DataFlow::SummarizedCallable { + private class IterationPreserveTaintStepFlowSummary extends DataFlow::SummarizedCallable { IterationPreserveTaintStepFlowSummary() { this = "async.sortBy" } override DataFlow::InvokeNode getACallSimple() { From 504ae0f35ab9d19265cbbdd8547e814519f1dd5a Mon Sep 17 00:00:00 2001 From: Kevin Stubbings Date: Wed, 16 Jul 2025 06:12:45 +0000 Subject: [PATCH 004/308] Update go path sanitizers and sinks --- .../2025-07-15-path-injection-sanitizers.md | 4 ++++ go/ql/lib/ext/os.model.yml | 1 - .../query-tests/Security/CWE-022/TaintedPath.expected | 10 +++++----- go/ql/test/query-tests/Security/CWE-022/TaintedPath.go | 5 +++-- 4 files changed, 12 insertions(+), 8 deletions(-) create mode 100644 go/ql/lib/change-notes/2025-07-15-path-injection-sanitizers.md diff --git a/go/ql/lib/change-notes/2025-07-15-path-injection-sanitizers.md b/go/ql/lib/change-notes/2025-07-15-path-injection-sanitizers.md new file mode 100644 index 000000000000..e4ff7224ad2f --- /dev/null +++ b/go/ql/lib/change-notes/2025-07-15-path-injection-sanitizers.md @@ -0,0 +1,4 @@ +--- +category: minorAnalysis +--- +* Remove model`CreateTemp` function, from the `os` package, as a path-injection sink due to proper sanitization by Go. Add check for `os.PathSeparator` in sanitizers for path-injection query. \ No newline at end of file diff --git a/go/ql/lib/ext/os.model.yml b/go/ql/lib/ext/os.model.yml index b4f074146b79..66316b4ff35b 100644 --- a/go/ql/lib/ext/os.model.yml +++ b/go/ql/lib/ext/os.model.yml @@ -28,7 +28,6 @@ extensions: - ["os", "", False, "ReadDir", "", "", "Argument[0]", "path-injection", "manual"] - ["os", "", False, "ReadFile", "", "", "Argument[0]", "path-injection", "manual"] - ["os", "", False, "MkdirTemp", "", "", "Argument[0..1]", "path-injection", "manual"] - - ["os", "", False, "CreateTemp", "", "", "Argument[0..1]", "path-injection", "manual"] - ["os", "", False, "WriteFile", "", "", "Argument[0]", "path-injection", "manual"] # command-injection - ["os", "", False, "StartProcess", "", "", "Argument[0]", "command-injection", "manual"] diff --git a/go/ql/test/query-tests/Security/CWE-022/TaintedPath.expected b/go/ql/test/query-tests/Security/CWE-022/TaintedPath.expected index 839d35f663ce..fc6e39f697de 100644 --- a/go/ql/test/query-tests/Security/CWE-022/TaintedPath.expected +++ b/go/ql/test/query-tests/Security/CWE-022/TaintedPath.expected @@ -1,14 +1,14 @@ #select | TaintedPath.go:17:29:17:40 | tainted_path | TaintedPath.go:14:18:14:22 | selection of URL | TaintedPath.go:17:29:17:40 | tainted_path | This path depends on a $@. | TaintedPath.go:14:18:14:22 | selection of URL | user-provided value | | TaintedPath.go:21:28:21:69 | call to Join | TaintedPath.go:14:18:14:22 | selection of URL | TaintedPath.go:21:28:21:69 | call to Join | This path depends on a $@. | TaintedPath.go:14:18:14:22 | selection of URL | user-provided value | -| TaintedPath.go:68:28:68:57 | call to Clean | TaintedPath.go:14:18:14:22 | selection of URL | TaintedPath.go:68:28:68:57 | call to Clean | This path depends on a $@. | TaintedPath.go:14:18:14:22 | selection of URL | user-provided value | +| TaintedPath.go:69:28:69:57 | call to Clean | TaintedPath.go:14:18:14:22 | selection of URL | TaintedPath.go:69:28:69:57 | call to Clean | This path depends on a $@. | TaintedPath.go:14:18:14:22 | selection of URL | user-provided value | edges | TaintedPath.go:14:18:14:22 | selection of URL | TaintedPath.go:14:18:14:30 | call to Query | provenance | Src:MaD:2 MaD:3 | | TaintedPath.go:14:18:14:30 | call to Query | TaintedPath.go:17:29:17:40 | tainted_path | provenance | Sink:MaD:1 | | TaintedPath.go:14:18:14:30 | call to Query | TaintedPath.go:21:57:21:68 | tainted_path | provenance | | -| TaintedPath.go:14:18:14:30 | call to Query | TaintedPath.go:68:39:68:56 | ...+... | provenance | | +| TaintedPath.go:14:18:14:30 | call to Query | TaintedPath.go:69:39:69:56 | ...+... | provenance | | | TaintedPath.go:21:57:21:68 | tainted_path | TaintedPath.go:21:28:21:69 | call to Join | provenance | FunctionModel Sink:MaD:1 | -| TaintedPath.go:68:39:68:56 | ...+... | TaintedPath.go:68:28:68:57 | call to Clean | provenance | MaD:4 Sink:MaD:1 | +| TaintedPath.go:69:39:69:56 | ...+... | TaintedPath.go:69:28:69:57 | call to Clean | provenance | MaD:4 Sink:MaD:1 | models | 1 | Sink: io/ioutil; ; false; ReadFile; ; ; Argument[0]; path-injection; manual | | 2 | Source: net/http; Request; true; URL; ; ; ; remote; manual | @@ -20,6 +20,6 @@ nodes | TaintedPath.go:17:29:17:40 | tainted_path | semmle.label | tainted_path | | TaintedPath.go:21:28:21:69 | call to Join | semmle.label | call to Join | | TaintedPath.go:21:57:21:68 | tainted_path | semmle.label | tainted_path | -| TaintedPath.go:68:28:68:57 | call to Clean | semmle.label | call to Clean | -| TaintedPath.go:68:39:68:56 | ...+... | semmle.label | ...+... | +| TaintedPath.go:69:28:69:57 | call to Clean | semmle.label | call to Clean | +| TaintedPath.go:69:39:69:56 | ...+... | semmle.label | ...+... | subpaths diff --git a/go/ql/test/query-tests/Security/CWE-022/TaintedPath.go b/go/ql/test/query-tests/Security/CWE-022/TaintedPath.go index e6a1c49f4c5b..99b3a29741b4 100644 --- a/go/ql/test/query-tests/Security/CWE-022/TaintedPath.go +++ b/go/ql/test/query-tests/Security/CWE-022/TaintedPath.go @@ -8,8 +8,8 @@ import ( "path/filepath" "regexp" "strings" + "os" ) - func handler(w http.ResponseWriter, r *http.Request) { tainted_path := r.URL.Query()["path"][0] @@ -58,9 +58,10 @@ func handler(w http.ResponseWriter, r *http.Request) { w.Write(data) } - // GOOD: Sanitized by filepath.Clean with a prepended '/' forcing interpretation + // GOOD: Sanitized by filepath.Clean with a prepended '/' or os.PathSeparator forcing interpretation // as an absolute path, so that Clean will throw away any leading `..` components. data, _ = ioutil.ReadFile(filepath.Clean("/" + tainted_path)) + data, _ = ioutil.ReadFile(filepath.Clean(string(os.PathSeparator) + tainted_path)) w.Write(data) // BAD: Sanitized by path.Clean with a prepended '/' forcing interpretation From f86152d3bd45e57cd2b64aacd7bd28e3c3317ebb Mon Sep 17 00:00:00 2001 From: Kevin Stubbings Date: Wed, 16 Jul 2025 21:27:33 +0000 Subject: [PATCH 005/308] Add sanitizer changes and fix test --- .../2025-07-15-path-injection-sanitizers.md | 2 +- .../go/security/TaintedPathCustomizations.qll | 9 +++++- .../Security/CWE-022/TaintedPath.expected | 32 +++++++++---------- .../Security/CWE-022/TaintedPath.go | 9 ++++-- 4 files changed, 32 insertions(+), 20 deletions(-) diff --git a/go/ql/lib/change-notes/2025-07-15-path-injection-sanitizers.md b/go/ql/lib/change-notes/2025-07-15-path-injection-sanitizers.md index e4ff7224ad2f..69596cf98d92 100644 --- a/go/ql/lib/change-notes/2025-07-15-path-injection-sanitizers.md +++ b/go/ql/lib/change-notes/2025-07-15-path-injection-sanitizers.md @@ -1,4 +1,4 @@ --- category: minorAnalysis --- -* Remove model`CreateTemp` function, from the `os` package, as a path-injection sink due to proper sanitization by Go. Add check for `os.PathSeparator` in sanitizers for path-injection query. \ No newline at end of file +* Remove model `CreateTemp` function, from the `os` package, as a path-injection sink due to proper sanitization by Go. Add check for `os.PathSeparator` in sanitizers for path-injection query. \ No newline at end of file diff --git a/go/ql/lib/semmle/go/security/TaintedPathCustomizations.qll b/go/ql/lib/semmle/go/security/TaintedPathCustomizations.qll index df601ce1eb84..760de2d9c546 100644 --- a/go/ql/lib/semmle/go/security/TaintedPathCustomizations.qll +++ b/go/ql/lib/semmle/go/security/TaintedPathCustomizations.qll @@ -87,7 +87,14 @@ module TaintedPath { exists(DataFlow::CallNode cleanCall, StringOps::Concatenation concatNode | cleanCall = any(Function f | f.hasQualifiedName("path/filepath", "Clean")).getACall() and concatNode = cleanCall.getArgument(0) and - concatNode.getOperand(0).asExpr().(StringLit).getValue() = "/" and + ( + concatNode.getOperand(0).asExpr().(StringLit).getValue() = "/" + or + exists(DeclaredConstant dc | + dc.hasQualifiedName("os", "PathSeparator") and + dc.getAReference() = concatNode.getOperand(0).asExpr().getAChildExpr*() + ) + ) and this = cleanCall.getResult() ) } diff --git a/go/ql/test/query-tests/Security/CWE-022/TaintedPath.expected b/go/ql/test/query-tests/Security/CWE-022/TaintedPath.expected index fc6e39f697de..f5d86e68dbc6 100644 --- a/go/ql/test/query-tests/Security/CWE-022/TaintedPath.expected +++ b/go/ql/test/query-tests/Security/CWE-022/TaintedPath.expected @@ -1,25 +1,25 @@ #select -| TaintedPath.go:17:29:17:40 | tainted_path | TaintedPath.go:14:18:14:22 | selection of URL | TaintedPath.go:17:29:17:40 | tainted_path | This path depends on a $@. | TaintedPath.go:14:18:14:22 | selection of URL | user-provided value | -| TaintedPath.go:21:28:21:69 | call to Join | TaintedPath.go:14:18:14:22 | selection of URL | TaintedPath.go:21:28:21:69 | call to Join | This path depends on a $@. | TaintedPath.go:14:18:14:22 | selection of URL | user-provided value | -| TaintedPath.go:69:28:69:57 | call to Clean | TaintedPath.go:14:18:14:22 | selection of URL | TaintedPath.go:69:28:69:57 | call to Clean | This path depends on a $@. | TaintedPath.go:14:18:14:22 | selection of URL | user-provided value | +| TaintedPath.go:18:29:18:40 | tainted_path | TaintedPath.go:15:18:15:22 | selection of URL | TaintedPath.go:18:29:18:40 | tainted_path | This path depends on a $@. | TaintedPath.go:15:18:15:22 | selection of URL | user-provided value | +| TaintedPath.go:22:28:22:69 | call to Join | TaintedPath.go:15:18:15:22 | selection of URL | TaintedPath.go:22:28:22:69 | call to Join | This path depends on a $@. | TaintedPath.go:15:18:15:22 | selection of URL | user-provided value | +| TaintedPath.go:74:28:74:57 | call to Clean | TaintedPath.go:15:18:15:22 | selection of URL | TaintedPath.go:74:28:74:57 | call to Clean | This path depends on a $@. | TaintedPath.go:15:18:15:22 | selection of URL | user-provided value | edges -| TaintedPath.go:14:18:14:22 | selection of URL | TaintedPath.go:14:18:14:30 | call to Query | provenance | Src:MaD:2 MaD:3 | -| TaintedPath.go:14:18:14:30 | call to Query | TaintedPath.go:17:29:17:40 | tainted_path | provenance | Sink:MaD:1 | -| TaintedPath.go:14:18:14:30 | call to Query | TaintedPath.go:21:57:21:68 | tainted_path | provenance | | -| TaintedPath.go:14:18:14:30 | call to Query | TaintedPath.go:69:39:69:56 | ...+... | provenance | | -| TaintedPath.go:21:57:21:68 | tainted_path | TaintedPath.go:21:28:21:69 | call to Join | provenance | FunctionModel Sink:MaD:1 | -| TaintedPath.go:69:39:69:56 | ...+... | TaintedPath.go:69:28:69:57 | call to Clean | provenance | MaD:4 Sink:MaD:1 | +| TaintedPath.go:15:18:15:22 | selection of URL | TaintedPath.go:15:18:15:30 | call to Query | provenance | Src:MaD:2 MaD:3 | +| TaintedPath.go:15:18:15:30 | call to Query | TaintedPath.go:18:29:18:40 | tainted_path | provenance | Sink:MaD:1 | +| TaintedPath.go:15:18:15:30 | call to Query | TaintedPath.go:22:57:22:68 | tainted_path | provenance | | +| TaintedPath.go:15:18:15:30 | call to Query | TaintedPath.go:74:39:74:56 | ...+... | provenance | | +| TaintedPath.go:22:57:22:68 | tainted_path | TaintedPath.go:22:28:22:69 | call to Join | provenance | FunctionModel Sink:MaD:1 | +| TaintedPath.go:74:39:74:56 | ...+... | TaintedPath.go:74:28:74:57 | call to Clean | provenance | MaD:4 Sink:MaD:1 | models | 1 | Sink: io/ioutil; ; false; ReadFile; ; ; Argument[0]; path-injection; manual | | 2 | Source: net/http; Request; true; URL; ; ; ; remote; manual | | 3 | Summary: net/url; URL; true; Query; ; ; Argument[receiver]; ReturnValue; taint; manual | | 4 | Summary: path; ; false; Clean; ; ; Argument[0]; ReturnValue; taint; manual | nodes -| TaintedPath.go:14:18:14:22 | selection of URL | semmle.label | selection of URL | -| TaintedPath.go:14:18:14:30 | call to Query | semmle.label | call to Query | -| TaintedPath.go:17:29:17:40 | tainted_path | semmle.label | tainted_path | -| TaintedPath.go:21:28:21:69 | call to Join | semmle.label | call to Join | -| TaintedPath.go:21:57:21:68 | tainted_path | semmle.label | tainted_path | -| TaintedPath.go:69:28:69:57 | call to Clean | semmle.label | call to Clean | -| TaintedPath.go:69:39:69:56 | ...+... | semmle.label | ...+... | +| TaintedPath.go:15:18:15:22 | selection of URL | semmle.label | selection of URL | +| TaintedPath.go:15:18:15:30 | call to Query | semmle.label | call to Query | +| TaintedPath.go:18:29:18:40 | tainted_path | semmle.label | tainted_path | +| TaintedPath.go:22:28:22:69 | call to Join | semmle.label | call to Join | +| TaintedPath.go:22:57:22:68 | tainted_path | semmle.label | tainted_path | +| TaintedPath.go:74:28:74:57 | call to Clean | semmle.label | call to Clean | +| TaintedPath.go:74:39:74:56 | ...+... | semmle.label | ...+... | subpaths diff --git a/go/ql/test/query-tests/Security/CWE-022/TaintedPath.go b/go/ql/test/query-tests/Security/CWE-022/TaintedPath.go index 99b3a29741b4..3949d8408a1c 100644 --- a/go/ql/test/query-tests/Security/CWE-022/TaintedPath.go +++ b/go/ql/test/query-tests/Security/CWE-022/TaintedPath.go @@ -4,12 +4,13 @@ import ( "io/ioutil" "mime/multipart" "net/http" + "os" "path" "path/filepath" "regexp" "strings" - "os" ) + func handler(w http.ResponseWriter, r *http.Request) { tainted_path := r.URL.Query()["path"][0] @@ -58,9 +59,13 @@ func handler(w http.ResponseWriter, r *http.Request) { w.Write(data) } - // GOOD: Sanitized by filepath.Clean with a prepended '/' or os.PathSeparator forcing interpretation + // GOOD: Sanitized by filepath.Clean with a prepended '/' forcing interpretation // as an absolute path, so that Clean will throw away any leading `..` components. data, _ = ioutil.ReadFile(filepath.Clean("/" + tainted_path)) + w.Write(data) + + // GOOD: Sanitized by filepath.Clean with a prepended os.PathSeparator forcing interpretation + // as an absolute path, so that Clean will throw away any leading `..` components. data, _ = ioutil.ReadFile(filepath.Clean(string(os.PathSeparator) + tainted_path)) w.Write(data) From b4b848a25c8663942af6c80ee18fda7ee2acaf09 Mon Sep 17 00:00:00 2001 From: Kevin Stubbings Date: Mon, 21 Jul 2025 21:53:35 +0000 Subject: [PATCH 006/308] Fix tests and simplify sanitizer --- go/ql/lib/ext/os.model.yml | 1 + .../lib/semmle/go/security/TaintedPathCustomizations.qll | 9 +-------- .../semmle/go/frameworks/StdlibTaintFlow/Os.go | 2 +- go/ql/test/query-tests/Security/CWE-022/TaintedPath.go | 2 +- 4 files changed, 4 insertions(+), 10 deletions(-) diff --git a/go/ql/lib/ext/os.model.yml b/go/ql/lib/ext/os.model.yml index 66316b4ff35b..7d2070b53bac 100644 --- a/go/ql/lib/ext/os.model.yml +++ b/go/ql/lib/ext/os.model.yml @@ -28,6 +28,7 @@ extensions: - ["os", "", False, "ReadDir", "", "", "Argument[0]", "path-injection", "manual"] - ["os", "", False, "ReadFile", "", "", "Argument[0]", "path-injection", "manual"] - ["os", "", False, "MkdirTemp", "", "", "Argument[0..1]", "path-injection", "manual"] + - ["os", "", False, "CreateTemp", "", "", "Argument[0]", "path-injection", "manual"] - ["os", "", False, "WriteFile", "", "", "Argument[0]", "path-injection", "manual"] # command-injection - ["os", "", False, "StartProcess", "", "", "Argument[0]", "command-injection", "manual"] diff --git a/go/ql/lib/semmle/go/security/TaintedPathCustomizations.qll b/go/ql/lib/semmle/go/security/TaintedPathCustomizations.qll index 760de2d9c546..ac6ea8c9835e 100644 --- a/go/ql/lib/semmle/go/security/TaintedPathCustomizations.qll +++ b/go/ql/lib/semmle/go/security/TaintedPathCustomizations.qll @@ -87,14 +87,7 @@ module TaintedPath { exists(DataFlow::CallNode cleanCall, StringOps::Concatenation concatNode | cleanCall = any(Function f | f.hasQualifiedName("path/filepath", "Clean")).getACall() and concatNode = cleanCall.getArgument(0) and - ( - concatNode.getOperand(0).asExpr().(StringLit).getValue() = "/" - or - exists(DeclaredConstant dc | - dc.hasQualifiedName("os", "PathSeparator") and - dc.getAReference() = concatNode.getOperand(0).asExpr().getAChildExpr*() - ) - ) and + concatNode.getOperand(0).getStringValue().prefix(1) = ["/", "\\"] and this = cleanCall.getResult() ) } diff --git a/go/ql/test/library-tests/semmle/go/frameworks/StdlibTaintFlow/Os.go b/go/ql/test/library-tests/semmle/go/frameworks/StdlibTaintFlow/Os.go index b27c5d1f47cb..859a3bbd3bd4 100644 --- a/go/ql/test/library-tests/semmle/go/frameworks/StdlibTaintFlow/Os.go +++ b/go/ql/test/library-tests/semmle/go/frameworks/StdlibTaintFlow/Os.go @@ -178,6 +178,6 @@ func fsAccesses() { os.ReadDir(path) // $ fsaccess=path os.ReadFile(path) // $ fsaccess=path os.MkdirTemp(path, part) // $ fsaccess=path fsaccess=part - os.CreateTemp(path, part) // $ fsaccess=path fsaccess=part + os.CreateTemp(path, part) // $ fsaccess=path os.WriteFile(path, []byte{}, 0600) // $ fsaccess=path } diff --git a/go/ql/test/query-tests/Security/CWE-022/TaintedPath.go b/go/ql/test/query-tests/Security/CWE-022/TaintedPath.go index 3949d8408a1c..a6519acea005 100644 --- a/go/ql/test/query-tests/Security/CWE-022/TaintedPath.go +++ b/go/ql/test/query-tests/Security/CWE-022/TaintedPath.go @@ -66,7 +66,7 @@ func handler(w http.ResponseWriter, r *http.Request) { // GOOD: Sanitized by filepath.Clean with a prepended os.PathSeparator forcing interpretation // as an absolute path, so that Clean will throw away any leading `..` components. - data, _ = ioutil.ReadFile(filepath.Clean(string(os.PathSeparator) + tainted_path)) + data, _ = ioutil.ReadFile(filepath.Clean(string(os.PathSeparator) + "hardcoded" + tainted_path)) w.Write(data) // BAD: Sanitized by path.Clean with a prepended '/' forcing interpretation From e2f3c9d1b6c84b48c3d3dbcef86ce9b8ec02918a Mon Sep 17 00:00:00 2001 From: Owen Mansel-Chan <62447351+owen-mc@users.noreply.github.com> Date: Tue, 22 Jul 2025 00:09:37 +0100 Subject: [PATCH 007/308] Reword change note --- go/ql/lib/change-notes/2025-07-15-path-injection-sanitizers.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/go/ql/lib/change-notes/2025-07-15-path-injection-sanitizers.md b/go/ql/lib/change-notes/2025-07-15-path-injection-sanitizers.md index 69596cf98d92..004eb973de30 100644 --- a/go/ql/lib/change-notes/2025-07-15-path-injection-sanitizers.md +++ b/go/ql/lib/change-notes/2025-07-15-path-injection-sanitizers.md @@ -1,4 +1,5 @@ --- category: minorAnalysis --- -* Remove model `CreateTemp` function, from the `os` package, as a path-injection sink due to proper sanitization by Go. Add check for `os.PathSeparator` in sanitizers for path-injection query. \ No newline at end of file +* The second argument of the `CreateTemp` function, from the `os` package, is no longer a path-injection sink due to proper sanitization by Go. +* The query "Uncontrolled data used in path expression" (`go/path-injection`) now detects sanitizing a path by adding `os.PathSeparator` or `\` to the beginning. \ No newline at end of file From 358617f53365db5b808bc668f0aae704e56790c2 Mon Sep 17 00:00:00 2001 From: Napalys Klicius Date: Wed, 30 Jul 2025 09:49:04 +0000 Subject: [PATCH 008/308] Move CORS misconfiguration query from experimental to Security --- .../semmle/javascript/frameworks}/Apollo.qll | 0 .../semmle/javascript/frameworks}/Cors.qll | 0 .../CorsPermissiveConfigurationCustomizations.qll | 10 +++++----- .../security}/CorsPermissiveConfigurationQuery.qll | 0 .../CWE-942/CorsPermissiveConfiguration.qhelp | 0 .../Security/CWE-942/CorsPermissiveConfiguration.ql | 11 ++++++----- .../examples/CorsPermissiveConfigurationBad.js | 0 .../examples/CorsPermissiveConfigurationGood.js | 0 .../CWE-942/CorsPermissiveConfiguration.qlref | 1 - .../CWE-942/CorsPermissiveConfiguration.expected | 0 .../CWE-942/CorsPermissiveConfiguration.qlref | 1 + .../Security/CWE-942/apollo-test.js | 0 .../Security/CWE-942/express-test.js | 0 13 files changed, 12 insertions(+), 11 deletions(-) rename javascript/ql/{src/experimental/Security/CWE-942 => lib/semmle/javascript/frameworks}/Apollo.qll (100%) rename javascript/ql/{src/experimental/Security/CWE-942 => lib/semmle/javascript/frameworks}/Cors.qll (100%) rename javascript/ql/{src/experimental/Security/CWE-942 => lib/semmle/javascript/security}/CorsPermissiveConfigurationCustomizations.qll (94%) rename javascript/ql/{src/experimental/Security/CWE-942 => lib/semmle/javascript/security}/CorsPermissiveConfigurationQuery.qll (100%) rename javascript/ql/src/{experimental => }/Security/CWE-942/CorsPermissiveConfiguration.qhelp (100%) rename javascript/ql/src/{experimental => }/Security/CWE-942/CorsPermissiveConfiguration.ql (53%) rename javascript/ql/src/{experimental => }/Security/CWE-942/examples/CorsPermissiveConfigurationBad.js (100%) rename javascript/ql/src/{experimental => }/Security/CWE-942/examples/CorsPermissiveConfigurationGood.js (100%) delete mode 100644 javascript/ql/test/experimental/Security/CWE-942/CorsPermissiveConfiguration.qlref rename javascript/ql/test/{experimental => query-tests}/Security/CWE-942/CorsPermissiveConfiguration.expected (100%) create mode 100644 javascript/ql/test/query-tests/Security/CWE-942/CorsPermissiveConfiguration.qlref rename javascript/ql/test/{experimental => query-tests}/Security/CWE-942/apollo-test.js (100%) rename javascript/ql/test/{experimental => query-tests}/Security/CWE-942/express-test.js (100%) diff --git a/javascript/ql/src/experimental/Security/CWE-942/Apollo.qll b/javascript/ql/lib/semmle/javascript/frameworks/Apollo.qll similarity index 100% rename from javascript/ql/src/experimental/Security/CWE-942/Apollo.qll rename to javascript/ql/lib/semmle/javascript/frameworks/Apollo.qll diff --git a/javascript/ql/src/experimental/Security/CWE-942/Cors.qll b/javascript/ql/lib/semmle/javascript/frameworks/Cors.qll similarity index 100% rename from javascript/ql/src/experimental/Security/CWE-942/Cors.qll rename to javascript/ql/lib/semmle/javascript/frameworks/Cors.qll diff --git a/javascript/ql/src/experimental/Security/CWE-942/CorsPermissiveConfigurationCustomizations.qll b/javascript/ql/lib/semmle/javascript/security/CorsPermissiveConfigurationCustomizations.qll similarity index 94% rename from javascript/ql/src/experimental/Security/CWE-942/CorsPermissiveConfigurationCustomizations.qll rename to javascript/ql/lib/semmle/javascript/security/CorsPermissiveConfigurationCustomizations.qll index 8876373a3d24..b642b98b35ba 100644 --- a/javascript/ql/src/experimental/Security/CWE-942/CorsPermissiveConfigurationCustomizations.qll +++ b/javascript/ql/lib/semmle/javascript/security/CorsPermissiveConfigurationCustomizations.qll @@ -5,8 +5,8 @@ */ import javascript -import Cors::Cors -import Apollo::Apollo +private import semmle.javascript.frameworks.Apollo +private import semmle.javascript.frameworks.Cors /** Module containing sources, sinks, and sanitizers for overly permissive CORS configurations. */ module CorsPermissiveConfiguration { @@ -105,7 +105,7 @@ module CorsPermissiveConfiguration { */ class CorsApolloServer extends Sink, DataFlow::ValueNode { CorsApolloServer() { - exists(ApolloServer agql | + exists(Apollo::ApolloServer agql | this = agql.getOptionArgument(0, "cors").getALocalSource().getAPropertyWrite("origin").getRhs() ) @@ -125,7 +125,7 @@ module CorsPermissiveConfiguration { * An express route setup configured with the `cors` package. */ class CorsConfiguration extends DataFlow::MethodCallNode { - Cors corsConfig; + Cors::Cors corsConfig; CorsConfiguration() { exists(Express::RouteSetup setup | this = setup | @@ -136,6 +136,6 @@ module CorsPermissiveConfiguration { } /** Gets the expression that configures `cors` on this route setup. */ - Cors getCorsConfiguration() { result = corsConfig } + Cors::Cors getCorsConfiguration() { result = corsConfig } } } diff --git a/javascript/ql/src/experimental/Security/CWE-942/CorsPermissiveConfigurationQuery.qll b/javascript/ql/lib/semmle/javascript/security/CorsPermissiveConfigurationQuery.qll similarity index 100% rename from javascript/ql/src/experimental/Security/CWE-942/CorsPermissiveConfigurationQuery.qll rename to javascript/ql/lib/semmle/javascript/security/CorsPermissiveConfigurationQuery.qll diff --git a/javascript/ql/src/experimental/Security/CWE-942/CorsPermissiveConfiguration.qhelp b/javascript/ql/src/Security/CWE-942/CorsPermissiveConfiguration.qhelp similarity index 100% rename from javascript/ql/src/experimental/Security/CWE-942/CorsPermissiveConfiguration.qhelp rename to javascript/ql/src/Security/CWE-942/CorsPermissiveConfiguration.qhelp diff --git a/javascript/ql/src/experimental/Security/CWE-942/CorsPermissiveConfiguration.ql b/javascript/ql/src/Security/CWE-942/CorsPermissiveConfiguration.ql similarity index 53% rename from javascript/ql/src/experimental/Security/CWE-942/CorsPermissiveConfiguration.ql rename to javascript/ql/src/Security/CWE-942/CorsPermissiveConfiguration.ql index 87db66ad98d9..050842028585 100644 --- a/javascript/ql/src/experimental/Security/CWE-942/CorsPermissiveConfiguration.ql +++ b/javascript/ql/src/Security/CWE-942/CorsPermissiveConfiguration.ql @@ -1,5 +1,5 @@ /** - * @name overly CORS configuration + * @name Permissive CORS configuration * @description Misconfiguration of CORS HTTP headers allows CSRF attacks. * @kind path-problem * @problem.severity error @@ -11,11 +11,12 @@ */ import javascript -import CorsPermissiveConfigurationQuery -import CorsPermissiveConfigurationFlow::PathGraph +import semmle.javascript.security.CorsPermissiveConfigurationQuery as CorsQuery +import CorsQuery::CorsPermissiveConfigurationFlow::PathGraph from - CorsPermissiveConfigurationFlow::PathNode source, CorsPermissiveConfigurationFlow::PathNode sink -where CorsPermissiveConfigurationFlow::flowPath(source, sink) + CorsQuery::CorsPermissiveConfigurationFlow::PathNode source, + CorsQuery::CorsPermissiveConfigurationFlow::PathNode sink +where CorsQuery::CorsPermissiveConfigurationFlow::flowPath(source, sink) select sink.getNode(), source, sink, "CORS Origin misconfiguration due to a $@.", source.getNode(), "too permissive or user controlled value" diff --git a/javascript/ql/src/experimental/Security/CWE-942/examples/CorsPermissiveConfigurationBad.js b/javascript/ql/src/Security/CWE-942/examples/CorsPermissiveConfigurationBad.js similarity index 100% rename from javascript/ql/src/experimental/Security/CWE-942/examples/CorsPermissiveConfigurationBad.js rename to javascript/ql/src/Security/CWE-942/examples/CorsPermissiveConfigurationBad.js diff --git a/javascript/ql/src/experimental/Security/CWE-942/examples/CorsPermissiveConfigurationGood.js b/javascript/ql/src/Security/CWE-942/examples/CorsPermissiveConfigurationGood.js similarity index 100% rename from javascript/ql/src/experimental/Security/CWE-942/examples/CorsPermissiveConfigurationGood.js rename to javascript/ql/src/Security/CWE-942/examples/CorsPermissiveConfigurationGood.js diff --git a/javascript/ql/test/experimental/Security/CWE-942/CorsPermissiveConfiguration.qlref b/javascript/ql/test/experimental/Security/CWE-942/CorsPermissiveConfiguration.qlref deleted file mode 100644 index 1e6a39679c0d..000000000000 --- a/javascript/ql/test/experimental/Security/CWE-942/CorsPermissiveConfiguration.qlref +++ /dev/null @@ -1 +0,0 @@ -./experimental/Security/CWE-942/CorsPermissiveConfiguration.ql \ No newline at end of file diff --git a/javascript/ql/test/experimental/Security/CWE-942/CorsPermissiveConfiguration.expected b/javascript/ql/test/query-tests/Security/CWE-942/CorsPermissiveConfiguration.expected similarity index 100% rename from javascript/ql/test/experimental/Security/CWE-942/CorsPermissiveConfiguration.expected rename to javascript/ql/test/query-tests/Security/CWE-942/CorsPermissiveConfiguration.expected diff --git a/javascript/ql/test/query-tests/Security/CWE-942/CorsPermissiveConfiguration.qlref b/javascript/ql/test/query-tests/Security/CWE-942/CorsPermissiveConfiguration.qlref new file mode 100644 index 000000000000..4f4178905a29 --- /dev/null +++ b/javascript/ql/test/query-tests/Security/CWE-942/CorsPermissiveConfiguration.qlref @@ -0,0 +1 @@ +Security/CWE-942/CorsPermissiveConfiguration.ql \ No newline at end of file diff --git a/javascript/ql/test/experimental/Security/CWE-942/apollo-test.js b/javascript/ql/test/query-tests/Security/CWE-942/apollo-test.js similarity index 100% rename from javascript/ql/test/experimental/Security/CWE-942/apollo-test.js rename to javascript/ql/test/query-tests/Security/CWE-942/apollo-test.js diff --git a/javascript/ql/test/experimental/Security/CWE-942/express-test.js b/javascript/ql/test/query-tests/Security/CWE-942/express-test.js similarity index 100% rename from javascript/ql/test/experimental/Security/CWE-942/express-test.js rename to javascript/ql/test/query-tests/Security/CWE-942/express-test.js From 92daa7d42cd2835a00c5e17deea4cc1a44401112 Mon Sep 17 00:00:00 2001 From: Napalys Klicius Date: Wed, 30 Jul 2025 10:27:14 +0000 Subject: [PATCH 009/308] Updated suite expectations --- .../query-suite/javascript-code-scanning.qls.expected | 1 + .../query-suite/javascript-security-and-quality.qls.expected | 1 + .../query-suite/javascript-security-extended.qls.expected | 1 + .../integration-tests/query-suite/not_included_in_qls.expected | 1 - 4 files changed, 3 insertions(+), 1 deletion(-) diff --git a/javascript/ql/integration-tests/query-suite/javascript-code-scanning.qls.expected b/javascript/ql/integration-tests/query-suite/javascript-code-scanning.qls.expected index 652ac0ebc1b9..0c417e661c79 100644 --- a/javascript/ql/integration-tests/query-suite/javascript-code-scanning.qls.expected +++ b/javascript/ql/integration-tests/query-suite/javascript-code-scanning.qls.expected @@ -83,5 +83,6 @@ ql/javascript/ql/src/Security/CWE-915/PrototypePollutingFunction.ql ql/javascript/ql/src/Security/CWE-915/PrototypePollutingMergeCall.ql ql/javascript/ql/src/Security/CWE-916/InsufficientPasswordHash.ql ql/javascript/ql/src/Security/CWE-918/RequestForgery.ql +ql/javascript/ql/src/Security/CWE-942/CorsPermissiveConfiguration.ql ql/javascript/ql/src/Summary/LinesOfCode.ql ql/javascript/ql/src/Summary/LinesOfUserCode.ql diff --git a/javascript/ql/integration-tests/query-suite/javascript-security-and-quality.qls.expected b/javascript/ql/integration-tests/query-suite/javascript-security-and-quality.qls.expected index dd5877683082..f87cd2bf505a 100644 --- a/javascript/ql/integration-tests/query-suite/javascript-security-and-quality.qls.expected +++ b/javascript/ql/integration-tests/query-suite/javascript-security-and-quality.qls.expected @@ -184,6 +184,7 @@ ql/javascript/ql/src/Security/CWE-915/PrototypePollutingMergeCall.ql ql/javascript/ql/src/Security/CWE-916/InsufficientPasswordHash.ql ql/javascript/ql/src/Security/CWE-918/ClientSideRequestForgery.ql ql/javascript/ql/src/Security/CWE-918/RequestForgery.ql +ql/javascript/ql/src/Security/CWE-942/CorsPermissiveConfiguration.ql ql/javascript/ql/src/Statements/DanglingElse.ql ql/javascript/ql/src/Statements/IgnoreArrayResult.ql ql/javascript/ql/src/Statements/InconsistentLoopOrientation.ql diff --git a/javascript/ql/integration-tests/query-suite/javascript-security-extended.qls.expected b/javascript/ql/integration-tests/query-suite/javascript-security-extended.qls.expected index 9b7cfd22ed6f..ac5e0e2c4984 100644 --- a/javascript/ql/integration-tests/query-suite/javascript-security-extended.qls.expected +++ b/javascript/ql/integration-tests/query-suite/javascript-security-extended.qls.expected @@ -99,5 +99,6 @@ ql/javascript/ql/src/Security/CWE-915/PrototypePollutingMergeCall.ql ql/javascript/ql/src/Security/CWE-916/InsufficientPasswordHash.ql ql/javascript/ql/src/Security/CWE-918/ClientSideRequestForgery.ql ql/javascript/ql/src/Security/CWE-918/RequestForgery.ql +ql/javascript/ql/src/Security/CWE-942/CorsPermissiveConfiguration.ql ql/javascript/ql/src/Summary/LinesOfCode.ql ql/javascript/ql/src/Summary/LinesOfUserCode.ql diff --git a/javascript/ql/integration-tests/query-suite/not_included_in_qls.expected b/javascript/ql/integration-tests/query-suite/not_included_in_qls.expected index 1b119f60c75e..fa52a97a4e4a 100644 --- a/javascript/ql/integration-tests/query-suite/not_included_in_qls.expected +++ b/javascript/ql/integration-tests/query-suite/not_included_in_qls.expected @@ -75,7 +75,6 @@ ql/javascript/ql/src/experimental/Security/CWE-347/decodeJwtWithoutVerificationL ql/javascript/ql/src/experimental/Security/CWE-444/InsecureHttpParser.ql ql/javascript/ql/src/experimental/Security/CWE-522-DecompressionBombs/DecompressionBombs.ql ql/javascript/ql/src/experimental/Security/CWE-918/SSRF.ql -ql/javascript/ql/src/experimental/Security/CWE-942/CorsPermissiveConfiguration.ql ql/javascript/ql/src/experimental/StandardLibrary/MultipleArgumentsToSetConstructor.ql ql/javascript/ql/src/experimental/heuristics/ql/src/Security/CWE-020/UntrustedDataToExternalAPI.ql ql/javascript/ql/src/experimental/heuristics/ql/src/Security/CWE-078/CommandInjection.ql From 95743d7109180c7076fe732c2e51ff1ee88d14ab Mon Sep 17 00:00:00 2001 From: Napalys Klicius Date: Wed, 30 Jul 2025 10:42:55 +0000 Subject: [PATCH 010/308] Added inline test expectations for cors permissive config --- .../Security/CWE-942/CorsPermissiveConfiguration.qlref | 3 ++- .../ql/test/query-tests/Security/CWE-942/apollo-test.js | 8 ++++---- .../ql/test/query-tests/Security/CWE-942/express-test.js | 6 +++--- 3 files changed, 9 insertions(+), 8 deletions(-) diff --git a/javascript/ql/test/query-tests/Security/CWE-942/CorsPermissiveConfiguration.qlref b/javascript/ql/test/query-tests/Security/CWE-942/CorsPermissiveConfiguration.qlref index 4f4178905a29..b38b30eb842d 100644 --- a/javascript/ql/test/query-tests/Security/CWE-942/CorsPermissiveConfiguration.qlref +++ b/javascript/ql/test/query-tests/Security/CWE-942/CorsPermissiveConfiguration.qlref @@ -1 +1,2 @@ -Security/CWE-942/CorsPermissiveConfiguration.ql \ No newline at end of file +query: Security/CWE-942/CorsPermissiveConfiguration.ql +postprocess: utils/test/InlineExpectationsTestQuery.ql \ No newline at end of file diff --git a/javascript/ql/test/query-tests/Security/CWE-942/apollo-test.js b/javascript/ql/test/query-tests/Security/CWE-942/apollo-test.js index f55d5dc2c3ec..22019a722584 100644 --- a/javascript/ql/test/query-tests/Security/CWE-942/apollo-test.js +++ b/javascript/ql/test/query-tests/Security/CWE-942/apollo-test.js @@ -5,10 +5,10 @@ var https = require('https'), var server = https.createServer(function () { }); server.on('request', function (req, res) { - let user_origin = url.parse(req.url, true).query.origin; + let user_origin = url.parse(req.url, true).query.origin; // $ Source // BAD: CORS too permissive const server_1 = new ApolloServer({ - cors: { origin: true } + cors: { origin: true } // $ Alert }); // GOOD: restrictive CORS @@ -18,11 +18,11 @@ server.on('request', function (req, res) { // BAD: CORS too permissive const server_3 = new ApolloServer({ - cors: { origin: null } + cors: { origin: null } // $ Alert }); // BAD: CORS is controlled by user const server_4 = new ApolloServer({ - cors: { origin: user_origin } + cors: { origin: user_origin } // $ Alert }); }); \ No newline at end of file diff --git a/javascript/ql/test/query-tests/Security/CWE-942/express-test.js b/javascript/ql/test/query-tests/Security/CWE-942/express-test.js index 3ad31a6a31a8..9b21ed56873b 100644 --- a/javascript/ql/test/query-tests/Security/CWE-942/express-test.js +++ b/javascript/ql/test/query-tests/Security/CWE-942/express-test.js @@ -7,7 +7,7 @@ var https = require('https'), var server = https.createServer(function () { }); server.on('request', function (req, res) { - let user_origin = url.parse(req.url, true).query.origin; + let user_origin = url.parse(req.url, true).query.origin; // $ Source // BAD: CORS too permissive, default value is * var app1 = express(); @@ -23,14 +23,14 @@ server.on('request', function (req, res) { // BAD: CORS too permissive var app3 = express(); var corsOption3 = { - origin: '*' + origin: '*' // $ Alert }; app3.use(cors(corsOption3)); // BAD: CORS is controlled by user var app4 = express(); var corsOption4 = { - origin: user_origin + origin: user_origin // $ Alert }; app4.use(cors(corsOption4)); }); \ No newline at end of file From 84ffbbec33cbff31393da847b815f2c56ae076c2 Mon Sep 17 00:00:00 2001 From: Napalys Klicius Date: Wed, 30 Jul 2025 10:51:38 +0000 Subject: [PATCH 011/308] Added missing doc strings --- .../security/CorsPermissiveConfigurationCustomizations.qll | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/javascript/ql/lib/semmle/javascript/security/CorsPermissiveConfigurationCustomizations.qll b/javascript/ql/lib/semmle/javascript/security/CorsPermissiveConfigurationCustomizations.qll index b642b98b35ba..4751ace2a608 100644 --- a/javascript/ql/lib/semmle/javascript/security/CorsPermissiveConfigurationCustomizations.qll +++ b/javascript/ql/lib/semmle/javascript/security/CorsPermissiveConfigurationCustomizations.qll @@ -26,6 +26,7 @@ module CorsPermissiveConfiguration { this = TWildcard() and result = "wildcard" } + /** DEPRECATED: Converts this flow state to a flow label. */ deprecated DataFlow::FlowLabel toFlowLabel() { this = TTaint() and result.isTaint() or @@ -37,6 +38,7 @@ module CorsPermissiveConfiguration { /** Predicates for working with flow states. */ module FlowState { + /** DEPRECATED: Gets a flow state from a flow label. */ deprecated FlowState fromFlowLabel(DataFlow::FlowLabel label) { result.toFlowLabel() = label } /** A tainted value. */ @@ -81,6 +83,7 @@ module CorsPermissiveConfiguration { TrueAndNull() { this = "TrueAndNull" } } + /** DEPRECATED: Gets a flow label representing `true` and `null` values. */ deprecated TrueAndNull truenullLabel() { any() } /** A flow label representing `*` value. */ @@ -88,6 +91,7 @@ module CorsPermissiveConfiguration { Wildcard() { this = "Wildcard" } } + /** DEPRECATED: Gets a flow label representing `*` value. */ deprecated Wildcard wildcardLabel() { any() } /** An overly permissive value for `origin` (Apollo) */ From fd4233e30edc5b828c53f1b4b8cfe76becf154b3 Mon Sep 17 00:00:00 2001 From: Napalys Klicius Date: Thu, 31 Jul 2025 10:53:03 +0200 Subject: [PATCH 012/308] Moved apollo modeling to MaD --- javascript/ql/lib/ext/apollo-server.model.yml | 12 +++++++ .../semmle/javascript/frameworks/Apollo.qll | 36 ------------------- ...sPermissiveConfigurationCustomizations.qll | 4 +-- 3 files changed, 14 insertions(+), 38 deletions(-) delete mode 100644 javascript/ql/lib/semmle/javascript/frameworks/Apollo.qll diff --git a/javascript/ql/lib/ext/apollo-server.model.yml b/javascript/ql/lib/ext/apollo-server.model.yml index ffceb6a6d5af..5962b8ee7d08 100644 --- a/javascript/ql/lib/ext/apollo-server.model.yml +++ b/javascript/ql/lib/ext/apollo-server.model.yml @@ -5,6 +5,12 @@ extensions: data: - ["@apollo/server", "Member[ApolloServer,ApolloServerBase].Argument[0].AnyMember.AnyMember.AnyMember.Parameter[1]", "remote"] + - addsTo: + pack: codeql/javascript-all + extensible: sinkModel + data: + - ["@apollo/server", "Member[gql].Argument[0]", "sql-injection"] + - addsTo: pack: codeql/javascript-all extensible: typeModel @@ -13,3 +19,9 @@ extensions: - ["@apollo/server", "apollo-server-express", ""] - ["@apollo/server", "apollo-server-core", ""] - ["@apollo/server", "apollo-server", ""] + - ["@apollo/server", "@apollo/apollo-server-express", ""] + - ["@apollo/server", "apollo-server-express", ""] + - ["@apollo/server", "@apollo/server", ""] + - ["@apollo/server", "@apollo/apollo-server-core", ""] + - ["ApolloServer", "@apollo/server", "Member[ApolloServer]"] + - ["GraphQLApollo", "@apollo/server", "Member[gql]"] diff --git a/javascript/ql/lib/semmle/javascript/frameworks/Apollo.qll b/javascript/ql/lib/semmle/javascript/frameworks/Apollo.qll deleted file mode 100644 index 983c0a8ac89c..000000000000 --- a/javascript/ql/lib/semmle/javascript/frameworks/Apollo.qll +++ /dev/null @@ -1,36 +0,0 @@ -/** - * Provides classes for working with Apollo GraphQL connectors. - */ - -import javascript - -/** Provides classes modeling the apollo packages [@apollo/server](https://npmjs.com/package/@apollo/server`) */ -module Apollo { - /** Get a reference to the `ApolloServer` class. */ - private API::Node apollo() { - result = - API::moduleImport([ - "@apollo/server", "@apollo/apollo-server-express", "@apollo/apollo-server-core", - "apollo-server", "apollo-server-express" - ]).getMember("ApolloServer") - } - - /** Gets a reference to the `gql` function that parses GraphQL strings. */ - private API::Node gql() { - result = - API::moduleImport([ - "@apollo/server", "@apollo/apollo-server-express", "@apollo/apollo-server-core", - "apollo-server", "apollo-server-express" - ]).getMember("gql") - } - - /** An instantiation of an `ApolloServer`. */ - class ApolloServer extends API::NewNode { - ApolloServer() { this = apollo().getAnInstantiation() } - } - - /** A string that is interpreted as a GraphQL query by a `apollo` package. */ - private class ApolloGraphQLString extends GraphQL::GraphQLString { - ApolloGraphQLString() { this = gql().getACall().getArgument(0) } - } -} diff --git a/javascript/ql/lib/semmle/javascript/security/CorsPermissiveConfigurationCustomizations.qll b/javascript/ql/lib/semmle/javascript/security/CorsPermissiveConfigurationCustomizations.qll index 4751ace2a608..a504f66ba22e 100644 --- a/javascript/ql/lib/semmle/javascript/security/CorsPermissiveConfigurationCustomizations.qll +++ b/javascript/ql/lib/semmle/javascript/security/CorsPermissiveConfigurationCustomizations.qll @@ -5,7 +5,6 @@ */ import javascript -private import semmle.javascript.frameworks.Apollo private import semmle.javascript.frameworks.Cors /** Module containing sources, sinks, and sanitizers for overly permissive CORS configurations. */ @@ -109,7 +108,8 @@ module CorsPermissiveConfiguration { */ class CorsApolloServer extends Sink, DataFlow::ValueNode { CorsApolloServer() { - exists(Apollo::ApolloServer agql | + exists(API::NewNode agql | + agql = ModelOutput::getATypeNode("ApolloServer").getAnInstantiation() and this = agql.getOptionArgument(0, "cors").getALocalSource().getAPropertyWrite("origin").getRhs() ) From 2baca58b278827703fd803889555c71b5bd05a8e Mon Sep 17 00:00:00 2001 From: Napalys Klicius Date: Thu, 31 Jul 2025 11:08:22 +0200 Subject: [PATCH 013/308] Removed deprecations from cors as it was moved out experimental --- ...sPermissiveConfigurationCustomizations.qll | 33 ------------------- .../CorsPermissiveConfigurationQuery.qll | 28 ---------------- 2 files changed, 61 deletions(-) diff --git a/javascript/ql/lib/semmle/javascript/security/CorsPermissiveConfigurationCustomizations.qll b/javascript/ql/lib/semmle/javascript/security/CorsPermissiveConfigurationCustomizations.qll index a504f66ba22e..583847ab0d98 100644 --- a/javascript/ql/lib/semmle/javascript/security/CorsPermissiveConfigurationCustomizations.qll +++ b/javascript/ql/lib/semmle/javascript/security/CorsPermissiveConfigurationCustomizations.qll @@ -24,22 +24,10 @@ module CorsPermissiveConfiguration { or this = TWildcard() and result = "wildcard" } - - /** DEPRECATED: Converts this flow state to a flow label. */ - deprecated DataFlow::FlowLabel toFlowLabel() { - this = TTaint() and result.isTaint() - or - this = TTrueOrNull() and result instanceof TrueAndNull - or - this = TWildcard() and result instanceof Wildcard - } } /** Predicates for working with flow states. */ module FlowState { - /** DEPRECATED: Gets a flow state from a flow label. */ - deprecated FlowState fromFlowLabel(DataFlow::FlowLabel label) { result.toFlowLabel() = label } - /** A tainted value. */ FlowState taint() { result = TTaint() } @@ -65,11 +53,6 @@ module CorsPermissiveConfiguration { */ abstract class Sanitizer extends DataFlow::Node { } - /** - * DEPRECATED: Use `ActiveThreatModelSource` from Concepts instead! - */ - deprecated class RemoteFlowSourceAsSource = ActiveThreatModelSourceAsSource; - /** * An active threat-model source, considered as a flow source. */ @@ -77,22 +60,6 @@ module CorsPermissiveConfiguration { ActiveThreatModelSourceAsSource() { not this instanceof ClientSideRemoteFlowSource } } - /** A flow label representing `true` and `null` values. */ - abstract deprecated class TrueAndNull extends DataFlow::FlowLabel { - TrueAndNull() { this = "TrueAndNull" } - } - - /** DEPRECATED: Gets a flow label representing `true` and `null` values. */ - deprecated TrueAndNull truenullLabel() { any() } - - /** A flow label representing `*` value. */ - abstract deprecated class Wildcard extends DataFlow::FlowLabel { - Wildcard() { this = "Wildcard" } - } - - /** DEPRECATED: Gets a flow label representing `*` value. */ - deprecated Wildcard wildcardLabel() { any() } - /** An overly permissive value for `origin` (Apollo) */ class TrueNullValue extends Source { TrueNullValue() { this.mayHaveBooleanValue(true) or this.asExpr() instanceof NullLiteral } diff --git a/javascript/ql/lib/semmle/javascript/security/CorsPermissiveConfigurationQuery.qll b/javascript/ql/lib/semmle/javascript/security/CorsPermissiveConfigurationQuery.qll index 3605a1adaa93..0db678e43afd 100644 --- a/javascript/ql/lib/semmle/javascript/security/CorsPermissiveConfigurationQuery.qll +++ b/javascript/ql/lib/semmle/javascript/security/CorsPermissiveConfigurationQuery.qll @@ -39,31 +39,3 @@ module CorsPermissiveConfigurationConfig implements DataFlow::StateConfigSig { module CorsPermissiveConfigurationFlow = TaintTracking::GlobalWithState; - -/** - * DEPRECATED. Use the `CorsPermissiveConfigurationFlow` module instead. - */ -deprecated class Configuration extends TaintTracking::Configuration { - Configuration() { this = "CorsPermissiveConfiguration" } - - override predicate isSource(DataFlow::Node source, DataFlow::FlowLabel label) { - CorsPermissiveConfigurationConfig::isSource(source, FlowState::fromFlowLabel(label)) - } - - override predicate isSink(DataFlow::Node sink, DataFlow::FlowLabel label) { - CorsPermissiveConfigurationConfig::isSink(sink, FlowState::fromFlowLabel(label)) - } - - override predicate isSanitizer(DataFlow::Node node) { - super.isSanitizer(node) or - CorsPermissiveConfigurationConfig::isBarrier(node) - } -} - -deprecated private class WildcardActivated extends DataFlow::FlowLabel, Wildcard { - WildcardActivated() { this = this } -} - -deprecated private class TrueAndNullActivated extends DataFlow::FlowLabel, TrueAndNull { - TrueAndNullActivated() { this = this } -} From 791a7e242e5ca1e9ad68c21a49cd76730bdb0370 Mon Sep 17 00:00:00 2001 From: Napalys Klicius Date: Thu, 31 Jul 2025 11:31:10 +0200 Subject: [PATCH 014/308] Updated qhelp for cors permissive configuration --- .../CWE-942/CorsPermissiveConfiguration.qhelp | 92 ++++++++++--------- 1 file changed, 47 insertions(+), 45 deletions(-) diff --git a/javascript/ql/src/Security/CWE-942/CorsPermissiveConfiguration.qhelp b/javascript/ql/src/Security/CWE-942/CorsPermissiveConfiguration.qhelp index fc79eee743bf..04796dfbc189 100644 --- a/javascript/ql/src/Security/CWE-942/CorsPermissiveConfiguration.qhelp +++ b/javascript/ql/src/Security/CWE-942/CorsPermissiveConfiguration.qhelp @@ -3,69 +3,71 @@ "qhelp.dtd"> - -

+ +

- A server can use CORS (Cross-Origin Resource Sharing) to relax the - restrictions imposed by the SOP (Same-Origin Policy), allowing controlled, secure - cross-origin requests when necessary. + A server can use CORS (Cross-Origin Resource Sharing) to relax the + restrictions imposed by the Same-Origin Policy, allowing controlled, secure + cross-origin requests when necessary. - A server with an overly permissive CORS configuration may inadvertently - expose sensitive data or lead to CSRF which is an attack that allows attackers to trick - users into performing unwanted operations in websites they're authenticated to. +

+

-

+ A server with an overly permissive CORS configuration may inadvertently + expose sensitive data or enable CSRF attacks, which allow attackers to trick + users into performing unwanted operations on websites they're authenticated to. -
+

+ - -

+ +

- When the origin is set to true, it signifies that the server - is accepting requests from any origin, potentially exposing the system to - CSRF attacks. This can be fixed using false as origin value or using a whitelist. + When the origin is set to true, the server + accepts requests from any origin, potentially exposing the system to + CSRF attacks. Use false as the origin value or implement a whitelist + of allowed origins instead. -

-

+

+

- On the other hand, if the origin is - set to null, it can be exploited by an attacker to deceive a user into making - requests from a null origin form, often hosted within a sandboxed iframe. + When the origin is set to null, it can be + exploited by an attacker who can deceive a user into making + requests from a null origin, often hosted within a sandboxed iframe. -

+

+

-

+ If the origin value is user-controlled, ensure that the data + is properly sanitized and validated against a whitelist of allowed origins. - If the origin value is user controlled, make sure that the data - is properly sanitized. +

+
-

- + +

- -

+ In the following example, server_1 accepts requests from any origin + because the value of origin is set to true. + server_2 uses user-controlled data for the origin without validation. - In the example below, the server_1 accepts requests from any origin - since the value of origin is set to true. - And server_2's origin is user-controlled. +

-

+ - +

-

+ To fix these issues, server_1 uses a restrictive CORS configuration + that is not vulnerable to CSRF attacks. server_2 properly validates + user-controlled data against a whitelist before using it. - In the example below, the server_1 CORS is restrictive so it's not - vulnerable to CSRF attacks. And server_2's is using properly sanitized - user-controlled data. +

-

+ +
- - - - -
  • Mozilla Developer Network: CORS, Access-Control-Allow-Origin.
  • -
  • W3C: CORS for developers, Advice for Resource Owners
  • -
    + +
  • Mozilla Developer Network: CORS, Access-Control-Allow-Origin.
  • +
  • W3C: CORS for developers, Advice for Resource Owners.
  • +
    From 021aa13ee2d544de36bcb26f16857c9c085401d2 Mon Sep 17 00:00:00 2001 From: Napalys Klicius Date: Thu, 31 Jul 2025 12:45:34 +0200 Subject: [PATCH 015/308] Added change note --- .../change-notes/2025-07-31-cors-move-out-of-experimental.md | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 javascript/ql/src/change-notes/2025-07-31-cors-move-out-of-experimental.md diff --git a/javascript/ql/src/change-notes/2025-07-31-cors-move-out-of-experimental.md b/javascript/ql/src/change-notes/2025-07-31-cors-move-out-of-experimental.md new file mode 100644 index 000000000000..112fb0c628ff --- /dev/null +++ b/javascript/ql/src/change-notes/2025-07-31-cors-move-out-of-experimental.md @@ -0,0 +1,4 @@ +--- +category: minorAnalysis +--- +* The query "CORS misconfiguration" (`js/cors-misconfiguration`) has been promoted from experimental and is now part of the default security suite. From 9cc6e9c8a9efdd646aa0a20db70c1348d91dc57f Mon Sep 17 00:00:00 2001 From: Kasper Svendsen Date: Mon, 25 Aug 2025 15:00:01 +0200 Subject: [PATCH 016/308] Overlay: Add discarding for Java classes, interfaces & fields --- java/ql/lib/semmle/code/java/Member.qll | 3 +++ java/ql/lib/semmle/code/java/Type.qll | 5 +++++ 2 files changed, 8 insertions(+) diff --git a/java/ql/lib/semmle/code/java/Member.qll b/java/ql/lib/semmle/code/java/Member.qll index 7d84dbd379d0..17fe696972f6 100644 --- a/java/ql/lib/semmle/code/java/Member.qll +++ b/java/ql/lib/semmle/code/java/Member.qll @@ -848,6 +848,9 @@ class Field extends Member, ExprParent, @field, Variable { override string getAPrimaryQlClass() { result = "Field" } } +overlay[local] +private class DiscardableField extends DiscardableReferableLocatable, @field { } + /** An instance field. */ class InstanceField extends Field { InstanceField() { not this.isStatic() } diff --git a/java/ql/lib/semmle/code/java/Type.qll b/java/ql/lib/semmle/code/java/Type.qll index dd646e74285c..345643e13433 100644 --- a/java/ql/lib/semmle/code/java/Type.qll +++ b/java/ql/lib/semmle/code/java/Type.qll @@ -15,6 +15,7 @@ module; import Member import Modifier import JDK +private import semmle.code.java.Overlay /** * Holds if reference type `t` is an immediate super-type of `sub`. @@ -998,6 +999,10 @@ class ClassOrInterface extends RefType, @classorinterface { CompanionObject getCompanionObject() { type_companion_object(this, _, result) } } +overlay[local] +private class DiscardableClassOrInterface extends DiscardableReferableLocatable, @classorinterface { +} + private string getAPublicObjectMethodSignature() { exists(Method m | m.getDeclaringType() instanceof TypeObject and From 10c10c7d30cdd8bff78677840d5accf6cfe12a47 Mon Sep 17 00:00:00 2001 From: Napalys Klicius Date: Wed, 27 Aug 2025 10:17:39 +0000 Subject: [PATCH 017/308] JS: fixed typo in folder name --- .../RemotePropertyInjection.expected | 0 .../RemotePropertyInjection.qlref | 0 .../{RemovePropertyInjection => RemotePropertyInjection}/tst.js | 0 .../tstNonExpr.js | 0 4 files changed, 0 insertions(+), 0 deletions(-) rename javascript/ql/test/query-tests/Security/CWE-400/{RemovePropertyInjection => RemotePropertyInjection}/RemotePropertyInjection.expected (100%) rename javascript/ql/test/query-tests/Security/CWE-400/{RemovePropertyInjection => RemotePropertyInjection}/RemotePropertyInjection.qlref (100%) rename javascript/ql/test/query-tests/Security/CWE-400/{RemovePropertyInjection => RemotePropertyInjection}/tst.js (100%) rename javascript/ql/test/query-tests/Security/CWE-400/{RemovePropertyInjection => RemotePropertyInjection}/tstNonExpr.js (100%) diff --git a/javascript/ql/test/query-tests/Security/CWE-400/RemovePropertyInjection/RemotePropertyInjection.expected b/javascript/ql/test/query-tests/Security/CWE-400/RemotePropertyInjection/RemotePropertyInjection.expected similarity index 100% rename from javascript/ql/test/query-tests/Security/CWE-400/RemovePropertyInjection/RemotePropertyInjection.expected rename to javascript/ql/test/query-tests/Security/CWE-400/RemotePropertyInjection/RemotePropertyInjection.expected diff --git a/javascript/ql/test/query-tests/Security/CWE-400/RemovePropertyInjection/RemotePropertyInjection.qlref b/javascript/ql/test/query-tests/Security/CWE-400/RemotePropertyInjection/RemotePropertyInjection.qlref similarity index 100% rename from javascript/ql/test/query-tests/Security/CWE-400/RemovePropertyInjection/RemotePropertyInjection.qlref rename to javascript/ql/test/query-tests/Security/CWE-400/RemotePropertyInjection/RemotePropertyInjection.qlref diff --git a/javascript/ql/test/query-tests/Security/CWE-400/RemovePropertyInjection/tst.js b/javascript/ql/test/query-tests/Security/CWE-400/RemotePropertyInjection/tst.js similarity index 100% rename from javascript/ql/test/query-tests/Security/CWE-400/RemovePropertyInjection/tst.js rename to javascript/ql/test/query-tests/Security/CWE-400/RemotePropertyInjection/tst.js diff --git a/javascript/ql/test/query-tests/Security/CWE-400/RemovePropertyInjection/tstNonExpr.js b/javascript/ql/test/query-tests/Security/CWE-400/RemotePropertyInjection/tstNonExpr.js similarity index 100% rename from javascript/ql/test/query-tests/Security/CWE-400/RemovePropertyInjection/tstNonExpr.js rename to javascript/ql/test/query-tests/Security/CWE-400/RemotePropertyInjection/tstNonExpr.js From c39c04cb86c074ae2684c5997bf13d4728cd1d3c Mon Sep 17 00:00:00 2001 From: Napalys Klicius Date: Wed, 27 Aug 2025 10:20:38 +0000 Subject: [PATCH 018/308] JS: added new test case for remote prop injection via `Object.keys` --- .../RemotePropertyInjection.expected | 22 +++++++++---------- .../CWE-400/RemotePropertyInjection/tst.js | 9 ++++++-- 2 files changed, 18 insertions(+), 13 deletions(-) diff --git a/javascript/ql/test/query-tests/Security/CWE-400/RemotePropertyInjection/RemotePropertyInjection.expected b/javascript/ql/test/query-tests/Security/CWE-400/RemotePropertyInjection/RemotePropertyInjection.expected index 9b486b593330..0352205e30b7 100644 --- a/javascript/ql/test/query-tests/Security/CWE-400/RemotePropertyInjection/RemotePropertyInjection.expected +++ b/javascript/ql/test/query-tests/Security/CWE-400/RemotePropertyInjection/RemotePropertyInjection.expected @@ -11,11 +11,11 @@ edges | tst.js:8:6:8:52 | prop | tst.js:16:10:16:13 | prop | provenance | | | tst.js:8:13:8:52 | myCoolL ... rolled) | tst.js:8:6:8:52 | prop | provenance | | | tst.js:8:28:8:51 | req.que ... trolled | tst.js:8:13:8:52 | myCoolL ... rolled) | provenance | | -| tst.js:8:28:8:51 | req.que ... trolled | tst.js:21:25:21:25 | x | provenance | | -| tst.js:21:25:21:25 | x | tst.js:22:15:22:15 | x | provenance | | -| tst.js:22:6:22:15 | result | tst.js:23:9:23:14 | result | provenance | | -| tst.js:22:15:22:15 | x | tst.js:22:6:22:15 | result | provenance | | -| tst.js:23:9:23:14 | result | tst.js:23:9:23:42 | result. ... length) | provenance | | +| tst.js:8:28:8:51 | req.que ... trolled | tst.js:27:25:27:25 | x | provenance | | +| tst.js:27:25:27:25 | x | tst.js:28:15:28:15 | x | provenance | | +| tst.js:28:6:28:15 | result | tst.js:29:9:29:14 | result | provenance | | +| tst.js:28:15:28:15 | x | tst.js:28:6:28:15 | result | provenance | | +| tst.js:29:9:29:14 | result | tst.js:29:9:29:42 | result. ... length) | provenance | | | tstNonExpr.js:5:7:5:23 | userVal | tstNonExpr.js:8:17:8:23 | userVal | provenance | | | tstNonExpr.js:5:17:5:23 | req.url | tstNonExpr.js:5:7:5:23 | userVal | provenance | | nodes @@ -26,13 +26,13 @@ nodes | tst.js:13:15:13:18 | prop | semmle.label | prop | | tst.js:14:31:14:34 | prop | semmle.label | prop | | tst.js:16:10:16:13 | prop | semmle.label | prop | -| tst.js:21:25:21:25 | x | semmle.label | x | -| tst.js:22:6:22:15 | result | semmle.label | result | -| tst.js:22:15:22:15 | x | semmle.label | x | -| tst.js:23:9:23:14 | result | semmle.label | result | -| tst.js:23:9:23:42 | result. ... length) | semmle.label | result. ... length) | +| tst.js:27:25:27:25 | x | semmle.label | x | +| tst.js:28:6:28:15 | result | semmle.label | result | +| tst.js:28:15:28:15 | x | semmle.label | x | +| tst.js:29:9:29:14 | result | semmle.label | result | +| tst.js:29:9:29:42 | result. ... length) | semmle.label | result. ... length) | | tstNonExpr.js:5:7:5:23 | userVal | semmle.label | userVal | | tstNonExpr.js:5:17:5:23 | req.url | semmle.label | req.url | | tstNonExpr.js:8:17:8:23 | userVal | semmle.label | userVal | subpaths -| tst.js:8:28:8:51 | req.que ... trolled | tst.js:21:25:21:25 | x | tst.js:23:9:23:42 | result. ... length) | tst.js:8:13:8:52 | myCoolL ... rolled) | +| tst.js:8:28:8:51 | req.que ... trolled | tst.js:27:25:27:25 | x | tst.js:29:9:29:42 | result. ... length) | tst.js:8:13:8:52 | myCoolL ... rolled) | diff --git a/javascript/ql/test/query-tests/Security/CWE-400/RemotePropertyInjection/tst.js b/javascript/ql/test/query-tests/Security/CWE-400/RemotePropertyInjection/tst.js index 301b7b808810..122e9a4c51f0 100644 --- a/javascript/ql/test/query-tests/Security/CWE-400/RemotePropertyInjection/tst.js +++ b/javascript/ql/test/query-tests/Security/CWE-400/RemotePropertyInjection/tst.js @@ -16,10 +16,15 @@ app.get('/user/:id', function(req, res) { headers[prop] = 42; // $ Alert res.set(headers); myCoolLocalFct[req.query.x](); // OK - flagged by method name injection + + Object.keys(req.body).forEach( // $ MISSING: Source + key => { + myObj[key] = 42; // $ MISSING: Alert + } + ); }); function myCoolLocalFct(x) { var result = x; return result.substring(0, result.length); - -} \ No newline at end of file +} From 32606584ea6bd70063371eef0a47c7a645c3e6ae Mon Sep 17 00:00:00 2001 From: Napalys Klicius Date: Wed, 27 Aug 2025 10:23:03 +0000 Subject: [PATCH 019/308] JS: add enumeration taint flow to Remote Property Injection query --- .../security/dataflow/RemotePropertyInjectionQuery.qll | 5 +++++ .../RemotePropertyInjection.expected | 6 ++++++ .../Security/CWE-400/RemotePropertyInjection/tst.js | 4 ++-- 3 files changed, 13 insertions(+), 2 deletions(-) diff --git a/javascript/ql/lib/semmle/javascript/security/dataflow/RemotePropertyInjectionQuery.qll b/javascript/ql/lib/semmle/javascript/security/dataflow/RemotePropertyInjectionQuery.qll index 8f1f174d8ecf..f338651b63de 100644 --- a/javascript/ql/lib/semmle/javascript/security/dataflow/RemotePropertyInjectionQuery.qll +++ b/javascript/ql/lib/semmle/javascript/security/dataflow/RemotePropertyInjectionQuery.qll @@ -10,6 +10,7 @@ import javascript import RemotePropertyInjectionCustomizations::RemotePropertyInjection +private import semmle.javascript.DynamicPropertyAccess /** * A taint-tracking configuration for reasoning about remote property injection. @@ -24,6 +25,10 @@ module RemotePropertyInjectionConfig implements DataFlow::ConfigSig { node = StringConcatenation::getRoot(any(ConstantString str).flow()) } + predicate isAdditionalFlowStep(DataFlow::Node node1, DataFlow::Node node2) { + node1 = node2.(EnumeratedPropName).getSourceObject() + } + predicate observeDiffInformedIncrementalMode() { any() } } diff --git a/javascript/ql/test/query-tests/Security/CWE-400/RemotePropertyInjection/RemotePropertyInjection.expected b/javascript/ql/test/query-tests/Security/CWE-400/RemotePropertyInjection/RemotePropertyInjection.expected index 0352205e30b7..7021d9b04d11 100644 --- a/javascript/ql/test/query-tests/Security/CWE-400/RemotePropertyInjection/RemotePropertyInjection.expected +++ b/javascript/ql/test/query-tests/Security/CWE-400/RemotePropertyInjection/RemotePropertyInjection.expected @@ -3,6 +3,7 @@ | tst.js:13:15:13:18 | prop | tst.js:8:28:8:51 | req.que ... trolled | tst.js:13:15:13:18 | prop | A property name to write to depends on a $@. | tst.js:8:28:8:51 | req.que ... trolled | user-provided value | | tst.js:14:31:14:34 | prop | tst.js:8:28:8:51 | req.que ... trolled | tst.js:14:31:14:34 | prop | A property name to write to depends on a $@. | tst.js:8:28:8:51 | req.que ... trolled | user-provided value | | tst.js:16:10:16:13 | prop | tst.js:8:28:8:51 | req.que ... trolled | tst.js:16:10:16:13 | prop | A property name to write to depends on a $@. | tst.js:8:28:8:51 | req.que ... trolled | user-provided value | +| tst.js:22:10:22:12 | key | tst.js:20:14:20:21 | req.body | tst.js:22:10:22:12 | key | A property name to write to depends on a $@. | tst.js:20:14:20:21 | req.body | user-provided value | | tstNonExpr.js:8:17:8:23 | userVal | tstNonExpr.js:5:17:5:23 | req.url | tstNonExpr.js:8:17:8:23 | userVal | A header name depends on a $@. | tstNonExpr.js:5:17:5:23 | req.url | user-provided value | edges | tst.js:8:6:8:52 | prop | tst.js:9:8:9:11 | prop | provenance | | @@ -12,6 +13,8 @@ edges | tst.js:8:13:8:52 | myCoolL ... rolled) | tst.js:8:6:8:52 | prop | provenance | | | tst.js:8:28:8:51 | req.que ... trolled | tst.js:8:13:8:52 | myCoolL ... rolled) | provenance | | | tst.js:8:28:8:51 | req.que ... trolled | tst.js:27:25:27:25 | x | provenance | | +| tst.js:20:14:20:21 | req.body | tst.js:21:3:21:5 | key | provenance | Config | +| tst.js:21:3:21:5 | key | tst.js:22:10:22:12 | key | provenance | | | tst.js:27:25:27:25 | x | tst.js:28:15:28:15 | x | provenance | | | tst.js:28:6:28:15 | result | tst.js:29:9:29:14 | result | provenance | | | tst.js:28:15:28:15 | x | tst.js:28:6:28:15 | result | provenance | | @@ -26,6 +29,9 @@ nodes | tst.js:13:15:13:18 | prop | semmle.label | prop | | tst.js:14:31:14:34 | prop | semmle.label | prop | | tst.js:16:10:16:13 | prop | semmle.label | prop | +| tst.js:20:14:20:21 | req.body | semmle.label | req.body | +| tst.js:21:3:21:5 | key | semmle.label | key | +| tst.js:22:10:22:12 | key | semmle.label | key | | tst.js:27:25:27:25 | x | semmle.label | x | | tst.js:28:6:28:15 | result | semmle.label | result | | tst.js:28:15:28:15 | x | semmle.label | x | diff --git a/javascript/ql/test/query-tests/Security/CWE-400/RemotePropertyInjection/tst.js b/javascript/ql/test/query-tests/Security/CWE-400/RemotePropertyInjection/tst.js index 122e9a4c51f0..ebdb07a758b1 100644 --- a/javascript/ql/test/query-tests/Security/CWE-400/RemotePropertyInjection/tst.js +++ b/javascript/ql/test/query-tests/Security/CWE-400/RemotePropertyInjection/tst.js @@ -17,9 +17,9 @@ app.get('/user/:id', function(req, res) { res.set(headers); myCoolLocalFct[req.query.x](); // OK - flagged by method name injection - Object.keys(req.body).forEach( // $ MISSING: Source + Object.keys(req.body).forEach( // $ Source key => { - myObj[key] = 42; // $ MISSING: Alert + myObj[key] = 42; // $ Alert } ); }); From e0916c8750b4f0d72092a390eb85335c2d9e621b Mon Sep 17 00:00:00 2001 From: Napalys Klicius Date: Wed, 27 Aug 2025 10:32:45 +0000 Subject: [PATCH 020/308] JS: add change note --- .../2025-08-27-remote-property-injection-update.md | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 javascript/ql/src/change-notes/2025-08-27-remote-property-injection-update.md diff --git a/javascript/ql/src/change-notes/2025-08-27-remote-property-injection-update.md b/javascript/ql/src/change-notes/2025-08-27-remote-property-injection-update.md new file mode 100644 index 000000000000..17fe6123cceb --- /dev/null +++ b/javascript/ql/src/change-notes/2025-08-27-remote-property-injection-update.md @@ -0,0 +1,4 @@ +--- +category: minorAnalysis +--- +* The query `js/remote-property-injection` now detects property injection vulnerabilities through object enumeration patterns such as `Object.keys()`. \ No newline at end of file From 57b4534d30f22b92dcfdeb885588e9e1258d1b37 Mon Sep 17 00:00:00 2001 From: Asger F Date: Thu, 28 Aug 2025 13:35:28 +0200 Subject: [PATCH 021/308] JS: Avoid overriding Expr predicates in xUnit.qll --- .../ql/lib/semmle/javascript/frameworks/xUnit.qll | 13 +++++++++++-- .../library-tests/frameworks/xUnit/tests.expected | 6 +++--- 2 files changed, 14 insertions(+), 5 deletions(-) diff --git a/javascript/ql/lib/semmle/javascript/frameworks/xUnit.qll b/javascript/ql/lib/semmle/javascript/frameworks/xUnit.qll index 92458cd87afe..be64f243e46f 100644 --- a/javascript/ql/lib/semmle/javascript/frameworks/xUnit.qll +++ b/javascript/ql/lib/semmle/javascript/frameworks/xUnit.qll @@ -23,6 +23,8 @@ private predicate possiblyAttribute(Expr e, string name) { ) } +final private class FinalExpr = Expr; + /** * A bracketed list of expressions. * @@ -34,15 +36,22 @@ private predicate possiblyAttribute(Expr e, string name) { * * We also allow singleton lists, as in `[a][b]`. */ -abstract private class BracketedListOfExpressions extends Expr { +abstract private class BracketedListOfExpressions extends FinalExpr { /** Gets the `i`th element expression of this list. */ abstract Expr getElement(int i); + + /** Gets the first token in this bracketed list of expressions */ + Token getFirstToken() { result = Expr.super.getFirstToken() } + + /** Gets the last token in this bracketed list of expressions */ + Token getLastToken() { result = Expr.super.getLastToken() } } /** * An array expression viewed as a bracketed list of expressions. */ -private class ArrayExprIsABracketedListOfExpressions extends ArrayExpr, BracketedListOfExpressions { +private class ArrayExprIsABracketedListOfExpressions extends BracketedListOfExpressions instanceof ArrayExpr +{ /** Gets the `i`th element of this array literal. */ override Expr getElement(int i) { result = ArrayExpr.super.getElement(i) } } diff --git a/javascript/ql/test/library-tests/frameworks/xUnit/tests.expected b/javascript/ql/test/library-tests/frameworks/xUnit/tests.expected index 5d30921408b5..266e9e31e6ff 100644 --- a/javascript/ql/test/library-tests/frameworks/xUnit/tests.expected +++ b/javascript/ql/test/library-tests/frameworks/xUnit/tests.expected @@ -3,10 +3,10 @@ xUnitAnnotationfrom | tst.js:5:5:5:13 | [Fixture] | tst.js:6:5:13:5 | functio ... }\\n } | | tst.js:7:9:7:14 | [Fact] | tst.js:8:9:12:9 | functio ... } | | tst.js:16:1:16:43 | [Import ... t.js")] | tst.js:18:1:22:2 | Test.xU ... ..]\\n\\n}; | -| tst.js:17:1:17:9 | Fixture | tst.js:18:1:22:2 | Test.xU ... ..]\\n\\n}; | +| tst.js:17:2:17:8 | Fixture | tst.js:18:1:22:2 | Test.xU ... ..]\\n\\n}; | | tst.js:24:1:24:9 | [Fixture] | tst.js:25:1:34:2 | Test.Ex ... }\\n}; | | tst.js:27:5:29:7 | [Import ... })] | tst.js:31:5:33:5 | functio ... ]\\n } | -| tst.js:30:5:30:10 | Fact | tst.js:31:5:33:5 | functio ... ]\\n } | +| tst.js:30:6:30:9 | Fact | tst.js:31:5:33:5 | functio ... ]\\n } | xUnitAttribute | tst.js:3:2:3:8 | Fixture | Fixture | 0 | | tst.js:5:6:5:12 | Fixture | Fixture | 0 | @@ -24,7 +24,7 @@ xUnitFixture | tst.js:4:20:14:1 | functio ... }\\n} | tst.js:3:1:3:9 | [Fixture] | | tst.js:6:5:13:5 | functio ... }\\n } | tst.js:5:5:5:13 | [Fixture] | | tst.js:18:24:22:1 | functio ... ...]\\n\\n} | tst.js:16:1:16:43 | [Import ... t.js")] | -| tst.js:18:24:22:1 | functio ... ...]\\n\\n} | tst.js:17:1:17:9 | Fixture | +| tst.js:18:24:22:1 | functio ... ...]\\n\\n} | tst.js:17:2:17:8 | Fixture | | tst.js:25:21:34:1 | functio ... }\\n} | tst.js:24:1:24:9 | [Fixture] | xUnitTarget | tst.js:4:1:14:2 | Test.Ex ... }\\n}; | From 67dc01b636c6ed5bcd41635b2aae68123219d4f3 Mon Sep 17 00:00:00 2001 From: Henry Mercer Date: Fri, 29 Aug 2025 18:05:47 +0100 Subject: [PATCH 022/308] Actions: Add successfully extracted files query --- .../src/Diagnostics/SuccessfullyExtractedFiles.ql | 13 +++++++++++++ 1 file changed, 13 insertions(+) create mode 100644 actions/ql/src/Diagnostics/SuccessfullyExtractedFiles.ql diff --git a/actions/ql/src/Diagnostics/SuccessfullyExtractedFiles.ql b/actions/ql/src/Diagnostics/SuccessfullyExtractedFiles.ql new file mode 100644 index 000000000000..eebf889a3885 --- /dev/null +++ b/actions/ql/src/Diagnostics/SuccessfullyExtractedFiles.ql @@ -0,0 +1,13 @@ +/** + * @id actions/diagnostics/successfully-extracted-files + * @name Extracted files + * @description List all files that were extracted. + * @kind diagnostic + * @tags successfully-extracted-files + */ + +private import codeql.Locations + +from File f +where exists(f.getRelativePath()) +select f, "" From 71bac5eda88d29c02e6c3400bb3b6cf854e5c19d Mon Sep 17 00:00:00 2001 From: Henry Mercer Date: Fri, 29 Aug 2025 20:10:20 +0100 Subject: [PATCH 023/308] Actions: Add file coverage baseline --- actions/extractor/codeql-extractor.yml | 3 ++- actions/extractor/tools/baseline-config.json | 10 ++++++++++ actions/extractor/tools/configure-baseline.cmd | 2 ++ actions/extractor/tools/configure-baseline.sh | 3 +++ 4 files changed, 17 insertions(+), 1 deletion(-) create mode 100644 actions/extractor/tools/baseline-config.json create mode 100755 actions/extractor/tools/configure-baseline.cmd create mode 100755 actions/extractor/tools/configure-baseline.sh diff --git a/actions/extractor/codeql-extractor.yml b/actions/extractor/codeql-extractor.yml index ab7374910054..ed3d54173234 100644 --- a/actions/extractor/codeql-extractor.yml +++ b/actions/extractor/codeql-extractor.yml @@ -8,7 +8,8 @@ build_modes: - none file_coverage_languages: [] github_api_languages: [] -scc_languages: [] +scc_languages: + - YAML file_types: - name: workflow display_name: GitHub Actions workflow files diff --git a/actions/extractor/tools/baseline-config.json b/actions/extractor/tools/baseline-config.json new file mode 100644 index 000000000000..fde0bd1ecdff --- /dev/null +++ b/actions/extractor/tools/baseline-config.json @@ -0,0 +1,10 @@ +{ + "paths": [ + ".github/workflows/*.yml", + ".github/workflows/*.yaml", + ".github/reusable_workflows/**/*.yml", + ".github/reusable_workflows/**/*.yaml", + "**/action.yml", + "**/action.yaml" + ] +} diff --git a/actions/extractor/tools/configure-baseline.cmd b/actions/extractor/tools/configure-baseline.cmd new file mode 100755 index 000000000000..b9c1b3f7a028 --- /dev/null +++ b/actions/extractor/tools/configure-baseline.cmd @@ -0,0 +1,2 @@ +@echo off +type "%CODEQL_EXTRACTOR_ACTIONS_ROOT%\tools\baseline-config.json" diff --git a/actions/extractor/tools/configure-baseline.sh b/actions/extractor/tools/configure-baseline.sh new file mode 100755 index 000000000000..6fd7605ef3f9 --- /dev/null +++ b/actions/extractor/tools/configure-baseline.sh @@ -0,0 +1,3 @@ +#!/bin/sh + +cat "$CODEQL_EXTRACTOR_ACTIONS_ROOT/tools/baseline-config.json" From 8434dc3890801b7584a99f5becd552bbfeda3514 Mon Sep 17 00:00:00 2001 From: Anders Schack-Mulligen Date: Wed, 27 Aug 2025 12:55:18 +0200 Subject: [PATCH 024/308] Controlflow: Add a shared SuccessorType implementation. --- .../codeql/controlflow/SuccessorType.qll | 341 ++++++++++++++++++ 1 file changed, 341 insertions(+) create mode 100644 shared/controlflow/codeql/controlflow/SuccessorType.qll diff --git a/shared/controlflow/codeql/controlflow/SuccessorType.qll b/shared/controlflow/codeql/controlflow/SuccessorType.qll new file mode 100644 index 000000000000..029d52f5cb74 --- /dev/null +++ b/shared/controlflow/codeql/controlflow/SuccessorType.qll @@ -0,0 +1,341 @@ +/** + * Provides different types of control flow successor types. These are used as + * edge labels in the control flow graph. + */ +overlay[local] +module; + +private import codeql.util.Boolean + +/* + * SuccessorType + * |- NormalSuccessor + * | |- DirectSuccessor + * | \- ConditionalSuccessor + * | |- BooleanSuccessor + * | |- NullnessSuccessor + * | |- MatchingSuccessor + * | \- EmptinessSuccessor + * \- AbruptSuccessor + * |- ExceptionSuccessor + * |- ReturnSuccessor + * |- ExitSuccessor (program termination) + * \- JumpSuccessor + * |- BreakSuccessor + * |- ContinueSuccessor + * |- GotoSuccessor + * |- RedoSuccessor // rare, used in Ruby + * |- RetrySuccessor // rare, used in Ruby + * \- JavaYieldSuccessor + */ + +private newtype TSuccessorType = + TDirectSuccessor() or + TBooleanSuccessor(Boolean branch) or + TNullnessSuccessor(Boolean isNull) or + TMatchingSuccessor(Boolean isMatch) or + TEmptinessSuccessor(Boolean isEmpty) or + TExceptionSuccessor() or + TReturnSuccessor() or + TExitSuccessor() or + TBreakSuccessor() or + TContinueSuccessor() or + TGotoSuccessor() or + TRedoSuccessor() or + TRetrySuccessor() or + TJavaYieldSuccessor() + +/** + * The type of a control flow successor. + * + * A successor is either normal, which covers direct and conditional + * successors, or abrupt, which covers all other types of successors including + * for example exceptions, returns, and other jumps. + */ +class SuccessorType extends TSuccessorType { + /** Gets a textual representation of this successor type. */ + abstract string toString(); +} + +private class TNormalSuccessor = TDirectSuccessor or TConditionalSuccessor; + +/** + * A normal control flow successor. This is either a direct or a conditional + * successor. + */ +abstract class NormalSuccessor extends SuccessorType, TNormalSuccessor { } + +/** A direct control flow successor. */ +class DirectSuccessor extends NormalSuccessor, TDirectSuccessor { + override string toString() { result = "successor" } +} + +private class TConditionalSuccessor = + TBooleanSuccessor or TMatchingSuccessor or TNullnessSuccessor or TEmptinessSuccessor; + +/** + * A conditional control flow successor. Either a Boolean successor (`BooleanSuccessor`), + * a nullness successor (`NullnessSuccessor`), a matching successor (`MatchingSuccessor`), + * or an emptiness successor (`EmptinessSuccessor`). + */ +abstract class ConditionalSuccessor extends NormalSuccessor, TConditionalSuccessor { + /** Gets the Boolean value of this successor. */ + abstract boolean getValue(); +} + +/** + * A Boolean control flow successor. + * + * For example, this program fragment: + * + * ```csharp + * if (x < 0) + * return 0; + * else + * return 1; + * ``` + * + * has a control flow graph containing Boolean successors: + * + * ``` + * if + * | + * x < 0 + * / \ + * / \ + * / \ + * true false + * | \ + * return 0 return 1 + * ``` + */ +class BooleanSuccessor extends ConditionalSuccessor, TBooleanSuccessor { + override boolean getValue() { this = TBooleanSuccessor(result) } + + override string toString() { result = this.getValue().toString() } +} + +/** + * A nullness control flow successor. + * + * For example, this program fragment: + * + * ```csharp + * int? M(string s) => s?.Length; + * ``` + * + * has a control flow graph containing nullness successors: + * + * ``` + * enter M + * | + * s + * / \ + * / \ + * / \ + * null non-null + * \ | + * \ Length + * \ / + * \ / + * exit M + * ``` + */ +class NullnessSuccessor extends ConditionalSuccessor, TNullnessSuccessor { + /** Holds if this is a `null` successor. */ + predicate isNull() { this = TNullnessSuccessor(true) } + + override boolean getValue() { this = TNullnessSuccessor(result) } + + override string toString() { if this.isNull() then result = "null" else result = "non-null" } +} + +/** + * A matching control flow successor. + * + * For example, this program fragment: + * + * ```csharp + * switch (x) { + * case 0 : + * return 0; + * default : + * return 1; + * } + * ``` + * + * has a control flow graph containing matching successors: + * + * ``` + * switch + * | + * x + * | + * case 0 + * / \ + * / \ + * / \ + * match no-match + * | \ + * return 0 default + * | + * return 1 + * ``` + */ +class MatchingSuccessor extends ConditionalSuccessor, TMatchingSuccessor { + /** Holds if this is a match successor. */ + predicate isMatch() { this = TMatchingSuccessor(true) } + + override boolean getValue() { this = TMatchingSuccessor(result) } + + override string toString() { if this.isMatch() then result = "match" else result = "no-match" } +} + +/** + * An emptiness control flow successor. + * + * For example, this program fragment: + * + * ```csharp + * foreach (var arg in args) + * { + * yield return arg; + * } + * yield return ""; + * ``` + * + * has a control flow graph containing emptiness successors: + * + * ``` + * args + * | + * loop-header------<----- + * / \ \ + * / \ | + * / \ | + * / \ | + * empty non-empty | + * | \ | + * yield return "" \ | + * var arg | + * | | + * yield return arg | + * \_________/ + * ``` + */ +class EmptinessSuccessor extends ConditionalSuccessor, TEmptinessSuccessor { + /** Holds if this is an empty successor. */ + predicate isEmpty() { this = TEmptinessSuccessor(true) } + + override boolean getValue() { this = TEmptinessSuccessor(result) } + + override string toString() { if this.isEmpty() then result = "empty" else result = "non-empty" } +} + +private class TAbruptSuccessor = + TExceptionSuccessor or TReturnSuccessor or TExitSuccessor or TJumpSuccessor; + +/** An abrupt control flow successor. */ +abstract class AbruptSuccessor extends SuccessorType, TAbruptSuccessor { } + +/** + * An exceptional control flow successor. + * + * Example: + * + * ```csharp + * int M(string s) + * { + * if (s == null) + * throw new ArgumentNullException(nameof(s)); + * return s.Length; + * } + * ``` + * + * The callable exit node of `M` is an exceptional successor of the node + * `throw new ArgumentNullException(nameof(s));`. + */ +class ExceptionSuccessor extends AbruptSuccessor, TExceptionSuccessor { + override string toString() { result = "exception" } +} + +/** + * A `return` control flow successor. + * + * Example: + * + * ```csharp + * void M() + * { + * return; + * } + * ``` + * + * The callable exit node of `M` is a `return` successor of the `return;` + * statement. + */ +class ReturnSuccessor extends AbruptSuccessor, TReturnSuccessor { + override string toString() { result = "return" } +} + +/** + * An exit control flow successor. + * + * Example: + * + * ```csharp + * 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 AbruptSuccessor, TExitSuccessor { + override string toString() { result = "exit" } +} + +private class TJumpSuccessor = + TBreakSuccessor or TContinueSuccessor or TGotoSuccessor or TRedoSuccessor or TRetrySuccessor or + TJavaYieldSuccessor; + +/** + * A jump control flow successor. + * + * This covers non-exceptional, non-local control flow, such as `break`, + * `continue`, and `goto`. + */ +abstract class JumpSuccessor extends AbruptSuccessor, TJumpSuccessor { } + +/** A `break` control flow successor. */ +class BreakSuccessor extends JumpSuccessor, TBreakSuccessor { + override string toString() { result = "break" } +} + +/** A `continue` control flow successor. */ +class ContinueSuccessor extends JumpSuccessor, TContinueSuccessor { + override string toString() { result = "continue" } +} + +/** A `goto` control flow successor. */ +class GotoSuccessor extends JumpSuccessor, TGotoSuccessor { + override string toString() { result = "goto" } +} + +/** A `redo` control flow successor (rare, used in Ruby). */ +class RedoSuccessor extends JumpSuccessor, TRedoSuccessor { + override string toString() { result = "redo" } +} + +/** A `retry` control flow successor (rare, used in Ruby). */ +class RetrySuccessor extends JumpSuccessor, TRetrySuccessor { + override string toString() { result = "retry" } +} + +/** A Java `yield` control flow successor. */ +class JavaYieldSuccessor extends JumpSuccessor, TJavaYieldSuccessor { + override string toString() { result = "yield" } +} From 8b50ac291fbc056fb638f5e12511209953505982 Mon Sep 17 00:00:00 2001 From: Anders Schack-Mulligen Date: Wed, 27 Aug 2025 13:35:41 +0200 Subject: [PATCH 025/308] C#: Use shared SuccessorType. --- csharp/ql/lib/semmle/code/csharp/Caching.qll | 3 - .../semmle/code/csharp/commons/Constants.qll | 4 +- .../code/csharp/controlflow/BasicBlocks.qll | 2 +- .../csharp/controlflow/ControlFlowElement.qll | 1 - .../csharp/controlflow/ControlFlowGraph.qll | 1 - .../semmle/code/csharp/controlflow/Guards.qll | 2 +- .../controlflow/internal/Completion.qll | 7 +- .../internal/ControlFlowGraphImpl.qll | 12 +- .../controlflow/internal/PreBasicBlocks.qll | 2 +- .../csharp/controlflow/internal/Splitting.qll | 17 +- .../controlflow/internal/SuccessorType.qll | 327 +----------------- .../semmle/code/csharp/dataflow/Nullness.qll | 6 +- .../code/csharp/dataflow/internal/BaseSSA.qll | 2 +- .../dataflow/internal/DataFlowPrivate.qll | 4 +- .../code/csharp/dataflow/internal/SsaImpl.qll | 8 +- .../dataflow/ConditionalBypassQuery.qll | 6 +- .../Control-Flow/ConstantCondition.ql | 4 +- .../CWE-384/AbandonSession.ql | 4 +- .../controlflow/graph/Condition.ql | 3 +- .../library-tests/controlflow/graph/Nodes.ql | 2 +- 20 files changed, 38 insertions(+), 379 deletions(-) diff --git a/csharp/ql/lib/semmle/code/csharp/Caching.qll b/csharp/ql/lib/semmle/code/csharp/Caching.qll index 6a58edef63ff..4e34f5504dc9 100644 --- a/csharp/ql/lib/semmle/code/csharp/Caching.qll +++ b/csharp/ql/lib/semmle/code/csharp/Caching.qll @@ -10,7 +10,6 @@ module Stages { cached module ControlFlowStage { private import semmle.code.csharp.controlflow.internal.Splitting - private import semmle.code.csharp.controlflow.internal.SuccessorType private import semmle.code.csharp.controlflow.Guards as Guards cached @@ -20,8 +19,6 @@ module Stages { private predicate forceCachingInSameStageRev() { exists(Split s) or - exists(SuccessorType st) - or exists(ControlFlow::Node n) or Guards::Internal::isCustomNullCheck(_, _, _, _) diff --git a/csharp/ql/lib/semmle/code/csharp/commons/Constants.qll b/csharp/ql/lib/semmle/code/csharp/commons/Constants.qll index 508ba0e5e87d..ab2d9e0eef74 100644 --- a/csharp/ql/lib/semmle/code/csharp/commons/Constants.qll +++ b/csharp/ql/lib/semmle/code/csharp/commons/Constants.qll @@ -6,9 +6,7 @@ private import semmle.code.csharp.commons.StructuralComparison as StructuralComp pragma[noinline] private predicate isConstantCondition0(ControlFlow::Node cfn, boolean b) { - exists( - cfn.getASuccessorByType(any(ControlFlow::SuccessorTypes::BooleanSuccessor t | t.getValue() = b)) - ) and + exists(cfn.getASuccessorByType(any(ControlFlow::BooleanSuccessor t | t.getValue() = b))) and strictcount(ControlFlow::SuccessorType t | exists(cfn.getASuccessorByType(t))) = 1 } diff --git a/csharp/ql/lib/semmle/code/csharp/controlflow/BasicBlocks.qll b/csharp/ql/lib/semmle/code/csharp/controlflow/BasicBlocks.qll index c3bf2545230c..cc628d9792ba 100644 --- a/csharp/ql/lib/semmle/code/csharp/controlflow/BasicBlocks.qll +++ b/csharp/ql/lib/semmle/code/csharp/controlflow/BasicBlocks.qll @@ -3,7 +3,7 @@ */ import csharp -private import ControlFlow::SuccessorTypes +private import ControlFlow private import semmle.code.csharp.controlflow.internal.ControlFlowGraphImpl as CfgImpl private import CfgImpl::BasicBlocks as BasicBlocksImpl private import codeql.controlflow.BasicBlock as BB diff --git a/csharp/ql/lib/semmle/code/csharp/controlflow/ControlFlowElement.qll b/csharp/ql/lib/semmle/code/csharp/controlflow/ControlFlowElement.qll index 1cd09725b6e0..f914b13e228e 100644 --- a/csharp/ql/lib/semmle/code/csharp/controlflow/ControlFlowElement.qll +++ b/csharp/ql/lib/semmle/code/csharp/controlflow/ControlFlowElement.qll @@ -5,7 +5,6 @@ private import semmle.code.csharp.ExprOrStmtParent private import semmle.code.csharp.commons.Compilation private import ControlFlow private import ControlFlow::BasicBlocks -private import SuccessorTypes private import semmle.code.csharp.Caching private import internal.ControlFlowGraphImpl as Impl diff --git a/csharp/ql/lib/semmle/code/csharp/controlflow/ControlFlowGraph.qll b/csharp/ql/lib/semmle/code/csharp/controlflow/ControlFlowGraph.qll index 2334d240935f..4b9d636824cc 100644 --- a/csharp/ql/lib/semmle/code/csharp/controlflow/ControlFlowGraph.qll +++ b/csharp/ql/lib/semmle/code/csharp/controlflow/ControlFlowGraph.qll @@ -6,7 +6,6 @@ import csharp module ControlFlow { private import semmle.code.csharp.controlflow.BasicBlocks as BBs import semmle.code.csharp.controlflow.internal.SuccessorType - private import SuccessorTypes private import internal.ControlFlowGraphImpl as Impl private import internal.Splitting as Splitting diff --git a/csharp/ql/lib/semmle/code/csharp/controlflow/Guards.qll b/csharp/ql/lib/semmle/code/csharp/controlflow/Guards.qll index 2688472f71c3..459028aa6ea7 100644 --- a/csharp/ql/lib/semmle/code/csharp/controlflow/Guards.qll +++ b/csharp/ql/lib/semmle/code/csharp/controlflow/Guards.qll @@ -3,7 +3,7 @@ */ import csharp -private import ControlFlow::SuccessorTypes +private import ControlFlow private import semmle.code.csharp.commons.Assertions private import semmle.code.csharp.commons.ComparisonTest private import semmle.code.csharp.commons.StructuralComparison as SC diff --git a/csharp/ql/lib/semmle/code/csharp/controlflow/internal/Completion.qll b/csharp/ql/lib/semmle/code/csharp/controlflow/internal/Completion.qll index 6fed45cdf84d..157278d4a919 100644 --- a/csharp/ql/lib/semmle/code/csharp/controlflow/internal/Completion.qll +++ b/csharp/ql/lib/semmle/code/csharp/controlflow/internal/Completion.qll @@ -26,7 +26,6 @@ private import semmle.code.csharp.frameworks.System private import ControlFlowGraphImpl private import NonReturning private import SuccessorType -private import SuccessorTypes private newtype TCompletion = TSimpleCompletion() or @@ -575,7 +574,7 @@ abstract private class NonNestedNormalCompletion extends NormalCompletion { } /** A simple (normal) completion. */ class SimpleCompletion extends NonNestedNormalCompletion, TSimpleCompletion { - override NormalSuccessor getAMatchingSuccessorType() { any() } + override DirectSuccessor getAMatchingSuccessorType() { any() } override string toString() { result = "normal" } } @@ -859,7 +858,7 @@ class GotoCompletion extends Completion { /** Gets the label of the `goto` completion. */ string getLabel() { result = label } - override GotoSuccessor getAMatchingSuccessorType() { result.getLabel() = label } + override GotoSuccessor getAMatchingSuccessorType() { any() } override string toString() { // `NestedCompletion` defines `toString()` for the other case @@ -882,7 +881,7 @@ class ThrowCompletion extends Completion { /** Gets the type of the exception being thrown. */ ExceptionClass getExceptionClass() { result = ec } - override ExceptionSuccessor getAMatchingSuccessorType() { result.getExceptionClass() = ec } + override ExceptionSuccessor getAMatchingSuccessorType() { any() } override string toString() { // `NestedCompletion` defines `toString()` for the other case diff --git a/csharp/ql/lib/semmle/code/csharp/controlflow/internal/ControlFlowGraphImpl.qll b/csharp/ql/lib/semmle/code/csharp/controlflow/internal/ControlFlowGraphImpl.qll index 74cb070635b2..cde366f00146 100644 --- a/csharp/ql/lib/semmle/code/csharp/controlflow/internal/ControlFlowGraphImpl.qll +++ b/csharp/ql/lib/semmle/code/csharp/controlflow/internal/ControlFlowGraphImpl.qll @@ -83,17 +83,13 @@ private module CfgInput implements CfgShared::InputSig { SuccessorType getAMatchingSuccessorType(Completion c) { result = c.getAMatchingSuccessorType() } - predicate successorTypeIsSimple(SuccessorType t) { - t instanceof ST::SuccessorTypes::NormalSuccessor - } + predicate successorTypeIsSimple(SuccessorType t) { t instanceof ST::DirectSuccessor } - predicate successorTypeIsCondition(SuccessorType t) { - t instanceof ST::SuccessorTypes::ConditionalSuccessor - } + predicate successorTypeIsCondition(SuccessorType t) { t instanceof ST::ConditionalSuccessor } predicate isAbnormalExitType(SuccessorType t) { - t instanceof ST::SuccessorTypes::ExceptionSuccessor or - t instanceof ST::SuccessorTypes::ExitSuccessor + t instanceof ST::ExceptionSuccessor or + t instanceof ST::ExitSuccessor } int idOfAstNode(AstNode node) { result = node.getId() } diff --git a/csharp/ql/lib/semmle/code/csharp/controlflow/internal/PreBasicBlocks.qll b/csharp/ql/lib/semmle/code/csharp/controlflow/internal/PreBasicBlocks.qll index b3cdf3335e66..3997207ed99a 100644 --- a/csharp/ql/lib/semmle/code/csharp/controlflow/internal/PreBasicBlocks.qll +++ b/csharp/ql/lib/semmle/code/csharp/controlflow/internal/PreBasicBlocks.qll @@ -150,7 +150,7 @@ class ConditionBlock extends PreBasicBlock { } pragma[nomagic] - predicate controls(PreBasicBlock controlled, Cfg::SuccessorTypes::ConditionalSuccessor s) { + predicate controls(PreBasicBlock controlled, Cfg::ConditionalSuccessor s) { exists(PreBasicBlock succ, ConditionalCompletion c | conditionBlockImmediatelyControls(this, succ, c) | diff --git a/csharp/ql/lib/semmle/code/csharp/controlflow/internal/Splitting.qll b/csharp/ql/lib/semmle/code/csharp/controlflow/internal/Splitting.qll index f57dd0703fce..2c026c9370be 100644 --- a/csharp/ql/lib/semmle/code/csharp/controlflow/internal/Splitting.qll +++ b/csharp/ql/lib/semmle/code/csharp/controlflow/internal/Splitting.qll @@ -470,8 +470,11 @@ module FinallySplitting { * then the `finally` block must end with a `return` as well (provided that * the `finally` block exits normally). */ - class FinallySplitType extends Cfg::SuccessorType { - FinallySplitType() { not this instanceof Cfg::SuccessorTypes::ConditionalSuccessor } + class FinallySplitType instanceof Cfg::SuccessorType { + FinallySplitType() { not this instanceof Cfg::ConditionalSuccessor } + + /** Gets a textual representation of this successor type. */ + string toString() { result = super.toString() } /** Holds if this split type matches entry into a `finally` block with completion `c`. */ predicate isSplitForEntryCompletion(Completion c) { @@ -479,7 +482,7 @@ module FinallySplitting { then // If the entry into the `finally` block completes with any normal completion, // it simply means normal execution after the `finally` block - this instanceof Cfg::SuccessorTypes::NormalSuccessor + this instanceof Cfg::DirectSuccessor else this = c.getAMatchingSuccessorType() } } @@ -533,7 +536,7 @@ module FinallySplitting { int getNestLevel() { result = nestLevel } override string toString() { - if type instanceof Cfg::SuccessorTypes::NormalSuccessor + if type instanceof Cfg::DirectSuccessor then result = "" else if nestLevel > 0 @@ -617,14 +620,14 @@ module FinallySplitting { or not c instanceof NormalCompletion or - type instanceof Cfg::SuccessorTypes::NormalSuccessor + type instanceof Cfg::DirectSuccessor ) else ( // Finally block can exit with completion `c` inherited from try/catch // block: must match this split inherited = true and type = c.getAMatchingSuccessorType() and - not type instanceof Cfg::SuccessorTypes::NormalSuccessor + not type instanceof Cfg::DirectSuccessor ) ) or @@ -657,7 +660,7 @@ module FinallySplitting { exists(FinallySplit outer | outer.getNestLevel() = super.getNestLevel() - 1 and outer.(FinallySplitImpl).exit(pred, c, inherited) and - super.getType() instanceof Cfg::SuccessorTypes::NormalSuccessor and + super.getType() instanceof Cfg::DirectSuccessor and inherited = true ) } diff --git a/csharp/ql/lib/semmle/code/csharp/controlflow/internal/SuccessorType.qll b/csharp/ql/lib/semmle/code/csharp/controlflow/internal/SuccessorType.qll index d6ea2161bbb7..c0dae26b30e0 100644 --- a/csharp/ql/lib/semmle/code/csharp/controlflow/internal/SuccessorType.qll +++ b/csharp/ql/lib/semmle/code/csharp/controlflow/internal/SuccessorType.qll @@ -4,329 +4,4 @@ * Provides different types of control flow successor types. */ -import csharp -private import Completion -private import semmle.code.csharp.Caching - -cached -private newtype TSuccessorType = - TSuccessorSuccessor() { Stages::ControlFlowStage::forceCachingInSameStage() } or - TBooleanSuccessor(boolean b) { b = true or b = false } or - TNullnessSuccessor(boolean isNull) { isNull = true or isNull = false } or - TMatchingSuccessor(boolean isMatch) { isMatch = true or isMatch = false } or - TEmptinessSuccessor(boolean isEmpty) { isEmpty = true or isEmpty = false } or - TReturnSuccessor() or - TBreakSuccessor() or - TContinueSuccessor() or - TGotoSuccessor(string label) { label = any(GotoStmt gs).getLabel() } or - TExceptionSuccessor(ExceptionClass ec) { exists(ThrowCompletion c | c.getExceptionClass() = ec) } or - TExitSuccessor() - -/** The type of a control flow successor. */ -class SuccessorType extends TSuccessorType { - /** Gets a textual representation of successor type. */ - string toString() { none() } -} - -/** Provides different types of control flow successor types. */ -module SuccessorTypes { - /** A normal control flow successor. */ - class NormalSuccessor extends SuccessorType, TSuccessorSuccessor { - override string toString() { result = "successor" } - } - - /** - * A conditional control flow successor. Either a Boolean successor (`BooleanSuccessor`), - * a nullness successor (`NullnessSuccessor`), a matching successor (`MatchingSuccessor`), - * or an emptiness successor (`EmptinessSuccessor`). - */ - abstract class ConditionalSuccessor extends SuccessorType { - /** Gets the Boolean value of this successor. */ - abstract boolean getValue(); - } - - /** - * A Boolean control flow successor. - * - * For example, this program fragment: - * - * ```csharp - * if (x < 0) - * return 0; - * else - * return 1; - * ``` - * - * has a control flow graph containing Boolean successors: - * - * ``` - * if - * | - * x < 0 - * / \ - * / \ - * / \ - * true false - * | \ - * return 0 return 1 - * ``` - */ - class BooleanSuccessor extends ConditionalSuccessor, TBooleanSuccessor { - override boolean getValue() { this = TBooleanSuccessor(result) } - - override string toString() { result = this.getValue().toString() } - } - - /** - * A nullness control flow successor. - * - * For example, this program fragment: - * - * ```csharp - * int? M(string s) => s?.Length; - * ``` - * - * has a control flow graph containing nullness successors: - * - * ``` - * enter M - * | - * s - * / \ - * / \ - * / \ - * null non-null - * \ | - * \ Length - * \ / - * \ / - * exit M - * ``` - */ - class NullnessSuccessor extends ConditionalSuccessor, TNullnessSuccessor { - /** Holds if this is a `null` successor. */ - predicate isNull() { this = TNullnessSuccessor(true) } - - override boolean getValue() { this = TNullnessSuccessor(result) } - - override string toString() { if this.isNull() then result = "null" else result = "non-null" } - } - - /** - * A matching control flow successor. - * - * For example, this program fragment: - * - * ```csharp - * switch (x) { - * case 0 : - * return 0; - * default : - * return 1; - * } - * ``` - * - * has a control flow graph containing matching successors: - * - * ``` - * switch - * | - * x - * | - * case 0 - * / \ - * / \ - * / \ - * match no-match - * | \ - * return 0 default - * | - * return 1 - * ``` - */ - class MatchingSuccessor extends ConditionalSuccessor, TMatchingSuccessor { - /** Holds if this is a match successor. */ - predicate isMatch() { this = TMatchingSuccessor(true) } - - override boolean getValue() { this = TMatchingSuccessor(result) } - - override string toString() { if this.isMatch() then result = "match" else result = "no-match" } - } - - /** - * An emptiness control flow successor. - * - * For example, this program fragment: - * - * ```csharp - * foreach (var arg in args) - * { - * yield return arg; - * } - * yield return ""; - * ``` - * - * has a control flow graph containing emptiness successors: - * - * ``` - * args - * | - * foreach------<------- - * / \ \ - * / \ | - * / \ | - * / \ | - * empty non-empty | - * | \ | - * yield return "" \ | - * var arg | - * | | - * yield return arg | - * \_________/ - * ``` - */ - class EmptinessSuccessor extends ConditionalSuccessor, TEmptinessSuccessor { - /** Holds if this is an empty successor. */ - predicate isEmpty() { this = TEmptinessSuccessor(true) } - - override boolean getValue() { this = TEmptinessSuccessor(result) } - - override string toString() { if this.isEmpty() then result = "empty" else result = "non-empty" } - } - - /** - * A `return` control flow successor. - * - * Example: - * - * ```csharp - * void M() - * { - * return; - * } - * ``` - * - * The callable exit node of `M` is a `return` successor of the `return;` - * statement. - */ - class ReturnSuccessor extends SuccessorType, TReturnSuccessor { - override string toString() { result = "return" } - } - - /** - * A `break` control flow successor. - * - * Example: - * - * ```csharp - * int M(int x) - * { - * while (true) - * { - * if (x++ > 10) - * break; - * } - * return x; - * } - * ``` - * - * The node `return x;` is a `break` successor of the node `break;`. - */ - class BreakSuccessor extends SuccessorType, TBreakSuccessor { - override string toString() { result = "break" } - } - - /** - * A `continue` control flow successor. - * - * Example: - * - * ```csharp - * int M(int x) - * { - * while (true) { - * if (x++ < 10) - * continue; - * } - * return x; - * } - * ``` - * - * The node `while (true) { ... }` is a `continue` successor of the node - * `continue;`. - */ - class ContinueSuccessor extends SuccessorType, TContinueSuccessor { - override string toString() { result = "continue" } - } - - /** - * A `goto` control flow successor. - * - * Example: - * - * ```csharp - * int M(int x) - * { - * while (true) - * { - * if (x++ > 10) - * goto Return; - * } - * Return: return x; - * } - * ``` - * - * The node `Return: return x` is a `goto label` successor of the node - * `goto Return;`. - */ - class GotoSuccessor extends SuccessorType, TGotoSuccessor { - /** Gets the `goto` label. */ - string getLabel() { this = TGotoSuccessor(result) } - - override string toString() { result = "goto(" + this.getLabel() + ")" } - } - - /** - * An exceptional control flow successor. - * - * Example: - * - * ```csharp - * int M(string s) - * { - * if (s == null) - * throw new ArgumentNullException(nameof(s)); - * return s.Length; - * } - * ``` - * - * The callable exit node of `M` is an exceptional successor (of type - * `ArgumentNullException`) of the node `throw new ArgumentNullException(nameof(s));`. - */ - class ExceptionSuccessor extends SuccessorType, TExceptionSuccessor { - /** Gets the type of exception. */ - ExceptionClass getExceptionClass() { this = TExceptionSuccessor(result) } - - override string toString() { result = "exception(" + this.getExceptionClass().getName() + ")" } - } - - /** - * An exit control flow successor. - * - * Example: - * - * ```csharp - * 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" } - } -} +import codeql.controlflow.SuccessorType diff --git a/csharp/ql/lib/semmle/code/csharp/dataflow/Nullness.qll b/csharp/ql/lib/semmle/code/csharp/dataflow/Nullness.qll index 352418779955..3723dcaec12a 100644 --- a/csharp/ql/lib/semmle/code/csharp/dataflow/Nullness.qll +++ b/csharp/ql/lib/semmle/code/csharp/dataflow/Nullness.qll @@ -151,9 +151,7 @@ private predicate exprImpliesSsaDef( * If the returned element takes the `s` branch, then `def` is guaranteed to be * `null` if `nv.isNull()` holds, and non-`null` otherwise. */ -private ControlFlowElement getANullCheck( - Ssa::Definition def, SuccessorTypes::ConditionalSuccessor s, NullValue nv -) { +private ControlFlowElement getANullCheck(Ssa::Definition def, ConditionalSuccessor s, NullValue nv) { exists(Expr e, G::AbstractValue v | v.branch(result, s, e) | exprImpliesSsaDef(e, v, def, nv)) } @@ -294,7 +292,7 @@ private predicate defNullImpliesStep( bb2 = phi.getBasicBlock() ) ) and - not exists(SuccessorTypes::ConditionalSuccessor s, NullValue nv | + not exists(ConditionalSuccessor s, NullValue nv | bb1.getLastNode() = getANullCheck(def1, s, nv).getAControlFlowNode() | bb2 = bb1.getASuccessor(s) and diff --git a/csharp/ql/lib/semmle/code/csharp/dataflow/internal/BaseSSA.qll b/csharp/ql/lib/semmle/code/csharp/dataflow/internal/BaseSSA.qll index 6e2d7d239f78..747cf790d91f 100644 --- a/csharp/ql/lib/semmle/code/csharp/dataflow/internal/BaseSSA.qll +++ b/csharp/ql/lib/semmle/code/csharp/dataflow/internal/BaseSSA.qll @@ -28,7 +28,7 @@ module BaseSsa { private predicate implicitEntryDef( Callable c, ControlFlow::BasicBlocks::EntryBlock bb, SsaInput::SourceVariable v ) { - exists(ControlFlow::ControlFlow::BasicBlocks::EntryBlock entry | + exists(ControlFlow::BasicBlocks::EntryBlock entry | c = entry.getCallable() and // In case `c` has multiple bodies, we want each body to get its own implicit // entry definition. In case `c` doesn't have multiple bodies, the line below diff --git a/csharp/ql/lib/semmle/code/csharp/dataflow/internal/DataFlowPrivate.qll b/csharp/ql/lib/semmle/code/csharp/dataflow/internal/DataFlowPrivate.qll index 95d76059f76d..62ac89faef8c 100644 --- a/csharp/ql/lib/semmle/code/csharp/dataflow/internal/DataFlowPrivate.qll +++ b/csharp/ql/lib/semmle/code/csharp/dataflow/internal/DataFlowPrivate.qll @@ -2583,9 +2583,7 @@ class NodeRegion instanceof ControlFlow::BasicBlock { * Holds if the nodes in `nr` are unreachable when the call context is `call`. */ predicate isUnreachableInCall(NodeRegion nr, DataFlowCall call) { - exists( - ExplicitParameterNode paramNode, Guard guard, ControlFlow::SuccessorTypes::BooleanSuccessor bs - | + exists(ExplicitParameterNode paramNode, Guard guard, ControlFlow::BooleanSuccessor bs | viableConstantBooleanParamArg(paramNode, bs.getValue().booleanNot(), call) and paramNode.getSsaDefinition().getARead() = guard and guard.controlsBlock(nr, bs, _) diff --git a/csharp/ql/lib/semmle/code/csharp/dataflow/internal/SsaImpl.qll b/csharp/ql/lib/semmle/code/csharp/dataflow/internal/SsaImpl.qll index 7fbd179ace09..9ca33610f9cb 100644 --- a/csharp/ql/lib/semmle/code/csharp/dataflow/internal/SsaImpl.qll +++ b/csharp/ql/lib/semmle/code/csharp/dataflow/internal/SsaImpl.qll @@ -818,8 +818,8 @@ private module Cached { } cached - predicate implicitEntryDefinition(ControlFlow::ControlFlow::BasicBlock bb, Ssa::SourceVariable v) { - exists(ControlFlow::ControlFlow::BasicBlocks::EntryBlock entry, Callable c | + predicate implicitEntryDefinition(ControlFlow::BasicBlock bb, Ssa::SourceVariable v) { + exists(ControlFlow::BasicBlocks::EntryBlock entry, Callable c | c = entry.getCallable() and // In case `c` has multiple bodies, we want each body to get its own implicit // entry definition. In case `c` doesn't have multiple bodies, the line below @@ -1045,7 +1045,7 @@ private module DataFlowIntegrationInput implements Impl::DataFlowIntegrationInpu * from `bb1` to `bb2`. */ predicate hasValueBranchEdge(BasicBlock bb1, BasicBlock bb2, GuardValue branch) { - exists(ControlFlow::SuccessorTypes::ConditionalSuccessor s | + exists(ControlFlow::ConditionalSuccessor s | this.getAControlFlowNode() = bb1.getLastNode() and bb2 = bb1.getASuccessor(s) and s.getValue() = branch @@ -1064,7 +1064,7 @@ private module DataFlowIntegrationInput implements Impl::DataFlowIntegrationInpu /** Holds if the guard `guard` controls block `bb` upon evaluating to `branch`. */ predicate guardDirectlyControlsBlock(Guard guard, ControlFlow::BasicBlock bb, GuardValue branch) { - exists(ConditionBlock conditionBlock, ControlFlow::SuccessorTypes::ConditionalSuccessor s | + exists(ConditionBlock conditionBlock, ControlFlow::ConditionalSuccessor s | guard.getAControlFlowNode() = conditionBlock.getLastNode() and s.getValue() = branch and conditionBlock.edgeDominates(bb, s) diff --git a/csharp/ql/lib/semmle/code/csharp/security/dataflow/ConditionalBypassQuery.qll b/csharp/ql/lib/semmle/code/csharp/security/dataflow/ConditionalBypassQuery.qll index ee345780654d..f2b46e4ebac1 100644 --- a/csharp/ql/lib/semmle/code/csharp/security/dataflow/ConditionalBypassQuery.qll +++ b/csharp/ql/lib/semmle/code/csharp/security/dataflow/ConditionalBypassQuery.qll @@ -74,7 +74,7 @@ class ReverseDnsSource extends Source { pragma[noinline] private predicate conditionControlsCall0( - SensitiveExecutionMethodCall call, Expr e, ControlFlow::SuccessorTypes::BooleanSuccessor s + SensitiveExecutionMethodCall call, Expr e, ControlFlow::BooleanSuccessor s ) { forex(BasicBlock bb | bb = call.getAControlFlowNode().getBasicBlock() | e.controlsBlock(bb, s, _)) } @@ -82,9 +82,7 @@ private predicate conditionControlsCall0( private predicate conditionControlsCall( SensitiveExecutionMethodCall call, SensitiveExecutionMethod def, Expr e, boolean cond ) { - exists(ControlFlow::SuccessorTypes::BooleanSuccessor s | cond = s.getValue() | - conditionControlsCall0(call, e, s) - ) and + exists(ControlFlow::BooleanSuccessor s | cond = s.getValue() | conditionControlsCall0(call, e, s)) and def = call.getTarget().getUnboundDeclaration() } diff --git a/csharp/ql/src/Bad Practices/Control-Flow/ConstantCondition.ql b/csharp/ql/src/Bad Practices/Control-Flow/ConstantCondition.ql index 5ec702f77e04..eb71239e0fc0 100644 --- a/csharp/ql/src/Bad Practices/Control-Flow/ConstantCondition.ql +++ b/csharp/ql/src/Bad Practices/Control-Flow/ConstantCondition.ql @@ -89,7 +89,7 @@ class ConstantNullnessCondition extends ConstantCondition { ConstantNullnessCondition() { forex(ControlFlow::Node cfn | cfn = this.getAControlFlowNode() | - exists(ControlFlow::SuccessorTypes::NullnessSuccessor t, ControlFlow::Node s | + exists(ControlFlow::NullnessSuccessor t, ControlFlow::Node s | s = cfn.getASuccessorByType(t) | b = t.getValue() and @@ -112,7 +112,7 @@ class ConstantMatchingCondition extends ConstantCondition { ConstantMatchingCondition() { forex(ControlFlow::Node cfn | cfn = this.getAControlFlowNode() | - exists(ControlFlow::SuccessorTypes::MatchingSuccessor t | exists(cfn.getASuccessorByType(t)) | + exists(ControlFlow::MatchingSuccessor t | exists(cfn.getASuccessorByType(t)) | b = t.getValue() ) and strictcount(ControlFlow::SuccessorType t | exists(cfn.getASuccessorByType(t))) = 1 diff --git a/csharp/ql/src/Security Features/CWE-384/AbandonSession.ql b/csharp/ql/src/Security Features/CWE-384/AbandonSession.ql index 5258d6a4cd2a..c350c8f37554 100644 --- a/csharp/ql/src/Security Features/CWE-384/AbandonSession.ql +++ b/csharp/ql/src/Security Features/CWE-384/AbandonSession.ql @@ -21,10 +21,10 @@ predicate loginMethod(Method m, ControlFlow::SuccessorType flowFrom) { or m = any(SystemWebSecurityFormsAuthenticationClass c).getAuthenticateMethod() ) and - flowFrom.(ControlFlow::SuccessorTypes::BooleanSuccessor).getValue() = true + flowFrom.(ControlFlow::BooleanSuccessor).getValue() = true or m = any(SystemWebSecurityFormsAuthenticationClass c).getSignOutMethod() and - flowFrom instanceof ControlFlow::SuccessorTypes::NormalSuccessor + flowFrom instanceof ControlFlow::DirectSuccessor } /** The `System.Web.SessionState.HttpSessionState` class. */ diff --git a/csharp/ql/test/library-tests/controlflow/graph/Condition.ql b/csharp/ql/test/library-tests/controlflow/graph/Condition.ql index 25de07e9d5b5..61c801819246 100644 --- a/csharp/ql/test/library-tests/controlflow/graph/Condition.ql +++ b/csharp/ql/test/library-tests/controlflow/graph/Condition.ql @@ -4,8 +4,7 @@ import ControlFlow query predicate conditionBlock( BasicBlocks::ConditionBlock cb, BasicBlock controlled, boolean testIsTrue ) { - cb.edgeDominates(controlled, - any(SuccessorTypes::ConditionalSuccessor s | testIsTrue = s.getValue())) + cb.edgeDominates(controlled, any(ConditionalSuccessor s | testIsTrue = s.getValue())) } ControlFlow::Node successor(ControlFlow::Node node, boolean kind) { diff --git a/csharp/ql/test/library-tests/controlflow/graph/Nodes.ql b/csharp/ql/test/library-tests/controlflow/graph/Nodes.ql index fb937bfbd9f7..3f4ed835fc24 100644 --- a/csharp/ql/test/library-tests/controlflow/graph/Nodes.ql +++ b/csharp/ql/test/library-tests/controlflow/graph/Nodes.ql @@ -12,7 +12,7 @@ class MyFinallySplitControlFlowNode extends ElementNode { exists(Splitting::FinallySplitting::FinallySplitType type | type = this.getASplit().(FinallySplit).getType() | - not type instanceof SuccessorTypes::NormalSuccessor + not type instanceof DirectSuccessor ) } From d8c193df18379f70baa7c1d41af50f05be683f69 Mon Sep 17 00:00:00 2001 From: Anders Schack-Mulligen Date: Wed, 27 Aug 2025 14:21:18 +0200 Subject: [PATCH 026/308] Ruby: Use shared SuccessorType. --- .../DataFlowConsistency.ql | 2 +- .../codeql/ruby/controlflow/BasicBlocks.qll | 1 - .../ruby/controlflow/ControlFlowGraph.qll | 237 +----------------- .../ruby/controlflow/internal/Completion.qll | 7 +- .../internal/ControlFlowGraphImpl.qll | 30 +-- .../ruby/controlflow/internal/Guards.qll | 2 +- .../ruby/controlflow/internal/Splitting.qll | 16 +- .../dataflow/internal/DataFlowPrivate.qll | 7 +- .../codeql/ruby/dataflow/internal/SsaImpl.qll | 2 +- .../controlflow/graph/BasicBlocks.ql | 2 +- .../dataflow/barrier-guards/barrier-guards.ql | 2 +- 11 files changed, 25 insertions(+), 283 deletions(-) diff --git a/ruby/ql/consistency-queries/DataFlowConsistency.ql b/ruby/ql/consistency-queries/DataFlowConsistency.ql index 24766016cbb6..4e0588d5d4a1 100644 --- a/ruby/ql/consistency-queries/DataFlowConsistency.ql +++ b/ruby/ql/consistency-queries/DataFlowConsistency.ql @@ -28,7 +28,7 @@ private module Input implements InputSig { exists(CfgNodes::ExprCfgNode n | arg.argumentOf(call, _) and n = call.asCall() and - arg.asExpr().getASuccessor(any(SuccessorTypes::ConditionalSuccessor c)).getASuccessor*() = n and + arg.asExpr().getASuccessor(any(ConditionalSuccessor c)).getASuccessor*() = n and n.getASplit() instanceof Split::ConditionalCompletionSplit ) } diff --git a/ruby/ql/lib/codeql/ruby/controlflow/BasicBlocks.qll b/ruby/ql/lib/codeql/ruby/controlflow/BasicBlocks.qll index bd13fca2875a..72d8360b24c0 100644 --- a/ruby/ql/lib/codeql/ruby/controlflow/BasicBlocks.qll +++ b/ruby/ql/lib/codeql/ruby/controlflow/BasicBlocks.qll @@ -8,7 +8,6 @@ private import codeql.ruby.ast.internal.TreeSitter private import codeql.ruby.controlflow.ControlFlowGraph private import internal.ControlFlowGraphImpl as CfgImpl private import CfgNodes -private import SuccessorTypes private import CfgImpl::BasicBlocks as BasicBlocksImpl private import codeql.controlflow.BasicBlock as BB diff --git a/ruby/ql/lib/codeql/ruby/controlflow/ControlFlowGraph.qll b/ruby/ql/lib/codeql/ruby/controlflow/ControlFlowGraph.qll index 1d3632ba1c07..8a7abea30904 100644 --- a/ruby/ql/lib/codeql/ruby/controlflow/ControlFlowGraph.qll +++ b/ruby/ql/lib/codeql/ruby/controlflow/ControlFlowGraph.qll @@ -2,9 +2,9 @@ overlay[local] module; +import codeql.controlflow.SuccessorType private import codeql.ruby.AST private import codeql.ruby.controlflow.BasicBlocks -private import SuccessorTypes private import internal.ControlFlowGraphImpl as CfgImpl private import internal.Splitting as Splitting private import internal.Completion @@ -59,241 +59,6 @@ class CfgNode extends CfgImpl::Node { BasicBlock getBasicBlock() { result.getANode() = this } } -/** The type of a control flow successor. */ -class SuccessorType extends CfgImpl::TSuccessorType { - /** Gets a textual representation of successor type. */ - string toString() { none() } -} - -/** Provides different types of control flow successor types. */ -module SuccessorTypes { - /** A normal control flow successor. */ - class NormalSuccessor extends SuccessorType, CfgImpl::TSuccessorSuccessor { - final override string toString() { result = "successor" } - } - - /** - * A conditional control flow successor. Either a Boolean successor (`BooleanSuccessor`) - * or a matching successor (`MatchingSuccessor`) - */ - class ConditionalSuccessor extends SuccessorType { - boolean value; - - ConditionalSuccessor() { - this = CfgImpl::TBooleanSuccessor(value) or - this = CfgImpl::TMatchingSuccessor(value) - } - - /** Gets the Boolean value of this successor. */ - final boolean getValue() { result = value } - - override string toString() { result = this.getValue().toString() } - } - - /** - * A Boolean control flow successor. - * - * For example, in - * - * ```rb - * if x >= 0 - * puts "positive" - * else - * puts "negative" - * end - * ``` - * - * `x >= 0` has both a `true` successor and a `false` successor. - */ - class BooleanSuccessor extends ConditionalSuccessor, CfgImpl::TBooleanSuccessor { } - - /** - * A matching control flow successor. - * - * For example, this program fragment: - * - * ```rb - * case x - * when 1 then puts "one" - * else puts "not one" - * end - * ``` - * - * has a control flow graph containing matching successors: - * - * ``` - * x - * | - * 1 - * / \ - * / \ - * / \ - * / \ - * match non-match - * | | - * puts "one" puts "not one" - * ``` - */ - class MatchingSuccessor extends ConditionalSuccessor, CfgImpl::TMatchingSuccessor { - override string toString() { if value = true then result = "match" else result = "no-match" } - } - - /** - * A `return` control flow successor. - * - * Example: - * - * ```rb - * def sum(x,y) - * return x + y - * end - * ``` - * - * The exit node of `sum` is a `return` successor of the `return x + y` - * statement. - */ - class ReturnSuccessor extends SuccessorType, CfgImpl::TReturnSuccessor { - final override string toString() { result = "return" } - } - - /** - * A `break` control flow successor. - * - * Example: - * - * ```rb - * def m - * while x >= 0 - * x -= 1 - * if num > 100 - * break - * end - * end - * puts "done" - * end - * ``` - * - * The node `puts "done"` is `break` successor of the node `break`. - */ - class BreakSuccessor extends SuccessorType, CfgImpl::TBreakSuccessor { - final override string toString() { result = "break" } - } - - /** - * A `next` control flow successor. - * - * Example: - * - * ```rb - * def m - * while x >= 0 - * x -= 1 - * if num > 100 - * next - * end - * end - * puts "done" - * end - * ``` - * - * The node `x >= 0` is `next` successor of the node `next`. - */ - class NextSuccessor extends SuccessorType, CfgImpl::TNextSuccessor { - final override string toString() { result = "next" } - } - - /** - * A `redo` control flow successor. - * - * Example: - * - * Example: - * - * ```rb - * def m - * while x >= 0 - * x -= 1 - * if num > 100 - * redo - * end - * end - * puts "done" - * end - * ``` - * - * The node `x -= 1` is `redo` successor of the node `redo`. - */ - class RedoSuccessor extends SuccessorType, CfgImpl::TRedoSuccessor { - final override string toString() { result = "redo" } - } - - /** - * A `retry` control flow successor. - * - * Example: - * - * Example: - * - * ```rb - * def m - * begin - * puts "Retry" - * raise - * rescue - * retry - * end - * end - * ``` - * - * The node `puts "Retry"` is `retry` successor of the node `retry`. - */ - class RetrySuccessor extends SuccessorType, CfgImpl::TRetrySuccessor { - final override string toString() { result = "retry" } - } - - /** - * An exceptional control flow successor. - * - * Example: - * - * ```rb - * def m x - * if x > 2 - * raise "x > 2" - * end - * puts "x <= 2" - * end - * ``` - * - * The exit node of `m` is an exceptional successor of the node - * `raise "x > 2"`. - */ - class RaiseSuccessor extends SuccessorType, CfgImpl::TRaiseSuccessor { - final override string toString() { result = "raise" } - } - - /** - * An exit control flow successor. - * - * Example: - * - * ```rb - * def m x - * if x > 2 - * exit 1 - * end - * puts "x <= 2" - * end - * ``` - * - * The exit node of `m` is an exit successor of the node - * `exit 1`. - */ - class ExitSuccessor extends SuccessorType, CfgImpl::TExitSuccessor { - final override string toString() { result = "exit" } - } -} - class Split = Splitting::Split; /** Provides different kinds of control flow graph splittings. */ diff --git a/ruby/ql/lib/codeql/ruby/controlflow/internal/Completion.qll b/ruby/ql/lib/codeql/ruby/controlflow/internal/Completion.qll index b8edf83c20df..bcfe8f98d437 100644 --- a/ruby/ql/lib/codeql/ruby/controlflow/internal/Completion.qll +++ b/ruby/ql/lib/codeql/ruby/controlflow/internal/Completion.qll @@ -12,7 +12,6 @@ private import codeql.ruby.ast.internal.Control private import codeql.ruby.controlflow.ControlFlowGraph private import ControlFlowGraphImpl as CfgImpl private import NonReturning -private import SuccessorTypes private newtype TCompletion = TSimpleCompletion() or @@ -267,7 +266,7 @@ abstract private class NonNestedNormalCompletion extends NormalCompletion { } /** A simple (normal) completion. */ class SimpleCompletion extends NonNestedNormalCompletion, TSimpleCompletion { - override NormalSuccessor getAMatchingSuccessorType() { any() } + override DirectSuccessor getAMatchingSuccessorType() { any() } override string toString() { result = "simple" } } @@ -377,7 +376,7 @@ class NextCompletion extends Completion { this = TNestedCompletion(_, TNextCompletion(), _) } - override NextSuccessor getAMatchingSuccessorType() { any() } + override ContinueSuccessor getAMatchingSuccessorType() { any() } override string toString() { // `NestedCompletion` defines `toString()` for the other case @@ -431,7 +430,7 @@ class RaiseCompletion extends Completion { this = TNestedCompletion(_, TRaiseCompletion(), _) } - override RaiseSuccessor getAMatchingSuccessorType() { any() } + override ExceptionSuccessor getAMatchingSuccessorType() { any() } override string toString() { // `NestedCompletion` defines `toString()` for the other case diff --git a/ruby/ql/lib/codeql/ruby/controlflow/internal/ControlFlowGraphImpl.qll b/ruby/ql/lib/codeql/ruby/controlflow/internal/ControlFlowGraphImpl.qll index d0d418a839f6..d45f6f19cdf3 100644 --- a/ruby/ql/lib/codeql/ruby/controlflow/internal/ControlFlowGraphImpl.qll +++ b/ruby/ql/lib/codeql/ruby/controlflow/internal/ControlFlowGraphImpl.qll @@ -50,17 +50,13 @@ private module CfgInput implements CfgShared::InputSig { SuccessorType getAMatchingSuccessorType(Completion c) { result = c.getAMatchingSuccessorType() } - predicate successorTypeIsSimple(SuccessorType t) { - t instanceof Cfg::SuccessorTypes::NormalSuccessor - } + predicate successorTypeIsSimple(SuccessorType t) { t instanceof Cfg::DirectSuccessor } - predicate successorTypeIsCondition(SuccessorType t) { - t instanceof Cfg::SuccessorTypes::ConditionalSuccessor - } + predicate successorTypeIsCondition(SuccessorType t) { t instanceof Cfg::ConditionalSuccessor } predicate isAbnormalExitType(SuccessorType t) { - t instanceof Cfg::SuccessorTypes::RaiseSuccessor or - t instanceof Cfg::SuccessorTypes::ExitSuccessor + t instanceof Cfg::ExceptionSuccessor or + t instanceof Cfg::ExitSuccessor } private predicate id(Ruby::AstNode node1, Ruby::AstNode node2) { node1 = node2 } @@ -1528,21 +1524,3 @@ CfgScope getCfgScope(AstNode n) { pragma[only_bind_into](result) = getCfgScopeImpl(n0) ) } - -cached -private module Cached { - cached - newtype TSuccessorType = - TSuccessorSuccessor() or - TBooleanSuccessor(boolean b) { b in [false, true] } or - TMatchingSuccessor(boolean isMatch) { isMatch in [false, true] } or - TReturnSuccessor() or - TBreakSuccessor() or - TNextSuccessor() or - TRedoSuccessor() or - TRetrySuccessor() or - TRaiseSuccessor() or // TODO: Add exception type? - TExitSuccessor() -} - -import Cached diff --git a/ruby/ql/lib/codeql/ruby/controlflow/internal/Guards.qll b/ruby/ql/lib/codeql/ruby/controlflow/internal/Guards.qll index a60102e017c6..387fb03dc9a8 100644 --- a/ruby/ql/lib/codeql/ruby/controlflow/internal/Guards.qll +++ b/ruby/ql/lib/codeql/ruby/controlflow/internal/Guards.qll @@ -6,7 +6,7 @@ private import codeql.ruby.CFG /** Holds if the guard `guard` controls block `bb` upon evaluating to `branch`. */ pragma[nomagic] predicate guardControlsBlock(CfgNodes::AstCfgNode guard, BasicBlock bb, boolean branch) { - exists(ConditionBlock conditionBlock, SuccessorTypes::ConditionalSuccessor s | + exists(ConditionBlock conditionBlock, ConditionalSuccessor s | guard = conditionBlock.getLastNode() and s.getValue() = branch and conditionBlock.edgeDominates(bb, s) diff --git a/ruby/ql/lib/codeql/ruby/controlflow/internal/Splitting.qll b/ruby/ql/lib/codeql/ruby/controlflow/internal/Splitting.qll index 146d5927479d..6a8092922171 100644 --- a/ruby/ql/lib/codeql/ruby/controlflow/internal/Splitting.qll +++ b/ruby/ql/lib/codeql/ruby/controlflow/internal/Splitting.qll @@ -8,7 +8,6 @@ private import codeql.ruby.AST as Ast private import Completion as Comp private import Comp private import ControlFlowGraphImpl -private import SuccessorTypes private import codeql.ruby.controlflow.ControlFlowGraph cached @@ -123,16 +122,19 @@ module EnsureSplitting { * the `ensure` block must end with a `return` as well (provided that * the `ensure` block executes normally). */ - class EnsureSplitType extends SuccessorType { + class EnsureSplitType instanceof SuccessorType { EnsureSplitType() { not this instanceof ConditionalSuccessor } + /** Gets a textual representation of this successor type. */ + string toString() { result = super.toString() } + /** Holds if this split type matches entry into an `ensure` block with completion `c`. */ predicate isSplitForEntryCompletion(Completion c) { if c instanceof NormalCompletion then // If the entry into the `ensure` block completes with any normal completion, // it simply means normal execution after the `ensure` block - this instanceof NormalSuccessor + this instanceof DirectSuccessor else this = c.getAMatchingSuccessorType() } } @@ -195,7 +197,7 @@ module EnsureSplitting { int getNestLevel() { result = nestLevel } override string toString() { - if type instanceof NormalSuccessor + if type instanceof DirectSuccessor then result = "" else if nestLevel > 0 @@ -271,14 +273,14 @@ module EnsureSplitting { or not c instanceof NormalCompletion or - type instanceof NormalSuccessor + type instanceof DirectSuccessor ) else ( // `ensure` block can exit with inherited completion `c`, which must // match this split inherited = true and type = c.getAMatchingSuccessorType() and - not type instanceof NormalSuccessor + not type instanceof DirectSuccessor ) ) or @@ -308,7 +310,7 @@ module EnsureSplitting { exists(EnsureSplitImpl outer | outer.(EnsureSplit).getNestLevel() = super.getNestLevel() - 1 and outer.exit(pred, c, inherited) and - super.getType() instanceof NormalSuccessor and + super.getType() instanceof DirectSuccessor and inherited = true ) } diff --git a/ruby/ql/lib/codeql/ruby/dataflow/internal/DataFlowPrivate.qll b/ruby/ql/lib/codeql/ruby/dataflow/internal/DataFlowPrivate.qll index 91408072ed7c..9332aa43e52b 100644 --- a/ruby/ql/lib/codeql/ruby/dataflow/internal/DataFlowPrivate.qll +++ b/ruby/ql/lib/codeql/ruby/dataflow/internal/DataFlowPrivate.qll @@ -153,7 +153,7 @@ module LocalFlow { exprTo = nodeTo.asExpr() and n.getReturningNode().getAstNode() instanceof BreakStmt and exprTo.getAstNode() instanceof Loop and - nodeTo.asExpr().getAPredecessor(any(SuccessorTypes::BreakSuccessor s)) = n.getReturningNode() + nodeTo.asExpr().getAPredecessor(any(BreakSuccessor s)) = n.getReturningNode() ) or nodeFrom.asExpr() = nodeTo.(ReturningStatementNode).getReturningNode().getReturnedValueNode() @@ -161,7 +161,7 @@ module LocalFlow { nodeTo.asExpr() = any(CfgNodes::ExprNodes::ForExprCfgNode for | exists(SuccessorType s | - not s instanceof SuccessorTypes::BreakSuccessor and + not s instanceof BreakSuccessor and exists(for.getAPredecessor(s)) ) and nodeFrom.asExpr() = for.getValue() @@ -2386,8 +2386,7 @@ module TypeInference { | m = resolveConstantReadAccess(pattern.getExpr()) and cb.getLastNode() = pattern and - cb.edgeDominates(read.getBasicBlock(), - any(SuccessorTypes::MatchingSuccessor match | match.getValue() = true)) and + cb.edgeDominates(read.getBasicBlock(), any(MatchingSuccessor match | match.getValue() = true)) and caseRead = def.getARead() and read = def.getARead() and case.getValue() = caseRead diff --git a/ruby/ql/lib/codeql/ruby/dataflow/internal/SsaImpl.qll b/ruby/ql/lib/codeql/ruby/dataflow/internal/SsaImpl.qll index af5745f6fd3c..029d4c530601 100644 --- a/ruby/ql/lib/codeql/ruby/dataflow/internal/SsaImpl.qll +++ b/ruby/ql/lib/codeql/ruby/dataflow/internal/SsaImpl.qll @@ -487,7 +487,7 @@ private module DataFlowIntegrationInput implements Impl::DataFlowIntegrationInpu * from `bb1` to `bb2`. */ predicate hasValueBranchEdge(BasicBlock bb1, BasicBlock bb2, GuardValue branch) { - exists(Cfg::SuccessorTypes::ConditionalSuccessor s | + exists(Cfg::ConditionalSuccessor s | this.getBasicBlock() = bb1 and bb2 = bb1.getASuccessor(s) and s.getValue() = branch diff --git a/ruby/ql/test/library-tests/controlflow/graph/BasicBlocks.ql b/ruby/ql/test/library-tests/controlflow/graph/BasicBlocks.ql index 8db21dd44964..c99de9bc0a86 100644 --- a/ruby/ql/test/library-tests/controlflow/graph/BasicBlocks.ql +++ b/ruby/ql/test/library-tests/controlflow/graph/BasicBlocks.ql @@ -9,7 +9,7 @@ query predicate immediateDominator(BasicBlock bb1, BasicBlock bb2) { bb1.getImmediateDominator() = bb2 } -query predicate controls(ConditionBlock bb1, BasicBlock bb2, SuccessorTypes::ConditionalSuccessor t) { +query predicate controls(ConditionBlock bb1, BasicBlock bb2, ConditionalSuccessor t) { bb1.edgeDominates(bb2, t) } diff --git a/ruby/ql/test/library-tests/dataflow/barrier-guards/barrier-guards.ql b/ruby/ql/test/library-tests/dataflow/barrier-guards/barrier-guards.ql index 1bf7461e7fac..86609a73909c 100644 --- a/ruby/ql/test/library-tests/dataflow/barrier-guards/barrier-guards.ql +++ b/ruby/ql/test/library-tests/dataflow/barrier-guards/barrier-guards.ql @@ -12,7 +12,7 @@ query predicate newStyleBarrierGuards(DataFlow::Node n) { n instanceof StringConstArrayInclusionCallBarrier } -query predicate controls(CfgNode condition, BasicBlock bb, SuccessorTypes::ConditionalSuccessor s) { +query predicate controls(CfgNode condition, BasicBlock bb, ConditionalSuccessor s) { exists(ConditionBlock cb | cb.edgeDominates(bb, s) and condition = cb.getLastNode() From cf9196fb5579405f5bda53990649b5582d963bd3 Mon Sep 17 00:00:00 2001 From: Anders Schack-Mulligen Date: Wed, 27 Aug 2025 14:39:48 +0200 Subject: [PATCH 027/308] Rust: Use shared SuccessorType. --- .../rust/controlflow/ControlFlowGraph.qll | 18 +---- .../rust/controlflow/internal/Completion.qll | 5 +- .../internal/ControlFlowGraphImpl.qll | 2 +- .../controlflow/internal/SuccessorType.qll | 74 ------------------- .../lib/codeql/rust/internal/CachedStages.qll | 3 - 5 files changed, 4 insertions(+), 98 deletions(-) delete mode 100644 rust/ql/lib/codeql/rust/controlflow/internal/SuccessorType.qll diff --git a/rust/ql/lib/codeql/rust/controlflow/ControlFlowGraph.qll b/rust/ql/lib/codeql/rust/controlflow/ControlFlowGraph.qll index eb8dbdea39f7..b586a1aafee4 100644 --- a/rust/ql/lib/codeql/rust/controlflow/ControlFlowGraph.qll +++ b/rust/ql/lib/codeql/rust/controlflow/ControlFlowGraph.qll @@ -1,25 +1,9 @@ /** Provides classes representing the control flow graph. */ private import internal.ControlFlowGraphImpl -private import internal.SuccessorType private import internal.Scope as Scope +import codeql.controlflow.SuccessorType final class CfgScope = Scope::CfgScope; -final class SuccessorType = SuccessorTypeImpl; - -final class NormalSuccessor = NormalSuccessorImpl; - -final class ConditionalSuccessor = ConditionalSuccessorImpl; - -final class BooleanSuccessor = BooleanSuccessorImpl; - -final class MatchSuccessor = MatchSuccessorImpl; - -final class BreakSuccessor = BreakSuccessorImpl; - -final class ContinueSuccessor = ContinueSuccessorImpl; - -final class ReturnSuccessor = ReturnSuccessorImpl; - final class CfgNode = Node; diff --git a/rust/ql/lib/codeql/rust/controlflow/internal/Completion.qll b/rust/ql/lib/codeql/rust/controlflow/internal/Completion.qll index 01169ce2727a..0250f1cbc435 100644 --- a/rust/ql/lib/codeql/rust/controlflow/internal/Completion.qll +++ b/rust/ql/lib/codeql/rust/controlflow/internal/Completion.qll @@ -1,7 +1,6 @@ private import codeql.util.Boolean private import codeql.rust.controlflow.ControlFlowGraph private import rust -private import SuccessorType newtype TCompletion = TSimpleCompletion() or @@ -32,7 +31,7 @@ abstract class NormalCompletion extends Completion { } /** A simple (normal) completion. */ class SimpleCompletion extends NormalCompletion, TSimpleCompletion { - override NormalSuccessor getAMatchingSuccessorType() { any() } + override DirectSuccessor getAMatchingSuccessorType() { any() } // `SimpleCompletion` is the "default" completion type, thus it is valid for // any node where there isn't another more specific completion type. @@ -184,7 +183,7 @@ class MatchCompletion extends TMatchCompletion, ConditionalCompletion { e instanceof TryExpr and value = true } - override MatchSuccessor getAMatchingSuccessorType() { result.getValue() = value } + override MatchingSuccessor getAMatchingSuccessorType() { result.getValue() = value } /** Gets the dual match completion. */ override MatchCompletion getDual() { result = TMatchCompletion(value.booleanNot()) } diff --git a/rust/ql/lib/codeql/rust/controlflow/internal/ControlFlowGraphImpl.qll b/rust/ql/lib/codeql/rust/controlflow/internal/ControlFlowGraphImpl.qll index e989931e0698..b7607aa025b5 100644 --- a/rust/ql/lib/codeql/rust/controlflow/internal/ControlFlowGraphImpl.qll +++ b/rust/ql/lib/codeql/rust/controlflow/internal/ControlFlowGraphImpl.qll @@ -37,7 +37,7 @@ private module CfgInput implements InputSig { /** * Hold if `c` represents simple (normal) evaluation of a statement or an expression. */ - predicate successorTypeIsSimple(SuccessorType t) { t instanceof Cfg::NormalSuccessor } + predicate successorTypeIsSimple(SuccessorType t) { t instanceof Cfg::DirectSuccessor } /** Holds if `t` is an abnormal exit type out of a CFG scope. */ predicate isAbnormalExitType(SuccessorType t) { none() } diff --git a/rust/ql/lib/codeql/rust/controlflow/internal/SuccessorType.qll b/rust/ql/lib/codeql/rust/controlflow/internal/SuccessorType.qll deleted file mode 100644 index 658d2a667061..000000000000 --- a/rust/ql/lib/codeql/rust/controlflow/internal/SuccessorType.qll +++ /dev/null @@ -1,74 +0,0 @@ -private import rust -private import codeql.util.Boolean -private import Completion -private import codeql.rust.internal.CachedStages - -cached -newtype TSuccessorType = - TNormalSuccessor() { Stages::CfgStage::ref() } or - TBooleanSuccessor(Boolean b) or - TMatchSuccessor(Boolean b) or - TBreakSuccessor() or - TContinueSuccessor() or - TReturnSuccessor() - -/** The type of a control flow successor. */ -abstract class SuccessorTypeImpl extends TSuccessorType { - /** Gets a textual representation of successor type. */ - abstract string toString(); -} - -/** A normal control flow successor. */ -class NormalSuccessorImpl extends SuccessorTypeImpl, TNormalSuccessor { - override string toString() { result = "successor" } -} - -/** A conditional control flow successor. */ -abstract class ConditionalSuccessorImpl extends SuccessorTypeImpl { - boolean value; - - bindingset[value] - ConditionalSuccessorImpl() { exists(value) } - - /** Gets the Boolean value of this successor. */ - boolean getValue() { result = value } -} - -/** A Boolean control flow successor for a boolean conditon. */ -class BooleanSuccessorImpl extends ConditionalSuccessorImpl, TBooleanSuccessor { - BooleanSuccessorImpl() { this = TBooleanSuccessor(value) } - - override string toString() { result = this.getValue().toString() } -} - -/** - * A control flow successor of a pattern match. - */ -class MatchSuccessorImpl extends ConditionalSuccessorImpl, TMatchSuccessor { - MatchSuccessorImpl() { this = TMatchSuccessor(value) } - - override string toString() { - if this.getValue() = true then result = "match" else result = "no-match" - } -} - -/** - * A control flow successor of a `break` expression. - */ -class BreakSuccessorImpl extends SuccessorTypeImpl, TBreakSuccessor { - override string toString() { result = "break" } -} - -/** - * A control flow successor of a `continue` expression. - */ -class ContinueSuccessorImpl extends SuccessorTypeImpl, TContinueSuccessor { - override string toString() { result = "continue" } -} - -/** - * A `return` control flow successor. - */ -class ReturnSuccessorImpl extends SuccessorTypeImpl, TReturnSuccessor { - override string toString() { result = "return" } -} diff --git a/rust/ql/lib/codeql/rust/internal/CachedStages.qll b/rust/ql/lib/codeql/rust/internal/CachedStages.qll index c2dc21661783..cfd3d6905220 100644 --- a/rust/ql/lib/codeql/rust/internal/CachedStages.qll +++ b/rust/ql/lib/codeql/rust/internal/CachedStages.qll @@ -65,7 +65,6 @@ module Stages { cached module CfgStage { private import codeql.rust.controlflow.internal.Splitting - private import codeql.rust.controlflow.internal.SuccessorType private import codeql.rust.controlflow.internal.ControlFlowGraphImpl private import codeql.rust.controlflow.CfgNodes @@ -87,8 +86,6 @@ module Stages { or exists(TConditionalCompletionSplitKind()) or - exists(TNormalSuccessor()) - or exists(AstCfgNode n) or exists(CallExprCfgNode n | exists(n.getFunction())) From c1662cf05c1107d09644476e0a9f6660f09489a5 Mon Sep 17 00:00:00 2001 From: Anders Schack-Mulligen Date: Thu, 28 Aug 2025 09:52:08 +0200 Subject: [PATCH 028/308] C#/Ruby: Accept qltest changes. Mostly toString changes, and a slight change to splitting in C#. --- .../AssignableDefinitionNode.expected | 2 +- .../controlflow/graph/BasicBlock.expected | 164 +- .../controlflow/graph/Condition.expected | 335 ++-- .../controlflow/graph/Dominance.expected | 1687 ++++++----------- .../graph/EnclosingCallable.expected | 653 +++---- .../controlflow/graph/NodeGraph.expected | 817 +++----- .../controlflow/graph/Nodes.expected | 569 ++---- .../csharp8/switchexprcontrolflow.expected | 22 +- .../dataflow/ssa/SsaDef.expected | 2 +- .../dataflow/ssa/SsaDefElement.expected | 2 +- .../dataflow/ssa/SsaExplicitDef.expected | 2 +- .../dataflow/ssa/SsaRead.expected | 2 +- .../dataflow/ssa/SsaUltimateDef.expected | 2 +- .../ql/test/library-tests/goto/Goto1.expected | 12 +- .../controlflow/graph/BasicBlocks.expected | 598 +++--- .../controlflow/graph/Cfg.expected | 340 ++-- .../controlflow/graph/Nodes.expected | 38 +- 17 files changed, 1969 insertions(+), 3278 deletions(-) diff --git a/csharp/ql/test/library-tests/assignables/AssignableDefinitionNode.expected b/csharp/ql/test/library-tests/assignables/AssignableDefinitionNode.expected index 7d1d5bf5af2c..0189d522a6cd 100644 --- a/csharp/ql/test/library-tests/assignables/AssignableDefinitionNode.expected +++ b/csharp/ql/test/library-tests/assignables/AssignableDefinitionNode.expected @@ -81,7 +81,7 @@ | Discards.cs:25:22:25:22 | String _ | Discards.cs:25:22:25:22 | String _ | | Finally.cs:7:13:7:17 | Int32 i = ... | Finally.cs:7:13:7:17 | Int32 i = ... | | Finally.cs:15:13:15:17 | ... = ... | Finally.cs:15:13:15:17 | ... = ... | -| Finally.cs:15:13:15:17 | ... = ... | Finally.cs:15:13:15:17 | [finally: exception(Exception)] ... = ... | +| Finally.cs:15:13:15:17 | ... = ... | Finally.cs:15:13:15:17 | [finally: exception] ... = ... | | Patterns.cs:7:16:7:23 | Object o = ... | Patterns.cs:7:16:7:23 | Object o = ... | | Patterns.cs:8:18:8:23 | Int32 i1 | Patterns.cs:8:18:8:23 | Int32 i1 | | Patterns.cs:12:23:12:31 | String s1 | Patterns.cs:12:23:12:31 | String s1 | diff --git a/csharp/ql/test/library-tests/controlflow/graph/BasicBlock.expected b/csharp/ql/test/library-tests/controlflow/graph/BasicBlock.expected index 6177eb7e3350..4f78a6f8303e 100644 --- a/csharp/ql/test/library-tests/controlflow/graph/BasicBlock.expected +++ b/csharp/ql/test/library-tests/controlflow/graph/BasicBlock.expected @@ -435,33 +435,32 @@ | Finally.cs:3:14:3:20 | enter Finally | Finally.cs:3:14:3:20 | exit Finally | 5 | | Finally.cs:7:10:7:11 | enter M1 | Finally.cs:11:13:11:37 | call to method WriteLine | 7 | | Finally.cs:7:10:7:11 | exit M1 | Finally.cs:7:10:7:11 | exit M1 | 1 | -| Finally.cs:14:9:16:9 | [finally: exception(Exception)] {...} | Finally.cs:7:10:7:11 | exit M1 (abnormal) | 5 | +| Finally.cs:14:9:16:9 | [finally: exception] {...} | Finally.cs:7:10:7:11 | exit M1 (abnormal) | 5 | | Finally.cs:14:9:16:9 | {...} | Finally.cs:7:10:7:11 | exit M1 (normal) | 5 | | Finally.cs:19:10:19:11 | enter M2 | Finally.cs:23:13:23:37 | call to method WriteLine | 7 | | Finally.cs:19:10:19:11 | exit M2 | Finally.cs:19:10:19:11 | exit M2 | 1 | -| Finally.cs:19:10:19:11 | exit M2 (abnormal) | Finally.cs:19:10:19:11 | exit M2 (abnormal) | 1 | | Finally.cs:19:10:19:11 | exit M2 (normal) | Finally.cs:19:10:19:11 | exit M2 (normal) | 1 | | Finally.cs:24:13:24:19 | return ...; | Finally.cs:50:13:50:40 | [finally: return] call to method WriteLine | 5 | | Finally.cs:26:9:29:9 | [exception: Exception] catch (...) {...} | Finally.cs:26:9:29:9 | [exception: Exception] catch (...) {...} | 1 | | Finally.cs:26:38:26:39 | [exception: Exception] IOException ex | Finally.cs:26:48:26:51 | [exception: Exception] true | 2 | -| Finally.cs:27:9:29:9 | {...} | Finally.cs:50:13:50:40 | [finally: exception(IOException)] call to method WriteLine | 6 | +| Finally.cs:27:9:29:9 | {...} | Finally.cs:28:13:28:18 | throw ...; | 2 | | Finally.cs:30:9:40:9 | [exception: Exception] catch (...) {...} | Finally.cs:30:9:40:9 | [exception: Exception] catch (...) {...} | 1 | | Finally.cs:30:41:30:42 | [exception: Exception] ArgumentException ex | Finally.cs:34:21:34:24 | true | 6 | -| Finally.cs:34:27:34:32 | throw ...; | Finally.cs:50:13:50:40 | [finally: exception(Exception)] call to method WriteLine | 9 | +| Finally.cs:34:27:34:32 | throw ...; | Finally.cs:38:17:38:44 | [finally: exception] throw ...; | 5 | | Finally.cs:41:9:43:9 | [exception: Exception] catch (...) {...} | Finally.cs:41:9:43:9 | [exception: Exception] catch (...) {...} | 1 | | Finally.cs:42:9:43:9 | {...} | Finally.cs:50:13:50:40 | call to method WriteLine | 5 | +| Finally.cs:49:9:51:9 | [finally: exception] {...} | Finally.cs:19:10:19:11 | exit M2 (abnormal) | 5 | | Finally.cs:54:10:54:11 | enter M3 | Finally.cs:58:13:58:37 | call to method WriteLine | 7 | | Finally.cs:54:10:54:11 | exit M3 | Finally.cs:54:10:54:11 | exit M3 | 1 | -| Finally.cs:54:10:54:11 | exit M3 (abnormal) | Finally.cs:54:10:54:11 | exit M3 (abnormal) | 1 | | Finally.cs:54:10:54:11 | exit M3 (normal) | Finally.cs:54:10:54:11 | exit M3 (normal) | 1 | | Finally.cs:59:13:59:19 | return ...; | Finally.cs:70:13:70:40 | [finally: return] call to method WriteLine | 5 | | Finally.cs:61:9:64:9 | [exception: Exception] catch (...) {...} | Finally.cs:61:9:64:9 | [exception: Exception] catch (...) {...} | 1 | | Finally.cs:61:38:61:39 | [exception: Exception] IOException ex | Finally.cs:61:48:61:51 | [exception: Exception] true | 2 | -| Finally.cs:62:9:64:9 | {...} | Finally.cs:70:13:70:40 | [finally: exception(IOException)] call to method WriteLine | 6 | +| Finally.cs:62:9:64:9 | {...} | Finally.cs:63:13:63:18 | throw ...; | 2 | | Finally.cs:65:9:67:9 | [exception: Exception] catch (...) {...} | Finally.cs:65:9:67:9 | [exception: Exception] catch (...) {...} | 1 | | Finally.cs:65:26:65:26 | [exception: Exception] Exception e | Finally.cs:65:35:65:51 | [exception: Exception] ... != ... | 5 | | Finally.cs:66:9:67:9 | {...} | Finally.cs:70:13:70:40 | call to method WriteLine | 5 | -| Finally.cs:69:9:71:9 | [finally: exception(Exception)] {...} | Finally.cs:70:13:70:40 | [finally: exception(Exception)] call to method WriteLine | 4 | +| Finally.cs:69:9:71:9 | [finally: exception] {...} | Finally.cs:54:10:54:11 | exit M3 (abnormal) | 5 | | Finally.cs:74:10:74:11 | enter M4 | Finally.cs:77:9:100:9 | while (...) ... | 6 | | Finally.cs:74:10:74:11 | exit M4 | Finally.cs:74:10:74:11 | exit M4 | 1 | | Finally.cs:74:10:74:11 | exit M4 (abnormal) | Finally.cs:74:10:74:11 | exit M4 (abnormal) | 1 | @@ -482,12 +481,12 @@ | Finally.cs:93:31:93:45 | [finally: continue] object creation of type Exception | Finally.cs:93:31:93:45 | [finally: continue] object creation of type Exception | 1 | | Finally.cs:93:31:93:45 | [finally: return] object creation of type Exception | Finally.cs:93:31:93:45 | [finally: return] object creation of type Exception | 1 | | Finally.cs:93:31:93:45 | object creation of type Exception | Finally.cs:93:31:93:45 | object creation of type Exception | 1 | -| Finally.cs:96:17:98:17 | [finally(1): exception(Exception)] {...} | Finally.cs:97:21:97:23 | [finally(1): exception(Exception)] ...-- | 4 | -| Finally.cs:96:17:98:17 | [finally: break, finally(1): exception(Exception)] {...} | Finally.cs:97:21:97:23 | [finally: break, finally(1): exception(Exception)] ...-- | 4 | +| Finally.cs:96:17:98:17 | [finally(1): exception] {...} | Finally.cs:97:21:97:23 | [finally(1): exception] ...-- | 4 | +| Finally.cs:96:17:98:17 | [finally: break, finally(1): exception] {...} | Finally.cs:97:21:97:23 | [finally: break, finally(1): exception] ...-- | 4 | | Finally.cs:96:17:98:17 | [finally: break] {...} | Finally.cs:97:21:97:23 | [finally: break] ...-- | 4 | -| Finally.cs:96:17:98:17 | [finally: continue, finally(1): exception(Exception)] {...} | Finally.cs:97:21:97:23 | [finally: continue, finally(1): exception(Exception)] ...-- | 4 | +| Finally.cs:96:17:98:17 | [finally: continue, finally(1): exception] {...} | Finally.cs:97:21:97:23 | [finally: continue, finally(1): exception] ...-- | 4 | | Finally.cs:96:17:98:17 | [finally: continue] {...} | Finally.cs:97:21:97:23 | [finally: continue] ...-- | 4 | -| Finally.cs:96:17:98:17 | [finally: return, finally(1): exception(Exception)] {...} | Finally.cs:97:21:97:23 | [finally: return, finally(1): exception(Exception)] ...-- | 4 | +| Finally.cs:96:17:98:17 | [finally: return, finally(1): exception] {...} | Finally.cs:97:21:97:23 | [finally: return, finally(1): exception] ...-- | 4 | | Finally.cs:96:17:98:17 | [finally: return] {...} | Finally.cs:97:21:97:23 | [finally: return] ...-- | 4 | | Finally.cs:96:17:98:17 | {...} | Finally.cs:97:21:97:23 | ...-- | 4 | | Finally.cs:103:10:103:11 | enter M5 | Finally.cs:107:17:107:21 | access to field Field | 7 | @@ -500,75 +499,55 @@ | Finally.cs:109:13:110:49 | if (...) ... | Finally.cs:109:17:109:21 | access to field Field | 3 | | Finally.cs:109:17:109:28 | access to property Length | Finally.cs:109:17:109:28 | access to property Length | 1 | | Finally.cs:109:33:109:33 | 1 | Finally.cs:109:17:109:33 | ... == ... | 2 | -| Finally.cs:110:17:110:49 | throw ...; | Finally.cs:114:19:114:35 | [finally: exception(OutOfMemoryException)] ... == ... | 8 | +| Finally.cs:110:17:110:49 | throw ...; | Finally.cs:110:17:110:49 | throw ...; | 1 | | Finally.cs:110:23:110:48 | object creation of type OutOfMemoryException | Finally.cs:110:23:110:48 | object creation of type OutOfMemoryException | 1 | -| Finally.cs:113:9:118:9 | [finally: exception(Exception)] {...} | Finally.cs:114:19:114:35 | [finally: exception(Exception)] ... == ... | 7 | -| Finally.cs:113:9:118:9 | [finally: exception(NullReferenceException)] {...} | Finally.cs:114:19:114:35 | [finally: exception(NullReferenceException)] ... == ... | 7 | +| Finally.cs:113:9:118:9 | [finally: exception] {...} | Finally.cs:114:19:114:35 | [finally: exception] ... == ... | 7 | | Finally.cs:113:9:118:9 | {...} | Finally.cs:114:19:114:35 | ... == ... | 7 | -| Finally.cs:114:17:114:36 | [false, finally: exception(Exception)] !... | Finally.cs:114:17:114:36 | [false, finally: exception(Exception)] !... | 1 | -| Finally.cs:114:17:114:36 | [false, finally: exception(NullReferenceException)] !... | Finally.cs:114:17:114:36 | [false, finally: exception(NullReferenceException)] !... | 1 | -| Finally.cs:114:17:114:36 | [false, finally: exception(OutOfMemoryException)] !... | Finally.cs:114:17:114:36 | [false, finally: exception(OutOfMemoryException)] !... | 1 | +| Finally.cs:114:17:114:36 | [false, finally: exception] !... | Finally.cs:114:17:114:36 | [false, finally: exception] !... | 1 | | Finally.cs:114:17:114:36 | [false, finally: return] !... | Finally.cs:114:17:114:36 | [false, finally: return] !... | 1 | | Finally.cs:114:17:114:36 | [false] !... | Finally.cs:114:17:114:36 | [false] !... | 1 | -| Finally.cs:114:17:114:36 | [true, finally: exception(Exception)] !... | Finally.cs:114:17:114:36 | [true, finally: exception(Exception)] !... | 1 | -| Finally.cs:114:17:114:36 | [true, finally: exception(NullReferenceException)] !... | Finally.cs:114:17:114:36 | [true, finally: exception(NullReferenceException)] !... | 1 | -| Finally.cs:114:17:114:36 | [true, finally: exception(OutOfMemoryException)] !... | Finally.cs:114:17:114:36 | [true, finally: exception(OutOfMemoryException)] !... | 1 | +| Finally.cs:114:17:114:36 | [true, finally: exception] !... | Finally.cs:114:17:114:36 | [true, finally: exception] !... | 1 | | Finally.cs:114:17:114:36 | [true, finally: return] !... | Finally.cs:114:17:114:36 | [true, finally: return] !... | 1 | | Finally.cs:114:17:114:36 | [true] !... | Finally.cs:114:17:114:36 | [true] !... | 1 | | Finally.cs:115:17:115:41 | ...; | Finally.cs:115:17:115:40 | call to method WriteLine | 4 | -| Finally.cs:115:17:115:41 | [finally: exception(Exception)] ...; | Finally.cs:115:17:115:40 | [finally: exception(Exception)] call to method WriteLine | 4 | -| Finally.cs:115:17:115:41 | [finally: exception(NullReferenceException)] ...; | Finally.cs:115:17:115:40 | [finally: exception(NullReferenceException)] call to method WriteLine | 4 | -| Finally.cs:115:17:115:41 | [finally: exception(OutOfMemoryException)] ...; | Finally.cs:115:17:115:40 | [finally: exception(OutOfMemoryException)] call to method WriteLine | 4 | +| Finally.cs:115:17:115:41 | [finally: exception] ...; | Finally.cs:115:17:115:40 | [finally: exception] call to method WriteLine | 4 | | Finally.cs:115:17:115:41 | [finally: return] ...; | Finally.cs:115:17:115:40 | [finally: return] call to method WriteLine | 4 | -| Finally.cs:116:13:117:37 | [finally: exception(Exception)] if (...) ... | Finally.cs:116:17:116:32 | [finally: exception(Exception)] ... > ... | 6 | -| Finally.cs:116:13:117:37 | [finally: exception(NullReferenceException)] if (...) ... | Finally.cs:116:17:116:32 | [finally: exception(NullReferenceException)] ... > ... | 6 | -| Finally.cs:116:13:117:37 | [finally: exception(OutOfMemoryException)] if (...) ... | Finally.cs:116:17:116:32 | [finally: exception(OutOfMemoryException)] ... > ... | 6 | +| Finally.cs:116:13:117:37 | [finally: exception] if (...) ... | Finally.cs:116:17:116:32 | [finally: exception] ... > ... | 6 | | Finally.cs:116:13:117:37 | [finally: return] if (...) ... | Finally.cs:116:17:116:32 | [finally: return] ... > ... | 6 | | Finally.cs:116:13:117:37 | if (...) ... | Finally.cs:116:17:116:32 | ... > ... | 6 | | Finally.cs:117:17:117:37 | ...; | Finally.cs:117:17:117:36 | call to method WriteLine | 3 | -| Finally.cs:117:17:117:37 | [finally: exception(Exception)] ...; | Finally.cs:117:17:117:36 | [finally: exception(Exception)] call to method WriteLine | 3 | -| Finally.cs:117:17:117:37 | [finally: exception(NullReferenceException)] ...; | Finally.cs:117:17:117:36 | [finally: exception(NullReferenceException)] call to method WriteLine | 3 | -| Finally.cs:117:17:117:37 | [finally: exception(OutOfMemoryException)] ...; | Finally.cs:117:17:117:36 | [finally: exception(OutOfMemoryException)] call to method WriteLine | 3 | +| Finally.cs:117:17:117:37 | [finally: exception] ...; | Finally.cs:117:17:117:36 | [finally: exception] call to method WriteLine | 3 | | Finally.cs:117:17:117:37 | [finally: return] ...; | Finally.cs:117:17:117:36 | [finally: return] call to method WriteLine | 3 | | Finally.cs:121:10:121:11 | enter M6 | Finally.cs:121:10:121:11 | exit M6 | 12 | | Finally.cs:133:10:133:11 | enter M7 | Finally.cs:137:13:137:36 | call to method WriteLine | 7 | | Finally.cs:133:10:133:11 | exit M7 (abnormal) | Finally.cs:133:10:133:11 | exit M7 | 2 | -| Finally.cs:140:9:143:9 | [finally: exception(Exception)] {...} | Finally.cs:141:13:141:44 | [finally: exception(Exception)] throw ...; | 4 | +| Finally.cs:140:9:143:9 | [finally: exception] {...} | Finally.cs:141:13:141:44 | [finally: exception] throw ...; | 4 | | Finally.cs:140:9:143:9 | {...} | Finally.cs:141:13:141:44 | throw ...; | 4 | | Finally.cs:147:10:147:11 | enter M8 | Finally.cs:151:17:151:28 | ... == ... | 8 | | Finally.cs:147:10:147:11 | exit M8 | Finally.cs:147:10:147:11 | exit M8 | 1 | | Finally.cs:147:10:147:11 | exit M8 (abnormal) | Finally.cs:147:10:147:11 | exit M8 (abnormal) | 1 | | Finally.cs:147:10:147:11 | exit M8 (normal) | Finally.cs:147:10:147:11 | exit M8 (normal) | 1 | -| Finally.cs:152:17:152:50 | throw ...; | Finally.cs:158:21:158:31 | [finally: exception(ArgumentNullException)] access to property Length | 7 | +| Finally.cs:152:17:152:50 | throw ...; | Finally.cs:152:17:152:50 | throw ...; | 1 | | Finally.cs:152:23:152:49 | object creation of type ArgumentNullException | Finally.cs:152:23:152:49 | object creation of type ArgumentNullException | 1 | -| Finally.cs:155:9:169:9 | [finally: exception(Exception)] {...} | Finally.cs:158:21:158:31 | [finally: exception(Exception)] access to property Length | 6 | +| Finally.cs:155:9:169:9 | [finally: exception] {...} | Finally.cs:158:21:158:31 | [finally: exception] access to property Length | 6 | | Finally.cs:155:9:169:9 | {...} | Finally.cs:158:21:158:31 | access to property Length | 6 | | Finally.cs:158:36:158:36 | 1 | Finally.cs:158:21:158:36 | ... == ... | 2 | -| Finally.cs:158:36:158:36 | [finally: exception(ArgumentNullException)] 1 | Finally.cs:158:21:158:36 | [finally: exception(ArgumentNullException)] ... == ... | 2 | -| Finally.cs:158:36:158:36 | [finally: exception(Exception)] 1 | Finally.cs:158:21:158:36 | [finally: exception(Exception)] ... == ... | 2 | -| Finally.cs:159:21:159:45 | [finally: exception(ArgumentNullException)] throw ...; | Finally.cs:159:21:159:45 | [finally: exception(ArgumentNullException)] throw ...; | 1 | -| Finally.cs:159:21:159:45 | [finally: exception(Exception)] throw ...; | Finally.cs:159:21:159:45 | [finally: exception(Exception)] throw ...; | 1 | +| Finally.cs:158:36:158:36 | [finally: exception] 1 | Finally.cs:158:21:158:36 | [finally: exception] ... == ... | 2 | +| Finally.cs:159:21:159:45 | [finally: exception] throw ...; | Finally.cs:159:21:159:45 | [finally: exception] throw ...; | 1 | | Finally.cs:159:21:159:45 | throw ...; | Finally.cs:159:21:159:45 | throw ...; | 1 | | Finally.cs:159:41:159:43 | "1" | Finally.cs:159:27:159:44 | object creation of type Exception | 2 | -| Finally.cs:159:41:159:43 | [finally: exception(ArgumentNullException)] "1" | Finally.cs:159:27:159:44 | [finally: exception(ArgumentNullException)] object creation of type Exception | 2 | -| Finally.cs:159:41:159:43 | [finally: exception(Exception)] "1" | Finally.cs:159:27:159:44 | [finally: exception(Exception)] object creation of type Exception | 2 | +| Finally.cs:159:41:159:43 | [finally: exception] "1" | Finally.cs:159:27:159:44 | [finally: exception] object creation of type Exception | 2 | | Finally.cs:161:13:164:13 | [exception: Exception] catch (...) {...} | Finally.cs:161:13:164:13 | [exception: Exception] catch (...) {...} | 1 | | Finally.cs:161:13:164:13 | [exception: NullReferenceException] catch (...) {...} | Finally.cs:161:13:164:13 | [exception: NullReferenceException] catch (...) {...} | 1 | -| Finally.cs:161:13:164:13 | [finally: exception(ArgumentNullException), exception: Exception] catch (...) {...} | Finally.cs:161:13:164:13 | [finally: exception(ArgumentNullException), exception: Exception] catch (...) {...} | 1 | -| Finally.cs:161:13:164:13 | [finally: exception(ArgumentNullException), exception: NullReferenceException] catch (...) {...} | Finally.cs:161:13:164:13 | [finally: exception(ArgumentNullException), exception: NullReferenceException] catch (...) {...} | 1 | -| Finally.cs:161:13:164:13 | [finally: exception(Exception), exception: Exception] catch (...) {...} | Finally.cs:161:13:164:13 | [finally: exception(Exception), exception: Exception] catch (...) {...} | 1 | -| Finally.cs:161:13:164:13 | [finally: exception(Exception), exception: NullReferenceException] catch (...) {...} | Finally.cs:161:13:164:13 | [finally: exception(Exception), exception: NullReferenceException] catch (...) {...} | 1 | +| Finally.cs:161:13:164:13 | [finally: exception, exception: Exception] catch (...) {...} | Finally.cs:161:13:164:13 | [finally: exception, exception: Exception] catch (...) {...} | 1 | +| Finally.cs:161:13:164:13 | [finally: exception, exception: NullReferenceException] catch (...) {...} | Finally.cs:161:13:164:13 | [finally: exception, exception: NullReferenceException] catch (...) {...} | 1 | | Finally.cs:161:30:161:30 | [exception: Exception] Exception e | Finally.cs:161:39:161:54 | [exception: Exception] ... == ... | 5 | | Finally.cs:161:30:161:30 | [exception: NullReferenceException] Exception e | Finally.cs:161:39:161:54 | [exception: NullReferenceException] ... == ... | 5 | -| Finally.cs:161:30:161:30 | [finally: exception(ArgumentNullException), exception: Exception] Exception e | Finally.cs:161:39:161:54 | [finally: exception(ArgumentNullException), exception: Exception] ... == ... | 5 | -| Finally.cs:161:30:161:30 | [finally: exception(ArgumentNullException), exception: NullReferenceException] Exception e | Finally.cs:161:39:161:54 | [finally: exception(ArgumentNullException), exception: NullReferenceException] ... == ... | 5 | -| Finally.cs:161:30:161:30 | [finally: exception(Exception), exception: Exception] Exception e | Finally.cs:161:39:161:54 | [finally: exception(Exception), exception: Exception] ... == ... | 5 | -| Finally.cs:161:30:161:30 | [finally: exception(Exception), exception: NullReferenceException] Exception e | Finally.cs:161:39:161:54 | [finally: exception(Exception), exception: NullReferenceException] ... == ... | 5 | -| Finally.cs:162:13:164:13 | [finally: exception(ArgumentNullException)] {...} | Finally.cs:163:17:163:42 | [finally: exception(ArgumentNullException)] call to method WriteLine | 6 | -| Finally.cs:162:13:164:13 | [finally: exception(Exception)] {...} | Finally.cs:163:17:163:42 | [finally: exception(Exception)] call to method WriteLine | 6 | +| Finally.cs:161:30:161:30 | [finally: exception, exception: Exception] Exception e | Finally.cs:161:39:161:54 | [finally: exception, exception: Exception] ... == ... | 5 | +| Finally.cs:161:30:161:30 | [finally: exception, exception: NullReferenceException] Exception e | Finally.cs:161:39:161:54 | [finally: exception, exception: NullReferenceException] ... == ... | 5 | +| Finally.cs:162:13:164:13 | [finally: exception] {...} | Finally.cs:163:17:163:42 | [finally: exception] call to method WriteLine | 6 | | Finally.cs:162:13:164:13 | {...} | Finally.cs:163:17:163:42 | call to method WriteLine | 6 | -| Finally.cs:165:13:168:13 | [finally: exception(ArgumentNullException)] catch {...} | Finally.cs:167:17:167:37 | [finally: exception(ArgumentNullException)] call to method WriteLine | 5 | -| Finally.cs:165:13:168:13 | [finally: exception(Exception)] catch {...} | Finally.cs:167:17:167:37 | [finally: exception(Exception)] call to method WriteLine | 5 | +| Finally.cs:165:13:168:13 | [finally: exception] catch {...} | Finally.cs:167:17:167:37 | [finally: exception] call to method WriteLine | 5 | | Finally.cs:165:13:168:13 | catch {...} | Finally.cs:167:17:167:37 | call to method WriteLine | 5 | | Finally.cs:172:11:172:20 | enter ExceptionA | Finally.cs:172:11:172:20 | exit ExceptionA | 5 | | Finally.cs:173:11:173:20 | enter ExceptionB | Finally.cs:173:11:173:20 | exit ExceptionB | 5 | @@ -577,89 +556,66 @@ | Finally.cs:176:10:176:11 | exit M9 | Finally.cs:176:10:176:11 | exit M9 | 1 | | Finally.cs:176:10:176:11 | exit M9 (abnormal) | Finally.cs:176:10:176:11 | exit M9 (abnormal) | 1 | | Finally.cs:176:10:176:11 | exit M9 (normal) | Finally.cs:176:10:176:11 | exit M9 (normal) | 1 | -| Finally.cs:180:21:180:43 | [b1 (line 176): true] throw ...; | Finally.cs:186:21:186:22 | [finally: exception(ExceptionA), b1 (line 176): true] access to parameter b2 | 6 | +| Finally.cs:180:21:180:43 | [b1 (line 176): true] throw ...; | Finally.cs:180:21:180:43 | [b1 (line 176): true] throw ...; | 1 | | Finally.cs:180:27:180:42 | [b1 (line 176): true] object creation of type ExceptionA | Finally.cs:180:27:180:42 | [b1 (line 176): true] object creation of type ExceptionA | 1 | | Finally.cs:183:9:192:9 | [b1 (line 176): false] {...} | Finally.cs:186:21:186:22 | [b1 (line 176): false] access to parameter b2 | 5 | -| Finally.cs:183:9:192:9 | [finally: exception(Exception), b1 (line 176): true] {...} | Finally.cs:186:21:186:22 | [finally: exception(Exception), b1 (line 176): true] access to parameter b2 | 5 | +| Finally.cs:183:9:192:9 | [finally: exception, b1 (line 176): true] {...} | Finally.cs:186:21:186:22 | [finally: exception, b1 (line 176): true] access to parameter b2 | 5 | | Finally.cs:186:25:186:47 | [b1 (line 176): false, b2 (line 176): true] throw ...; | Finally.cs:188:13:191:13 | [exception: ExceptionB, b1 (line 176): false, b2 (line 176): true] catch (...) {...} | 2 | -| Finally.cs:186:25:186:47 | [finally: exception(Exception), b1 (line 176): true, b2 (line 176): true] throw ...; | Finally.cs:188:13:191:13 | [finally: exception(Exception), exception: ExceptionB, b1 (line 176): true, b2 (line 176): true] catch (...) {...} | 2 | -| Finally.cs:186:25:186:47 | [finally: exception(ExceptionA), b1 (line 176): true, b2 (line 176): true] throw ...; | Finally.cs:188:13:191:13 | [finally: exception(ExceptionA), exception: ExceptionB, b1 (line 176): true, b2 (line 176): true] catch (...) {...} | 2 | +| Finally.cs:186:25:186:47 | [finally: exception, b1 (line 176): true, b2 (line 176): true] throw ...; | Finally.cs:188:13:191:13 | [finally: exception, exception: ExceptionB, b1 (line 176): true, b2 (line 176): true] catch (...) {...} | 2 | | Finally.cs:186:31:186:46 | [b1 (line 176): false, b2 (line 176): true] object creation of type ExceptionB | Finally.cs:186:31:186:46 | [b1 (line 176): false, b2 (line 176): true] object creation of type ExceptionB | 1 | -| Finally.cs:186:31:186:46 | [finally: exception(Exception), b1 (line 176): true, b2 (line 176): true] object creation of type ExceptionB | Finally.cs:186:31:186:46 | [finally: exception(Exception), b1 (line 176): true, b2 (line 176): true] object creation of type ExceptionB | 1 | -| Finally.cs:186:31:186:46 | [finally: exception(ExceptionA), b1 (line 176): true, b2 (line 176): true] object creation of type ExceptionB | Finally.cs:186:31:186:46 | [finally: exception(ExceptionA), b1 (line 176): true, b2 (line 176): true] object creation of type ExceptionB | 1 | +| Finally.cs:186:31:186:46 | [finally: exception, b1 (line 176): true, b2 (line 176): true] object creation of type ExceptionB | Finally.cs:186:31:186:46 | [finally: exception, b1 (line 176): true, b2 (line 176): true] object creation of type ExceptionB | 1 | | Finally.cs:188:13:191:13 | [exception: Exception, b1 (line 176): false, b2 (line 176): true] catch (...) {...} | Finally.cs:188:13:191:13 | [exception: Exception, b1 (line 176): false, b2 (line 176): true] catch (...) {...} | 1 | -| Finally.cs:188:13:191:13 | [finally: exception(Exception), exception: Exception, b1 (line 176): true, b2 (line 176): true] catch (...) {...} | Finally.cs:188:13:191:13 | [finally: exception(Exception), exception: Exception, b1 (line 176): true, b2 (line 176): true] catch (...) {...} | 1 | -| Finally.cs:188:13:191:13 | [finally: exception(ExceptionA), exception: Exception, b1 (line 176): true, b2 (line 176): true] catch (...) {...} | Finally.cs:188:13:191:13 | [finally: exception(ExceptionA), exception: Exception, b1 (line 176): true, b2 (line 176): true] catch (...) {...} | 1 | +| Finally.cs:188:13:191:13 | [finally: exception, exception: Exception, b1 (line 176): true, b2 (line 176): true] catch (...) {...} | Finally.cs:188:13:191:13 | [finally: exception, exception: Exception, b1 (line 176): true, b2 (line 176): true] catch (...) {...} | 1 | | Finally.cs:188:38:188:39 | [exception: Exception, b1 (line 176): false, b2 (line 176): true] access to parameter b2 | Finally.cs:188:38:188:39 | [exception: Exception, b1 (line 176): false, b2 (line 176): true] access to parameter b2 | 1 | | Finally.cs:188:38:188:39 | [exception: ExceptionB, b1 (line 176): false, b2 (line 176): true] access to parameter b2 | Finally.cs:188:38:188:39 | [exception: ExceptionB, b1 (line 176): false, b2 (line 176): true] access to parameter b2 | 1 | -| Finally.cs:188:38:188:39 | [finally: exception(Exception), exception: Exception, b1 (line 176): true, b2 (line 176): true] access to parameter b2 | Finally.cs:188:38:188:39 | [finally: exception(Exception), exception: Exception, b1 (line 176): true, b2 (line 176): true] access to parameter b2 | 1 | -| Finally.cs:188:38:188:39 | [finally: exception(Exception), exception: ExceptionB, b1 (line 176): true, b2 (line 176): true] access to parameter b2 | Finally.cs:188:38:188:39 | [finally: exception(Exception), exception: ExceptionB, b1 (line 176): true, b2 (line 176): true] access to parameter b2 | 1 | -| Finally.cs:188:38:188:39 | [finally: exception(ExceptionA), exception: Exception, b1 (line 176): true, b2 (line 176): true] access to parameter b2 | Finally.cs:188:38:188:39 | [finally: exception(ExceptionA), exception: Exception, b1 (line 176): true, b2 (line 176): true] access to parameter b2 | 1 | -| Finally.cs:188:38:188:39 | [finally: exception(ExceptionA), exception: ExceptionB, b1 (line 176): true, b2 (line 176): true] access to parameter b2 | Finally.cs:188:38:188:39 | [finally: exception(ExceptionA), exception: ExceptionB, b1 (line 176): true, b2 (line 176): true] access to parameter b2 | 1 | +| Finally.cs:188:38:188:39 | [finally: exception, exception: Exception, b1 (line 176): true, b2 (line 176): true] access to parameter b2 | Finally.cs:188:38:188:39 | [finally: exception, exception: Exception, b1 (line 176): true, b2 (line 176): true] access to parameter b2 | 1 | +| Finally.cs:188:38:188:39 | [finally: exception, exception: ExceptionB, b1 (line 176): true, b2 (line 176): true] access to parameter b2 | Finally.cs:188:38:188:39 | [finally: exception, exception: ExceptionB, b1 (line 176): true, b2 (line 176): true] access to parameter b2 | 1 | | Finally.cs:189:13:191:13 | [b1 (line 176): false] {...} | Finally.cs:190:21:190:22 | [b1 (line 176): false] access to parameter b1 | 3 | -| Finally.cs:189:13:191:13 | [finally: exception(Exception), b1 (line 176): true] {...} | Finally.cs:190:21:190:22 | [finally: exception(Exception), b1 (line 176): true] access to parameter b1 | 3 | -| Finally.cs:189:13:191:13 | [finally: exception(ExceptionA), b1 (line 176): true] {...} | Finally.cs:190:21:190:22 | [finally: exception(ExceptionA), b1 (line 176): true] access to parameter b1 | 3 | -| Finally.cs:190:31:190:46 | [finally: exception(Exception)] object creation of type ExceptionC | Finally.cs:190:25:190:47 | [finally: exception(Exception)] throw ...; | 2 | -| Finally.cs:190:31:190:46 | [finally: exception(ExceptionA)] object creation of type ExceptionC | Finally.cs:190:25:190:47 | [finally: exception(ExceptionA)] throw ...; | 2 | +| Finally.cs:189:13:191:13 | [finally: exception, b1 (line 176): true] {...} | Finally.cs:190:21:190:22 | [finally: exception, b1 (line 176): true] access to parameter b1 | 3 | +| Finally.cs:190:31:190:46 | [finally: exception] object creation of type ExceptionC | Finally.cs:190:25:190:47 | [finally: exception] throw ...; | 2 | | Finally.cs:195:10:195:12 | enter M10 | Finally.cs:199:17:199:18 | access to parameter b1 | 6 | | Finally.cs:195:10:195:12 | exit M10 | Finally.cs:195:10:195:12 | exit M10 | 1 | | Finally.cs:195:10:195:12 | exit M10 (abnormal) | Finally.cs:195:10:195:12 | exit M10 (abnormal) | 1 | -| Finally.cs:199:21:199:43 | throw ...; | Finally.cs:205:21:205:22 | [finally: exception(ExceptionA)] access to parameter b2 | 6 | +| Finally.cs:199:21:199:43 | throw ...; | Finally.cs:199:21:199:43 | throw ...; | 1 | | Finally.cs:199:27:199:42 | object creation of type ExceptionA | Finally.cs:199:27:199:42 | object creation of type ExceptionA | 1 | -| Finally.cs:202:9:212:9 | [finally: exception(Exception)] {...} | Finally.cs:205:21:205:22 | [finally: exception(Exception)] access to parameter b2 | 5 | +| Finally.cs:202:9:212:9 | [finally: exception] {...} | Finally.cs:205:21:205:22 | [finally: exception] access to parameter b2 | 5 | | Finally.cs:202:9:212:9 | {...} | Finally.cs:205:21:205:22 | access to parameter b2 | 5 | -| Finally.cs:205:25:205:47 | [finally: exception(Exception)] throw ...; | Finally.cs:209:21:209:22 | [finally: exception(Exception), finally(1): exception(ExceptionB)] access to parameter b3 | 4 | -| Finally.cs:205:25:205:47 | [finally: exception(ExceptionA)] throw ...; | Finally.cs:209:21:209:22 | [finally: exception(ExceptionA), finally(1): exception(ExceptionB)] access to parameter b3 | 4 | -| Finally.cs:205:25:205:47 | throw ...; | Finally.cs:209:21:209:22 | [finally(1): exception(ExceptionB)] access to parameter b3 | 4 | -| Finally.cs:205:31:205:46 | [finally: exception(Exception)] object creation of type ExceptionB | Finally.cs:205:31:205:46 | [finally: exception(Exception)] object creation of type ExceptionB | 1 | -| Finally.cs:205:31:205:46 | [finally: exception(ExceptionA)] object creation of type ExceptionB | Finally.cs:205:31:205:46 | [finally: exception(ExceptionA)] object creation of type ExceptionB | 1 | +| Finally.cs:205:25:205:47 | [finally: exception] throw ...; | Finally.cs:205:25:205:47 | [finally: exception] throw ...; | 1 | +| Finally.cs:205:25:205:47 | throw ...; | Finally.cs:205:25:205:47 | throw ...; | 1 | +| Finally.cs:205:31:205:46 | [finally: exception] object creation of type ExceptionB | Finally.cs:205:31:205:46 | [finally: exception] object creation of type ExceptionB | 1 | | Finally.cs:205:31:205:46 | object creation of type ExceptionB | Finally.cs:205:31:205:46 | object creation of type ExceptionB | 1 | -| Finally.cs:208:13:210:13 | [finally(1): exception(Exception)] {...} | Finally.cs:209:21:209:22 | [finally(1): exception(Exception)] access to parameter b3 | 3 | -| Finally.cs:208:13:210:13 | [finally: exception(Exception), finally(1): exception(Exception)] {...} | Finally.cs:209:21:209:22 | [finally: exception(Exception), finally(1): exception(Exception)] access to parameter b3 | 3 | -| Finally.cs:208:13:210:13 | [finally: exception(Exception)] {...} | Finally.cs:209:21:209:22 | [finally: exception(Exception)] access to parameter b3 | 3 | -| Finally.cs:208:13:210:13 | [finally: exception(ExceptionA), finally(1): exception(Exception)] {...} | Finally.cs:209:21:209:22 | [finally: exception(ExceptionA), finally(1): exception(Exception)] access to parameter b3 | 3 | -| Finally.cs:208:13:210:13 | [finally: exception(ExceptionA)] {...} | Finally.cs:209:21:209:22 | [finally: exception(ExceptionA)] access to parameter b3 | 3 | +| Finally.cs:208:13:210:13 | [finally(1): exception] {...} | Finally.cs:209:21:209:22 | [finally(1): exception] access to parameter b3 | 3 | +| Finally.cs:208:13:210:13 | [finally: exception, finally(1): exception] {...} | Finally.cs:209:21:209:22 | [finally: exception, finally(1): exception] access to parameter b3 | 3 | +| Finally.cs:208:13:210:13 | [finally: exception] {...} | Finally.cs:209:21:209:22 | [finally: exception] access to parameter b3 | 3 | | Finally.cs:208:13:210:13 | {...} | Finally.cs:209:21:209:22 | access to parameter b3 | 3 | -| Finally.cs:209:31:209:46 | [finally(1): exception(Exception)] object creation of type ExceptionC | Finally.cs:209:25:209:47 | [finally(1): exception(Exception)] throw ...; | 2 | -| Finally.cs:209:31:209:46 | [finally(1): exception(ExceptionB)] object creation of type ExceptionC | Finally.cs:209:25:209:47 | [finally(1): exception(ExceptionB)] throw ...; | 2 | -| Finally.cs:209:31:209:46 | [finally: exception(Exception), finally(1): exception(Exception)] object creation of type ExceptionC | Finally.cs:209:25:209:47 | [finally: exception(Exception), finally(1): exception(Exception)] throw ...; | 2 | -| Finally.cs:209:31:209:46 | [finally: exception(Exception), finally(1): exception(ExceptionB)] object creation of type ExceptionC | Finally.cs:209:25:209:47 | [finally: exception(Exception), finally(1): exception(ExceptionB)] throw ...; | 2 | -| Finally.cs:209:31:209:46 | [finally: exception(Exception)] object creation of type ExceptionC | Finally.cs:209:25:209:47 | [finally: exception(Exception)] throw ...; | 2 | -| Finally.cs:209:31:209:46 | [finally: exception(ExceptionA), finally(1): exception(Exception)] object creation of type ExceptionC | Finally.cs:209:25:209:47 | [finally: exception(ExceptionA), finally(1): exception(Exception)] throw ...; | 2 | -| Finally.cs:209:31:209:46 | [finally: exception(ExceptionA), finally(1): exception(ExceptionB)] object creation of type ExceptionC | Finally.cs:209:25:209:47 | [finally: exception(ExceptionA), finally(1): exception(ExceptionB)] throw ...; | 2 | -| Finally.cs:209:31:209:46 | [finally: exception(ExceptionA)] object creation of type ExceptionC | Finally.cs:209:25:209:47 | [finally: exception(ExceptionA)] throw ...; | 2 | +| Finally.cs:209:31:209:46 | [finally(1): exception] object creation of type ExceptionC | Finally.cs:209:25:209:47 | [finally(1): exception] throw ...; | 2 | +| Finally.cs:209:31:209:46 | [finally: exception, finally(1): exception] object creation of type ExceptionC | Finally.cs:209:25:209:47 | [finally: exception, finally(1): exception] throw ...; | 2 | +| Finally.cs:209:31:209:46 | [finally: exception] object creation of type ExceptionC | Finally.cs:209:25:209:47 | [finally: exception] throw ...; | 2 | | Finally.cs:209:31:209:46 | object creation of type ExceptionC | Finally.cs:209:25:209:47 | throw ...; | 2 | | Finally.cs:211:13:211:29 | ...; | Finally.cs:195:10:195:12 | exit M10 (normal) | 9 | -| Finally.cs:211:13:211:29 | [finally: exception(Exception)] ...; | Finally.cs:211:13:211:28 | [finally: exception(Exception)] ... = ... | 4 | -| Finally.cs:211:13:211:29 | [finally: exception(ExceptionA)] ...; | Finally.cs:211:13:211:28 | [finally: exception(ExceptionA)] ... = ... | 4 | +| Finally.cs:211:13:211:29 | [finally: exception] ...; | Finally.cs:211:13:211:28 | [finally: exception] ... = ... | 4 | | Finally.cs:216:10:216:12 | enter M11 | Finally.cs:220:13:220:36 | call to method WriteLine | 7 | | Finally.cs:222:9:225:9 | catch {...} | Finally.cs:224:13:224:38 | call to method WriteLine | 5 | | Finally.cs:227:9:229:9 | {...} | Finally.cs:216:10:216:12 | exit M11 | 9 | | Finally.cs:233:10:233:12 | enter M12 | Finally.cs:239:21:239:22 | access to parameter b1 | 8 | | Finally.cs:233:10:233:12 | exit M12 | Finally.cs:233:10:233:12 | exit M12 | 1 | -| Finally.cs:233:10:233:12 | exit M12 (abnormal) | Finally.cs:233:10:233:12 | exit M12 (abnormal) | 1 | -| Finally.cs:240:21:240:43 | throw ...; | Finally.cs:246:25:246:26 | [finally: exception(ExceptionA)] access to parameter b2 | 6 | +| Finally.cs:240:21:240:43 | throw ...; | Finally.cs:240:21:240:43 | throw ...; | 1 | | Finally.cs:240:27:240:42 | object creation of type ExceptionA | Finally.cs:240:27:240:42 | object creation of type ExceptionA | 1 | -| Finally.cs:243:13:253:13 | [finally: exception(Exception)] {...} | Finally.cs:246:25:246:26 | [finally: exception(Exception)] access to parameter b2 | 5 | +| Finally.cs:243:13:253:13 | [finally: exception] {...} | Finally.cs:246:25:246:26 | [finally: exception] access to parameter b2 | 5 | | Finally.cs:243:13:253:13 | {...} | Finally.cs:246:25:246:26 | access to parameter b2 | 5 | -| Finally.cs:247:25:247:47 | [finally: exception(Exception)] throw ...; | Finally.cs:251:21:251:54 | [finally: exception(Exception), finally(1): exception(ExceptionA)] call to method WriteLine | 5 | -| Finally.cs:247:25:247:47 | [finally: exception(ExceptionA)] throw ...; | Finally.cs:251:21:251:54 | [finally: exception(ExceptionA), finally(1): exception(ExceptionA)] call to method WriteLine | 5 | -| Finally.cs:247:25:247:47 | throw ...; | Finally.cs:251:21:251:54 | [finally(1): exception(ExceptionA)] call to method WriteLine | 5 | -| Finally.cs:247:31:247:46 | [finally: exception(Exception)] object creation of type ExceptionA | Finally.cs:247:31:247:46 | [finally: exception(Exception)] object creation of type ExceptionA | 1 | -| Finally.cs:247:31:247:46 | [finally: exception(ExceptionA)] object creation of type ExceptionA | Finally.cs:247:31:247:46 | [finally: exception(ExceptionA)] object creation of type ExceptionA | 1 | +| Finally.cs:247:25:247:47 | [finally: exception] throw ...; | Finally.cs:247:25:247:47 | [finally: exception] throw ...; | 1 | +| Finally.cs:247:25:247:47 | throw ...; | Finally.cs:247:25:247:47 | throw ...; | 1 | +| Finally.cs:247:31:247:46 | [finally: exception] object creation of type ExceptionA | Finally.cs:247:31:247:46 | [finally: exception] object creation of type ExceptionA | 1 | | Finally.cs:247:31:247:46 | object creation of type ExceptionA | Finally.cs:247:31:247:46 | object creation of type ExceptionA | 1 | -| Finally.cs:250:17:252:17 | [finally(1): exception(Exception)] {...} | Finally.cs:251:21:251:54 | [finally(1): exception(Exception)] call to method WriteLine | 4 | -| Finally.cs:250:17:252:17 | [finally: exception(Exception), finally(1): exception(Exception)] {...} | Finally.cs:251:21:251:54 | [finally: exception(Exception), finally(1): exception(Exception)] call to method WriteLine | 4 | -| Finally.cs:250:17:252:17 | [finally: exception(Exception)] {...} | Finally.cs:251:21:251:54 | [finally: exception(Exception)] call to method WriteLine | 4 | -| Finally.cs:250:17:252:17 | [finally: exception(ExceptionA), finally(1): exception(Exception)] {...} | Finally.cs:251:21:251:54 | [finally: exception(ExceptionA), finally(1): exception(Exception)] call to method WriteLine | 4 | -| Finally.cs:250:17:252:17 | [finally: exception(ExceptionA)] {...} | Finally.cs:251:21:251:54 | [finally: exception(ExceptionA)] call to method WriteLine | 4 | +| Finally.cs:250:17:252:17 | [finally(1): exception] {...} | Finally.cs:251:21:251:54 | [finally(1): exception] call to method WriteLine | 4 | +| Finally.cs:250:17:252:17 | [finally: exception, finally(1): exception] {...} | Finally.cs:251:21:251:54 | [finally: exception, finally(1): exception] call to method WriteLine | 4 | +| Finally.cs:250:17:252:17 | [finally: exception] {...} | Finally.cs:251:21:251:54 | [finally: exception] call to method WriteLine | 4 | | Finally.cs:250:17:252:17 | {...} | Finally.cs:254:13:254:44 | call to method WriteLine | 7 | -| Finally.cs:257:9:259:9 | [finally: exception(Exception)] {...} | Finally.cs:258:13:258:46 | [finally: exception(Exception)] call to method WriteLine | 4 | -| Finally.cs:257:9:259:9 | [finally: exception(ExceptionA)] {...} | Finally.cs:258:13:258:46 | [finally: exception(ExceptionA)] call to method WriteLine | 4 | +| Finally.cs:257:9:259:9 | [finally: exception] {...} | Finally.cs:233:10:233:12 | exit M12 (abnormal) | 5 | | Finally.cs:257:9:259:9 | {...} | Finally.cs:233:10:233:12 | exit M12 (normal) | 8 | | Finally.cs:263:10:263:12 | enter M13 | Finally.cs:267:13:267:34 | call to method WriteLine | 7 | | Finally.cs:263:10:263:12 | exit M13 | Finally.cs:263:10:263:12 | exit M13 | 1 | -| Finally.cs:270:9:273:9 | [finally: exception(Exception)] {...} | Finally.cs:263:10:263:12 | exit M13 (abnormal) | 10 | +| Finally.cs:270:9:273:9 | [finally: exception] {...} | Finally.cs:263:10:263:12 | exit M13 (abnormal) | 10 | | Finally.cs:270:9:273:9 | {...} | Finally.cs:263:10:263:12 | exit M13 (normal) | 10 | | Foreach.cs:4:7:4:13 | enter Foreach | Foreach.cs:4:7:4:13 | exit Foreach | 5 | | Foreach.cs:6:10:6:11 | enter M1 | Foreach.cs:8:29:8:32 | access to parameter args | 3 | diff --git a/csharp/ql/test/library-tests/controlflow/graph/Condition.expected b/csharp/ql/test/library-tests/controlflow/graph/Condition.expected index a59100474ea6..b4a4cbb6a157 100644 --- a/csharp/ql/test/library-tests/controlflow/graph/Condition.expected +++ b/csharp/ql/test/library-tests/controlflow/graph/Condition.expected @@ -1341,11 +1341,9 @@ conditionBlock | Finally.cs:61:9:64:9 | [exception: Exception] catch (...) {...} | Finally.cs:65:9:67:9 | [exception: Exception] catch (...) {...} | false | | Finally.cs:61:9:64:9 | [exception: Exception] catch (...) {...} | Finally.cs:65:26:65:26 | [exception: Exception] Exception e | false | | Finally.cs:61:9:64:9 | [exception: Exception] catch (...) {...} | Finally.cs:66:9:67:9 | {...} | false | -| Finally.cs:61:9:64:9 | [exception: Exception] catch (...) {...} | Finally.cs:69:9:71:9 | [finally: exception(Exception)] {...} | false | | Finally.cs:61:38:61:39 | [exception: Exception] IOException ex | Finally.cs:62:9:64:9 | {...} | true | | Finally.cs:65:9:67:9 | [exception: Exception] catch (...) {...} | Finally.cs:65:26:65:26 | [exception: Exception] Exception e | true | | Finally.cs:65:9:67:9 | [exception: Exception] catch (...) {...} | Finally.cs:66:9:67:9 | {...} | true | -| Finally.cs:65:9:67:9 | [exception: Exception] catch (...) {...} | Finally.cs:69:9:71:9 | [finally: exception(Exception)] {...} | true | | Finally.cs:65:26:65:26 | [exception: Exception] Exception e | Finally.cs:66:9:67:9 | {...} | true | | Finally.cs:77:16:77:16 | access to local variable i | Finally.cs:74:10:74:11 | exit M4 (abnormal) | true | | Finally.cs:77:16:77:16 | access to local variable i | Finally.cs:78:9:100:9 | {...} | true | @@ -1363,12 +1361,12 @@ conditionBlock | Finally.cs:77:16:77:16 | access to local variable i | Finally.cs:93:31:93:45 | [finally: continue] object creation of type Exception | true | | Finally.cs:77:16:77:16 | access to local variable i | Finally.cs:93:31:93:45 | [finally: return] object creation of type Exception | true | | Finally.cs:77:16:77:16 | access to local variable i | Finally.cs:93:31:93:45 | object creation of type Exception | true | -| Finally.cs:77:16:77:16 | access to local variable i | Finally.cs:96:17:98:17 | [finally(1): exception(Exception)] {...} | true | -| Finally.cs:77:16:77:16 | access to local variable i | Finally.cs:96:17:98:17 | [finally: break, finally(1): exception(Exception)] {...} | true | +| Finally.cs:77:16:77:16 | access to local variable i | Finally.cs:96:17:98:17 | [finally(1): exception] {...} | true | +| Finally.cs:77:16:77:16 | access to local variable i | Finally.cs:96:17:98:17 | [finally: break, finally(1): exception] {...} | true | | Finally.cs:77:16:77:16 | access to local variable i | Finally.cs:96:17:98:17 | [finally: break] {...} | true | -| Finally.cs:77:16:77:16 | access to local variable i | Finally.cs:96:17:98:17 | [finally: continue, finally(1): exception(Exception)] {...} | true | +| Finally.cs:77:16:77:16 | access to local variable i | Finally.cs:96:17:98:17 | [finally: continue, finally(1): exception] {...} | true | | Finally.cs:77:16:77:16 | access to local variable i | Finally.cs:96:17:98:17 | [finally: continue] {...} | true | -| Finally.cs:77:16:77:16 | access to local variable i | Finally.cs:96:17:98:17 | [finally: return, finally(1): exception(Exception)] {...} | true | +| Finally.cs:77:16:77:16 | access to local variable i | Finally.cs:96:17:98:17 | [finally: return, finally(1): exception] {...} | true | | Finally.cs:77:16:77:16 | access to local variable i | Finally.cs:96:17:98:17 | [finally: return] {...} | true | | Finally.cs:77:16:77:16 | access to local variable i | Finally.cs:96:17:98:17 | {...} | true | | Finally.cs:78:9:100:9 | {...} | Finally.cs:82:21:82:27 | return ...; | true | @@ -1385,17 +1383,17 @@ conditionBlock | Finally.cs:78:9:100:9 | {...} | Finally.cs:93:31:93:45 | [finally: continue] object creation of type Exception | false | | Finally.cs:78:9:100:9 | {...} | Finally.cs:93:31:93:45 | [finally: return] object creation of type Exception | true | | Finally.cs:78:9:100:9 | {...} | Finally.cs:93:31:93:45 | object creation of type Exception | false | -| Finally.cs:78:9:100:9 | {...} | Finally.cs:96:17:98:17 | [finally(1): exception(Exception)] {...} | false | -| Finally.cs:78:9:100:9 | {...} | Finally.cs:96:17:98:17 | [finally: break, finally(1): exception(Exception)] {...} | false | +| Finally.cs:78:9:100:9 | {...} | Finally.cs:96:17:98:17 | [finally(1): exception] {...} | false | +| Finally.cs:78:9:100:9 | {...} | Finally.cs:96:17:98:17 | [finally: break, finally(1): exception] {...} | false | | Finally.cs:78:9:100:9 | {...} | Finally.cs:96:17:98:17 | [finally: break] {...} | false | -| Finally.cs:78:9:100:9 | {...} | Finally.cs:96:17:98:17 | [finally: continue, finally(1): exception(Exception)] {...} | false | +| Finally.cs:78:9:100:9 | {...} | Finally.cs:96:17:98:17 | [finally: continue, finally(1): exception] {...} | false | | Finally.cs:78:9:100:9 | {...} | Finally.cs:96:17:98:17 | [finally: continue] {...} | false | -| Finally.cs:78:9:100:9 | {...} | Finally.cs:96:17:98:17 | [finally: return, finally(1): exception(Exception)] {...} | true | +| Finally.cs:78:9:100:9 | {...} | Finally.cs:96:17:98:17 | [finally: return, finally(1): exception] {...} | true | | Finally.cs:78:9:100:9 | {...} | Finally.cs:96:17:98:17 | [finally: return] {...} | true | | Finally.cs:78:9:100:9 | {...} | Finally.cs:96:17:98:17 | {...} | false | | Finally.cs:82:21:82:27 | return ...; | Finally.cs:93:25:93:46 | [finally: return] throw ...; | true | | Finally.cs:82:21:82:27 | return ...; | Finally.cs:93:31:93:45 | [finally: return] object creation of type Exception | true | -| Finally.cs:82:21:82:27 | return ...; | Finally.cs:96:17:98:17 | [finally: return, finally(1): exception(Exception)] {...} | true | +| Finally.cs:82:21:82:27 | return ...; | Finally.cs:96:17:98:17 | [finally: return, finally(1): exception] {...} | true | | Finally.cs:82:21:82:27 | return ...; | Finally.cs:96:17:98:17 | [finally: return] {...} | false | | Finally.cs:83:17:84:29 | if (...) ... | Finally.cs:84:21:84:29 | continue; | true | | Finally.cs:83:17:84:29 | if (...) ... | Finally.cs:85:17:86:26 | if (...) ... | false | @@ -1407,15 +1405,15 @@ conditionBlock | Finally.cs:83:17:84:29 | if (...) ... | Finally.cs:93:31:93:45 | [finally: break] object creation of type Exception | false | | Finally.cs:83:17:84:29 | if (...) ... | Finally.cs:93:31:93:45 | [finally: continue] object creation of type Exception | true | | Finally.cs:83:17:84:29 | if (...) ... | Finally.cs:93:31:93:45 | object creation of type Exception | false | -| Finally.cs:83:17:84:29 | if (...) ... | Finally.cs:96:17:98:17 | [finally(1): exception(Exception)] {...} | false | -| Finally.cs:83:17:84:29 | if (...) ... | Finally.cs:96:17:98:17 | [finally: break, finally(1): exception(Exception)] {...} | false | +| Finally.cs:83:17:84:29 | if (...) ... | Finally.cs:96:17:98:17 | [finally(1): exception] {...} | false | +| Finally.cs:83:17:84:29 | if (...) ... | Finally.cs:96:17:98:17 | [finally: break, finally(1): exception] {...} | false | | Finally.cs:83:17:84:29 | if (...) ... | Finally.cs:96:17:98:17 | [finally: break] {...} | false | -| Finally.cs:83:17:84:29 | if (...) ... | Finally.cs:96:17:98:17 | [finally: continue, finally(1): exception(Exception)] {...} | true | +| Finally.cs:83:17:84:29 | if (...) ... | Finally.cs:96:17:98:17 | [finally: continue, finally(1): exception] {...} | true | | Finally.cs:83:17:84:29 | if (...) ... | Finally.cs:96:17:98:17 | [finally: continue] {...} | true | | Finally.cs:83:17:84:29 | if (...) ... | Finally.cs:96:17:98:17 | {...} | false | | Finally.cs:84:21:84:29 | continue; | Finally.cs:93:25:93:46 | [finally: continue] throw ...; | true | | Finally.cs:84:21:84:29 | continue; | Finally.cs:93:31:93:45 | [finally: continue] object creation of type Exception | true | -| Finally.cs:84:21:84:29 | continue; | Finally.cs:96:17:98:17 | [finally: continue, finally(1): exception(Exception)] {...} | true | +| Finally.cs:84:21:84:29 | continue; | Finally.cs:96:17:98:17 | [finally: continue, finally(1): exception] {...} | true | | Finally.cs:84:21:84:29 | continue; | Finally.cs:96:17:98:17 | [finally: continue] {...} | false | | Finally.cs:85:17:86:26 | if (...) ... | Finally.cs:86:21:86:26 | break; | true | | Finally.cs:85:17:86:26 | if (...) ... | Finally.cs:89:13:99:13 | {...} | false | @@ -1423,17 +1421,17 @@ conditionBlock | Finally.cs:85:17:86:26 | if (...) ... | Finally.cs:93:25:93:46 | throw ...; | false | | Finally.cs:85:17:86:26 | if (...) ... | Finally.cs:93:31:93:45 | [finally: break] object creation of type Exception | true | | Finally.cs:85:17:86:26 | if (...) ... | Finally.cs:93:31:93:45 | object creation of type Exception | false | -| Finally.cs:85:17:86:26 | if (...) ... | Finally.cs:96:17:98:17 | [finally(1): exception(Exception)] {...} | false | -| Finally.cs:85:17:86:26 | if (...) ... | Finally.cs:96:17:98:17 | [finally: break, finally(1): exception(Exception)] {...} | true | +| Finally.cs:85:17:86:26 | if (...) ... | Finally.cs:96:17:98:17 | [finally(1): exception] {...} | false | +| Finally.cs:85:17:86:26 | if (...) ... | Finally.cs:96:17:98:17 | [finally: break, finally(1): exception] {...} | true | | Finally.cs:85:17:86:26 | if (...) ... | Finally.cs:96:17:98:17 | [finally: break] {...} | true | | Finally.cs:85:17:86:26 | if (...) ... | Finally.cs:96:17:98:17 | {...} | false | | Finally.cs:86:21:86:26 | break; | Finally.cs:93:25:93:46 | [finally: break] throw ...; | true | | Finally.cs:86:21:86:26 | break; | Finally.cs:93:31:93:45 | [finally: break] object creation of type Exception | true | -| Finally.cs:86:21:86:26 | break; | Finally.cs:96:17:98:17 | [finally: break, finally(1): exception(Exception)] {...} | true | +| Finally.cs:86:21:86:26 | break; | Finally.cs:96:17:98:17 | [finally: break, finally(1): exception] {...} | true | | Finally.cs:86:21:86:26 | break; | Finally.cs:96:17:98:17 | [finally: break] {...} | false | | Finally.cs:89:13:99:13 | {...} | Finally.cs:93:25:93:46 | throw ...; | true | | Finally.cs:89:13:99:13 | {...} | Finally.cs:93:31:93:45 | object creation of type Exception | true | -| Finally.cs:89:13:99:13 | {...} | Finally.cs:96:17:98:17 | [finally(1): exception(Exception)] {...} | true | +| Finally.cs:89:13:99:13 | {...} | Finally.cs:96:17:98:17 | [finally(1): exception] {...} | true | | Finally.cs:89:13:99:13 | {...} | Finally.cs:96:17:98:17 | {...} | false | | Finally.cs:107:33:107:33 | 0 | Finally.cs:108:17:108:23 | return ...; | true | | Finally.cs:107:33:107:33 | 0 | Finally.cs:109:13:110:49 | if (...) ... | false | @@ -1442,20 +1440,15 @@ conditionBlock | Finally.cs:107:33:107:33 | 0 | Finally.cs:110:17:110:49 | throw ...; | false | | Finally.cs:107:33:107:33 | 0 | Finally.cs:110:23:110:48 | object creation of type OutOfMemoryException | false | | Finally.cs:107:33:107:33 | 0 | Finally.cs:113:9:118:9 | {...} | false | -| Finally.cs:107:33:107:33 | 0 | Finally.cs:114:17:114:36 | [false, finally: exception(OutOfMemoryException)] !... | false | | Finally.cs:107:33:107:33 | 0 | Finally.cs:114:17:114:36 | [false, finally: return] !... | true | | Finally.cs:107:33:107:33 | 0 | Finally.cs:114:17:114:36 | [false] !... | false | -| Finally.cs:107:33:107:33 | 0 | Finally.cs:114:17:114:36 | [true, finally: exception(OutOfMemoryException)] !... | false | | Finally.cs:107:33:107:33 | 0 | Finally.cs:114:17:114:36 | [true, finally: return] !... | true | | Finally.cs:107:33:107:33 | 0 | Finally.cs:114:17:114:36 | [true] !... | false | | Finally.cs:107:33:107:33 | 0 | Finally.cs:115:17:115:41 | ...; | false | -| Finally.cs:107:33:107:33 | 0 | Finally.cs:115:17:115:41 | [finally: exception(OutOfMemoryException)] ...; | false | | Finally.cs:107:33:107:33 | 0 | Finally.cs:115:17:115:41 | [finally: return] ...; | true | -| Finally.cs:107:33:107:33 | 0 | Finally.cs:116:13:117:37 | [finally: exception(OutOfMemoryException)] if (...) ... | false | | Finally.cs:107:33:107:33 | 0 | Finally.cs:116:13:117:37 | [finally: return] if (...) ... | true | | Finally.cs:107:33:107:33 | 0 | Finally.cs:116:13:117:37 | if (...) ... | false | | Finally.cs:107:33:107:33 | 0 | Finally.cs:117:17:117:37 | ...; | false | -| Finally.cs:107:33:107:33 | 0 | Finally.cs:117:17:117:37 | [finally: exception(OutOfMemoryException)] ...; | false | | Finally.cs:107:33:107:33 | 0 | Finally.cs:117:17:117:37 | [finally: return] ...; | true | | Finally.cs:108:17:108:23 | return ...; | Finally.cs:114:17:114:36 | [false, finally: return] !... | true | | Finally.cs:108:17:108:23 | return ...; | Finally.cs:114:17:114:36 | [true, finally: return] !... | false | @@ -1463,228 +1456,149 @@ conditionBlock | Finally.cs:109:33:109:33 | 1 | Finally.cs:110:17:110:49 | throw ...; | true | | Finally.cs:109:33:109:33 | 1 | Finally.cs:110:23:110:48 | object creation of type OutOfMemoryException | true | | Finally.cs:109:33:109:33 | 1 | Finally.cs:113:9:118:9 | {...} | false | -| Finally.cs:109:33:109:33 | 1 | Finally.cs:114:17:114:36 | [false, finally: exception(OutOfMemoryException)] !... | true | | Finally.cs:109:33:109:33 | 1 | Finally.cs:114:17:114:36 | [false] !... | false | -| Finally.cs:109:33:109:33 | 1 | Finally.cs:114:17:114:36 | [true, finally: exception(OutOfMemoryException)] !... | true | | Finally.cs:109:33:109:33 | 1 | Finally.cs:114:17:114:36 | [true] !... | false | | Finally.cs:109:33:109:33 | 1 | Finally.cs:115:17:115:41 | ...; | false | -| Finally.cs:109:33:109:33 | 1 | Finally.cs:115:17:115:41 | [finally: exception(OutOfMemoryException)] ...; | true | -| Finally.cs:109:33:109:33 | 1 | Finally.cs:116:13:117:37 | [finally: exception(OutOfMemoryException)] if (...) ... | true | | Finally.cs:109:33:109:33 | 1 | Finally.cs:116:13:117:37 | if (...) ... | false | | Finally.cs:109:33:109:33 | 1 | Finally.cs:117:17:117:37 | ...; | false | -| Finally.cs:109:33:109:33 | 1 | Finally.cs:117:17:117:37 | [finally: exception(OutOfMemoryException)] ...; | true | -| Finally.cs:110:17:110:49 | throw ...; | Finally.cs:114:17:114:36 | [false, finally: exception(OutOfMemoryException)] !... | true | -| Finally.cs:110:17:110:49 | throw ...; | Finally.cs:114:17:114:36 | [true, finally: exception(OutOfMemoryException)] !... | false | -| Finally.cs:110:17:110:49 | throw ...; | Finally.cs:115:17:115:41 | [finally: exception(OutOfMemoryException)] ...; | false | -| Finally.cs:113:9:118:9 | [finally: exception(Exception)] {...} | Finally.cs:114:17:114:36 | [false, finally: exception(Exception)] !... | true | -| Finally.cs:113:9:118:9 | [finally: exception(Exception)] {...} | Finally.cs:114:17:114:36 | [true, finally: exception(Exception)] !... | false | -| Finally.cs:113:9:118:9 | [finally: exception(Exception)] {...} | Finally.cs:115:17:115:41 | [finally: exception(Exception)] ...; | false | -| Finally.cs:113:9:118:9 | [finally: exception(NullReferenceException)] {...} | Finally.cs:114:17:114:36 | [false, finally: exception(NullReferenceException)] !... | true | -| Finally.cs:113:9:118:9 | [finally: exception(NullReferenceException)] {...} | Finally.cs:114:17:114:36 | [true, finally: exception(NullReferenceException)] !... | false | -| Finally.cs:113:9:118:9 | [finally: exception(NullReferenceException)] {...} | Finally.cs:115:17:115:41 | [finally: exception(NullReferenceException)] ...; | false | +| Finally.cs:113:9:118:9 | [finally: exception] {...} | Finally.cs:114:17:114:36 | [false, finally: exception] !... | true | +| Finally.cs:113:9:118:9 | [finally: exception] {...} | Finally.cs:114:17:114:36 | [true, finally: exception] !... | false | +| Finally.cs:113:9:118:9 | [finally: exception] {...} | Finally.cs:115:17:115:41 | [finally: exception] ...; | false | | Finally.cs:113:9:118:9 | {...} | Finally.cs:114:17:114:36 | [false] !... | true | | Finally.cs:113:9:118:9 | {...} | Finally.cs:114:17:114:36 | [true] !... | false | | Finally.cs:113:9:118:9 | {...} | Finally.cs:115:17:115:41 | ...; | false | -| Finally.cs:114:17:114:36 | [true, finally: exception(Exception)] !... | Finally.cs:115:17:115:41 | [finally: exception(Exception)] ...; | true | -| Finally.cs:114:17:114:36 | [true, finally: exception(NullReferenceException)] !... | Finally.cs:115:17:115:41 | [finally: exception(NullReferenceException)] ...; | true | -| Finally.cs:114:17:114:36 | [true, finally: exception(OutOfMemoryException)] !... | Finally.cs:115:17:115:41 | [finally: exception(OutOfMemoryException)] ...; | true | +| Finally.cs:114:17:114:36 | [true, finally: exception] !... | Finally.cs:115:17:115:41 | [finally: exception] ...; | true | | Finally.cs:114:17:114:36 | [true, finally: return] !... | Finally.cs:115:17:115:41 | [finally: return] ...; | true | | Finally.cs:114:17:114:36 | [true] !... | Finally.cs:115:17:115:41 | ...; | true | -| Finally.cs:116:13:117:37 | [finally: exception(Exception)] if (...) ... | Finally.cs:117:17:117:37 | [finally: exception(Exception)] ...; | true | -| Finally.cs:116:13:117:37 | [finally: exception(NullReferenceException)] if (...) ... | Finally.cs:117:17:117:37 | [finally: exception(NullReferenceException)] ...; | true | -| Finally.cs:116:13:117:37 | [finally: exception(OutOfMemoryException)] if (...) ... | Finally.cs:117:17:117:37 | [finally: exception(OutOfMemoryException)] ...; | true | +| Finally.cs:116:13:117:37 | [finally: exception] if (...) ... | Finally.cs:117:17:117:37 | [finally: exception] ...; | true | | Finally.cs:116:13:117:37 | [finally: return] if (...) ... | Finally.cs:117:17:117:37 | [finally: return] ...; | true | | Finally.cs:116:13:117:37 | if (...) ... | Finally.cs:117:17:117:37 | ...; | true | | Finally.cs:147:10:147:11 | enter M8 | Finally.cs:147:10:147:11 | exit M8 (abnormal) | true | | Finally.cs:147:10:147:11 | enter M8 | Finally.cs:147:10:147:11 | exit M8 (normal) | false | | Finally.cs:147:10:147:11 | enter M8 | Finally.cs:152:17:152:50 | throw ...; | true | | Finally.cs:147:10:147:11 | enter M8 | Finally.cs:152:23:152:49 | object creation of type ArgumentNullException | true | -| Finally.cs:147:10:147:11 | enter M8 | Finally.cs:155:9:169:9 | [finally: exception(Exception)] {...} | true | +| Finally.cs:147:10:147:11 | enter M8 | Finally.cs:155:9:169:9 | [finally: exception] {...} | true | | Finally.cs:147:10:147:11 | enter M8 | Finally.cs:155:9:169:9 | {...} | false | | Finally.cs:147:10:147:11 | enter M8 | Finally.cs:158:36:158:36 | 1 | false | -| Finally.cs:147:10:147:11 | enter M8 | Finally.cs:158:36:158:36 | [finally: exception(ArgumentNullException)] 1 | true | -| Finally.cs:147:10:147:11 | enter M8 | Finally.cs:158:36:158:36 | [finally: exception(Exception)] 1 | true | -| Finally.cs:147:10:147:11 | enter M8 | Finally.cs:159:21:159:45 | [finally: exception(ArgumentNullException)] throw ...; | true | -| Finally.cs:147:10:147:11 | enter M8 | Finally.cs:159:21:159:45 | [finally: exception(Exception)] throw ...; | true | +| Finally.cs:147:10:147:11 | enter M8 | Finally.cs:158:36:158:36 | [finally: exception] 1 | true | +| Finally.cs:147:10:147:11 | enter M8 | Finally.cs:159:21:159:45 | [finally: exception] throw ...; | true | | Finally.cs:147:10:147:11 | enter M8 | Finally.cs:159:21:159:45 | throw ...; | false | | Finally.cs:147:10:147:11 | enter M8 | Finally.cs:159:41:159:43 | "1" | false | -| Finally.cs:147:10:147:11 | enter M8 | Finally.cs:159:41:159:43 | [finally: exception(ArgumentNullException)] "1" | true | -| Finally.cs:147:10:147:11 | enter M8 | Finally.cs:159:41:159:43 | [finally: exception(Exception)] "1" | true | +| Finally.cs:147:10:147:11 | enter M8 | Finally.cs:159:41:159:43 | [finally: exception] "1" | true | | Finally.cs:147:10:147:11 | enter M8 | Finally.cs:161:13:164:13 | [exception: Exception] catch (...) {...} | false | | Finally.cs:147:10:147:11 | enter M8 | Finally.cs:161:13:164:13 | [exception: NullReferenceException] catch (...) {...} | false | -| Finally.cs:147:10:147:11 | enter M8 | Finally.cs:161:13:164:13 | [finally: exception(ArgumentNullException), exception: Exception] catch (...) {...} | true | -| Finally.cs:147:10:147:11 | enter M8 | Finally.cs:161:13:164:13 | [finally: exception(ArgumentNullException), exception: NullReferenceException] catch (...) {...} | true | -| Finally.cs:147:10:147:11 | enter M8 | Finally.cs:161:13:164:13 | [finally: exception(Exception), exception: Exception] catch (...) {...} | true | -| Finally.cs:147:10:147:11 | enter M8 | Finally.cs:161:13:164:13 | [finally: exception(Exception), exception: NullReferenceException] catch (...) {...} | true | +| Finally.cs:147:10:147:11 | enter M8 | Finally.cs:161:13:164:13 | [finally: exception, exception: Exception] catch (...) {...} | true | +| Finally.cs:147:10:147:11 | enter M8 | Finally.cs:161:13:164:13 | [finally: exception, exception: NullReferenceException] catch (...) {...} | true | | Finally.cs:147:10:147:11 | enter M8 | Finally.cs:161:30:161:30 | [exception: Exception] Exception e | false | | Finally.cs:147:10:147:11 | enter M8 | Finally.cs:161:30:161:30 | [exception: NullReferenceException] Exception e | false | -| Finally.cs:147:10:147:11 | enter M8 | Finally.cs:161:30:161:30 | [finally: exception(ArgumentNullException), exception: Exception] Exception e | true | -| Finally.cs:147:10:147:11 | enter M8 | Finally.cs:161:30:161:30 | [finally: exception(ArgumentNullException), exception: NullReferenceException] Exception e | true | -| Finally.cs:147:10:147:11 | enter M8 | Finally.cs:161:30:161:30 | [finally: exception(Exception), exception: Exception] Exception e | true | -| Finally.cs:147:10:147:11 | enter M8 | Finally.cs:161:30:161:30 | [finally: exception(Exception), exception: NullReferenceException] Exception e | true | -| Finally.cs:147:10:147:11 | enter M8 | Finally.cs:162:13:164:13 | [finally: exception(ArgumentNullException)] {...} | true | -| Finally.cs:147:10:147:11 | enter M8 | Finally.cs:162:13:164:13 | [finally: exception(Exception)] {...} | true | +| Finally.cs:147:10:147:11 | enter M8 | Finally.cs:161:30:161:30 | [finally: exception, exception: Exception] Exception e | true | +| Finally.cs:147:10:147:11 | enter M8 | Finally.cs:161:30:161:30 | [finally: exception, exception: NullReferenceException] Exception e | true | +| Finally.cs:147:10:147:11 | enter M8 | Finally.cs:162:13:164:13 | [finally: exception] {...} | true | | Finally.cs:147:10:147:11 | enter M8 | Finally.cs:162:13:164:13 | {...} | false | -| Finally.cs:147:10:147:11 | enter M8 | Finally.cs:165:13:168:13 | [finally: exception(ArgumentNullException)] catch {...} | true | -| Finally.cs:147:10:147:11 | enter M8 | Finally.cs:165:13:168:13 | [finally: exception(Exception)] catch {...} | true | +| Finally.cs:147:10:147:11 | enter M8 | Finally.cs:165:13:168:13 | [finally: exception] catch {...} | true | | Finally.cs:147:10:147:11 | enter M8 | Finally.cs:165:13:168:13 | catch {...} | false | | Finally.cs:158:36:158:36 | 1 | Finally.cs:159:21:159:45 | throw ...; | true | | Finally.cs:158:36:158:36 | 1 | Finally.cs:159:41:159:43 | "1" | true | -| Finally.cs:158:36:158:36 | [finally: exception(ArgumentNullException)] 1 | Finally.cs:159:21:159:45 | [finally: exception(ArgumentNullException)] throw ...; | true | -| Finally.cs:158:36:158:36 | [finally: exception(ArgumentNullException)] 1 | Finally.cs:159:41:159:43 | [finally: exception(ArgumentNullException)] "1" | true | -| Finally.cs:158:36:158:36 | [finally: exception(Exception)] 1 | Finally.cs:159:21:159:45 | [finally: exception(Exception)] throw ...; | true | -| Finally.cs:158:36:158:36 | [finally: exception(Exception)] 1 | Finally.cs:159:41:159:43 | [finally: exception(Exception)] "1" | true | +| Finally.cs:158:36:158:36 | [finally: exception] 1 | Finally.cs:159:21:159:45 | [finally: exception] throw ...; | true | +| Finally.cs:158:36:158:36 | [finally: exception] 1 | Finally.cs:159:41:159:43 | [finally: exception] "1" | true | | Finally.cs:161:13:164:13 | [exception: Exception] catch (...) {...} | Finally.cs:161:30:161:30 | [exception: Exception] Exception e | true | | Finally.cs:161:13:164:13 | [exception: NullReferenceException] catch (...) {...} | Finally.cs:161:30:161:30 | [exception: NullReferenceException] Exception e | true | -| Finally.cs:161:13:164:13 | [finally: exception(ArgumentNullException), exception: Exception] catch (...) {...} | Finally.cs:161:30:161:30 | [finally: exception(ArgumentNullException), exception: Exception] Exception e | true | -| Finally.cs:161:13:164:13 | [finally: exception(ArgumentNullException), exception: NullReferenceException] catch (...) {...} | Finally.cs:161:30:161:30 | [finally: exception(ArgumentNullException), exception: NullReferenceException] Exception e | true | -| Finally.cs:161:13:164:13 | [finally: exception(Exception), exception: Exception] catch (...) {...} | Finally.cs:161:30:161:30 | [finally: exception(Exception), exception: Exception] Exception e | true | -| Finally.cs:161:13:164:13 | [finally: exception(Exception), exception: NullReferenceException] catch (...) {...} | Finally.cs:161:30:161:30 | [finally: exception(Exception), exception: NullReferenceException] Exception e | true | +| Finally.cs:161:13:164:13 | [finally: exception, exception: Exception] catch (...) {...} | Finally.cs:161:30:161:30 | [finally: exception, exception: Exception] Exception e | true | +| Finally.cs:161:13:164:13 | [finally: exception, exception: NullReferenceException] catch (...) {...} | Finally.cs:161:30:161:30 | [finally: exception, exception: NullReferenceException] Exception e | true | | Finally.cs:176:10:176:11 | enter M9 | Finally.cs:176:10:176:11 | exit M9 (normal) | false | | Finally.cs:176:10:176:11 | enter M9 | Finally.cs:180:21:180:43 | [b1 (line 176): true] throw ...; | true | | Finally.cs:176:10:176:11 | enter M9 | Finally.cs:180:27:180:42 | [b1 (line 176): true] object creation of type ExceptionA | true | | Finally.cs:176:10:176:11 | enter M9 | Finally.cs:183:9:192:9 | [b1 (line 176): false] {...} | false | -| Finally.cs:176:10:176:11 | enter M9 | Finally.cs:183:9:192:9 | [finally: exception(Exception), b1 (line 176): true] {...} | true | +| Finally.cs:176:10:176:11 | enter M9 | Finally.cs:183:9:192:9 | [finally: exception, b1 (line 176): true] {...} | true | | Finally.cs:176:10:176:11 | enter M9 | Finally.cs:186:25:186:47 | [b1 (line 176): false, b2 (line 176): true] throw ...; | false | -| Finally.cs:176:10:176:11 | enter M9 | Finally.cs:186:25:186:47 | [finally: exception(Exception), b1 (line 176): true, b2 (line 176): true] throw ...; | true | -| Finally.cs:176:10:176:11 | enter M9 | Finally.cs:186:25:186:47 | [finally: exception(ExceptionA), b1 (line 176): true, b2 (line 176): true] throw ...; | true | +| Finally.cs:176:10:176:11 | enter M9 | Finally.cs:186:25:186:47 | [finally: exception, b1 (line 176): true, b2 (line 176): true] throw ...; | true | | Finally.cs:176:10:176:11 | enter M9 | Finally.cs:186:31:186:46 | [b1 (line 176): false, b2 (line 176): true] object creation of type ExceptionB | false | -| Finally.cs:176:10:176:11 | enter M9 | Finally.cs:186:31:186:46 | [finally: exception(Exception), b1 (line 176): true, b2 (line 176): true] object creation of type ExceptionB | true | -| Finally.cs:176:10:176:11 | enter M9 | Finally.cs:186:31:186:46 | [finally: exception(ExceptionA), b1 (line 176): true, b2 (line 176): true] object creation of type ExceptionB | true | +| Finally.cs:176:10:176:11 | enter M9 | Finally.cs:186:31:186:46 | [finally: exception, b1 (line 176): true, b2 (line 176): true] object creation of type ExceptionB | true | | Finally.cs:176:10:176:11 | enter M9 | Finally.cs:188:13:191:13 | [exception: Exception, b1 (line 176): false, b2 (line 176): true] catch (...) {...} | false | -| Finally.cs:176:10:176:11 | enter M9 | Finally.cs:188:13:191:13 | [finally: exception(Exception), exception: Exception, b1 (line 176): true, b2 (line 176): true] catch (...) {...} | true | -| Finally.cs:176:10:176:11 | enter M9 | Finally.cs:188:13:191:13 | [finally: exception(ExceptionA), exception: Exception, b1 (line 176): true, b2 (line 176): true] catch (...) {...} | true | +| Finally.cs:176:10:176:11 | enter M9 | Finally.cs:188:13:191:13 | [finally: exception, exception: Exception, b1 (line 176): true, b2 (line 176): true] catch (...) {...} | true | | Finally.cs:176:10:176:11 | enter M9 | Finally.cs:188:38:188:39 | [exception: Exception, b1 (line 176): false, b2 (line 176): true] access to parameter b2 | false | | Finally.cs:176:10:176:11 | enter M9 | Finally.cs:188:38:188:39 | [exception: ExceptionB, b1 (line 176): false, b2 (line 176): true] access to parameter b2 | false | -| Finally.cs:176:10:176:11 | enter M9 | Finally.cs:188:38:188:39 | [finally: exception(Exception), exception: Exception, b1 (line 176): true, b2 (line 176): true] access to parameter b2 | true | -| Finally.cs:176:10:176:11 | enter M9 | Finally.cs:188:38:188:39 | [finally: exception(Exception), exception: ExceptionB, b1 (line 176): true, b2 (line 176): true] access to parameter b2 | true | -| Finally.cs:176:10:176:11 | enter M9 | Finally.cs:188:38:188:39 | [finally: exception(ExceptionA), exception: Exception, b1 (line 176): true, b2 (line 176): true] access to parameter b2 | true | -| Finally.cs:176:10:176:11 | enter M9 | Finally.cs:188:38:188:39 | [finally: exception(ExceptionA), exception: ExceptionB, b1 (line 176): true, b2 (line 176): true] access to parameter b2 | true | +| Finally.cs:176:10:176:11 | enter M9 | Finally.cs:188:38:188:39 | [finally: exception, exception: Exception, b1 (line 176): true, b2 (line 176): true] access to parameter b2 | true | +| Finally.cs:176:10:176:11 | enter M9 | Finally.cs:188:38:188:39 | [finally: exception, exception: ExceptionB, b1 (line 176): true, b2 (line 176): true] access to parameter b2 | true | | Finally.cs:176:10:176:11 | enter M9 | Finally.cs:189:13:191:13 | [b1 (line 176): false] {...} | false | -| Finally.cs:176:10:176:11 | enter M9 | Finally.cs:189:13:191:13 | [finally: exception(Exception), b1 (line 176): true] {...} | true | -| Finally.cs:176:10:176:11 | enter M9 | Finally.cs:189:13:191:13 | [finally: exception(ExceptionA), b1 (line 176): true] {...} | true | -| Finally.cs:176:10:176:11 | enter M9 | Finally.cs:190:31:190:46 | [finally: exception(Exception)] object creation of type ExceptionC | true | -| Finally.cs:176:10:176:11 | enter M9 | Finally.cs:190:31:190:46 | [finally: exception(ExceptionA)] object creation of type ExceptionC | true | -| Finally.cs:180:21:180:43 | [b1 (line 176): true] throw ...; | Finally.cs:186:25:186:47 | [finally: exception(ExceptionA), b1 (line 176): true, b2 (line 176): true] throw ...; | true | -| Finally.cs:180:21:180:43 | [b1 (line 176): true] throw ...; | Finally.cs:186:31:186:46 | [finally: exception(ExceptionA), b1 (line 176): true, b2 (line 176): true] object creation of type ExceptionB | true | -| Finally.cs:180:21:180:43 | [b1 (line 176): true] throw ...; | Finally.cs:188:13:191:13 | [finally: exception(ExceptionA), exception: Exception, b1 (line 176): true, b2 (line 176): true] catch (...) {...} | true | -| Finally.cs:180:21:180:43 | [b1 (line 176): true] throw ...; | Finally.cs:188:38:188:39 | [finally: exception(ExceptionA), exception: Exception, b1 (line 176): true, b2 (line 176): true] access to parameter b2 | true | -| Finally.cs:180:21:180:43 | [b1 (line 176): true] throw ...; | Finally.cs:188:38:188:39 | [finally: exception(ExceptionA), exception: ExceptionB, b1 (line 176): true, b2 (line 176): true] access to parameter b2 | true | -| Finally.cs:180:21:180:43 | [b1 (line 176): true] throw ...; | Finally.cs:189:13:191:13 | [finally: exception(ExceptionA), b1 (line 176): true] {...} | true | -| Finally.cs:180:21:180:43 | [b1 (line 176): true] throw ...; | Finally.cs:190:31:190:46 | [finally: exception(ExceptionA)] object creation of type ExceptionC | true | +| Finally.cs:176:10:176:11 | enter M9 | Finally.cs:189:13:191:13 | [finally: exception, b1 (line 176): true] {...} | true | +| Finally.cs:176:10:176:11 | enter M9 | Finally.cs:190:31:190:46 | [finally: exception] object creation of type ExceptionC | true | | Finally.cs:183:9:192:9 | [b1 (line 176): false] {...} | Finally.cs:186:25:186:47 | [b1 (line 176): false, b2 (line 176): true] throw ...; | true | | Finally.cs:183:9:192:9 | [b1 (line 176): false] {...} | Finally.cs:186:31:186:46 | [b1 (line 176): false, b2 (line 176): true] object creation of type ExceptionB | true | | Finally.cs:183:9:192:9 | [b1 (line 176): false] {...} | Finally.cs:188:13:191:13 | [exception: Exception, b1 (line 176): false, b2 (line 176): true] catch (...) {...} | true | | Finally.cs:183:9:192:9 | [b1 (line 176): false] {...} | Finally.cs:188:38:188:39 | [exception: Exception, b1 (line 176): false, b2 (line 176): true] access to parameter b2 | true | | Finally.cs:183:9:192:9 | [b1 (line 176): false] {...} | Finally.cs:188:38:188:39 | [exception: ExceptionB, b1 (line 176): false, b2 (line 176): true] access to parameter b2 | true | | Finally.cs:183:9:192:9 | [b1 (line 176): false] {...} | Finally.cs:189:13:191:13 | [b1 (line 176): false] {...} | true | -| Finally.cs:183:9:192:9 | [finally: exception(Exception), b1 (line 176): true] {...} | Finally.cs:186:25:186:47 | [finally: exception(Exception), b1 (line 176): true, b2 (line 176): true] throw ...; | true | -| Finally.cs:183:9:192:9 | [finally: exception(Exception), b1 (line 176): true] {...} | Finally.cs:186:31:186:46 | [finally: exception(Exception), b1 (line 176): true, b2 (line 176): true] object creation of type ExceptionB | true | -| Finally.cs:183:9:192:9 | [finally: exception(Exception), b1 (line 176): true] {...} | Finally.cs:188:13:191:13 | [finally: exception(Exception), exception: Exception, b1 (line 176): true, b2 (line 176): true] catch (...) {...} | true | -| Finally.cs:183:9:192:9 | [finally: exception(Exception), b1 (line 176): true] {...} | Finally.cs:188:38:188:39 | [finally: exception(Exception), exception: Exception, b1 (line 176): true, b2 (line 176): true] access to parameter b2 | true | -| Finally.cs:183:9:192:9 | [finally: exception(Exception), b1 (line 176): true] {...} | Finally.cs:188:38:188:39 | [finally: exception(Exception), exception: ExceptionB, b1 (line 176): true, b2 (line 176): true] access to parameter b2 | true | -| Finally.cs:183:9:192:9 | [finally: exception(Exception), b1 (line 176): true] {...} | Finally.cs:189:13:191:13 | [finally: exception(Exception), b1 (line 176): true] {...} | true | -| Finally.cs:183:9:192:9 | [finally: exception(Exception), b1 (line 176): true] {...} | Finally.cs:190:31:190:46 | [finally: exception(Exception)] object creation of type ExceptionC | true | +| Finally.cs:183:9:192:9 | [finally: exception, b1 (line 176): true] {...} | Finally.cs:186:25:186:47 | [finally: exception, b1 (line 176): true, b2 (line 176): true] throw ...; | true | +| Finally.cs:183:9:192:9 | [finally: exception, b1 (line 176): true] {...} | Finally.cs:186:31:186:46 | [finally: exception, b1 (line 176): true, b2 (line 176): true] object creation of type ExceptionB | true | +| Finally.cs:183:9:192:9 | [finally: exception, b1 (line 176): true] {...} | Finally.cs:188:13:191:13 | [finally: exception, exception: Exception, b1 (line 176): true, b2 (line 176): true] catch (...) {...} | true | +| Finally.cs:183:9:192:9 | [finally: exception, b1 (line 176): true] {...} | Finally.cs:188:38:188:39 | [finally: exception, exception: Exception, b1 (line 176): true, b2 (line 176): true] access to parameter b2 | true | +| Finally.cs:183:9:192:9 | [finally: exception, b1 (line 176): true] {...} | Finally.cs:188:38:188:39 | [finally: exception, exception: ExceptionB, b1 (line 176): true, b2 (line 176): true] access to parameter b2 | true | +| Finally.cs:183:9:192:9 | [finally: exception, b1 (line 176): true] {...} | Finally.cs:189:13:191:13 | [finally: exception, b1 (line 176): true] {...} | true | +| Finally.cs:183:9:192:9 | [finally: exception, b1 (line 176): true] {...} | Finally.cs:190:31:190:46 | [finally: exception] object creation of type ExceptionC | true | | Finally.cs:186:25:186:47 | [b1 (line 176): false, b2 (line 176): true] throw ...; | Finally.cs:188:38:188:39 | [exception: ExceptionB, b1 (line 176): false, b2 (line 176): true] access to parameter b2 | true | -| Finally.cs:186:25:186:47 | [finally: exception(Exception), b1 (line 176): true, b2 (line 176): true] throw ...; | Finally.cs:188:38:188:39 | [finally: exception(Exception), exception: ExceptionB, b1 (line 176): true, b2 (line 176): true] access to parameter b2 | true | -| Finally.cs:186:25:186:47 | [finally: exception(ExceptionA), b1 (line 176): true, b2 (line 176): true] throw ...; | Finally.cs:188:38:188:39 | [finally: exception(ExceptionA), exception: ExceptionB, b1 (line 176): true, b2 (line 176): true] access to parameter b2 | true | +| Finally.cs:186:25:186:47 | [finally: exception, b1 (line 176): true, b2 (line 176): true] throw ...; | Finally.cs:188:38:188:39 | [finally: exception, exception: ExceptionB, b1 (line 176): true, b2 (line 176): true] access to parameter b2 | true | | Finally.cs:188:13:191:13 | [exception: Exception, b1 (line 176): false, b2 (line 176): true] catch (...) {...} | Finally.cs:188:38:188:39 | [exception: Exception, b1 (line 176): false, b2 (line 176): true] access to parameter b2 | true | -| Finally.cs:188:13:191:13 | [finally: exception(Exception), exception: Exception, b1 (line 176): true, b2 (line 176): true] catch (...) {...} | Finally.cs:188:38:188:39 | [finally: exception(Exception), exception: Exception, b1 (line 176): true, b2 (line 176): true] access to parameter b2 | true | -| Finally.cs:188:13:191:13 | [finally: exception(ExceptionA), exception: Exception, b1 (line 176): true, b2 (line 176): true] catch (...) {...} | Finally.cs:188:38:188:39 | [finally: exception(ExceptionA), exception: Exception, b1 (line 176): true, b2 (line 176): true] access to parameter b2 | true | -| Finally.cs:189:13:191:13 | [finally: exception(Exception), b1 (line 176): true] {...} | Finally.cs:190:31:190:46 | [finally: exception(Exception)] object creation of type ExceptionC | true | -| Finally.cs:189:13:191:13 | [finally: exception(ExceptionA), b1 (line 176): true] {...} | Finally.cs:190:31:190:46 | [finally: exception(ExceptionA)] object creation of type ExceptionC | true | +| Finally.cs:188:13:191:13 | [finally: exception, exception: Exception, b1 (line 176): true, b2 (line 176): true] catch (...) {...} | Finally.cs:188:38:188:39 | [finally: exception, exception: Exception, b1 (line 176): true, b2 (line 176): true] access to parameter b2 | true | +| Finally.cs:189:13:191:13 | [finally: exception, b1 (line 176): true] {...} | Finally.cs:190:31:190:46 | [finally: exception] object creation of type ExceptionC | true | | Finally.cs:195:10:195:12 | enter M10 | Finally.cs:199:21:199:43 | throw ...; | true | | Finally.cs:195:10:195:12 | enter M10 | Finally.cs:199:27:199:42 | object creation of type ExceptionA | true | -| Finally.cs:195:10:195:12 | enter M10 | Finally.cs:202:9:212:9 | [finally: exception(Exception)] {...} | true | +| Finally.cs:195:10:195:12 | enter M10 | Finally.cs:202:9:212:9 | [finally: exception] {...} | true | | Finally.cs:195:10:195:12 | enter M10 | Finally.cs:202:9:212:9 | {...} | false | -| Finally.cs:195:10:195:12 | enter M10 | Finally.cs:205:25:205:47 | [finally: exception(Exception)] throw ...; | true | -| Finally.cs:195:10:195:12 | enter M10 | Finally.cs:205:25:205:47 | [finally: exception(ExceptionA)] throw ...; | true | +| Finally.cs:195:10:195:12 | enter M10 | Finally.cs:205:25:205:47 | [finally: exception] throw ...; | true | | Finally.cs:195:10:195:12 | enter M10 | Finally.cs:205:25:205:47 | throw ...; | false | -| Finally.cs:195:10:195:12 | enter M10 | Finally.cs:205:31:205:46 | [finally: exception(Exception)] object creation of type ExceptionB | true | -| Finally.cs:195:10:195:12 | enter M10 | Finally.cs:205:31:205:46 | [finally: exception(ExceptionA)] object creation of type ExceptionB | true | +| Finally.cs:195:10:195:12 | enter M10 | Finally.cs:205:31:205:46 | [finally: exception] object creation of type ExceptionB | true | | Finally.cs:195:10:195:12 | enter M10 | Finally.cs:205:31:205:46 | object creation of type ExceptionB | false | -| Finally.cs:195:10:195:12 | enter M10 | Finally.cs:208:13:210:13 | [finally(1): exception(Exception)] {...} | false | -| Finally.cs:195:10:195:12 | enter M10 | Finally.cs:208:13:210:13 | [finally: exception(Exception), finally(1): exception(Exception)] {...} | true | -| Finally.cs:195:10:195:12 | enter M10 | Finally.cs:208:13:210:13 | [finally: exception(Exception)] {...} | true | -| Finally.cs:195:10:195:12 | enter M10 | Finally.cs:208:13:210:13 | [finally: exception(ExceptionA), finally(1): exception(Exception)] {...} | true | -| Finally.cs:195:10:195:12 | enter M10 | Finally.cs:208:13:210:13 | [finally: exception(ExceptionA)] {...} | true | +| Finally.cs:195:10:195:12 | enter M10 | Finally.cs:208:13:210:13 | [finally(1): exception] {...} | false | +| Finally.cs:195:10:195:12 | enter M10 | Finally.cs:208:13:210:13 | [finally: exception, finally(1): exception] {...} | true | +| Finally.cs:195:10:195:12 | enter M10 | Finally.cs:208:13:210:13 | [finally: exception] {...} | true | | Finally.cs:195:10:195:12 | enter M10 | Finally.cs:208:13:210:13 | {...} | false | -| Finally.cs:195:10:195:12 | enter M10 | Finally.cs:209:31:209:46 | [finally(1): exception(Exception)] object creation of type ExceptionC | false | -| Finally.cs:195:10:195:12 | enter M10 | Finally.cs:209:31:209:46 | [finally(1): exception(ExceptionB)] object creation of type ExceptionC | false | -| Finally.cs:195:10:195:12 | enter M10 | Finally.cs:209:31:209:46 | [finally: exception(Exception), finally(1): exception(Exception)] object creation of type ExceptionC | true | -| Finally.cs:195:10:195:12 | enter M10 | Finally.cs:209:31:209:46 | [finally: exception(Exception), finally(1): exception(ExceptionB)] object creation of type ExceptionC | true | -| Finally.cs:195:10:195:12 | enter M10 | Finally.cs:209:31:209:46 | [finally: exception(Exception)] object creation of type ExceptionC | true | -| Finally.cs:195:10:195:12 | enter M10 | Finally.cs:209:31:209:46 | [finally: exception(ExceptionA), finally(1): exception(Exception)] object creation of type ExceptionC | true | -| Finally.cs:195:10:195:12 | enter M10 | Finally.cs:209:31:209:46 | [finally: exception(ExceptionA), finally(1): exception(ExceptionB)] object creation of type ExceptionC | true | -| Finally.cs:195:10:195:12 | enter M10 | Finally.cs:209:31:209:46 | [finally: exception(ExceptionA)] object creation of type ExceptionC | true | +| Finally.cs:195:10:195:12 | enter M10 | Finally.cs:209:31:209:46 | [finally(1): exception] object creation of type ExceptionC | false | +| Finally.cs:195:10:195:12 | enter M10 | Finally.cs:209:31:209:46 | [finally: exception, finally(1): exception] object creation of type ExceptionC | true | +| Finally.cs:195:10:195:12 | enter M10 | Finally.cs:209:31:209:46 | [finally: exception] object creation of type ExceptionC | true | | Finally.cs:195:10:195:12 | enter M10 | Finally.cs:209:31:209:46 | object creation of type ExceptionC | false | | Finally.cs:195:10:195:12 | enter M10 | Finally.cs:211:13:211:29 | ...; | false | -| Finally.cs:195:10:195:12 | enter M10 | Finally.cs:211:13:211:29 | [finally: exception(Exception)] ...; | true | -| Finally.cs:195:10:195:12 | enter M10 | Finally.cs:211:13:211:29 | [finally: exception(ExceptionA)] ...; | true | -| Finally.cs:199:21:199:43 | throw ...; | Finally.cs:205:25:205:47 | [finally: exception(ExceptionA)] throw ...; | true | -| Finally.cs:199:21:199:43 | throw ...; | Finally.cs:205:31:205:46 | [finally: exception(ExceptionA)] object creation of type ExceptionB | true | -| Finally.cs:199:21:199:43 | throw ...; | Finally.cs:208:13:210:13 | [finally: exception(ExceptionA), finally(1): exception(Exception)] {...} | true | -| Finally.cs:199:21:199:43 | throw ...; | Finally.cs:208:13:210:13 | [finally: exception(ExceptionA)] {...} | false | -| Finally.cs:199:21:199:43 | throw ...; | Finally.cs:209:31:209:46 | [finally: exception(ExceptionA), finally(1): exception(Exception)] object creation of type ExceptionC | true | -| Finally.cs:199:21:199:43 | throw ...; | Finally.cs:209:31:209:46 | [finally: exception(ExceptionA), finally(1): exception(ExceptionB)] object creation of type ExceptionC | true | -| Finally.cs:199:21:199:43 | throw ...; | Finally.cs:209:31:209:46 | [finally: exception(ExceptionA)] object creation of type ExceptionC | false | -| Finally.cs:199:21:199:43 | throw ...; | Finally.cs:211:13:211:29 | [finally: exception(ExceptionA)] ...; | false | -| Finally.cs:202:9:212:9 | [finally: exception(Exception)] {...} | Finally.cs:205:25:205:47 | [finally: exception(Exception)] throw ...; | true | -| Finally.cs:202:9:212:9 | [finally: exception(Exception)] {...} | Finally.cs:205:31:205:46 | [finally: exception(Exception)] object creation of type ExceptionB | true | -| Finally.cs:202:9:212:9 | [finally: exception(Exception)] {...} | Finally.cs:208:13:210:13 | [finally: exception(Exception), finally(1): exception(Exception)] {...} | true | -| Finally.cs:202:9:212:9 | [finally: exception(Exception)] {...} | Finally.cs:208:13:210:13 | [finally: exception(Exception)] {...} | false | -| Finally.cs:202:9:212:9 | [finally: exception(Exception)] {...} | Finally.cs:209:31:209:46 | [finally: exception(Exception), finally(1): exception(Exception)] object creation of type ExceptionC | true | -| Finally.cs:202:9:212:9 | [finally: exception(Exception)] {...} | Finally.cs:209:31:209:46 | [finally: exception(Exception), finally(1): exception(ExceptionB)] object creation of type ExceptionC | true | -| Finally.cs:202:9:212:9 | [finally: exception(Exception)] {...} | Finally.cs:209:31:209:46 | [finally: exception(Exception)] object creation of type ExceptionC | false | -| Finally.cs:202:9:212:9 | [finally: exception(Exception)] {...} | Finally.cs:211:13:211:29 | [finally: exception(Exception)] ...; | false | +| Finally.cs:195:10:195:12 | enter M10 | Finally.cs:211:13:211:29 | [finally: exception] ...; | true | +| Finally.cs:202:9:212:9 | [finally: exception] {...} | Finally.cs:205:25:205:47 | [finally: exception] throw ...; | true | +| Finally.cs:202:9:212:9 | [finally: exception] {...} | Finally.cs:205:31:205:46 | [finally: exception] object creation of type ExceptionB | true | +| Finally.cs:202:9:212:9 | [finally: exception] {...} | Finally.cs:208:13:210:13 | [finally: exception, finally(1): exception] {...} | true | +| Finally.cs:202:9:212:9 | [finally: exception] {...} | Finally.cs:208:13:210:13 | [finally: exception] {...} | false | +| Finally.cs:202:9:212:9 | [finally: exception] {...} | Finally.cs:209:31:209:46 | [finally: exception, finally(1): exception] object creation of type ExceptionC | true | +| Finally.cs:202:9:212:9 | [finally: exception] {...} | Finally.cs:209:31:209:46 | [finally: exception] object creation of type ExceptionC | false | +| Finally.cs:202:9:212:9 | [finally: exception] {...} | Finally.cs:211:13:211:29 | [finally: exception] ...; | false | | Finally.cs:202:9:212:9 | {...} | Finally.cs:205:25:205:47 | throw ...; | true | | Finally.cs:202:9:212:9 | {...} | Finally.cs:205:31:205:46 | object creation of type ExceptionB | true | -| Finally.cs:202:9:212:9 | {...} | Finally.cs:208:13:210:13 | [finally(1): exception(Exception)] {...} | true | +| Finally.cs:202:9:212:9 | {...} | Finally.cs:208:13:210:13 | [finally(1): exception] {...} | true | | Finally.cs:202:9:212:9 | {...} | Finally.cs:208:13:210:13 | {...} | false | -| Finally.cs:202:9:212:9 | {...} | Finally.cs:209:31:209:46 | [finally(1): exception(Exception)] object creation of type ExceptionC | true | -| Finally.cs:202:9:212:9 | {...} | Finally.cs:209:31:209:46 | [finally(1): exception(ExceptionB)] object creation of type ExceptionC | true | +| Finally.cs:202:9:212:9 | {...} | Finally.cs:209:31:209:46 | [finally(1): exception] object creation of type ExceptionC | true | | Finally.cs:202:9:212:9 | {...} | Finally.cs:209:31:209:46 | object creation of type ExceptionC | false | | Finally.cs:202:9:212:9 | {...} | Finally.cs:211:13:211:29 | ...; | false | -| Finally.cs:205:25:205:47 | [finally: exception(Exception)] throw ...; | Finally.cs:209:31:209:46 | [finally: exception(Exception), finally(1): exception(ExceptionB)] object creation of type ExceptionC | true | -| Finally.cs:205:25:205:47 | [finally: exception(ExceptionA)] throw ...; | Finally.cs:209:31:209:46 | [finally: exception(ExceptionA), finally(1): exception(ExceptionB)] object creation of type ExceptionC | true | -| Finally.cs:205:25:205:47 | throw ...; | Finally.cs:209:31:209:46 | [finally(1): exception(ExceptionB)] object creation of type ExceptionC | true | -| Finally.cs:208:13:210:13 | [finally(1): exception(Exception)] {...} | Finally.cs:209:31:209:46 | [finally(1): exception(Exception)] object creation of type ExceptionC | true | -| Finally.cs:208:13:210:13 | [finally: exception(Exception), finally(1): exception(Exception)] {...} | Finally.cs:209:31:209:46 | [finally: exception(Exception), finally(1): exception(Exception)] object creation of type ExceptionC | true | -| Finally.cs:208:13:210:13 | [finally: exception(Exception)] {...} | Finally.cs:209:31:209:46 | [finally: exception(Exception)] object creation of type ExceptionC | true | -| Finally.cs:208:13:210:13 | [finally: exception(Exception)] {...} | Finally.cs:211:13:211:29 | [finally: exception(Exception)] ...; | false | -| Finally.cs:208:13:210:13 | [finally: exception(ExceptionA), finally(1): exception(Exception)] {...} | Finally.cs:209:31:209:46 | [finally: exception(ExceptionA), finally(1): exception(Exception)] object creation of type ExceptionC | true | -| Finally.cs:208:13:210:13 | [finally: exception(ExceptionA)] {...} | Finally.cs:209:31:209:46 | [finally: exception(ExceptionA)] object creation of type ExceptionC | true | -| Finally.cs:208:13:210:13 | [finally: exception(ExceptionA)] {...} | Finally.cs:211:13:211:29 | [finally: exception(ExceptionA)] ...; | false | +| Finally.cs:208:13:210:13 | [finally(1): exception] {...} | Finally.cs:209:31:209:46 | [finally(1): exception] object creation of type ExceptionC | true | +| Finally.cs:208:13:210:13 | [finally: exception, finally(1): exception] {...} | Finally.cs:209:31:209:46 | [finally: exception, finally(1): exception] object creation of type ExceptionC | true | +| Finally.cs:208:13:210:13 | [finally: exception] {...} | Finally.cs:209:31:209:46 | [finally: exception] object creation of type ExceptionC | true | +| Finally.cs:208:13:210:13 | [finally: exception] {...} | Finally.cs:211:13:211:29 | [finally: exception] ...; | false | | Finally.cs:208:13:210:13 | {...} | Finally.cs:209:31:209:46 | object creation of type ExceptionC | true | | Finally.cs:208:13:210:13 | {...} | Finally.cs:211:13:211:29 | ...; | false | | Finally.cs:233:10:233:12 | enter M12 | Finally.cs:240:21:240:43 | throw ...; | true | | Finally.cs:233:10:233:12 | enter M12 | Finally.cs:240:27:240:42 | object creation of type ExceptionA | true | -| Finally.cs:233:10:233:12 | enter M12 | Finally.cs:243:13:253:13 | [finally: exception(Exception)] {...} | true | +| Finally.cs:233:10:233:12 | enter M12 | Finally.cs:243:13:253:13 | [finally: exception] {...} | true | | Finally.cs:233:10:233:12 | enter M12 | Finally.cs:243:13:253:13 | {...} | false | -| Finally.cs:233:10:233:12 | enter M12 | Finally.cs:247:25:247:47 | [finally: exception(Exception)] throw ...; | true | -| Finally.cs:233:10:233:12 | enter M12 | Finally.cs:247:25:247:47 | [finally: exception(ExceptionA)] throw ...; | true | +| Finally.cs:233:10:233:12 | enter M12 | Finally.cs:247:25:247:47 | [finally: exception] throw ...; | true | | Finally.cs:233:10:233:12 | enter M12 | Finally.cs:247:25:247:47 | throw ...; | false | -| Finally.cs:233:10:233:12 | enter M12 | Finally.cs:247:31:247:46 | [finally: exception(Exception)] object creation of type ExceptionA | true | -| Finally.cs:233:10:233:12 | enter M12 | Finally.cs:247:31:247:46 | [finally: exception(ExceptionA)] object creation of type ExceptionA | true | +| Finally.cs:233:10:233:12 | enter M12 | Finally.cs:247:31:247:46 | [finally: exception] object creation of type ExceptionA | true | | Finally.cs:233:10:233:12 | enter M12 | Finally.cs:247:31:247:46 | object creation of type ExceptionA | false | -| Finally.cs:233:10:233:12 | enter M12 | Finally.cs:250:17:252:17 | [finally(1): exception(Exception)] {...} | false | -| Finally.cs:233:10:233:12 | enter M12 | Finally.cs:250:17:252:17 | [finally: exception(Exception), finally(1): exception(Exception)] {...} | true | -| Finally.cs:233:10:233:12 | enter M12 | Finally.cs:250:17:252:17 | [finally: exception(Exception)] {...} | true | -| Finally.cs:233:10:233:12 | enter M12 | Finally.cs:250:17:252:17 | [finally: exception(ExceptionA), finally(1): exception(Exception)] {...} | true | -| Finally.cs:233:10:233:12 | enter M12 | Finally.cs:250:17:252:17 | [finally: exception(ExceptionA)] {...} | true | +| Finally.cs:233:10:233:12 | enter M12 | Finally.cs:250:17:252:17 | [finally(1): exception] {...} | false | +| Finally.cs:233:10:233:12 | enter M12 | Finally.cs:250:17:252:17 | [finally: exception, finally(1): exception] {...} | true | +| Finally.cs:233:10:233:12 | enter M12 | Finally.cs:250:17:252:17 | [finally: exception] {...} | true | | Finally.cs:233:10:233:12 | enter M12 | Finally.cs:250:17:252:17 | {...} | false | | Finally.cs:233:10:233:12 | enter M12 | Finally.cs:257:9:259:9 | {...} | false | -| Finally.cs:240:21:240:43 | throw ...; | Finally.cs:247:25:247:47 | [finally: exception(ExceptionA)] throw ...; | true | -| Finally.cs:240:21:240:43 | throw ...; | Finally.cs:247:31:247:46 | [finally: exception(ExceptionA)] object creation of type ExceptionA | true | -| Finally.cs:240:21:240:43 | throw ...; | Finally.cs:250:17:252:17 | [finally: exception(ExceptionA), finally(1): exception(Exception)] {...} | true | -| Finally.cs:240:21:240:43 | throw ...; | Finally.cs:250:17:252:17 | [finally: exception(ExceptionA)] {...} | false | -| Finally.cs:243:13:253:13 | [finally: exception(Exception)] {...} | Finally.cs:247:25:247:47 | [finally: exception(Exception)] throw ...; | true | -| Finally.cs:243:13:253:13 | [finally: exception(Exception)] {...} | Finally.cs:247:31:247:46 | [finally: exception(Exception)] object creation of type ExceptionA | true | -| Finally.cs:243:13:253:13 | [finally: exception(Exception)] {...} | Finally.cs:250:17:252:17 | [finally: exception(Exception), finally(1): exception(Exception)] {...} | true | -| Finally.cs:243:13:253:13 | [finally: exception(Exception)] {...} | Finally.cs:250:17:252:17 | [finally: exception(Exception)] {...} | false | +| Finally.cs:243:13:253:13 | [finally: exception] {...} | Finally.cs:247:25:247:47 | [finally: exception] throw ...; | true | +| Finally.cs:243:13:253:13 | [finally: exception] {...} | Finally.cs:247:31:247:46 | [finally: exception] object creation of type ExceptionA | true | +| Finally.cs:243:13:253:13 | [finally: exception] {...} | Finally.cs:250:17:252:17 | [finally: exception, finally(1): exception] {...} | true | +| Finally.cs:243:13:253:13 | [finally: exception] {...} | Finally.cs:250:17:252:17 | [finally: exception] {...} | false | | Finally.cs:243:13:253:13 | {...} | Finally.cs:247:25:247:47 | throw ...; | true | | Finally.cs:243:13:253:13 | {...} | Finally.cs:247:31:247:46 | object creation of type ExceptionA | true | -| Finally.cs:243:13:253:13 | {...} | Finally.cs:250:17:252:17 | [finally(1): exception(Exception)] {...} | true | +| Finally.cs:243:13:253:13 | {...} | Finally.cs:250:17:252:17 | [finally(1): exception] {...} | true | | Finally.cs:243:13:253:13 | {...} | Finally.cs:250:17:252:17 | {...} | false | | Finally.cs:243:13:253:13 | {...} | Finally.cs:257:9:259:9 | {...} | false | | Foreach.cs:8:9:9:13 | foreach (... ... in ...) ... | Foreach.cs:6:10:6:11 | exit M1 (normal) | true | @@ -2751,91 +2665,62 @@ conditionFlow | Finally.cs:107:17:107:33 | ... == ... | Finally.cs:109:13:110:49 | if (...) ... | false | | Finally.cs:109:17:109:33 | ... == ... | Finally.cs:110:23:110:48 | object creation of type OutOfMemoryException | true | | Finally.cs:109:17:109:33 | ... == ... | Finally.cs:113:9:118:9 | {...} | false | -| Finally.cs:114:17:114:36 | [false, finally: exception(Exception)] !... | Finally.cs:116:13:117:37 | [finally: exception(Exception)] if (...) ... | false | -| Finally.cs:114:17:114:36 | [false, finally: exception(NullReferenceException)] !... | Finally.cs:116:13:117:37 | [finally: exception(NullReferenceException)] if (...) ... | false | -| Finally.cs:114:17:114:36 | [false, finally: exception(OutOfMemoryException)] !... | Finally.cs:116:13:117:37 | [finally: exception(OutOfMemoryException)] if (...) ... | false | +| Finally.cs:114:17:114:36 | [false, finally: exception] !... | Finally.cs:116:13:117:37 | [finally: exception] if (...) ... | false | | Finally.cs:114:17:114:36 | [false, finally: return] !... | Finally.cs:116:13:117:37 | [finally: return] if (...) ... | false | | Finally.cs:114:17:114:36 | [false] !... | Finally.cs:116:13:117:37 | if (...) ... | false | -| Finally.cs:114:17:114:36 | [true, finally: exception(Exception)] !... | Finally.cs:115:17:115:41 | [finally: exception(Exception)] ...; | true | -| Finally.cs:114:17:114:36 | [true, finally: exception(NullReferenceException)] !... | Finally.cs:115:17:115:41 | [finally: exception(NullReferenceException)] ...; | true | -| Finally.cs:114:17:114:36 | [true, finally: exception(OutOfMemoryException)] !... | Finally.cs:115:17:115:41 | [finally: exception(OutOfMemoryException)] ...; | true | +| Finally.cs:114:17:114:36 | [true, finally: exception] !... | Finally.cs:115:17:115:41 | [finally: exception] ...; | true | | Finally.cs:114:17:114:36 | [true, finally: return] !... | Finally.cs:115:17:115:41 | [finally: return] ...; | true | | Finally.cs:114:17:114:36 | [true] !... | Finally.cs:115:17:115:41 | ...; | true | | Finally.cs:114:19:114:35 | ... == ... | Finally.cs:114:17:114:36 | [false] !... | true | | Finally.cs:114:19:114:35 | ... == ... | Finally.cs:114:17:114:36 | [true] !... | false | -| Finally.cs:114:19:114:35 | [finally: exception(Exception)] ... == ... | Finally.cs:114:17:114:36 | [false, finally: exception(Exception)] !... | true | -| Finally.cs:114:19:114:35 | [finally: exception(Exception)] ... == ... | Finally.cs:114:17:114:36 | [true, finally: exception(Exception)] !... | false | -| Finally.cs:114:19:114:35 | [finally: exception(NullReferenceException)] ... == ... | Finally.cs:114:17:114:36 | [false, finally: exception(NullReferenceException)] !... | true | -| Finally.cs:114:19:114:35 | [finally: exception(NullReferenceException)] ... == ... | Finally.cs:114:17:114:36 | [true, finally: exception(NullReferenceException)] !... | false | -| Finally.cs:114:19:114:35 | [finally: exception(OutOfMemoryException)] ... == ... | Finally.cs:114:17:114:36 | [false, finally: exception(OutOfMemoryException)] !... | true | -| Finally.cs:114:19:114:35 | [finally: exception(OutOfMemoryException)] ... == ... | Finally.cs:114:17:114:36 | [true, finally: exception(OutOfMemoryException)] !... | false | +| Finally.cs:114:19:114:35 | [finally: exception] ... == ... | Finally.cs:114:17:114:36 | [false, finally: exception] !... | true | +| Finally.cs:114:19:114:35 | [finally: exception] ... == ... | Finally.cs:114:17:114:36 | [true, finally: exception] !... | false | | Finally.cs:114:19:114:35 | [finally: return] ... == ... | Finally.cs:114:17:114:36 | [false, finally: return] !... | true | | Finally.cs:114:19:114:35 | [finally: return] ... == ... | Finally.cs:114:17:114:36 | [true, finally: return] !... | false | | Finally.cs:116:17:116:32 | ... > ... | Finally.cs:103:10:103:11 | exit M5 (normal) | false | | Finally.cs:116:17:116:32 | ... > ... | Finally.cs:117:17:117:37 | ...; | true | -| Finally.cs:116:17:116:32 | [finally: exception(Exception)] ... > ... | Finally.cs:117:17:117:37 | [finally: exception(Exception)] ...; | true | -| Finally.cs:116:17:116:32 | [finally: exception(NullReferenceException)] ... > ... | Finally.cs:117:17:117:37 | [finally: exception(NullReferenceException)] ...; | true | -| Finally.cs:116:17:116:32 | [finally: exception(OutOfMemoryException)] ... > ... | Finally.cs:117:17:117:37 | [finally: exception(OutOfMemoryException)] ...; | true | +| Finally.cs:116:17:116:32 | [finally: exception] ... > ... | Finally.cs:117:17:117:37 | [finally: exception] ...; | true | | Finally.cs:116:17:116:32 | [finally: return] ... > ... | Finally.cs:117:17:117:37 | [finally: return] ...; | true | | Finally.cs:151:17:151:28 | ... == ... | Finally.cs:152:23:152:49 | object creation of type ArgumentNullException | true | | Finally.cs:151:17:151:28 | ... == ... | Finally.cs:155:9:169:9 | {...} | false | | Finally.cs:158:21:158:36 | ... == ... | Finally.cs:147:10:147:11 | exit M8 (normal) | false | | Finally.cs:158:21:158:36 | ... == ... | Finally.cs:159:41:159:43 | "1" | true | -| Finally.cs:158:21:158:36 | [finally: exception(ArgumentNullException)] ... == ... | Finally.cs:159:41:159:43 | [finally: exception(ArgumentNullException)] "1" | true | -| Finally.cs:158:21:158:36 | [finally: exception(Exception)] ... == ... | Finally.cs:159:41:159:43 | [finally: exception(Exception)] "1" | true | +| Finally.cs:158:21:158:36 | [finally: exception] ... == ... | Finally.cs:159:41:159:43 | [finally: exception] "1" | true | | Finally.cs:161:39:161:54 | [exception: Exception] ... == ... | Finally.cs:162:13:164:13 | {...} | true | | Finally.cs:161:39:161:54 | [exception: Exception] ... == ... | Finally.cs:165:13:168:13 | catch {...} | false | | Finally.cs:161:39:161:54 | [exception: NullReferenceException] ... == ... | Finally.cs:162:13:164:13 | {...} | true | | Finally.cs:161:39:161:54 | [exception: NullReferenceException] ... == ... | Finally.cs:165:13:168:13 | catch {...} | false | -| Finally.cs:161:39:161:54 | [finally: exception(ArgumentNullException), exception: Exception] ... == ... | Finally.cs:162:13:164:13 | [finally: exception(ArgumentNullException)] {...} | true | -| Finally.cs:161:39:161:54 | [finally: exception(ArgumentNullException), exception: Exception] ... == ... | Finally.cs:165:13:168:13 | [finally: exception(ArgumentNullException)] catch {...} | false | -| Finally.cs:161:39:161:54 | [finally: exception(ArgumentNullException), exception: NullReferenceException] ... == ... | Finally.cs:162:13:164:13 | [finally: exception(ArgumentNullException)] {...} | true | -| Finally.cs:161:39:161:54 | [finally: exception(ArgumentNullException), exception: NullReferenceException] ... == ... | Finally.cs:165:13:168:13 | [finally: exception(ArgumentNullException)] catch {...} | false | -| Finally.cs:161:39:161:54 | [finally: exception(Exception), exception: Exception] ... == ... | Finally.cs:162:13:164:13 | [finally: exception(Exception)] {...} | true | -| Finally.cs:161:39:161:54 | [finally: exception(Exception), exception: Exception] ... == ... | Finally.cs:165:13:168:13 | [finally: exception(Exception)] catch {...} | false | -| Finally.cs:161:39:161:54 | [finally: exception(Exception), exception: NullReferenceException] ... == ... | Finally.cs:162:13:164:13 | [finally: exception(Exception)] {...} | true | -| Finally.cs:161:39:161:54 | [finally: exception(Exception), exception: NullReferenceException] ... == ... | Finally.cs:165:13:168:13 | [finally: exception(Exception)] catch {...} | false | +| Finally.cs:161:39:161:54 | [finally: exception, exception: Exception] ... == ... | Finally.cs:162:13:164:13 | [finally: exception] {...} | true | +| Finally.cs:161:39:161:54 | [finally: exception, exception: Exception] ... == ... | Finally.cs:165:13:168:13 | [finally: exception] catch {...} | false | +| Finally.cs:161:39:161:54 | [finally: exception, exception: NullReferenceException] ... == ... | Finally.cs:162:13:164:13 | [finally: exception] {...} | true | +| Finally.cs:161:39:161:54 | [finally: exception, exception: NullReferenceException] ... == ... | Finally.cs:165:13:168:13 | [finally: exception] catch {...} | false | | Finally.cs:180:17:180:18 | access to parameter b1 | Finally.cs:180:27:180:42 | [b1 (line 176): true] object creation of type ExceptionA | true | | Finally.cs:180:17:180:18 | access to parameter b1 | Finally.cs:183:9:192:9 | [b1 (line 176): false] {...} | false | | Finally.cs:186:21:186:22 | [b1 (line 176): false] access to parameter b2 | Finally.cs:176:10:176:11 | exit M9 (normal) | false | | Finally.cs:186:21:186:22 | [b1 (line 176): false] access to parameter b2 | Finally.cs:186:31:186:46 | [b1 (line 176): false, b2 (line 176): true] object creation of type ExceptionB | true | -| Finally.cs:186:21:186:22 | [finally: exception(Exception), b1 (line 176): true] access to parameter b2 | Finally.cs:186:31:186:46 | [finally: exception(Exception), b1 (line 176): true, b2 (line 176): true] object creation of type ExceptionB | true | -| Finally.cs:186:21:186:22 | [finally: exception(ExceptionA), b1 (line 176): true] access to parameter b2 | Finally.cs:186:31:186:46 | [finally: exception(ExceptionA), b1 (line 176): true, b2 (line 176): true] object creation of type ExceptionB | true | +| Finally.cs:186:21:186:22 | [finally: exception, b1 (line 176): true] access to parameter b2 | Finally.cs:186:31:186:46 | [finally: exception, b1 (line 176): true, b2 (line 176): true] object creation of type ExceptionB | true | | Finally.cs:188:38:188:39 | [exception: Exception, b1 (line 176): false, b2 (line 176): true] access to parameter b2 | Finally.cs:189:13:191:13 | [b1 (line 176): false] {...} | true | | Finally.cs:188:38:188:39 | [exception: ExceptionB, b1 (line 176): false, b2 (line 176): true] access to parameter b2 | Finally.cs:189:13:191:13 | [b1 (line 176): false] {...} | true | -| Finally.cs:188:38:188:39 | [finally: exception(Exception), exception: Exception, b1 (line 176): true, b2 (line 176): true] access to parameter b2 | Finally.cs:189:13:191:13 | [finally: exception(Exception), b1 (line 176): true] {...} | true | -| Finally.cs:188:38:188:39 | [finally: exception(Exception), exception: ExceptionB, b1 (line 176): true, b2 (line 176): true] access to parameter b2 | Finally.cs:189:13:191:13 | [finally: exception(Exception), b1 (line 176): true] {...} | true | -| Finally.cs:188:38:188:39 | [finally: exception(ExceptionA), exception: Exception, b1 (line 176): true, b2 (line 176): true] access to parameter b2 | Finally.cs:189:13:191:13 | [finally: exception(ExceptionA), b1 (line 176): true] {...} | true | -| Finally.cs:188:38:188:39 | [finally: exception(ExceptionA), exception: ExceptionB, b1 (line 176): true, b2 (line 176): true] access to parameter b2 | Finally.cs:189:13:191:13 | [finally: exception(ExceptionA), b1 (line 176): true] {...} | true | +| Finally.cs:188:38:188:39 | [finally: exception, exception: Exception, b1 (line 176): true, b2 (line 176): true] access to parameter b2 | Finally.cs:189:13:191:13 | [finally: exception, b1 (line 176): true] {...} | true | +| Finally.cs:188:38:188:39 | [finally: exception, exception: ExceptionB, b1 (line 176): true, b2 (line 176): true] access to parameter b2 | Finally.cs:189:13:191:13 | [finally: exception, b1 (line 176): true] {...} | true | | Finally.cs:190:21:190:22 | [b1 (line 176): false] access to parameter b1 | Finally.cs:176:10:176:11 | exit M9 (normal) | false | -| Finally.cs:190:21:190:22 | [finally: exception(Exception), b1 (line 176): true] access to parameter b1 | Finally.cs:190:31:190:46 | [finally: exception(Exception)] object creation of type ExceptionC | true | -| Finally.cs:190:21:190:22 | [finally: exception(ExceptionA), b1 (line 176): true] access to parameter b1 | Finally.cs:190:31:190:46 | [finally: exception(ExceptionA)] object creation of type ExceptionC | true | +| Finally.cs:190:21:190:22 | [finally: exception, b1 (line 176): true] access to parameter b1 | Finally.cs:190:31:190:46 | [finally: exception] object creation of type ExceptionC | true | | Finally.cs:199:17:199:18 | access to parameter b1 | Finally.cs:199:27:199:42 | object creation of type ExceptionA | true | | Finally.cs:199:17:199:18 | access to parameter b1 | Finally.cs:202:9:212:9 | {...} | false | -| Finally.cs:205:21:205:22 | [finally: exception(Exception)] access to parameter b2 | Finally.cs:205:31:205:46 | [finally: exception(Exception)] object creation of type ExceptionB | true | -| Finally.cs:205:21:205:22 | [finally: exception(Exception)] access to parameter b2 | Finally.cs:208:13:210:13 | [finally: exception(Exception)] {...} | false | -| Finally.cs:205:21:205:22 | [finally: exception(ExceptionA)] access to parameter b2 | Finally.cs:205:31:205:46 | [finally: exception(ExceptionA)] object creation of type ExceptionB | true | -| Finally.cs:205:21:205:22 | [finally: exception(ExceptionA)] access to parameter b2 | Finally.cs:208:13:210:13 | [finally: exception(ExceptionA)] {...} | false | +| Finally.cs:205:21:205:22 | [finally: exception] access to parameter b2 | Finally.cs:205:31:205:46 | [finally: exception] object creation of type ExceptionB | true | +| Finally.cs:205:21:205:22 | [finally: exception] access to parameter b2 | Finally.cs:208:13:210:13 | [finally: exception] {...} | false | | Finally.cs:205:21:205:22 | access to parameter b2 | Finally.cs:205:31:205:46 | object creation of type ExceptionB | true | | Finally.cs:205:21:205:22 | access to parameter b2 | Finally.cs:208:13:210:13 | {...} | false | -| Finally.cs:209:21:209:22 | [finally(1): exception(Exception)] access to parameter b3 | Finally.cs:209:31:209:46 | [finally(1): exception(Exception)] object creation of type ExceptionC | true | -| Finally.cs:209:21:209:22 | [finally(1): exception(ExceptionB)] access to parameter b3 | Finally.cs:209:31:209:46 | [finally(1): exception(ExceptionB)] object creation of type ExceptionC | true | -| Finally.cs:209:21:209:22 | [finally: exception(Exception), finally(1): exception(Exception)] access to parameter b3 | Finally.cs:209:31:209:46 | [finally: exception(Exception), finally(1): exception(Exception)] object creation of type ExceptionC | true | -| Finally.cs:209:21:209:22 | [finally: exception(Exception), finally(1): exception(ExceptionB)] access to parameter b3 | Finally.cs:209:31:209:46 | [finally: exception(Exception), finally(1): exception(ExceptionB)] object creation of type ExceptionC | true | -| Finally.cs:209:21:209:22 | [finally: exception(Exception)] access to parameter b3 | Finally.cs:209:31:209:46 | [finally: exception(Exception)] object creation of type ExceptionC | true | -| Finally.cs:209:21:209:22 | [finally: exception(Exception)] access to parameter b3 | Finally.cs:211:13:211:29 | [finally: exception(Exception)] ...; | false | -| Finally.cs:209:21:209:22 | [finally: exception(ExceptionA), finally(1): exception(Exception)] access to parameter b3 | Finally.cs:209:31:209:46 | [finally: exception(ExceptionA), finally(1): exception(Exception)] object creation of type ExceptionC | true | -| Finally.cs:209:21:209:22 | [finally: exception(ExceptionA), finally(1): exception(ExceptionB)] access to parameter b3 | Finally.cs:209:31:209:46 | [finally: exception(ExceptionA), finally(1): exception(ExceptionB)] object creation of type ExceptionC | true | -| Finally.cs:209:21:209:22 | [finally: exception(ExceptionA)] access to parameter b3 | Finally.cs:209:31:209:46 | [finally: exception(ExceptionA)] object creation of type ExceptionC | true | -| Finally.cs:209:21:209:22 | [finally: exception(ExceptionA)] access to parameter b3 | Finally.cs:211:13:211:29 | [finally: exception(ExceptionA)] ...; | false | +| Finally.cs:209:21:209:22 | [finally(1): exception] access to parameter b3 | Finally.cs:209:31:209:46 | [finally(1): exception] object creation of type ExceptionC | true | +| Finally.cs:209:21:209:22 | [finally: exception, finally(1): exception] access to parameter b3 | Finally.cs:209:31:209:46 | [finally: exception, finally(1): exception] object creation of type ExceptionC | true | +| Finally.cs:209:21:209:22 | [finally: exception] access to parameter b3 | Finally.cs:209:31:209:46 | [finally: exception] object creation of type ExceptionC | true | +| Finally.cs:209:21:209:22 | [finally: exception] access to parameter b3 | Finally.cs:211:13:211:29 | [finally: exception] ...; | false | | Finally.cs:209:21:209:22 | access to parameter b3 | Finally.cs:209:31:209:46 | object creation of type ExceptionC | true | | Finally.cs:209:21:209:22 | access to parameter b3 | Finally.cs:211:13:211:29 | ...; | false | | Finally.cs:239:21:239:22 | access to parameter b1 | Finally.cs:240:27:240:42 | object creation of type ExceptionA | true | | Finally.cs:239:21:239:22 | access to parameter b1 | Finally.cs:243:13:253:13 | {...} | false | -| Finally.cs:246:25:246:26 | [finally: exception(Exception)] access to parameter b2 | Finally.cs:247:31:247:46 | [finally: exception(Exception)] object creation of type ExceptionA | true | -| Finally.cs:246:25:246:26 | [finally: exception(Exception)] access to parameter b2 | Finally.cs:250:17:252:17 | [finally: exception(Exception)] {...} | false | -| Finally.cs:246:25:246:26 | [finally: exception(ExceptionA)] access to parameter b2 | Finally.cs:247:31:247:46 | [finally: exception(ExceptionA)] object creation of type ExceptionA | true | -| Finally.cs:246:25:246:26 | [finally: exception(ExceptionA)] access to parameter b2 | Finally.cs:250:17:252:17 | [finally: exception(ExceptionA)] {...} | false | +| Finally.cs:246:25:246:26 | [finally: exception] access to parameter b2 | Finally.cs:247:31:247:46 | [finally: exception] object creation of type ExceptionA | true | +| Finally.cs:246:25:246:26 | [finally: exception] access to parameter b2 | Finally.cs:250:17:252:17 | [finally: exception] {...} | false | | Finally.cs:246:25:246:26 | access to parameter b2 | Finally.cs:247:31:247:46 | object creation of type ExceptionA | true | | Finally.cs:246:25:246:26 | access to parameter b2 | Finally.cs:250:17:252:17 | {...} | false | | LoopUnrolling.cs:9:13:9:28 | ... == ... | LoopUnrolling.cs:10:13:10:19 | return ...; | true | diff --git a/csharp/ql/test/library-tests/controlflow/graph/Dominance.expected b/csharp/ql/test/library-tests/controlflow/graph/Dominance.expected index f0a0c6459cbb..bc5082c4c18e 100644 --- a/csharp/ql/test/library-tests/controlflow/graph/Dominance.expected +++ b/csharp/ql/test/library-tests/controlflow/graph/Dominance.expected @@ -1067,11 +1067,11 @@ dominance | CompileTimeOperators.cs:29:5:41:5 | {...} | CompileTimeOperators.cs:30:9:38:9 | try {...} ... | | CompileTimeOperators.cs:30:9:38:9 | try {...} ... | CompileTimeOperators.cs:31:9:34:9 | {...} | | CompileTimeOperators.cs:31:9:34:9 | {...} | CompileTimeOperators.cs:32:13:32:21 | goto ...; | -| CompileTimeOperators.cs:32:13:32:21 | goto ...; | CompileTimeOperators.cs:36:9:38:9 | [finally: goto(End)] {...} | -| CompileTimeOperators.cs:36:9:38:9 | [finally: goto(End)] {...} | CompileTimeOperators.cs:37:13:37:41 | [finally: goto(End)] ...; | -| CompileTimeOperators.cs:37:13:37:40 | [finally: goto(End)] call to method WriteLine | CompileTimeOperators.cs:40:9:40:11 | End: | -| CompileTimeOperators.cs:37:13:37:41 | [finally: goto(End)] ...; | CompileTimeOperators.cs:37:31:37:39 | [finally: goto(End)] "Finally" | -| CompileTimeOperators.cs:37:31:37:39 | [finally: goto(End)] "Finally" | CompileTimeOperators.cs:37:13:37:40 | [finally: goto(End)] call to method WriteLine | +| CompileTimeOperators.cs:32:13:32:21 | goto ...; | CompileTimeOperators.cs:36:9:38:9 | [finally: goto] {...} | +| CompileTimeOperators.cs:36:9:38:9 | [finally: goto] {...} | CompileTimeOperators.cs:37:13:37:41 | [finally: goto] ...; | +| CompileTimeOperators.cs:37:13:37:40 | [finally: goto] call to method WriteLine | CompileTimeOperators.cs:40:9:40:11 | End: | +| CompileTimeOperators.cs:37:13:37:41 | [finally: goto] ...; | CompileTimeOperators.cs:37:31:37:39 | [finally: goto] "Finally" | +| CompileTimeOperators.cs:37:31:37:39 | [finally: goto] "Finally" | CompileTimeOperators.cs:37:13:37:40 | [finally: goto] call to method WriteLine | | CompileTimeOperators.cs:40:9:40:11 | End: | CompileTimeOperators.cs:40:14:40:38 | ...; | | CompileTimeOperators.cs:40:14:40:37 | call to method WriteLine | CompileTimeOperators.cs:28:10:28:10 | exit M (normal) | | CompileTimeOperators.cs:40:14:40:38 | ...; | CompileTimeOperators.cs:40:32:40:36 | "End" | @@ -1741,18 +1741,18 @@ dominance | Finally.cs:8:5:17:5 | {...} | Finally.cs:9:9:16:9 | try {...} ... | | Finally.cs:9:9:16:9 | try {...} ... | Finally.cs:10:9:12:9 | {...} | | Finally.cs:10:9:12:9 | {...} | Finally.cs:11:13:11:38 | ...; | -| Finally.cs:11:13:11:37 | call to method WriteLine | Finally.cs:14:9:16:9 | [finally: exception(Exception)] {...} | +| Finally.cs:11:13:11:37 | call to method WriteLine | Finally.cs:14:9:16:9 | [finally: exception] {...} | | Finally.cs:11:13:11:37 | call to method WriteLine | Finally.cs:14:9:16:9 | {...} | | Finally.cs:11:13:11:38 | ...; | Finally.cs:11:31:11:36 | "Try1" | | Finally.cs:11:31:11:36 | "Try1" | Finally.cs:11:13:11:37 | call to method WriteLine | -| Finally.cs:14:9:16:9 | [finally: exception(Exception)] {...} | Finally.cs:15:13:15:41 | [finally: exception(Exception)] ...; | +| Finally.cs:14:9:16:9 | [finally: exception] {...} | Finally.cs:15:13:15:41 | [finally: exception] ...; | | Finally.cs:14:9:16:9 | {...} | Finally.cs:15:13:15:41 | ...; | -| Finally.cs:15:13:15:40 | [finally: exception(Exception)] call to method WriteLine | Finally.cs:7:10:7:11 | exit M1 (abnormal) | +| Finally.cs:15:13:15:40 | [finally: exception] call to method WriteLine | Finally.cs:7:10:7:11 | exit M1 (abnormal) | | Finally.cs:15:13:15:40 | call to method WriteLine | Finally.cs:7:10:7:11 | exit M1 (normal) | | Finally.cs:15:13:15:41 | ...; | Finally.cs:15:31:15:39 | "Finally" | -| Finally.cs:15:13:15:41 | [finally: exception(Exception)] ...; | Finally.cs:15:31:15:39 | [finally: exception(Exception)] "Finally" | +| Finally.cs:15:13:15:41 | [finally: exception] ...; | Finally.cs:15:31:15:39 | [finally: exception] "Finally" | | Finally.cs:15:31:15:39 | "Finally" | Finally.cs:15:13:15:40 | call to method WriteLine | -| Finally.cs:15:31:15:39 | [finally: exception(Exception)] "Finally" | Finally.cs:15:13:15:40 | [finally: exception(Exception)] call to method WriteLine | +| Finally.cs:15:31:15:39 | [finally: exception] "Finally" | Finally.cs:15:13:15:40 | [finally: exception] call to method WriteLine | | Finally.cs:19:10:19:11 | enter M2 | Finally.cs:20:5:52:5 | {...} | | Finally.cs:20:5:52:5 | {...} | Finally.cs:21:9:51:9 | try {...} ... | | Finally.cs:21:9:51:9 | try {...} ... | Finally.cs:22:9:25:9 | {...} | @@ -1767,7 +1767,6 @@ dominance | Finally.cs:26:38:26:39 | [exception: Exception] IOException ex | Finally.cs:26:48:26:51 | [exception: Exception] true | | Finally.cs:26:48:26:51 | [exception: Exception] true | Finally.cs:27:9:29:9 | {...} | | Finally.cs:27:9:29:9 | {...} | Finally.cs:28:13:28:18 | throw ...; | -| Finally.cs:28:13:28:18 | throw ...; | Finally.cs:49:9:51:9 | [finally: exception(IOException)] {...} | | Finally.cs:30:9:40:9 | [exception: Exception] catch (...) {...} | Finally.cs:30:41:30:42 | [exception: Exception] ArgumentException ex | | Finally.cs:30:9:40:9 | [exception: Exception] catch (...) {...} | Finally.cs:41:9:43:9 | [exception: Exception] catch (...) {...} | | Finally.cs:30:41:30:42 | [exception: Exception] ArgumentException ex | Finally.cs:31:9:40:9 | {...} | @@ -1776,24 +1775,21 @@ dominance | Finally.cs:33:13:35:13 | {...} | Finally.cs:34:17:34:32 | if (...) ... | | Finally.cs:34:17:34:32 | if (...) ... | Finally.cs:34:21:34:24 | true | | Finally.cs:34:21:34:24 | true | Finally.cs:34:27:34:32 | throw ...; | -| Finally.cs:34:27:34:32 | throw ...; | Finally.cs:37:13:39:13 | [finally: exception(ArgumentException)] {...} | -| Finally.cs:37:13:39:13 | [finally: exception(ArgumentException)] {...} | Finally.cs:38:37:38:42 | [finally: exception(ArgumentException)] "Boo!" | -| Finally.cs:38:17:38:44 | [finally: exception(ArgumentException)] throw ...; | Finally.cs:49:9:51:9 | [finally: exception(Exception)] {...} | -| Finally.cs:38:23:38:43 | [finally: exception(ArgumentException)] object creation of type Exception | Finally.cs:38:17:38:44 | [finally: exception(ArgumentException)] throw ...; | -| Finally.cs:38:37:38:42 | [finally: exception(ArgumentException)] "Boo!" | Finally.cs:38:23:38:43 | [finally: exception(ArgumentException)] object creation of type Exception | +| Finally.cs:34:27:34:32 | throw ...; | Finally.cs:37:13:39:13 | [finally: exception] {...} | +| Finally.cs:37:13:39:13 | [finally: exception] {...} | Finally.cs:38:37:38:42 | [finally: exception] "Boo!" | +| Finally.cs:38:23:38:43 | [finally: exception] object creation of type Exception | Finally.cs:38:17:38:44 | [finally: exception] throw ...; | +| Finally.cs:38:37:38:42 | [finally: exception] "Boo!" | Finally.cs:38:23:38:43 | [finally: exception] object creation of type Exception | | Finally.cs:41:9:43:9 | [exception: Exception] catch (...) {...} | Finally.cs:42:9:43:9 | {...} | | Finally.cs:42:9:43:9 | {...} | Finally.cs:49:9:51:9 | {...} | -| Finally.cs:49:9:51:9 | [finally: exception(Exception)] {...} | Finally.cs:50:13:50:41 | [finally: exception(Exception)] ...; | -| Finally.cs:49:9:51:9 | [finally: exception(IOException)] {...} | Finally.cs:50:13:50:41 | [finally: exception(IOException)] ...; | +| Finally.cs:49:9:51:9 | [finally: exception] {...} | Finally.cs:50:13:50:41 | [finally: exception] ...; | | Finally.cs:49:9:51:9 | [finally: return] {...} | Finally.cs:50:13:50:41 | [finally: return] ...; | | Finally.cs:49:9:51:9 | {...} | Finally.cs:50:13:50:41 | ...; | +| Finally.cs:50:13:50:40 | [finally: exception] call to method WriteLine | Finally.cs:19:10:19:11 | exit M2 (abnormal) | | Finally.cs:50:13:50:41 | ...; | Finally.cs:50:31:50:39 | "Finally" | -| Finally.cs:50:13:50:41 | [finally: exception(Exception)] ...; | Finally.cs:50:31:50:39 | [finally: exception(Exception)] "Finally" | -| Finally.cs:50:13:50:41 | [finally: exception(IOException)] ...; | Finally.cs:50:31:50:39 | [finally: exception(IOException)] "Finally" | +| Finally.cs:50:13:50:41 | [finally: exception] ...; | Finally.cs:50:31:50:39 | [finally: exception] "Finally" | | Finally.cs:50:13:50:41 | [finally: return] ...; | Finally.cs:50:31:50:39 | [finally: return] "Finally" | | Finally.cs:50:31:50:39 | "Finally" | Finally.cs:50:13:50:40 | call to method WriteLine | -| Finally.cs:50:31:50:39 | [finally: exception(Exception)] "Finally" | Finally.cs:50:13:50:40 | [finally: exception(Exception)] call to method WriteLine | -| Finally.cs:50:31:50:39 | [finally: exception(IOException)] "Finally" | Finally.cs:50:13:50:40 | [finally: exception(IOException)] call to method WriteLine | +| Finally.cs:50:31:50:39 | [finally: exception] "Finally" | Finally.cs:50:13:50:40 | [finally: exception] call to method WriteLine | | Finally.cs:50:31:50:39 | [finally: return] "Finally" | Finally.cs:50:13:50:40 | [finally: return] call to method WriteLine | | Finally.cs:54:10:54:11 | enter M3 | Finally.cs:55:5:72:5 | {...} | | Finally.cs:55:5:72:5 | {...} | Finally.cs:56:9:71:9 | try {...} ... | @@ -1809,26 +1805,22 @@ dominance | Finally.cs:61:38:61:39 | [exception: Exception] IOException ex | Finally.cs:61:48:61:51 | [exception: Exception] true | | Finally.cs:61:48:61:51 | [exception: Exception] true | Finally.cs:62:9:64:9 | {...} | | Finally.cs:62:9:64:9 | {...} | Finally.cs:63:13:63:18 | throw ...; | -| Finally.cs:63:13:63:18 | throw ...; | Finally.cs:69:9:71:9 | [finally: exception(IOException)] {...} | | Finally.cs:65:9:67:9 | [exception: Exception] catch (...) {...} | Finally.cs:65:26:65:26 | [exception: Exception] Exception e | | Finally.cs:65:26:65:26 | [exception: Exception] Exception e | Finally.cs:65:35:65:35 | [exception: Exception] access to local variable e | | Finally.cs:65:35:65:35 | [exception: Exception] access to local variable e | Finally.cs:65:35:65:43 | [exception: Exception] access to property Message | | Finally.cs:65:35:65:43 | [exception: Exception] access to property Message | Finally.cs:65:48:65:51 | [exception: Exception] null | | Finally.cs:65:35:65:51 | [exception: Exception] ... != ... | Finally.cs:66:9:67:9 | {...} | -| Finally.cs:65:35:65:51 | [exception: Exception] ... != ... | Finally.cs:69:9:71:9 | [finally: exception(Exception)] {...} | | Finally.cs:65:48:65:51 | [exception: Exception] null | Finally.cs:65:35:65:51 | [exception: Exception] ... != ... | | Finally.cs:66:9:67:9 | {...} | Finally.cs:69:9:71:9 | {...} | -| Finally.cs:69:9:71:9 | [finally: exception(Exception)] {...} | Finally.cs:70:13:70:41 | [finally: exception(Exception)] ...; | -| Finally.cs:69:9:71:9 | [finally: exception(IOException)] {...} | Finally.cs:70:13:70:41 | [finally: exception(IOException)] ...; | +| Finally.cs:69:9:71:9 | [finally: exception] {...} | Finally.cs:70:13:70:41 | [finally: exception] ...; | | Finally.cs:69:9:71:9 | [finally: return] {...} | Finally.cs:70:13:70:41 | [finally: return] ...; | | Finally.cs:69:9:71:9 | {...} | Finally.cs:70:13:70:41 | ...; | +| Finally.cs:70:13:70:40 | [finally: exception] call to method WriteLine | Finally.cs:54:10:54:11 | exit M3 (abnormal) | | Finally.cs:70:13:70:41 | ...; | Finally.cs:70:31:70:39 | "Finally" | -| Finally.cs:70:13:70:41 | [finally: exception(Exception)] ...; | Finally.cs:70:31:70:39 | [finally: exception(Exception)] "Finally" | -| Finally.cs:70:13:70:41 | [finally: exception(IOException)] ...; | Finally.cs:70:31:70:39 | [finally: exception(IOException)] "Finally" | +| Finally.cs:70:13:70:41 | [finally: exception] ...; | Finally.cs:70:31:70:39 | [finally: exception] "Finally" | | Finally.cs:70:13:70:41 | [finally: return] ...; | Finally.cs:70:31:70:39 | [finally: return] "Finally" | | Finally.cs:70:31:70:39 | "Finally" | Finally.cs:70:13:70:40 | call to method WriteLine | -| Finally.cs:70:31:70:39 | [finally: exception(Exception)] "Finally" | Finally.cs:70:13:70:40 | [finally: exception(Exception)] call to method WriteLine | -| Finally.cs:70:31:70:39 | [finally: exception(IOException)] "Finally" | Finally.cs:70:13:70:40 | [finally: exception(IOException)] call to method WriteLine | +| Finally.cs:70:31:70:39 | [finally: exception] "Finally" | Finally.cs:70:13:70:40 | [finally: exception] call to method WriteLine | | Finally.cs:70:31:70:39 | [finally: return] "Finally" | Finally.cs:70:13:70:40 | [finally: return] call to method WriteLine | | Finally.cs:74:10:74:11 | enter M4 | Finally.cs:75:5:101:5 | {...} | | Finally.cs:75:5:101:5 | {...} | Finally.cs:76:9:76:19 | ... ...; | @@ -1894,36 +1886,36 @@ dominance | Finally.cs:92:30:92:30 | [finally: continue] 3 | Finally.cs:92:25:92:30 | [finally: continue] ... == ... | | Finally.cs:92:30:92:30 | [finally: return] 3 | Finally.cs:92:25:92:30 | [finally: return] ... == ... | | Finally.cs:93:31:93:45 | [finally: break] object creation of type Exception | Finally.cs:93:25:93:46 | [finally: break] throw ...; | -| Finally.cs:93:31:93:45 | [finally: break] object creation of type Exception | Finally.cs:96:17:98:17 | [finally: break, finally(1): exception(Exception)] {...} | +| Finally.cs:93:31:93:45 | [finally: break] object creation of type Exception | Finally.cs:96:17:98:17 | [finally: break, finally(1): exception] {...} | | Finally.cs:93:31:93:45 | [finally: continue] object creation of type Exception | Finally.cs:93:25:93:46 | [finally: continue] throw ...; | -| Finally.cs:93:31:93:45 | [finally: continue] object creation of type Exception | Finally.cs:96:17:98:17 | [finally: continue, finally(1): exception(Exception)] {...} | +| Finally.cs:93:31:93:45 | [finally: continue] object creation of type Exception | Finally.cs:96:17:98:17 | [finally: continue, finally(1): exception] {...} | | Finally.cs:93:31:93:45 | [finally: return] object creation of type Exception | Finally.cs:93:25:93:46 | [finally: return] throw ...; | -| Finally.cs:93:31:93:45 | [finally: return] object creation of type Exception | Finally.cs:96:17:98:17 | [finally: return, finally(1): exception(Exception)] {...} | +| Finally.cs:93:31:93:45 | [finally: return] object creation of type Exception | Finally.cs:96:17:98:17 | [finally: return, finally(1): exception] {...} | | Finally.cs:93:31:93:45 | object creation of type Exception | Finally.cs:93:25:93:46 | throw ...; | -| Finally.cs:93:31:93:45 | object creation of type Exception | Finally.cs:96:17:98:17 | [finally(1): exception(Exception)] {...} | -| Finally.cs:96:17:98:17 | [finally(1): exception(Exception)] {...} | Finally.cs:97:21:97:24 | [finally(1): exception(Exception)] ...; | -| Finally.cs:96:17:98:17 | [finally: break, finally(1): exception(Exception)] {...} | Finally.cs:97:21:97:24 | [finally: break, finally(1): exception(Exception)] ...; | +| Finally.cs:93:31:93:45 | object creation of type Exception | Finally.cs:96:17:98:17 | [finally(1): exception] {...} | +| Finally.cs:96:17:98:17 | [finally(1): exception] {...} | Finally.cs:97:21:97:24 | [finally(1): exception] ...; | +| Finally.cs:96:17:98:17 | [finally: break, finally(1): exception] {...} | Finally.cs:97:21:97:24 | [finally: break, finally(1): exception] ...; | | Finally.cs:96:17:98:17 | [finally: break] {...} | Finally.cs:97:21:97:24 | [finally: break] ...; | -| Finally.cs:96:17:98:17 | [finally: continue, finally(1): exception(Exception)] {...} | Finally.cs:97:21:97:24 | [finally: continue, finally(1): exception(Exception)] ...; | +| Finally.cs:96:17:98:17 | [finally: continue, finally(1): exception] {...} | Finally.cs:97:21:97:24 | [finally: continue, finally(1): exception] ...; | | Finally.cs:96:17:98:17 | [finally: continue] {...} | Finally.cs:97:21:97:24 | [finally: continue] ...; | -| Finally.cs:96:17:98:17 | [finally: return, finally(1): exception(Exception)] {...} | Finally.cs:97:21:97:24 | [finally: return, finally(1): exception(Exception)] ...; | +| Finally.cs:96:17:98:17 | [finally: return, finally(1): exception] {...} | Finally.cs:97:21:97:24 | [finally: return, finally(1): exception] ...; | | Finally.cs:96:17:98:17 | [finally: return] {...} | Finally.cs:97:21:97:24 | [finally: return] ...; | | Finally.cs:96:17:98:17 | {...} | Finally.cs:97:21:97:24 | ...; | -| Finally.cs:97:21:97:21 | [finally(1): exception(Exception)] access to local variable i | Finally.cs:97:21:97:23 | [finally(1): exception(Exception)] ...-- | -| Finally.cs:97:21:97:21 | [finally: break, finally(1): exception(Exception)] access to local variable i | Finally.cs:97:21:97:23 | [finally: break, finally(1): exception(Exception)] ...-- | +| Finally.cs:97:21:97:21 | [finally(1): exception] access to local variable i | Finally.cs:97:21:97:23 | [finally(1): exception] ...-- | +| Finally.cs:97:21:97:21 | [finally: break, finally(1): exception] access to local variable i | Finally.cs:97:21:97:23 | [finally: break, finally(1): exception] ...-- | | Finally.cs:97:21:97:21 | [finally: break] access to local variable i | Finally.cs:97:21:97:23 | [finally: break] ...-- | -| Finally.cs:97:21:97:21 | [finally: continue, finally(1): exception(Exception)] access to local variable i | Finally.cs:97:21:97:23 | [finally: continue, finally(1): exception(Exception)] ...-- | +| Finally.cs:97:21:97:21 | [finally: continue, finally(1): exception] access to local variable i | Finally.cs:97:21:97:23 | [finally: continue, finally(1): exception] ...-- | | Finally.cs:97:21:97:21 | [finally: continue] access to local variable i | Finally.cs:97:21:97:23 | [finally: continue] ...-- | -| Finally.cs:97:21:97:21 | [finally: return, finally(1): exception(Exception)] access to local variable i | Finally.cs:97:21:97:23 | [finally: return, finally(1): exception(Exception)] ...-- | +| Finally.cs:97:21:97:21 | [finally: return, finally(1): exception] access to local variable i | Finally.cs:97:21:97:23 | [finally: return, finally(1): exception] ...-- | | Finally.cs:97:21:97:21 | [finally: return] access to local variable i | Finally.cs:97:21:97:23 | [finally: return] ...-- | | Finally.cs:97:21:97:21 | access to local variable i | Finally.cs:97:21:97:23 | ...-- | | Finally.cs:97:21:97:24 | ...; | Finally.cs:97:21:97:21 | access to local variable i | -| Finally.cs:97:21:97:24 | [finally(1): exception(Exception)] ...; | Finally.cs:97:21:97:21 | [finally(1): exception(Exception)] access to local variable i | -| Finally.cs:97:21:97:24 | [finally: break, finally(1): exception(Exception)] ...; | Finally.cs:97:21:97:21 | [finally: break, finally(1): exception(Exception)] access to local variable i | +| Finally.cs:97:21:97:24 | [finally(1): exception] ...; | Finally.cs:97:21:97:21 | [finally(1): exception] access to local variable i | +| Finally.cs:97:21:97:24 | [finally: break, finally(1): exception] ...; | Finally.cs:97:21:97:21 | [finally: break, finally(1): exception] access to local variable i | | Finally.cs:97:21:97:24 | [finally: break] ...; | Finally.cs:97:21:97:21 | [finally: break] access to local variable i | -| Finally.cs:97:21:97:24 | [finally: continue, finally(1): exception(Exception)] ...; | Finally.cs:97:21:97:21 | [finally: continue, finally(1): exception(Exception)] access to local variable i | +| Finally.cs:97:21:97:24 | [finally: continue, finally(1): exception] ...; | Finally.cs:97:21:97:21 | [finally: continue, finally(1): exception] access to local variable i | | Finally.cs:97:21:97:24 | [finally: continue] ...; | Finally.cs:97:21:97:21 | [finally: continue] access to local variable i | -| Finally.cs:97:21:97:24 | [finally: return, finally(1): exception(Exception)] ...; | Finally.cs:97:21:97:21 | [finally: return, finally(1): exception(Exception)] access to local variable i | +| Finally.cs:97:21:97:24 | [finally: return, finally(1): exception] ...; | Finally.cs:97:21:97:21 | [finally: return, finally(1): exception] access to local variable i | | Finally.cs:97:21:97:24 | [finally: return] ...; | Finally.cs:97:21:97:21 | [finally: return] access to local variable i | | Finally.cs:103:10:103:11 | enter M5 | Finally.cs:104:5:119:5 | {...} | | Finally.cs:104:5:119:5 | {...} | Finally.cs:105:9:118:9 | try {...} ... | @@ -1931,10 +1923,9 @@ dominance | Finally.cs:106:9:111:9 | {...} | Finally.cs:107:13:108:23 | if (...) ... | | Finally.cs:107:13:108:23 | if (...) ... | Finally.cs:107:17:107:21 | this access | | Finally.cs:107:17:107:21 | access to field Field | Finally.cs:107:17:107:28 | access to property Length | -| Finally.cs:107:17:107:21 | access to field Field | Finally.cs:113:9:118:9 | [finally: exception(NullReferenceException)] {...} | +| Finally.cs:107:17:107:21 | access to field Field | Finally.cs:113:9:118:9 | [finally: exception] {...} | | Finally.cs:107:17:107:21 | this access | Finally.cs:107:17:107:21 | access to field Field | | Finally.cs:107:17:107:28 | access to property Length | Finally.cs:107:33:107:33 | 0 | -| Finally.cs:107:17:107:28 | access to property Length | Finally.cs:113:9:118:9 | [finally: exception(Exception)] {...} | | Finally.cs:107:17:107:33 | ... == ... | Finally.cs:108:17:108:23 | return ...; | | Finally.cs:107:17:107:33 | ... == ... | Finally.cs:109:13:110:49 | if (...) ... | | Finally.cs:107:33:107:33 | 0 | Finally.cs:107:17:107:33 | ... == ... | @@ -1946,107 +1937,67 @@ dominance | Finally.cs:109:17:109:33 | ... == ... | Finally.cs:110:23:110:48 | object creation of type OutOfMemoryException | | Finally.cs:109:17:109:33 | ... == ... | Finally.cs:113:9:118:9 | {...} | | Finally.cs:109:33:109:33 | 1 | Finally.cs:109:17:109:33 | ... == ... | -| Finally.cs:110:17:110:49 | throw ...; | Finally.cs:113:9:118:9 | [finally: exception(OutOfMemoryException)] {...} | | Finally.cs:110:23:110:48 | object creation of type OutOfMemoryException | Finally.cs:110:17:110:49 | throw ...; | -| Finally.cs:113:9:118:9 | [finally: exception(Exception)] {...} | Finally.cs:114:13:115:41 | [finally: exception(Exception)] if (...) ... | -| Finally.cs:113:9:118:9 | [finally: exception(NullReferenceException)] {...} | Finally.cs:114:13:115:41 | [finally: exception(NullReferenceException)] if (...) ... | -| Finally.cs:113:9:118:9 | [finally: exception(OutOfMemoryException)] {...} | Finally.cs:114:13:115:41 | [finally: exception(OutOfMemoryException)] if (...) ... | +| Finally.cs:113:9:118:9 | [finally: exception] {...} | Finally.cs:114:13:115:41 | [finally: exception] if (...) ... | | Finally.cs:113:9:118:9 | [finally: return] {...} | Finally.cs:114:13:115:41 | [finally: return] if (...) ... | | Finally.cs:113:9:118:9 | {...} | Finally.cs:114:13:115:41 | if (...) ... | -| Finally.cs:114:13:115:41 | [finally: exception(Exception)] if (...) ... | Finally.cs:114:19:114:23 | [finally: exception(Exception)] this access | -| Finally.cs:114:13:115:41 | [finally: exception(NullReferenceException)] if (...) ... | Finally.cs:114:19:114:23 | [finally: exception(NullReferenceException)] this access | -| Finally.cs:114:13:115:41 | [finally: exception(OutOfMemoryException)] if (...) ... | Finally.cs:114:19:114:23 | [finally: exception(OutOfMemoryException)] this access | +| Finally.cs:114:13:115:41 | [finally: exception] if (...) ... | Finally.cs:114:19:114:23 | [finally: exception] this access | | Finally.cs:114:13:115:41 | [finally: return] if (...) ... | Finally.cs:114:19:114:23 | [finally: return] this access | | Finally.cs:114:13:115:41 | if (...) ... | Finally.cs:114:19:114:23 | this access | -| Finally.cs:114:17:114:36 | [true, finally: exception(Exception)] !... | Finally.cs:115:17:115:41 | [finally: exception(Exception)] ...; | -| Finally.cs:114:17:114:36 | [true, finally: exception(NullReferenceException)] !... | Finally.cs:115:17:115:41 | [finally: exception(NullReferenceException)] ...; | -| Finally.cs:114:17:114:36 | [true, finally: exception(OutOfMemoryException)] !... | Finally.cs:115:17:115:41 | [finally: exception(OutOfMemoryException)] ...; | +| Finally.cs:114:17:114:36 | [true, finally: exception] !... | Finally.cs:115:17:115:41 | [finally: exception] ...; | | Finally.cs:114:17:114:36 | [true, finally: return] !... | Finally.cs:115:17:115:41 | [finally: return] ...; | | Finally.cs:114:17:114:36 | [true] !... | Finally.cs:115:17:115:41 | ...; | -| Finally.cs:114:19:114:23 | [finally: exception(Exception)] access to field Field | Finally.cs:114:19:114:30 | [finally: exception(Exception)] access to property Length | -| Finally.cs:114:19:114:23 | [finally: exception(Exception)] this access | Finally.cs:114:19:114:23 | [finally: exception(Exception)] access to field Field | -| Finally.cs:114:19:114:23 | [finally: exception(NullReferenceException)] access to field Field | Finally.cs:114:19:114:30 | [finally: exception(NullReferenceException)] access to property Length | -| Finally.cs:114:19:114:23 | [finally: exception(NullReferenceException)] this access | Finally.cs:114:19:114:23 | [finally: exception(NullReferenceException)] access to field Field | -| Finally.cs:114:19:114:23 | [finally: exception(OutOfMemoryException)] access to field Field | Finally.cs:114:19:114:30 | [finally: exception(OutOfMemoryException)] access to property Length | -| Finally.cs:114:19:114:23 | [finally: exception(OutOfMemoryException)] this access | Finally.cs:114:19:114:23 | [finally: exception(OutOfMemoryException)] access to field Field | +| Finally.cs:114:19:114:23 | [finally: exception] access to field Field | Finally.cs:114:19:114:30 | [finally: exception] access to property Length | +| Finally.cs:114:19:114:23 | [finally: exception] this access | Finally.cs:114:19:114:23 | [finally: exception] access to field Field | | Finally.cs:114:19:114:23 | [finally: return] access to field Field | Finally.cs:114:19:114:30 | [finally: return] access to property Length | | Finally.cs:114:19:114:23 | [finally: return] this access | Finally.cs:114:19:114:23 | [finally: return] access to field Field | | Finally.cs:114:19:114:23 | access to field Field | Finally.cs:114:19:114:30 | access to property Length | | Finally.cs:114:19:114:23 | this access | Finally.cs:114:19:114:23 | access to field Field | -| Finally.cs:114:19:114:30 | [finally: exception(Exception)] access to property Length | Finally.cs:114:35:114:35 | [finally: exception(Exception)] 0 | -| Finally.cs:114:19:114:30 | [finally: exception(NullReferenceException)] access to property Length | Finally.cs:114:35:114:35 | [finally: exception(NullReferenceException)] 0 | -| Finally.cs:114:19:114:30 | [finally: exception(OutOfMemoryException)] access to property Length | Finally.cs:114:35:114:35 | [finally: exception(OutOfMemoryException)] 0 | +| Finally.cs:114:19:114:30 | [finally: exception] access to property Length | Finally.cs:114:35:114:35 | [finally: exception] 0 | | Finally.cs:114:19:114:30 | [finally: return] access to property Length | Finally.cs:114:35:114:35 | [finally: return] 0 | | Finally.cs:114:19:114:30 | access to property Length | Finally.cs:114:35:114:35 | 0 | | Finally.cs:114:19:114:35 | ... == ... | Finally.cs:114:17:114:36 | [false] !... | | Finally.cs:114:19:114:35 | ... == ... | Finally.cs:114:17:114:36 | [true] !... | -| Finally.cs:114:19:114:35 | [finally: exception(Exception)] ... == ... | Finally.cs:114:17:114:36 | [false, finally: exception(Exception)] !... | -| Finally.cs:114:19:114:35 | [finally: exception(Exception)] ... == ... | Finally.cs:114:17:114:36 | [true, finally: exception(Exception)] !... | -| Finally.cs:114:19:114:35 | [finally: exception(NullReferenceException)] ... == ... | Finally.cs:114:17:114:36 | [false, finally: exception(NullReferenceException)] !... | -| Finally.cs:114:19:114:35 | [finally: exception(NullReferenceException)] ... == ... | Finally.cs:114:17:114:36 | [true, finally: exception(NullReferenceException)] !... | -| Finally.cs:114:19:114:35 | [finally: exception(OutOfMemoryException)] ... == ... | Finally.cs:114:17:114:36 | [false, finally: exception(OutOfMemoryException)] !... | -| Finally.cs:114:19:114:35 | [finally: exception(OutOfMemoryException)] ... == ... | Finally.cs:114:17:114:36 | [true, finally: exception(OutOfMemoryException)] !... | +| Finally.cs:114:19:114:35 | [finally: exception] ... == ... | Finally.cs:114:17:114:36 | [false, finally: exception] !... | +| Finally.cs:114:19:114:35 | [finally: exception] ... == ... | Finally.cs:114:17:114:36 | [true, finally: exception] !... | | Finally.cs:114:19:114:35 | [finally: return] ... == ... | Finally.cs:114:17:114:36 | [false, finally: return] !... | | Finally.cs:114:19:114:35 | [finally: return] ... == ... | Finally.cs:114:17:114:36 | [true, finally: return] !... | | Finally.cs:114:35:114:35 | 0 | Finally.cs:114:19:114:35 | ... == ... | -| Finally.cs:114:35:114:35 | [finally: exception(Exception)] 0 | Finally.cs:114:19:114:35 | [finally: exception(Exception)] ... == ... | -| Finally.cs:114:35:114:35 | [finally: exception(NullReferenceException)] 0 | Finally.cs:114:19:114:35 | [finally: exception(NullReferenceException)] ... == ... | -| Finally.cs:114:35:114:35 | [finally: exception(OutOfMemoryException)] 0 | Finally.cs:114:19:114:35 | [finally: exception(OutOfMemoryException)] ... == ... | +| Finally.cs:114:35:114:35 | [finally: exception] 0 | Finally.cs:114:19:114:35 | [finally: exception] ... == ... | | Finally.cs:114:35:114:35 | [finally: return] 0 | Finally.cs:114:19:114:35 | [finally: return] ... == ... | | Finally.cs:115:17:115:41 | ...; | Finally.cs:115:35:115:39 | this access | -| Finally.cs:115:17:115:41 | [finally: exception(Exception)] ...; | Finally.cs:115:35:115:39 | [finally: exception(Exception)] this access | -| Finally.cs:115:17:115:41 | [finally: exception(NullReferenceException)] ...; | Finally.cs:115:35:115:39 | [finally: exception(NullReferenceException)] this access | -| Finally.cs:115:17:115:41 | [finally: exception(OutOfMemoryException)] ...; | Finally.cs:115:35:115:39 | [finally: exception(OutOfMemoryException)] this access | +| Finally.cs:115:17:115:41 | [finally: exception] ...; | Finally.cs:115:35:115:39 | [finally: exception] this access | | Finally.cs:115:17:115:41 | [finally: return] ...; | Finally.cs:115:35:115:39 | [finally: return] this access | -| Finally.cs:115:35:115:39 | [finally: exception(Exception)] access to field Field | Finally.cs:115:17:115:40 | [finally: exception(Exception)] call to method WriteLine | -| Finally.cs:115:35:115:39 | [finally: exception(Exception)] this access | Finally.cs:115:35:115:39 | [finally: exception(Exception)] access to field Field | -| Finally.cs:115:35:115:39 | [finally: exception(NullReferenceException)] access to field Field | Finally.cs:115:17:115:40 | [finally: exception(NullReferenceException)] call to method WriteLine | -| Finally.cs:115:35:115:39 | [finally: exception(NullReferenceException)] this access | Finally.cs:115:35:115:39 | [finally: exception(NullReferenceException)] access to field Field | -| Finally.cs:115:35:115:39 | [finally: exception(OutOfMemoryException)] access to field Field | Finally.cs:115:17:115:40 | [finally: exception(OutOfMemoryException)] call to method WriteLine | -| Finally.cs:115:35:115:39 | [finally: exception(OutOfMemoryException)] this access | Finally.cs:115:35:115:39 | [finally: exception(OutOfMemoryException)] access to field Field | +| Finally.cs:115:35:115:39 | [finally: exception] access to field Field | Finally.cs:115:17:115:40 | [finally: exception] call to method WriteLine | +| Finally.cs:115:35:115:39 | [finally: exception] this access | Finally.cs:115:35:115:39 | [finally: exception] access to field Field | | Finally.cs:115:35:115:39 | [finally: return] access to field Field | Finally.cs:115:17:115:40 | [finally: return] call to method WriteLine | | Finally.cs:115:35:115:39 | [finally: return] this access | Finally.cs:115:35:115:39 | [finally: return] access to field Field | | Finally.cs:115:35:115:39 | access to field Field | Finally.cs:115:17:115:40 | call to method WriteLine | | Finally.cs:115:35:115:39 | this access | Finally.cs:115:35:115:39 | access to field Field | -| Finally.cs:116:13:117:37 | [finally: exception(Exception)] if (...) ... | Finally.cs:116:17:116:21 | [finally: exception(Exception)] this access | -| Finally.cs:116:13:117:37 | [finally: exception(NullReferenceException)] if (...) ... | Finally.cs:116:17:116:21 | [finally: exception(NullReferenceException)] this access | -| Finally.cs:116:13:117:37 | [finally: exception(OutOfMemoryException)] if (...) ... | Finally.cs:116:17:116:21 | [finally: exception(OutOfMemoryException)] this access | +| Finally.cs:116:13:117:37 | [finally: exception] if (...) ... | Finally.cs:116:17:116:21 | [finally: exception] this access | | Finally.cs:116:13:117:37 | [finally: return] if (...) ... | Finally.cs:116:17:116:21 | [finally: return] this access | | Finally.cs:116:13:117:37 | if (...) ... | Finally.cs:116:17:116:21 | this access | -| Finally.cs:116:17:116:21 | [finally: exception(Exception)] access to field Field | Finally.cs:116:17:116:28 | [finally: exception(Exception)] access to property Length | -| Finally.cs:116:17:116:21 | [finally: exception(Exception)] this access | Finally.cs:116:17:116:21 | [finally: exception(Exception)] access to field Field | -| Finally.cs:116:17:116:21 | [finally: exception(NullReferenceException)] access to field Field | Finally.cs:116:17:116:28 | [finally: exception(NullReferenceException)] access to property Length | -| Finally.cs:116:17:116:21 | [finally: exception(NullReferenceException)] this access | Finally.cs:116:17:116:21 | [finally: exception(NullReferenceException)] access to field Field | -| Finally.cs:116:17:116:21 | [finally: exception(OutOfMemoryException)] access to field Field | Finally.cs:116:17:116:28 | [finally: exception(OutOfMemoryException)] access to property Length | -| Finally.cs:116:17:116:21 | [finally: exception(OutOfMemoryException)] this access | Finally.cs:116:17:116:21 | [finally: exception(OutOfMemoryException)] access to field Field | +| Finally.cs:116:17:116:21 | [finally: exception] access to field Field | Finally.cs:116:17:116:28 | [finally: exception] access to property Length | +| Finally.cs:116:17:116:21 | [finally: exception] this access | Finally.cs:116:17:116:21 | [finally: exception] access to field Field | | Finally.cs:116:17:116:21 | [finally: return] access to field Field | Finally.cs:116:17:116:28 | [finally: return] access to property Length | | Finally.cs:116:17:116:21 | [finally: return] this access | Finally.cs:116:17:116:21 | [finally: return] access to field Field | | Finally.cs:116:17:116:21 | access to field Field | Finally.cs:116:17:116:28 | access to property Length | | Finally.cs:116:17:116:21 | this access | Finally.cs:116:17:116:21 | access to field Field | -| Finally.cs:116:17:116:28 | [finally: exception(Exception)] access to property Length | Finally.cs:116:32:116:32 | [finally: exception(Exception)] 0 | -| Finally.cs:116:17:116:28 | [finally: exception(NullReferenceException)] access to property Length | Finally.cs:116:32:116:32 | [finally: exception(NullReferenceException)] 0 | -| Finally.cs:116:17:116:28 | [finally: exception(OutOfMemoryException)] access to property Length | Finally.cs:116:32:116:32 | [finally: exception(OutOfMemoryException)] 0 | +| Finally.cs:116:17:116:28 | [finally: exception] access to property Length | Finally.cs:116:32:116:32 | [finally: exception] 0 | | Finally.cs:116:17:116:28 | [finally: return] access to property Length | Finally.cs:116:32:116:32 | [finally: return] 0 | | Finally.cs:116:17:116:28 | access to property Length | Finally.cs:116:32:116:32 | 0 | | Finally.cs:116:17:116:32 | ... > ... | Finally.cs:117:17:117:37 | ...; | -| Finally.cs:116:17:116:32 | [finally: exception(Exception)] ... > ... | Finally.cs:117:17:117:37 | [finally: exception(Exception)] ...; | -| Finally.cs:116:17:116:32 | [finally: exception(NullReferenceException)] ... > ... | Finally.cs:117:17:117:37 | [finally: exception(NullReferenceException)] ...; | -| Finally.cs:116:17:116:32 | [finally: exception(OutOfMemoryException)] ... > ... | Finally.cs:117:17:117:37 | [finally: exception(OutOfMemoryException)] ...; | +| Finally.cs:116:17:116:32 | [finally: exception] ... > ... | Finally.cs:103:10:103:11 | exit M5 (abnormal) | +| Finally.cs:116:17:116:32 | [finally: exception] ... > ... | Finally.cs:117:17:117:37 | [finally: exception] ...; | | Finally.cs:116:17:116:32 | [finally: return] ... > ... | Finally.cs:117:17:117:37 | [finally: return] ...; | | Finally.cs:116:32:116:32 | 0 | Finally.cs:116:17:116:32 | ... > ... | -| Finally.cs:116:32:116:32 | [finally: exception(Exception)] 0 | Finally.cs:116:17:116:32 | [finally: exception(Exception)] ... > ... | -| Finally.cs:116:32:116:32 | [finally: exception(NullReferenceException)] 0 | Finally.cs:116:17:116:32 | [finally: exception(NullReferenceException)] ... > ... | -| Finally.cs:116:32:116:32 | [finally: exception(OutOfMemoryException)] 0 | Finally.cs:116:17:116:32 | [finally: exception(OutOfMemoryException)] ... > ... | +| Finally.cs:116:32:116:32 | [finally: exception] 0 | Finally.cs:116:17:116:32 | [finally: exception] ... > ... | | Finally.cs:116:32:116:32 | [finally: return] 0 | Finally.cs:116:17:116:32 | [finally: return] ... > ... | | Finally.cs:117:17:117:37 | ...; | Finally.cs:117:35:117:35 | 1 | -| Finally.cs:117:17:117:37 | [finally: exception(Exception)] ...; | Finally.cs:117:35:117:35 | [finally: exception(Exception)] 1 | -| Finally.cs:117:17:117:37 | [finally: exception(NullReferenceException)] ...; | Finally.cs:117:35:117:35 | [finally: exception(NullReferenceException)] 1 | -| Finally.cs:117:17:117:37 | [finally: exception(OutOfMemoryException)] ...; | Finally.cs:117:35:117:35 | [finally: exception(OutOfMemoryException)] 1 | +| Finally.cs:117:17:117:37 | [finally: exception] ...; | Finally.cs:117:35:117:35 | [finally: exception] 1 | | Finally.cs:117:17:117:37 | [finally: return] ...; | Finally.cs:117:35:117:35 | [finally: return] 1 | | Finally.cs:117:35:117:35 | 1 | Finally.cs:117:17:117:36 | call to method WriteLine | -| Finally.cs:117:35:117:35 | [finally: exception(Exception)] 1 | Finally.cs:117:17:117:36 | [finally: exception(Exception)] call to method WriteLine | -| Finally.cs:117:35:117:35 | [finally: exception(NullReferenceException)] 1 | Finally.cs:117:17:117:36 | [finally: exception(NullReferenceException)] call to method WriteLine | -| Finally.cs:117:35:117:35 | [finally: exception(OutOfMemoryException)] 1 | Finally.cs:117:17:117:36 | [finally: exception(OutOfMemoryException)] call to method WriteLine | +| Finally.cs:117:35:117:35 | [finally: exception] 1 | Finally.cs:117:17:117:36 | [finally: exception] call to method WriteLine | | Finally.cs:117:35:117:35 | [finally: return] 1 | Finally.cs:117:17:117:36 | [finally: return] call to method WriteLine | | Finally.cs:121:10:121:11 | enter M6 | Finally.cs:122:5:131:5 | {...} | | Finally.cs:121:10:121:11 | exit M6 (normal) | Finally.cs:121:10:121:11 | exit M6 | @@ -2064,16 +2015,16 @@ dominance | Finally.cs:134:5:145:5 | {...} | Finally.cs:135:9:143:9 | try {...} ... | | Finally.cs:135:9:143:9 | try {...} ... | Finally.cs:136:9:138:9 | {...} | | Finally.cs:136:9:138:9 | {...} | Finally.cs:137:13:137:37 | ...; | -| Finally.cs:137:13:137:36 | call to method WriteLine | Finally.cs:140:9:143:9 | [finally: exception(Exception)] {...} | +| Finally.cs:137:13:137:36 | call to method WriteLine | Finally.cs:140:9:143:9 | [finally: exception] {...} | | Finally.cs:137:13:137:36 | call to method WriteLine | Finally.cs:140:9:143:9 | {...} | | Finally.cs:137:13:137:37 | ...; | Finally.cs:137:31:137:35 | "Try" | | Finally.cs:137:31:137:35 | "Try" | Finally.cs:137:13:137:36 | call to method WriteLine | -| Finally.cs:140:9:143:9 | [finally: exception(Exception)] {...} | Finally.cs:141:41:141:42 | [finally: exception(Exception)] "" | +| Finally.cs:140:9:143:9 | [finally: exception] {...} | Finally.cs:141:41:141:42 | [finally: exception] "" | | Finally.cs:140:9:143:9 | {...} | Finally.cs:141:41:141:42 | "" | -| Finally.cs:141:19:141:43 | [finally: exception(Exception)] object creation of type ArgumentException | Finally.cs:141:13:141:44 | [finally: exception(Exception)] throw ...; | +| Finally.cs:141:19:141:43 | [finally: exception] object creation of type ArgumentException | Finally.cs:141:13:141:44 | [finally: exception] throw ...; | | Finally.cs:141:19:141:43 | object creation of type ArgumentException | Finally.cs:141:13:141:44 | throw ...; | | Finally.cs:141:41:141:42 | "" | Finally.cs:141:19:141:43 | object creation of type ArgumentException | -| Finally.cs:141:41:141:42 | [finally: exception(Exception)] "" | Finally.cs:141:19:141:43 | [finally: exception(Exception)] object creation of type ArgumentException | +| Finally.cs:141:41:141:42 | [finally: exception] "" | Finally.cs:141:19:141:43 | [finally: exception] object creation of type ArgumentException | | Finally.cs:147:10:147:11 | enter M8 | Finally.cs:148:5:170:5 | {...} | | Finally.cs:148:5:170:5 | {...} | Finally.cs:149:9:169:9 | try {...} ... | | Finally.cs:149:9:169:9 | try {...} ... | Finally.cs:150:9:153:9 | {...} | @@ -2083,102 +2034,70 @@ dominance | Finally.cs:151:17:151:28 | ... == ... | Finally.cs:152:23:152:49 | object creation of type ArgumentNullException | | Finally.cs:151:17:151:28 | ... == ... | Finally.cs:155:9:169:9 | {...} | | Finally.cs:151:25:151:28 | null | Finally.cs:151:17:151:28 | ... == ... | -| Finally.cs:152:17:152:50 | throw ...; | Finally.cs:155:9:169:9 | [finally: exception(ArgumentNullException)] {...} | | Finally.cs:152:23:152:49 | object creation of type ArgumentNullException | Finally.cs:152:17:152:50 | throw ...; | -| Finally.cs:152:23:152:49 | object creation of type ArgumentNullException | Finally.cs:155:9:169:9 | [finally: exception(Exception)] {...} | -| Finally.cs:155:9:169:9 | [finally: exception(ArgumentNullException)] {...} | Finally.cs:156:13:168:13 | [finally: exception(ArgumentNullException)] try {...} ... | -| Finally.cs:155:9:169:9 | [finally: exception(Exception)] {...} | Finally.cs:156:13:168:13 | [finally: exception(Exception)] try {...} ... | +| Finally.cs:152:23:152:49 | object creation of type ArgumentNullException | Finally.cs:155:9:169:9 | [finally: exception] {...} | +| Finally.cs:155:9:169:9 | [finally: exception] {...} | Finally.cs:156:13:168:13 | [finally: exception] try {...} ... | | Finally.cs:155:9:169:9 | {...} | Finally.cs:156:13:168:13 | try {...} ... | -| Finally.cs:156:13:168:13 | [finally: exception(ArgumentNullException)] try {...} ... | Finally.cs:157:13:160:13 | [finally: exception(ArgumentNullException)] {...} | -| Finally.cs:156:13:168:13 | [finally: exception(Exception)] try {...} ... | Finally.cs:157:13:160:13 | [finally: exception(Exception)] {...} | +| Finally.cs:156:13:168:13 | [finally: exception] try {...} ... | Finally.cs:157:13:160:13 | [finally: exception] {...} | | Finally.cs:156:13:168:13 | try {...} ... | Finally.cs:157:13:160:13 | {...} | -| Finally.cs:157:13:160:13 | [finally: exception(ArgumentNullException)] {...} | Finally.cs:158:17:159:45 | [finally: exception(ArgumentNullException)] if (...) ... | -| Finally.cs:157:13:160:13 | [finally: exception(Exception)] {...} | Finally.cs:158:17:159:45 | [finally: exception(Exception)] if (...) ... | +| Finally.cs:157:13:160:13 | [finally: exception] {...} | Finally.cs:158:17:159:45 | [finally: exception] if (...) ... | | Finally.cs:157:13:160:13 | {...} | Finally.cs:158:17:159:45 | if (...) ... | -| Finally.cs:158:17:159:45 | [finally: exception(ArgumentNullException)] if (...) ... | Finally.cs:158:21:158:24 | [finally: exception(ArgumentNullException)] access to parameter args | -| Finally.cs:158:17:159:45 | [finally: exception(Exception)] if (...) ... | Finally.cs:158:21:158:24 | [finally: exception(Exception)] access to parameter args | +| Finally.cs:158:17:159:45 | [finally: exception] if (...) ... | Finally.cs:158:21:158:24 | [finally: exception] access to parameter args | | Finally.cs:158:17:159:45 | if (...) ... | Finally.cs:158:21:158:24 | access to parameter args | -| Finally.cs:158:21:158:24 | [finally: exception(ArgumentNullException)] access to parameter args | Finally.cs:158:21:158:31 | [finally: exception(ArgumentNullException)] access to property Length | -| Finally.cs:158:21:158:24 | [finally: exception(Exception)] access to parameter args | Finally.cs:158:21:158:31 | [finally: exception(Exception)] access to property Length | +| Finally.cs:158:21:158:24 | [finally: exception] access to parameter args | Finally.cs:158:21:158:31 | [finally: exception] access to property Length | | Finally.cs:158:21:158:24 | access to parameter args | Finally.cs:158:21:158:31 | access to property Length | -| Finally.cs:158:21:158:31 | [finally: exception(ArgumentNullException)] access to property Length | Finally.cs:158:36:158:36 | [finally: exception(ArgumentNullException)] 1 | -| Finally.cs:158:21:158:31 | [finally: exception(ArgumentNullException)] access to property Length | Finally.cs:161:13:164:13 | [finally: exception(ArgumentNullException), exception: Exception] catch (...) {...} | -| Finally.cs:158:21:158:31 | [finally: exception(ArgumentNullException)] access to property Length | Finally.cs:161:13:164:13 | [finally: exception(ArgumentNullException), exception: NullReferenceException] catch (...) {...} | -| Finally.cs:158:21:158:31 | [finally: exception(Exception)] access to property Length | Finally.cs:158:36:158:36 | [finally: exception(Exception)] 1 | -| Finally.cs:158:21:158:31 | [finally: exception(Exception)] access to property Length | Finally.cs:161:13:164:13 | [finally: exception(Exception), exception: Exception] catch (...) {...} | -| Finally.cs:158:21:158:31 | [finally: exception(Exception)] access to property Length | Finally.cs:161:13:164:13 | [finally: exception(Exception), exception: NullReferenceException] catch (...) {...} | +| Finally.cs:158:21:158:31 | [finally: exception] access to property Length | Finally.cs:158:36:158:36 | [finally: exception] 1 | +| Finally.cs:158:21:158:31 | [finally: exception] access to property Length | Finally.cs:161:13:164:13 | [finally: exception, exception: Exception] catch (...) {...} | +| Finally.cs:158:21:158:31 | [finally: exception] access to property Length | Finally.cs:161:13:164:13 | [finally: exception, exception: NullReferenceException] catch (...) {...} | | Finally.cs:158:21:158:31 | access to property Length | Finally.cs:158:36:158:36 | 1 | | Finally.cs:158:21:158:31 | access to property Length | Finally.cs:161:13:164:13 | [exception: Exception] catch (...) {...} | | Finally.cs:158:21:158:31 | access to property Length | Finally.cs:161:13:164:13 | [exception: NullReferenceException] catch (...) {...} | | Finally.cs:158:21:158:36 | ... == ... | Finally.cs:159:41:159:43 | "1" | -| Finally.cs:158:21:158:36 | [finally: exception(ArgumentNullException)] ... == ... | Finally.cs:159:41:159:43 | [finally: exception(ArgumentNullException)] "1" | -| Finally.cs:158:21:158:36 | [finally: exception(Exception)] ... == ... | Finally.cs:159:41:159:43 | [finally: exception(Exception)] "1" | +| Finally.cs:158:21:158:36 | [finally: exception] ... == ... | Finally.cs:159:41:159:43 | [finally: exception] "1" | | Finally.cs:158:36:158:36 | 1 | Finally.cs:158:21:158:36 | ... == ... | -| Finally.cs:158:36:158:36 | [finally: exception(ArgumentNullException)] 1 | Finally.cs:158:21:158:36 | [finally: exception(ArgumentNullException)] ... == ... | -| Finally.cs:158:36:158:36 | [finally: exception(Exception)] 1 | Finally.cs:158:21:158:36 | [finally: exception(Exception)] ... == ... | -| Finally.cs:159:27:159:44 | [finally: exception(ArgumentNullException)] object creation of type Exception | Finally.cs:159:21:159:45 | [finally: exception(ArgumentNullException)] throw ...; | -| Finally.cs:159:27:159:44 | [finally: exception(Exception)] object creation of type Exception | Finally.cs:159:21:159:45 | [finally: exception(Exception)] throw ...; | +| Finally.cs:158:36:158:36 | [finally: exception] 1 | Finally.cs:158:21:158:36 | [finally: exception] ... == ... | +| Finally.cs:159:27:159:44 | [finally: exception] object creation of type Exception | Finally.cs:159:21:159:45 | [finally: exception] throw ...; | | Finally.cs:159:27:159:44 | object creation of type Exception | Finally.cs:159:21:159:45 | throw ...; | | Finally.cs:159:41:159:43 | "1" | Finally.cs:159:27:159:44 | object creation of type Exception | -| Finally.cs:159:41:159:43 | [finally: exception(ArgumentNullException)] "1" | Finally.cs:159:27:159:44 | [finally: exception(ArgumentNullException)] object creation of type Exception | -| Finally.cs:159:41:159:43 | [finally: exception(Exception)] "1" | Finally.cs:159:27:159:44 | [finally: exception(Exception)] object creation of type Exception | +| Finally.cs:159:41:159:43 | [finally: exception] "1" | Finally.cs:159:27:159:44 | [finally: exception] object creation of type Exception | | Finally.cs:161:13:164:13 | [exception: Exception] catch (...) {...} | Finally.cs:161:30:161:30 | [exception: Exception] Exception e | | Finally.cs:161:13:164:13 | [exception: NullReferenceException] catch (...) {...} | Finally.cs:161:30:161:30 | [exception: NullReferenceException] Exception e | -| Finally.cs:161:13:164:13 | [finally: exception(ArgumentNullException), exception: Exception] catch (...) {...} | Finally.cs:161:30:161:30 | [finally: exception(ArgumentNullException), exception: Exception] Exception e | -| Finally.cs:161:13:164:13 | [finally: exception(ArgumentNullException), exception: NullReferenceException] catch (...) {...} | Finally.cs:161:30:161:30 | [finally: exception(ArgumentNullException), exception: NullReferenceException] Exception e | -| Finally.cs:161:13:164:13 | [finally: exception(Exception), exception: Exception] catch (...) {...} | Finally.cs:161:30:161:30 | [finally: exception(Exception), exception: Exception] Exception e | -| Finally.cs:161:13:164:13 | [finally: exception(Exception), exception: NullReferenceException] catch (...) {...} | Finally.cs:161:30:161:30 | [finally: exception(Exception), exception: NullReferenceException] Exception e | +| Finally.cs:161:13:164:13 | [finally: exception, exception: Exception] catch (...) {...} | Finally.cs:161:30:161:30 | [finally: exception, exception: Exception] Exception e | +| Finally.cs:161:13:164:13 | [finally: exception, exception: NullReferenceException] catch (...) {...} | Finally.cs:161:30:161:30 | [finally: exception, exception: NullReferenceException] Exception e | | Finally.cs:161:30:161:30 | [exception: Exception] Exception e | Finally.cs:161:39:161:39 | [exception: Exception] access to local variable e | | Finally.cs:161:30:161:30 | [exception: NullReferenceException] Exception e | Finally.cs:161:39:161:39 | [exception: NullReferenceException] access to local variable e | -| Finally.cs:161:30:161:30 | [finally: exception(ArgumentNullException), exception: Exception] Exception e | Finally.cs:161:39:161:39 | [finally: exception(ArgumentNullException), exception: Exception] access to local variable e | -| Finally.cs:161:30:161:30 | [finally: exception(ArgumentNullException), exception: NullReferenceException] Exception e | Finally.cs:161:39:161:39 | [finally: exception(ArgumentNullException), exception: NullReferenceException] access to local variable e | -| Finally.cs:161:30:161:30 | [finally: exception(Exception), exception: Exception] Exception e | Finally.cs:161:39:161:39 | [finally: exception(Exception), exception: Exception] access to local variable e | -| Finally.cs:161:30:161:30 | [finally: exception(Exception), exception: NullReferenceException] Exception e | Finally.cs:161:39:161:39 | [finally: exception(Exception), exception: NullReferenceException] access to local variable e | +| Finally.cs:161:30:161:30 | [finally: exception, exception: Exception] Exception e | Finally.cs:161:39:161:39 | [finally: exception, exception: Exception] access to local variable e | +| Finally.cs:161:30:161:30 | [finally: exception, exception: NullReferenceException] Exception e | Finally.cs:161:39:161:39 | [finally: exception, exception: NullReferenceException] access to local variable e | | Finally.cs:161:39:161:39 | [exception: Exception] access to local variable e | Finally.cs:161:39:161:47 | [exception: Exception] access to property Message | | Finally.cs:161:39:161:39 | [exception: NullReferenceException] access to local variable e | Finally.cs:161:39:161:47 | [exception: NullReferenceException] access to property Message | -| Finally.cs:161:39:161:39 | [finally: exception(ArgumentNullException), exception: Exception] access to local variable e | Finally.cs:161:39:161:47 | [finally: exception(ArgumentNullException), exception: Exception] access to property Message | -| Finally.cs:161:39:161:39 | [finally: exception(ArgumentNullException), exception: NullReferenceException] access to local variable e | Finally.cs:161:39:161:47 | [finally: exception(ArgumentNullException), exception: NullReferenceException] access to property Message | -| Finally.cs:161:39:161:39 | [finally: exception(Exception), exception: Exception] access to local variable e | Finally.cs:161:39:161:47 | [finally: exception(Exception), exception: Exception] access to property Message | -| Finally.cs:161:39:161:39 | [finally: exception(Exception), exception: NullReferenceException] access to local variable e | Finally.cs:161:39:161:47 | [finally: exception(Exception), exception: NullReferenceException] access to property Message | +| Finally.cs:161:39:161:39 | [finally: exception, exception: Exception] access to local variable e | Finally.cs:161:39:161:47 | [finally: exception, exception: Exception] access to property Message | +| Finally.cs:161:39:161:39 | [finally: exception, exception: NullReferenceException] access to local variable e | Finally.cs:161:39:161:47 | [finally: exception, exception: NullReferenceException] access to property Message | | Finally.cs:161:39:161:47 | [exception: Exception] access to property Message | Finally.cs:161:52:161:54 | [exception: Exception] "1" | | Finally.cs:161:39:161:47 | [exception: NullReferenceException] access to property Message | Finally.cs:161:52:161:54 | [exception: NullReferenceException] "1" | -| Finally.cs:161:39:161:47 | [finally: exception(ArgumentNullException), exception: Exception] access to property Message | Finally.cs:161:52:161:54 | [finally: exception(ArgumentNullException), exception: Exception] "1" | -| Finally.cs:161:39:161:47 | [finally: exception(ArgumentNullException), exception: NullReferenceException] access to property Message | Finally.cs:161:52:161:54 | [finally: exception(ArgumentNullException), exception: NullReferenceException] "1" | -| Finally.cs:161:39:161:47 | [finally: exception(Exception), exception: Exception] access to property Message | Finally.cs:161:52:161:54 | [finally: exception(Exception), exception: Exception] "1" | -| Finally.cs:161:39:161:47 | [finally: exception(Exception), exception: NullReferenceException] access to property Message | Finally.cs:161:52:161:54 | [finally: exception(Exception), exception: NullReferenceException] "1" | +| Finally.cs:161:39:161:47 | [finally: exception, exception: Exception] access to property Message | Finally.cs:161:52:161:54 | [finally: exception, exception: Exception] "1" | +| Finally.cs:161:39:161:47 | [finally: exception, exception: NullReferenceException] access to property Message | Finally.cs:161:52:161:54 | [finally: exception, exception: NullReferenceException] "1" | | Finally.cs:161:52:161:54 | [exception: Exception] "1" | Finally.cs:161:39:161:54 | [exception: Exception] ... == ... | | Finally.cs:161:52:161:54 | [exception: NullReferenceException] "1" | Finally.cs:161:39:161:54 | [exception: NullReferenceException] ... == ... | -| Finally.cs:161:52:161:54 | [finally: exception(ArgumentNullException), exception: Exception] "1" | Finally.cs:161:39:161:54 | [finally: exception(ArgumentNullException), exception: Exception] ... == ... | -| Finally.cs:161:52:161:54 | [finally: exception(ArgumentNullException), exception: NullReferenceException] "1" | Finally.cs:161:39:161:54 | [finally: exception(ArgumentNullException), exception: NullReferenceException] ... == ... | -| Finally.cs:161:52:161:54 | [finally: exception(Exception), exception: Exception] "1" | Finally.cs:161:39:161:54 | [finally: exception(Exception), exception: Exception] ... == ... | -| Finally.cs:161:52:161:54 | [finally: exception(Exception), exception: NullReferenceException] "1" | Finally.cs:161:39:161:54 | [finally: exception(Exception), exception: NullReferenceException] ... == ... | -| Finally.cs:162:13:164:13 | [finally: exception(ArgumentNullException)] {...} | Finally.cs:163:17:163:43 | [finally: exception(ArgumentNullException)] ...; | -| Finally.cs:162:13:164:13 | [finally: exception(Exception)] {...} | Finally.cs:163:17:163:43 | [finally: exception(Exception)] ...; | +| Finally.cs:161:52:161:54 | [finally: exception, exception: Exception] "1" | Finally.cs:161:39:161:54 | [finally: exception, exception: Exception] ... == ... | +| Finally.cs:161:52:161:54 | [finally: exception, exception: NullReferenceException] "1" | Finally.cs:161:39:161:54 | [finally: exception, exception: NullReferenceException] ... == ... | +| Finally.cs:162:13:164:13 | [finally: exception] {...} | Finally.cs:163:17:163:43 | [finally: exception] ...; | | Finally.cs:162:13:164:13 | {...} | Finally.cs:163:17:163:43 | ...; | | Finally.cs:163:17:163:43 | ...; | Finally.cs:163:35:163:38 | access to parameter args | -| Finally.cs:163:17:163:43 | [finally: exception(ArgumentNullException)] ...; | Finally.cs:163:35:163:38 | [finally: exception(ArgumentNullException)] access to parameter args | -| Finally.cs:163:17:163:43 | [finally: exception(Exception)] ...; | Finally.cs:163:35:163:38 | [finally: exception(Exception)] access to parameter args | -| Finally.cs:163:35:163:38 | [finally: exception(ArgumentNullException)] access to parameter args | Finally.cs:163:40:163:40 | [finally: exception(ArgumentNullException)] 0 | -| Finally.cs:163:35:163:38 | [finally: exception(Exception)] access to parameter args | Finally.cs:163:40:163:40 | [finally: exception(Exception)] 0 | +| Finally.cs:163:17:163:43 | [finally: exception] ...; | Finally.cs:163:35:163:38 | [finally: exception] access to parameter args | +| Finally.cs:163:35:163:38 | [finally: exception] access to parameter args | Finally.cs:163:40:163:40 | [finally: exception] 0 | | Finally.cs:163:35:163:38 | access to parameter args | Finally.cs:163:40:163:40 | 0 | -| Finally.cs:163:35:163:41 | [finally: exception(ArgumentNullException)] access to array element | Finally.cs:163:17:163:42 | [finally: exception(ArgumentNullException)] call to method WriteLine | -| Finally.cs:163:35:163:41 | [finally: exception(Exception)] access to array element | Finally.cs:163:17:163:42 | [finally: exception(Exception)] call to method WriteLine | +| Finally.cs:163:35:163:41 | [finally: exception] access to array element | Finally.cs:163:17:163:42 | [finally: exception] call to method WriteLine | | Finally.cs:163:35:163:41 | access to array element | Finally.cs:163:17:163:42 | call to method WriteLine | | Finally.cs:163:40:163:40 | 0 | Finally.cs:163:35:163:41 | access to array element | -| Finally.cs:163:40:163:40 | [finally: exception(ArgumentNullException)] 0 | Finally.cs:163:35:163:41 | [finally: exception(ArgumentNullException)] access to array element | -| Finally.cs:163:40:163:40 | [finally: exception(Exception)] 0 | Finally.cs:163:35:163:41 | [finally: exception(Exception)] access to array element | -| Finally.cs:165:13:168:13 | [finally: exception(ArgumentNullException)] catch {...} | Finally.cs:166:13:168:13 | [finally: exception(ArgumentNullException)] {...} | -| Finally.cs:165:13:168:13 | [finally: exception(Exception)] catch {...} | Finally.cs:166:13:168:13 | [finally: exception(Exception)] {...} | +| Finally.cs:163:40:163:40 | [finally: exception] 0 | Finally.cs:163:35:163:41 | [finally: exception] access to array element | +| Finally.cs:165:13:168:13 | [finally: exception] catch {...} | Finally.cs:166:13:168:13 | [finally: exception] {...} | | Finally.cs:165:13:168:13 | catch {...} | Finally.cs:166:13:168:13 | {...} | -| Finally.cs:166:13:168:13 | [finally: exception(ArgumentNullException)] {...} | Finally.cs:167:17:167:38 | [finally: exception(ArgumentNullException)] ...; | -| Finally.cs:166:13:168:13 | [finally: exception(Exception)] {...} | Finally.cs:167:17:167:38 | [finally: exception(Exception)] ...; | +| Finally.cs:166:13:168:13 | [finally: exception] {...} | Finally.cs:167:17:167:38 | [finally: exception] ...; | | Finally.cs:166:13:168:13 | {...} | Finally.cs:167:17:167:38 | ...; | | Finally.cs:167:17:167:38 | ...; | Finally.cs:167:35:167:36 | "" | -| Finally.cs:167:17:167:38 | [finally: exception(ArgumentNullException)] ...; | Finally.cs:167:35:167:36 | [finally: exception(ArgumentNullException)] "" | -| Finally.cs:167:17:167:38 | [finally: exception(Exception)] ...; | Finally.cs:167:35:167:36 | [finally: exception(Exception)] "" | +| Finally.cs:167:17:167:38 | [finally: exception] ...; | Finally.cs:167:35:167:36 | [finally: exception] "" | | Finally.cs:167:35:167:36 | "" | Finally.cs:167:17:167:37 | call to method WriteLine | -| Finally.cs:167:35:167:36 | [finally: exception(ArgumentNullException)] "" | Finally.cs:167:17:167:37 | [finally: exception(ArgumentNullException)] call to method WriteLine | -| Finally.cs:167:35:167:36 | [finally: exception(Exception)] "" | Finally.cs:167:17:167:37 | [finally: exception(Exception)] call to method WriteLine | +| Finally.cs:167:35:167:36 | [finally: exception] "" | Finally.cs:167:17:167:37 | [finally: exception] call to method WriteLine | | Finally.cs:172:11:172:20 | call to constructor Exception | Finally.cs:172:11:172:20 | {...} | | Finally.cs:172:11:172:20 | enter ExceptionA | Finally.cs:172:11:172:20 | call to constructor Exception | | Finally.cs:172:11:172:20 | exit ExceptionA (normal) | Finally.cs:172:11:172:20 | exit ExceptionA | @@ -2198,50 +2117,35 @@ dominance | Finally.cs:180:13:180:43 | if (...) ... | Finally.cs:180:17:180:18 | access to parameter b1 | | Finally.cs:180:17:180:18 | access to parameter b1 | Finally.cs:180:27:180:42 | [b1 (line 176): true] object creation of type ExceptionA | | Finally.cs:180:17:180:18 | access to parameter b1 | Finally.cs:183:9:192:9 | [b1 (line 176): false] {...} | -| Finally.cs:180:21:180:43 | [b1 (line 176): true] throw ...; | Finally.cs:183:9:192:9 | [finally: exception(ExceptionA), b1 (line 176): true] {...} | | Finally.cs:180:27:180:42 | [b1 (line 176): true] object creation of type ExceptionA | Finally.cs:180:21:180:43 | [b1 (line 176): true] throw ...; | -| Finally.cs:180:27:180:42 | [b1 (line 176): true] object creation of type ExceptionA | Finally.cs:183:9:192:9 | [finally: exception(Exception), b1 (line 176): true] {...} | +| Finally.cs:180:27:180:42 | [b1 (line 176): true] object creation of type ExceptionA | Finally.cs:183:9:192:9 | [finally: exception, b1 (line 176): true] {...} | | Finally.cs:183:9:192:9 | [b1 (line 176): false] {...} | Finally.cs:184:13:191:13 | [b1 (line 176): false] try {...} ... | -| Finally.cs:183:9:192:9 | [finally: exception(Exception), b1 (line 176): true] {...} | Finally.cs:184:13:191:13 | [finally: exception(Exception), b1 (line 176): true] try {...} ... | -| Finally.cs:183:9:192:9 | [finally: exception(ExceptionA), b1 (line 176): true] {...} | Finally.cs:184:13:191:13 | [finally: exception(ExceptionA), b1 (line 176): true] try {...} ... | +| Finally.cs:183:9:192:9 | [finally: exception, b1 (line 176): true] {...} | Finally.cs:184:13:191:13 | [finally: exception, b1 (line 176): true] try {...} ... | | Finally.cs:184:13:191:13 | [b1 (line 176): false] try {...} ... | Finally.cs:185:13:187:13 | [b1 (line 176): false] {...} | -| Finally.cs:184:13:191:13 | [finally: exception(Exception), b1 (line 176): true] try {...} ... | Finally.cs:185:13:187:13 | [finally: exception(Exception), b1 (line 176): true] {...} | -| Finally.cs:184:13:191:13 | [finally: exception(ExceptionA), b1 (line 176): true] try {...} ... | Finally.cs:185:13:187:13 | [finally: exception(ExceptionA), b1 (line 176): true] {...} | +| Finally.cs:184:13:191:13 | [finally: exception, b1 (line 176): true] try {...} ... | Finally.cs:185:13:187:13 | [finally: exception, b1 (line 176): true] {...} | | Finally.cs:185:13:187:13 | [b1 (line 176): false] {...} | Finally.cs:186:17:186:47 | [b1 (line 176): false] if (...) ... | -| Finally.cs:185:13:187:13 | [finally: exception(Exception), b1 (line 176): true] {...} | Finally.cs:186:17:186:47 | [finally: exception(Exception), b1 (line 176): true] if (...) ... | -| Finally.cs:185:13:187:13 | [finally: exception(ExceptionA), b1 (line 176): true] {...} | Finally.cs:186:17:186:47 | [finally: exception(ExceptionA), b1 (line 176): true] if (...) ... | +| Finally.cs:185:13:187:13 | [finally: exception, b1 (line 176): true] {...} | Finally.cs:186:17:186:47 | [finally: exception, b1 (line 176): true] if (...) ... | | Finally.cs:186:17:186:47 | [b1 (line 176): false] if (...) ... | Finally.cs:186:21:186:22 | [b1 (line 176): false] access to parameter b2 | -| Finally.cs:186:17:186:47 | [finally: exception(Exception), b1 (line 176): true] if (...) ... | Finally.cs:186:21:186:22 | [finally: exception(Exception), b1 (line 176): true] access to parameter b2 | -| Finally.cs:186:17:186:47 | [finally: exception(ExceptionA), b1 (line 176): true] if (...) ... | Finally.cs:186:21:186:22 | [finally: exception(ExceptionA), b1 (line 176): true] access to parameter b2 | +| Finally.cs:186:17:186:47 | [finally: exception, b1 (line 176): true] if (...) ... | Finally.cs:186:21:186:22 | [finally: exception, b1 (line 176): true] access to parameter b2 | | Finally.cs:186:21:186:22 | [b1 (line 176): false] access to parameter b2 | Finally.cs:176:10:176:11 | exit M9 (normal) | | Finally.cs:186:21:186:22 | [b1 (line 176): false] access to parameter b2 | Finally.cs:186:31:186:46 | [b1 (line 176): false, b2 (line 176): true] object creation of type ExceptionB | -| Finally.cs:186:21:186:22 | [finally: exception(Exception), b1 (line 176): true] access to parameter b2 | Finally.cs:186:31:186:46 | [finally: exception(Exception), b1 (line 176): true, b2 (line 176): true] object creation of type ExceptionB | -| Finally.cs:186:21:186:22 | [finally: exception(ExceptionA), b1 (line 176): true] access to parameter b2 | Finally.cs:186:31:186:46 | [finally: exception(ExceptionA), b1 (line 176): true, b2 (line 176): true] object creation of type ExceptionB | +| Finally.cs:186:21:186:22 | [finally: exception, b1 (line 176): true] access to parameter b2 | Finally.cs:186:31:186:46 | [finally: exception, b1 (line 176): true, b2 (line 176): true] object creation of type ExceptionB | | Finally.cs:186:25:186:47 | [b1 (line 176): false, b2 (line 176): true] throw ...; | Finally.cs:188:13:191:13 | [exception: ExceptionB, b1 (line 176): false, b2 (line 176): true] catch (...) {...} | -| Finally.cs:186:25:186:47 | [finally: exception(Exception), b1 (line 176): true, b2 (line 176): true] throw ...; | Finally.cs:188:13:191:13 | [finally: exception(Exception), exception: ExceptionB, b1 (line 176): true, b2 (line 176): true] catch (...) {...} | -| Finally.cs:186:25:186:47 | [finally: exception(ExceptionA), b1 (line 176): true, b2 (line 176): true] throw ...; | Finally.cs:188:13:191:13 | [finally: exception(ExceptionA), exception: ExceptionB, b1 (line 176): true, b2 (line 176): true] catch (...) {...} | +| Finally.cs:186:25:186:47 | [finally: exception, b1 (line 176): true, b2 (line 176): true] throw ...; | Finally.cs:188:13:191:13 | [finally: exception, exception: ExceptionB, b1 (line 176): true, b2 (line 176): true] catch (...) {...} | | Finally.cs:186:31:186:46 | [b1 (line 176): false, b2 (line 176): true] object creation of type ExceptionB | Finally.cs:186:25:186:47 | [b1 (line 176): false, b2 (line 176): true] throw ...; | | Finally.cs:186:31:186:46 | [b1 (line 176): false, b2 (line 176): true] object creation of type ExceptionB | Finally.cs:188:13:191:13 | [exception: Exception, b1 (line 176): false, b2 (line 176): true] catch (...) {...} | -| Finally.cs:186:31:186:46 | [finally: exception(Exception), b1 (line 176): true, b2 (line 176): true] object creation of type ExceptionB | Finally.cs:186:25:186:47 | [finally: exception(Exception), b1 (line 176): true, b2 (line 176): true] throw ...; | -| Finally.cs:186:31:186:46 | [finally: exception(Exception), b1 (line 176): true, b2 (line 176): true] object creation of type ExceptionB | Finally.cs:188:13:191:13 | [finally: exception(Exception), exception: Exception, b1 (line 176): true, b2 (line 176): true] catch (...) {...} | -| Finally.cs:186:31:186:46 | [finally: exception(ExceptionA), b1 (line 176): true, b2 (line 176): true] object creation of type ExceptionB | Finally.cs:186:25:186:47 | [finally: exception(ExceptionA), b1 (line 176): true, b2 (line 176): true] throw ...; | -| Finally.cs:186:31:186:46 | [finally: exception(ExceptionA), b1 (line 176): true, b2 (line 176): true] object creation of type ExceptionB | Finally.cs:188:13:191:13 | [finally: exception(ExceptionA), exception: Exception, b1 (line 176): true, b2 (line 176): true] catch (...) {...} | +| Finally.cs:186:31:186:46 | [finally: exception, b1 (line 176): true, b2 (line 176): true] object creation of type ExceptionB | Finally.cs:186:25:186:47 | [finally: exception, b1 (line 176): true, b2 (line 176): true] throw ...; | +| Finally.cs:186:31:186:46 | [finally: exception, b1 (line 176): true, b2 (line 176): true] object creation of type ExceptionB | Finally.cs:188:13:191:13 | [finally: exception, exception: Exception, b1 (line 176): true, b2 (line 176): true] catch (...) {...} | | Finally.cs:188:13:191:13 | [exception: Exception, b1 (line 176): false, b2 (line 176): true] catch (...) {...} | Finally.cs:188:38:188:39 | [exception: Exception, b1 (line 176): false, b2 (line 176): true] access to parameter b2 | | Finally.cs:188:13:191:13 | [exception: ExceptionB, b1 (line 176): false, b2 (line 176): true] catch (...) {...} | Finally.cs:188:38:188:39 | [exception: ExceptionB, b1 (line 176): false, b2 (line 176): true] access to parameter b2 | -| Finally.cs:188:13:191:13 | [finally: exception(Exception), exception: Exception, b1 (line 176): true, b2 (line 176): true] catch (...) {...} | Finally.cs:188:38:188:39 | [finally: exception(Exception), exception: Exception, b1 (line 176): true, b2 (line 176): true] access to parameter b2 | -| Finally.cs:188:13:191:13 | [finally: exception(Exception), exception: ExceptionB, b1 (line 176): true, b2 (line 176): true] catch (...) {...} | Finally.cs:188:38:188:39 | [finally: exception(Exception), exception: ExceptionB, b1 (line 176): true, b2 (line 176): true] access to parameter b2 | -| Finally.cs:188:13:191:13 | [finally: exception(ExceptionA), exception: Exception, b1 (line 176): true, b2 (line 176): true] catch (...) {...} | Finally.cs:188:38:188:39 | [finally: exception(ExceptionA), exception: Exception, b1 (line 176): true, b2 (line 176): true] access to parameter b2 | -| Finally.cs:188:13:191:13 | [finally: exception(ExceptionA), exception: ExceptionB, b1 (line 176): true, b2 (line 176): true] catch (...) {...} | Finally.cs:188:38:188:39 | [finally: exception(ExceptionA), exception: ExceptionB, b1 (line 176): true, b2 (line 176): true] access to parameter b2 | +| Finally.cs:188:13:191:13 | [finally: exception, exception: Exception, b1 (line 176): true, b2 (line 176): true] catch (...) {...} | Finally.cs:188:38:188:39 | [finally: exception, exception: Exception, b1 (line 176): true, b2 (line 176): true] access to parameter b2 | +| Finally.cs:188:13:191:13 | [finally: exception, exception: ExceptionB, b1 (line 176): true, b2 (line 176): true] catch (...) {...} | Finally.cs:188:38:188:39 | [finally: exception, exception: ExceptionB, b1 (line 176): true, b2 (line 176): true] access to parameter b2 | | Finally.cs:189:13:191:13 | [b1 (line 176): false] {...} | Finally.cs:190:17:190:47 | [b1 (line 176): false] if (...) ... | -| Finally.cs:189:13:191:13 | [finally: exception(Exception), b1 (line 176): true] {...} | Finally.cs:190:17:190:47 | [finally: exception(Exception), b1 (line 176): true] if (...) ... | -| Finally.cs:189:13:191:13 | [finally: exception(ExceptionA), b1 (line 176): true] {...} | Finally.cs:190:17:190:47 | [finally: exception(ExceptionA), b1 (line 176): true] if (...) ... | +| Finally.cs:189:13:191:13 | [finally: exception, b1 (line 176): true] {...} | Finally.cs:190:17:190:47 | [finally: exception, b1 (line 176): true] if (...) ... | | Finally.cs:190:17:190:47 | [b1 (line 176): false] if (...) ... | Finally.cs:190:21:190:22 | [b1 (line 176): false] access to parameter b1 | -| Finally.cs:190:17:190:47 | [finally: exception(Exception), b1 (line 176): true] if (...) ... | Finally.cs:190:21:190:22 | [finally: exception(Exception), b1 (line 176): true] access to parameter b1 | -| Finally.cs:190:17:190:47 | [finally: exception(ExceptionA), b1 (line 176): true] if (...) ... | Finally.cs:190:21:190:22 | [finally: exception(ExceptionA), b1 (line 176): true] access to parameter b1 | -| Finally.cs:190:21:190:22 | [finally: exception(Exception), b1 (line 176): true] access to parameter b1 | Finally.cs:190:31:190:46 | [finally: exception(Exception)] object creation of type ExceptionC | -| Finally.cs:190:21:190:22 | [finally: exception(ExceptionA), b1 (line 176): true] access to parameter b1 | Finally.cs:190:31:190:46 | [finally: exception(ExceptionA)] object creation of type ExceptionC | -| Finally.cs:190:31:190:46 | [finally: exception(Exception)] object creation of type ExceptionC | Finally.cs:190:25:190:47 | [finally: exception(Exception)] throw ...; | -| Finally.cs:190:31:190:46 | [finally: exception(ExceptionA)] object creation of type ExceptionC | Finally.cs:190:25:190:47 | [finally: exception(ExceptionA)] throw ...; | +| Finally.cs:190:17:190:47 | [finally: exception, b1 (line 176): true] if (...) ... | Finally.cs:190:21:190:22 | [finally: exception, b1 (line 176): true] access to parameter b1 | +| Finally.cs:190:21:190:22 | [finally: exception, b1 (line 176): true] access to parameter b1 | Finally.cs:190:31:190:46 | [finally: exception] object creation of type ExceptionC | +| Finally.cs:190:31:190:46 | [finally: exception] object creation of type ExceptionC | Finally.cs:190:25:190:47 | [finally: exception] throw ...; | | Finally.cs:195:10:195:12 | enter M10 | Finally.cs:196:5:214:5 | {...} | | Finally.cs:196:5:214:5 | {...} | Finally.cs:197:9:212:9 | try {...} ... | | Finally.cs:197:9:212:9 | try {...} ... | Finally.cs:198:9:200:9 | {...} | @@ -2249,85 +2153,49 @@ dominance | Finally.cs:199:13:199:43 | if (...) ... | Finally.cs:199:17:199:18 | access to parameter b1 | | Finally.cs:199:17:199:18 | access to parameter b1 | Finally.cs:199:27:199:42 | object creation of type ExceptionA | | Finally.cs:199:17:199:18 | access to parameter b1 | Finally.cs:202:9:212:9 | {...} | -| Finally.cs:199:21:199:43 | throw ...; | Finally.cs:202:9:212:9 | [finally: exception(ExceptionA)] {...} | | Finally.cs:199:27:199:42 | object creation of type ExceptionA | Finally.cs:199:21:199:43 | throw ...; | -| Finally.cs:199:27:199:42 | object creation of type ExceptionA | Finally.cs:202:9:212:9 | [finally: exception(Exception)] {...} | -| Finally.cs:202:9:212:9 | [finally: exception(Exception)] {...} | Finally.cs:203:13:210:13 | [finally: exception(Exception)] try {...} ... | -| Finally.cs:202:9:212:9 | [finally: exception(ExceptionA)] {...} | Finally.cs:203:13:210:13 | [finally: exception(ExceptionA)] try {...} ... | +| Finally.cs:199:27:199:42 | object creation of type ExceptionA | Finally.cs:202:9:212:9 | [finally: exception] {...} | +| Finally.cs:202:9:212:9 | [finally: exception] {...} | Finally.cs:203:13:210:13 | [finally: exception] try {...} ... | | Finally.cs:202:9:212:9 | {...} | Finally.cs:203:13:210:13 | try {...} ... | -| Finally.cs:203:13:210:13 | [finally: exception(Exception)] try {...} ... | Finally.cs:204:13:206:13 | [finally: exception(Exception)] {...} | -| Finally.cs:203:13:210:13 | [finally: exception(ExceptionA)] try {...} ... | Finally.cs:204:13:206:13 | [finally: exception(ExceptionA)] {...} | +| Finally.cs:203:13:210:13 | [finally: exception] try {...} ... | Finally.cs:204:13:206:13 | [finally: exception] {...} | | Finally.cs:203:13:210:13 | try {...} ... | Finally.cs:204:13:206:13 | {...} | -| Finally.cs:204:13:206:13 | [finally: exception(Exception)] {...} | Finally.cs:205:17:205:47 | [finally: exception(Exception)] if (...) ... | -| Finally.cs:204:13:206:13 | [finally: exception(ExceptionA)] {...} | Finally.cs:205:17:205:47 | [finally: exception(ExceptionA)] if (...) ... | +| Finally.cs:204:13:206:13 | [finally: exception] {...} | Finally.cs:205:17:205:47 | [finally: exception] if (...) ... | | Finally.cs:204:13:206:13 | {...} | Finally.cs:205:17:205:47 | if (...) ... | -| Finally.cs:205:17:205:47 | [finally: exception(Exception)] if (...) ... | Finally.cs:205:21:205:22 | [finally: exception(Exception)] access to parameter b2 | -| Finally.cs:205:17:205:47 | [finally: exception(ExceptionA)] if (...) ... | Finally.cs:205:21:205:22 | [finally: exception(ExceptionA)] access to parameter b2 | +| Finally.cs:205:17:205:47 | [finally: exception] if (...) ... | Finally.cs:205:21:205:22 | [finally: exception] access to parameter b2 | | Finally.cs:205:17:205:47 | if (...) ... | Finally.cs:205:21:205:22 | access to parameter b2 | -| Finally.cs:205:21:205:22 | [finally: exception(Exception)] access to parameter b2 | Finally.cs:205:31:205:46 | [finally: exception(Exception)] object creation of type ExceptionB | -| Finally.cs:205:21:205:22 | [finally: exception(Exception)] access to parameter b2 | Finally.cs:208:13:210:13 | [finally: exception(Exception)] {...} | -| Finally.cs:205:21:205:22 | [finally: exception(ExceptionA)] access to parameter b2 | Finally.cs:205:31:205:46 | [finally: exception(ExceptionA)] object creation of type ExceptionB | -| Finally.cs:205:21:205:22 | [finally: exception(ExceptionA)] access to parameter b2 | Finally.cs:208:13:210:13 | [finally: exception(ExceptionA)] {...} | +| Finally.cs:205:21:205:22 | [finally: exception] access to parameter b2 | Finally.cs:205:31:205:46 | [finally: exception] object creation of type ExceptionB | +| Finally.cs:205:21:205:22 | [finally: exception] access to parameter b2 | Finally.cs:208:13:210:13 | [finally: exception] {...} | | Finally.cs:205:21:205:22 | access to parameter b2 | Finally.cs:205:31:205:46 | object creation of type ExceptionB | | Finally.cs:205:21:205:22 | access to parameter b2 | Finally.cs:208:13:210:13 | {...} | -| Finally.cs:205:25:205:47 | [finally: exception(Exception)] throw ...; | Finally.cs:208:13:210:13 | [finally: exception(Exception), finally(1): exception(ExceptionB)] {...} | -| Finally.cs:205:25:205:47 | [finally: exception(ExceptionA)] throw ...; | Finally.cs:208:13:210:13 | [finally: exception(ExceptionA), finally(1): exception(ExceptionB)] {...} | -| Finally.cs:205:25:205:47 | throw ...; | Finally.cs:208:13:210:13 | [finally(1): exception(ExceptionB)] {...} | -| Finally.cs:205:31:205:46 | [finally: exception(Exception)] object creation of type ExceptionB | Finally.cs:205:25:205:47 | [finally: exception(Exception)] throw ...; | -| Finally.cs:205:31:205:46 | [finally: exception(Exception)] object creation of type ExceptionB | Finally.cs:208:13:210:13 | [finally: exception(Exception), finally(1): exception(Exception)] {...} | -| Finally.cs:205:31:205:46 | [finally: exception(ExceptionA)] object creation of type ExceptionB | Finally.cs:205:25:205:47 | [finally: exception(ExceptionA)] throw ...; | -| Finally.cs:205:31:205:46 | [finally: exception(ExceptionA)] object creation of type ExceptionB | Finally.cs:208:13:210:13 | [finally: exception(ExceptionA), finally(1): exception(Exception)] {...} | +| Finally.cs:205:31:205:46 | [finally: exception] object creation of type ExceptionB | Finally.cs:205:25:205:47 | [finally: exception] throw ...; | +| Finally.cs:205:31:205:46 | [finally: exception] object creation of type ExceptionB | Finally.cs:208:13:210:13 | [finally: exception, finally(1): exception] {...} | | Finally.cs:205:31:205:46 | object creation of type ExceptionB | Finally.cs:205:25:205:47 | throw ...; | -| Finally.cs:205:31:205:46 | object creation of type ExceptionB | Finally.cs:208:13:210:13 | [finally(1): exception(Exception)] {...} | -| Finally.cs:208:13:210:13 | [finally(1): exception(Exception)] {...} | Finally.cs:209:17:209:47 | [finally(1): exception(Exception)] if (...) ... | -| Finally.cs:208:13:210:13 | [finally(1): exception(ExceptionB)] {...} | Finally.cs:209:17:209:47 | [finally(1): exception(ExceptionB)] if (...) ... | -| Finally.cs:208:13:210:13 | [finally: exception(Exception), finally(1): exception(Exception)] {...} | Finally.cs:209:17:209:47 | [finally: exception(Exception), finally(1): exception(Exception)] if (...) ... | -| Finally.cs:208:13:210:13 | [finally: exception(Exception), finally(1): exception(ExceptionB)] {...} | Finally.cs:209:17:209:47 | [finally: exception(Exception), finally(1): exception(ExceptionB)] if (...) ... | -| Finally.cs:208:13:210:13 | [finally: exception(Exception)] {...} | Finally.cs:209:17:209:47 | [finally: exception(Exception)] if (...) ... | -| Finally.cs:208:13:210:13 | [finally: exception(ExceptionA), finally(1): exception(Exception)] {...} | Finally.cs:209:17:209:47 | [finally: exception(ExceptionA), finally(1): exception(Exception)] if (...) ... | -| Finally.cs:208:13:210:13 | [finally: exception(ExceptionA), finally(1): exception(ExceptionB)] {...} | Finally.cs:209:17:209:47 | [finally: exception(ExceptionA), finally(1): exception(ExceptionB)] if (...) ... | -| Finally.cs:208:13:210:13 | [finally: exception(ExceptionA)] {...} | Finally.cs:209:17:209:47 | [finally: exception(ExceptionA)] if (...) ... | +| Finally.cs:205:31:205:46 | object creation of type ExceptionB | Finally.cs:208:13:210:13 | [finally(1): exception] {...} | +| Finally.cs:208:13:210:13 | [finally(1): exception] {...} | Finally.cs:209:17:209:47 | [finally(1): exception] if (...) ... | +| Finally.cs:208:13:210:13 | [finally: exception, finally(1): exception] {...} | Finally.cs:209:17:209:47 | [finally: exception, finally(1): exception] if (...) ... | +| Finally.cs:208:13:210:13 | [finally: exception] {...} | Finally.cs:209:17:209:47 | [finally: exception] if (...) ... | | Finally.cs:208:13:210:13 | {...} | Finally.cs:209:17:209:47 | if (...) ... | -| Finally.cs:209:17:209:47 | [finally(1): exception(Exception)] if (...) ... | Finally.cs:209:21:209:22 | [finally(1): exception(Exception)] access to parameter b3 | -| Finally.cs:209:17:209:47 | [finally(1): exception(ExceptionB)] if (...) ... | Finally.cs:209:21:209:22 | [finally(1): exception(ExceptionB)] access to parameter b3 | -| Finally.cs:209:17:209:47 | [finally: exception(Exception), finally(1): exception(Exception)] if (...) ... | Finally.cs:209:21:209:22 | [finally: exception(Exception), finally(1): exception(Exception)] access to parameter b3 | -| Finally.cs:209:17:209:47 | [finally: exception(Exception), finally(1): exception(ExceptionB)] if (...) ... | Finally.cs:209:21:209:22 | [finally: exception(Exception), finally(1): exception(ExceptionB)] access to parameter b3 | -| Finally.cs:209:17:209:47 | [finally: exception(Exception)] if (...) ... | Finally.cs:209:21:209:22 | [finally: exception(Exception)] access to parameter b3 | -| Finally.cs:209:17:209:47 | [finally: exception(ExceptionA), finally(1): exception(Exception)] if (...) ... | Finally.cs:209:21:209:22 | [finally: exception(ExceptionA), finally(1): exception(Exception)] access to parameter b3 | -| Finally.cs:209:17:209:47 | [finally: exception(ExceptionA), finally(1): exception(ExceptionB)] if (...) ... | Finally.cs:209:21:209:22 | [finally: exception(ExceptionA), finally(1): exception(ExceptionB)] access to parameter b3 | -| Finally.cs:209:17:209:47 | [finally: exception(ExceptionA)] if (...) ... | Finally.cs:209:21:209:22 | [finally: exception(ExceptionA)] access to parameter b3 | +| Finally.cs:209:17:209:47 | [finally(1): exception] if (...) ... | Finally.cs:209:21:209:22 | [finally(1): exception] access to parameter b3 | +| Finally.cs:209:17:209:47 | [finally: exception, finally(1): exception] if (...) ... | Finally.cs:209:21:209:22 | [finally: exception, finally(1): exception] access to parameter b3 | +| Finally.cs:209:17:209:47 | [finally: exception] if (...) ... | Finally.cs:209:21:209:22 | [finally: exception] access to parameter b3 | | Finally.cs:209:17:209:47 | if (...) ... | Finally.cs:209:21:209:22 | access to parameter b3 | -| Finally.cs:209:21:209:22 | [finally(1): exception(Exception)] access to parameter b3 | Finally.cs:209:31:209:46 | [finally(1): exception(Exception)] object creation of type ExceptionC | -| Finally.cs:209:21:209:22 | [finally(1): exception(ExceptionB)] access to parameter b3 | Finally.cs:209:31:209:46 | [finally(1): exception(ExceptionB)] object creation of type ExceptionC | -| Finally.cs:209:21:209:22 | [finally: exception(Exception), finally(1): exception(Exception)] access to parameter b3 | Finally.cs:209:31:209:46 | [finally: exception(Exception), finally(1): exception(Exception)] object creation of type ExceptionC | -| Finally.cs:209:21:209:22 | [finally: exception(Exception), finally(1): exception(ExceptionB)] access to parameter b3 | Finally.cs:209:31:209:46 | [finally: exception(Exception), finally(1): exception(ExceptionB)] object creation of type ExceptionC | -| Finally.cs:209:21:209:22 | [finally: exception(Exception)] access to parameter b3 | Finally.cs:209:31:209:46 | [finally: exception(Exception)] object creation of type ExceptionC | -| Finally.cs:209:21:209:22 | [finally: exception(Exception)] access to parameter b3 | Finally.cs:211:13:211:29 | [finally: exception(Exception)] ...; | -| Finally.cs:209:21:209:22 | [finally: exception(ExceptionA), finally(1): exception(Exception)] access to parameter b3 | Finally.cs:209:31:209:46 | [finally: exception(ExceptionA), finally(1): exception(Exception)] object creation of type ExceptionC | -| Finally.cs:209:21:209:22 | [finally: exception(ExceptionA), finally(1): exception(ExceptionB)] access to parameter b3 | Finally.cs:209:31:209:46 | [finally: exception(ExceptionA), finally(1): exception(ExceptionB)] object creation of type ExceptionC | -| Finally.cs:209:21:209:22 | [finally: exception(ExceptionA)] access to parameter b3 | Finally.cs:209:31:209:46 | [finally: exception(ExceptionA)] object creation of type ExceptionC | -| Finally.cs:209:21:209:22 | [finally: exception(ExceptionA)] access to parameter b3 | Finally.cs:211:13:211:29 | [finally: exception(ExceptionA)] ...; | +| Finally.cs:209:21:209:22 | [finally(1): exception] access to parameter b3 | Finally.cs:209:31:209:46 | [finally(1): exception] object creation of type ExceptionC | +| Finally.cs:209:21:209:22 | [finally: exception, finally(1): exception] access to parameter b3 | Finally.cs:209:31:209:46 | [finally: exception, finally(1): exception] object creation of type ExceptionC | +| Finally.cs:209:21:209:22 | [finally: exception] access to parameter b3 | Finally.cs:209:31:209:46 | [finally: exception] object creation of type ExceptionC | +| Finally.cs:209:21:209:22 | [finally: exception] access to parameter b3 | Finally.cs:211:13:211:29 | [finally: exception] ...; | | Finally.cs:209:21:209:22 | access to parameter b3 | Finally.cs:209:31:209:46 | object creation of type ExceptionC | | Finally.cs:209:21:209:22 | access to parameter b3 | Finally.cs:211:13:211:29 | ...; | -| Finally.cs:209:31:209:46 | [finally(1): exception(Exception)] object creation of type ExceptionC | Finally.cs:209:25:209:47 | [finally(1): exception(Exception)] throw ...; | -| Finally.cs:209:31:209:46 | [finally(1): exception(ExceptionB)] object creation of type ExceptionC | Finally.cs:209:25:209:47 | [finally(1): exception(ExceptionB)] throw ...; | -| Finally.cs:209:31:209:46 | [finally: exception(Exception), finally(1): exception(Exception)] object creation of type ExceptionC | Finally.cs:209:25:209:47 | [finally: exception(Exception), finally(1): exception(Exception)] throw ...; | -| Finally.cs:209:31:209:46 | [finally: exception(Exception), finally(1): exception(ExceptionB)] object creation of type ExceptionC | Finally.cs:209:25:209:47 | [finally: exception(Exception), finally(1): exception(ExceptionB)] throw ...; | -| Finally.cs:209:31:209:46 | [finally: exception(Exception)] object creation of type ExceptionC | Finally.cs:209:25:209:47 | [finally: exception(Exception)] throw ...; | -| Finally.cs:209:31:209:46 | [finally: exception(ExceptionA), finally(1): exception(Exception)] object creation of type ExceptionC | Finally.cs:209:25:209:47 | [finally: exception(ExceptionA), finally(1): exception(Exception)] throw ...; | -| Finally.cs:209:31:209:46 | [finally: exception(ExceptionA), finally(1): exception(ExceptionB)] object creation of type ExceptionC | Finally.cs:209:25:209:47 | [finally: exception(ExceptionA), finally(1): exception(ExceptionB)] throw ...; | -| Finally.cs:209:31:209:46 | [finally: exception(ExceptionA)] object creation of type ExceptionC | Finally.cs:209:25:209:47 | [finally: exception(ExceptionA)] throw ...; | +| Finally.cs:209:31:209:46 | [finally(1): exception] object creation of type ExceptionC | Finally.cs:209:25:209:47 | [finally(1): exception] throw ...; | +| Finally.cs:209:31:209:46 | [finally: exception, finally(1): exception] object creation of type ExceptionC | Finally.cs:209:25:209:47 | [finally: exception, finally(1): exception] throw ...; | +| Finally.cs:209:31:209:46 | [finally: exception] object creation of type ExceptionC | Finally.cs:209:25:209:47 | [finally: exception] throw ...; | | Finally.cs:209:31:209:46 | object creation of type ExceptionC | Finally.cs:209:25:209:47 | throw ...; | -| Finally.cs:211:13:211:16 | [finally: exception(Exception)] this access | Finally.cs:211:26:211:28 | [finally: exception(Exception)] "0" | -| Finally.cs:211:13:211:16 | [finally: exception(ExceptionA)] this access | Finally.cs:211:26:211:28 | [finally: exception(ExceptionA)] "0" | +| Finally.cs:211:13:211:16 | [finally: exception] this access | Finally.cs:211:26:211:28 | [finally: exception] "0" | | Finally.cs:211:13:211:16 | this access | Finally.cs:211:26:211:28 | "0" | | Finally.cs:211:13:211:28 | ... = ... | Finally.cs:213:9:213:25 | ...; | | Finally.cs:211:13:211:29 | ...; | Finally.cs:211:13:211:16 | this access | -| Finally.cs:211:13:211:29 | [finally: exception(Exception)] ...; | Finally.cs:211:13:211:16 | [finally: exception(Exception)] this access | -| Finally.cs:211:13:211:29 | [finally: exception(ExceptionA)] ...; | Finally.cs:211:13:211:16 | [finally: exception(ExceptionA)] this access | +| Finally.cs:211:13:211:29 | [finally: exception] ...; | Finally.cs:211:13:211:16 | [finally: exception] this access | | Finally.cs:211:26:211:28 | "0" | Finally.cs:211:13:211:28 | ... = ... | -| Finally.cs:211:26:211:28 | [finally: exception(Exception)] "0" | Finally.cs:211:13:211:28 | [finally: exception(Exception)] ... = ... | -| Finally.cs:211:26:211:28 | [finally: exception(ExceptionA)] "0" | Finally.cs:211:13:211:28 | [finally: exception(ExceptionA)] ... = ... | +| Finally.cs:211:26:211:28 | [finally: exception] "0" | Finally.cs:211:13:211:28 | [finally: exception] ... = ... | | Finally.cs:213:9:213:12 | this access | Finally.cs:213:22:213:24 | "1" | | Finally.cs:213:9:213:24 | ... = ... | Finally.cs:195:10:195:12 | exit M10 (normal) | | Finally.cs:213:9:213:25 | ...; | Finally.cs:213:9:213:12 | this access | @@ -2361,77 +2229,48 @@ dominance | Finally.cs:239:17:240:43 | if (...) ... | Finally.cs:239:21:239:22 | access to parameter b1 | | Finally.cs:239:21:239:22 | access to parameter b1 | Finally.cs:240:27:240:42 | object creation of type ExceptionA | | Finally.cs:239:21:239:22 | access to parameter b1 | Finally.cs:243:13:253:13 | {...} | -| Finally.cs:240:21:240:43 | throw ...; | Finally.cs:243:13:253:13 | [finally: exception(ExceptionA)] {...} | | Finally.cs:240:27:240:42 | object creation of type ExceptionA | Finally.cs:240:21:240:43 | throw ...; | -| Finally.cs:240:27:240:42 | object creation of type ExceptionA | Finally.cs:243:13:253:13 | [finally: exception(Exception)] {...} | -| Finally.cs:243:13:253:13 | [finally: exception(Exception)] {...} | Finally.cs:244:17:252:17 | [finally: exception(Exception)] try {...} ... | -| Finally.cs:243:13:253:13 | [finally: exception(ExceptionA)] {...} | Finally.cs:244:17:252:17 | [finally: exception(ExceptionA)] try {...} ... | +| Finally.cs:240:27:240:42 | object creation of type ExceptionA | Finally.cs:243:13:253:13 | [finally: exception] {...} | +| Finally.cs:243:13:253:13 | [finally: exception] {...} | Finally.cs:244:17:252:17 | [finally: exception] try {...} ... | | Finally.cs:243:13:253:13 | {...} | Finally.cs:244:17:252:17 | try {...} ... | -| Finally.cs:244:17:252:17 | [finally: exception(Exception)] try {...} ... | Finally.cs:245:17:248:17 | [finally: exception(Exception)] {...} | -| Finally.cs:244:17:252:17 | [finally: exception(ExceptionA)] try {...} ... | Finally.cs:245:17:248:17 | [finally: exception(ExceptionA)] {...} | +| Finally.cs:244:17:252:17 | [finally: exception] try {...} ... | Finally.cs:245:17:248:17 | [finally: exception] {...} | | Finally.cs:244:17:252:17 | try {...} ... | Finally.cs:245:17:248:17 | {...} | -| Finally.cs:245:17:248:17 | [finally: exception(Exception)] {...} | Finally.cs:246:21:247:47 | [finally: exception(Exception)] if (...) ... | -| Finally.cs:245:17:248:17 | [finally: exception(ExceptionA)] {...} | Finally.cs:246:21:247:47 | [finally: exception(ExceptionA)] if (...) ... | +| Finally.cs:245:17:248:17 | [finally: exception] {...} | Finally.cs:246:21:247:47 | [finally: exception] if (...) ... | | Finally.cs:245:17:248:17 | {...} | Finally.cs:246:21:247:47 | if (...) ... | -| Finally.cs:246:21:247:47 | [finally: exception(Exception)] if (...) ... | Finally.cs:246:25:246:26 | [finally: exception(Exception)] access to parameter b2 | -| Finally.cs:246:21:247:47 | [finally: exception(ExceptionA)] if (...) ... | Finally.cs:246:25:246:26 | [finally: exception(ExceptionA)] access to parameter b2 | +| Finally.cs:246:21:247:47 | [finally: exception] if (...) ... | Finally.cs:246:25:246:26 | [finally: exception] access to parameter b2 | | Finally.cs:246:21:247:47 | if (...) ... | Finally.cs:246:25:246:26 | access to parameter b2 | -| Finally.cs:246:25:246:26 | [finally: exception(Exception)] access to parameter b2 | Finally.cs:247:31:247:46 | [finally: exception(Exception)] object creation of type ExceptionA | -| Finally.cs:246:25:246:26 | [finally: exception(Exception)] access to parameter b2 | Finally.cs:250:17:252:17 | [finally: exception(Exception)] {...} | -| Finally.cs:246:25:246:26 | [finally: exception(ExceptionA)] access to parameter b2 | Finally.cs:247:31:247:46 | [finally: exception(ExceptionA)] object creation of type ExceptionA | -| Finally.cs:246:25:246:26 | [finally: exception(ExceptionA)] access to parameter b2 | Finally.cs:250:17:252:17 | [finally: exception(ExceptionA)] {...} | +| Finally.cs:246:25:246:26 | [finally: exception] access to parameter b2 | Finally.cs:247:31:247:46 | [finally: exception] object creation of type ExceptionA | +| Finally.cs:246:25:246:26 | [finally: exception] access to parameter b2 | Finally.cs:250:17:252:17 | [finally: exception] {...} | | Finally.cs:246:25:246:26 | access to parameter b2 | Finally.cs:247:31:247:46 | object creation of type ExceptionA | | Finally.cs:246:25:246:26 | access to parameter b2 | Finally.cs:250:17:252:17 | {...} | -| Finally.cs:247:25:247:47 | [finally: exception(Exception)] throw ...; | Finally.cs:250:17:252:17 | [finally: exception(Exception), finally(1): exception(ExceptionA)] {...} | -| Finally.cs:247:25:247:47 | [finally: exception(ExceptionA)] throw ...; | Finally.cs:250:17:252:17 | [finally: exception(ExceptionA), finally(1): exception(ExceptionA)] {...} | -| Finally.cs:247:25:247:47 | throw ...; | Finally.cs:250:17:252:17 | [finally(1): exception(ExceptionA)] {...} | -| Finally.cs:247:31:247:46 | [finally: exception(Exception)] object creation of type ExceptionA | Finally.cs:247:25:247:47 | [finally: exception(Exception)] throw ...; | -| Finally.cs:247:31:247:46 | [finally: exception(Exception)] object creation of type ExceptionA | Finally.cs:250:17:252:17 | [finally: exception(Exception), finally(1): exception(Exception)] {...} | -| Finally.cs:247:31:247:46 | [finally: exception(ExceptionA)] object creation of type ExceptionA | Finally.cs:247:25:247:47 | [finally: exception(ExceptionA)] throw ...; | -| Finally.cs:247:31:247:46 | [finally: exception(ExceptionA)] object creation of type ExceptionA | Finally.cs:250:17:252:17 | [finally: exception(ExceptionA), finally(1): exception(Exception)] {...} | +| Finally.cs:247:31:247:46 | [finally: exception] object creation of type ExceptionA | Finally.cs:247:25:247:47 | [finally: exception] throw ...; | +| Finally.cs:247:31:247:46 | [finally: exception] object creation of type ExceptionA | Finally.cs:250:17:252:17 | [finally: exception, finally(1): exception] {...} | | Finally.cs:247:31:247:46 | object creation of type ExceptionA | Finally.cs:247:25:247:47 | throw ...; | -| Finally.cs:247:31:247:46 | object creation of type ExceptionA | Finally.cs:250:17:252:17 | [finally(1): exception(Exception)] {...} | -| Finally.cs:250:17:252:17 | [finally(1): exception(Exception)] {...} | Finally.cs:251:21:251:55 | [finally(1): exception(Exception)] ...; | -| Finally.cs:250:17:252:17 | [finally(1): exception(ExceptionA)] {...} | Finally.cs:251:21:251:55 | [finally(1): exception(ExceptionA)] ...; | -| Finally.cs:250:17:252:17 | [finally: exception(Exception), finally(1): exception(Exception)] {...} | Finally.cs:251:21:251:55 | [finally: exception(Exception), finally(1): exception(Exception)] ...; | -| Finally.cs:250:17:252:17 | [finally: exception(Exception), finally(1): exception(ExceptionA)] {...} | Finally.cs:251:21:251:55 | [finally: exception(Exception), finally(1): exception(ExceptionA)] ...; | -| Finally.cs:250:17:252:17 | [finally: exception(Exception)] {...} | Finally.cs:251:21:251:55 | [finally: exception(Exception)] ...; | -| Finally.cs:250:17:252:17 | [finally: exception(ExceptionA), finally(1): exception(Exception)] {...} | Finally.cs:251:21:251:55 | [finally: exception(ExceptionA), finally(1): exception(Exception)] ...; | -| Finally.cs:250:17:252:17 | [finally: exception(ExceptionA), finally(1): exception(ExceptionA)] {...} | Finally.cs:251:21:251:55 | [finally: exception(ExceptionA), finally(1): exception(ExceptionA)] ...; | -| Finally.cs:250:17:252:17 | [finally: exception(ExceptionA)] {...} | Finally.cs:251:21:251:55 | [finally: exception(ExceptionA)] ...; | +| Finally.cs:247:31:247:46 | object creation of type ExceptionA | Finally.cs:250:17:252:17 | [finally(1): exception] {...} | +| Finally.cs:250:17:252:17 | [finally(1): exception] {...} | Finally.cs:251:21:251:55 | [finally(1): exception] ...; | +| Finally.cs:250:17:252:17 | [finally: exception, finally(1): exception] {...} | Finally.cs:251:21:251:55 | [finally: exception, finally(1): exception] ...; | +| Finally.cs:250:17:252:17 | [finally: exception] {...} | Finally.cs:251:21:251:55 | [finally: exception] ...; | | Finally.cs:250:17:252:17 | {...} | Finally.cs:251:21:251:55 | ...; | | Finally.cs:251:21:251:54 | call to method WriteLine | Finally.cs:254:13:254:45 | ...; | | Finally.cs:251:21:251:55 | ...; | Finally.cs:251:39:251:53 | "Inner finally" | -| Finally.cs:251:21:251:55 | [finally(1): exception(Exception)] ...; | Finally.cs:251:39:251:53 | [finally(1): exception(Exception)] "Inner finally" | -| Finally.cs:251:21:251:55 | [finally(1): exception(ExceptionA)] ...; | Finally.cs:251:39:251:53 | [finally(1): exception(ExceptionA)] "Inner finally" | -| Finally.cs:251:21:251:55 | [finally: exception(Exception), finally(1): exception(Exception)] ...; | Finally.cs:251:39:251:53 | [finally: exception(Exception), finally(1): exception(Exception)] "Inner finally" | -| Finally.cs:251:21:251:55 | [finally: exception(Exception), finally(1): exception(ExceptionA)] ...; | Finally.cs:251:39:251:53 | [finally: exception(Exception), finally(1): exception(ExceptionA)] "Inner finally" | -| Finally.cs:251:21:251:55 | [finally: exception(Exception)] ...; | Finally.cs:251:39:251:53 | [finally: exception(Exception)] "Inner finally" | -| Finally.cs:251:21:251:55 | [finally: exception(ExceptionA), finally(1): exception(Exception)] ...; | Finally.cs:251:39:251:53 | [finally: exception(ExceptionA), finally(1): exception(Exception)] "Inner finally" | -| Finally.cs:251:21:251:55 | [finally: exception(ExceptionA), finally(1): exception(ExceptionA)] ...; | Finally.cs:251:39:251:53 | [finally: exception(ExceptionA), finally(1): exception(ExceptionA)] "Inner finally" | -| Finally.cs:251:21:251:55 | [finally: exception(ExceptionA)] ...; | Finally.cs:251:39:251:53 | [finally: exception(ExceptionA)] "Inner finally" | +| Finally.cs:251:21:251:55 | [finally(1): exception] ...; | Finally.cs:251:39:251:53 | [finally(1): exception] "Inner finally" | +| Finally.cs:251:21:251:55 | [finally: exception, finally(1): exception] ...; | Finally.cs:251:39:251:53 | [finally: exception, finally(1): exception] "Inner finally" | +| Finally.cs:251:21:251:55 | [finally: exception] ...; | Finally.cs:251:39:251:53 | [finally: exception] "Inner finally" | | Finally.cs:251:39:251:53 | "Inner finally" | Finally.cs:251:21:251:54 | call to method WriteLine | -| Finally.cs:251:39:251:53 | [finally(1): exception(Exception)] "Inner finally" | Finally.cs:251:21:251:54 | [finally(1): exception(Exception)] call to method WriteLine | -| Finally.cs:251:39:251:53 | [finally(1): exception(ExceptionA)] "Inner finally" | Finally.cs:251:21:251:54 | [finally(1): exception(ExceptionA)] call to method WriteLine | -| Finally.cs:251:39:251:53 | [finally: exception(Exception), finally(1): exception(Exception)] "Inner finally" | Finally.cs:251:21:251:54 | [finally: exception(Exception), finally(1): exception(Exception)] call to method WriteLine | -| Finally.cs:251:39:251:53 | [finally: exception(Exception), finally(1): exception(ExceptionA)] "Inner finally" | Finally.cs:251:21:251:54 | [finally: exception(Exception), finally(1): exception(ExceptionA)] call to method WriteLine | -| Finally.cs:251:39:251:53 | [finally: exception(Exception)] "Inner finally" | Finally.cs:251:21:251:54 | [finally: exception(Exception)] call to method WriteLine | -| Finally.cs:251:39:251:53 | [finally: exception(ExceptionA), finally(1): exception(Exception)] "Inner finally" | Finally.cs:251:21:251:54 | [finally: exception(ExceptionA), finally(1): exception(Exception)] call to method WriteLine | -| Finally.cs:251:39:251:53 | [finally: exception(ExceptionA), finally(1): exception(ExceptionA)] "Inner finally" | Finally.cs:251:21:251:54 | [finally: exception(ExceptionA), finally(1): exception(ExceptionA)] call to method WriteLine | -| Finally.cs:251:39:251:53 | [finally: exception(ExceptionA)] "Inner finally" | Finally.cs:251:21:251:54 | [finally: exception(ExceptionA)] call to method WriteLine | +| Finally.cs:251:39:251:53 | [finally(1): exception] "Inner finally" | Finally.cs:251:21:251:54 | [finally(1): exception] call to method WriteLine | +| Finally.cs:251:39:251:53 | [finally: exception, finally(1): exception] "Inner finally" | Finally.cs:251:21:251:54 | [finally: exception, finally(1): exception] call to method WriteLine | +| Finally.cs:251:39:251:53 | [finally: exception] "Inner finally" | Finally.cs:251:21:251:54 | [finally: exception] call to method WriteLine | | Finally.cs:254:13:254:44 | call to method WriteLine | Finally.cs:257:9:259:9 | {...} | | Finally.cs:254:13:254:45 | ...; | Finally.cs:254:31:254:43 | "Mid finally" | | Finally.cs:254:31:254:43 | "Mid finally" | Finally.cs:254:13:254:44 | call to method WriteLine | -| Finally.cs:257:9:259:9 | [finally: exception(Exception)] {...} | Finally.cs:258:13:258:47 | [finally: exception(Exception)] ...; | -| Finally.cs:257:9:259:9 | [finally: exception(ExceptionA)] {...} | Finally.cs:258:13:258:47 | [finally: exception(ExceptionA)] ...; | +| Finally.cs:257:9:259:9 | [finally: exception] {...} | Finally.cs:258:13:258:47 | [finally: exception] ...; | | Finally.cs:257:9:259:9 | {...} | Finally.cs:258:13:258:47 | ...; | +| Finally.cs:258:13:258:46 | [finally: exception] call to method WriteLine | Finally.cs:233:10:233:12 | exit M12 (abnormal) | | Finally.cs:258:13:258:46 | call to method WriteLine | Finally.cs:260:9:260:34 | ...; | | Finally.cs:258:13:258:47 | ...; | Finally.cs:258:31:258:45 | "Outer finally" | -| Finally.cs:258:13:258:47 | [finally: exception(Exception)] ...; | Finally.cs:258:31:258:45 | [finally: exception(Exception)] "Outer finally" | -| Finally.cs:258:13:258:47 | [finally: exception(ExceptionA)] ...; | Finally.cs:258:31:258:45 | [finally: exception(ExceptionA)] "Outer finally" | +| Finally.cs:258:13:258:47 | [finally: exception] ...; | Finally.cs:258:31:258:45 | [finally: exception] "Outer finally" | | Finally.cs:258:31:258:45 | "Outer finally" | Finally.cs:258:13:258:46 | call to method WriteLine | -| Finally.cs:258:31:258:45 | [finally: exception(Exception)] "Outer finally" | Finally.cs:258:13:258:46 | [finally: exception(Exception)] call to method WriteLine | -| Finally.cs:258:31:258:45 | [finally: exception(ExceptionA)] "Outer finally" | Finally.cs:258:13:258:46 | [finally: exception(ExceptionA)] call to method WriteLine | +| Finally.cs:258:31:258:45 | [finally: exception] "Outer finally" | Finally.cs:258:13:258:46 | [finally: exception] call to method WriteLine | | Finally.cs:260:9:260:33 | call to method WriteLine | Finally.cs:233:10:233:12 | exit M12 (normal) | | Finally.cs:260:9:260:34 | ...; | Finally.cs:260:27:260:32 | "Done" | | Finally.cs:260:27:260:32 | "Done" | Finally.cs:260:9:260:33 | call to method WriteLine | @@ -2439,28 +2278,28 @@ dominance | Finally.cs:264:5:274:5 | {...} | Finally.cs:265:9:273:9 | try {...} ... | | Finally.cs:265:9:273:9 | try {...} ... | Finally.cs:266:9:268:9 | {...} | | Finally.cs:266:9:268:9 | {...} | Finally.cs:267:13:267:35 | ...; | -| Finally.cs:267:13:267:34 | call to method WriteLine | Finally.cs:270:9:273:9 | [finally: exception(Exception)] {...} | +| Finally.cs:267:13:267:34 | call to method WriteLine | Finally.cs:270:9:273:9 | [finally: exception] {...} | | Finally.cs:267:13:267:34 | call to method WriteLine | Finally.cs:270:9:273:9 | {...} | | Finally.cs:267:13:267:35 | ...; | Finally.cs:267:31:267:33 | "1" | | Finally.cs:267:31:267:33 | "1" | Finally.cs:267:13:267:34 | call to method WriteLine | -| Finally.cs:270:9:273:9 | [finally: exception(Exception)] {...} | Finally.cs:271:13:271:35 | [finally: exception(Exception)] ...; | +| Finally.cs:270:9:273:9 | [finally: exception] {...} | Finally.cs:271:13:271:35 | [finally: exception] ...; | | Finally.cs:270:9:273:9 | {...} | Finally.cs:271:13:271:35 | ...; | -| Finally.cs:271:13:271:34 | [finally: exception(Exception)] call to method WriteLine | Finally.cs:272:13:272:19 | [finally: exception(Exception)] ...; | +| Finally.cs:271:13:271:34 | [finally: exception] call to method WriteLine | Finally.cs:272:13:272:19 | [finally: exception] ...; | | Finally.cs:271:13:271:34 | call to method WriteLine | Finally.cs:272:13:272:19 | ...; | | Finally.cs:271:13:271:35 | ...; | Finally.cs:271:31:271:33 | "3" | -| Finally.cs:271:13:271:35 | [finally: exception(Exception)] ...; | Finally.cs:271:31:271:33 | [finally: exception(Exception)] "3" | +| Finally.cs:271:13:271:35 | [finally: exception] ...; | Finally.cs:271:31:271:33 | [finally: exception] "3" | | Finally.cs:271:31:271:33 | "3" | Finally.cs:271:13:271:34 | call to method WriteLine | -| Finally.cs:271:31:271:33 | [finally: exception(Exception)] "3" | Finally.cs:271:13:271:34 | [finally: exception(Exception)] call to method WriteLine | -| Finally.cs:272:13:272:13 | [finally: exception(Exception)] access to parameter i | Finally.cs:272:18:272:18 | [finally: exception(Exception)] 3 | +| Finally.cs:271:31:271:33 | [finally: exception] "3" | Finally.cs:271:13:271:34 | [finally: exception] call to method WriteLine | +| Finally.cs:272:13:272:13 | [finally: exception] access to parameter i | Finally.cs:272:18:272:18 | [finally: exception] 3 | | Finally.cs:272:13:272:13 | access to parameter i | Finally.cs:272:18:272:18 | 3 | | Finally.cs:272:13:272:18 | ... + ... | Finally.cs:272:13:272:18 | ... = ... | | Finally.cs:272:13:272:18 | ... = ... | Finally.cs:263:10:263:12 | exit M13 (normal) | -| Finally.cs:272:13:272:18 | [finally: exception(Exception)] ... + ... | Finally.cs:272:13:272:18 | [finally: exception(Exception)] ... = ... | -| Finally.cs:272:13:272:18 | [finally: exception(Exception)] ... = ... | Finally.cs:263:10:263:12 | exit M13 (abnormal) | +| Finally.cs:272:13:272:18 | [finally: exception] ... + ... | Finally.cs:272:13:272:18 | [finally: exception] ... = ... | +| Finally.cs:272:13:272:18 | [finally: exception] ... = ... | Finally.cs:263:10:263:12 | exit M13 (abnormal) | | Finally.cs:272:13:272:19 | ...; | Finally.cs:272:13:272:13 | access to parameter i | -| Finally.cs:272:13:272:19 | [finally: exception(Exception)] ...; | Finally.cs:272:13:272:13 | [finally: exception(Exception)] access to parameter i | +| Finally.cs:272:13:272:19 | [finally: exception] ...; | Finally.cs:272:13:272:13 | [finally: exception] access to parameter i | | Finally.cs:272:18:272:18 | 3 | Finally.cs:272:13:272:18 | ... + ... | -| Finally.cs:272:18:272:18 | [finally: exception(Exception)] 3 | Finally.cs:272:13:272:18 | [finally: exception(Exception)] ... + ... | +| Finally.cs:272:18:272:18 | [finally: exception] 3 | Finally.cs:272:13:272:18 | [finally: exception] ... + ... | | Foreach.cs:4:7:4:13 | call to constructor Object | Foreach.cs:4:7:4:13 | {...} | | Foreach.cs:4:7:4:13 | enter Foreach | Foreach.cs:4:7:4:13 | call to constructor Object | | Foreach.cs:4:7:4:13 | exit Foreach (normal) | Foreach.cs:4:7:4:13 | exit Foreach | @@ -5445,11 +5284,11 @@ postDominance | CompileTimeOperators.cs:30:9:38:9 | try {...} ... | CompileTimeOperators.cs:29:5:41:5 | {...} | | CompileTimeOperators.cs:31:9:34:9 | {...} | CompileTimeOperators.cs:30:9:38:9 | try {...} ... | | CompileTimeOperators.cs:32:13:32:21 | goto ...; | CompileTimeOperators.cs:31:9:34:9 | {...} | -| CompileTimeOperators.cs:36:9:38:9 | [finally: goto(End)] {...} | CompileTimeOperators.cs:32:13:32:21 | goto ...; | -| CompileTimeOperators.cs:37:13:37:40 | [finally: goto(End)] call to method WriteLine | CompileTimeOperators.cs:37:31:37:39 | [finally: goto(End)] "Finally" | -| CompileTimeOperators.cs:37:13:37:41 | [finally: goto(End)] ...; | CompileTimeOperators.cs:36:9:38:9 | [finally: goto(End)] {...} | -| CompileTimeOperators.cs:37:31:37:39 | [finally: goto(End)] "Finally" | CompileTimeOperators.cs:37:13:37:41 | [finally: goto(End)] ...; | -| CompileTimeOperators.cs:40:9:40:11 | End: | CompileTimeOperators.cs:37:13:37:40 | [finally: goto(End)] call to method WriteLine | +| CompileTimeOperators.cs:36:9:38:9 | [finally: goto] {...} | CompileTimeOperators.cs:32:13:32:21 | goto ...; | +| CompileTimeOperators.cs:37:13:37:40 | [finally: goto] call to method WriteLine | CompileTimeOperators.cs:37:31:37:39 | [finally: goto] "Finally" | +| CompileTimeOperators.cs:37:13:37:41 | [finally: goto] ...; | CompileTimeOperators.cs:36:9:38:9 | [finally: goto] {...} | +| CompileTimeOperators.cs:37:31:37:39 | [finally: goto] "Finally" | CompileTimeOperators.cs:37:13:37:41 | [finally: goto] ...; | +| CompileTimeOperators.cs:40:9:40:11 | End: | CompileTimeOperators.cs:37:13:37:40 | [finally: goto] call to method WriteLine | | CompileTimeOperators.cs:40:14:40:37 | call to method WriteLine | CompileTimeOperators.cs:40:32:40:36 | "End" | | CompileTimeOperators.cs:40:14:40:38 | ...; | CompileTimeOperators.cs:40:9:40:11 | End: | | CompileTimeOperators.cs:40:32:40:36 | "End" | CompileTimeOperators.cs:40:14:40:38 | ...; | @@ -6094,7 +5933,7 @@ postDominance | Finally.cs:3:14:3:20 | exit Finally | Finally.cs:3:14:3:20 | exit Finally (normal) | | Finally.cs:3:14:3:20 | exit Finally (normal) | Finally.cs:3:14:3:20 | {...} | | Finally.cs:3:14:3:20 | {...} | Finally.cs:3:14:3:20 | call to constructor Object | -| Finally.cs:7:10:7:11 | exit M1 (abnormal) | Finally.cs:15:13:15:40 | [finally: exception(Exception)] call to method WriteLine | +| Finally.cs:7:10:7:11 | exit M1 (abnormal) | Finally.cs:15:13:15:40 | [finally: exception] call to method WriteLine | | Finally.cs:7:10:7:11 | exit M1 (normal) | Finally.cs:15:13:15:40 | call to method WriteLine | | Finally.cs:8:5:17:5 | {...} | Finally.cs:7:10:7:11 | enter M1 | | Finally.cs:9:9:16:9 | try {...} ... | Finally.cs:8:5:17:5 | {...} | @@ -6103,12 +5942,13 @@ postDominance | Finally.cs:11:13:11:38 | ...; | Finally.cs:10:9:12:9 | {...} | | Finally.cs:11:31:11:36 | "Try1" | Finally.cs:11:13:11:38 | ...; | | Finally.cs:14:9:16:9 | {...} | Finally.cs:11:13:11:37 | call to method WriteLine | -| Finally.cs:15:13:15:40 | [finally: exception(Exception)] call to method WriteLine | Finally.cs:15:31:15:39 | [finally: exception(Exception)] "Finally" | +| Finally.cs:15:13:15:40 | [finally: exception] call to method WriteLine | Finally.cs:15:31:15:39 | [finally: exception] "Finally" | | Finally.cs:15:13:15:40 | call to method WriteLine | Finally.cs:15:31:15:39 | "Finally" | | Finally.cs:15:13:15:41 | ...; | Finally.cs:14:9:16:9 | {...} | -| Finally.cs:15:13:15:41 | [finally: exception(Exception)] ...; | Finally.cs:14:9:16:9 | [finally: exception(Exception)] {...} | +| Finally.cs:15:13:15:41 | [finally: exception] ...; | Finally.cs:14:9:16:9 | [finally: exception] {...} | | Finally.cs:15:31:15:39 | "Finally" | Finally.cs:15:13:15:41 | ...; | -| Finally.cs:15:31:15:39 | [finally: exception(Exception)] "Finally" | Finally.cs:15:13:15:41 | [finally: exception(Exception)] ...; | +| Finally.cs:15:31:15:39 | [finally: exception] "Finally" | Finally.cs:15:13:15:41 | [finally: exception] ...; | +| Finally.cs:19:10:19:11 | exit M2 (abnormal) | Finally.cs:50:13:50:40 | [finally: exception] call to method WriteLine | | Finally.cs:19:10:19:11 | exit M2 (normal) | Finally.cs:50:13:50:40 | [finally: return] call to method WriteLine | | Finally.cs:19:10:19:11 | exit M2 (normal) | Finally.cs:50:13:50:40 | call to method WriteLine | | Finally.cs:20:5:52:5 | {...} | Finally.cs:19:10:19:11 | enter M2 | @@ -6125,28 +5965,24 @@ postDominance | Finally.cs:33:13:35:13 | {...} | Finally.cs:32:13:39:13 | try {...} ... | | Finally.cs:34:17:34:32 | if (...) ... | Finally.cs:33:13:35:13 | {...} | | Finally.cs:34:21:34:24 | true | Finally.cs:34:17:34:32 | if (...) ... | -| Finally.cs:37:13:39:13 | [finally: exception(ArgumentException)] {...} | Finally.cs:34:27:34:32 | throw ...; | -| Finally.cs:38:17:38:44 | [finally: exception(ArgumentException)] throw ...; | Finally.cs:38:23:38:43 | [finally: exception(ArgumentException)] object creation of type Exception | -| Finally.cs:38:23:38:43 | [finally: exception(ArgumentException)] object creation of type Exception | Finally.cs:38:37:38:42 | [finally: exception(ArgumentException)] "Boo!" | -| Finally.cs:38:37:38:42 | [finally: exception(ArgumentException)] "Boo!" | Finally.cs:37:13:39:13 | [finally: exception(ArgumentException)] {...} | +| Finally.cs:37:13:39:13 | [finally: exception] {...} | Finally.cs:34:27:34:32 | throw ...; | +| Finally.cs:38:17:38:44 | [finally: exception] throw ...; | Finally.cs:38:23:38:43 | [finally: exception] object creation of type Exception | +| Finally.cs:38:23:38:43 | [finally: exception] object creation of type Exception | Finally.cs:38:37:38:42 | [finally: exception] "Boo!" | +| Finally.cs:38:37:38:42 | [finally: exception] "Boo!" | Finally.cs:37:13:39:13 | [finally: exception] {...} | | Finally.cs:41:9:43:9 | [exception: Exception] catch (...) {...} | Finally.cs:30:9:40:9 | [exception: Exception] catch (...) {...} | | Finally.cs:42:9:43:9 | {...} | Finally.cs:41:9:43:9 | [exception: Exception] catch (...) {...} | -| Finally.cs:49:9:51:9 | [finally: exception(Exception)] {...} | Finally.cs:38:17:38:44 | [finally: exception(ArgumentException)] throw ...; | -| Finally.cs:49:9:51:9 | [finally: exception(IOException)] {...} | Finally.cs:28:13:28:18 | throw ...; | | Finally.cs:49:9:51:9 | [finally: return] {...} | Finally.cs:24:13:24:19 | return ...; | | Finally.cs:49:9:51:9 | {...} | Finally.cs:42:9:43:9 | {...} | -| Finally.cs:50:13:50:40 | [finally: exception(Exception)] call to method WriteLine | Finally.cs:50:31:50:39 | [finally: exception(Exception)] "Finally" | -| Finally.cs:50:13:50:40 | [finally: exception(IOException)] call to method WriteLine | Finally.cs:50:31:50:39 | [finally: exception(IOException)] "Finally" | +| Finally.cs:50:13:50:40 | [finally: exception] call to method WriteLine | Finally.cs:50:31:50:39 | [finally: exception] "Finally" | | Finally.cs:50:13:50:40 | [finally: return] call to method WriteLine | Finally.cs:50:31:50:39 | [finally: return] "Finally" | | Finally.cs:50:13:50:40 | call to method WriteLine | Finally.cs:50:31:50:39 | "Finally" | | Finally.cs:50:13:50:41 | ...; | Finally.cs:49:9:51:9 | {...} | -| Finally.cs:50:13:50:41 | [finally: exception(Exception)] ...; | Finally.cs:49:9:51:9 | [finally: exception(Exception)] {...} | -| Finally.cs:50:13:50:41 | [finally: exception(IOException)] ...; | Finally.cs:49:9:51:9 | [finally: exception(IOException)] {...} | +| Finally.cs:50:13:50:41 | [finally: exception] ...; | Finally.cs:49:9:51:9 | [finally: exception] {...} | | Finally.cs:50:13:50:41 | [finally: return] ...; | Finally.cs:49:9:51:9 | [finally: return] {...} | | Finally.cs:50:31:50:39 | "Finally" | Finally.cs:50:13:50:41 | ...; | -| Finally.cs:50:31:50:39 | [finally: exception(Exception)] "Finally" | Finally.cs:50:13:50:41 | [finally: exception(Exception)] ...; | -| Finally.cs:50:31:50:39 | [finally: exception(IOException)] "Finally" | Finally.cs:50:13:50:41 | [finally: exception(IOException)] ...; | +| Finally.cs:50:31:50:39 | [finally: exception] "Finally" | Finally.cs:50:13:50:41 | [finally: exception] ...; | | Finally.cs:50:31:50:39 | [finally: return] "Finally" | Finally.cs:50:13:50:41 | [finally: return] ...; | +| Finally.cs:54:10:54:11 | exit M3 (abnormal) | Finally.cs:70:13:70:40 | [finally: exception] call to method WriteLine | | Finally.cs:54:10:54:11 | exit M3 (normal) | Finally.cs:70:13:70:40 | [finally: return] call to method WriteLine | | Finally.cs:54:10:54:11 | exit M3 (normal) | Finally.cs:70:13:70:40 | call to method WriteLine | | Finally.cs:55:5:72:5 | {...} | Finally.cs:54:10:54:11 | enter M3 | @@ -6164,20 +6000,16 @@ postDominance | Finally.cs:65:35:65:51 | [exception: Exception] ... != ... | Finally.cs:65:48:65:51 | [exception: Exception] null | | Finally.cs:65:48:65:51 | [exception: Exception] null | Finally.cs:65:35:65:43 | [exception: Exception] access to property Message | | Finally.cs:66:9:67:9 | {...} | Finally.cs:65:35:65:51 | [exception: Exception] ... != ... | -| Finally.cs:69:9:71:9 | [finally: exception(IOException)] {...} | Finally.cs:63:13:63:18 | throw ...; | | Finally.cs:69:9:71:9 | [finally: return] {...} | Finally.cs:59:13:59:19 | return ...; | | Finally.cs:69:9:71:9 | {...} | Finally.cs:66:9:67:9 | {...} | -| Finally.cs:70:13:70:40 | [finally: exception(Exception)] call to method WriteLine | Finally.cs:70:31:70:39 | [finally: exception(Exception)] "Finally" | -| Finally.cs:70:13:70:40 | [finally: exception(IOException)] call to method WriteLine | Finally.cs:70:31:70:39 | [finally: exception(IOException)] "Finally" | +| Finally.cs:70:13:70:40 | [finally: exception] call to method WriteLine | Finally.cs:70:31:70:39 | [finally: exception] "Finally" | | Finally.cs:70:13:70:40 | [finally: return] call to method WriteLine | Finally.cs:70:31:70:39 | [finally: return] "Finally" | | Finally.cs:70:13:70:40 | call to method WriteLine | Finally.cs:70:31:70:39 | "Finally" | | Finally.cs:70:13:70:41 | ...; | Finally.cs:69:9:71:9 | {...} | -| Finally.cs:70:13:70:41 | [finally: exception(Exception)] ...; | Finally.cs:69:9:71:9 | [finally: exception(Exception)] {...} | -| Finally.cs:70:13:70:41 | [finally: exception(IOException)] ...; | Finally.cs:69:9:71:9 | [finally: exception(IOException)] {...} | +| Finally.cs:70:13:70:41 | [finally: exception] ...; | Finally.cs:69:9:71:9 | [finally: exception] {...} | | Finally.cs:70:13:70:41 | [finally: return] ...; | Finally.cs:69:9:71:9 | [finally: return] {...} | | Finally.cs:70:31:70:39 | "Finally" | Finally.cs:70:13:70:41 | ...; | -| Finally.cs:70:31:70:39 | [finally: exception(Exception)] "Finally" | Finally.cs:70:13:70:41 | [finally: exception(Exception)] ...; | -| Finally.cs:70:31:70:39 | [finally: exception(IOException)] "Finally" | Finally.cs:70:13:70:41 | [finally: exception(IOException)] ...; | +| Finally.cs:70:31:70:39 | [finally: exception] "Finally" | Finally.cs:70:13:70:41 | [finally: exception] ...; | | Finally.cs:70:31:70:39 | [finally: return] "Finally" | Finally.cs:70:13:70:41 | [finally: return] ...; | | Finally.cs:74:10:74:11 | exit M4 (normal) | Finally.cs:77:16:77:20 | ... > ... | | Finally.cs:74:10:74:11 | exit M4 (normal) | Finally.cs:97:21:97:23 | [finally: break] ...-- | @@ -6235,29 +6067,29 @@ postDominance | Finally.cs:96:17:98:17 | [finally: continue] {...} | Finally.cs:92:25:92:30 | [finally: continue] ... == ... | | Finally.cs:96:17:98:17 | [finally: return] {...} | Finally.cs:92:25:92:30 | [finally: return] ... == ... | | Finally.cs:96:17:98:17 | {...} | Finally.cs:92:25:92:30 | ... == ... | -| Finally.cs:97:21:97:21 | [finally(1): exception(Exception)] access to local variable i | Finally.cs:97:21:97:24 | [finally(1): exception(Exception)] ...; | -| Finally.cs:97:21:97:21 | [finally: break, finally(1): exception(Exception)] access to local variable i | Finally.cs:97:21:97:24 | [finally: break, finally(1): exception(Exception)] ...; | +| Finally.cs:97:21:97:21 | [finally(1): exception] access to local variable i | Finally.cs:97:21:97:24 | [finally(1): exception] ...; | +| Finally.cs:97:21:97:21 | [finally: break, finally(1): exception] access to local variable i | Finally.cs:97:21:97:24 | [finally: break, finally(1): exception] ...; | | Finally.cs:97:21:97:21 | [finally: break] access to local variable i | Finally.cs:97:21:97:24 | [finally: break] ...; | -| Finally.cs:97:21:97:21 | [finally: continue, finally(1): exception(Exception)] access to local variable i | Finally.cs:97:21:97:24 | [finally: continue, finally(1): exception(Exception)] ...; | +| Finally.cs:97:21:97:21 | [finally: continue, finally(1): exception] access to local variable i | Finally.cs:97:21:97:24 | [finally: continue, finally(1): exception] ...; | | Finally.cs:97:21:97:21 | [finally: continue] access to local variable i | Finally.cs:97:21:97:24 | [finally: continue] ...; | -| Finally.cs:97:21:97:21 | [finally: return, finally(1): exception(Exception)] access to local variable i | Finally.cs:97:21:97:24 | [finally: return, finally(1): exception(Exception)] ...; | +| Finally.cs:97:21:97:21 | [finally: return, finally(1): exception] access to local variable i | Finally.cs:97:21:97:24 | [finally: return, finally(1): exception] ...; | | Finally.cs:97:21:97:21 | [finally: return] access to local variable i | Finally.cs:97:21:97:24 | [finally: return] ...; | | Finally.cs:97:21:97:21 | access to local variable i | Finally.cs:97:21:97:24 | ...; | | Finally.cs:97:21:97:23 | ...-- | Finally.cs:97:21:97:21 | access to local variable i | -| Finally.cs:97:21:97:23 | [finally(1): exception(Exception)] ...-- | Finally.cs:97:21:97:21 | [finally(1): exception(Exception)] access to local variable i | -| Finally.cs:97:21:97:23 | [finally: break, finally(1): exception(Exception)] ...-- | Finally.cs:97:21:97:21 | [finally: break, finally(1): exception(Exception)] access to local variable i | +| Finally.cs:97:21:97:23 | [finally(1): exception] ...-- | Finally.cs:97:21:97:21 | [finally(1): exception] access to local variable i | +| Finally.cs:97:21:97:23 | [finally: break, finally(1): exception] ...-- | Finally.cs:97:21:97:21 | [finally: break, finally(1): exception] access to local variable i | | Finally.cs:97:21:97:23 | [finally: break] ...-- | Finally.cs:97:21:97:21 | [finally: break] access to local variable i | -| Finally.cs:97:21:97:23 | [finally: continue, finally(1): exception(Exception)] ...-- | Finally.cs:97:21:97:21 | [finally: continue, finally(1): exception(Exception)] access to local variable i | +| Finally.cs:97:21:97:23 | [finally: continue, finally(1): exception] ...-- | Finally.cs:97:21:97:21 | [finally: continue, finally(1): exception] access to local variable i | | Finally.cs:97:21:97:23 | [finally: continue] ...-- | Finally.cs:97:21:97:21 | [finally: continue] access to local variable i | -| Finally.cs:97:21:97:23 | [finally: return, finally(1): exception(Exception)] ...-- | Finally.cs:97:21:97:21 | [finally: return, finally(1): exception(Exception)] access to local variable i | +| Finally.cs:97:21:97:23 | [finally: return, finally(1): exception] ...-- | Finally.cs:97:21:97:21 | [finally: return, finally(1): exception] access to local variable i | | Finally.cs:97:21:97:23 | [finally: return] ...-- | Finally.cs:97:21:97:21 | [finally: return] access to local variable i | | Finally.cs:97:21:97:24 | ...; | Finally.cs:96:17:98:17 | {...} | -| Finally.cs:97:21:97:24 | [finally(1): exception(Exception)] ...; | Finally.cs:96:17:98:17 | [finally(1): exception(Exception)] {...} | -| Finally.cs:97:21:97:24 | [finally: break, finally(1): exception(Exception)] ...; | Finally.cs:96:17:98:17 | [finally: break, finally(1): exception(Exception)] {...} | +| Finally.cs:97:21:97:24 | [finally(1): exception] ...; | Finally.cs:96:17:98:17 | [finally(1): exception] {...} | +| Finally.cs:97:21:97:24 | [finally: break, finally(1): exception] ...; | Finally.cs:96:17:98:17 | [finally: break, finally(1): exception] {...} | | Finally.cs:97:21:97:24 | [finally: break] ...; | Finally.cs:96:17:98:17 | [finally: break] {...} | -| Finally.cs:97:21:97:24 | [finally: continue, finally(1): exception(Exception)] ...; | Finally.cs:96:17:98:17 | [finally: continue, finally(1): exception(Exception)] {...} | +| Finally.cs:97:21:97:24 | [finally: continue, finally(1): exception] ...; | Finally.cs:96:17:98:17 | [finally: continue, finally(1): exception] {...} | | Finally.cs:97:21:97:24 | [finally: continue] ...; | Finally.cs:96:17:98:17 | [finally: continue] {...} | -| Finally.cs:97:21:97:24 | [finally: return, finally(1): exception(Exception)] ...; | Finally.cs:96:17:98:17 | [finally: return, finally(1): exception(Exception)] {...} | +| Finally.cs:97:21:97:24 | [finally: return, finally(1): exception] ...; | Finally.cs:96:17:98:17 | [finally: return, finally(1): exception] {...} | | Finally.cs:97:21:97:24 | [finally: return] ...; | Finally.cs:96:17:98:17 | [finally: return] {...} | | Finally.cs:103:10:103:11 | exit M5 (normal) | Finally.cs:116:17:116:32 | ... > ... | | Finally.cs:103:10:103:11 | exit M5 (normal) | Finally.cs:116:17:116:32 | [finally: return] ... > ... | @@ -6277,52 +6109,33 @@ postDominance | Finally.cs:109:17:109:28 | access to property Length | Finally.cs:109:17:109:21 | access to field Field | | Finally.cs:109:17:109:33 | ... == ... | Finally.cs:109:33:109:33 | 1 | | Finally.cs:109:33:109:33 | 1 | Finally.cs:109:17:109:28 | access to property Length | -| Finally.cs:113:9:118:9 | [finally: exception(OutOfMemoryException)] {...} | Finally.cs:110:17:110:49 | throw ...; | | Finally.cs:113:9:118:9 | [finally: return] {...} | Finally.cs:108:17:108:23 | return ...; | | Finally.cs:113:9:118:9 | {...} | Finally.cs:109:17:109:33 | ... == ... | -| Finally.cs:114:13:115:41 | [finally: exception(Exception)] if (...) ... | Finally.cs:113:9:118:9 | [finally: exception(Exception)] {...} | -| Finally.cs:114:13:115:41 | [finally: exception(NullReferenceException)] if (...) ... | Finally.cs:113:9:118:9 | [finally: exception(NullReferenceException)] {...} | -| Finally.cs:114:13:115:41 | [finally: exception(OutOfMemoryException)] if (...) ... | Finally.cs:113:9:118:9 | [finally: exception(OutOfMemoryException)] {...} | +| Finally.cs:114:13:115:41 | [finally: exception] if (...) ... | Finally.cs:113:9:118:9 | [finally: exception] {...} | | Finally.cs:114:13:115:41 | [finally: return] if (...) ... | Finally.cs:113:9:118:9 | [finally: return] {...} | | Finally.cs:114:13:115:41 | if (...) ... | Finally.cs:113:9:118:9 | {...} | -| Finally.cs:114:19:114:23 | [finally: exception(Exception)] access to field Field | Finally.cs:114:19:114:23 | [finally: exception(Exception)] this access | -| Finally.cs:114:19:114:23 | [finally: exception(Exception)] this access | Finally.cs:114:13:115:41 | [finally: exception(Exception)] if (...) ... | -| Finally.cs:114:19:114:23 | [finally: exception(NullReferenceException)] access to field Field | Finally.cs:114:19:114:23 | [finally: exception(NullReferenceException)] this access | -| Finally.cs:114:19:114:23 | [finally: exception(NullReferenceException)] this access | Finally.cs:114:13:115:41 | [finally: exception(NullReferenceException)] if (...) ... | -| Finally.cs:114:19:114:23 | [finally: exception(OutOfMemoryException)] access to field Field | Finally.cs:114:19:114:23 | [finally: exception(OutOfMemoryException)] this access | -| Finally.cs:114:19:114:23 | [finally: exception(OutOfMemoryException)] this access | Finally.cs:114:13:115:41 | [finally: exception(OutOfMemoryException)] if (...) ... | +| Finally.cs:114:19:114:23 | [finally: exception] access to field Field | Finally.cs:114:19:114:23 | [finally: exception] this access | +| Finally.cs:114:19:114:23 | [finally: exception] this access | Finally.cs:114:13:115:41 | [finally: exception] if (...) ... | | Finally.cs:114:19:114:23 | [finally: return] access to field Field | Finally.cs:114:19:114:23 | [finally: return] this access | | Finally.cs:114:19:114:23 | [finally: return] this access | Finally.cs:114:13:115:41 | [finally: return] if (...) ... | | Finally.cs:114:19:114:23 | access to field Field | Finally.cs:114:19:114:23 | this access | | Finally.cs:114:19:114:23 | this access | Finally.cs:114:13:115:41 | if (...) ... | -| Finally.cs:114:19:114:30 | [finally: exception(Exception)] access to property Length | Finally.cs:114:19:114:23 | [finally: exception(Exception)] access to field Field | -| Finally.cs:114:19:114:30 | [finally: exception(NullReferenceException)] access to property Length | Finally.cs:114:19:114:23 | [finally: exception(NullReferenceException)] access to field Field | -| Finally.cs:114:19:114:30 | [finally: exception(OutOfMemoryException)] access to property Length | Finally.cs:114:19:114:23 | [finally: exception(OutOfMemoryException)] access to field Field | +| Finally.cs:114:19:114:30 | [finally: exception] access to property Length | Finally.cs:114:19:114:23 | [finally: exception] access to field Field | | Finally.cs:114:19:114:30 | [finally: return] access to property Length | Finally.cs:114:19:114:23 | [finally: return] access to field Field | | Finally.cs:114:19:114:30 | access to property Length | Finally.cs:114:19:114:23 | access to field Field | | Finally.cs:114:19:114:35 | ... == ... | Finally.cs:114:35:114:35 | 0 | -| Finally.cs:114:19:114:35 | [finally: exception(Exception)] ... == ... | Finally.cs:114:35:114:35 | [finally: exception(Exception)] 0 | -| Finally.cs:114:19:114:35 | [finally: exception(NullReferenceException)] ... == ... | Finally.cs:114:35:114:35 | [finally: exception(NullReferenceException)] 0 | -| Finally.cs:114:19:114:35 | [finally: exception(OutOfMemoryException)] ... == ... | Finally.cs:114:35:114:35 | [finally: exception(OutOfMemoryException)] 0 | +| Finally.cs:114:19:114:35 | [finally: exception] ... == ... | Finally.cs:114:35:114:35 | [finally: exception] 0 | | Finally.cs:114:19:114:35 | [finally: return] ... == ... | Finally.cs:114:35:114:35 | [finally: return] 0 | | Finally.cs:114:35:114:35 | 0 | Finally.cs:114:19:114:30 | access to property Length | -| Finally.cs:114:35:114:35 | [finally: exception(Exception)] 0 | Finally.cs:114:19:114:30 | [finally: exception(Exception)] access to property Length | -| Finally.cs:114:35:114:35 | [finally: exception(NullReferenceException)] 0 | Finally.cs:114:19:114:30 | [finally: exception(NullReferenceException)] access to property Length | -| Finally.cs:114:35:114:35 | [finally: exception(OutOfMemoryException)] 0 | Finally.cs:114:19:114:30 | [finally: exception(OutOfMemoryException)] access to property Length | +| Finally.cs:114:35:114:35 | [finally: exception] 0 | Finally.cs:114:19:114:30 | [finally: exception] access to property Length | | Finally.cs:114:35:114:35 | [finally: return] 0 | Finally.cs:114:19:114:30 | [finally: return] access to property Length | -| Finally.cs:115:17:115:40 | [finally: exception(Exception)] call to method WriteLine | Finally.cs:115:35:115:39 | [finally: exception(Exception)] access to field Field | -| Finally.cs:115:17:115:40 | [finally: exception(NullReferenceException)] call to method WriteLine | Finally.cs:115:35:115:39 | [finally: exception(NullReferenceException)] access to field Field | -| Finally.cs:115:17:115:40 | [finally: exception(OutOfMemoryException)] call to method WriteLine | Finally.cs:115:35:115:39 | [finally: exception(OutOfMemoryException)] access to field Field | +| Finally.cs:115:17:115:40 | [finally: exception] call to method WriteLine | Finally.cs:115:35:115:39 | [finally: exception] access to field Field | | Finally.cs:115:17:115:40 | [finally: return] call to method WriteLine | Finally.cs:115:35:115:39 | [finally: return] access to field Field | | Finally.cs:115:17:115:40 | call to method WriteLine | Finally.cs:115:35:115:39 | access to field Field | | Finally.cs:115:17:115:41 | ...; | Finally.cs:114:17:114:36 | [true] !... | | Finally.cs:115:17:115:41 | [finally: return] ...; | Finally.cs:114:17:114:36 | [true, finally: return] !... | -| Finally.cs:115:35:115:39 | [finally: exception(Exception)] access to field Field | Finally.cs:115:35:115:39 | [finally: exception(Exception)] this access | -| Finally.cs:115:35:115:39 | [finally: exception(Exception)] this access | Finally.cs:115:17:115:41 | [finally: exception(Exception)] ...; | -| Finally.cs:115:35:115:39 | [finally: exception(NullReferenceException)] access to field Field | Finally.cs:115:35:115:39 | [finally: exception(NullReferenceException)] this access | -| Finally.cs:115:35:115:39 | [finally: exception(NullReferenceException)] this access | Finally.cs:115:17:115:41 | [finally: exception(NullReferenceException)] ...; | -| Finally.cs:115:35:115:39 | [finally: exception(OutOfMemoryException)] access to field Field | Finally.cs:115:35:115:39 | [finally: exception(OutOfMemoryException)] this access | -| Finally.cs:115:35:115:39 | [finally: exception(OutOfMemoryException)] this access | Finally.cs:115:17:115:41 | [finally: exception(OutOfMemoryException)] ...; | +| Finally.cs:115:35:115:39 | [finally: exception] access to field Field | Finally.cs:115:35:115:39 | [finally: exception] this access | +| Finally.cs:115:35:115:39 | [finally: exception] this access | Finally.cs:115:17:115:41 | [finally: exception] ...; | | Finally.cs:115:35:115:39 | [finally: return] access to field Field | Finally.cs:115:35:115:39 | [finally: return] this access | | Finally.cs:115:35:115:39 | [finally: return] this access | Finally.cs:115:17:115:41 | [finally: return] ...; | | Finally.cs:115:35:115:39 | access to field Field | Finally.cs:115:35:115:39 | this access | @@ -6331,40 +6144,26 @@ postDominance | Finally.cs:116:13:117:37 | [finally: return] if (...) ... | Finally.cs:115:17:115:40 | [finally: return] call to method WriteLine | | Finally.cs:116:13:117:37 | if (...) ... | Finally.cs:114:17:114:36 | [false] !... | | Finally.cs:116:13:117:37 | if (...) ... | Finally.cs:115:17:115:40 | call to method WriteLine | -| Finally.cs:116:17:116:21 | [finally: exception(Exception)] access to field Field | Finally.cs:116:17:116:21 | [finally: exception(Exception)] this access | -| Finally.cs:116:17:116:21 | [finally: exception(Exception)] this access | Finally.cs:116:13:117:37 | [finally: exception(Exception)] if (...) ... | -| Finally.cs:116:17:116:21 | [finally: exception(NullReferenceException)] access to field Field | Finally.cs:116:17:116:21 | [finally: exception(NullReferenceException)] this access | -| Finally.cs:116:17:116:21 | [finally: exception(NullReferenceException)] this access | Finally.cs:116:13:117:37 | [finally: exception(NullReferenceException)] if (...) ... | -| Finally.cs:116:17:116:21 | [finally: exception(OutOfMemoryException)] access to field Field | Finally.cs:116:17:116:21 | [finally: exception(OutOfMemoryException)] this access | -| Finally.cs:116:17:116:21 | [finally: exception(OutOfMemoryException)] this access | Finally.cs:116:13:117:37 | [finally: exception(OutOfMemoryException)] if (...) ... | +| Finally.cs:116:17:116:21 | [finally: exception] access to field Field | Finally.cs:116:17:116:21 | [finally: exception] this access | +| Finally.cs:116:17:116:21 | [finally: exception] this access | Finally.cs:116:13:117:37 | [finally: exception] if (...) ... | | Finally.cs:116:17:116:21 | [finally: return] access to field Field | Finally.cs:116:17:116:21 | [finally: return] this access | | Finally.cs:116:17:116:21 | [finally: return] this access | Finally.cs:116:13:117:37 | [finally: return] if (...) ... | | Finally.cs:116:17:116:21 | access to field Field | Finally.cs:116:17:116:21 | this access | | Finally.cs:116:17:116:21 | this access | Finally.cs:116:13:117:37 | if (...) ... | -| Finally.cs:116:17:116:28 | [finally: exception(Exception)] access to property Length | Finally.cs:116:17:116:21 | [finally: exception(Exception)] access to field Field | -| Finally.cs:116:17:116:28 | [finally: exception(NullReferenceException)] access to property Length | Finally.cs:116:17:116:21 | [finally: exception(NullReferenceException)] access to field Field | -| Finally.cs:116:17:116:28 | [finally: exception(OutOfMemoryException)] access to property Length | Finally.cs:116:17:116:21 | [finally: exception(OutOfMemoryException)] access to field Field | +| Finally.cs:116:17:116:28 | [finally: exception] access to property Length | Finally.cs:116:17:116:21 | [finally: exception] access to field Field | | Finally.cs:116:17:116:28 | [finally: return] access to property Length | Finally.cs:116:17:116:21 | [finally: return] access to field Field | | Finally.cs:116:17:116:28 | access to property Length | Finally.cs:116:17:116:21 | access to field Field | | Finally.cs:116:17:116:32 | ... > ... | Finally.cs:116:32:116:32 | 0 | -| Finally.cs:116:17:116:32 | [finally: exception(Exception)] ... > ... | Finally.cs:116:32:116:32 | [finally: exception(Exception)] 0 | -| Finally.cs:116:17:116:32 | [finally: exception(NullReferenceException)] ... > ... | Finally.cs:116:32:116:32 | [finally: exception(NullReferenceException)] 0 | -| Finally.cs:116:17:116:32 | [finally: exception(OutOfMemoryException)] ... > ... | Finally.cs:116:32:116:32 | [finally: exception(OutOfMemoryException)] 0 | +| Finally.cs:116:17:116:32 | [finally: exception] ... > ... | Finally.cs:116:32:116:32 | [finally: exception] 0 | | Finally.cs:116:17:116:32 | [finally: return] ... > ... | Finally.cs:116:32:116:32 | [finally: return] 0 | | Finally.cs:116:32:116:32 | 0 | Finally.cs:116:17:116:28 | access to property Length | -| Finally.cs:116:32:116:32 | [finally: exception(Exception)] 0 | Finally.cs:116:17:116:28 | [finally: exception(Exception)] access to property Length | -| Finally.cs:116:32:116:32 | [finally: exception(NullReferenceException)] 0 | Finally.cs:116:17:116:28 | [finally: exception(NullReferenceException)] access to property Length | -| Finally.cs:116:32:116:32 | [finally: exception(OutOfMemoryException)] 0 | Finally.cs:116:17:116:28 | [finally: exception(OutOfMemoryException)] access to property Length | +| Finally.cs:116:32:116:32 | [finally: exception] 0 | Finally.cs:116:17:116:28 | [finally: exception] access to property Length | | Finally.cs:116:32:116:32 | [finally: return] 0 | Finally.cs:116:17:116:28 | [finally: return] access to property Length | -| Finally.cs:117:17:117:36 | [finally: exception(Exception)] call to method WriteLine | Finally.cs:117:35:117:35 | [finally: exception(Exception)] 1 | -| Finally.cs:117:17:117:36 | [finally: exception(NullReferenceException)] call to method WriteLine | Finally.cs:117:35:117:35 | [finally: exception(NullReferenceException)] 1 | -| Finally.cs:117:17:117:36 | [finally: exception(OutOfMemoryException)] call to method WriteLine | Finally.cs:117:35:117:35 | [finally: exception(OutOfMemoryException)] 1 | +| Finally.cs:117:17:117:36 | [finally: exception] call to method WriteLine | Finally.cs:117:35:117:35 | [finally: exception] 1 | | Finally.cs:117:17:117:36 | [finally: return] call to method WriteLine | Finally.cs:117:35:117:35 | [finally: return] 1 | | Finally.cs:117:17:117:36 | call to method WriteLine | Finally.cs:117:35:117:35 | 1 | | Finally.cs:117:35:117:35 | 1 | Finally.cs:117:17:117:37 | ...; | -| Finally.cs:117:35:117:35 | [finally: exception(Exception)] 1 | Finally.cs:117:17:117:37 | [finally: exception(Exception)] ...; | -| Finally.cs:117:35:117:35 | [finally: exception(NullReferenceException)] 1 | Finally.cs:117:17:117:37 | [finally: exception(NullReferenceException)] ...; | -| Finally.cs:117:35:117:35 | [finally: exception(OutOfMemoryException)] 1 | Finally.cs:117:17:117:37 | [finally: exception(OutOfMemoryException)] ...; | +| Finally.cs:117:35:117:35 | [finally: exception] 1 | Finally.cs:117:17:117:37 | [finally: exception] ...; | | Finally.cs:117:35:117:35 | [finally: return] 1 | Finally.cs:117:17:117:37 | [finally: return] ...; | | Finally.cs:121:10:121:11 | exit M6 | Finally.cs:121:10:121:11 | exit M6 (normal) | | Finally.cs:121:10:121:11 | exit M6 (normal) | Finally.cs:125:17:125:40 | Double temp = ... | @@ -6384,12 +6183,12 @@ postDominance | Finally.cs:137:13:137:36 | call to method WriteLine | Finally.cs:137:31:137:35 | "Try" | | Finally.cs:137:13:137:37 | ...; | Finally.cs:136:9:138:9 | {...} | | Finally.cs:137:31:137:35 | "Try" | Finally.cs:137:13:137:37 | ...; | -| Finally.cs:141:13:141:44 | [finally: exception(Exception)] throw ...; | Finally.cs:141:19:141:43 | [finally: exception(Exception)] object creation of type ArgumentException | +| Finally.cs:141:13:141:44 | [finally: exception] throw ...; | Finally.cs:141:19:141:43 | [finally: exception] object creation of type ArgumentException | | Finally.cs:141:13:141:44 | throw ...; | Finally.cs:141:19:141:43 | object creation of type ArgumentException | -| Finally.cs:141:19:141:43 | [finally: exception(Exception)] object creation of type ArgumentException | Finally.cs:141:41:141:42 | [finally: exception(Exception)] "" | +| Finally.cs:141:19:141:43 | [finally: exception] object creation of type ArgumentException | Finally.cs:141:41:141:42 | [finally: exception] "" | | Finally.cs:141:19:141:43 | object creation of type ArgumentException | Finally.cs:141:41:141:42 | "" | | Finally.cs:141:41:141:42 | "" | Finally.cs:140:9:143:9 | {...} | -| Finally.cs:141:41:141:42 | [finally: exception(Exception)] "" | Finally.cs:140:9:143:9 | [finally: exception(Exception)] {...} | +| Finally.cs:141:41:141:42 | [finally: exception] "" | Finally.cs:140:9:143:9 | [finally: exception] {...} | | Finally.cs:147:10:147:11 | exit M8 (normal) | Finally.cs:158:21:158:36 | ... == ... | | Finally.cs:147:10:147:11 | exit M8 (normal) | Finally.cs:163:17:163:42 | call to method WriteLine | | Finally.cs:147:10:147:11 | exit M8 (normal) | Finally.cs:167:17:167:37 | call to method WriteLine | @@ -6400,28 +6199,20 @@ postDominance | Finally.cs:151:17:151:20 | access to parameter args | Finally.cs:151:13:152:50 | if (...) ... | | Finally.cs:151:17:151:28 | ... == ... | Finally.cs:151:25:151:28 | null | | Finally.cs:151:25:151:28 | null | Finally.cs:151:17:151:20 | access to parameter args | -| Finally.cs:155:9:169:9 | [finally: exception(ArgumentNullException)] {...} | Finally.cs:152:17:152:50 | throw ...; | | Finally.cs:155:9:169:9 | {...} | Finally.cs:151:17:151:28 | ... == ... | -| Finally.cs:156:13:168:13 | [finally: exception(ArgumentNullException)] try {...} ... | Finally.cs:155:9:169:9 | [finally: exception(ArgumentNullException)] {...} | -| Finally.cs:156:13:168:13 | [finally: exception(Exception)] try {...} ... | Finally.cs:155:9:169:9 | [finally: exception(Exception)] {...} | +| Finally.cs:156:13:168:13 | [finally: exception] try {...} ... | Finally.cs:155:9:169:9 | [finally: exception] {...} | | Finally.cs:156:13:168:13 | try {...} ... | Finally.cs:155:9:169:9 | {...} | -| Finally.cs:157:13:160:13 | [finally: exception(ArgumentNullException)] {...} | Finally.cs:156:13:168:13 | [finally: exception(ArgumentNullException)] try {...} ... | -| Finally.cs:157:13:160:13 | [finally: exception(Exception)] {...} | Finally.cs:156:13:168:13 | [finally: exception(Exception)] try {...} ... | +| Finally.cs:157:13:160:13 | [finally: exception] {...} | Finally.cs:156:13:168:13 | [finally: exception] try {...} ... | | Finally.cs:157:13:160:13 | {...} | Finally.cs:156:13:168:13 | try {...} ... | -| Finally.cs:158:17:159:45 | [finally: exception(ArgumentNullException)] if (...) ... | Finally.cs:157:13:160:13 | [finally: exception(ArgumentNullException)] {...} | -| Finally.cs:158:17:159:45 | [finally: exception(Exception)] if (...) ... | Finally.cs:157:13:160:13 | [finally: exception(Exception)] {...} | +| Finally.cs:158:17:159:45 | [finally: exception] if (...) ... | Finally.cs:157:13:160:13 | [finally: exception] {...} | | Finally.cs:158:17:159:45 | if (...) ... | Finally.cs:157:13:160:13 | {...} | -| Finally.cs:158:21:158:24 | [finally: exception(ArgumentNullException)] access to parameter args | Finally.cs:158:17:159:45 | [finally: exception(ArgumentNullException)] if (...) ... | -| Finally.cs:158:21:158:24 | [finally: exception(Exception)] access to parameter args | Finally.cs:158:17:159:45 | [finally: exception(Exception)] if (...) ... | +| Finally.cs:158:21:158:24 | [finally: exception] access to parameter args | Finally.cs:158:17:159:45 | [finally: exception] if (...) ... | | Finally.cs:158:21:158:24 | access to parameter args | Finally.cs:158:17:159:45 | if (...) ... | -| Finally.cs:158:21:158:31 | [finally: exception(ArgumentNullException)] access to property Length | Finally.cs:158:21:158:24 | [finally: exception(ArgumentNullException)] access to parameter args | -| Finally.cs:158:21:158:31 | [finally: exception(Exception)] access to property Length | Finally.cs:158:21:158:24 | [finally: exception(Exception)] access to parameter args | +| Finally.cs:158:21:158:31 | [finally: exception] access to property Length | Finally.cs:158:21:158:24 | [finally: exception] access to parameter args | | Finally.cs:158:21:158:31 | access to property Length | Finally.cs:158:21:158:24 | access to parameter args | | Finally.cs:158:21:158:36 | ... == ... | Finally.cs:158:36:158:36 | 1 | -| Finally.cs:158:21:158:36 | [finally: exception(ArgumentNullException)] ... == ... | Finally.cs:158:36:158:36 | [finally: exception(ArgumentNullException)] 1 | -| Finally.cs:158:21:158:36 | [finally: exception(Exception)] ... == ... | Finally.cs:158:36:158:36 | [finally: exception(Exception)] 1 | -| Finally.cs:159:27:159:44 | [finally: exception(ArgumentNullException)] object creation of type Exception | Finally.cs:159:41:159:43 | [finally: exception(ArgumentNullException)] "1" | -| Finally.cs:159:27:159:44 | [finally: exception(Exception)] object creation of type Exception | Finally.cs:159:41:159:43 | [finally: exception(Exception)] "1" | +| Finally.cs:158:21:158:36 | [finally: exception] ... == ... | Finally.cs:158:36:158:36 | [finally: exception] 1 | +| Finally.cs:159:27:159:44 | [finally: exception] object creation of type Exception | Finally.cs:159:41:159:43 | [finally: exception] "1" | | Finally.cs:159:27:159:44 | object creation of type Exception | Finally.cs:159:41:159:43 | "1" | | Finally.cs:161:13:164:13 | [exception: Exception] catch (...) {...} | Finally.cs:159:21:159:45 | throw ...; | | Finally.cs:161:13:164:13 | [exception: Exception] catch (...) {...} | Finally.cs:159:27:159:44 | object creation of type Exception | @@ -6429,55 +6220,38 @@ postDominance | Finally.cs:161:30:161:30 | [exception: NullReferenceException] Exception e | Finally.cs:161:13:164:13 | [exception: NullReferenceException] catch (...) {...} | | Finally.cs:161:39:161:39 | [exception: Exception] access to local variable e | Finally.cs:161:30:161:30 | [exception: Exception] Exception e | | Finally.cs:161:39:161:39 | [exception: NullReferenceException] access to local variable e | Finally.cs:161:30:161:30 | [exception: NullReferenceException] Exception e | -| Finally.cs:161:39:161:39 | [finally: exception(ArgumentNullException), exception: Exception] access to local variable e | Finally.cs:161:30:161:30 | [finally: exception(ArgumentNullException), exception: Exception] Exception e | -| Finally.cs:161:39:161:39 | [finally: exception(ArgumentNullException), exception: NullReferenceException] access to local variable e | Finally.cs:161:30:161:30 | [finally: exception(ArgumentNullException), exception: NullReferenceException] Exception e | -| Finally.cs:161:39:161:39 | [finally: exception(Exception), exception: Exception] access to local variable e | Finally.cs:161:30:161:30 | [finally: exception(Exception), exception: Exception] Exception e | -| Finally.cs:161:39:161:39 | [finally: exception(Exception), exception: NullReferenceException] access to local variable e | Finally.cs:161:30:161:30 | [finally: exception(Exception), exception: NullReferenceException] Exception e | +| Finally.cs:161:39:161:39 | [finally: exception, exception: Exception] access to local variable e | Finally.cs:161:30:161:30 | [finally: exception, exception: Exception] Exception e | +| Finally.cs:161:39:161:39 | [finally: exception, exception: NullReferenceException] access to local variable e | Finally.cs:161:30:161:30 | [finally: exception, exception: NullReferenceException] Exception e | | Finally.cs:161:39:161:47 | [exception: Exception] access to property Message | Finally.cs:161:39:161:39 | [exception: Exception] access to local variable e | | Finally.cs:161:39:161:47 | [exception: NullReferenceException] access to property Message | Finally.cs:161:39:161:39 | [exception: NullReferenceException] access to local variable e | -| Finally.cs:161:39:161:47 | [finally: exception(ArgumentNullException), exception: Exception] access to property Message | Finally.cs:161:39:161:39 | [finally: exception(ArgumentNullException), exception: Exception] access to local variable e | -| Finally.cs:161:39:161:47 | [finally: exception(ArgumentNullException), exception: NullReferenceException] access to property Message | Finally.cs:161:39:161:39 | [finally: exception(ArgumentNullException), exception: NullReferenceException] access to local variable e | -| Finally.cs:161:39:161:47 | [finally: exception(Exception), exception: Exception] access to property Message | Finally.cs:161:39:161:39 | [finally: exception(Exception), exception: Exception] access to local variable e | -| Finally.cs:161:39:161:47 | [finally: exception(Exception), exception: NullReferenceException] access to property Message | Finally.cs:161:39:161:39 | [finally: exception(Exception), exception: NullReferenceException] access to local variable e | +| Finally.cs:161:39:161:47 | [finally: exception, exception: Exception] access to property Message | Finally.cs:161:39:161:39 | [finally: exception, exception: Exception] access to local variable e | +| Finally.cs:161:39:161:47 | [finally: exception, exception: NullReferenceException] access to property Message | Finally.cs:161:39:161:39 | [finally: exception, exception: NullReferenceException] access to local variable e | | Finally.cs:161:39:161:54 | [exception: Exception] ... == ... | Finally.cs:161:52:161:54 | [exception: Exception] "1" | | Finally.cs:161:39:161:54 | [exception: NullReferenceException] ... == ... | Finally.cs:161:52:161:54 | [exception: NullReferenceException] "1" | -| Finally.cs:161:39:161:54 | [finally: exception(ArgumentNullException), exception: Exception] ... == ... | Finally.cs:161:52:161:54 | [finally: exception(ArgumentNullException), exception: Exception] "1" | -| Finally.cs:161:39:161:54 | [finally: exception(ArgumentNullException), exception: NullReferenceException] ... == ... | Finally.cs:161:52:161:54 | [finally: exception(ArgumentNullException), exception: NullReferenceException] "1" | -| Finally.cs:161:39:161:54 | [finally: exception(Exception), exception: Exception] ... == ... | Finally.cs:161:52:161:54 | [finally: exception(Exception), exception: Exception] "1" | -| Finally.cs:161:39:161:54 | [finally: exception(Exception), exception: NullReferenceException] ... == ... | Finally.cs:161:52:161:54 | [finally: exception(Exception), exception: NullReferenceException] "1" | +| Finally.cs:161:39:161:54 | [finally: exception, exception: Exception] ... == ... | Finally.cs:161:52:161:54 | [finally: exception, exception: Exception] "1" | +| Finally.cs:161:39:161:54 | [finally: exception, exception: NullReferenceException] ... == ... | Finally.cs:161:52:161:54 | [finally: exception, exception: NullReferenceException] "1" | | Finally.cs:161:52:161:54 | [exception: Exception] "1" | Finally.cs:161:39:161:47 | [exception: Exception] access to property Message | | Finally.cs:161:52:161:54 | [exception: NullReferenceException] "1" | Finally.cs:161:39:161:47 | [exception: NullReferenceException] access to property Message | -| Finally.cs:161:52:161:54 | [finally: exception(ArgumentNullException), exception: Exception] "1" | Finally.cs:161:39:161:47 | [finally: exception(ArgumentNullException), exception: Exception] access to property Message | -| Finally.cs:161:52:161:54 | [finally: exception(ArgumentNullException), exception: NullReferenceException] "1" | Finally.cs:161:39:161:47 | [finally: exception(ArgumentNullException), exception: NullReferenceException] access to property Message | -| Finally.cs:161:52:161:54 | [finally: exception(Exception), exception: Exception] "1" | Finally.cs:161:39:161:47 | [finally: exception(Exception), exception: Exception] access to property Message | -| Finally.cs:161:52:161:54 | [finally: exception(Exception), exception: NullReferenceException] "1" | Finally.cs:161:39:161:47 | [finally: exception(Exception), exception: NullReferenceException] access to property Message | -| Finally.cs:163:17:163:42 | [finally: exception(ArgumentNullException)] call to method WriteLine | Finally.cs:163:35:163:41 | [finally: exception(ArgumentNullException)] access to array element | -| Finally.cs:163:17:163:42 | [finally: exception(Exception)] call to method WriteLine | Finally.cs:163:35:163:41 | [finally: exception(Exception)] access to array element | +| Finally.cs:161:52:161:54 | [finally: exception, exception: Exception] "1" | Finally.cs:161:39:161:47 | [finally: exception, exception: Exception] access to property Message | +| Finally.cs:161:52:161:54 | [finally: exception, exception: NullReferenceException] "1" | Finally.cs:161:39:161:47 | [finally: exception, exception: NullReferenceException] access to property Message | +| Finally.cs:163:17:163:42 | [finally: exception] call to method WriteLine | Finally.cs:163:35:163:41 | [finally: exception] access to array element | | Finally.cs:163:17:163:42 | call to method WriteLine | Finally.cs:163:35:163:41 | access to array element | | Finally.cs:163:17:163:43 | ...; | Finally.cs:162:13:164:13 | {...} | -| Finally.cs:163:17:163:43 | [finally: exception(ArgumentNullException)] ...; | Finally.cs:162:13:164:13 | [finally: exception(ArgumentNullException)] {...} | -| Finally.cs:163:17:163:43 | [finally: exception(Exception)] ...; | Finally.cs:162:13:164:13 | [finally: exception(Exception)] {...} | -| Finally.cs:163:35:163:38 | [finally: exception(ArgumentNullException)] access to parameter args | Finally.cs:163:17:163:43 | [finally: exception(ArgumentNullException)] ...; | -| Finally.cs:163:35:163:38 | [finally: exception(Exception)] access to parameter args | Finally.cs:163:17:163:43 | [finally: exception(Exception)] ...; | +| Finally.cs:163:17:163:43 | [finally: exception] ...; | Finally.cs:162:13:164:13 | [finally: exception] {...} | +| Finally.cs:163:35:163:38 | [finally: exception] access to parameter args | Finally.cs:163:17:163:43 | [finally: exception] ...; | | Finally.cs:163:35:163:38 | access to parameter args | Finally.cs:163:17:163:43 | ...; | -| Finally.cs:163:35:163:41 | [finally: exception(ArgumentNullException)] access to array element | Finally.cs:163:40:163:40 | [finally: exception(ArgumentNullException)] 0 | -| Finally.cs:163:35:163:41 | [finally: exception(Exception)] access to array element | Finally.cs:163:40:163:40 | [finally: exception(Exception)] 0 | +| Finally.cs:163:35:163:41 | [finally: exception] access to array element | Finally.cs:163:40:163:40 | [finally: exception] 0 | | Finally.cs:163:35:163:41 | access to array element | Finally.cs:163:40:163:40 | 0 | | Finally.cs:163:40:163:40 | 0 | Finally.cs:163:35:163:38 | access to parameter args | -| Finally.cs:163:40:163:40 | [finally: exception(ArgumentNullException)] 0 | Finally.cs:163:35:163:38 | [finally: exception(ArgumentNullException)] access to parameter args | -| Finally.cs:163:40:163:40 | [finally: exception(Exception)] 0 | Finally.cs:163:35:163:38 | [finally: exception(Exception)] access to parameter args | -| Finally.cs:166:13:168:13 | [finally: exception(ArgumentNullException)] {...} | Finally.cs:165:13:168:13 | [finally: exception(ArgumentNullException)] catch {...} | -| Finally.cs:166:13:168:13 | [finally: exception(Exception)] {...} | Finally.cs:165:13:168:13 | [finally: exception(Exception)] catch {...} | +| Finally.cs:163:40:163:40 | [finally: exception] 0 | Finally.cs:163:35:163:38 | [finally: exception] access to parameter args | +| Finally.cs:166:13:168:13 | [finally: exception] {...} | Finally.cs:165:13:168:13 | [finally: exception] catch {...} | | Finally.cs:166:13:168:13 | {...} | Finally.cs:165:13:168:13 | catch {...} | -| Finally.cs:167:17:167:37 | [finally: exception(ArgumentNullException)] call to method WriteLine | Finally.cs:167:35:167:36 | [finally: exception(ArgumentNullException)] "" | -| Finally.cs:167:17:167:37 | [finally: exception(Exception)] call to method WriteLine | Finally.cs:167:35:167:36 | [finally: exception(Exception)] "" | +| Finally.cs:167:17:167:37 | [finally: exception] call to method WriteLine | Finally.cs:167:35:167:36 | [finally: exception] "" | | Finally.cs:167:17:167:37 | call to method WriteLine | Finally.cs:167:35:167:36 | "" | | Finally.cs:167:17:167:38 | ...; | Finally.cs:166:13:168:13 | {...} | -| Finally.cs:167:17:167:38 | [finally: exception(ArgumentNullException)] ...; | Finally.cs:166:13:168:13 | [finally: exception(ArgumentNullException)] {...} | -| Finally.cs:167:17:167:38 | [finally: exception(Exception)] ...; | Finally.cs:166:13:168:13 | [finally: exception(Exception)] {...} | +| Finally.cs:167:17:167:38 | [finally: exception] ...; | Finally.cs:166:13:168:13 | [finally: exception] {...} | | Finally.cs:167:35:167:36 | "" | Finally.cs:167:17:167:38 | ...; | -| Finally.cs:167:35:167:36 | [finally: exception(ArgumentNullException)] "" | Finally.cs:167:17:167:38 | [finally: exception(ArgumentNullException)] ...; | -| Finally.cs:167:35:167:36 | [finally: exception(Exception)] "" | Finally.cs:167:17:167:38 | [finally: exception(Exception)] ...; | +| Finally.cs:167:35:167:36 | [finally: exception] "" | Finally.cs:167:17:167:38 | [finally: exception] ...; | | Finally.cs:172:11:172:20 | call to constructor Exception | Finally.cs:172:11:172:20 | enter ExceptionA | | Finally.cs:172:11:172:20 | exit ExceptionA | Finally.cs:172:11:172:20 | exit ExceptionA (normal) | | Finally.cs:172:11:172:20 | exit ExceptionA (normal) | Finally.cs:172:11:172:20 | {...} | @@ -6498,95 +6272,60 @@ postDominance | Finally.cs:180:13:180:43 | if (...) ... | Finally.cs:179:9:181:9 | {...} | | Finally.cs:180:17:180:18 | access to parameter b1 | Finally.cs:180:13:180:43 | if (...) ... | | Finally.cs:183:9:192:9 | [b1 (line 176): false] {...} | Finally.cs:180:17:180:18 | access to parameter b1 | -| Finally.cs:183:9:192:9 | [finally: exception(ExceptionA), b1 (line 176): true] {...} | Finally.cs:180:21:180:43 | [b1 (line 176): true] throw ...; | | Finally.cs:184:13:191:13 | [b1 (line 176): false] try {...} ... | Finally.cs:183:9:192:9 | [b1 (line 176): false] {...} | -| Finally.cs:184:13:191:13 | [finally: exception(Exception), b1 (line 176): true] try {...} ... | Finally.cs:183:9:192:9 | [finally: exception(Exception), b1 (line 176): true] {...} | -| Finally.cs:184:13:191:13 | [finally: exception(ExceptionA), b1 (line 176): true] try {...} ... | Finally.cs:183:9:192:9 | [finally: exception(ExceptionA), b1 (line 176): true] {...} | +| Finally.cs:184:13:191:13 | [finally: exception, b1 (line 176): true] try {...} ... | Finally.cs:183:9:192:9 | [finally: exception, b1 (line 176): true] {...} | | Finally.cs:185:13:187:13 | [b1 (line 176): false] {...} | Finally.cs:184:13:191:13 | [b1 (line 176): false] try {...} ... | -| Finally.cs:185:13:187:13 | [finally: exception(Exception), b1 (line 176): true] {...} | Finally.cs:184:13:191:13 | [finally: exception(Exception), b1 (line 176): true] try {...} ... | -| Finally.cs:185:13:187:13 | [finally: exception(ExceptionA), b1 (line 176): true] {...} | Finally.cs:184:13:191:13 | [finally: exception(ExceptionA), b1 (line 176): true] try {...} ... | +| Finally.cs:185:13:187:13 | [finally: exception, b1 (line 176): true] {...} | Finally.cs:184:13:191:13 | [finally: exception, b1 (line 176): true] try {...} ... | | Finally.cs:186:17:186:47 | [b1 (line 176): false] if (...) ... | Finally.cs:185:13:187:13 | [b1 (line 176): false] {...} | -| Finally.cs:186:17:186:47 | [finally: exception(Exception), b1 (line 176): true] if (...) ... | Finally.cs:185:13:187:13 | [finally: exception(Exception), b1 (line 176): true] {...} | -| Finally.cs:186:17:186:47 | [finally: exception(ExceptionA), b1 (line 176): true] if (...) ... | Finally.cs:185:13:187:13 | [finally: exception(ExceptionA), b1 (line 176): true] {...} | +| Finally.cs:186:17:186:47 | [finally: exception, b1 (line 176): true] if (...) ... | Finally.cs:185:13:187:13 | [finally: exception, b1 (line 176): true] {...} | | Finally.cs:186:21:186:22 | [b1 (line 176): false] access to parameter b2 | Finally.cs:186:17:186:47 | [b1 (line 176): false] if (...) ... | -| Finally.cs:186:21:186:22 | [finally: exception(Exception), b1 (line 176): true] access to parameter b2 | Finally.cs:186:17:186:47 | [finally: exception(Exception), b1 (line 176): true] if (...) ... | -| Finally.cs:186:21:186:22 | [finally: exception(ExceptionA), b1 (line 176): true] access to parameter b2 | Finally.cs:186:17:186:47 | [finally: exception(ExceptionA), b1 (line 176): true] if (...) ... | +| Finally.cs:186:21:186:22 | [finally: exception, b1 (line 176): true] access to parameter b2 | Finally.cs:186:17:186:47 | [finally: exception, b1 (line 176): true] if (...) ... | | Finally.cs:188:13:191:13 | [exception: ExceptionB, b1 (line 176): false, b2 (line 176): true] catch (...) {...} | Finally.cs:186:25:186:47 | [b1 (line 176): false, b2 (line 176): true] throw ...; | -| Finally.cs:188:13:191:13 | [finally: exception(Exception), exception: ExceptionB, b1 (line 176): true, b2 (line 176): true] catch (...) {...} | Finally.cs:186:25:186:47 | [finally: exception(Exception), b1 (line 176): true, b2 (line 176): true] throw ...; | -| Finally.cs:188:13:191:13 | [finally: exception(ExceptionA), exception: ExceptionB, b1 (line 176): true, b2 (line 176): true] catch (...) {...} | Finally.cs:186:25:186:47 | [finally: exception(ExceptionA), b1 (line 176): true, b2 (line 176): true] throw ...; | +| Finally.cs:188:13:191:13 | [finally: exception, exception: ExceptionB, b1 (line 176): true, b2 (line 176): true] catch (...) {...} | Finally.cs:186:25:186:47 | [finally: exception, b1 (line 176): true, b2 (line 176): true] throw ...; | | Finally.cs:188:38:188:39 | [exception: Exception, b1 (line 176): false, b2 (line 176): true] access to parameter b2 | Finally.cs:188:13:191:13 | [exception: Exception, b1 (line 176): false, b2 (line 176): true] catch (...) {...} | | Finally.cs:188:38:188:39 | [exception: ExceptionB, b1 (line 176): false, b2 (line 176): true] access to parameter b2 | Finally.cs:188:13:191:13 | [exception: ExceptionB, b1 (line 176): false, b2 (line 176): true] catch (...) {...} | | Finally.cs:189:13:191:13 | [b1 (line 176): false] {...} | Finally.cs:188:38:188:39 | [exception: Exception, b1 (line 176): false, b2 (line 176): true] access to parameter b2 | | Finally.cs:189:13:191:13 | [b1 (line 176): false] {...} | Finally.cs:188:38:188:39 | [exception: ExceptionB, b1 (line 176): false, b2 (line 176): true] access to parameter b2 | | Finally.cs:190:17:190:47 | [b1 (line 176): false] if (...) ... | Finally.cs:189:13:191:13 | [b1 (line 176): false] {...} | -| Finally.cs:190:17:190:47 | [finally: exception(Exception), b1 (line 176): true] if (...) ... | Finally.cs:189:13:191:13 | [finally: exception(Exception), b1 (line 176): true] {...} | -| Finally.cs:190:17:190:47 | [finally: exception(ExceptionA), b1 (line 176): true] if (...) ... | Finally.cs:189:13:191:13 | [finally: exception(ExceptionA), b1 (line 176): true] {...} | +| Finally.cs:190:17:190:47 | [finally: exception, b1 (line 176): true] if (...) ... | Finally.cs:189:13:191:13 | [finally: exception, b1 (line 176): true] {...} | | Finally.cs:190:21:190:22 | [b1 (line 176): false] access to parameter b1 | Finally.cs:190:17:190:47 | [b1 (line 176): false] if (...) ... | -| Finally.cs:190:21:190:22 | [finally: exception(Exception), b1 (line 176): true] access to parameter b1 | Finally.cs:190:17:190:47 | [finally: exception(Exception), b1 (line 176): true] if (...) ... | -| Finally.cs:190:21:190:22 | [finally: exception(ExceptionA), b1 (line 176): true] access to parameter b1 | Finally.cs:190:17:190:47 | [finally: exception(ExceptionA), b1 (line 176): true] if (...) ... | -| Finally.cs:190:25:190:47 | [finally: exception(Exception)] throw ...; | Finally.cs:190:31:190:46 | [finally: exception(Exception)] object creation of type ExceptionC | -| Finally.cs:190:25:190:47 | [finally: exception(ExceptionA)] throw ...; | Finally.cs:190:31:190:46 | [finally: exception(ExceptionA)] object creation of type ExceptionC | +| Finally.cs:190:21:190:22 | [finally: exception, b1 (line 176): true] access to parameter b1 | Finally.cs:190:17:190:47 | [finally: exception, b1 (line 176): true] if (...) ... | +| Finally.cs:190:25:190:47 | [finally: exception] throw ...; | Finally.cs:190:31:190:46 | [finally: exception] object creation of type ExceptionC | | Finally.cs:195:10:195:12 | exit M10 (normal) | Finally.cs:213:9:213:24 | ... = ... | | Finally.cs:196:5:214:5 | {...} | Finally.cs:195:10:195:12 | enter M10 | | Finally.cs:197:9:212:9 | try {...} ... | Finally.cs:196:5:214:5 | {...} | | Finally.cs:198:9:200:9 | {...} | Finally.cs:197:9:212:9 | try {...} ... | | Finally.cs:199:13:199:43 | if (...) ... | Finally.cs:198:9:200:9 | {...} | | Finally.cs:199:17:199:18 | access to parameter b1 | Finally.cs:199:13:199:43 | if (...) ... | -| Finally.cs:202:9:212:9 | [finally: exception(ExceptionA)] {...} | Finally.cs:199:21:199:43 | throw ...; | | Finally.cs:202:9:212:9 | {...} | Finally.cs:199:17:199:18 | access to parameter b1 | -| Finally.cs:203:13:210:13 | [finally: exception(Exception)] try {...} ... | Finally.cs:202:9:212:9 | [finally: exception(Exception)] {...} | -| Finally.cs:203:13:210:13 | [finally: exception(ExceptionA)] try {...} ... | Finally.cs:202:9:212:9 | [finally: exception(ExceptionA)] {...} | +| Finally.cs:203:13:210:13 | [finally: exception] try {...} ... | Finally.cs:202:9:212:9 | [finally: exception] {...} | | Finally.cs:203:13:210:13 | try {...} ... | Finally.cs:202:9:212:9 | {...} | -| Finally.cs:204:13:206:13 | [finally: exception(Exception)] {...} | Finally.cs:203:13:210:13 | [finally: exception(Exception)] try {...} ... | -| Finally.cs:204:13:206:13 | [finally: exception(ExceptionA)] {...} | Finally.cs:203:13:210:13 | [finally: exception(ExceptionA)] try {...} ... | +| Finally.cs:204:13:206:13 | [finally: exception] {...} | Finally.cs:203:13:210:13 | [finally: exception] try {...} ... | | Finally.cs:204:13:206:13 | {...} | Finally.cs:203:13:210:13 | try {...} ... | -| Finally.cs:205:17:205:47 | [finally: exception(Exception)] if (...) ... | Finally.cs:204:13:206:13 | [finally: exception(Exception)] {...} | -| Finally.cs:205:17:205:47 | [finally: exception(ExceptionA)] if (...) ... | Finally.cs:204:13:206:13 | [finally: exception(ExceptionA)] {...} | +| Finally.cs:205:17:205:47 | [finally: exception] if (...) ... | Finally.cs:204:13:206:13 | [finally: exception] {...} | | Finally.cs:205:17:205:47 | if (...) ... | Finally.cs:204:13:206:13 | {...} | -| Finally.cs:205:21:205:22 | [finally: exception(Exception)] access to parameter b2 | Finally.cs:205:17:205:47 | [finally: exception(Exception)] if (...) ... | -| Finally.cs:205:21:205:22 | [finally: exception(ExceptionA)] access to parameter b2 | Finally.cs:205:17:205:47 | [finally: exception(ExceptionA)] if (...) ... | +| Finally.cs:205:21:205:22 | [finally: exception] access to parameter b2 | Finally.cs:205:17:205:47 | [finally: exception] if (...) ... | | Finally.cs:205:21:205:22 | access to parameter b2 | Finally.cs:205:17:205:47 | if (...) ... | -| Finally.cs:208:13:210:13 | [finally(1): exception(ExceptionB)] {...} | Finally.cs:205:25:205:47 | throw ...; | -| Finally.cs:208:13:210:13 | [finally: exception(Exception), finally(1): exception(ExceptionB)] {...} | Finally.cs:205:25:205:47 | [finally: exception(Exception)] throw ...; | -| Finally.cs:208:13:210:13 | [finally: exception(ExceptionA), finally(1): exception(ExceptionB)] {...} | Finally.cs:205:25:205:47 | [finally: exception(ExceptionA)] throw ...; | | Finally.cs:208:13:210:13 | {...} | Finally.cs:205:21:205:22 | access to parameter b2 | -| Finally.cs:209:17:209:47 | [finally(1): exception(Exception)] if (...) ... | Finally.cs:208:13:210:13 | [finally(1): exception(Exception)] {...} | -| Finally.cs:209:17:209:47 | [finally(1): exception(ExceptionB)] if (...) ... | Finally.cs:208:13:210:13 | [finally(1): exception(ExceptionB)] {...} | -| Finally.cs:209:17:209:47 | [finally: exception(Exception), finally(1): exception(Exception)] if (...) ... | Finally.cs:208:13:210:13 | [finally: exception(Exception), finally(1): exception(Exception)] {...} | -| Finally.cs:209:17:209:47 | [finally: exception(Exception), finally(1): exception(ExceptionB)] if (...) ... | Finally.cs:208:13:210:13 | [finally: exception(Exception), finally(1): exception(ExceptionB)] {...} | -| Finally.cs:209:17:209:47 | [finally: exception(Exception)] if (...) ... | Finally.cs:208:13:210:13 | [finally: exception(Exception)] {...} | -| Finally.cs:209:17:209:47 | [finally: exception(ExceptionA), finally(1): exception(Exception)] if (...) ... | Finally.cs:208:13:210:13 | [finally: exception(ExceptionA), finally(1): exception(Exception)] {...} | -| Finally.cs:209:17:209:47 | [finally: exception(ExceptionA), finally(1): exception(ExceptionB)] if (...) ... | Finally.cs:208:13:210:13 | [finally: exception(ExceptionA), finally(1): exception(ExceptionB)] {...} | -| Finally.cs:209:17:209:47 | [finally: exception(ExceptionA)] if (...) ... | Finally.cs:208:13:210:13 | [finally: exception(ExceptionA)] {...} | +| Finally.cs:209:17:209:47 | [finally(1): exception] if (...) ... | Finally.cs:208:13:210:13 | [finally(1): exception] {...} | +| Finally.cs:209:17:209:47 | [finally: exception, finally(1): exception] if (...) ... | Finally.cs:208:13:210:13 | [finally: exception, finally(1): exception] {...} | +| Finally.cs:209:17:209:47 | [finally: exception] if (...) ... | Finally.cs:208:13:210:13 | [finally: exception] {...} | | Finally.cs:209:17:209:47 | if (...) ... | Finally.cs:208:13:210:13 | {...} | -| Finally.cs:209:21:209:22 | [finally(1): exception(Exception)] access to parameter b3 | Finally.cs:209:17:209:47 | [finally(1): exception(Exception)] if (...) ... | -| Finally.cs:209:21:209:22 | [finally(1): exception(ExceptionB)] access to parameter b3 | Finally.cs:209:17:209:47 | [finally(1): exception(ExceptionB)] if (...) ... | -| Finally.cs:209:21:209:22 | [finally: exception(Exception), finally(1): exception(Exception)] access to parameter b3 | Finally.cs:209:17:209:47 | [finally: exception(Exception), finally(1): exception(Exception)] if (...) ... | -| Finally.cs:209:21:209:22 | [finally: exception(Exception), finally(1): exception(ExceptionB)] access to parameter b3 | Finally.cs:209:17:209:47 | [finally: exception(Exception), finally(1): exception(ExceptionB)] if (...) ... | -| Finally.cs:209:21:209:22 | [finally: exception(Exception)] access to parameter b3 | Finally.cs:209:17:209:47 | [finally: exception(Exception)] if (...) ... | -| Finally.cs:209:21:209:22 | [finally: exception(ExceptionA), finally(1): exception(Exception)] access to parameter b3 | Finally.cs:209:17:209:47 | [finally: exception(ExceptionA), finally(1): exception(Exception)] if (...) ... | -| Finally.cs:209:21:209:22 | [finally: exception(ExceptionA), finally(1): exception(ExceptionB)] access to parameter b3 | Finally.cs:209:17:209:47 | [finally: exception(ExceptionA), finally(1): exception(ExceptionB)] if (...) ... | -| Finally.cs:209:21:209:22 | [finally: exception(ExceptionA)] access to parameter b3 | Finally.cs:209:17:209:47 | [finally: exception(ExceptionA)] if (...) ... | +| Finally.cs:209:21:209:22 | [finally(1): exception] access to parameter b3 | Finally.cs:209:17:209:47 | [finally(1): exception] if (...) ... | +| Finally.cs:209:21:209:22 | [finally: exception, finally(1): exception] access to parameter b3 | Finally.cs:209:17:209:47 | [finally: exception, finally(1): exception] if (...) ... | +| Finally.cs:209:21:209:22 | [finally: exception] access to parameter b3 | Finally.cs:209:17:209:47 | [finally: exception] if (...) ... | | Finally.cs:209:21:209:22 | access to parameter b3 | Finally.cs:209:17:209:47 | if (...) ... | -| Finally.cs:209:25:209:47 | [finally(1): exception(Exception)] throw ...; | Finally.cs:209:31:209:46 | [finally(1): exception(Exception)] object creation of type ExceptionC | -| Finally.cs:209:25:209:47 | [finally(1): exception(ExceptionB)] throw ...; | Finally.cs:209:31:209:46 | [finally(1): exception(ExceptionB)] object creation of type ExceptionC | -| Finally.cs:209:25:209:47 | [finally: exception(Exception), finally(1): exception(Exception)] throw ...; | Finally.cs:209:31:209:46 | [finally: exception(Exception), finally(1): exception(Exception)] object creation of type ExceptionC | -| Finally.cs:209:25:209:47 | [finally: exception(Exception), finally(1): exception(ExceptionB)] throw ...; | Finally.cs:209:31:209:46 | [finally: exception(Exception), finally(1): exception(ExceptionB)] object creation of type ExceptionC | -| Finally.cs:209:25:209:47 | [finally: exception(Exception)] throw ...; | Finally.cs:209:31:209:46 | [finally: exception(Exception)] object creation of type ExceptionC | -| Finally.cs:209:25:209:47 | [finally: exception(ExceptionA), finally(1): exception(Exception)] throw ...; | Finally.cs:209:31:209:46 | [finally: exception(ExceptionA), finally(1): exception(Exception)] object creation of type ExceptionC | -| Finally.cs:209:25:209:47 | [finally: exception(ExceptionA), finally(1): exception(ExceptionB)] throw ...; | Finally.cs:209:31:209:46 | [finally: exception(ExceptionA), finally(1): exception(ExceptionB)] object creation of type ExceptionC | -| Finally.cs:209:25:209:47 | [finally: exception(ExceptionA)] throw ...; | Finally.cs:209:31:209:46 | [finally: exception(ExceptionA)] object creation of type ExceptionC | +| Finally.cs:209:25:209:47 | [finally(1): exception] throw ...; | Finally.cs:209:31:209:46 | [finally(1): exception] object creation of type ExceptionC | +| Finally.cs:209:25:209:47 | [finally: exception, finally(1): exception] throw ...; | Finally.cs:209:31:209:46 | [finally: exception, finally(1): exception] object creation of type ExceptionC | +| Finally.cs:209:25:209:47 | [finally: exception] throw ...; | Finally.cs:209:31:209:46 | [finally: exception] object creation of type ExceptionC | | Finally.cs:209:25:209:47 | throw ...; | Finally.cs:209:31:209:46 | object creation of type ExceptionC | -| Finally.cs:211:13:211:16 | [finally: exception(Exception)] this access | Finally.cs:211:13:211:29 | [finally: exception(Exception)] ...; | -| Finally.cs:211:13:211:16 | [finally: exception(ExceptionA)] this access | Finally.cs:211:13:211:29 | [finally: exception(ExceptionA)] ...; | +| Finally.cs:211:13:211:16 | [finally: exception] this access | Finally.cs:211:13:211:29 | [finally: exception] ...; | | Finally.cs:211:13:211:16 | this access | Finally.cs:211:13:211:29 | ...; | | Finally.cs:211:13:211:28 | ... = ... | Finally.cs:211:26:211:28 | "0" | -| Finally.cs:211:13:211:28 | [finally: exception(Exception)] ... = ... | Finally.cs:211:26:211:28 | [finally: exception(Exception)] "0" | -| Finally.cs:211:13:211:28 | [finally: exception(ExceptionA)] ... = ... | Finally.cs:211:26:211:28 | [finally: exception(ExceptionA)] "0" | +| Finally.cs:211:13:211:28 | [finally: exception] ... = ... | Finally.cs:211:26:211:28 | [finally: exception] "0" | | Finally.cs:211:13:211:29 | ...; | Finally.cs:209:21:209:22 | access to parameter b3 | | Finally.cs:211:26:211:28 | "0" | Finally.cs:211:13:211:16 | this access | -| Finally.cs:211:26:211:28 | [finally: exception(Exception)] "0" | Finally.cs:211:13:211:16 | [finally: exception(Exception)] this access | -| Finally.cs:211:26:211:28 | [finally: exception(ExceptionA)] "0" | Finally.cs:211:13:211:16 | [finally: exception(ExceptionA)] this access | +| Finally.cs:211:26:211:28 | [finally: exception] "0" | Finally.cs:211:13:211:16 | [finally: exception] this access | | Finally.cs:213:9:213:12 | this access | Finally.cs:213:9:213:25 | ...; | | Finally.cs:213:9:213:24 | ... = ... | Finally.cs:213:22:213:24 | "1" | | Finally.cs:213:9:213:25 | ...; | Finally.cs:211:13:211:28 | ... = ... | @@ -6611,6 +6350,7 @@ postDominance | Finally.cs:230:9:230:33 | call to method WriteLine | Finally.cs:230:27:230:32 | "Done" | | Finally.cs:230:9:230:34 | ...; | Finally.cs:228:13:228:40 | call to method WriteLine | | Finally.cs:230:27:230:32 | "Done" | Finally.cs:230:9:230:34 | ...; | +| Finally.cs:233:10:233:12 | exit M12 (abnormal) | Finally.cs:258:13:258:46 | [finally: exception] call to method WriteLine | | Finally.cs:233:10:233:12 | exit M12 (normal) | Finally.cs:260:9:260:33 | call to method WriteLine | | Finally.cs:234:5:261:5 | {...} | Finally.cs:233:10:233:12 | enter M12 | | Finally.cs:235:9:259:9 | try {...} ... | Finally.cs:234:5:261:5 | {...} | @@ -6619,68 +6359,42 @@ postDominance | Finally.cs:238:13:241:13 | {...} | Finally.cs:237:13:253:13 | try {...} ... | | Finally.cs:239:17:240:43 | if (...) ... | Finally.cs:238:13:241:13 | {...} | | Finally.cs:239:21:239:22 | access to parameter b1 | Finally.cs:239:17:240:43 | if (...) ... | -| Finally.cs:243:13:253:13 | [finally: exception(ExceptionA)] {...} | Finally.cs:240:21:240:43 | throw ...; | | Finally.cs:243:13:253:13 | {...} | Finally.cs:239:21:239:22 | access to parameter b1 | -| Finally.cs:244:17:252:17 | [finally: exception(Exception)] try {...} ... | Finally.cs:243:13:253:13 | [finally: exception(Exception)] {...} | -| Finally.cs:244:17:252:17 | [finally: exception(ExceptionA)] try {...} ... | Finally.cs:243:13:253:13 | [finally: exception(ExceptionA)] {...} | +| Finally.cs:244:17:252:17 | [finally: exception] try {...} ... | Finally.cs:243:13:253:13 | [finally: exception] {...} | | Finally.cs:244:17:252:17 | try {...} ... | Finally.cs:243:13:253:13 | {...} | -| Finally.cs:245:17:248:17 | [finally: exception(Exception)] {...} | Finally.cs:244:17:252:17 | [finally: exception(Exception)] try {...} ... | -| Finally.cs:245:17:248:17 | [finally: exception(ExceptionA)] {...} | Finally.cs:244:17:252:17 | [finally: exception(ExceptionA)] try {...} ... | +| Finally.cs:245:17:248:17 | [finally: exception] {...} | Finally.cs:244:17:252:17 | [finally: exception] try {...} ... | | Finally.cs:245:17:248:17 | {...} | Finally.cs:244:17:252:17 | try {...} ... | -| Finally.cs:246:21:247:47 | [finally: exception(Exception)] if (...) ... | Finally.cs:245:17:248:17 | [finally: exception(Exception)] {...} | -| Finally.cs:246:21:247:47 | [finally: exception(ExceptionA)] if (...) ... | Finally.cs:245:17:248:17 | [finally: exception(ExceptionA)] {...} | +| Finally.cs:246:21:247:47 | [finally: exception] if (...) ... | Finally.cs:245:17:248:17 | [finally: exception] {...} | | Finally.cs:246:21:247:47 | if (...) ... | Finally.cs:245:17:248:17 | {...} | -| Finally.cs:246:25:246:26 | [finally: exception(Exception)] access to parameter b2 | Finally.cs:246:21:247:47 | [finally: exception(Exception)] if (...) ... | -| Finally.cs:246:25:246:26 | [finally: exception(ExceptionA)] access to parameter b2 | Finally.cs:246:21:247:47 | [finally: exception(ExceptionA)] if (...) ... | +| Finally.cs:246:25:246:26 | [finally: exception] access to parameter b2 | Finally.cs:246:21:247:47 | [finally: exception] if (...) ... | | Finally.cs:246:25:246:26 | access to parameter b2 | Finally.cs:246:21:247:47 | if (...) ... | -| Finally.cs:250:17:252:17 | [finally(1): exception(ExceptionA)] {...} | Finally.cs:247:25:247:47 | throw ...; | -| Finally.cs:250:17:252:17 | [finally: exception(Exception), finally(1): exception(ExceptionA)] {...} | Finally.cs:247:25:247:47 | [finally: exception(Exception)] throw ...; | -| Finally.cs:250:17:252:17 | [finally: exception(ExceptionA), finally(1): exception(ExceptionA)] {...} | Finally.cs:247:25:247:47 | [finally: exception(ExceptionA)] throw ...; | | Finally.cs:250:17:252:17 | {...} | Finally.cs:246:25:246:26 | access to parameter b2 | -| Finally.cs:251:21:251:54 | [finally(1): exception(Exception)] call to method WriteLine | Finally.cs:251:39:251:53 | [finally(1): exception(Exception)] "Inner finally" | -| Finally.cs:251:21:251:54 | [finally(1): exception(ExceptionA)] call to method WriteLine | Finally.cs:251:39:251:53 | [finally(1): exception(ExceptionA)] "Inner finally" | -| Finally.cs:251:21:251:54 | [finally: exception(Exception), finally(1): exception(Exception)] call to method WriteLine | Finally.cs:251:39:251:53 | [finally: exception(Exception), finally(1): exception(Exception)] "Inner finally" | -| Finally.cs:251:21:251:54 | [finally: exception(Exception), finally(1): exception(ExceptionA)] call to method WriteLine | Finally.cs:251:39:251:53 | [finally: exception(Exception), finally(1): exception(ExceptionA)] "Inner finally" | -| Finally.cs:251:21:251:54 | [finally: exception(Exception)] call to method WriteLine | Finally.cs:251:39:251:53 | [finally: exception(Exception)] "Inner finally" | -| Finally.cs:251:21:251:54 | [finally: exception(ExceptionA), finally(1): exception(Exception)] call to method WriteLine | Finally.cs:251:39:251:53 | [finally: exception(ExceptionA), finally(1): exception(Exception)] "Inner finally" | -| Finally.cs:251:21:251:54 | [finally: exception(ExceptionA), finally(1): exception(ExceptionA)] call to method WriteLine | Finally.cs:251:39:251:53 | [finally: exception(ExceptionA), finally(1): exception(ExceptionA)] "Inner finally" | -| Finally.cs:251:21:251:54 | [finally: exception(ExceptionA)] call to method WriteLine | Finally.cs:251:39:251:53 | [finally: exception(ExceptionA)] "Inner finally" | +| Finally.cs:251:21:251:54 | [finally(1): exception] call to method WriteLine | Finally.cs:251:39:251:53 | [finally(1): exception] "Inner finally" | +| Finally.cs:251:21:251:54 | [finally: exception, finally(1): exception] call to method WriteLine | Finally.cs:251:39:251:53 | [finally: exception, finally(1): exception] "Inner finally" | +| Finally.cs:251:21:251:54 | [finally: exception] call to method WriteLine | Finally.cs:251:39:251:53 | [finally: exception] "Inner finally" | | Finally.cs:251:21:251:54 | call to method WriteLine | Finally.cs:251:39:251:53 | "Inner finally" | | Finally.cs:251:21:251:55 | ...; | Finally.cs:250:17:252:17 | {...} | -| Finally.cs:251:21:251:55 | [finally(1): exception(Exception)] ...; | Finally.cs:250:17:252:17 | [finally(1): exception(Exception)] {...} | -| Finally.cs:251:21:251:55 | [finally(1): exception(ExceptionA)] ...; | Finally.cs:250:17:252:17 | [finally(1): exception(ExceptionA)] {...} | -| Finally.cs:251:21:251:55 | [finally: exception(Exception), finally(1): exception(Exception)] ...; | Finally.cs:250:17:252:17 | [finally: exception(Exception), finally(1): exception(Exception)] {...} | -| Finally.cs:251:21:251:55 | [finally: exception(Exception), finally(1): exception(ExceptionA)] ...; | Finally.cs:250:17:252:17 | [finally: exception(Exception), finally(1): exception(ExceptionA)] {...} | -| Finally.cs:251:21:251:55 | [finally: exception(Exception)] ...; | Finally.cs:250:17:252:17 | [finally: exception(Exception)] {...} | -| Finally.cs:251:21:251:55 | [finally: exception(ExceptionA), finally(1): exception(Exception)] ...; | Finally.cs:250:17:252:17 | [finally: exception(ExceptionA), finally(1): exception(Exception)] {...} | -| Finally.cs:251:21:251:55 | [finally: exception(ExceptionA), finally(1): exception(ExceptionA)] ...; | Finally.cs:250:17:252:17 | [finally: exception(ExceptionA), finally(1): exception(ExceptionA)] {...} | -| Finally.cs:251:21:251:55 | [finally: exception(ExceptionA)] ...; | Finally.cs:250:17:252:17 | [finally: exception(ExceptionA)] {...} | +| Finally.cs:251:21:251:55 | [finally(1): exception] ...; | Finally.cs:250:17:252:17 | [finally(1): exception] {...} | +| Finally.cs:251:21:251:55 | [finally: exception, finally(1): exception] ...; | Finally.cs:250:17:252:17 | [finally: exception, finally(1): exception] {...} | +| Finally.cs:251:21:251:55 | [finally: exception] ...; | Finally.cs:250:17:252:17 | [finally: exception] {...} | | Finally.cs:251:39:251:53 | "Inner finally" | Finally.cs:251:21:251:55 | ...; | -| Finally.cs:251:39:251:53 | [finally(1): exception(Exception)] "Inner finally" | Finally.cs:251:21:251:55 | [finally(1): exception(Exception)] ...; | -| Finally.cs:251:39:251:53 | [finally(1): exception(ExceptionA)] "Inner finally" | Finally.cs:251:21:251:55 | [finally(1): exception(ExceptionA)] ...; | -| Finally.cs:251:39:251:53 | [finally: exception(Exception), finally(1): exception(Exception)] "Inner finally" | Finally.cs:251:21:251:55 | [finally: exception(Exception), finally(1): exception(Exception)] ...; | -| Finally.cs:251:39:251:53 | [finally: exception(Exception), finally(1): exception(ExceptionA)] "Inner finally" | Finally.cs:251:21:251:55 | [finally: exception(Exception), finally(1): exception(ExceptionA)] ...; | -| Finally.cs:251:39:251:53 | [finally: exception(Exception)] "Inner finally" | Finally.cs:251:21:251:55 | [finally: exception(Exception)] ...; | -| Finally.cs:251:39:251:53 | [finally: exception(ExceptionA), finally(1): exception(Exception)] "Inner finally" | Finally.cs:251:21:251:55 | [finally: exception(ExceptionA), finally(1): exception(Exception)] ...; | -| Finally.cs:251:39:251:53 | [finally: exception(ExceptionA), finally(1): exception(ExceptionA)] "Inner finally" | Finally.cs:251:21:251:55 | [finally: exception(ExceptionA), finally(1): exception(ExceptionA)] ...; | -| Finally.cs:251:39:251:53 | [finally: exception(ExceptionA)] "Inner finally" | Finally.cs:251:21:251:55 | [finally: exception(ExceptionA)] ...; | +| Finally.cs:251:39:251:53 | [finally(1): exception] "Inner finally" | Finally.cs:251:21:251:55 | [finally(1): exception] ...; | +| Finally.cs:251:39:251:53 | [finally: exception, finally(1): exception] "Inner finally" | Finally.cs:251:21:251:55 | [finally: exception, finally(1): exception] ...; | +| Finally.cs:251:39:251:53 | [finally: exception] "Inner finally" | Finally.cs:251:21:251:55 | [finally: exception] ...; | | Finally.cs:254:13:254:44 | call to method WriteLine | Finally.cs:254:31:254:43 | "Mid finally" | | Finally.cs:254:13:254:45 | ...; | Finally.cs:251:21:251:54 | call to method WriteLine | | Finally.cs:254:31:254:43 | "Mid finally" | Finally.cs:254:13:254:45 | ...; | | Finally.cs:257:9:259:9 | {...} | Finally.cs:254:13:254:44 | call to method WriteLine | -| Finally.cs:258:13:258:46 | [finally: exception(Exception)] call to method WriteLine | Finally.cs:258:31:258:45 | [finally: exception(Exception)] "Outer finally" | -| Finally.cs:258:13:258:46 | [finally: exception(ExceptionA)] call to method WriteLine | Finally.cs:258:31:258:45 | [finally: exception(ExceptionA)] "Outer finally" | +| Finally.cs:258:13:258:46 | [finally: exception] call to method WriteLine | Finally.cs:258:31:258:45 | [finally: exception] "Outer finally" | | Finally.cs:258:13:258:46 | call to method WriteLine | Finally.cs:258:31:258:45 | "Outer finally" | | Finally.cs:258:13:258:47 | ...; | Finally.cs:257:9:259:9 | {...} | -| Finally.cs:258:13:258:47 | [finally: exception(Exception)] ...; | Finally.cs:257:9:259:9 | [finally: exception(Exception)] {...} | -| Finally.cs:258:13:258:47 | [finally: exception(ExceptionA)] ...; | Finally.cs:257:9:259:9 | [finally: exception(ExceptionA)] {...} | +| Finally.cs:258:13:258:47 | [finally: exception] ...; | Finally.cs:257:9:259:9 | [finally: exception] {...} | | Finally.cs:258:31:258:45 | "Outer finally" | Finally.cs:258:13:258:47 | ...; | -| Finally.cs:258:31:258:45 | [finally: exception(Exception)] "Outer finally" | Finally.cs:258:13:258:47 | [finally: exception(Exception)] ...; | -| Finally.cs:258:31:258:45 | [finally: exception(ExceptionA)] "Outer finally" | Finally.cs:258:13:258:47 | [finally: exception(ExceptionA)] ...; | +| Finally.cs:258:31:258:45 | [finally: exception] "Outer finally" | Finally.cs:258:13:258:47 | [finally: exception] ...; | | Finally.cs:260:9:260:33 | call to method WriteLine | Finally.cs:260:27:260:32 | "Done" | | Finally.cs:260:9:260:34 | ...; | Finally.cs:258:13:258:46 | call to method WriteLine | | Finally.cs:260:27:260:32 | "Done" | Finally.cs:260:9:260:34 | ...; | -| Finally.cs:263:10:263:12 | exit M13 (abnormal) | Finally.cs:272:13:272:18 | [finally: exception(Exception)] ... = ... | +| Finally.cs:263:10:263:12 | exit M13 (abnormal) | Finally.cs:272:13:272:18 | [finally: exception] ... = ... | | Finally.cs:263:10:263:12 | exit M13 (normal) | Finally.cs:272:13:272:18 | ... = ... | | Finally.cs:264:5:274:5 | {...} | Finally.cs:263:10:263:12 | enter M13 | | Finally.cs:265:9:273:9 | try {...} ... | Finally.cs:264:5:274:5 | {...} | @@ -6689,22 +6403,22 @@ postDominance | Finally.cs:267:13:267:35 | ...; | Finally.cs:266:9:268:9 | {...} | | Finally.cs:267:31:267:33 | "1" | Finally.cs:267:13:267:35 | ...; | | Finally.cs:270:9:273:9 | {...} | Finally.cs:267:13:267:34 | call to method WriteLine | -| Finally.cs:271:13:271:34 | [finally: exception(Exception)] call to method WriteLine | Finally.cs:271:31:271:33 | [finally: exception(Exception)] "3" | +| Finally.cs:271:13:271:34 | [finally: exception] call to method WriteLine | Finally.cs:271:31:271:33 | [finally: exception] "3" | | Finally.cs:271:13:271:34 | call to method WriteLine | Finally.cs:271:31:271:33 | "3" | | Finally.cs:271:13:271:35 | ...; | Finally.cs:270:9:273:9 | {...} | -| Finally.cs:271:13:271:35 | [finally: exception(Exception)] ...; | Finally.cs:270:9:273:9 | [finally: exception(Exception)] {...} | +| Finally.cs:271:13:271:35 | [finally: exception] ...; | Finally.cs:270:9:273:9 | [finally: exception] {...} | | Finally.cs:271:31:271:33 | "3" | Finally.cs:271:13:271:35 | ...; | -| Finally.cs:271:31:271:33 | [finally: exception(Exception)] "3" | Finally.cs:271:13:271:35 | [finally: exception(Exception)] ...; | -| Finally.cs:272:13:272:13 | [finally: exception(Exception)] access to parameter i | Finally.cs:272:13:272:19 | [finally: exception(Exception)] ...; | +| Finally.cs:271:31:271:33 | [finally: exception] "3" | Finally.cs:271:13:271:35 | [finally: exception] ...; | +| Finally.cs:272:13:272:13 | [finally: exception] access to parameter i | Finally.cs:272:13:272:19 | [finally: exception] ...; | | Finally.cs:272:13:272:13 | access to parameter i | Finally.cs:272:13:272:19 | ...; | | Finally.cs:272:13:272:18 | ... + ... | Finally.cs:272:18:272:18 | 3 | | Finally.cs:272:13:272:18 | ... = ... | Finally.cs:272:13:272:18 | ... + ... | -| Finally.cs:272:13:272:18 | [finally: exception(Exception)] ... + ... | Finally.cs:272:18:272:18 | [finally: exception(Exception)] 3 | -| Finally.cs:272:13:272:18 | [finally: exception(Exception)] ... = ... | Finally.cs:272:13:272:18 | [finally: exception(Exception)] ... + ... | +| Finally.cs:272:13:272:18 | [finally: exception] ... + ... | Finally.cs:272:18:272:18 | [finally: exception] 3 | +| Finally.cs:272:13:272:18 | [finally: exception] ... = ... | Finally.cs:272:13:272:18 | [finally: exception] ... + ... | | Finally.cs:272:13:272:19 | ...; | Finally.cs:271:13:271:34 | call to method WriteLine | -| Finally.cs:272:13:272:19 | [finally: exception(Exception)] ...; | Finally.cs:271:13:271:34 | [finally: exception(Exception)] call to method WriteLine | +| Finally.cs:272:13:272:19 | [finally: exception] ...; | Finally.cs:271:13:271:34 | [finally: exception] call to method WriteLine | | Finally.cs:272:18:272:18 | 3 | Finally.cs:272:13:272:13 | access to parameter i | -| Finally.cs:272:18:272:18 | [finally: exception(Exception)] 3 | Finally.cs:272:13:272:13 | [finally: exception(Exception)] access to parameter i | +| Finally.cs:272:18:272:18 | [finally: exception] 3 | Finally.cs:272:13:272:13 | [finally: exception] access to parameter i | | Foreach.cs:4:7:4:13 | call to constructor Object | Foreach.cs:4:7:4:13 | enter Foreach | | Foreach.cs:4:7:4:13 | exit Foreach | Foreach.cs:4:7:4:13 | exit Foreach (normal) | | Foreach.cs:4:7:4:13 | exit Foreach (normal) | Foreach.cs:4:7:4:13 | {...} | @@ -10543,14 +10257,13 @@ blockDominance | Finally.cs:3:14:3:20 | enter Finally | Finally.cs:3:14:3:20 | enter Finally | | Finally.cs:7:10:7:11 | enter M1 | Finally.cs:7:10:7:11 | enter M1 | | Finally.cs:7:10:7:11 | enter M1 | Finally.cs:7:10:7:11 | exit M1 | -| Finally.cs:7:10:7:11 | enter M1 | Finally.cs:14:9:16:9 | [finally: exception(Exception)] {...} | +| Finally.cs:7:10:7:11 | enter M1 | Finally.cs:14:9:16:9 | [finally: exception] {...} | | Finally.cs:7:10:7:11 | enter M1 | Finally.cs:14:9:16:9 | {...} | | Finally.cs:7:10:7:11 | exit M1 | Finally.cs:7:10:7:11 | exit M1 | -| Finally.cs:14:9:16:9 | [finally: exception(Exception)] {...} | Finally.cs:14:9:16:9 | [finally: exception(Exception)] {...} | +| Finally.cs:14:9:16:9 | [finally: exception] {...} | Finally.cs:14:9:16:9 | [finally: exception] {...} | | Finally.cs:14:9:16:9 | {...} | Finally.cs:14:9:16:9 | {...} | | Finally.cs:19:10:19:11 | enter M2 | Finally.cs:19:10:19:11 | enter M2 | | Finally.cs:19:10:19:11 | enter M2 | Finally.cs:19:10:19:11 | exit M2 | -| Finally.cs:19:10:19:11 | enter M2 | Finally.cs:19:10:19:11 | exit M2 (abnormal) | | Finally.cs:19:10:19:11 | enter M2 | Finally.cs:19:10:19:11 | exit M2 (normal) | | Finally.cs:19:10:19:11 | enter M2 | Finally.cs:24:13:24:19 | return ...; | | Finally.cs:19:10:19:11 | enter M2 | Finally.cs:26:9:29:9 | [exception: Exception] catch (...) {...} | @@ -10561,11 +10274,10 @@ blockDominance | Finally.cs:19:10:19:11 | enter M2 | Finally.cs:34:27:34:32 | throw ...; | | Finally.cs:19:10:19:11 | enter M2 | Finally.cs:41:9:43:9 | [exception: Exception] catch (...) {...} | | Finally.cs:19:10:19:11 | enter M2 | Finally.cs:42:9:43:9 | {...} | +| Finally.cs:19:10:19:11 | enter M2 | Finally.cs:49:9:51:9 | [finally: exception] {...} | | Finally.cs:19:10:19:11 | exit M2 | Finally.cs:19:10:19:11 | exit M2 | -| Finally.cs:19:10:19:11 | exit M2 (abnormal) | Finally.cs:19:10:19:11 | exit M2 (abnormal) | | Finally.cs:19:10:19:11 | exit M2 (normal) | Finally.cs:19:10:19:11 | exit M2 (normal) | | Finally.cs:24:13:24:19 | return ...; | Finally.cs:24:13:24:19 | return ...; | -| Finally.cs:26:9:29:9 | [exception: Exception] catch (...) {...} | Finally.cs:19:10:19:11 | exit M2 (abnormal) | | Finally.cs:26:9:29:9 | [exception: Exception] catch (...) {...} | Finally.cs:26:9:29:9 | [exception: Exception] catch (...) {...} | | Finally.cs:26:9:29:9 | [exception: Exception] catch (...) {...} | Finally.cs:26:38:26:39 | [exception: Exception] IOException ex | | Finally.cs:26:9:29:9 | [exception: Exception] catch (...) {...} | Finally.cs:27:9:29:9 | {...} | @@ -10574,6 +10286,7 @@ blockDominance | Finally.cs:26:9:29:9 | [exception: Exception] catch (...) {...} | Finally.cs:34:27:34:32 | throw ...; | | Finally.cs:26:9:29:9 | [exception: Exception] catch (...) {...} | Finally.cs:41:9:43:9 | [exception: Exception] catch (...) {...} | | Finally.cs:26:9:29:9 | [exception: Exception] catch (...) {...} | Finally.cs:42:9:43:9 | {...} | +| Finally.cs:26:9:29:9 | [exception: Exception] catch (...) {...} | Finally.cs:49:9:51:9 | [finally: exception] {...} | | Finally.cs:26:38:26:39 | [exception: Exception] IOException ex | Finally.cs:26:38:26:39 | [exception: Exception] IOException ex | | Finally.cs:26:38:26:39 | [exception: Exception] IOException ex | Finally.cs:27:9:29:9 | {...} | | Finally.cs:27:9:29:9 | {...} | Finally.cs:27:9:29:9 | {...} | @@ -10588,9 +10301,9 @@ blockDominance | Finally.cs:41:9:43:9 | [exception: Exception] catch (...) {...} | Finally.cs:41:9:43:9 | [exception: Exception] catch (...) {...} | | Finally.cs:41:9:43:9 | [exception: Exception] catch (...) {...} | Finally.cs:42:9:43:9 | {...} | | Finally.cs:42:9:43:9 | {...} | Finally.cs:42:9:43:9 | {...} | +| Finally.cs:49:9:51:9 | [finally: exception] {...} | Finally.cs:49:9:51:9 | [finally: exception] {...} | | Finally.cs:54:10:54:11 | enter M3 | Finally.cs:54:10:54:11 | enter M3 | | Finally.cs:54:10:54:11 | enter M3 | Finally.cs:54:10:54:11 | exit M3 | -| Finally.cs:54:10:54:11 | enter M3 | Finally.cs:54:10:54:11 | exit M3 (abnormal) | | Finally.cs:54:10:54:11 | enter M3 | Finally.cs:54:10:54:11 | exit M3 (normal) | | Finally.cs:54:10:54:11 | enter M3 | Finally.cs:59:13:59:19 | return ...; | | Finally.cs:54:10:54:11 | enter M3 | Finally.cs:61:9:64:9 | [exception: Exception] catch (...) {...} | @@ -10599,31 +10312,27 @@ blockDominance | Finally.cs:54:10:54:11 | enter M3 | Finally.cs:65:9:67:9 | [exception: Exception] catch (...) {...} | | Finally.cs:54:10:54:11 | enter M3 | Finally.cs:65:26:65:26 | [exception: Exception] Exception e | | Finally.cs:54:10:54:11 | enter M3 | Finally.cs:66:9:67:9 | {...} | -| Finally.cs:54:10:54:11 | enter M3 | Finally.cs:69:9:71:9 | [finally: exception(Exception)] {...} | +| Finally.cs:54:10:54:11 | enter M3 | Finally.cs:69:9:71:9 | [finally: exception] {...} | | Finally.cs:54:10:54:11 | exit M3 | Finally.cs:54:10:54:11 | exit M3 | -| Finally.cs:54:10:54:11 | exit M3 (abnormal) | Finally.cs:54:10:54:11 | exit M3 (abnormal) | | Finally.cs:54:10:54:11 | exit M3 (normal) | Finally.cs:54:10:54:11 | exit M3 (normal) | | Finally.cs:59:13:59:19 | return ...; | Finally.cs:59:13:59:19 | return ...; | -| Finally.cs:61:9:64:9 | [exception: Exception] catch (...) {...} | Finally.cs:54:10:54:11 | exit M3 (abnormal) | | Finally.cs:61:9:64:9 | [exception: Exception] catch (...) {...} | Finally.cs:61:9:64:9 | [exception: Exception] catch (...) {...} | | Finally.cs:61:9:64:9 | [exception: Exception] catch (...) {...} | Finally.cs:61:38:61:39 | [exception: Exception] IOException ex | | Finally.cs:61:9:64:9 | [exception: Exception] catch (...) {...} | Finally.cs:62:9:64:9 | {...} | | Finally.cs:61:9:64:9 | [exception: Exception] catch (...) {...} | Finally.cs:65:9:67:9 | [exception: Exception] catch (...) {...} | | Finally.cs:61:9:64:9 | [exception: Exception] catch (...) {...} | Finally.cs:65:26:65:26 | [exception: Exception] Exception e | | Finally.cs:61:9:64:9 | [exception: Exception] catch (...) {...} | Finally.cs:66:9:67:9 | {...} | -| Finally.cs:61:9:64:9 | [exception: Exception] catch (...) {...} | Finally.cs:69:9:71:9 | [finally: exception(Exception)] {...} | +| Finally.cs:61:9:64:9 | [exception: Exception] catch (...) {...} | Finally.cs:69:9:71:9 | [finally: exception] {...} | | Finally.cs:61:38:61:39 | [exception: Exception] IOException ex | Finally.cs:61:38:61:39 | [exception: Exception] IOException ex | | Finally.cs:61:38:61:39 | [exception: Exception] IOException ex | Finally.cs:62:9:64:9 | {...} | | Finally.cs:62:9:64:9 | {...} | Finally.cs:62:9:64:9 | {...} | | Finally.cs:65:9:67:9 | [exception: Exception] catch (...) {...} | Finally.cs:65:9:67:9 | [exception: Exception] catch (...) {...} | | Finally.cs:65:9:67:9 | [exception: Exception] catch (...) {...} | Finally.cs:65:26:65:26 | [exception: Exception] Exception e | | Finally.cs:65:9:67:9 | [exception: Exception] catch (...) {...} | Finally.cs:66:9:67:9 | {...} | -| Finally.cs:65:9:67:9 | [exception: Exception] catch (...) {...} | Finally.cs:69:9:71:9 | [finally: exception(Exception)] {...} | | Finally.cs:65:26:65:26 | [exception: Exception] Exception e | Finally.cs:65:26:65:26 | [exception: Exception] Exception e | | Finally.cs:65:26:65:26 | [exception: Exception] Exception e | Finally.cs:66:9:67:9 | {...} | -| Finally.cs:65:26:65:26 | [exception: Exception] Exception e | Finally.cs:69:9:71:9 | [finally: exception(Exception)] {...} | | Finally.cs:66:9:67:9 | {...} | Finally.cs:66:9:67:9 | {...} | -| Finally.cs:69:9:71:9 | [finally: exception(Exception)] {...} | Finally.cs:69:9:71:9 | [finally: exception(Exception)] {...} | +| Finally.cs:69:9:71:9 | [finally: exception] {...} | Finally.cs:69:9:71:9 | [finally: exception] {...} | | Finally.cs:74:10:74:11 | enter M4 | Finally.cs:74:10:74:11 | enter M4 | | Finally.cs:74:10:74:11 | enter M4 | Finally.cs:74:10:74:11 | exit M4 | | Finally.cs:74:10:74:11 | enter M4 | Finally.cs:74:10:74:11 | exit M4 (abnormal) | @@ -10644,12 +10353,12 @@ blockDominance | Finally.cs:74:10:74:11 | enter M4 | Finally.cs:93:31:93:45 | [finally: continue] object creation of type Exception | | Finally.cs:74:10:74:11 | enter M4 | Finally.cs:93:31:93:45 | [finally: return] object creation of type Exception | | Finally.cs:74:10:74:11 | enter M4 | Finally.cs:93:31:93:45 | object creation of type Exception | -| Finally.cs:74:10:74:11 | enter M4 | Finally.cs:96:17:98:17 | [finally(1): exception(Exception)] {...} | -| Finally.cs:74:10:74:11 | enter M4 | Finally.cs:96:17:98:17 | [finally: break, finally(1): exception(Exception)] {...} | +| Finally.cs:74:10:74:11 | enter M4 | Finally.cs:96:17:98:17 | [finally(1): exception] {...} | +| Finally.cs:74:10:74:11 | enter M4 | Finally.cs:96:17:98:17 | [finally: break, finally(1): exception] {...} | | Finally.cs:74:10:74:11 | enter M4 | Finally.cs:96:17:98:17 | [finally: break] {...} | -| Finally.cs:74:10:74:11 | enter M4 | Finally.cs:96:17:98:17 | [finally: continue, finally(1): exception(Exception)] {...} | +| Finally.cs:74:10:74:11 | enter M4 | Finally.cs:96:17:98:17 | [finally: continue, finally(1): exception] {...} | | Finally.cs:74:10:74:11 | enter M4 | Finally.cs:96:17:98:17 | [finally: continue] {...} | -| Finally.cs:74:10:74:11 | enter M4 | Finally.cs:96:17:98:17 | [finally: return, finally(1): exception(Exception)] {...} | +| Finally.cs:74:10:74:11 | enter M4 | Finally.cs:96:17:98:17 | [finally: return, finally(1): exception] {...} | | Finally.cs:74:10:74:11 | enter M4 | Finally.cs:96:17:98:17 | [finally: return] {...} | | Finally.cs:74:10:74:11 | enter M4 | Finally.cs:96:17:98:17 | {...} | | Finally.cs:74:10:74:11 | exit M4 | Finally.cs:74:10:74:11 | exit M4 | @@ -10674,12 +10383,12 @@ blockDominance | Finally.cs:77:16:77:16 | access to local variable i | Finally.cs:93:31:93:45 | [finally: continue] object creation of type Exception | | Finally.cs:77:16:77:16 | access to local variable i | Finally.cs:93:31:93:45 | [finally: return] object creation of type Exception | | Finally.cs:77:16:77:16 | access to local variable i | Finally.cs:93:31:93:45 | object creation of type Exception | -| Finally.cs:77:16:77:16 | access to local variable i | Finally.cs:96:17:98:17 | [finally(1): exception(Exception)] {...} | -| Finally.cs:77:16:77:16 | access to local variable i | Finally.cs:96:17:98:17 | [finally: break, finally(1): exception(Exception)] {...} | +| Finally.cs:77:16:77:16 | access to local variable i | Finally.cs:96:17:98:17 | [finally(1): exception] {...} | +| Finally.cs:77:16:77:16 | access to local variable i | Finally.cs:96:17:98:17 | [finally: break, finally(1): exception] {...} | | Finally.cs:77:16:77:16 | access to local variable i | Finally.cs:96:17:98:17 | [finally: break] {...} | -| Finally.cs:77:16:77:16 | access to local variable i | Finally.cs:96:17:98:17 | [finally: continue, finally(1): exception(Exception)] {...} | +| Finally.cs:77:16:77:16 | access to local variable i | Finally.cs:96:17:98:17 | [finally: continue, finally(1): exception] {...} | | Finally.cs:77:16:77:16 | access to local variable i | Finally.cs:96:17:98:17 | [finally: continue] {...} | -| Finally.cs:77:16:77:16 | access to local variable i | Finally.cs:96:17:98:17 | [finally: return, finally(1): exception(Exception)] {...} | +| Finally.cs:77:16:77:16 | access to local variable i | Finally.cs:96:17:98:17 | [finally: return, finally(1): exception] {...} | | Finally.cs:77:16:77:16 | access to local variable i | Finally.cs:96:17:98:17 | [finally: return] {...} | | Finally.cs:77:16:77:16 | access to local variable i | Finally.cs:96:17:98:17 | {...} | | Finally.cs:78:9:100:9 | {...} | Finally.cs:74:10:74:11 | exit M4 (abnormal) | @@ -10698,18 +10407,18 @@ blockDominance | Finally.cs:78:9:100:9 | {...} | Finally.cs:93:31:93:45 | [finally: continue] object creation of type Exception | | Finally.cs:78:9:100:9 | {...} | Finally.cs:93:31:93:45 | [finally: return] object creation of type Exception | | Finally.cs:78:9:100:9 | {...} | Finally.cs:93:31:93:45 | object creation of type Exception | -| Finally.cs:78:9:100:9 | {...} | Finally.cs:96:17:98:17 | [finally(1): exception(Exception)] {...} | -| Finally.cs:78:9:100:9 | {...} | Finally.cs:96:17:98:17 | [finally: break, finally(1): exception(Exception)] {...} | +| Finally.cs:78:9:100:9 | {...} | Finally.cs:96:17:98:17 | [finally(1): exception] {...} | +| Finally.cs:78:9:100:9 | {...} | Finally.cs:96:17:98:17 | [finally: break, finally(1): exception] {...} | | Finally.cs:78:9:100:9 | {...} | Finally.cs:96:17:98:17 | [finally: break] {...} | -| Finally.cs:78:9:100:9 | {...} | Finally.cs:96:17:98:17 | [finally: continue, finally(1): exception(Exception)] {...} | +| Finally.cs:78:9:100:9 | {...} | Finally.cs:96:17:98:17 | [finally: continue, finally(1): exception] {...} | | Finally.cs:78:9:100:9 | {...} | Finally.cs:96:17:98:17 | [finally: continue] {...} | -| Finally.cs:78:9:100:9 | {...} | Finally.cs:96:17:98:17 | [finally: return, finally(1): exception(Exception)] {...} | +| Finally.cs:78:9:100:9 | {...} | Finally.cs:96:17:98:17 | [finally: return, finally(1): exception] {...} | | Finally.cs:78:9:100:9 | {...} | Finally.cs:96:17:98:17 | [finally: return] {...} | | Finally.cs:78:9:100:9 | {...} | Finally.cs:96:17:98:17 | {...} | | Finally.cs:82:21:82:27 | return ...; | Finally.cs:82:21:82:27 | return ...; | | Finally.cs:82:21:82:27 | return ...; | Finally.cs:93:25:93:46 | [finally: return] throw ...; | | Finally.cs:82:21:82:27 | return ...; | Finally.cs:93:31:93:45 | [finally: return] object creation of type Exception | -| Finally.cs:82:21:82:27 | return ...; | Finally.cs:96:17:98:17 | [finally: return, finally(1): exception(Exception)] {...} | +| Finally.cs:82:21:82:27 | return ...; | Finally.cs:96:17:98:17 | [finally: return, finally(1): exception] {...} | | Finally.cs:82:21:82:27 | return ...; | Finally.cs:96:17:98:17 | [finally: return] {...} | | Finally.cs:83:17:84:29 | if (...) ... | Finally.cs:83:17:84:29 | if (...) ... | | Finally.cs:83:17:84:29 | if (...) ... | Finally.cs:84:21:84:29 | continue; | @@ -10722,16 +10431,16 @@ blockDominance | Finally.cs:83:17:84:29 | if (...) ... | Finally.cs:93:31:93:45 | [finally: break] object creation of type Exception | | Finally.cs:83:17:84:29 | if (...) ... | Finally.cs:93:31:93:45 | [finally: continue] object creation of type Exception | | Finally.cs:83:17:84:29 | if (...) ... | Finally.cs:93:31:93:45 | object creation of type Exception | -| Finally.cs:83:17:84:29 | if (...) ... | Finally.cs:96:17:98:17 | [finally(1): exception(Exception)] {...} | -| Finally.cs:83:17:84:29 | if (...) ... | Finally.cs:96:17:98:17 | [finally: break, finally(1): exception(Exception)] {...} | +| Finally.cs:83:17:84:29 | if (...) ... | Finally.cs:96:17:98:17 | [finally(1): exception] {...} | +| Finally.cs:83:17:84:29 | if (...) ... | Finally.cs:96:17:98:17 | [finally: break, finally(1): exception] {...} | | Finally.cs:83:17:84:29 | if (...) ... | Finally.cs:96:17:98:17 | [finally: break] {...} | -| Finally.cs:83:17:84:29 | if (...) ... | Finally.cs:96:17:98:17 | [finally: continue, finally(1): exception(Exception)] {...} | +| Finally.cs:83:17:84:29 | if (...) ... | Finally.cs:96:17:98:17 | [finally: continue, finally(1): exception] {...} | | Finally.cs:83:17:84:29 | if (...) ... | Finally.cs:96:17:98:17 | [finally: continue] {...} | | Finally.cs:83:17:84:29 | if (...) ... | Finally.cs:96:17:98:17 | {...} | | Finally.cs:84:21:84:29 | continue; | Finally.cs:84:21:84:29 | continue; | | Finally.cs:84:21:84:29 | continue; | Finally.cs:93:25:93:46 | [finally: continue] throw ...; | | Finally.cs:84:21:84:29 | continue; | Finally.cs:93:31:93:45 | [finally: continue] object creation of type Exception | -| Finally.cs:84:21:84:29 | continue; | Finally.cs:96:17:98:17 | [finally: continue, finally(1): exception(Exception)] {...} | +| Finally.cs:84:21:84:29 | continue; | Finally.cs:96:17:98:17 | [finally: continue, finally(1): exception] {...} | | Finally.cs:84:21:84:29 | continue; | Finally.cs:96:17:98:17 | [finally: continue] {...} | | Finally.cs:85:17:86:26 | if (...) ... | Finally.cs:85:17:86:26 | if (...) ... | | Finally.cs:85:17:86:26 | if (...) ... | Finally.cs:86:21:86:26 | break; | @@ -10740,19 +10449,19 @@ blockDominance | Finally.cs:85:17:86:26 | if (...) ... | Finally.cs:93:25:93:46 | throw ...; | | Finally.cs:85:17:86:26 | if (...) ... | Finally.cs:93:31:93:45 | [finally: break] object creation of type Exception | | Finally.cs:85:17:86:26 | if (...) ... | Finally.cs:93:31:93:45 | object creation of type Exception | -| Finally.cs:85:17:86:26 | if (...) ... | Finally.cs:96:17:98:17 | [finally(1): exception(Exception)] {...} | -| Finally.cs:85:17:86:26 | if (...) ... | Finally.cs:96:17:98:17 | [finally: break, finally(1): exception(Exception)] {...} | +| Finally.cs:85:17:86:26 | if (...) ... | Finally.cs:96:17:98:17 | [finally(1): exception] {...} | +| Finally.cs:85:17:86:26 | if (...) ... | Finally.cs:96:17:98:17 | [finally: break, finally(1): exception] {...} | | Finally.cs:85:17:86:26 | if (...) ... | Finally.cs:96:17:98:17 | [finally: break] {...} | | Finally.cs:85:17:86:26 | if (...) ... | Finally.cs:96:17:98:17 | {...} | | Finally.cs:86:21:86:26 | break; | Finally.cs:86:21:86:26 | break; | | Finally.cs:86:21:86:26 | break; | Finally.cs:93:25:93:46 | [finally: break] throw ...; | | Finally.cs:86:21:86:26 | break; | Finally.cs:93:31:93:45 | [finally: break] object creation of type Exception | -| Finally.cs:86:21:86:26 | break; | Finally.cs:96:17:98:17 | [finally: break, finally(1): exception(Exception)] {...} | +| Finally.cs:86:21:86:26 | break; | Finally.cs:96:17:98:17 | [finally: break, finally(1): exception] {...} | | Finally.cs:86:21:86:26 | break; | Finally.cs:96:17:98:17 | [finally: break] {...} | | Finally.cs:89:13:99:13 | {...} | Finally.cs:89:13:99:13 | {...} | | Finally.cs:89:13:99:13 | {...} | Finally.cs:93:25:93:46 | throw ...; | | Finally.cs:89:13:99:13 | {...} | Finally.cs:93:31:93:45 | object creation of type Exception | -| Finally.cs:89:13:99:13 | {...} | Finally.cs:96:17:98:17 | [finally(1): exception(Exception)] {...} | +| Finally.cs:89:13:99:13 | {...} | Finally.cs:96:17:98:17 | [finally(1): exception] {...} | | Finally.cs:89:13:99:13 | {...} | Finally.cs:96:17:98:17 | {...} | | Finally.cs:93:25:93:46 | [finally: break] throw ...; | Finally.cs:93:25:93:46 | [finally: break] throw ...; | | Finally.cs:93:25:93:46 | [finally: continue] throw ...; | Finally.cs:93:25:93:46 | [finally: continue] throw ...; | @@ -10760,22 +10469,22 @@ blockDominance | Finally.cs:93:25:93:46 | throw ...; | Finally.cs:93:25:93:46 | throw ...; | | Finally.cs:93:31:93:45 | [finally: break] object creation of type Exception | Finally.cs:93:25:93:46 | [finally: break] throw ...; | | Finally.cs:93:31:93:45 | [finally: break] object creation of type Exception | Finally.cs:93:31:93:45 | [finally: break] object creation of type Exception | -| Finally.cs:93:31:93:45 | [finally: break] object creation of type Exception | Finally.cs:96:17:98:17 | [finally: break, finally(1): exception(Exception)] {...} | +| Finally.cs:93:31:93:45 | [finally: break] object creation of type Exception | Finally.cs:96:17:98:17 | [finally: break, finally(1): exception] {...} | | Finally.cs:93:31:93:45 | [finally: continue] object creation of type Exception | Finally.cs:93:25:93:46 | [finally: continue] throw ...; | | Finally.cs:93:31:93:45 | [finally: continue] object creation of type Exception | Finally.cs:93:31:93:45 | [finally: continue] object creation of type Exception | -| Finally.cs:93:31:93:45 | [finally: continue] object creation of type Exception | Finally.cs:96:17:98:17 | [finally: continue, finally(1): exception(Exception)] {...} | +| Finally.cs:93:31:93:45 | [finally: continue] object creation of type Exception | Finally.cs:96:17:98:17 | [finally: continue, finally(1): exception] {...} | | Finally.cs:93:31:93:45 | [finally: return] object creation of type Exception | Finally.cs:93:25:93:46 | [finally: return] throw ...; | | Finally.cs:93:31:93:45 | [finally: return] object creation of type Exception | Finally.cs:93:31:93:45 | [finally: return] object creation of type Exception | -| Finally.cs:93:31:93:45 | [finally: return] object creation of type Exception | Finally.cs:96:17:98:17 | [finally: return, finally(1): exception(Exception)] {...} | +| Finally.cs:93:31:93:45 | [finally: return] object creation of type Exception | Finally.cs:96:17:98:17 | [finally: return, finally(1): exception] {...} | | Finally.cs:93:31:93:45 | object creation of type Exception | Finally.cs:93:25:93:46 | throw ...; | | Finally.cs:93:31:93:45 | object creation of type Exception | Finally.cs:93:31:93:45 | object creation of type Exception | -| Finally.cs:93:31:93:45 | object creation of type Exception | Finally.cs:96:17:98:17 | [finally(1): exception(Exception)] {...} | -| Finally.cs:96:17:98:17 | [finally(1): exception(Exception)] {...} | Finally.cs:96:17:98:17 | [finally(1): exception(Exception)] {...} | -| Finally.cs:96:17:98:17 | [finally: break, finally(1): exception(Exception)] {...} | Finally.cs:96:17:98:17 | [finally: break, finally(1): exception(Exception)] {...} | +| Finally.cs:93:31:93:45 | object creation of type Exception | Finally.cs:96:17:98:17 | [finally(1): exception] {...} | +| Finally.cs:96:17:98:17 | [finally(1): exception] {...} | Finally.cs:96:17:98:17 | [finally(1): exception] {...} | +| Finally.cs:96:17:98:17 | [finally: break, finally(1): exception] {...} | Finally.cs:96:17:98:17 | [finally: break, finally(1): exception] {...} | | Finally.cs:96:17:98:17 | [finally: break] {...} | Finally.cs:96:17:98:17 | [finally: break] {...} | -| Finally.cs:96:17:98:17 | [finally: continue, finally(1): exception(Exception)] {...} | Finally.cs:96:17:98:17 | [finally: continue, finally(1): exception(Exception)] {...} | +| Finally.cs:96:17:98:17 | [finally: continue, finally(1): exception] {...} | Finally.cs:96:17:98:17 | [finally: continue, finally(1): exception] {...} | | Finally.cs:96:17:98:17 | [finally: continue] {...} | Finally.cs:96:17:98:17 | [finally: continue] {...} | -| Finally.cs:96:17:98:17 | [finally: return, finally(1): exception(Exception)] {...} | Finally.cs:96:17:98:17 | [finally: return, finally(1): exception(Exception)] {...} | +| Finally.cs:96:17:98:17 | [finally: return, finally(1): exception] {...} | Finally.cs:96:17:98:17 | [finally: return, finally(1): exception] {...} | | Finally.cs:96:17:98:17 | [finally: return] {...} | Finally.cs:96:17:98:17 | [finally: return] {...} | | Finally.cs:96:17:98:17 | {...} | Finally.cs:96:17:98:17 | {...} | | Finally.cs:103:10:103:11 | enter M5 | Finally.cs:103:10:103:11 | enter M5 | @@ -10790,33 +10499,22 @@ blockDominance | Finally.cs:103:10:103:11 | enter M5 | Finally.cs:109:33:109:33 | 1 | | Finally.cs:103:10:103:11 | enter M5 | Finally.cs:110:17:110:49 | throw ...; | | Finally.cs:103:10:103:11 | enter M5 | Finally.cs:110:23:110:48 | object creation of type OutOfMemoryException | -| Finally.cs:103:10:103:11 | enter M5 | Finally.cs:113:9:118:9 | [finally: exception(Exception)] {...} | -| Finally.cs:103:10:103:11 | enter M5 | Finally.cs:113:9:118:9 | [finally: exception(NullReferenceException)] {...} | +| Finally.cs:103:10:103:11 | enter M5 | Finally.cs:113:9:118:9 | [finally: exception] {...} | | Finally.cs:103:10:103:11 | enter M5 | Finally.cs:113:9:118:9 | {...} | -| Finally.cs:103:10:103:11 | enter M5 | Finally.cs:114:17:114:36 | [false, finally: exception(Exception)] !... | -| Finally.cs:103:10:103:11 | enter M5 | Finally.cs:114:17:114:36 | [false, finally: exception(NullReferenceException)] !... | -| Finally.cs:103:10:103:11 | enter M5 | Finally.cs:114:17:114:36 | [false, finally: exception(OutOfMemoryException)] !... | +| Finally.cs:103:10:103:11 | enter M5 | Finally.cs:114:17:114:36 | [false, finally: exception] !... | | Finally.cs:103:10:103:11 | enter M5 | Finally.cs:114:17:114:36 | [false, finally: return] !... | | Finally.cs:103:10:103:11 | enter M5 | Finally.cs:114:17:114:36 | [false] !... | -| Finally.cs:103:10:103:11 | enter M5 | Finally.cs:114:17:114:36 | [true, finally: exception(Exception)] !... | -| Finally.cs:103:10:103:11 | enter M5 | Finally.cs:114:17:114:36 | [true, finally: exception(NullReferenceException)] !... | -| Finally.cs:103:10:103:11 | enter M5 | Finally.cs:114:17:114:36 | [true, finally: exception(OutOfMemoryException)] !... | +| Finally.cs:103:10:103:11 | enter M5 | Finally.cs:114:17:114:36 | [true, finally: exception] !... | | Finally.cs:103:10:103:11 | enter M5 | Finally.cs:114:17:114:36 | [true, finally: return] !... | | Finally.cs:103:10:103:11 | enter M5 | Finally.cs:114:17:114:36 | [true] !... | | Finally.cs:103:10:103:11 | enter M5 | Finally.cs:115:17:115:41 | ...; | -| Finally.cs:103:10:103:11 | enter M5 | Finally.cs:115:17:115:41 | [finally: exception(Exception)] ...; | -| Finally.cs:103:10:103:11 | enter M5 | Finally.cs:115:17:115:41 | [finally: exception(NullReferenceException)] ...; | -| Finally.cs:103:10:103:11 | enter M5 | Finally.cs:115:17:115:41 | [finally: exception(OutOfMemoryException)] ...; | +| Finally.cs:103:10:103:11 | enter M5 | Finally.cs:115:17:115:41 | [finally: exception] ...; | | Finally.cs:103:10:103:11 | enter M5 | Finally.cs:115:17:115:41 | [finally: return] ...; | -| Finally.cs:103:10:103:11 | enter M5 | Finally.cs:116:13:117:37 | [finally: exception(Exception)] if (...) ... | -| Finally.cs:103:10:103:11 | enter M5 | Finally.cs:116:13:117:37 | [finally: exception(NullReferenceException)] if (...) ... | -| Finally.cs:103:10:103:11 | enter M5 | Finally.cs:116:13:117:37 | [finally: exception(OutOfMemoryException)] if (...) ... | +| Finally.cs:103:10:103:11 | enter M5 | Finally.cs:116:13:117:37 | [finally: exception] if (...) ... | | Finally.cs:103:10:103:11 | enter M5 | Finally.cs:116:13:117:37 | [finally: return] if (...) ... | | Finally.cs:103:10:103:11 | enter M5 | Finally.cs:116:13:117:37 | if (...) ... | | Finally.cs:103:10:103:11 | enter M5 | Finally.cs:117:17:117:37 | ...; | -| Finally.cs:103:10:103:11 | enter M5 | Finally.cs:117:17:117:37 | [finally: exception(Exception)] ...; | -| Finally.cs:103:10:103:11 | enter M5 | Finally.cs:117:17:117:37 | [finally: exception(NullReferenceException)] ...; | -| Finally.cs:103:10:103:11 | enter M5 | Finally.cs:117:17:117:37 | [finally: exception(OutOfMemoryException)] ...; | +| Finally.cs:103:10:103:11 | enter M5 | Finally.cs:117:17:117:37 | [finally: exception] ...; | | Finally.cs:103:10:103:11 | enter M5 | Finally.cs:117:17:117:37 | [finally: return] ...; | | Finally.cs:103:10:103:11 | exit M5 | Finally.cs:103:10:103:11 | exit M5 | | Finally.cs:103:10:103:11 | exit M5 (abnormal) | Finally.cs:103:10:103:11 | exit M5 (abnormal) | @@ -10830,27 +10528,16 @@ blockDominance | Finally.cs:107:17:107:28 | access to property Length | Finally.cs:109:33:109:33 | 1 | | Finally.cs:107:17:107:28 | access to property Length | Finally.cs:110:17:110:49 | throw ...; | | Finally.cs:107:17:107:28 | access to property Length | Finally.cs:110:23:110:48 | object creation of type OutOfMemoryException | -| Finally.cs:107:17:107:28 | access to property Length | Finally.cs:113:9:118:9 | [finally: exception(Exception)] {...} | | Finally.cs:107:17:107:28 | access to property Length | Finally.cs:113:9:118:9 | {...} | -| Finally.cs:107:17:107:28 | access to property Length | Finally.cs:114:17:114:36 | [false, finally: exception(Exception)] !... | -| Finally.cs:107:17:107:28 | access to property Length | Finally.cs:114:17:114:36 | [false, finally: exception(OutOfMemoryException)] !... | | Finally.cs:107:17:107:28 | access to property Length | Finally.cs:114:17:114:36 | [false, finally: return] !... | | Finally.cs:107:17:107:28 | access to property Length | Finally.cs:114:17:114:36 | [false] !... | -| Finally.cs:107:17:107:28 | access to property Length | Finally.cs:114:17:114:36 | [true, finally: exception(Exception)] !... | -| Finally.cs:107:17:107:28 | access to property Length | Finally.cs:114:17:114:36 | [true, finally: exception(OutOfMemoryException)] !... | | Finally.cs:107:17:107:28 | access to property Length | Finally.cs:114:17:114:36 | [true, finally: return] !... | | Finally.cs:107:17:107:28 | access to property Length | Finally.cs:114:17:114:36 | [true] !... | | Finally.cs:107:17:107:28 | access to property Length | Finally.cs:115:17:115:41 | ...; | -| Finally.cs:107:17:107:28 | access to property Length | Finally.cs:115:17:115:41 | [finally: exception(Exception)] ...; | -| Finally.cs:107:17:107:28 | access to property Length | Finally.cs:115:17:115:41 | [finally: exception(OutOfMemoryException)] ...; | | Finally.cs:107:17:107:28 | access to property Length | Finally.cs:115:17:115:41 | [finally: return] ...; | -| Finally.cs:107:17:107:28 | access to property Length | Finally.cs:116:13:117:37 | [finally: exception(Exception)] if (...) ... | -| Finally.cs:107:17:107:28 | access to property Length | Finally.cs:116:13:117:37 | [finally: exception(OutOfMemoryException)] if (...) ... | | Finally.cs:107:17:107:28 | access to property Length | Finally.cs:116:13:117:37 | [finally: return] if (...) ... | | Finally.cs:107:17:107:28 | access to property Length | Finally.cs:116:13:117:37 | if (...) ... | | Finally.cs:107:17:107:28 | access to property Length | Finally.cs:117:17:117:37 | ...; | -| Finally.cs:107:17:107:28 | access to property Length | Finally.cs:117:17:117:37 | [finally: exception(Exception)] ...; | -| Finally.cs:107:17:107:28 | access to property Length | Finally.cs:117:17:117:37 | [finally: exception(OutOfMemoryException)] ...; | | Finally.cs:107:17:107:28 | access to property Length | Finally.cs:117:17:117:37 | [finally: return] ...; | | Finally.cs:107:33:107:33 | 0 | Finally.cs:103:10:103:11 | exit M5 (normal) | | Finally.cs:107:33:107:33 | 0 | Finally.cs:107:33:107:33 | 0 | @@ -10861,20 +10548,15 @@ blockDominance | Finally.cs:107:33:107:33 | 0 | Finally.cs:110:17:110:49 | throw ...; | | Finally.cs:107:33:107:33 | 0 | Finally.cs:110:23:110:48 | object creation of type OutOfMemoryException | | Finally.cs:107:33:107:33 | 0 | Finally.cs:113:9:118:9 | {...} | -| Finally.cs:107:33:107:33 | 0 | Finally.cs:114:17:114:36 | [false, finally: exception(OutOfMemoryException)] !... | | Finally.cs:107:33:107:33 | 0 | Finally.cs:114:17:114:36 | [false, finally: return] !... | | Finally.cs:107:33:107:33 | 0 | Finally.cs:114:17:114:36 | [false] !... | -| Finally.cs:107:33:107:33 | 0 | Finally.cs:114:17:114:36 | [true, finally: exception(OutOfMemoryException)] !... | | Finally.cs:107:33:107:33 | 0 | Finally.cs:114:17:114:36 | [true, finally: return] !... | | Finally.cs:107:33:107:33 | 0 | Finally.cs:114:17:114:36 | [true] !... | | Finally.cs:107:33:107:33 | 0 | Finally.cs:115:17:115:41 | ...; | -| Finally.cs:107:33:107:33 | 0 | Finally.cs:115:17:115:41 | [finally: exception(OutOfMemoryException)] ...; | | Finally.cs:107:33:107:33 | 0 | Finally.cs:115:17:115:41 | [finally: return] ...; | -| Finally.cs:107:33:107:33 | 0 | Finally.cs:116:13:117:37 | [finally: exception(OutOfMemoryException)] if (...) ... | | Finally.cs:107:33:107:33 | 0 | Finally.cs:116:13:117:37 | [finally: return] if (...) ... | | Finally.cs:107:33:107:33 | 0 | Finally.cs:116:13:117:37 | if (...) ... | | Finally.cs:107:33:107:33 | 0 | Finally.cs:117:17:117:37 | ...; | -| Finally.cs:107:33:107:33 | 0 | Finally.cs:117:17:117:37 | [finally: exception(OutOfMemoryException)] ...; | | Finally.cs:107:33:107:33 | 0 | Finally.cs:117:17:117:37 | [finally: return] ...; | | Finally.cs:108:17:108:23 | return ...; | Finally.cs:108:17:108:23 | return ...; | | Finally.cs:108:17:108:23 | return ...; | Finally.cs:114:17:114:36 | [false, finally: return] !... | @@ -10888,118 +10570,75 @@ blockDominance | Finally.cs:109:13:110:49 | if (...) ... | Finally.cs:110:17:110:49 | throw ...; | | Finally.cs:109:13:110:49 | if (...) ... | Finally.cs:110:23:110:48 | object creation of type OutOfMemoryException | | Finally.cs:109:13:110:49 | if (...) ... | Finally.cs:113:9:118:9 | {...} | -| Finally.cs:109:13:110:49 | if (...) ... | Finally.cs:114:17:114:36 | [false, finally: exception(OutOfMemoryException)] !... | | Finally.cs:109:13:110:49 | if (...) ... | Finally.cs:114:17:114:36 | [false] !... | -| Finally.cs:109:13:110:49 | if (...) ... | Finally.cs:114:17:114:36 | [true, finally: exception(OutOfMemoryException)] !... | | Finally.cs:109:13:110:49 | if (...) ... | Finally.cs:114:17:114:36 | [true] !... | | Finally.cs:109:13:110:49 | if (...) ... | Finally.cs:115:17:115:41 | ...; | -| Finally.cs:109:13:110:49 | if (...) ... | Finally.cs:115:17:115:41 | [finally: exception(OutOfMemoryException)] ...; | -| Finally.cs:109:13:110:49 | if (...) ... | Finally.cs:116:13:117:37 | [finally: exception(OutOfMemoryException)] if (...) ... | | Finally.cs:109:13:110:49 | if (...) ... | Finally.cs:116:13:117:37 | if (...) ... | | Finally.cs:109:13:110:49 | if (...) ... | Finally.cs:117:17:117:37 | ...; | -| Finally.cs:109:13:110:49 | if (...) ... | Finally.cs:117:17:117:37 | [finally: exception(OutOfMemoryException)] ...; | | Finally.cs:109:17:109:28 | access to property Length | Finally.cs:109:17:109:28 | access to property Length | | Finally.cs:109:17:109:28 | access to property Length | Finally.cs:109:33:109:33 | 1 | | Finally.cs:109:17:109:28 | access to property Length | Finally.cs:110:17:110:49 | throw ...; | | Finally.cs:109:17:109:28 | access to property Length | Finally.cs:110:23:110:48 | object creation of type OutOfMemoryException | | Finally.cs:109:17:109:28 | access to property Length | Finally.cs:113:9:118:9 | {...} | -| Finally.cs:109:17:109:28 | access to property Length | Finally.cs:114:17:114:36 | [false, finally: exception(OutOfMemoryException)] !... | | Finally.cs:109:17:109:28 | access to property Length | Finally.cs:114:17:114:36 | [false] !... | -| Finally.cs:109:17:109:28 | access to property Length | Finally.cs:114:17:114:36 | [true, finally: exception(OutOfMemoryException)] !... | | Finally.cs:109:17:109:28 | access to property Length | Finally.cs:114:17:114:36 | [true] !... | | Finally.cs:109:17:109:28 | access to property Length | Finally.cs:115:17:115:41 | ...; | -| Finally.cs:109:17:109:28 | access to property Length | Finally.cs:115:17:115:41 | [finally: exception(OutOfMemoryException)] ...; | -| Finally.cs:109:17:109:28 | access to property Length | Finally.cs:116:13:117:37 | [finally: exception(OutOfMemoryException)] if (...) ... | | Finally.cs:109:17:109:28 | access to property Length | Finally.cs:116:13:117:37 | if (...) ... | | Finally.cs:109:17:109:28 | access to property Length | Finally.cs:117:17:117:37 | ...; | -| Finally.cs:109:17:109:28 | access to property Length | Finally.cs:117:17:117:37 | [finally: exception(OutOfMemoryException)] ...; | | Finally.cs:109:33:109:33 | 1 | Finally.cs:109:33:109:33 | 1 | | Finally.cs:109:33:109:33 | 1 | Finally.cs:110:17:110:49 | throw ...; | | Finally.cs:109:33:109:33 | 1 | Finally.cs:110:23:110:48 | object creation of type OutOfMemoryException | | Finally.cs:109:33:109:33 | 1 | Finally.cs:113:9:118:9 | {...} | -| Finally.cs:109:33:109:33 | 1 | Finally.cs:114:17:114:36 | [false, finally: exception(OutOfMemoryException)] !... | | Finally.cs:109:33:109:33 | 1 | Finally.cs:114:17:114:36 | [false] !... | -| Finally.cs:109:33:109:33 | 1 | Finally.cs:114:17:114:36 | [true, finally: exception(OutOfMemoryException)] !... | | Finally.cs:109:33:109:33 | 1 | Finally.cs:114:17:114:36 | [true] !... | | Finally.cs:109:33:109:33 | 1 | Finally.cs:115:17:115:41 | ...; | -| Finally.cs:109:33:109:33 | 1 | Finally.cs:115:17:115:41 | [finally: exception(OutOfMemoryException)] ...; | -| Finally.cs:109:33:109:33 | 1 | Finally.cs:116:13:117:37 | [finally: exception(OutOfMemoryException)] if (...) ... | | Finally.cs:109:33:109:33 | 1 | Finally.cs:116:13:117:37 | if (...) ... | | Finally.cs:109:33:109:33 | 1 | Finally.cs:117:17:117:37 | ...; | -| Finally.cs:109:33:109:33 | 1 | Finally.cs:117:17:117:37 | [finally: exception(OutOfMemoryException)] ...; | | Finally.cs:110:17:110:49 | throw ...; | Finally.cs:110:17:110:49 | throw ...; | -| Finally.cs:110:17:110:49 | throw ...; | Finally.cs:114:17:114:36 | [false, finally: exception(OutOfMemoryException)] !... | -| Finally.cs:110:17:110:49 | throw ...; | Finally.cs:114:17:114:36 | [true, finally: exception(OutOfMemoryException)] !... | -| Finally.cs:110:17:110:49 | throw ...; | Finally.cs:115:17:115:41 | [finally: exception(OutOfMemoryException)] ...; | -| Finally.cs:110:17:110:49 | throw ...; | Finally.cs:116:13:117:37 | [finally: exception(OutOfMemoryException)] if (...) ... | -| Finally.cs:110:17:110:49 | throw ...; | Finally.cs:117:17:117:37 | [finally: exception(OutOfMemoryException)] ...; | | Finally.cs:110:23:110:48 | object creation of type OutOfMemoryException | Finally.cs:110:17:110:49 | throw ...; | | Finally.cs:110:23:110:48 | object creation of type OutOfMemoryException | Finally.cs:110:23:110:48 | object creation of type OutOfMemoryException | -| Finally.cs:110:23:110:48 | object creation of type OutOfMemoryException | Finally.cs:114:17:114:36 | [false, finally: exception(OutOfMemoryException)] !... | -| Finally.cs:110:23:110:48 | object creation of type OutOfMemoryException | Finally.cs:114:17:114:36 | [true, finally: exception(OutOfMemoryException)] !... | -| Finally.cs:110:23:110:48 | object creation of type OutOfMemoryException | Finally.cs:115:17:115:41 | [finally: exception(OutOfMemoryException)] ...; | -| Finally.cs:110:23:110:48 | object creation of type OutOfMemoryException | Finally.cs:116:13:117:37 | [finally: exception(OutOfMemoryException)] if (...) ... | -| Finally.cs:110:23:110:48 | object creation of type OutOfMemoryException | Finally.cs:117:17:117:37 | [finally: exception(OutOfMemoryException)] ...; | -| Finally.cs:113:9:118:9 | [finally: exception(Exception)] {...} | Finally.cs:113:9:118:9 | [finally: exception(Exception)] {...} | -| Finally.cs:113:9:118:9 | [finally: exception(Exception)] {...} | Finally.cs:114:17:114:36 | [false, finally: exception(Exception)] !... | -| Finally.cs:113:9:118:9 | [finally: exception(Exception)] {...} | Finally.cs:114:17:114:36 | [true, finally: exception(Exception)] !... | -| Finally.cs:113:9:118:9 | [finally: exception(Exception)] {...} | Finally.cs:115:17:115:41 | [finally: exception(Exception)] ...; | -| Finally.cs:113:9:118:9 | [finally: exception(Exception)] {...} | Finally.cs:116:13:117:37 | [finally: exception(Exception)] if (...) ... | -| Finally.cs:113:9:118:9 | [finally: exception(Exception)] {...} | Finally.cs:117:17:117:37 | [finally: exception(Exception)] ...; | -| Finally.cs:113:9:118:9 | [finally: exception(NullReferenceException)] {...} | Finally.cs:113:9:118:9 | [finally: exception(NullReferenceException)] {...} | -| Finally.cs:113:9:118:9 | [finally: exception(NullReferenceException)] {...} | Finally.cs:114:17:114:36 | [false, finally: exception(NullReferenceException)] !... | -| Finally.cs:113:9:118:9 | [finally: exception(NullReferenceException)] {...} | Finally.cs:114:17:114:36 | [true, finally: exception(NullReferenceException)] !... | -| Finally.cs:113:9:118:9 | [finally: exception(NullReferenceException)] {...} | Finally.cs:115:17:115:41 | [finally: exception(NullReferenceException)] ...; | -| Finally.cs:113:9:118:9 | [finally: exception(NullReferenceException)] {...} | Finally.cs:116:13:117:37 | [finally: exception(NullReferenceException)] if (...) ... | -| Finally.cs:113:9:118:9 | [finally: exception(NullReferenceException)] {...} | Finally.cs:117:17:117:37 | [finally: exception(NullReferenceException)] ...; | +| Finally.cs:113:9:118:9 | [finally: exception] {...} | Finally.cs:103:10:103:11 | exit M5 (abnormal) | +| Finally.cs:113:9:118:9 | [finally: exception] {...} | Finally.cs:113:9:118:9 | [finally: exception] {...} | +| Finally.cs:113:9:118:9 | [finally: exception] {...} | Finally.cs:114:17:114:36 | [false, finally: exception] !... | +| Finally.cs:113:9:118:9 | [finally: exception] {...} | Finally.cs:114:17:114:36 | [true, finally: exception] !... | +| Finally.cs:113:9:118:9 | [finally: exception] {...} | Finally.cs:115:17:115:41 | [finally: exception] ...; | +| Finally.cs:113:9:118:9 | [finally: exception] {...} | Finally.cs:116:13:117:37 | [finally: exception] if (...) ... | +| Finally.cs:113:9:118:9 | [finally: exception] {...} | Finally.cs:117:17:117:37 | [finally: exception] ...; | | Finally.cs:113:9:118:9 | {...} | Finally.cs:113:9:118:9 | {...} | | Finally.cs:113:9:118:9 | {...} | Finally.cs:114:17:114:36 | [false] !... | | Finally.cs:113:9:118:9 | {...} | Finally.cs:114:17:114:36 | [true] !... | | Finally.cs:113:9:118:9 | {...} | Finally.cs:115:17:115:41 | ...; | | Finally.cs:113:9:118:9 | {...} | Finally.cs:116:13:117:37 | if (...) ... | | Finally.cs:113:9:118:9 | {...} | Finally.cs:117:17:117:37 | ...; | -| Finally.cs:114:17:114:36 | [false, finally: exception(Exception)] !... | Finally.cs:114:17:114:36 | [false, finally: exception(Exception)] !... | -| Finally.cs:114:17:114:36 | [false, finally: exception(NullReferenceException)] !... | Finally.cs:114:17:114:36 | [false, finally: exception(NullReferenceException)] !... | -| Finally.cs:114:17:114:36 | [false, finally: exception(OutOfMemoryException)] !... | Finally.cs:114:17:114:36 | [false, finally: exception(OutOfMemoryException)] !... | +| Finally.cs:114:17:114:36 | [false, finally: exception] !... | Finally.cs:114:17:114:36 | [false, finally: exception] !... | | Finally.cs:114:17:114:36 | [false, finally: return] !... | Finally.cs:114:17:114:36 | [false, finally: return] !... | | Finally.cs:114:17:114:36 | [false] !... | Finally.cs:114:17:114:36 | [false] !... | -| Finally.cs:114:17:114:36 | [true, finally: exception(Exception)] !... | Finally.cs:114:17:114:36 | [true, finally: exception(Exception)] !... | -| Finally.cs:114:17:114:36 | [true, finally: exception(Exception)] !... | Finally.cs:115:17:115:41 | [finally: exception(Exception)] ...; | -| Finally.cs:114:17:114:36 | [true, finally: exception(NullReferenceException)] !... | Finally.cs:114:17:114:36 | [true, finally: exception(NullReferenceException)] !... | -| Finally.cs:114:17:114:36 | [true, finally: exception(NullReferenceException)] !... | Finally.cs:115:17:115:41 | [finally: exception(NullReferenceException)] ...; | -| Finally.cs:114:17:114:36 | [true, finally: exception(OutOfMemoryException)] !... | Finally.cs:114:17:114:36 | [true, finally: exception(OutOfMemoryException)] !... | -| Finally.cs:114:17:114:36 | [true, finally: exception(OutOfMemoryException)] !... | Finally.cs:115:17:115:41 | [finally: exception(OutOfMemoryException)] ...; | +| Finally.cs:114:17:114:36 | [true, finally: exception] !... | Finally.cs:114:17:114:36 | [true, finally: exception] !... | +| Finally.cs:114:17:114:36 | [true, finally: exception] !... | Finally.cs:115:17:115:41 | [finally: exception] ...; | | Finally.cs:114:17:114:36 | [true, finally: return] !... | Finally.cs:114:17:114:36 | [true, finally: return] !... | | Finally.cs:114:17:114:36 | [true, finally: return] !... | Finally.cs:115:17:115:41 | [finally: return] ...; | | Finally.cs:114:17:114:36 | [true] !... | Finally.cs:114:17:114:36 | [true] !... | | Finally.cs:114:17:114:36 | [true] !... | Finally.cs:115:17:115:41 | ...; | | Finally.cs:115:17:115:41 | ...; | Finally.cs:115:17:115:41 | ...; | -| Finally.cs:115:17:115:41 | [finally: exception(Exception)] ...; | Finally.cs:115:17:115:41 | [finally: exception(Exception)] ...; | -| Finally.cs:115:17:115:41 | [finally: exception(NullReferenceException)] ...; | Finally.cs:115:17:115:41 | [finally: exception(NullReferenceException)] ...; | -| Finally.cs:115:17:115:41 | [finally: exception(OutOfMemoryException)] ...; | Finally.cs:115:17:115:41 | [finally: exception(OutOfMemoryException)] ...; | +| Finally.cs:115:17:115:41 | [finally: exception] ...; | Finally.cs:115:17:115:41 | [finally: exception] ...; | | Finally.cs:115:17:115:41 | [finally: return] ...; | Finally.cs:115:17:115:41 | [finally: return] ...; | -| Finally.cs:116:13:117:37 | [finally: exception(Exception)] if (...) ... | Finally.cs:116:13:117:37 | [finally: exception(Exception)] if (...) ... | -| Finally.cs:116:13:117:37 | [finally: exception(Exception)] if (...) ... | Finally.cs:117:17:117:37 | [finally: exception(Exception)] ...; | -| Finally.cs:116:13:117:37 | [finally: exception(NullReferenceException)] if (...) ... | Finally.cs:116:13:117:37 | [finally: exception(NullReferenceException)] if (...) ... | -| Finally.cs:116:13:117:37 | [finally: exception(NullReferenceException)] if (...) ... | Finally.cs:117:17:117:37 | [finally: exception(NullReferenceException)] ...; | -| Finally.cs:116:13:117:37 | [finally: exception(OutOfMemoryException)] if (...) ... | Finally.cs:116:13:117:37 | [finally: exception(OutOfMemoryException)] if (...) ... | -| Finally.cs:116:13:117:37 | [finally: exception(OutOfMemoryException)] if (...) ... | Finally.cs:117:17:117:37 | [finally: exception(OutOfMemoryException)] ...; | +| Finally.cs:116:13:117:37 | [finally: exception] if (...) ... | Finally.cs:103:10:103:11 | exit M5 (abnormal) | +| Finally.cs:116:13:117:37 | [finally: exception] if (...) ... | Finally.cs:116:13:117:37 | [finally: exception] if (...) ... | +| Finally.cs:116:13:117:37 | [finally: exception] if (...) ... | Finally.cs:117:17:117:37 | [finally: exception] ...; | | Finally.cs:116:13:117:37 | [finally: return] if (...) ... | Finally.cs:116:13:117:37 | [finally: return] if (...) ... | | Finally.cs:116:13:117:37 | [finally: return] if (...) ... | Finally.cs:117:17:117:37 | [finally: return] ...; | | Finally.cs:116:13:117:37 | if (...) ... | Finally.cs:116:13:117:37 | if (...) ... | | Finally.cs:116:13:117:37 | if (...) ... | Finally.cs:117:17:117:37 | ...; | | Finally.cs:117:17:117:37 | ...; | Finally.cs:117:17:117:37 | ...; | -| Finally.cs:117:17:117:37 | [finally: exception(Exception)] ...; | Finally.cs:117:17:117:37 | [finally: exception(Exception)] ...; | -| Finally.cs:117:17:117:37 | [finally: exception(NullReferenceException)] ...; | Finally.cs:117:17:117:37 | [finally: exception(NullReferenceException)] ...; | -| Finally.cs:117:17:117:37 | [finally: exception(OutOfMemoryException)] ...; | Finally.cs:117:17:117:37 | [finally: exception(OutOfMemoryException)] ...; | +| Finally.cs:117:17:117:37 | [finally: exception] ...; | Finally.cs:117:17:117:37 | [finally: exception] ...; | | Finally.cs:117:17:117:37 | [finally: return] ...; | Finally.cs:117:17:117:37 | [finally: return] ...; | | Finally.cs:121:10:121:11 | enter M6 | Finally.cs:121:10:121:11 | enter M6 | | Finally.cs:133:10:133:11 | enter M7 | Finally.cs:133:10:133:11 | enter M7 | | Finally.cs:133:10:133:11 | enter M7 | Finally.cs:133:10:133:11 | exit M7 (abnormal) | -| Finally.cs:133:10:133:11 | enter M7 | Finally.cs:140:9:143:9 | [finally: exception(Exception)] {...} | +| Finally.cs:133:10:133:11 | enter M7 | Finally.cs:140:9:143:9 | [finally: exception] {...} | | Finally.cs:133:10:133:11 | enter M7 | Finally.cs:140:9:143:9 | {...} | | Finally.cs:133:10:133:11 | exit M7 (abnormal) | Finally.cs:133:10:133:11 | exit M7 (abnormal) | -| Finally.cs:140:9:143:9 | [finally: exception(Exception)] {...} | Finally.cs:140:9:143:9 | [finally: exception(Exception)] {...} | +| Finally.cs:140:9:143:9 | [finally: exception] {...} | Finally.cs:140:9:143:9 | [finally: exception] {...} | | Finally.cs:140:9:143:9 | {...} | Finally.cs:140:9:143:9 | {...} | | Finally.cs:147:10:147:11 | enter M8 | Finally.cs:147:10:147:11 | enter M8 | | Finally.cs:147:10:147:11 | enter M8 | Finally.cs:147:10:147:11 | exit M8 | @@ -11007,80 +10646,54 @@ blockDominance | Finally.cs:147:10:147:11 | enter M8 | Finally.cs:147:10:147:11 | exit M8 (normal) | | Finally.cs:147:10:147:11 | enter M8 | Finally.cs:152:17:152:50 | throw ...; | | Finally.cs:147:10:147:11 | enter M8 | Finally.cs:152:23:152:49 | object creation of type ArgumentNullException | -| Finally.cs:147:10:147:11 | enter M8 | Finally.cs:155:9:169:9 | [finally: exception(Exception)] {...} | +| Finally.cs:147:10:147:11 | enter M8 | Finally.cs:155:9:169:9 | [finally: exception] {...} | | Finally.cs:147:10:147:11 | enter M8 | Finally.cs:155:9:169:9 | {...} | | Finally.cs:147:10:147:11 | enter M8 | Finally.cs:158:36:158:36 | 1 | -| Finally.cs:147:10:147:11 | enter M8 | Finally.cs:158:36:158:36 | [finally: exception(ArgumentNullException)] 1 | -| Finally.cs:147:10:147:11 | enter M8 | Finally.cs:158:36:158:36 | [finally: exception(Exception)] 1 | -| Finally.cs:147:10:147:11 | enter M8 | Finally.cs:159:21:159:45 | [finally: exception(ArgumentNullException)] throw ...; | -| Finally.cs:147:10:147:11 | enter M8 | Finally.cs:159:21:159:45 | [finally: exception(Exception)] throw ...; | +| Finally.cs:147:10:147:11 | enter M8 | Finally.cs:158:36:158:36 | [finally: exception] 1 | +| Finally.cs:147:10:147:11 | enter M8 | Finally.cs:159:21:159:45 | [finally: exception] throw ...; | | Finally.cs:147:10:147:11 | enter M8 | Finally.cs:159:21:159:45 | throw ...; | | Finally.cs:147:10:147:11 | enter M8 | Finally.cs:159:41:159:43 | "1" | -| Finally.cs:147:10:147:11 | enter M8 | Finally.cs:159:41:159:43 | [finally: exception(ArgumentNullException)] "1" | -| Finally.cs:147:10:147:11 | enter M8 | Finally.cs:159:41:159:43 | [finally: exception(Exception)] "1" | +| Finally.cs:147:10:147:11 | enter M8 | Finally.cs:159:41:159:43 | [finally: exception] "1" | | Finally.cs:147:10:147:11 | enter M8 | Finally.cs:161:13:164:13 | [exception: Exception] catch (...) {...} | | Finally.cs:147:10:147:11 | enter M8 | Finally.cs:161:13:164:13 | [exception: NullReferenceException] catch (...) {...} | -| Finally.cs:147:10:147:11 | enter M8 | Finally.cs:161:13:164:13 | [finally: exception(ArgumentNullException), exception: Exception] catch (...) {...} | -| Finally.cs:147:10:147:11 | enter M8 | Finally.cs:161:13:164:13 | [finally: exception(ArgumentNullException), exception: NullReferenceException] catch (...) {...} | -| Finally.cs:147:10:147:11 | enter M8 | Finally.cs:161:13:164:13 | [finally: exception(Exception), exception: Exception] catch (...) {...} | -| Finally.cs:147:10:147:11 | enter M8 | Finally.cs:161:13:164:13 | [finally: exception(Exception), exception: NullReferenceException] catch (...) {...} | +| Finally.cs:147:10:147:11 | enter M8 | Finally.cs:161:13:164:13 | [finally: exception, exception: Exception] catch (...) {...} | +| Finally.cs:147:10:147:11 | enter M8 | Finally.cs:161:13:164:13 | [finally: exception, exception: NullReferenceException] catch (...) {...} | | Finally.cs:147:10:147:11 | enter M8 | Finally.cs:161:30:161:30 | [exception: Exception] Exception e | | Finally.cs:147:10:147:11 | enter M8 | Finally.cs:161:30:161:30 | [exception: NullReferenceException] Exception e | -| Finally.cs:147:10:147:11 | enter M8 | Finally.cs:161:30:161:30 | [finally: exception(ArgumentNullException), exception: Exception] Exception e | -| Finally.cs:147:10:147:11 | enter M8 | Finally.cs:161:30:161:30 | [finally: exception(ArgumentNullException), exception: NullReferenceException] Exception e | -| Finally.cs:147:10:147:11 | enter M8 | Finally.cs:161:30:161:30 | [finally: exception(Exception), exception: Exception] Exception e | -| Finally.cs:147:10:147:11 | enter M8 | Finally.cs:161:30:161:30 | [finally: exception(Exception), exception: NullReferenceException] Exception e | -| Finally.cs:147:10:147:11 | enter M8 | Finally.cs:162:13:164:13 | [finally: exception(ArgumentNullException)] {...} | -| Finally.cs:147:10:147:11 | enter M8 | Finally.cs:162:13:164:13 | [finally: exception(Exception)] {...} | +| Finally.cs:147:10:147:11 | enter M8 | Finally.cs:161:30:161:30 | [finally: exception, exception: Exception] Exception e | +| Finally.cs:147:10:147:11 | enter M8 | Finally.cs:161:30:161:30 | [finally: exception, exception: NullReferenceException] Exception e | +| Finally.cs:147:10:147:11 | enter M8 | Finally.cs:162:13:164:13 | [finally: exception] {...} | | Finally.cs:147:10:147:11 | enter M8 | Finally.cs:162:13:164:13 | {...} | -| Finally.cs:147:10:147:11 | enter M8 | Finally.cs:165:13:168:13 | [finally: exception(ArgumentNullException)] catch {...} | -| Finally.cs:147:10:147:11 | enter M8 | Finally.cs:165:13:168:13 | [finally: exception(Exception)] catch {...} | +| Finally.cs:147:10:147:11 | enter M8 | Finally.cs:165:13:168:13 | [finally: exception] catch {...} | | Finally.cs:147:10:147:11 | enter M8 | Finally.cs:165:13:168:13 | catch {...} | | Finally.cs:147:10:147:11 | exit M8 | Finally.cs:147:10:147:11 | exit M8 | | Finally.cs:147:10:147:11 | exit M8 (abnormal) | Finally.cs:147:10:147:11 | exit M8 (abnormal) | | Finally.cs:147:10:147:11 | exit M8 (normal) | Finally.cs:147:10:147:11 | exit M8 (normal) | | Finally.cs:152:17:152:50 | throw ...; | Finally.cs:152:17:152:50 | throw ...; | -| Finally.cs:152:17:152:50 | throw ...; | Finally.cs:158:36:158:36 | [finally: exception(ArgumentNullException)] 1 | -| Finally.cs:152:17:152:50 | throw ...; | Finally.cs:159:21:159:45 | [finally: exception(ArgumentNullException)] throw ...; | -| Finally.cs:152:17:152:50 | throw ...; | Finally.cs:159:41:159:43 | [finally: exception(ArgumentNullException)] "1" | -| Finally.cs:152:17:152:50 | throw ...; | Finally.cs:161:13:164:13 | [finally: exception(ArgumentNullException), exception: Exception] catch (...) {...} | -| Finally.cs:152:17:152:50 | throw ...; | Finally.cs:161:13:164:13 | [finally: exception(ArgumentNullException), exception: NullReferenceException] catch (...) {...} | -| Finally.cs:152:17:152:50 | throw ...; | Finally.cs:161:30:161:30 | [finally: exception(ArgumentNullException), exception: Exception] Exception e | -| Finally.cs:152:17:152:50 | throw ...; | Finally.cs:161:30:161:30 | [finally: exception(ArgumentNullException), exception: NullReferenceException] Exception e | -| Finally.cs:152:17:152:50 | throw ...; | Finally.cs:162:13:164:13 | [finally: exception(ArgumentNullException)] {...} | -| Finally.cs:152:17:152:50 | throw ...; | Finally.cs:165:13:168:13 | [finally: exception(ArgumentNullException)] catch {...} | | Finally.cs:152:23:152:49 | object creation of type ArgumentNullException | Finally.cs:147:10:147:11 | exit M8 (abnormal) | | Finally.cs:152:23:152:49 | object creation of type ArgumentNullException | Finally.cs:152:17:152:50 | throw ...; | | Finally.cs:152:23:152:49 | object creation of type ArgumentNullException | Finally.cs:152:23:152:49 | object creation of type ArgumentNullException | -| Finally.cs:152:23:152:49 | object creation of type ArgumentNullException | Finally.cs:155:9:169:9 | [finally: exception(Exception)] {...} | -| Finally.cs:152:23:152:49 | object creation of type ArgumentNullException | Finally.cs:158:36:158:36 | [finally: exception(ArgumentNullException)] 1 | -| Finally.cs:152:23:152:49 | object creation of type ArgumentNullException | Finally.cs:158:36:158:36 | [finally: exception(Exception)] 1 | -| Finally.cs:152:23:152:49 | object creation of type ArgumentNullException | Finally.cs:159:21:159:45 | [finally: exception(ArgumentNullException)] throw ...; | -| Finally.cs:152:23:152:49 | object creation of type ArgumentNullException | Finally.cs:159:21:159:45 | [finally: exception(Exception)] throw ...; | -| Finally.cs:152:23:152:49 | object creation of type ArgumentNullException | Finally.cs:159:41:159:43 | [finally: exception(ArgumentNullException)] "1" | -| Finally.cs:152:23:152:49 | object creation of type ArgumentNullException | Finally.cs:159:41:159:43 | [finally: exception(Exception)] "1" | -| Finally.cs:152:23:152:49 | object creation of type ArgumentNullException | Finally.cs:161:13:164:13 | [finally: exception(ArgumentNullException), exception: Exception] catch (...) {...} | -| Finally.cs:152:23:152:49 | object creation of type ArgumentNullException | Finally.cs:161:13:164:13 | [finally: exception(ArgumentNullException), exception: NullReferenceException] catch (...) {...} | -| Finally.cs:152:23:152:49 | object creation of type ArgumentNullException | Finally.cs:161:13:164:13 | [finally: exception(Exception), exception: Exception] catch (...) {...} | -| Finally.cs:152:23:152:49 | object creation of type ArgumentNullException | Finally.cs:161:13:164:13 | [finally: exception(Exception), exception: NullReferenceException] catch (...) {...} | -| Finally.cs:152:23:152:49 | object creation of type ArgumentNullException | Finally.cs:161:30:161:30 | [finally: exception(ArgumentNullException), exception: Exception] Exception e | -| Finally.cs:152:23:152:49 | object creation of type ArgumentNullException | Finally.cs:161:30:161:30 | [finally: exception(ArgumentNullException), exception: NullReferenceException] Exception e | -| Finally.cs:152:23:152:49 | object creation of type ArgumentNullException | Finally.cs:161:30:161:30 | [finally: exception(Exception), exception: Exception] Exception e | -| Finally.cs:152:23:152:49 | object creation of type ArgumentNullException | Finally.cs:161:30:161:30 | [finally: exception(Exception), exception: NullReferenceException] Exception e | -| Finally.cs:152:23:152:49 | object creation of type ArgumentNullException | Finally.cs:162:13:164:13 | [finally: exception(ArgumentNullException)] {...} | -| Finally.cs:152:23:152:49 | object creation of type ArgumentNullException | Finally.cs:162:13:164:13 | [finally: exception(Exception)] {...} | -| Finally.cs:152:23:152:49 | object creation of type ArgumentNullException | Finally.cs:165:13:168:13 | [finally: exception(ArgumentNullException)] catch {...} | -| Finally.cs:152:23:152:49 | object creation of type ArgumentNullException | Finally.cs:165:13:168:13 | [finally: exception(Exception)] catch {...} | -| Finally.cs:155:9:169:9 | [finally: exception(Exception)] {...} | Finally.cs:155:9:169:9 | [finally: exception(Exception)] {...} | -| Finally.cs:155:9:169:9 | [finally: exception(Exception)] {...} | Finally.cs:158:36:158:36 | [finally: exception(Exception)] 1 | -| Finally.cs:155:9:169:9 | [finally: exception(Exception)] {...} | Finally.cs:159:21:159:45 | [finally: exception(Exception)] throw ...; | -| Finally.cs:155:9:169:9 | [finally: exception(Exception)] {...} | Finally.cs:159:41:159:43 | [finally: exception(Exception)] "1" | -| Finally.cs:155:9:169:9 | [finally: exception(Exception)] {...} | Finally.cs:161:13:164:13 | [finally: exception(Exception), exception: Exception] catch (...) {...} | -| Finally.cs:155:9:169:9 | [finally: exception(Exception)] {...} | Finally.cs:161:13:164:13 | [finally: exception(Exception), exception: NullReferenceException] catch (...) {...} | -| Finally.cs:155:9:169:9 | [finally: exception(Exception)] {...} | Finally.cs:161:30:161:30 | [finally: exception(Exception), exception: Exception] Exception e | -| Finally.cs:155:9:169:9 | [finally: exception(Exception)] {...} | Finally.cs:161:30:161:30 | [finally: exception(Exception), exception: NullReferenceException] Exception e | -| Finally.cs:155:9:169:9 | [finally: exception(Exception)] {...} | Finally.cs:162:13:164:13 | [finally: exception(Exception)] {...} | -| Finally.cs:155:9:169:9 | [finally: exception(Exception)] {...} | Finally.cs:165:13:168:13 | [finally: exception(Exception)] catch {...} | +| Finally.cs:152:23:152:49 | object creation of type ArgumentNullException | Finally.cs:155:9:169:9 | [finally: exception] {...} | +| Finally.cs:152:23:152:49 | object creation of type ArgumentNullException | Finally.cs:158:36:158:36 | [finally: exception] 1 | +| Finally.cs:152:23:152:49 | object creation of type ArgumentNullException | Finally.cs:159:21:159:45 | [finally: exception] throw ...; | +| Finally.cs:152:23:152:49 | object creation of type ArgumentNullException | Finally.cs:159:41:159:43 | [finally: exception] "1" | +| Finally.cs:152:23:152:49 | object creation of type ArgumentNullException | Finally.cs:161:13:164:13 | [finally: exception, exception: Exception] catch (...) {...} | +| Finally.cs:152:23:152:49 | object creation of type ArgumentNullException | Finally.cs:161:13:164:13 | [finally: exception, exception: NullReferenceException] catch (...) {...} | +| Finally.cs:152:23:152:49 | object creation of type ArgumentNullException | Finally.cs:161:30:161:30 | [finally: exception, exception: Exception] Exception e | +| Finally.cs:152:23:152:49 | object creation of type ArgumentNullException | Finally.cs:161:30:161:30 | [finally: exception, exception: NullReferenceException] Exception e | +| Finally.cs:152:23:152:49 | object creation of type ArgumentNullException | Finally.cs:162:13:164:13 | [finally: exception] {...} | +| Finally.cs:152:23:152:49 | object creation of type ArgumentNullException | Finally.cs:165:13:168:13 | [finally: exception] catch {...} | +| Finally.cs:155:9:169:9 | [finally: exception] {...} | Finally.cs:147:10:147:11 | exit M8 (abnormal) | +| Finally.cs:155:9:169:9 | [finally: exception] {...} | Finally.cs:155:9:169:9 | [finally: exception] {...} | +| Finally.cs:155:9:169:9 | [finally: exception] {...} | Finally.cs:158:36:158:36 | [finally: exception] 1 | +| Finally.cs:155:9:169:9 | [finally: exception] {...} | Finally.cs:159:21:159:45 | [finally: exception] throw ...; | +| Finally.cs:155:9:169:9 | [finally: exception] {...} | Finally.cs:159:41:159:43 | [finally: exception] "1" | +| Finally.cs:155:9:169:9 | [finally: exception] {...} | Finally.cs:161:13:164:13 | [finally: exception, exception: Exception] catch (...) {...} | +| Finally.cs:155:9:169:9 | [finally: exception] {...} | Finally.cs:161:13:164:13 | [finally: exception, exception: NullReferenceException] catch (...) {...} | +| Finally.cs:155:9:169:9 | [finally: exception] {...} | Finally.cs:161:30:161:30 | [finally: exception, exception: Exception] Exception e | +| Finally.cs:155:9:169:9 | [finally: exception] {...} | Finally.cs:161:30:161:30 | [finally: exception, exception: NullReferenceException] Exception e | +| Finally.cs:155:9:169:9 | [finally: exception] {...} | Finally.cs:162:13:164:13 | [finally: exception] {...} | +| Finally.cs:155:9:169:9 | [finally: exception] {...} | Finally.cs:165:13:168:13 | [finally: exception] catch {...} | | Finally.cs:155:9:169:9 | {...} | Finally.cs:147:10:147:11 | exit M8 (normal) | | Finally.cs:155:9:169:9 | {...} | Finally.cs:155:9:169:9 | {...} | | Finally.cs:155:9:169:9 | {...} | Finally.cs:158:36:158:36 | 1 | @@ -11095,44 +10708,30 @@ blockDominance | Finally.cs:158:36:158:36 | 1 | Finally.cs:158:36:158:36 | 1 | | Finally.cs:158:36:158:36 | 1 | Finally.cs:159:21:159:45 | throw ...; | | Finally.cs:158:36:158:36 | 1 | Finally.cs:159:41:159:43 | "1" | -| Finally.cs:158:36:158:36 | [finally: exception(ArgumentNullException)] 1 | Finally.cs:158:36:158:36 | [finally: exception(ArgumentNullException)] 1 | -| Finally.cs:158:36:158:36 | [finally: exception(ArgumentNullException)] 1 | Finally.cs:159:21:159:45 | [finally: exception(ArgumentNullException)] throw ...; | -| Finally.cs:158:36:158:36 | [finally: exception(ArgumentNullException)] 1 | Finally.cs:159:41:159:43 | [finally: exception(ArgumentNullException)] "1" | -| Finally.cs:158:36:158:36 | [finally: exception(Exception)] 1 | Finally.cs:158:36:158:36 | [finally: exception(Exception)] 1 | -| Finally.cs:158:36:158:36 | [finally: exception(Exception)] 1 | Finally.cs:159:21:159:45 | [finally: exception(Exception)] throw ...; | -| Finally.cs:158:36:158:36 | [finally: exception(Exception)] 1 | Finally.cs:159:41:159:43 | [finally: exception(Exception)] "1" | -| Finally.cs:159:21:159:45 | [finally: exception(ArgumentNullException)] throw ...; | Finally.cs:159:21:159:45 | [finally: exception(ArgumentNullException)] throw ...; | -| Finally.cs:159:21:159:45 | [finally: exception(Exception)] throw ...; | Finally.cs:159:21:159:45 | [finally: exception(Exception)] throw ...; | +| Finally.cs:158:36:158:36 | [finally: exception] 1 | Finally.cs:158:36:158:36 | [finally: exception] 1 | +| Finally.cs:158:36:158:36 | [finally: exception] 1 | Finally.cs:159:21:159:45 | [finally: exception] throw ...; | +| Finally.cs:158:36:158:36 | [finally: exception] 1 | Finally.cs:159:41:159:43 | [finally: exception] "1" | +| Finally.cs:159:21:159:45 | [finally: exception] throw ...; | Finally.cs:159:21:159:45 | [finally: exception] throw ...; | | Finally.cs:159:21:159:45 | throw ...; | Finally.cs:159:21:159:45 | throw ...; | | Finally.cs:159:41:159:43 | "1" | Finally.cs:159:21:159:45 | throw ...; | | Finally.cs:159:41:159:43 | "1" | Finally.cs:159:41:159:43 | "1" | -| Finally.cs:159:41:159:43 | [finally: exception(ArgumentNullException)] "1" | Finally.cs:159:21:159:45 | [finally: exception(ArgumentNullException)] throw ...; | -| Finally.cs:159:41:159:43 | [finally: exception(ArgumentNullException)] "1" | Finally.cs:159:41:159:43 | [finally: exception(ArgumentNullException)] "1" | -| Finally.cs:159:41:159:43 | [finally: exception(Exception)] "1" | Finally.cs:159:21:159:45 | [finally: exception(Exception)] throw ...; | -| Finally.cs:159:41:159:43 | [finally: exception(Exception)] "1" | Finally.cs:159:41:159:43 | [finally: exception(Exception)] "1" | +| Finally.cs:159:41:159:43 | [finally: exception] "1" | Finally.cs:159:21:159:45 | [finally: exception] throw ...; | +| Finally.cs:159:41:159:43 | [finally: exception] "1" | Finally.cs:159:41:159:43 | [finally: exception] "1" | | Finally.cs:161:13:164:13 | [exception: Exception] catch (...) {...} | Finally.cs:161:13:164:13 | [exception: Exception] catch (...) {...} | | Finally.cs:161:13:164:13 | [exception: Exception] catch (...) {...} | Finally.cs:161:30:161:30 | [exception: Exception] Exception e | | Finally.cs:161:13:164:13 | [exception: NullReferenceException] catch (...) {...} | Finally.cs:161:13:164:13 | [exception: NullReferenceException] catch (...) {...} | | Finally.cs:161:13:164:13 | [exception: NullReferenceException] catch (...) {...} | Finally.cs:161:30:161:30 | [exception: NullReferenceException] Exception e | -| Finally.cs:161:13:164:13 | [finally: exception(ArgumentNullException), exception: Exception] catch (...) {...} | Finally.cs:161:13:164:13 | [finally: exception(ArgumentNullException), exception: Exception] catch (...) {...} | -| Finally.cs:161:13:164:13 | [finally: exception(ArgumentNullException), exception: Exception] catch (...) {...} | Finally.cs:161:30:161:30 | [finally: exception(ArgumentNullException), exception: Exception] Exception e | -| Finally.cs:161:13:164:13 | [finally: exception(ArgumentNullException), exception: NullReferenceException] catch (...) {...} | Finally.cs:161:13:164:13 | [finally: exception(ArgumentNullException), exception: NullReferenceException] catch (...) {...} | -| Finally.cs:161:13:164:13 | [finally: exception(ArgumentNullException), exception: NullReferenceException] catch (...) {...} | Finally.cs:161:30:161:30 | [finally: exception(ArgumentNullException), exception: NullReferenceException] Exception e | -| Finally.cs:161:13:164:13 | [finally: exception(Exception), exception: Exception] catch (...) {...} | Finally.cs:161:13:164:13 | [finally: exception(Exception), exception: Exception] catch (...) {...} | -| Finally.cs:161:13:164:13 | [finally: exception(Exception), exception: Exception] catch (...) {...} | Finally.cs:161:30:161:30 | [finally: exception(Exception), exception: Exception] Exception e | -| Finally.cs:161:13:164:13 | [finally: exception(Exception), exception: NullReferenceException] catch (...) {...} | Finally.cs:161:13:164:13 | [finally: exception(Exception), exception: NullReferenceException] catch (...) {...} | -| Finally.cs:161:13:164:13 | [finally: exception(Exception), exception: NullReferenceException] catch (...) {...} | Finally.cs:161:30:161:30 | [finally: exception(Exception), exception: NullReferenceException] Exception e | +| Finally.cs:161:13:164:13 | [finally: exception, exception: Exception] catch (...) {...} | Finally.cs:161:13:164:13 | [finally: exception, exception: Exception] catch (...) {...} | +| Finally.cs:161:13:164:13 | [finally: exception, exception: Exception] catch (...) {...} | Finally.cs:161:30:161:30 | [finally: exception, exception: Exception] Exception e | +| Finally.cs:161:13:164:13 | [finally: exception, exception: NullReferenceException] catch (...) {...} | Finally.cs:161:13:164:13 | [finally: exception, exception: NullReferenceException] catch (...) {...} | +| Finally.cs:161:13:164:13 | [finally: exception, exception: NullReferenceException] catch (...) {...} | Finally.cs:161:30:161:30 | [finally: exception, exception: NullReferenceException] Exception e | | Finally.cs:161:30:161:30 | [exception: Exception] Exception e | Finally.cs:161:30:161:30 | [exception: Exception] Exception e | | Finally.cs:161:30:161:30 | [exception: NullReferenceException] Exception e | Finally.cs:161:30:161:30 | [exception: NullReferenceException] Exception e | -| Finally.cs:161:30:161:30 | [finally: exception(ArgumentNullException), exception: Exception] Exception e | Finally.cs:161:30:161:30 | [finally: exception(ArgumentNullException), exception: Exception] Exception e | -| Finally.cs:161:30:161:30 | [finally: exception(ArgumentNullException), exception: NullReferenceException] Exception e | Finally.cs:161:30:161:30 | [finally: exception(ArgumentNullException), exception: NullReferenceException] Exception e | -| Finally.cs:161:30:161:30 | [finally: exception(Exception), exception: Exception] Exception e | Finally.cs:161:30:161:30 | [finally: exception(Exception), exception: Exception] Exception e | -| Finally.cs:161:30:161:30 | [finally: exception(Exception), exception: NullReferenceException] Exception e | Finally.cs:161:30:161:30 | [finally: exception(Exception), exception: NullReferenceException] Exception e | -| Finally.cs:162:13:164:13 | [finally: exception(ArgumentNullException)] {...} | Finally.cs:162:13:164:13 | [finally: exception(ArgumentNullException)] {...} | -| Finally.cs:162:13:164:13 | [finally: exception(Exception)] {...} | Finally.cs:162:13:164:13 | [finally: exception(Exception)] {...} | +| Finally.cs:161:30:161:30 | [finally: exception, exception: Exception] Exception e | Finally.cs:161:30:161:30 | [finally: exception, exception: Exception] Exception e | +| Finally.cs:161:30:161:30 | [finally: exception, exception: NullReferenceException] Exception e | Finally.cs:161:30:161:30 | [finally: exception, exception: NullReferenceException] Exception e | +| Finally.cs:162:13:164:13 | [finally: exception] {...} | Finally.cs:162:13:164:13 | [finally: exception] {...} | | Finally.cs:162:13:164:13 | {...} | Finally.cs:162:13:164:13 | {...} | -| Finally.cs:165:13:168:13 | [finally: exception(ArgumentNullException)] catch {...} | Finally.cs:165:13:168:13 | [finally: exception(ArgumentNullException)] catch {...} | -| Finally.cs:165:13:168:13 | [finally: exception(Exception)] catch {...} | Finally.cs:165:13:168:13 | [finally: exception(Exception)] catch {...} | +| Finally.cs:165:13:168:13 | [finally: exception] catch {...} | Finally.cs:165:13:168:13 | [finally: exception] catch {...} | | Finally.cs:165:13:168:13 | catch {...} | Finally.cs:165:13:168:13 | catch {...} | | Finally.cs:172:11:172:20 | enter ExceptionA | Finally.cs:172:11:172:20 | enter ExceptionA | | Finally.cs:173:11:173:20 | enter ExceptionB | Finally.cs:173:11:173:20 | enter ExceptionB | @@ -11144,55 +10743,34 @@ blockDominance | Finally.cs:176:10:176:11 | enter M9 | Finally.cs:180:21:180:43 | [b1 (line 176): true] throw ...; | | Finally.cs:176:10:176:11 | enter M9 | Finally.cs:180:27:180:42 | [b1 (line 176): true] object creation of type ExceptionA | | Finally.cs:176:10:176:11 | enter M9 | Finally.cs:183:9:192:9 | [b1 (line 176): false] {...} | -| Finally.cs:176:10:176:11 | enter M9 | Finally.cs:183:9:192:9 | [finally: exception(Exception), b1 (line 176): true] {...} | +| Finally.cs:176:10:176:11 | enter M9 | Finally.cs:183:9:192:9 | [finally: exception, b1 (line 176): true] {...} | | Finally.cs:176:10:176:11 | enter M9 | Finally.cs:186:25:186:47 | [b1 (line 176): false, b2 (line 176): true] throw ...; | -| Finally.cs:176:10:176:11 | enter M9 | Finally.cs:186:25:186:47 | [finally: exception(Exception), b1 (line 176): true, b2 (line 176): true] throw ...; | -| Finally.cs:176:10:176:11 | enter M9 | Finally.cs:186:25:186:47 | [finally: exception(ExceptionA), b1 (line 176): true, b2 (line 176): true] throw ...; | +| Finally.cs:176:10:176:11 | enter M9 | Finally.cs:186:25:186:47 | [finally: exception, b1 (line 176): true, b2 (line 176): true] throw ...; | | Finally.cs:176:10:176:11 | enter M9 | Finally.cs:186:31:186:46 | [b1 (line 176): false, b2 (line 176): true] object creation of type ExceptionB | -| Finally.cs:176:10:176:11 | enter M9 | Finally.cs:186:31:186:46 | [finally: exception(Exception), b1 (line 176): true, b2 (line 176): true] object creation of type ExceptionB | -| Finally.cs:176:10:176:11 | enter M9 | Finally.cs:186:31:186:46 | [finally: exception(ExceptionA), b1 (line 176): true, b2 (line 176): true] object creation of type ExceptionB | +| Finally.cs:176:10:176:11 | enter M9 | Finally.cs:186:31:186:46 | [finally: exception, b1 (line 176): true, b2 (line 176): true] object creation of type ExceptionB | | Finally.cs:176:10:176:11 | enter M9 | Finally.cs:188:13:191:13 | [exception: Exception, b1 (line 176): false, b2 (line 176): true] catch (...) {...} | -| Finally.cs:176:10:176:11 | enter M9 | Finally.cs:188:13:191:13 | [finally: exception(Exception), exception: Exception, b1 (line 176): true, b2 (line 176): true] catch (...) {...} | -| Finally.cs:176:10:176:11 | enter M9 | Finally.cs:188:13:191:13 | [finally: exception(ExceptionA), exception: Exception, b1 (line 176): true, b2 (line 176): true] catch (...) {...} | +| Finally.cs:176:10:176:11 | enter M9 | Finally.cs:188:13:191:13 | [finally: exception, exception: Exception, b1 (line 176): true, b2 (line 176): true] catch (...) {...} | | Finally.cs:176:10:176:11 | enter M9 | Finally.cs:188:38:188:39 | [exception: Exception, b1 (line 176): false, b2 (line 176): true] access to parameter b2 | | Finally.cs:176:10:176:11 | enter M9 | Finally.cs:188:38:188:39 | [exception: ExceptionB, b1 (line 176): false, b2 (line 176): true] access to parameter b2 | -| Finally.cs:176:10:176:11 | enter M9 | Finally.cs:188:38:188:39 | [finally: exception(Exception), exception: Exception, b1 (line 176): true, b2 (line 176): true] access to parameter b2 | -| Finally.cs:176:10:176:11 | enter M9 | Finally.cs:188:38:188:39 | [finally: exception(Exception), exception: ExceptionB, b1 (line 176): true, b2 (line 176): true] access to parameter b2 | -| Finally.cs:176:10:176:11 | enter M9 | Finally.cs:188:38:188:39 | [finally: exception(ExceptionA), exception: Exception, b1 (line 176): true, b2 (line 176): true] access to parameter b2 | -| Finally.cs:176:10:176:11 | enter M9 | Finally.cs:188:38:188:39 | [finally: exception(ExceptionA), exception: ExceptionB, b1 (line 176): true, b2 (line 176): true] access to parameter b2 | +| Finally.cs:176:10:176:11 | enter M9 | Finally.cs:188:38:188:39 | [finally: exception, exception: Exception, b1 (line 176): true, b2 (line 176): true] access to parameter b2 | +| Finally.cs:176:10:176:11 | enter M9 | Finally.cs:188:38:188:39 | [finally: exception, exception: ExceptionB, b1 (line 176): true, b2 (line 176): true] access to parameter b2 | | Finally.cs:176:10:176:11 | enter M9 | Finally.cs:189:13:191:13 | [b1 (line 176): false] {...} | -| Finally.cs:176:10:176:11 | enter M9 | Finally.cs:189:13:191:13 | [finally: exception(Exception), b1 (line 176): true] {...} | -| Finally.cs:176:10:176:11 | enter M9 | Finally.cs:189:13:191:13 | [finally: exception(ExceptionA), b1 (line 176): true] {...} | -| Finally.cs:176:10:176:11 | enter M9 | Finally.cs:190:31:190:46 | [finally: exception(Exception)] object creation of type ExceptionC | -| Finally.cs:176:10:176:11 | enter M9 | Finally.cs:190:31:190:46 | [finally: exception(ExceptionA)] object creation of type ExceptionC | +| Finally.cs:176:10:176:11 | enter M9 | Finally.cs:189:13:191:13 | [finally: exception, b1 (line 176): true] {...} | +| Finally.cs:176:10:176:11 | enter M9 | Finally.cs:190:31:190:46 | [finally: exception] object creation of type ExceptionC | | Finally.cs:176:10:176:11 | exit M9 | Finally.cs:176:10:176:11 | exit M9 | | Finally.cs:176:10:176:11 | exit M9 (abnormal) | Finally.cs:176:10:176:11 | exit M9 (abnormal) | | Finally.cs:176:10:176:11 | exit M9 (normal) | Finally.cs:176:10:176:11 | exit M9 (normal) | | Finally.cs:180:21:180:43 | [b1 (line 176): true] throw ...; | Finally.cs:180:21:180:43 | [b1 (line 176): true] throw ...; | -| Finally.cs:180:21:180:43 | [b1 (line 176): true] throw ...; | Finally.cs:186:25:186:47 | [finally: exception(ExceptionA), b1 (line 176): true, b2 (line 176): true] throw ...; | -| Finally.cs:180:21:180:43 | [b1 (line 176): true] throw ...; | Finally.cs:186:31:186:46 | [finally: exception(ExceptionA), b1 (line 176): true, b2 (line 176): true] object creation of type ExceptionB | -| Finally.cs:180:21:180:43 | [b1 (line 176): true] throw ...; | Finally.cs:188:13:191:13 | [finally: exception(ExceptionA), exception: Exception, b1 (line 176): true, b2 (line 176): true] catch (...) {...} | -| Finally.cs:180:21:180:43 | [b1 (line 176): true] throw ...; | Finally.cs:188:38:188:39 | [finally: exception(ExceptionA), exception: Exception, b1 (line 176): true, b2 (line 176): true] access to parameter b2 | -| Finally.cs:180:21:180:43 | [b1 (line 176): true] throw ...; | Finally.cs:188:38:188:39 | [finally: exception(ExceptionA), exception: ExceptionB, b1 (line 176): true, b2 (line 176): true] access to parameter b2 | -| Finally.cs:180:21:180:43 | [b1 (line 176): true] throw ...; | Finally.cs:189:13:191:13 | [finally: exception(ExceptionA), b1 (line 176): true] {...} | -| Finally.cs:180:21:180:43 | [b1 (line 176): true] throw ...; | Finally.cs:190:31:190:46 | [finally: exception(ExceptionA)] object creation of type ExceptionC | | Finally.cs:180:27:180:42 | [b1 (line 176): true] object creation of type ExceptionA | Finally.cs:180:21:180:43 | [b1 (line 176): true] throw ...; | | Finally.cs:180:27:180:42 | [b1 (line 176): true] object creation of type ExceptionA | Finally.cs:180:27:180:42 | [b1 (line 176): true] object creation of type ExceptionA | -| Finally.cs:180:27:180:42 | [b1 (line 176): true] object creation of type ExceptionA | Finally.cs:183:9:192:9 | [finally: exception(Exception), b1 (line 176): true] {...} | -| Finally.cs:180:27:180:42 | [b1 (line 176): true] object creation of type ExceptionA | Finally.cs:186:25:186:47 | [finally: exception(Exception), b1 (line 176): true, b2 (line 176): true] throw ...; | -| Finally.cs:180:27:180:42 | [b1 (line 176): true] object creation of type ExceptionA | Finally.cs:186:25:186:47 | [finally: exception(ExceptionA), b1 (line 176): true, b2 (line 176): true] throw ...; | -| Finally.cs:180:27:180:42 | [b1 (line 176): true] object creation of type ExceptionA | Finally.cs:186:31:186:46 | [finally: exception(Exception), b1 (line 176): true, b2 (line 176): true] object creation of type ExceptionB | -| Finally.cs:180:27:180:42 | [b1 (line 176): true] object creation of type ExceptionA | Finally.cs:186:31:186:46 | [finally: exception(ExceptionA), b1 (line 176): true, b2 (line 176): true] object creation of type ExceptionB | -| Finally.cs:180:27:180:42 | [b1 (line 176): true] object creation of type ExceptionA | Finally.cs:188:13:191:13 | [finally: exception(Exception), exception: Exception, b1 (line 176): true, b2 (line 176): true] catch (...) {...} | -| Finally.cs:180:27:180:42 | [b1 (line 176): true] object creation of type ExceptionA | Finally.cs:188:13:191:13 | [finally: exception(ExceptionA), exception: Exception, b1 (line 176): true, b2 (line 176): true] catch (...) {...} | -| Finally.cs:180:27:180:42 | [b1 (line 176): true] object creation of type ExceptionA | Finally.cs:188:38:188:39 | [finally: exception(Exception), exception: Exception, b1 (line 176): true, b2 (line 176): true] access to parameter b2 | -| Finally.cs:180:27:180:42 | [b1 (line 176): true] object creation of type ExceptionA | Finally.cs:188:38:188:39 | [finally: exception(Exception), exception: ExceptionB, b1 (line 176): true, b2 (line 176): true] access to parameter b2 | -| Finally.cs:180:27:180:42 | [b1 (line 176): true] object creation of type ExceptionA | Finally.cs:188:38:188:39 | [finally: exception(ExceptionA), exception: Exception, b1 (line 176): true, b2 (line 176): true] access to parameter b2 | -| Finally.cs:180:27:180:42 | [b1 (line 176): true] object creation of type ExceptionA | Finally.cs:188:38:188:39 | [finally: exception(ExceptionA), exception: ExceptionB, b1 (line 176): true, b2 (line 176): true] access to parameter b2 | -| Finally.cs:180:27:180:42 | [b1 (line 176): true] object creation of type ExceptionA | Finally.cs:189:13:191:13 | [finally: exception(Exception), b1 (line 176): true] {...} | -| Finally.cs:180:27:180:42 | [b1 (line 176): true] object creation of type ExceptionA | Finally.cs:189:13:191:13 | [finally: exception(ExceptionA), b1 (line 176): true] {...} | -| Finally.cs:180:27:180:42 | [b1 (line 176): true] object creation of type ExceptionA | Finally.cs:190:31:190:46 | [finally: exception(Exception)] object creation of type ExceptionC | -| Finally.cs:180:27:180:42 | [b1 (line 176): true] object creation of type ExceptionA | Finally.cs:190:31:190:46 | [finally: exception(ExceptionA)] object creation of type ExceptionC | +| Finally.cs:180:27:180:42 | [b1 (line 176): true] object creation of type ExceptionA | Finally.cs:183:9:192:9 | [finally: exception, b1 (line 176): true] {...} | +| Finally.cs:180:27:180:42 | [b1 (line 176): true] object creation of type ExceptionA | Finally.cs:186:25:186:47 | [finally: exception, b1 (line 176): true, b2 (line 176): true] throw ...; | +| Finally.cs:180:27:180:42 | [b1 (line 176): true] object creation of type ExceptionA | Finally.cs:186:31:186:46 | [finally: exception, b1 (line 176): true, b2 (line 176): true] object creation of type ExceptionB | +| Finally.cs:180:27:180:42 | [b1 (line 176): true] object creation of type ExceptionA | Finally.cs:188:13:191:13 | [finally: exception, exception: Exception, b1 (line 176): true, b2 (line 176): true] catch (...) {...} | +| Finally.cs:180:27:180:42 | [b1 (line 176): true] object creation of type ExceptionA | Finally.cs:188:38:188:39 | [finally: exception, exception: Exception, b1 (line 176): true, b2 (line 176): true] access to parameter b2 | +| Finally.cs:180:27:180:42 | [b1 (line 176): true] object creation of type ExceptionA | Finally.cs:188:38:188:39 | [finally: exception, exception: ExceptionB, b1 (line 176): true, b2 (line 176): true] access to parameter b2 | +| Finally.cs:180:27:180:42 | [b1 (line 176): true] object creation of type ExceptionA | Finally.cs:189:13:191:13 | [finally: exception, b1 (line 176): true] {...} | +| Finally.cs:180:27:180:42 | [b1 (line 176): true] object creation of type ExceptionA | Finally.cs:190:31:190:46 | [finally: exception] object creation of type ExceptionC | | Finally.cs:183:9:192:9 | [b1 (line 176): false] {...} | Finally.cs:176:10:176:11 | exit M9 (normal) | | Finally.cs:183:9:192:9 | [b1 (line 176): false] {...} | Finally.cs:183:9:192:9 | [b1 (line 176): false] {...} | | Finally.cs:183:9:192:9 | [b1 (line 176): false] {...} | Finally.cs:186:25:186:47 | [b1 (line 176): false, b2 (line 176): true] throw ...; | @@ -11201,186 +10779,119 @@ blockDominance | Finally.cs:183:9:192:9 | [b1 (line 176): false] {...} | Finally.cs:188:38:188:39 | [exception: Exception, b1 (line 176): false, b2 (line 176): true] access to parameter b2 | | Finally.cs:183:9:192:9 | [b1 (line 176): false] {...} | Finally.cs:188:38:188:39 | [exception: ExceptionB, b1 (line 176): false, b2 (line 176): true] access to parameter b2 | | Finally.cs:183:9:192:9 | [b1 (line 176): false] {...} | Finally.cs:189:13:191:13 | [b1 (line 176): false] {...} | -| Finally.cs:183:9:192:9 | [finally: exception(Exception), b1 (line 176): true] {...} | Finally.cs:183:9:192:9 | [finally: exception(Exception), b1 (line 176): true] {...} | -| Finally.cs:183:9:192:9 | [finally: exception(Exception), b1 (line 176): true] {...} | Finally.cs:186:25:186:47 | [finally: exception(Exception), b1 (line 176): true, b2 (line 176): true] throw ...; | -| Finally.cs:183:9:192:9 | [finally: exception(Exception), b1 (line 176): true] {...} | Finally.cs:186:31:186:46 | [finally: exception(Exception), b1 (line 176): true, b2 (line 176): true] object creation of type ExceptionB | -| Finally.cs:183:9:192:9 | [finally: exception(Exception), b1 (line 176): true] {...} | Finally.cs:188:13:191:13 | [finally: exception(Exception), exception: Exception, b1 (line 176): true, b2 (line 176): true] catch (...) {...} | -| Finally.cs:183:9:192:9 | [finally: exception(Exception), b1 (line 176): true] {...} | Finally.cs:188:38:188:39 | [finally: exception(Exception), exception: Exception, b1 (line 176): true, b2 (line 176): true] access to parameter b2 | -| Finally.cs:183:9:192:9 | [finally: exception(Exception), b1 (line 176): true] {...} | Finally.cs:188:38:188:39 | [finally: exception(Exception), exception: ExceptionB, b1 (line 176): true, b2 (line 176): true] access to parameter b2 | -| Finally.cs:183:9:192:9 | [finally: exception(Exception), b1 (line 176): true] {...} | Finally.cs:189:13:191:13 | [finally: exception(Exception), b1 (line 176): true] {...} | -| Finally.cs:183:9:192:9 | [finally: exception(Exception), b1 (line 176): true] {...} | Finally.cs:190:31:190:46 | [finally: exception(Exception)] object creation of type ExceptionC | +| Finally.cs:183:9:192:9 | [finally: exception, b1 (line 176): true] {...} | Finally.cs:183:9:192:9 | [finally: exception, b1 (line 176): true] {...} | +| Finally.cs:183:9:192:9 | [finally: exception, b1 (line 176): true] {...} | Finally.cs:186:25:186:47 | [finally: exception, b1 (line 176): true, b2 (line 176): true] throw ...; | +| Finally.cs:183:9:192:9 | [finally: exception, b1 (line 176): true] {...} | Finally.cs:186:31:186:46 | [finally: exception, b1 (line 176): true, b2 (line 176): true] object creation of type ExceptionB | +| Finally.cs:183:9:192:9 | [finally: exception, b1 (line 176): true] {...} | Finally.cs:188:13:191:13 | [finally: exception, exception: Exception, b1 (line 176): true, b2 (line 176): true] catch (...) {...} | +| Finally.cs:183:9:192:9 | [finally: exception, b1 (line 176): true] {...} | Finally.cs:188:38:188:39 | [finally: exception, exception: Exception, b1 (line 176): true, b2 (line 176): true] access to parameter b2 | +| Finally.cs:183:9:192:9 | [finally: exception, b1 (line 176): true] {...} | Finally.cs:188:38:188:39 | [finally: exception, exception: ExceptionB, b1 (line 176): true, b2 (line 176): true] access to parameter b2 | +| Finally.cs:183:9:192:9 | [finally: exception, b1 (line 176): true] {...} | Finally.cs:189:13:191:13 | [finally: exception, b1 (line 176): true] {...} | +| Finally.cs:183:9:192:9 | [finally: exception, b1 (line 176): true] {...} | Finally.cs:190:31:190:46 | [finally: exception] object creation of type ExceptionC | | Finally.cs:186:25:186:47 | [b1 (line 176): false, b2 (line 176): true] throw ...; | Finally.cs:186:25:186:47 | [b1 (line 176): false, b2 (line 176): true] throw ...; | | Finally.cs:186:25:186:47 | [b1 (line 176): false, b2 (line 176): true] throw ...; | Finally.cs:188:38:188:39 | [exception: ExceptionB, b1 (line 176): false, b2 (line 176): true] access to parameter b2 | -| Finally.cs:186:25:186:47 | [finally: exception(Exception), b1 (line 176): true, b2 (line 176): true] throw ...; | Finally.cs:186:25:186:47 | [finally: exception(Exception), b1 (line 176): true, b2 (line 176): true] throw ...; | -| Finally.cs:186:25:186:47 | [finally: exception(Exception), b1 (line 176): true, b2 (line 176): true] throw ...; | Finally.cs:188:38:188:39 | [finally: exception(Exception), exception: ExceptionB, b1 (line 176): true, b2 (line 176): true] access to parameter b2 | -| Finally.cs:186:25:186:47 | [finally: exception(ExceptionA), b1 (line 176): true, b2 (line 176): true] throw ...; | Finally.cs:186:25:186:47 | [finally: exception(ExceptionA), b1 (line 176): true, b2 (line 176): true] throw ...; | -| Finally.cs:186:25:186:47 | [finally: exception(ExceptionA), b1 (line 176): true, b2 (line 176): true] throw ...; | Finally.cs:188:38:188:39 | [finally: exception(ExceptionA), exception: ExceptionB, b1 (line 176): true, b2 (line 176): true] access to parameter b2 | +| Finally.cs:186:25:186:47 | [finally: exception, b1 (line 176): true, b2 (line 176): true] throw ...; | Finally.cs:186:25:186:47 | [finally: exception, b1 (line 176): true, b2 (line 176): true] throw ...; | +| Finally.cs:186:25:186:47 | [finally: exception, b1 (line 176): true, b2 (line 176): true] throw ...; | Finally.cs:188:38:188:39 | [finally: exception, exception: ExceptionB, b1 (line 176): true, b2 (line 176): true] access to parameter b2 | | Finally.cs:186:31:186:46 | [b1 (line 176): false, b2 (line 176): true] object creation of type ExceptionB | Finally.cs:186:25:186:47 | [b1 (line 176): false, b2 (line 176): true] throw ...; | | Finally.cs:186:31:186:46 | [b1 (line 176): false, b2 (line 176): true] object creation of type ExceptionB | Finally.cs:186:31:186:46 | [b1 (line 176): false, b2 (line 176): true] object creation of type ExceptionB | | Finally.cs:186:31:186:46 | [b1 (line 176): false, b2 (line 176): true] object creation of type ExceptionB | Finally.cs:188:13:191:13 | [exception: Exception, b1 (line 176): false, b2 (line 176): true] catch (...) {...} | | Finally.cs:186:31:186:46 | [b1 (line 176): false, b2 (line 176): true] object creation of type ExceptionB | Finally.cs:188:38:188:39 | [exception: Exception, b1 (line 176): false, b2 (line 176): true] access to parameter b2 | | Finally.cs:186:31:186:46 | [b1 (line 176): false, b2 (line 176): true] object creation of type ExceptionB | Finally.cs:188:38:188:39 | [exception: ExceptionB, b1 (line 176): false, b2 (line 176): true] access to parameter b2 | | Finally.cs:186:31:186:46 | [b1 (line 176): false, b2 (line 176): true] object creation of type ExceptionB | Finally.cs:189:13:191:13 | [b1 (line 176): false] {...} | -| Finally.cs:186:31:186:46 | [finally: exception(Exception), b1 (line 176): true, b2 (line 176): true] object creation of type ExceptionB | Finally.cs:186:25:186:47 | [finally: exception(Exception), b1 (line 176): true, b2 (line 176): true] throw ...; | -| Finally.cs:186:31:186:46 | [finally: exception(Exception), b1 (line 176): true, b2 (line 176): true] object creation of type ExceptionB | Finally.cs:186:31:186:46 | [finally: exception(Exception), b1 (line 176): true, b2 (line 176): true] object creation of type ExceptionB | -| Finally.cs:186:31:186:46 | [finally: exception(Exception), b1 (line 176): true, b2 (line 176): true] object creation of type ExceptionB | Finally.cs:188:13:191:13 | [finally: exception(Exception), exception: Exception, b1 (line 176): true, b2 (line 176): true] catch (...) {...} | -| Finally.cs:186:31:186:46 | [finally: exception(Exception), b1 (line 176): true, b2 (line 176): true] object creation of type ExceptionB | Finally.cs:188:38:188:39 | [finally: exception(Exception), exception: Exception, b1 (line 176): true, b2 (line 176): true] access to parameter b2 | -| Finally.cs:186:31:186:46 | [finally: exception(Exception), b1 (line 176): true, b2 (line 176): true] object creation of type ExceptionB | Finally.cs:188:38:188:39 | [finally: exception(Exception), exception: ExceptionB, b1 (line 176): true, b2 (line 176): true] access to parameter b2 | -| Finally.cs:186:31:186:46 | [finally: exception(Exception), b1 (line 176): true, b2 (line 176): true] object creation of type ExceptionB | Finally.cs:189:13:191:13 | [finally: exception(Exception), b1 (line 176): true] {...} | -| Finally.cs:186:31:186:46 | [finally: exception(Exception), b1 (line 176): true, b2 (line 176): true] object creation of type ExceptionB | Finally.cs:190:31:190:46 | [finally: exception(Exception)] object creation of type ExceptionC | -| Finally.cs:186:31:186:46 | [finally: exception(ExceptionA), b1 (line 176): true, b2 (line 176): true] object creation of type ExceptionB | Finally.cs:186:25:186:47 | [finally: exception(ExceptionA), b1 (line 176): true, b2 (line 176): true] throw ...; | -| Finally.cs:186:31:186:46 | [finally: exception(ExceptionA), b1 (line 176): true, b2 (line 176): true] object creation of type ExceptionB | Finally.cs:186:31:186:46 | [finally: exception(ExceptionA), b1 (line 176): true, b2 (line 176): true] object creation of type ExceptionB | -| Finally.cs:186:31:186:46 | [finally: exception(ExceptionA), b1 (line 176): true, b2 (line 176): true] object creation of type ExceptionB | Finally.cs:188:13:191:13 | [finally: exception(ExceptionA), exception: Exception, b1 (line 176): true, b2 (line 176): true] catch (...) {...} | -| Finally.cs:186:31:186:46 | [finally: exception(ExceptionA), b1 (line 176): true, b2 (line 176): true] object creation of type ExceptionB | Finally.cs:188:38:188:39 | [finally: exception(ExceptionA), exception: Exception, b1 (line 176): true, b2 (line 176): true] access to parameter b2 | -| Finally.cs:186:31:186:46 | [finally: exception(ExceptionA), b1 (line 176): true, b2 (line 176): true] object creation of type ExceptionB | Finally.cs:188:38:188:39 | [finally: exception(ExceptionA), exception: ExceptionB, b1 (line 176): true, b2 (line 176): true] access to parameter b2 | -| Finally.cs:186:31:186:46 | [finally: exception(ExceptionA), b1 (line 176): true, b2 (line 176): true] object creation of type ExceptionB | Finally.cs:189:13:191:13 | [finally: exception(ExceptionA), b1 (line 176): true] {...} | -| Finally.cs:186:31:186:46 | [finally: exception(ExceptionA), b1 (line 176): true, b2 (line 176): true] object creation of type ExceptionB | Finally.cs:190:31:190:46 | [finally: exception(ExceptionA)] object creation of type ExceptionC | +| Finally.cs:186:31:186:46 | [finally: exception, b1 (line 176): true, b2 (line 176): true] object creation of type ExceptionB | Finally.cs:186:25:186:47 | [finally: exception, b1 (line 176): true, b2 (line 176): true] throw ...; | +| Finally.cs:186:31:186:46 | [finally: exception, b1 (line 176): true, b2 (line 176): true] object creation of type ExceptionB | Finally.cs:186:31:186:46 | [finally: exception, b1 (line 176): true, b2 (line 176): true] object creation of type ExceptionB | +| Finally.cs:186:31:186:46 | [finally: exception, b1 (line 176): true, b2 (line 176): true] object creation of type ExceptionB | Finally.cs:188:13:191:13 | [finally: exception, exception: Exception, b1 (line 176): true, b2 (line 176): true] catch (...) {...} | +| Finally.cs:186:31:186:46 | [finally: exception, b1 (line 176): true, b2 (line 176): true] object creation of type ExceptionB | Finally.cs:188:38:188:39 | [finally: exception, exception: Exception, b1 (line 176): true, b2 (line 176): true] access to parameter b2 | +| Finally.cs:186:31:186:46 | [finally: exception, b1 (line 176): true, b2 (line 176): true] object creation of type ExceptionB | Finally.cs:188:38:188:39 | [finally: exception, exception: ExceptionB, b1 (line 176): true, b2 (line 176): true] access to parameter b2 | +| Finally.cs:186:31:186:46 | [finally: exception, b1 (line 176): true, b2 (line 176): true] object creation of type ExceptionB | Finally.cs:189:13:191:13 | [finally: exception, b1 (line 176): true] {...} | +| Finally.cs:186:31:186:46 | [finally: exception, b1 (line 176): true, b2 (line 176): true] object creation of type ExceptionB | Finally.cs:190:31:190:46 | [finally: exception] object creation of type ExceptionC | | Finally.cs:188:13:191:13 | [exception: Exception, b1 (line 176): false, b2 (line 176): true] catch (...) {...} | Finally.cs:188:13:191:13 | [exception: Exception, b1 (line 176): false, b2 (line 176): true] catch (...) {...} | | Finally.cs:188:13:191:13 | [exception: Exception, b1 (line 176): false, b2 (line 176): true] catch (...) {...} | Finally.cs:188:38:188:39 | [exception: Exception, b1 (line 176): false, b2 (line 176): true] access to parameter b2 | -| Finally.cs:188:13:191:13 | [finally: exception(Exception), exception: Exception, b1 (line 176): true, b2 (line 176): true] catch (...) {...} | Finally.cs:188:13:191:13 | [finally: exception(Exception), exception: Exception, b1 (line 176): true, b2 (line 176): true] catch (...) {...} | -| Finally.cs:188:13:191:13 | [finally: exception(Exception), exception: Exception, b1 (line 176): true, b2 (line 176): true] catch (...) {...} | Finally.cs:188:38:188:39 | [finally: exception(Exception), exception: Exception, b1 (line 176): true, b2 (line 176): true] access to parameter b2 | -| Finally.cs:188:13:191:13 | [finally: exception(ExceptionA), exception: Exception, b1 (line 176): true, b2 (line 176): true] catch (...) {...} | Finally.cs:188:13:191:13 | [finally: exception(ExceptionA), exception: Exception, b1 (line 176): true, b2 (line 176): true] catch (...) {...} | -| Finally.cs:188:13:191:13 | [finally: exception(ExceptionA), exception: Exception, b1 (line 176): true, b2 (line 176): true] catch (...) {...} | Finally.cs:188:38:188:39 | [finally: exception(ExceptionA), exception: Exception, b1 (line 176): true, b2 (line 176): true] access to parameter b2 | +| Finally.cs:188:13:191:13 | [finally: exception, exception: Exception, b1 (line 176): true, b2 (line 176): true] catch (...) {...} | Finally.cs:188:13:191:13 | [finally: exception, exception: Exception, b1 (line 176): true, b2 (line 176): true] catch (...) {...} | +| Finally.cs:188:13:191:13 | [finally: exception, exception: Exception, b1 (line 176): true, b2 (line 176): true] catch (...) {...} | Finally.cs:188:38:188:39 | [finally: exception, exception: Exception, b1 (line 176): true, b2 (line 176): true] access to parameter b2 | | Finally.cs:188:38:188:39 | [exception: Exception, b1 (line 176): false, b2 (line 176): true] access to parameter b2 | Finally.cs:188:38:188:39 | [exception: Exception, b1 (line 176): false, b2 (line 176): true] access to parameter b2 | | Finally.cs:188:38:188:39 | [exception: ExceptionB, b1 (line 176): false, b2 (line 176): true] access to parameter b2 | Finally.cs:188:38:188:39 | [exception: ExceptionB, b1 (line 176): false, b2 (line 176): true] access to parameter b2 | -| Finally.cs:188:38:188:39 | [finally: exception(Exception), exception: Exception, b1 (line 176): true, b2 (line 176): true] access to parameter b2 | Finally.cs:188:38:188:39 | [finally: exception(Exception), exception: Exception, b1 (line 176): true, b2 (line 176): true] access to parameter b2 | -| Finally.cs:188:38:188:39 | [finally: exception(Exception), exception: ExceptionB, b1 (line 176): true, b2 (line 176): true] access to parameter b2 | Finally.cs:188:38:188:39 | [finally: exception(Exception), exception: ExceptionB, b1 (line 176): true, b2 (line 176): true] access to parameter b2 | -| Finally.cs:188:38:188:39 | [finally: exception(ExceptionA), exception: Exception, b1 (line 176): true, b2 (line 176): true] access to parameter b2 | Finally.cs:188:38:188:39 | [finally: exception(ExceptionA), exception: Exception, b1 (line 176): true, b2 (line 176): true] access to parameter b2 | -| Finally.cs:188:38:188:39 | [finally: exception(ExceptionA), exception: ExceptionB, b1 (line 176): true, b2 (line 176): true] access to parameter b2 | Finally.cs:188:38:188:39 | [finally: exception(ExceptionA), exception: ExceptionB, b1 (line 176): true, b2 (line 176): true] access to parameter b2 | +| Finally.cs:188:38:188:39 | [finally: exception, exception: Exception, b1 (line 176): true, b2 (line 176): true] access to parameter b2 | Finally.cs:188:38:188:39 | [finally: exception, exception: Exception, b1 (line 176): true, b2 (line 176): true] access to parameter b2 | +| Finally.cs:188:38:188:39 | [finally: exception, exception: ExceptionB, b1 (line 176): true, b2 (line 176): true] access to parameter b2 | Finally.cs:188:38:188:39 | [finally: exception, exception: ExceptionB, b1 (line 176): true, b2 (line 176): true] access to parameter b2 | | Finally.cs:189:13:191:13 | [b1 (line 176): false] {...} | Finally.cs:189:13:191:13 | [b1 (line 176): false] {...} | -| Finally.cs:189:13:191:13 | [finally: exception(Exception), b1 (line 176): true] {...} | Finally.cs:189:13:191:13 | [finally: exception(Exception), b1 (line 176): true] {...} | -| Finally.cs:189:13:191:13 | [finally: exception(Exception), b1 (line 176): true] {...} | Finally.cs:190:31:190:46 | [finally: exception(Exception)] object creation of type ExceptionC | -| Finally.cs:189:13:191:13 | [finally: exception(ExceptionA), b1 (line 176): true] {...} | Finally.cs:189:13:191:13 | [finally: exception(ExceptionA), b1 (line 176): true] {...} | -| Finally.cs:189:13:191:13 | [finally: exception(ExceptionA), b1 (line 176): true] {...} | Finally.cs:190:31:190:46 | [finally: exception(ExceptionA)] object creation of type ExceptionC | -| Finally.cs:190:31:190:46 | [finally: exception(Exception)] object creation of type ExceptionC | Finally.cs:190:31:190:46 | [finally: exception(Exception)] object creation of type ExceptionC | -| Finally.cs:190:31:190:46 | [finally: exception(ExceptionA)] object creation of type ExceptionC | Finally.cs:190:31:190:46 | [finally: exception(ExceptionA)] object creation of type ExceptionC | +| Finally.cs:189:13:191:13 | [finally: exception, b1 (line 176): true] {...} | Finally.cs:189:13:191:13 | [finally: exception, b1 (line 176): true] {...} | +| Finally.cs:189:13:191:13 | [finally: exception, b1 (line 176): true] {...} | Finally.cs:190:31:190:46 | [finally: exception] object creation of type ExceptionC | +| Finally.cs:190:31:190:46 | [finally: exception] object creation of type ExceptionC | Finally.cs:190:31:190:46 | [finally: exception] object creation of type ExceptionC | | Finally.cs:195:10:195:12 | enter M10 | Finally.cs:195:10:195:12 | enter M10 | | Finally.cs:195:10:195:12 | enter M10 | Finally.cs:195:10:195:12 | exit M10 | | Finally.cs:195:10:195:12 | enter M10 | Finally.cs:195:10:195:12 | exit M10 (abnormal) | | Finally.cs:195:10:195:12 | enter M10 | Finally.cs:199:21:199:43 | throw ...; | | Finally.cs:195:10:195:12 | enter M10 | Finally.cs:199:27:199:42 | object creation of type ExceptionA | -| Finally.cs:195:10:195:12 | enter M10 | Finally.cs:202:9:212:9 | [finally: exception(Exception)] {...} | +| Finally.cs:195:10:195:12 | enter M10 | Finally.cs:202:9:212:9 | [finally: exception] {...} | | Finally.cs:195:10:195:12 | enter M10 | Finally.cs:202:9:212:9 | {...} | -| Finally.cs:195:10:195:12 | enter M10 | Finally.cs:205:25:205:47 | [finally: exception(Exception)] throw ...; | -| Finally.cs:195:10:195:12 | enter M10 | Finally.cs:205:25:205:47 | [finally: exception(ExceptionA)] throw ...; | +| Finally.cs:195:10:195:12 | enter M10 | Finally.cs:205:25:205:47 | [finally: exception] throw ...; | | Finally.cs:195:10:195:12 | enter M10 | Finally.cs:205:25:205:47 | throw ...; | -| Finally.cs:195:10:195:12 | enter M10 | Finally.cs:205:31:205:46 | [finally: exception(Exception)] object creation of type ExceptionB | -| Finally.cs:195:10:195:12 | enter M10 | Finally.cs:205:31:205:46 | [finally: exception(ExceptionA)] object creation of type ExceptionB | +| Finally.cs:195:10:195:12 | enter M10 | Finally.cs:205:31:205:46 | [finally: exception] object creation of type ExceptionB | | Finally.cs:195:10:195:12 | enter M10 | Finally.cs:205:31:205:46 | object creation of type ExceptionB | -| Finally.cs:195:10:195:12 | enter M10 | Finally.cs:208:13:210:13 | [finally(1): exception(Exception)] {...} | -| Finally.cs:195:10:195:12 | enter M10 | Finally.cs:208:13:210:13 | [finally: exception(Exception), finally(1): exception(Exception)] {...} | -| Finally.cs:195:10:195:12 | enter M10 | Finally.cs:208:13:210:13 | [finally: exception(Exception)] {...} | -| Finally.cs:195:10:195:12 | enter M10 | Finally.cs:208:13:210:13 | [finally: exception(ExceptionA), finally(1): exception(Exception)] {...} | -| Finally.cs:195:10:195:12 | enter M10 | Finally.cs:208:13:210:13 | [finally: exception(ExceptionA)] {...} | +| Finally.cs:195:10:195:12 | enter M10 | Finally.cs:208:13:210:13 | [finally(1): exception] {...} | +| Finally.cs:195:10:195:12 | enter M10 | Finally.cs:208:13:210:13 | [finally: exception, finally(1): exception] {...} | +| Finally.cs:195:10:195:12 | enter M10 | Finally.cs:208:13:210:13 | [finally: exception] {...} | | Finally.cs:195:10:195:12 | enter M10 | Finally.cs:208:13:210:13 | {...} | -| Finally.cs:195:10:195:12 | enter M10 | Finally.cs:209:31:209:46 | [finally(1): exception(Exception)] object creation of type ExceptionC | -| Finally.cs:195:10:195:12 | enter M10 | Finally.cs:209:31:209:46 | [finally(1): exception(ExceptionB)] object creation of type ExceptionC | -| Finally.cs:195:10:195:12 | enter M10 | Finally.cs:209:31:209:46 | [finally: exception(Exception), finally(1): exception(Exception)] object creation of type ExceptionC | -| Finally.cs:195:10:195:12 | enter M10 | Finally.cs:209:31:209:46 | [finally: exception(Exception), finally(1): exception(ExceptionB)] object creation of type ExceptionC | -| Finally.cs:195:10:195:12 | enter M10 | Finally.cs:209:31:209:46 | [finally: exception(Exception)] object creation of type ExceptionC | -| Finally.cs:195:10:195:12 | enter M10 | Finally.cs:209:31:209:46 | [finally: exception(ExceptionA), finally(1): exception(Exception)] object creation of type ExceptionC | -| Finally.cs:195:10:195:12 | enter M10 | Finally.cs:209:31:209:46 | [finally: exception(ExceptionA), finally(1): exception(ExceptionB)] object creation of type ExceptionC | -| Finally.cs:195:10:195:12 | enter M10 | Finally.cs:209:31:209:46 | [finally: exception(ExceptionA)] object creation of type ExceptionC | +| Finally.cs:195:10:195:12 | enter M10 | Finally.cs:209:31:209:46 | [finally(1): exception] object creation of type ExceptionC | +| Finally.cs:195:10:195:12 | enter M10 | Finally.cs:209:31:209:46 | [finally: exception, finally(1): exception] object creation of type ExceptionC | +| Finally.cs:195:10:195:12 | enter M10 | Finally.cs:209:31:209:46 | [finally: exception] object creation of type ExceptionC | | Finally.cs:195:10:195:12 | enter M10 | Finally.cs:209:31:209:46 | object creation of type ExceptionC | | Finally.cs:195:10:195:12 | enter M10 | Finally.cs:211:13:211:29 | ...; | -| Finally.cs:195:10:195:12 | enter M10 | Finally.cs:211:13:211:29 | [finally: exception(Exception)] ...; | -| Finally.cs:195:10:195:12 | enter M10 | Finally.cs:211:13:211:29 | [finally: exception(ExceptionA)] ...; | +| Finally.cs:195:10:195:12 | enter M10 | Finally.cs:211:13:211:29 | [finally: exception] ...; | | Finally.cs:195:10:195:12 | exit M10 | Finally.cs:195:10:195:12 | exit M10 | | Finally.cs:195:10:195:12 | exit M10 (abnormal) | Finally.cs:195:10:195:12 | exit M10 (abnormal) | | Finally.cs:199:21:199:43 | throw ...; | Finally.cs:199:21:199:43 | throw ...; | -| Finally.cs:199:21:199:43 | throw ...; | Finally.cs:205:25:205:47 | [finally: exception(ExceptionA)] throw ...; | -| Finally.cs:199:21:199:43 | throw ...; | Finally.cs:205:31:205:46 | [finally: exception(ExceptionA)] object creation of type ExceptionB | -| Finally.cs:199:21:199:43 | throw ...; | Finally.cs:208:13:210:13 | [finally: exception(ExceptionA), finally(1): exception(Exception)] {...} | -| Finally.cs:199:21:199:43 | throw ...; | Finally.cs:208:13:210:13 | [finally: exception(ExceptionA)] {...} | -| Finally.cs:199:21:199:43 | throw ...; | Finally.cs:209:31:209:46 | [finally: exception(ExceptionA), finally(1): exception(Exception)] object creation of type ExceptionC | -| Finally.cs:199:21:199:43 | throw ...; | Finally.cs:209:31:209:46 | [finally: exception(ExceptionA), finally(1): exception(ExceptionB)] object creation of type ExceptionC | -| Finally.cs:199:21:199:43 | throw ...; | Finally.cs:209:31:209:46 | [finally: exception(ExceptionA)] object creation of type ExceptionC | -| Finally.cs:199:21:199:43 | throw ...; | Finally.cs:211:13:211:29 | [finally: exception(ExceptionA)] ...; | | Finally.cs:199:27:199:42 | object creation of type ExceptionA | Finally.cs:199:21:199:43 | throw ...; | | Finally.cs:199:27:199:42 | object creation of type ExceptionA | Finally.cs:199:27:199:42 | object creation of type ExceptionA | -| Finally.cs:199:27:199:42 | object creation of type ExceptionA | Finally.cs:202:9:212:9 | [finally: exception(Exception)] {...} | -| Finally.cs:199:27:199:42 | object creation of type ExceptionA | Finally.cs:205:25:205:47 | [finally: exception(Exception)] throw ...; | -| Finally.cs:199:27:199:42 | object creation of type ExceptionA | Finally.cs:205:25:205:47 | [finally: exception(ExceptionA)] throw ...; | -| Finally.cs:199:27:199:42 | object creation of type ExceptionA | Finally.cs:205:31:205:46 | [finally: exception(Exception)] object creation of type ExceptionB | -| Finally.cs:199:27:199:42 | object creation of type ExceptionA | Finally.cs:205:31:205:46 | [finally: exception(ExceptionA)] object creation of type ExceptionB | -| Finally.cs:199:27:199:42 | object creation of type ExceptionA | Finally.cs:208:13:210:13 | [finally: exception(Exception), finally(1): exception(Exception)] {...} | -| Finally.cs:199:27:199:42 | object creation of type ExceptionA | Finally.cs:208:13:210:13 | [finally: exception(Exception)] {...} | -| Finally.cs:199:27:199:42 | object creation of type ExceptionA | Finally.cs:208:13:210:13 | [finally: exception(ExceptionA), finally(1): exception(Exception)] {...} | -| Finally.cs:199:27:199:42 | object creation of type ExceptionA | Finally.cs:208:13:210:13 | [finally: exception(ExceptionA)] {...} | -| Finally.cs:199:27:199:42 | object creation of type ExceptionA | Finally.cs:209:31:209:46 | [finally: exception(Exception), finally(1): exception(Exception)] object creation of type ExceptionC | -| Finally.cs:199:27:199:42 | object creation of type ExceptionA | Finally.cs:209:31:209:46 | [finally: exception(Exception), finally(1): exception(ExceptionB)] object creation of type ExceptionC | -| Finally.cs:199:27:199:42 | object creation of type ExceptionA | Finally.cs:209:31:209:46 | [finally: exception(Exception)] object creation of type ExceptionC | -| Finally.cs:199:27:199:42 | object creation of type ExceptionA | Finally.cs:209:31:209:46 | [finally: exception(ExceptionA), finally(1): exception(Exception)] object creation of type ExceptionC | -| Finally.cs:199:27:199:42 | object creation of type ExceptionA | Finally.cs:209:31:209:46 | [finally: exception(ExceptionA), finally(1): exception(ExceptionB)] object creation of type ExceptionC | -| Finally.cs:199:27:199:42 | object creation of type ExceptionA | Finally.cs:209:31:209:46 | [finally: exception(ExceptionA)] object creation of type ExceptionC | -| Finally.cs:199:27:199:42 | object creation of type ExceptionA | Finally.cs:211:13:211:29 | [finally: exception(Exception)] ...; | -| Finally.cs:199:27:199:42 | object creation of type ExceptionA | Finally.cs:211:13:211:29 | [finally: exception(ExceptionA)] ...; | -| Finally.cs:202:9:212:9 | [finally: exception(Exception)] {...} | Finally.cs:202:9:212:9 | [finally: exception(Exception)] {...} | -| Finally.cs:202:9:212:9 | [finally: exception(Exception)] {...} | Finally.cs:205:25:205:47 | [finally: exception(Exception)] throw ...; | -| Finally.cs:202:9:212:9 | [finally: exception(Exception)] {...} | Finally.cs:205:31:205:46 | [finally: exception(Exception)] object creation of type ExceptionB | -| Finally.cs:202:9:212:9 | [finally: exception(Exception)] {...} | Finally.cs:208:13:210:13 | [finally: exception(Exception), finally(1): exception(Exception)] {...} | -| Finally.cs:202:9:212:9 | [finally: exception(Exception)] {...} | Finally.cs:208:13:210:13 | [finally: exception(Exception)] {...} | -| Finally.cs:202:9:212:9 | [finally: exception(Exception)] {...} | Finally.cs:209:31:209:46 | [finally: exception(Exception), finally(1): exception(Exception)] object creation of type ExceptionC | -| Finally.cs:202:9:212:9 | [finally: exception(Exception)] {...} | Finally.cs:209:31:209:46 | [finally: exception(Exception), finally(1): exception(ExceptionB)] object creation of type ExceptionC | -| Finally.cs:202:9:212:9 | [finally: exception(Exception)] {...} | Finally.cs:209:31:209:46 | [finally: exception(Exception)] object creation of type ExceptionC | -| Finally.cs:202:9:212:9 | [finally: exception(Exception)] {...} | Finally.cs:211:13:211:29 | [finally: exception(Exception)] ...; | +| Finally.cs:199:27:199:42 | object creation of type ExceptionA | Finally.cs:202:9:212:9 | [finally: exception] {...} | +| Finally.cs:199:27:199:42 | object creation of type ExceptionA | Finally.cs:205:25:205:47 | [finally: exception] throw ...; | +| Finally.cs:199:27:199:42 | object creation of type ExceptionA | Finally.cs:205:31:205:46 | [finally: exception] object creation of type ExceptionB | +| Finally.cs:199:27:199:42 | object creation of type ExceptionA | Finally.cs:208:13:210:13 | [finally: exception, finally(1): exception] {...} | +| Finally.cs:199:27:199:42 | object creation of type ExceptionA | Finally.cs:208:13:210:13 | [finally: exception] {...} | +| Finally.cs:199:27:199:42 | object creation of type ExceptionA | Finally.cs:209:31:209:46 | [finally: exception, finally(1): exception] object creation of type ExceptionC | +| Finally.cs:199:27:199:42 | object creation of type ExceptionA | Finally.cs:209:31:209:46 | [finally: exception] object creation of type ExceptionC | +| Finally.cs:199:27:199:42 | object creation of type ExceptionA | Finally.cs:211:13:211:29 | [finally: exception] ...; | +| Finally.cs:202:9:212:9 | [finally: exception] {...} | Finally.cs:202:9:212:9 | [finally: exception] {...} | +| Finally.cs:202:9:212:9 | [finally: exception] {...} | Finally.cs:205:25:205:47 | [finally: exception] throw ...; | +| Finally.cs:202:9:212:9 | [finally: exception] {...} | Finally.cs:205:31:205:46 | [finally: exception] object creation of type ExceptionB | +| Finally.cs:202:9:212:9 | [finally: exception] {...} | Finally.cs:208:13:210:13 | [finally: exception, finally(1): exception] {...} | +| Finally.cs:202:9:212:9 | [finally: exception] {...} | Finally.cs:208:13:210:13 | [finally: exception] {...} | +| Finally.cs:202:9:212:9 | [finally: exception] {...} | Finally.cs:209:31:209:46 | [finally: exception, finally(1): exception] object creation of type ExceptionC | +| Finally.cs:202:9:212:9 | [finally: exception] {...} | Finally.cs:209:31:209:46 | [finally: exception] object creation of type ExceptionC | +| Finally.cs:202:9:212:9 | [finally: exception] {...} | Finally.cs:211:13:211:29 | [finally: exception] ...; | | Finally.cs:202:9:212:9 | {...} | Finally.cs:202:9:212:9 | {...} | | Finally.cs:202:9:212:9 | {...} | Finally.cs:205:25:205:47 | throw ...; | | Finally.cs:202:9:212:9 | {...} | Finally.cs:205:31:205:46 | object creation of type ExceptionB | -| Finally.cs:202:9:212:9 | {...} | Finally.cs:208:13:210:13 | [finally(1): exception(Exception)] {...} | +| Finally.cs:202:9:212:9 | {...} | Finally.cs:208:13:210:13 | [finally(1): exception] {...} | | Finally.cs:202:9:212:9 | {...} | Finally.cs:208:13:210:13 | {...} | -| Finally.cs:202:9:212:9 | {...} | Finally.cs:209:31:209:46 | [finally(1): exception(Exception)] object creation of type ExceptionC | -| Finally.cs:202:9:212:9 | {...} | Finally.cs:209:31:209:46 | [finally(1): exception(ExceptionB)] object creation of type ExceptionC | +| Finally.cs:202:9:212:9 | {...} | Finally.cs:209:31:209:46 | [finally(1): exception] object creation of type ExceptionC | | Finally.cs:202:9:212:9 | {...} | Finally.cs:209:31:209:46 | object creation of type ExceptionC | | Finally.cs:202:9:212:9 | {...} | Finally.cs:211:13:211:29 | ...; | -| Finally.cs:205:25:205:47 | [finally: exception(Exception)] throw ...; | Finally.cs:205:25:205:47 | [finally: exception(Exception)] throw ...; | -| Finally.cs:205:25:205:47 | [finally: exception(Exception)] throw ...; | Finally.cs:209:31:209:46 | [finally: exception(Exception), finally(1): exception(ExceptionB)] object creation of type ExceptionC | -| Finally.cs:205:25:205:47 | [finally: exception(ExceptionA)] throw ...; | Finally.cs:205:25:205:47 | [finally: exception(ExceptionA)] throw ...; | -| Finally.cs:205:25:205:47 | [finally: exception(ExceptionA)] throw ...; | Finally.cs:209:31:209:46 | [finally: exception(ExceptionA), finally(1): exception(ExceptionB)] object creation of type ExceptionC | +| Finally.cs:205:25:205:47 | [finally: exception] throw ...; | Finally.cs:205:25:205:47 | [finally: exception] throw ...; | | Finally.cs:205:25:205:47 | throw ...; | Finally.cs:205:25:205:47 | throw ...; | -| Finally.cs:205:25:205:47 | throw ...; | Finally.cs:209:31:209:46 | [finally(1): exception(ExceptionB)] object creation of type ExceptionC | -| Finally.cs:205:31:205:46 | [finally: exception(Exception)] object creation of type ExceptionB | Finally.cs:205:25:205:47 | [finally: exception(Exception)] throw ...; | -| Finally.cs:205:31:205:46 | [finally: exception(Exception)] object creation of type ExceptionB | Finally.cs:205:31:205:46 | [finally: exception(Exception)] object creation of type ExceptionB | -| Finally.cs:205:31:205:46 | [finally: exception(Exception)] object creation of type ExceptionB | Finally.cs:208:13:210:13 | [finally: exception(Exception), finally(1): exception(Exception)] {...} | -| Finally.cs:205:31:205:46 | [finally: exception(Exception)] object creation of type ExceptionB | Finally.cs:209:31:209:46 | [finally: exception(Exception), finally(1): exception(Exception)] object creation of type ExceptionC | -| Finally.cs:205:31:205:46 | [finally: exception(Exception)] object creation of type ExceptionB | Finally.cs:209:31:209:46 | [finally: exception(Exception), finally(1): exception(ExceptionB)] object creation of type ExceptionC | -| Finally.cs:205:31:205:46 | [finally: exception(ExceptionA)] object creation of type ExceptionB | Finally.cs:205:25:205:47 | [finally: exception(ExceptionA)] throw ...; | -| Finally.cs:205:31:205:46 | [finally: exception(ExceptionA)] object creation of type ExceptionB | Finally.cs:205:31:205:46 | [finally: exception(ExceptionA)] object creation of type ExceptionB | -| Finally.cs:205:31:205:46 | [finally: exception(ExceptionA)] object creation of type ExceptionB | Finally.cs:208:13:210:13 | [finally: exception(ExceptionA), finally(1): exception(Exception)] {...} | -| Finally.cs:205:31:205:46 | [finally: exception(ExceptionA)] object creation of type ExceptionB | Finally.cs:209:31:209:46 | [finally: exception(ExceptionA), finally(1): exception(Exception)] object creation of type ExceptionC | -| Finally.cs:205:31:205:46 | [finally: exception(ExceptionA)] object creation of type ExceptionB | Finally.cs:209:31:209:46 | [finally: exception(ExceptionA), finally(1): exception(ExceptionB)] object creation of type ExceptionC | +| Finally.cs:205:31:205:46 | [finally: exception] object creation of type ExceptionB | Finally.cs:205:25:205:47 | [finally: exception] throw ...; | +| Finally.cs:205:31:205:46 | [finally: exception] object creation of type ExceptionB | Finally.cs:205:31:205:46 | [finally: exception] object creation of type ExceptionB | +| Finally.cs:205:31:205:46 | [finally: exception] object creation of type ExceptionB | Finally.cs:208:13:210:13 | [finally: exception, finally(1): exception] {...} | +| Finally.cs:205:31:205:46 | [finally: exception] object creation of type ExceptionB | Finally.cs:209:31:209:46 | [finally: exception, finally(1): exception] object creation of type ExceptionC | | Finally.cs:205:31:205:46 | object creation of type ExceptionB | Finally.cs:205:25:205:47 | throw ...; | | Finally.cs:205:31:205:46 | object creation of type ExceptionB | Finally.cs:205:31:205:46 | object creation of type ExceptionB | -| Finally.cs:205:31:205:46 | object creation of type ExceptionB | Finally.cs:208:13:210:13 | [finally(1): exception(Exception)] {...} | -| Finally.cs:205:31:205:46 | object creation of type ExceptionB | Finally.cs:209:31:209:46 | [finally(1): exception(Exception)] object creation of type ExceptionC | -| Finally.cs:205:31:205:46 | object creation of type ExceptionB | Finally.cs:209:31:209:46 | [finally(1): exception(ExceptionB)] object creation of type ExceptionC | -| Finally.cs:208:13:210:13 | [finally(1): exception(Exception)] {...} | Finally.cs:208:13:210:13 | [finally(1): exception(Exception)] {...} | -| Finally.cs:208:13:210:13 | [finally(1): exception(Exception)] {...} | Finally.cs:209:31:209:46 | [finally(1): exception(Exception)] object creation of type ExceptionC | -| Finally.cs:208:13:210:13 | [finally: exception(Exception), finally(1): exception(Exception)] {...} | Finally.cs:208:13:210:13 | [finally: exception(Exception), finally(1): exception(Exception)] {...} | -| Finally.cs:208:13:210:13 | [finally: exception(Exception), finally(1): exception(Exception)] {...} | Finally.cs:209:31:209:46 | [finally: exception(Exception), finally(1): exception(Exception)] object creation of type ExceptionC | -| Finally.cs:208:13:210:13 | [finally: exception(Exception)] {...} | Finally.cs:208:13:210:13 | [finally: exception(Exception)] {...} | -| Finally.cs:208:13:210:13 | [finally: exception(Exception)] {...} | Finally.cs:209:31:209:46 | [finally: exception(Exception)] object creation of type ExceptionC | -| Finally.cs:208:13:210:13 | [finally: exception(Exception)] {...} | Finally.cs:211:13:211:29 | [finally: exception(Exception)] ...; | -| Finally.cs:208:13:210:13 | [finally: exception(ExceptionA), finally(1): exception(Exception)] {...} | Finally.cs:208:13:210:13 | [finally: exception(ExceptionA), finally(1): exception(Exception)] {...} | -| Finally.cs:208:13:210:13 | [finally: exception(ExceptionA), finally(1): exception(Exception)] {...} | Finally.cs:209:31:209:46 | [finally: exception(ExceptionA), finally(1): exception(Exception)] object creation of type ExceptionC | -| Finally.cs:208:13:210:13 | [finally: exception(ExceptionA)] {...} | Finally.cs:208:13:210:13 | [finally: exception(ExceptionA)] {...} | -| Finally.cs:208:13:210:13 | [finally: exception(ExceptionA)] {...} | Finally.cs:209:31:209:46 | [finally: exception(ExceptionA)] object creation of type ExceptionC | -| Finally.cs:208:13:210:13 | [finally: exception(ExceptionA)] {...} | Finally.cs:211:13:211:29 | [finally: exception(ExceptionA)] ...; | +| Finally.cs:205:31:205:46 | object creation of type ExceptionB | Finally.cs:208:13:210:13 | [finally(1): exception] {...} | +| Finally.cs:205:31:205:46 | object creation of type ExceptionB | Finally.cs:209:31:209:46 | [finally(1): exception] object creation of type ExceptionC | +| Finally.cs:208:13:210:13 | [finally(1): exception] {...} | Finally.cs:208:13:210:13 | [finally(1): exception] {...} | +| Finally.cs:208:13:210:13 | [finally(1): exception] {...} | Finally.cs:209:31:209:46 | [finally(1): exception] object creation of type ExceptionC | +| Finally.cs:208:13:210:13 | [finally: exception, finally(1): exception] {...} | Finally.cs:208:13:210:13 | [finally: exception, finally(1): exception] {...} | +| Finally.cs:208:13:210:13 | [finally: exception, finally(1): exception] {...} | Finally.cs:209:31:209:46 | [finally: exception, finally(1): exception] object creation of type ExceptionC | +| Finally.cs:208:13:210:13 | [finally: exception] {...} | Finally.cs:208:13:210:13 | [finally: exception] {...} | +| Finally.cs:208:13:210:13 | [finally: exception] {...} | Finally.cs:209:31:209:46 | [finally: exception] object creation of type ExceptionC | +| Finally.cs:208:13:210:13 | [finally: exception] {...} | Finally.cs:211:13:211:29 | [finally: exception] ...; | | Finally.cs:208:13:210:13 | {...} | Finally.cs:208:13:210:13 | {...} | | Finally.cs:208:13:210:13 | {...} | Finally.cs:209:31:209:46 | object creation of type ExceptionC | | Finally.cs:208:13:210:13 | {...} | Finally.cs:211:13:211:29 | ...; | -| Finally.cs:209:31:209:46 | [finally(1): exception(Exception)] object creation of type ExceptionC | Finally.cs:209:31:209:46 | [finally(1): exception(Exception)] object creation of type ExceptionC | -| Finally.cs:209:31:209:46 | [finally(1): exception(ExceptionB)] object creation of type ExceptionC | Finally.cs:209:31:209:46 | [finally(1): exception(ExceptionB)] object creation of type ExceptionC | -| Finally.cs:209:31:209:46 | [finally: exception(Exception), finally(1): exception(Exception)] object creation of type ExceptionC | Finally.cs:209:31:209:46 | [finally: exception(Exception), finally(1): exception(Exception)] object creation of type ExceptionC | -| Finally.cs:209:31:209:46 | [finally: exception(Exception), finally(1): exception(ExceptionB)] object creation of type ExceptionC | Finally.cs:209:31:209:46 | [finally: exception(Exception), finally(1): exception(ExceptionB)] object creation of type ExceptionC | -| Finally.cs:209:31:209:46 | [finally: exception(Exception)] object creation of type ExceptionC | Finally.cs:209:31:209:46 | [finally: exception(Exception)] object creation of type ExceptionC | -| Finally.cs:209:31:209:46 | [finally: exception(ExceptionA), finally(1): exception(Exception)] object creation of type ExceptionC | Finally.cs:209:31:209:46 | [finally: exception(ExceptionA), finally(1): exception(Exception)] object creation of type ExceptionC | -| Finally.cs:209:31:209:46 | [finally: exception(ExceptionA), finally(1): exception(ExceptionB)] object creation of type ExceptionC | Finally.cs:209:31:209:46 | [finally: exception(ExceptionA), finally(1): exception(ExceptionB)] object creation of type ExceptionC | -| Finally.cs:209:31:209:46 | [finally: exception(ExceptionA)] object creation of type ExceptionC | Finally.cs:209:31:209:46 | [finally: exception(ExceptionA)] object creation of type ExceptionC | +| Finally.cs:209:31:209:46 | [finally(1): exception] object creation of type ExceptionC | Finally.cs:209:31:209:46 | [finally(1): exception] object creation of type ExceptionC | +| Finally.cs:209:31:209:46 | [finally: exception, finally(1): exception] object creation of type ExceptionC | Finally.cs:209:31:209:46 | [finally: exception, finally(1): exception] object creation of type ExceptionC | +| Finally.cs:209:31:209:46 | [finally: exception] object creation of type ExceptionC | Finally.cs:209:31:209:46 | [finally: exception] object creation of type ExceptionC | | Finally.cs:209:31:209:46 | object creation of type ExceptionC | Finally.cs:209:31:209:46 | object creation of type ExceptionC | | Finally.cs:211:13:211:29 | ...; | Finally.cs:211:13:211:29 | ...; | -| Finally.cs:211:13:211:29 | [finally: exception(Exception)] ...; | Finally.cs:211:13:211:29 | [finally: exception(Exception)] ...; | -| Finally.cs:211:13:211:29 | [finally: exception(ExceptionA)] ...; | Finally.cs:211:13:211:29 | [finally: exception(ExceptionA)] ...; | +| Finally.cs:211:13:211:29 | [finally: exception] ...; | Finally.cs:211:13:211:29 | [finally: exception] ...; | | Finally.cs:216:10:216:12 | enter M11 | Finally.cs:216:10:216:12 | enter M11 | | Finally.cs:216:10:216:12 | enter M11 | Finally.cs:222:9:225:9 | catch {...} | | Finally.cs:216:10:216:12 | enter M11 | Finally.cs:227:9:229:9 | {...} | @@ -11388,83 +10899,61 @@ blockDominance | Finally.cs:227:9:229:9 | {...} | Finally.cs:227:9:229:9 | {...} | | Finally.cs:233:10:233:12 | enter M12 | Finally.cs:233:10:233:12 | enter M12 | | Finally.cs:233:10:233:12 | enter M12 | Finally.cs:233:10:233:12 | exit M12 | -| Finally.cs:233:10:233:12 | enter M12 | Finally.cs:233:10:233:12 | exit M12 (abnormal) | | Finally.cs:233:10:233:12 | enter M12 | Finally.cs:240:21:240:43 | throw ...; | | Finally.cs:233:10:233:12 | enter M12 | Finally.cs:240:27:240:42 | object creation of type ExceptionA | -| Finally.cs:233:10:233:12 | enter M12 | Finally.cs:243:13:253:13 | [finally: exception(Exception)] {...} | +| Finally.cs:233:10:233:12 | enter M12 | Finally.cs:243:13:253:13 | [finally: exception] {...} | | Finally.cs:233:10:233:12 | enter M12 | Finally.cs:243:13:253:13 | {...} | -| Finally.cs:233:10:233:12 | enter M12 | Finally.cs:247:25:247:47 | [finally: exception(Exception)] throw ...; | -| Finally.cs:233:10:233:12 | enter M12 | Finally.cs:247:25:247:47 | [finally: exception(ExceptionA)] throw ...; | +| Finally.cs:233:10:233:12 | enter M12 | Finally.cs:247:25:247:47 | [finally: exception] throw ...; | | Finally.cs:233:10:233:12 | enter M12 | Finally.cs:247:25:247:47 | throw ...; | -| Finally.cs:233:10:233:12 | enter M12 | Finally.cs:247:31:247:46 | [finally: exception(Exception)] object creation of type ExceptionA | -| Finally.cs:233:10:233:12 | enter M12 | Finally.cs:247:31:247:46 | [finally: exception(ExceptionA)] object creation of type ExceptionA | +| Finally.cs:233:10:233:12 | enter M12 | Finally.cs:247:31:247:46 | [finally: exception] object creation of type ExceptionA | | Finally.cs:233:10:233:12 | enter M12 | Finally.cs:247:31:247:46 | object creation of type ExceptionA | -| Finally.cs:233:10:233:12 | enter M12 | Finally.cs:250:17:252:17 | [finally(1): exception(Exception)] {...} | -| Finally.cs:233:10:233:12 | enter M12 | Finally.cs:250:17:252:17 | [finally: exception(Exception), finally(1): exception(Exception)] {...} | -| Finally.cs:233:10:233:12 | enter M12 | Finally.cs:250:17:252:17 | [finally: exception(Exception)] {...} | -| Finally.cs:233:10:233:12 | enter M12 | Finally.cs:250:17:252:17 | [finally: exception(ExceptionA), finally(1): exception(Exception)] {...} | -| Finally.cs:233:10:233:12 | enter M12 | Finally.cs:250:17:252:17 | [finally: exception(ExceptionA)] {...} | +| Finally.cs:233:10:233:12 | enter M12 | Finally.cs:250:17:252:17 | [finally(1): exception] {...} | +| Finally.cs:233:10:233:12 | enter M12 | Finally.cs:250:17:252:17 | [finally: exception, finally(1): exception] {...} | +| Finally.cs:233:10:233:12 | enter M12 | Finally.cs:250:17:252:17 | [finally: exception] {...} | | Finally.cs:233:10:233:12 | enter M12 | Finally.cs:250:17:252:17 | {...} | -| Finally.cs:233:10:233:12 | enter M12 | Finally.cs:257:9:259:9 | [finally: exception(Exception)] {...} | -| Finally.cs:233:10:233:12 | enter M12 | Finally.cs:257:9:259:9 | [finally: exception(ExceptionA)] {...} | +| Finally.cs:233:10:233:12 | enter M12 | Finally.cs:257:9:259:9 | [finally: exception] {...} | | Finally.cs:233:10:233:12 | enter M12 | Finally.cs:257:9:259:9 | {...} | | Finally.cs:233:10:233:12 | exit M12 | Finally.cs:233:10:233:12 | exit M12 | -| Finally.cs:233:10:233:12 | exit M12 (abnormal) | Finally.cs:233:10:233:12 | exit M12 (abnormal) | | Finally.cs:240:21:240:43 | throw ...; | Finally.cs:240:21:240:43 | throw ...; | -| Finally.cs:240:21:240:43 | throw ...; | Finally.cs:247:25:247:47 | [finally: exception(ExceptionA)] throw ...; | -| Finally.cs:240:21:240:43 | throw ...; | Finally.cs:247:31:247:46 | [finally: exception(ExceptionA)] object creation of type ExceptionA | -| Finally.cs:240:21:240:43 | throw ...; | Finally.cs:250:17:252:17 | [finally: exception(ExceptionA), finally(1): exception(Exception)] {...} | -| Finally.cs:240:21:240:43 | throw ...; | Finally.cs:250:17:252:17 | [finally: exception(ExceptionA)] {...} | | Finally.cs:240:27:240:42 | object creation of type ExceptionA | Finally.cs:240:21:240:43 | throw ...; | | Finally.cs:240:27:240:42 | object creation of type ExceptionA | Finally.cs:240:27:240:42 | object creation of type ExceptionA | -| Finally.cs:240:27:240:42 | object creation of type ExceptionA | Finally.cs:243:13:253:13 | [finally: exception(Exception)] {...} | -| Finally.cs:240:27:240:42 | object creation of type ExceptionA | Finally.cs:247:25:247:47 | [finally: exception(Exception)] throw ...; | -| Finally.cs:240:27:240:42 | object creation of type ExceptionA | Finally.cs:247:25:247:47 | [finally: exception(ExceptionA)] throw ...; | -| Finally.cs:240:27:240:42 | object creation of type ExceptionA | Finally.cs:247:31:247:46 | [finally: exception(Exception)] object creation of type ExceptionA | -| Finally.cs:240:27:240:42 | object creation of type ExceptionA | Finally.cs:247:31:247:46 | [finally: exception(ExceptionA)] object creation of type ExceptionA | -| Finally.cs:240:27:240:42 | object creation of type ExceptionA | Finally.cs:250:17:252:17 | [finally: exception(Exception), finally(1): exception(Exception)] {...} | -| Finally.cs:240:27:240:42 | object creation of type ExceptionA | Finally.cs:250:17:252:17 | [finally: exception(Exception)] {...} | -| Finally.cs:240:27:240:42 | object creation of type ExceptionA | Finally.cs:250:17:252:17 | [finally: exception(ExceptionA), finally(1): exception(Exception)] {...} | -| Finally.cs:240:27:240:42 | object creation of type ExceptionA | Finally.cs:250:17:252:17 | [finally: exception(ExceptionA)] {...} | -| Finally.cs:243:13:253:13 | [finally: exception(Exception)] {...} | Finally.cs:243:13:253:13 | [finally: exception(Exception)] {...} | -| Finally.cs:243:13:253:13 | [finally: exception(Exception)] {...} | Finally.cs:247:25:247:47 | [finally: exception(Exception)] throw ...; | -| Finally.cs:243:13:253:13 | [finally: exception(Exception)] {...} | Finally.cs:247:31:247:46 | [finally: exception(Exception)] object creation of type ExceptionA | -| Finally.cs:243:13:253:13 | [finally: exception(Exception)] {...} | Finally.cs:250:17:252:17 | [finally: exception(Exception), finally(1): exception(Exception)] {...} | -| Finally.cs:243:13:253:13 | [finally: exception(Exception)] {...} | Finally.cs:250:17:252:17 | [finally: exception(Exception)] {...} | +| Finally.cs:240:27:240:42 | object creation of type ExceptionA | Finally.cs:243:13:253:13 | [finally: exception] {...} | +| Finally.cs:240:27:240:42 | object creation of type ExceptionA | Finally.cs:247:25:247:47 | [finally: exception] throw ...; | +| Finally.cs:240:27:240:42 | object creation of type ExceptionA | Finally.cs:247:31:247:46 | [finally: exception] object creation of type ExceptionA | +| Finally.cs:240:27:240:42 | object creation of type ExceptionA | Finally.cs:250:17:252:17 | [finally: exception, finally(1): exception] {...} | +| Finally.cs:240:27:240:42 | object creation of type ExceptionA | Finally.cs:250:17:252:17 | [finally: exception] {...} | +| Finally.cs:243:13:253:13 | [finally: exception] {...} | Finally.cs:243:13:253:13 | [finally: exception] {...} | +| Finally.cs:243:13:253:13 | [finally: exception] {...} | Finally.cs:247:25:247:47 | [finally: exception] throw ...; | +| Finally.cs:243:13:253:13 | [finally: exception] {...} | Finally.cs:247:31:247:46 | [finally: exception] object creation of type ExceptionA | +| Finally.cs:243:13:253:13 | [finally: exception] {...} | Finally.cs:250:17:252:17 | [finally: exception, finally(1): exception] {...} | +| Finally.cs:243:13:253:13 | [finally: exception] {...} | Finally.cs:250:17:252:17 | [finally: exception] {...} | | Finally.cs:243:13:253:13 | {...} | Finally.cs:243:13:253:13 | {...} | | Finally.cs:243:13:253:13 | {...} | Finally.cs:247:25:247:47 | throw ...; | | Finally.cs:243:13:253:13 | {...} | Finally.cs:247:31:247:46 | object creation of type ExceptionA | -| Finally.cs:243:13:253:13 | {...} | Finally.cs:250:17:252:17 | [finally(1): exception(Exception)] {...} | +| Finally.cs:243:13:253:13 | {...} | Finally.cs:250:17:252:17 | [finally(1): exception] {...} | | Finally.cs:243:13:253:13 | {...} | Finally.cs:250:17:252:17 | {...} | | Finally.cs:243:13:253:13 | {...} | Finally.cs:257:9:259:9 | {...} | -| Finally.cs:247:25:247:47 | [finally: exception(Exception)] throw ...; | Finally.cs:247:25:247:47 | [finally: exception(Exception)] throw ...; | -| Finally.cs:247:25:247:47 | [finally: exception(ExceptionA)] throw ...; | Finally.cs:247:25:247:47 | [finally: exception(ExceptionA)] throw ...; | +| Finally.cs:247:25:247:47 | [finally: exception] throw ...; | Finally.cs:247:25:247:47 | [finally: exception] throw ...; | | Finally.cs:247:25:247:47 | throw ...; | Finally.cs:247:25:247:47 | throw ...; | -| Finally.cs:247:31:247:46 | [finally: exception(Exception)] object creation of type ExceptionA | Finally.cs:247:25:247:47 | [finally: exception(Exception)] throw ...; | -| Finally.cs:247:31:247:46 | [finally: exception(Exception)] object creation of type ExceptionA | Finally.cs:247:31:247:46 | [finally: exception(Exception)] object creation of type ExceptionA | -| Finally.cs:247:31:247:46 | [finally: exception(Exception)] object creation of type ExceptionA | Finally.cs:250:17:252:17 | [finally: exception(Exception), finally(1): exception(Exception)] {...} | -| Finally.cs:247:31:247:46 | [finally: exception(ExceptionA)] object creation of type ExceptionA | Finally.cs:247:25:247:47 | [finally: exception(ExceptionA)] throw ...; | -| Finally.cs:247:31:247:46 | [finally: exception(ExceptionA)] object creation of type ExceptionA | Finally.cs:247:31:247:46 | [finally: exception(ExceptionA)] object creation of type ExceptionA | -| Finally.cs:247:31:247:46 | [finally: exception(ExceptionA)] object creation of type ExceptionA | Finally.cs:250:17:252:17 | [finally: exception(ExceptionA), finally(1): exception(Exception)] {...} | +| Finally.cs:247:31:247:46 | [finally: exception] object creation of type ExceptionA | Finally.cs:247:25:247:47 | [finally: exception] throw ...; | +| Finally.cs:247:31:247:46 | [finally: exception] object creation of type ExceptionA | Finally.cs:247:31:247:46 | [finally: exception] object creation of type ExceptionA | +| Finally.cs:247:31:247:46 | [finally: exception] object creation of type ExceptionA | Finally.cs:250:17:252:17 | [finally: exception, finally(1): exception] {...} | | Finally.cs:247:31:247:46 | object creation of type ExceptionA | Finally.cs:247:25:247:47 | throw ...; | | Finally.cs:247:31:247:46 | object creation of type ExceptionA | Finally.cs:247:31:247:46 | object creation of type ExceptionA | -| Finally.cs:247:31:247:46 | object creation of type ExceptionA | Finally.cs:250:17:252:17 | [finally(1): exception(Exception)] {...} | -| Finally.cs:250:17:252:17 | [finally(1): exception(Exception)] {...} | Finally.cs:250:17:252:17 | [finally(1): exception(Exception)] {...} | -| Finally.cs:250:17:252:17 | [finally: exception(Exception), finally(1): exception(Exception)] {...} | Finally.cs:250:17:252:17 | [finally: exception(Exception), finally(1): exception(Exception)] {...} | -| Finally.cs:250:17:252:17 | [finally: exception(Exception)] {...} | Finally.cs:250:17:252:17 | [finally: exception(Exception)] {...} | -| Finally.cs:250:17:252:17 | [finally: exception(ExceptionA), finally(1): exception(Exception)] {...} | Finally.cs:250:17:252:17 | [finally: exception(ExceptionA), finally(1): exception(Exception)] {...} | -| Finally.cs:250:17:252:17 | [finally: exception(ExceptionA)] {...} | Finally.cs:250:17:252:17 | [finally: exception(ExceptionA)] {...} | +| Finally.cs:247:31:247:46 | object creation of type ExceptionA | Finally.cs:250:17:252:17 | [finally(1): exception] {...} | +| Finally.cs:250:17:252:17 | [finally(1): exception] {...} | Finally.cs:250:17:252:17 | [finally(1): exception] {...} | +| Finally.cs:250:17:252:17 | [finally: exception, finally(1): exception] {...} | Finally.cs:250:17:252:17 | [finally: exception, finally(1): exception] {...} | +| Finally.cs:250:17:252:17 | [finally: exception] {...} | Finally.cs:250:17:252:17 | [finally: exception] {...} | | Finally.cs:250:17:252:17 | {...} | Finally.cs:250:17:252:17 | {...} | | Finally.cs:250:17:252:17 | {...} | Finally.cs:257:9:259:9 | {...} | -| Finally.cs:257:9:259:9 | [finally: exception(Exception)] {...} | Finally.cs:257:9:259:9 | [finally: exception(Exception)] {...} | -| Finally.cs:257:9:259:9 | [finally: exception(ExceptionA)] {...} | Finally.cs:257:9:259:9 | [finally: exception(ExceptionA)] {...} | +| Finally.cs:257:9:259:9 | [finally: exception] {...} | Finally.cs:257:9:259:9 | [finally: exception] {...} | | Finally.cs:257:9:259:9 | {...} | Finally.cs:257:9:259:9 | {...} | | Finally.cs:263:10:263:12 | enter M13 | Finally.cs:263:10:263:12 | enter M13 | | Finally.cs:263:10:263:12 | enter M13 | Finally.cs:263:10:263:12 | exit M13 | -| Finally.cs:263:10:263:12 | enter M13 | Finally.cs:270:9:273:9 | [finally: exception(Exception)] {...} | +| Finally.cs:263:10:263:12 | enter M13 | Finally.cs:270:9:273:9 | [finally: exception] {...} | | Finally.cs:263:10:263:12 | enter M13 | Finally.cs:270:9:273:9 | {...} | | Finally.cs:263:10:263:12 | exit M13 | Finally.cs:263:10:263:12 | exit M13 | -| Finally.cs:270:9:273:9 | [finally: exception(Exception)] {...} | Finally.cs:270:9:273:9 | [finally: exception(Exception)] {...} | +| Finally.cs:270:9:273:9 | [finally: exception] {...} | Finally.cs:270:9:273:9 | [finally: exception] {...} | | Finally.cs:270:9:273:9 | {...} | Finally.cs:270:9:273:9 | {...} | | Foreach.cs:4:7:4:13 | enter Foreach | Foreach.cs:4:7:4:13 | enter Foreach | | Foreach.cs:6:10:6:11 | enter M1 | Foreach.cs:6:10:6:11 | enter M1 | @@ -14617,12 +14106,11 @@ postBlockDominance | Finally.cs:3:14:3:20 | enter Finally | Finally.cs:3:14:3:20 | enter Finally | | Finally.cs:7:10:7:11 | enter M1 | Finally.cs:7:10:7:11 | enter M1 | | Finally.cs:7:10:7:11 | exit M1 | Finally.cs:7:10:7:11 | exit M1 | -| Finally.cs:14:9:16:9 | [finally: exception(Exception)] {...} | Finally.cs:14:9:16:9 | [finally: exception(Exception)] {...} | +| Finally.cs:14:9:16:9 | [finally: exception] {...} | Finally.cs:14:9:16:9 | [finally: exception] {...} | | Finally.cs:14:9:16:9 | {...} | Finally.cs:7:10:7:11 | enter M1 | | Finally.cs:14:9:16:9 | {...} | Finally.cs:14:9:16:9 | {...} | | Finally.cs:19:10:19:11 | enter M2 | Finally.cs:19:10:19:11 | enter M2 | | Finally.cs:19:10:19:11 | exit M2 | Finally.cs:19:10:19:11 | exit M2 | -| Finally.cs:19:10:19:11 | exit M2 (abnormal) | Finally.cs:19:10:19:11 | exit M2 (abnormal) | | Finally.cs:19:10:19:11 | exit M2 (normal) | Finally.cs:19:10:19:11 | enter M2 | | Finally.cs:19:10:19:11 | exit M2 (normal) | Finally.cs:19:10:19:11 | exit M2 (normal) | | Finally.cs:19:10:19:11 | exit M2 (normal) | Finally.cs:24:13:24:19 | return ...; | @@ -14645,9 +14133,9 @@ postBlockDominance | Finally.cs:42:9:43:9 | {...} | Finally.cs:30:9:40:9 | [exception: Exception] catch (...) {...} | | Finally.cs:42:9:43:9 | {...} | Finally.cs:41:9:43:9 | [exception: Exception] catch (...) {...} | | Finally.cs:42:9:43:9 | {...} | Finally.cs:42:9:43:9 | {...} | +| Finally.cs:49:9:51:9 | [finally: exception] {...} | Finally.cs:49:9:51:9 | [finally: exception] {...} | | Finally.cs:54:10:54:11 | enter M3 | Finally.cs:54:10:54:11 | enter M3 | | Finally.cs:54:10:54:11 | exit M3 | Finally.cs:54:10:54:11 | exit M3 | -| Finally.cs:54:10:54:11 | exit M3 (abnormal) | Finally.cs:54:10:54:11 | exit M3 (abnormal) | | Finally.cs:54:10:54:11 | exit M3 (normal) | Finally.cs:54:10:54:11 | enter M3 | | Finally.cs:54:10:54:11 | exit M3 (normal) | Finally.cs:54:10:54:11 | exit M3 (normal) | | Finally.cs:54:10:54:11 | exit M3 (normal) | Finally.cs:59:13:59:19 | return ...; | @@ -14668,7 +14156,7 @@ postBlockDominance | Finally.cs:66:9:67:9 | {...} | Finally.cs:65:9:67:9 | [exception: Exception] catch (...) {...} | | Finally.cs:66:9:67:9 | {...} | Finally.cs:65:26:65:26 | [exception: Exception] Exception e | | Finally.cs:66:9:67:9 | {...} | Finally.cs:66:9:67:9 | {...} | -| Finally.cs:69:9:71:9 | [finally: exception(Exception)] {...} | Finally.cs:69:9:71:9 | [finally: exception(Exception)] {...} | +| Finally.cs:69:9:71:9 | [finally: exception] {...} | Finally.cs:69:9:71:9 | [finally: exception] {...} | | Finally.cs:74:10:74:11 | enter M4 | Finally.cs:74:10:74:11 | enter M4 | | Finally.cs:74:10:74:11 | exit M4 | Finally.cs:74:10:74:11 | exit M4 | | Finally.cs:74:10:74:11 | exit M4 (abnormal) | Finally.cs:74:10:74:11 | exit M4 (abnormal) | @@ -14707,14 +14195,14 @@ postBlockDominance | Finally.cs:93:31:93:45 | [finally: continue] object creation of type Exception | Finally.cs:93:31:93:45 | [finally: continue] object creation of type Exception | | Finally.cs:93:31:93:45 | [finally: return] object creation of type Exception | Finally.cs:93:31:93:45 | [finally: return] object creation of type Exception | | Finally.cs:93:31:93:45 | object creation of type Exception | Finally.cs:93:31:93:45 | object creation of type Exception | -| Finally.cs:96:17:98:17 | [finally(1): exception(Exception)] {...} | Finally.cs:96:17:98:17 | [finally(1): exception(Exception)] {...} | -| Finally.cs:96:17:98:17 | [finally: break, finally(1): exception(Exception)] {...} | Finally.cs:96:17:98:17 | [finally: break, finally(1): exception(Exception)] {...} | +| Finally.cs:96:17:98:17 | [finally(1): exception] {...} | Finally.cs:96:17:98:17 | [finally(1): exception] {...} | +| Finally.cs:96:17:98:17 | [finally: break, finally(1): exception] {...} | Finally.cs:96:17:98:17 | [finally: break, finally(1): exception] {...} | | Finally.cs:96:17:98:17 | [finally: break] {...} | Finally.cs:86:21:86:26 | break; | | Finally.cs:96:17:98:17 | [finally: break] {...} | Finally.cs:96:17:98:17 | [finally: break] {...} | -| Finally.cs:96:17:98:17 | [finally: continue, finally(1): exception(Exception)] {...} | Finally.cs:96:17:98:17 | [finally: continue, finally(1): exception(Exception)] {...} | +| Finally.cs:96:17:98:17 | [finally: continue, finally(1): exception] {...} | Finally.cs:96:17:98:17 | [finally: continue, finally(1): exception] {...} | | Finally.cs:96:17:98:17 | [finally: continue] {...} | Finally.cs:84:21:84:29 | continue; | | Finally.cs:96:17:98:17 | [finally: continue] {...} | Finally.cs:96:17:98:17 | [finally: continue] {...} | -| Finally.cs:96:17:98:17 | [finally: return, finally(1): exception(Exception)] {...} | Finally.cs:96:17:98:17 | [finally: return, finally(1): exception(Exception)] {...} | +| Finally.cs:96:17:98:17 | [finally: return, finally(1): exception] {...} | Finally.cs:96:17:98:17 | [finally: return, finally(1): exception] {...} | | Finally.cs:96:17:98:17 | [finally: return] {...} | Finally.cs:82:21:82:27 | return ...; | | Finally.cs:96:17:98:17 | [finally: return] {...} | Finally.cs:96:17:98:17 | [finally: return] {...} | | Finally.cs:96:17:98:17 | {...} | Finally.cs:89:13:99:13 | {...} | @@ -14755,32 +14243,23 @@ postBlockDominance | Finally.cs:109:33:109:33 | 1 | Finally.cs:109:33:109:33 | 1 | | Finally.cs:110:17:110:49 | throw ...; | Finally.cs:110:17:110:49 | throw ...; | | Finally.cs:110:23:110:48 | object creation of type OutOfMemoryException | Finally.cs:110:23:110:48 | object creation of type OutOfMemoryException | -| Finally.cs:113:9:118:9 | [finally: exception(Exception)] {...} | Finally.cs:113:9:118:9 | [finally: exception(Exception)] {...} | -| Finally.cs:113:9:118:9 | [finally: exception(NullReferenceException)] {...} | Finally.cs:113:9:118:9 | [finally: exception(NullReferenceException)] {...} | +| Finally.cs:113:9:118:9 | [finally: exception] {...} | Finally.cs:113:9:118:9 | [finally: exception] {...} | | Finally.cs:113:9:118:9 | {...} | Finally.cs:109:13:110:49 | if (...) ... | | Finally.cs:113:9:118:9 | {...} | Finally.cs:109:17:109:28 | access to property Length | | Finally.cs:113:9:118:9 | {...} | Finally.cs:109:33:109:33 | 1 | | Finally.cs:113:9:118:9 | {...} | Finally.cs:113:9:118:9 | {...} | -| Finally.cs:114:17:114:36 | [false, finally: exception(Exception)] !... | Finally.cs:114:17:114:36 | [false, finally: exception(Exception)] !... | -| Finally.cs:114:17:114:36 | [false, finally: exception(NullReferenceException)] !... | Finally.cs:114:17:114:36 | [false, finally: exception(NullReferenceException)] !... | -| Finally.cs:114:17:114:36 | [false, finally: exception(OutOfMemoryException)] !... | Finally.cs:114:17:114:36 | [false, finally: exception(OutOfMemoryException)] !... | +| Finally.cs:114:17:114:36 | [false, finally: exception] !... | Finally.cs:114:17:114:36 | [false, finally: exception] !... | | Finally.cs:114:17:114:36 | [false, finally: return] !... | Finally.cs:114:17:114:36 | [false, finally: return] !... | | Finally.cs:114:17:114:36 | [false] !... | Finally.cs:114:17:114:36 | [false] !... | -| Finally.cs:114:17:114:36 | [true, finally: exception(Exception)] !... | Finally.cs:114:17:114:36 | [true, finally: exception(Exception)] !... | -| Finally.cs:114:17:114:36 | [true, finally: exception(NullReferenceException)] !... | Finally.cs:114:17:114:36 | [true, finally: exception(NullReferenceException)] !... | -| Finally.cs:114:17:114:36 | [true, finally: exception(OutOfMemoryException)] !... | Finally.cs:114:17:114:36 | [true, finally: exception(OutOfMemoryException)] !... | +| Finally.cs:114:17:114:36 | [true, finally: exception] !... | Finally.cs:114:17:114:36 | [true, finally: exception] !... | | Finally.cs:114:17:114:36 | [true, finally: return] !... | Finally.cs:114:17:114:36 | [true, finally: return] !... | | Finally.cs:114:17:114:36 | [true] !... | Finally.cs:114:17:114:36 | [true] !... | | Finally.cs:115:17:115:41 | ...; | Finally.cs:114:17:114:36 | [true] !... | | Finally.cs:115:17:115:41 | ...; | Finally.cs:115:17:115:41 | ...; | -| Finally.cs:115:17:115:41 | [finally: exception(Exception)] ...; | Finally.cs:115:17:115:41 | [finally: exception(Exception)] ...; | -| Finally.cs:115:17:115:41 | [finally: exception(NullReferenceException)] ...; | Finally.cs:115:17:115:41 | [finally: exception(NullReferenceException)] ...; | -| Finally.cs:115:17:115:41 | [finally: exception(OutOfMemoryException)] ...; | Finally.cs:115:17:115:41 | [finally: exception(OutOfMemoryException)] ...; | +| Finally.cs:115:17:115:41 | [finally: exception] ...; | Finally.cs:115:17:115:41 | [finally: exception] ...; | | Finally.cs:115:17:115:41 | [finally: return] ...; | Finally.cs:114:17:114:36 | [true, finally: return] !... | | Finally.cs:115:17:115:41 | [finally: return] ...; | Finally.cs:115:17:115:41 | [finally: return] ...; | -| Finally.cs:116:13:117:37 | [finally: exception(Exception)] if (...) ... | Finally.cs:116:13:117:37 | [finally: exception(Exception)] if (...) ... | -| Finally.cs:116:13:117:37 | [finally: exception(NullReferenceException)] if (...) ... | Finally.cs:116:13:117:37 | [finally: exception(NullReferenceException)] if (...) ... | -| Finally.cs:116:13:117:37 | [finally: exception(OutOfMemoryException)] if (...) ... | Finally.cs:116:13:117:37 | [finally: exception(OutOfMemoryException)] if (...) ... | +| Finally.cs:116:13:117:37 | [finally: exception] if (...) ... | Finally.cs:116:13:117:37 | [finally: exception] if (...) ... | | Finally.cs:116:13:117:37 | [finally: return] if (...) ... | Finally.cs:108:17:108:23 | return ...; | | Finally.cs:116:13:117:37 | [finally: return] if (...) ... | Finally.cs:114:17:114:36 | [false, finally: return] !... | | Finally.cs:116:13:117:37 | [finally: return] if (...) ... | Finally.cs:114:17:114:36 | [true, finally: return] !... | @@ -14795,14 +14274,12 @@ postBlockDominance | Finally.cs:116:13:117:37 | if (...) ... | Finally.cs:115:17:115:41 | ...; | | Finally.cs:116:13:117:37 | if (...) ... | Finally.cs:116:13:117:37 | if (...) ... | | Finally.cs:117:17:117:37 | ...; | Finally.cs:117:17:117:37 | ...; | -| Finally.cs:117:17:117:37 | [finally: exception(Exception)] ...; | Finally.cs:117:17:117:37 | [finally: exception(Exception)] ...; | -| Finally.cs:117:17:117:37 | [finally: exception(NullReferenceException)] ...; | Finally.cs:117:17:117:37 | [finally: exception(NullReferenceException)] ...; | -| Finally.cs:117:17:117:37 | [finally: exception(OutOfMemoryException)] ...; | Finally.cs:117:17:117:37 | [finally: exception(OutOfMemoryException)] ...; | +| Finally.cs:117:17:117:37 | [finally: exception] ...; | Finally.cs:117:17:117:37 | [finally: exception] ...; | | Finally.cs:117:17:117:37 | [finally: return] ...; | Finally.cs:117:17:117:37 | [finally: return] ...; | | Finally.cs:121:10:121:11 | enter M6 | Finally.cs:121:10:121:11 | enter M6 | | Finally.cs:133:10:133:11 | enter M7 | Finally.cs:133:10:133:11 | enter M7 | | Finally.cs:133:10:133:11 | exit M7 (abnormal) | Finally.cs:133:10:133:11 | exit M7 (abnormal) | -| Finally.cs:140:9:143:9 | [finally: exception(Exception)] {...} | Finally.cs:140:9:143:9 | [finally: exception(Exception)] {...} | +| Finally.cs:140:9:143:9 | [finally: exception] {...} | Finally.cs:140:9:143:9 | [finally: exception] {...} | | Finally.cs:140:9:143:9 | {...} | Finally.cs:140:9:143:9 | {...} | | Finally.cs:147:10:147:11 | enter M8 | Finally.cs:147:10:147:11 | enter M8 | | Finally.cs:147:10:147:11 | exit M8 | Finally.cs:147:10:147:11 | exit M8 | @@ -14821,41 +14298,32 @@ postBlockDominance | Finally.cs:147:10:147:11 | exit M8 (normal) | Finally.cs:165:13:168:13 | catch {...} | | Finally.cs:152:17:152:50 | throw ...; | Finally.cs:152:17:152:50 | throw ...; | | Finally.cs:152:23:152:49 | object creation of type ArgumentNullException | Finally.cs:152:23:152:49 | object creation of type ArgumentNullException | -| Finally.cs:155:9:169:9 | [finally: exception(Exception)] {...} | Finally.cs:155:9:169:9 | [finally: exception(Exception)] {...} | +| Finally.cs:155:9:169:9 | [finally: exception] {...} | Finally.cs:155:9:169:9 | [finally: exception] {...} | | Finally.cs:155:9:169:9 | {...} | Finally.cs:147:10:147:11 | enter M8 | | Finally.cs:155:9:169:9 | {...} | Finally.cs:155:9:169:9 | {...} | | Finally.cs:158:36:158:36 | 1 | Finally.cs:158:36:158:36 | 1 | -| Finally.cs:158:36:158:36 | [finally: exception(ArgumentNullException)] 1 | Finally.cs:158:36:158:36 | [finally: exception(ArgumentNullException)] 1 | -| Finally.cs:158:36:158:36 | [finally: exception(Exception)] 1 | Finally.cs:158:36:158:36 | [finally: exception(Exception)] 1 | -| Finally.cs:159:21:159:45 | [finally: exception(ArgumentNullException)] throw ...; | Finally.cs:159:21:159:45 | [finally: exception(ArgumentNullException)] throw ...; | -| Finally.cs:159:21:159:45 | [finally: exception(Exception)] throw ...; | Finally.cs:159:21:159:45 | [finally: exception(Exception)] throw ...; | +| Finally.cs:158:36:158:36 | [finally: exception] 1 | Finally.cs:158:36:158:36 | [finally: exception] 1 | +| Finally.cs:159:21:159:45 | [finally: exception] throw ...; | Finally.cs:159:21:159:45 | [finally: exception] throw ...; | | Finally.cs:159:21:159:45 | throw ...; | Finally.cs:159:21:159:45 | throw ...; | | Finally.cs:159:41:159:43 | "1" | Finally.cs:159:41:159:43 | "1" | -| Finally.cs:159:41:159:43 | [finally: exception(ArgumentNullException)] "1" | Finally.cs:159:41:159:43 | [finally: exception(ArgumentNullException)] "1" | -| Finally.cs:159:41:159:43 | [finally: exception(Exception)] "1" | Finally.cs:159:41:159:43 | [finally: exception(Exception)] "1" | +| Finally.cs:159:41:159:43 | [finally: exception] "1" | Finally.cs:159:41:159:43 | [finally: exception] "1" | | Finally.cs:161:13:164:13 | [exception: Exception] catch (...) {...} | Finally.cs:159:21:159:45 | throw ...; | | Finally.cs:161:13:164:13 | [exception: Exception] catch (...) {...} | Finally.cs:159:41:159:43 | "1" | | Finally.cs:161:13:164:13 | [exception: Exception] catch (...) {...} | Finally.cs:161:13:164:13 | [exception: Exception] catch (...) {...} | | Finally.cs:161:13:164:13 | [exception: NullReferenceException] catch (...) {...} | Finally.cs:161:13:164:13 | [exception: NullReferenceException] catch (...) {...} | -| Finally.cs:161:13:164:13 | [finally: exception(ArgumentNullException), exception: Exception] catch (...) {...} | Finally.cs:161:13:164:13 | [finally: exception(ArgumentNullException), exception: Exception] catch (...) {...} | -| Finally.cs:161:13:164:13 | [finally: exception(ArgumentNullException), exception: NullReferenceException] catch (...) {...} | Finally.cs:161:13:164:13 | [finally: exception(ArgumentNullException), exception: NullReferenceException] catch (...) {...} | -| Finally.cs:161:13:164:13 | [finally: exception(Exception), exception: Exception] catch (...) {...} | Finally.cs:161:13:164:13 | [finally: exception(Exception), exception: Exception] catch (...) {...} | -| Finally.cs:161:13:164:13 | [finally: exception(Exception), exception: NullReferenceException] catch (...) {...} | Finally.cs:161:13:164:13 | [finally: exception(Exception), exception: NullReferenceException] catch (...) {...} | +| Finally.cs:161:13:164:13 | [finally: exception, exception: Exception] catch (...) {...} | Finally.cs:161:13:164:13 | [finally: exception, exception: Exception] catch (...) {...} | +| Finally.cs:161:13:164:13 | [finally: exception, exception: NullReferenceException] catch (...) {...} | Finally.cs:161:13:164:13 | [finally: exception, exception: NullReferenceException] catch (...) {...} | | Finally.cs:161:30:161:30 | [exception: Exception] Exception e | Finally.cs:159:21:159:45 | throw ...; | | Finally.cs:161:30:161:30 | [exception: Exception] Exception e | Finally.cs:159:41:159:43 | "1" | | Finally.cs:161:30:161:30 | [exception: Exception] Exception e | Finally.cs:161:13:164:13 | [exception: Exception] catch (...) {...} | | Finally.cs:161:30:161:30 | [exception: Exception] Exception e | Finally.cs:161:30:161:30 | [exception: Exception] Exception e | | Finally.cs:161:30:161:30 | [exception: NullReferenceException] Exception e | Finally.cs:161:13:164:13 | [exception: NullReferenceException] catch (...) {...} | | Finally.cs:161:30:161:30 | [exception: NullReferenceException] Exception e | Finally.cs:161:30:161:30 | [exception: NullReferenceException] Exception e | -| Finally.cs:161:30:161:30 | [finally: exception(ArgumentNullException), exception: Exception] Exception e | Finally.cs:161:30:161:30 | [finally: exception(ArgumentNullException), exception: Exception] Exception e | -| Finally.cs:161:30:161:30 | [finally: exception(ArgumentNullException), exception: NullReferenceException] Exception e | Finally.cs:161:30:161:30 | [finally: exception(ArgumentNullException), exception: NullReferenceException] Exception e | -| Finally.cs:161:30:161:30 | [finally: exception(Exception), exception: Exception] Exception e | Finally.cs:161:30:161:30 | [finally: exception(Exception), exception: Exception] Exception e | -| Finally.cs:161:30:161:30 | [finally: exception(Exception), exception: NullReferenceException] Exception e | Finally.cs:161:30:161:30 | [finally: exception(Exception), exception: NullReferenceException] Exception e | -| Finally.cs:162:13:164:13 | [finally: exception(ArgumentNullException)] {...} | Finally.cs:162:13:164:13 | [finally: exception(ArgumentNullException)] {...} | -| Finally.cs:162:13:164:13 | [finally: exception(Exception)] {...} | Finally.cs:162:13:164:13 | [finally: exception(Exception)] {...} | +| Finally.cs:161:30:161:30 | [finally: exception, exception: Exception] Exception e | Finally.cs:161:30:161:30 | [finally: exception, exception: Exception] Exception e | +| Finally.cs:161:30:161:30 | [finally: exception, exception: NullReferenceException] Exception e | Finally.cs:161:30:161:30 | [finally: exception, exception: NullReferenceException] Exception e | +| Finally.cs:162:13:164:13 | [finally: exception] {...} | Finally.cs:162:13:164:13 | [finally: exception] {...} | | Finally.cs:162:13:164:13 | {...} | Finally.cs:162:13:164:13 | {...} | -| Finally.cs:165:13:168:13 | [finally: exception(ArgumentNullException)] catch {...} | Finally.cs:165:13:168:13 | [finally: exception(ArgumentNullException)] catch {...} | -| Finally.cs:165:13:168:13 | [finally: exception(Exception)] catch {...} | Finally.cs:165:13:168:13 | [finally: exception(Exception)] catch {...} | +| Finally.cs:165:13:168:13 | [finally: exception] catch {...} | Finally.cs:165:13:168:13 | [finally: exception] catch {...} | | Finally.cs:165:13:168:13 | catch {...} | Finally.cs:165:13:168:13 | catch {...} | | Finally.cs:172:11:172:20 | enter ExceptionA | Finally.cs:172:11:172:20 | enter ExceptionA | | Finally.cs:173:11:173:20 | enter ExceptionB | Finally.cs:173:11:173:20 | enter ExceptionB | @@ -14876,71 +14344,54 @@ postBlockDominance | Finally.cs:180:27:180:42 | [b1 (line 176): true] object creation of type ExceptionA | Finally.cs:180:27:180:42 | [b1 (line 176): true] object creation of type ExceptionA | | Finally.cs:183:9:192:9 | [b1 (line 176): false] {...} | Finally.cs:176:10:176:11 | enter M9 | | Finally.cs:183:9:192:9 | [b1 (line 176): false] {...} | Finally.cs:183:9:192:9 | [b1 (line 176): false] {...} | -| Finally.cs:183:9:192:9 | [finally: exception(Exception), b1 (line 176): true] {...} | Finally.cs:183:9:192:9 | [finally: exception(Exception), b1 (line 176): true] {...} | +| Finally.cs:183:9:192:9 | [finally: exception, b1 (line 176): true] {...} | Finally.cs:183:9:192:9 | [finally: exception, b1 (line 176): true] {...} | | Finally.cs:186:25:186:47 | [b1 (line 176): false, b2 (line 176): true] throw ...; | Finally.cs:186:25:186:47 | [b1 (line 176): false, b2 (line 176): true] throw ...; | -| Finally.cs:186:25:186:47 | [finally: exception(Exception), b1 (line 176): true, b2 (line 176): true] throw ...; | Finally.cs:186:25:186:47 | [finally: exception(Exception), b1 (line 176): true, b2 (line 176): true] throw ...; | -| Finally.cs:186:25:186:47 | [finally: exception(ExceptionA), b1 (line 176): true, b2 (line 176): true] throw ...; | Finally.cs:186:25:186:47 | [finally: exception(ExceptionA), b1 (line 176): true, b2 (line 176): true] throw ...; | +| Finally.cs:186:25:186:47 | [finally: exception, b1 (line 176): true, b2 (line 176): true] throw ...; | Finally.cs:186:25:186:47 | [finally: exception, b1 (line 176): true, b2 (line 176): true] throw ...; | | Finally.cs:186:31:186:46 | [b1 (line 176): false, b2 (line 176): true] object creation of type ExceptionB | Finally.cs:186:31:186:46 | [b1 (line 176): false, b2 (line 176): true] object creation of type ExceptionB | -| Finally.cs:186:31:186:46 | [finally: exception(Exception), b1 (line 176): true, b2 (line 176): true] object creation of type ExceptionB | Finally.cs:186:31:186:46 | [finally: exception(Exception), b1 (line 176): true, b2 (line 176): true] object creation of type ExceptionB | -| Finally.cs:186:31:186:46 | [finally: exception(ExceptionA), b1 (line 176): true, b2 (line 176): true] object creation of type ExceptionB | Finally.cs:186:31:186:46 | [finally: exception(ExceptionA), b1 (line 176): true, b2 (line 176): true] object creation of type ExceptionB | +| Finally.cs:186:31:186:46 | [finally: exception, b1 (line 176): true, b2 (line 176): true] object creation of type ExceptionB | Finally.cs:186:31:186:46 | [finally: exception, b1 (line 176): true, b2 (line 176): true] object creation of type ExceptionB | | Finally.cs:188:13:191:13 | [exception: Exception, b1 (line 176): false, b2 (line 176): true] catch (...) {...} | Finally.cs:188:13:191:13 | [exception: Exception, b1 (line 176): false, b2 (line 176): true] catch (...) {...} | -| Finally.cs:188:13:191:13 | [finally: exception(Exception), exception: Exception, b1 (line 176): true, b2 (line 176): true] catch (...) {...} | Finally.cs:188:13:191:13 | [finally: exception(Exception), exception: Exception, b1 (line 176): true, b2 (line 176): true] catch (...) {...} | -| Finally.cs:188:13:191:13 | [finally: exception(ExceptionA), exception: Exception, b1 (line 176): true, b2 (line 176): true] catch (...) {...} | Finally.cs:188:13:191:13 | [finally: exception(ExceptionA), exception: Exception, b1 (line 176): true, b2 (line 176): true] catch (...) {...} | +| Finally.cs:188:13:191:13 | [finally: exception, exception: Exception, b1 (line 176): true, b2 (line 176): true] catch (...) {...} | Finally.cs:188:13:191:13 | [finally: exception, exception: Exception, b1 (line 176): true, b2 (line 176): true] catch (...) {...} | | Finally.cs:188:38:188:39 | [exception: Exception, b1 (line 176): false, b2 (line 176): true] access to parameter b2 | Finally.cs:188:13:191:13 | [exception: Exception, b1 (line 176): false, b2 (line 176): true] catch (...) {...} | | Finally.cs:188:38:188:39 | [exception: Exception, b1 (line 176): false, b2 (line 176): true] access to parameter b2 | Finally.cs:188:38:188:39 | [exception: Exception, b1 (line 176): false, b2 (line 176): true] access to parameter b2 | | Finally.cs:188:38:188:39 | [exception: ExceptionB, b1 (line 176): false, b2 (line 176): true] access to parameter b2 | Finally.cs:186:25:186:47 | [b1 (line 176): false, b2 (line 176): true] throw ...; | | Finally.cs:188:38:188:39 | [exception: ExceptionB, b1 (line 176): false, b2 (line 176): true] access to parameter b2 | Finally.cs:188:38:188:39 | [exception: ExceptionB, b1 (line 176): false, b2 (line 176): true] access to parameter b2 | -| Finally.cs:188:38:188:39 | [finally: exception(Exception), exception: Exception, b1 (line 176): true, b2 (line 176): true] access to parameter b2 | Finally.cs:188:38:188:39 | [finally: exception(Exception), exception: Exception, b1 (line 176): true, b2 (line 176): true] access to parameter b2 | -| Finally.cs:188:38:188:39 | [finally: exception(Exception), exception: ExceptionB, b1 (line 176): true, b2 (line 176): true] access to parameter b2 | Finally.cs:188:38:188:39 | [finally: exception(Exception), exception: ExceptionB, b1 (line 176): true, b2 (line 176): true] access to parameter b2 | -| Finally.cs:188:38:188:39 | [finally: exception(ExceptionA), exception: Exception, b1 (line 176): true, b2 (line 176): true] access to parameter b2 | Finally.cs:188:38:188:39 | [finally: exception(ExceptionA), exception: Exception, b1 (line 176): true, b2 (line 176): true] access to parameter b2 | -| Finally.cs:188:38:188:39 | [finally: exception(ExceptionA), exception: ExceptionB, b1 (line 176): true, b2 (line 176): true] access to parameter b2 | Finally.cs:188:38:188:39 | [finally: exception(ExceptionA), exception: ExceptionB, b1 (line 176): true, b2 (line 176): true] access to parameter b2 | +| Finally.cs:188:38:188:39 | [finally: exception, exception: Exception, b1 (line 176): true, b2 (line 176): true] access to parameter b2 | Finally.cs:188:38:188:39 | [finally: exception, exception: Exception, b1 (line 176): true, b2 (line 176): true] access to parameter b2 | +| Finally.cs:188:38:188:39 | [finally: exception, exception: ExceptionB, b1 (line 176): true, b2 (line 176): true] access to parameter b2 | Finally.cs:188:38:188:39 | [finally: exception, exception: ExceptionB, b1 (line 176): true, b2 (line 176): true] access to parameter b2 | | Finally.cs:189:13:191:13 | [b1 (line 176): false] {...} | Finally.cs:186:25:186:47 | [b1 (line 176): false, b2 (line 176): true] throw ...; | | Finally.cs:189:13:191:13 | [b1 (line 176): false] {...} | Finally.cs:186:31:186:46 | [b1 (line 176): false, b2 (line 176): true] object creation of type ExceptionB | | Finally.cs:189:13:191:13 | [b1 (line 176): false] {...} | Finally.cs:188:13:191:13 | [exception: Exception, b1 (line 176): false, b2 (line 176): true] catch (...) {...} | | Finally.cs:189:13:191:13 | [b1 (line 176): false] {...} | Finally.cs:188:38:188:39 | [exception: Exception, b1 (line 176): false, b2 (line 176): true] access to parameter b2 | | Finally.cs:189:13:191:13 | [b1 (line 176): false] {...} | Finally.cs:188:38:188:39 | [exception: ExceptionB, b1 (line 176): false, b2 (line 176): true] access to parameter b2 | | Finally.cs:189:13:191:13 | [b1 (line 176): false] {...} | Finally.cs:189:13:191:13 | [b1 (line 176): false] {...} | -| Finally.cs:189:13:191:13 | [finally: exception(Exception), b1 (line 176): true] {...} | Finally.cs:189:13:191:13 | [finally: exception(Exception), b1 (line 176): true] {...} | -| Finally.cs:189:13:191:13 | [finally: exception(ExceptionA), b1 (line 176): true] {...} | Finally.cs:189:13:191:13 | [finally: exception(ExceptionA), b1 (line 176): true] {...} | -| Finally.cs:190:31:190:46 | [finally: exception(Exception)] object creation of type ExceptionC | Finally.cs:190:31:190:46 | [finally: exception(Exception)] object creation of type ExceptionC | -| Finally.cs:190:31:190:46 | [finally: exception(ExceptionA)] object creation of type ExceptionC | Finally.cs:190:31:190:46 | [finally: exception(ExceptionA)] object creation of type ExceptionC | +| Finally.cs:189:13:191:13 | [finally: exception, b1 (line 176): true] {...} | Finally.cs:189:13:191:13 | [finally: exception, b1 (line 176): true] {...} | +| Finally.cs:190:31:190:46 | [finally: exception] object creation of type ExceptionC | Finally.cs:190:31:190:46 | [finally: exception] object creation of type ExceptionC | | Finally.cs:195:10:195:12 | enter M10 | Finally.cs:195:10:195:12 | enter M10 | | Finally.cs:195:10:195:12 | exit M10 | Finally.cs:195:10:195:12 | exit M10 | | Finally.cs:195:10:195:12 | exit M10 (abnormal) | Finally.cs:195:10:195:12 | exit M10 (abnormal) | | Finally.cs:199:21:199:43 | throw ...; | Finally.cs:199:21:199:43 | throw ...; | | Finally.cs:199:27:199:42 | object creation of type ExceptionA | Finally.cs:199:27:199:42 | object creation of type ExceptionA | -| Finally.cs:202:9:212:9 | [finally: exception(Exception)] {...} | Finally.cs:202:9:212:9 | [finally: exception(Exception)] {...} | +| Finally.cs:202:9:212:9 | [finally: exception] {...} | Finally.cs:202:9:212:9 | [finally: exception] {...} | | Finally.cs:202:9:212:9 | {...} | Finally.cs:195:10:195:12 | enter M10 | | Finally.cs:202:9:212:9 | {...} | Finally.cs:202:9:212:9 | {...} | -| Finally.cs:205:25:205:47 | [finally: exception(Exception)] throw ...; | Finally.cs:205:25:205:47 | [finally: exception(Exception)] throw ...; | -| Finally.cs:205:25:205:47 | [finally: exception(ExceptionA)] throw ...; | Finally.cs:205:25:205:47 | [finally: exception(ExceptionA)] throw ...; | +| Finally.cs:205:25:205:47 | [finally: exception] throw ...; | Finally.cs:205:25:205:47 | [finally: exception] throw ...; | | Finally.cs:205:25:205:47 | throw ...; | Finally.cs:205:25:205:47 | throw ...; | -| Finally.cs:205:31:205:46 | [finally: exception(Exception)] object creation of type ExceptionB | Finally.cs:205:31:205:46 | [finally: exception(Exception)] object creation of type ExceptionB | -| Finally.cs:205:31:205:46 | [finally: exception(ExceptionA)] object creation of type ExceptionB | Finally.cs:205:31:205:46 | [finally: exception(ExceptionA)] object creation of type ExceptionB | +| Finally.cs:205:31:205:46 | [finally: exception] object creation of type ExceptionB | Finally.cs:205:31:205:46 | [finally: exception] object creation of type ExceptionB | | Finally.cs:205:31:205:46 | object creation of type ExceptionB | Finally.cs:205:31:205:46 | object creation of type ExceptionB | -| Finally.cs:208:13:210:13 | [finally(1): exception(Exception)] {...} | Finally.cs:208:13:210:13 | [finally(1): exception(Exception)] {...} | -| Finally.cs:208:13:210:13 | [finally: exception(Exception), finally(1): exception(Exception)] {...} | Finally.cs:208:13:210:13 | [finally: exception(Exception), finally(1): exception(Exception)] {...} | -| Finally.cs:208:13:210:13 | [finally: exception(Exception)] {...} | Finally.cs:208:13:210:13 | [finally: exception(Exception)] {...} | -| Finally.cs:208:13:210:13 | [finally: exception(ExceptionA), finally(1): exception(Exception)] {...} | Finally.cs:208:13:210:13 | [finally: exception(ExceptionA), finally(1): exception(Exception)] {...} | -| Finally.cs:208:13:210:13 | [finally: exception(ExceptionA)] {...} | Finally.cs:208:13:210:13 | [finally: exception(ExceptionA)] {...} | +| Finally.cs:208:13:210:13 | [finally(1): exception] {...} | Finally.cs:208:13:210:13 | [finally(1): exception] {...} | +| Finally.cs:208:13:210:13 | [finally: exception, finally(1): exception] {...} | Finally.cs:208:13:210:13 | [finally: exception, finally(1): exception] {...} | +| Finally.cs:208:13:210:13 | [finally: exception] {...} | Finally.cs:208:13:210:13 | [finally: exception] {...} | | Finally.cs:208:13:210:13 | {...} | Finally.cs:195:10:195:12 | enter M10 | | Finally.cs:208:13:210:13 | {...} | Finally.cs:202:9:212:9 | {...} | | Finally.cs:208:13:210:13 | {...} | Finally.cs:208:13:210:13 | {...} | -| Finally.cs:209:31:209:46 | [finally(1): exception(Exception)] object creation of type ExceptionC | Finally.cs:209:31:209:46 | [finally(1): exception(Exception)] object creation of type ExceptionC | -| Finally.cs:209:31:209:46 | [finally(1): exception(ExceptionB)] object creation of type ExceptionC | Finally.cs:209:31:209:46 | [finally(1): exception(ExceptionB)] object creation of type ExceptionC | -| Finally.cs:209:31:209:46 | [finally: exception(Exception), finally(1): exception(Exception)] object creation of type ExceptionC | Finally.cs:209:31:209:46 | [finally: exception(Exception), finally(1): exception(Exception)] object creation of type ExceptionC | -| Finally.cs:209:31:209:46 | [finally: exception(Exception), finally(1): exception(ExceptionB)] object creation of type ExceptionC | Finally.cs:209:31:209:46 | [finally: exception(Exception), finally(1): exception(ExceptionB)] object creation of type ExceptionC | -| Finally.cs:209:31:209:46 | [finally: exception(Exception)] object creation of type ExceptionC | Finally.cs:209:31:209:46 | [finally: exception(Exception)] object creation of type ExceptionC | -| Finally.cs:209:31:209:46 | [finally: exception(ExceptionA), finally(1): exception(Exception)] object creation of type ExceptionC | Finally.cs:209:31:209:46 | [finally: exception(ExceptionA), finally(1): exception(Exception)] object creation of type ExceptionC | -| Finally.cs:209:31:209:46 | [finally: exception(ExceptionA), finally(1): exception(ExceptionB)] object creation of type ExceptionC | Finally.cs:209:31:209:46 | [finally: exception(ExceptionA), finally(1): exception(ExceptionB)] object creation of type ExceptionC | -| Finally.cs:209:31:209:46 | [finally: exception(ExceptionA)] object creation of type ExceptionC | Finally.cs:209:31:209:46 | [finally: exception(ExceptionA)] object creation of type ExceptionC | +| Finally.cs:209:31:209:46 | [finally(1): exception] object creation of type ExceptionC | Finally.cs:209:31:209:46 | [finally(1): exception] object creation of type ExceptionC | +| Finally.cs:209:31:209:46 | [finally: exception, finally(1): exception] object creation of type ExceptionC | Finally.cs:209:31:209:46 | [finally: exception, finally(1): exception] object creation of type ExceptionC | +| Finally.cs:209:31:209:46 | [finally: exception] object creation of type ExceptionC | Finally.cs:209:31:209:46 | [finally: exception] object creation of type ExceptionC | | Finally.cs:209:31:209:46 | object creation of type ExceptionC | Finally.cs:209:31:209:46 | object creation of type ExceptionC | | Finally.cs:211:13:211:29 | ...; | Finally.cs:195:10:195:12 | enter M10 | | Finally.cs:211:13:211:29 | ...; | Finally.cs:202:9:212:9 | {...} | | Finally.cs:211:13:211:29 | ...; | Finally.cs:208:13:210:13 | {...} | | Finally.cs:211:13:211:29 | ...; | Finally.cs:211:13:211:29 | ...; | -| Finally.cs:211:13:211:29 | [finally: exception(Exception)] ...; | Finally.cs:211:13:211:29 | [finally: exception(Exception)] ...; | -| Finally.cs:211:13:211:29 | [finally: exception(ExceptionA)] ...; | Finally.cs:211:13:211:29 | [finally: exception(ExceptionA)] ...; | +| Finally.cs:211:13:211:29 | [finally: exception] ...; | Finally.cs:211:13:211:29 | [finally: exception] ...; | | Finally.cs:216:10:216:12 | enter M11 | Finally.cs:216:10:216:12 | enter M11 | | Finally.cs:222:9:225:9 | catch {...} | Finally.cs:222:9:225:9 | catch {...} | | Finally.cs:227:9:229:9 | {...} | Finally.cs:216:10:216:12 | enter M11 | @@ -14948,35 +14399,29 @@ postBlockDominance | Finally.cs:227:9:229:9 | {...} | Finally.cs:227:9:229:9 | {...} | | Finally.cs:233:10:233:12 | enter M12 | Finally.cs:233:10:233:12 | enter M12 | | Finally.cs:233:10:233:12 | exit M12 | Finally.cs:233:10:233:12 | exit M12 | -| Finally.cs:233:10:233:12 | exit M12 (abnormal) | Finally.cs:233:10:233:12 | exit M12 (abnormal) | | Finally.cs:240:21:240:43 | throw ...; | Finally.cs:240:21:240:43 | throw ...; | | Finally.cs:240:27:240:42 | object creation of type ExceptionA | Finally.cs:240:27:240:42 | object creation of type ExceptionA | -| Finally.cs:243:13:253:13 | [finally: exception(Exception)] {...} | Finally.cs:243:13:253:13 | [finally: exception(Exception)] {...} | +| Finally.cs:243:13:253:13 | [finally: exception] {...} | Finally.cs:243:13:253:13 | [finally: exception] {...} | | Finally.cs:243:13:253:13 | {...} | Finally.cs:233:10:233:12 | enter M12 | | Finally.cs:243:13:253:13 | {...} | Finally.cs:243:13:253:13 | {...} | -| Finally.cs:247:25:247:47 | [finally: exception(Exception)] throw ...; | Finally.cs:247:25:247:47 | [finally: exception(Exception)] throw ...; | -| Finally.cs:247:25:247:47 | [finally: exception(ExceptionA)] throw ...; | Finally.cs:247:25:247:47 | [finally: exception(ExceptionA)] throw ...; | +| Finally.cs:247:25:247:47 | [finally: exception] throw ...; | Finally.cs:247:25:247:47 | [finally: exception] throw ...; | | Finally.cs:247:25:247:47 | throw ...; | Finally.cs:247:25:247:47 | throw ...; | -| Finally.cs:247:31:247:46 | [finally: exception(Exception)] object creation of type ExceptionA | Finally.cs:247:31:247:46 | [finally: exception(Exception)] object creation of type ExceptionA | -| Finally.cs:247:31:247:46 | [finally: exception(ExceptionA)] object creation of type ExceptionA | Finally.cs:247:31:247:46 | [finally: exception(ExceptionA)] object creation of type ExceptionA | +| Finally.cs:247:31:247:46 | [finally: exception] object creation of type ExceptionA | Finally.cs:247:31:247:46 | [finally: exception] object creation of type ExceptionA | | Finally.cs:247:31:247:46 | object creation of type ExceptionA | Finally.cs:247:31:247:46 | object creation of type ExceptionA | -| Finally.cs:250:17:252:17 | [finally(1): exception(Exception)] {...} | Finally.cs:250:17:252:17 | [finally(1): exception(Exception)] {...} | -| Finally.cs:250:17:252:17 | [finally: exception(Exception), finally(1): exception(Exception)] {...} | Finally.cs:250:17:252:17 | [finally: exception(Exception), finally(1): exception(Exception)] {...} | -| Finally.cs:250:17:252:17 | [finally: exception(Exception)] {...} | Finally.cs:250:17:252:17 | [finally: exception(Exception)] {...} | -| Finally.cs:250:17:252:17 | [finally: exception(ExceptionA), finally(1): exception(Exception)] {...} | Finally.cs:250:17:252:17 | [finally: exception(ExceptionA), finally(1): exception(Exception)] {...} | -| Finally.cs:250:17:252:17 | [finally: exception(ExceptionA)] {...} | Finally.cs:250:17:252:17 | [finally: exception(ExceptionA)] {...} | +| Finally.cs:250:17:252:17 | [finally(1): exception] {...} | Finally.cs:250:17:252:17 | [finally(1): exception] {...} | +| Finally.cs:250:17:252:17 | [finally: exception, finally(1): exception] {...} | Finally.cs:250:17:252:17 | [finally: exception, finally(1): exception] {...} | +| Finally.cs:250:17:252:17 | [finally: exception] {...} | Finally.cs:250:17:252:17 | [finally: exception] {...} | | Finally.cs:250:17:252:17 | {...} | Finally.cs:233:10:233:12 | enter M12 | | Finally.cs:250:17:252:17 | {...} | Finally.cs:243:13:253:13 | {...} | | Finally.cs:250:17:252:17 | {...} | Finally.cs:250:17:252:17 | {...} | -| Finally.cs:257:9:259:9 | [finally: exception(Exception)] {...} | Finally.cs:257:9:259:9 | [finally: exception(Exception)] {...} | -| Finally.cs:257:9:259:9 | [finally: exception(ExceptionA)] {...} | Finally.cs:257:9:259:9 | [finally: exception(ExceptionA)] {...} | +| Finally.cs:257:9:259:9 | [finally: exception] {...} | Finally.cs:257:9:259:9 | [finally: exception] {...} | | Finally.cs:257:9:259:9 | {...} | Finally.cs:233:10:233:12 | enter M12 | | Finally.cs:257:9:259:9 | {...} | Finally.cs:243:13:253:13 | {...} | | Finally.cs:257:9:259:9 | {...} | Finally.cs:250:17:252:17 | {...} | | Finally.cs:257:9:259:9 | {...} | Finally.cs:257:9:259:9 | {...} | | Finally.cs:263:10:263:12 | enter M13 | Finally.cs:263:10:263:12 | enter M13 | | Finally.cs:263:10:263:12 | exit M13 | Finally.cs:263:10:263:12 | exit M13 | -| Finally.cs:270:9:273:9 | [finally: exception(Exception)] {...} | Finally.cs:270:9:273:9 | [finally: exception(Exception)] {...} | +| Finally.cs:270:9:273:9 | [finally: exception] {...} | Finally.cs:270:9:273:9 | [finally: exception] {...} | | Finally.cs:270:9:273:9 | {...} | Finally.cs:263:10:263:12 | enter M13 | | Finally.cs:270:9:273:9 | {...} | Finally.cs:270:9:273:9 | {...} | | Foreach.cs:4:7:4:13 | enter Foreach | Foreach.cs:4:7:4:13 | enter Foreach | diff --git a/csharp/ql/test/library-tests/controlflow/graph/EnclosingCallable.expected b/csharp/ql/test/library-tests/controlflow/graph/EnclosingCallable.expected index fd87b8db0584..2c2e977ae126 100644 --- a/csharp/ql/test/library-tests/controlflow/graph/EnclosingCallable.expected +++ b/csharp/ql/test/library-tests/controlflow/graph/EnclosingCallable.expected @@ -1146,10 +1146,10 @@ nodeEnclosing | CompileTimeOperators.cs:30:9:38:9 | try {...} ... | CompileTimeOperators.cs:28:10:28:10 | M | | CompileTimeOperators.cs:31:9:34:9 | {...} | CompileTimeOperators.cs:28:10:28:10 | M | | CompileTimeOperators.cs:32:13:32:21 | goto ...; | CompileTimeOperators.cs:28:10:28:10 | M | -| CompileTimeOperators.cs:36:9:38:9 | [finally: goto(End)] {...} | CompileTimeOperators.cs:28:10:28:10 | M | -| CompileTimeOperators.cs:37:13:37:40 | [finally: goto(End)] call to method WriteLine | CompileTimeOperators.cs:28:10:28:10 | M | -| CompileTimeOperators.cs:37:13:37:41 | [finally: goto(End)] ...; | CompileTimeOperators.cs:28:10:28:10 | M | -| CompileTimeOperators.cs:37:31:37:39 | [finally: goto(End)] "Finally" | CompileTimeOperators.cs:28:10:28:10 | M | +| CompileTimeOperators.cs:36:9:38:9 | [finally: goto] {...} | CompileTimeOperators.cs:28:10:28:10 | M | +| CompileTimeOperators.cs:37:13:37:40 | [finally: goto] call to method WriteLine | CompileTimeOperators.cs:28:10:28:10 | M | +| CompileTimeOperators.cs:37:13:37:41 | [finally: goto] ...; | CompileTimeOperators.cs:28:10:28:10 | M | +| CompileTimeOperators.cs:37:31:37:39 | [finally: goto] "Finally" | CompileTimeOperators.cs:28:10:28:10 | M | | CompileTimeOperators.cs:40:9:40:11 | End: | CompileTimeOperators.cs:28:10:28:10 | M | | CompileTimeOperators.cs:40:14:40:37 | call to method WriteLine | CompileTimeOperators.cs:28:10:28:10 | M | | CompileTimeOperators.cs:40:14:40:38 | ...; | CompileTimeOperators.cs:28:10:28:10 | M | @@ -1899,14 +1899,14 @@ nodeEnclosing | Finally.cs:11:13:11:37 | call to method WriteLine | Finally.cs:7:10:7:11 | M1 | | Finally.cs:11:13:11:38 | ...; | Finally.cs:7:10:7:11 | M1 | | Finally.cs:11:31:11:36 | "Try1" | Finally.cs:7:10:7:11 | M1 | -| Finally.cs:14:9:16:9 | [finally: exception(Exception)] {...} | Finally.cs:7:10:7:11 | M1 | +| Finally.cs:14:9:16:9 | [finally: exception] {...} | Finally.cs:7:10:7:11 | M1 | | Finally.cs:14:9:16:9 | {...} | Finally.cs:7:10:7:11 | M1 | -| Finally.cs:15:13:15:40 | [finally: exception(Exception)] call to method WriteLine | Finally.cs:7:10:7:11 | M1 | +| Finally.cs:15:13:15:40 | [finally: exception] call to method WriteLine | Finally.cs:7:10:7:11 | M1 | | Finally.cs:15:13:15:40 | call to method WriteLine | Finally.cs:7:10:7:11 | M1 | | Finally.cs:15:13:15:41 | ...; | Finally.cs:7:10:7:11 | M1 | -| Finally.cs:15:13:15:41 | [finally: exception(Exception)] ...; | Finally.cs:7:10:7:11 | M1 | +| Finally.cs:15:13:15:41 | [finally: exception] ...; | Finally.cs:7:10:7:11 | M1 | | Finally.cs:15:31:15:39 | "Finally" | Finally.cs:7:10:7:11 | M1 | -| Finally.cs:15:31:15:39 | [finally: exception(Exception)] "Finally" | Finally.cs:7:10:7:11 | M1 | +| Finally.cs:15:31:15:39 | [finally: exception] "Finally" | Finally.cs:7:10:7:11 | M1 | | Finally.cs:19:10:19:11 | enter M2 | Finally.cs:19:10:19:11 | M2 | | Finally.cs:19:10:19:11 | exit M2 | Finally.cs:19:10:19:11 | M2 | | Finally.cs:19:10:19:11 | exit M2 (abnormal) | Finally.cs:19:10:19:11 | M2 | @@ -1931,27 +1931,23 @@ nodeEnclosing | Finally.cs:34:17:34:32 | if (...) ... | Finally.cs:19:10:19:11 | M2 | | Finally.cs:34:21:34:24 | true | Finally.cs:19:10:19:11 | M2 | | Finally.cs:34:27:34:32 | throw ...; | Finally.cs:19:10:19:11 | M2 | -| Finally.cs:37:13:39:13 | [finally: exception(ArgumentException)] {...} | Finally.cs:19:10:19:11 | M2 | -| Finally.cs:38:17:38:44 | [finally: exception(ArgumentException)] throw ...; | Finally.cs:19:10:19:11 | M2 | -| Finally.cs:38:23:38:43 | [finally: exception(ArgumentException)] object creation of type Exception | Finally.cs:19:10:19:11 | M2 | -| Finally.cs:38:37:38:42 | [finally: exception(ArgumentException)] "Boo!" | Finally.cs:19:10:19:11 | M2 | +| Finally.cs:37:13:39:13 | [finally: exception] {...} | Finally.cs:19:10:19:11 | M2 | +| Finally.cs:38:17:38:44 | [finally: exception] throw ...; | Finally.cs:19:10:19:11 | M2 | +| Finally.cs:38:23:38:43 | [finally: exception] object creation of type Exception | Finally.cs:19:10:19:11 | M2 | +| Finally.cs:38:37:38:42 | [finally: exception] "Boo!" | Finally.cs:19:10:19:11 | M2 | | Finally.cs:41:9:43:9 | [exception: Exception] catch (...) {...} | Finally.cs:19:10:19:11 | M2 | | Finally.cs:42:9:43:9 | {...} | Finally.cs:19:10:19:11 | M2 | -| Finally.cs:49:9:51:9 | [finally: exception(Exception)] {...} | Finally.cs:19:10:19:11 | M2 | -| Finally.cs:49:9:51:9 | [finally: exception(IOException)] {...} | Finally.cs:19:10:19:11 | M2 | +| Finally.cs:49:9:51:9 | [finally: exception] {...} | Finally.cs:19:10:19:11 | M2 | | Finally.cs:49:9:51:9 | [finally: return] {...} | Finally.cs:19:10:19:11 | M2 | | Finally.cs:49:9:51:9 | {...} | Finally.cs:19:10:19:11 | M2 | -| Finally.cs:50:13:50:40 | [finally: exception(Exception)] call to method WriteLine | Finally.cs:19:10:19:11 | M2 | -| Finally.cs:50:13:50:40 | [finally: exception(IOException)] call to method WriteLine | Finally.cs:19:10:19:11 | M2 | +| Finally.cs:50:13:50:40 | [finally: exception] call to method WriteLine | Finally.cs:19:10:19:11 | M2 | | Finally.cs:50:13:50:40 | [finally: return] call to method WriteLine | Finally.cs:19:10:19:11 | M2 | | Finally.cs:50:13:50:40 | call to method WriteLine | Finally.cs:19:10:19:11 | M2 | | Finally.cs:50:13:50:41 | ...; | Finally.cs:19:10:19:11 | M2 | -| Finally.cs:50:13:50:41 | [finally: exception(Exception)] ...; | Finally.cs:19:10:19:11 | M2 | -| Finally.cs:50:13:50:41 | [finally: exception(IOException)] ...; | Finally.cs:19:10:19:11 | M2 | +| Finally.cs:50:13:50:41 | [finally: exception] ...; | Finally.cs:19:10:19:11 | M2 | | Finally.cs:50:13:50:41 | [finally: return] ...; | Finally.cs:19:10:19:11 | M2 | | Finally.cs:50:31:50:39 | "Finally" | Finally.cs:19:10:19:11 | M2 | -| Finally.cs:50:31:50:39 | [finally: exception(Exception)] "Finally" | Finally.cs:19:10:19:11 | M2 | -| Finally.cs:50:31:50:39 | [finally: exception(IOException)] "Finally" | Finally.cs:19:10:19:11 | M2 | +| Finally.cs:50:31:50:39 | [finally: exception] "Finally" | Finally.cs:19:10:19:11 | M2 | | Finally.cs:50:31:50:39 | [finally: return] "Finally" | Finally.cs:19:10:19:11 | M2 | | Finally.cs:54:10:54:11 | enter M3 | Finally.cs:54:10:54:11 | M3 | | Finally.cs:54:10:54:11 | exit M3 | Finally.cs:54:10:54:11 | M3 | @@ -1976,21 +1972,17 @@ nodeEnclosing | Finally.cs:65:35:65:51 | [exception: Exception] ... != ... | Finally.cs:54:10:54:11 | M3 | | Finally.cs:65:48:65:51 | [exception: Exception] null | Finally.cs:54:10:54:11 | M3 | | Finally.cs:66:9:67:9 | {...} | Finally.cs:54:10:54:11 | M3 | -| Finally.cs:69:9:71:9 | [finally: exception(Exception)] {...} | Finally.cs:54:10:54:11 | M3 | -| Finally.cs:69:9:71:9 | [finally: exception(IOException)] {...} | Finally.cs:54:10:54:11 | M3 | +| Finally.cs:69:9:71:9 | [finally: exception] {...} | Finally.cs:54:10:54:11 | M3 | | Finally.cs:69:9:71:9 | [finally: return] {...} | Finally.cs:54:10:54:11 | M3 | | Finally.cs:69:9:71:9 | {...} | Finally.cs:54:10:54:11 | M3 | -| Finally.cs:70:13:70:40 | [finally: exception(Exception)] call to method WriteLine | Finally.cs:54:10:54:11 | M3 | -| Finally.cs:70:13:70:40 | [finally: exception(IOException)] call to method WriteLine | Finally.cs:54:10:54:11 | M3 | +| Finally.cs:70:13:70:40 | [finally: exception] call to method WriteLine | Finally.cs:54:10:54:11 | M3 | | Finally.cs:70:13:70:40 | [finally: return] call to method WriteLine | Finally.cs:54:10:54:11 | M3 | | Finally.cs:70:13:70:40 | call to method WriteLine | Finally.cs:54:10:54:11 | M3 | | Finally.cs:70:13:70:41 | ...; | Finally.cs:54:10:54:11 | M3 | -| Finally.cs:70:13:70:41 | [finally: exception(Exception)] ...; | Finally.cs:54:10:54:11 | M3 | -| Finally.cs:70:13:70:41 | [finally: exception(IOException)] ...; | Finally.cs:54:10:54:11 | M3 | +| Finally.cs:70:13:70:41 | [finally: exception] ...; | Finally.cs:54:10:54:11 | M3 | | Finally.cs:70:13:70:41 | [finally: return] ...; | Finally.cs:54:10:54:11 | M3 | | Finally.cs:70:31:70:39 | "Finally" | Finally.cs:54:10:54:11 | M3 | -| Finally.cs:70:31:70:39 | [finally: exception(Exception)] "Finally" | Finally.cs:54:10:54:11 | M3 | -| Finally.cs:70:31:70:39 | [finally: exception(IOException)] "Finally" | Finally.cs:54:10:54:11 | M3 | +| Finally.cs:70:31:70:39 | [finally: exception] "Finally" | Finally.cs:54:10:54:11 | M3 | | Finally.cs:70:31:70:39 | [finally: return] "Finally" | Finally.cs:54:10:54:11 | M3 | | Finally.cs:74:10:74:11 | enter M4 | Finally.cs:74:10:74:11 | M4 | | Finally.cs:74:10:74:11 | exit M4 | Finally.cs:74:10:74:11 | M4 | @@ -2058,37 +2050,37 @@ nodeEnclosing | Finally.cs:93:31:93:45 | [finally: continue] object creation of type Exception | Finally.cs:74:10:74:11 | M4 | | Finally.cs:93:31:93:45 | [finally: return] object creation of type Exception | Finally.cs:74:10:74:11 | M4 | | Finally.cs:93:31:93:45 | object creation of type Exception | Finally.cs:74:10:74:11 | M4 | -| Finally.cs:96:17:98:17 | [finally(1): exception(Exception)] {...} | Finally.cs:74:10:74:11 | M4 | -| Finally.cs:96:17:98:17 | [finally: break, finally(1): exception(Exception)] {...} | Finally.cs:74:10:74:11 | M4 | +| Finally.cs:96:17:98:17 | [finally(1): exception] {...} | Finally.cs:74:10:74:11 | M4 | +| Finally.cs:96:17:98:17 | [finally: break, finally(1): exception] {...} | Finally.cs:74:10:74:11 | M4 | | Finally.cs:96:17:98:17 | [finally: break] {...} | Finally.cs:74:10:74:11 | M4 | -| Finally.cs:96:17:98:17 | [finally: continue, finally(1): exception(Exception)] {...} | Finally.cs:74:10:74:11 | M4 | +| Finally.cs:96:17:98:17 | [finally: continue, finally(1): exception] {...} | Finally.cs:74:10:74:11 | M4 | | Finally.cs:96:17:98:17 | [finally: continue] {...} | Finally.cs:74:10:74:11 | M4 | -| Finally.cs:96:17:98:17 | [finally: return, finally(1): exception(Exception)] {...} | Finally.cs:74:10:74:11 | M4 | +| Finally.cs:96:17:98:17 | [finally: return, finally(1): exception] {...} | Finally.cs:74:10:74:11 | M4 | | Finally.cs:96:17:98:17 | [finally: return] {...} | Finally.cs:74:10:74:11 | M4 | | Finally.cs:96:17:98:17 | {...} | Finally.cs:74:10:74:11 | M4 | -| Finally.cs:97:21:97:21 | [finally(1): exception(Exception)] access to local variable i | Finally.cs:74:10:74:11 | M4 | -| Finally.cs:97:21:97:21 | [finally: break, finally(1): exception(Exception)] access to local variable i | Finally.cs:74:10:74:11 | M4 | +| Finally.cs:97:21:97:21 | [finally(1): exception] access to local variable i | Finally.cs:74:10:74:11 | M4 | +| Finally.cs:97:21:97:21 | [finally: break, finally(1): exception] access to local variable i | Finally.cs:74:10:74:11 | M4 | | Finally.cs:97:21:97:21 | [finally: break] access to local variable i | Finally.cs:74:10:74:11 | M4 | -| Finally.cs:97:21:97:21 | [finally: continue, finally(1): exception(Exception)] access to local variable i | Finally.cs:74:10:74:11 | M4 | +| Finally.cs:97:21:97:21 | [finally: continue, finally(1): exception] access to local variable i | Finally.cs:74:10:74:11 | M4 | | Finally.cs:97:21:97:21 | [finally: continue] access to local variable i | Finally.cs:74:10:74:11 | M4 | -| Finally.cs:97:21:97:21 | [finally: return, finally(1): exception(Exception)] access to local variable i | Finally.cs:74:10:74:11 | M4 | +| Finally.cs:97:21:97:21 | [finally: return, finally(1): exception] access to local variable i | Finally.cs:74:10:74:11 | M4 | | Finally.cs:97:21:97:21 | [finally: return] access to local variable i | Finally.cs:74:10:74:11 | M4 | | Finally.cs:97:21:97:21 | access to local variable i | Finally.cs:74:10:74:11 | M4 | | Finally.cs:97:21:97:23 | ...-- | Finally.cs:74:10:74:11 | M4 | -| Finally.cs:97:21:97:23 | [finally(1): exception(Exception)] ...-- | Finally.cs:74:10:74:11 | M4 | -| Finally.cs:97:21:97:23 | [finally: break, finally(1): exception(Exception)] ...-- | Finally.cs:74:10:74:11 | M4 | +| Finally.cs:97:21:97:23 | [finally(1): exception] ...-- | Finally.cs:74:10:74:11 | M4 | +| Finally.cs:97:21:97:23 | [finally: break, finally(1): exception] ...-- | Finally.cs:74:10:74:11 | M4 | | Finally.cs:97:21:97:23 | [finally: break] ...-- | Finally.cs:74:10:74:11 | M4 | -| Finally.cs:97:21:97:23 | [finally: continue, finally(1): exception(Exception)] ...-- | Finally.cs:74:10:74:11 | M4 | +| Finally.cs:97:21:97:23 | [finally: continue, finally(1): exception] ...-- | Finally.cs:74:10:74:11 | M4 | | Finally.cs:97:21:97:23 | [finally: continue] ...-- | Finally.cs:74:10:74:11 | M4 | -| Finally.cs:97:21:97:23 | [finally: return, finally(1): exception(Exception)] ...-- | Finally.cs:74:10:74:11 | M4 | +| Finally.cs:97:21:97:23 | [finally: return, finally(1): exception] ...-- | Finally.cs:74:10:74:11 | M4 | | Finally.cs:97:21:97:23 | [finally: return] ...-- | Finally.cs:74:10:74:11 | M4 | | Finally.cs:97:21:97:24 | ...; | Finally.cs:74:10:74:11 | M4 | -| Finally.cs:97:21:97:24 | [finally(1): exception(Exception)] ...; | Finally.cs:74:10:74:11 | M4 | -| Finally.cs:97:21:97:24 | [finally: break, finally(1): exception(Exception)] ...; | Finally.cs:74:10:74:11 | M4 | +| Finally.cs:97:21:97:24 | [finally(1): exception] ...; | Finally.cs:74:10:74:11 | M4 | +| Finally.cs:97:21:97:24 | [finally: break, finally(1): exception] ...; | Finally.cs:74:10:74:11 | M4 | | Finally.cs:97:21:97:24 | [finally: break] ...; | Finally.cs:74:10:74:11 | M4 | -| Finally.cs:97:21:97:24 | [finally: continue, finally(1): exception(Exception)] ...; | Finally.cs:74:10:74:11 | M4 | +| Finally.cs:97:21:97:24 | [finally: continue, finally(1): exception] ...; | Finally.cs:74:10:74:11 | M4 | | Finally.cs:97:21:97:24 | [finally: continue] ...; | Finally.cs:74:10:74:11 | M4 | -| Finally.cs:97:21:97:24 | [finally: return, finally(1): exception(Exception)] ...; | Finally.cs:74:10:74:11 | M4 | +| Finally.cs:97:21:97:24 | [finally: return, finally(1): exception] ...; | Finally.cs:74:10:74:11 | M4 | | Finally.cs:97:21:97:24 | [finally: return] ...; | Finally.cs:74:10:74:11 | M4 | | Finally.cs:103:10:103:11 | enter M5 | Finally.cs:103:10:103:11 | M5 | | Finally.cs:103:10:103:11 | exit M5 | Finally.cs:103:10:103:11 | M5 | @@ -2112,115 +2104,71 @@ nodeEnclosing | Finally.cs:109:33:109:33 | 1 | Finally.cs:103:10:103:11 | M5 | | Finally.cs:110:17:110:49 | throw ...; | Finally.cs:103:10:103:11 | M5 | | Finally.cs:110:23:110:48 | object creation of type OutOfMemoryException | Finally.cs:103:10:103:11 | M5 | -| Finally.cs:113:9:118:9 | [finally: exception(Exception)] {...} | Finally.cs:103:10:103:11 | M5 | -| Finally.cs:113:9:118:9 | [finally: exception(NullReferenceException)] {...} | Finally.cs:103:10:103:11 | M5 | -| Finally.cs:113:9:118:9 | [finally: exception(OutOfMemoryException)] {...} | Finally.cs:103:10:103:11 | M5 | +| Finally.cs:113:9:118:9 | [finally: exception] {...} | Finally.cs:103:10:103:11 | M5 | | Finally.cs:113:9:118:9 | [finally: return] {...} | Finally.cs:103:10:103:11 | M5 | | Finally.cs:113:9:118:9 | {...} | Finally.cs:103:10:103:11 | M5 | -| Finally.cs:114:13:115:41 | [finally: exception(Exception)] if (...) ... | Finally.cs:103:10:103:11 | M5 | -| Finally.cs:114:13:115:41 | [finally: exception(NullReferenceException)] if (...) ... | Finally.cs:103:10:103:11 | M5 | -| Finally.cs:114:13:115:41 | [finally: exception(OutOfMemoryException)] if (...) ... | Finally.cs:103:10:103:11 | M5 | +| Finally.cs:114:13:115:41 | [finally: exception] if (...) ... | Finally.cs:103:10:103:11 | M5 | | Finally.cs:114:13:115:41 | [finally: return] if (...) ... | Finally.cs:103:10:103:11 | M5 | | Finally.cs:114:13:115:41 | if (...) ... | Finally.cs:103:10:103:11 | M5 | -| Finally.cs:114:17:114:36 | [false, finally: exception(Exception)] !... | Finally.cs:103:10:103:11 | M5 | -| Finally.cs:114:17:114:36 | [false, finally: exception(NullReferenceException)] !... | Finally.cs:103:10:103:11 | M5 | -| Finally.cs:114:17:114:36 | [false, finally: exception(OutOfMemoryException)] !... | Finally.cs:103:10:103:11 | M5 | +| Finally.cs:114:17:114:36 | [false, finally: exception] !... | Finally.cs:103:10:103:11 | M5 | | Finally.cs:114:17:114:36 | [false, finally: return] !... | Finally.cs:103:10:103:11 | M5 | | Finally.cs:114:17:114:36 | [false] !... | Finally.cs:103:10:103:11 | M5 | -| Finally.cs:114:17:114:36 | [true, finally: exception(Exception)] !... | Finally.cs:103:10:103:11 | M5 | -| Finally.cs:114:17:114:36 | [true, finally: exception(NullReferenceException)] !... | Finally.cs:103:10:103:11 | M5 | -| Finally.cs:114:17:114:36 | [true, finally: exception(OutOfMemoryException)] !... | Finally.cs:103:10:103:11 | M5 | +| Finally.cs:114:17:114:36 | [true, finally: exception] !... | Finally.cs:103:10:103:11 | M5 | | Finally.cs:114:17:114:36 | [true, finally: return] !... | Finally.cs:103:10:103:11 | M5 | | Finally.cs:114:17:114:36 | [true] !... | Finally.cs:103:10:103:11 | M5 | -| Finally.cs:114:19:114:23 | [finally: exception(Exception)] access to field Field | Finally.cs:103:10:103:11 | M5 | -| Finally.cs:114:19:114:23 | [finally: exception(Exception)] this access | Finally.cs:103:10:103:11 | M5 | -| Finally.cs:114:19:114:23 | [finally: exception(NullReferenceException)] access to field Field | Finally.cs:103:10:103:11 | M5 | -| Finally.cs:114:19:114:23 | [finally: exception(NullReferenceException)] this access | Finally.cs:103:10:103:11 | M5 | -| Finally.cs:114:19:114:23 | [finally: exception(OutOfMemoryException)] access to field Field | Finally.cs:103:10:103:11 | M5 | -| Finally.cs:114:19:114:23 | [finally: exception(OutOfMemoryException)] this access | Finally.cs:103:10:103:11 | M5 | +| Finally.cs:114:19:114:23 | [finally: exception] access to field Field | Finally.cs:103:10:103:11 | M5 | +| Finally.cs:114:19:114:23 | [finally: exception] this access | Finally.cs:103:10:103:11 | M5 | | Finally.cs:114:19:114:23 | [finally: return] access to field Field | Finally.cs:103:10:103:11 | M5 | | Finally.cs:114:19:114:23 | [finally: return] this access | Finally.cs:103:10:103:11 | M5 | | Finally.cs:114:19:114:23 | access to field Field | Finally.cs:103:10:103:11 | M5 | | Finally.cs:114:19:114:23 | this access | Finally.cs:103:10:103:11 | M5 | -| Finally.cs:114:19:114:30 | [finally: exception(Exception)] access to property Length | Finally.cs:103:10:103:11 | M5 | -| Finally.cs:114:19:114:30 | [finally: exception(NullReferenceException)] access to property Length | Finally.cs:103:10:103:11 | M5 | -| Finally.cs:114:19:114:30 | [finally: exception(OutOfMemoryException)] access to property Length | Finally.cs:103:10:103:11 | M5 | +| Finally.cs:114:19:114:30 | [finally: exception] access to property Length | Finally.cs:103:10:103:11 | M5 | | Finally.cs:114:19:114:30 | [finally: return] access to property Length | Finally.cs:103:10:103:11 | M5 | | Finally.cs:114:19:114:30 | access to property Length | Finally.cs:103:10:103:11 | M5 | | Finally.cs:114:19:114:35 | ... == ... | Finally.cs:103:10:103:11 | M5 | -| Finally.cs:114:19:114:35 | [finally: exception(Exception)] ... == ... | Finally.cs:103:10:103:11 | M5 | -| Finally.cs:114:19:114:35 | [finally: exception(NullReferenceException)] ... == ... | Finally.cs:103:10:103:11 | M5 | -| Finally.cs:114:19:114:35 | [finally: exception(OutOfMemoryException)] ... == ... | Finally.cs:103:10:103:11 | M5 | +| Finally.cs:114:19:114:35 | [finally: exception] ... == ... | Finally.cs:103:10:103:11 | M5 | | Finally.cs:114:19:114:35 | [finally: return] ... == ... | Finally.cs:103:10:103:11 | M5 | | Finally.cs:114:35:114:35 | 0 | Finally.cs:103:10:103:11 | M5 | -| Finally.cs:114:35:114:35 | [finally: exception(Exception)] 0 | Finally.cs:103:10:103:11 | M5 | -| Finally.cs:114:35:114:35 | [finally: exception(NullReferenceException)] 0 | Finally.cs:103:10:103:11 | M5 | -| Finally.cs:114:35:114:35 | [finally: exception(OutOfMemoryException)] 0 | Finally.cs:103:10:103:11 | M5 | +| Finally.cs:114:35:114:35 | [finally: exception] 0 | Finally.cs:103:10:103:11 | M5 | | Finally.cs:114:35:114:35 | [finally: return] 0 | Finally.cs:103:10:103:11 | M5 | -| Finally.cs:115:17:115:40 | [finally: exception(Exception)] call to method WriteLine | Finally.cs:103:10:103:11 | M5 | -| Finally.cs:115:17:115:40 | [finally: exception(NullReferenceException)] call to method WriteLine | Finally.cs:103:10:103:11 | M5 | -| Finally.cs:115:17:115:40 | [finally: exception(OutOfMemoryException)] call to method WriteLine | Finally.cs:103:10:103:11 | M5 | +| Finally.cs:115:17:115:40 | [finally: exception] call to method WriteLine | Finally.cs:103:10:103:11 | M5 | | Finally.cs:115:17:115:40 | [finally: return] call to method WriteLine | Finally.cs:103:10:103:11 | M5 | | Finally.cs:115:17:115:40 | call to method WriteLine | Finally.cs:103:10:103:11 | M5 | | Finally.cs:115:17:115:41 | ...; | Finally.cs:103:10:103:11 | M5 | -| Finally.cs:115:17:115:41 | [finally: exception(Exception)] ...; | Finally.cs:103:10:103:11 | M5 | -| Finally.cs:115:17:115:41 | [finally: exception(NullReferenceException)] ...; | Finally.cs:103:10:103:11 | M5 | -| Finally.cs:115:17:115:41 | [finally: exception(OutOfMemoryException)] ...; | Finally.cs:103:10:103:11 | M5 | +| Finally.cs:115:17:115:41 | [finally: exception] ...; | Finally.cs:103:10:103:11 | M5 | | Finally.cs:115:17:115:41 | [finally: return] ...; | Finally.cs:103:10:103:11 | M5 | -| Finally.cs:115:35:115:39 | [finally: exception(Exception)] access to field Field | Finally.cs:103:10:103:11 | M5 | -| Finally.cs:115:35:115:39 | [finally: exception(Exception)] this access | Finally.cs:103:10:103:11 | M5 | -| Finally.cs:115:35:115:39 | [finally: exception(NullReferenceException)] access to field Field | Finally.cs:103:10:103:11 | M5 | -| Finally.cs:115:35:115:39 | [finally: exception(NullReferenceException)] this access | Finally.cs:103:10:103:11 | M5 | -| Finally.cs:115:35:115:39 | [finally: exception(OutOfMemoryException)] access to field Field | Finally.cs:103:10:103:11 | M5 | -| Finally.cs:115:35:115:39 | [finally: exception(OutOfMemoryException)] this access | Finally.cs:103:10:103:11 | M5 | +| Finally.cs:115:35:115:39 | [finally: exception] access to field Field | Finally.cs:103:10:103:11 | M5 | +| Finally.cs:115:35:115:39 | [finally: exception] this access | Finally.cs:103:10:103:11 | M5 | | Finally.cs:115:35:115:39 | [finally: return] access to field Field | Finally.cs:103:10:103:11 | M5 | | Finally.cs:115:35:115:39 | [finally: return] this access | Finally.cs:103:10:103:11 | M5 | | Finally.cs:115:35:115:39 | access to field Field | Finally.cs:103:10:103:11 | M5 | | Finally.cs:115:35:115:39 | this access | Finally.cs:103:10:103:11 | M5 | -| Finally.cs:116:13:117:37 | [finally: exception(Exception)] if (...) ... | Finally.cs:103:10:103:11 | M5 | -| Finally.cs:116:13:117:37 | [finally: exception(NullReferenceException)] if (...) ... | Finally.cs:103:10:103:11 | M5 | -| Finally.cs:116:13:117:37 | [finally: exception(OutOfMemoryException)] if (...) ... | Finally.cs:103:10:103:11 | M5 | +| Finally.cs:116:13:117:37 | [finally: exception] if (...) ... | Finally.cs:103:10:103:11 | M5 | | Finally.cs:116:13:117:37 | [finally: return] if (...) ... | Finally.cs:103:10:103:11 | M5 | | Finally.cs:116:13:117:37 | if (...) ... | Finally.cs:103:10:103:11 | M5 | -| Finally.cs:116:17:116:21 | [finally: exception(Exception)] access to field Field | Finally.cs:103:10:103:11 | M5 | -| Finally.cs:116:17:116:21 | [finally: exception(Exception)] this access | Finally.cs:103:10:103:11 | M5 | -| Finally.cs:116:17:116:21 | [finally: exception(NullReferenceException)] access to field Field | Finally.cs:103:10:103:11 | M5 | -| Finally.cs:116:17:116:21 | [finally: exception(NullReferenceException)] this access | Finally.cs:103:10:103:11 | M5 | -| Finally.cs:116:17:116:21 | [finally: exception(OutOfMemoryException)] access to field Field | Finally.cs:103:10:103:11 | M5 | -| Finally.cs:116:17:116:21 | [finally: exception(OutOfMemoryException)] this access | Finally.cs:103:10:103:11 | M5 | +| Finally.cs:116:17:116:21 | [finally: exception] access to field Field | Finally.cs:103:10:103:11 | M5 | +| Finally.cs:116:17:116:21 | [finally: exception] this access | Finally.cs:103:10:103:11 | M5 | | Finally.cs:116:17:116:21 | [finally: return] access to field Field | Finally.cs:103:10:103:11 | M5 | | Finally.cs:116:17:116:21 | [finally: return] this access | Finally.cs:103:10:103:11 | M5 | | Finally.cs:116:17:116:21 | access to field Field | Finally.cs:103:10:103:11 | M5 | | Finally.cs:116:17:116:21 | this access | Finally.cs:103:10:103:11 | M5 | -| Finally.cs:116:17:116:28 | [finally: exception(Exception)] access to property Length | Finally.cs:103:10:103:11 | M5 | -| Finally.cs:116:17:116:28 | [finally: exception(NullReferenceException)] access to property Length | Finally.cs:103:10:103:11 | M5 | -| Finally.cs:116:17:116:28 | [finally: exception(OutOfMemoryException)] access to property Length | Finally.cs:103:10:103:11 | M5 | +| Finally.cs:116:17:116:28 | [finally: exception] access to property Length | Finally.cs:103:10:103:11 | M5 | | Finally.cs:116:17:116:28 | [finally: return] access to property Length | Finally.cs:103:10:103:11 | M5 | | Finally.cs:116:17:116:28 | access to property Length | Finally.cs:103:10:103:11 | M5 | | Finally.cs:116:17:116:32 | ... > ... | Finally.cs:103:10:103:11 | M5 | -| Finally.cs:116:17:116:32 | [finally: exception(Exception)] ... > ... | Finally.cs:103:10:103:11 | M5 | -| Finally.cs:116:17:116:32 | [finally: exception(NullReferenceException)] ... > ... | Finally.cs:103:10:103:11 | M5 | -| Finally.cs:116:17:116:32 | [finally: exception(OutOfMemoryException)] ... > ... | Finally.cs:103:10:103:11 | M5 | +| Finally.cs:116:17:116:32 | [finally: exception] ... > ... | Finally.cs:103:10:103:11 | M5 | | Finally.cs:116:17:116:32 | [finally: return] ... > ... | Finally.cs:103:10:103:11 | M5 | | Finally.cs:116:32:116:32 | 0 | Finally.cs:103:10:103:11 | M5 | -| Finally.cs:116:32:116:32 | [finally: exception(Exception)] 0 | Finally.cs:103:10:103:11 | M5 | -| Finally.cs:116:32:116:32 | [finally: exception(NullReferenceException)] 0 | Finally.cs:103:10:103:11 | M5 | -| Finally.cs:116:32:116:32 | [finally: exception(OutOfMemoryException)] 0 | Finally.cs:103:10:103:11 | M5 | +| Finally.cs:116:32:116:32 | [finally: exception] 0 | Finally.cs:103:10:103:11 | M5 | | Finally.cs:116:32:116:32 | [finally: return] 0 | Finally.cs:103:10:103:11 | M5 | -| Finally.cs:117:17:117:36 | [finally: exception(Exception)] call to method WriteLine | Finally.cs:103:10:103:11 | M5 | -| Finally.cs:117:17:117:36 | [finally: exception(NullReferenceException)] call to method WriteLine | Finally.cs:103:10:103:11 | M5 | -| Finally.cs:117:17:117:36 | [finally: exception(OutOfMemoryException)] call to method WriteLine | Finally.cs:103:10:103:11 | M5 | +| Finally.cs:117:17:117:36 | [finally: exception] call to method WriteLine | Finally.cs:103:10:103:11 | M5 | | Finally.cs:117:17:117:36 | [finally: return] call to method WriteLine | Finally.cs:103:10:103:11 | M5 | | Finally.cs:117:17:117:36 | call to method WriteLine | Finally.cs:103:10:103:11 | M5 | | Finally.cs:117:17:117:37 | ...; | Finally.cs:103:10:103:11 | M5 | -| Finally.cs:117:17:117:37 | [finally: exception(Exception)] ...; | Finally.cs:103:10:103:11 | M5 | -| Finally.cs:117:17:117:37 | [finally: exception(NullReferenceException)] ...; | Finally.cs:103:10:103:11 | M5 | -| Finally.cs:117:17:117:37 | [finally: exception(OutOfMemoryException)] ...; | Finally.cs:103:10:103:11 | M5 | +| Finally.cs:117:17:117:37 | [finally: exception] ...; | Finally.cs:103:10:103:11 | M5 | | Finally.cs:117:17:117:37 | [finally: return] ...; | Finally.cs:103:10:103:11 | M5 | | Finally.cs:117:35:117:35 | 1 | Finally.cs:103:10:103:11 | M5 | -| Finally.cs:117:35:117:35 | [finally: exception(Exception)] 1 | Finally.cs:103:10:103:11 | M5 | -| Finally.cs:117:35:117:35 | [finally: exception(NullReferenceException)] 1 | Finally.cs:103:10:103:11 | M5 | -| Finally.cs:117:35:117:35 | [finally: exception(OutOfMemoryException)] 1 | Finally.cs:103:10:103:11 | M5 | +| Finally.cs:117:35:117:35 | [finally: exception] 1 | Finally.cs:103:10:103:11 | M5 | | Finally.cs:117:35:117:35 | [finally: return] 1 | Finally.cs:103:10:103:11 | M5 | | Finally.cs:121:10:121:11 | enter M6 | Finally.cs:121:10:121:11 | M6 | | Finally.cs:121:10:121:11 | exit M6 | Finally.cs:121:10:121:11 | M6 | @@ -2243,14 +2191,14 @@ nodeEnclosing | Finally.cs:137:13:137:36 | call to method WriteLine | Finally.cs:133:10:133:11 | M7 | | Finally.cs:137:13:137:37 | ...; | Finally.cs:133:10:133:11 | M7 | | Finally.cs:137:31:137:35 | "Try" | Finally.cs:133:10:133:11 | M7 | -| Finally.cs:140:9:143:9 | [finally: exception(Exception)] {...} | Finally.cs:133:10:133:11 | M7 | +| Finally.cs:140:9:143:9 | [finally: exception] {...} | Finally.cs:133:10:133:11 | M7 | | Finally.cs:140:9:143:9 | {...} | Finally.cs:133:10:133:11 | M7 | -| Finally.cs:141:13:141:44 | [finally: exception(Exception)] throw ...; | Finally.cs:133:10:133:11 | M7 | +| Finally.cs:141:13:141:44 | [finally: exception] throw ...; | Finally.cs:133:10:133:11 | M7 | | Finally.cs:141:13:141:44 | throw ...; | Finally.cs:133:10:133:11 | M7 | -| Finally.cs:141:19:141:43 | [finally: exception(Exception)] object creation of type ArgumentException | Finally.cs:133:10:133:11 | M7 | +| Finally.cs:141:19:141:43 | [finally: exception] object creation of type ArgumentException | Finally.cs:133:10:133:11 | M7 | | Finally.cs:141:19:141:43 | object creation of type ArgumentException | Finally.cs:133:10:133:11 | M7 | | Finally.cs:141:41:141:42 | "" | Finally.cs:133:10:133:11 | M7 | -| Finally.cs:141:41:141:42 | [finally: exception(Exception)] "" | Finally.cs:133:10:133:11 | M7 | +| Finally.cs:141:41:141:42 | [finally: exception] "" | Finally.cs:133:10:133:11 | M7 | | Finally.cs:147:10:147:11 | enter M8 | Finally.cs:147:10:147:11 | M8 | | Finally.cs:147:10:147:11 | exit M8 | Finally.cs:147:10:147:11 | M8 | | Finally.cs:147:10:147:11 | exit M8 (abnormal) | Finally.cs:147:10:147:11 | M8 | @@ -2264,108 +2212,74 @@ nodeEnclosing | Finally.cs:151:25:151:28 | null | Finally.cs:147:10:147:11 | M8 | | Finally.cs:152:17:152:50 | throw ...; | Finally.cs:147:10:147:11 | M8 | | Finally.cs:152:23:152:49 | object creation of type ArgumentNullException | Finally.cs:147:10:147:11 | M8 | -| Finally.cs:155:9:169:9 | [finally: exception(ArgumentNullException)] {...} | Finally.cs:147:10:147:11 | M8 | -| Finally.cs:155:9:169:9 | [finally: exception(Exception)] {...} | Finally.cs:147:10:147:11 | M8 | +| Finally.cs:155:9:169:9 | [finally: exception] {...} | Finally.cs:147:10:147:11 | M8 | | Finally.cs:155:9:169:9 | {...} | Finally.cs:147:10:147:11 | M8 | -| Finally.cs:156:13:168:13 | [finally: exception(ArgumentNullException)] try {...} ... | Finally.cs:147:10:147:11 | M8 | -| Finally.cs:156:13:168:13 | [finally: exception(Exception)] try {...} ... | Finally.cs:147:10:147:11 | M8 | +| Finally.cs:156:13:168:13 | [finally: exception] try {...} ... | Finally.cs:147:10:147:11 | M8 | | Finally.cs:156:13:168:13 | try {...} ... | Finally.cs:147:10:147:11 | M8 | -| Finally.cs:157:13:160:13 | [finally: exception(ArgumentNullException)] {...} | Finally.cs:147:10:147:11 | M8 | -| Finally.cs:157:13:160:13 | [finally: exception(Exception)] {...} | Finally.cs:147:10:147:11 | M8 | +| Finally.cs:157:13:160:13 | [finally: exception] {...} | Finally.cs:147:10:147:11 | M8 | | Finally.cs:157:13:160:13 | {...} | Finally.cs:147:10:147:11 | M8 | -| Finally.cs:158:17:159:45 | [finally: exception(ArgumentNullException)] if (...) ... | Finally.cs:147:10:147:11 | M8 | -| Finally.cs:158:17:159:45 | [finally: exception(Exception)] if (...) ... | Finally.cs:147:10:147:11 | M8 | +| Finally.cs:158:17:159:45 | [finally: exception] if (...) ... | Finally.cs:147:10:147:11 | M8 | | Finally.cs:158:17:159:45 | if (...) ... | Finally.cs:147:10:147:11 | M8 | -| Finally.cs:158:21:158:24 | [finally: exception(ArgumentNullException)] access to parameter args | Finally.cs:147:10:147:11 | M8 | -| Finally.cs:158:21:158:24 | [finally: exception(Exception)] access to parameter args | Finally.cs:147:10:147:11 | M8 | +| Finally.cs:158:21:158:24 | [finally: exception] access to parameter args | Finally.cs:147:10:147:11 | M8 | | Finally.cs:158:21:158:24 | access to parameter args | Finally.cs:147:10:147:11 | M8 | -| Finally.cs:158:21:158:31 | [finally: exception(ArgumentNullException)] access to property Length | Finally.cs:147:10:147:11 | M8 | -| Finally.cs:158:21:158:31 | [finally: exception(Exception)] access to property Length | Finally.cs:147:10:147:11 | M8 | +| Finally.cs:158:21:158:31 | [finally: exception] access to property Length | Finally.cs:147:10:147:11 | M8 | | Finally.cs:158:21:158:31 | access to property Length | Finally.cs:147:10:147:11 | M8 | | Finally.cs:158:21:158:36 | ... == ... | Finally.cs:147:10:147:11 | M8 | -| Finally.cs:158:21:158:36 | [finally: exception(ArgumentNullException)] ... == ... | Finally.cs:147:10:147:11 | M8 | -| Finally.cs:158:21:158:36 | [finally: exception(Exception)] ... == ... | Finally.cs:147:10:147:11 | M8 | +| Finally.cs:158:21:158:36 | [finally: exception] ... == ... | Finally.cs:147:10:147:11 | M8 | | Finally.cs:158:36:158:36 | 1 | Finally.cs:147:10:147:11 | M8 | -| Finally.cs:158:36:158:36 | [finally: exception(ArgumentNullException)] 1 | Finally.cs:147:10:147:11 | M8 | -| Finally.cs:158:36:158:36 | [finally: exception(Exception)] 1 | Finally.cs:147:10:147:11 | M8 | -| Finally.cs:159:21:159:45 | [finally: exception(ArgumentNullException)] throw ...; | Finally.cs:147:10:147:11 | M8 | -| Finally.cs:159:21:159:45 | [finally: exception(Exception)] throw ...; | Finally.cs:147:10:147:11 | M8 | +| Finally.cs:158:36:158:36 | [finally: exception] 1 | Finally.cs:147:10:147:11 | M8 | +| Finally.cs:159:21:159:45 | [finally: exception] throw ...; | Finally.cs:147:10:147:11 | M8 | | Finally.cs:159:21:159:45 | throw ...; | Finally.cs:147:10:147:11 | M8 | -| Finally.cs:159:27:159:44 | [finally: exception(ArgumentNullException)] object creation of type Exception | Finally.cs:147:10:147:11 | M8 | -| Finally.cs:159:27:159:44 | [finally: exception(Exception)] object creation of type Exception | Finally.cs:147:10:147:11 | M8 | +| Finally.cs:159:27:159:44 | [finally: exception] object creation of type Exception | Finally.cs:147:10:147:11 | M8 | | Finally.cs:159:27:159:44 | object creation of type Exception | Finally.cs:147:10:147:11 | M8 | | Finally.cs:159:41:159:43 | "1" | Finally.cs:147:10:147:11 | M8 | -| Finally.cs:159:41:159:43 | [finally: exception(ArgumentNullException)] "1" | Finally.cs:147:10:147:11 | M8 | -| Finally.cs:159:41:159:43 | [finally: exception(Exception)] "1" | Finally.cs:147:10:147:11 | M8 | +| Finally.cs:159:41:159:43 | [finally: exception] "1" | Finally.cs:147:10:147:11 | M8 | | Finally.cs:161:13:164:13 | [exception: Exception] catch (...) {...} | Finally.cs:147:10:147:11 | M8 | | Finally.cs:161:13:164:13 | [exception: NullReferenceException] catch (...) {...} | Finally.cs:147:10:147:11 | M8 | -| Finally.cs:161:13:164:13 | [finally: exception(ArgumentNullException), exception: Exception] catch (...) {...} | Finally.cs:147:10:147:11 | M8 | -| Finally.cs:161:13:164:13 | [finally: exception(ArgumentNullException), exception: NullReferenceException] catch (...) {...} | Finally.cs:147:10:147:11 | M8 | -| Finally.cs:161:13:164:13 | [finally: exception(Exception), exception: Exception] catch (...) {...} | Finally.cs:147:10:147:11 | M8 | -| Finally.cs:161:13:164:13 | [finally: exception(Exception), exception: NullReferenceException] catch (...) {...} | Finally.cs:147:10:147:11 | M8 | +| Finally.cs:161:13:164:13 | [finally: exception, exception: Exception] catch (...) {...} | Finally.cs:147:10:147:11 | M8 | +| Finally.cs:161:13:164:13 | [finally: exception, exception: NullReferenceException] catch (...) {...} | Finally.cs:147:10:147:11 | M8 | | Finally.cs:161:30:161:30 | [exception: Exception] Exception e | Finally.cs:147:10:147:11 | M8 | | Finally.cs:161:30:161:30 | [exception: NullReferenceException] Exception e | Finally.cs:147:10:147:11 | M8 | -| Finally.cs:161:30:161:30 | [finally: exception(ArgumentNullException), exception: Exception] Exception e | Finally.cs:147:10:147:11 | M8 | -| Finally.cs:161:30:161:30 | [finally: exception(ArgumentNullException), exception: NullReferenceException] Exception e | Finally.cs:147:10:147:11 | M8 | -| Finally.cs:161:30:161:30 | [finally: exception(Exception), exception: Exception] Exception e | Finally.cs:147:10:147:11 | M8 | -| Finally.cs:161:30:161:30 | [finally: exception(Exception), exception: NullReferenceException] Exception e | Finally.cs:147:10:147:11 | M8 | +| Finally.cs:161:30:161:30 | [finally: exception, exception: Exception] Exception e | Finally.cs:147:10:147:11 | M8 | +| Finally.cs:161:30:161:30 | [finally: exception, exception: NullReferenceException] Exception e | Finally.cs:147:10:147:11 | M8 | | Finally.cs:161:39:161:39 | [exception: Exception] access to local variable e | Finally.cs:147:10:147:11 | M8 | | Finally.cs:161:39:161:39 | [exception: NullReferenceException] access to local variable e | Finally.cs:147:10:147:11 | M8 | -| Finally.cs:161:39:161:39 | [finally: exception(ArgumentNullException), exception: Exception] access to local variable e | Finally.cs:147:10:147:11 | M8 | -| Finally.cs:161:39:161:39 | [finally: exception(ArgumentNullException), exception: NullReferenceException] access to local variable e | Finally.cs:147:10:147:11 | M8 | -| Finally.cs:161:39:161:39 | [finally: exception(Exception), exception: Exception] access to local variable e | Finally.cs:147:10:147:11 | M8 | -| Finally.cs:161:39:161:39 | [finally: exception(Exception), exception: NullReferenceException] access to local variable e | Finally.cs:147:10:147:11 | M8 | +| Finally.cs:161:39:161:39 | [finally: exception, exception: Exception] access to local variable e | Finally.cs:147:10:147:11 | M8 | +| Finally.cs:161:39:161:39 | [finally: exception, exception: NullReferenceException] access to local variable e | Finally.cs:147:10:147:11 | M8 | | Finally.cs:161:39:161:47 | [exception: Exception] access to property Message | Finally.cs:147:10:147:11 | M8 | | Finally.cs:161:39:161:47 | [exception: NullReferenceException] access to property Message | Finally.cs:147:10:147:11 | M8 | -| Finally.cs:161:39:161:47 | [finally: exception(ArgumentNullException), exception: Exception] access to property Message | Finally.cs:147:10:147:11 | M8 | -| Finally.cs:161:39:161:47 | [finally: exception(ArgumentNullException), exception: NullReferenceException] access to property Message | Finally.cs:147:10:147:11 | M8 | -| Finally.cs:161:39:161:47 | [finally: exception(Exception), exception: Exception] access to property Message | Finally.cs:147:10:147:11 | M8 | -| Finally.cs:161:39:161:47 | [finally: exception(Exception), exception: NullReferenceException] access to property Message | Finally.cs:147:10:147:11 | M8 | +| Finally.cs:161:39:161:47 | [finally: exception, exception: Exception] access to property Message | Finally.cs:147:10:147:11 | M8 | +| Finally.cs:161:39:161:47 | [finally: exception, exception: NullReferenceException] access to property Message | Finally.cs:147:10:147:11 | M8 | | Finally.cs:161:39:161:54 | [exception: Exception] ... == ... | Finally.cs:147:10:147:11 | M8 | | Finally.cs:161:39:161:54 | [exception: NullReferenceException] ... == ... | Finally.cs:147:10:147:11 | M8 | -| Finally.cs:161:39:161:54 | [finally: exception(ArgumentNullException), exception: Exception] ... == ... | Finally.cs:147:10:147:11 | M8 | -| Finally.cs:161:39:161:54 | [finally: exception(ArgumentNullException), exception: NullReferenceException] ... == ... | Finally.cs:147:10:147:11 | M8 | -| Finally.cs:161:39:161:54 | [finally: exception(Exception), exception: Exception] ... == ... | Finally.cs:147:10:147:11 | M8 | -| Finally.cs:161:39:161:54 | [finally: exception(Exception), exception: NullReferenceException] ... == ... | Finally.cs:147:10:147:11 | M8 | +| Finally.cs:161:39:161:54 | [finally: exception, exception: Exception] ... == ... | Finally.cs:147:10:147:11 | M8 | +| Finally.cs:161:39:161:54 | [finally: exception, exception: NullReferenceException] ... == ... | Finally.cs:147:10:147:11 | M8 | | Finally.cs:161:52:161:54 | [exception: Exception] "1" | Finally.cs:147:10:147:11 | M8 | | Finally.cs:161:52:161:54 | [exception: NullReferenceException] "1" | Finally.cs:147:10:147:11 | M8 | -| Finally.cs:161:52:161:54 | [finally: exception(ArgumentNullException), exception: Exception] "1" | Finally.cs:147:10:147:11 | M8 | -| Finally.cs:161:52:161:54 | [finally: exception(ArgumentNullException), exception: NullReferenceException] "1" | Finally.cs:147:10:147:11 | M8 | -| Finally.cs:161:52:161:54 | [finally: exception(Exception), exception: Exception] "1" | Finally.cs:147:10:147:11 | M8 | -| Finally.cs:161:52:161:54 | [finally: exception(Exception), exception: NullReferenceException] "1" | Finally.cs:147:10:147:11 | M8 | -| Finally.cs:162:13:164:13 | [finally: exception(ArgumentNullException)] {...} | Finally.cs:147:10:147:11 | M8 | -| Finally.cs:162:13:164:13 | [finally: exception(Exception)] {...} | Finally.cs:147:10:147:11 | M8 | +| Finally.cs:161:52:161:54 | [finally: exception, exception: Exception] "1" | Finally.cs:147:10:147:11 | M8 | +| Finally.cs:161:52:161:54 | [finally: exception, exception: NullReferenceException] "1" | Finally.cs:147:10:147:11 | M8 | +| Finally.cs:162:13:164:13 | [finally: exception] {...} | Finally.cs:147:10:147:11 | M8 | | Finally.cs:162:13:164:13 | {...} | Finally.cs:147:10:147:11 | M8 | -| Finally.cs:163:17:163:42 | [finally: exception(ArgumentNullException)] call to method WriteLine | Finally.cs:147:10:147:11 | M8 | -| Finally.cs:163:17:163:42 | [finally: exception(Exception)] call to method WriteLine | Finally.cs:147:10:147:11 | M8 | +| Finally.cs:163:17:163:42 | [finally: exception] call to method WriteLine | Finally.cs:147:10:147:11 | M8 | | Finally.cs:163:17:163:42 | call to method WriteLine | Finally.cs:147:10:147:11 | M8 | | Finally.cs:163:17:163:43 | ...; | Finally.cs:147:10:147:11 | M8 | -| Finally.cs:163:17:163:43 | [finally: exception(ArgumentNullException)] ...; | Finally.cs:147:10:147:11 | M8 | -| Finally.cs:163:17:163:43 | [finally: exception(Exception)] ...; | Finally.cs:147:10:147:11 | M8 | -| Finally.cs:163:35:163:38 | [finally: exception(ArgumentNullException)] access to parameter args | Finally.cs:147:10:147:11 | M8 | -| Finally.cs:163:35:163:38 | [finally: exception(Exception)] access to parameter args | Finally.cs:147:10:147:11 | M8 | +| Finally.cs:163:17:163:43 | [finally: exception] ...; | Finally.cs:147:10:147:11 | M8 | +| Finally.cs:163:35:163:38 | [finally: exception] access to parameter args | Finally.cs:147:10:147:11 | M8 | | Finally.cs:163:35:163:38 | access to parameter args | Finally.cs:147:10:147:11 | M8 | -| Finally.cs:163:35:163:41 | [finally: exception(ArgumentNullException)] access to array element | Finally.cs:147:10:147:11 | M8 | -| Finally.cs:163:35:163:41 | [finally: exception(Exception)] access to array element | Finally.cs:147:10:147:11 | M8 | +| Finally.cs:163:35:163:41 | [finally: exception] access to array element | Finally.cs:147:10:147:11 | M8 | | Finally.cs:163:35:163:41 | access to array element | Finally.cs:147:10:147:11 | M8 | | Finally.cs:163:40:163:40 | 0 | Finally.cs:147:10:147:11 | M8 | -| Finally.cs:163:40:163:40 | [finally: exception(ArgumentNullException)] 0 | Finally.cs:147:10:147:11 | M8 | -| Finally.cs:163:40:163:40 | [finally: exception(Exception)] 0 | Finally.cs:147:10:147:11 | M8 | -| Finally.cs:165:13:168:13 | [finally: exception(ArgumentNullException)] catch {...} | Finally.cs:147:10:147:11 | M8 | -| Finally.cs:165:13:168:13 | [finally: exception(Exception)] catch {...} | Finally.cs:147:10:147:11 | M8 | +| Finally.cs:163:40:163:40 | [finally: exception] 0 | Finally.cs:147:10:147:11 | M8 | +| Finally.cs:165:13:168:13 | [finally: exception] catch {...} | Finally.cs:147:10:147:11 | M8 | | Finally.cs:165:13:168:13 | catch {...} | Finally.cs:147:10:147:11 | M8 | -| Finally.cs:166:13:168:13 | [finally: exception(ArgumentNullException)] {...} | Finally.cs:147:10:147:11 | M8 | -| Finally.cs:166:13:168:13 | [finally: exception(Exception)] {...} | Finally.cs:147:10:147:11 | M8 | +| Finally.cs:166:13:168:13 | [finally: exception] {...} | Finally.cs:147:10:147:11 | M8 | | Finally.cs:166:13:168:13 | {...} | Finally.cs:147:10:147:11 | M8 | -| Finally.cs:167:17:167:37 | [finally: exception(ArgumentNullException)] call to method WriteLine | Finally.cs:147:10:147:11 | M8 | -| Finally.cs:167:17:167:37 | [finally: exception(Exception)] call to method WriteLine | Finally.cs:147:10:147:11 | M8 | +| Finally.cs:167:17:167:37 | [finally: exception] call to method WriteLine | Finally.cs:147:10:147:11 | M8 | | Finally.cs:167:17:167:37 | call to method WriteLine | Finally.cs:147:10:147:11 | M8 | | Finally.cs:167:17:167:38 | ...; | Finally.cs:147:10:147:11 | M8 | -| Finally.cs:167:17:167:38 | [finally: exception(ArgumentNullException)] ...; | Finally.cs:147:10:147:11 | M8 | -| Finally.cs:167:17:167:38 | [finally: exception(Exception)] ...; | Finally.cs:147:10:147:11 | M8 | +| Finally.cs:167:17:167:38 | [finally: exception] ...; | Finally.cs:147:10:147:11 | M8 | | Finally.cs:167:35:167:36 | "" | Finally.cs:147:10:147:11 | M8 | -| Finally.cs:167:35:167:36 | [finally: exception(ArgumentNullException)] "" | Finally.cs:147:10:147:11 | M8 | -| Finally.cs:167:35:167:36 | [finally: exception(Exception)] "" | Finally.cs:147:10:147:11 | M8 | +| Finally.cs:167:35:167:36 | [finally: exception] "" | Finally.cs:147:10:147:11 | M8 | | Finally.cs:172:11:172:20 | call to constructor Exception | Finally.cs:172:11:172:20 | ExceptionA | | Finally.cs:172:11:172:20 | enter ExceptionA | Finally.cs:172:11:172:20 | ExceptionA | | Finally.cs:172:11:172:20 | exit ExceptionA | Finally.cs:172:11:172:20 | ExceptionA | @@ -2393,51 +2307,35 @@ nodeEnclosing | Finally.cs:180:21:180:43 | [b1 (line 176): true] throw ...; | Finally.cs:176:10:176:11 | M9 | | Finally.cs:180:27:180:42 | [b1 (line 176): true] object creation of type ExceptionA | Finally.cs:176:10:176:11 | M9 | | Finally.cs:183:9:192:9 | [b1 (line 176): false] {...} | Finally.cs:176:10:176:11 | M9 | -| Finally.cs:183:9:192:9 | [finally: exception(Exception), b1 (line 176): true] {...} | Finally.cs:176:10:176:11 | M9 | -| Finally.cs:183:9:192:9 | [finally: exception(ExceptionA), b1 (line 176): true] {...} | Finally.cs:176:10:176:11 | M9 | +| Finally.cs:183:9:192:9 | [finally: exception, b1 (line 176): true] {...} | Finally.cs:176:10:176:11 | M9 | | Finally.cs:184:13:191:13 | [b1 (line 176): false] try {...} ... | Finally.cs:176:10:176:11 | M9 | -| Finally.cs:184:13:191:13 | [finally: exception(Exception), b1 (line 176): true] try {...} ... | Finally.cs:176:10:176:11 | M9 | -| Finally.cs:184:13:191:13 | [finally: exception(ExceptionA), b1 (line 176): true] try {...} ... | Finally.cs:176:10:176:11 | M9 | +| Finally.cs:184:13:191:13 | [finally: exception, b1 (line 176): true] try {...} ... | Finally.cs:176:10:176:11 | M9 | | Finally.cs:185:13:187:13 | [b1 (line 176): false] {...} | Finally.cs:176:10:176:11 | M9 | -| Finally.cs:185:13:187:13 | [finally: exception(Exception), b1 (line 176): true] {...} | Finally.cs:176:10:176:11 | M9 | -| Finally.cs:185:13:187:13 | [finally: exception(ExceptionA), b1 (line 176): true] {...} | Finally.cs:176:10:176:11 | M9 | +| Finally.cs:185:13:187:13 | [finally: exception, b1 (line 176): true] {...} | Finally.cs:176:10:176:11 | M9 | | Finally.cs:186:17:186:47 | [b1 (line 176): false] if (...) ... | Finally.cs:176:10:176:11 | M9 | -| Finally.cs:186:17:186:47 | [finally: exception(Exception), b1 (line 176): true] if (...) ... | Finally.cs:176:10:176:11 | M9 | -| Finally.cs:186:17:186:47 | [finally: exception(ExceptionA), b1 (line 176): true] if (...) ... | Finally.cs:176:10:176:11 | M9 | +| Finally.cs:186:17:186:47 | [finally: exception, b1 (line 176): true] if (...) ... | Finally.cs:176:10:176:11 | M9 | | Finally.cs:186:21:186:22 | [b1 (line 176): false] access to parameter b2 | Finally.cs:176:10:176:11 | M9 | -| Finally.cs:186:21:186:22 | [finally: exception(Exception), b1 (line 176): true] access to parameter b2 | Finally.cs:176:10:176:11 | M9 | -| Finally.cs:186:21:186:22 | [finally: exception(ExceptionA), b1 (line 176): true] access to parameter b2 | Finally.cs:176:10:176:11 | M9 | +| Finally.cs:186:21:186:22 | [finally: exception, b1 (line 176): true] access to parameter b2 | Finally.cs:176:10:176:11 | M9 | | Finally.cs:186:25:186:47 | [b1 (line 176): false, b2 (line 176): true] throw ...; | Finally.cs:176:10:176:11 | M9 | -| Finally.cs:186:25:186:47 | [finally: exception(Exception), b1 (line 176): true, b2 (line 176): true] throw ...; | Finally.cs:176:10:176:11 | M9 | -| Finally.cs:186:25:186:47 | [finally: exception(ExceptionA), b1 (line 176): true, b2 (line 176): true] throw ...; | Finally.cs:176:10:176:11 | M9 | +| Finally.cs:186:25:186:47 | [finally: exception, b1 (line 176): true, b2 (line 176): true] throw ...; | Finally.cs:176:10:176:11 | M9 | | Finally.cs:186:31:186:46 | [b1 (line 176): false, b2 (line 176): true] object creation of type ExceptionB | Finally.cs:176:10:176:11 | M9 | -| Finally.cs:186:31:186:46 | [finally: exception(Exception), b1 (line 176): true, b2 (line 176): true] object creation of type ExceptionB | Finally.cs:176:10:176:11 | M9 | -| Finally.cs:186:31:186:46 | [finally: exception(ExceptionA), b1 (line 176): true, b2 (line 176): true] object creation of type ExceptionB | Finally.cs:176:10:176:11 | M9 | +| Finally.cs:186:31:186:46 | [finally: exception, b1 (line 176): true, b2 (line 176): true] object creation of type ExceptionB | Finally.cs:176:10:176:11 | M9 | | Finally.cs:188:13:191:13 | [exception: Exception, b1 (line 176): false, b2 (line 176): true] catch (...) {...} | Finally.cs:176:10:176:11 | M9 | | Finally.cs:188:13:191:13 | [exception: ExceptionB, b1 (line 176): false, b2 (line 176): true] catch (...) {...} | Finally.cs:176:10:176:11 | M9 | -| Finally.cs:188:13:191:13 | [finally: exception(Exception), exception: Exception, b1 (line 176): true, b2 (line 176): true] catch (...) {...} | Finally.cs:176:10:176:11 | M9 | -| Finally.cs:188:13:191:13 | [finally: exception(Exception), exception: ExceptionB, b1 (line 176): true, b2 (line 176): true] catch (...) {...} | Finally.cs:176:10:176:11 | M9 | -| Finally.cs:188:13:191:13 | [finally: exception(ExceptionA), exception: Exception, b1 (line 176): true, b2 (line 176): true] catch (...) {...} | Finally.cs:176:10:176:11 | M9 | -| Finally.cs:188:13:191:13 | [finally: exception(ExceptionA), exception: ExceptionB, b1 (line 176): true, b2 (line 176): true] catch (...) {...} | Finally.cs:176:10:176:11 | M9 | +| Finally.cs:188:13:191:13 | [finally: exception, exception: Exception, b1 (line 176): true, b2 (line 176): true] catch (...) {...} | Finally.cs:176:10:176:11 | M9 | +| Finally.cs:188:13:191:13 | [finally: exception, exception: ExceptionB, b1 (line 176): true, b2 (line 176): true] catch (...) {...} | Finally.cs:176:10:176:11 | M9 | | Finally.cs:188:38:188:39 | [exception: Exception, b1 (line 176): false, b2 (line 176): true] access to parameter b2 | Finally.cs:176:10:176:11 | M9 | | Finally.cs:188:38:188:39 | [exception: ExceptionB, b1 (line 176): false, b2 (line 176): true] access to parameter b2 | Finally.cs:176:10:176:11 | M9 | -| Finally.cs:188:38:188:39 | [finally: exception(Exception), exception: Exception, b1 (line 176): true, b2 (line 176): true] access to parameter b2 | Finally.cs:176:10:176:11 | M9 | -| Finally.cs:188:38:188:39 | [finally: exception(Exception), exception: ExceptionB, b1 (line 176): true, b2 (line 176): true] access to parameter b2 | Finally.cs:176:10:176:11 | M9 | -| Finally.cs:188:38:188:39 | [finally: exception(ExceptionA), exception: Exception, b1 (line 176): true, b2 (line 176): true] access to parameter b2 | Finally.cs:176:10:176:11 | M9 | -| Finally.cs:188:38:188:39 | [finally: exception(ExceptionA), exception: ExceptionB, b1 (line 176): true, b2 (line 176): true] access to parameter b2 | Finally.cs:176:10:176:11 | M9 | +| Finally.cs:188:38:188:39 | [finally: exception, exception: Exception, b1 (line 176): true, b2 (line 176): true] access to parameter b2 | Finally.cs:176:10:176:11 | M9 | +| Finally.cs:188:38:188:39 | [finally: exception, exception: ExceptionB, b1 (line 176): true, b2 (line 176): true] access to parameter b2 | Finally.cs:176:10:176:11 | M9 | | Finally.cs:189:13:191:13 | [b1 (line 176): false] {...} | Finally.cs:176:10:176:11 | M9 | -| Finally.cs:189:13:191:13 | [finally: exception(Exception), b1 (line 176): true] {...} | Finally.cs:176:10:176:11 | M9 | -| Finally.cs:189:13:191:13 | [finally: exception(ExceptionA), b1 (line 176): true] {...} | Finally.cs:176:10:176:11 | M9 | +| Finally.cs:189:13:191:13 | [finally: exception, b1 (line 176): true] {...} | Finally.cs:176:10:176:11 | M9 | | Finally.cs:190:17:190:47 | [b1 (line 176): false] if (...) ... | Finally.cs:176:10:176:11 | M9 | -| Finally.cs:190:17:190:47 | [finally: exception(Exception), b1 (line 176): true] if (...) ... | Finally.cs:176:10:176:11 | M9 | -| Finally.cs:190:17:190:47 | [finally: exception(ExceptionA), b1 (line 176): true] if (...) ... | Finally.cs:176:10:176:11 | M9 | +| Finally.cs:190:17:190:47 | [finally: exception, b1 (line 176): true] if (...) ... | Finally.cs:176:10:176:11 | M9 | | Finally.cs:190:21:190:22 | [b1 (line 176): false] access to parameter b1 | Finally.cs:176:10:176:11 | M9 | -| Finally.cs:190:21:190:22 | [finally: exception(Exception), b1 (line 176): true] access to parameter b1 | Finally.cs:176:10:176:11 | M9 | -| Finally.cs:190:21:190:22 | [finally: exception(ExceptionA), b1 (line 176): true] access to parameter b1 | Finally.cs:176:10:176:11 | M9 | -| Finally.cs:190:25:190:47 | [finally: exception(Exception)] throw ...; | Finally.cs:176:10:176:11 | M9 | -| Finally.cs:190:25:190:47 | [finally: exception(ExceptionA)] throw ...; | Finally.cs:176:10:176:11 | M9 | -| Finally.cs:190:31:190:46 | [finally: exception(Exception)] object creation of type ExceptionC | Finally.cs:176:10:176:11 | M9 | -| Finally.cs:190:31:190:46 | [finally: exception(ExceptionA)] object creation of type ExceptionC | Finally.cs:176:10:176:11 | M9 | +| Finally.cs:190:21:190:22 | [finally: exception, b1 (line 176): true] access to parameter b1 | Finally.cs:176:10:176:11 | M9 | +| Finally.cs:190:25:190:47 | [finally: exception] throw ...; | Finally.cs:176:10:176:11 | M9 | +| Finally.cs:190:31:190:46 | [finally: exception] object creation of type ExceptionC | Finally.cs:176:10:176:11 | M9 | | Finally.cs:195:10:195:12 | enter M10 | Finally.cs:195:10:195:12 | M10 | | Finally.cs:195:10:195:12 | exit M10 | Finally.cs:195:10:195:12 | M10 | | Finally.cs:195:10:195:12 | exit M10 (abnormal) | Finally.cs:195:10:195:12 | M10 | @@ -2449,84 +2347,48 @@ nodeEnclosing | Finally.cs:199:17:199:18 | access to parameter b1 | Finally.cs:195:10:195:12 | M10 | | Finally.cs:199:21:199:43 | throw ...; | Finally.cs:195:10:195:12 | M10 | | Finally.cs:199:27:199:42 | object creation of type ExceptionA | Finally.cs:195:10:195:12 | M10 | -| Finally.cs:202:9:212:9 | [finally: exception(Exception)] {...} | Finally.cs:195:10:195:12 | M10 | -| Finally.cs:202:9:212:9 | [finally: exception(ExceptionA)] {...} | Finally.cs:195:10:195:12 | M10 | +| Finally.cs:202:9:212:9 | [finally: exception] {...} | Finally.cs:195:10:195:12 | M10 | | Finally.cs:202:9:212:9 | {...} | Finally.cs:195:10:195:12 | M10 | -| Finally.cs:203:13:210:13 | [finally: exception(Exception)] try {...} ... | Finally.cs:195:10:195:12 | M10 | -| Finally.cs:203:13:210:13 | [finally: exception(ExceptionA)] try {...} ... | Finally.cs:195:10:195:12 | M10 | +| Finally.cs:203:13:210:13 | [finally: exception] try {...} ... | Finally.cs:195:10:195:12 | M10 | | Finally.cs:203:13:210:13 | try {...} ... | Finally.cs:195:10:195:12 | M10 | -| Finally.cs:204:13:206:13 | [finally: exception(Exception)] {...} | Finally.cs:195:10:195:12 | M10 | -| Finally.cs:204:13:206:13 | [finally: exception(ExceptionA)] {...} | Finally.cs:195:10:195:12 | M10 | +| Finally.cs:204:13:206:13 | [finally: exception] {...} | Finally.cs:195:10:195:12 | M10 | | Finally.cs:204:13:206:13 | {...} | Finally.cs:195:10:195:12 | M10 | -| Finally.cs:205:17:205:47 | [finally: exception(Exception)] if (...) ... | Finally.cs:195:10:195:12 | M10 | -| Finally.cs:205:17:205:47 | [finally: exception(ExceptionA)] if (...) ... | Finally.cs:195:10:195:12 | M10 | +| Finally.cs:205:17:205:47 | [finally: exception] if (...) ... | Finally.cs:195:10:195:12 | M10 | | Finally.cs:205:17:205:47 | if (...) ... | Finally.cs:195:10:195:12 | M10 | -| Finally.cs:205:21:205:22 | [finally: exception(Exception)] access to parameter b2 | Finally.cs:195:10:195:12 | M10 | -| Finally.cs:205:21:205:22 | [finally: exception(ExceptionA)] access to parameter b2 | Finally.cs:195:10:195:12 | M10 | +| Finally.cs:205:21:205:22 | [finally: exception] access to parameter b2 | Finally.cs:195:10:195:12 | M10 | | Finally.cs:205:21:205:22 | access to parameter b2 | Finally.cs:195:10:195:12 | M10 | -| Finally.cs:205:25:205:47 | [finally: exception(Exception)] throw ...; | Finally.cs:195:10:195:12 | M10 | -| Finally.cs:205:25:205:47 | [finally: exception(ExceptionA)] throw ...; | Finally.cs:195:10:195:12 | M10 | +| Finally.cs:205:25:205:47 | [finally: exception] throw ...; | Finally.cs:195:10:195:12 | M10 | | Finally.cs:205:25:205:47 | throw ...; | Finally.cs:195:10:195:12 | M10 | -| Finally.cs:205:31:205:46 | [finally: exception(Exception)] object creation of type ExceptionB | Finally.cs:195:10:195:12 | M10 | -| Finally.cs:205:31:205:46 | [finally: exception(ExceptionA)] object creation of type ExceptionB | Finally.cs:195:10:195:12 | M10 | +| Finally.cs:205:31:205:46 | [finally: exception] object creation of type ExceptionB | Finally.cs:195:10:195:12 | M10 | | Finally.cs:205:31:205:46 | object creation of type ExceptionB | Finally.cs:195:10:195:12 | M10 | -| Finally.cs:208:13:210:13 | [finally(1): exception(Exception)] {...} | Finally.cs:195:10:195:12 | M10 | -| Finally.cs:208:13:210:13 | [finally(1): exception(ExceptionB)] {...} | Finally.cs:195:10:195:12 | M10 | -| Finally.cs:208:13:210:13 | [finally: exception(Exception), finally(1): exception(Exception)] {...} | Finally.cs:195:10:195:12 | M10 | -| Finally.cs:208:13:210:13 | [finally: exception(Exception), finally(1): exception(ExceptionB)] {...} | Finally.cs:195:10:195:12 | M10 | -| Finally.cs:208:13:210:13 | [finally: exception(Exception)] {...} | Finally.cs:195:10:195:12 | M10 | -| Finally.cs:208:13:210:13 | [finally: exception(ExceptionA), finally(1): exception(Exception)] {...} | Finally.cs:195:10:195:12 | M10 | -| Finally.cs:208:13:210:13 | [finally: exception(ExceptionA), finally(1): exception(ExceptionB)] {...} | Finally.cs:195:10:195:12 | M10 | -| Finally.cs:208:13:210:13 | [finally: exception(ExceptionA)] {...} | Finally.cs:195:10:195:12 | M10 | +| Finally.cs:208:13:210:13 | [finally(1): exception] {...} | Finally.cs:195:10:195:12 | M10 | +| Finally.cs:208:13:210:13 | [finally: exception, finally(1): exception] {...} | Finally.cs:195:10:195:12 | M10 | +| Finally.cs:208:13:210:13 | [finally: exception] {...} | Finally.cs:195:10:195:12 | M10 | | Finally.cs:208:13:210:13 | {...} | Finally.cs:195:10:195:12 | M10 | -| Finally.cs:209:17:209:47 | [finally(1): exception(Exception)] if (...) ... | Finally.cs:195:10:195:12 | M10 | -| Finally.cs:209:17:209:47 | [finally(1): exception(ExceptionB)] if (...) ... | Finally.cs:195:10:195:12 | M10 | -| Finally.cs:209:17:209:47 | [finally: exception(Exception), finally(1): exception(Exception)] if (...) ... | Finally.cs:195:10:195:12 | M10 | -| Finally.cs:209:17:209:47 | [finally: exception(Exception), finally(1): exception(ExceptionB)] if (...) ... | Finally.cs:195:10:195:12 | M10 | -| Finally.cs:209:17:209:47 | [finally: exception(Exception)] if (...) ... | Finally.cs:195:10:195:12 | M10 | -| Finally.cs:209:17:209:47 | [finally: exception(ExceptionA), finally(1): exception(Exception)] if (...) ... | Finally.cs:195:10:195:12 | M10 | -| Finally.cs:209:17:209:47 | [finally: exception(ExceptionA), finally(1): exception(ExceptionB)] if (...) ... | Finally.cs:195:10:195:12 | M10 | -| Finally.cs:209:17:209:47 | [finally: exception(ExceptionA)] if (...) ... | Finally.cs:195:10:195:12 | M10 | +| Finally.cs:209:17:209:47 | [finally(1): exception] if (...) ... | Finally.cs:195:10:195:12 | M10 | +| Finally.cs:209:17:209:47 | [finally: exception, finally(1): exception] if (...) ... | Finally.cs:195:10:195:12 | M10 | +| Finally.cs:209:17:209:47 | [finally: exception] if (...) ... | Finally.cs:195:10:195:12 | M10 | | Finally.cs:209:17:209:47 | if (...) ... | Finally.cs:195:10:195:12 | M10 | -| Finally.cs:209:21:209:22 | [finally(1): exception(Exception)] access to parameter b3 | Finally.cs:195:10:195:12 | M10 | -| Finally.cs:209:21:209:22 | [finally(1): exception(ExceptionB)] access to parameter b3 | Finally.cs:195:10:195:12 | M10 | -| Finally.cs:209:21:209:22 | [finally: exception(Exception), finally(1): exception(Exception)] access to parameter b3 | Finally.cs:195:10:195:12 | M10 | -| Finally.cs:209:21:209:22 | [finally: exception(Exception), finally(1): exception(ExceptionB)] access to parameter b3 | Finally.cs:195:10:195:12 | M10 | -| Finally.cs:209:21:209:22 | [finally: exception(Exception)] access to parameter b3 | Finally.cs:195:10:195:12 | M10 | -| Finally.cs:209:21:209:22 | [finally: exception(ExceptionA), finally(1): exception(Exception)] access to parameter b3 | Finally.cs:195:10:195:12 | M10 | -| Finally.cs:209:21:209:22 | [finally: exception(ExceptionA), finally(1): exception(ExceptionB)] access to parameter b3 | Finally.cs:195:10:195:12 | M10 | -| Finally.cs:209:21:209:22 | [finally: exception(ExceptionA)] access to parameter b3 | Finally.cs:195:10:195:12 | M10 | +| Finally.cs:209:21:209:22 | [finally(1): exception] access to parameter b3 | Finally.cs:195:10:195:12 | M10 | +| Finally.cs:209:21:209:22 | [finally: exception, finally(1): exception] access to parameter b3 | Finally.cs:195:10:195:12 | M10 | +| Finally.cs:209:21:209:22 | [finally: exception] access to parameter b3 | Finally.cs:195:10:195:12 | M10 | | Finally.cs:209:21:209:22 | access to parameter b3 | Finally.cs:195:10:195:12 | M10 | -| Finally.cs:209:25:209:47 | [finally(1): exception(Exception)] throw ...; | Finally.cs:195:10:195:12 | M10 | -| Finally.cs:209:25:209:47 | [finally(1): exception(ExceptionB)] throw ...; | Finally.cs:195:10:195:12 | M10 | -| Finally.cs:209:25:209:47 | [finally: exception(Exception), finally(1): exception(Exception)] throw ...; | Finally.cs:195:10:195:12 | M10 | -| Finally.cs:209:25:209:47 | [finally: exception(Exception), finally(1): exception(ExceptionB)] throw ...; | Finally.cs:195:10:195:12 | M10 | -| Finally.cs:209:25:209:47 | [finally: exception(Exception)] throw ...; | Finally.cs:195:10:195:12 | M10 | -| Finally.cs:209:25:209:47 | [finally: exception(ExceptionA), finally(1): exception(Exception)] throw ...; | Finally.cs:195:10:195:12 | M10 | -| Finally.cs:209:25:209:47 | [finally: exception(ExceptionA), finally(1): exception(ExceptionB)] throw ...; | Finally.cs:195:10:195:12 | M10 | -| Finally.cs:209:25:209:47 | [finally: exception(ExceptionA)] throw ...; | Finally.cs:195:10:195:12 | M10 | +| Finally.cs:209:25:209:47 | [finally(1): exception] throw ...; | Finally.cs:195:10:195:12 | M10 | +| Finally.cs:209:25:209:47 | [finally: exception, finally(1): exception] throw ...; | Finally.cs:195:10:195:12 | M10 | +| Finally.cs:209:25:209:47 | [finally: exception] throw ...; | Finally.cs:195:10:195:12 | M10 | | Finally.cs:209:25:209:47 | throw ...; | Finally.cs:195:10:195:12 | M10 | -| Finally.cs:209:31:209:46 | [finally(1): exception(Exception)] object creation of type ExceptionC | Finally.cs:195:10:195:12 | M10 | -| Finally.cs:209:31:209:46 | [finally(1): exception(ExceptionB)] object creation of type ExceptionC | Finally.cs:195:10:195:12 | M10 | -| Finally.cs:209:31:209:46 | [finally: exception(Exception), finally(1): exception(Exception)] object creation of type ExceptionC | Finally.cs:195:10:195:12 | M10 | -| Finally.cs:209:31:209:46 | [finally: exception(Exception), finally(1): exception(ExceptionB)] object creation of type ExceptionC | Finally.cs:195:10:195:12 | M10 | -| Finally.cs:209:31:209:46 | [finally: exception(Exception)] object creation of type ExceptionC | Finally.cs:195:10:195:12 | M10 | -| Finally.cs:209:31:209:46 | [finally: exception(ExceptionA), finally(1): exception(Exception)] object creation of type ExceptionC | Finally.cs:195:10:195:12 | M10 | -| Finally.cs:209:31:209:46 | [finally: exception(ExceptionA), finally(1): exception(ExceptionB)] object creation of type ExceptionC | Finally.cs:195:10:195:12 | M10 | -| Finally.cs:209:31:209:46 | [finally: exception(ExceptionA)] object creation of type ExceptionC | Finally.cs:195:10:195:12 | M10 | +| Finally.cs:209:31:209:46 | [finally(1): exception] object creation of type ExceptionC | Finally.cs:195:10:195:12 | M10 | +| Finally.cs:209:31:209:46 | [finally: exception, finally(1): exception] object creation of type ExceptionC | Finally.cs:195:10:195:12 | M10 | +| Finally.cs:209:31:209:46 | [finally: exception] object creation of type ExceptionC | Finally.cs:195:10:195:12 | M10 | | Finally.cs:209:31:209:46 | object creation of type ExceptionC | Finally.cs:195:10:195:12 | M10 | -| Finally.cs:211:13:211:16 | [finally: exception(Exception)] this access | Finally.cs:195:10:195:12 | M10 | -| Finally.cs:211:13:211:16 | [finally: exception(ExceptionA)] this access | Finally.cs:195:10:195:12 | M10 | +| Finally.cs:211:13:211:16 | [finally: exception] this access | Finally.cs:195:10:195:12 | M10 | | Finally.cs:211:13:211:16 | this access | Finally.cs:195:10:195:12 | M10 | | Finally.cs:211:13:211:28 | ... = ... | Finally.cs:195:10:195:12 | M10 | -| Finally.cs:211:13:211:28 | [finally: exception(Exception)] ... = ... | Finally.cs:195:10:195:12 | M10 | -| Finally.cs:211:13:211:28 | [finally: exception(ExceptionA)] ... = ... | Finally.cs:195:10:195:12 | M10 | +| Finally.cs:211:13:211:28 | [finally: exception] ... = ... | Finally.cs:195:10:195:12 | M10 | | Finally.cs:211:13:211:29 | ...; | Finally.cs:195:10:195:12 | M10 | -| Finally.cs:211:13:211:29 | [finally: exception(Exception)] ...; | Finally.cs:195:10:195:12 | M10 | -| Finally.cs:211:13:211:29 | [finally: exception(ExceptionA)] ...; | Finally.cs:195:10:195:12 | M10 | +| Finally.cs:211:13:211:29 | [finally: exception] ...; | Finally.cs:195:10:195:12 | M10 | | Finally.cs:211:26:211:28 | "0" | Finally.cs:195:10:195:12 | M10 | -| Finally.cs:211:26:211:28 | [finally: exception(Exception)] "0" | Finally.cs:195:10:195:12 | M10 | -| Finally.cs:211:26:211:28 | [finally: exception(ExceptionA)] "0" | Finally.cs:195:10:195:12 | M10 | +| Finally.cs:211:26:211:28 | [finally: exception] "0" | Finally.cs:195:10:195:12 | M10 | | Finally.cs:213:9:213:12 | this access | Finally.cs:195:10:195:12 | M10 | | Finally.cs:213:9:213:24 | ... = ... | Finally.cs:195:10:195:12 | M10 | | Finally.cs:213:9:213:25 | ...; | Finally.cs:195:10:195:12 | M10 | @@ -2565,78 +2427,47 @@ nodeEnclosing | Finally.cs:239:21:239:22 | access to parameter b1 | Finally.cs:233:10:233:12 | M12 | | Finally.cs:240:21:240:43 | throw ...; | Finally.cs:233:10:233:12 | M12 | | Finally.cs:240:27:240:42 | object creation of type ExceptionA | Finally.cs:233:10:233:12 | M12 | -| Finally.cs:243:13:253:13 | [finally: exception(Exception)] {...} | Finally.cs:233:10:233:12 | M12 | -| Finally.cs:243:13:253:13 | [finally: exception(ExceptionA)] {...} | Finally.cs:233:10:233:12 | M12 | +| Finally.cs:243:13:253:13 | [finally: exception] {...} | Finally.cs:233:10:233:12 | M12 | | Finally.cs:243:13:253:13 | {...} | Finally.cs:233:10:233:12 | M12 | -| Finally.cs:244:17:252:17 | [finally: exception(Exception)] try {...} ... | Finally.cs:233:10:233:12 | M12 | -| Finally.cs:244:17:252:17 | [finally: exception(ExceptionA)] try {...} ... | Finally.cs:233:10:233:12 | M12 | +| Finally.cs:244:17:252:17 | [finally: exception] try {...} ... | Finally.cs:233:10:233:12 | M12 | | Finally.cs:244:17:252:17 | try {...} ... | Finally.cs:233:10:233:12 | M12 | -| Finally.cs:245:17:248:17 | [finally: exception(Exception)] {...} | Finally.cs:233:10:233:12 | M12 | -| Finally.cs:245:17:248:17 | [finally: exception(ExceptionA)] {...} | Finally.cs:233:10:233:12 | M12 | +| Finally.cs:245:17:248:17 | [finally: exception] {...} | Finally.cs:233:10:233:12 | M12 | | Finally.cs:245:17:248:17 | {...} | Finally.cs:233:10:233:12 | M12 | -| Finally.cs:246:21:247:47 | [finally: exception(Exception)] if (...) ... | Finally.cs:233:10:233:12 | M12 | -| Finally.cs:246:21:247:47 | [finally: exception(ExceptionA)] if (...) ... | Finally.cs:233:10:233:12 | M12 | +| Finally.cs:246:21:247:47 | [finally: exception] if (...) ... | Finally.cs:233:10:233:12 | M12 | | Finally.cs:246:21:247:47 | if (...) ... | Finally.cs:233:10:233:12 | M12 | -| Finally.cs:246:25:246:26 | [finally: exception(Exception)] access to parameter b2 | Finally.cs:233:10:233:12 | M12 | -| Finally.cs:246:25:246:26 | [finally: exception(ExceptionA)] access to parameter b2 | Finally.cs:233:10:233:12 | M12 | +| Finally.cs:246:25:246:26 | [finally: exception] access to parameter b2 | Finally.cs:233:10:233:12 | M12 | | Finally.cs:246:25:246:26 | access to parameter b2 | Finally.cs:233:10:233:12 | M12 | -| Finally.cs:247:25:247:47 | [finally: exception(Exception)] throw ...; | Finally.cs:233:10:233:12 | M12 | -| Finally.cs:247:25:247:47 | [finally: exception(ExceptionA)] throw ...; | Finally.cs:233:10:233:12 | M12 | +| Finally.cs:247:25:247:47 | [finally: exception] throw ...; | Finally.cs:233:10:233:12 | M12 | | Finally.cs:247:25:247:47 | throw ...; | Finally.cs:233:10:233:12 | M12 | -| Finally.cs:247:31:247:46 | [finally: exception(Exception)] object creation of type ExceptionA | Finally.cs:233:10:233:12 | M12 | -| Finally.cs:247:31:247:46 | [finally: exception(ExceptionA)] object creation of type ExceptionA | Finally.cs:233:10:233:12 | M12 | +| Finally.cs:247:31:247:46 | [finally: exception] object creation of type ExceptionA | Finally.cs:233:10:233:12 | M12 | | Finally.cs:247:31:247:46 | object creation of type ExceptionA | Finally.cs:233:10:233:12 | M12 | -| Finally.cs:250:17:252:17 | [finally(1): exception(Exception)] {...} | Finally.cs:233:10:233:12 | M12 | -| Finally.cs:250:17:252:17 | [finally(1): exception(ExceptionA)] {...} | Finally.cs:233:10:233:12 | M12 | -| Finally.cs:250:17:252:17 | [finally: exception(Exception), finally(1): exception(Exception)] {...} | Finally.cs:233:10:233:12 | M12 | -| Finally.cs:250:17:252:17 | [finally: exception(Exception), finally(1): exception(ExceptionA)] {...} | Finally.cs:233:10:233:12 | M12 | -| Finally.cs:250:17:252:17 | [finally: exception(Exception)] {...} | Finally.cs:233:10:233:12 | M12 | -| Finally.cs:250:17:252:17 | [finally: exception(ExceptionA), finally(1): exception(Exception)] {...} | Finally.cs:233:10:233:12 | M12 | -| Finally.cs:250:17:252:17 | [finally: exception(ExceptionA), finally(1): exception(ExceptionA)] {...} | Finally.cs:233:10:233:12 | M12 | -| Finally.cs:250:17:252:17 | [finally: exception(ExceptionA)] {...} | Finally.cs:233:10:233:12 | M12 | +| Finally.cs:250:17:252:17 | [finally(1): exception] {...} | Finally.cs:233:10:233:12 | M12 | +| Finally.cs:250:17:252:17 | [finally: exception, finally(1): exception] {...} | Finally.cs:233:10:233:12 | M12 | +| Finally.cs:250:17:252:17 | [finally: exception] {...} | Finally.cs:233:10:233:12 | M12 | | Finally.cs:250:17:252:17 | {...} | Finally.cs:233:10:233:12 | M12 | -| Finally.cs:251:21:251:54 | [finally(1): exception(Exception)] call to method WriteLine | Finally.cs:233:10:233:12 | M12 | -| Finally.cs:251:21:251:54 | [finally(1): exception(ExceptionA)] call to method WriteLine | Finally.cs:233:10:233:12 | M12 | -| Finally.cs:251:21:251:54 | [finally: exception(Exception), finally(1): exception(Exception)] call to method WriteLine | Finally.cs:233:10:233:12 | M12 | -| Finally.cs:251:21:251:54 | [finally: exception(Exception), finally(1): exception(ExceptionA)] call to method WriteLine | Finally.cs:233:10:233:12 | M12 | -| Finally.cs:251:21:251:54 | [finally: exception(Exception)] call to method WriteLine | Finally.cs:233:10:233:12 | M12 | -| Finally.cs:251:21:251:54 | [finally: exception(ExceptionA), finally(1): exception(Exception)] call to method WriteLine | Finally.cs:233:10:233:12 | M12 | -| Finally.cs:251:21:251:54 | [finally: exception(ExceptionA), finally(1): exception(ExceptionA)] call to method WriteLine | Finally.cs:233:10:233:12 | M12 | -| Finally.cs:251:21:251:54 | [finally: exception(ExceptionA)] call to method WriteLine | Finally.cs:233:10:233:12 | M12 | +| Finally.cs:251:21:251:54 | [finally(1): exception] call to method WriteLine | Finally.cs:233:10:233:12 | M12 | +| Finally.cs:251:21:251:54 | [finally: exception, finally(1): exception] call to method WriteLine | Finally.cs:233:10:233:12 | M12 | +| Finally.cs:251:21:251:54 | [finally: exception] call to method WriteLine | Finally.cs:233:10:233:12 | M12 | | Finally.cs:251:21:251:54 | call to method WriteLine | Finally.cs:233:10:233:12 | M12 | | Finally.cs:251:21:251:55 | ...; | Finally.cs:233:10:233:12 | M12 | -| Finally.cs:251:21:251:55 | [finally(1): exception(Exception)] ...; | Finally.cs:233:10:233:12 | M12 | -| Finally.cs:251:21:251:55 | [finally(1): exception(ExceptionA)] ...; | Finally.cs:233:10:233:12 | M12 | -| Finally.cs:251:21:251:55 | [finally: exception(Exception), finally(1): exception(Exception)] ...; | Finally.cs:233:10:233:12 | M12 | -| Finally.cs:251:21:251:55 | [finally: exception(Exception), finally(1): exception(ExceptionA)] ...; | Finally.cs:233:10:233:12 | M12 | -| Finally.cs:251:21:251:55 | [finally: exception(Exception)] ...; | Finally.cs:233:10:233:12 | M12 | -| Finally.cs:251:21:251:55 | [finally: exception(ExceptionA), finally(1): exception(Exception)] ...; | Finally.cs:233:10:233:12 | M12 | -| Finally.cs:251:21:251:55 | [finally: exception(ExceptionA), finally(1): exception(ExceptionA)] ...; | Finally.cs:233:10:233:12 | M12 | -| Finally.cs:251:21:251:55 | [finally: exception(ExceptionA)] ...; | Finally.cs:233:10:233:12 | M12 | +| Finally.cs:251:21:251:55 | [finally(1): exception] ...; | Finally.cs:233:10:233:12 | M12 | +| Finally.cs:251:21:251:55 | [finally: exception, finally(1): exception] ...; | Finally.cs:233:10:233:12 | M12 | +| Finally.cs:251:21:251:55 | [finally: exception] ...; | Finally.cs:233:10:233:12 | M12 | | Finally.cs:251:39:251:53 | "Inner finally" | Finally.cs:233:10:233:12 | M12 | -| Finally.cs:251:39:251:53 | [finally(1): exception(Exception)] "Inner finally" | Finally.cs:233:10:233:12 | M12 | -| Finally.cs:251:39:251:53 | [finally(1): exception(ExceptionA)] "Inner finally" | Finally.cs:233:10:233:12 | M12 | -| Finally.cs:251:39:251:53 | [finally: exception(Exception), finally(1): exception(Exception)] "Inner finally" | Finally.cs:233:10:233:12 | M12 | -| Finally.cs:251:39:251:53 | [finally: exception(Exception), finally(1): exception(ExceptionA)] "Inner finally" | Finally.cs:233:10:233:12 | M12 | -| Finally.cs:251:39:251:53 | [finally: exception(Exception)] "Inner finally" | Finally.cs:233:10:233:12 | M12 | -| Finally.cs:251:39:251:53 | [finally: exception(ExceptionA), finally(1): exception(Exception)] "Inner finally" | Finally.cs:233:10:233:12 | M12 | -| Finally.cs:251:39:251:53 | [finally: exception(ExceptionA), finally(1): exception(ExceptionA)] "Inner finally" | Finally.cs:233:10:233:12 | M12 | -| Finally.cs:251:39:251:53 | [finally: exception(ExceptionA)] "Inner finally" | Finally.cs:233:10:233:12 | M12 | +| Finally.cs:251:39:251:53 | [finally(1): exception] "Inner finally" | Finally.cs:233:10:233:12 | M12 | +| Finally.cs:251:39:251:53 | [finally: exception, finally(1): exception] "Inner finally" | Finally.cs:233:10:233:12 | M12 | +| Finally.cs:251:39:251:53 | [finally: exception] "Inner finally" | Finally.cs:233:10:233:12 | M12 | | Finally.cs:254:13:254:44 | call to method WriteLine | Finally.cs:233:10:233:12 | M12 | | Finally.cs:254:13:254:45 | ...; | Finally.cs:233:10:233:12 | M12 | | Finally.cs:254:31:254:43 | "Mid finally" | Finally.cs:233:10:233:12 | M12 | -| Finally.cs:257:9:259:9 | [finally: exception(Exception)] {...} | Finally.cs:233:10:233:12 | M12 | -| Finally.cs:257:9:259:9 | [finally: exception(ExceptionA)] {...} | Finally.cs:233:10:233:12 | M12 | +| Finally.cs:257:9:259:9 | [finally: exception] {...} | Finally.cs:233:10:233:12 | M12 | | Finally.cs:257:9:259:9 | {...} | Finally.cs:233:10:233:12 | M12 | -| Finally.cs:258:13:258:46 | [finally: exception(Exception)] call to method WriteLine | Finally.cs:233:10:233:12 | M12 | -| Finally.cs:258:13:258:46 | [finally: exception(ExceptionA)] call to method WriteLine | Finally.cs:233:10:233:12 | M12 | +| Finally.cs:258:13:258:46 | [finally: exception] call to method WriteLine | Finally.cs:233:10:233:12 | M12 | | Finally.cs:258:13:258:46 | call to method WriteLine | Finally.cs:233:10:233:12 | M12 | | Finally.cs:258:13:258:47 | ...; | Finally.cs:233:10:233:12 | M12 | -| Finally.cs:258:13:258:47 | [finally: exception(Exception)] ...; | Finally.cs:233:10:233:12 | M12 | -| Finally.cs:258:13:258:47 | [finally: exception(ExceptionA)] ...; | Finally.cs:233:10:233:12 | M12 | +| Finally.cs:258:13:258:47 | [finally: exception] ...; | Finally.cs:233:10:233:12 | M12 | | Finally.cs:258:31:258:45 | "Outer finally" | Finally.cs:233:10:233:12 | M12 | -| Finally.cs:258:31:258:45 | [finally: exception(Exception)] "Outer finally" | Finally.cs:233:10:233:12 | M12 | -| Finally.cs:258:31:258:45 | [finally: exception(ExceptionA)] "Outer finally" | Finally.cs:233:10:233:12 | M12 | +| Finally.cs:258:31:258:45 | [finally: exception] "Outer finally" | Finally.cs:233:10:233:12 | M12 | | Finally.cs:260:9:260:33 | call to method WriteLine | Finally.cs:233:10:233:12 | M12 | | Finally.cs:260:9:260:34 | ...; | Finally.cs:233:10:233:12 | M12 | | Finally.cs:260:27:260:32 | "Done" | Finally.cs:233:10:233:12 | M12 | @@ -2650,24 +2481,24 @@ nodeEnclosing | Finally.cs:267:13:267:34 | call to method WriteLine | Finally.cs:263:10:263:12 | M13 | | Finally.cs:267:13:267:35 | ...; | Finally.cs:263:10:263:12 | M13 | | Finally.cs:267:31:267:33 | "1" | Finally.cs:263:10:263:12 | M13 | -| Finally.cs:270:9:273:9 | [finally: exception(Exception)] {...} | Finally.cs:263:10:263:12 | M13 | +| Finally.cs:270:9:273:9 | [finally: exception] {...} | Finally.cs:263:10:263:12 | M13 | | Finally.cs:270:9:273:9 | {...} | Finally.cs:263:10:263:12 | M13 | -| Finally.cs:271:13:271:34 | [finally: exception(Exception)] call to method WriteLine | Finally.cs:263:10:263:12 | M13 | +| Finally.cs:271:13:271:34 | [finally: exception] call to method WriteLine | Finally.cs:263:10:263:12 | M13 | | Finally.cs:271:13:271:34 | call to method WriteLine | Finally.cs:263:10:263:12 | M13 | | Finally.cs:271:13:271:35 | ...; | Finally.cs:263:10:263:12 | M13 | -| Finally.cs:271:13:271:35 | [finally: exception(Exception)] ...; | Finally.cs:263:10:263:12 | M13 | +| Finally.cs:271:13:271:35 | [finally: exception] ...; | Finally.cs:263:10:263:12 | M13 | | Finally.cs:271:31:271:33 | "3" | Finally.cs:263:10:263:12 | M13 | -| Finally.cs:271:31:271:33 | [finally: exception(Exception)] "3" | Finally.cs:263:10:263:12 | M13 | -| Finally.cs:272:13:272:13 | [finally: exception(Exception)] access to parameter i | Finally.cs:263:10:263:12 | M13 | +| Finally.cs:271:31:271:33 | [finally: exception] "3" | Finally.cs:263:10:263:12 | M13 | +| Finally.cs:272:13:272:13 | [finally: exception] access to parameter i | Finally.cs:263:10:263:12 | M13 | | Finally.cs:272:13:272:13 | access to parameter i | Finally.cs:263:10:263:12 | M13 | | Finally.cs:272:13:272:18 | ... + ... | Finally.cs:263:10:263:12 | M13 | | Finally.cs:272:13:272:18 | ... = ... | Finally.cs:263:10:263:12 | M13 | -| Finally.cs:272:13:272:18 | [finally: exception(Exception)] ... + ... | Finally.cs:263:10:263:12 | M13 | -| Finally.cs:272:13:272:18 | [finally: exception(Exception)] ... = ... | Finally.cs:263:10:263:12 | M13 | +| Finally.cs:272:13:272:18 | [finally: exception] ... + ... | Finally.cs:263:10:263:12 | M13 | +| Finally.cs:272:13:272:18 | [finally: exception] ... = ... | Finally.cs:263:10:263:12 | M13 | | Finally.cs:272:13:272:19 | ...; | Finally.cs:263:10:263:12 | M13 | -| Finally.cs:272:13:272:19 | [finally: exception(Exception)] ...; | Finally.cs:263:10:263:12 | M13 | +| Finally.cs:272:13:272:19 | [finally: exception] ...; | Finally.cs:263:10:263:12 | M13 | | Finally.cs:272:18:272:18 | 3 | Finally.cs:263:10:263:12 | M13 | -| Finally.cs:272:18:272:18 | [finally: exception(Exception)] 3 | Finally.cs:263:10:263:12 | M13 | +| Finally.cs:272:18:272:18 | [finally: exception] 3 | Finally.cs:263:10:263:12 | M13 | | Foreach.cs:4:7:4:13 | call to constructor Object | Foreach.cs:4:7:4:13 | Foreach | | Foreach.cs:4:7:4:13 | enter Foreach | Foreach.cs:4:7:4:13 | Foreach | | Foreach.cs:4:7:4:13 | exit Foreach | Foreach.cs:4:7:4:13 | Foreach | @@ -5296,11 +5127,10 @@ blockEnclosing | Finally.cs:3:14:3:20 | enter Finally | Finally.cs:3:14:3:20 | Finally | | Finally.cs:7:10:7:11 | enter M1 | Finally.cs:7:10:7:11 | M1 | | Finally.cs:7:10:7:11 | exit M1 | Finally.cs:7:10:7:11 | M1 | -| Finally.cs:14:9:16:9 | [finally: exception(Exception)] {...} | Finally.cs:7:10:7:11 | M1 | +| Finally.cs:14:9:16:9 | [finally: exception] {...} | Finally.cs:7:10:7:11 | M1 | | Finally.cs:14:9:16:9 | {...} | Finally.cs:7:10:7:11 | M1 | | Finally.cs:19:10:19:11 | enter M2 | Finally.cs:19:10:19:11 | M2 | | Finally.cs:19:10:19:11 | exit M2 | Finally.cs:19:10:19:11 | M2 | -| Finally.cs:19:10:19:11 | exit M2 (abnormal) | Finally.cs:19:10:19:11 | M2 | | Finally.cs:19:10:19:11 | exit M2 (normal) | Finally.cs:19:10:19:11 | M2 | | Finally.cs:24:13:24:19 | return ...; | Finally.cs:19:10:19:11 | M2 | | Finally.cs:26:9:29:9 | [exception: Exception] catch (...) {...} | Finally.cs:19:10:19:11 | M2 | @@ -5311,9 +5141,9 @@ blockEnclosing | Finally.cs:34:27:34:32 | throw ...; | Finally.cs:19:10:19:11 | M2 | | Finally.cs:41:9:43:9 | [exception: Exception] catch (...) {...} | Finally.cs:19:10:19:11 | M2 | | Finally.cs:42:9:43:9 | {...} | Finally.cs:19:10:19:11 | M2 | +| Finally.cs:49:9:51:9 | [finally: exception] {...} | Finally.cs:19:10:19:11 | M2 | | Finally.cs:54:10:54:11 | enter M3 | Finally.cs:54:10:54:11 | M3 | | Finally.cs:54:10:54:11 | exit M3 | Finally.cs:54:10:54:11 | M3 | -| Finally.cs:54:10:54:11 | exit M3 (abnormal) | Finally.cs:54:10:54:11 | M3 | | Finally.cs:54:10:54:11 | exit M3 (normal) | Finally.cs:54:10:54:11 | M3 | | Finally.cs:59:13:59:19 | return ...; | Finally.cs:54:10:54:11 | M3 | | Finally.cs:61:9:64:9 | [exception: Exception] catch (...) {...} | Finally.cs:54:10:54:11 | M3 | @@ -5322,7 +5152,7 @@ blockEnclosing | Finally.cs:65:9:67:9 | [exception: Exception] catch (...) {...} | Finally.cs:54:10:54:11 | M3 | | Finally.cs:65:26:65:26 | [exception: Exception] Exception e | Finally.cs:54:10:54:11 | M3 | | Finally.cs:66:9:67:9 | {...} | Finally.cs:54:10:54:11 | M3 | -| Finally.cs:69:9:71:9 | [finally: exception(Exception)] {...} | Finally.cs:54:10:54:11 | M3 | +| Finally.cs:69:9:71:9 | [finally: exception] {...} | Finally.cs:54:10:54:11 | M3 | | Finally.cs:74:10:74:11 | enter M4 | Finally.cs:74:10:74:11 | M4 | | Finally.cs:74:10:74:11 | exit M4 | Finally.cs:74:10:74:11 | M4 | | Finally.cs:74:10:74:11 | exit M4 (abnormal) | Finally.cs:74:10:74:11 | M4 | @@ -5343,12 +5173,12 @@ blockEnclosing | Finally.cs:93:31:93:45 | [finally: continue] object creation of type Exception | Finally.cs:74:10:74:11 | M4 | | Finally.cs:93:31:93:45 | [finally: return] object creation of type Exception | Finally.cs:74:10:74:11 | M4 | | Finally.cs:93:31:93:45 | object creation of type Exception | Finally.cs:74:10:74:11 | M4 | -| Finally.cs:96:17:98:17 | [finally(1): exception(Exception)] {...} | Finally.cs:74:10:74:11 | M4 | -| Finally.cs:96:17:98:17 | [finally: break, finally(1): exception(Exception)] {...} | Finally.cs:74:10:74:11 | M4 | +| Finally.cs:96:17:98:17 | [finally(1): exception] {...} | Finally.cs:74:10:74:11 | M4 | +| Finally.cs:96:17:98:17 | [finally: break, finally(1): exception] {...} | Finally.cs:74:10:74:11 | M4 | | Finally.cs:96:17:98:17 | [finally: break] {...} | Finally.cs:74:10:74:11 | M4 | -| Finally.cs:96:17:98:17 | [finally: continue, finally(1): exception(Exception)] {...} | Finally.cs:74:10:74:11 | M4 | +| Finally.cs:96:17:98:17 | [finally: continue, finally(1): exception] {...} | Finally.cs:74:10:74:11 | M4 | | Finally.cs:96:17:98:17 | [finally: continue] {...} | Finally.cs:74:10:74:11 | M4 | -| Finally.cs:96:17:98:17 | [finally: return, finally(1): exception(Exception)] {...} | Finally.cs:74:10:74:11 | M4 | +| Finally.cs:96:17:98:17 | [finally: return, finally(1): exception] {...} | Finally.cs:74:10:74:11 | M4 | | Finally.cs:96:17:98:17 | [finally: return] {...} | Finally.cs:74:10:74:11 | M4 | | Finally.cs:96:17:98:17 | {...} | Finally.cs:74:10:74:11 | M4 | | Finally.cs:103:10:103:11 | enter M5 | Finally.cs:103:10:103:11 | M5 | @@ -5363,38 +5193,27 @@ blockEnclosing | Finally.cs:109:33:109:33 | 1 | Finally.cs:103:10:103:11 | M5 | | Finally.cs:110:17:110:49 | throw ...; | Finally.cs:103:10:103:11 | M5 | | Finally.cs:110:23:110:48 | object creation of type OutOfMemoryException | Finally.cs:103:10:103:11 | M5 | -| Finally.cs:113:9:118:9 | [finally: exception(Exception)] {...} | Finally.cs:103:10:103:11 | M5 | -| Finally.cs:113:9:118:9 | [finally: exception(NullReferenceException)] {...} | Finally.cs:103:10:103:11 | M5 | +| Finally.cs:113:9:118:9 | [finally: exception] {...} | Finally.cs:103:10:103:11 | M5 | | Finally.cs:113:9:118:9 | {...} | Finally.cs:103:10:103:11 | M5 | -| Finally.cs:114:17:114:36 | [false, finally: exception(Exception)] !... | Finally.cs:103:10:103:11 | M5 | -| Finally.cs:114:17:114:36 | [false, finally: exception(NullReferenceException)] !... | Finally.cs:103:10:103:11 | M5 | -| Finally.cs:114:17:114:36 | [false, finally: exception(OutOfMemoryException)] !... | Finally.cs:103:10:103:11 | M5 | +| Finally.cs:114:17:114:36 | [false, finally: exception] !... | Finally.cs:103:10:103:11 | M5 | | Finally.cs:114:17:114:36 | [false, finally: return] !... | Finally.cs:103:10:103:11 | M5 | | Finally.cs:114:17:114:36 | [false] !... | Finally.cs:103:10:103:11 | M5 | -| Finally.cs:114:17:114:36 | [true, finally: exception(Exception)] !... | Finally.cs:103:10:103:11 | M5 | -| Finally.cs:114:17:114:36 | [true, finally: exception(NullReferenceException)] !... | Finally.cs:103:10:103:11 | M5 | -| Finally.cs:114:17:114:36 | [true, finally: exception(OutOfMemoryException)] !... | Finally.cs:103:10:103:11 | M5 | +| Finally.cs:114:17:114:36 | [true, finally: exception] !... | Finally.cs:103:10:103:11 | M5 | | Finally.cs:114:17:114:36 | [true, finally: return] !... | Finally.cs:103:10:103:11 | M5 | | Finally.cs:114:17:114:36 | [true] !... | Finally.cs:103:10:103:11 | M5 | | Finally.cs:115:17:115:41 | ...; | Finally.cs:103:10:103:11 | M5 | -| Finally.cs:115:17:115:41 | [finally: exception(Exception)] ...; | Finally.cs:103:10:103:11 | M5 | -| Finally.cs:115:17:115:41 | [finally: exception(NullReferenceException)] ...; | Finally.cs:103:10:103:11 | M5 | -| Finally.cs:115:17:115:41 | [finally: exception(OutOfMemoryException)] ...; | Finally.cs:103:10:103:11 | M5 | +| Finally.cs:115:17:115:41 | [finally: exception] ...; | Finally.cs:103:10:103:11 | M5 | | Finally.cs:115:17:115:41 | [finally: return] ...; | Finally.cs:103:10:103:11 | M5 | -| Finally.cs:116:13:117:37 | [finally: exception(Exception)] if (...) ... | Finally.cs:103:10:103:11 | M5 | -| Finally.cs:116:13:117:37 | [finally: exception(NullReferenceException)] if (...) ... | Finally.cs:103:10:103:11 | M5 | -| Finally.cs:116:13:117:37 | [finally: exception(OutOfMemoryException)] if (...) ... | Finally.cs:103:10:103:11 | M5 | +| Finally.cs:116:13:117:37 | [finally: exception] if (...) ... | Finally.cs:103:10:103:11 | M5 | | Finally.cs:116:13:117:37 | [finally: return] if (...) ... | Finally.cs:103:10:103:11 | M5 | | Finally.cs:116:13:117:37 | if (...) ... | Finally.cs:103:10:103:11 | M5 | | Finally.cs:117:17:117:37 | ...; | Finally.cs:103:10:103:11 | M5 | -| Finally.cs:117:17:117:37 | [finally: exception(Exception)] ...; | Finally.cs:103:10:103:11 | M5 | -| Finally.cs:117:17:117:37 | [finally: exception(NullReferenceException)] ...; | Finally.cs:103:10:103:11 | M5 | -| Finally.cs:117:17:117:37 | [finally: exception(OutOfMemoryException)] ...; | Finally.cs:103:10:103:11 | M5 | +| Finally.cs:117:17:117:37 | [finally: exception] ...; | Finally.cs:103:10:103:11 | M5 | | Finally.cs:117:17:117:37 | [finally: return] ...; | Finally.cs:103:10:103:11 | M5 | | Finally.cs:121:10:121:11 | enter M6 | Finally.cs:121:10:121:11 | M6 | | Finally.cs:133:10:133:11 | enter M7 | Finally.cs:133:10:133:11 | M7 | | Finally.cs:133:10:133:11 | exit M7 (abnormal) | Finally.cs:133:10:133:11 | M7 | -| Finally.cs:140:9:143:9 | [finally: exception(Exception)] {...} | Finally.cs:133:10:133:11 | M7 | +| Finally.cs:140:9:143:9 | [finally: exception] {...} | Finally.cs:133:10:133:11 | M7 | | Finally.cs:140:9:143:9 | {...} | Finally.cs:133:10:133:11 | M7 | | Finally.cs:147:10:147:11 | enter M8 | Finally.cs:147:10:147:11 | M8 | | Finally.cs:147:10:147:11 | exit M8 | Finally.cs:147:10:147:11 | M8 | @@ -5402,34 +5221,25 @@ blockEnclosing | Finally.cs:147:10:147:11 | exit M8 (normal) | Finally.cs:147:10:147:11 | M8 | | Finally.cs:152:17:152:50 | throw ...; | Finally.cs:147:10:147:11 | M8 | | Finally.cs:152:23:152:49 | object creation of type ArgumentNullException | Finally.cs:147:10:147:11 | M8 | -| Finally.cs:155:9:169:9 | [finally: exception(Exception)] {...} | Finally.cs:147:10:147:11 | M8 | +| Finally.cs:155:9:169:9 | [finally: exception] {...} | Finally.cs:147:10:147:11 | M8 | | Finally.cs:155:9:169:9 | {...} | Finally.cs:147:10:147:11 | M8 | | Finally.cs:158:36:158:36 | 1 | Finally.cs:147:10:147:11 | M8 | -| Finally.cs:158:36:158:36 | [finally: exception(ArgumentNullException)] 1 | Finally.cs:147:10:147:11 | M8 | -| Finally.cs:158:36:158:36 | [finally: exception(Exception)] 1 | Finally.cs:147:10:147:11 | M8 | -| Finally.cs:159:21:159:45 | [finally: exception(ArgumentNullException)] throw ...; | Finally.cs:147:10:147:11 | M8 | -| Finally.cs:159:21:159:45 | [finally: exception(Exception)] throw ...; | Finally.cs:147:10:147:11 | M8 | +| Finally.cs:158:36:158:36 | [finally: exception] 1 | Finally.cs:147:10:147:11 | M8 | +| Finally.cs:159:21:159:45 | [finally: exception] throw ...; | Finally.cs:147:10:147:11 | M8 | | Finally.cs:159:21:159:45 | throw ...; | Finally.cs:147:10:147:11 | M8 | | Finally.cs:159:41:159:43 | "1" | Finally.cs:147:10:147:11 | M8 | -| Finally.cs:159:41:159:43 | [finally: exception(ArgumentNullException)] "1" | Finally.cs:147:10:147:11 | M8 | -| Finally.cs:159:41:159:43 | [finally: exception(Exception)] "1" | Finally.cs:147:10:147:11 | M8 | +| Finally.cs:159:41:159:43 | [finally: exception] "1" | Finally.cs:147:10:147:11 | M8 | | Finally.cs:161:13:164:13 | [exception: Exception] catch (...) {...} | Finally.cs:147:10:147:11 | M8 | | Finally.cs:161:13:164:13 | [exception: NullReferenceException] catch (...) {...} | Finally.cs:147:10:147:11 | M8 | -| Finally.cs:161:13:164:13 | [finally: exception(ArgumentNullException), exception: Exception] catch (...) {...} | Finally.cs:147:10:147:11 | M8 | -| Finally.cs:161:13:164:13 | [finally: exception(ArgumentNullException), exception: NullReferenceException] catch (...) {...} | Finally.cs:147:10:147:11 | M8 | -| Finally.cs:161:13:164:13 | [finally: exception(Exception), exception: Exception] catch (...) {...} | Finally.cs:147:10:147:11 | M8 | -| Finally.cs:161:13:164:13 | [finally: exception(Exception), exception: NullReferenceException] catch (...) {...} | Finally.cs:147:10:147:11 | M8 | +| Finally.cs:161:13:164:13 | [finally: exception, exception: Exception] catch (...) {...} | Finally.cs:147:10:147:11 | M8 | +| Finally.cs:161:13:164:13 | [finally: exception, exception: NullReferenceException] catch (...) {...} | Finally.cs:147:10:147:11 | M8 | | Finally.cs:161:30:161:30 | [exception: Exception] Exception e | Finally.cs:147:10:147:11 | M8 | | Finally.cs:161:30:161:30 | [exception: NullReferenceException] Exception e | Finally.cs:147:10:147:11 | M8 | -| Finally.cs:161:30:161:30 | [finally: exception(ArgumentNullException), exception: Exception] Exception e | Finally.cs:147:10:147:11 | M8 | -| Finally.cs:161:30:161:30 | [finally: exception(ArgumentNullException), exception: NullReferenceException] Exception e | Finally.cs:147:10:147:11 | M8 | -| Finally.cs:161:30:161:30 | [finally: exception(Exception), exception: Exception] Exception e | Finally.cs:147:10:147:11 | M8 | -| Finally.cs:161:30:161:30 | [finally: exception(Exception), exception: NullReferenceException] Exception e | Finally.cs:147:10:147:11 | M8 | -| Finally.cs:162:13:164:13 | [finally: exception(ArgumentNullException)] {...} | Finally.cs:147:10:147:11 | M8 | -| Finally.cs:162:13:164:13 | [finally: exception(Exception)] {...} | Finally.cs:147:10:147:11 | M8 | +| Finally.cs:161:30:161:30 | [finally: exception, exception: Exception] Exception e | Finally.cs:147:10:147:11 | M8 | +| Finally.cs:161:30:161:30 | [finally: exception, exception: NullReferenceException] Exception e | Finally.cs:147:10:147:11 | M8 | +| Finally.cs:162:13:164:13 | [finally: exception] {...} | Finally.cs:147:10:147:11 | M8 | | Finally.cs:162:13:164:13 | {...} | Finally.cs:147:10:147:11 | M8 | -| Finally.cs:165:13:168:13 | [finally: exception(ArgumentNullException)] catch {...} | Finally.cs:147:10:147:11 | M8 | -| Finally.cs:165:13:168:13 | [finally: exception(Exception)] catch {...} | Finally.cs:147:10:147:11 | M8 | +| Finally.cs:165:13:168:13 | [finally: exception] catch {...} | Finally.cs:147:10:147:11 | M8 | | Finally.cs:165:13:168:13 | catch {...} | Finally.cs:147:10:147:11 | M8 | | Finally.cs:172:11:172:20 | enter ExceptionA | Finally.cs:172:11:172:20 | ExceptionA | | Finally.cs:173:11:173:20 | enter ExceptionB | Finally.cs:173:11:173:20 | ExceptionB | @@ -5441,86 +5251,63 @@ blockEnclosing | Finally.cs:180:21:180:43 | [b1 (line 176): true] throw ...; | Finally.cs:176:10:176:11 | M9 | | Finally.cs:180:27:180:42 | [b1 (line 176): true] object creation of type ExceptionA | Finally.cs:176:10:176:11 | M9 | | Finally.cs:183:9:192:9 | [b1 (line 176): false] {...} | Finally.cs:176:10:176:11 | M9 | -| Finally.cs:183:9:192:9 | [finally: exception(Exception), b1 (line 176): true] {...} | Finally.cs:176:10:176:11 | M9 | +| Finally.cs:183:9:192:9 | [finally: exception, b1 (line 176): true] {...} | Finally.cs:176:10:176:11 | M9 | | Finally.cs:186:25:186:47 | [b1 (line 176): false, b2 (line 176): true] throw ...; | Finally.cs:176:10:176:11 | M9 | -| Finally.cs:186:25:186:47 | [finally: exception(Exception), b1 (line 176): true, b2 (line 176): true] throw ...; | Finally.cs:176:10:176:11 | M9 | -| Finally.cs:186:25:186:47 | [finally: exception(ExceptionA), b1 (line 176): true, b2 (line 176): true] throw ...; | Finally.cs:176:10:176:11 | M9 | +| Finally.cs:186:25:186:47 | [finally: exception, b1 (line 176): true, b2 (line 176): true] throw ...; | Finally.cs:176:10:176:11 | M9 | | Finally.cs:186:31:186:46 | [b1 (line 176): false, b2 (line 176): true] object creation of type ExceptionB | Finally.cs:176:10:176:11 | M9 | -| Finally.cs:186:31:186:46 | [finally: exception(Exception), b1 (line 176): true, b2 (line 176): true] object creation of type ExceptionB | Finally.cs:176:10:176:11 | M9 | -| Finally.cs:186:31:186:46 | [finally: exception(ExceptionA), b1 (line 176): true, b2 (line 176): true] object creation of type ExceptionB | Finally.cs:176:10:176:11 | M9 | +| Finally.cs:186:31:186:46 | [finally: exception, b1 (line 176): true, b2 (line 176): true] object creation of type ExceptionB | Finally.cs:176:10:176:11 | M9 | | Finally.cs:188:13:191:13 | [exception: Exception, b1 (line 176): false, b2 (line 176): true] catch (...) {...} | Finally.cs:176:10:176:11 | M9 | -| Finally.cs:188:13:191:13 | [finally: exception(Exception), exception: Exception, b1 (line 176): true, b2 (line 176): true] catch (...) {...} | Finally.cs:176:10:176:11 | M9 | -| Finally.cs:188:13:191:13 | [finally: exception(ExceptionA), exception: Exception, b1 (line 176): true, b2 (line 176): true] catch (...) {...} | Finally.cs:176:10:176:11 | M9 | +| Finally.cs:188:13:191:13 | [finally: exception, exception: Exception, b1 (line 176): true, b2 (line 176): true] catch (...) {...} | Finally.cs:176:10:176:11 | M9 | | Finally.cs:188:38:188:39 | [exception: Exception, b1 (line 176): false, b2 (line 176): true] access to parameter b2 | Finally.cs:176:10:176:11 | M9 | | Finally.cs:188:38:188:39 | [exception: ExceptionB, b1 (line 176): false, b2 (line 176): true] access to parameter b2 | Finally.cs:176:10:176:11 | M9 | -| Finally.cs:188:38:188:39 | [finally: exception(Exception), exception: Exception, b1 (line 176): true, b2 (line 176): true] access to parameter b2 | Finally.cs:176:10:176:11 | M9 | -| Finally.cs:188:38:188:39 | [finally: exception(Exception), exception: ExceptionB, b1 (line 176): true, b2 (line 176): true] access to parameter b2 | Finally.cs:176:10:176:11 | M9 | -| Finally.cs:188:38:188:39 | [finally: exception(ExceptionA), exception: Exception, b1 (line 176): true, b2 (line 176): true] access to parameter b2 | Finally.cs:176:10:176:11 | M9 | -| Finally.cs:188:38:188:39 | [finally: exception(ExceptionA), exception: ExceptionB, b1 (line 176): true, b2 (line 176): true] access to parameter b2 | Finally.cs:176:10:176:11 | M9 | +| Finally.cs:188:38:188:39 | [finally: exception, exception: Exception, b1 (line 176): true, b2 (line 176): true] access to parameter b2 | Finally.cs:176:10:176:11 | M9 | +| Finally.cs:188:38:188:39 | [finally: exception, exception: ExceptionB, b1 (line 176): true, b2 (line 176): true] access to parameter b2 | Finally.cs:176:10:176:11 | M9 | | Finally.cs:189:13:191:13 | [b1 (line 176): false] {...} | Finally.cs:176:10:176:11 | M9 | -| Finally.cs:189:13:191:13 | [finally: exception(Exception), b1 (line 176): true] {...} | Finally.cs:176:10:176:11 | M9 | -| Finally.cs:189:13:191:13 | [finally: exception(ExceptionA), b1 (line 176): true] {...} | Finally.cs:176:10:176:11 | M9 | -| Finally.cs:190:31:190:46 | [finally: exception(Exception)] object creation of type ExceptionC | Finally.cs:176:10:176:11 | M9 | -| Finally.cs:190:31:190:46 | [finally: exception(ExceptionA)] object creation of type ExceptionC | Finally.cs:176:10:176:11 | M9 | +| Finally.cs:189:13:191:13 | [finally: exception, b1 (line 176): true] {...} | Finally.cs:176:10:176:11 | M9 | +| Finally.cs:190:31:190:46 | [finally: exception] object creation of type ExceptionC | Finally.cs:176:10:176:11 | M9 | | Finally.cs:195:10:195:12 | enter M10 | Finally.cs:195:10:195:12 | M10 | | Finally.cs:195:10:195:12 | exit M10 | Finally.cs:195:10:195:12 | M10 | | Finally.cs:195:10:195:12 | exit M10 (abnormal) | Finally.cs:195:10:195:12 | M10 | | Finally.cs:199:21:199:43 | throw ...; | Finally.cs:195:10:195:12 | M10 | | Finally.cs:199:27:199:42 | object creation of type ExceptionA | Finally.cs:195:10:195:12 | M10 | -| Finally.cs:202:9:212:9 | [finally: exception(Exception)] {...} | Finally.cs:195:10:195:12 | M10 | +| Finally.cs:202:9:212:9 | [finally: exception] {...} | Finally.cs:195:10:195:12 | M10 | | Finally.cs:202:9:212:9 | {...} | Finally.cs:195:10:195:12 | M10 | -| Finally.cs:205:25:205:47 | [finally: exception(Exception)] throw ...; | Finally.cs:195:10:195:12 | M10 | -| Finally.cs:205:25:205:47 | [finally: exception(ExceptionA)] throw ...; | Finally.cs:195:10:195:12 | M10 | +| Finally.cs:205:25:205:47 | [finally: exception] throw ...; | Finally.cs:195:10:195:12 | M10 | | Finally.cs:205:25:205:47 | throw ...; | Finally.cs:195:10:195:12 | M10 | -| Finally.cs:205:31:205:46 | [finally: exception(Exception)] object creation of type ExceptionB | Finally.cs:195:10:195:12 | M10 | -| Finally.cs:205:31:205:46 | [finally: exception(ExceptionA)] object creation of type ExceptionB | Finally.cs:195:10:195:12 | M10 | +| Finally.cs:205:31:205:46 | [finally: exception] object creation of type ExceptionB | Finally.cs:195:10:195:12 | M10 | | Finally.cs:205:31:205:46 | object creation of type ExceptionB | Finally.cs:195:10:195:12 | M10 | -| Finally.cs:208:13:210:13 | [finally(1): exception(Exception)] {...} | Finally.cs:195:10:195:12 | M10 | -| Finally.cs:208:13:210:13 | [finally: exception(Exception), finally(1): exception(Exception)] {...} | Finally.cs:195:10:195:12 | M10 | -| Finally.cs:208:13:210:13 | [finally: exception(Exception)] {...} | Finally.cs:195:10:195:12 | M10 | -| Finally.cs:208:13:210:13 | [finally: exception(ExceptionA), finally(1): exception(Exception)] {...} | Finally.cs:195:10:195:12 | M10 | -| Finally.cs:208:13:210:13 | [finally: exception(ExceptionA)] {...} | Finally.cs:195:10:195:12 | M10 | +| Finally.cs:208:13:210:13 | [finally(1): exception] {...} | Finally.cs:195:10:195:12 | M10 | +| Finally.cs:208:13:210:13 | [finally: exception, finally(1): exception] {...} | Finally.cs:195:10:195:12 | M10 | +| Finally.cs:208:13:210:13 | [finally: exception] {...} | Finally.cs:195:10:195:12 | M10 | | Finally.cs:208:13:210:13 | {...} | Finally.cs:195:10:195:12 | M10 | -| Finally.cs:209:31:209:46 | [finally(1): exception(Exception)] object creation of type ExceptionC | Finally.cs:195:10:195:12 | M10 | -| Finally.cs:209:31:209:46 | [finally(1): exception(ExceptionB)] object creation of type ExceptionC | Finally.cs:195:10:195:12 | M10 | -| Finally.cs:209:31:209:46 | [finally: exception(Exception), finally(1): exception(Exception)] object creation of type ExceptionC | Finally.cs:195:10:195:12 | M10 | -| Finally.cs:209:31:209:46 | [finally: exception(Exception), finally(1): exception(ExceptionB)] object creation of type ExceptionC | Finally.cs:195:10:195:12 | M10 | -| Finally.cs:209:31:209:46 | [finally: exception(Exception)] object creation of type ExceptionC | Finally.cs:195:10:195:12 | M10 | -| Finally.cs:209:31:209:46 | [finally: exception(ExceptionA), finally(1): exception(Exception)] object creation of type ExceptionC | Finally.cs:195:10:195:12 | M10 | -| Finally.cs:209:31:209:46 | [finally: exception(ExceptionA), finally(1): exception(ExceptionB)] object creation of type ExceptionC | Finally.cs:195:10:195:12 | M10 | -| Finally.cs:209:31:209:46 | [finally: exception(ExceptionA)] object creation of type ExceptionC | Finally.cs:195:10:195:12 | M10 | +| Finally.cs:209:31:209:46 | [finally(1): exception] object creation of type ExceptionC | Finally.cs:195:10:195:12 | M10 | +| Finally.cs:209:31:209:46 | [finally: exception, finally(1): exception] object creation of type ExceptionC | Finally.cs:195:10:195:12 | M10 | +| Finally.cs:209:31:209:46 | [finally: exception] object creation of type ExceptionC | Finally.cs:195:10:195:12 | M10 | | Finally.cs:209:31:209:46 | object creation of type ExceptionC | Finally.cs:195:10:195:12 | M10 | | Finally.cs:211:13:211:29 | ...; | Finally.cs:195:10:195:12 | M10 | -| Finally.cs:211:13:211:29 | [finally: exception(Exception)] ...; | Finally.cs:195:10:195:12 | M10 | -| Finally.cs:211:13:211:29 | [finally: exception(ExceptionA)] ...; | Finally.cs:195:10:195:12 | M10 | +| Finally.cs:211:13:211:29 | [finally: exception] ...; | Finally.cs:195:10:195:12 | M10 | | Finally.cs:216:10:216:12 | enter M11 | Finally.cs:216:10:216:12 | M11 | | Finally.cs:222:9:225:9 | catch {...} | Finally.cs:216:10:216:12 | M11 | | Finally.cs:227:9:229:9 | {...} | Finally.cs:216:10:216:12 | M11 | | Finally.cs:233:10:233:12 | enter M12 | Finally.cs:233:10:233:12 | M12 | | Finally.cs:233:10:233:12 | exit M12 | Finally.cs:233:10:233:12 | M12 | -| Finally.cs:233:10:233:12 | exit M12 (abnormal) | Finally.cs:233:10:233:12 | M12 | | Finally.cs:240:21:240:43 | throw ...; | Finally.cs:233:10:233:12 | M12 | | Finally.cs:240:27:240:42 | object creation of type ExceptionA | Finally.cs:233:10:233:12 | M12 | -| Finally.cs:243:13:253:13 | [finally: exception(Exception)] {...} | Finally.cs:233:10:233:12 | M12 | +| Finally.cs:243:13:253:13 | [finally: exception] {...} | Finally.cs:233:10:233:12 | M12 | | Finally.cs:243:13:253:13 | {...} | Finally.cs:233:10:233:12 | M12 | -| Finally.cs:247:25:247:47 | [finally: exception(Exception)] throw ...; | Finally.cs:233:10:233:12 | M12 | -| Finally.cs:247:25:247:47 | [finally: exception(ExceptionA)] throw ...; | Finally.cs:233:10:233:12 | M12 | +| Finally.cs:247:25:247:47 | [finally: exception] throw ...; | Finally.cs:233:10:233:12 | M12 | | Finally.cs:247:25:247:47 | throw ...; | Finally.cs:233:10:233:12 | M12 | -| Finally.cs:247:31:247:46 | [finally: exception(Exception)] object creation of type ExceptionA | Finally.cs:233:10:233:12 | M12 | -| Finally.cs:247:31:247:46 | [finally: exception(ExceptionA)] object creation of type ExceptionA | Finally.cs:233:10:233:12 | M12 | +| Finally.cs:247:31:247:46 | [finally: exception] object creation of type ExceptionA | Finally.cs:233:10:233:12 | M12 | | Finally.cs:247:31:247:46 | object creation of type ExceptionA | Finally.cs:233:10:233:12 | M12 | -| Finally.cs:250:17:252:17 | [finally(1): exception(Exception)] {...} | Finally.cs:233:10:233:12 | M12 | -| Finally.cs:250:17:252:17 | [finally: exception(Exception), finally(1): exception(Exception)] {...} | Finally.cs:233:10:233:12 | M12 | -| Finally.cs:250:17:252:17 | [finally: exception(Exception)] {...} | Finally.cs:233:10:233:12 | M12 | -| Finally.cs:250:17:252:17 | [finally: exception(ExceptionA), finally(1): exception(Exception)] {...} | Finally.cs:233:10:233:12 | M12 | -| Finally.cs:250:17:252:17 | [finally: exception(ExceptionA)] {...} | Finally.cs:233:10:233:12 | M12 | +| Finally.cs:250:17:252:17 | [finally(1): exception] {...} | Finally.cs:233:10:233:12 | M12 | +| Finally.cs:250:17:252:17 | [finally: exception, finally(1): exception] {...} | Finally.cs:233:10:233:12 | M12 | +| Finally.cs:250:17:252:17 | [finally: exception] {...} | Finally.cs:233:10:233:12 | M12 | | Finally.cs:250:17:252:17 | {...} | Finally.cs:233:10:233:12 | M12 | -| Finally.cs:257:9:259:9 | [finally: exception(Exception)] {...} | Finally.cs:233:10:233:12 | M12 | -| Finally.cs:257:9:259:9 | [finally: exception(ExceptionA)] {...} | Finally.cs:233:10:233:12 | M12 | +| Finally.cs:257:9:259:9 | [finally: exception] {...} | Finally.cs:233:10:233:12 | M12 | | Finally.cs:257:9:259:9 | {...} | Finally.cs:233:10:233:12 | M12 | | Finally.cs:263:10:263:12 | enter M13 | Finally.cs:263:10:263:12 | M13 | | Finally.cs:263:10:263:12 | exit M13 | Finally.cs:263:10:263:12 | M13 | -| Finally.cs:270:9:273:9 | [finally: exception(Exception)] {...} | Finally.cs:263:10:263:12 | M13 | +| Finally.cs:270:9:273:9 | [finally: exception] {...} | Finally.cs:263:10:263:12 | M13 | | Finally.cs:270:9:273:9 | {...} | Finally.cs:263:10:263:12 | M13 | | Foreach.cs:4:7:4:13 | enter Foreach | Foreach.cs:4:7:4:13 | Foreach | | Foreach.cs:6:10:6:11 | enter M1 | Foreach.cs:6:10:6:11 | M1 | diff --git a/csharp/ql/test/library-tests/controlflow/graph/NodeGraph.expected b/csharp/ql/test/library-tests/controlflow/graph/NodeGraph.expected index 1664d77538a6..8726e77130bb 100644 --- a/csharp/ql/test/library-tests/controlflow/graph/NodeGraph.expected +++ b/csharp/ql/test/library-tests/controlflow/graph/NodeGraph.expected @@ -372,7 +372,7 @@ | Assert.cs:16:20:16:32 | ... ? ... : ... | Assert.cs:16:16:16:32 | String s = ... | | | Assert.cs:16:24:16:27 | null | Assert.cs:16:20:16:32 | ... ? ... : ... | | | Assert.cs:16:31:16:32 | "" | Assert.cs:16:20:16:32 | ... ? ... : ... | | -| Assert.cs:17:9:17:24 | [assertion failure] call to method IsNull | Assert.cs:14:10:14:11 | exit M2 (abnormal) | exception(AssertFailedException) | +| Assert.cs:17:9:17:24 | [assertion failure] call to method IsNull | Assert.cs:14:10:14:11 | exit M2 (abnormal) | exception | | Assert.cs:17:9:17:24 | [assertion success] call to method IsNull | Assert.cs:18:9:18:36 | ...; | | | Assert.cs:17:9:17:25 | ...; | Assert.cs:17:23:17:23 | access to local variable s | | | Assert.cs:17:23:17:23 | access to local variable s | Assert.cs:17:9:17:24 | [assertion failure] call to method IsNull | non-null | @@ -392,7 +392,7 @@ | Assert.cs:23:20:23:32 | ... ? ... : ... | Assert.cs:23:16:23:32 | String s = ... | | | Assert.cs:23:24:23:27 | null | Assert.cs:23:20:23:32 | ... ? ... : ... | | | Assert.cs:23:31:23:32 | "" | Assert.cs:23:20:23:32 | ... ? ... : ... | | -| Assert.cs:24:9:24:27 | [assertion failure] call to method IsNotNull | Assert.cs:21:10:21:11 | exit M3 (abnormal) | exception(AssertFailedException) | +| Assert.cs:24:9:24:27 | [assertion failure] call to method IsNotNull | Assert.cs:21:10:21:11 | exit M3 (abnormal) | exception | | Assert.cs:24:9:24:27 | [assertion success] call to method IsNotNull | Assert.cs:25:9:25:36 | ...; | | | Assert.cs:24:9:24:28 | ...; | Assert.cs:24:26:24:26 | access to local variable s | | | Assert.cs:24:26:24:26 | access to local variable s | Assert.cs:24:9:24:27 | [assertion failure] call to method IsNotNull | null | @@ -412,7 +412,7 @@ | Assert.cs:30:20:30:32 | ... ? ... : ... | Assert.cs:30:16:30:32 | String s = ... | | | Assert.cs:30:24:30:27 | null | Assert.cs:30:20:30:32 | ... ? ... : ... | | | Assert.cs:30:31:30:32 | "" | Assert.cs:30:20:30:32 | ... ? ... : ... | | -| Assert.cs:31:9:31:32 | [assertion failure] call to method IsTrue | Assert.cs:28:10:28:11 | exit M4 (abnormal) | exception(AssertFailedException) | +| Assert.cs:31:9:31:32 | [assertion failure] call to method IsTrue | Assert.cs:28:10:28:11 | exit M4 (abnormal) | exception | | Assert.cs:31:9:31:32 | [assertion success] call to method IsTrue | Assert.cs:32:9:32:36 | ...; | | | Assert.cs:31:9:31:33 | ...; | Assert.cs:31:23:31:23 | access to local variable s | | | Assert.cs:31:23:31:23 | access to local variable s | Assert.cs:31:28:31:31 | null | | @@ -434,7 +434,7 @@ | Assert.cs:37:20:37:32 | ... ? ... : ... | Assert.cs:37:16:37:32 | String s = ... | | | Assert.cs:37:24:37:27 | null | Assert.cs:37:20:37:32 | ... ? ... : ... | | | Assert.cs:37:31:37:32 | "" | Assert.cs:37:20:37:32 | ... ? ... : ... | | -| Assert.cs:38:9:38:32 | [assertion failure] call to method IsTrue | Assert.cs:35:10:35:11 | exit M5 (abnormal) | exception(AssertFailedException) | +| Assert.cs:38:9:38:32 | [assertion failure] call to method IsTrue | Assert.cs:35:10:35:11 | exit M5 (abnormal) | exception | | Assert.cs:38:9:38:32 | [assertion success] call to method IsTrue | Assert.cs:39:9:39:36 | ...; | | | Assert.cs:38:9:38:33 | ...; | Assert.cs:38:23:38:23 | access to local variable s | | | Assert.cs:38:23:38:23 | access to local variable s | Assert.cs:38:28:38:31 | null | | @@ -456,7 +456,7 @@ | Assert.cs:44:20:44:32 | ... ? ... : ... | Assert.cs:44:16:44:32 | String s = ... | | | Assert.cs:44:24:44:27 | null | Assert.cs:44:20:44:32 | ... ? ... : ... | | | Assert.cs:44:31:44:32 | "" | Assert.cs:44:20:44:32 | ... ? ... : ... | | -| Assert.cs:45:9:45:33 | [assertion failure] call to method IsFalse | Assert.cs:42:10:42:11 | exit M6 (abnormal) | exception(AssertFailedException) | +| Assert.cs:45:9:45:33 | [assertion failure] call to method IsFalse | Assert.cs:42:10:42:11 | exit M6 (abnormal) | exception | | Assert.cs:45:9:45:33 | [assertion success] call to method IsFalse | Assert.cs:46:9:46:36 | ...; | | | Assert.cs:45:9:45:34 | ...; | Assert.cs:45:24:45:24 | access to local variable s | | | Assert.cs:45:24:45:24 | access to local variable s | Assert.cs:45:29:45:32 | null | | @@ -478,7 +478,7 @@ | Assert.cs:51:20:51:32 | ... ? ... : ... | Assert.cs:51:16:51:32 | String s = ... | | | Assert.cs:51:24:51:27 | null | Assert.cs:51:20:51:32 | ... ? ... : ... | | | Assert.cs:51:31:51:32 | "" | Assert.cs:51:20:51:32 | ... ? ... : ... | | -| Assert.cs:52:9:52:33 | [assertion failure] call to method IsFalse | Assert.cs:49:10:49:11 | exit M7 (abnormal) | exception(AssertFailedException) | +| Assert.cs:52:9:52:33 | [assertion failure] call to method IsFalse | Assert.cs:49:10:49:11 | exit M7 (abnormal) | exception | | Assert.cs:52:9:52:33 | [assertion success] call to method IsFalse | Assert.cs:53:9:53:36 | ...; | | | Assert.cs:52:9:52:34 | ...; | Assert.cs:52:24:52:24 | access to local variable s | | | Assert.cs:52:24:52:24 | access to local variable s | Assert.cs:52:29:52:32 | null | | @@ -502,7 +502,7 @@ | Assert.cs:58:20:58:32 | [b (line 56): true] ... ? ... : ... | Assert.cs:58:16:58:32 | [b (line 56): true] String s = ... | | | Assert.cs:58:24:58:27 | [b (line 56): true] null | Assert.cs:58:20:58:32 | [b (line 56): true] ... ? ... : ... | | | Assert.cs:58:31:58:32 | [b (line 56): false] "" | Assert.cs:58:20:58:32 | [b (line 56): false] ... ? ... : ... | | -| Assert.cs:59:9:59:37 | [assertion failure] call to method IsTrue | Assert.cs:56:10:56:11 | exit M8 (abnormal) | exception(AssertFailedException) | +| Assert.cs:59:9:59:37 | [assertion failure] call to method IsTrue | Assert.cs:56:10:56:11 | exit M8 (abnormal) | exception | | Assert.cs:59:9:59:37 | [assertion success] call to method IsTrue | Assert.cs:60:9:60:36 | ...; | | | Assert.cs:59:9:59:38 | [b (line 56): false] ...; | Assert.cs:59:23:59:23 | [b (line 56): false] access to local variable s | | | Assert.cs:59:9:59:38 | [b (line 56): true] ...; | Assert.cs:59:23:59:23 | [b (line 56): true] access to local variable s | | @@ -535,7 +535,7 @@ | Assert.cs:65:20:65:32 | [b (line 63): true] ... ? ... : ... | Assert.cs:65:16:65:32 | [b (line 63): true] String s = ... | | | Assert.cs:65:24:65:27 | [b (line 63): true] null | Assert.cs:65:20:65:32 | [b (line 63): true] ... ? ... : ... | | | Assert.cs:65:31:65:32 | [b (line 63): false] "" | Assert.cs:65:20:65:32 | [b (line 63): false] ... ? ... : ... | | -| Assert.cs:66:9:66:38 | [assertion failure] call to method IsFalse | Assert.cs:63:10:63:11 | exit M9 (abnormal) | exception(AssertFailedException) | +| Assert.cs:66:9:66:38 | [assertion failure] call to method IsFalse | Assert.cs:63:10:63:11 | exit M9 (abnormal) | exception | | Assert.cs:66:9:66:38 | [assertion success] call to method IsFalse | Assert.cs:67:9:67:36 | ...; | | | Assert.cs:66:9:66:39 | [b (line 63): false] ...; | Assert.cs:66:24:66:24 | [b (line 63): false] access to local variable s | | | Assert.cs:66:9:66:39 | [b (line 63): true] ...; | Assert.cs:66:24:66:24 | [b (line 63): true] access to local variable s | | @@ -568,7 +568,7 @@ | Assert.cs:72:20:72:32 | [b (line 70): true] ... ? ... : ... | Assert.cs:72:16:72:32 | [b (line 70): true] String s = ... | | | Assert.cs:72:24:72:27 | [b (line 70): true] null | Assert.cs:72:20:72:32 | [b (line 70): true] ... ? ... : ... | | | Assert.cs:72:31:72:32 | [b (line 70): false] "" | Assert.cs:72:20:72:32 | [b (line 70): false] ... ? ... : ... | | -| Assert.cs:73:9:73:37 | [assertion failure] call to method IsTrue | Assert.cs:70:10:70:12 | exit M10 (abnormal) | exception(AssertFailedException) | +| Assert.cs:73:9:73:37 | [assertion failure] call to method IsTrue | Assert.cs:70:10:70:12 | exit M10 (abnormal) | exception | | Assert.cs:73:9:73:37 | [assertion success] call to method IsTrue | Assert.cs:74:9:74:36 | ...; | | | Assert.cs:73:9:73:38 | [b (line 70): false] ...; | Assert.cs:73:23:73:23 | [b (line 70): false] access to local variable s | | | Assert.cs:73:9:73:38 | [b (line 70): true] ...; | Assert.cs:73:23:73:23 | [b (line 70): true] access to local variable s | | @@ -601,7 +601,7 @@ | Assert.cs:79:20:79:32 | [b (line 77): true] ... ? ... : ... | Assert.cs:79:16:79:32 | [b (line 77): true] String s = ... | | | Assert.cs:79:24:79:27 | [b (line 77): true] null | Assert.cs:79:20:79:32 | [b (line 77): true] ... ? ... : ... | | | Assert.cs:79:31:79:32 | [b (line 77): false] "" | Assert.cs:79:20:79:32 | [b (line 77): false] ... ? ... : ... | | -| Assert.cs:80:9:80:38 | [assertion failure] call to method IsFalse | Assert.cs:77:10:77:12 | exit M11 (abnormal) | exception(AssertFailedException) | +| Assert.cs:80:9:80:38 | [assertion failure] call to method IsFalse | Assert.cs:77:10:77:12 | exit M11 (abnormal) | exception | | Assert.cs:80:9:80:38 | [assertion success] call to method IsFalse | Assert.cs:81:9:81:36 | ...; | | | Assert.cs:80:9:80:39 | [b (line 77): false] ...; | Assert.cs:80:24:80:24 | [b (line 77): false] access to local variable s | | | Assert.cs:80:9:80:39 | [b (line 77): true] ...; | Assert.cs:80:24:80:24 | [b (line 77): true] access to local variable s | | @@ -666,8 +666,8 @@ | Assert.cs:90:13:90:25 | [b (line 84): true] ... ? ... : ... | Assert.cs:90:9:90:25 | [b (line 84): true] ... = ... | | | Assert.cs:90:17:90:20 | [b (line 84): true] null | Assert.cs:90:13:90:25 | [b (line 84): true] ... ? ... : ... | | | Assert.cs:90:24:90:25 | [b (line 84): false] "" | Assert.cs:90:13:90:25 | [b (line 84): false] ... ? ... : ... | | -| Assert.cs:91:9:91:24 | [assertion failure, b (line 84): false] call to method IsNull | Assert.cs:84:10:84:12 | exit M12 (abnormal) | exception(AssertFailedException) | -| Assert.cs:91:9:91:24 | [assertion failure, b (line 84): true] call to method IsNull | Assert.cs:84:10:84:12 | exit M12 (abnormal) | exception(AssertFailedException) | +| Assert.cs:91:9:91:24 | [assertion failure, b (line 84): false] call to method IsNull | Assert.cs:84:10:84:12 | exit M12 (abnormal) | exception | +| Assert.cs:91:9:91:24 | [assertion failure, b (line 84): true] call to method IsNull | Assert.cs:84:10:84:12 | exit M12 (abnormal) | exception | | Assert.cs:91:9:91:24 | [assertion success, b (line 84): false] call to method IsNull | Assert.cs:92:9:92:36 | [b (line 84): false] ...; | | | Assert.cs:91:9:91:24 | [assertion success, b (line 84): true] call to method IsNull | Assert.cs:92:9:92:36 | [b (line 84): true] ...; | | | Assert.cs:91:9:91:25 | [b (line 84): false] ...; | Assert.cs:91:23:91:23 | [b (line 84): false] access to local variable s | | @@ -694,8 +694,8 @@ | Assert.cs:94:13:94:25 | [b (line 84): true] ... ? ... : ... | Assert.cs:94:9:94:25 | [b (line 84): true] ... = ... | | | Assert.cs:94:17:94:20 | [b (line 84): true] null | Assert.cs:94:13:94:25 | [b (line 84): true] ... ? ... : ... | | | Assert.cs:94:24:94:25 | [b (line 84): false] "" | Assert.cs:94:13:94:25 | [b (line 84): false] ... ? ... : ... | | -| Assert.cs:95:9:95:27 | [assertion failure, b (line 84): false] call to method IsNotNull | Assert.cs:84:10:84:12 | exit M12 (abnormal) | exception(AssertFailedException) | -| Assert.cs:95:9:95:27 | [assertion failure, b (line 84): true] call to method IsNotNull | Assert.cs:84:10:84:12 | exit M12 (abnormal) | exception(AssertFailedException) | +| Assert.cs:95:9:95:27 | [assertion failure, b (line 84): false] call to method IsNotNull | Assert.cs:84:10:84:12 | exit M12 (abnormal) | exception | +| Assert.cs:95:9:95:27 | [assertion failure, b (line 84): true] call to method IsNotNull | Assert.cs:84:10:84:12 | exit M12 (abnormal) | exception | | Assert.cs:95:9:95:27 | [assertion success, b (line 84): false] call to method IsNotNull | Assert.cs:96:9:96:36 | [b (line 84): false] ...; | | | Assert.cs:95:9:95:27 | [assertion success, b (line 84): true] call to method IsNotNull | Assert.cs:96:9:96:36 | [b (line 84): true] ...; | | | Assert.cs:95:9:95:28 | [b (line 84): false] ...; | Assert.cs:95:26:95:26 | [b (line 84): false] access to local variable s | | @@ -722,8 +722,8 @@ | Assert.cs:98:13:98:25 | [b (line 84): true] ... ? ... : ... | Assert.cs:98:9:98:25 | [b (line 84): true] ... = ... | | | Assert.cs:98:17:98:20 | [b (line 84): true] null | Assert.cs:98:13:98:25 | [b (line 84): true] ... ? ... : ... | | | Assert.cs:98:24:98:25 | [b (line 84): false] "" | Assert.cs:98:13:98:25 | [b (line 84): false] ... ? ... : ... | | -| Assert.cs:99:9:99:32 | [assertion failure, b (line 84): false] call to method IsTrue | Assert.cs:84:10:84:12 | exit M12 (abnormal) | exception(AssertFailedException) | -| Assert.cs:99:9:99:32 | [assertion failure, b (line 84): true] call to method IsTrue | Assert.cs:84:10:84:12 | exit M12 (abnormal) | exception(AssertFailedException) | +| Assert.cs:99:9:99:32 | [assertion failure, b (line 84): false] call to method IsTrue | Assert.cs:84:10:84:12 | exit M12 (abnormal) | exception | +| Assert.cs:99:9:99:32 | [assertion failure, b (line 84): true] call to method IsTrue | Assert.cs:84:10:84:12 | exit M12 (abnormal) | exception | | Assert.cs:99:9:99:32 | [assertion success, b (line 84): false] call to method IsTrue | Assert.cs:100:9:100:36 | [b (line 84): false] ...; | | | Assert.cs:99:9:99:32 | [assertion success, b (line 84): true] call to method IsTrue | Assert.cs:100:9:100:36 | [b (line 84): true] ...; | | | Assert.cs:99:9:99:33 | [b (line 84): false] ...; | Assert.cs:99:23:99:23 | [b (line 84): false] access to local variable s | | @@ -754,8 +754,8 @@ | Assert.cs:102:13:102:25 | [b (line 84): true] ... ? ... : ... | Assert.cs:102:9:102:25 | [b (line 84): true] ... = ... | | | Assert.cs:102:17:102:20 | [b (line 84): true] null | Assert.cs:102:13:102:25 | [b (line 84): true] ... ? ... : ... | | | Assert.cs:102:24:102:25 | [b (line 84): false] "" | Assert.cs:102:13:102:25 | [b (line 84): false] ... ? ... : ... | | -| Assert.cs:103:9:103:32 | [assertion failure, b (line 84): false] call to method IsTrue | Assert.cs:84:10:84:12 | exit M12 (abnormal) | exception(AssertFailedException) | -| Assert.cs:103:9:103:32 | [assertion failure, b (line 84): true] call to method IsTrue | Assert.cs:84:10:84:12 | exit M12 (abnormal) | exception(AssertFailedException) | +| Assert.cs:103:9:103:32 | [assertion failure, b (line 84): false] call to method IsTrue | Assert.cs:84:10:84:12 | exit M12 (abnormal) | exception | +| Assert.cs:103:9:103:32 | [assertion failure, b (line 84): true] call to method IsTrue | Assert.cs:84:10:84:12 | exit M12 (abnormal) | exception | | Assert.cs:103:9:103:32 | [assertion success, b (line 84): false] call to method IsTrue | Assert.cs:104:9:104:36 | [b (line 84): false] ...; | | | Assert.cs:103:9:103:32 | [assertion success, b (line 84): true] call to method IsTrue | Assert.cs:104:9:104:36 | [b (line 84): true] ...; | | | Assert.cs:103:9:103:33 | [b (line 84): false] ...; | Assert.cs:103:23:103:23 | [b (line 84): false] access to local variable s | | @@ -786,8 +786,8 @@ | Assert.cs:106:13:106:25 | [b (line 84): true] ... ? ... : ... | Assert.cs:106:9:106:25 | [b (line 84): true] ... = ... | | | Assert.cs:106:17:106:20 | [b (line 84): true] null | Assert.cs:106:13:106:25 | [b (line 84): true] ... ? ... : ... | | | Assert.cs:106:24:106:25 | [b (line 84): false] "" | Assert.cs:106:13:106:25 | [b (line 84): false] ... ? ... : ... | | -| Assert.cs:107:9:107:33 | [assertion failure, b (line 84): false] call to method IsFalse | Assert.cs:84:10:84:12 | exit M12 (abnormal) | exception(AssertFailedException) | -| Assert.cs:107:9:107:33 | [assertion failure, b (line 84): true] call to method IsFalse | Assert.cs:84:10:84:12 | exit M12 (abnormal) | exception(AssertFailedException) | +| Assert.cs:107:9:107:33 | [assertion failure, b (line 84): false] call to method IsFalse | Assert.cs:84:10:84:12 | exit M12 (abnormal) | exception | +| Assert.cs:107:9:107:33 | [assertion failure, b (line 84): true] call to method IsFalse | Assert.cs:84:10:84:12 | exit M12 (abnormal) | exception | | Assert.cs:107:9:107:33 | [assertion success, b (line 84): false] call to method IsFalse | Assert.cs:108:9:108:36 | [b (line 84): false] ...; | | | Assert.cs:107:9:107:33 | [assertion success, b (line 84): true] call to method IsFalse | Assert.cs:108:9:108:36 | [b (line 84): true] ...; | | | Assert.cs:107:9:107:34 | [b (line 84): false] ...; | Assert.cs:107:24:107:24 | [b (line 84): false] access to local variable s | | @@ -818,8 +818,8 @@ | Assert.cs:110:13:110:25 | [b (line 84): true] ... ? ... : ... | Assert.cs:110:9:110:25 | [b (line 84): true] ... = ... | | | Assert.cs:110:17:110:20 | [b (line 84): true] null | Assert.cs:110:13:110:25 | [b (line 84): true] ... ? ... : ... | | | Assert.cs:110:24:110:25 | [b (line 84): false] "" | Assert.cs:110:13:110:25 | [b (line 84): false] ... ? ... : ... | | -| Assert.cs:111:9:111:33 | [assertion failure, b (line 84): false] call to method IsFalse | Assert.cs:84:10:84:12 | exit M12 (abnormal) | exception(AssertFailedException) | -| Assert.cs:111:9:111:33 | [assertion failure, b (line 84): true] call to method IsFalse | Assert.cs:84:10:84:12 | exit M12 (abnormal) | exception(AssertFailedException) | +| Assert.cs:111:9:111:33 | [assertion failure, b (line 84): false] call to method IsFalse | Assert.cs:84:10:84:12 | exit M12 (abnormal) | exception | +| Assert.cs:111:9:111:33 | [assertion failure, b (line 84): true] call to method IsFalse | Assert.cs:84:10:84:12 | exit M12 (abnormal) | exception | | Assert.cs:111:9:111:33 | [assertion success, b (line 84): false] call to method IsFalse | Assert.cs:112:9:112:36 | [b (line 84): false] ...; | | | Assert.cs:111:9:111:33 | [assertion success, b (line 84): true] call to method IsFalse | Assert.cs:112:9:112:36 | [b (line 84): true] ...; | | | Assert.cs:111:9:111:34 | [b (line 84): false] ...; | Assert.cs:111:24:111:24 | [b (line 84): false] access to local variable s | | @@ -850,8 +850,8 @@ | Assert.cs:114:13:114:25 | [b (line 84): true] ... ? ... : ... | Assert.cs:114:9:114:25 | [b (line 84): true] ... = ... | | | Assert.cs:114:17:114:20 | [b (line 84): true] null | Assert.cs:114:13:114:25 | [b (line 84): true] ... ? ... : ... | | | Assert.cs:114:24:114:25 | [b (line 84): false] "" | Assert.cs:114:13:114:25 | [b (line 84): false] ... ? ... : ... | | -| Assert.cs:115:9:115:37 | [assertion failure, b (line 84): false] call to method IsTrue | Assert.cs:84:10:84:12 | exit M12 (abnormal) | exception(AssertFailedException) | -| Assert.cs:115:9:115:37 | [assertion failure, b (line 84): true] call to method IsTrue | Assert.cs:84:10:84:12 | exit M12 (abnormal) | exception(AssertFailedException) | +| Assert.cs:115:9:115:37 | [assertion failure, b (line 84): false] call to method IsTrue | Assert.cs:84:10:84:12 | exit M12 (abnormal) | exception | +| Assert.cs:115:9:115:37 | [assertion failure, b (line 84): true] call to method IsTrue | Assert.cs:84:10:84:12 | exit M12 (abnormal) | exception | | Assert.cs:115:9:115:37 | [assertion success, b (line 84): true] call to method IsTrue | Assert.cs:116:9:116:36 | [b (line 84): true] ...; | | | Assert.cs:115:9:115:38 | [b (line 84): false] ...; | Assert.cs:115:23:115:23 | [b (line 84): false] access to local variable s | | | Assert.cs:115:9:115:38 | [b (line 84): true] ...; | Assert.cs:115:23:115:23 | [b (line 84): true] access to local variable s | | @@ -877,7 +877,7 @@ | Assert.cs:118:13:118:13 | [b (line 84): true] access to parameter b | Assert.cs:118:17:118:20 | [b (line 84): true] null | true | | Assert.cs:118:13:118:25 | [b (line 84): true] ... ? ... : ... | Assert.cs:118:9:118:25 | [b (line 84): true] ... = ... | | | Assert.cs:118:17:118:20 | [b (line 84): true] null | Assert.cs:118:13:118:25 | [b (line 84): true] ... ? ... : ... | | -| Assert.cs:119:9:119:39 | [assertion failure, b (line 84): true] call to method IsFalse | Assert.cs:84:10:84:12 | exit M12 (abnormal) | exception(AssertFailedException) | +| Assert.cs:119:9:119:39 | [assertion failure, b (line 84): true] call to method IsFalse | Assert.cs:84:10:84:12 | exit M12 (abnormal) | exception | | Assert.cs:119:9:119:39 | [assertion success, b (line 84): true] call to method IsFalse | Assert.cs:120:9:120:36 | [b (line 84): true] ...; | | | Assert.cs:119:9:119:40 | [b (line 84): true] ...; | Assert.cs:119:24:119:24 | [b (line 84): true] access to local variable s | | | Assert.cs:119:24:119:24 | [b (line 84): true] access to local variable s | Assert.cs:119:29:119:32 | [b (line 84): true] null | | @@ -897,7 +897,7 @@ | Assert.cs:122:13:122:13 | [b (line 84): true] access to parameter b | Assert.cs:122:17:122:20 | [b (line 84): true] null | true | | Assert.cs:122:13:122:25 | [b (line 84): true] ... ? ... : ... | Assert.cs:122:9:122:25 | [b (line 84): true] ... = ... | | | Assert.cs:122:17:122:20 | [b (line 84): true] null | Assert.cs:122:13:122:25 | [b (line 84): true] ... ? ... : ... | | -| Assert.cs:123:9:123:37 | [assertion failure, b (line 84): true] call to method IsTrue | Assert.cs:84:10:84:12 | exit M12 (abnormal) | exception(AssertFailedException) | +| Assert.cs:123:9:123:37 | [assertion failure, b (line 84): true] call to method IsTrue | Assert.cs:84:10:84:12 | exit M12 (abnormal) | exception | | Assert.cs:123:9:123:37 | [assertion success, b (line 84): true] call to method IsTrue | Assert.cs:124:9:124:36 | [b (line 84): true] ...; | | | Assert.cs:123:9:123:38 | [b (line 84): true] ...; | Assert.cs:123:23:123:23 | [b (line 84): true] access to local variable s | | | Assert.cs:123:23:123:23 | [b (line 84): true] access to local variable s | Assert.cs:123:28:123:31 | [b (line 84): true] null | | @@ -916,7 +916,7 @@ | Assert.cs:126:13:126:13 | [b (line 84): true] access to parameter b | Assert.cs:126:17:126:20 | [b (line 84): true] null | true | | Assert.cs:126:13:126:25 | [b (line 84): true] ... ? ... : ... | Assert.cs:126:9:126:25 | [b (line 84): true] ... = ... | | | Assert.cs:126:17:126:20 | [b (line 84): true] null | Assert.cs:126:13:126:25 | [b (line 84): true] ... ? ... : ... | | -| Assert.cs:127:9:127:39 | [assertion failure] call to method IsFalse | Assert.cs:84:10:84:12 | exit M12 (abnormal) | exception(AssertFailedException) | +| Assert.cs:127:9:127:39 | [assertion failure] call to method IsFalse | Assert.cs:84:10:84:12 | exit M12 (abnormal) | exception | | Assert.cs:127:9:127:39 | [assertion success] call to method IsFalse | Assert.cs:128:9:128:36 | ...; | | | Assert.cs:127:9:127:40 | [b (line 84): true] ...; | Assert.cs:127:24:127:24 | [b (line 84): true] access to local variable s | | | Assert.cs:127:24:127:24 | [b (line 84): true] access to local variable s | Assert.cs:127:29:127:32 | [b (line 84): true] null | | @@ -938,8 +938,8 @@ | Assert.cs:138:10:138:12 | exit M13 (abnormal) | Assert.cs:138:10:138:12 | exit M13 | | | Assert.cs:138:10:138:12 | exit M13 (normal) | Assert.cs:138:10:138:12 | exit M13 | | | Assert.cs:139:5:142:5 | {...} | Assert.cs:140:9:140:36 | ...; | | -| Assert.cs:140:9:140:35 | [assertion failure] call to method AssertTrueFalse | Assert.cs:138:10:138:12 | exit M13 (abnormal) | exception(Exception) | -| Assert.cs:140:9:140:35 | [assertion failure] call to method AssertTrueFalse | Assert.cs:138:10:138:12 | exit M13 (abnormal) | exception(Exception) | +| Assert.cs:140:9:140:35 | [assertion failure] call to method AssertTrueFalse | Assert.cs:138:10:138:12 | exit M13 (abnormal) | exception | +| Assert.cs:140:9:140:35 | [assertion failure] call to method AssertTrueFalse | Assert.cs:138:10:138:12 | exit M13 (abnormal) | exception | | Assert.cs:140:9:140:35 | [assertion success] call to method AssertTrueFalse | Assert.cs:141:9:141:15 | return ...; | | | Assert.cs:140:9:140:35 | this access | Assert.cs:140:25:140:26 | access to parameter b1 | | | Assert.cs:140:9:140:36 | ...; | Assert.cs:140:9:140:35 | this access | | @@ -1159,11 +1159,11 @@ | CompileTimeOperators.cs:29:5:41:5 | {...} | CompileTimeOperators.cs:30:9:38:9 | try {...} ... | | | CompileTimeOperators.cs:30:9:38:9 | try {...} ... | CompileTimeOperators.cs:31:9:34:9 | {...} | | | CompileTimeOperators.cs:31:9:34:9 | {...} | CompileTimeOperators.cs:32:13:32:21 | goto ...; | | -| CompileTimeOperators.cs:32:13:32:21 | goto ...; | CompileTimeOperators.cs:36:9:38:9 | [finally: goto(End)] {...} | goto(End) | -| CompileTimeOperators.cs:36:9:38:9 | [finally: goto(End)] {...} | CompileTimeOperators.cs:37:13:37:41 | [finally: goto(End)] ...; | | -| CompileTimeOperators.cs:37:13:37:40 | [finally: goto(End)] call to method WriteLine | CompileTimeOperators.cs:40:9:40:11 | End: | goto(End) | -| CompileTimeOperators.cs:37:13:37:41 | [finally: goto(End)] ...; | CompileTimeOperators.cs:37:31:37:39 | [finally: goto(End)] "Finally" | | -| CompileTimeOperators.cs:37:31:37:39 | [finally: goto(End)] "Finally" | CompileTimeOperators.cs:37:13:37:40 | [finally: goto(End)] call to method WriteLine | | +| CompileTimeOperators.cs:32:13:32:21 | goto ...; | CompileTimeOperators.cs:36:9:38:9 | [finally: goto] {...} | goto | +| CompileTimeOperators.cs:36:9:38:9 | [finally: goto] {...} | CompileTimeOperators.cs:37:13:37:41 | [finally: goto] ...; | | +| CompileTimeOperators.cs:37:13:37:40 | [finally: goto] call to method WriteLine | CompileTimeOperators.cs:40:9:40:11 | End: | goto | +| CompileTimeOperators.cs:37:13:37:41 | [finally: goto] ...; | CompileTimeOperators.cs:37:31:37:39 | [finally: goto] "Finally" | | +| CompileTimeOperators.cs:37:31:37:39 | [finally: goto] "Finally" | CompileTimeOperators.cs:37:13:37:40 | [finally: goto] call to method WriteLine | | | CompileTimeOperators.cs:40:9:40:11 | End: | CompileTimeOperators.cs:40:14:40:38 | ...; | | | CompileTimeOperators.cs:40:14:40:37 | call to method WriteLine | CompileTimeOperators.cs:28:10:28:10 | exit M (normal) | | | CompileTimeOperators.cs:40:14:40:38 | ...; | CompileTimeOperators.cs:40:32:40:36 | "End" | | @@ -1708,7 +1708,7 @@ | ExitMethods.cs:20:10:20:11 | enter M3 | ExitMethods.cs:21:5:24:5 | {...} | | | ExitMethods.cs:20:10:20:11 | exit M3 (abnormal) | ExitMethods.cs:20:10:20:11 | exit M3 | | | ExitMethods.cs:21:5:24:5 | {...} | ExitMethods.cs:22:9:22:26 | ...; | | -| ExitMethods.cs:22:9:22:25 | call to method ErrorAlways | ExitMethods.cs:20:10:20:11 | exit M3 (abnormal) | exception(ArgumentException), exception(Exception) | +| ExitMethods.cs:22:9:22:25 | call to method ErrorAlways | ExitMethods.cs:20:10:20:11 | exit M3 (abnormal) | exception | | ExitMethods.cs:22:9:22:26 | ...; | ExitMethods.cs:22:21:22:24 | true | | | ExitMethods.cs:22:21:22:24 | true | ExitMethods.cs:22:9:22:25 | call to method ErrorAlways | | | ExitMethods.cs:26:10:26:11 | enter M4 | ExitMethods.cs:27:5:30:5 | {...} | | @@ -1728,8 +1728,8 @@ | ExitMethods.cs:39:5:52:5 | {...} | ExitMethods.cs:40:9:51:9 | try {...} ... | | | ExitMethods.cs:40:9:51:9 | try {...} ... | ExitMethods.cs:41:9:43:9 | {...} | | | ExitMethods.cs:41:9:43:9 | {...} | ExitMethods.cs:42:13:42:31 | ...; | | -| ExitMethods.cs:42:13:42:30 | call to method ErrorAlways | ExitMethods.cs:44:9:47:9 | [exception: ArgumentException] catch (...) {...} | exception(ArgumentException) | -| ExitMethods.cs:42:13:42:30 | call to method ErrorAlways | ExitMethods.cs:44:9:47:9 | [exception: Exception] catch (...) {...} | exception(Exception) | +| ExitMethods.cs:42:13:42:30 | call to method ErrorAlways | ExitMethods.cs:44:9:47:9 | [exception: ArgumentException] catch (...) {...} | exception | +| ExitMethods.cs:42:13:42:30 | call to method ErrorAlways | ExitMethods.cs:44:9:47:9 | [exception: Exception] catch (...) {...} | exception | | ExitMethods.cs:42:13:42:31 | ...; | ExitMethods.cs:42:25:42:29 | false | | | ExitMethods.cs:42:25:42:29 | false | ExitMethods.cs:42:13:42:30 | call to method ErrorAlways | | | ExitMethods.cs:44:9:47:9 | [exception: ArgumentException] catch (...) {...} | ExitMethods.cs:45:9:47:9 | {...} | match | @@ -1743,12 +1743,12 @@ | ExitMethods.cs:54:10:54:11 | enter M7 | ExitMethods.cs:55:5:58:5 | {...} | | | ExitMethods.cs:54:10:54:11 | exit M7 (abnormal) | ExitMethods.cs:54:10:54:11 | exit M7 | | | ExitMethods.cs:55:5:58:5 | {...} | ExitMethods.cs:56:9:56:23 | ...; | | -| ExitMethods.cs:56:9:56:22 | call to method ErrorAlways2 | ExitMethods.cs:54:10:54:11 | exit M7 (abnormal) | exception(Exception) | +| ExitMethods.cs:56:9:56:22 | call to method ErrorAlways2 | ExitMethods.cs:54:10:54:11 | exit M7 (abnormal) | exception | | ExitMethods.cs:56:9:56:23 | ...; | ExitMethods.cs:56:9:56:22 | call to method ErrorAlways2 | | | ExitMethods.cs:60:10:60:11 | enter M8 | ExitMethods.cs:61:5:64:5 | {...} | | | ExitMethods.cs:60:10:60:11 | exit M8 (abnormal) | ExitMethods.cs:60:10:60:11 | exit M8 | | | ExitMethods.cs:61:5:64:5 | {...} | ExitMethods.cs:62:9:62:23 | ...; | | -| ExitMethods.cs:62:9:62:22 | call to method ErrorAlways3 | ExitMethods.cs:60:10:60:11 | exit M8 (abnormal) | exception(Exception) | +| ExitMethods.cs:62:9:62:22 | call to method ErrorAlways3 | ExitMethods.cs:60:10:60:11 | exit M8 (abnormal) | exception | | ExitMethods.cs:62:9:62:23 | ...; | ExitMethods.cs:62:9:62:22 | call to method ErrorAlways3 | | | ExitMethods.cs:66:17:66:26 | enter ErrorMaybe | ExitMethods.cs:67:5:70:5 | {...} | | | ExitMethods.cs:66:17:66:26 | exit ErrorMaybe (abnormal) | ExitMethods.cs:66:17:66:26 | exit ErrorMaybe | | @@ -1757,7 +1757,7 @@ | ExitMethods.cs:68:9:69:34 | if (...) ... | ExitMethods.cs:68:13:68:13 | access to parameter b | | | ExitMethods.cs:68:13:68:13 | access to parameter b | ExitMethods.cs:66:17:66:26 | exit ErrorMaybe (normal) | false | | ExitMethods.cs:68:13:68:13 | access to parameter b | ExitMethods.cs:69:19:69:33 | object creation of type Exception | true | -| ExitMethods.cs:69:13:69:34 | throw ...; | ExitMethods.cs:66:17:66:26 | exit ErrorMaybe (abnormal) | exception(Exception) | +| ExitMethods.cs:69:13:69:34 | throw ...; | ExitMethods.cs:66:17:66:26 | exit ErrorMaybe (abnormal) | exception | | ExitMethods.cs:69:19:69:33 | object creation of type Exception | ExitMethods.cs:69:13:69:34 | throw ...; | | | ExitMethods.cs:72:17:72:27 | enter ErrorAlways | ExitMethods.cs:73:5:78:5 | {...} | | | ExitMethods.cs:72:17:72:27 | exit ErrorAlways (abnormal) | ExitMethods.cs:72:17:72:27 | exit ErrorAlways | | @@ -1765,19 +1765,19 @@ | ExitMethods.cs:74:9:77:45 | if (...) ... | ExitMethods.cs:74:13:74:13 | access to parameter b | | | ExitMethods.cs:74:13:74:13 | access to parameter b | ExitMethods.cs:75:19:75:33 | object creation of type Exception | true | | ExitMethods.cs:74:13:74:13 | access to parameter b | ExitMethods.cs:77:41:77:43 | "b" | false | -| ExitMethods.cs:75:13:75:34 | throw ...; | ExitMethods.cs:72:17:72:27 | exit ErrorAlways (abnormal) | exception(Exception) | +| ExitMethods.cs:75:13:75:34 | throw ...; | ExitMethods.cs:72:17:72:27 | exit ErrorAlways (abnormal) | exception | | ExitMethods.cs:75:19:75:33 | object creation of type Exception | ExitMethods.cs:75:13:75:34 | throw ...; | | -| ExitMethods.cs:77:13:77:45 | throw ...; | ExitMethods.cs:72:17:72:27 | exit ErrorAlways (abnormal) | exception(ArgumentException) | +| ExitMethods.cs:77:13:77:45 | throw ...; | ExitMethods.cs:72:17:72:27 | exit ErrorAlways (abnormal) | exception | | ExitMethods.cs:77:19:77:44 | object creation of type ArgumentException | ExitMethods.cs:77:13:77:45 | throw ...; | | | ExitMethods.cs:77:41:77:43 | "b" | ExitMethods.cs:77:19:77:44 | object creation of type ArgumentException | | | ExitMethods.cs:80:17:80:28 | enter ErrorAlways2 | ExitMethods.cs:81:5:83:5 | {...} | | | ExitMethods.cs:80:17:80:28 | exit ErrorAlways2 (abnormal) | ExitMethods.cs:80:17:80:28 | exit ErrorAlways2 | | | ExitMethods.cs:81:5:83:5 | {...} | ExitMethods.cs:82:15:82:29 | object creation of type Exception | | -| ExitMethods.cs:82:9:82:30 | throw ...; | ExitMethods.cs:80:17:80:28 | exit ErrorAlways2 (abnormal) | exception(Exception) | +| ExitMethods.cs:82:9:82:30 | throw ...; | ExitMethods.cs:80:17:80:28 | exit ErrorAlways2 (abnormal) | exception | | ExitMethods.cs:82:15:82:29 | object creation of type Exception | ExitMethods.cs:82:9:82:30 | throw ...; | | | ExitMethods.cs:85:17:85:28 | enter ErrorAlways3 | ExitMethods.cs:85:41:85:55 | object creation of type Exception | | | ExitMethods.cs:85:17:85:28 | exit ErrorAlways3 (abnormal) | ExitMethods.cs:85:17:85:28 | exit ErrorAlways3 | | -| ExitMethods.cs:85:35:85:55 | throw ... | ExitMethods.cs:85:17:85:28 | exit ErrorAlways3 (abnormal) | exception(Exception) | +| ExitMethods.cs:85:35:85:55 | throw ... | ExitMethods.cs:85:17:85:28 | exit ErrorAlways3 (abnormal) | exception | | ExitMethods.cs:85:41:85:55 | object creation of type Exception | ExitMethods.cs:85:35:85:55 | throw ... | | | ExitMethods.cs:87:10:87:13 | enter Exit | ExitMethods.cs:88:5:90:5 | {...} | | | ExitMethods.cs:87:10:87:13 | exit Exit (abnormal) | ExitMethods.cs:87:10:87:13 | exit Exit | | @@ -1813,7 +1813,7 @@ | ExitMethods.cs:112:29:112:29 | (...) ... | ExitMethods.cs:112:33:112:37 | access to parameter input | | | ExitMethods.cs:112:29:112:37 | ... / ... | ExitMethods.cs:112:16:112:76 | ... ? ... : ... | | | ExitMethods.cs:112:33:112:37 | access to parameter input | ExitMethods.cs:112:29:112:37 | ... / ... | | -| ExitMethods.cs:112:41:112:76 | throw ... | ExitMethods.cs:110:13:110:21 | exit ThrowExpr (abnormal) | exception(ArgumentException) | +| ExitMethods.cs:112:41:112:76 | throw ... | ExitMethods.cs:110:13:110:21 | exit ThrowExpr (abnormal) | exception | | ExitMethods.cs:112:47:112:76 | object creation of type ArgumentException | ExitMethods.cs:112:41:112:76 | throw ... | | | ExitMethods.cs:112:69:112:75 | "input" | ExitMethods.cs:112:47:112:76 | object creation of type ArgumentException | | | ExitMethods.cs:115:16:115:34 | enter ExtensionMethodCall | ExitMethods.cs:116:5:118:5 | {...} | | @@ -1830,26 +1830,26 @@ | ExitMethods.cs:120:17:120:32 | enter FailingAssertion | ExitMethods.cs:121:5:124:5 | {...} | | | ExitMethods.cs:120:17:120:32 | exit FailingAssertion (abnormal) | ExitMethods.cs:120:17:120:32 | exit FailingAssertion | | | ExitMethods.cs:121:5:124:5 | {...} | ExitMethods.cs:122:9:122:29 | ...; | | -| ExitMethods.cs:122:9:122:28 | [assertion failure] call to method IsTrue | ExitMethods.cs:120:17:120:32 | exit FailingAssertion (abnormal) | exception(AssertFailedException) | +| ExitMethods.cs:122:9:122:28 | [assertion failure] call to method IsTrue | ExitMethods.cs:120:17:120:32 | exit FailingAssertion (abnormal) | exception | | ExitMethods.cs:122:9:122:29 | ...; | ExitMethods.cs:122:23:122:27 | false | | | ExitMethods.cs:122:23:122:27 | false | ExitMethods.cs:122:9:122:28 | [assertion failure] call to method IsTrue | false | | ExitMethods.cs:126:17:126:33 | enter FailingAssertion2 | ExitMethods.cs:127:5:130:5 | {...} | | | ExitMethods.cs:126:17:126:33 | exit FailingAssertion2 (abnormal) | ExitMethods.cs:126:17:126:33 | exit FailingAssertion2 | | | ExitMethods.cs:127:5:130:5 | {...} | ExitMethods.cs:128:9:128:27 | ...; | | -| ExitMethods.cs:128:9:128:26 | call to method FailingAssertion | ExitMethods.cs:126:17:126:33 | exit FailingAssertion2 (abnormal) | exception(AssertFailedException) | +| ExitMethods.cs:128:9:128:26 | call to method FailingAssertion | ExitMethods.cs:126:17:126:33 | exit FailingAssertion2 (abnormal) | exception | | ExitMethods.cs:128:9:128:26 | this access | ExitMethods.cs:128:9:128:26 | call to method FailingAssertion | | | ExitMethods.cs:128:9:128:27 | ...; | ExitMethods.cs:128:9:128:26 | this access | | | ExitMethods.cs:132:10:132:20 | enter AssertFalse | ExitMethods.cs:132:48:132:48 | access to parameter b | | | ExitMethods.cs:132:10:132:20 | exit AssertFalse (abnormal) | ExitMethods.cs:132:10:132:20 | exit AssertFalse | | | ExitMethods.cs:132:10:132:20 | exit AssertFalse (normal) | ExitMethods.cs:132:10:132:20 | exit AssertFalse | | -| ExitMethods.cs:132:33:132:49 | [assertion failure] call to method IsFalse | ExitMethods.cs:132:10:132:20 | exit AssertFalse (abnormal) | exception(AssertFailedException) | +| ExitMethods.cs:132:33:132:49 | [assertion failure] call to method IsFalse | ExitMethods.cs:132:10:132:20 | exit AssertFalse (abnormal) | exception | | ExitMethods.cs:132:33:132:49 | [assertion success] call to method IsFalse | ExitMethods.cs:132:10:132:20 | exit AssertFalse (normal) | | | ExitMethods.cs:132:48:132:48 | access to parameter b | ExitMethods.cs:132:33:132:49 | [assertion failure] call to method IsFalse | true | | ExitMethods.cs:132:48:132:48 | access to parameter b | ExitMethods.cs:132:33:132:49 | [assertion success] call to method IsFalse | false | | ExitMethods.cs:134:17:134:33 | enter FailingAssertion3 | ExitMethods.cs:135:5:138:5 | {...} | | | ExitMethods.cs:134:17:134:33 | exit FailingAssertion3 (abnormal) | ExitMethods.cs:134:17:134:33 | exit FailingAssertion3 | | | ExitMethods.cs:135:5:138:5 | {...} | ExitMethods.cs:136:9:136:26 | ...; | | -| ExitMethods.cs:136:9:136:25 | [assertion failure] call to method AssertFalse | ExitMethods.cs:134:17:134:33 | exit FailingAssertion3 (abnormal) | exception(AssertFailedException) | +| ExitMethods.cs:136:9:136:25 | [assertion failure] call to method AssertFalse | ExitMethods.cs:134:17:134:33 | exit FailingAssertion3 (abnormal) | exception | | ExitMethods.cs:136:9:136:25 | this access | ExitMethods.cs:136:21:136:24 | true | | | ExitMethods.cs:136:9:136:26 | ...; | ExitMethods.cs:136:9:136:25 | this access | | | ExitMethods.cs:136:21:136:24 | true | ExitMethods.cs:136:9:136:25 | [assertion failure] call to method AssertFalse | true | @@ -1859,11 +1859,11 @@ | ExitMethods.cs:142:9:145:53 | if (...) ... | ExitMethods.cs:142:13:142:13 | access to parameter b | | | ExitMethods.cs:142:13:142:13 | access to parameter b | ExitMethods.cs:143:13:143:43 | ...; | true | | ExitMethods.cs:142:13:142:13 | access to parameter b | ExitMethods.cs:145:13:145:53 | ...; | false | -| ExitMethods.cs:143:13:143:42 | call to method Throw | ExitMethods.cs:140:17:140:42 | exit ExceptionDispatchInfoThrow (abnormal) | exception(ArgumentException) | +| ExitMethods.cs:143:13:143:42 | call to method Throw | ExitMethods.cs:140:17:140:42 | exit ExceptionDispatchInfoThrow (abnormal) | exception | | ExitMethods.cs:143:13:143:43 | ...; | ExitMethods.cs:143:41:143:41 | access to parameter e | | | ExitMethods.cs:143:41:143:41 | access to parameter e | ExitMethods.cs:143:13:143:42 | call to method Throw | | | ExitMethods.cs:145:13:145:44 | call to method Capture | ExitMethods.cs:145:13:145:52 | call to method Throw | | -| ExitMethods.cs:145:13:145:52 | call to method Throw | ExitMethods.cs:140:17:140:42 | exit ExceptionDispatchInfoThrow (abnormal) | exception(Exception) | +| ExitMethods.cs:145:13:145:52 | call to method Throw | ExitMethods.cs:140:17:140:42 | exit ExceptionDispatchInfoThrow (abnormal) | exception | | ExitMethods.cs:145:13:145:53 | ...; | ExitMethods.cs:145:43:145:43 | access to parameter e | | | ExitMethods.cs:145:43:145:43 | access to parameter e | ExitMethods.cs:145:13:145:44 | call to method Capture | | | Extensions.cs:5:23:5:29 | enter ToInt32 | Extensions.cs:6:5:8:5 | {...} | | @@ -1912,18 +1912,18 @@ | Finally.cs:8:5:17:5 | {...} | Finally.cs:9:9:16:9 | try {...} ... | | | Finally.cs:9:9:16:9 | try {...} ... | Finally.cs:10:9:12:9 | {...} | | | Finally.cs:10:9:12:9 | {...} | Finally.cs:11:13:11:38 | ...; | | -| Finally.cs:11:13:11:37 | call to method WriteLine | Finally.cs:14:9:16:9 | [finally: exception(Exception)] {...} | exception(Exception) | +| Finally.cs:11:13:11:37 | call to method WriteLine | Finally.cs:14:9:16:9 | [finally: exception] {...} | exception | | Finally.cs:11:13:11:37 | call to method WriteLine | Finally.cs:14:9:16:9 | {...} | | | Finally.cs:11:13:11:38 | ...; | Finally.cs:11:31:11:36 | "Try1" | | | Finally.cs:11:31:11:36 | "Try1" | Finally.cs:11:13:11:37 | call to method WriteLine | | -| Finally.cs:14:9:16:9 | [finally: exception(Exception)] {...} | Finally.cs:15:13:15:41 | [finally: exception(Exception)] ...; | | +| Finally.cs:14:9:16:9 | [finally: exception] {...} | Finally.cs:15:13:15:41 | [finally: exception] ...; | | | Finally.cs:14:9:16:9 | {...} | Finally.cs:15:13:15:41 | ...; | | -| Finally.cs:15:13:15:40 | [finally: exception(Exception)] call to method WriteLine | Finally.cs:7:10:7:11 | exit M1 (abnormal) | exception(Exception) | +| Finally.cs:15:13:15:40 | [finally: exception] call to method WriteLine | Finally.cs:7:10:7:11 | exit M1 (abnormal) | exception | | Finally.cs:15:13:15:40 | call to method WriteLine | Finally.cs:7:10:7:11 | exit M1 (normal) | | | Finally.cs:15:13:15:41 | ...; | Finally.cs:15:31:15:39 | "Finally" | | -| Finally.cs:15:13:15:41 | [finally: exception(Exception)] ...; | Finally.cs:15:31:15:39 | [finally: exception(Exception)] "Finally" | | +| Finally.cs:15:13:15:41 | [finally: exception] ...; | Finally.cs:15:31:15:39 | [finally: exception] "Finally" | | | Finally.cs:15:31:15:39 | "Finally" | Finally.cs:15:13:15:40 | call to method WriteLine | | -| Finally.cs:15:31:15:39 | [finally: exception(Exception)] "Finally" | Finally.cs:15:13:15:40 | [finally: exception(Exception)] call to method WriteLine | | +| Finally.cs:15:31:15:39 | [finally: exception] "Finally" | Finally.cs:15:13:15:40 | [finally: exception] call to method WriteLine | | | Finally.cs:19:10:19:11 | enter M2 | Finally.cs:20:5:52:5 | {...} | | | Finally.cs:19:10:19:11 | exit M2 (abnormal) | Finally.cs:19:10:19:11 | exit M2 | | | Finally.cs:19:10:19:11 | exit M2 (normal) | Finally.cs:19:10:19:11 | exit M2 | | @@ -1931,7 +1931,7 @@ | Finally.cs:21:9:51:9 | try {...} ... | Finally.cs:22:9:25:9 | {...} | | | Finally.cs:22:9:25:9 | {...} | Finally.cs:23:13:23:38 | ...; | | | Finally.cs:23:13:23:37 | call to method WriteLine | Finally.cs:24:13:24:19 | return ...; | | -| Finally.cs:23:13:23:37 | call to method WriteLine | Finally.cs:26:9:29:9 | [exception: Exception] catch (...) {...} | exception(Exception) | +| Finally.cs:23:13:23:37 | call to method WriteLine | Finally.cs:26:9:29:9 | [exception: Exception] catch (...) {...} | exception | | Finally.cs:23:13:23:38 | ...; | Finally.cs:23:31:23:36 | "Try2" | | | Finally.cs:23:31:23:36 | "Try2" | Finally.cs:23:13:23:37 | call to method WriteLine | | | Finally.cs:24:13:24:19 | return ...; | Finally.cs:49:9:51:9 | [finally: return] {...} | return | @@ -1940,7 +1940,7 @@ | Finally.cs:26:38:26:39 | [exception: Exception] IOException ex | Finally.cs:26:48:26:51 | [exception: Exception] true | | | Finally.cs:26:48:26:51 | [exception: Exception] true | Finally.cs:27:9:29:9 | {...} | true | | Finally.cs:27:9:29:9 | {...} | Finally.cs:28:13:28:18 | throw ...; | | -| Finally.cs:28:13:28:18 | throw ...; | Finally.cs:49:9:51:9 | [finally: exception(IOException)] {...} | exception(IOException) | +| Finally.cs:28:13:28:18 | throw ...; | Finally.cs:49:9:51:9 | [finally: exception] {...} | exception | | Finally.cs:30:9:40:9 | [exception: Exception] catch (...) {...} | Finally.cs:30:41:30:42 | [exception: Exception] ArgumentException ex | match | | Finally.cs:30:9:40:9 | [exception: Exception] catch (...) {...} | Finally.cs:41:9:43:9 | [exception: Exception] catch (...) {...} | no-match | | Finally.cs:30:41:30:42 | [exception: Exception] ArgumentException ex | Finally.cs:31:9:40:9 | {...} | | @@ -1949,28 +1949,24 @@ | Finally.cs:33:13:35:13 | {...} | Finally.cs:34:17:34:32 | if (...) ... | | | Finally.cs:34:17:34:32 | if (...) ... | Finally.cs:34:21:34:24 | true | | | Finally.cs:34:21:34:24 | true | Finally.cs:34:27:34:32 | throw ...; | true | -| Finally.cs:34:27:34:32 | throw ...; | Finally.cs:37:13:39:13 | [finally: exception(ArgumentException)] {...} | exception(ArgumentException) | -| Finally.cs:37:13:39:13 | [finally: exception(ArgumentException)] {...} | Finally.cs:38:37:38:42 | [finally: exception(ArgumentException)] "Boo!" | | -| Finally.cs:38:17:38:44 | [finally: exception(ArgumentException)] throw ...; | Finally.cs:49:9:51:9 | [finally: exception(Exception)] {...} | exception(Exception) | -| Finally.cs:38:23:38:43 | [finally: exception(ArgumentException)] object creation of type Exception | Finally.cs:38:17:38:44 | [finally: exception(ArgumentException)] throw ...; | | -| Finally.cs:38:37:38:42 | [finally: exception(ArgumentException)] "Boo!" | Finally.cs:38:23:38:43 | [finally: exception(ArgumentException)] object creation of type Exception | | +| Finally.cs:34:27:34:32 | throw ...; | Finally.cs:37:13:39:13 | [finally: exception] {...} | exception | +| Finally.cs:37:13:39:13 | [finally: exception] {...} | Finally.cs:38:37:38:42 | [finally: exception] "Boo!" | | +| Finally.cs:38:17:38:44 | [finally: exception] throw ...; | Finally.cs:49:9:51:9 | [finally: exception] {...} | exception | +| Finally.cs:38:23:38:43 | [finally: exception] object creation of type Exception | Finally.cs:38:17:38:44 | [finally: exception] throw ...; | | +| Finally.cs:38:37:38:42 | [finally: exception] "Boo!" | Finally.cs:38:23:38:43 | [finally: exception] object creation of type Exception | | | Finally.cs:41:9:43:9 | [exception: Exception] catch (...) {...} | Finally.cs:42:9:43:9 | {...} | match | | Finally.cs:42:9:43:9 | {...} | Finally.cs:49:9:51:9 | {...} | | -| Finally.cs:49:9:51:9 | [finally: exception(Exception)] {...} | Finally.cs:50:13:50:41 | [finally: exception(Exception)] ...; | | -| Finally.cs:49:9:51:9 | [finally: exception(IOException)] {...} | Finally.cs:50:13:50:41 | [finally: exception(IOException)] ...; | | +| Finally.cs:49:9:51:9 | [finally: exception] {...} | Finally.cs:50:13:50:41 | [finally: exception] ...; | | | Finally.cs:49:9:51:9 | [finally: return] {...} | Finally.cs:50:13:50:41 | [finally: return] ...; | | | Finally.cs:49:9:51:9 | {...} | Finally.cs:50:13:50:41 | ...; | | -| Finally.cs:50:13:50:40 | [finally: exception(Exception)] call to method WriteLine | Finally.cs:19:10:19:11 | exit M2 (abnormal) | exception(Exception) | -| Finally.cs:50:13:50:40 | [finally: exception(IOException)] call to method WriteLine | Finally.cs:19:10:19:11 | exit M2 (abnormal) | exception(IOException) | +| Finally.cs:50:13:50:40 | [finally: exception] call to method WriteLine | Finally.cs:19:10:19:11 | exit M2 (abnormal) | exception | | Finally.cs:50:13:50:40 | [finally: return] call to method WriteLine | Finally.cs:19:10:19:11 | exit M2 (normal) | return | | Finally.cs:50:13:50:40 | call to method WriteLine | Finally.cs:19:10:19:11 | exit M2 (normal) | | | Finally.cs:50:13:50:41 | ...; | Finally.cs:50:31:50:39 | "Finally" | | -| Finally.cs:50:13:50:41 | [finally: exception(Exception)] ...; | Finally.cs:50:31:50:39 | [finally: exception(Exception)] "Finally" | | -| Finally.cs:50:13:50:41 | [finally: exception(IOException)] ...; | Finally.cs:50:31:50:39 | [finally: exception(IOException)] "Finally" | | +| Finally.cs:50:13:50:41 | [finally: exception] ...; | Finally.cs:50:31:50:39 | [finally: exception] "Finally" | | | Finally.cs:50:13:50:41 | [finally: return] ...; | Finally.cs:50:31:50:39 | [finally: return] "Finally" | | | Finally.cs:50:31:50:39 | "Finally" | Finally.cs:50:13:50:40 | call to method WriteLine | | -| Finally.cs:50:31:50:39 | [finally: exception(Exception)] "Finally" | Finally.cs:50:13:50:40 | [finally: exception(Exception)] call to method WriteLine | | -| Finally.cs:50:31:50:39 | [finally: exception(IOException)] "Finally" | Finally.cs:50:13:50:40 | [finally: exception(IOException)] call to method WriteLine | | +| Finally.cs:50:31:50:39 | [finally: exception] "Finally" | Finally.cs:50:13:50:40 | [finally: exception] call to method WriteLine | | | Finally.cs:50:31:50:39 | [finally: return] "Finally" | Finally.cs:50:13:50:40 | [finally: return] call to method WriteLine | | | Finally.cs:54:10:54:11 | enter M3 | Finally.cs:55:5:72:5 | {...} | | | Finally.cs:54:10:54:11 | exit M3 (abnormal) | Finally.cs:54:10:54:11 | exit M3 | | @@ -1979,7 +1975,7 @@ | Finally.cs:56:9:71:9 | try {...} ... | Finally.cs:57:9:60:9 | {...} | | | Finally.cs:57:9:60:9 | {...} | Finally.cs:58:13:58:38 | ...; | | | Finally.cs:58:13:58:37 | call to method WriteLine | Finally.cs:59:13:59:19 | return ...; | | -| Finally.cs:58:13:58:37 | call to method WriteLine | Finally.cs:61:9:64:9 | [exception: Exception] catch (...) {...} | exception(Exception) | +| Finally.cs:58:13:58:37 | call to method WriteLine | Finally.cs:61:9:64:9 | [exception: Exception] catch (...) {...} | exception | | Finally.cs:58:13:58:38 | ...; | Finally.cs:58:31:58:36 | "Try3" | | | Finally.cs:58:31:58:36 | "Try3" | Finally.cs:58:13:58:37 | call to method WriteLine | | | Finally.cs:59:13:59:19 | return ...; | Finally.cs:69:9:71:9 | [finally: return] {...} | return | @@ -1988,30 +1984,26 @@ | Finally.cs:61:38:61:39 | [exception: Exception] IOException ex | Finally.cs:61:48:61:51 | [exception: Exception] true | | | Finally.cs:61:48:61:51 | [exception: Exception] true | Finally.cs:62:9:64:9 | {...} | true | | Finally.cs:62:9:64:9 | {...} | Finally.cs:63:13:63:18 | throw ...; | | -| Finally.cs:63:13:63:18 | throw ...; | Finally.cs:69:9:71:9 | [finally: exception(IOException)] {...} | exception(IOException) | +| Finally.cs:63:13:63:18 | throw ...; | Finally.cs:69:9:71:9 | [finally: exception] {...} | exception | | Finally.cs:65:9:67:9 | [exception: Exception] catch (...) {...} | Finally.cs:65:26:65:26 | [exception: Exception] Exception e | match | | Finally.cs:65:26:65:26 | [exception: Exception] Exception e | Finally.cs:65:35:65:35 | [exception: Exception] access to local variable e | | | Finally.cs:65:35:65:35 | [exception: Exception] access to local variable e | Finally.cs:65:35:65:43 | [exception: Exception] access to property Message | | | Finally.cs:65:35:65:43 | [exception: Exception] access to property Message | Finally.cs:65:48:65:51 | [exception: Exception] null | | | Finally.cs:65:35:65:51 | [exception: Exception] ... != ... | Finally.cs:66:9:67:9 | {...} | true | -| Finally.cs:65:35:65:51 | [exception: Exception] ... != ... | Finally.cs:69:9:71:9 | [finally: exception(Exception)] {...} | exception(Exception) | +| Finally.cs:65:35:65:51 | [exception: Exception] ... != ... | Finally.cs:69:9:71:9 | [finally: exception] {...} | exception | | Finally.cs:65:48:65:51 | [exception: Exception] null | Finally.cs:65:35:65:51 | [exception: Exception] ... != ... | | | Finally.cs:66:9:67:9 | {...} | Finally.cs:69:9:71:9 | {...} | | -| Finally.cs:69:9:71:9 | [finally: exception(Exception)] {...} | Finally.cs:70:13:70:41 | [finally: exception(Exception)] ...; | | -| Finally.cs:69:9:71:9 | [finally: exception(IOException)] {...} | Finally.cs:70:13:70:41 | [finally: exception(IOException)] ...; | | +| Finally.cs:69:9:71:9 | [finally: exception] {...} | Finally.cs:70:13:70:41 | [finally: exception] ...; | | | Finally.cs:69:9:71:9 | [finally: return] {...} | Finally.cs:70:13:70:41 | [finally: return] ...; | | | Finally.cs:69:9:71:9 | {...} | Finally.cs:70:13:70:41 | ...; | | -| Finally.cs:70:13:70:40 | [finally: exception(Exception)] call to method WriteLine | Finally.cs:54:10:54:11 | exit M3 (abnormal) | exception(Exception) | -| Finally.cs:70:13:70:40 | [finally: exception(IOException)] call to method WriteLine | Finally.cs:54:10:54:11 | exit M3 (abnormal) | exception(IOException) | +| Finally.cs:70:13:70:40 | [finally: exception] call to method WriteLine | Finally.cs:54:10:54:11 | exit M3 (abnormal) | exception | | Finally.cs:70:13:70:40 | [finally: return] call to method WriteLine | Finally.cs:54:10:54:11 | exit M3 (normal) | return | | Finally.cs:70:13:70:40 | call to method WriteLine | Finally.cs:54:10:54:11 | exit M3 (normal) | | | Finally.cs:70:13:70:41 | ...; | Finally.cs:70:31:70:39 | "Finally" | | -| Finally.cs:70:13:70:41 | [finally: exception(Exception)] ...; | Finally.cs:70:31:70:39 | [finally: exception(Exception)] "Finally" | | -| Finally.cs:70:13:70:41 | [finally: exception(IOException)] ...; | Finally.cs:70:31:70:39 | [finally: exception(IOException)] "Finally" | | +| Finally.cs:70:13:70:41 | [finally: exception] ...; | Finally.cs:70:31:70:39 | [finally: exception] "Finally" | | | Finally.cs:70:13:70:41 | [finally: return] ...; | Finally.cs:70:31:70:39 | [finally: return] "Finally" | | | Finally.cs:70:31:70:39 | "Finally" | Finally.cs:70:13:70:40 | call to method WriteLine | | -| Finally.cs:70:31:70:39 | [finally: exception(Exception)] "Finally" | Finally.cs:70:13:70:40 | [finally: exception(Exception)] call to method WriteLine | | -| Finally.cs:70:31:70:39 | [finally: exception(IOException)] "Finally" | Finally.cs:70:13:70:40 | [finally: exception(IOException)] call to method WriteLine | | +| Finally.cs:70:31:70:39 | [finally: exception] "Finally" | Finally.cs:70:13:70:40 | [finally: exception] call to method WriteLine | | | Finally.cs:70:31:70:39 | [finally: return] "Finally" | Finally.cs:70:13:70:40 | [finally: return] call to method WriteLine | | | Finally.cs:74:10:74:11 | enter M4 | Finally.cs:75:5:101:5 | {...} | | | Finally.cs:74:10:74:11 | exit M4 (abnormal) | Finally.cs:74:10:74:11 | exit M4 | | @@ -2078,49 +2070,49 @@ | Finally.cs:92:30:92:30 | [finally: break] 3 | Finally.cs:92:25:92:30 | [finally: break] ... == ... | | | Finally.cs:92:30:92:30 | [finally: continue] 3 | Finally.cs:92:25:92:30 | [finally: continue] ... == ... | | | Finally.cs:92:30:92:30 | [finally: return] 3 | Finally.cs:92:25:92:30 | [finally: return] ... == ... | | -| Finally.cs:93:25:93:46 | [finally: break] throw ...; | Finally.cs:96:17:98:17 | [finally: break, finally(1): exception(Exception)] {...} | exception(Exception) | -| Finally.cs:93:25:93:46 | [finally: continue] throw ...; | Finally.cs:96:17:98:17 | [finally: continue, finally(1): exception(Exception)] {...} | exception(Exception) | -| Finally.cs:93:25:93:46 | [finally: return] throw ...; | Finally.cs:96:17:98:17 | [finally: return, finally(1): exception(Exception)] {...} | exception(Exception) | -| Finally.cs:93:25:93:46 | throw ...; | Finally.cs:96:17:98:17 | [finally(1): exception(Exception)] {...} | exception(Exception) | +| Finally.cs:93:25:93:46 | [finally: break] throw ...; | Finally.cs:96:17:98:17 | [finally: break, finally(1): exception] {...} | exception | +| Finally.cs:93:25:93:46 | [finally: continue] throw ...; | Finally.cs:96:17:98:17 | [finally: continue, finally(1): exception] {...} | exception | +| Finally.cs:93:25:93:46 | [finally: return] throw ...; | Finally.cs:96:17:98:17 | [finally: return, finally(1): exception] {...} | exception | +| Finally.cs:93:25:93:46 | throw ...; | Finally.cs:96:17:98:17 | [finally(1): exception] {...} | exception | | Finally.cs:93:31:93:45 | [finally: break] object creation of type Exception | Finally.cs:93:25:93:46 | [finally: break] throw ...; | | -| Finally.cs:93:31:93:45 | [finally: break] object creation of type Exception | Finally.cs:96:17:98:17 | [finally: break, finally(1): exception(Exception)] {...} | exception(Exception) | +| Finally.cs:93:31:93:45 | [finally: break] object creation of type Exception | Finally.cs:96:17:98:17 | [finally: break, finally(1): exception] {...} | exception | | Finally.cs:93:31:93:45 | [finally: continue] object creation of type Exception | Finally.cs:93:25:93:46 | [finally: continue] throw ...; | | -| Finally.cs:93:31:93:45 | [finally: continue] object creation of type Exception | Finally.cs:96:17:98:17 | [finally: continue, finally(1): exception(Exception)] {...} | exception(Exception) | +| Finally.cs:93:31:93:45 | [finally: continue] object creation of type Exception | Finally.cs:96:17:98:17 | [finally: continue, finally(1): exception] {...} | exception | | Finally.cs:93:31:93:45 | [finally: return] object creation of type Exception | Finally.cs:93:25:93:46 | [finally: return] throw ...; | | -| Finally.cs:93:31:93:45 | [finally: return] object creation of type Exception | Finally.cs:96:17:98:17 | [finally: return, finally(1): exception(Exception)] {...} | exception(Exception) | +| Finally.cs:93:31:93:45 | [finally: return] object creation of type Exception | Finally.cs:96:17:98:17 | [finally: return, finally(1): exception] {...} | exception | | Finally.cs:93:31:93:45 | object creation of type Exception | Finally.cs:93:25:93:46 | throw ...; | | -| Finally.cs:93:31:93:45 | object creation of type Exception | Finally.cs:96:17:98:17 | [finally(1): exception(Exception)] {...} | exception(Exception) | -| Finally.cs:96:17:98:17 | [finally(1): exception(Exception)] {...} | Finally.cs:97:21:97:24 | [finally(1): exception(Exception)] ...; | | -| Finally.cs:96:17:98:17 | [finally: break, finally(1): exception(Exception)] {...} | Finally.cs:97:21:97:24 | [finally: break, finally(1): exception(Exception)] ...; | | +| Finally.cs:93:31:93:45 | object creation of type Exception | Finally.cs:96:17:98:17 | [finally(1): exception] {...} | exception | +| Finally.cs:96:17:98:17 | [finally(1): exception] {...} | Finally.cs:97:21:97:24 | [finally(1): exception] ...; | | +| Finally.cs:96:17:98:17 | [finally: break, finally(1): exception] {...} | Finally.cs:97:21:97:24 | [finally: break, finally(1): exception] ...; | | | Finally.cs:96:17:98:17 | [finally: break] {...} | Finally.cs:97:21:97:24 | [finally: break] ...; | | -| Finally.cs:96:17:98:17 | [finally: continue, finally(1): exception(Exception)] {...} | Finally.cs:97:21:97:24 | [finally: continue, finally(1): exception(Exception)] ...; | | +| Finally.cs:96:17:98:17 | [finally: continue, finally(1): exception] {...} | Finally.cs:97:21:97:24 | [finally: continue, finally(1): exception] ...; | | | Finally.cs:96:17:98:17 | [finally: continue] {...} | Finally.cs:97:21:97:24 | [finally: continue] ...; | | -| Finally.cs:96:17:98:17 | [finally: return, finally(1): exception(Exception)] {...} | Finally.cs:97:21:97:24 | [finally: return, finally(1): exception(Exception)] ...; | | +| Finally.cs:96:17:98:17 | [finally: return, finally(1): exception] {...} | Finally.cs:97:21:97:24 | [finally: return, finally(1): exception] ...; | | | Finally.cs:96:17:98:17 | [finally: return] {...} | Finally.cs:97:21:97:24 | [finally: return] ...; | | | Finally.cs:96:17:98:17 | {...} | Finally.cs:97:21:97:24 | ...; | | -| Finally.cs:97:21:97:21 | [finally(1): exception(Exception)] access to local variable i | Finally.cs:97:21:97:23 | [finally(1): exception(Exception)] ...-- | | -| Finally.cs:97:21:97:21 | [finally: break, finally(1): exception(Exception)] access to local variable i | Finally.cs:97:21:97:23 | [finally: break, finally(1): exception(Exception)] ...-- | | +| Finally.cs:97:21:97:21 | [finally(1): exception] access to local variable i | Finally.cs:97:21:97:23 | [finally(1): exception] ...-- | | +| Finally.cs:97:21:97:21 | [finally: break, finally(1): exception] access to local variable i | Finally.cs:97:21:97:23 | [finally: break, finally(1): exception] ...-- | | | Finally.cs:97:21:97:21 | [finally: break] access to local variable i | Finally.cs:97:21:97:23 | [finally: break] ...-- | | -| Finally.cs:97:21:97:21 | [finally: continue, finally(1): exception(Exception)] access to local variable i | Finally.cs:97:21:97:23 | [finally: continue, finally(1): exception(Exception)] ...-- | | +| Finally.cs:97:21:97:21 | [finally: continue, finally(1): exception] access to local variable i | Finally.cs:97:21:97:23 | [finally: continue, finally(1): exception] ...-- | | | Finally.cs:97:21:97:21 | [finally: continue] access to local variable i | Finally.cs:97:21:97:23 | [finally: continue] ...-- | | -| Finally.cs:97:21:97:21 | [finally: return, finally(1): exception(Exception)] access to local variable i | Finally.cs:97:21:97:23 | [finally: return, finally(1): exception(Exception)] ...-- | | +| Finally.cs:97:21:97:21 | [finally: return, finally(1): exception] access to local variable i | Finally.cs:97:21:97:23 | [finally: return, finally(1): exception] ...-- | | | Finally.cs:97:21:97:21 | [finally: return] access to local variable i | Finally.cs:97:21:97:23 | [finally: return] ...-- | | | Finally.cs:97:21:97:21 | access to local variable i | Finally.cs:97:21:97:23 | ...-- | | | Finally.cs:97:21:97:23 | ...-- | Finally.cs:77:16:77:16 | access to local variable i | | -| Finally.cs:97:21:97:23 | [finally(1): exception(Exception)] ...-- | Finally.cs:74:10:74:11 | exit M4 (abnormal) | exception(Exception) | -| Finally.cs:97:21:97:23 | [finally: break, finally(1): exception(Exception)] ...-- | Finally.cs:74:10:74:11 | exit M4 (abnormal) | exception(Exception) | +| Finally.cs:97:21:97:23 | [finally(1): exception] ...-- | Finally.cs:74:10:74:11 | exit M4 (abnormal) | exception | +| Finally.cs:97:21:97:23 | [finally: break, finally(1): exception] ...-- | Finally.cs:74:10:74:11 | exit M4 (abnormal) | exception | | Finally.cs:97:21:97:23 | [finally: break] ...-- | Finally.cs:74:10:74:11 | exit M4 (normal) | break | -| Finally.cs:97:21:97:23 | [finally: continue, finally(1): exception(Exception)] ...-- | Finally.cs:74:10:74:11 | exit M4 (abnormal) | exception(Exception) | +| Finally.cs:97:21:97:23 | [finally: continue, finally(1): exception] ...-- | Finally.cs:74:10:74:11 | exit M4 (abnormal) | exception | | Finally.cs:97:21:97:23 | [finally: continue] ...-- | Finally.cs:77:16:77:16 | access to local variable i | continue | -| Finally.cs:97:21:97:23 | [finally: return, finally(1): exception(Exception)] ...-- | Finally.cs:74:10:74:11 | exit M4 (abnormal) | exception(Exception) | +| Finally.cs:97:21:97:23 | [finally: return, finally(1): exception] ...-- | Finally.cs:74:10:74:11 | exit M4 (abnormal) | exception | | Finally.cs:97:21:97:23 | [finally: return] ...-- | Finally.cs:74:10:74:11 | exit M4 (normal) | return | | Finally.cs:97:21:97:24 | ...; | Finally.cs:97:21:97:21 | access to local variable i | | -| Finally.cs:97:21:97:24 | [finally(1): exception(Exception)] ...; | Finally.cs:97:21:97:21 | [finally(1): exception(Exception)] access to local variable i | | -| Finally.cs:97:21:97:24 | [finally: break, finally(1): exception(Exception)] ...; | Finally.cs:97:21:97:21 | [finally: break, finally(1): exception(Exception)] access to local variable i | | +| Finally.cs:97:21:97:24 | [finally(1): exception] ...; | Finally.cs:97:21:97:21 | [finally(1): exception] access to local variable i | | +| Finally.cs:97:21:97:24 | [finally: break, finally(1): exception] ...; | Finally.cs:97:21:97:21 | [finally: break, finally(1): exception] access to local variable i | | | Finally.cs:97:21:97:24 | [finally: break] ...; | Finally.cs:97:21:97:21 | [finally: break] access to local variable i | | -| Finally.cs:97:21:97:24 | [finally: continue, finally(1): exception(Exception)] ...; | Finally.cs:97:21:97:21 | [finally: continue, finally(1): exception(Exception)] access to local variable i | | +| Finally.cs:97:21:97:24 | [finally: continue, finally(1): exception] ...; | Finally.cs:97:21:97:21 | [finally: continue, finally(1): exception] access to local variable i | | | Finally.cs:97:21:97:24 | [finally: continue] ...; | Finally.cs:97:21:97:21 | [finally: continue] access to local variable i | | -| Finally.cs:97:21:97:24 | [finally: return, finally(1): exception(Exception)] ...; | Finally.cs:97:21:97:21 | [finally: return, finally(1): exception(Exception)] access to local variable i | | +| Finally.cs:97:21:97:24 | [finally: return, finally(1): exception] ...; | Finally.cs:97:21:97:21 | [finally: return, finally(1): exception] access to local variable i | | | Finally.cs:97:21:97:24 | [finally: return] ...; | Finally.cs:97:21:97:21 | [finally: return] access to local variable i | | | Finally.cs:103:10:103:11 | enter M5 | Finally.cs:104:5:119:5 | {...} | | | Finally.cs:103:10:103:11 | exit M5 (abnormal) | Finally.cs:103:10:103:11 | exit M5 | | @@ -2130,147 +2122,97 @@ | Finally.cs:106:9:111:9 | {...} | Finally.cs:107:13:108:23 | if (...) ... | | | Finally.cs:107:13:108:23 | if (...) ... | Finally.cs:107:17:107:21 | this access | | | Finally.cs:107:17:107:21 | access to field Field | Finally.cs:107:17:107:28 | access to property Length | | -| Finally.cs:107:17:107:21 | access to field Field | Finally.cs:113:9:118:9 | [finally: exception(NullReferenceException)] {...} | exception(NullReferenceException) | +| Finally.cs:107:17:107:21 | access to field Field | Finally.cs:113:9:118:9 | [finally: exception] {...} | exception | | Finally.cs:107:17:107:21 | this access | Finally.cs:107:17:107:21 | access to field Field | | | Finally.cs:107:17:107:28 | access to property Length | Finally.cs:107:33:107:33 | 0 | | -| Finally.cs:107:17:107:28 | access to property Length | Finally.cs:113:9:118:9 | [finally: exception(Exception)] {...} | exception(Exception) | -| Finally.cs:107:17:107:28 | access to property Length | Finally.cs:113:9:118:9 | [finally: exception(NullReferenceException)] {...} | exception(NullReferenceException) | +| Finally.cs:107:17:107:28 | access to property Length | Finally.cs:113:9:118:9 | [finally: exception] {...} | exception | | Finally.cs:107:17:107:33 | ... == ... | Finally.cs:108:17:108:23 | return ...; | true | | Finally.cs:107:17:107:33 | ... == ... | Finally.cs:109:13:110:49 | if (...) ... | false | | Finally.cs:107:33:107:33 | 0 | Finally.cs:107:17:107:33 | ... == ... | | | Finally.cs:108:17:108:23 | return ...; | Finally.cs:113:9:118:9 | [finally: return] {...} | return | | Finally.cs:109:13:110:49 | if (...) ... | Finally.cs:109:17:109:21 | this access | | | Finally.cs:109:17:109:21 | access to field Field | Finally.cs:109:17:109:28 | access to property Length | | -| Finally.cs:109:17:109:21 | access to field Field | Finally.cs:113:9:118:9 | [finally: exception(NullReferenceException)] {...} | exception(NullReferenceException) | +| Finally.cs:109:17:109:21 | access to field Field | Finally.cs:113:9:118:9 | [finally: exception] {...} | exception | | Finally.cs:109:17:109:21 | this access | Finally.cs:109:17:109:21 | access to field Field | | | Finally.cs:109:17:109:28 | access to property Length | Finally.cs:109:33:109:33 | 1 | | -| Finally.cs:109:17:109:28 | access to property Length | Finally.cs:113:9:118:9 | [finally: exception(Exception)] {...} | exception(Exception) | -| Finally.cs:109:17:109:28 | access to property Length | Finally.cs:113:9:118:9 | [finally: exception(NullReferenceException)] {...} | exception(NullReferenceException) | +| Finally.cs:109:17:109:28 | access to property Length | Finally.cs:113:9:118:9 | [finally: exception] {...} | exception | | Finally.cs:109:17:109:33 | ... == ... | Finally.cs:110:23:110:48 | object creation of type OutOfMemoryException | true | | Finally.cs:109:17:109:33 | ... == ... | Finally.cs:113:9:118:9 | {...} | false | | Finally.cs:109:33:109:33 | 1 | Finally.cs:109:17:109:33 | ... == ... | | -| Finally.cs:110:17:110:49 | throw ...; | Finally.cs:113:9:118:9 | [finally: exception(OutOfMemoryException)] {...} | exception(OutOfMemoryException) | +| Finally.cs:110:17:110:49 | throw ...; | Finally.cs:113:9:118:9 | [finally: exception] {...} | exception | | Finally.cs:110:23:110:48 | object creation of type OutOfMemoryException | Finally.cs:110:17:110:49 | throw ...; | | -| Finally.cs:110:23:110:48 | object creation of type OutOfMemoryException | Finally.cs:113:9:118:9 | [finally: exception(Exception)] {...} | exception(Exception) | -| Finally.cs:113:9:118:9 | [finally: exception(Exception)] {...} | Finally.cs:114:13:115:41 | [finally: exception(Exception)] if (...) ... | | -| Finally.cs:113:9:118:9 | [finally: exception(NullReferenceException)] {...} | Finally.cs:114:13:115:41 | [finally: exception(NullReferenceException)] if (...) ... | | -| Finally.cs:113:9:118:9 | [finally: exception(OutOfMemoryException)] {...} | Finally.cs:114:13:115:41 | [finally: exception(OutOfMemoryException)] if (...) ... | | +| Finally.cs:110:23:110:48 | object creation of type OutOfMemoryException | Finally.cs:113:9:118:9 | [finally: exception] {...} | exception | +| Finally.cs:113:9:118:9 | [finally: exception] {...} | Finally.cs:114:13:115:41 | [finally: exception] if (...) ... | | | Finally.cs:113:9:118:9 | [finally: return] {...} | Finally.cs:114:13:115:41 | [finally: return] if (...) ... | | | Finally.cs:113:9:118:9 | {...} | Finally.cs:114:13:115:41 | if (...) ... | | -| Finally.cs:114:13:115:41 | [finally: exception(Exception)] if (...) ... | Finally.cs:114:19:114:23 | [finally: exception(Exception)] this access | | -| Finally.cs:114:13:115:41 | [finally: exception(NullReferenceException)] if (...) ... | Finally.cs:114:19:114:23 | [finally: exception(NullReferenceException)] this access | | -| Finally.cs:114:13:115:41 | [finally: exception(OutOfMemoryException)] if (...) ... | Finally.cs:114:19:114:23 | [finally: exception(OutOfMemoryException)] this access | | +| Finally.cs:114:13:115:41 | [finally: exception] if (...) ... | Finally.cs:114:19:114:23 | [finally: exception] this access | | | Finally.cs:114:13:115:41 | [finally: return] if (...) ... | Finally.cs:114:19:114:23 | [finally: return] this access | | | Finally.cs:114:13:115:41 | if (...) ... | Finally.cs:114:19:114:23 | this access | | -| Finally.cs:114:17:114:36 | [false, finally: exception(Exception)] !... | Finally.cs:116:13:117:37 | [finally: exception(Exception)] if (...) ... | false | -| Finally.cs:114:17:114:36 | [false, finally: exception(NullReferenceException)] !... | Finally.cs:116:13:117:37 | [finally: exception(NullReferenceException)] if (...) ... | false | -| Finally.cs:114:17:114:36 | [false, finally: exception(OutOfMemoryException)] !... | Finally.cs:116:13:117:37 | [finally: exception(OutOfMemoryException)] if (...) ... | false | +| Finally.cs:114:17:114:36 | [false, finally: exception] !... | Finally.cs:116:13:117:37 | [finally: exception] if (...) ... | false | | Finally.cs:114:17:114:36 | [false, finally: return] !... | Finally.cs:116:13:117:37 | [finally: return] if (...) ... | false | | Finally.cs:114:17:114:36 | [false] !... | Finally.cs:116:13:117:37 | if (...) ... | false | -| Finally.cs:114:17:114:36 | [true, finally: exception(Exception)] !... | Finally.cs:115:17:115:41 | [finally: exception(Exception)] ...; | true | -| Finally.cs:114:17:114:36 | [true, finally: exception(NullReferenceException)] !... | Finally.cs:115:17:115:41 | [finally: exception(NullReferenceException)] ...; | true | -| Finally.cs:114:17:114:36 | [true, finally: exception(OutOfMemoryException)] !... | Finally.cs:115:17:115:41 | [finally: exception(OutOfMemoryException)] ...; | true | +| Finally.cs:114:17:114:36 | [true, finally: exception] !... | Finally.cs:115:17:115:41 | [finally: exception] ...; | true | | Finally.cs:114:17:114:36 | [true, finally: return] !... | Finally.cs:115:17:115:41 | [finally: return] ...; | true | | Finally.cs:114:17:114:36 | [true] !... | Finally.cs:115:17:115:41 | ...; | true | -| Finally.cs:114:19:114:23 | [finally: exception(Exception)] access to field Field | Finally.cs:114:19:114:30 | [finally: exception(Exception)] access to property Length | | -| Finally.cs:114:19:114:23 | [finally: exception(Exception)] this access | Finally.cs:114:19:114:23 | [finally: exception(Exception)] access to field Field | | -| Finally.cs:114:19:114:23 | [finally: exception(NullReferenceException)] access to field Field | Finally.cs:114:19:114:30 | [finally: exception(NullReferenceException)] access to property Length | | -| Finally.cs:114:19:114:23 | [finally: exception(NullReferenceException)] this access | Finally.cs:114:19:114:23 | [finally: exception(NullReferenceException)] access to field Field | | -| Finally.cs:114:19:114:23 | [finally: exception(OutOfMemoryException)] access to field Field | Finally.cs:114:19:114:30 | [finally: exception(OutOfMemoryException)] access to property Length | | -| Finally.cs:114:19:114:23 | [finally: exception(OutOfMemoryException)] this access | Finally.cs:114:19:114:23 | [finally: exception(OutOfMemoryException)] access to field Field | | +| Finally.cs:114:19:114:23 | [finally: exception] access to field Field | Finally.cs:114:19:114:30 | [finally: exception] access to property Length | | +| Finally.cs:114:19:114:23 | [finally: exception] this access | Finally.cs:114:19:114:23 | [finally: exception] access to field Field | | | Finally.cs:114:19:114:23 | [finally: return] access to field Field | Finally.cs:114:19:114:30 | [finally: return] access to property Length | | | Finally.cs:114:19:114:23 | [finally: return] this access | Finally.cs:114:19:114:23 | [finally: return] access to field Field | | | Finally.cs:114:19:114:23 | access to field Field | Finally.cs:114:19:114:30 | access to property Length | | | Finally.cs:114:19:114:23 | this access | Finally.cs:114:19:114:23 | access to field Field | | -| Finally.cs:114:19:114:30 | [finally: exception(Exception)] access to property Length | Finally.cs:114:35:114:35 | [finally: exception(Exception)] 0 | | -| Finally.cs:114:19:114:30 | [finally: exception(NullReferenceException)] access to property Length | Finally.cs:114:35:114:35 | [finally: exception(NullReferenceException)] 0 | | -| Finally.cs:114:19:114:30 | [finally: exception(OutOfMemoryException)] access to property Length | Finally.cs:114:35:114:35 | [finally: exception(OutOfMemoryException)] 0 | | +| Finally.cs:114:19:114:30 | [finally: exception] access to property Length | Finally.cs:114:35:114:35 | [finally: exception] 0 | | | Finally.cs:114:19:114:30 | [finally: return] access to property Length | Finally.cs:114:35:114:35 | [finally: return] 0 | | | Finally.cs:114:19:114:30 | access to property Length | Finally.cs:114:35:114:35 | 0 | | | Finally.cs:114:19:114:35 | ... == ... | Finally.cs:114:17:114:36 | [false] !... | true | | Finally.cs:114:19:114:35 | ... == ... | Finally.cs:114:17:114:36 | [true] !... | false | -| Finally.cs:114:19:114:35 | [finally: exception(Exception)] ... == ... | Finally.cs:114:17:114:36 | [false, finally: exception(Exception)] !... | true | -| Finally.cs:114:19:114:35 | [finally: exception(Exception)] ... == ... | Finally.cs:114:17:114:36 | [true, finally: exception(Exception)] !... | false | -| Finally.cs:114:19:114:35 | [finally: exception(NullReferenceException)] ... == ... | Finally.cs:114:17:114:36 | [false, finally: exception(NullReferenceException)] !... | true | -| Finally.cs:114:19:114:35 | [finally: exception(NullReferenceException)] ... == ... | Finally.cs:114:17:114:36 | [true, finally: exception(NullReferenceException)] !... | false | -| Finally.cs:114:19:114:35 | [finally: exception(OutOfMemoryException)] ... == ... | Finally.cs:114:17:114:36 | [false, finally: exception(OutOfMemoryException)] !... | true | -| Finally.cs:114:19:114:35 | [finally: exception(OutOfMemoryException)] ... == ... | Finally.cs:114:17:114:36 | [true, finally: exception(OutOfMemoryException)] !... | false | +| Finally.cs:114:19:114:35 | [finally: exception] ... == ... | Finally.cs:114:17:114:36 | [false, finally: exception] !... | true | +| Finally.cs:114:19:114:35 | [finally: exception] ... == ... | Finally.cs:114:17:114:36 | [true, finally: exception] !... | false | | Finally.cs:114:19:114:35 | [finally: return] ... == ... | Finally.cs:114:17:114:36 | [false, finally: return] !... | true | | Finally.cs:114:19:114:35 | [finally: return] ... == ... | Finally.cs:114:17:114:36 | [true, finally: return] !... | false | | Finally.cs:114:35:114:35 | 0 | Finally.cs:114:19:114:35 | ... == ... | | -| Finally.cs:114:35:114:35 | [finally: exception(Exception)] 0 | Finally.cs:114:19:114:35 | [finally: exception(Exception)] ... == ... | | -| Finally.cs:114:35:114:35 | [finally: exception(NullReferenceException)] 0 | Finally.cs:114:19:114:35 | [finally: exception(NullReferenceException)] ... == ... | | -| Finally.cs:114:35:114:35 | [finally: exception(OutOfMemoryException)] 0 | Finally.cs:114:19:114:35 | [finally: exception(OutOfMemoryException)] ... == ... | | +| Finally.cs:114:35:114:35 | [finally: exception] 0 | Finally.cs:114:19:114:35 | [finally: exception] ... == ... | | | Finally.cs:114:35:114:35 | [finally: return] 0 | Finally.cs:114:19:114:35 | [finally: return] ... == ... | | -| Finally.cs:115:17:115:40 | [finally: exception(Exception)] call to method WriteLine | Finally.cs:116:13:117:37 | [finally: exception(Exception)] if (...) ... | | -| Finally.cs:115:17:115:40 | [finally: exception(NullReferenceException)] call to method WriteLine | Finally.cs:116:13:117:37 | [finally: exception(NullReferenceException)] if (...) ... | | -| Finally.cs:115:17:115:40 | [finally: exception(OutOfMemoryException)] call to method WriteLine | Finally.cs:116:13:117:37 | [finally: exception(OutOfMemoryException)] if (...) ... | | +| Finally.cs:115:17:115:40 | [finally: exception] call to method WriteLine | Finally.cs:116:13:117:37 | [finally: exception] if (...) ... | | | Finally.cs:115:17:115:40 | [finally: return] call to method WriteLine | Finally.cs:116:13:117:37 | [finally: return] if (...) ... | | | Finally.cs:115:17:115:40 | call to method WriteLine | Finally.cs:116:13:117:37 | if (...) ... | | | Finally.cs:115:17:115:41 | ...; | Finally.cs:115:35:115:39 | this access | | -| Finally.cs:115:17:115:41 | [finally: exception(Exception)] ...; | Finally.cs:115:35:115:39 | [finally: exception(Exception)] this access | | -| Finally.cs:115:17:115:41 | [finally: exception(NullReferenceException)] ...; | Finally.cs:115:35:115:39 | [finally: exception(NullReferenceException)] this access | | -| Finally.cs:115:17:115:41 | [finally: exception(OutOfMemoryException)] ...; | Finally.cs:115:35:115:39 | [finally: exception(OutOfMemoryException)] this access | | +| Finally.cs:115:17:115:41 | [finally: exception] ...; | Finally.cs:115:35:115:39 | [finally: exception] this access | | | Finally.cs:115:17:115:41 | [finally: return] ...; | Finally.cs:115:35:115:39 | [finally: return] this access | | -| Finally.cs:115:35:115:39 | [finally: exception(Exception)] access to field Field | Finally.cs:115:17:115:40 | [finally: exception(Exception)] call to method WriteLine | | -| Finally.cs:115:35:115:39 | [finally: exception(Exception)] this access | Finally.cs:115:35:115:39 | [finally: exception(Exception)] access to field Field | | -| Finally.cs:115:35:115:39 | [finally: exception(NullReferenceException)] access to field Field | Finally.cs:115:17:115:40 | [finally: exception(NullReferenceException)] call to method WriteLine | | -| Finally.cs:115:35:115:39 | [finally: exception(NullReferenceException)] this access | Finally.cs:115:35:115:39 | [finally: exception(NullReferenceException)] access to field Field | | -| Finally.cs:115:35:115:39 | [finally: exception(OutOfMemoryException)] access to field Field | Finally.cs:115:17:115:40 | [finally: exception(OutOfMemoryException)] call to method WriteLine | | -| Finally.cs:115:35:115:39 | [finally: exception(OutOfMemoryException)] this access | Finally.cs:115:35:115:39 | [finally: exception(OutOfMemoryException)] access to field Field | | +| Finally.cs:115:35:115:39 | [finally: exception] access to field Field | Finally.cs:115:17:115:40 | [finally: exception] call to method WriteLine | | +| Finally.cs:115:35:115:39 | [finally: exception] this access | Finally.cs:115:35:115:39 | [finally: exception] access to field Field | | | Finally.cs:115:35:115:39 | [finally: return] access to field Field | Finally.cs:115:17:115:40 | [finally: return] call to method WriteLine | | | Finally.cs:115:35:115:39 | [finally: return] this access | Finally.cs:115:35:115:39 | [finally: return] access to field Field | | | Finally.cs:115:35:115:39 | access to field Field | Finally.cs:115:17:115:40 | call to method WriteLine | | | Finally.cs:115:35:115:39 | this access | Finally.cs:115:35:115:39 | access to field Field | | -| Finally.cs:116:13:117:37 | [finally: exception(Exception)] if (...) ... | Finally.cs:116:17:116:21 | [finally: exception(Exception)] this access | | -| Finally.cs:116:13:117:37 | [finally: exception(NullReferenceException)] if (...) ... | Finally.cs:116:17:116:21 | [finally: exception(NullReferenceException)] this access | | -| Finally.cs:116:13:117:37 | [finally: exception(OutOfMemoryException)] if (...) ... | Finally.cs:116:17:116:21 | [finally: exception(OutOfMemoryException)] this access | | +| Finally.cs:116:13:117:37 | [finally: exception] if (...) ... | Finally.cs:116:17:116:21 | [finally: exception] this access | | | Finally.cs:116:13:117:37 | [finally: return] if (...) ... | Finally.cs:116:17:116:21 | [finally: return] this access | | | Finally.cs:116:13:117:37 | if (...) ... | Finally.cs:116:17:116:21 | this access | | -| Finally.cs:116:17:116:21 | [finally: exception(Exception)] access to field Field | Finally.cs:116:17:116:28 | [finally: exception(Exception)] access to property Length | | -| Finally.cs:116:17:116:21 | [finally: exception(Exception)] this access | Finally.cs:116:17:116:21 | [finally: exception(Exception)] access to field Field | | -| Finally.cs:116:17:116:21 | [finally: exception(NullReferenceException)] access to field Field | Finally.cs:116:17:116:28 | [finally: exception(NullReferenceException)] access to property Length | | -| Finally.cs:116:17:116:21 | [finally: exception(NullReferenceException)] this access | Finally.cs:116:17:116:21 | [finally: exception(NullReferenceException)] access to field Field | | -| Finally.cs:116:17:116:21 | [finally: exception(OutOfMemoryException)] access to field Field | Finally.cs:116:17:116:28 | [finally: exception(OutOfMemoryException)] access to property Length | | -| Finally.cs:116:17:116:21 | [finally: exception(OutOfMemoryException)] this access | Finally.cs:116:17:116:21 | [finally: exception(OutOfMemoryException)] access to field Field | | +| Finally.cs:116:17:116:21 | [finally: exception] access to field Field | Finally.cs:116:17:116:28 | [finally: exception] access to property Length | | +| Finally.cs:116:17:116:21 | [finally: exception] this access | Finally.cs:116:17:116:21 | [finally: exception] access to field Field | | | Finally.cs:116:17:116:21 | [finally: return] access to field Field | Finally.cs:116:17:116:28 | [finally: return] access to property Length | | | Finally.cs:116:17:116:21 | [finally: return] this access | Finally.cs:116:17:116:21 | [finally: return] access to field Field | | | Finally.cs:116:17:116:21 | access to field Field | Finally.cs:116:17:116:28 | access to property Length | | | Finally.cs:116:17:116:21 | this access | Finally.cs:116:17:116:21 | access to field Field | | -| Finally.cs:116:17:116:28 | [finally: exception(Exception)] access to property Length | Finally.cs:116:32:116:32 | [finally: exception(Exception)] 0 | | -| Finally.cs:116:17:116:28 | [finally: exception(NullReferenceException)] access to property Length | Finally.cs:116:32:116:32 | [finally: exception(NullReferenceException)] 0 | | -| Finally.cs:116:17:116:28 | [finally: exception(OutOfMemoryException)] access to property Length | Finally.cs:116:32:116:32 | [finally: exception(OutOfMemoryException)] 0 | | +| Finally.cs:116:17:116:28 | [finally: exception] access to property Length | Finally.cs:116:32:116:32 | [finally: exception] 0 | | | Finally.cs:116:17:116:28 | [finally: return] access to property Length | Finally.cs:116:32:116:32 | [finally: return] 0 | | | Finally.cs:116:17:116:28 | access to property Length | Finally.cs:116:32:116:32 | 0 | | | Finally.cs:116:17:116:32 | ... > ... | Finally.cs:103:10:103:11 | exit M5 (normal) | false | | Finally.cs:116:17:116:32 | ... > ... | Finally.cs:117:17:117:37 | ...; | true | -| Finally.cs:116:17:116:32 | [finally: exception(Exception)] ... > ... | Finally.cs:103:10:103:11 | exit M5 (abnormal) | exception(Exception) | -| Finally.cs:116:17:116:32 | [finally: exception(Exception)] ... > ... | Finally.cs:117:17:117:37 | [finally: exception(Exception)] ...; | true | -| Finally.cs:116:17:116:32 | [finally: exception(NullReferenceException)] ... > ... | Finally.cs:103:10:103:11 | exit M5 (abnormal) | exception(NullReferenceException) | -| Finally.cs:116:17:116:32 | [finally: exception(NullReferenceException)] ... > ... | Finally.cs:117:17:117:37 | [finally: exception(NullReferenceException)] ...; | true | -| Finally.cs:116:17:116:32 | [finally: exception(OutOfMemoryException)] ... > ... | Finally.cs:103:10:103:11 | exit M5 (abnormal) | exception(OutOfMemoryException) | -| Finally.cs:116:17:116:32 | [finally: exception(OutOfMemoryException)] ... > ... | Finally.cs:117:17:117:37 | [finally: exception(OutOfMemoryException)] ...; | true | +| Finally.cs:116:17:116:32 | [finally: exception] ... > ... | Finally.cs:103:10:103:11 | exit M5 (abnormal) | exception | +| Finally.cs:116:17:116:32 | [finally: exception] ... > ... | Finally.cs:117:17:117:37 | [finally: exception] ...; | true | | Finally.cs:116:17:116:32 | [finally: return] ... > ... | Finally.cs:103:10:103:11 | exit M5 (normal) | return | | Finally.cs:116:17:116:32 | [finally: return] ... > ... | Finally.cs:117:17:117:37 | [finally: return] ...; | true | | Finally.cs:116:32:116:32 | 0 | Finally.cs:116:17:116:32 | ... > ... | | -| Finally.cs:116:32:116:32 | [finally: exception(Exception)] 0 | Finally.cs:116:17:116:32 | [finally: exception(Exception)] ... > ... | | -| Finally.cs:116:32:116:32 | [finally: exception(NullReferenceException)] 0 | Finally.cs:116:17:116:32 | [finally: exception(NullReferenceException)] ... > ... | | -| Finally.cs:116:32:116:32 | [finally: exception(OutOfMemoryException)] 0 | Finally.cs:116:17:116:32 | [finally: exception(OutOfMemoryException)] ... > ... | | +| Finally.cs:116:32:116:32 | [finally: exception] 0 | Finally.cs:116:17:116:32 | [finally: exception] ... > ... | | | Finally.cs:116:32:116:32 | [finally: return] 0 | Finally.cs:116:17:116:32 | [finally: return] ... > ... | | -| Finally.cs:117:17:117:36 | [finally: exception(Exception)] call to method WriteLine | Finally.cs:103:10:103:11 | exit M5 (abnormal) | exception(Exception) | -| Finally.cs:117:17:117:36 | [finally: exception(NullReferenceException)] call to method WriteLine | Finally.cs:103:10:103:11 | exit M5 (abnormal) | exception(NullReferenceException) | -| Finally.cs:117:17:117:36 | [finally: exception(OutOfMemoryException)] call to method WriteLine | Finally.cs:103:10:103:11 | exit M5 (abnormal) | exception(OutOfMemoryException) | +| Finally.cs:117:17:117:36 | [finally: exception] call to method WriteLine | Finally.cs:103:10:103:11 | exit M5 (abnormal) | exception | | Finally.cs:117:17:117:36 | [finally: return] call to method WriteLine | Finally.cs:103:10:103:11 | exit M5 (normal) | return | | Finally.cs:117:17:117:36 | call to method WriteLine | Finally.cs:103:10:103:11 | exit M5 (normal) | | | Finally.cs:117:17:117:37 | ...; | Finally.cs:117:35:117:35 | 1 | | -| Finally.cs:117:17:117:37 | [finally: exception(Exception)] ...; | Finally.cs:117:35:117:35 | [finally: exception(Exception)] 1 | | -| Finally.cs:117:17:117:37 | [finally: exception(NullReferenceException)] ...; | Finally.cs:117:35:117:35 | [finally: exception(NullReferenceException)] 1 | | -| Finally.cs:117:17:117:37 | [finally: exception(OutOfMemoryException)] ...; | Finally.cs:117:35:117:35 | [finally: exception(OutOfMemoryException)] 1 | | +| Finally.cs:117:17:117:37 | [finally: exception] ...; | Finally.cs:117:35:117:35 | [finally: exception] 1 | | | Finally.cs:117:17:117:37 | [finally: return] ...; | Finally.cs:117:35:117:35 | [finally: return] 1 | | | Finally.cs:117:35:117:35 | 1 | Finally.cs:117:17:117:36 | call to method WriteLine | | -| Finally.cs:117:35:117:35 | [finally: exception(Exception)] 1 | Finally.cs:117:17:117:36 | [finally: exception(Exception)] call to method WriteLine | | -| Finally.cs:117:35:117:35 | [finally: exception(NullReferenceException)] 1 | Finally.cs:117:17:117:36 | [finally: exception(NullReferenceException)] call to method WriteLine | | -| Finally.cs:117:35:117:35 | [finally: exception(OutOfMemoryException)] 1 | Finally.cs:117:17:117:36 | [finally: exception(OutOfMemoryException)] call to method WriteLine | | +| Finally.cs:117:35:117:35 | [finally: exception] 1 | Finally.cs:117:17:117:36 | [finally: exception] call to method WriteLine | | | Finally.cs:117:35:117:35 | [finally: return] 1 | Finally.cs:117:17:117:36 | [finally: return] call to method WriteLine | | | Finally.cs:121:10:121:11 | enter M6 | Finally.cs:122:5:131:5 | {...} | | | Finally.cs:121:10:121:11 | exit M6 (normal) | Finally.cs:121:10:121:11 | exit M6 | | @@ -2288,18 +2230,18 @@ | Finally.cs:134:5:145:5 | {...} | Finally.cs:135:9:143:9 | try {...} ... | | | Finally.cs:135:9:143:9 | try {...} ... | Finally.cs:136:9:138:9 | {...} | | | Finally.cs:136:9:138:9 | {...} | Finally.cs:137:13:137:37 | ...; | | -| Finally.cs:137:13:137:36 | call to method WriteLine | Finally.cs:140:9:143:9 | [finally: exception(Exception)] {...} | exception(Exception) | +| Finally.cs:137:13:137:36 | call to method WriteLine | Finally.cs:140:9:143:9 | [finally: exception] {...} | exception | | Finally.cs:137:13:137:36 | call to method WriteLine | Finally.cs:140:9:143:9 | {...} | | | Finally.cs:137:13:137:37 | ...; | Finally.cs:137:31:137:35 | "Try" | | | Finally.cs:137:31:137:35 | "Try" | Finally.cs:137:13:137:36 | call to method WriteLine | | -| Finally.cs:140:9:143:9 | [finally: exception(Exception)] {...} | Finally.cs:141:41:141:42 | [finally: exception(Exception)] "" | | +| Finally.cs:140:9:143:9 | [finally: exception] {...} | Finally.cs:141:41:141:42 | [finally: exception] "" | | | Finally.cs:140:9:143:9 | {...} | Finally.cs:141:41:141:42 | "" | | -| Finally.cs:141:13:141:44 | [finally: exception(Exception)] throw ...; | Finally.cs:133:10:133:11 | exit M7 (abnormal) | exception(ArgumentException) | -| Finally.cs:141:13:141:44 | throw ...; | Finally.cs:133:10:133:11 | exit M7 (abnormal) | exception(ArgumentException) | -| Finally.cs:141:19:141:43 | [finally: exception(Exception)] object creation of type ArgumentException | Finally.cs:141:13:141:44 | [finally: exception(Exception)] throw ...; | | +| Finally.cs:141:13:141:44 | [finally: exception] throw ...; | Finally.cs:133:10:133:11 | exit M7 (abnormal) | exception | +| Finally.cs:141:13:141:44 | throw ...; | Finally.cs:133:10:133:11 | exit M7 (abnormal) | exception | +| Finally.cs:141:19:141:43 | [finally: exception] object creation of type ArgumentException | Finally.cs:141:13:141:44 | [finally: exception] throw ...; | | | Finally.cs:141:19:141:43 | object creation of type ArgumentException | Finally.cs:141:13:141:44 | throw ...; | | | Finally.cs:141:41:141:42 | "" | Finally.cs:141:19:141:43 | object creation of type ArgumentException | | -| Finally.cs:141:41:141:42 | [finally: exception(Exception)] "" | Finally.cs:141:19:141:43 | [finally: exception(Exception)] object creation of type ArgumentException | | +| Finally.cs:141:41:141:42 | [finally: exception] "" | Finally.cs:141:19:141:43 | [finally: exception] object creation of type ArgumentException | | | Finally.cs:147:10:147:11 | enter M8 | Finally.cs:148:5:170:5 | {...} | | | Finally.cs:147:10:147:11 | exit M8 (abnormal) | Finally.cs:147:10:147:11 | exit M8 | | | Finally.cs:147:10:147:11 | exit M8 (normal) | Finally.cs:147:10:147:11 | exit M8 | | @@ -2311,129 +2253,89 @@ | Finally.cs:151:17:151:28 | ... == ... | Finally.cs:152:23:152:49 | object creation of type ArgumentNullException | true | | Finally.cs:151:17:151:28 | ... == ... | Finally.cs:155:9:169:9 | {...} | false | | Finally.cs:151:25:151:28 | null | Finally.cs:151:17:151:28 | ... == ... | | -| Finally.cs:152:17:152:50 | throw ...; | Finally.cs:155:9:169:9 | [finally: exception(ArgumentNullException)] {...} | exception(ArgumentNullException) | +| Finally.cs:152:17:152:50 | throw ...; | Finally.cs:155:9:169:9 | [finally: exception] {...} | exception | | Finally.cs:152:23:152:49 | object creation of type ArgumentNullException | Finally.cs:152:17:152:50 | throw ...; | | -| Finally.cs:152:23:152:49 | object creation of type ArgumentNullException | Finally.cs:155:9:169:9 | [finally: exception(Exception)] {...} | exception(Exception) | -| Finally.cs:155:9:169:9 | [finally: exception(ArgumentNullException)] {...} | Finally.cs:156:13:168:13 | [finally: exception(ArgumentNullException)] try {...} ... | | -| Finally.cs:155:9:169:9 | [finally: exception(Exception)] {...} | Finally.cs:156:13:168:13 | [finally: exception(Exception)] try {...} ... | | +| Finally.cs:152:23:152:49 | object creation of type ArgumentNullException | Finally.cs:155:9:169:9 | [finally: exception] {...} | exception | +| Finally.cs:155:9:169:9 | [finally: exception] {...} | Finally.cs:156:13:168:13 | [finally: exception] try {...} ... | | | Finally.cs:155:9:169:9 | {...} | Finally.cs:156:13:168:13 | try {...} ... | | -| Finally.cs:156:13:168:13 | [finally: exception(ArgumentNullException)] try {...} ... | Finally.cs:157:13:160:13 | [finally: exception(ArgumentNullException)] {...} | | -| Finally.cs:156:13:168:13 | [finally: exception(Exception)] try {...} ... | Finally.cs:157:13:160:13 | [finally: exception(Exception)] {...} | | +| Finally.cs:156:13:168:13 | [finally: exception] try {...} ... | Finally.cs:157:13:160:13 | [finally: exception] {...} | | | Finally.cs:156:13:168:13 | try {...} ... | Finally.cs:157:13:160:13 | {...} | | -| Finally.cs:157:13:160:13 | [finally: exception(ArgumentNullException)] {...} | Finally.cs:158:17:159:45 | [finally: exception(ArgumentNullException)] if (...) ... | | -| Finally.cs:157:13:160:13 | [finally: exception(Exception)] {...} | Finally.cs:158:17:159:45 | [finally: exception(Exception)] if (...) ... | | +| Finally.cs:157:13:160:13 | [finally: exception] {...} | Finally.cs:158:17:159:45 | [finally: exception] if (...) ... | | | Finally.cs:157:13:160:13 | {...} | Finally.cs:158:17:159:45 | if (...) ... | | -| Finally.cs:158:17:159:45 | [finally: exception(ArgumentNullException)] if (...) ... | Finally.cs:158:21:158:24 | [finally: exception(ArgumentNullException)] access to parameter args | | -| Finally.cs:158:17:159:45 | [finally: exception(Exception)] if (...) ... | Finally.cs:158:21:158:24 | [finally: exception(Exception)] access to parameter args | | +| Finally.cs:158:17:159:45 | [finally: exception] if (...) ... | Finally.cs:158:21:158:24 | [finally: exception] access to parameter args | | | Finally.cs:158:17:159:45 | if (...) ... | Finally.cs:158:21:158:24 | access to parameter args | | -| Finally.cs:158:21:158:24 | [finally: exception(ArgumentNullException)] access to parameter args | Finally.cs:158:21:158:31 | [finally: exception(ArgumentNullException)] access to property Length | | -| Finally.cs:158:21:158:24 | [finally: exception(Exception)] access to parameter args | Finally.cs:158:21:158:31 | [finally: exception(Exception)] access to property Length | | +| Finally.cs:158:21:158:24 | [finally: exception] access to parameter args | Finally.cs:158:21:158:31 | [finally: exception] access to property Length | | | Finally.cs:158:21:158:24 | access to parameter args | Finally.cs:158:21:158:31 | access to property Length | | -| Finally.cs:158:21:158:31 | [finally: exception(ArgumentNullException)] access to property Length | Finally.cs:158:36:158:36 | [finally: exception(ArgumentNullException)] 1 | | -| Finally.cs:158:21:158:31 | [finally: exception(ArgumentNullException)] access to property Length | Finally.cs:161:13:164:13 | [finally: exception(ArgumentNullException), exception: Exception] catch (...) {...} | exception(Exception) | -| Finally.cs:158:21:158:31 | [finally: exception(ArgumentNullException)] access to property Length | Finally.cs:161:13:164:13 | [finally: exception(ArgumentNullException), exception: NullReferenceException] catch (...) {...} | exception(NullReferenceException) | -| Finally.cs:158:21:158:31 | [finally: exception(Exception)] access to property Length | Finally.cs:158:36:158:36 | [finally: exception(Exception)] 1 | | -| Finally.cs:158:21:158:31 | [finally: exception(Exception)] access to property Length | Finally.cs:161:13:164:13 | [finally: exception(Exception), exception: Exception] catch (...) {...} | exception(Exception) | -| Finally.cs:158:21:158:31 | [finally: exception(Exception)] access to property Length | Finally.cs:161:13:164:13 | [finally: exception(Exception), exception: NullReferenceException] catch (...) {...} | exception(NullReferenceException) | +| Finally.cs:158:21:158:31 | [finally: exception] access to property Length | Finally.cs:158:36:158:36 | [finally: exception] 1 | | +| Finally.cs:158:21:158:31 | [finally: exception] access to property Length | Finally.cs:161:13:164:13 | [finally: exception, exception: Exception] catch (...) {...} | exception | +| Finally.cs:158:21:158:31 | [finally: exception] access to property Length | Finally.cs:161:13:164:13 | [finally: exception, exception: NullReferenceException] catch (...) {...} | exception | | Finally.cs:158:21:158:31 | access to property Length | Finally.cs:158:36:158:36 | 1 | | -| Finally.cs:158:21:158:31 | access to property Length | Finally.cs:161:13:164:13 | [exception: Exception] catch (...) {...} | exception(Exception) | -| Finally.cs:158:21:158:31 | access to property Length | Finally.cs:161:13:164:13 | [exception: NullReferenceException] catch (...) {...} | exception(NullReferenceException) | +| Finally.cs:158:21:158:31 | access to property Length | Finally.cs:161:13:164:13 | [exception: Exception] catch (...) {...} | exception | +| Finally.cs:158:21:158:31 | access to property Length | Finally.cs:161:13:164:13 | [exception: NullReferenceException] catch (...) {...} | exception | | Finally.cs:158:21:158:36 | ... == ... | Finally.cs:147:10:147:11 | exit M8 (normal) | false | | Finally.cs:158:21:158:36 | ... == ... | Finally.cs:159:41:159:43 | "1" | true | -| Finally.cs:158:21:158:36 | [finally: exception(ArgumentNullException)] ... == ... | Finally.cs:147:10:147:11 | exit M8 (abnormal) | exception(ArgumentNullException) | -| Finally.cs:158:21:158:36 | [finally: exception(ArgumentNullException)] ... == ... | Finally.cs:159:41:159:43 | [finally: exception(ArgumentNullException)] "1" | true | -| Finally.cs:158:21:158:36 | [finally: exception(Exception)] ... == ... | Finally.cs:147:10:147:11 | exit M8 (abnormal) | exception(Exception) | -| Finally.cs:158:21:158:36 | [finally: exception(Exception)] ... == ... | Finally.cs:159:41:159:43 | [finally: exception(Exception)] "1" | true | +| Finally.cs:158:21:158:36 | [finally: exception] ... == ... | Finally.cs:147:10:147:11 | exit M8 (abnormal) | exception | +| Finally.cs:158:21:158:36 | [finally: exception] ... == ... | Finally.cs:159:41:159:43 | [finally: exception] "1" | true | | Finally.cs:158:36:158:36 | 1 | Finally.cs:158:21:158:36 | ... == ... | | -| Finally.cs:158:36:158:36 | [finally: exception(ArgumentNullException)] 1 | Finally.cs:158:21:158:36 | [finally: exception(ArgumentNullException)] ... == ... | | -| Finally.cs:158:36:158:36 | [finally: exception(Exception)] 1 | Finally.cs:158:21:158:36 | [finally: exception(Exception)] ... == ... | | -| Finally.cs:159:21:159:45 | [finally: exception(ArgumentNullException)] throw ...; | Finally.cs:161:13:164:13 | [finally: exception(ArgumentNullException), exception: Exception] catch (...) {...} | exception(Exception) | -| Finally.cs:159:21:159:45 | [finally: exception(Exception)] throw ...; | Finally.cs:161:13:164:13 | [finally: exception(Exception), exception: Exception] catch (...) {...} | exception(Exception) | -| Finally.cs:159:21:159:45 | throw ...; | Finally.cs:161:13:164:13 | [exception: Exception] catch (...) {...} | exception(Exception) | -| Finally.cs:159:27:159:44 | [finally: exception(ArgumentNullException)] object creation of type Exception | Finally.cs:159:21:159:45 | [finally: exception(ArgumentNullException)] throw ...; | | -| Finally.cs:159:27:159:44 | [finally: exception(ArgumentNullException)] object creation of type Exception | Finally.cs:161:13:164:13 | [finally: exception(ArgumentNullException), exception: Exception] catch (...) {...} | exception(Exception) | -| Finally.cs:159:27:159:44 | [finally: exception(Exception)] object creation of type Exception | Finally.cs:159:21:159:45 | [finally: exception(Exception)] throw ...; | | -| Finally.cs:159:27:159:44 | [finally: exception(Exception)] object creation of type Exception | Finally.cs:161:13:164:13 | [finally: exception(Exception), exception: Exception] catch (...) {...} | exception(Exception) | +| Finally.cs:158:36:158:36 | [finally: exception] 1 | Finally.cs:158:21:158:36 | [finally: exception] ... == ... | | +| Finally.cs:159:21:159:45 | [finally: exception] throw ...; | Finally.cs:161:13:164:13 | [finally: exception, exception: Exception] catch (...) {...} | exception | +| Finally.cs:159:21:159:45 | throw ...; | Finally.cs:161:13:164:13 | [exception: Exception] catch (...) {...} | exception | +| Finally.cs:159:27:159:44 | [finally: exception] object creation of type Exception | Finally.cs:159:21:159:45 | [finally: exception] throw ...; | | +| Finally.cs:159:27:159:44 | [finally: exception] object creation of type Exception | Finally.cs:161:13:164:13 | [finally: exception, exception: Exception] catch (...) {...} | exception | | Finally.cs:159:27:159:44 | object creation of type Exception | Finally.cs:159:21:159:45 | throw ...; | | -| Finally.cs:159:27:159:44 | object creation of type Exception | Finally.cs:161:13:164:13 | [exception: Exception] catch (...) {...} | exception(Exception) | +| Finally.cs:159:27:159:44 | object creation of type Exception | Finally.cs:161:13:164:13 | [exception: Exception] catch (...) {...} | exception | | Finally.cs:159:41:159:43 | "1" | Finally.cs:159:27:159:44 | object creation of type Exception | | -| Finally.cs:159:41:159:43 | [finally: exception(ArgumentNullException)] "1" | Finally.cs:159:27:159:44 | [finally: exception(ArgumentNullException)] object creation of type Exception | | -| Finally.cs:159:41:159:43 | [finally: exception(Exception)] "1" | Finally.cs:159:27:159:44 | [finally: exception(Exception)] object creation of type Exception | | +| Finally.cs:159:41:159:43 | [finally: exception] "1" | Finally.cs:159:27:159:44 | [finally: exception] object creation of type Exception | | | Finally.cs:161:13:164:13 | [exception: Exception] catch (...) {...} | Finally.cs:161:30:161:30 | [exception: Exception] Exception e | match | | Finally.cs:161:13:164:13 | [exception: NullReferenceException] catch (...) {...} | Finally.cs:161:30:161:30 | [exception: NullReferenceException] Exception e | match | -| Finally.cs:161:13:164:13 | [finally: exception(ArgumentNullException), exception: Exception] catch (...) {...} | Finally.cs:161:30:161:30 | [finally: exception(ArgumentNullException), exception: Exception] Exception e | match | -| Finally.cs:161:13:164:13 | [finally: exception(ArgumentNullException), exception: NullReferenceException] catch (...) {...} | Finally.cs:161:30:161:30 | [finally: exception(ArgumentNullException), exception: NullReferenceException] Exception e | match | -| Finally.cs:161:13:164:13 | [finally: exception(Exception), exception: Exception] catch (...) {...} | Finally.cs:161:30:161:30 | [finally: exception(Exception), exception: Exception] Exception e | match | -| Finally.cs:161:13:164:13 | [finally: exception(Exception), exception: NullReferenceException] catch (...) {...} | Finally.cs:161:30:161:30 | [finally: exception(Exception), exception: NullReferenceException] Exception e | match | +| Finally.cs:161:13:164:13 | [finally: exception, exception: Exception] catch (...) {...} | Finally.cs:161:30:161:30 | [finally: exception, exception: Exception] Exception e | match | +| Finally.cs:161:13:164:13 | [finally: exception, exception: NullReferenceException] catch (...) {...} | Finally.cs:161:30:161:30 | [finally: exception, exception: NullReferenceException] Exception e | match | | Finally.cs:161:30:161:30 | [exception: Exception] Exception e | Finally.cs:161:39:161:39 | [exception: Exception] access to local variable e | | | Finally.cs:161:30:161:30 | [exception: NullReferenceException] Exception e | Finally.cs:161:39:161:39 | [exception: NullReferenceException] access to local variable e | | -| Finally.cs:161:30:161:30 | [finally: exception(ArgumentNullException), exception: Exception] Exception e | Finally.cs:161:39:161:39 | [finally: exception(ArgumentNullException), exception: Exception] access to local variable e | | -| Finally.cs:161:30:161:30 | [finally: exception(ArgumentNullException), exception: NullReferenceException] Exception e | Finally.cs:161:39:161:39 | [finally: exception(ArgumentNullException), exception: NullReferenceException] access to local variable e | | -| Finally.cs:161:30:161:30 | [finally: exception(Exception), exception: Exception] Exception e | Finally.cs:161:39:161:39 | [finally: exception(Exception), exception: Exception] access to local variable e | | -| Finally.cs:161:30:161:30 | [finally: exception(Exception), exception: NullReferenceException] Exception e | Finally.cs:161:39:161:39 | [finally: exception(Exception), exception: NullReferenceException] access to local variable e | | +| Finally.cs:161:30:161:30 | [finally: exception, exception: Exception] Exception e | Finally.cs:161:39:161:39 | [finally: exception, exception: Exception] access to local variable e | | +| Finally.cs:161:30:161:30 | [finally: exception, exception: NullReferenceException] Exception e | Finally.cs:161:39:161:39 | [finally: exception, exception: NullReferenceException] access to local variable e | | | Finally.cs:161:39:161:39 | [exception: Exception] access to local variable e | Finally.cs:161:39:161:47 | [exception: Exception] access to property Message | | | Finally.cs:161:39:161:39 | [exception: NullReferenceException] access to local variable e | Finally.cs:161:39:161:47 | [exception: NullReferenceException] access to property Message | | -| Finally.cs:161:39:161:39 | [finally: exception(ArgumentNullException), exception: Exception] access to local variable e | Finally.cs:161:39:161:47 | [finally: exception(ArgumentNullException), exception: Exception] access to property Message | | -| Finally.cs:161:39:161:39 | [finally: exception(ArgumentNullException), exception: NullReferenceException] access to local variable e | Finally.cs:161:39:161:47 | [finally: exception(ArgumentNullException), exception: NullReferenceException] access to property Message | | -| Finally.cs:161:39:161:39 | [finally: exception(Exception), exception: Exception] access to local variable e | Finally.cs:161:39:161:47 | [finally: exception(Exception), exception: Exception] access to property Message | | -| Finally.cs:161:39:161:39 | [finally: exception(Exception), exception: NullReferenceException] access to local variable e | Finally.cs:161:39:161:47 | [finally: exception(Exception), exception: NullReferenceException] access to property Message | | +| Finally.cs:161:39:161:39 | [finally: exception, exception: Exception] access to local variable e | Finally.cs:161:39:161:47 | [finally: exception, exception: Exception] access to property Message | | +| Finally.cs:161:39:161:39 | [finally: exception, exception: NullReferenceException] access to local variable e | Finally.cs:161:39:161:47 | [finally: exception, exception: NullReferenceException] access to property Message | | | Finally.cs:161:39:161:47 | [exception: Exception] access to property Message | Finally.cs:161:52:161:54 | [exception: Exception] "1" | | | Finally.cs:161:39:161:47 | [exception: NullReferenceException] access to property Message | Finally.cs:161:52:161:54 | [exception: NullReferenceException] "1" | | -| Finally.cs:161:39:161:47 | [finally: exception(ArgumentNullException), exception: Exception] access to property Message | Finally.cs:161:52:161:54 | [finally: exception(ArgumentNullException), exception: Exception] "1" | | -| Finally.cs:161:39:161:47 | [finally: exception(ArgumentNullException), exception: NullReferenceException] access to property Message | Finally.cs:161:52:161:54 | [finally: exception(ArgumentNullException), exception: NullReferenceException] "1" | | -| Finally.cs:161:39:161:47 | [finally: exception(Exception), exception: Exception] access to property Message | Finally.cs:161:52:161:54 | [finally: exception(Exception), exception: Exception] "1" | | -| Finally.cs:161:39:161:47 | [finally: exception(Exception), exception: NullReferenceException] access to property Message | Finally.cs:161:52:161:54 | [finally: exception(Exception), exception: NullReferenceException] "1" | | +| Finally.cs:161:39:161:47 | [finally: exception, exception: Exception] access to property Message | Finally.cs:161:52:161:54 | [finally: exception, exception: Exception] "1" | | +| Finally.cs:161:39:161:47 | [finally: exception, exception: NullReferenceException] access to property Message | Finally.cs:161:52:161:54 | [finally: exception, exception: NullReferenceException] "1" | | | Finally.cs:161:39:161:54 | [exception: Exception] ... == ... | Finally.cs:162:13:164:13 | {...} | true | | Finally.cs:161:39:161:54 | [exception: Exception] ... == ... | Finally.cs:165:13:168:13 | catch {...} | false | | Finally.cs:161:39:161:54 | [exception: NullReferenceException] ... == ... | Finally.cs:162:13:164:13 | {...} | true | | Finally.cs:161:39:161:54 | [exception: NullReferenceException] ... == ... | Finally.cs:165:13:168:13 | catch {...} | false | -| Finally.cs:161:39:161:54 | [finally: exception(ArgumentNullException), exception: Exception] ... == ... | Finally.cs:162:13:164:13 | [finally: exception(ArgumentNullException)] {...} | true | -| Finally.cs:161:39:161:54 | [finally: exception(ArgumentNullException), exception: Exception] ... == ... | Finally.cs:165:13:168:13 | [finally: exception(ArgumentNullException)] catch {...} | false | -| Finally.cs:161:39:161:54 | [finally: exception(ArgumentNullException), exception: NullReferenceException] ... == ... | Finally.cs:162:13:164:13 | [finally: exception(ArgumentNullException)] {...} | true | -| Finally.cs:161:39:161:54 | [finally: exception(ArgumentNullException), exception: NullReferenceException] ... == ... | Finally.cs:165:13:168:13 | [finally: exception(ArgumentNullException)] catch {...} | false | -| Finally.cs:161:39:161:54 | [finally: exception(Exception), exception: Exception] ... == ... | Finally.cs:162:13:164:13 | [finally: exception(Exception)] {...} | true | -| Finally.cs:161:39:161:54 | [finally: exception(Exception), exception: Exception] ... == ... | Finally.cs:165:13:168:13 | [finally: exception(Exception)] catch {...} | false | -| Finally.cs:161:39:161:54 | [finally: exception(Exception), exception: NullReferenceException] ... == ... | Finally.cs:162:13:164:13 | [finally: exception(Exception)] {...} | true | -| Finally.cs:161:39:161:54 | [finally: exception(Exception), exception: NullReferenceException] ... == ... | Finally.cs:165:13:168:13 | [finally: exception(Exception)] catch {...} | false | +| Finally.cs:161:39:161:54 | [finally: exception, exception: Exception] ... == ... | Finally.cs:162:13:164:13 | [finally: exception] {...} | true | +| Finally.cs:161:39:161:54 | [finally: exception, exception: Exception] ... == ... | Finally.cs:165:13:168:13 | [finally: exception] catch {...} | false | +| Finally.cs:161:39:161:54 | [finally: exception, exception: NullReferenceException] ... == ... | Finally.cs:162:13:164:13 | [finally: exception] {...} | true | +| Finally.cs:161:39:161:54 | [finally: exception, exception: NullReferenceException] ... == ... | Finally.cs:165:13:168:13 | [finally: exception] catch {...} | false | | Finally.cs:161:52:161:54 | [exception: Exception] "1" | Finally.cs:161:39:161:54 | [exception: Exception] ... == ... | | | Finally.cs:161:52:161:54 | [exception: NullReferenceException] "1" | Finally.cs:161:39:161:54 | [exception: NullReferenceException] ... == ... | | -| Finally.cs:161:52:161:54 | [finally: exception(ArgumentNullException), exception: Exception] "1" | Finally.cs:161:39:161:54 | [finally: exception(ArgumentNullException), exception: Exception] ... == ... | | -| Finally.cs:161:52:161:54 | [finally: exception(ArgumentNullException), exception: NullReferenceException] "1" | Finally.cs:161:39:161:54 | [finally: exception(ArgumentNullException), exception: NullReferenceException] ... == ... | | -| Finally.cs:161:52:161:54 | [finally: exception(Exception), exception: Exception] "1" | Finally.cs:161:39:161:54 | [finally: exception(Exception), exception: Exception] ... == ... | | -| Finally.cs:161:52:161:54 | [finally: exception(Exception), exception: NullReferenceException] "1" | Finally.cs:161:39:161:54 | [finally: exception(Exception), exception: NullReferenceException] ... == ... | | -| Finally.cs:162:13:164:13 | [finally: exception(ArgumentNullException)] {...} | Finally.cs:163:17:163:43 | [finally: exception(ArgumentNullException)] ...; | | -| Finally.cs:162:13:164:13 | [finally: exception(Exception)] {...} | Finally.cs:163:17:163:43 | [finally: exception(Exception)] ...; | | +| Finally.cs:161:52:161:54 | [finally: exception, exception: Exception] "1" | Finally.cs:161:39:161:54 | [finally: exception, exception: Exception] ... == ... | | +| Finally.cs:161:52:161:54 | [finally: exception, exception: NullReferenceException] "1" | Finally.cs:161:39:161:54 | [finally: exception, exception: NullReferenceException] ... == ... | | +| Finally.cs:162:13:164:13 | [finally: exception] {...} | Finally.cs:163:17:163:43 | [finally: exception] ...; | | | Finally.cs:162:13:164:13 | {...} | Finally.cs:163:17:163:43 | ...; | | -| Finally.cs:163:17:163:42 | [finally: exception(ArgumentNullException)] call to method WriteLine | Finally.cs:147:10:147:11 | exit M8 (abnormal) | exception(ArgumentNullException) | -| Finally.cs:163:17:163:42 | [finally: exception(Exception)] call to method WriteLine | Finally.cs:147:10:147:11 | exit M8 (abnormal) | exception(Exception) | +| Finally.cs:163:17:163:42 | [finally: exception] call to method WriteLine | Finally.cs:147:10:147:11 | exit M8 (abnormal) | exception | | Finally.cs:163:17:163:42 | call to method WriteLine | Finally.cs:147:10:147:11 | exit M8 (normal) | | | Finally.cs:163:17:163:43 | ...; | Finally.cs:163:35:163:38 | access to parameter args | | -| Finally.cs:163:17:163:43 | [finally: exception(ArgumentNullException)] ...; | Finally.cs:163:35:163:38 | [finally: exception(ArgumentNullException)] access to parameter args | | -| Finally.cs:163:17:163:43 | [finally: exception(Exception)] ...; | Finally.cs:163:35:163:38 | [finally: exception(Exception)] access to parameter args | | -| Finally.cs:163:35:163:38 | [finally: exception(ArgumentNullException)] access to parameter args | Finally.cs:163:40:163:40 | [finally: exception(ArgumentNullException)] 0 | | -| Finally.cs:163:35:163:38 | [finally: exception(Exception)] access to parameter args | Finally.cs:163:40:163:40 | [finally: exception(Exception)] 0 | | +| Finally.cs:163:17:163:43 | [finally: exception] ...; | Finally.cs:163:35:163:38 | [finally: exception] access to parameter args | | +| Finally.cs:163:35:163:38 | [finally: exception] access to parameter args | Finally.cs:163:40:163:40 | [finally: exception] 0 | | | Finally.cs:163:35:163:38 | access to parameter args | Finally.cs:163:40:163:40 | 0 | | -| Finally.cs:163:35:163:41 | [finally: exception(ArgumentNullException)] access to array element | Finally.cs:163:17:163:42 | [finally: exception(ArgumentNullException)] call to method WriteLine | | -| Finally.cs:163:35:163:41 | [finally: exception(Exception)] access to array element | Finally.cs:163:17:163:42 | [finally: exception(Exception)] call to method WriteLine | | +| Finally.cs:163:35:163:41 | [finally: exception] access to array element | Finally.cs:163:17:163:42 | [finally: exception] call to method WriteLine | | | Finally.cs:163:35:163:41 | access to array element | Finally.cs:163:17:163:42 | call to method WriteLine | | | Finally.cs:163:40:163:40 | 0 | Finally.cs:163:35:163:41 | access to array element | | -| Finally.cs:163:40:163:40 | [finally: exception(ArgumentNullException)] 0 | Finally.cs:163:35:163:41 | [finally: exception(ArgumentNullException)] access to array element | | -| Finally.cs:163:40:163:40 | [finally: exception(Exception)] 0 | Finally.cs:163:35:163:41 | [finally: exception(Exception)] access to array element | | -| Finally.cs:165:13:168:13 | [finally: exception(ArgumentNullException)] catch {...} | Finally.cs:166:13:168:13 | [finally: exception(ArgumentNullException)] {...} | | -| Finally.cs:165:13:168:13 | [finally: exception(Exception)] catch {...} | Finally.cs:166:13:168:13 | [finally: exception(Exception)] {...} | | +| Finally.cs:163:40:163:40 | [finally: exception] 0 | Finally.cs:163:35:163:41 | [finally: exception] access to array element | | +| Finally.cs:165:13:168:13 | [finally: exception] catch {...} | Finally.cs:166:13:168:13 | [finally: exception] {...} | | | Finally.cs:165:13:168:13 | catch {...} | Finally.cs:166:13:168:13 | {...} | | -| Finally.cs:166:13:168:13 | [finally: exception(ArgumentNullException)] {...} | Finally.cs:167:17:167:38 | [finally: exception(ArgumentNullException)] ...; | | -| Finally.cs:166:13:168:13 | [finally: exception(Exception)] {...} | Finally.cs:167:17:167:38 | [finally: exception(Exception)] ...; | | +| Finally.cs:166:13:168:13 | [finally: exception] {...} | Finally.cs:167:17:167:38 | [finally: exception] ...; | | | Finally.cs:166:13:168:13 | {...} | Finally.cs:167:17:167:38 | ...; | | -| Finally.cs:167:17:167:37 | [finally: exception(ArgumentNullException)] call to method WriteLine | Finally.cs:147:10:147:11 | exit M8 (abnormal) | exception(ArgumentNullException) | -| Finally.cs:167:17:167:37 | [finally: exception(Exception)] call to method WriteLine | Finally.cs:147:10:147:11 | exit M8 (abnormal) | exception(Exception) | +| Finally.cs:167:17:167:37 | [finally: exception] call to method WriteLine | Finally.cs:147:10:147:11 | exit M8 (abnormal) | exception | | Finally.cs:167:17:167:37 | call to method WriteLine | Finally.cs:147:10:147:11 | exit M8 (normal) | | | Finally.cs:167:17:167:38 | ...; | Finally.cs:167:35:167:36 | "" | | -| Finally.cs:167:17:167:38 | [finally: exception(ArgumentNullException)] ...; | Finally.cs:167:35:167:36 | [finally: exception(ArgumentNullException)] "" | | -| Finally.cs:167:17:167:38 | [finally: exception(Exception)] ...; | Finally.cs:167:35:167:36 | [finally: exception(Exception)] "" | | +| Finally.cs:167:17:167:38 | [finally: exception] ...; | Finally.cs:167:35:167:36 | [finally: exception] "" | | | Finally.cs:167:35:167:36 | "" | Finally.cs:167:17:167:37 | call to method WriteLine | | -| Finally.cs:167:35:167:36 | [finally: exception(ArgumentNullException)] "" | Finally.cs:167:17:167:37 | [finally: exception(ArgumentNullException)] call to method WriteLine | | -| Finally.cs:167:35:167:36 | [finally: exception(Exception)] "" | Finally.cs:167:17:167:37 | [finally: exception(Exception)] call to method WriteLine | | +| Finally.cs:167:35:167:36 | [finally: exception] "" | Finally.cs:167:17:167:37 | [finally: exception] call to method WriteLine | | | Finally.cs:172:11:172:20 | call to constructor Exception | Finally.cs:172:11:172:20 | {...} | | | Finally.cs:172:11:172:20 | enter ExceptionA | Finally.cs:172:11:172:20 | call to constructor Exception | | | Finally.cs:172:11:172:20 | exit ExceptionA (normal) | Finally.cs:172:11:172:20 | exit ExceptionA | | @@ -2455,64 +2357,45 @@ | Finally.cs:180:13:180:43 | if (...) ... | Finally.cs:180:17:180:18 | access to parameter b1 | | | Finally.cs:180:17:180:18 | access to parameter b1 | Finally.cs:180:27:180:42 | [b1 (line 176): true] object creation of type ExceptionA | true | | Finally.cs:180:17:180:18 | access to parameter b1 | Finally.cs:183:9:192:9 | [b1 (line 176): false] {...} | false | -| Finally.cs:180:21:180:43 | [b1 (line 176): true] throw ...; | Finally.cs:183:9:192:9 | [finally: exception(ExceptionA), b1 (line 176): true] {...} | exception(ExceptionA) | +| Finally.cs:180:21:180:43 | [b1 (line 176): true] throw ...; | Finally.cs:183:9:192:9 | [finally: exception, b1 (line 176): true] {...} | exception | | Finally.cs:180:27:180:42 | [b1 (line 176): true] object creation of type ExceptionA | Finally.cs:180:21:180:43 | [b1 (line 176): true] throw ...; | | -| Finally.cs:180:27:180:42 | [b1 (line 176): true] object creation of type ExceptionA | Finally.cs:183:9:192:9 | [finally: exception(Exception), b1 (line 176): true] {...} | exception(Exception) | +| Finally.cs:180:27:180:42 | [b1 (line 176): true] object creation of type ExceptionA | Finally.cs:183:9:192:9 | [finally: exception, b1 (line 176): true] {...} | exception | | Finally.cs:183:9:192:9 | [b1 (line 176): false] {...} | Finally.cs:184:13:191:13 | [b1 (line 176): false] try {...} ... | | -| Finally.cs:183:9:192:9 | [finally: exception(Exception), b1 (line 176): true] {...} | Finally.cs:184:13:191:13 | [finally: exception(Exception), b1 (line 176): true] try {...} ... | | -| Finally.cs:183:9:192:9 | [finally: exception(ExceptionA), b1 (line 176): true] {...} | Finally.cs:184:13:191:13 | [finally: exception(ExceptionA), b1 (line 176): true] try {...} ... | | +| Finally.cs:183:9:192:9 | [finally: exception, b1 (line 176): true] {...} | Finally.cs:184:13:191:13 | [finally: exception, b1 (line 176): true] try {...} ... | | | Finally.cs:184:13:191:13 | [b1 (line 176): false] try {...} ... | Finally.cs:185:13:187:13 | [b1 (line 176): false] {...} | | -| Finally.cs:184:13:191:13 | [finally: exception(Exception), b1 (line 176): true] try {...} ... | Finally.cs:185:13:187:13 | [finally: exception(Exception), b1 (line 176): true] {...} | | -| Finally.cs:184:13:191:13 | [finally: exception(ExceptionA), b1 (line 176): true] try {...} ... | Finally.cs:185:13:187:13 | [finally: exception(ExceptionA), b1 (line 176): true] {...} | | +| Finally.cs:184:13:191:13 | [finally: exception, b1 (line 176): true] try {...} ... | Finally.cs:185:13:187:13 | [finally: exception, b1 (line 176): true] {...} | | | Finally.cs:185:13:187:13 | [b1 (line 176): false] {...} | Finally.cs:186:17:186:47 | [b1 (line 176): false] if (...) ... | | -| Finally.cs:185:13:187:13 | [finally: exception(Exception), b1 (line 176): true] {...} | Finally.cs:186:17:186:47 | [finally: exception(Exception), b1 (line 176): true] if (...) ... | | -| Finally.cs:185:13:187:13 | [finally: exception(ExceptionA), b1 (line 176): true] {...} | Finally.cs:186:17:186:47 | [finally: exception(ExceptionA), b1 (line 176): true] if (...) ... | | +| Finally.cs:185:13:187:13 | [finally: exception, b1 (line 176): true] {...} | Finally.cs:186:17:186:47 | [finally: exception, b1 (line 176): true] if (...) ... | | | Finally.cs:186:17:186:47 | [b1 (line 176): false] if (...) ... | Finally.cs:186:21:186:22 | [b1 (line 176): false] access to parameter b2 | | -| Finally.cs:186:17:186:47 | [finally: exception(Exception), b1 (line 176): true] if (...) ... | Finally.cs:186:21:186:22 | [finally: exception(Exception), b1 (line 176): true] access to parameter b2 | | -| Finally.cs:186:17:186:47 | [finally: exception(ExceptionA), b1 (line 176): true] if (...) ... | Finally.cs:186:21:186:22 | [finally: exception(ExceptionA), b1 (line 176): true] access to parameter b2 | | +| Finally.cs:186:17:186:47 | [finally: exception, b1 (line 176): true] if (...) ... | Finally.cs:186:21:186:22 | [finally: exception, b1 (line 176): true] access to parameter b2 | | | Finally.cs:186:21:186:22 | [b1 (line 176): false] access to parameter b2 | Finally.cs:176:10:176:11 | exit M9 (normal) | false | | Finally.cs:186:21:186:22 | [b1 (line 176): false] access to parameter b2 | Finally.cs:186:31:186:46 | [b1 (line 176): false, b2 (line 176): true] object creation of type ExceptionB | true | -| Finally.cs:186:21:186:22 | [finally: exception(Exception), b1 (line 176): true] access to parameter b2 | Finally.cs:176:10:176:11 | exit M9 (abnormal) | exception(Exception) | -| Finally.cs:186:21:186:22 | [finally: exception(Exception), b1 (line 176): true] access to parameter b2 | Finally.cs:186:31:186:46 | [finally: exception(Exception), b1 (line 176): true, b2 (line 176): true] object creation of type ExceptionB | true | -| Finally.cs:186:21:186:22 | [finally: exception(ExceptionA), b1 (line 176): true] access to parameter b2 | Finally.cs:176:10:176:11 | exit M9 (abnormal) | exception(ExceptionA) | -| Finally.cs:186:21:186:22 | [finally: exception(ExceptionA), b1 (line 176): true] access to parameter b2 | Finally.cs:186:31:186:46 | [finally: exception(ExceptionA), b1 (line 176): true, b2 (line 176): true] object creation of type ExceptionB | true | -| Finally.cs:186:25:186:47 | [b1 (line 176): false, b2 (line 176): true] throw ...; | Finally.cs:188:13:191:13 | [exception: ExceptionB, b1 (line 176): false, b2 (line 176): true] catch (...) {...} | exception(ExceptionB) | -| Finally.cs:186:25:186:47 | [finally: exception(Exception), b1 (line 176): true, b2 (line 176): true] throw ...; | Finally.cs:188:13:191:13 | [finally: exception(Exception), exception: ExceptionB, b1 (line 176): true, b2 (line 176): true] catch (...) {...} | exception(ExceptionB) | -| Finally.cs:186:25:186:47 | [finally: exception(ExceptionA), b1 (line 176): true, b2 (line 176): true] throw ...; | Finally.cs:188:13:191:13 | [finally: exception(ExceptionA), exception: ExceptionB, b1 (line 176): true, b2 (line 176): true] catch (...) {...} | exception(ExceptionB) | +| Finally.cs:186:21:186:22 | [finally: exception, b1 (line 176): true] access to parameter b2 | Finally.cs:176:10:176:11 | exit M9 (abnormal) | exception | +| Finally.cs:186:21:186:22 | [finally: exception, b1 (line 176): true] access to parameter b2 | Finally.cs:186:31:186:46 | [finally: exception, b1 (line 176): true, b2 (line 176): true] object creation of type ExceptionB | true | +| Finally.cs:186:25:186:47 | [b1 (line 176): false, b2 (line 176): true] throw ...; | Finally.cs:188:13:191:13 | [exception: ExceptionB, b1 (line 176): false, b2 (line 176): true] catch (...) {...} | exception | +| Finally.cs:186:25:186:47 | [finally: exception, b1 (line 176): true, b2 (line 176): true] throw ...; | Finally.cs:188:13:191:13 | [finally: exception, exception: ExceptionB, b1 (line 176): true, b2 (line 176): true] catch (...) {...} | exception | | Finally.cs:186:31:186:46 | [b1 (line 176): false, b2 (line 176): true] object creation of type ExceptionB | Finally.cs:186:25:186:47 | [b1 (line 176): false, b2 (line 176): true] throw ...; | | -| Finally.cs:186:31:186:46 | [b1 (line 176): false, b2 (line 176): true] object creation of type ExceptionB | Finally.cs:188:13:191:13 | [exception: Exception, b1 (line 176): false, b2 (line 176): true] catch (...) {...} | exception(Exception) | -| Finally.cs:186:31:186:46 | [finally: exception(Exception), b1 (line 176): true, b2 (line 176): true] object creation of type ExceptionB | Finally.cs:186:25:186:47 | [finally: exception(Exception), b1 (line 176): true, b2 (line 176): true] throw ...; | | -| Finally.cs:186:31:186:46 | [finally: exception(Exception), b1 (line 176): true, b2 (line 176): true] object creation of type ExceptionB | Finally.cs:188:13:191:13 | [finally: exception(Exception), exception: Exception, b1 (line 176): true, b2 (line 176): true] catch (...) {...} | exception(Exception) | -| Finally.cs:186:31:186:46 | [finally: exception(ExceptionA), b1 (line 176): true, b2 (line 176): true] object creation of type ExceptionB | Finally.cs:186:25:186:47 | [finally: exception(ExceptionA), b1 (line 176): true, b2 (line 176): true] throw ...; | | -| Finally.cs:186:31:186:46 | [finally: exception(ExceptionA), b1 (line 176): true, b2 (line 176): true] object creation of type ExceptionB | Finally.cs:188:13:191:13 | [finally: exception(ExceptionA), exception: Exception, b1 (line 176): true, b2 (line 176): true] catch (...) {...} | exception(Exception) | -| Finally.cs:188:13:191:13 | [exception: Exception, b1 (line 176): false, b2 (line 176): true] catch (...) {...} | Finally.cs:176:10:176:11 | exit M9 (abnormal) | exception(Exception) | +| Finally.cs:186:31:186:46 | [b1 (line 176): false, b2 (line 176): true] object creation of type ExceptionB | Finally.cs:188:13:191:13 | [exception: Exception, b1 (line 176): false, b2 (line 176): true] catch (...) {...} | exception | +| Finally.cs:186:31:186:46 | [finally: exception, b1 (line 176): true, b2 (line 176): true] object creation of type ExceptionB | Finally.cs:186:25:186:47 | [finally: exception, b1 (line 176): true, b2 (line 176): true] throw ...; | | +| Finally.cs:186:31:186:46 | [finally: exception, b1 (line 176): true, b2 (line 176): true] object creation of type ExceptionB | Finally.cs:188:13:191:13 | [finally: exception, exception: Exception, b1 (line 176): true, b2 (line 176): true] catch (...) {...} | exception | +| Finally.cs:188:13:191:13 | [exception: Exception, b1 (line 176): false, b2 (line 176): true] catch (...) {...} | Finally.cs:176:10:176:11 | exit M9 (abnormal) | exception | | Finally.cs:188:13:191:13 | [exception: Exception, b1 (line 176): false, b2 (line 176): true] catch (...) {...} | Finally.cs:188:38:188:39 | [exception: Exception, b1 (line 176): false, b2 (line 176): true] access to parameter b2 | match | | Finally.cs:188:13:191:13 | [exception: ExceptionB, b1 (line 176): false, b2 (line 176): true] catch (...) {...} | Finally.cs:188:38:188:39 | [exception: ExceptionB, b1 (line 176): false, b2 (line 176): true] access to parameter b2 | match | -| Finally.cs:188:13:191:13 | [finally: exception(Exception), exception: Exception, b1 (line 176): true, b2 (line 176): true] catch (...) {...} | Finally.cs:176:10:176:11 | exit M9 (abnormal) | exception(Exception) | -| Finally.cs:188:13:191:13 | [finally: exception(Exception), exception: Exception, b1 (line 176): true, b2 (line 176): true] catch (...) {...} | Finally.cs:188:38:188:39 | [finally: exception(Exception), exception: Exception, b1 (line 176): true, b2 (line 176): true] access to parameter b2 | match | -| Finally.cs:188:13:191:13 | [finally: exception(Exception), exception: ExceptionB, b1 (line 176): true, b2 (line 176): true] catch (...) {...} | Finally.cs:188:38:188:39 | [finally: exception(Exception), exception: ExceptionB, b1 (line 176): true, b2 (line 176): true] access to parameter b2 | match | -| Finally.cs:188:13:191:13 | [finally: exception(ExceptionA), exception: Exception, b1 (line 176): true, b2 (line 176): true] catch (...) {...} | Finally.cs:176:10:176:11 | exit M9 (abnormal) | exception(Exception) | -| Finally.cs:188:13:191:13 | [finally: exception(ExceptionA), exception: Exception, b1 (line 176): true, b2 (line 176): true] catch (...) {...} | Finally.cs:188:38:188:39 | [finally: exception(ExceptionA), exception: Exception, b1 (line 176): true, b2 (line 176): true] access to parameter b2 | match | -| Finally.cs:188:13:191:13 | [finally: exception(ExceptionA), exception: ExceptionB, b1 (line 176): true, b2 (line 176): true] catch (...) {...} | Finally.cs:188:38:188:39 | [finally: exception(ExceptionA), exception: ExceptionB, b1 (line 176): true, b2 (line 176): true] access to parameter b2 | match | +| Finally.cs:188:13:191:13 | [finally: exception, exception: Exception, b1 (line 176): true, b2 (line 176): true] catch (...) {...} | Finally.cs:176:10:176:11 | exit M9 (abnormal) | exception | +| Finally.cs:188:13:191:13 | [finally: exception, exception: Exception, b1 (line 176): true, b2 (line 176): true] catch (...) {...} | Finally.cs:188:38:188:39 | [finally: exception, exception: Exception, b1 (line 176): true, b2 (line 176): true] access to parameter b2 | match | +| Finally.cs:188:13:191:13 | [finally: exception, exception: ExceptionB, b1 (line 176): true, b2 (line 176): true] catch (...) {...} | Finally.cs:188:38:188:39 | [finally: exception, exception: ExceptionB, b1 (line 176): true, b2 (line 176): true] access to parameter b2 | match | | Finally.cs:188:38:188:39 | [exception: Exception, b1 (line 176): false, b2 (line 176): true] access to parameter b2 | Finally.cs:189:13:191:13 | [b1 (line 176): false] {...} | true | | Finally.cs:188:38:188:39 | [exception: ExceptionB, b1 (line 176): false, b2 (line 176): true] access to parameter b2 | Finally.cs:189:13:191:13 | [b1 (line 176): false] {...} | true | -| Finally.cs:188:38:188:39 | [finally: exception(Exception), exception: Exception, b1 (line 176): true, b2 (line 176): true] access to parameter b2 | Finally.cs:189:13:191:13 | [finally: exception(Exception), b1 (line 176): true] {...} | true | -| Finally.cs:188:38:188:39 | [finally: exception(Exception), exception: ExceptionB, b1 (line 176): true, b2 (line 176): true] access to parameter b2 | Finally.cs:189:13:191:13 | [finally: exception(Exception), b1 (line 176): true] {...} | true | -| Finally.cs:188:38:188:39 | [finally: exception(ExceptionA), exception: Exception, b1 (line 176): true, b2 (line 176): true] access to parameter b2 | Finally.cs:189:13:191:13 | [finally: exception(ExceptionA), b1 (line 176): true] {...} | true | -| Finally.cs:188:38:188:39 | [finally: exception(ExceptionA), exception: ExceptionB, b1 (line 176): true, b2 (line 176): true] access to parameter b2 | Finally.cs:189:13:191:13 | [finally: exception(ExceptionA), b1 (line 176): true] {...} | true | +| Finally.cs:188:38:188:39 | [finally: exception, exception: Exception, b1 (line 176): true, b2 (line 176): true] access to parameter b2 | Finally.cs:189:13:191:13 | [finally: exception, b1 (line 176): true] {...} | true | +| Finally.cs:188:38:188:39 | [finally: exception, exception: ExceptionB, b1 (line 176): true, b2 (line 176): true] access to parameter b2 | Finally.cs:189:13:191:13 | [finally: exception, b1 (line 176): true] {...} | true | | Finally.cs:189:13:191:13 | [b1 (line 176): false] {...} | Finally.cs:190:17:190:47 | [b1 (line 176): false] if (...) ... | | -| Finally.cs:189:13:191:13 | [finally: exception(Exception), b1 (line 176): true] {...} | Finally.cs:190:17:190:47 | [finally: exception(Exception), b1 (line 176): true] if (...) ... | | -| Finally.cs:189:13:191:13 | [finally: exception(ExceptionA), b1 (line 176): true] {...} | Finally.cs:190:17:190:47 | [finally: exception(ExceptionA), b1 (line 176): true] if (...) ... | | +| Finally.cs:189:13:191:13 | [finally: exception, b1 (line 176): true] {...} | Finally.cs:190:17:190:47 | [finally: exception, b1 (line 176): true] if (...) ... | | | Finally.cs:190:17:190:47 | [b1 (line 176): false] if (...) ... | Finally.cs:190:21:190:22 | [b1 (line 176): false] access to parameter b1 | | -| Finally.cs:190:17:190:47 | [finally: exception(Exception), b1 (line 176): true] if (...) ... | Finally.cs:190:21:190:22 | [finally: exception(Exception), b1 (line 176): true] access to parameter b1 | | -| Finally.cs:190:17:190:47 | [finally: exception(ExceptionA), b1 (line 176): true] if (...) ... | Finally.cs:190:21:190:22 | [finally: exception(ExceptionA), b1 (line 176): true] access to parameter b1 | | +| Finally.cs:190:17:190:47 | [finally: exception, b1 (line 176): true] if (...) ... | Finally.cs:190:21:190:22 | [finally: exception, b1 (line 176): true] access to parameter b1 | | | Finally.cs:190:21:190:22 | [b1 (line 176): false] access to parameter b1 | Finally.cs:176:10:176:11 | exit M9 (normal) | false | -| Finally.cs:190:21:190:22 | [finally: exception(Exception), b1 (line 176): true] access to parameter b1 | Finally.cs:190:31:190:46 | [finally: exception(Exception)] object creation of type ExceptionC | true | -| Finally.cs:190:21:190:22 | [finally: exception(ExceptionA), b1 (line 176): true] access to parameter b1 | Finally.cs:190:31:190:46 | [finally: exception(ExceptionA)] object creation of type ExceptionC | true | -| Finally.cs:190:25:190:47 | [finally: exception(Exception)] throw ...; | Finally.cs:176:10:176:11 | exit M9 (abnormal) | exception(ExceptionC) | -| Finally.cs:190:25:190:47 | [finally: exception(ExceptionA)] throw ...; | Finally.cs:176:10:176:11 | exit M9 (abnormal) | exception(ExceptionC) | -| Finally.cs:190:31:190:46 | [finally: exception(Exception)] object creation of type ExceptionC | Finally.cs:190:25:190:47 | [finally: exception(Exception)] throw ...; | | -| Finally.cs:190:31:190:46 | [finally: exception(ExceptionA)] object creation of type ExceptionC | Finally.cs:190:25:190:47 | [finally: exception(ExceptionA)] throw ...; | | +| Finally.cs:190:21:190:22 | [finally: exception, b1 (line 176): true] access to parameter b1 | Finally.cs:190:31:190:46 | [finally: exception] object creation of type ExceptionC | true | +| Finally.cs:190:25:190:47 | [finally: exception] throw ...; | Finally.cs:176:10:176:11 | exit M9 (abnormal) | exception | +| Finally.cs:190:31:190:46 | [finally: exception] object creation of type ExceptionC | Finally.cs:190:25:190:47 | [finally: exception] throw ...; | | | Finally.cs:195:10:195:12 | enter M10 | Finally.cs:196:5:214:5 | {...} | | | Finally.cs:195:10:195:12 | exit M10 (abnormal) | Finally.cs:195:10:195:12 | exit M10 | | | Finally.cs:195:10:195:12 | exit M10 (normal) | Finally.cs:195:10:195:12 | exit M10 | | @@ -2522,102 +2405,59 @@ | Finally.cs:199:13:199:43 | if (...) ... | Finally.cs:199:17:199:18 | access to parameter b1 | | | Finally.cs:199:17:199:18 | access to parameter b1 | Finally.cs:199:27:199:42 | object creation of type ExceptionA | true | | Finally.cs:199:17:199:18 | access to parameter b1 | Finally.cs:202:9:212:9 | {...} | false | -| Finally.cs:199:21:199:43 | throw ...; | Finally.cs:202:9:212:9 | [finally: exception(ExceptionA)] {...} | exception(ExceptionA) | +| Finally.cs:199:21:199:43 | throw ...; | Finally.cs:202:9:212:9 | [finally: exception] {...} | exception | | Finally.cs:199:27:199:42 | object creation of type ExceptionA | Finally.cs:199:21:199:43 | throw ...; | | -| Finally.cs:199:27:199:42 | object creation of type ExceptionA | Finally.cs:202:9:212:9 | [finally: exception(Exception)] {...} | exception(Exception) | -| Finally.cs:202:9:212:9 | [finally: exception(Exception)] {...} | Finally.cs:203:13:210:13 | [finally: exception(Exception)] try {...} ... | | -| Finally.cs:202:9:212:9 | [finally: exception(ExceptionA)] {...} | Finally.cs:203:13:210:13 | [finally: exception(ExceptionA)] try {...} ... | | +| Finally.cs:199:27:199:42 | object creation of type ExceptionA | Finally.cs:202:9:212:9 | [finally: exception] {...} | exception | +| Finally.cs:202:9:212:9 | [finally: exception] {...} | Finally.cs:203:13:210:13 | [finally: exception] try {...} ... | | | Finally.cs:202:9:212:9 | {...} | Finally.cs:203:13:210:13 | try {...} ... | | -| Finally.cs:203:13:210:13 | [finally: exception(Exception)] try {...} ... | Finally.cs:204:13:206:13 | [finally: exception(Exception)] {...} | | -| Finally.cs:203:13:210:13 | [finally: exception(ExceptionA)] try {...} ... | Finally.cs:204:13:206:13 | [finally: exception(ExceptionA)] {...} | | +| Finally.cs:203:13:210:13 | [finally: exception] try {...} ... | Finally.cs:204:13:206:13 | [finally: exception] {...} | | | Finally.cs:203:13:210:13 | try {...} ... | Finally.cs:204:13:206:13 | {...} | | -| Finally.cs:204:13:206:13 | [finally: exception(Exception)] {...} | Finally.cs:205:17:205:47 | [finally: exception(Exception)] if (...) ... | | -| Finally.cs:204:13:206:13 | [finally: exception(ExceptionA)] {...} | Finally.cs:205:17:205:47 | [finally: exception(ExceptionA)] if (...) ... | | +| Finally.cs:204:13:206:13 | [finally: exception] {...} | Finally.cs:205:17:205:47 | [finally: exception] if (...) ... | | | Finally.cs:204:13:206:13 | {...} | Finally.cs:205:17:205:47 | if (...) ... | | -| Finally.cs:205:17:205:47 | [finally: exception(Exception)] if (...) ... | Finally.cs:205:21:205:22 | [finally: exception(Exception)] access to parameter b2 | | -| Finally.cs:205:17:205:47 | [finally: exception(ExceptionA)] if (...) ... | Finally.cs:205:21:205:22 | [finally: exception(ExceptionA)] access to parameter b2 | | +| Finally.cs:205:17:205:47 | [finally: exception] if (...) ... | Finally.cs:205:21:205:22 | [finally: exception] access to parameter b2 | | | Finally.cs:205:17:205:47 | if (...) ... | Finally.cs:205:21:205:22 | access to parameter b2 | | -| Finally.cs:205:21:205:22 | [finally: exception(Exception)] access to parameter b2 | Finally.cs:205:31:205:46 | [finally: exception(Exception)] object creation of type ExceptionB | true | -| Finally.cs:205:21:205:22 | [finally: exception(Exception)] access to parameter b2 | Finally.cs:208:13:210:13 | [finally: exception(Exception)] {...} | false | -| Finally.cs:205:21:205:22 | [finally: exception(ExceptionA)] access to parameter b2 | Finally.cs:205:31:205:46 | [finally: exception(ExceptionA)] object creation of type ExceptionB | true | -| Finally.cs:205:21:205:22 | [finally: exception(ExceptionA)] access to parameter b2 | Finally.cs:208:13:210:13 | [finally: exception(ExceptionA)] {...} | false | +| Finally.cs:205:21:205:22 | [finally: exception] access to parameter b2 | Finally.cs:205:31:205:46 | [finally: exception] object creation of type ExceptionB | true | +| Finally.cs:205:21:205:22 | [finally: exception] access to parameter b2 | Finally.cs:208:13:210:13 | [finally: exception] {...} | false | | Finally.cs:205:21:205:22 | access to parameter b2 | Finally.cs:205:31:205:46 | object creation of type ExceptionB | true | | Finally.cs:205:21:205:22 | access to parameter b2 | Finally.cs:208:13:210:13 | {...} | false | -| Finally.cs:205:25:205:47 | [finally: exception(Exception)] throw ...; | Finally.cs:208:13:210:13 | [finally: exception(Exception), finally(1): exception(ExceptionB)] {...} | exception(ExceptionB) | -| Finally.cs:205:25:205:47 | [finally: exception(ExceptionA)] throw ...; | Finally.cs:208:13:210:13 | [finally: exception(ExceptionA), finally(1): exception(ExceptionB)] {...} | exception(ExceptionB) | -| Finally.cs:205:25:205:47 | throw ...; | Finally.cs:208:13:210:13 | [finally(1): exception(ExceptionB)] {...} | exception(ExceptionB) | -| Finally.cs:205:31:205:46 | [finally: exception(Exception)] object creation of type ExceptionB | Finally.cs:205:25:205:47 | [finally: exception(Exception)] throw ...; | | -| Finally.cs:205:31:205:46 | [finally: exception(Exception)] object creation of type ExceptionB | Finally.cs:208:13:210:13 | [finally: exception(Exception), finally(1): exception(Exception)] {...} | exception(Exception) | -| Finally.cs:205:31:205:46 | [finally: exception(ExceptionA)] object creation of type ExceptionB | Finally.cs:205:25:205:47 | [finally: exception(ExceptionA)] throw ...; | | -| Finally.cs:205:31:205:46 | [finally: exception(ExceptionA)] object creation of type ExceptionB | Finally.cs:208:13:210:13 | [finally: exception(ExceptionA), finally(1): exception(Exception)] {...} | exception(Exception) | +| Finally.cs:205:25:205:47 | [finally: exception] throw ...; | Finally.cs:208:13:210:13 | [finally: exception, finally(1): exception] {...} | exception | +| Finally.cs:205:25:205:47 | throw ...; | Finally.cs:208:13:210:13 | [finally(1): exception] {...} | exception | +| Finally.cs:205:31:205:46 | [finally: exception] object creation of type ExceptionB | Finally.cs:205:25:205:47 | [finally: exception] throw ...; | | +| Finally.cs:205:31:205:46 | [finally: exception] object creation of type ExceptionB | Finally.cs:208:13:210:13 | [finally: exception, finally(1): exception] {...} | exception | | Finally.cs:205:31:205:46 | object creation of type ExceptionB | Finally.cs:205:25:205:47 | throw ...; | | -| Finally.cs:205:31:205:46 | object creation of type ExceptionB | Finally.cs:208:13:210:13 | [finally(1): exception(Exception)] {...} | exception(Exception) | -| Finally.cs:208:13:210:13 | [finally(1): exception(Exception)] {...} | Finally.cs:209:17:209:47 | [finally(1): exception(Exception)] if (...) ... | | -| Finally.cs:208:13:210:13 | [finally(1): exception(ExceptionB)] {...} | Finally.cs:209:17:209:47 | [finally(1): exception(ExceptionB)] if (...) ... | | -| Finally.cs:208:13:210:13 | [finally: exception(Exception), finally(1): exception(Exception)] {...} | Finally.cs:209:17:209:47 | [finally: exception(Exception), finally(1): exception(Exception)] if (...) ... | | -| Finally.cs:208:13:210:13 | [finally: exception(Exception), finally(1): exception(ExceptionB)] {...} | Finally.cs:209:17:209:47 | [finally: exception(Exception), finally(1): exception(ExceptionB)] if (...) ... | | -| Finally.cs:208:13:210:13 | [finally: exception(Exception)] {...} | Finally.cs:209:17:209:47 | [finally: exception(Exception)] if (...) ... | | -| Finally.cs:208:13:210:13 | [finally: exception(ExceptionA), finally(1): exception(Exception)] {...} | Finally.cs:209:17:209:47 | [finally: exception(ExceptionA), finally(1): exception(Exception)] if (...) ... | | -| Finally.cs:208:13:210:13 | [finally: exception(ExceptionA), finally(1): exception(ExceptionB)] {...} | Finally.cs:209:17:209:47 | [finally: exception(ExceptionA), finally(1): exception(ExceptionB)] if (...) ... | | -| Finally.cs:208:13:210:13 | [finally: exception(ExceptionA)] {...} | Finally.cs:209:17:209:47 | [finally: exception(ExceptionA)] if (...) ... | | +| Finally.cs:205:31:205:46 | object creation of type ExceptionB | Finally.cs:208:13:210:13 | [finally(1): exception] {...} | exception | +| Finally.cs:208:13:210:13 | [finally(1): exception] {...} | Finally.cs:209:17:209:47 | [finally(1): exception] if (...) ... | | +| Finally.cs:208:13:210:13 | [finally: exception, finally(1): exception] {...} | Finally.cs:209:17:209:47 | [finally: exception, finally(1): exception] if (...) ... | | +| Finally.cs:208:13:210:13 | [finally: exception] {...} | Finally.cs:209:17:209:47 | [finally: exception] if (...) ... | | | Finally.cs:208:13:210:13 | {...} | Finally.cs:209:17:209:47 | if (...) ... | | -| Finally.cs:209:17:209:47 | [finally(1): exception(Exception)] if (...) ... | Finally.cs:209:21:209:22 | [finally(1): exception(Exception)] access to parameter b3 | | -| Finally.cs:209:17:209:47 | [finally(1): exception(ExceptionB)] if (...) ... | Finally.cs:209:21:209:22 | [finally(1): exception(ExceptionB)] access to parameter b3 | | -| Finally.cs:209:17:209:47 | [finally: exception(Exception), finally(1): exception(Exception)] if (...) ... | Finally.cs:209:21:209:22 | [finally: exception(Exception), finally(1): exception(Exception)] access to parameter b3 | | -| Finally.cs:209:17:209:47 | [finally: exception(Exception), finally(1): exception(ExceptionB)] if (...) ... | Finally.cs:209:21:209:22 | [finally: exception(Exception), finally(1): exception(ExceptionB)] access to parameter b3 | | -| Finally.cs:209:17:209:47 | [finally: exception(Exception)] if (...) ... | Finally.cs:209:21:209:22 | [finally: exception(Exception)] access to parameter b3 | | -| Finally.cs:209:17:209:47 | [finally: exception(ExceptionA), finally(1): exception(Exception)] if (...) ... | Finally.cs:209:21:209:22 | [finally: exception(ExceptionA), finally(1): exception(Exception)] access to parameter b3 | | -| Finally.cs:209:17:209:47 | [finally: exception(ExceptionA), finally(1): exception(ExceptionB)] if (...) ... | Finally.cs:209:21:209:22 | [finally: exception(ExceptionA), finally(1): exception(ExceptionB)] access to parameter b3 | | -| Finally.cs:209:17:209:47 | [finally: exception(ExceptionA)] if (...) ... | Finally.cs:209:21:209:22 | [finally: exception(ExceptionA)] access to parameter b3 | | +| Finally.cs:209:17:209:47 | [finally(1): exception] if (...) ... | Finally.cs:209:21:209:22 | [finally(1): exception] access to parameter b3 | | +| Finally.cs:209:17:209:47 | [finally: exception, finally(1): exception] if (...) ... | Finally.cs:209:21:209:22 | [finally: exception, finally(1): exception] access to parameter b3 | | +| Finally.cs:209:17:209:47 | [finally: exception] if (...) ... | Finally.cs:209:21:209:22 | [finally: exception] access to parameter b3 | | | Finally.cs:209:17:209:47 | if (...) ... | Finally.cs:209:21:209:22 | access to parameter b3 | | -| Finally.cs:209:21:209:22 | [finally(1): exception(Exception)] access to parameter b3 | Finally.cs:195:10:195:12 | exit M10 (abnormal) | exception(Exception) | -| Finally.cs:209:21:209:22 | [finally(1): exception(Exception)] access to parameter b3 | Finally.cs:209:31:209:46 | [finally(1): exception(Exception)] object creation of type ExceptionC | true | -| Finally.cs:209:21:209:22 | [finally(1): exception(ExceptionB)] access to parameter b3 | Finally.cs:195:10:195:12 | exit M10 (abnormal) | exception(ExceptionB) | -| Finally.cs:209:21:209:22 | [finally(1): exception(ExceptionB)] access to parameter b3 | Finally.cs:209:31:209:46 | [finally(1): exception(ExceptionB)] object creation of type ExceptionC | true | -| Finally.cs:209:21:209:22 | [finally: exception(Exception), finally(1): exception(Exception)] access to parameter b3 | Finally.cs:195:10:195:12 | exit M10 (abnormal) | exception(Exception) | -| Finally.cs:209:21:209:22 | [finally: exception(Exception), finally(1): exception(Exception)] access to parameter b3 | Finally.cs:209:31:209:46 | [finally: exception(Exception), finally(1): exception(Exception)] object creation of type ExceptionC | true | -| Finally.cs:209:21:209:22 | [finally: exception(Exception), finally(1): exception(ExceptionB)] access to parameter b3 | Finally.cs:195:10:195:12 | exit M10 (abnormal) | exception(ExceptionB) | -| Finally.cs:209:21:209:22 | [finally: exception(Exception), finally(1): exception(ExceptionB)] access to parameter b3 | Finally.cs:209:31:209:46 | [finally: exception(Exception), finally(1): exception(ExceptionB)] object creation of type ExceptionC | true | -| Finally.cs:209:21:209:22 | [finally: exception(Exception)] access to parameter b3 | Finally.cs:209:31:209:46 | [finally: exception(Exception)] object creation of type ExceptionC | true | -| Finally.cs:209:21:209:22 | [finally: exception(Exception)] access to parameter b3 | Finally.cs:211:13:211:29 | [finally: exception(Exception)] ...; | false | -| Finally.cs:209:21:209:22 | [finally: exception(ExceptionA), finally(1): exception(Exception)] access to parameter b3 | Finally.cs:195:10:195:12 | exit M10 (abnormal) | exception(Exception) | -| Finally.cs:209:21:209:22 | [finally: exception(ExceptionA), finally(1): exception(Exception)] access to parameter b3 | Finally.cs:209:31:209:46 | [finally: exception(ExceptionA), finally(1): exception(Exception)] object creation of type ExceptionC | true | -| Finally.cs:209:21:209:22 | [finally: exception(ExceptionA), finally(1): exception(ExceptionB)] access to parameter b3 | Finally.cs:195:10:195:12 | exit M10 (abnormal) | exception(ExceptionB) | -| Finally.cs:209:21:209:22 | [finally: exception(ExceptionA), finally(1): exception(ExceptionB)] access to parameter b3 | Finally.cs:209:31:209:46 | [finally: exception(ExceptionA), finally(1): exception(ExceptionB)] object creation of type ExceptionC | true | -| Finally.cs:209:21:209:22 | [finally: exception(ExceptionA)] access to parameter b3 | Finally.cs:209:31:209:46 | [finally: exception(ExceptionA)] object creation of type ExceptionC | true | -| Finally.cs:209:21:209:22 | [finally: exception(ExceptionA)] access to parameter b3 | Finally.cs:211:13:211:29 | [finally: exception(ExceptionA)] ...; | false | +| Finally.cs:209:21:209:22 | [finally(1): exception] access to parameter b3 | Finally.cs:195:10:195:12 | exit M10 (abnormal) | exception | +| Finally.cs:209:21:209:22 | [finally(1): exception] access to parameter b3 | Finally.cs:209:31:209:46 | [finally(1): exception] object creation of type ExceptionC | true | +| Finally.cs:209:21:209:22 | [finally: exception, finally(1): exception] access to parameter b3 | Finally.cs:195:10:195:12 | exit M10 (abnormal) | exception | +| Finally.cs:209:21:209:22 | [finally: exception, finally(1): exception] access to parameter b3 | Finally.cs:209:31:209:46 | [finally: exception, finally(1): exception] object creation of type ExceptionC | true | +| Finally.cs:209:21:209:22 | [finally: exception] access to parameter b3 | Finally.cs:209:31:209:46 | [finally: exception] object creation of type ExceptionC | true | +| Finally.cs:209:21:209:22 | [finally: exception] access to parameter b3 | Finally.cs:211:13:211:29 | [finally: exception] ...; | false | | Finally.cs:209:21:209:22 | access to parameter b3 | Finally.cs:209:31:209:46 | object creation of type ExceptionC | true | | Finally.cs:209:21:209:22 | access to parameter b3 | Finally.cs:211:13:211:29 | ...; | false | -| Finally.cs:209:25:209:47 | [finally(1): exception(Exception)] throw ...; | Finally.cs:195:10:195:12 | exit M10 (abnormal) | exception(ExceptionC) | -| Finally.cs:209:25:209:47 | [finally(1): exception(ExceptionB)] throw ...; | Finally.cs:195:10:195:12 | exit M10 (abnormal) | exception(ExceptionC) | -| Finally.cs:209:25:209:47 | [finally: exception(Exception), finally(1): exception(Exception)] throw ...; | Finally.cs:195:10:195:12 | exit M10 (abnormal) | exception(ExceptionC) | -| Finally.cs:209:25:209:47 | [finally: exception(Exception), finally(1): exception(ExceptionB)] throw ...; | Finally.cs:195:10:195:12 | exit M10 (abnormal) | exception(ExceptionC) | -| Finally.cs:209:25:209:47 | [finally: exception(Exception)] throw ...; | Finally.cs:195:10:195:12 | exit M10 (abnormal) | exception(ExceptionC) | -| Finally.cs:209:25:209:47 | [finally: exception(ExceptionA), finally(1): exception(Exception)] throw ...; | Finally.cs:195:10:195:12 | exit M10 (abnormal) | exception(ExceptionC) | -| Finally.cs:209:25:209:47 | [finally: exception(ExceptionA), finally(1): exception(ExceptionB)] throw ...; | Finally.cs:195:10:195:12 | exit M10 (abnormal) | exception(ExceptionC) | -| Finally.cs:209:25:209:47 | [finally: exception(ExceptionA)] throw ...; | Finally.cs:195:10:195:12 | exit M10 (abnormal) | exception(ExceptionC) | -| Finally.cs:209:25:209:47 | throw ...; | Finally.cs:195:10:195:12 | exit M10 (abnormal) | exception(ExceptionC) | -| Finally.cs:209:31:209:46 | [finally(1): exception(Exception)] object creation of type ExceptionC | Finally.cs:209:25:209:47 | [finally(1): exception(Exception)] throw ...; | | -| Finally.cs:209:31:209:46 | [finally(1): exception(ExceptionB)] object creation of type ExceptionC | Finally.cs:209:25:209:47 | [finally(1): exception(ExceptionB)] throw ...; | | -| Finally.cs:209:31:209:46 | [finally: exception(Exception), finally(1): exception(Exception)] object creation of type ExceptionC | Finally.cs:209:25:209:47 | [finally: exception(Exception), finally(1): exception(Exception)] throw ...; | | -| Finally.cs:209:31:209:46 | [finally: exception(Exception), finally(1): exception(ExceptionB)] object creation of type ExceptionC | Finally.cs:209:25:209:47 | [finally: exception(Exception), finally(1): exception(ExceptionB)] throw ...; | | -| Finally.cs:209:31:209:46 | [finally: exception(Exception)] object creation of type ExceptionC | Finally.cs:209:25:209:47 | [finally: exception(Exception)] throw ...; | | -| Finally.cs:209:31:209:46 | [finally: exception(ExceptionA), finally(1): exception(Exception)] object creation of type ExceptionC | Finally.cs:209:25:209:47 | [finally: exception(ExceptionA), finally(1): exception(Exception)] throw ...; | | -| Finally.cs:209:31:209:46 | [finally: exception(ExceptionA), finally(1): exception(ExceptionB)] object creation of type ExceptionC | Finally.cs:209:25:209:47 | [finally: exception(ExceptionA), finally(1): exception(ExceptionB)] throw ...; | | -| Finally.cs:209:31:209:46 | [finally: exception(ExceptionA)] object creation of type ExceptionC | Finally.cs:209:25:209:47 | [finally: exception(ExceptionA)] throw ...; | | +| Finally.cs:209:25:209:47 | [finally(1): exception] throw ...; | Finally.cs:195:10:195:12 | exit M10 (abnormal) | exception | +| Finally.cs:209:25:209:47 | [finally: exception, finally(1): exception] throw ...; | Finally.cs:195:10:195:12 | exit M10 (abnormal) | exception | +| Finally.cs:209:25:209:47 | [finally: exception] throw ...; | Finally.cs:195:10:195:12 | exit M10 (abnormal) | exception | +| Finally.cs:209:25:209:47 | throw ...; | Finally.cs:195:10:195:12 | exit M10 (abnormal) | exception | +| Finally.cs:209:31:209:46 | [finally(1): exception] object creation of type ExceptionC | Finally.cs:209:25:209:47 | [finally(1): exception] throw ...; | | +| Finally.cs:209:31:209:46 | [finally: exception, finally(1): exception] object creation of type ExceptionC | Finally.cs:209:25:209:47 | [finally: exception, finally(1): exception] throw ...; | | +| Finally.cs:209:31:209:46 | [finally: exception] object creation of type ExceptionC | Finally.cs:209:25:209:47 | [finally: exception] throw ...; | | | Finally.cs:209:31:209:46 | object creation of type ExceptionC | Finally.cs:209:25:209:47 | throw ...; | | -| Finally.cs:211:13:211:16 | [finally: exception(Exception)] this access | Finally.cs:211:26:211:28 | [finally: exception(Exception)] "0" | | -| Finally.cs:211:13:211:16 | [finally: exception(ExceptionA)] this access | Finally.cs:211:26:211:28 | [finally: exception(ExceptionA)] "0" | | +| Finally.cs:211:13:211:16 | [finally: exception] this access | Finally.cs:211:26:211:28 | [finally: exception] "0" | | | Finally.cs:211:13:211:16 | this access | Finally.cs:211:26:211:28 | "0" | | | Finally.cs:211:13:211:28 | ... = ... | Finally.cs:213:9:213:25 | ...; | | -| Finally.cs:211:13:211:28 | [finally: exception(Exception)] ... = ... | Finally.cs:195:10:195:12 | exit M10 (abnormal) | exception(Exception) | -| Finally.cs:211:13:211:28 | [finally: exception(ExceptionA)] ... = ... | Finally.cs:195:10:195:12 | exit M10 (abnormal) | exception(ExceptionA) | +| Finally.cs:211:13:211:28 | [finally: exception] ... = ... | Finally.cs:195:10:195:12 | exit M10 (abnormal) | exception | | Finally.cs:211:13:211:29 | ...; | Finally.cs:211:13:211:16 | this access | | -| Finally.cs:211:13:211:29 | [finally: exception(Exception)] ...; | Finally.cs:211:13:211:16 | [finally: exception(Exception)] this access | | -| Finally.cs:211:13:211:29 | [finally: exception(ExceptionA)] ...; | Finally.cs:211:13:211:16 | [finally: exception(ExceptionA)] this access | | +| Finally.cs:211:13:211:29 | [finally: exception] ...; | Finally.cs:211:13:211:16 | [finally: exception] this access | | | Finally.cs:211:26:211:28 | "0" | Finally.cs:211:13:211:28 | ... = ... | | -| Finally.cs:211:26:211:28 | [finally: exception(Exception)] "0" | Finally.cs:211:13:211:28 | [finally: exception(Exception)] ... = ... | | -| Finally.cs:211:26:211:28 | [finally: exception(ExceptionA)] "0" | Finally.cs:211:13:211:28 | [finally: exception(ExceptionA)] ... = ... | | +| Finally.cs:211:26:211:28 | [finally: exception] "0" | Finally.cs:211:13:211:28 | [finally: exception] ... = ... | | | Finally.cs:213:9:213:12 | this access | Finally.cs:213:22:213:24 | "1" | | | Finally.cs:213:9:213:24 | ... = ... | Finally.cs:195:10:195:12 | exit M10 (normal) | | | Finally.cs:213:9:213:25 | ...; | Finally.cs:213:9:213:12 | this access | | @@ -2627,7 +2467,7 @@ | Finally.cs:217:5:231:5 | {...} | Finally.cs:218:9:229:9 | try {...} ... | | | Finally.cs:218:9:229:9 | try {...} ... | Finally.cs:219:9:221:9 | {...} | | | Finally.cs:219:9:221:9 | {...} | Finally.cs:220:13:220:37 | ...; | | -| Finally.cs:220:13:220:36 | call to method WriteLine | Finally.cs:222:9:225:9 | catch {...} | exception(Exception) | +| Finally.cs:220:13:220:36 | call to method WriteLine | Finally.cs:222:9:225:9 | catch {...} | exception | | Finally.cs:220:13:220:36 | call to method WriteLine | Finally.cs:227:9:229:9 | {...} | | | Finally.cs:220:13:220:37 | ...; | Finally.cs:220:31:220:35 | "Try" | | | Finally.cs:220:31:220:35 | "Try" | Finally.cs:220:13:220:36 | call to method WriteLine | | @@ -2654,88 +2494,55 @@ | Finally.cs:239:17:240:43 | if (...) ... | Finally.cs:239:21:239:22 | access to parameter b1 | | | Finally.cs:239:21:239:22 | access to parameter b1 | Finally.cs:240:27:240:42 | object creation of type ExceptionA | true | | Finally.cs:239:21:239:22 | access to parameter b1 | Finally.cs:243:13:253:13 | {...} | false | -| Finally.cs:240:21:240:43 | throw ...; | Finally.cs:243:13:253:13 | [finally: exception(ExceptionA)] {...} | exception(ExceptionA) | +| Finally.cs:240:21:240:43 | throw ...; | Finally.cs:243:13:253:13 | [finally: exception] {...} | exception | | Finally.cs:240:27:240:42 | object creation of type ExceptionA | Finally.cs:240:21:240:43 | throw ...; | | -| Finally.cs:240:27:240:42 | object creation of type ExceptionA | Finally.cs:243:13:253:13 | [finally: exception(Exception)] {...} | exception(Exception) | -| Finally.cs:243:13:253:13 | [finally: exception(Exception)] {...} | Finally.cs:244:17:252:17 | [finally: exception(Exception)] try {...} ... | | -| Finally.cs:243:13:253:13 | [finally: exception(ExceptionA)] {...} | Finally.cs:244:17:252:17 | [finally: exception(ExceptionA)] try {...} ... | | +| Finally.cs:240:27:240:42 | object creation of type ExceptionA | Finally.cs:243:13:253:13 | [finally: exception] {...} | exception | +| Finally.cs:243:13:253:13 | [finally: exception] {...} | Finally.cs:244:17:252:17 | [finally: exception] try {...} ... | | | Finally.cs:243:13:253:13 | {...} | Finally.cs:244:17:252:17 | try {...} ... | | -| Finally.cs:244:17:252:17 | [finally: exception(Exception)] try {...} ... | Finally.cs:245:17:248:17 | [finally: exception(Exception)] {...} | | -| Finally.cs:244:17:252:17 | [finally: exception(ExceptionA)] try {...} ... | Finally.cs:245:17:248:17 | [finally: exception(ExceptionA)] {...} | | +| Finally.cs:244:17:252:17 | [finally: exception] try {...} ... | Finally.cs:245:17:248:17 | [finally: exception] {...} | | | Finally.cs:244:17:252:17 | try {...} ... | Finally.cs:245:17:248:17 | {...} | | -| Finally.cs:245:17:248:17 | [finally: exception(Exception)] {...} | Finally.cs:246:21:247:47 | [finally: exception(Exception)] if (...) ... | | -| Finally.cs:245:17:248:17 | [finally: exception(ExceptionA)] {...} | Finally.cs:246:21:247:47 | [finally: exception(ExceptionA)] if (...) ... | | +| Finally.cs:245:17:248:17 | [finally: exception] {...} | Finally.cs:246:21:247:47 | [finally: exception] if (...) ... | | | Finally.cs:245:17:248:17 | {...} | Finally.cs:246:21:247:47 | if (...) ... | | -| Finally.cs:246:21:247:47 | [finally: exception(Exception)] if (...) ... | Finally.cs:246:25:246:26 | [finally: exception(Exception)] access to parameter b2 | | -| Finally.cs:246:21:247:47 | [finally: exception(ExceptionA)] if (...) ... | Finally.cs:246:25:246:26 | [finally: exception(ExceptionA)] access to parameter b2 | | +| Finally.cs:246:21:247:47 | [finally: exception] if (...) ... | Finally.cs:246:25:246:26 | [finally: exception] access to parameter b2 | | | Finally.cs:246:21:247:47 | if (...) ... | Finally.cs:246:25:246:26 | access to parameter b2 | | -| Finally.cs:246:25:246:26 | [finally: exception(Exception)] access to parameter b2 | Finally.cs:247:31:247:46 | [finally: exception(Exception)] object creation of type ExceptionA | true | -| Finally.cs:246:25:246:26 | [finally: exception(Exception)] access to parameter b2 | Finally.cs:250:17:252:17 | [finally: exception(Exception)] {...} | false | -| Finally.cs:246:25:246:26 | [finally: exception(ExceptionA)] access to parameter b2 | Finally.cs:247:31:247:46 | [finally: exception(ExceptionA)] object creation of type ExceptionA | true | -| Finally.cs:246:25:246:26 | [finally: exception(ExceptionA)] access to parameter b2 | Finally.cs:250:17:252:17 | [finally: exception(ExceptionA)] {...} | false | +| Finally.cs:246:25:246:26 | [finally: exception] access to parameter b2 | Finally.cs:247:31:247:46 | [finally: exception] object creation of type ExceptionA | true | +| Finally.cs:246:25:246:26 | [finally: exception] access to parameter b2 | Finally.cs:250:17:252:17 | [finally: exception] {...} | false | | Finally.cs:246:25:246:26 | access to parameter b2 | Finally.cs:247:31:247:46 | object creation of type ExceptionA | true | | Finally.cs:246:25:246:26 | access to parameter b2 | Finally.cs:250:17:252:17 | {...} | false | -| Finally.cs:247:25:247:47 | [finally: exception(Exception)] throw ...; | Finally.cs:250:17:252:17 | [finally: exception(Exception), finally(1): exception(ExceptionA)] {...} | exception(ExceptionA) | -| Finally.cs:247:25:247:47 | [finally: exception(ExceptionA)] throw ...; | Finally.cs:250:17:252:17 | [finally: exception(ExceptionA), finally(1): exception(ExceptionA)] {...} | exception(ExceptionA) | -| Finally.cs:247:25:247:47 | throw ...; | Finally.cs:250:17:252:17 | [finally(1): exception(ExceptionA)] {...} | exception(ExceptionA) | -| Finally.cs:247:31:247:46 | [finally: exception(Exception)] object creation of type ExceptionA | Finally.cs:247:25:247:47 | [finally: exception(Exception)] throw ...; | | -| Finally.cs:247:31:247:46 | [finally: exception(Exception)] object creation of type ExceptionA | Finally.cs:250:17:252:17 | [finally: exception(Exception), finally(1): exception(Exception)] {...} | exception(Exception) | -| Finally.cs:247:31:247:46 | [finally: exception(ExceptionA)] object creation of type ExceptionA | Finally.cs:247:25:247:47 | [finally: exception(ExceptionA)] throw ...; | | -| Finally.cs:247:31:247:46 | [finally: exception(ExceptionA)] object creation of type ExceptionA | Finally.cs:250:17:252:17 | [finally: exception(ExceptionA), finally(1): exception(Exception)] {...} | exception(Exception) | +| Finally.cs:247:25:247:47 | [finally: exception] throw ...; | Finally.cs:250:17:252:17 | [finally: exception, finally(1): exception] {...} | exception | +| Finally.cs:247:25:247:47 | throw ...; | Finally.cs:250:17:252:17 | [finally(1): exception] {...} | exception | +| Finally.cs:247:31:247:46 | [finally: exception] object creation of type ExceptionA | Finally.cs:247:25:247:47 | [finally: exception] throw ...; | | +| Finally.cs:247:31:247:46 | [finally: exception] object creation of type ExceptionA | Finally.cs:250:17:252:17 | [finally: exception, finally(1): exception] {...} | exception | | Finally.cs:247:31:247:46 | object creation of type ExceptionA | Finally.cs:247:25:247:47 | throw ...; | | -| Finally.cs:247:31:247:46 | object creation of type ExceptionA | Finally.cs:250:17:252:17 | [finally(1): exception(Exception)] {...} | exception(Exception) | -| Finally.cs:250:17:252:17 | [finally(1): exception(Exception)] {...} | Finally.cs:251:21:251:55 | [finally(1): exception(Exception)] ...; | | -| Finally.cs:250:17:252:17 | [finally(1): exception(ExceptionA)] {...} | Finally.cs:251:21:251:55 | [finally(1): exception(ExceptionA)] ...; | | -| Finally.cs:250:17:252:17 | [finally: exception(Exception), finally(1): exception(Exception)] {...} | Finally.cs:251:21:251:55 | [finally: exception(Exception), finally(1): exception(Exception)] ...; | | -| Finally.cs:250:17:252:17 | [finally: exception(Exception), finally(1): exception(ExceptionA)] {...} | Finally.cs:251:21:251:55 | [finally: exception(Exception), finally(1): exception(ExceptionA)] ...; | | -| Finally.cs:250:17:252:17 | [finally: exception(Exception)] {...} | Finally.cs:251:21:251:55 | [finally: exception(Exception)] ...; | | -| Finally.cs:250:17:252:17 | [finally: exception(ExceptionA), finally(1): exception(Exception)] {...} | Finally.cs:251:21:251:55 | [finally: exception(ExceptionA), finally(1): exception(Exception)] ...; | | -| Finally.cs:250:17:252:17 | [finally: exception(ExceptionA), finally(1): exception(ExceptionA)] {...} | Finally.cs:251:21:251:55 | [finally: exception(ExceptionA), finally(1): exception(ExceptionA)] ...; | | -| Finally.cs:250:17:252:17 | [finally: exception(ExceptionA)] {...} | Finally.cs:251:21:251:55 | [finally: exception(ExceptionA)] ...; | | +| Finally.cs:247:31:247:46 | object creation of type ExceptionA | Finally.cs:250:17:252:17 | [finally(1): exception] {...} | exception | +| Finally.cs:250:17:252:17 | [finally(1): exception] {...} | Finally.cs:251:21:251:55 | [finally(1): exception] ...; | | +| Finally.cs:250:17:252:17 | [finally: exception, finally(1): exception] {...} | Finally.cs:251:21:251:55 | [finally: exception, finally(1): exception] ...; | | +| Finally.cs:250:17:252:17 | [finally: exception] {...} | Finally.cs:251:21:251:55 | [finally: exception] ...; | | | Finally.cs:250:17:252:17 | {...} | Finally.cs:251:21:251:55 | ...; | | -| Finally.cs:251:21:251:54 | [finally(1): exception(Exception)] call to method WriteLine | Finally.cs:257:9:259:9 | [finally: exception(Exception)] {...} | exception(Exception) | -| Finally.cs:251:21:251:54 | [finally(1): exception(ExceptionA)] call to method WriteLine | Finally.cs:257:9:259:9 | [finally: exception(ExceptionA)] {...} | exception(ExceptionA) | -| Finally.cs:251:21:251:54 | [finally: exception(Exception), finally(1): exception(Exception)] call to method WriteLine | Finally.cs:257:9:259:9 | [finally: exception(Exception)] {...} | exception(Exception) | -| Finally.cs:251:21:251:54 | [finally: exception(Exception), finally(1): exception(ExceptionA)] call to method WriteLine | Finally.cs:257:9:259:9 | [finally: exception(ExceptionA)] {...} | exception(ExceptionA) | -| Finally.cs:251:21:251:54 | [finally: exception(Exception)] call to method WriteLine | Finally.cs:257:9:259:9 | [finally: exception(Exception)] {...} | exception(Exception) | -| Finally.cs:251:21:251:54 | [finally: exception(ExceptionA), finally(1): exception(Exception)] call to method WriteLine | Finally.cs:257:9:259:9 | [finally: exception(Exception)] {...} | exception(Exception) | -| Finally.cs:251:21:251:54 | [finally: exception(ExceptionA), finally(1): exception(ExceptionA)] call to method WriteLine | Finally.cs:257:9:259:9 | [finally: exception(ExceptionA)] {...} | exception(ExceptionA) | -| Finally.cs:251:21:251:54 | [finally: exception(ExceptionA)] call to method WriteLine | Finally.cs:257:9:259:9 | [finally: exception(ExceptionA)] {...} | exception(ExceptionA) | +| Finally.cs:251:21:251:54 | [finally(1): exception] call to method WriteLine | Finally.cs:257:9:259:9 | [finally: exception] {...} | exception | +| Finally.cs:251:21:251:54 | [finally: exception, finally(1): exception] call to method WriteLine | Finally.cs:257:9:259:9 | [finally: exception] {...} | exception | +| Finally.cs:251:21:251:54 | [finally: exception] call to method WriteLine | Finally.cs:257:9:259:9 | [finally: exception] {...} | exception | | Finally.cs:251:21:251:54 | call to method WriteLine | Finally.cs:254:13:254:45 | ...; | | | Finally.cs:251:21:251:55 | ...; | Finally.cs:251:39:251:53 | "Inner finally" | | -| Finally.cs:251:21:251:55 | [finally(1): exception(Exception)] ...; | Finally.cs:251:39:251:53 | [finally(1): exception(Exception)] "Inner finally" | | -| Finally.cs:251:21:251:55 | [finally(1): exception(ExceptionA)] ...; | Finally.cs:251:39:251:53 | [finally(1): exception(ExceptionA)] "Inner finally" | | -| Finally.cs:251:21:251:55 | [finally: exception(Exception), finally(1): exception(Exception)] ...; | Finally.cs:251:39:251:53 | [finally: exception(Exception), finally(1): exception(Exception)] "Inner finally" | | -| Finally.cs:251:21:251:55 | [finally: exception(Exception), finally(1): exception(ExceptionA)] ...; | Finally.cs:251:39:251:53 | [finally: exception(Exception), finally(1): exception(ExceptionA)] "Inner finally" | | -| Finally.cs:251:21:251:55 | [finally: exception(Exception)] ...; | Finally.cs:251:39:251:53 | [finally: exception(Exception)] "Inner finally" | | -| Finally.cs:251:21:251:55 | [finally: exception(ExceptionA), finally(1): exception(Exception)] ...; | Finally.cs:251:39:251:53 | [finally: exception(ExceptionA), finally(1): exception(Exception)] "Inner finally" | | -| Finally.cs:251:21:251:55 | [finally: exception(ExceptionA), finally(1): exception(ExceptionA)] ...; | Finally.cs:251:39:251:53 | [finally: exception(ExceptionA), finally(1): exception(ExceptionA)] "Inner finally" | | -| Finally.cs:251:21:251:55 | [finally: exception(ExceptionA)] ...; | Finally.cs:251:39:251:53 | [finally: exception(ExceptionA)] "Inner finally" | | +| Finally.cs:251:21:251:55 | [finally(1): exception] ...; | Finally.cs:251:39:251:53 | [finally(1): exception] "Inner finally" | | +| Finally.cs:251:21:251:55 | [finally: exception, finally(1): exception] ...; | Finally.cs:251:39:251:53 | [finally: exception, finally(1): exception] "Inner finally" | | +| Finally.cs:251:21:251:55 | [finally: exception] ...; | Finally.cs:251:39:251:53 | [finally: exception] "Inner finally" | | | Finally.cs:251:39:251:53 | "Inner finally" | Finally.cs:251:21:251:54 | call to method WriteLine | | -| Finally.cs:251:39:251:53 | [finally(1): exception(Exception)] "Inner finally" | Finally.cs:251:21:251:54 | [finally(1): exception(Exception)] call to method WriteLine | | -| Finally.cs:251:39:251:53 | [finally(1): exception(ExceptionA)] "Inner finally" | Finally.cs:251:21:251:54 | [finally(1): exception(ExceptionA)] call to method WriteLine | | -| Finally.cs:251:39:251:53 | [finally: exception(Exception), finally(1): exception(Exception)] "Inner finally" | Finally.cs:251:21:251:54 | [finally: exception(Exception), finally(1): exception(Exception)] call to method WriteLine | | -| Finally.cs:251:39:251:53 | [finally: exception(Exception), finally(1): exception(ExceptionA)] "Inner finally" | Finally.cs:251:21:251:54 | [finally: exception(Exception), finally(1): exception(ExceptionA)] call to method WriteLine | | -| Finally.cs:251:39:251:53 | [finally: exception(Exception)] "Inner finally" | Finally.cs:251:21:251:54 | [finally: exception(Exception)] call to method WriteLine | | -| Finally.cs:251:39:251:53 | [finally: exception(ExceptionA), finally(1): exception(Exception)] "Inner finally" | Finally.cs:251:21:251:54 | [finally: exception(ExceptionA), finally(1): exception(Exception)] call to method WriteLine | | -| Finally.cs:251:39:251:53 | [finally: exception(ExceptionA), finally(1): exception(ExceptionA)] "Inner finally" | Finally.cs:251:21:251:54 | [finally: exception(ExceptionA), finally(1): exception(ExceptionA)] call to method WriteLine | | -| Finally.cs:251:39:251:53 | [finally: exception(ExceptionA)] "Inner finally" | Finally.cs:251:21:251:54 | [finally: exception(ExceptionA)] call to method WriteLine | | -| Finally.cs:254:13:254:44 | call to method WriteLine | Finally.cs:257:9:259:9 | [finally: exception(Exception)] {...} | exception(Exception) | +| Finally.cs:251:39:251:53 | [finally(1): exception] "Inner finally" | Finally.cs:251:21:251:54 | [finally(1): exception] call to method WriteLine | | +| Finally.cs:251:39:251:53 | [finally: exception, finally(1): exception] "Inner finally" | Finally.cs:251:21:251:54 | [finally: exception, finally(1): exception] call to method WriteLine | | +| Finally.cs:251:39:251:53 | [finally: exception] "Inner finally" | Finally.cs:251:21:251:54 | [finally: exception] call to method WriteLine | | +| Finally.cs:254:13:254:44 | call to method WriteLine | Finally.cs:257:9:259:9 | [finally: exception] {...} | exception | | Finally.cs:254:13:254:44 | call to method WriteLine | Finally.cs:257:9:259:9 | {...} | | | Finally.cs:254:13:254:45 | ...; | Finally.cs:254:31:254:43 | "Mid finally" | | | Finally.cs:254:31:254:43 | "Mid finally" | Finally.cs:254:13:254:44 | call to method WriteLine | | -| Finally.cs:257:9:259:9 | [finally: exception(Exception)] {...} | Finally.cs:258:13:258:47 | [finally: exception(Exception)] ...; | | -| Finally.cs:257:9:259:9 | [finally: exception(ExceptionA)] {...} | Finally.cs:258:13:258:47 | [finally: exception(ExceptionA)] ...; | | +| Finally.cs:257:9:259:9 | [finally: exception] {...} | Finally.cs:258:13:258:47 | [finally: exception] ...; | | | Finally.cs:257:9:259:9 | {...} | Finally.cs:258:13:258:47 | ...; | | -| Finally.cs:258:13:258:46 | [finally: exception(Exception)] call to method WriteLine | Finally.cs:233:10:233:12 | exit M12 (abnormal) | exception(Exception) | -| Finally.cs:258:13:258:46 | [finally: exception(ExceptionA)] call to method WriteLine | Finally.cs:233:10:233:12 | exit M12 (abnormal) | exception(ExceptionA) | +| Finally.cs:258:13:258:46 | [finally: exception] call to method WriteLine | Finally.cs:233:10:233:12 | exit M12 (abnormal) | exception | | Finally.cs:258:13:258:46 | call to method WriteLine | Finally.cs:260:9:260:34 | ...; | | | Finally.cs:258:13:258:47 | ...; | Finally.cs:258:31:258:45 | "Outer finally" | | -| Finally.cs:258:13:258:47 | [finally: exception(Exception)] ...; | Finally.cs:258:31:258:45 | [finally: exception(Exception)] "Outer finally" | | -| Finally.cs:258:13:258:47 | [finally: exception(ExceptionA)] ...; | Finally.cs:258:31:258:45 | [finally: exception(ExceptionA)] "Outer finally" | | +| Finally.cs:258:13:258:47 | [finally: exception] ...; | Finally.cs:258:31:258:45 | [finally: exception] "Outer finally" | | | Finally.cs:258:31:258:45 | "Outer finally" | Finally.cs:258:13:258:46 | call to method WriteLine | | -| Finally.cs:258:31:258:45 | [finally: exception(Exception)] "Outer finally" | Finally.cs:258:13:258:46 | [finally: exception(Exception)] call to method WriteLine | | -| Finally.cs:258:31:258:45 | [finally: exception(ExceptionA)] "Outer finally" | Finally.cs:258:13:258:46 | [finally: exception(ExceptionA)] call to method WriteLine | | +| Finally.cs:258:31:258:45 | [finally: exception] "Outer finally" | Finally.cs:258:13:258:46 | [finally: exception] call to method WriteLine | | | Finally.cs:260:9:260:33 | call to method WriteLine | Finally.cs:233:10:233:12 | exit M12 (normal) | | | Finally.cs:260:9:260:34 | ...; | Finally.cs:260:27:260:32 | "Done" | | | Finally.cs:260:27:260:32 | "Done" | Finally.cs:260:9:260:33 | call to method WriteLine | | @@ -2745,28 +2552,28 @@ | Finally.cs:264:5:274:5 | {...} | Finally.cs:265:9:273:9 | try {...} ... | | | Finally.cs:265:9:273:9 | try {...} ... | Finally.cs:266:9:268:9 | {...} | | | Finally.cs:266:9:268:9 | {...} | Finally.cs:267:13:267:35 | ...; | | -| Finally.cs:267:13:267:34 | call to method WriteLine | Finally.cs:270:9:273:9 | [finally: exception(Exception)] {...} | exception(Exception) | +| Finally.cs:267:13:267:34 | call to method WriteLine | Finally.cs:270:9:273:9 | [finally: exception] {...} | exception | | Finally.cs:267:13:267:34 | call to method WriteLine | Finally.cs:270:9:273:9 | {...} | | | Finally.cs:267:13:267:35 | ...; | Finally.cs:267:31:267:33 | "1" | | | Finally.cs:267:31:267:33 | "1" | Finally.cs:267:13:267:34 | call to method WriteLine | | -| Finally.cs:270:9:273:9 | [finally: exception(Exception)] {...} | Finally.cs:271:13:271:35 | [finally: exception(Exception)] ...; | | +| Finally.cs:270:9:273:9 | [finally: exception] {...} | Finally.cs:271:13:271:35 | [finally: exception] ...; | | | Finally.cs:270:9:273:9 | {...} | Finally.cs:271:13:271:35 | ...; | | -| Finally.cs:271:13:271:34 | [finally: exception(Exception)] call to method WriteLine | Finally.cs:272:13:272:19 | [finally: exception(Exception)] ...; | | +| Finally.cs:271:13:271:34 | [finally: exception] call to method WriteLine | Finally.cs:272:13:272:19 | [finally: exception] ...; | | | Finally.cs:271:13:271:34 | call to method WriteLine | Finally.cs:272:13:272:19 | ...; | | | Finally.cs:271:13:271:35 | ...; | Finally.cs:271:31:271:33 | "3" | | -| Finally.cs:271:13:271:35 | [finally: exception(Exception)] ...; | Finally.cs:271:31:271:33 | [finally: exception(Exception)] "3" | | +| Finally.cs:271:13:271:35 | [finally: exception] ...; | Finally.cs:271:31:271:33 | [finally: exception] "3" | | | Finally.cs:271:31:271:33 | "3" | Finally.cs:271:13:271:34 | call to method WriteLine | | -| Finally.cs:271:31:271:33 | [finally: exception(Exception)] "3" | Finally.cs:271:13:271:34 | [finally: exception(Exception)] call to method WriteLine | | -| Finally.cs:272:13:272:13 | [finally: exception(Exception)] access to parameter i | Finally.cs:272:18:272:18 | [finally: exception(Exception)] 3 | | +| Finally.cs:271:31:271:33 | [finally: exception] "3" | Finally.cs:271:13:271:34 | [finally: exception] call to method WriteLine | | +| Finally.cs:272:13:272:13 | [finally: exception] access to parameter i | Finally.cs:272:18:272:18 | [finally: exception] 3 | | | Finally.cs:272:13:272:13 | access to parameter i | Finally.cs:272:18:272:18 | 3 | | | Finally.cs:272:13:272:18 | ... + ... | Finally.cs:272:13:272:18 | ... = ... | | | Finally.cs:272:13:272:18 | ... = ... | Finally.cs:263:10:263:12 | exit M13 (normal) | | -| Finally.cs:272:13:272:18 | [finally: exception(Exception)] ... + ... | Finally.cs:272:13:272:18 | [finally: exception(Exception)] ... = ... | | -| Finally.cs:272:13:272:18 | [finally: exception(Exception)] ... = ... | Finally.cs:263:10:263:12 | exit M13 (abnormal) | exception(Exception) | +| Finally.cs:272:13:272:18 | [finally: exception] ... + ... | Finally.cs:272:13:272:18 | [finally: exception] ... = ... | | +| Finally.cs:272:13:272:18 | [finally: exception] ... = ... | Finally.cs:263:10:263:12 | exit M13 (abnormal) | exception | | Finally.cs:272:13:272:19 | ...; | Finally.cs:272:13:272:13 | access to parameter i | | -| Finally.cs:272:13:272:19 | [finally: exception(Exception)] ...; | Finally.cs:272:13:272:13 | [finally: exception(Exception)] access to parameter i | | +| Finally.cs:272:13:272:19 | [finally: exception] ...; | Finally.cs:272:13:272:13 | [finally: exception] access to parameter i | | | Finally.cs:272:18:272:18 | 3 | Finally.cs:272:13:272:18 | ... + ... | | -| Finally.cs:272:18:272:18 | [finally: exception(Exception)] 3 | Finally.cs:272:13:272:18 | [finally: exception(Exception)] ... + ... | | +| Finally.cs:272:18:272:18 | [finally: exception] 3 | Finally.cs:272:13:272:18 | [finally: exception] ... + ... | | | Foreach.cs:4:7:4:13 | call to constructor Object | Foreach.cs:4:7:4:13 | {...} | | | Foreach.cs:4:7:4:13 | enter Foreach | Foreach.cs:4:7:4:13 | call to constructor Object | | | Foreach.cs:4:7:4:13 | exit Foreach (normal) | Foreach.cs:4:7:4:13 | exit Foreach | | @@ -3159,7 +2966,7 @@ | LoopUnrolling.cs:50:16:50:35 | call to method WriteLine | LoopUnrolling.cs:51:13:51:23 | goto ...; | | | LoopUnrolling.cs:50:16:50:36 | ...; | LoopUnrolling.cs:50:34:50:34 | access to local variable x | | | LoopUnrolling.cs:50:34:50:34 | access to local variable x | LoopUnrolling.cs:50:16:50:35 | call to method WriteLine | | -| LoopUnrolling.cs:51:13:51:23 | goto ...; | LoopUnrolling.cs:50:9:50:13 | Label: | goto(Label) | +| LoopUnrolling.cs:51:13:51:23 | goto ...; | LoopUnrolling.cs:50:9:50:13 | Label: | goto | | LoopUnrolling.cs:55:10:55:11 | enter M7 | LoopUnrolling.cs:56:5:65:5 | {...} | | | LoopUnrolling.cs:55:10:55:11 | exit M7 (normal) | LoopUnrolling.cs:55:10:55:11 | exit M7 | | | LoopUnrolling.cs:56:5:65:5 | {...} | LoopUnrolling.cs:57:9:57:48 | ... ...; | | @@ -3261,27 +3068,27 @@ | MultiImplementationA.cs:6:22:6:31 | enter get_P1 | MultiImplementationB.cs:3:22:3:22 | 0 | | | MultiImplementationA.cs:6:22:6:31 | exit get_P1 (abnormal) | MultiImplementationA.cs:6:22:6:31 | exit get_P1 | | | MultiImplementationA.cs:6:22:6:31 | exit get_P1 (normal) | MultiImplementationA.cs:6:22:6:31 | exit get_P1 | | -| MultiImplementationA.cs:6:22:6:31 | throw ... | MultiImplementationA.cs:6:22:6:31 | exit get_P1 (abnormal) | exception(NullReferenceException) | +| MultiImplementationA.cs:6:22:6:31 | throw ... | MultiImplementationA.cs:6:22:6:31 | exit get_P1 (abnormal) | exception | | MultiImplementationA.cs:6:28:6:31 | null | MultiImplementationA.cs:6:22:6:31 | throw ... | | | MultiImplementationA.cs:7:21:7:23 | enter get_P2 | MultiImplementationA.cs:7:25:7:39 | {...} | | | MultiImplementationA.cs:7:21:7:23 | enter get_P2 | MultiImplementationB.cs:4:25:4:37 | {...} | | | MultiImplementationA.cs:7:21:7:23 | exit get_P2 (abnormal) | MultiImplementationA.cs:7:21:7:23 | exit get_P2 | | | MultiImplementationA.cs:7:21:7:23 | exit get_P2 (normal) | MultiImplementationA.cs:7:21:7:23 | exit get_P2 | | | MultiImplementationA.cs:7:25:7:39 | {...} | MultiImplementationA.cs:7:33:7:36 | null | | -| MultiImplementationA.cs:7:27:7:37 | throw ...; | MultiImplementationA.cs:7:21:7:23 | exit get_P2 (abnormal) | exception(NullReferenceException) | +| MultiImplementationA.cs:7:27:7:37 | throw ...; | MultiImplementationA.cs:7:21:7:23 | exit get_P2 (abnormal) | exception | | MultiImplementationA.cs:7:33:7:36 | null | MultiImplementationA.cs:7:27:7:37 | throw ...; | | | MultiImplementationA.cs:7:41:7:43 | enter set_P2 | MultiImplementationA.cs:7:45:7:59 | {...} | | | MultiImplementationA.cs:7:41:7:43 | enter set_P2 | MultiImplementationB.cs:4:43:4:45 | {...} | | | MultiImplementationA.cs:7:41:7:43 | exit set_P2 (abnormal) | MultiImplementationA.cs:7:41:7:43 | exit set_P2 | | | MultiImplementationA.cs:7:41:7:43 | exit set_P2 (normal) | MultiImplementationA.cs:7:41:7:43 | exit set_P2 | | | MultiImplementationA.cs:7:45:7:59 | {...} | MultiImplementationA.cs:7:53:7:56 | null | | -| MultiImplementationA.cs:7:47:7:57 | throw ...; | MultiImplementationA.cs:7:41:7:43 | exit set_P2 (abnormal) | exception(NullReferenceException) | +| MultiImplementationA.cs:7:47:7:57 | throw ...; | MultiImplementationA.cs:7:41:7:43 | exit set_P2 (abnormal) | exception | | MultiImplementationA.cs:7:53:7:56 | null | MultiImplementationA.cs:7:47:7:57 | throw ...; | | | MultiImplementationA.cs:8:16:8:16 | enter M | MultiImplementationA.cs:8:29:8:32 | null | | | MultiImplementationA.cs:8:16:8:16 | enter M | MultiImplementationB.cs:5:23:5:23 | 2 | | | MultiImplementationA.cs:8:16:8:16 | exit M (abnormal) | MultiImplementationA.cs:8:16:8:16 | exit M | | | MultiImplementationA.cs:8:16:8:16 | exit M (normal) | MultiImplementationA.cs:8:16:8:16 | exit M | | -| MultiImplementationA.cs:8:23:8:32 | throw ... | MultiImplementationA.cs:8:16:8:16 | exit M (abnormal) | exception(NullReferenceException) | +| MultiImplementationA.cs:8:23:8:32 | throw ... | MultiImplementationA.cs:8:16:8:16 | exit M (abnormal) | exception | | MultiImplementationA.cs:8:29:8:32 | null | MultiImplementationA.cs:8:23:8:32 | throw ... | | | MultiImplementationA.cs:13:16:13:16 | this access | MultiImplementationA.cs:13:20:13:20 | 0 | | | MultiImplementationA.cs:13:16:13:20 | ... = ... | MultiImplementationA.cs:24:16:24:16 | this access | | @@ -3347,7 +3154,7 @@ | MultiImplementationA.cs:28:7:28:8 | {...} | MultiImplementationA.cs:28:7:28:8 | exit C3 (normal) | | | MultiImplementationA.cs:30:21:30:23 | enter get_P3 | MultiImplementationA.cs:30:34:30:37 | null | | | MultiImplementationA.cs:30:21:30:23 | exit get_P3 (abnormal) | MultiImplementationA.cs:30:21:30:23 | exit get_P3 | | -| MultiImplementationA.cs:30:28:30:37 | throw ... | MultiImplementationA.cs:30:21:30:23 | exit get_P3 (abnormal) | exception(NullReferenceException) | +| MultiImplementationA.cs:30:28:30:37 | throw ... | MultiImplementationA.cs:30:21:30:23 | exit get_P3 (abnormal) | exception | | MultiImplementationA.cs:30:34:30:37 | null | MultiImplementationA.cs:30:28:30:37 | throw ... | | | MultiImplementationA.cs:34:15:34:16 | call to constructor Object | MultiImplementationA.cs:34:15:34:16 | {...} | | | MultiImplementationA.cs:34:15:34:16 | enter C4 | MultiImplementationA.cs:34:15:34:16 | call to constructor Object | | @@ -3359,12 +3166,12 @@ | MultiImplementationA.cs:36:9:36:10 | exit M1 (abnormal) | MultiImplementationA.cs:36:9:36:10 | exit M1 | | | MultiImplementationA.cs:36:9:36:10 | exit M1 (normal) | MultiImplementationA.cs:36:9:36:10 | exit M1 | | | MultiImplementationA.cs:36:14:36:28 | {...} | MultiImplementationA.cs:36:22:36:25 | null | | -| MultiImplementationA.cs:36:16:36:26 | throw ...; | MultiImplementationA.cs:36:9:36:10 | exit M1 (abnormal) | exception(NullReferenceException) | +| MultiImplementationA.cs:36:16:36:26 | throw ...; | MultiImplementationA.cs:36:9:36:10 | exit M1 (abnormal) | exception | | MultiImplementationA.cs:36:22:36:25 | null | MultiImplementationA.cs:36:16:36:26 | throw ...; | | | MultiImplementationA.cs:37:9:37:10 | enter M2 | MultiImplementationA.cs:37:14:37:28 | {...} | | | MultiImplementationA.cs:37:9:37:10 | exit M2 (abnormal) | MultiImplementationA.cs:37:9:37:10 | exit M2 | | | MultiImplementationA.cs:37:14:37:28 | {...} | MultiImplementationA.cs:37:22:37:25 | null | | -| MultiImplementationA.cs:37:16:37:26 | throw ...; | MultiImplementationA.cs:37:9:37:10 | exit M2 (abnormal) | exception(NullReferenceException) | +| MultiImplementationA.cs:37:16:37:26 | throw ...; | MultiImplementationA.cs:37:9:37:10 | exit M2 (abnormal) | exception | | MultiImplementationA.cs:37:22:37:25 | null | MultiImplementationA.cs:37:16:37:26 | throw ...; | | | MultiImplementationB.cs:1:7:1:8 | call to constructor Object | MultiImplementationB.cs:1:7:1:8 | {...} | | | MultiImplementationB.cs:1:7:1:8 | {...} | MultiImplementationA.cs:4:7:4:8 | exit C1 (normal) | | @@ -3377,29 +3184,29 @@ | MultiImplementationB.cs:11:16:11:16 | this access | MultiImplementationB.cs:11:20:11:20 | 1 | | | MultiImplementationB.cs:11:16:11:20 | ... = ... | MultiImplementationB.cs:22:16:22:16 | this access | | | MultiImplementationB.cs:11:20:11:20 | 1 | MultiImplementationB.cs:11:16:11:20 | ... = ... | | -| MultiImplementationB.cs:12:31:12:40 | throw ... | MultiImplementationA.cs:14:31:14:31 | exit get_Item (abnormal) | exception(NullReferenceException) | +| MultiImplementationB.cs:12:31:12:40 | throw ... | MultiImplementationA.cs:14:31:14:31 | exit get_Item (abnormal) | exception | | MultiImplementationB.cs:12:37:12:40 | null | MultiImplementationB.cs:12:31:12:40 | throw ... | | | MultiImplementationB.cs:13:40:13:54 | {...} | MultiImplementationB.cs:13:48:13:51 | null | | -| MultiImplementationB.cs:13:42:13:52 | throw ...; | MultiImplementationA.cs:15:36:15:38 | exit get_Item (abnormal) | exception(NullReferenceException) | +| MultiImplementationB.cs:13:42:13:52 | throw ...; | MultiImplementationA.cs:15:36:15:38 | exit get_Item (abnormal) | exception | | MultiImplementationB.cs:13:48:13:51 | null | MultiImplementationB.cs:13:42:13:52 | throw ...; | | | MultiImplementationB.cs:13:60:13:62 | {...} | MultiImplementationA.cs:15:54:15:56 | exit set_Item (normal) | | | MultiImplementationB.cs:15:5:17:5 | {...} | MultiImplementationB.cs:16:9:16:31 | M2(...) | | | MultiImplementationB.cs:16:9:16:31 | M2(...) | MultiImplementationA.cs:16:17:16:18 | exit M1 (normal) | | | MultiImplementationB.cs:16:9:16:31 | enter M2 | MultiImplementationB.cs:16:27:16:30 | null | | | MultiImplementationB.cs:16:9:16:31 | exit M2 (abnormal) | MultiImplementationB.cs:16:9:16:31 | exit M2 | | -| MultiImplementationB.cs:16:21:16:30 | throw ... | MultiImplementationB.cs:16:9:16:31 | exit M2 (abnormal) | exception(NullReferenceException) | +| MultiImplementationB.cs:16:21:16:30 | throw ... | MultiImplementationB.cs:16:9:16:31 | exit M2 (abnormal) | exception | | MultiImplementationB.cs:16:27:16:30 | null | MultiImplementationB.cs:16:21:16:30 | throw ... | | | MultiImplementationB.cs:18:12:18:13 | call to constructor Object | MultiImplementationB.cs:11:16:11:16 | this access | | | MultiImplementationB.cs:18:22:18:36 | {...} | MultiImplementationB.cs:18:30:18:33 | null | | -| MultiImplementationB.cs:18:24:18:34 | throw ...; | MultiImplementationA.cs:20:12:20:13 | exit C2 (abnormal) | exception(NullReferenceException) | +| MultiImplementationB.cs:18:24:18:34 | throw ...; | MultiImplementationA.cs:20:12:20:13 | exit C2 (abnormal) | exception | | MultiImplementationB.cs:18:30:18:33 | null | MultiImplementationB.cs:18:24:18:34 | throw ...; | | | MultiImplementationB.cs:19:19:19:22 | call to constructor C2 | MultiImplementationB.cs:19:27:19:29 | {...} | | | MultiImplementationB.cs:19:24:19:24 | 1 | MultiImplementationB.cs:19:19:19:22 | call to constructor C2 | | | MultiImplementationB.cs:19:27:19:29 | {...} | MultiImplementationA.cs:21:12:21:13 | exit C2 (normal) | | | MultiImplementationB.cs:20:11:20:25 | {...} | MultiImplementationB.cs:20:19:20:22 | null | | -| MultiImplementationB.cs:20:13:20:23 | throw ...; | MultiImplementationA.cs:22:6:22:7 | exit ~C2 (abnormal) | exception(NullReferenceException) | +| MultiImplementationB.cs:20:13:20:23 | throw ...; | MultiImplementationA.cs:22:6:22:7 | exit ~C2 (abnormal) | exception | | MultiImplementationB.cs:20:19:20:22 | null | MultiImplementationB.cs:20:13:20:23 | throw ...; | | -| MultiImplementationB.cs:21:50:21:59 | throw ... | MultiImplementationA.cs:23:28:23:35 | exit implicit conversion (abnormal) | exception(NullReferenceException) | +| MultiImplementationB.cs:21:50:21:59 | throw ... | MultiImplementationA.cs:23:28:23:35 | exit implicit conversion (abnormal) | exception | | MultiImplementationB.cs:21:56:21:59 | null | MultiImplementationB.cs:21:50:21:59 | throw ... | | | MultiImplementationB.cs:22:16:22:16 | access to property P | MultiImplementationB.cs:22:32:22:34 | ... = ... | | | MultiImplementationB.cs:22:16:22:16 | this access | MultiImplementationB.cs:22:34:22:34 | 1 | | @@ -3772,7 +3579,7 @@ | PostDominance.cs:19:13:19:21 | [true] ... is ... | PostDominance.cs:20:45:20:53 | nameof(...) | true | | PostDominance.cs:19:18:19:21 | null | PostDominance.cs:19:13:19:21 | [false] ... is ... | no-match | | PostDominance.cs:19:18:19:21 | null | PostDominance.cs:19:13:19:21 | [true] ... is ... | match | -| PostDominance.cs:20:13:20:55 | throw ...; | PostDominance.cs:17:10:17:11 | exit M3 (abnormal) | exception(ArgumentNullException) | +| PostDominance.cs:20:13:20:55 | throw ...; | PostDominance.cs:17:10:17:11 | exit M3 (abnormal) | exception | | PostDominance.cs:20:19:20:54 | object creation of type ArgumentNullException | PostDominance.cs:20:13:20:55 | throw ...; | | | PostDominance.cs:20:45:20:53 | nameof(...) | PostDominance.cs:20:19:20:54 | object creation of type ArgumentNullException | | | PostDominance.cs:21:9:21:28 | call to method WriteLine | PostDominance.cs:17:10:17:11 | exit M3 (normal) | | @@ -3867,12 +3674,12 @@ | Switch.cs:16:13:16:19 | case ...: | Switch.cs:16:18:16:18 | 0 | | | Switch.cs:16:18:16:18 | 0 | Switch.cs:17:23:17:37 | object creation of type Exception | match | | Switch.cs:16:18:16:18 | 0 | Switch.cs:18:13:18:22 | case ...: | no-match | -| Switch.cs:17:17:17:38 | throw ...; | Switch.cs:10:10:10:11 | exit M2 (abnormal) | exception(Exception) | +| Switch.cs:17:17:17:38 | throw ...; | Switch.cs:10:10:10:11 | exit M2 (abnormal) | exception | | Switch.cs:17:23:17:37 | object creation of type Exception | Switch.cs:17:17:17:38 | throw ...; | | | Switch.cs:18:13:18:22 | case ...: | Switch.cs:18:18:18:21 | null | | | Switch.cs:18:18:18:21 | null | Switch.cs:19:17:19:29 | goto default; | match | | Switch.cs:18:18:18:21 | null | Switch.cs:20:13:20:23 | case ...: | no-match | -| Switch.cs:19:17:19:29 | goto default; | Switch.cs:30:13:30:20 | default: | goto(default) | +| Switch.cs:19:17:19:29 | goto default; | Switch.cs:30:13:30:20 | default: | goto | | Switch.cs:20:13:20:23 | case ...: | Switch.cs:20:18:20:22 | Int32 i | | | Switch.cs:20:18:20:22 | Int32 i | Switch.cs:21:17:22:27 | if (...) ... | match | | Switch.cs:20:18:20:22 | Int32 i | Switch.cs:24:13:24:56 | case ...: | no-match | @@ -3882,7 +3689,7 @@ | Switch.cs:21:21:21:29 | ... == ... | Switch.cs:23:27:23:27 | 0 | false | | Switch.cs:21:26:21:29 | null | Switch.cs:21:21:21:29 | ... == ... | | | Switch.cs:22:21:22:27 | return ...; | Switch.cs:10:10:10:11 | exit M2 (normal) | return | -| Switch.cs:23:17:23:28 | goto case ...; | Switch.cs:16:13:16:19 | case ...: | goto(0) | +| Switch.cs:23:17:23:28 | goto case ...; | Switch.cs:16:13:16:19 | case ...: | goto | | Switch.cs:23:27:23:27 | 0 | Switch.cs:23:17:23:28 | goto case ...; | | | Switch.cs:24:13:24:56 | case ...: | Switch.cs:24:18:24:25 | String s | | | Switch.cs:24:18:24:25 | String s | Switch.cs:24:32:24:32 | access to local variable s | match | @@ -3905,16 +3712,16 @@ | Switch.cs:27:13:27:39 | case ...: | Switch.cs:27:18:27:25 | Double d | | | Switch.cs:27:18:27:25 | Double d | Switch.cs:27:32:27:38 | call to method Throw | match | | Switch.cs:27:18:27:25 | Double d | Switch.cs:30:13:30:20 | default: | no-match | -| Switch.cs:27:32:27:38 | call to method Throw | Switch.cs:10:10:10:11 | exit M2 (abnormal) | exception(Exception) | +| Switch.cs:27:32:27:38 | call to method Throw | Switch.cs:10:10:10:11 | exit M2 (abnormal) | exception | | Switch.cs:28:13:28:17 | Label: | Switch.cs:29:17:29:23 | return ...; | | | Switch.cs:29:17:29:23 | return ...; | Switch.cs:10:10:10:11 | exit M2 (normal) | return | | Switch.cs:30:13:30:20 | default: | Switch.cs:31:17:31:27 | goto ...; | | -| Switch.cs:31:17:31:27 | goto ...; | Switch.cs:28:13:28:17 | Label: | goto(Label) | +| Switch.cs:31:17:31:27 | goto ...; | Switch.cs:28:13:28:17 | Label: | goto | | Switch.cs:35:10:35:11 | enter M3 | Switch.cs:36:5:42:5 | {...} | | | Switch.cs:35:10:35:11 | exit M3 (abnormal) | Switch.cs:35:10:35:11 | exit M3 | | | Switch.cs:36:5:42:5 | {...} | Switch.cs:37:9:41:9 | switch (...) {...} | | | Switch.cs:37:9:41:9 | switch (...) {...} | Switch.cs:37:17:37:23 | call to method Throw | | -| Switch.cs:37:17:37:23 | call to method Throw | Switch.cs:35:10:35:11 | exit M3 (abnormal) | exception(Exception) | +| Switch.cs:37:17:37:23 | call to method Throw | Switch.cs:35:10:35:11 | exit M3 (abnormal) | exception | | Switch.cs:44:10:44:11 | enter M4 | Switch.cs:45:5:53:5 | {...} | | | Switch.cs:44:10:44:11 | exit M4 (normal) | Switch.cs:44:10:44:11 | exit M4 | | | Switch.cs:45:5:53:5 | {...} | Switch.cs:46:9:52:9 | switch (...) {...} | | @@ -4013,7 +3820,7 @@ | Switch.cs:108:17:108:17 | 1 | Switch.cs:108:16:108:17 | -... | | | Switch.cs:111:17:111:21 | enter Throw | Switch.cs:111:34:111:48 | object creation of type Exception | | | Switch.cs:111:17:111:21 | exit Throw (abnormal) | Switch.cs:111:17:111:21 | exit Throw | | -| Switch.cs:111:28:111:48 | throw ... | Switch.cs:111:17:111:21 | exit Throw (abnormal) | exception(Exception) | +| Switch.cs:111:28:111:48 | throw ... | Switch.cs:111:17:111:21 | exit Throw (abnormal) | exception | | Switch.cs:111:34:111:48 | object creation of type Exception | Switch.cs:111:28:111:48 | throw ... | | | Switch.cs:113:9:113:11 | enter M10 | Switch.cs:114:5:121:5 | {...} | | | Switch.cs:113:9:113:11 | exit M10 (normal) | Switch.cs:113:9:113:11 | exit M10 | | @@ -4126,7 +3933,7 @@ | Switch.cs:156:28:156:31 | true | Switch.cs:156:41:156:45 | false | no-match | | Switch.cs:156:28:156:38 | ... => ... | Switch.cs:156:17:156:54 | ... switch { ... } | | | Switch.cs:156:36:156:38 | "a" | Switch.cs:156:28:156:38 | ... => ... | | -| Switch.cs:156:41:156:45 | false | Switch.cs:154:10:154:12 | exit M15 (abnormal) | exception(InvalidOperationException) | +| Switch.cs:156:41:156:45 | false | Switch.cs:154:10:154:12 | exit M15 (abnormal) | exception | | Switch.cs:156:41:156:45 | false | Switch.cs:156:50:156:52 | "b" | match | | Switch.cs:156:41:156:52 | ... => ... | Switch.cs:156:17:156:54 | ... switch { ... } | | | Switch.cs:156:50:156:52 | "b" | Switch.cs:156:41:156:52 | ... => ... | | @@ -4361,7 +4168,7 @@ | cflow.cs:42:17:42:38 | call to method WriteLine | cflow.cs:43:27:43:27 | 2 | | | cflow.cs:42:17:42:39 | ...; | cflow.cs:42:35:42:37 | "1" | | | cflow.cs:42:35:42:37 | "1" | cflow.cs:42:17:42:38 | call to method WriteLine | | -| cflow.cs:43:17:43:28 | goto case ...; | cflow.cs:44:13:44:19 | case ...: | goto(2) | +| cflow.cs:43:17:43:28 | goto case ...; | cflow.cs:44:13:44:19 | case ...: | goto | | cflow.cs:43:27:43:27 | 2 | cflow.cs:43:17:43:28 | goto case ...; | | | cflow.cs:44:13:44:19 | case ...: | cflow.cs:44:18:44:18 | 2 | | | cflow.cs:44:18:44:18 | 2 | cflow.cs:45:17:45:39 | ...; | match | @@ -4369,7 +4176,7 @@ | cflow.cs:45:17:45:38 | call to method WriteLine | cflow.cs:46:27:46:27 | 1 | | | cflow.cs:45:17:45:39 | ...; | cflow.cs:45:35:45:37 | "2" | | | cflow.cs:45:35:45:37 | "2" | cflow.cs:45:17:45:38 | call to method WriteLine | | -| cflow.cs:46:17:46:28 | goto case ...; | cflow.cs:41:13:41:19 | case ...: | goto(1) | +| cflow.cs:46:17:46:28 | goto case ...; | cflow.cs:41:13:41:19 | case ...: | goto | | cflow.cs:46:27:46:27 | 1 | cflow.cs:46:17:46:28 | goto case ...; | | | cflow.cs:47:13:47:19 | case ...: | cflow.cs:47:18:47:18 | 3 | | | cflow.cs:47:18:47:18 | 3 | cflow.cs:48:17:48:39 | ...; | match | @@ -4407,7 +4214,7 @@ | cflow.cs:63:23:63:33 | ... == ... | cflow.cs:63:21:63:34 | [false] !... | true | | cflow.cs:63:23:63:33 | ... == ... | cflow.cs:63:21:63:34 | [true] !... | false | | cflow.cs:63:32:63:33 | "" | cflow.cs:63:23:63:33 | ... == ... | | -| cflow.cs:64:21:64:55 | throw ...; | cflow.cs:37:17:37:22 | exit Switch (abnormal) | exception(NullReferenceException) | +| cflow.cs:64:21:64:55 | throw ...; | cflow.cs:37:17:37:22 | exit Switch (abnormal) | exception | | cflow.cs:64:27:64:54 | object creation of type NullReferenceException | cflow.cs:64:21:64:55 | throw ...; | | | cflow.cs:65:17:65:22 | break; | cflow.cs:67:16:67:16 | access to parameter a | break | | cflow.cs:67:9:67:17 | return ...; | cflow.cs:37:17:37:22 | exit Switch (normal) | return | @@ -4462,7 +4269,7 @@ | cflow.cs:92:13:92:27 | call to method Equals | cflow.cs:94:9:94:29 | ...; | false | | cflow.cs:92:20:92:20 | access to parameter s | cflow.cs:92:23:92:26 | null | | | cflow.cs:92:23:92:26 | null | cflow.cs:92:13:92:27 | call to method Equals | | -| cflow.cs:93:13:93:49 | throw ...; | cflow.cs:90:18:90:19 | exit M3 (abnormal) | exception(ArgumentNullException) | +| cflow.cs:93:13:93:49 | throw ...; | cflow.cs:90:18:90:19 | exit M3 (abnormal) | exception | | cflow.cs:93:19:93:48 | object creation of type ArgumentNullException | cflow.cs:93:13:93:49 | throw ...; | | | cflow.cs:93:45:93:47 | "s" | cflow.cs:93:19:93:48 | object creation of type ArgumentNullException | | | cflow.cs:94:9:94:28 | call to method WriteLine | cflow.cs:96:9:97:55 | if (...) ... | | @@ -4777,7 +4584,7 @@ | cflow.cs:200:61:200:61 | access to local variable b | cflow.cs:200:40:200:61 | [true] ... && ... | true | | cflow.cs:201:9:205:9 | {...} | cflow.cs:202:13:204:13 | {...} | | | cflow.cs:202:13:204:13 | {...} | cflow.cs:203:23:203:37 | object creation of type Exception | | -| cflow.cs:203:17:203:38 | throw ...; | cflow.cs:193:10:193:17 | exit Booleans (abnormal) | exception(Exception) | +| cflow.cs:203:17:203:38 | throw ...; | cflow.cs:193:10:193:17 | exit Booleans (abnormal) | exception | | cflow.cs:203:23:203:37 | object creation of type Exception | cflow.cs:203:17:203:38 | throw ...; | | | cflow.cs:208:10:208:11 | enter Do | cflow.cs:209:5:222:5 | {...} | | | cflow.cs:208:10:208:11 | exit Do (normal) | cflow.cs:208:10:208:11 | exit Do | | @@ -4873,7 +4680,7 @@ | cflow.cs:244:13:244:28 | ... > ... | cflow.cs:244:31:244:41 | goto ...; | true | | cflow.cs:244:13:244:28 | ... > ... | cflow.cs:246:9:258:9 | switch (...) {...} | false | | cflow.cs:244:28:244:28 | 0 | cflow.cs:244:13:244:28 | ... > ... | | -| cflow.cs:244:31:244:41 | goto ...; | cflow.cs:242:5:242:9 | Label: | goto(Label) | +| cflow.cs:244:31:244:41 | goto ...; | cflow.cs:242:5:242:9 | Label: | goto | | cflow.cs:246:9:258:9 | switch (...) {...} | cflow.cs:246:17:246:21 | this access | | | cflow.cs:246:17:246:21 | access to field Field | cflow.cs:246:17:246:28 | access to property Length | | | cflow.cs:246:17:246:21 | this access | cflow.cs:246:17:246:21 | access to field Field | | @@ -4883,7 +4690,7 @@ | cflow.cs:248:13:248:19 | case ...: | cflow.cs:248:18:248:18 | 0 | | | cflow.cs:248:18:248:18 | 0 | cflow.cs:249:17:249:29 | goto default; | match | | cflow.cs:248:18:248:18 | 0 | cflow.cs:250:13:250:19 | case ...: | no-match | -| cflow.cs:249:17:249:29 | goto default; | cflow.cs:255:13:255:20 | default: | goto(default) | +| cflow.cs:249:17:249:29 | goto default; | cflow.cs:255:13:255:20 | default: | goto | | cflow.cs:250:13:250:19 | case ...: | cflow.cs:250:18:250:18 | 1 | | | cflow.cs:250:18:250:18 | 1 | cflow.cs:251:17:251:37 | ...; | match | | cflow.cs:250:18:250:18 | 1 | cflow.cs:253:13:253:19 | case ...: | no-match | @@ -4894,7 +4701,7 @@ | cflow.cs:253:13:253:19 | case ...: | cflow.cs:253:18:253:18 | 2 | | | cflow.cs:253:18:253:18 | 2 | cflow.cs:254:17:254:27 | goto ...; | match | | cflow.cs:253:18:253:18 | 2 | cflow.cs:255:13:255:20 | default: | no-match | -| cflow.cs:254:17:254:27 | goto ...; | cflow.cs:242:5:242:9 | Label: | goto(Label) | +| cflow.cs:254:17:254:27 | goto ...; | cflow.cs:242:5:242:9 | Label: | goto | | cflow.cs:255:13:255:20 | default: | cflow.cs:256:17:256:37 | ...; | | | cflow.cs:256:17:256:36 | call to method WriteLine | cflow.cs:257:17:257:22 | break; | | | cflow.cs:256:17:256:37 | ...; | cflow.cs:256:35:256:35 | 0 | | diff --git a/csharp/ql/test/library-tests/controlflow/graph/Nodes.expected b/csharp/ql/test/library-tests/controlflow/graph/Nodes.expected index 7c5a64b7155e..81c154386797 100644 --- a/csharp/ql/test/library-tests/controlflow/graph/Nodes.expected +++ b/csharp/ql/test/library-tests/controlflow/graph/Nodes.expected @@ -508,65 +508,45 @@ booleanNode | Finally.cs:180:21:180:43 | [b1 (line 176): true] throw ...; | b1 (line 176): true | | Finally.cs:180:27:180:42 | [b1 (line 176): true] object creation of type ExceptionA | b1 (line 176): true | | Finally.cs:183:9:192:9 | [b1 (line 176): false] {...} | b1 (line 176): false | -| Finally.cs:183:9:192:9 | [finally: exception(Exception), b1 (line 176): true] {...} | b1 (line 176): true | -| Finally.cs:183:9:192:9 | [finally: exception(ExceptionA), b1 (line 176): true] {...} | b1 (line 176): true | +| Finally.cs:183:9:192:9 | [finally: exception, b1 (line 176): true] {...} | b1 (line 176): true | | Finally.cs:184:13:191:13 | [b1 (line 176): false] try {...} ... | b1 (line 176): false | -| Finally.cs:184:13:191:13 | [finally: exception(Exception), b1 (line 176): true] try {...} ... | b1 (line 176): true | -| Finally.cs:184:13:191:13 | [finally: exception(ExceptionA), b1 (line 176): true] try {...} ... | b1 (line 176): true | +| Finally.cs:184:13:191:13 | [finally: exception, b1 (line 176): true] try {...} ... | b1 (line 176): true | | Finally.cs:185:13:187:13 | [b1 (line 176): false] {...} | b1 (line 176): false | -| Finally.cs:185:13:187:13 | [finally: exception(Exception), b1 (line 176): true] {...} | b1 (line 176): true | -| Finally.cs:185:13:187:13 | [finally: exception(ExceptionA), b1 (line 176): true] {...} | b1 (line 176): true | +| Finally.cs:185:13:187:13 | [finally: exception, b1 (line 176): true] {...} | b1 (line 176): true | | Finally.cs:186:17:186:47 | [b1 (line 176): false] if (...) ... | b1 (line 176): false | -| Finally.cs:186:17:186:47 | [finally: exception(Exception), b1 (line 176): true] if (...) ... | b1 (line 176): true | -| Finally.cs:186:17:186:47 | [finally: exception(ExceptionA), b1 (line 176): true] if (...) ... | b1 (line 176): true | +| Finally.cs:186:17:186:47 | [finally: exception, b1 (line 176): true] if (...) ... | b1 (line 176): true | | Finally.cs:186:21:186:22 | [b1 (line 176): false] access to parameter b2 | b1 (line 176): false | -| Finally.cs:186:21:186:22 | [finally: exception(Exception), b1 (line 176): true] access to parameter b2 | b1 (line 176): true | -| Finally.cs:186:21:186:22 | [finally: exception(ExceptionA), b1 (line 176): true] access to parameter b2 | b1 (line 176): true | +| Finally.cs:186:21:186:22 | [finally: exception, b1 (line 176): true] access to parameter b2 | b1 (line 176): true | | Finally.cs:186:25:186:47 | [b1 (line 176): false, b2 (line 176): true] throw ...; | b1 (line 176): false | | Finally.cs:186:25:186:47 | [b1 (line 176): false, b2 (line 176): true] throw ...; | b2 (line 176): true | -| Finally.cs:186:25:186:47 | [finally: exception(Exception), b1 (line 176): true, b2 (line 176): true] throw ...; | b1 (line 176): true | -| Finally.cs:186:25:186:47 | [finally: exception(Exception), b1 (line 176): true, b2 (line 176): true] throw ...; | b2 (line 176): true | -| Finally.cs:186:25:186:47 | [finally: exception(ExceptionA), b1 (line 176): true, b2 (line 176): true] throw ...; | b1 (line 176): true | -| Finally.cs:186:25:186:47 | [finally: exception(ExceptionA), b1 (line 176): true, b2 (line 176): true] throw ...; | b2 (line 176): true | +| Finally.cs:186:25:186:47 | [finally: exception, b1 (line 176): true, b2 (line 176): true] throw ...; | b1 (line 176): true | +| Finally.cs:186:25:186:47 | [finally: exception, b1 (line 176): true, b2 (line 176): true] throw ...; | b2 (line 176): true | | Finally.cs:186:31:186:46 | [b1 (line 176): false, b2 (line 176): true] object creation of type ExceptionB | b1 (line 176): false | | Finally.cs:186:31:186:46 | [b1 (line 176): false, b2 (line 176): true] object creation of type ExceptionB | b2 (line 176): true | -| Finally.cs:186:31:186:46 | [finally: exception(Exception), b1 (line 176): true, b2 (line 176): true] object creation of type ExceptionB | b1 (line 176): true | -| Finally.cs:186:31:186:46 | [finally: exception(Exception), b1 (line 176): true, b2 (line 176): true] object creation of type ExceptionB | b2 (line 176): true | -| Finally.cs:186:31:186:46 | [finally: exception(ExceptionA), b1 (line 176): true, b2 (line 176): true] object creation of type ExceptionB | b1 (line 176): true | -| Finally.cs:186:31:186:46 | [finally: exception(ExceptionA), b1 (line 176): true, b2 (line 176): true] object creation of type ExceptionB | b2 (line 176): true | +| Finally.cs:186:31:186:46 | [finally: exception, b1 (line 176): true, b2 (line 176): true] object creation of type ExceptionB | b1 (line 176): true | +| Finally.cs:186:31:186:46 | [finally: exception, b1 (line 176): true, b2 (line 176): true] object creation of type ExceptionB | b2 (line 176): true | | Finally.cs:188:13:191:13 | [exception: Exception, b1 (line 176): false, b2 (line 176): true] catch (...) {...} | b1 (line 176): false | | Finally.cs:188:13:191:13 | [exception: Exception, b1 (line 176): false, b2 (line 176): true] catch (...) {...} | b2 (line 176): true | | Finally.cs:188:13:191:13 | [exception: ExceptionB, b1 (line 176): false, b2 (line 176): true] catch (...) {...} | b1 (line 176): false | | Finally.cs:188:13:191:13 | [exception: ExceptionB, b1 (line 176): false, b2 (line 176): true] catch (...) {...} | b2 (line 176): true | -| Finally.cs:188:13:191:13 | [finally: exception(Exception), exception: Exception, b1 (line 176): true, b2 (line 176): true] catch (...) {...} | b1 (line 176): true | -| Finally.cs:188:13:191:13 | [finally: exception(Exception), exception: Exception, b1 (line 176): true, b2 (line 176): true] catch (...) {...} | b2 (line 176): true | -| Finally.cs:188:13:191:13 | [finally: exception(Exception), exception: ExceptionB, b1 (line 176): true, b2 (line 176): true] catch (...) {...} | b1 (line 176): true | -| Finally.cs:188:13:191:13 | [finally: exception(Exception), exception: ExceptionB, b1 (line 176): true, b2 (line 176): true] catch (...) {...} | b2 (line 176): true | -| Finally.cs:188:13:191:13 | [finally: exception(ExceptionA), exception: Exception, b1 (line 176): true, b2 (line 176): true] catch (...) {...} | b1 (line 176): true | -| Finally.cs:188:13:191:13 | [finally: exception(ExceptionA), exception: Exception, b1 (line 176): true, b2 (line 176): true] catch (...) {...} | b2 (line 176): true | -| Finally.cs:188:13:191:13 | [finally: exception(ExceptionA), exception: ExceptionB, b1 (line 176): true, b2 (line 176): true] catch (...) {...} | b1 (line 176): true | -| Finally.cs:188:13:191:13 | [finally: exception(ExceptionA), exception: ExceptionB, b1 (line 176): true, b2 (line 176): true] catch (...) {...} | b2 (line 176): true | +| Finally.cs:188:13:191:13 | [finally: exception, exception: Exception, b1 (line 176): true, b2 (line 176): true] catch (...) {...} | b1 (line 176): true | +| Finally.cs:188:13:191:13 | [finally: exception, exception: Exception, b1 (line 176): true, b2 (line 176): true] catch (...) {...} | b2 (line 176): true | +| Finally.cs:188:13:191:13 | [finally: exception, exception: ExceptionB, b1 (line 176): true, b2 (line 176): true] catch (...) {...} | b1 (line 176): true | +| Finally.cs:188:13:191:13 | [finally: exception, exception: ExceptionB, b1 (line 176): true, b2 (line 176): true] catch (...) {...} | b2 (line 176): true | | Finally.cs:188:38:188:39 | [exception: Exception, b1 (line 176): false, b2 (line 176): true] access to parameter b2 | b1 (line 176): false | | Finally.cs:188:38:188:39 | [exception: Exception, b1 (line 176): false, b2 (line 176): true] access to parameter b2 | b2 (line 176): true | | Finally.cs:188:38:188:39 | [exception: ExceptionB, b1 (line 176): false, b2 (line 176): true] access to parameter b2 | b1 (line 176): false | | Finally.cs:188:38:188:39 | [exception: ExceptionB, b1 (line 176): false, b2 (line 176): true] access to parameter b2 | b2 (line 176): true | -| Finally.cs:188:38:188:39 | [finally: exception(Exception), exception: Exception, b1 (line 176): true, b2 (line 176): true] access to parameter b2 | b1 (line 176): true | -| Finally.cs:188:38:188:39 | [finally: exception(Exception), exception: Exception, b1 (line 176): true, b2 (line 176): true] access to parameter b2 | b2 (line 176): true | -| Finally.cs:188:38:188:39 | [finally: exception(Exception), exception: ExceptionB, b1 (line 176): true, b2 (line 176): true] access to parameter b2 | b1 (line 176): true | -| Finally.cs:188:38:188:39 | [finally: exception(Exception), exception: ExceptionB, b1 (line 176): true, b2 (line 176): true] access to parameter b2 | b2 (line 176): true | -| Finally.cs:188:38:188:39 | [finally: exception(ExceptionA), exception: Exception, b1 (line 176): true, b2 (line 176): true] access to parameter b2 | b1 (line 176): true | -| Finally.cs:188:38:188:39 | [finally: exception(ExceptionA), exception: Exception, b1 (line 176): true, b2 (line 176): true] access to parameter b2 | b2 (line 176): true | -| Finally.cs:188:38:188:39 | [finally: exception(ExceptionA), exception: ExceptionB, b1 (line 176): true, b2 (line 176): true] access to parameter b2 | b1 (line 176): true | -| Finally.cs:188:38:188:39 | [finally: exception(ExceptionA), exception: ExceptionB, b1 (line 176): true, b2 (line 176): true] access to parameter b2 | b2 (line 176): true | +| Finally.cs:188:38:188:39 | [finally: exception, exception: Exception, b1 (line 176): true, b2 (line 176): true] access to parameter b2 | b1 (line 176): true | +| Finally.cs:188:38:188:39 | [finally: exception, exception: Exception, b1 (line 176): true, b2 (line 176): true] access to parameter b2 | b2 (line 176): true | +| Finally.cs:188:38:188:39 | [finally: exception, exception: ExceptionB, b1 (line 176): true, b2 (line 176): true] access to parameter b2 | b1 (line 176): true | +| Finally.cs:188:38:188:39 | [finally: exception, exception: ExceptionB, b1 (line 176): true, b2 (line 176): true] access to parameter b2 | b2 (line 176): true | | Finally.cs:189:13:191:13 | [b1 (line 176): false] {...} | b1 (line 176): false | -| Finally.cs:189:13:191:13 | [finally: exception(Exception), b1 (line 176): true] {...} | b1 (line 176): true | -| Finally.cs:189:13:191:13 | [finally: exception(ExceptionA), b1 (line 176): true] {...} | b1 (line 176): true | +| Finally.cs:189:13:191:13 | [finally: exception, b1 (line 176): true] {...} | b1 (line 176): true | | Finally.cs:190:17:190:47 | [b1 (line 176): false] if (...) ... | b1 (line 176): false | -| Finally.cs:190:17:190:47 | [finally: exception(Exception), b1 (line 176): true] if (...) ... | b1 (line 176): true | -| Finally.cs:190:17:190:47 | [finally: exception(ExceptionA), b1 (line 176): true] if (...) ... | b1 (line 176): true | +| Finally.cs:190:17:190:47 | [finally: exception, b1 (line 176): true] if (...) ... | b1 (line 176): true | | Finally.cs:190:21:190:22 | [b1 (line 176): false] access to parameter b1 | b1 (line 176): false | -| Finally.cs:190:21:190:22 | [finally: exception(Exception), b1 (line 176): true] access to parameter b1 | b1 (line 176): true | -| Finally.cs:190:21:190:22 | [finally: exception(ExceptionA), b1 (line 176): true] access to parameter b1 | b1 (line 176): true | +| Finally.cs:190:21:190:22 | [finally: exception, b1 (line 176): true] access to parameter b1 | b1 (line 176): true | | LoopUnrolling.cs:58:9:64:9 | [b (line 55): false] foreach (... ... in ...) ... | b (line 55): false | | LoopUnrolling.cs:58:9:64:9 | [b (line 55): true] foreach (... ... in ...) ... | b (line 55): true | | LoopUnrolling.cs:58:22:58:22 | [b (line 55): false] String x | b (line 55): false | @@ -614,41 +594,33 @@ finallyNode | BreakInTry.cs:67:21:67:31 | [finally: return] ... == ... | BreakInTry.cs:58:9:70:9 | try {...} ... | | BreakInTry.cs:67:28:67:31 | [finally: return] null | BreakInTry.cs:58:9:70:9 | try {...} ... | | BreakInTry.cs:68:21:68:26 | [finally: return] break; | BreakInTry.cs:58:9:70:9 | try {...} ... | -| CompileTimeOperators.cs:36:9:38:9 | [finally: goto(End)] {...} | CompileTimeOperators.cs:30:9:38:9 | try {...} ... | -| CompileTimeOperators.cs:37:13:37:40 | [finally: goto(End)] call to method WriteLine | CompileTimeOperators.cs:30:9:38:9 | try {...} ... | -| CompileTimeOperators.cs:37:13:37:41 | [finally: goto(End)] ...; | CompileTimeOperators.cs:30:9:38:9 | try {...} ... | -| CompileTimeOperators.cs:37:31:37:39 | [finally: goto(End)] "Finally" | CompileTimeOperators.cs:30:9:38:9 | try {...} ... | -| Finally.cs:14:9:16:9 | [finally: exception(Exception)] {...} | Finally.cs:9:9:16:9 | try {...} ... | -| Finally.cs:15:13:15:40 | [finally: exception(Exception)] call to method WriteLine | Finally.cs:9:9:16:9 | try {...} ... | -| Finally.cs:15:13:15:41 | [finally: exception(Exception)] ...; | Finally.cs:9:9:16:9 | try {...} ... | -| Finally.cs:15:31:15:39 | [finally: exception(Exception)] "Finally" | Finally.cs:9:9:16:9 | try {...} ... | -| Finally.cs:37:13:39:13 | [finally: exception(ArgumentException)] {...} | Finally.cs:32:13:39:13 | try {...} ... | -| Finally.cs:38:17:38:44 | [finally: exception(ArgumentException)] throw ...; | Finally.cs:32:13:39:13 | try {...} ... | -| Finally.cs:38:23:38:43 | [finally: exception(ArgumentException)] object creation of type Exception | Finally.cs:32:13:39:13 | try {...} ... | -| Finally.cs:38:37:38:42 | [finally: exception(ArgumentException)] "Boo!" | Finally.cs:32:13:39:13 | try {...} ... | -| Finally.cs:49:9:51:9 | [finally: exception(Exception)] {...} | Finally.cs:21:9:51:9 | try {...} ... | -| Finally.cs:49:9:51:9 | [finally: exception(IOException)] {...} | Finally.cs:21:9:51:9 | try {...} ... | +| CompileTimeOperators.cs:36:9:38:9 | [finally: goto] {...} | CompileTimeOperators.cs:30:9:38:9 | try {...} ... | +| CompileTimeOperators.cs:37:13:37:40 | [finally: goto] call to method WriteLine | CompileTimeOperators.cs:30:9:38:9 | try {...} ... | +| CompileTimeOperators.cs:37:13:37:41 | [finally: goto] ...; | CompileTimeOperators.cs:30:9:38:9 | try {...} ... | +| CompileTimeOperators.cs:37:31:37:39 | [finally: goto] "Finally" | CompileTimeOperators.cs:30:9:38:9 | try {...} ... | +| Finally.cs:14:9:16:9 | [finally: exception] {...} | Finally.cs:9:9:16:9 | try {...} ... | +| Finally.cs:15:13:15:40 | [finally: exception] call to method WriteLine | Finally.cs:9:9:16:9 | try {...} ... | +| Finally.cs:15:13:15:41 | [finally: exception] ...; | Finally.cs:9:9:16:9 | try {...} ... | +| Finally.cs:15:31:15:39 | [finally: exception] "Finally" | Finally.cs:9:9:16:9 | try {...} ... | +| Finally.cs:37:13:39:13 | [finally: exception] {...} | Finally.cs:32:13:39:13 | try {...} ... | +| Finally.cs:38:17:38:44 | [finally: exception] throw ...; | Finally.cs:32:13:39:13 | try {...} ... | +| Finally.cs:38:23:38:43 | [finally: exception] object creation of type Exception | Finally.cs:32:13:39:13 | try {...} ... | +| Finally.cs:38:37:38:42 | [finally: exception] "Boo!" | Finally.cs:32:13:39:13 | try {...} ... | +| Finally.cs:49:9:51:9 | [finally: exception] {...} | Finally.cs:21:9:51:9 | try {...} ... | | Finally.cs:49:9:51:9 | [finally: return] {...} | Finally.cs:21:9:51:9 | try {...} ... | -| Finally.cs:50:13:50:40 | [finally: exception(Exception)] call to method WriteLine | Finally.cs:21:9:51:9 | try {...} ... | -| Finally.cs:50:13:50:40 | [finally: exception(IOException)] call to method WriteLine | Finally.cs:21:9:51:9 | try {...} ... | +| Finally.cs:50:13:50:40 | [finally: exception] call to method WriteLine | Finally.cs:21:9:51:9 | try {...} ... | | Finally.cs:50:13:50:40 | [finally: return] call to method WriteLine | Finally.cs:21:9:51:9 | try {...} ... | -| Finally.cs:50:13:50:41 | [finally: exception(Exception)] ...; | Finally.cs:21:9:51:9 | try {...} ... | -| Finally.cs:50:13:50:41 | [finally: exception(IOException)] ...; | Finally.cs:21:9:51:9 | try {...} ... | +| Finally.cs:50:13:50:41 | [finally: exception] ...; | Finally.cs:21:9:51:9 | try {...} ... | | Finally.cs:50:13:50:41 | [finally: return] ...; | Finally.cs:21:9:51:9 | try {...} ... | -| Finally.cs:50:31:50:39 | [finally: exception(Exception)] "Finally" | Finally.cs:21:9:51:9 | try {...} ... | -| Finally.cs:50:31:50:39 | [finally: exception(IOException)] "Finally" | Finally.cs:21:9:51:9 | try {...} ... | +| Finally.cs:50:31:50:39 | [finally: exception] "Finally" | Finally.cs:21:9:51:9 | try {...} ... | | Finally.cs:50:31:50:39 | [finally: return] "Finally" | Finally.cs:21:9:51:9 | try {...} ... | -| Finally.cs:69:9:71:9 | [finally: exception(Exception)] {...} | Finally.cs:56:9:71:9 | try {...} ... | -| Finally.cs:69:9:71:9 | [finally: exception(IOException)] {...} | Finally.cs:56:9:71:9 | try {...} ... | +| Finally.cs:69:9:71:9 | [finally: exception] {...} | Finally.cs:56:9:71:9 | try {...} ... | | Finally.cs:69:9:71:9 | [finally: return] {...} | Finally.cs:56:9:71:9 | try {...} ... | -| Finally.cs:70:13:70:40 | [finally: exception(Exception)] call to method WriteLine | Finally.cs:56:9:71:9 | try {...} ... | -| Finally.cs:70:13:70:40 | [finally: exception(IOException)] call to method WriteLine | Finally.cs:56:9:71:9 | try {...} ... | +| Finally.cs:70:13:70:40 | [finally: exception] call to method WriteLine | Finally.cs:56:9:71:9 | try {...} ... | | Finally.cs:70:13:70:40 | [finally: return] call to method WriteLine | Finally.cs:56:9:71:9 | try {...} ... | -| Finally.cs:70:13:70:41 | [finally: exception(Exception)] ...; | Finally.cs:56:9:71:9 | try {...} ... | -| Finally.cs:70:13:70:41 | [finally: exception(IOException)] ...; | Finally.cs:56:9:71:9 | try {...} ... | +| Finally.cs:70:13:70:41 | [finally: exception] ...; | Finally.cs:56:9:71:9 | try {...} ... | | Finally.cs:70:13:70:41 | [finally: return] ...; | Finally.cs:56:9:71:9 | try {...} ... | -| Finally.cs:70:31:70:39 | [finally: exception(Exception)] "Finally" | Finally.cs:56:9:71:9 | try {...} ... | -| Finally.cs:70:31:70:39 | [finally: exception(IOException)] "Finally" | Finally.cs:56:9:71:9 | try {...} ... | +| Finally.cs:70:31:70:39 | [finally: exception] "Finally" | Finally.cs:56:9:71:9 | try {...} ... | | Finally.cs:70:31:70:39 | [finally: return] "Finally" | Finally.cs:56:9:71:9 | try {...} ... | | Finally.cs:89:13:99:13 | [finally: break] {...} | Finally.cs:79:13:99:13 | try {...} ... | | Finally.cs:89:13:99:13 | [finally: continue] {...} | Finally.cs:79:13:99:13 | try {...} ... | @@ -677,351 +649,190 @@ finallyNode | Finally.cs:93:31:93:45 | [finally: break] object creation of type Exception | Finally.cs:79:13:99:13 | try {...} ... | | Finally.cs:93:31:93:45 | [finally: continue] object creation of type Exception | Finally.cs:79:13:99:13 | try {...} ... | | Finally.cs:93:31:93:45 | [finally: return] object creation of type Exception | Finally.cs:79:13:99:13 | try {...} ... | -| Finally.cs:96:17:98:17 | [finally(1): exception(Exception)] {...} | Finally.cs:90:17:98:17 | try {...} ... | -| Finally.cs:96:17:98:17 | [finally: break, finally(1): exception(Exception)] {...} | Finally.cs:90:17:98:17 | try {...} ... | +| Finally.cs:96:17:98:17 | [finally(1): exception] {...} | Finally.cs:90:17:98:17 | try {...} ... | +| Finally.cs:96:17:98:17 | [finally: break, finally(1): exception] {...} | Finally.cs:90:17:98:17 | try {...} ... | | Finally.cs:96:17:98:17 | [finally: break] {...} | Finally.cs:90:17:98:17 | try {...} ... | -| Finally.cs:96:17:98:17 | [finally: continue, finally(1): exception(Exception)] {...} | Finally.cs:90:17:98:17 | try {...} ... | +| Finally.cs:96:17:98:17 | [finally: continue, finally(1): exception] {...} | Finally.cs:90:17:98:17 | try {...} ... | | Finally.cs:96:17:98:17 | [finally: continue] {...} | Finally.cs:90:17:98:17 | try {...} ... | -| Finally.cs:96:17:98:17 | [finally: return, finally(1): exception(Exception)] {...} | Finally.cs:90:17:98:17 | try {...} ... | +| Finally.cs:96:17:98:17 | [finally: return, finally(1): exception] {...} | Finally.cs:90:17:98:17 | try {...} ... | | Finally.cs:96:17:98:17 | [finally: return] {...} | Finally.cs:90:17:98:17 | try {...} ... | -| Finally.cs:97:21:97:21 | [finally(1): exception(Exception)] access to local variable i | Finally.cs:90:17:98:17 | try {...} ... | -| Finally.cs:97:21:97:21 | [finally: break, finally(1): exception(Exception)] access to local variable i | Finally.cs:90:17:98:17 | try {...} ... | +| Finally.cs:97:21:97:21 | [finally(1): exception] access to local variable i | Finally.cs:90:17:98:17 | try {...} ... | +| Finally.cs:97:21:97:21 | [finally: break, finally(1): exception] access to local variable i | Finally.cs:90:17:98:17 | try {...} ... | | Finally.cs:97:21:97:21 | [finally: break] access to local variable i | Finally.cs:90:17:98:17 | try {...} ... | -| Finally.cs:97:21:97:21 | [finally: continue, finally(1): exception(Exception)] access to local variable i | Finally.cs:90:17:98:17 | try {...} ... | +| Finally.cs:97:21:97:21 | [finally: continue, finally(1): exception] access to local variable i | Finally.cs:90:17:98:17 | try {...} ... | | Finally.cs:97:21:97:21 | [finally: continue] access to local variable i | Finally.cs:90:17:98:17 | try {...} ... | -| Finally.cs:97:21:97:21 | [finally: return, finally(1): exception(Exception)] access to local variable i | Finally.cs:90:17:98:17 | try {...} ... | +| Finally.cs:97:21:97:21 | [finally: return, finally(1): exception] access to local variable i | Finally.cs:90:17:98:17 | try {...} ... | | Finally.cs:97:21:97:21 | [finally: return] access to local variable i | Finally.cs:90:17:98:17 | try {...} ... | -| Finally.cs:97:21:97:23 | [finally(1): exception(Exception)] ...-- | Finally.cs:90:17:98:17 | try {...} ... | -| Finally.cs:97:21:97:23 | [finally: break, finally(1): exception(Exception)] ...-- | Finally.cs:90:17:98:17 | try {...} ... | +| Finally.cs:97:21:97:23 | [finally(1): exception] ...-- | Finally.cs:90:17:98:17 | try {...} ... | +| Finally.cs:97:21:97:23 | [finally: break, finally(1): exception] ...-- | Finally.cs:90:17:98:17 | try {...} ... | | Finally.cs:97:21:97:23 | [finally: break] ...-- | Finally.cs:90:17:98:17 | try {...} ... | -| Finally.cs:97:21:97:23 | [finally: continue, finally(1): exception(Exception)] ...-- | Finally.cs:90:17:98:17 | try {...} ... | +| Finally.cs:97:21:97:23 | [finally: continue, finally(1): exception] ...-- | Finally.cs:90:17:98:17 | try {...} ... | | Finally.cs:97:21:97:23 | [finally: continue] ...-- | Finally.cs:90:17:98:17 | try {...} ... | -| Finally.cs:97:21:97:23 | [finally: return, finally(1): exception(Exception)] ...-- | Finally.cs:90:17:98:17 | try {...} ... | +| Finally.cs:97:21:97:23 | [finally: return, finally(1): exception] ...-- | Finally.cs:90:17:98:17 | try {...} ... | | Finally.cs:97:21:97:23 | [finally: return] ...-- | Finally.cs:90:17:98:17 | try {...} ... | -| Finally.cs:97:21:97:24 | [finally(1): exception(Exception)] ...; | Finally.cs:90:17:98:17 | try {...} ... | -| Finally.cs:97:21:97:24 | [finally: break, finally(1): exception(Exception)] ...; | Finally.cs:90:17:98:17 | try {...} ... | +| Finally.cs:97:21:97:24 | [finally(1): exception] ...; | Finally.cs:90:17:98:17 | try {...} ... | +| Finally.cs:97:21:97:24 | [finally: break, finally(1): exception] ...; | Finally.cs:90:17:98:17 | try {...} ... | | Finally.cs:97:21:97:24 | [finally: break] ...; | Finally.cs:90:17:98:17 | try {...} ... | -| Finally.cs:97:21:97:24 | [finally: continue, finally(1): exception(Exception)] ...; | Finally.cs:90:17:98:17 | try {...} ... | +| Finally.cs:97:21:97:24 | [finally: continue, finally(1): exception] ...; | Finally.cs:90:17:98:17 | try {...} ... | | Finally.cs:97:21:97:24 | [finally: continue] ...; | Finally.cs:90:17:98:17 | try {...} ... | -| Finally.cs:97:21:97:24 | [finally: return, finally(1): exception(Exception)] ...; | Finally.cs:90:17:98:17 | try {...} ... | +| Finally.cs:97:21:97:24 | [finally: return, finally(1): exception] ...; | Finally.cs:90:17:98:17 | try {...} ... | | Finally.cs:97:21:97:24 | [finally: return] ...; | Finally.cs:90:17:98:17 | try {...} ... | -| Finally.cs:113:9:118:9 | [finally: exception(Exception)] {...} | Finally.cs:105:9:118:9 | try {...} ... | -| Finally.cs:113:9:118:9 | [finally: exception(NullReferenceException)] {...} | Finally.cs:105:9:118:9 | try {...} ... | -| Finally.cs:113:9:118:9 | [finally: exception(OutOfMemoryException)] {...} | Finally.cs:105:9:118:9 | try {...} ... | +| Finally.cs:113:9:118:9 | [finally: exception] {...} | Finally.cs:105:9:118:9 | try {...} ... | | Finally.cs:113:9:118:9 | [finally: return] {...} | Finally.cs:105:9:118:9 | try {...} ... | -| Finally.cs:114:13:115:41 | [finally: exception(Exception)] if (...) ... | Finally.cs:105:9:118:9 | try {...} ... | -| Finally.cs:114:13:115:41 | [finally: exception(NullReferenceException)] if (...) ... | Finally.cs:105:9:118:9 | try {...} ... | -| Finally.cs:114:13:115:41 | [finally: exception(OutOfMemoryException)] if (...) ... | Finally.cs:105:9:118:9 | try {...} ... | +| Finally.cs:114:13:115:41 | [finally: exception] if (...) ... | Finally.cs:105:9:118:9 | try {...} ... | | Finally.cs:114:13:115:41 | [finally: return] if (...) ... | Finally.cs:105:9:118:9 | try {...} ... | -| Finally.cs:114:17:114:36 | [false, finally: exception(Exception)] !... | Finally.cs:105:9:118:9 | try {...} ... | -| Finally.cs:114:17:114:36 | [false, finally: exception(NullReferenceException)] !... | Finally.cs:105:9:118:9 | try {...} ... | -| Finally.cs:114:17:114:36 | [false, finally: exception(OutOfMemoryException)] !... | Finally.cs:105:9:118:9 | try {...} ... | +| Finally.cs:114:17:114:36 | [false, finally: exception] !... | Finally.cs:105:9:118:9 | try {...} ... | | Finally.cs:114:17:114:36 | [false, finally: return] !... | Finally.cs:105:9:118:9 | try {...} ... | -| Finally.cs:114:17:114:36 | [true, finally: exception(Exception)] !... | Finally.cs:105:9:118:9 | try {...} ... | -| Finally.cs:114:17:114:36 | [true, finally: exception(NullReferenceException)] !... | Finally.cs:105:9:118:9 | try {...} ... | -| Finally.cs:114:17:114:36 | [true, finally: exception(OutOfMemoryException)] !... | Finally.cs:105:9:118:9 | try {...} ... | +| Finally.cs:114:17:114:36 | [true, finally: exception] !... | Finally.cs:105:9:118:9 | try {...} ... | | Finally.cs:114:17:114:36 | [true, finally: return] !... | Finally.cs:105:9:118:9 | try {...} ... | -| Finally.cs:114:19:114:23 | [finally: exception(Exception)] access to field Field | Finally.cs:105:9:118:9 | try {...} ... | -| Finally.cs:114:19:114:23 | [finally: exception(Exception)] this access | Finally.cs:105:9:118:9 | try {...} ... | -| Finally.cs:114:19:114:23 | [finally: exception(NullReferenceException)] access to field Field | Finally.cs:105:9:118:9 | try {...} ... | -| Finally.cs:114:19:114:23 | [finally: exception(NullReferenceException)] this access | Finally.cs:105:9:118:9 | try {...} ... | -| Finally.cs:114:19:114:23 | [finally: exception(OutOfMemoryException)] access to field Field | Finally.cs:105:9:118:9 | try {...} ... | -| Finally.cs:114:19:114:23 | [finally: exception(OutOfMemoryException)] this access | Finally.cs:105:9:118:9 | try {...} ... | +| Finally.cs:114:19:114:23 | [finally: exception] access to field Field | Finally.cs:105:9:118:9 | try {...} ... | +| Finally.cs:114:19:114:23 | [finally: exception] this access | Finally.cs:105:9:118:9 | try {...} ... | | Finally.cs:114:19:114:23 | [finally: return] access to field Field | Finally.cs:105:9:118:9 | try {...} ... | | Finally.cs:114:19:114:23 | [finally: return] this access | Finally.cs:105:9:118:9 | try {...} ... | -| Finally.cs:114:19:114:30 | [finally: exception(Exception)] access to property Length | Finally.cs:105:9:118:9 | try {...} ... | -| Finally.cs:114:19:114:30 | [finally: exception(NullReferenceException)] access to property Length | Finally.cs:105:9:118:9 | try {...} ... | -| Finally.cs:114:19:114:30 | [finally: exception(OutOfMemoryException)] access to property Length | Finally.cs:105:9:118:9 | try {...} ... | +| Finally.cs:114:19:114:30 | [finally: exception] access to property Length | Finally.cs:105:9:118:9 | try {...} ... | | Finally.cs:114:19:114:30 | [finally: return] access to property Length | Finally.cs:105:9:118:9 | try {...} ... | -| Finally.cs:114:19:114:35 | [finally: exception(Exception)] ... == ... | Finally.cs:105:9:118:9 | try {...} ... | -| Finally.cs:114:19:114:35 | [finally: exception(NullReferenceException)] ... == ... | Finally.cs:105:9:118:9 | try {...} ... | -| Finally.cs:114:19:114:35 | [finally: exception(OutOfMemoryException)] ... == ... | Finally.cs:105:9:118:9 | try {...} ... | +| Finally.cs:114:19:114:35 | [finally: exception] ... == ... | Finally.cs:105:9:118:9 | try {...} ... | | Finally.cs:114:19:114:35 | [finally: return] ... == ... | Finally.cs:105:9:118:9 | try {...} ... | -| Finally.cs:114:35:114:35 | [finally: exception(Exception)] 0 | Finally.cs:105:9:118:9 | try {...} ... | -| Finally.cs:114:35:114:35 | [finally: exception(NullReferenceException)] 0 | Finally.cs:105:9:118:9 | try {...} ... | -| Finally.cs:114:35:114:35 | [finally: exception(OutOfMemoryException)] 0 | Finally.cs:105:9:118:9 | try {...} ... | +| Finally.cs:114:35:114:35 | [finally: exception] 0 | Finally.cs:105:9:118:9 | try {...} ... | | Finally.cs:114:35:114:35 | [finally: return] 0 | Finally.cs:105:9:118:9 | try {...} ... | -| Finally.cs:115:17:115:40 | [finally: exception(Exception)] call to method WriteLine | Finally.cs:105:9:118:9 | try {...} ... | -| Finally.cs:115:17:115:40 | [finally: exception(NullReferenceException)] call to method WriteLine | Finally.cs:105:9:118:9 | try {...} ... | -| Finally.cs:115:17:115:40 | [finally: exception(OutOfMemoryException)] call to method WriteLine | Finally.cs:105:9:118:9 | try {...} ... | +| Finally.cs:115:17:115:40 | [finally: exception] call to method WriteLine | Finally.cs:105:9:118:9 | try {...} ... | | Finally.cs:115:17:115:40 | [finally: return] call to method WriteLine | Finally.cs:105:9:118:9 | try {...} ... | -| Finally.cs:115:17:115:41 | [finally: exception(Exception)] ...; | Finally.cs:105:9:118:9 | try {...} ... | -| Finally.cs:115:17:115:41 | [finally: exception(NullReferenceException)] ...; | Finally.cs:105:9:118:9 | try {...} ... | -| Finally.cs:115:17:115:41 | [finally: exception(OutOfMemoryException)] ...; | Finally.cs:105:9:118:9 | try {...} ... | +| Finally.cs:115:17:115:41 | [finally: exception] ...; | Finally.cs:105:9:118:9 | try {...} ... | | Finally.cs:115:17:115:41 | [finally: return] ...; | Finally.cs:105:9:118:9 | try {...} ... | -| Finally.cs:115:35:115:39 | [finally: exception(Exception)] access to field Field | Finally.cs:105:9:118:9 | try {...} ... | -| Finally.cs:115:35:115:39 | [finally: exception(Exception)] this access | Finally.cs:105:9:118:9 | try {...} ... | -| Finally.cs:115:35:115:39 | [finally: exception(NullReferenceException)] access to field Field | Finally.cs:105:9:118:9 | try {...} ... | -| Finally.cs:115:35:115:39 | [finally: exception(NullReferenceException)] this access | Finally.cs:105:9:118:9 | try {...} ... | -| Finally.cs:115:35:115:39 | [finally: exception(OutOfMemoryException)] access to field Field | Finally.cs:105:9:118:9 | try {...} ... | -| Finally.cs:115:35:115:39 | [finally: exception(OutOfMemoryException)] this access | Finally.cs:105:9:118:9 | try {...} ... | +| Finally.cs:115:35:115:39 | [finally: exception] access to field Field | Finally.cs:105:9:118:9 | try {...} ... | +| Finally.cs:115:35:115:39 | [finally: exception] this access | Finally.cs:105:9:118:9 | try {...} ... | | Finally.cs:115:35:115:39 | [finally: return] access to field Field | Finally.cs:105:9:118:9 | try {...} ... | | Finally.cs:115:35:115:39 | [finally: return] this access | Finally.cs:105:9:118:9 | try {...} ... | -| Finally.cs:116:13:117:37 | [finally: exception(Exception)] if (...) ... | Finally.cs:105:9:118:9 | try {...} ... | -| Finally.cs:116:13:117:37 | [finally: exception(NullReferenceException)] if (...) ... | Finally.cs:105:9:118:9 | try {...} ... | -| Finally.cs:116:13:117:37 | [finally: exception(OutOfMemoryException)] if (...) ... | Finally.cs:105:9:118:9 | try {...} ... | +| Finally.cs:116:13:117:37 | [finally: exception] if (...) ... | Finally.cs:105:9:118:9 | try {...} ... | | Finally.cs:116:13:117:37 | [finally: return] if (...) ... | Finally.cs:105:9:118:9 | try {...} ... | -| Finally.cs:116:17:116:21 | [finally: exception(Exception)] access to field Field | Finally.cs:105:9:118:9 | try {...} ... | -| Finally.cs:116:17:116:21 | [finally: exception(Exception)] this access | Finally.cs:105:9:118:9 | try {...} ... | -| Finally.cs:116:17:116:21 | [finally: exception(NullReferenceException)] access to field Field | Finally.cs:105:9:118:9 | try {...} ... | -| Finally.cs:116:17:116:21 | [finally: exception(NullReferenceException)] this access | Finally.cs:105:9:118:9 | try {...} ... | -| Finally.cs:116:17:116:21 | [finally: exception(OutOfMemoryException)] access to field Field | Finally.cs:105:9:118:9 | try {...} ... | -| Finally.cs:116:17:116:21 | [finally: exception(OutOfMemoryException)] this access | Finally.cs:105:9:118:9 | try {...} ... | +| Finally.cs:116:17:116:21 | [finally: exception] access to field Field | Finally.cs:105:9:118:9 | try {...} ... | +| Finally.cs:116:17:116:21 | [finally: exception] this access | Finally.cs:105:9:118:9 | try {...} ... | | Finally.cs:116:17:116:21 | [finally: return] access to field Field | Finally.cs:105:9:118:9 | try {...} ... | | Finally.cs:116:17:116:21 | [finally: return] this access | Finally.cs:105:9:118:9 | try {...} ... | -| Finally.cs:116:17:116:28 | [finally: exception(Exception)] access to property Length | Finally.cs:105:9:118:9 | try {...} ... | -| Finally.cs:116:17:116:28 | [finally: exception(NullReferenceException)] access to property Length | Finally.cs:105:9:118:9 | try {...} ... | -| Finally.cs:116:17:116:28 | [finally: exception(OutOfMemoryException)] access to property Length | Finally.cs:105:9:118:9 | try {...} ... | +| Finally.cs:116:17:116:28 | [finally: exception] access to property Length | Finally.cs:105:9:118:9 | try {...} ... | | Finally.cs:116:17:116:28 | [finally: return] access to property Length | Finally.cs:105:9:118:9 | try {...} ... | -| Finally.cs:116:17:116:32 | [finally: exception(Exception)] ... > ... | Finally.cs:105:9:118:9 | try {...} ... | -| Finally.cs:116:17:116:32 | [finally: exception(NullReferenceException)] ... > ... | Finally.cs:105:9:118:9 | try {...} ... | -| Finally.cs:116:17:116:32 | [finally: exception(OutOfMemoryException)] ... > ... | Finally.cs:105:9:118:9 | try {...} ... | +| Finally.cs:116:17:116:32 | [finally: exception] ... > ... | Finally.cs:105:9:118:9 | try {...} ... | | Finally.cs:116:17:116:32 | [finally: return] ... > ... | Finally.cs:105:9:118:9 | try {...} ... | -| Finally.cs:116:32:116:32 | [finally: exception(Exception)] 0 | Finally.cs:105:9:118:9 | try {...} ... | -| Finally.cs:116:32:116:32 | [finally: exception(NullReferenceException)] 0 | Finally.cs:105:9:118:9 | try {...} ... | -| Finally.cs:116:32:116:32 | [finally: exception(OutOfMemoryException)] 0 | Finally.cs:105:9:118:9 | try {...} ... | +| Finally.cs:116:32:116:32 | [finally: exception] 0 | Finally.cs:105:9:118:9 | try {...} ... | | Finally.cs:116:32:116:32 | [finally: return] 0 | Finally.cs:105:9:118:9 | try {...} ... | -| Finally.cs:117:17:117:36 | [finally: exception(Exception)] call to method WriteLine | Finally.cs:105:9:118:9 | try {...} ... | -| Finally.cs:117:17:117:36 | [finally: exception(NullReferenceException)] call to method WriteLine | Finally.cs:105:9:118:9 | try {...} ... | -| Finally.cs:117:17:117:36 | [finally: exception(OutOfMemoryException)] call to method WriteLine | Finally.cs:105:9:118:9 | try {...} ... | +| Finally.cs:117:17:117:36 | [finally: exception] call to method WriteLine | Finally.cs:105:9:118:9 | try {...} ... | | Finally.cs:117:17:117:36 | [finally: return] call to method WriteLine | Finally.cs:105:9:118:9 | try {...} ... | -| Finally.cs:117:17:117:37 | [finally: exception(Exception)] ...; | Finally.cs:105:9:118:9 | try {...} ... | -| Finally.cs:117:17:117:37 | [finally: exception(NullReferenceException)] ...; | Finally.cs:105:9:118:9 | try {...} ... | -| Finally.cs:117:17:117:37 | [finally: exception(OutOfMemoryException)] ...; | Finally.cs:105:9:118:9 | try {...} ... | +| Finally.cs:117:17:117:37 | [finally: exception] ...; | Finally.cs:105:9:118:9 | try {...} ... | | Finally.cs:117:17:117:37 | [finally: return] ...; | Finally.cs:105:9:118:9 | try {...} ... | -| Finally.cs:117:35:117:35 | [finally: exception(Exception)] 1 | Finally.cs:105:9:118:9 | try {...} ... | -| Finally.cs:117:35:117:35 | [finally: exception(NullReferenceException)] 1 | Finally.cs:105:9:118:9 | try {...} ... | -| Finally.cs:117:35:117:35 | [finally: exception(OutOfMemoryException)] 1 | Finally.cs:105:9:118:9 | try {...} ... | +| Finally.cs:117:35:117:35 | [finally: exception] 1 | Finally.cs:105:9:118:9 | try {...} ... | | Finally.cs:117:35:117:35 | [finally: return] 1 | Finally.cs:105:9:118:9 | try {...} ... | -| Finally.cs:140:9:143:9 | [finally: exception(Exception)] {...} | Finally.cs:135:9:143:9 | try {...} ... | -| Finally.cs:141:13:141:44 | [finally: exception(Exception)] throw ...; | Finally.cs:135:9:143:9 | try {...} ... | -| Finally.cs:141:19:141:43 | [finally: exception(Exception)] object creation of type ArgumentException | Finally.cs:135:9:143:9 | try {...} ... | -| Finally.cs:141:41:141:42 | [finally: exception(Exception)] "" | Finally.cs:135:9:143:9 | try {...} ... | -| Finally.cs:155:9:169:9 | [finally: exception(ArgumentNullException)] {...} | Finally.cs:149:9:169:9 | try {...} ... | -| Finally.cs:155:9:169:9 | [finally: exception(Exception)] {...} | Finally.cs:149:9:169:9 | try {...} ... | -| Finally.cs:156:13:168:13 | [finally: exception(ArgumentNullException)] try {...} ... | Finally.cs:149:9:169:9 | try {...} ... | -| Finally.cs:156:13:168:13 | [finally: exception(Exception)] try {...} ... | Finally.cs:149:9:169:9 | try {...} ... | -| Finally.cs:157:13:160:13 | [finally: exception(ArgumentNullException)] {...} | Finally.cs:149:9:169:9 | try {...} ... | -| Finally.cs:157:13:160:13 | [finally: exception(Exception)] {...} | Finally.cs:149:9:169:9 | try {...} ... | -| Finally.cs:158:17:159:45 | [finally: exception(ArgumentNullException)] if (...) ... | Finally.cs:149:9:169:9 | try {...} ... | -| Finally.cs:158:17:159:45 | [finally: exception(Exception)] if (...) ... | Finally.cs:149:9:169:9 | try {...} ... | -| Finally.cs:158:21:158:24 | [finally: exception(ArgumentNullException)] access to parameter args | Finally.cs:149:9:169:9 | try {...} ... | -| Finally.cs:158:21:158:24 | [finally: exception(Exception)] access to parameter args | Finally.cs:149:9:169:9 | try {...} ... | -| Finally.cs:158:21:158:31 | [finally: exception(ArgumentNullException)] access to property Length | Finally.cs:149:9:169:9 | try {...} ... | -| Finally.cs:158:21:158:31 | [finally: exception(Exception)] access to property Length | Finally.cs:149:9:169:9 | try {...} ... | -| Finally.cs:158:21:158:36 | [finally: exception(ArgumentNullException)] ... == ... | Finally.cs:149:9:169:9 | try {...} ... | -| Finally.cs:158:21:158:36 | [finally: exception(Exception)] ... == ... | Finally.cs:149:9:169:9 | try {...} ... | -| Finally.cs:158:36:158:36 | [finally: exception(ArgumentNullException)] 1 | Finally.cs:149:9:169:9 | try {...} ... | -| Finally.cs:158:36:158:36 | [finally: exception(Exception)] 1 | Finally.cs:149:9:169:9 | try {...} ... | -| Finally.cs:159:21:159:45 | [finally: exception(ArgumentNullException)] throw ...; | Finally.cs:149:9:169:9 | try {...} ... | -| Finally.cs:159:21:159:45 | [finally: exception(Exception)] throw ...; | Finally.cs:149:9:169:9 | try {...} ... | -| Finally.cs:159:27:159:44 | [finally: exception(ArgumentNullException)] object creation of type Exception | Finally.cs:149:9:169:9 | try {...} ... | -| Finally.cs:159:27:159:44 | [finally: exception(Exception)] object creation of type Exception | Finally.cs:149:9:169:9 | try {...} ... | -| Finally.cs:159:41:159:43 | [finally: exception(ArgumentNullException)] "1" | Finally.cs:149:9:169:9 | try {...} ... | -| Finally.cs:159:41:159:43 | [finally: exception(Exception)] "1" | Finally.cs:149:9:169:9 | try {...} ... | -| Finally.cs:161:13:164:13 | [finally: exception(ArgumentNullException), exception: Exception] catch (...) {...} | Finally.cs:149:9:169:9 | try {...} ... | -| Finally.cs:161:13:164:13 | [finally: exception(ArgumentNullException), exception: NullReferenceException] catch (...) {...} | Finally.cs:149:9:169:9 | try {...} ... | -| Finally.cs:161:13:164:13 | [finally: exception(Exception), exception: Exception] catch (...) {...} | Finally.cs:149:9:169:9 | try {...} ... | -| Finally.cs:161:13:164:13 | [finally: exception(Exception), exception: NullReferenceException] catch (...) {...} | Finally.cs:149:9:169:9 | try {...} ... | -| Finally.cs:161:30:161:30 | [finally: exception(ArgumentNullException), exception: Exception] Exception e | Finally.cs:149:9:169:9 | try {...} ... | -| Finally.cs:161:30:161:30 | [finally: exception(ArgumentNullException), exception: NullReferenceException] Exception e | Finally.cs:149:9:169:9 | try {...} ... | -| Finally.cs:161:30:161:30 | [finally: exception(Exception), exception: Exception] Exception e | Finally.cs:149:9:169:9 | try {...} ... | -| Finally.cs:161:30:161:30 | [finally: exception(Exception), exception: NullReferenceException] Exception e | Finally.cs:149:9:169:9 | try {...} ... | -| Finally.cs:161:39:161:39 | [finally: exception(ArgumentNullException), exception: Exception] access to local variable e | Finally.cs:149:9:169:9 | try {...} ... | -| Finally.cs:161:39:161:39 | [finally: exception(ArgumentNullException), exception: NullReferenceException] access to local variable e | Finally.cs:149:9:169:9 | try {...} ... | -| Finally.cs:161:39:161:39 | [finally: exception(Exception), exception: Exception] access to local variable e | Finally.cs:149:9:169:9 | try {...} ... | -| Finally.cs:161:39:161:39 | [finally: exception(Exception), exception: NullReferenceException] access to local variable e | Finally.cs:149:9:169:9 | try {...} ... | -| Finally.cs:161:39:161:47 | [finally: exception(ArgumentNullException), exception: Exception] access to property Message | Finally.cs:149:9:169:9 | try {...} ... | -| Finally.cs:161:39:161:47 | [finally: exception(ArgumentNullException), exception: NullReferenceException] access to property Message | Finally.cs:149:9:169:9 | try {...} ... | -| Finally.cs:161:39:161:47 | [finally: exception(Exception), exception: Exception] access to property Message | Finally.cs:149:9:169:9 | try {...} ... | -| Finally.cs:161:39:161:47 | [finally: exception(Exception), exception: NullReferenceException] access to property Message | Finally.cs:149:9:169:9 | try {...} ... | -| Finally.cs:161:39:161:54 | [finally: exception(ArgumentNullException), exception: Exception] ... == ... | Finally.cs:149:9:169:9 | try {...} ... | -| Finally.cs:161:39:161:54 | [finally: exception(ArgumentNullException), exception: NullReferenceException] ... == ... | Finally.cs:149:9:169:9 | try {...} ... | -| Finally.cs:161:39:161:54 | [finally: exception(Exception), exception: Exception] ... == ... | Finally.cs:149:9:169:9 | try {...} ... | -| Finally.cs:161:39:161:54 | [finally: exception(Exception), exception: NullReferenceException] ... == ... | Finally.cs:149:9:169:9 | try {...} ... | -| Finally.cs:161:52:161:54 | [finally: exception(ArgumentNullException), exception: Exception] "1" | Finally.cs:149:9:169:9 | try {...} ... | -| Finally.cs:161:52:161:54 | [finally: exception(ArgumentNullException), exception: NullReferenceException] "1" | Finally.cs:149:9:169:9 | try {...} ... | -| Finally.cs:161:52:161:54 | [finally: exception(Exception), exception: Exception] "1" | Finally.cs:149:9:169:9 | try {...} ... | -| Finally.cs:161:52:161:54 | [finally: exception(Exception), exception: NullReferenceException] "1" | Finally.cs:149:9:169:9 | try {...} ... | -| Finally.cs:162:13:164:13 | [finally: exception(ArgumentNullException)] {...} | Finally.cs:149:9:169:9 | try {...} ... | -| Finally.cs:162:13:164:13 | [finally: exception(Exception)] {...} | Finally.cs:149:9:169:9 | try {...} ... | -| Finally.cs:163:17:163:42 | [finally: exception(ArgumentNullException)] call to method WriteLine | Finally.cs:149:9:169:9 | try {...} ... | -| Finally.cs:163:17:163:42 | [finally: exception(Exception)] call to method WriteLine | Finally.cs:149:9:169:9 | try {...} ... | -| Finally.cs:163:17:163:43 | [finally: exception(ArgumentNullException)] ...; | Finally.cs:149:9:169:9 | try {...} ... | -| Finally.cs:163:17:163:43 | [finally: exception(Exception)] ...; | Finally.cs:149:9:169:9 | try {...} ... | -| Finally.cs:163:35:163:38 | [finally: exception(ArgumentNullException)] access to parameter args | Finally.cs:149:9:169:9 | try {...} ... | -| Finally.cs:163:35:163:38 | [finally: exception(Exception)] access to parameter args | Finally.cs:149:9:169:9 | try {...} ... | -| Finally.cs:163:35:163:41 | [finally: exception(ArgumentNullException)] access to array element | Finally.cs:149:9:169:9 | try {...} ... | -| Finally.cs:163:35:163:41 | [finally: exception(Exception)] access to array element | Finally.cs:149:9:169:9 | try {...} ... | -| Finally.cs:163:40:163:40 | [finally: exception(ArgumentNullException)] 0 | Finally.cs:149:9:169:9 | try {...} ... | -| Finally.cs:163:40:163:40 | [finally: exception(Exception)] 0 | Finally.cs:149:9:169:9 | try {...} ... | -| Finally.cs:165:13:168:13 | [finally: exception(ArgumentNullException)] catch {...} | Finally.cs:149:9:169:9 | try {...} ... | -| Finally.cs:165:13:168:13 | [finally: exception(Exception)] catch {...} | Finally.cs:149:9:169:9 | try {...} ... | -| Finally.cs:166:13:168:13 | [finally: exception(ArgumentNullException)] {...} | Finally.cs:149:9:169:9 | try {...} ... | -| Finally.cs:166:13:168:13 | [finally: exception(Exception)] {...} | Finally.cs:149:9:169:9 | try {...} ... | -| Finally.cs:167:17:167:37 | [finally: exception(ArgumentNullException)] call to method WriteLine | Finally.cs:149:9:169:9 | try {...} ... | -| Finally.cs:167:17:167:37 | [finally: exception(Exception)] call to method WriteLine | Finally.cs:149:9:169:9 | try {...} ... | -| Finally.cs:167:17:167:38 | [finally: exception(ArgumentNullException)] ...; | Finally.cs:149:9:169:9 | try {...} ... | -| Finally.cs:167:17:167:38 | [finally: exception(Exception)] ...; | Finally.cs:149:9:169:9 | try {...} ... | -| Finally.cs:167:35:167:36 | [finally: exception(ArgumentNullException)] "" | Finally.cs:149:9:169:9 | try {...} ... | -| Finally.cs:167:35:167:36 | [finally: exception(Exception)] "" | Finally.cs:149:9:169:9 | try {...} ... | -| Finally.cs:183:9:192:9 | [finally: exception(Exception), b1 (line 176): true] {...} | Finally.cs:178:9:192:9 | try {...} ... | -| Finally.cs:183:9:192:9 | [finally: exception(ExceptionA), b1 (line 176): true] {...} | Finally.cs:178:9:192:9 | try {...} ... | -| Finally.cs:184:13:191:13 | [finally: exception(Exception), b1 (line 176): true] try {...} ... | Finally.cs:178:9:192:9 | try {...} ... | -| Finally.cs:184:13:191:13 | [finally: exception(ExceptionA), b1 (line 176): true] try {...} ... | Finally.cs:178:9:192:9 | try {...} ... | -| Finally.cs:185:13:187:13 | [finally: exception(Exception), b1 (line 176): true] {...} | Finally.cs:178:9:192:9 | try {...} ... | -| Finally.cs:185:13:187:13 | [finally: exception(ExceptionA), b1 (line 176): true] {...} | Finally.cs:178:9:192:9 | try {...} ... | -| Finally.cs:186:17:186:47 | [finally: exception(Exception), b1 (line 176): true] if (...) ... | Finally.cs:178:9:192:9 | try {...} ... | -| Finally.cs:186:17:186:47 | [finally: exception(ExceptionA), b1 (line 176): true] if (...) ... | Finally.cs:178:9:192:9 | try {...} ... | -| Finally.cs:186:21:186:22 | [finally: exception(Exception), b1 (line 176): true] access to parameter b2 | Finally.cs:178:9:192:9 | try {...} ... | -| Finally.cs:186:21:186:22 | [finally: exception(ExceptionA), b1 (line 176): true] access to parameter b2 | Finally.cs:178:9:192:9 | try {...} ... | -| Finally.cs:186:25:186:47 | [finally: exception(Exception), b1 (line 176): true, b2 (line 176): true] throw ...; | Finally.cs:178:9:192:9 | try {...} ... | -| Finally.cs:186:25:186:47 | [finally: exception(ExceptionA), b1 (line 176): true, b2 (line 176): true] throw ...; | Finally.cs:178:9:192:9 | try {...} ... | -| Finally.cs:186:31:186:46 | [finally: exception(Exception), b1 (line 176): true, b2 (line 176): true] object creation of type ExceptionB | Finally.cs:178:9:192:9 | try {...} ... | -| Finally.cs:186:31:186:46 | [finally: exception(ExceptionA), b1 (line 176): true, b2 (line 176): true] object creation of type ExceptionB | Finally.cs:178:9:192:9 | try {...} ... | -| Finally.cs:188:13:191:13 | [finally: exception(Exception), exception: Exception, b1 (line 176): true, b2 (line 176): true] catch (...) {...} | Finally.cs:178:9:192:9 | try {...} ... | -| Finally.cs:188:13:191:13 | [finally: exception(Exception), exception: ExceptionB, b1 (line 176): true, b2 (line 176): true] catch (...) {...} | Finally.cs:178:9:192:9 | try {...} ... | -| Finally.cs:188:13:191:13 | [finally: exception(ExceptionA), exception: Exception, b1 (line 176): true, b2 (line 176): true] catch (...) {...} | Finally.cs:178:9:192:9 | try {...} ... | -| Finally.cs:188:13:191:13 | [finally: exception(ExceptionA), exception: ExceptionB, b1 (line 176): true, b2 (line 176): true] catch (...) {...} | Finally.cs:178:9:192:9 | try {...} ... | -| Finally.cs:188:38:188:39 | [finally: exception(Exception), exception: Exception, b1 (line 176): true, b2 (line 176): true] access to parameter b2 | Finally.cs:178:9:192:9 | try {...} ... | -| Finally.cs:188:38:188:39 | [finally: exception(Exception), exception: ExceptionB, b1 (line 176): true, b2 (line 176): true] access to parameter b2 | Finally.cs:178:9:192:9 | try {...} ... | -| Finally.cs:188:38:188:39 | [finally: exception(ExceptionA), exception: Exception, b1 (line 176): true, b2 (line 176): true] access to parameter b2 | Finally.cs:178:9:192:9 | try {...} ... | -| Finally.cs:188:38:188:39 | [finally: exception(ExceptionA), exception: ExceptionB, b1 (line 176): true, b2 (line 176): true] access to parameter b2 | Finally.cs:178:9:192:9 | try {...} ... | -| Finally.cs:189:13:191:13 | [finally: exception(Exception), b1 (line 176): true] {...} | Finally.cs:178:9:192:9 | try {...} ... | -| Finally.cs:189:13:191:13 | [finally: exception(ExceptionA), b1 (line 176): true] {...} | Finally.cs:178:9:192:9 | try {...} ... | -| Finally.cs:190:17:190:47 | [finally: exception(Exception), b1 (line 176): true] if (...) ... | Finally.cs:178:9:192:9 | try {...} ... | -| Finally.cs:190:17:190:47 | [finally: exception(ExceptionA), b1 (line 176): true] if (...) ... | Finally.cs:178:9:192:9 | try {...} ... | -| Finally.cs:190:21:190:22 | [finally: exception(Exception), b1 (line 176): true] access to parameter b1 | Finally.cs:178:9:192:9 | try {...} ... | -| Finally.cs:190:21:190:22 | [finally: exception(ExceptionA), b1 (line 176): true] access to parameter b1 | Finally.cs:178:9:192:9 | try {...} ... | -| Finally.cs:190:25:190:47 | [finally: exception(Exception)] throw ...; | Finally.cs:178:9:192:9 | try {...} ... | -| Finally.cs:190:25:190:47 | [finally: exception(ExceptionA)] throw ...; | Finally.cs:178:9:192:9 | try {...} ... | -| Finally.cs:190:31:190:46 | [finally: exception(Exception)] object creation of type ExceptionC | Finally.cs:178:9:192:9 | try {...} ... | -| Finally.cs:190:31:190:46 | [finally: exception(ExceptionA)] object creation of type ExceptionC | Finally.cs:178:9:192:9 | try {...} ... | -| Finally.cs:202:9:212:9 | [finally: exception(Exception)] {...} | Finally.cs:197:9:212:9 | try {...} ... | -| Finally.cs:202:9:212:9 | [finally: exception(ExceptionA)] {...} | Finally.cs:197:9:212:9 | try {...} ... | -| Finally.cs:203:13:210:13 | [finally: exception(Exception)] try {...} ... | Finally.cs:197:9:212:9 | try {...} ... | -| Finally.cs:203:13:210:13 | [finally: exception(ExceptionA)] try {...} ... | Finally.cs:197:9:212:9 | try {...} ... | -| Finally.cs:204:13:206:13 | [finally: exception(Exception)] {...} | Finally.cs:197:9:212:9 | try {...} ... | -| Finally.cs:204:13:206:13 | [finally: exception(ExceptionA)] {...} | Finally.cs:197:9:212:9 | try {...} ... | -| Finally.cs:205:17:205:47 | [finally: exception(Exception)] if (...) ... | Finally.cs:197:9:212:9 | try {...} ... | -| Finally.cs:205:17:205:47 | [finally: exception(ExceptionA)] if (...) ... | Finally.cs:197:9:212:9 | try {...} ... | -| Finally.cs:205:21:205:22 | [finally: exception(Exception)] access to parameter b2 | Finally.cs:197:9:212:9 | try {...} ... | -| Finally.cs:205:21:205:22 | [finally: exception(ExceptionA)] access to parameter b2 | Finally.cs:197:9:212:9 | try {...} ... | -| Finally.cs:205:25:205:47 | [finally: exception(Exception)] throw ...; | Finally.cs:197:9:212:9 | try {...} ... | -| Finally.cs:205:25:205:47 | [finally: exception(ExceptionA)] throw ...; | Finally.cs:197:9:212:9 | try {...} ... | -| Finally.cs:205:31:205:46 | [finally: exception(Exception)] object creation of type ExceptionB | Finally.cs:197:9:212:9 | try {...} ... | -| Finally.cs:205:31:205:46 | [finally: exception(ExceptionA)] object creation of type ExceptionB | Finally.cs:197:9:212:9 | try {...} ... | -| Finally.cs:208:13:210:13 | [finally(1): exception(Exception)] {...} | Finally.cs:203:13:210:13 | try {...} ... | -| Finally.cs:208:13:210:13 | [finally(1): exception(ExceptionB)] {...} | Finally.cs:203:13:210:13 | try {...} ... | -| Finally.cs:208:13:210:13 | [finally: exception(Exception), finally(1): exception(Exception)] {...} | Finally.cs:203:13:210:13 | try {...} ... | -| Finally.cs:208:13:210:13 | [finally: exception(Exception), finally(1): exception(ExceptionB)] {...} | Finally.cs:203:13:210:13 | try {...} ... | -| Finally.cs:208:13:210:13 | [finally: exception(Exception)] {...} | Finally.cs:203:13:210:13 | try {...} ... | -| Finally.cs:208:13:210:13 | [finally: exception(ExceptionA), finally(1): exception(Exception)] {...} | Finally.cs:203:13:210:13 | try {...} ... | -| Finally.cs:208:13:210:13 | [finally: exception(ExceptionA), finally(1): exception(ExceptionB)] {...} | Finally.cs:203:13:210:13 | try {...} ... | -| Finally.cs:208:13:210:13 | [finally: exception(ExceptionA)] {...} | Finally.cs:203:13:210:13 | try {...} ... | -| Finally.cs:209:17:209:47 | [finally(1): exception(Exception)] if (...) ... | Finally.cs:203:13:210:13 | try {...} ... | -| Finally.cs:209:17:209:47 | [finally(1): exception(ExceptionB)] if (...) ... | Finally.cs:203:13:210:13 | try {...} ... | -| Finally.cs:209:17:209:47 | [finally: exception(Exception), finally(1): exception(Exception)] if (...) ... | Finally.cs:203:13:210:13 | try {...} ... | -| Finally.cs:209:17:209:47 | [finally: exception(Exception), finally(1): exception(ExceptionB)] if (...) ... | Finally.cs:203:13:210:13 | try {...} ... | -| Finally.cs:209:17:209:47 | [finally: exception(Exception)] if (...) ... | Finally.cs:203:13:210:13 | try {...} ... | -| Finally.cs:209:17:209:47 | [finally: exception(ExceptionA), finally(1): exception(Exception)] if (...) ... | Finally.cs:203:13:210:13 | try {...} ... | -| Finally.cs:209:17:209:47 | [finally: exception(ExceptionA), finally(1): exception(ExceptionB)] if (...) ... | Finally.cs:203:13:210:13 | try {...} ... | -| Finally.cs:209:17:209:47 | [finally: exception(ExceptionA)] if (...) ... | Finally.cs:203:13:210:13 | try {...} ... | -| Finally.cs:209:21:209:22 | [finally(1): exception(Exception)] access to parameter b3 | Finally.cs:203:13:210:13 | try {...} ... | -| Finally.cs:209:21:209:22 | [finally(1): exception(ExceptionB)] access to parameter b3 | Finally.cs:203:13:210:13 | try {...} ... | -| Finally.cs:209:21:209:22 | [finally: exception(Exception), finally(1): exception(Exception)] access to parameter b3 | Finally.cs:203:13:210:13 | try {...} ... | -| Finally.cs:209:21:209:22 | [finally: exception(Exception), finally(1): exception(ExceptionB)] access to parameter b3 | Finally.cs:203:13:210:13 | try {...} ... | -| Finally.cs:209:21:209:22 | [finally: exception(Exception)] access to parameter b3 | Finally.cs:203:13:210:13 | try {...} ... | -| Finally.cs:209:21:209:22 | [finally: exception(ExceptionA), finally(1): exception(Exception)] access to parameter b3 | Finally.cs:203:13:210:13 | try {...} ... | -| Finally.cs:209:21:209:22 | [finally: exception(ExceptionA), finally(1): exception(ExceptionB)] access to parameter b3 | Finally.cs:203:13:210:13 | try {...} ... | -| Finally.cs:209:21:209:22 | [finally: exception(ExceptionA)] access to parameter b3 | Finally.cs:203:13:210:13 | try {...} ... | -| Finally.cs:209:25:209:47 | [finally(1): exception(Exception)] throw ...; | Finally.cs:203:13:210:13 | try {...} ... | -| Finally.cs:209:25:209:47 | [finally(1): exception(ExceptionB)] throw ...; | Finally.cs:203:13:210:13 | try {...} ... | -| Finally.cs:209:25:209:47 | [finally: exception(Exception), finally(1): exception(Exception)] throw ...; | Finally.cs:203:13:210:13 | try {...} ... | -| Finally.cs:209:25:209:47 | [finally: exception(Exception), finally(1): exception(ExceptionB)] throw ...; | Finally.cs:203:13:210:13 | try {...} ... | -| Finally.cs:209:25:209:47 | [finally: exception(Exception)] throw ...; | Finally.cs:203:13:210:13 | try {...} ... | -| Finally.cs:209:25:209:47 | [finally: exception(ExceptionA), finally(1): exception(Exception)] throw ...; | Finally.cs:203:13:210:13 | try {...} ... | -| Finally.cs:209:25:209:47 | [finally: exception(ExceptionA), finally(1): exception(ExceptionB)] throw ...; | Finally.cs:203:13:210:13 | try {...} ... | -| Finally.cs:209:25:209:47 | [finally: exception(ExceptionA)] throw ...; | Finally.cs:203:13:210:13 | try {...} ... | -| Finally.cs:209:31:209:46 | [finally(1): exception(Exception)] object creation of type ExceptionC | Finally.cs:203:13:210:13 | try {...} ... | -| Finally.cs:209:31:209:46 | [finally(1): exception(ExceptionB)] object creation of type ExceptionC | Finally.cs:203:13:210:13 | try {...} ... | -| Finally.cs:209:31:209:46 | [finally: exception(Exception), finally(1): exception(Exception)] object creation of type ExceptionC | Finally.cs:203:13:210:13 | try {...} ... | -| Finally.cs:209:31:209:46 | [finally: exception(Exception), finally(1): exception(ExceptionB)] object creation of type ExceptionC | Finally.cs:203:13:210:13 | try {...} ... | -| Finally.cs:209:31:209:46 | [finally: exception(Exception)] object creation of type ExceptionC | Finally.cs:203:13:210:13 | try {...} ... | -| Finally.cs:209:31:209:46 | [finally: exception(ExceptionA), finally(1): exception(Exception)] object creation of type ExceptionC | Finally.cs:203:13:210:13 | try {...} ... | -| Finally.cs:209:31:209:46 | [finally: exception(ExceptionA), finally(1): exception(ExceptionB)] object creation of type ExceptionC | Finally.cs:203:13:210:13 | try {...} ... | -| Finally.cs:209:31:209:46 | [finally: exception(ExceptionA)] object creation of type ExceptionC | Finally.cs:203:13:210:13 | try {...} ... | -| Finally.cs:211:13:211:16 | [finally: exception(Exception)] this access | Finally.cs:197:9:212:9 | try {...} ... | -| Finally.cs:211:13:211:16 | [finally: exception(ExceptionA)] this access | Finally.cs:197:9:212:9 | try {...} ... | -| Finally.cs:211:13:211:28 | [finally: exception(Exception)] ... = ... | Finally.cs:197:9:212:9 | try {...} ... | -| Finally.cs:211:13:211:28 | [finally: exception(ExceptionA)] ... = ... | Finally.cs:197:9:212:9 | try {...} ... | -| Finally.cs:211:13:211:29 | [finally: exception(Exception)] ...; | Finally.cs:197:9:212:9 | try {...} ... | -| Finally.cs:211:13:211:29 | [finally: exception(ExceptionA)] ...; | Finally.cs:197:9:212:9 | try {...} ... | -| Finally.cs:211:26:211:28 | [finally: exception(Exception)] "0" | Finally.cs:197:9:212:9 | try {...} ... | -| Finally.cs:211:26:211:28 | [finally: exception(ExceptionA)] "0" | Finally.cs:197:9:212:9 | try {...} ... | -| Finally.cs:243:13:253:13 | [finally: exception(Exception)] {...} | Finally.cs:237:13:253:13 | try {...} ... | -| Finally.cs:243:13:253:13 | [finally: exception(ExceptionA)] {...} | Finally.cs:237:13:253:13 | try {...} ... | -| Finally.cs:244:17:252:17 | [finally: exception(Exception)] try {...} ... | Finally.cs:237:13:253:13 | try {...} ... | -| Finally.cs:244:17:252:17 | [finally: exception(ExceptionA)] try {...} ... | Finally.cs:237:13:253:13 | try {...} ... | -| Finally.cs:245:17:248:17 | [finally: exception(Exception)] {...} | Finally.cs:237:13:253:13 | try {...} ... | -| Finally.cs:245:17:248:17 | [finally: exception(ExceptionA)] {...} | Finally.cs:237:13:253:13 | try {...} ... | -| Finally.cs:246:21:247:47 | [finally: exception(Exception)] if (...) ... | Finally.cs:237:13:253:13 | try {...} ... | -| Finally.cs:246:21:247:47 | [finally: exception(ExceptionA)] if (...) ... | Finally.cs:237:13:253:13 | try {...} ... | -| Finally.cs:246:25:246:26 | [finally: exception(Exception)] access to parameter b2 | Finally.cs:237:13:253:13 | try {...} ... | -| Finally.cs:246:25:246:26 | [finally: exception(ExceptionA)] access to parameter b2 | Finally.cs:237:13:253:13 | try {...} ... | -| Finally.cs:247:25:247:47 | [finally: exception(Exception)] throw ...; | Finally.cs:237:13:253:13 | try {...} ... | -| Finally.cs:247:25:247:47 | [finally: exception(ExceptionA)] throw ...; | Finally.cs:237:13:253:13 | try {...} ... | -| Finally.cs:247:31:247:46 | [finally: exception(Exception)] object creation of type ExceptionA | Finally.cs:237:13:253:13 | try {...} ... | -| Finally.cs:247:31:247:46 | [finally: exception(ExceptionA)] object creation of type ExceptionA | Finally.cs:237:13:253:13 | try {...} ... | -| Finally.cs:250:17:252:17 | [finally(1): exception(Exception)] {...} | Finally.cs:244:17:252:17 | try {...} ... | -| Finally.cs:250:17:252:17 | [finally(1): exception(ExceptionA)] {...} | Finally.cs:244:17:252:17 | try {...} ... | -| Finally.cs:250:17:252:17 | [finally: exception(Exception), finally(1): exception(Exception)] {...} | Finally.cs:244:17:252:17 | try {...} ... | -| Finally.cs:250:17:252:17 | [finally: exception(Exception), finally(1): exception(ExceptionA)] {...} | Finally.cs:244:17:252:17 | try {...} ... | -| Finally.cs:250:17:252:17 | [finally: exception(Exception)] {...} | Finally.cs:244:17:252:17 | try {...} ... | -| Finally.cs:250:17:252:17 | [finally: exception(ExceptionA), finally(1): exception(Exception)] {...} | Finally.cs:244:17:252:17 | try {...} ... | -| Finally.cs:250:17:252:17 | [finally: exception(ExceptionA), finally(1): exception(ExceptionA)] {...} | Finally.cs:244:17:252:17 | try {...} ... | -| Finally.cs:250:17:252:17 | [finally: exception(ExceptionA)] {...} | Finally.cs:244:17:252:17 | try {...} ... | -| Finally.cs:251:21:251:54 | [finally(1): exception(Exception)] call to method WriteLine | Finally.cs:244:17:252:17 | try {...} ... | -| Finally.cs:251:21:251:54 | [finally(1): exception(ExceptionA)] call to method WriteLine | Finally.cs:244:17:252:17 | try {...} ... | -| Finally.cs:251:21:251:54 | [finally: exception(Exception), finally(1): exception(Exception)] call to method WriteLine | Finally.cs:244:17:252:17 | try {...} ... | -| Finally.cs:251:21:251:54 | [finally: exception(Exception), finally(1): exception(ExceptionA)] call to method WriteLine | Finally.cs:244:17:252:17 | try {...} ... | -| Finally.cs:251:21:251:54 | [finally: exception(Exception)] call to method WriteLine | Finally.cs:244:17:252:17 | try {...} ... | -| Finally.cs:251:21:251:54 | [finally: exception(ExceptionA), finally(1): exception(Exception)] call to method WriteLine | Finally.cs:244:17:252:17 | try {...} ... | -| Finally.cs:251:21:251:54 | [finally: exception(ExceptionA), finally(1): exception(ExceptionA)] call to method WriteLine | Finally.cs:244:17:252:17 | try {...} ... | -| Finally.cs:251:21:251:54 | [finally: exception(ExceptionA)] call to method WriteLine | Finally.cs:244:17:252:17 | try {...} ... | -| Finally.cs:251:21:251:55 | [finally(1): exception(Exception)] ...; | Finally.cs:244:17:252:17 | try {...} ... | -| Finally.cs:251:21:251:55 | [finally(1): exception(ExceptionA)] ...; | Finally.cs:244:17:252:17 | try {...} ... | -| Finally.cs:251:21:251:55 | [finally: exception(Exception), finally(1): exception(Exception)] ...; | Finally.cs:244:17:252:17 | try {...} ... | -| Finally.cs:251:21:251:55 | [finally: exception(Exception), finally(1): exception(ExceptionA)] ...; | Finally.cs:244:17:252:17 | try {...} ... | -| Finally.cs:251:21:251:55 | [finally: exception(Exception)] ...; | Finally.cs:244:17:252:17 | try {...} ... | -| Finally.cs:251:21:251:55 | [finally: exception(ExceptionA), finally(1): exception(Exception)] ...; | Finally.cs:244:17:252:17 | try {...} ... | -| Finally.cs:251:21:251:55 | [finally: exception(ExceptionA), finally(1): exception(ExceptionA)] ...; | Finally.cs:244:17:252:17 | try {...} ... | -| Finally.cs:251:21:251:55 | [finally: exception(ExceptionA)] ...; | Finally.cs:244:17:252:17 | try {...} ... | -| Finally.cs:251:39:251:53 | [finally(1): exception(Exception)] "Inner finally" | Finally.cs:244:17:252:17 | try {...} ... | -| Finally.cs:251:39:251:53 | [finally(1): exception(ExceptionA)] "Inner finally" | Finally.cs:244:17:252:17 | try {...} ... | -| Finally.cs:251:39:251:53 | [finally: exception(Exception), finally(1): exception(Exception)] "Inner finally" | Finally.cs:244:17:252:17 | try {...} ... | -| Finally.cs:251:39:251:53 | [finally: exception(Exception), finally(1): exception(ExceptionA)] "Inner finally" | Finally.cs:244:17:252:17 | try {...} ... | -| Finally.cs:251:39:251:53 | [finally: exception(Exception)] "Inner finally" | Finally.cs:244:17:252:17 | try {...} ... | -| Finally.cs:251:39:251:53 | [finally: exception(ExceptionA), finally(1): exception(Exception)] "Inner finally" | Finally.cs:244:17:252:17 | try {...} ... | -| Finally.cs:251:39:251:53 | [finally: exception(ExceptionA), finally(1): exception(ExceptionA)] "Inner finally" | Finally.cs:244:17:252:17 | try {...} ... | -| Finally.cs:251:39:251:53 | [finally: exception(ExceptionA)] "Inner finally" | Finally.cs:244:17:252:17 | try {...} ... | -| Finally.cs:257:9:259:9 | [finally: exception(Exception)] {...} | Finally.cs:235:9:259:9 | try {...} ... | -| Finally.cs:257:9:259:9 | [finally: exception(ExceptionA)] {...} | Finally.cs:235:9:259:9 | try {...} ... | -| Finally.cs:258:13:258:46 | [finally: exception(Exception)] call to method WriteLine | Finally.cs:235:9:259:9 | try {...} ... | -| Finally.cs:258:13:258:46 | [finally: exception(ExceptionA)] call to method WriteLine | Finally.cs:235:9:259:9 | try {...} ... | -| Finally.cs:258:13:258:47 | [finally: exception(Exception)] ...; | Finally.cs:235:9:259:9 | try {...} ... | -| Finally.cs:258:13:258:47 | [finally: exception(ExceptionA)] ...; | Finally.cs:235:9:259:9 | try {...} ... | -| Finally.cs:258:31:258:45 | [finally: exception(Exception)] "Outer finally" | Finally.cs:235:9:259:9 | try {...} ... | -| Finally.cs:258:31:258:45 | [finally: exception(ExceptionA)] "Outer finally" | Finally.cs:235:9:259:9 | try {...} ... | -| Finally.cs:270:9:273:9 | [finally: exception(Exception)] {...} | Finally.cs:265:9:273:9 | try {...} ... | -| Finally.cs:271:13:271:34 | [finally: exception(Exception)] call to method WriteLine | Finally.cs:265:9:273:9 | try {...} ... | -| Finally.cs:271:13:271:35 | [finally: exception(Exception)] ...; | Finally.cs:265:9:273:9 | try {...} ... | -| Finally.cs:271:31:271:33 | [finally: exception(Exception)] "3" | Finally.cs:265:9:273:9 | try {...} ... | -| Finally.cs:272:13:272:13 | [finally: exception(Exception)] access to parameter i | Finally.cs:265:9:273:9 | try {...} ... | -| Finally.cs:272:13:272:18 | [finally: exception(Exception)] ... + ... | Finally.cs:265:9:273:9 | try {...} ... | -| Finally.cs:272:13:272:18 | [finally: exception(Exception)] ... = ... | Finally.cs:265:9:273:9 | try {...} ... | -| Finally.cs:272:13:272:19 | [finally: exception(Exception)] ...; | Finally.cs:265:9:273:9 | try {...} ... | -| Finally.cs:272:18:272:18 | [finally: exception(Exception)] 3 | Finally.cs:265:9:273:9 | try {...} ... | +| Finally.cs:140:9:143:9 | [finally: exception] {...} | Finally.cs:135:9:143:9 | try {...} ... | +| Finally.cs:141:13:141:44 | [finally: exception] throw ...; | Finally.cs:135:9:143:9 | try {...} ... | +| Finally.cs:141:19:141:43 | [finally: exception] object creation of type ArgumentException | Finally.cs:135:9:143:9 | try {...} ... | +| Finally.cs:141:41:141:42 | [finally: exception] "" | Finally.cs:135:9:143:9 | try {...} ... | +| Finally.cs:155:9:169:9 | [finally: exception] {...} | Finally.cs:149:9:169:9 | try {...} ... | +| Finally.cs:156:13:168:13 | [finally: exception] try {...} ... | Finally.cs:149:9:169:9 | try {...} ... | +| Finally.cs:157:13:160:13 | [finally: exception] {...} | Finally.cs:149:9:169:9 | try {...} ... | +| Finally.cs:158:17:159:45 | [finally: exception] if (...) ... | Finally.cs:149:9:169:9 | try {...} ... | +| Finally.cs:158:21:158:24 | [finally: exception] access to parameter args | Finally.cs:149:9:169:9 | try {...} ... | +| Finally.cs:158:21:158:31 | [finally: exception] access to property Length | Finally.cs:149:9:169:9 | try {...} ... | +| Finally.cs:158:21:158:36 | [finally: exception] ... == ... | Finally.cs:149:9:169:9 | try {...} ... | +| Finally.cs:158:36:158:36 | [finally: exception] 1 | Finally.cs:149:9:169:9 | try {...} ... | +| Finally.cs:159:21:159:45 | [finally: exception] throw ...; | Finally.cs:149:9:169:9 | try {...} ... | +| Finally.cs:159:27:159:44 | [finally: exception] object creation of type Exception | Finally.cs:149:9:169:9 | try {...} ... | +| Finally.cs:159:41:159:43 | [finally: exception] "1" | Finally.cs:149:9:169:9 | try {...} ... | +| Finally.cs:161:13:164:13 | [finally: exception, exception: Exception] catch (...) {...} | Finally.cs:149:9:169:9 | try {...} ... | +| Finally.cs:161:13:164:13 | [finally: exception, exception: NullReferenceException] catch (...) {...} | Finally.cs:149:9:169:9 | try {...} ... | +| Finally.cs:161:30:161:30 | [finally: exception, exception: Exception] Exception e | Finally.cs:149:9:169:9 | try {...} ... | +| Finally.cs:161:30:161:30 | [finally: exception, exception: NullReferenceException] Exception e | Finally.cs:149:9:169:9 | try {...} ... | +| Finally.cs:161:39:161:39 | [finally: exception, exception: Exception] access to local variable e | Finally.cs:149:9:169:9 | try {...} ... | +| Finally.cs:161:39:161:39 | [finally: exception, exception: NullReferenceException] access to local variable e | Finally.cs:149:9:169:9 | try {...} ... | +| Finally.cs:161:39:161:47 | [finally: exception, exception: Exception] access to property Message | Finally.cs:149:9:169:9 | try {...} ... | +| Finally.cs:161:39:161:47 | [finally: exception, exception: NullReferenceException] access to property Message | Finally.cs:149:9:169:9 | try {...} ... | +| Finally.cs:161:39:161:54 | [finally: exception, exception: Exception] ... == ... | Finally.cs:149:9:169:9 | try {...} ... | +| Finally.cs:161:39:161:54 | [finally: exception, exception: NullReferenceException] ... == ... | Finally.cs:149:9:169:9 | try {...} ... | +| Finally.cs:161:52:161:54 | [finally: exception, exception: Exception] "1" | Finally.cs:149:9:169:9 | try {...} ... | +| Finally.cs:161:52:161:54 | [finally: exception, exception: NullReferenceException] "1" | Finally.cs:149:9:169:9 | try {...} ... | +| Finally.cs:162:13:164:13 | [finally: exception] {...} | Finally.cs:149:9:169:9 | try {...} ... | +| Finally.cs:163:17:163:42 | [finally: exception] call to method WriteLine | Finally.cs:149:9:169:9 | try {...} ... | +| Finally.cs:163:17:163:43 | [finally: exception] ...; | Finally.cs:149:9:169:9 | try {...} ... | +| Finally.cs:163:35:163:38 | [finally: exception] access to parameter args | Finally.cs:149:9:169:9 | try {...} ... | +| Finally.cs:163:35:163:41 | [finally: exception] access to array element | Finally.cs:149:9:169:9 | try {...} ... | +| Finally.cs:163:40:163:40 | [finally: exception] 0 | Finally.cs:149:9:169:9 | try {...} ... | +| Finally.cs:165:13:168:13 | [finally: exception] catch {...} | Finally.cs:149:9:169:9 | try {...} ... | +| Finally.cs:166:13:168:13 | [finally: exception] {...} | Finally.cs:149:9:169:9 | try {...} ... | +| Finally.cs:167:17:167:37 | [finally: exception] call to method WriteLine | Finally.cs:149:9:169:9 | try {...} ... | +| Finally.cs:167:17:167:38 | [finally: exception] ...; | Finally.cs:149:9:169:9 | try {...} ... | +| Finally.cs:167:35:167:36 | [finally: exception] "" | Finally.cs:149:9:169:9 | try {...} ... | +| Finally.cs:183:9:192:9 | [finally: exception, b1 (line 176): true] {...} | Finally.cs:178:9:192:9 | try {...} ... | +| Finally.cs:184:13:191:13 | [finally: exception, b1 (line 176): true] try {...} ... | Finally.cs:178:9:192:9 | try {...} ... | +| Finally.cs:185:13:187:13 | [finally: exception, b1 (line 176): true] {...} | Finally.cs:178:9:192:9 | try {...} ... | +| Finally.cs:186:17:186:47 | [finally: exception, b1 (line 176): true] if (...) ... | Finally.cs:178:9:192:9 | try {...} ... | +| Finally.cs:186:21:186:22 | [finally: exception, b1 (line 176): true] access to parameter b2 | Finally.cs:178:9:192:9 | try {...} ... | +| Finally.cs:186:25:186:47 | [finally: exception, b1 (line 176): true, b2 (line 176): true] throw ...; | Finally.cs:178:9:192:9 | try {...} ... | +| Finally.cs:186:31:186:46 | [finally: exception, b1 (line 176): true, b2 (line 176): true] object creation of type ExceptionB | Finally.cs:178:9:192:9 | try {...} ... | +| Finally.cs:188:13:191:13 | [finally: exception, exception: Exception, b1 (line 176): true, b2 (line 176): true] catch (...) {...} | Finally.cs:178:9:192:9 | try {...} ... | +| Finally.cs:188:13:191:13 | [finally: exception, exception: ExceptionB, b1 (line 176): true, b2 (line 176): true] catch (...) {...} | Finally.cs:178:9:192:9 | try {...} ... | +| Finally.cs:188:38:188:39 | [finally: exception, exception: Exception, b1 (line 176): true, b2 (line 176): true] access to parameter b2 | Finally.cs:178:9:192:9 | try {...} ... | +| Finally.cs:188:38:188:39 | [finally: exception, exception: ExceptionB, b1 (line 176): true, b2 (line 176): true] access to parameter b2 | Finally.cs:178:9:192:9 | try {...} ... | +| Finally.cs:189:13:191:13 | [finally: exception, b1 (line 176): true] {...} | Finally.cs:178:9:192:9 | try {...} ... | +| Finally.cs:190:17:190:47 | [finally: exception, b1 (line 176): true] if (...) ... | Finally.cs:178:9:192:9 | try {...} ... | +| Finally.cs:190:21:190:22 | [finally: exception, b1 (line 176): true] access to parameter b1 | Finally.cs:178:9:192:9 | try {...} ... | +| Finally.cs:190:25:190:47 | [finally: exception] throw ...; | Finally.cs:178:9:192:9 | try {...} ... | +| Finally.cs:190:31:190:46 | [finally: exception] object creation of type ExceptionC | Finally.cs:178:9:192:9 | try {...} ... | +| Finally.cs:202:9:212:9 | [finally: exception] {...} | Finally.cs:197:9:212:9 | try {...} ... | +| Finally.cs:203:13:210:13 | [finally: exception] try {...} ... | Finally.cs:197:9:212:9 | try {...} ... | +| Finally.cs:204:13:206:13 | [finally: exception] {...} | Finally.cs:197:9:212:9 | try {...} ... | +| Finally.cs:205:17:205:47 | [finally: exception] if (...) ... | Finally.cs:197:9:212:9 | try {...} ... | +| Finally.cs:205:21:205:22 | [finally: exception] access to parameter b2 | Finally.cs:197:9:212:9 | try {...} ... | +| Finally.cs:205:25:205:47 | [finally: exception] throw ...; | Finally.cs:197:9:212:9 | try {...} ... | +| Finally.cs:205:31:205:46 | [finally: exception] object creation of type ExceptionB | Finally.cs:197:9:212:9 | try {...} ... | +| Finally.cs:208:13:210:13 | [finally(1): exception] {...} | Finally.cs:203:13:210:13 | try {...} ... | +| Finally.cs:208:13:210:13 | [finally: exception, finally(1): exception] {...} | Finally.cs:203:13:210:13 | try {...} ... | +| Finally.cs:208:13:210:13 | [finally: exception] {...} | Finally.cs:203:13:210:13 | try {...} ... | +| Finally.cs:209:17:209:47 | [finally(1): exception] if (...) ... | Finally.cs:203:13:210:13 | try {...} ... | +| Finally.cs:209:17:209:47 | [finally: exception, finally(1): exception] if (...) ... | Finally.cs:203:13:210:13 | try {...} ... | +| Finally.cs:209:17:209:47 | [finally: exception] if (...) ... | Finally.cs:203:13:210:13 | try {...} ... | +| Finally.cs:209:21:209:22 | [finally(1): exception] access to parameter b3 | Finally.cs:203:13:210:13 | try {...} ... | +| Finally.cs:209:21:209:22 | [finally: exception, finally(1): exception] access to parameter b3 | Finally.cs:203:13:210:13 | try {...} ... | +| Finally.cs:209:21:209:22 | [finally: exception] access to parameter b3 | Finally.cs:203:13:210:13 | try {...} ... | +| Finally.cs:209:25:209:47 | [finally(1): exception] throw ...; | Finally.cs:203:13:210:13 | try {...} ... | +| Finally.cs:209:25:209:47 | [finally: exception, finally(1): exception] throw ...; | Finally.cs:203:13:210:13 | try {...} ... | +| Finally.cs:209:25:209:47 | [finally: exception] throw ...; | Finally.cs:203:13:210:13 | try {...} ... | +| Finally.cs:209:31:209:46 | [finally(1): exception] object creation of type ExceptionC | Finally.cs:203:13:210:13 | try {...} ... | +| Finally.cs:209:31:209:46 | [finally: exception, finally(1): exception] object creation of type ExceptionC | Finally.cs:203:13:210:13 | try {...} ... | +| Finally.cs:209:31:209:46 | [finally: exception] object creation of type ExceptionC | Finally.cs:203:13:210:13 | try {...} ... | +| Finally.cs:211:13:211:16 | [finally: exception] this access | Finally.cs:197:9:212:9 | try {...} ... | +| Finally.cs:211:13:211:28 | [finally: exception] ... = ... | Finally.cs:197:9:212:9 | try {...} ... | +| Finally.cs:211:13:211:29 | [finally: exception] ...; | Finally.cs:197:9:212:9 | try {...} ... | +| Finally.cs:211:26:211:28 | [finally: exception] "0" | Finally.cs:197:9:212:9 | try {...} ... | +| Finally.cs:243:13:253:13 | [finally: exception] {...} | Finally.cs:237:13:253:13 | try {...} ... | +| Finally.cs:244:17:252:17 | [finally: exception] try {...} ... | Finally.cs:237:13:253:13 | try {...} ... | +| Finally.cs:245:17:248:17 | [finally: exception] {...} | Finally.cs:237:13:253:13 | try {...} ... | +| Finally.cs:246:21:247:47 | [finally: exception] if (...) ... | Finally.cs:237:13:253:13 | try {...} ... | +| Finally.cs:246:25:246:26 | [finally: exception] access to parameter b2 | Finally.cs:237:13:253:13 | try {...} ... | +| Finally.cs:247:25:247:47 | [finally: exception] throw ...; | Finally.cs:237:13:253:13 | try {...} ... | +| Finally.cs:247:31:247:46 | [finally: exception] object creation of type ExceptionA | Finally.cs:237:13:253:13 | try {...} ... | +| Finally.cs:250:17:252:17 | [finally(1): exception] {...} | Finally.cs:244:17:252:17 | try {...} ... | +| Finally.cs:250:17:252:17 | [finally: exception, finally(1): exception] {...} | Finally.cs:244:17:252:17 | try {...} ... | +| Finally.cs:250:17:252:17 | [finally: exception] {...} | Finally.cs:244:17:252:17 | try {...} ... | +| Finally.cs:251:21:251:54 | [finally(1): exception] call to method WriteLine | Finally.cs:244:17:252:17 | try {...} ... | +| Finally.cs:251:21:251:54 | [finally: exception, finally(1): exception] call to method WriteLine | Finally.cs:244:17:252:17 | try {...} ... | +| Finally.cs:251:21:251:54 | [finally: exception] call to method WriteLine | Finally.cs:244:17:252:17 | try {...} ... | +| Finally.cs:251:21:251:55 | [finally(1): exception] ...; | Finally.cs:244:17:252:17 | try {...} ... | +| Finally.cs:251:21:251:55 | [finally: exception, finally(1): exception] ...; | Finally.cs:244:17:252:17 | try {...} ... | +| Finally.cs:251:21:251:55 | [finally: exception] ...; | Finally.cs:244:17:252:17 | try {...} ... | +| Finally.cs:251:39:251:53 | [finally(1): exception] "Inner finally" | Finally.cs:244:17:252:17 | try {...} ... | +| Finally.cs:251:39:251:53 | [finally: exception, finally(1): exception] "Inner finally" | Finally.cs:244:17:252:17 | try {...} ... | +| Finally.cs:251:39:251:53 | [finally: exception] "Inner finally" | Finally.cs:244:17:252:17 | try {...} ... | +| Finally.cs:257:9:259:9 | [finally: exception] {...} | Finally.cs:235:9:259:9 | try {...} ... | +| Finally.cs:258:13:258:46 | [finally: exception] call to method WriteLine | Finally.cs:235:9:259:9 | try {...} ... | +| Finally.cs:258:13:258:47 | [finally: exception] ...; | Finally.cs:235:9:259:9 | try {...} ... | +| Finally.cs:258:31:258:45 | [finally: exception] "Outer finally" | Finally.cs:235:9:259:9 | try {...} ... | +| Finally.cs:270:9:273:9 | [finally: exception] {...} | Finally.cs:265:9:273:9 | try {...} ... | +| Finally.cs:271:13:271:34 | [finally: exception] call to method WriteLine | Finally.cs:265:9:273:9 | try {...} ... | +| Finally.cs:271:13:271:35 | [finally: exception] ...; | Finally.cs:265:9:273:9 | try {...} ... | +| Finally.cs:271:31:271:33 | [finally: exception] "3" | Finally.cs:265:9:273:9 | try {...} ... | +| Finally.cs:272:13:272:13 | [finally: exception] access to parameter i | Finally.cs:265:9:273:9 | try {...} ... | +| Finally.cs:272:13:272:18 | [finally: exception] ... + ... | Finally.cs:265:9:273:9 | try {...} ... | +| Finally.cs:272:13:272:18 | [finally: exception] ... = ... | Finally.cs:265:9:273:9 | try {...} ... | +| Finally.cs:272:13:272:19 | [finally: exception] ...; | Finally.cs:265:9:273:9 | try {...} ... | +| Finally.cs:272:18:272:18 | [finally: exception] 3 | Finally.cs:265:9:273:9 | try {...} ... | | cflow.cs:274:9:276:9 | [finally: return] {...} | cflow.cs:268:9:276:9 | try {...} ... | | cflow.cs:275:13:275:41 | [finally: return] call to method WriteLine | cflow.cs:268:9:276:9 | try {...} ... | | cflow.cs:275:13:275:42 | [finally: return] ...; | cflow.cs:268:9:276:9 | try {...} ... | diff --git a/csharp/ql/test/library-tests/csharp8/switchexprcontrolflow.expected b/csharp/ql/test/library-tests/csharp8/switchexprcontrolflow.expected index b8a976a78a6a..2c4b9de438ea 100644 --- a/csharp/ql/test/library-tests/csharp8/switchexprcontrolflow.expected +++ b/csharp/ql/test/library-tests/csharp8/switchexprcontrolflow.expected @@ -45,9 +45,9 @@ | patterns.cs:110:25:110:25 | 0 | patterns.cs:110:22:110:26 | (..., ...) | semmle.label | successor | | patterns.cs:111:13:111:17 | ( ... ) | patterns.cs:111:13:111:17 | [no-match] { ... } | semmle.label | no-match | | patterns.cs:111:13:111:17 | ( ... ) | patterns.cs:111:14:111:14 | 1 | semmle.label | match | -| patterns.cs:111:13:111:17 | [match] { ... } | patterns.cs:98:10:98:20 | exit Expressions (abnormal) | semmle.label | exception(InvalidOperationException) | +| patterns.cs:111:13:111:17 | [match] { ... } | patterns.cs:98:10:98:20 | exit Expressions (abnormal) | semmle.label | exception | | patterns.cs:111:13:111:17 | [match] { ... } | patterns.cs:111:23:111:23 | 0 | semmle.label | match | -| patterns.cs:111:13:111:17 | [no-match] { ... } | patterns.cs:98:10:98:20 | exit Expressions (abnormal) | semmle.label | exception(InvalidOperationException) | +| patterns.cs:111:13:111:17 | [no-match] { ... } | patterns.cs:98:10:98:20 | exit Expressions (abnormal) | semmle.label | exception | | patterns.cs:111:13:111:26 | ... => ... | patterns.cs:108:24:112:9 | ... switch { ... } | semmle.label | successor | | patterns.cs:111:14:111:14 | 1 | patterns.cs:111:13:111:17 | [no-match] { ... } | semmle.label | no-match | | patterns.cs:111:14:111:14 | 1 | patterns.cs:111:16:111:16 | 0 | semmle.label | match | @@ -89,9 +89,9 @@ | patterns.cs:118:32:118:33 | access to local variable x2 | patterns.cs:118:28:118:34 | (..., ...) | semmle.label | successor | | patterns.cs:119:13:119:28 | ( ... ) | patterns.cs:119:13:119:28 | [no-match] { ... } | semmle.label | no-match | | patterns.cs:119:13:119:28 | ( ... ) | patterns.cs:119:14:119:19 | Int32 x2 | semmle.label | match | -| patterns.cs:119:13:119:28 | [match] { ... } | patterns.cs:98:10:98:20 | exit Expressions (abnormal) | semmle.label | exception(InvalidOperationException) | +| patterns.cs:119:13:119:28 | [match] { ... } | patterns.cs:98:10:98:20 | exit Expressions (abnormal) | semmle.label | exception | | patterns.cs:119:13:119:28 | [match] { ... } | patterns.cs:119:34:119:34 | 0 | semmle.label | match | -| patterns.cs:119:13:119:28 | [no-match] { ... } | patterns.cs:98:10:98:20 | exit Expressions (abnormal) | semmle.label | exception(InvalidOperationException) | +| patterns.cs:119:13:119:28 | [no-match] { ... } | patterns.cs:98:10:98:20 | exit Expressions (abnormal) | semmle.label | exception | | patterns.cs:119:13:119:38 | ... => ... | patterns.cs:115:20:120:9 | ... switch { ... } | semmle.label | successor | | patterns.cs:119:14:119:19 | Int32 x2 | patterns.cs:119:13:119:28 | [no-match] { ... } | semmle.label | no-match | | patterns.cs:119:14:119:19 | Int32 x2 | patterns.cs:119:22:119:27 | Int32 y2 | semmle.label | match | @@ -148,7 +148,7 @@ | patterns.cs:130:17:130:17 | 2 | patterns.cs:130:13:130:18 | [match] { ... } | semmle.label | match | | patterns.cs:130:17:130:17 | 2 | patterns.cs:130:13:130:18 | [no-match] { ... } | semmle.label | no-match | | patterns.cs:130:23:130:23 | 2 | patterns.cs:130:13:130:23 | ... => ... | semmle.label | successor | -| patterns.cs:131:13:131:22 | (..., ...) | patterns.cs:123:10:123:21 | exit Expressions2 (abnormal) | semmle.label | exception(InvalidOperationException) | +| patterns.cs:131:13:131:22 | (..., ...) | patterns.cs:123:10:123:21 | exit Expressions2 (abnormal) | semmle.label | exception | | patterns.cs:131:13:131:22 | (..., ...) | patterns.cs:131:27:131:27 | 3 | semmle.label | match | | patterns.cs:131:13:131:27 | ... => ... | patterns.cs:126:17:132:9 | ... switch { ... } | semmle.label | successor | | patterns.cs:131:18:131:18 | Int32 x | patterns.cs:131:21:131:21 | _ | semmle.label | successor | @@ -162,9 +162,9 @@ | patterns.cs:136:17:143:13 | ... switch { ... } | patterns.cs:136:13:143:13 | ... = ... | semmle.label | successor | | patterns.cs:138:17:138:17 | 1 | patterns.cs:138:28:138:50 | object creation of type ArgumentException | semmle.label | match | | patterns.cs:138:17:138:17 | 1 | patterns.cs:139:17:139:17 | 2 | semmle.label | no-match | -| patterns.cs:138:22:138:50 | throw ... | patterns.cs:145:9:148:9 | [exception: ArgumentException] catch (...) {...} | semmle.label | exception(ArgumentException) | +| patterns.cs:138:22:138:50 | throw ... | patterns.cs:145:9:148:9 | [exception: ArgumentException] catch (...) {...} | semmle.label | exception | | patterns.cs:138:28:138:50 | object creation of type ArgumentException | patterns.cs:138:22:138:50 | throw ... | semmle.label | successor | -| patterns.cs:138:28:138:50 | object creation of type ArgumentException | patterns.cs:145:9:148:9 | [exception: Exception] catch (...) {...} | semmle.label | exception(Exception) | +| patterns.cs:138:28:138:50 | object creation of type ArgumentException | patterns.cs:145:9:148:9 | [exception: Exception] catch (...) {...} | semmle.label | exception | | patterns.cs:139:17:139:17 | 2 | patterns.cs:139:22:139:22 | 3 | semmle.label | match | | patterns.cs:139:17:139:17 | 2 | patterns.cs:140:17:140:24 | Object y | semmle.label | no-match | | patterns.cs:139:17:139:22 | ... => ... | patterns.cs:136:17:143:13 | ... switch { ... } | semmle.label | successor | @@ -187,16 +187,16 @@ | patterns.cs:142:17:142:24 | access to type MyStruct | patterns.cs:142:17:142:36 | [no-match] { ... } | semmle.label | no-match | | patterns.cs:142:17:142:24 | access to type MyStruct | patterns.cs:142:31:142:32 | 10 | semmle.label | match | | patterns.cs:142:17:142:36 | [match] { ... } | patterns.cs:142:41:142:41 | 6 | semmle.label | match | -| patterns.cs:142:17:142:36 | [match] { ... } | patterns.cs:145:9:148:9 | [exception: InvalidOperationException] catch (...) {...} | semmle.label | exception(InvalidOperationException) | -| patterns.cs:142:17:142:36 | [no-match] { ... } | patterns.cs:145:9:148:9 | [exception: InvalidOperationException] catch (...) {...} | semmle.label | exception(InvalidOperationException) | +| patterns.cs:142:17:142:36 | [match] { ... } | patterns.cs:145:9:148:9 | [exception: InvalidOperationException] catch (...) {...} | semmle.label | exception | +| patterns.cs:142:17:142:36 | [no-match] { ... } | patterns.cs:145:9:148:9 | [exception: InvalidOperationException] catch (...) {...} | semmle.label | exception | | patterns.cs:142:17:142:41 | ... => ... | patterns.cs:136:17:143:13 | ... switch { ... } | semmle.label | successor | | patterns.cs:142:26:142:34 | [match] { ... } | patterns.cs:142:17:142:36 | [match] { ... } | semmle.label | match | | patterns.cs:142:26:142:34 | [no-match] { ... } | patterns.cs:142:17:142:36 | [no-match] { ... } | semmle.label | no-match | | patterns.cs:142:31:142:32 | 10 | patterns.cs:142:26:142:34 | [match] { ... } | semmle.label | match | | patterns.cs:142:31:142:32 | 10 | patterns.cs:142:26:142:34 | [no-match] { ... } | semmle.label | no-match | | patterns.cs:142:41:142:41 | 6 | patterns.cs:142:17:142:41 | ... => ... | semmle.label | successor | -| patterns.cs:145:9:148:9 | [exception: ArgumentException] catch (...) {...} | patterns.cs:123:10:123:21 | exit Expressions2 (abnormal) | semmle.label | exception(ArgumentException) | -| patterns.cs:145:9:148:9 | [exception: Exception] catch (...) {...} | patterns.cs:123:10:123:21 | exit Expressions2 (abnormal) | semmle.label | exception(Exception) | +| patterns.cs:145:9:148:9 | [exception: ArgumentException] catch (...) {...} | patterns.cs:123:10:123:21 | exit Expressions2 (abnormal) | semmle.label | exception | +| patterns.cs:145:9:148:9 | [exception: Exception] catch (...) {...} | patterns.cs:123:10:123:21 | exit Expressions2 (abnormal) | semmle.label | exception | | patterns.cs:145:9:148:9 | [exception: Exception] catch (...) {...} | patterns.cs:145:41:145:42 | [exception: Exception] InvalidOperationException ex | semmle.label | match | | patterns.cs:145:9:148:9 | [exception: InvalidOperationException] catch (...) {...} | patterns.cs:145:41:145:42 | [exception: InvalidOperationException] InvalidOperationException ex | semmle.label | match | | patterns.cs:145:41:145:42 | [exception: Exception] InvalidOperationException ex | patterns.cs:146:9:148:9 | {...} | semmle.label | successor | diff --git a/csharp/ql/test/library-tests/dataflow/ssa/SsaDef.expected b/csharp/ql/test/library-tests/dataflow/ssa/SsaDef.expected index 8d0e2b8261db..7fa4581f5aae 100644 --- a/csharp/ql/test/library-tests/dataflow/ssa/SsaDef.expected +++ b/csharp/ql/test/library-tests/dataflow/ssa/SsaDef.expected @@ -35,7 +35,7 @@ | Capture.cs:248:36:248:36 | j | Capture.cs:251:13:251:17 | SSA def(j) | | Consistency.cs:7:25:7:25 | b | Consistency.cs:7:25:7:25 | SSA param(b) | | Consistency.cs:15:17:15:17 | i | Consistency.cs:15:17:15:21 | SSA def(i) | -| Consistency.cs:15:17:15:17 | i | Consistency.cs:15:17:15:21 | [finally: exception(Exception)] SSA def(i) | +| Consistency.cs:15:17:15:17 | i | Consistency.cs:15:17:15:21 | [finally: exception] SSA def(i) | | Consistency.cs:25:29:25:29 | c | Consistency.cs:25:29:25:29 | SSA def(c) | | Consistency.cs:26:13:26:19 | c.Field | Consistency.cs:25:29:25:29 | SSA qualifier def(c.Field) | | Consistency.cs:30:30:30:30 | c | Consistency.cs:32:9:32:29 | SSA def(c) | diff --git a/csharp/ql/test/library-tests/dataflow/ssa/SsaDefElement.expected b/csharp/ql/test/library-tests/dataflow/ssa/SsaDefElement.expected index 272db29e6f4f..02e4624488ea 100644 --- a/csharp/ql/test/library-tests/dataflow/ssa/SsaDefElement.expected +++ b/csharp/ql/test/library-tests/dataflow/ssa/SsaDefElement.expected @@ -35,7 +35,7 @@ | Capture.cs:251:13:251:17 | SSA def(j) | Capture.cs:251:13:251:17 | ... = ... | | Consistency.cs:7:25:7:25 | SSA param(b) | Consistency.cs:7:25:7:25 | b | | Consistency.cs:15:17:15:21 | SSA def(i) | Consistency.cs:15:17:15:21 | Int32 i = ... | -| Consistency.cs:15:17:15:21 | [finally: exception(Exception)] SSA def(i) | Consistency.cs:15:17:15:21 | Int32 i = ... | +| Consistency.cs:15:17:15:21 | [finally: exception] SSA def(i) | Consistency.cs:15:17:15:21 | Int32 i = ... | | Consistency.cs:25:29:25:29 | SSA def(c) | Consistency.cs:25:9:25:30 | call to method Out | | Consistency.cs:25:29:25:29 | SSA qualifier def(c.Field) | Consistency.cs:25:9:25:30 | call to method Out | | Consistency.cs:32:9:32:29 | SSA def(c) | Consistency.cs:32:9:32:29 | ... = ... | diff --git a/csharp/ql/test/library-tests/dataflow/ssa/SsaExplicitDef.expected b/csharp/ql/test/library-tests/dataflow/ssa/SsaExplicitDef.expected index 3dfc82d27ad0..4a2158c6736a 100644 --- a/csharp/ql/test/library-tests/dataflow/ssa/SsaExplicitDef.expected +++ b/csharp/ql/test/library-tests/dataflow/ssa/SsaExplicitDef.expected @@ -15,7 +15,7 @@ | Capture.cs:212:30:212:35 | exited | Capture.cs:212:30:212:71 | SSA def(exited) | Capture.cs:212:30:212:71 | EventHandler exited = ... | | Capture.cs:248:36:248:36 | j | Capture.cs:251:13:251:17 | SSA def(j) | Capture.cs:251:13:251:17 | ... = ... | | Consistency.cs:15:17:15:17 | i | Consistency.cs:15:17:15:21 | SSA def(i) | Consistency.cs:15:17:15:21 | Int32 i = ... | -| Consistency.cs:15:17:15:17 | i | Consistency.cs:15:17:15:21 | [finally: exception(Exception)] SSA def(i) | Consistency.cs:15:17:15:21 | Int32 i = ... | +| Consistency.cs:15:17:15:17 | i | Consistency.cs:15:17:15:21 | [finally: exception] SSA def(i) | Consistency.cs:15:17:15:21 | Int32 i = ... | | Consistency.cs:25:29:25:29 | c | Consistency.cs:25:29:25:29 | SSA def(c) | Consistency.cs:25:29:25:29 | Consistency c | | Consistency.cs:30:30:30:30 | c | Consistency.cs:32:9:32:29 | SSA def(c) | Consistency.cs:32:9:32:29 | ... = ... | | Consistency.cs:44:11:44:11 | s | Consistency.cs:44:11:44:11 | SSA def(s) | Consistency.cs:44:11:44:11 | S s | diff --git a/csharp/ql/test/library-tests/dataflow/ssa/SsaRead.expected b/csharp/ql/test/library-tests/dataflow/ssa/SsaRead.expected index 9daa4269711c..cc6a0e595465 100644 --- a/csharp/ql/test/library-tests/dataflow/ssa/SsaRead.expected +++ b/csharp/ql/test/library-tests/dataflow/ssa/SsaRead.expected @@ -35,7 +35,7 @@ | Capture.cs:212:30:212:35 | exited | Capture.cs:212:30:212:71 | SSA def(exited) | Capture.cs:213:29:213:34 | access to local variable exited | | Consistency.cs:7:25:7:25 | b | Consistency.cs:7:25:7:25 | SSA param(b) | Consistency.cs:11:17:11:17 | access to parameter b | | Consistency.cs:15:17:15:17 | i | Consistency.cs:15:17:15:21 | SSA def(i) | Consistency.cs:16:17:16:17 | access to local variable i | -| Consistency.cs:15:17:15:17 | i | Consistency.cs:15:17:15:21 | [finally: exception(Exception)] SSA def(i) | Consistency.cs:16:17:16:17 | access to local variable i | +| Consistency.cs:15:17:15:17 | i | Consistency.cs:15:17:15:21 | [finally: exception] SSA def(i) | Consistency.cs:16:17:16:17 | access to local variable i | | Consistency.cs:25:29:25:29 | c | Consistency.cs:25:29:25:29 | SSA def(c) | Consistency.cs:26:13:26:13 | access to local variable c | | Consistency.cs:25:29:25:29 | c | Consistency.cs:25:29:25:29 | SSA def(c) | Consistency.cs:27:13:27:13 | access to local variable c | | Consistency.cs:26:13:26:19 | c.Field | Consistency.cs:25:29:25:29 | SSA qualifier def(c.Field) | Consistency.cs:26:13:26:19 | access to field Field | diff --git a/csharp/ql/test/library-tests/dataflow/ssa/SsaUltimateDef.expected b/csharp/ql/test/library-tests/dataflow/ssa/SsaUltimateDef.expected index d0e6b073f01a..1219abdfe452 100644 --- a/csharp/ql/test/library-tests/dataflow/ssa/SsaUltimateDef.expected +++ b/csharp/ql/test/library-tests/dataflow/ssa/SsaUltimateDef.expected @@ -35,7 +35,7 @@ | Capture.cs:248:36:248:36 | j | Capture.cs:251:13:251:17 | SSA def(j) | Capture.cs:251:13:251:17 | SSA def(j) | | Consistency.cs:7:25:7:25 | b | Consistency.cs:7:25:7:25 | SSA param(b) | Consistency.cs:7:25:7:25 | SSA param(b) | | Consistency.cs:15:17:15:17 | i | Consistency.cs:15:17:15:21 | SSA def(i) | Consistency.cs:15:17:15:21 | SSA def(i) | -| Consistency.cs:15:17:15:17 | i | Consistency.cs:15:17:15:21 | [finally: exception(Exception)] SSA def(i) | Consistency.cs:15:17:15:21 | [finally: exception(Exception)] SSA def(i) | +| Consistency.cs:15:17:15:17 | i | Consistency.cs:15:17:15:21 | [finally: exception] SSA def(i) | Consistency.cs:15:17:15:21 | [finally: exception] SSA def(i) | | Consistency.cs:25:29:25:29 | c | Consistency.cs:25:29:25:29 | SSA def(c) | Consistency.cs:25:29:25:29 | SSA def(c) | | Consistency.cs:26:13:26:19 | c.Field | Consistency.cs:25:29:25:29 | SSA qualifier def(c.Field) | Consistency.cs:25:29:25:29 | SSA qualifier def(c.Field) | | Consistency.cs:30:30:30:30 | c | Consistency.cs:32:9:32:29 | SSA def(c) | Consistency.cs:32:9:32:29 | SSA def(c) | diff --git a/csharp/ql/test/library-tests/goto/Goto1.expected b/csharp/ql/test/library-tests/goto/Goto1.expected index e6c124726a3d..0baaf5ef723a 100644 --- a/csharp/ql/test/library-tests/goto/Goto1.expected +++ b/csharp/ql/test/library-tests/goto/Goto1.expected @@ -7,7 +7,7 @@ | goto.cs:5:5:20:5 | {...} | goto.cs:6:9:8:9 | {...} | semmle.label | successor | | goto.cs:6:9:8:9 | {...} | goto.cs:7:13:7:14 | s1: | semmle.label | successor | | goto.cs:7:13:7:14 | s1: | goto.cs:7:17:7:24 | goto ...; | semmle.label | successor | -| goto.cs:7:17:7:24 | goto ...; | goto.cs:9:9:9:10 | s2: | semmle.label | goto(s2) | +| goto.cs:7:17:7:24 | goto ...; | goto.cs:9:9:9:10 | s2: | semmle.label | goto | | goto.cs:9:9:9:10 | s2: | goto.cs:9:13:9:27 | ... ...; | semmle.label | successor | | goto.cs:9:13:9:27 | ... ...; | goto.cs:9:24:9:26 | "5" | semmle.label | successor | | goto.cs:9:20:9:26 | String s = ... | goto.cs:10:9:18:9 | switch (...) {...} | semmle.label | successor | @@ -18,24 +18,24 @@ | goto.cs:12:18:12:21 | null | goto.cs:12:24:12:25 | s3: | semmle.label | match | | goto.cs:12:18:12:21 | null | goto.cs:13:13:13:21 | case ...: | semmle.label | no-match | | goto.cs:12:24:12:25 | s3: | goto.cs:12:38:12:40 | "1" | semmle.label | successor | -| goto.cs:12:28:12:41 | goto case ...; | goto.cs:13:13:13:21 | case ...: | semmle.label | goto(1) | +| goto.cs:12:28:12:41 | goto case ...; | goto.cs:13:13:13:21 | case ...: | semmle.label | goto | | goto.cs:12:38:12:40 | "1" | goto.cs:12:28:12:41 | goto case ...; | semmle.label | successor | | goto.cs:13:13:13:21 | case ...: | goto.cs:13:18:13:20 | "1" | semmle.label | successor | | goto.cs:13:18:13:20 | "1" | goto.cs:13:23:13:24 | s4: | semmle.label | match | | goto.cs:13:18:13:20 | "1" | goto.cs:14:13:14:21 | case ...: | semmle.label | no-match | | goto.cs:13:23:13:24 | s4: | goto.cs:13:37:13:39 | "2" | semmle.label | successor | -| goto.cs:13:27:13:40 | goto case ...; | goto.cs:14:13:14:21 | case ...: | semmle.label | goto(2) | +| goto.cs:13:27:13:40 | goto case ...; | goto.cs:14:13:14:21 | case ...: | semmle.label | goto | | goto.cs:13:37:13:39 | "2" | goto.cs:13:27:13:40 | goto case ...; | semmle.label | successor | | goto.cs:14:13:14:21 | case ...: | goto.cs:14:18:14:20 | "2" | semmle.label | successor | | goto.cs:14:18:14:20 | "2" | goto.cs:14:23:14:24 | s5: | semmle.label | match | | goto.cs:14:18:14:20 | "2" | goto.cs:15:13:15:21 | case ...: | semmle.label | no-match | | goto.cs:14:23:14:24 | s5: | goto.cs:14:27:14:34 | goto ...; | semmle.label | successor | -| goto.cs:14:27:14:34 | goto ...; | goto.cs:9:9:9:10 | s2: | semmle.label | goto(s2) | +| goto.cs:14:27:14:34 | goto ...; | goto.cs:9:9:9:10 | s2: | semmle.label | goto | | goto.cs:15:13:15:21 | case ...: | goto.cs:15:18:15:20 | "3" | semmle.label | successor | | goto.cs:15:18:15:20 | "3" | goto.cs:15:23:15:24 | s6: | semmle.label | match | | goto.cs:15:18:15:20 | "3" | goto.cs:16:13:16:21 | case ...: | semmle.label | no-match | | goto.cs:15:23:15:24 | s6: | goto.cs:15:27:15:39 | goto default; | semmle.label | successor | -| goto.cs:15:27:15:39 | goto default; | goto.cs:17:13:17:20 | default: | semmle.label | goto(default) | +| goto.cs:15:27:15:39 | goto default; | goto.cs:17:13:17:20 | default: | semmle.label | goto | | goto.cs:16:13:16:21 | case ...: | goto.cs:16:18:16:20 | "4" | semmle.label | successor | | goto.cs:16:18:16:20 | "4" | goto.cs:16:23:16:24 | s7: | semmle.label | match | | goto.cs:16:18:16:20 | "4" | goto.cs:17:13:17:20 | default: | semmle.label | no-match | @@ -43,7 +43,7 @@ | goto.cs:16:27:16:32 | break; | goto.cs:19:9:19:10 | s9: | semmle.label | break | | goto.cs:17:13:17:20 | default: | goto.cs:17:22:17:23 | s8: | semmle.label | successor | | goto.cs:17:22:17:23 | s8: | goto.cs:17:36:17:39 | null | semmle.label | successor | -| goto.cs:17:26:17:40 | goto case ...; | goto.cs:12:13:12:22 | case ...: | semmle.label | goto(null) | +| goto.cs:17:26:17:40 | goto case ...; | goto.cs:12:13:12:22 | case ...: | semmle.label | goto | | goto.cs:17:36:17:39 | null | goto.cs:17:26:17:40 | goto case ...; | semmle.label | successor | | goto.cs:19:9:19:10 | s9: | goto.cs:19:12:19:12 | ; | semmle.label | successor | | goto.cs:19:12:19:12 | ; | goto.cs:4:17:4:20 | exit Main (normal) | semmle.label | successor | diff --git a/ruby/ql/test/library-tests/controlflow/graph/BasicBlocks.expected b/ruby/ql/test/library-tests/controlflow/graph/BasicBlocks.expected index cafb6267eb9b..35b18b7132b0 100644 --- a/ruby/ql/test/library-tests/controlflow/graph/BasicBlocks.expected +++ b/ruby/ql/test/library-tests/controlflow/graph/BasicBlocks.expected @@ -6,10 +6,10 @@ dominates | break_ensure.rb:1:1:11:3 | enter m1 | break_ensure.rb:3:5:5:7 | if ... | | break_ensure.rb:1:1:11:3 | enter m1 | break_ensure.rb:3:8:3:8 | x | | break_ensure.rb:1:1:11:3 | enter m1 | break_ensure.rb:4:7:4:11 | break | -| break_ensure.rb:1:1:11:3 | enter m1 | break_ensure.rb:8:3:10:5 | [ensure: raise] if ... | +| break_ensure.rb:1:1:11:3 | enter m1 | break_ensure.rb:8:3:10:5 | [ensure: exception] if ... | | break_ensure.rb:1:1:11:3 | enter m1 | break_ensure.rb:8:3:10:5 | if ... | -| break_ensure.rb:1:1:11:3 | enter m1 | break_ensure.rb:8:6:8:13 | [ensure: raise] self | -| break_ensure.rb:1:1:11:3 | enter m1 | break_ensure.rb:9:5:9:23 | [ensure: raise] self | +| break_ensure.rb:1:1:11:3 | enter m1 | break_ensure.rb:8:6:8:13 | [ensure: exception] self | +| break_ensure.rb:1:1:11:3 | enter m1 | break_ensure.rb:9:5:9:23 | [ensure: exception] self | | break_ensure.rb:1:1:11:3 | enter m1 | break_ensure.rb:9:5:9:23 | self | | break_ensure.rb:1:1:11:3 | exit m1 | break_ensure.rb:1:1:11:3 | exit m1 | | break_ensure.rb:1:1:56:4 | enter break_ensure.rb | break_ensure.rb:1:1:56:4 | enter break_ensure.rb | @@ -22,22 +22,22 @@ dominates | break_ensure.rb:2:9:2:9 | x | break_ensure.rb:3:5:5:7 | if ... | | break_ensure.rb:2:9:2:9 | x | break_ensure.rb:3:8:3:8 | x | | break_ensure.rb:2:9:2:9 | x | break_ensure.rb:4:7:4:11 | break | -| break_ensure.rb:2:9:2:9 | x | break_ensure.rb:8:3:10:5 | [ensure: raise] if ... | +| break_ensure.rb:2:9:2:9 | x | break_ensure.rb:8:3:10:5 | [ensure: exception] if ... | | break_ensure.rb:2:9:2:9 | x | break_ensure.rb:8:3:10:5 | if ... | -| break_ensure.rb:2:9:2:9 | x | break_ensure.rb:8:6:8:13 | [ensure: raise] self | -| break_ensure.rb:2:9:2:9 | x | break_ensure.rb:9:5:9:23 | [ensure: raise] self | +| break_ensure.rb:2:9:2:9 | x | break_ensure.rb:8:6:8:13 | [ensure: exception] self | +| break_ensure.rb:2:9:2:9 | x | break_ensure.rb:9:5:9:23 | [ensure: exception] self | | break_ensure.rb:2:9:2:9 | x | break_ensure.rb:9:5:9:23 | self | | break_ensure.rb:3:5:5:7 | if ... | break_ensure.rb:3:5:5:7 | if ... | | break_ensure.rb:3:8:3:8 | x | break_ensure.rb:3:5:5:7 | if ... | | break_ensure.rb:3:8:3:8 | x | break_ensure.rb:3:8:3:8 | x | | break_ensure.rb:3:8:3:8 | x | break_ensure.rb:4:7:4:11 | break | | break_ensure.rb:4:7:4:11 | break | break_ensure.rb:4:7:4:11 | break | -| break_ensure.rb:8:3:10:5 | [ensure: raise] if ... | break_ensure.rb:8:3:10:5 | [ensure: raise] if ... | +| break_ensure.rb:8:3:10:5 | [ensure: exception] if ... | break_ensure.rb:8:3:10:5 | [ensure: exception] if ... | | break_ensure.rb:8:3:10:5 | if ... | break_ensure.rb:8:3:10:5 | if ... | -| break_ensure.rb:8:6:8:13 | [ensure: raise] self | break_ensure.rb:8:3:10:5 | [ensure: raise] if ... | -| break_ensure.rb:8:6:8:13 | [ensure: raise] self | break_ensure.rb:8:6:8:13 | [ensure: raise] self | -| break_ensure.rb:8:6:8:13 | [ensure: raise] self | break_ensure.rb:9:5:9:23 | [ensure: raise] self | -| break_ensure.rb:9:5:9:23 | [ensure: raise] self | break_ensure.rb:9:5:9:23 | [ensure: raise] self | +| break_ensure.rb:8:6:8:13 | [ensure: exception] self | break_ensure.rb:8:3:10:5 | [ensure: exception] if ... | +| break_ensure.rb:8:6:8:13 | [ensure: exception] self | break_ensure.rb:8:6:8:13 | [ensure: exception] self | +| break_ensure.rb:8:6:8:13 | [ensure: exception] self | break_ensure.rb:9:5:9:23 | [ensure: exception] self | +| break_ensure.rb:9:5:9:23 | [ensure: exception] self | break_ensure.rb:9:5:9:23 | [ensure: exception] self | | break_ensure.rb:9:5:9:23 | self | break_ensure.rb:9:5:9:23 | self | | break_ensure.rb:13:1:25:3 | enter m2 | break_ensure.rb:13:1:25:3 | enter m2 | | break_ensure.rb:13:1:25:3 | enter m2 | break_ensure.rb:14:3:24:5 | while ... | @@ -46,11 +46,11 @@ dominates | break_ensure.rb:13:1:25:3 | enter m2 | break_ensure.rb:16:10:16:10 | x | | break_ensure.rb:13:1:25:3 | enter m2 | break_ensure.rb:17:9:17:13 | break | | break_ensure.rb:13:1:25:3 | enter m2 | break_ensure.rb:20:7:22:9 | [ensure: break] if ... | -| break_ensure.rb:13:1:25:3 | enter m2 | break_ensure.rb:20:7:22:9 | [ensure: raise] if ... | +| break_ensure.rb:13:1:25:3 | enter m2 | break_ensure.rb:20:7:22:9 | [ensure: exception] if ... | | break_ensure.rb:13:1:25:3 | enter m2 | break_ensure.rb:20:7:22:9 | if ... | -| break_ensure.rb:13:1:25:3 | enter m2 | break_ensure.rb:20:10:20:10 | [ensure: raise] y | +| break_ensure.rb:13:1:25:3 | enter m2 | break_ensure.rb:20:10:20:10 | [ensure: exception] y | | break_ensure.rb:13:1:25:3 | enter m2 | break_ensure.rb:21:9:21:20 | [ensure: break] self | -| break_ensure.rb:13:1:25:3 | enter m2 | break_ensure.rb:21:9:21:20 | [ensure: raise] self | +| break_ensure.rb:13:1:25:3 | enter m2 | break_ensure.rb:21:9:21:20 | [ensure: exception] self | | break_ensure.rb:13:1:25:3 | enter m2 | break_ensure.rb:21:9:21:20 | self | | break_ensure.rb:14:3:24:5 | while ... | break_ensure.rb:14:3:24:5 | while ... | | break_ensure.rb:14:9:14:9 | x | break_ensure.rb:14:3:24:5 | while ... | @@ -59,11 +59,11 @@ dominates | break_ensure.rb:14:9:14:9 | x | break_ensure.rb:16:10:16:10 | x | | break_ensure.rb:14:9:14:9 | x | break_ensure.rb:17:9:17:13 | break | | break_ensure.rb:14:9:14:9 | x | break_ensure.rb:20:7:22:9 | [ensure: break] if ... | -| break_ensure.rb:14:9:14:9 | x | break_ensure.rb:20:7:22:9 | [ensure: raise] if ... | +| break_ensure.rb:14:9:14:9 | x | break_ensure.rb:20:7:22:9 | [ensure: exception] if ... | | break_ensure.rb:14:9:14:9 | x | break_ensure.rb:20:7:22:9 | if ... | -| break_ensure.rb:14:9:14:9 | x | break_ensure.rb:20:10:20:10 | [ensure: raise] y | +| break_ensure.rb:14:9:14:9 | x | break_ensure.rb:20:10:20:10 | [ensure: exception] y | | break_ensure.rb:14:9:14:9 | x | break_ensure.rb:21:9:21:20 | [ensure: break] self | -| break_ensure.rb:14:9:14:9 | x | break_ensure.rb:21:9:21:20 | [ensure: raise] self | +| break_ensure.rb:14:9:14:9 | x | break_ensure.rb:21:9:21:20 | [ensure: exception] self | | break_ensure.rb:14:9:14:9 | x | break_ensure.rb:21:9:21:20 | self | | break_ensure.rb:16:7:18:9 | if ... | break_ensure.rb:16:7:18:9 | if ... | | break_ensure.rb:16:7:18:9 | if ... | break_ensure.rb:20:7:22:9 | if ... | @@ -72,42 +72,42 @@ dominates | break_ensure.rb:16:10:16:10 | x | break_ensure.rb:16:10:16:10 | x | | break_ensure.rb:16:10:16:10 | x | break_ensure.rb:17:9:17:13 | break | | break_ensure.rb:16:10:16:10 | x | break_ensure.rb:20:7:22:9 | [ensure: break] if ... | -| break_ensure.rb:16:10:16:10 | x | break_ensure.rb:20:7:22:9 | [ensure: raise] if ... | +| break_ensure.rb:16:10:16:10 | x | break_ensure.rb:20:7:22:9 | [ensure: exception] if ... | | break_ensure.rb:16:10:16:10 | x | break_ensure.rb:20:7:22:9 | if ... | -| break_ensure.rb:16:10:16:10 | x | break_ensure.rb:20:10:20:10 | [ensure: raise] y | +| break_ensure.rb:16:10:16:10 | x | break_ensure.rb:20:10:20:10 | [ensure: exception] y | | break_ensure.rb:16:10:16:10 | x | break_ensure.rb:21:9:21:20 | [ensure: break] self | -| break_ensure.rb:16:10:16:10 | x | break_ensure.rb:21:9:21:20 | [ensure: raise] self | +| break_ensure.rb:16:10:16:10 | x | break_ensure.rb:21:9:21:20 | [ensure: exception] self | | break_ensure.rb:16:10:16:10 | x | break_ensure.rb:21:9:21:20 | self | | break_ensure.rb:17:9:17:13 | break | break_ensure.rb:17:9:17:13 | break | | break_ensure.rb:17:9:17:13 | break | break_ensure.rb:20:7:22:9 | [ensure: break] if ... | | break_ensure.rb:17:9:17:13 | break | break_ensure.rb:21:9:21:20 | [ensure: break] self | | break_ensure.rb:20:7:22:9 | [ensure: break] if ... | break_ensure.rb:20:7:22:9 | [ensure: break] if ... | -| break_ensure.rb:20:7:22:9 | [ensure: raise] if ... | break_ensure.rb:20:7:22:9 | [ensure: raise] if ... | +| break_ensure.rb:20:7:22:9 | [ensure: exception] if ... | break_ensure.rb:20:7:22:9 | [ensure: exception] if ... | | break_ensure.rb:20:7:22:9 | if ... | break_ensure.rb:20:7:22:9 | if ... | -| break_ensure.rb:20:10:20:10 | [ensure: raise] y | break_ensure.rb:20:7:22:9 | [ensure: raise] if ... | -| break_ensure.rb:20:10:20:10 | [ensure: raise] y | break_ensure.rb:20:10:20:10 | [ensure: raise] y | -| break_ensure.rb:20:10:20:10 | [ensure: raise] y | break_ensure.rb:21:9:21:20 | [ensure: raise] self | +| break_ensure.rb:20:10:20:10 | [ensure: exception] y | break_ensure.rb:20:7:22:9 | [ensure: exception] if ... | +| break_ensure.rb:20:10:20:10 | [ensure: exception] y | break_ensure.rb:20:10:20:10 | [ensure: exception] y | +| break_ensure.rb:20:10:20:10 | [ensure: exception] y | break_ensure.rb:21:9:21:20 | [ensure: exception] self | | break_ensure.rb:21:9:21:20 | [ensure: break] self | break_ensure.rb:21:9:21:20 | [ensure: break] self | -| break_ensure.rb:21:9:21:20 | [ensure: raise] self | break_ensure.rb:21:9:21:20 | [ensure: raise] self | +| break_ensure.rb:21:9:21:20 | [ensure: exception] self | break_ensure.rb:21:9:21:20 | [ensure: exception] self | | break_ensure.rb:21:9:21:20 | self | break_ensure.rb:21:9:21:20 | self | | break_ensure.rb:27:1:42:3 | enter m3 | break_ensure.rb:27:1:42:3 | enter m3 | | break_ensure.rb:27:1:42:3 | enter m3 | break_ensure.rb:27:1:42:3 | exit m3 | | break_ensure.rb:27:1:42:3 | enter m3 | break_ensure.rb:27:1:42:3 | exit m3 (normal) | | break_ensure.rb:27:1:42:3 | enter m3 | break_ensure.rb:29:5:31:7 | if ... | | break_ensure.rb:27:1:42:3 | enter m3 | break_ensure.rb:30:7:30:12 | return | -| break_ensure.rb:27:1:42:3 | enter m3 | break_ensure.rb:33:5:39:7 | [ensure: raise] while ... | +| break_ensure.rb:27:1:42:3 | enter m3 | break_ensure.rb:33:5:39:7 | [ensure: exception] while ... | | break_ensure.rb:27:1:42:3 | enter m3 | break_ensure.rb:33:5:39:7 | [ensure: return] while ... | | break_ensure.rb:27:1:42:3 | enter m3 | break_ensure.rb:33:5:39:7 | while ... | -| break_ensure.rb:27:1:42:3 | enter m3 | break_ensure.rb:33:11:33:11 | [ensure: raise] y | +| break_ensure.rb:27:1:42:3 | enter m3 | break_ensure.rb:33:11:33:11 | [ensure: exception] y | | break_ensure.rb:27:1:42:3 | enter m3 | break_ensure.rb:33:11:33:11 | [ensure: return] y | | break_ensure.rb:27:1:42:3 | enter m3 | break_ensure.rb:33:11:33:11 | y | -| break_ensure.rb:27:1:42:3 | enter m3 | break_ensure.rb:35:9:37:11 | [ensure: raise] if ... | +| break_ensure.rb:27:1:42:3 | enter m3 | break_ensure.rb:35:9:37:11 | [ensure: exception] if ... | | break_ensure.rb:27:1:42:3 | enter m3 | break_ensure.rb:35:9:37:11 | [ensure: return] if ... | | break_ensure.rb:27:1:42:3 | enter m3 | break_ensure.rb:35:9:37:11 | if ... | -| break_ensure.rb:27:1:42:3 | enter m3 | break_ensure.rb:35:12:35:12 | [ensure: raise] x | +| break_ensure.rb:27:1:42:3 | enter m3 | break_ensure.rb:35:12:35:12 | [ensure: exception] x | | break_ensure.rb:27:1:42:3 | enter m3 | break_ensure.rb:35:12:35:12 | [ensure: return] x | | break_ensure.rb:27:1:42:3 | enter m3 | break_ensure.rb:35:12:35:12 | x | -| break_ensure.rb:27:1:42:3 | enter m3 | break_ensure.rb:36:11:36:15 | [ensure: raise] break | +| break_ensure.rb:27:1:42:3 | enter m3 | break_ensure.rb:36:11:36:15 | [ensure: exception] break | | break_ensure.rb:27:1:42:3 | enter m3 | break_ensure.rb:36:11:36:15 | [ensure: return] break | | break_ensure.rb:27:1:42:3 | enter m3 | break_ensure.rb:36:11:36:15 | break | | break_ensure.rb:27:1:42:3 | exit m3 | break_ensure.rb:27:1:42:3 | exit m3 | @@ -124,14 +124,14 @@ dominates | break_ensure.rb:30:7:30:12 | return | break_ensure.rb:35:9:37:11 | [ensure: return] if ... | | break_ensure.rb:30:7:30:12 | return | break_ensure.rb:35:12:35:12 | [ensure: return] x | | break_ensure.rb:30:7:30:12 | return | break_ensure.rb:36:11:36:15 | [ensure: return] break | -| break_ensure.rb:33:5:39:7 | [ensure: raise] while ... | break_ensure.rb:33:5:39:7 | [ensure: raise] while ... | +| break_ensure.rb:33:5:39:7 | [ensure: exception] while ... | break_ensure.rb:33:5:39:7 | [ensure: exception] while ... | | break_ensure.rb:33:5:39:7 | [ensure: return] while ... | break_ensure.rb:33:5:39:7 | [ensure: return] while ... | | break_ensure.rb:33:5:39:7 | while ... | break_ensure.rb:33:5:39:7 | while ... | -| break_ensure.rb:33:11:33:11 | [ensure: raise] y | break_ensure.rb:33:5:39:7 | [ensure: raise] while ... | -| break_ensure.rb:33:11:33:11 | [ensure: raise] y | break_ensure.rb:33:11:33:11 | [ensure: raise] y | -| break_ensure.rb:33:11:33:11 | [ensure: raise] y | break_ensure.rb:35:9:37:11 | [ensure: raise] if ... | -| break_ensure.rb:33:11:33:11 | [ensure: raise] y | break_ensure.rb:35:12:35:12 | [ensure: raise] x | -| break_ensure.rb:33:11:33:11 | [ensure: raise] y | break_ensure.rb:36:11:36:15 | [ensure: raise] break | +| break_ensure.rb:33:11:33:11 | [ensure: exception] y | break_ensure.rb:33:5:39:7 | [ensure: exception] while ... | +| break_ensure.rb:33:11:33:11 | [ensure: exception] y | break_ensure.rb:33:11:33:11 | [ensure: exception] y | +| break_ensure.rb:33:11:33:11 | [ensure: exception] y | break_ensure.rb:35:9:37:11 | [ensure: exception] if ... | +| break_ensure.rb:33:11:33:11 | [ensure: exception] y | break_ensure.rb:35:12:35:12 | [ensure: exception] x | +| break_ensure.rb:33:11:33:11 | [ensure: exception] y | break_ensure.rb:36:11:36:15 | [ensure: exception] break | | break_ensure.rb:33:11:33:11 | [ensure: return] y | break_ensure.rb:33:5:39:7 | [ensure: return] while ... | | break_ensure.rb:33:11:33:11 | [ensure: return] y | break_ensure.rb:33:11:33:11 | [ensure: return] y | | break_ensure.rb:33:11:33:11 | [ensure: return] y | break_ensure.rb:35:9:37:11 | [ensure: return] if ... | @@ -142,19 +142,19 @@ dominates | break_ensure.rb:33:11:33:11 | y | break_ensure.rb:35:9:37:11 | if ... | | break_ensure.rb:33:11:33:11 | y | break_ensure.rb:35:12:35:12 | x | | break_ensure.rb:33:11:33:11 | y | break_ensure.rb:36:11:36:15 | break | -| break_ensure.rb:35:9:37:11 | [ensure: raise] if ... | break_ensure.rb:35:9:37:11 | [ensure: raise] if ... | +| break_ensure.rb:35:9:37:11 | [ensure: exception] if ... | break_ensure.rb:35:9:37:11 | [ensure: exception] if ... | | break_ensure.rb:35:9:37:11 | [ensure: return] if ... | break_ensure.rb:35:9:37:11 | [ensure: return] if ... | | break_ensure.rb:35:9:37:11 | if ... | break_ensure.rb:35:9:37:11 | if ... | -| break_ensure.rb:35:12:35:12 | [ensure: raise] x | break_ensure.rb:35:9:37:11 | [ensure: raise] if ... | -| break_ensure.rb:35:12:35:12 | [ensure: raise] x | break_ensure.rb:35:12:35:12 | [ensure: raise] x | -| break_ensure.rb:35:12:35:12 | [ensure: raise] x | break_ensure.rb:36:11:36:15 | [ensure: raise] break | +| break_ensure.rb:35:12:35:12 | [ensure: exception] x | break_ensure.rb:35:9:37:11 | [ensure: exception] if ... | +| break_ensure.rb:35:12:35:12 | [ensure: exception] x | break_ensure.rb:35:12:35:12 | [ensure: exception] x | +| break_ensure.rb:35:12:35:12 | [ensure: exception] x | break_ensure.rb:36:11:36:15 | [ensure: exception] break | | break_ensure.rb:35:12:35:12 | [ensure: return] x | break_ensure.rb:35:9:37:11 | [ensure: return] if ... | | break_ensure.rb:35:12:35:12 | [ensure: return] x | break_ensure.rb:35:12:35:12 | [ensure: return] x | | break_ensure.rb:35:12:35:12 | [ensure: return] x | break_ensure.rb:36:11:36:15 | [ensure: return] break | | break_ensure.rb:35:12:35:12 | x | break_ensure.rb:35:9:37:11 | if ... | | break_ensure.rb:35:12:35:12 | x | break_ensure.rb:35:12:35:12 | x | | break_ensure.rb:35:12:35:12 | x | break_ensure.rb:36:11:36:15 | break | -| break_ensure.rb:36:11:36:15 | [ensure: raise] break | break_ensure.rb:36:11:36:15 | [ensure: raise] break | +| break_ensure.rb:36:11:36:15 | [ensure: exception] break | break_ensure.rb:36:11:36:15 | [ensure: exception] break | | break_ensure.rb:36:11:36:15 | [ensure: return] break | break_ensure.rb:36:11:36:15 | [ensure: return] break | | break_ensure.rb:36:11:36:15 | break | break_ensure.rb:36:11:36:15 | break | | break_ensure.rb:44:1:56:3 | enter m4 | break_ensure.rb:44:1:56:3 | enter m4 | @@ -163,41 +163,41 @@ dominates | break_ensure.rb:44:1:56:3 | enter m4 | break_ensure.rb:47:7:49:9 | if ... | | break_ensure.rb:44:1:56:3 | enter m4 | break_ensure.rb:47:10:47:10 | x | | break_ensure.rb:44:1:56:3 | enter m4 | break_ensure.rb:48:9:48:16 | self | -| break_ensure.rb:44:1:56:3 | enter m4 | break_ensure.rb:51:7:53:9 | [ensure: raise] if ... | +| break_ensure.rb:44:1:56:3 | enter m4 | break_ensure.rb:51:7:53:9 | [ensure: exception] if ... | | break_ensure.rb:44:1:56:3 | enter m4 | break_ensure.rb:51:7:53:9 | if ... | -| break_ensure.rb:44:1:56:3 | enter m4 | break_ensure.rb:51:10:51:10 | [ensure: raise] x | +| break_ensure.rb:44:1:56:3 | enter m4 | break_ensure.rb:51:10:51:10 | [ensure: exception] x | | break_ensure.rb:44:1:56:3 | enter m4 | break_ensure.rb:52:15:52:16 | 10 | -| break_ensure.rb:44:1:56:3 | enter m4 | break_ensure.rb:52:15:52:16 | [ensure: raise] 10 | +| break_ensure.rb:44:1:56:3 | enter m4 | break_ensure.rb:52:15:52:16 | [ensure: exception] 10 | | break_ensure.rb:45:3:55:5 | while ... | break_ensure.rb:45:3:55:5 | while ... | | break_ensure.rb:45:9:45:9 | x | break_ensure.rb:45:3:55:5 | while ... | | break_ensure.rb:45:9:45:9 | x | break_ensure.rb:45:9:45:9 | x | | break_ensure.rb:45:9:45:9 | x | break_ensure.rb:47:7:49:9 | if ... | | break_ensure.rb:45:9:45:9 | x | break_ensure.rb:47:10:47:10 | x | | break_ensure.rb:45:9:45:9 | x | break_ensure.rb:48:9:48:16 | self | -| break_ensure.rb:45:9:45:9 | x | break_ensure.rb:51:7:53:9 | [ensure: raise] if ... | +| break_ensure.rb:45:9:45:9 | x | break_ensure.rb:51:7:53:9 | [ensure: exception] if ... | | break_ensure.rb:45:9:45:9 | x | break_ensure.rb:51:7:53:9 | if ... | -| break_ensure.rb:45:9:45:9 | x | break_ensure.rb:51:10:51:10 | [ensure: raise] x | +| break_ensure.rb:45:9:45:9 | x | break_ensure.rb:51:10:51:10 | [ensure: exception] x | | break_ensure.rb:45:9:45:9 | x | break_ensure.rb:52:15:52:16 | 10 | -| break_ensure.rb:45:9:45:9 | x | break_ensure.rb:52:15:52:16 | [ensure: raise] 10 | +| break_ensure.rb:45:9:45:9 | x | break_ensure.rb:52:15:52:16 | [ensure: exception] 10 | | break_ensure.rb:47:7:49:9 | if ... | break_ensure.rb:47:7:49:9 | if ... | | break_ensure.rb:47:7:49:9 | if ... | break_ensure.rb:51:7:53:9 | if ... | | break_ensure.rb:47:7:49:9 | if ... | break_ensure.rb:52:15:52:16 | 10 | | break_ensure.rb:47:10:47:10 | x | break_ensure.rb:47:7:49:9 | if ... | | break_ensure.rb:47:10:47:10 | x | break_ensure.rb:47:10:47:10 | x | | break_ensure.rb:47:10:47:10 | x | break_ensure.rb:48:9:48:16 | self | -| break_ensure.rb:47:10:47:10 | x | break_ensure.rb:51:7:53:9 | [ensure: raise] if ... | +| break_ensure.rb:47:10:47:10 | x | break_ensure.rb:51:7:53:9 | [ensure: exception] if ... | | break_ensure.rb:47:10:47:10 | x | break_ensure.rb:51:7:53:9 | if ... | -| break_ensure.rb:47:10:47:10 | x | break_ensure.rb:51:10:51:10 | [ensure: raise] x | +| break_ensure.rb:47:10:47:10 | x | break_ensure.rb:51:10:51:10 | [ensure: exception] x | | break_ensure.rb:47:10:47:10 | x | break_ensure.rb:52:15:52:16 | 10 | -| break_ensure.rb:47:10:47:10 | x | break_ensure.rb:52:15:52:16 | [ensure: raise] 10 | +| break_ensure.rb:47:10:47:10 | x | break_ensure.rb:52:15:52:16 | [ensure: exception] 10 | | break_ensure.rb:48:9:48:16 | self | break_ensure.rb:48:9:48:16 | self | -| break_ensure.rb:51:7:53:9 | [ensure: raise] if ... | break_ensure.rb:51:7:53:9 | [ensure: raise] if ... | +| break_ensure.rb:51:7:53:9 | [ensure: exception] if ... | break_ensure.rb:51:7:53:9 | [ensure: exception] if ... | | break_ensure.rb:51:7:53:9 | if ... | break_ensure.rb:51:7:53:9 | if ... | -| break_ensure.rb:51:10:51:10 | [ensure: raise] x | break_ensure.rb:51:7:53:9 | [ensure: raise] if ... | -| break_ensure.rb:51:10:51:10 | [ensure: raise] x | break_ensure.rb:51:10:51:10 | [ensure: raise] x | -| break_ensure.rb:51:10:51:10 | [ensure: raise] x | break_ensure.rb:52:15:52:16 | [ensure: raise] 10 | +| break_ensure.rb:51:10:51:10 | [ensure: exception] x | break_ensure.rb:51:7:53:9 | [ensure: exception] if ... | +| break_ensure.rb:51:10:51:10 | [ensure: exception] x | break_ensure.rb:51:10:51:10 | [ensure: exception] x | +| break_ensure.rb:51:10:51:10 | [ensure: exception] x | break_ensure.rb:52:15:52:16 | [ensure: exception] 10 | | break_ensure.rb:52:15:52:16 | 10 | break_ensure.rb:52:15:52:16 | 10 | -| break_ensure.rb:52:15:52:16 | [ensure: raise] 10 | break_ensure.rb:52:15:52:16 | [ensure: raise] 10 | +| break_ensure.rb:52:15:52:16 | [ensure: exception] 10 | break_ensure.rb:52:15:52:16 | [ensure: exception] 10 | | case.rb:1:1:6:3 | enter if_in_case | case.rb:1:1:6:3 | enter if_in_case | | case.rb:1:1:6:3 | enter if_in_case | case.rb:2:3:5:5 | case ... | | case.rb:1:1:6:3 | enter if_in_case | case.rb:3:5:3:42 | [match] when ... | @@ -2047,7 +2047,7 @@ dominates | raise.rb:68:1:77:3 | enter m7 | raise.rb:71:3:72:18 | elsif ... | | raise.rb:68:1:77:3 | enter m7 | raise.rb:71:9:71:9 | x | | raise.rb:68:1:77:3 | enter m7 | raise.rb:72:13:72:17 | x < 0 | -| raise.rb:68:1:77:3 | enter m7 | raise.rb:76:3:76:15 | [ensure: raise] self | +| raise.rb:68:1:77:3 | enter m7 | raise.rb:76:3:76:15 | [ensure: exception] self | | raise.rb:68:1:77:3 | enter m7 | raise.rb:76:3:76:15 | self | | raise.rb:68:1:77:3 | exit m7 | raise.rb:68:1:77:3 | exit m7 | | raise.rb:68:1:77:3 | exit m7 (normal) | raise.rb:68:1:77:3 | exit m7 (normal) | @@ -2060,7 +2060,7 @@ dominates | raise.rb:71:9:71:9 | x | raise.rb:72:13:72:17 | x < 0 | | raise.rb:71:9:71:9 | x | raise.rb:76:3:76:15 | self | | raise.rb:72:13:72:17 | x < 0 | raise.rb:72:13:72:17 | x < 0 | -| raise.rb:76:3:76:15 | [ensure: raise] self | raise.rb:76:3:76:15 | [ensure: raise] self | +| raise.rb:76:3:76:15 | [ensure: exception] self | raise.rb:76:3:76:15 | [ensure: exception] self | | raise.rb:76:3:76:15 | self | raise.rb:76:3:76:15 | self | | raise.rb:79:1:92:3 | enter m8 | raise.rb:79:1:92:3 | enter m8 | | raise.rb:79:1:92:3 | enter m8 | raise.rb:79:1:92:3 | exit m8 | @@ -2069,7 +2069,7 @@ dominates | raise.rb:79:1:92:3 | enter m8 | raise.rb:84:5:85:20 | elsif ... | | raise.rb:79:1:92:3 | enter m8 | raise.rb:84:11:84:11 | x | | raise.rb:79:1:92:3 | enter m8 | raise.rb:85:15:85:19 | x < 0 | -| raise.rb:79:1:92:3 | enter m8 | raise.rb:89:5:89:17 | [ensure: raise] self | +| raise.rb:79:1:92:3 | enter m8 | raise.rb:89:5:89:17 | [ensure: exception] self | | raise.rb:79:1:92:3 | enter m8 | raise.rb:89:5:89:17 | self | | raise.rb:79:1:92:3 | exit m8 | raise.rb:79:1:92:3 | exit m8 | | raise.rb:79:1:92:3 | exit m8 (normal) | raise.rb:79:1:92:3 | exit m8 (normal) | @@ -2082,7 +2082,7 @@ dominates | raise.rb:84:11:84:11 | x | raise.rb:85:15:85:19 | x < 0 | | raise.rb:84:11:84:11 | x | raise.rb:89:5:89:17 | self | | raise.rb:85:15:85:19 | x < 0 | raise.rb:85:15:85:19 | x < 0 | -| raise.rb:89:5:89:17 | [ensure: raise] self | raise.rb:89:5:89:17 | [ensure: raise] self | +| raise.rb:89:5:89:17 | [ensure: exception] self | raise.rb:89:5:89:17 | [ensure: exception] self | | raise.rb:89:5:89:17 | self | raise.rb:89:5:89:17 | self | | raise.rb:94:1:119:3 | enter m9 | raise.rb:94:1:119:3 | enter m9 | | raise.rb:94:1:119:3 | enter m9 | raise.rb:94:1:119:3 | exit m9 | @@ -2093,29 +2093,29 @@ dominates | raise.rb:94:1:119:3 | enter m9 | raise.rb:99:5:100:20 | elsif ... | | raise.rb:94:1:119:3 | enter m9 | raise.rb:99:11:99:11 | x | | raise.rb:94:1:119:3 | enter m9 | raise.rb:100:15:100:19 | x < 0 | -| raise.rb:94:1:119:3 | enter m9 | raise.rb:104:5:104:23 | [ensure: raise] self | +| raise.rb:94:1:119:3 | enter m9 | raise.rb:104:5:104:23 | [ensure: exception] self | | raise.rb:94:1:119:3 | enter m9 | raise.rb:104:5:104:23 | self | -| raise.rb:94:1:119:3 | enter m9 | raise.rb:106:7:108:9 | [ensure: raise] if ... | +| raise.rb:94:1:119:3 | enter m9 | raise.rb:106:7:108:9 | [ensure: exception] if ... | | raise.rb:94:1:119:3 | enter m9 | raise.rb:106:7:108:9 | [ensure: return] if ... | | raise.rb:94:1:119:3 | enter m9 | raise.rb:106:7:108:9 | if ... | -| raise.rb:94:1:119:3 | enter m9 | raise.rb:106:10:106:11 | [ensure: raise] b1 | +| raise.rb:94:1:119:3 | enter m9 | raise.rb:106:10:106:11 | [ensure: exception] b1 | | raise.rb:94:1:119:3 | enter m9 | raise.rb:106:10:106:11 | [ensure: return] b1 | | raise.rb:94:1:119:3 | enter m9 | raise.rb:106:10:106:11 | b1 | -| raise.rb:94:1:119:3 | enter m9 | raise.rb:107:9:107:26 | [ensure: raise] self | +| raise.rb:94:1:119:3 | enter m9 | raise.rb:107:9:107:26 | [ensure: exception] self | | raise.rb:94:1:119:3 | enter m9 | raise.rb:107:9:107:26 | [ensure: return] self | | raise.rb:94:1:119:3 | enter m9 | raise.rb:107:9:107:26 | self | -| raise.rb:94:1:119:3 | enter m9 | raise.rb:109:5:110:25 | [ensure(1): raise] ensure ... | -| raise.rb:94:1:119:3 | enter m9 | raise.rb:109:5:110:25 | [ensure: raise, ensure(1): raise] ensure ... | -| raise.rb:94:1:119:3 | enter m9 | raise.rb:109:5:110:25 | [ensure: raise] ensure ... | -| raise.rb:94:1:119:3 | enter m9 | raise.rb:109:5:110:25 | [ensure: return, ensure(1): raise] ensure ... | +| raise.rb:94:1:119:3 | enter m9 | raise.rb:109:5:110:25 | [ensure(1): exception] ensure ... | +| raise.rb:94:1:119:3 | enter m9 | raise.rb:109:5:110:25 | [ensure: exception, ensure(1): exception] ensure ... | +| raise.rb:94:1:119:3 | enter m9 | raise.rb:109:5:110:25 | [ensure: exception] ensure ... | +| raise.rb:94:1:119:3 | enter m9 | raise.rb:109:5:110:25 | [ensure: return, ensure(1): exception] ensure ... | | raise.rb:94:1:119:3 | enter m9 | raise.rb:109:5:110:25 | [ensure: return] ensure ... | | raise.rb:94:1:119:3 | enter m9 | raise.rb:109:5:110:25 | ensure ... | -| raise.rb:94:1:119:3 | enter m9 | raise.rb:115:3:115:22 | [ensure: raise] self | +| raise.rb:94:1:119:3 | enter m9 | raise.rb:115:3:115:22 | [ensure: exception] self | | raise.rb:94:1:119:3 | enter m9 | raise.rb:115:3:115:22 | self | -| raise.rb:94:1:119:3 | enter m9 | raise.rb:116:3:118:5 | [ensure: raise] if ... | +| raise.rb:94:1:119:3 | enter m9 | raise.rb:116:3:118:5 | [ensure: exception] if ... | | raise.rb:94:1:119:3 | enter m9 | raise.rb:116:3:118:5 | [ensure: return] if ... | | raise.rb:94:1:119:3 | enter m9 | raise.rb:116:3:118:5 | if ... | -| raise.rb:94:1:119:3 | enter m9 | raise.rb:117:5:117:22 | [ensure: raise] self | +| raise.rb:94:1:119:3 | enter m9 | raise.rb:117:5:117:22 | [ensure: exception] self | | raise.rb:94:1:119:3 | enter m9 | raise.rb:117:5:117:22 | [ensure: return] self | | raise.rb:94:1:119:3 | enter m9 | raise.rb:117:5:117:22 | self | | raise.rb:94:1:119:3 | exit m9 | raise.rb:94:1:119:3 | exit m9 | @@ -2127,21 +2127,21 @@ dominates | raise.rb:97:8:97:8 | x | raise.rb:99:5:100:20 | elsif ... | | raise.rb:97:8:97:8 | x | raise.rb:99:11:99:11 | x | | raise.rb:97:8:97:8 | x | raise.rb:100:15:100:19 | x < 0 | -| raise.rb:97:8:97:8 | x | raise.rb:104:5:104:23 | [ensure: raise] self | +| raise.rb:97:8:97:8 | x | raise.rb:104:5:104:23 | [ensure: exception] self | | raise.rb:97:8:97:8 | x | raise.rb:104:5:104:23 | self | -| raise.rb:97:8:97:8 | x | raise.rb:106:7:108:9 | [ensure: raise] if ... | +| raise.rb:97:8:97:8 | x | raise.rb:106:7:108:9 | [ensure: exception] if ... | | raise.rb:97:8:97:8 | x | raise.rb:106:7:108:9 | [ensure: return] if ... | | raise.rb:97:8:97:8 | x | raise.rb:106:7:108:9 | if ... | -| raise.rb:97:8:97:8 | x | raise.rb:106:10:106:11 | [ensure: raise] b1 | +| raise.rb:97:8:97:8 | x | raise.rb:106:10:106:11 | [ensure: exception] b1 | | raise.rb:97:8:97:8 | x | raise.rb:106:10:106:11 | [ensure: return] b1 | | raise.rb:97:8:97:8 | x | raise.rb:106:10:106:11 | b1 | -| raise.rb:97:8:97:8 | x | raise.rb:107:9:107:26 | [ensure: raise] self | +| raise.rb:97:8:97:8 | x | raise.rb:107:9:107:26 | [ensure: exception] self | | raise.rb:97:8:97:8 | x | raise.rb:107:9:107:26 | [ensure: return] self | | raise.rb:97:8:97:8 | x | raise.rb:107:9:107:26 | self | -| raise.rb:97:8:97:8 | x | raise.rb:109:5:110:25 | [ensure(1): raise] ensure ... | -| raise.rb:97:8:97:8 | x | raise.rb:109:5:110:25 | [ensure: raise, ensure(1): raise] ensure ... | -| raise.rb:97:8:97:8 | x | raise.rb:109:5:110:25 | [ensure: raise] ensure ... | -| raise.rb:97:8:97:8 | x | raise.rb:109:5:110:25 | [ensure: return, ensure(1): raise] ensure ... | +| raise.rb:97:8:97:8 | x | raise.rb:109:5:110:25 | [ensure(1): exception] ensure ... | +| raise.rb:97:8:97:8 | x | raise.rb:109:5:110:25 | [ensure: exception, ensure(1): exception] ensure ... | +| raise.rb:97:8:97:8 | x | raise.rb:109:5:110:25 | [ensure: exception] ensure ... | +| raise.rb:97:8:97:8 | x | raise.rb:109:5:110:25 | [ensure: return, ensure(1): exception] ensure ... | | raise.rb:97:8:97:8 | x | raise.rb:109:5:110:25 | [ensure: return] ensure ... | | raise.rb:97:8:97:8 | x | raise.rb:109:5:110:25 | ensure ... | | raise.rb:97:8:97:8 | x | raise.rb:115:3:115:22 | self | @@ -2155,7 +2155,7 @@ dominates | raise.rb:99:5:100:20 | elsif ... | raise.rb:106:7:108:9 | if ... | | raise.rb:99:5:100:20 | elsif ... | raise.rb:106:10:106:11 | b1 | | raise.rb:99:5:100:20 | elsif ... | raise.rb:107:9:107:26 | self | -| raise.rb:99:5:100:20 | elsif ... | raise.rb:109:5:110:25 | [ensure(1): raise] ensure ... | +| raise.rb:99:5:100:20 | elsif ... | raise.rb:109:5:110:25 | [ensure(1): exception] ensure ... | | raise.rb:99:5:100:20 | elsif ... | raise.rb:109:5:110:25 | ensure ... | | raise.rb:99:5:100:20 | elsif ... | raise.rb:115:3:115:22 | self | | raise.rb:99:5:100:20 | elsif ... | raise.rb:116:3:118:5 | if ... | @@ -2171,8 +2171,8 @@ dominates | raise.rb:99:11:99:11 | x | raise.rb:106:10:106:11 | b1 | | raise.rb:99:11:99:11 | x | raise.rb:107:9:107:26 | [ensure: return] self | | raise.rb:99:11:99:11 | x | raise.rb:107:9:107:26 | self | -| raise.rb:99:11:99:11 | x | raise.rb:109:5:110:25 | [ensure(1): raise] ensure ... | -| raise.rb:99:11:99:11 | x | raise.rb:109:5:110:25 | [ensure: return, ensure(1): raise] ensure ... | +| raise.rb:99:11:99:11 | x | raise.rb:109:5:110:25 | [ensure(1): exception] ensure ... | +| raise.rb:99:11:99:11 | x | raise.rb:109:5:110:25 | [ensure: return, ensure(1): exception] ensure ... | | raise.rb:99:11:99:11 | x | raise.rb:109:5:110:25 | [ensure: return] ensure ... | | raise.rb:99:11:99:11 | x | raise.rb:109:5:110:25 | ensure ... | | raise.rb:99:11:99:11 | x | raise.rb:115:3:115:22 | self | @@ -2184,27 +2184,27 @@ dominates | raise.rb:100:15:100:19 | x < 0 | raise.rb:106:7:108:9 | [ensure: return] if ... | | raise.rb:100:15:100:19 | x < 0 | raise.rb:106:10:106:11 | [ensure: return] b1 | | raise.rb:100:15:100:19 | x < 0 | raise.rb:107:9:107:26 | [ensure: return] self | -| raise.rb:100:15:100:19 | x < 0 | raise.rb:109:5:110:25 | [ensure: return, ensure(1): raise] ensure ... | +| raise.rb:100:15:100:19 | x < 0 | raise.rb:109:5:110:25 | [ensure: return, ensure(1): exception] ensure ... | | raise.rb:100:15:100:19 | x < 0 | raise.rb:109:5:110:25 | [ensure: return] ensure ... | | raise.rb:100:15:100:19 | x < 0 | raise.rb:116:3:118:5 | [ensure: return] if ... | | raise.rb:100:15:100:19 | x < 0 | raise.rb:117:5:117:22 | [ensure: return] self | -| raise.rb:104:5:104:23 | [ensure: raise] self | raise.rb:104:5:104:23 | [ensure: raise] self | -| raise.rb:104:5:104:23 | [ensure: raise] self | raise.rb:106:7:108:9 | [ensure: raise] if ... | -| raise.rb:104:5:104:23 | [ensure: raise] self | raise.rb:106:10:106:11 | [ensure: raise] b1 | -| raise.rb:104:5:104:23 | [ensure: raise] self | raise.rb:107:9:107:26 | [ensure: raise] self | -| raise.rb:104:5:104:23 | [ensure: raise] self | raise.rb:109:5:110:25 | [ensure: raise, ensure(1): raise] ensure ... | -| raise.rb:104:5:104:23 | [ensure: raise] self | raise.rb:109:5:110:25 | [ensure: raise] ensure ... | +| raise.rb:104:5:104:23 | [ensure: exception] self | raise.rb:104:5:104:23 | [ensure: exception] self | +| raise.rb:104:5:104:23 | [ensure: exception] self | raise.rb:106:7:108:9 | [ensure: exception] if ... | +| raise.rb:104:5:104:23 | [ensure: exception] self | raise.rb:106:10:106:11 | [ensure: exception] b1 | +| raise.rb:104:5:104:23 | [ensure: exception] self | raise.rb:107:9:107:26 | [ensure: exception] self | +| raise.rb:104:5:104:23 | [ensure: exception] self | raise.rb:109:5:110:25 | [ensure: exception, ensure(1): exception] ensure ... | +| raise.rb:104:5:104:23 | [ensure: exception] self | raise.rb:109:5:110:25 | [ensure: exception] ensure ... | | raise.rb:104:5:104:23 | self | raise.rb:104:5:104:23 | self | | raise.rb:104:5:104:23 | self | raise.rb:106:7:108:9 | if ... | | raise.rb:104:5:104:23 | self | raise.rb:106:10:106:11 | b1 | | raise.rb:104:5:104:23 | self | raise.rb:107:9:107:26 | self | -| raise.rb:104:5:104:23 | self | raise.rb:109:5:110:25 | [ensure(1): raise] ensure ... | +| raise.rb:104:5:104:23 | self | raise.rb:109:5:110:25 | [ensure(1): exception] ensure ... | | raise.rb:104:5:104:23 | self | raise.rb:109:5:110:25 | ensure ... | | raise.rb:104:5:104:23 | self | raise.rb:115:3:115:22 | self | | raise.rb:104:5:104:23 | self | raise.rb:116:3:118:5 | if ... | | raise.rb:104:5:104:23 | self | raise.rb:117:5:117:22 | self | -| raise.rb:106:7:108:9 | [ensure: raise] if ... | raise.rb:106:7:108:9 | [ensure: raise] if ... | -| raise.rb:106:7:108:9 | [ensure: raise] if ... | raise.rb:109:5:110:25 | [ensure: raise] ensure ... | +| raise.rb:106:7:108:9 | [ensure: exception] if ... | raise.rb:106:7:108:9 | [ensure: exception] if ... | +| raise.rb:106:7:108:9 | [ensure: exception] if ... | raise.rb:109:5:110:25 | [ensure: exception] ensure ... | | raise.rb:106:7:108:9 | [ensure: return] if ... | raise.rb:106:7:108:9 | [ensure: return] if ... | | raise.rb:106:7:108:9 | [ensure: return] if ... | raise.rb:109:5:110:25 | [ensure: return] ensure ... | | raise.rb:106:7:108:9 | [ensure: return] if ... | raise.rb:116:3:118:5 | [ensure: return] if ... | @@ -2214,36 +2214,36 @@ dominates | raise.rb:106:7:108:9 | if ... | raise.rb:115:3:115:22 | self | | raise.rb:106:7:108:9 | if ... | raise.rb:116:3:118:5 | if ... | | raise.rb:106:7:108:9 | if ... | raise.rb:117:5:117:22 | self | -| raise.rb:106:10:106:11 | [ensure: raise] b1 | raise.rb:106:7:108:9 | [ensure: raise] if ... | -| raise.rb:106:10:106:11 | [ensure: raise] b1 | raise.rb:106:10:106:11 | [ensure: raise] b1 | -| raise.rb:106:10:106:11 | [ensure: raise] b1 | raise.rb:107:9:107:26 | [ensure: raise] self | -| raise.rb:106:10:106:11 | [ensure: raise] b1 | raise.rb:109:5:110:25 | [ensure: raise, ensure(1): raise] ensure ... | -| raise.rb:106:10:106:11 | [ensure: raise] b1 | raise.rb:109:5:110:25 | [ensure: raise] ensure ... | +| raise.rb:106:10:106:11 | [ensure: exception] b1 | raise.rb:106:7:108:9 | [ensure: exception] if ... | +| raise.rb:106:10:106:11 | [ensure: exception] b1 | raise.rb:106:10:106:11 | [ensure: exception] b1 | +| raise.rb:106:10:106:11 | [ensure: exception] b1 | raise.rb:107:9:107:26 | [ensure: exception] self | +| raise.rb:106:10:106:11 | [ensure: exception] b1 | raise.rb:109:5:110:25 | [ensure: exception, ensure(1): exception] ensure ... | +| raise.rb:106:10:106:11 | [ensure: exception] b1 | raise.rb:109:5:110:25 | [ensure: exception] ensure ... | | raise.rb:106:10:106:11 | [ensure: return] b1 | raise.rb:106:7:108:9 | [ensure: return] if ... | | raise.rb:106:10:106:11 | [ensure: return] b1 | raise.rb:106:10:106:11 | [ensure: return] b1 | | raise.rb:106:10:106:11 | [ensure: return] b1 | raise.rb:107:9:107:26 | [ensure: return] self | -| raise.rb:106:10:106:11 | [ensure: return] b1 | raise.rb:109:5:110:25 | [ensure: return, ensure(1): raise] ensure ... | +| raise.rb:106:10:106:11 | [ensure: return] b1 | raise.rb:109:5:110:25 | [ensure: return, ensure(1): exception] ensure ... | | raise.rb:106:10:106:11 | [ensure: return] b1 | raise.rb:109:5:110:25 | [ensure: return] ensure ... | | raise.rb:106:10:106:11 | [ensure: return] b1 | raise.rb:116:3:118:5 | [ensure: return] if ... | | raise.rb:106:10:106:11 | [ensure: return] b1 | raise.rb:117:5:117:22 | [ensure: return] self | | raise.rb:106:10:106:11 | b1 | raise.rb:106:7:108:9 | if ... | | raise.rb:106:10:106:11 | b1 | raise.rb:106:10:106:11 | b1 | | raise.rb:106:10:106:11 | b1 | raise.rb:107:9:107:26 | self | -| raise.rb:106:10:106:11 | b1 | raise.rb:109:5:110:25 | [ensure(1): raise] ensure ... | +| raise.rb:106:10:106:11 | b1 | raise.rb:109:5:110:25 | [ensure(1): exception] ensure ... | | raise.rb:106:10:106:11 | b1 | raise.rb:109:5:110:25 | ensure ... | | raise.rb:106:10:106:11 | b1 | raise.rb:115:3:115:22 | self | | raise.rb:106:10:106:11 | b1 | raise.rb:116:3:118:5 | if ... | | raise.rb:106:10:106:11 | b1 | raise.rb:117:5:117:22 | self | -| raise.rb:107:9:107:26 | [ensure: raise] self | raise.rb:107:9:107:26 | [ensure: raise] self | -| raise.rb:107:9:107:26 | [ensure: raise] self | raise.rb:109:5:110:25 | [ensure: raise, ensure(1): raise] ensure ... | +| raise.rb:107:9:107:26 | [ensure: exception] self | raise.rb:107:9:107:26 | [ensure: exception] self | +| raise.rb:107:9:107:26 | [ensure: exception] self | raise.rb:109:5:110:25 | [ensure: exception, ensure(1): exception] ensure ... | | raise.rb:107:9:107:26 | [ensure: return] self | raise.rb:107:9:107:26 | [ensure: return] self | -| raise.rb:107:9:107:26 | [ensure: return] self | raise.rb:109:5:110:25 | [ensure: return, ensure(1): raise] ensure ... | +| raise.rb:107:9:107:26 | [ensure: return] self | raise.rb:109:5:110:25 | [ensure: return, ensure(1): exception] ensure ... | | raise.rb:107:9:107:26 | self | raise.rb:107:9:107:26 | self | -| raise.rb:107:9:107:26 | self | raise.rb:109:5:110:25 | [ensure(1): raise] ensure ... | -| raise.rb:109:5:110:25 | [ensure(1): raise] ensure ... | raise.rb:109:5:110:25 | [ensure(1): raise] ensure ... | -| raise.rb:109:5:110:25 | [ensure: raise, ensure(1): raise] ensure ... | raise.rb:109:5:110:25 | [ensure: raise, ensure(1): raise] ensure ... | -| raise.rb:109:5:110:25 | [ensure: raise] ensure ... | raise.rb:109:5:110:25 | [ensure: raise] ensure ... | -| raise.rb:109:5:110:25 | [ensure: return, ensure(1): raise] ensure ... | raise.rb:109:5:110:25 | [ensure: return, ensure(1): raise] ensure ... | +| raise.rb:107:9:107:26 | self | raise.rb:109:5:110:25 | [ensure(1): exception] ensure ... | +| raise.rb:109:5:110:25 | [ensure(1): exception] ensure ... | raise.rb:109:5:110:25 | [ensure(1): exception] ensure ... | +| raise.rb:109:5:110:25 | [ensure: exception, ensure(1): exception] ensure ... | raise.rb:109:5:110:25 | [ensure: exception, ensure(1): exception] ensure ... | +| raise.rb:109:5:110:25 | [ensure: exception] ensure ... | raise.rb:109:5:110:25 | [ensure: exception] ensure ... | +| raise.rb:109:5:110:25 | [ensure: return, ensure(1): exception] ensure ... | raise.rb:109:5:110:25 | [ensure: return, ensure(1): exception] ensure ... | | raise.rb:109:5:110:25 | [ensure: return] ensure ... | raise.rb:109:5:110:25 | [ensure: return] ensure ... | | raise.rb:109:5:110:25 | [ensure: return] ensure ... | raise.rb:116:3:118:5 | [ensure: return] if ... | | raise.rb:109:5:110:25 | [ensure: return] ensure ... | raise.rb:117:5:117:22 | [ensure: return] self | @@ -2251,16 +2251,16 @@ dominates | raise.rb:109:5:110:25 | ensure ... | raise.rb:115:3:115:22 | self | | raise.rb:109:5:110:25 | ensure ... | raise.rb:116:3:118:5 | if ... | | raise.rb:109:5:110:25 | ensure ... | raise.rb:117:5:117:22 | self | -| raise.rb:115:3:115:22 | [ensure: raise] self | raise.rb:115:3:115:22 | [ensure: raise] self | -| raise.rb:115:3:115:22 | [ensure: raise] self | raise.rb:116:3:118:5 | [ensure: raise] if ... | -| raise.rb:115:3:115:22 | [ensure: raise] self | raise.rb:117:5:117:22 | [ensure: raise] self | +| raise.rb:115:3:115:22 | [ensure: exception] self | raise.rb:115:3:115:22 | [ensure: exception] self | +| raise.rb:115:3:115:22 | [ensure: exception] self | raise.rb:116:3:118:5 | [ensure: exception] if ... | +| raise.rb:115:3:115:22 | [ensure: exception] self | raise.rb:117:5:117:22 | [ensure: exception] self | | raise.rb:115:3:115:22 | self | raise.rb:115:3:115:22 | self | | raise.rb:115:3:115:22 | self | raise.rb:116:3:118:5 | if ... | | raise.rb:115:3:115:22 | self | raise.rb:117:5:117:22 | self | -| raise.rb:116:3:118:5 | [ensure: raise] if ... | raise.rb:116:3:118:5 | [ensure: raise] if ... | +| raise.rb:116:3:118:5 | [ensure: exception] if ... | raise.rb:116:3:118:5 | [ensure: exception] if ... | | raise.rb:116:3:118:5 | [ensure: return] if ... | raise.rb:116:3:118:5 | [ensure: return] if ... | | raise.rb:116:3:118:5 | if ... | raise.rb:116:3:118:5 | if ... | -| raise.rb:117:5:117:22 | [ensure: raise] self | raise.rb:117:5:117:22 | [ensure: raise] self | +| raise.rb:117:5:117:22 | [ensure: exception] self | raise.rb:117:5:117:22 | [ensure: exception] self | | raise.rb:117:5:117:22 | [ensure: return] self | raise.rb:117:5:117:22 | [ensure: return] self | | raise.rb:117:5:117:22 | self | raise.rb:117:5:117:22 | self | | raise.rb:121:1:126:3 | enter m10 | raise.rb:121:1:126:3 | enter m10 | @@ -2277,7 +2277,7 @@ dominates | raise.rb:128:1:140:3 | enter m11 | raise.rb:133:3:133:19 | rescue ... | | raise.rb:128:1:140:3 | enter m11 | raise.rb:134:10:134:19 | ExceptionB | | raise.rb:128:1:140:3 | enter m11 | raise.rb:135:5:135:21 | self | -| raise.rb:128:1:140:3 | enter m11 | raise.rb:137:5:137:17 | [ensure: raise] self | +| raise.rb:128:1:140:3 | enter m11 | raise.rb:137:5:137:17 | [ensure: exception] self | | raise.rb:128:1:140:3 | enter m11 | raise.rb:137:5:137:17 | self | | raise.rb:128:1:140:3 | exit m11 | raise.rb:128:1:140:3 | exit m11 | | raise.rb:130:5:132:7 | if ... | raise.rb:130:5:132:7 | if ... | @@ -2285,13 +2285,13 @@ dominates | raise.rb:131:7:131:22 | self | raise.rb:133:3:133:19 | rescue ... | | raise.rb:131:7:131:22 | self | raise.rb:134:10:134:19 | ExceptionB | | raise.rb:131:7:131:22 | self | raise.rb:135:5:135:21 | self | -| raise.rb:131:7:131:22 | self | raise.rb:137:5:137:17 | [ensure: raise] self | +| raise.rb:131:7:131:22 | self | raise.rb:137:5:137:17 | [ensure: exception] self | | raise.rb:133:3:133:19 | rescue ... | raise.rb:133:3:133:19 | rescue ... | | raise.rb:134:10:134:19 | ExceptionB | raise.rb:134:10:134:19 | ExceptionB | | raise.rb:134:10:134:19 | ExceptionB | raise.rb:135:5:135:21 | self | -| raise.rb:134:10:134:19 | ExceptionB | raise.rb:137:5:137:17 | [ensure: raise] self | +| raise.rb:134:10:134:19 | ExceptionB | raise.rb:137:5:137:17 | [ensure: exception] self | | raise.rb:135:5:135:21 | self | raise.rb:135:5:135:21 | self | -| raise.rb:137:5:137:17 | [ensure: raise] self | raise.rb:137:5:137:17 | [ensure: raise] self | +| raise.rb:137:5:137:17 | [ensure: exception] self | raise.rb:137:5:137:17 | [ensure: exception] self | | raise.rb:137:5:137:17 | self | raise.rb:137:5:137:17 | self | | raise.rb:142:1:148:3 | enter m12 | raise.rb:142:1:148:3 | enter m12 | | raise.rb:142:1:148:3 | enter m12 | raise.rb:142:1:148:3 | exit m12 (normal) | @@ -2362,7 +2362,7 @@ postDominance | break_ensure.rb:3:5:5:7 | if ... | break_ensure.rb:3:5:5:7 | if ... | | break_ensure.rb:3:8:3:8 | x | break_ensure.rb:3:8:3:8 | x | | break_ensure.rb:4:7:4:11 | break | break_ensure.rb:4:7:4:11 | break | -| break_ensure.rb:8:3:10:5 | [ensure: raise] if ... | break_ensure.rb:8:3:10:5 | [ensure: raise] if ... | +| break_ensure.rb:8:3:10:5 | [ensure: exception] if ... | break_ensure.rb:8:3:10:5 | [ensure: exception] if ... | | break_ensure.rb:8:3:10:5 | if ... | break_ensure.rb:1:1:11:3 | enter m1 | | break_ensure.rb:8:3:10:5 | if ... | break_ensure.rb:2:3:6:5 | while ... | | break_ensure.rb:8:3:10:5 | if ... | break_ensure.rb:2:9:2:9 | x | @@ -2371,8 +2371,8 @@ postDominance | break_ensure.rb:8:3:10:5 | if ... | break_ensure.rb:4:7:4:11 | break | | break_ensure.rb:8:3:10:5 | if ... | break_ensure.rb:8:3:10:5 | if ... | | break_ensure.rb:8:3:10:5 | if ... | break_ensure.rb:9:5:9:23 | self | -| break_ensure.rb:8:6:8:13 | [ensure: raise] self | break_ensure.rb:8:6:8:13 | [ensure: raise] self | -| break_ensure.rb:9:5:9:23 | [ensure: raise] self | break_ensure.rb:9:5:9:23 | [ensure: raise] self | +| break_ensure.rb:8:6:8:13 | [ensure: exception] self | break_ensure.rb:8:6:8:13 | [ensure: exception] self | +| break_ensure.rb:9:5:9:23 | [ensure: exception] self | break_ensure.rb:9:5:9:23 | [ensure: exception] self | | break_ensure.rb:9:5:9:23 | self | break_ensure.rb:9:5:9:23 | self | | break_ensure.rb:13:1:25:3 | enter m2 | break_ensure.rb:13:1:25:3 | enter m2 | | break_ensure.rb:14:3:24:5 | while ... | break_ensure.rb:13:1:25:3 | enter m2 | @@ -2382,11 +2382,11 @@ postDominance | break_ensure.rb:14:3:24:5 | while ... | break_ensure.rb:16:10:16:10 | x | | break_ensure.rb:14:3:24:5 | while ... | break_ensure.rb:17:9:17:13 | break | | break_ensure.rb:14:3:24:5 | while ... | break_ensure.rb:20:7:22:9 | [ensure: break] if ... | -| break_ensure.rb:14:3:24:5 | while ... | break_ensure.rb:20:7:22:9 | [ensure: raise] if ... | +| break_ensure.rb:14:3:24:5 | while ... | break_ensure.rb:20:7:22:9 | [ensure: exception] if ... | | break_ensure.rb:14:3:24:5 | while ... | break_ensure.rb:20:7:22:9 | if ... | -| break_ensure.rb:14:3:24:5 | while ... | break_ensure.rb:20:10:20:10 | [ensure: raise] y | +| break_ensure.rb:14:3:24:5 | while ... | break_ensure.rb:20:10:20:10 | [ensure: exception] y | | break_ensure.rb:14:3:24:5 | while ... | break_ensure.rb:21:9:21:20 | [ensure: break] self | -| break_ensure.rb:14:3:24:5 | while ... | break_ensure.rb:21:9:21:20 | [ensure: raise] self | +| break_ensure.rb:14:3:24:5 | while ... | break_ensure.rb:21:9:21:20 | [ensure: exception] self | | break_ensure.rb:14:3:24:5 | while ... | break_ensure.rb:21:9:21:20 | self | | break_ensure.rb:14:9:14:9 | x | break_ensure.rb:13:1:25:3 | enter m2 | | break_ensure.rb:14:9:14:9 | x | break_ensure.rb:14:9:14:9 | x | @@ -2399,15 +2399,15 @@ postDominance | break_ensure.rb:20:7:22:9 | [ensure: break] if ... | break_ensure.rb:17:9:17:13 | break | | break_ensure.rb:20:7:22:9 | [ensure: break] if ... | break_ensure.rb:20:7:22:9 | [ensure: break] if ... | | break_ensure.rb:20:7:22:9 | [ensure: break] if ... | break_ensure.rb:21:9:21:20 | [ensure: break] self | -| break_ensure.rb:20:7:22:9 | [ensure: raise] if ... | break_ensure.rb:20:7:22:9 | [ensure: raise] if ... | -| break_ensure.rb:20:7:22:9 | [ensure: raise] if ... | break_ensure.rb:20:10:20:10 | [ensure: raise] y | -| break_ensure.rb:20:7:22:9 | [ensure: raise] if ... | break_ensure.rb:21:9:21:20 | [ensure: raise] self | +| break_ensure.rb:20:7:22:9 | [ensure: exception] if ... | break_ensure.rb:20:7:22:9 | [ensure: exception] if ... | +| break_ensure.rb:20:7:22:9 | [ensure: exception] if ... | break_ensure.rb:20:10:20:10 | [ensure: exception] y | +| break_ensure.rb:20:7:22:9 | [ensure: exception] if ... | break_ensure.rb:21:9:21:20 | [ensure: exception] self | | break_ensure.rb:20:7:22:9 | if ... | break_ensure.rb:16:7:18:9 | if ... | | break_ensure.rb:20:7:22:9 | if ... | break_ensure.rb:20:7:22:9 | if ... | | break_ensure.rb:20:7:22:9 | if ... | break_ensure.rb:21:9:21:20 | self | -| break_ensure.rb:20:10:20:10 | [ensure: raise] y | break_ensure.rb:20:10:20:10 | [ensure: raise] y | +| break_ensure.rb:20:10:20:10 | [ensure: exception] y | break_ensure.rb:20:10:20:10 | [ensure: exception] y | | break_ensure.rb:21:9:21:20 | [ensure: break] self | break_ensure.rb:21:9:21:20 | [ensure: break] self | -| break_ensure.rb:21:9:21:20 | [ensure: raise] self | break_ensure.rb:21:9:21:20 | [ensure: raise] self | +| break_ensure.rb:21:9:21:20 | [ensure: exception] self | break_ensure.rb:21:9:21:20 | [ensure: exception] self | | break_ensure.rb:21:9:21:20 | self | break_ensure.rb:21:9:21:20 | self | | break_ensure.rb:27:1:42:3 | enter m3 | break_ensure.rb:27:1:42:3 | enter m3 | | break_ensure.rb:27:1:42:3 | exit m3 | break_ensure.rb:27:1:42:3 | exit m3 | @@ -2427,7 +2427,7 @@ postDominance | break_ensure.rb:27:1:42:3 | exit m3 (normal) | break_ensure.rb:36:11:36:15 | break | | break_ensure.rb:29:5:31:7 | if ... | break_ensure.rb:29:5:31:7 | if ... | | break_ensure.rb:30:7:30:12 | return | break_ensure.rb:30:7:30:12 | return | -| break_ensure.rb:33:5:39:7 | [ensure: raise] while ... | break_ensure.rb:33:5:39:7 | [ensure: raise] while ... | +| break_ensure.rb:33:5:39:7 | [ensure: exception] while ... | break_ensure.rb:33:5:39:7 | [ensure: exception] while ... | | break_ensure.rb:33:5:39:7 | [ensure: return] while ... | break_ensure.rb:30:7:30:12 | return | | break_ensure.rb:33:5:39:7 | [ensure: return] while ... | break_ensure.rb:33:5:39:7 | [ensure: return] while ... | | break_ensure.rb:33:5:39:7 | [ensure: return] while ... | break_ensure.rb:33:11:33:11 | [ensure: return] y | @@ -2440,20 +2440,20 @@ postDominance | break_ensure.rb:33:5:39:7 | while ... | break_ensure.rb:35:9:37:11 | if ... | | break_ensure.rb:33:5:39:7 | while ... | break_ensure.rb:35:12:35:12 | x | | break_ensure.rb:33:5:39:7 | while ... | break_ensure.rb:36:11:36:15 | break | -| break_ensure.rb:33:11:33:11 | [ensure: raise] y | break_ensure.rb:33:11:33:11 | [ensure: raise] y | +| break_ensure.rb:33:11:33:11 | [ensure: exception] y | break_ensure.rb:33:11:33:11 | [ensure: exception] y | | break_ensure.rb:33:11:33:11 | [ensure: return] y | break_ensure.rb:30:7:30:12 | return | | break_ensure.rb:33:11:33:11 | [ensure: return] y | break_ensure.rb:33:11:33:11 | [ensure: return] y | | break_ensure.rb:33:11:33:11 | [ensure: return] y | break_ensure.rb:35:9:37:11 | [ensure: return] if ... | | break_ensure.rb:33:11:33:11 | y | break_ensure.rb:29:5:31:7 | if ... | | break_ensure.rb:33:11:33:11 | y | break_ensure.rb:33:11:33:11 | y | | break_ensure.rb:33:11:33:11 | y | break_ensure.rb:35:9:37:11 | if ... | -| break_ensure.rb:35:9:37:11 | [ensure: raise] if ... | break_ensure.rb:35:9:37:11 | [ensure: raise] if ... | +| break_ensure.rb:35:9:37:11 | [ensure: exception] if ... | break_ensure.rb:35:9:37:11 | [ensure: exception] if ... | | break_ensure.rb:35:9:37:11 | [ensure: return] if ... | break_ensure.rb:35:9:37:11 | [ensure: return] if ... | | break_ensure.rb:35:9:37:11 | if ... | break_ensure.rb:35:9:37:11 | if ... | -| break_ensure.rb:35:12:35:12 | [ensure: raise] x | break_ensure.rb:35:12:35:12 | [ensure: raise] x | +| break_ensure.rb:35:12:35:12 | [ensure: exception] x | break_ensure.rb:35:12:35:12 | [ensure: exception] x | | break_ensure.rb:35:12:35:12 | [ensure: return] x | break_ensure.rb:35:12:35:12 | [ensure: return] x | | break_ensure.rb:35:12:35:12 | x | break_ensure.rb:35:12:35:12 | x | -| break_ensure.rb:36:11:36:15 | [ensure: raise] break | break_ensure.rb:36:11:36:15 | [ensure: raise] break | +| break_ensure.rb:36:11:36:15 | [ensure: exception] break | break_ensure.rb:36:11:36:15 | [ensure: exception] break | | break_ensure.rb:36:11:36:15 | [ensure: return] break | break_ensure.rb:36:11:36:15 | [ensure: return] break | | break_ensure.rb:36:11:36:15 | break | break_ensure.rb:36:11:36:15 | break | | break_ensure.rb:44:1:56:3 | enter m4 | break_ensure.rb:44:1:56:3 | enter m4 | @@ -2463,23 +2463,23 @@ postDominance | break_ensure.rb:45:3:55:5 | while ... | break_ensure.rb:47:7:49:9 | if ... | | break_ensure.rb:45:3:55:5 | while ... | break_ensure.rb:47:10:47:10 | x | | break_ensure.rb:45:3:55:5 | while ... | break_ensure.rb:48:9:48:16 | self | -| break_ensure.rb:45:3:55:5 | while ... | break_ensure.rb:51:7:53:9 | [ensure: raise] if ... | +| break_ensure.rb:45:3:55:5 | while ... | break_ensure.rb:51:7:53:9 | [ensure: exception] if ... | | break_ensure.rb:45:3:55:5 | while ... | break_ensure.rb:51:7:53:9 | if ... | -| break_ensure.rb:45:3:55:5 | while ... | break_ensure.rb:51:10:51:10 | [ensure: raise] x | +| break_ensure.rb:45:3:55:5 | while ... | break_ensure.rb:51:10:51:10 | [ensure: exception] x | | break_ensure.rb:45:3:55:5 | while ... | break_ensure.rb:52:15:52:16 | 10 | -| break_ensure.rb:45:3:55:5 | while ... | break_ensure.rb:52:15:52:16 | [ensure: raise] 10 | +| break_ensure.rb:45:3:55:5 | while ... | break_ensure.rb:52:15:52:16 | [ensure: exception] 10 | | break_ensure.rb:45:9:45:9 | x | break_ensure.rb:44:1:56:3 | enter m4 | | break_ensure.rb:45:9:45:9 | x | break_ensure.rb:45:9:45:9 | x | | break_ensure.rb:45:9:45:9 | x | break_ensure.rb:51:7:53:9 | if ... | | break_ensure.rb:47:7:49:9 | if ... | break_ensure.rb:47:7:49:9 | if ... | | break_ensure.rb:47:10:47:10 | x | break_ensure.rb:47:10:47:10 | x | | break_ensure.rb:48:9:48:16 | self | break_ensure.rb:48:9:48:16 | self | -| break_ensure.rb:51:7:53:9 | [ensure: raise] if ... | break_ensure.rb:51:7:53:9 | [ensure: raise] if ... | +| break_ensure.rb:51:7:53:9 | [ensure: exception] if ... | break_ensure.rb:51:7:53:9 | [ensure: exception] if ... | | break_ensure.rb:51:7:53:9 | if ... | break_ensure.rb:51:7:53:9 | if ... | -| break_ensure.rb:51:10:51:10 | [ensure: raise] x | break_ensure.rb:48:9:48:16 | self | -| break_ensure.rb:51:10:51:10 | [ensure: raise] x | break_ensure.rb:51:10:51:10 | [ensure: raise] x | +| break_ensure.rb:51:10:51:10 | [ensure: exception] x | break_ensure.rb:48:9:48:16 | self | +| break_ensure.rb:51:10:51:10 | [ensure: exception] x | break_ensure.rb:51:10:51:10 | [ensure: exception] x | | break_ensure.rb:52:15:52:16 | 10 | break_ensure.rb:52:15:52:16 | 10 | -| break_ensure.rb:52:15:52:16 | [ensure: raise] 10 | break_ensure.rb:52:15:52:16 | [ensure: raise] 10 | +| break_ensure.rb:52:15:52:16 | [ensure: exception] 10 | break_ensure.rb:52:15:52:16 | [ensure: exception] 10 | | case.rb:1:1:6:3 | enter if_in_case | case.rb:1:1:6:3 | enter if_in_case | | case.rb:1:1:99:4 | enter case.rb | case.rb:1:1:99:4 | enter case.rb | | case.rb:2:3:5:5 | case ... | case.rb:1:1:6:3 | enter if_in_case | @@ -3959,7 +3959,7 @@ postDominance | raise.rb:71:9:71:9 | x | raise.rb:68:1:77:3 | enter m7 | | raise.rb:71:9:71:9 | x | raise.rb:71:9:71:9 | x | | raise.rb:72:13:72:17 | x < 0 | raise.rb:72:13:72:17 | x < 0 | -| raise.rb:76:3:76:15 | [ensure: raise] self | raise.rb:76:3:76:15 | [ensure: raise] self | +| raise.rb:76:3:76:15 | [ensure: exception] self | raise.rb:76:3:76:15 | [ensure: exception] self | | raise.rb:76:3:76:15 | self | raise.rb:71:3:72:18 | elsif ... | | raise.rb:76:3:76:15 | self | raise.rb:76:3:76:15 | self | | raise.rb:79:1:92:3 | enter m8 | raise.rb:79:1:92:3 | enter m8 | @@ -3975,7 +3975,7 @@ postDominance | raise.rb:84:11:84:11 | x | raise.rb:79:1:92:3 | enter m8 | | raise.rb:84:11:84:11 | x | raise.rb:84:11:84:11 | x | | raise.rb:85:15:85:19 | x < 0 | raise.rb:85:15:85:19 | x < 0 | -| raise.rb:89:5:89:17 | [ensure: raise] self | raise.rb:89:5:89:17 | [ensure: raise] self | +| raise.rb:89:5:89:17 | [ensure: exception] self | raise.rb:89:5:89:17 | [ensure: exception] self | | raise.rb:89:5:89:17 | self | raise.rb:84:5:85:20 | elsif ... | | raise.rb:89:5:89:17 | self | raise.rb:89:5:89:17 | self | | raise.rb:94:1:119:3 | enter m9 | raise.rb:94:1:119:3 | enter m9 | @@ -4005,10 +4005,10 @@ postDominance | raise.rb:99:11:99:11 | x | raise.rb:97:8:97:8 | x | | raise.rb:99:11:99:11 | x | raise.rb:99:11:99:11 | x | | raise.rb:100:15:100:19 | x < 0 | raise.rb:100:15:100:19 | x < 0 | -| raise.rb:104:5:104:23 | [ensure: raise] self | raise.rb:104:5:104:23 | [ensure: raise] self | +| raise.rb:104:5:104:23 | [ensure: exception] self | raise.rb:104:5:104:23 | [ensure: exception] self | | raise.rb:104:5:104:23 | self | raise.rb:99:5:100:20 | elsif ... | | raise.rb:104:5:104:23 | self | raise.rb:104:5:104:23 | self | -| raise.rb:106:7:108:9 | [ensure: raise] if ... | raise.rb:106:7:108:9 | [ensure: raise] if ... | +| raise.rb:106:7:108:9 | [ensure: exception] if ... | raise.rb:106:7:108:9 | [ensure: exception] if ... | | raise.rb:106:7:108:9 | [ensure: return] if ... | raise.rb:100:15:100:19 | x < 0 | | raise.rb:106:7:108:9 | [ensure: return] if ... | raise.rb:106:7:108:9 | [ensure: return] if ... | | raise.rb:106:7:108:9 | [ensure: return] if ... | raise.rb:106:10:106:11 | [ensure: return] b1 | @@ -4016,19 +4016,19 @@ postDominance | raise.rb:106:7:108:9 | if ... | raise.rb:104:5:104:23 | self | | raise.rb:106:7:108:9 | if ... | raise.rb:106:7:108:9 | if ... | | raise.rb:106:7:108:9 | if ... | raise.rb:106:10:106:11 | b1 | -| raise.rb:106:10:106:11 | [ensure: raise] b1 | raise.rb:106:10:106:11 | [ensure: raise] b1 | +| raise.rb:106:10:106:11 | [ensure: exception] b1 | raise.rb:106:10:106:11 | [ensure: exception] b1 | | raise.rb:106:10:106:11 | [ensure: return] b1 | raise.rb:100:15:100:19 | x < 0 | | raise.rb:106:10:106:11 | [ensure: return] b1 | raise.rb:106:10:106:11 | [ensure: return] b1 | | raise.rb:106:10:106:11 | b1 | raise.rb:99:5:100:20 | elsif ... | | raise.rb:106:10:106:11 | b1 | raise.rb:104:5:104:23 | self | | raise.rb:106:10:106:11 | b1 | raise.rb:106:10:106:11 | b1 | -| raise.rb:107:9:107:26 | [ensure: raise] self | raise.rb:107:9:107:26 | [ensure: raise] self | +| raise.rb:107:9:107:26 | [ensure: exception] self | raise.rb:107:9:107:26 | [ensure: exception] self | | raise.rb:107:9:107:26 | [ensure: return] self | raise.rb:107:9:107:26 | [ensure: return] self | | raise.rb:107:9:107:26 | self | raise.rb:107:9:107:26 | self | -| raise.rb:109:5:110:25 | [ensure(1): raise] ensure ... | raise.rb:109:5:110:25 | [ensure(1): raise] ensure ... | -| raise.rb:109:5:110:25 | [ensure: raise, ensure(1): raise] ensure ... | raise.rb:109:5:110:25 | [ensure: raise, ensure(1): raise] ensure ... | -| raise.rb:109:5:110:25 | [ensure: raise] ensure ... | raise.rb:109:5:110:25 | [ensure: raise] ensure ... | -| raise.rb:109:5:110:25 | [ensure: return, ensure(1): raise] ensure ... | raise.rb:109:5:110:25 | [ensure: return, ensure(1): raise] ensure ... | +| raise.rb:109:5:110:25 | [ensure(1): exception] ensure ... | raise.rb:109:5:110:25 | [ensure(1): exception] ensure ... | +| raise.rb:109:5:110:25 | [ensure: exception, ensure(1): exception] ensure ... | raise.rb:109:5:110:25 | [ensure: exception, ensure(1): exception] ensure ... | +| raise.rb:109:5:110:25 | [ensure: exception] ensure ... | raise.rb:109:5:110:25 | [ensure: exception] ensure ... | +| raise.rb:109:5:110:25 | [ensure: return, ensure(1): exception] ensure ... | raise.rb:109:5:110:25 | [ensure: return, ensure(1): exception] ensure ... | | raise.rb:109:5:110:25 | [ensure: return] ensure ... | raise.rb:100:15:100:19 | x < 0 | | raise.rb:109:5:110:25 | [ensure: return] ensure ... | raise.rb:106:7:108:9 | [ensure: return] if ... | | raise.rb:109:5:110:25 | [ensure: return] ensure ... | raise.rb:106:10:106:11 | [ensure: return] b1 | @@ -4038,14 +4038,14 @@ postDominance | raise.rb:109:5:110:25 | ensure ... | raise.rb:106:7:108:9 | if ... | | raise.rb:109:5:110:25 | ensure ... | raise.rb:106:10:106:11 | b1 | | raise.rb:109:5:110:25 | ensure ... | raise.rb:109:5:110:25 | ensure ... | -| raise.rb:115:3:115:22 | [ensure: raise] self | raise.rb:115:3:115:22 | [ensure: raise] self | +| raise.rb:115:3:115:22 | [ensure: exception] self | raise.rb:115:3:115:22 | [ensure: exception] self | | raise.rb:115:3:115:22 | self | raise.rb:99:5:100:20 | elsif ... | | raise.rb:115:3:115:22 | self | raise.rb:104:5:104:23 | self | | raise.rb:115:3:115:22 | self | raise.rb:106:7:108:9 | if ... | | raise.rb:115:3:115:22 | self | raise.rb:106:10:106:11 | b1 | | raise.rb:115:3:115:22 | self | raise.rb:109:5:110:25 | ensure ... | | raise.rb:115:3:115:22 | self | raise.rb:115:3:115:22 | self | -| raise.rb:116:3:118:5 | [ensure: raise] if ... | raise.rb:116:3:118:5 | [ensure: raise] if ... | +| raise.rb:116:3:118:5 | [ensure: exception] if ... | raise.rb:116:3:118:5 | [ensure: exception] if ... | | raise.rb:116:3:118:5 | [ensure: return] if ... | raise.rb:100:15:100:19 | x < 0 | | raise.rb:116:3:118:5 | [ensure: return] if ... | raise.rb:106:7:108:9 | [ensure: return] if ... | | raise.rb:116:3:118:5 | [ensure: return] if ... | raise.rb:106:10:106:11 | [ensure: return] b1 | @@ -4058,7 +4058,7 @@ postDominance | raise.rb:116:3:118:5 | if ... | raise.rb:109:5:110:25 | ensure ... | | raise.rb:116:3:118:5 | if ... | raise.rb:115:3:115:22 | self | | raise.rb:116:3:118:5 | if ... | raise.rb:116:3:118:5 | if ... | -| raise.rb:117:5:117:22 | [ensure: raise] self | raise.rb:117:5:117:22 | [ensure: raise] self | +| raise.rb:117:5:117:22 | [ensure: exception] self | raise.rb:117:5:117:22 | [ensure: exception] self | | raise.rb:117:5:117:22 | [ensure: return] self | raise.rb:117:5:117:22 | [ensure: return] self | | raise.rb:117:5:117:22 | self | raise.rb:117:5:117:22 | self | | raise.rb:121:1:126:3 | enter m10 | raise.rb:121:1:126:3 | enter m10 | @@ -4074,7 +4074,7 @@ postDominance | raise.rb:134:10:134:19 | ExceptionB | raise.rb:134:10:134:19 | ExceptionB | | raise.rb:135:5:135:21 | self | raise.rb:134:10:134:19 | ExceptionB | | raise.rb:135:5:135:21 | self | raise.rb:135:5:135:21 | self | -| raise.rb:137:5:137:17 | [ensure: raise] self | raise.rb:137:5:137:17 | [ensure: raise] self | +| raise.rb:137:5:137:17 | [ensure: exception] self | raise.rb:137:5:137:17 | [ensure: exception] self | | raise.rb:137:5:137:17 | self | raise.rb:128:1:140:3 | enter m11 | | raise.rb:137:5:137:17 | self | raise.rb:130:5:132:7 | if ... | | raise.rb:137:5:137:17 | self | raise.rb:131:7:131:22 | self | @@ -4131,10 +4131,10 @@ immediateDominator | break_ensure.rb:3:5:5:7 | if ... | break_ensure.rb:3:8:3:8 | x | | break_ensure.rb:3:8:3:8 | x | break_ensure.rb:2:9:2:9 | x | | break_ensure.rb:4:7:4:11 | break | break_ensure.rb:3:8:3:8 | x | -| break_ensure.rb:8:3:10:5 | [ensure: raise] if ... | break_ensure.rb:8:6:8:13 | [ensure: raise] self | +| break_ensure.rb:8:3:10:5 | [ensure: exception] if ... | break_ensure.rb:8:6:8:13 | [ensure: exception] self | | break_ensure.rb:8:3:10:5 | if ... | break_ensure.rb:2:3:6:5 | while ... | -| break_ensure.rb:8:6:8:13 | [ensure: raise] self | break_ensure.rb:2:9:2:9 | x | -| break_ensure.rb:9:5:9:23 | [ensure: raise] self | break_ensure.rb:8:6:8:13 | [ensure: raise] self | +| break_ensure.rb:8:6:8:13 | [ensure: exception] self | break_ensure.rb:2:9:2:9 | x | +| break_ensure.rb:9:5:9:23 | [ensure: exception] self | break_ensure.rb:8:6:8:13 | [ensure: exception] self | | break_ensure.rb:9:5:9:23 | self | break_ensure.rb:2:3:6:5 | while ... | | break_ensure.rb:14:3:24:5 | while ... | break_ensure.rb:14:9:14:9 | x | | break_ensure.rb:14:9:14:9 | x | break_ensure.rb:13:1:25:3 | enter m2 | @@ -4142,29 +4142,29 @@ immediateDominator | break_ensure.rb:16:10:16:10 | x | break_ensure.rb:14:9:14:9 | x | | break_ensure.rb:17:9:17:13 | break | break_ensure.rb:16:10:16:10 | x | | break_ensure.rb:20:7:22:9 | [ensure: break] if ... | break_ensure.rb:17:9:17:13 | break | -| break_ensure.rb:20:7:22:9 | [ensure: raise] if ... | break_ensure.rb:20:10:20:10 | [ensure: raise] y | +| break_ensure.rb:20:7:22:9 | [ensure: exception] if ... | break_ensure.rb:20:10:20:10 | [ensure: exception] y | | break_ensure.rb:20:7:22:9 | if ... | break_ensure.rb:16:7:18:9 | if ... | -| break_ensure.rb:20:10:20:10 | [ensure: raise] y | break_ensure.rb:16:10:16:10 | x | +| break_ensure.rb:20:10:20:10 | [ensure: exception] y | break_ensure.rb:16:10:16:10 | x | | break_ensure.rb:21:9:21:20 | [ensure: break] self | break_ensure.rb:17:9:17:13 | break | -| break_ensure.rb:21:9:21:20 | [ensure: raise] self | break_ensure.rb:20:10:20:10 | [ensure: raise] y | +| break_ensure.rb:21:9:21:20 | [ensure: exception] self | break_ensure.rb:20:10:20:10 | [ensure: exception] y | | break_ensure.rb:21:9:21:20 | self | break_ensure.rb:16:7:18:9 | if ... | | break_ensure.rb:27:1:42:3 | exit m3 | break_ensure.rb:27:1:42:3 | enter m3 | | break_ensure.rb:27:1:42:3 | exit m3 (normal) | break_ensure.rb:27:1:42:3 | enter m3 | | break_ensure.rb:29:5:31:7 | if ... | break_ensure.rb:27:1:42:3 | enter m3 | | break_ensure.rb:30:7:30:12 | return | break_ensure.rb:27:1:42:3 | enter m3 | -| break_ensure.rb:33:5:39:7 | [ensure: raise] while ... | break_ensure.rb:33:11:33:11 | [ensure: raise] y | +| break_ensure.rb:33:5:39:7 | [ensure: exception] while ... | break_ensure.rb:33:11:33:11 | [ensure: exception] y | | break_ensure.rb:33:5:39:7 | [ensure: return] while ... | break_ensure.rb:33:11:33:11 | [ensure: return] y | | break_ensure.rb:33:5:39:7 | while ... | break_ensure.rb:33:11:33:11 | y | -| break_ensure.rb:33:11:33:11 | [ensure: raise] y | break_ensure.rb:27:1:42:3 | enter m3 | +| break_ensure.rb:33:11:33:11 | [ensure: exception] y | break_ensure.rb:27:1:42:3 | enter m3 | | break_ensure.rb:33:11:33:11 | [ensure: return] y | break_ensure.rb:30:7:30:12 | return | | break_ensure.rb:33:11:33:11 | y | break_ensure.rb:29:5:31:7 | if ... | -| break_ensure.rb:35:9:37:11 | [ensure: raise] if ... | break_ensure.rb:35:12:35:12 | [ensure: raise] x | +| break_ensure.rb:35:9:37:11 | [ensure: exception] if ... | break_ensure.rb:35:12:35:12 | [ensure: exception] x | | break_ensure.rb:35:9:37:11 | [ensure: return] if ... | break_ensure.rb:35:12:35:12 | [ensure: return] x | | break_ensure.rb:35:9:37:11 | if ... | break_ensure.rb:35:12:35:12 | x | -| break_ensure.rb:35:12:35:12 | [ensure: raise] x | break_ensure.rb:33:11:33:11 | [ensure: raise] y | +| break_ensure.rb:35:12:35:12 | [ensure: exception] x | break_ensure.rb:33:11:33:11 | [ensure: exception] y | | break_ensure.rb:35:12:35:12 | [ensure: return] x | break_ensure.rb:33:11:33:11 | [ensure: return] y | | break_ensure.rb:35:12:35:12 | x | break_ensure.rb:33:11:33:11 | y | -| break_ensure.rb:36:11:36:15 | [ensure: raise] break | break_ensure.rb:35:12:35:12 | [ensure: raise] x | +| break_ensure.rb:36:11:36:15 | [ensure: exception] break | break_ensure.rb:35:12:35:12 | [ensure: exception] x | | break_ensure.rb:36:11:36:15 | [ensure: return] break | break_ensure.rb:35:12:35:12 | [ensure: return] x | | break_ensure.rb:36:11:36:15 | break | break_ensure.rb:35:12:35:12 | x | | break_ensure.rb:45:3:55:5 | while ... | break_ensure.rb:45:9:45:9 | x | @@ -4172,11 +4172,11 @@ immediateDominator | break_ensure.rb:47:7:49:9 | if ... | break_ensure.rb:47:10:47:10 | x | | break_ensure.rb:47:10:47:10 | x | break_ensure.rb:45:9:45:9 | x | | break_ensure.rb:48:9:48:16 | self | break_ensure.rb:47:10:47:10 | x | -| break_ensure.rb:51:7:53:9 | [ensure: raise] if ... | break_ensure.rb:51:10:51:10 | [ensure: raise] x | +| break_ensure.rb:51:7:53:9 | [ensure: exception] if ... | break_ensure.rb:51:10:51:10 | [ensure: exception] x | | break_ensure.rb:51:7:53:9 | if ... | break_ensure.rb:47:7:49:9 | if ... | -| break_ensure.rb:51:10:51:10 | [ensure: raise] x | break_ensure.rb:47:10:47:10 | x | +| break_ensure.rb:51:10:51:10 | [ensure: exception] x | break_ensure.rb:47:10:47:10 | x | | break_ensure.rb:52:15:52:16 | 10 | break_ensure.rb:47:7:49:9 | if ... | -| break_ensure.rb:52:15:52:16 | [ensure: raise] 10 | break_ensure.rb:51:10:51:10 | [ensure: raise] x | +| break_ensure.rb:52:15:52:16 | [ensure: exception] 10 | break_ensure.rb:51:10:51:10 | [ensure: exception] x | | case.rb:2:3:5:5 | case ... | case.rb:1:1:6:3 | enter if_in_case | | case.rb:3:5:3:42 | [match] when ... | case.rb:1:1:6:3 | enter if_in_case | | case.rb:3:5:3:42 | [no-match] when ... | case.rb:1:1:6:3 | enter if_in_case | @@ -4470,7 +4470,7 @@ immediateDominator | raise.rb:71:3:72:18 | elsif ... | raise.rb:71:9:71:9 | x | | raise.rb:71:9:71:9 | x | raise.rb:68:1:77:3 | enter m7 | | raise.rb:72:13:72:17 | x < 0 | raise.rb:71:9:71:9 | x | -| raise.rb:76:3:76:15 | [ensure: raise] self | raise.rb:68:1:77:3 | enter m7 | +| raise.rb:76:3:76:15 | [ensure: exception] self | raise.rb:68:1:77:3 | enter m7 | | raise.rb:76:3:76:15 | self | raise.rb:71:3:72:18 | elsif ... | | raise.rb:79:1:92:3 | exit m8 | raise.rb:79:1:92:3 | enter m8 | | raise.rb:79:1:92:3 | exit m8 (normal) | raise.rb:84:11:84:11 | x | @@ -4478,7 +4478,7 @@ immediateDominator | raise.rb:84:5:85:20 | elsif ... | raise.rb:84:11:84:11 | x | | raise.rb:84:11:84:11 | x | raise.rb:79:1:92:3 | enter m8 | | raise.rb:85:15:85:19 | x < 0 | raise.rb:84:11:84:11 | x | -| raise.rb:89:5:89:17 | [ensure: raise] self | raise.rb:79:1:92:3 | enter m8 | +| raise.rb:89:5:89:17 | [ensure: exception] self | raise.rb:79:1:92:3 | enter m8 | | raise.rb:89:5:89:17 | self | raise.rb:84:5:85:20 | elsif ... | | raise.rb:94:1:119:3 | exit m9 | raise.rb:94:1:119:3 | enter m9 | | raise.rb:94:1:119:3 | exit m9 (abnormal) | raise.rb:94:1:119:3 | enter m9 | @@ -4488,29 +4488,29 @@ immediateDominator | raise.rb:99:5:100:20 | elsif ... | raise.rb:99:11:99:11 | x | | raise.rb:99:11:99:11 | x | raise.rb:97:8:97:8 | x | | raise.rb:100:15:100:19 | x < 0 | raise.rb:99:11:99:11 | x | -| raise.rb:104:5:104:23 | [ensure: raise] self | raise.rb:97:8:97:8 | x | +| raise.rb:104:5:104:23 | [ensure: exception] self | raise.rb:97:8:97:8 | x | | raise.rb:104:5:104:23 | self | raise.rb:99:5:100:20 | elsif ... | -| raise.rb:106:7:108:9 | [ensure: raise] if ... | raise.rb:106:10:106:11 | [ensure: raise] b1 | +| raise.rb:106:7:108:9 | [ensure: exception] if ... | raise.rb:106:10:106:11 | [ensure: exception] b1 | | raise.rb:106:7:108:9 | [ensure: return] if ... | raise.rb:106:10:106:11 | [ensure: return] b1 | | raise.rb:106:7:108:9 | if ... | raise.rb:106:10:106:11 | b1 | -| raise.rb:106:10:106:11 | [ensure: raise] b1 | raise.rb:104:5:104:23 | [ensure: raise] self | +| raise.rb:106:10:106:11 | [ensure: exception] b1 | raise.rb:104:5:104:23 | [ensure: exception] self | | raise.rb:106:10:106:11 | [ensure: return] b1 | raise.rb:100:15:100:19 | x < 0 | | raise.rb:106:10:106:11 | b1 | raise.rb:104:5:104:23 | self | -| raise.rb:107:9:107:26 | [ensure: raise] self | raise.rb:106:10:106:11 | [ensure: raise] b1 | +| raise.rb:107:9:107:26 | [ensure: exception] self | raise.rb:106:10:106:11 | [ensure: exception] b1 | | raise.rb:107:9:107:26 | [ensure: return] self | raise.rb:106:10:106:11 | [ensure: return] b1 | | raise.rb:107:9:107:26 | self | raise.rb:106:10:106:11 | b1 | -| raise.rb:109:5:110:25 | [ensure(1): raise] ensure ... | raise.rb:107:9:107:26 | self | -| raise.rb:109:5:110:25 | [ensure: raise, ensure(1): raise] ensure ... | raise.rb:107:9:107:26 | [ensure: raise] self | -| raise.rb:109:5:110:25 | [ensure: raise] ensure ... | raise.rb:106:7:108:9 | [ensure: raise] if ... | -| raise.rb:109:5:110:25 | [ensure: return, ensure(1): raise] ensure ... | raise.rb:107:9:107:26 | [ensure: return] self | +| raise.rb:109:5:110:25 | [ensure(1): exception] ensure ... | raise.rb:107:9:107:26 | self | +| raise.rb:109:5:110:25 | [ensure: exception, ensure(1): exception] ensure ... | raise.rb:107:9:107:26 | [ensure: exception] self | +| raise.rb:109:5:110:25 | [ensure: exception] ensure ... | raise.rb:106:7:108:9 | [ensure: exception] if ... | +| raise.rb:109:5:110:25 | [ensure: return, ensure(1): exception] ensure ... | raise.rb:107:9:107:26 | [ensure: return] self | | raise.rb:109:5:110:25 | [ensure: return] ensure ... | raise.rb:106:7:108:9 | [ensure: return] if ... | | raise.rb:109:5:110:25 | ensure ... | raise.rb:106:7:108:9 | if ... | -| raise.rb:115:3:115:22 | [ensure: raise] self | raise.rb:94:1:119:3 | enter m9 | +| raise.rb:115:3:115:22 | [ensure: exception] self | raise.rb:94:1:119:3 | enter m9 | | raise.rb:115:3:115:22 | self | raise.rb:109:5:110:25 | ensure ... | -| raise.rb:116:3:118:5 | [ensure: raise] if ... | raise.rb:115:3:115:22 | [ensure: raise] self | +| raise.rb:116:3:118:5 | [ensure: exception] if ... | raise.rb:115:3:115:22 | [ensure: exception] self | | raise.rb:116:3:118:5 | [ensure: return] if ... | raise.rb:109:5:110:25 | [ensure: return] ensure ... | | raise.rb:116:3:118:5 | if ... | raise.rb:115:3:115:22 | self | -| raise.rb:117:5:117:22 | [ensure: raise] self | raise.rb:115:3:115:22 | [ensure: raise] self | +| raise.rb:117:5:117:22 | [ensure: exception] self | raise.rb:115:3:115:22 | [ensure: exception] self | | raise.rb:117:5:117:22 | [ensure: return] self | raise.rb:109:5:110:25 | [ensure: return] ensure ... | | raise.rb:117:5:117:22 | self | raise.rb:115:3:115:22 | self | | raise.rb:121:1:126:3 | exit m10 | raise.rb:121:1:126:3 | enter m10 | @@ -4522,7 +4522,7 @@ immediateDominator | raise.rb:133:3:133:19 | rescue ... | raise.rb:131:7:131:22 | self | | raise.rb:134:10:134:19 | ExceptionB | raise.rb:131:7:131:22 | self | | raise.rb:135:5:135:21 | self | raise.rb:134:10:134:19 | ExceptionB | -| raise.rb:137:5:137:17 | [ensure: raise] self | raise.rb:134:10:134:19 | ExceptionB | +| raise.rb:137:5:137:17 | [ensure: exception] self | raise.rb:134:10:134:19 | ExceptionB | | raise.rb:137:5:137:17 | self | raise.rb:128:1:140:3 | enter m11 | | raise.rb:142:1:148:3 | exit m12 (normal) | raise.rb:142:1:148:3 | enter m12 | | raise.rb:143:3:145:5 | if ... | raise.rb:142:1:148:3 | enter m12 | @@ -4550,16 +4550,16 @@ controls | break_ensure.rb:2:9:2:9 | x | break_ensure.rb:4:7:4:11 | break | true | | break_ensure.rb:3:8:3:8 | x | break_ensure.rb:3:5:5:7 | if ... | false | | break_ensure.rb:3:8:3:8 | x | break_ensure.rb:4:7:4:11 | break | true | -| break_ensure.rb:8:6:8:13 | [ensure: raise] self | break_ensure.rb:9:5:9:23 | [ensure: raise] self | true | +| break_ensure.rb:8:6:8:13 | [ensure: exception] self | break_ensure.rb:9:5:9:23 | [ensure: exception] self | true | | break_ensure.rb:14:9:14:9 | x | break_ensure.rb:16:7:18:9 | if ... | true | | break_ensure.rb:14:9:14:9 | x | break_ensure.rb:16:10:16:10 | x | true | | break_ensure.rb:14:9:14:9 | x | break_ensure.rb:17:9:17:13 | break | true | | break_ensure.rb:14:9:14:9 | x | break_ensure.rb:20:7:22:9 | [ensure: break] if ... | true | -| break_ensure.rb:14:9:14:9 | x | break_ensure.rb:20:7:22:9 | [ensure: raise] if ... | true | +| break_ensure.rb:14:9:14:9 | x | break_ensure.rb:20:7:22:9 | [ensure: exception] if ... | true | | break_ensure.rb:14:9:14:9 | x | break_ensure.rb:20:7:22:9 | if ... | true | -| break_ensure.rb:14:9:14:9 | x | break_ensure.rb:20:10:20:10 | [ensure: raise] y | true | +| break_ensure.rb:14:9:14:9 | x | break_ensure.rb:20:10:20:10 | [ensure: exception] y | true | | break_ensure.rb:14:9:14:9 | x | break_ensure.rb:21:9:21:20 | [ensure: break] self | true | -| break_ensure.rb:14:9:14:9 | x | break_ensure.rb:21:9:21:20 | [ensure: raise] self | true | +| break_ensure.rb:14:9:14:9 | x | break_ensure.rb:21:9:21:20 | [ensure: exception] self | true | | break_ensure.rb:14:9:14:9 | x | break_ensure.rb:21:9:21:20 | self | true | | break_ensure.rb:16:7:18:9 | if ... | break_ensure.rb:21:9:21:20 | self | true | | break_ensure.rb:16:10:16:10 | x | break_ensure.rb:16:7:18:9 | if ... | false | @@ -4569,7 +4569,7 @@ controls | break_ensure.rb:16:10:16:10 | x | break_ensure.rb:21:9:21:20 | [ensure: break] self | true | | break_ensure.rb:16:10:16:10 | x | break_ensure.rb:21:9:21:20 | self | false | | break_ensure.rb:17:9:17:13 | break | break_ensure.rb:21:9:21:20 | [ensure: break] self | true | -| break_ensure.rb:20:10:20:10 | [ensure: raise] y | break_ensure.rb:21:9:21:20 | [ensure: raise] self | true | +| break_ensure.rb:20:10:20:10 | [ensure: exception] y | break_ensure.rb:21:9:21:20 | [ensure: exception] self | true | | break_ensure.rb:27:1:42:3 | enter m3 | break_ensure.rb:29:5:31:7 | if ... | false | | break_ensure.rb:27:1:42:3 | enter m3 | break_ensure.rb:30:7:30:12 | return | true | | break_ensure.rb:27:1:42:3 | enter m3 | break_ensure.rb:33:5:39:7 | [ensure: return] while ... | true | @@ -4582,17 +4582,17 @@ controls | break_ensure.rb:27:1:42:3 | enter m3 | break_ensure.rb:35:12:35:12 | x | false | | break_ensure.rb:27:1:42:3 | enter m3 | break_ensure.rb:36:11:36:15 | [ensure: return] break | true | | break_ensure.rb:27:1:42:3 | enter m3 | break_ensure.rb:36:11:36:15 | break | false | -| break_ensure.rb:33:11:33:11 | [ensure: raise] y | break_ensure.rb:35:9:37:11 | [ensure: raise] if ... | true | -| break_ensure.rb:33:11:33:11 | [ensure: raise] y | break_ensure.rb:35:12:35:12 | [ensure: raise] x | true | -| break_ensure.rb:33:11:33:11 | [ensure: raise] y | break_ensure.rb:36:11:36:15 | [ensure: raise] break | true | +| break_ensure.rb:33:11:33:11 | [ensure: exception] y | break_ensure.rb:35:9:37:11 | [ensure: exception] if ... | true | +| break_ensure.rb:33:11:33:11 | [ensure: exception] y | break_ensure.rb:35:12:35:12 | [ensure: exception] x | true | +| break_ensure.rb:33:11:33:11 | [ensure: exception] y | break_ensure.rb:36:11:36:15 | [ensure: exception] break | true | | break_ensure.rb:33:11:33:11 | [ensure: return] y | break_ensure.rb:35:9:37:11 | [ensure: return] if ... | true | | break_ensure.rb:33:11:33:11 | [ensure: return] y | break_ensure.rb:35:12:35:12 | [ensure: return] x | true | | break_ensure.rb:33:11:33:11 | [ensure: return] y | break_ensure.rb:36:11:36:15 | [ensure: return] break | true | | break_ensure.rb:33:11:33:11 | y | break_ensure.rb:35:9:37:11 | if ... | true | | break_ensure.rb:33:11:33:11 | y | break_ensure.rb:35:12:35:12 | x | true | | break_ensure.rb:33:11:33:11 | y | break_ensure.rb:36:11:36:15 | break | true | -| break_ensure.rb:35:12:35:12 | [ensure: raise] x | break_ensure.rb:35:9:37:11 | [ensure: raise] if ... | false | -| break_ensure.rb:35:12:35:12 | [ensure: raise] x | break_ensure.rb:36:11:36:15 | [ensure: raise] break | true | +| break_ensure.rb:35:12:35:12 | [ensure: exception] x | break_ensure.rb:35:9:37:11 | [ensure: exception] if ... | false | +| break_ensure.rb:35:12:35:12 | [ensure: exception] x | break_ensure.rb:36:11:36:15 | [ensure: exception] break | true | | break_ensure.rb:35:12:35:12 | [ensure: return] x | break_ensure.rb:35:9:37:11 | [ensure: return] if ... | false | | break_ensure.rb:35:12:35:12 | [ensure: return] x | break_ensure.rb:36:11:36:15 | [ensure: return] break | true | | break_ensure.rb:35:12:35:12 | x | break_ensure.rb:35:9:37:11 | if ... | false | @@ -4600,19 +4600,19 @@ controls | break_ensure.rb:45:9:45:9 | x | break_ensure.rb:47:7:49:9 | if ... | true | | break_ensure.rb:45:9:45:9 | x | break_ensure.rb:47:10:47:10 | x | true | | break_ensure.rb:45:9:45:9 | x | break_ensure.rb:48:9:48:16 | self | true | -| break_ensure.rb:45:9:45:9 | x | break_ensure.rb:51:7:53:9 | [ensure: raise] if ... | true | +| break_ensure.rb:45:9:45:9 | x | break_ensure.rb:51:7:53:9 | [ensure: exception] if ... | true | | break_ensure.rb:45:9:45:9 | x | break_ensure.rb:51:7:53:9 | if ... | true | -| break_ensure.rb:45:9:45:9 | x | break_ensure.rb:51:10:51:10 | [ensure: raise] x | true | +| break_ensure.rb:45:9:45:9 | x | break_ensure.rb:51:10:51:10 | [ensure: exception] x | true | | break_ensure.rb:45:9:45:9 | x | break_ensure.rb:52:15:52:16 | 10 | true | -| break_ensure.rb:45:9:45:9 | x | break_ensure.rb:52:15:52:16 | [ensure: raise] 10 | true | +| break_ensure.rb:45:9:45:9 | x | break_ensure.rb:52:15:52:16 | [ensure: exception] 10 | true | | break_ensure.rb:47:7:49:9 | if ... | break_ensure.rb:51:7:53:9 | if ... | false | | break_ensure.rb:47:7:49:9 | if ... | break_ensure.rb:52:15:52:16 | 10 | true | | break_ensure.rb:47:10:47:10 | x | break_ensure.rb:47:7:49:9 | if ... | false | | break_ensure.rb:47:10:47:10 | x | break_ensure.rb:48:9:48:16 | self | true | | break_ensure.rb:47:10:47:10 | x | break_ensure.rb:51:7:53:9 | if ... | false | | break_ensure.rb:47:10:47:10 | x | break_ensure.rb:52:15:52:16 | 10 | false | -| break_ensure.rb:51:10:51:10 | [ensure: raise] x | break_ensure.rb:51:7:53:9 | [ensure: raise] if ... | false | -| break_ensure.rb:51:10:51:10 | [ensure: raise] x | break_ensure.rb:52:15:52:16 | [ensure: raise] 10 | true | +| break_ensure.rb:51:10:51:10 | [ensure: exception] x | break_ensure.rb:51:7:53:9 | [ensure: exception] if ... | false | +| break_ensure.rb:51:10:51:10 | [ensure: exception] x | break_ensure.rb:52:15:52:16 | [ensure: exception] 10 | true | | case.rb:1:1:6:3 | enter if_in_case | case.rb:3:5:3:42 | [match] when ... | match | | case.rb:1:1:6:3 | enter if_in_case | case.rb:3:5:3:42 | [no-match] when ... | no-match | | case.rb:1:1:6:3 | enter if_in_case | case.rb:3:18:3:41 | if ... | match | @@ -5726,8 +5726,8 @@ controls | raise.rb:97:8:97:8 | x | raise.rb:106:10:106:11 | b1 | false | | raise.rb:97:8:97:8 | x | raise.rb:107:9:107:26 | [ensure: return] self | false | | raise.rb:97:8:97:8 | x | raise.rb:107:9:107:26 | self | false | -| raise.rb:97:8:97:8 | x | raise.rb:109:5:110:25 | [ensure(1): raise] ensure ... | false | -| raise.rb:97:8:97:8 | x | raise.rb:109:5:110:25 | [ensure: return, ensure(1): raise] ensure ... | false | +| raise.rb:97:8:97:8 | x | raise.rb:109:5:110:25 | [ensure(1): exception] ensure ... | false | +| raise.rb:97:8:97:8 | x | raise.rb:109:5:110:25 | [ensure: return, ensure(1): exception] ensure ... | false | | raise.rb:97:8:97:8 | x | raise.rb:109:5:110:25 | [ensure: return] ensure ... | false | | raise.rb:97:8:97:8 | x | raise.rb:109:5:110:25 | ensure ... | false | | raise.rb:97:8:97:8 | x | raise.rb:115:3:115:22 | self | false | @@ -5744,8 +5744,8 @@ controls | raise.rb:99:11:99:11 | x | raise.rb:106:10:106:11 | b1 | false | | raise.rb:99:11:99:11 | x | raise.rb:107:9:107:26 | [ensure: return] self | true | | raise.rb:99:11:99:11 | x | raise.rb:107:9:107:26 | self | false | -| raise.rb:99:11:99:11 | x | raise.rb:109:5:110:25 | [ensure(1): raise] ensure ... | false | -| raise.rb:99:11:99:11 | x | raise.rb:109:5:110:25 | [ensure: return, ensure(1): raise] ensure ... | true | +| raise.rb:99:11:99:11 | x | raise.rb:109:5:110:25 | [ensure(1): exception] ensure ... | false | +| raise.rb:99:11:99:11 | x | raise.rb:109:5:110:25 | [ensure: return, ensure(1): exception] ensure ... | true | | raise.rb:99:11:99:11 | x | raise.rb:109:5:110:25 | [ensure: return] ensure ... | true | | raise.rb:99:11:99:11 | x | raise.rb:109:5:110:25 | ensure ... | false | | raise.rb:99:11:99:11 | x | raise.rb:115:3:115:22 | self | false | @@ -5753,27 +5753,27 @@ controls | raise.rb:99:11:99:11 | x | raise.rb:116:3:118:5 | if ... | false | | raise.rb:99:11:99:11 | x | raise.rb:117:5:117:22 | [ensure: return] self | true | | raise.rb:99:11:99:11 | x | raise.rb:117:5:117:22 | self | false | -| raise.rb:106:10:106:11 | [ensure: raise] b1 | raise.rb:106:7:108:9 | [ensure: raise] if ... | false | -| raise.rb:106:10:106:11 | [ensure: raise] b1 | raise.rb:107:9:107:26 | [ensure: raise] self | true | -| raise.rb:106:10:106:11 | [ensure: raise] b1 | raise.rb:109:5:110:25 | [ensure: raise, ensure(1): raise] ensure ... | true | -| raise.rb:106:10:106:11 | [ensure: raise] b1 | raise.rb:109:5:110:25 | [ensure: raise] ensure ... | false | +| raise.rb:106:10:106:11 | [ensure: exception] b1 | raise.rb:106:7:108:9 | [ensure: exception] if ... | false | +| raise.rb:106:10:106:11 | [ensure: exception] b1 | raise.rb:107:9:107:26 | [ensure: exception] self | true | +| raise.rb:106:10:106:11 | [ensure: exception] b1 | raise.rb:109:5:110:25 | [ensure: exception, ensure(1): exception] ensure ... | true | +| raise.rb:106:10:106:11 | [ensure: exception] b1 | raise.rb:109:5:110:25 | [ensure: exception] ensure ... | false | | raise.rb:106:10:106:11 | [ensure: return] b1 | raise.rb:106:7:108:9 | [ensure: return] if ... | false | | raise.rb:106:10:106:11 | [ensure: return] b1 | raise.rb:107:9:107:26 | [ensure: return] self | true | -| raise.rb:106:10:106:11 | [ensure: return] b1 | raise.rb:109:5:110:25 | [ensure: return, ensure(1): raise] ensure ... | true | +| raise.rb:106:10:106:11 | [ensure: return] b1 | raise.rb:109:5:110:25 | [ensure: return, ensure(1): exception] ensure ... | true | | raise.rb:106:10:106:11 | [ensure: return] b1 | raise.rb:109:5:110:25 | [ensure: return] ensure ... | false | | raise.rb:106:10:106:11 | [ensure: return] b1 | raise.rb:116:3:118:5 | [ensure: return] if ... | false | | raise.rb:106:10:106:11 | [ensure: return] b1 | raise.rb:117:5:117:22 | [ensure: return] self | false | | raise.rb:106:10:106:11 | b1 | raise.rb:106:7:108:9 | if ... | false | | raise.rb:106:10:106:11 | b1 | raise.rb:107:9:107:26 | self | true | -| raise.rb:106:10:106:11 | b1 | raise.rb:109:5:110:25 | [ensure(1): raise] ensure ... | true | +| raise.rb:106:10:106:11 | b1 | raise.rb:109:5:110:25 | [ensure(1): exception] ensure ... | true | | raise.rb:106:10:106:11 | b1 | raise.rb:109:5:110:25 | ensure ... | false | | raise.rb:106:10:106:11 | b1 | raise.rb:115:3:115:22 | self | false | | raise.rb:106:10:106:11 | b1 | raise.rb:116:3:118:5 | if ... | false | | raise.rb:106:10:106:11 | b1 | raise.rb:117:5:117:22 | self | false | | raise.rb:109:5:110:25 | [ensure: return] ensure ... | raise.rb:116:3:118:5 | [ensure: return] if ... | false | | raise.rb:109:5:110:25 | [ensure: return] ensure ... | raise.rb:117:5:117:22 | [ensure: return] self | true | -| raise.rb:115:3:115:22 | [ensure: raise] self | raise.rb:116:3:118:5 | [ensure: raise] if ... | false | -| raise.rb:115:3:115:22 | [ensure: raise] self | raise.rb:117:5:117:22 | [ensure: raise] self | true | +| raise.rb:115:3:115:22 | [ensure: exception] self | raise.rb:116:3:118:5 | [ensure: exception] if ... | false | +| raise.rb:115:3:115:22 | [ensure: exception] self | raise.rb:117:5:117:22 | [ensure: exception] self | true | | raise.rb:115:3:115:22 | self | raise.rb:116:3:118:5 | if ... | false | | raise.rb:115:3:115:22 | self | raise.rb:117:5:117:22 | self | true | | raise.rb:121:1:126:3 | enter m10 | raise.rb:121:14:121:30 | self | false | @@ -5785,11 +5785,11 @@ controls | raise.rb:128:1:140:3 | enter m11 | raise.rb:133:3:133:19 | rescue ... | true | | raise.rb:128:1:140:3 | enter m11 | raise.rb:134:10:134:19 | ExceptionB | true | | raise.rb:128:1:140:3 | enter m11 | raise.rb:135:5:135:21 | self | true | -| raise.rb:128:1:140:3 | enter m11 | raise.rb:137:5:137:17 | [ensure: raise] self | true | +| raise.rb:128:1:140:3 | enter m11 | raise.rb:137:5:137:17 | [ensure: exception] self | true | | raise.rb:131:7:131:22 | self | raise.rb:133:3:133:19 | rescue ... | match | | raise.rb:131:7:131:22 | self | raise.rb:134:10:134:19 | ExceptionB | no-match | | raise.rb:131:7:131:22 | self | raise.rb:135:5:135:21 | self | no-match | -| raise.rb:131:7:131:22 | self | raise.rb:137:5:137:17 | [ensure: raise] self | no-match | +| raise.rb:131:7:131:22 | self | raise.rb:137:5:137:17 | [ensure: exception] self | no-match | | raise.rb:134:10:134:19 | ExceptionB | raise.rb:135:5:135:21 | self | match | | raise.rb:142:1:148:3 | enter m12 | raise.rb:143:3:145:5 | if ... | false | | raise.rb:142:1:148:3 | enter m12 | raise.rb:144:5:144:12 | self | true | @@ -5810,34 +5810,34 @@ successor | break_ensure.rb:2:3:6:5 | while ... | break_ensure.rb:9:5:9:23 | self | true | | break_ensure.rb:2:9:2:9 | x | break_ensure.rb:2:3:6:5 | while ... | false | | break_ensure.rb:2:9:2:9 | x | break_ensure.rb:3:8:3:8 | x | true | -| break_ensure.rb:2:9:2:9 | x | break_ensure.rb:8:6:8:13 | [ensure: raise] self | raise | -| break_ensure.rb:3:8:3:8 | x | break_ensure.rb:2:3:6:5 | while ... | raise | +| break_ensure.rb:2:9:2:9 | x | break_ensure.rb:8:6:8:13 | [ensure: exception] self | exception | +| break_ensure.rb:3:8:3:8 | x | break_ensure.rb:2:3:6:5 | while ... | exception | | break_ensure.rb:3:8:3:8 | x | break_ensure.rb:3:5:5:7 | if ... | false | | break_ensure.rb:3:8:3:8 | x | break_ensure.rb:4:7:4:11 | break | true | -| break_ensure.rb:8:6:8:13 | [ensure: raise] self | break_ensure.rb:8:3:10:5 | [ensure: raise] if ... | false | -| break_ensure.rb:8:6:8:13 | [ensure: raise] self | break_ensure.rb:9:5:9:23 | [ensure: raise] self | true | +| break_ensure.rb:8:6:8:13 | [ensure: exception] self | break_ensure.rb:8:3:10:5 | [ensure: exception] if ... | false | +| break_ensure.rb:8:6:8:13 | [ensure: exception] self | break_ensure.rb:9:5:9:23 | [ensure: exception] self | true | | break_ensure.rb:14:9:14:9 | x | break_ensure.rb:14:3:24:5 | while ... | false | | break_ensure.rb:14:9:14:9 | x | break_ensure.rb:16:10:16:10 | x | true | | break_ensure.rb:16:7:18:9 | if ... | break_ensure.rb:20:7:22:9 | if ... | false | | break_ensure.rb:16:7:18:9 | if ... | break_ensure.rb:21:9:21:20 | self | true | | break_ensure.rb:16:10:16:10 | x | break_ensure.rb:16:7:18:9 | if ... | false | | break_ensure.rb:16:10:16:10 | x | break_ensure.rb:17:9:17:13 | break | true | -| break_ensure.rb:16:10:16:10 | x | break_ensure.rb:20:10:20:10 | [ensure: raise] y | raise | +| break_ensure.rb:16:10:16:10 | x | break_ensure.rb:20:10:20:10 | [ensure: exception] y | exception | | break_ensure.rb:17:9:17:13 | break | break_ensure.rb:20:7:22:9 | [ensure: break] if ... | false | | break_ensure.rb:17:9:17:13 | break | break_ensure.rb:21:9:21:20 | [ensure: break] self | true | -| break_ensure.rb:20:10:20:10 | [ensure: raise] y | break_ensure.rb:20:7:22:9 | [ensure: raise] if ... | false | -| break_ensure.rb:20:10:20:10 | [ensure: raise] y | break_ensure.rb:21:9:21:20 | [ensure: raise] self | true | +| break_ensure.rb:20:10:20:10 | [ensure: exception] y | break_ensure.rb:20:7:22:9 | [ensure: exception] if ... | false | +| break_ensure.rb:20:10:20:10 | [ensure: exception] y | break_ensure.rb:21:9:21:20 | [ensure: exception] self | true | | break_ensure.rb:27:1:42:3 | enter m3 | break_ensure.rb:29:5:31:7 | if ... | false | | break_ensure.rb:27:1:42:3 | enter m3 | break_ensure.rb:30:7:30:12 | return | true | -| break_ensure.rb:27:1:42:3 | enter m3 | break_ensure.rb:33:11:33:11 | [ensure: raise] y | raise | -| break_ensure.rb:33:11:33:11 | [ensure: raise] y | break_ensure.rb:33:5:39:7 | [ensure: raise] while ... | false | -| break_ensure.rb:33:11:33:11 | [ensure: raise] y | break_ensure.rb:35:12:35:12 | [ensure: raise] x | true | +| break_ensure.rb:27:1:42:3 | enter m3 | break_ensure.rb:33:11:33:11 | [ensure: exception] y | exception | +| break_ensure.rb:33:11:33:11 | [ensure: exception] y | break_ensure.rb:33:5:39:7 | [ensure: exception] while ... | false | +| break_ensure.rb:33:11:33:11 | [ensure: exception] y | break_ensure.rb:35:12:35:12 | [ensure: exception] x | true | | break_ensure.rb:33:11:33:11 | [ensure: return] y | break_ensure.rb:33:5:39:7 | [ensure: return] while ... | false | | break_ensure.rb:33:11:33:11 | [ensure: return] y | break_ensure.rb:35:12:35:12 | [ensure: return] x | true | | break_ensure.rb:33:11:33:11 | y | break_ensure.rb:33:5:39:7 | while ... | false | | break_ensure.rb:33:11:33:11 | y | break_ensure.rb:35:12:35:12 | x | true | -| break_ensure.rb:35:12:35:12 | [ensure: raise] x | break_ensure.rb:35:9:37:11 | [ensure: raise] if ... | false | -| break_ensure.rb:35:12:35:12 | [ensure: raise] x | break_ensure.rb:36:11:36:15 | [ensure: raise] break | true | +| break_ensure.rb:35:12:35:12 | [ensure: exception] x | break_ensure.rb:35:9:37:11 | [ensure: exception] if ... | false | +| break_ensure.rb:35:12:35:12 | [ensure: exception] x | break_ensure.rb:36:11:36:15 | [ensure: exception] break | true | | break_ensure.rb:35:12:35:12 | [ensure: return] x | break_ensure.rb:35:9:37:11 | [ensure: return] if ... | false | | break_ensure.rb:35:12:35:12 | [ensure: return] x | break_ensure.rb:36:11:36:15 | [ensure: return] break | true | | break_ensure.rb:35:12:35:12 | x | break_ensure.rb:35:9:37:11 | if ... | false | @@ -5848,9 +5848,9 @@ successor | break_ensure.rb:47:7:49:9 | if ... | break_ensure.rb:52:15:52:16 | 10 | true | | break_ensure.rb:47:10:47:10 | x | break_ensure.rb:47:7:49:9 | if ... | false | | break_ensure.rb:47:10:47:10 | x | break_ensure.rb:48:9:48:16 | self | true | -| break_ensure.rb:47:10:47:10 | x | break_ensure.rb:51:10:51:10 | [ensure: raise] x | raise | -| break_ensure.rb:51:10:51:10 | [ensure: raise] x | break_ensure.rb:51:7:53:9 | [ensure: raise] if ... | false | -| break_ensure.rb:51:10:51:10 | [ensure: raise] x | break_ensure.rb:52:15:52:16 | [ensure: raise] 10 | true | +| break_ensure.rb:47:10:47:10 | x | break_ensure.rb:51:10:51:10 | [ensure: exception] x | exception | +| break_ensure.rb:51:10:51:10 | [ensure: exception] x | break_ensure.rb:51:7:53:9 | [ensure: exception] if ... | false | +| break_ensure.rb:51:10:51:10 | [ensure: exception] x | break_ensure.rb:52:15:52:16 | [ensure: exception] 10 | true | | case.rb:1:1:6:3 | enter if_in_case | case.rb:3:5:3:42 | [match] when ... | match | | case.rb:1:1:6:3 | enter if_in_case | case.rb:3:5:3:42 | [no-match] when ... | no-match | | case.rb:3:5:3:42 | [match] when ... | case.rb:3:21:3:22 | self | match | @@ -5873,9 +5873,9 @@ successor | case.rb:15:5:15:28 | in ... then ... | case.rb:15:17:15:17 | x | match | | case.rb:15:17:15:17 | x | case.rb:15:28:15:28 | 7 | false | | case.rb:15:17:15:17 | x | case.rb:16:10:16:10 | 8 | true | -| case.rb:20:1:24:3 | enter case_match_no_match | case.rb:20:1:24:3 | exit case_match_no_match (abnormal) | raise | +| case.rb:20:1:24:3 | enter case_match_no_match | case.rb:20:1:24:3 | exit case_match_no_match (abnormal) | exception | | case.rb:20:1:24:3 | enter case_match_no_match | case.rb:21:3:23:5 | case ... | match | -| case.rb:26:1:30:3 | enter case_match_raise | case.rb:26:1:30:3 | exit case_match_raise (abnormal) | raise | +| case.rb:26:1:30:3 | enter case_match_raise | case.rb:26:1:30:3 | exit case_match_raise (abnormal) | exception | | case.rb:26:1:30:3 | enter case_match_raise | case.rb:27:3:29:5 | case ... | match | | case.rb:32:1:39:3 | enter case_match_array | case.rb:33:3:38:5 | case ... | match | | case.rb:32:1:39:3 | enter case_match_array | case.rb:35:5:35:11 | in ... then ... | no-match | @@ -5889,9 +5889,9 @@ successor | case.rb:36:5:36:13 | in ... then ... | case.rb:36:9:36:9 | x | true | | case.rb:36:5:36:13 | in ... then ... | case.rb:37:5:37:27 | in ... then ... | no-match | | case.rb:36:9:36:9 | x | case.rb:33:3:38:5 | case ... | match | -| case.rb:37:5:37:27 | in ... then ... | case.rb:32:1:39:3 | exit case_match_array (abnormal) | raise | +| case.rb:37:5:37:27 | in ... then ... | case.rb:32:1:39:3 | exit case_match_array (abnormal) | exception | | case.rb:37:5:37:27 | in ... then ... | case.rb:37:8:37:26 | [ ..., * ] | match | -| case.rb:37:8:37:26 | [ ..., * ] | case.rb:32:1:39:3 | exit case_match_array (abnormal) | raise | +| case.rb:37:8:37:26 | [ ..., * ] | case.rb:32:1:39:3 | exit case_match_array (abnormal) | exception | | case.rb:37:8:37:26 | [ ..., * ] | case.rb:37:12:37:12 | a | false | | case.rb:37:8:37:26 | [ ..., * ] | case.rb:37:12:37:12 | a | match | | case.rb:37:8:37:26 | [ ..., * ] | case.rb:37:12:37:12 | a | true | @@ -5899,13 +5899,13 @@ successor | case.rb:37:15:37:15 | b | case.rb:37:19:37:19 | c | match | | case.rb:37:19:37:19 | c | case.rb:37:25:37:25 | e | match | | case.rb:37:25:37:25 | e | case.rb:33:3:38:5 | case ... | match | -| case.rb:41:1:45:3 | enter case_match_find | case.rb:41:1:45:3 | exit case_match_find (abnormal) | raise | +| case.rb:41:1:45:3 | enter case_match_find | case.rb:41:1:45:3 | exit case_match_find (abnormal) | exception | | case.rb:41:1:45:3 | enter case_match_find | case.rb:43:10:43:10 | x | false | | case.rb:41:1:45:3 | enter case_match_find | case.rb:43:10:43:10 | x | match | | case.rb:41:1:45:3 | enter case_match_find | case.rb:43:10:43:10 | x | true | -| case.rb:43:10:43:10 | x | case.rb:41:1:45:3 | exit case_match_find (abnormal) | raise | +| case.rb:43:10:43:10 | x | case.rb:41:1:45:3 | exit case_match_find (abnormal) | exception | | case.rb:43:10:43:10 | x | case.rb:43:16:43:16 | 2 | match | -| case.rb:43:16:43:16 | 2 | case.rb:41:1:45:3 | exit case_match_find (abnormal) | raise | +| case.rb:43:16:43:16 | 2 | case.rb:41:1:45:3 | exit case_match_find (abnormal) | exception | | case.rb:43:16:43:16 | 2 | case.rb:43:20:43:20 | y | match | | case.rb:47:1:53:3 | enter case_match_hash | case.rb:49:8:49:34 | { ..., ** } | match | | case.rb:47:1:53:3 | enter case_match_hash | case.rb:50:5:50:25 | in ... then ... | no-match | @@ -5924,9 +5924,9 @@ successor | case.rb:50:8:50:24 | { ..., ** } | case.rb:51:5:51:17 | in ... then ... | no-match | | case.rb:50:16:50:16 | 1 | case.rb:48:3:52:5 | case ... | match | | case.rb:50:16:50:16 | 1 | case.rb:51:5:51:17 | in ... then ... | no-match | -| case.rb:51:5:51:17 | in ... then ... | case.rb:47:1:53:3 | exit case_match_hash (abnormal) | raise | +| case.rb:51:5:51:17 | in ... then ... | case.rb:47:1:53:3 | exit case_match_hash (abnormal) | exception | | case.rb:51:5:51:17 | in ... then ... | case.rb:51:8:51:16 | { ..., ** } | match | -| case.rb:51:8:51:16 | { ..., ** } | case.rb:47:1:53:3 | exit case_match_hash (abnormal) | raise | +| case.rb:51:8:51:16 | { ..., ** } | case.rb:47:1:53:3 | exit case_match_hash (abnormal) | exception | | case.rb:51:8:51:16 | { ..., ** } | case.rb:48:3:52:5 | case ... | false | | case.rb:51:8:51:16 | { ..., ** } | case.rb:48:3:52:5 | case ... | match | | case.rb:51:8:51:16 | { ..., ** } | case.rb:48:3:52:5 | case ... | true | @@ -5997,12 +5997,12 @@ successor | case.rb:91:13:91:14 | "" | case.rb:91:18:91:19 | [ ..., * ] | no-match | | case.rb:91:18:91:19 | [ ..., * ] | case.rb:72:3:92:5 | case ... | match | | case.rb:91:18:91:19 | [ ..., * ] | case.rb:91:23:91:24 | { ..., ** } | no-match | -| case.rb:91:23:91:24 | { ..., ** } | case.rb:69:1:93:3 | exit case_match_various (abnormal) | raise | +| case.rb:91:23:91:24 | { ..., ** } | case.rb:69:1:93:3 | exit case_match_various (abnormal) | exception | | case.rb:91:23:91:24 | { ..., ** } | case.rb:72:3:92:5 | case ... | false | | case.rb:91:23:91:24 | { ..., ** } | case.rb:72:3:92:5 | case ... | match | | case.rb:91:23:91:24 | { ..., ** } | case.rb:72:3:92:5 | case ... | true | | case.rb:95:1:99:3 | enter case_match_guard_no_else | case.rb:97:13:97:13 | x | match | -| case.rb:97:13:97:13 | x | case.rb:95:1:99:3 | exit case_match_guard_no_else (abnormal) | raise | +| case.rb:97:13:97:13 | x | case.rb:95:1:99:3 | exit case_match_guard_no_else (abnormal) | exception | | case.rb:97:13:97:13 | x | case.rb:97:25:97:25 | 6 | true | | cfg.html.erb:5:16:31:12 | enter cfg.html.erb | cfg.html.erb:19:19:19:32 | self | true | | cfg.html.erb:5:16:31:12 | enter cfg.html.erb | cfg.html.erb:21:19:21:32 | self | false | @@ -6158,7 +6158,7 @@ successor | raise.rb:7:1:12:3 | enter m1 | raise.rb:9:5:9:17 | self | true | | raise.rb:14:1:23:3 | enter m2 | raise.rb:16:5:18:7 | if ... | false | | raise.rb:14:1:23:3 | enter m2 | raise.rb:17:7:17:22 | self | true | -| raise.rb:17:7:17:22 | self | raise.rb:14:1:23:3 | exit m2 (abnormal) | raise | +| raise.rb:17:7:17:22 | self | raise.rb:14:1:23:3 | exit m2 (abnormal) | exception | | raise.rb:17:7:17:22 | self | raise.rb:20:5:20:18 | self | match | | raise.rb:25:1:34:3 | enter m3 | raise.rb:27:5:29:7 | if ... | false | | raise.rb:25:1:34:3 | enter m3 | raise.rb:28:7:28:22 | self | true | @@ -6170,36 +6170,36 @@ successor | raise.rb:57:1:66:3 | enter m6 | raise.rb:60:7:60:22 | self | true | | raise.rb:60:7:60:22 | self | raise.rb:62:22:62:31 | ExceptionB | no-match | | raise.rb:60:7:60:22 | self | raise.rb:62:36:62:36 | e | match | -| raise.rb:62:22:62:31 | ExceptionB | raise.rb:57:1:66:3 | exit m6 (abnormal) | raise | +| raise.rb:62:22:62:31 | ExceptionB | raise.rb:57:1:66:3 | exit m6 (abnormal) | exception | | raise.rb:62:22:62:31 | ExceptionB | raise.rb:62:36:62:36 | e | match | | raise.rb:68:1:77:3 | enter m7 | raise.rb:70:5:70:17 | self | true | | raise.rb:68:1:77:3 | enter m7 | raise.rb:71:9:71:9 | x | false | -| raise.rb:68:1:77:3 | enter m7 | raise.rb:76:3:76:15 | [ensure: raise] self | raise | +| raise.rb:68:1:77:3 | enter m7 | raise.rb:76:3:76:15 | [ensure: exception] self | exception | | raise.rb:71:9:71:9 | x | raise.rb:71:3:72:18 | elsif ... | false | | raise.rb:71:9:71:9 | x | raise.rb:72:13:72:17 | x < 0 | true | -| raise.rb:71:9:71:9 | x | raise.rb:76:3:76:15 | [ensure: raise] self | raise | +| raise.rb:71:9:71:9 | x | raise.rb:76:3:76:15 | [ensure: exception] self | exception | | raise.rb:79:1:92:3 | enter m8 | raise.rb:83:7:83:19 | self | true | | raise.rb:79:1:92:3 | enter m8 | raise.rb:84:11:84:11 | x | false | -| raise.rb:79:1:92:3 | enter m8 | raise.rb:89:5:89:17 | [ensure: raise] self | raise | +| raise.rb:79:1:92:3 | enter m8 | raise.rb:89:5:89:17 | [ensure: exception] self | exception | | raise.rb:84:11:84:11 | x | raise.rb:84:5:85:20 | elsif ... | false | | raise.rb:84:11:84:11 | x | raise.rb:85:15:85:19 | x < 0 | true | -| raise.rb:84:11:84:11 | x | raise.rb:89:5:89:17 | [ensure: raise] self | raise | +| raise.rb:84:11:84:11 | x | raise.rb:89:5:89:17 | [ensure: exception] self | exception | | raise.rb:97:8:97:8 | x | raise.rb:98:7:98:19 | self | true | | raise.rb:97:8:97:8 | x | raise.rb:99:11:99:11 | x | false | -| raise.rb:97:8:97:8 | x | raise.rb:104:5:104:23 | [ensure: raise] self | raise | +| raise.rb:97:8:97:8 | x | raise.rb:104:5:104:23 | [ensure: exception] self | exception | | raise.rb:99:11:99:11 | x | raise.rb:99:5:100:20 | elsif ... | false | | raise.rb:99:11:99:11 | x | raise.rb:100:15:100:19 | x < 0 | true | -| raise.rb:99:11:99:11 | x | raise.rb:104:5:104:23 | [ensure: raise] self | raise | -| raise.rb:106:10:106:11 | [ensure: raise] b1 | raise.rb:106:7:108:9 | [ensure: raise] if ... | false | -| raise.rb:106:10:106:11 | [ensure: raise] b1 | raise.rb:107:9:107:26 | [ensure: raise] self | true | +| raise.rb:99:11:99:11 | x | raise.rb:104:5:104:23 | [ensure: exception] self | exception | +| raise.rb:106:10:106:11 | [ensure: exception] b1 | raise.rb:106:7:108:9 | [ensure: exception] if ... | false | +| raise.rb:106:10:106:11 | [ensure: exception] b1 | raise.rb:107:9:107:26 | [ensure: exception] self | true | | raise.rb:106:10:106:11 | [ensure: return] b1 | raise.rb:106:7:108:9 | [ensure: return] if ... | false | | raise.rb:106:10:106:11 | [ensure: return] b1 | raise.rb:107:9:107:26 | [ensure: return] self | true | | raise.rb:106:10:106:11 | b1 | raise.rb:106:7:108:9 | if ... | false | | raise.rb:106:10:106:11 | b1 | raise.rb:107:9:107:26 | self | true | | raise.rb:109:5:110:25 | [ensure: return] ensure ... | raise.rb:116:3:118:5 | [ensure: return] if ... | false | | raise.rb:109:5:110:25 | [ensure: return] ensure ... | raise.rb:117:5:117:22 | [ensure: return] self | true | -| raise.rb:115:3:115:22 | [ensure: raise] self | raise.rb:116:3:118:5 | [ensure: raise] if ... | false | -| raise.rb:115:3:115:22 | [ensure: raise] self | raise.rb:117:5:117:22 | [ensure: raise] self | true | +| raise.rb:115:3:115:22 | [ensure: exception] self | raise.rb:116:3:118:5 | [ensure: exception] if ... | false | +| raise.rb:115:3:115:22 | [ensure: exception] self | raise.rb:117:5:117:22 | [ensure: exception] self | true | | raise.rb:115:3:115:22 | self | raise.rb:116:3:118:5 | if ... | false | | raise.rb:115:3:115:22 | self | raise.rb:117:5:117:22 | self | true | | raise.rb:121:1:126:3 | enter m10 | raise.rb:121:14:121:30 | self | false | @@ -6211,7 +6211,7 @@ successor | raise.rb:131:7:131:22 | self | raise.rb:133:3:133:19 | rescue ... | match | | raise.rb:131:7:131:22 | self | raise.rb:134:10:134:19 | ExceptionB | no-match | | raise.rb:134:10:134:19 | ExceptionB | raise.rb:135:5:135:21 | self | match | -| raise.rb:134:10:134:19 | ExceptionB | raise.rb:137:5:137:17 | [ensure: raise] self | raise | +| raise.rb:134:10:134:19 | ExceptionB | raise.rb:137:5:137:17 | [ensure: exception] self | exception | | raise.rb:142:1:148:3 | enter m12 | raise.rb:143:3:145:5 | if ... | false | | raise.rb:142:1:148:3 | enter m12 | raise.rb:144:5:144:12 | self | true | | raise.rb:155:16:155:50 | enter { ... } | raise.rb:155:25:155:32 | self | true | @@ -6221,60 +6221,60 @@ successor | raise.rb:172:1:182:3 | enter m16 | raise.rb:174:8:174:23 | [true] ... \|\| ... | true | | raise.rb:172:1:182:3 | enter m16 | raise.rb:174:14:174:15 | b2 | false | | raise.rb:174:8:174:23 | [false] ... \|\| ... | raise.rb:177:14:177:14 | 2 | false | -| raise.rb:174:8:174:23 | [false] ... \|\| ... | raise.rb:179:10:179:19 | ExceptionA | raise | +| raise.rb:174:8:174:23 | [false] ... \|\| ... | raise.rb:179:10:179:19 | ExceptionA | exception | | raise.rb:174:8:174:23 | [true] ... \|\| ... | raise.rb:175:14:175:14 | 1 | true | -| raise.rb:174:8:174:23 | [true] ... \|\| ... | raise.rb:179:10:179:19 | ExceptionA | raise | +| raise.rb:174:8:174:23 | [true] ... \|\| ... | raise.rb:179:10:179:19 | ExceptionA | exception | | raise.rb:174:14:174:15 | b2 | raise.rb:174:8:174:23 | [false] ... \|\| ... | false | | raise.rb:174:14:174:15 | b2 | raise.rb:174:8:174:23 | [true] ... \|\| ... | true | -| raise.rb:174:14:174:15 | b2 | raise.rb:179:10:179:19 | ExceptionA | raise | -| raise.rb:179:10:179:19 | ExceptionA | raise.rb:172:1:182:3 | exit m16 (abnormal) | raise | +| raise.rb:174:14:174:15 | b2 | raise.rb:179:10:179:19 | ExceptionA | exception | +| raise.rb:179:10:179:19 | ExceptionA | raise.rb:172:1:182:3 | exit m16 (abnormal) | exception | | raise.rb:179:10:179:19 | ExceptionA | raise.rb:180:12:180:12 | 3 | match | joinBlockPredecessor -| break_ensure.rb:1:1:11:3 | exit m1 | break_ensure.rb:8:3:10:5 | [ensure: raise] if ... | 1 | +| break_ensure.rb:1:1:11:3 | exit m1 | break_ensure.rb:8:3:10:5 | [ensure: exception] if ... | 1 | | break_ensure.rb:1:1:11:3 | exit m1 | break_ensure.rb:8:3:10:5 | if ... | 0 | | break_ensure.rb:2:3:6:5 | while ... | break_ensure.rb:2:9:2:9 | x | 0 | | break_ensure.rb:2:3:6:5 | while ... | break_ensure.rb:3:8:3:8 | x | 1 | | break_ensure.rb:2:3:6:5 | while ... | break_ensure.rb:4:7:4:11 | break | 2 | | break_ensure.rb:2:9:2:9 | x | break_ensure.rb:1:1:11:3 | enter m1 | 0 | | break_ensure.rb:2:9:2:9 | x | break_ensure.rb:3:5:5:7 | if ... | 1 | -| break_ensure.rb:8:3:10:5 | [ensure: raise] if ... | break_ensure.rb:8:6:8:13 | [ensure: raise] self | 0 | -| break_ensure.rb:8:3:10:5 | [ensure: raise] if ... | break_ensure.rb:9:5:9:23 | [ensure: raise] self | 1 | +| break_ensure.rb:8:3:10:5 | [ensure: exception] if ... | break_ensure.rb:8:6:8:13 | [ensure: exception] self | 0 | +| break_ensure.rb:8:3:10:5 | [ensure: exception] if ... | break_ensure.rb:9:5:9:23 | [ensure: exception] self | 1 | | break_ensure.rb:8:3:10:5 | if ... | break_ensure.rb:2:3:6:5 | while ... | 0 | | break_ensure.rb:8:3:10:5 | if ... | break_ensure.rb:9:5:9:23 | self | 1 | | break_ensure.rb:14:3:24:5 | while ... | break_ensure.rb:14:9:14:9 | x | 0 | | break_ensure.rb:14:3:24:5 | while ... | break_ensure.rb:20:7:22:9 | [ensure: break] if ... | 1 | -| break_ensure.rb:14:3:24:5 | while ... | break_ensure.rb:20:7:22:9 | [ensure: raise] if ... | 2 | +| break_ensure.rb:14:3:24:5 | while ... | break_ensure.rb:20:7:22:9 | [ensure: exception] if ... | 2 | | break_ensure.rb:14:9:14:9 | x | break_ensure.rb:13:1:25:3 | enter m2 | 0 | | break_ensure.rb:14:9:14:9 | x | break_ensure.rb:20:7:22:9 | if ... | 1 | | break_ensure.rb:20:7:22:9 | [ensure: break] if ... | break_ensure.rb:17:9:17:13 | break | 0 | | break_ensure.rb:20:7:22:9 | [ensure: break] if ... | break_ensure.rb:21:9:21:20 | [ensure: break] self | 1 | -| break_ensure.rb:20:7:22:9 | [ensure: raise] if ... | break_ensure.rb:20:10:20:10 | [ensure: raise] y | 0 | -| break_ensure.rb:20:7:22:9 | [ensure: raise] if ... | break_ensure.rb:21:9:21:20 | [ensure: raise] self | 1 | +| break_ensure.rb:20:7:22:9 | [ensure: exception] if ... | break_ensure.rb:20:10:20:10 | [ensure: exception] y | 0 | +| break_ensure.rb:20:7:22:9 | [ensure: exception] if ... | break_ensure.rb:21:9:21:20 | [ensure: exception] self | 1 | | break_ensure.rb:20:7:22:9 | if ... | break_ensure.rb:16:7:18:9 | if ... | 0 | | break_ensure.rb:20:7:22:9 | if ... | break_ensure.rb:21:9:21:20 | self | 1 | -| break_ensure.rb:27:1:42:3 | exit m3 | break_ensure.rb:33:5:39:7 | [ensure: raise] while ... | 0 | +| break_ensure.rb:27:1:42:3 | exit m3 | break_ensure.rb:33:5:39:7 | [ensure: exception] while ... | 0 | | break_ensure.rb:27:1:42:3 | exit m3 (normal) | break_ensure.rb:33:5:39:7 | [ensure: return] while ... | 1 | | break_ensure.rb:27:1:42:3 | exit m3 (normal) | break_ensure.rb:33:5:39:7 | while ... | 0 | -| break_ensure.rb:33:5:39:7 | [ensure: raise] while ... | break_ensure.rb:33:11:33:11 | [ensure: raise] y | 0 | -| break_ensure.rb:33:5:39:7 | [ensure: raise] while ... | break_ensure.rb:36:11:36:15 | [ensure: raise] break | 1 | +| break_ensure.rb:33:5:39:7 | [ensure: exception] while ... | break_ensure.rb:33:11:33:11 | [ensure: exception] y | 0 | +| break_ensure.rb:33:5:39:7 | [ensure: exception] while ... | break_ensure.rb:36:11:36:15 | [ensure: exception] break | 1 | | break_ensure.rb:33:5:39:7 | [ensure: return] while ... | break_ensure.rb:33:11:33:11 | [ensure: return] y | 0 | | break_ensure.rb:33:5:39:7 | [ensure: return] while ... | break_ensure.rb:36:11:36:15 | [ensure: return] break | 1 | | break_ensure.rb:33:5:39:7 | while ... | break_ensure.rb:33:11:33:11 | y | 0 | | break_ensure.rb:33:5:39:7 | while ... | break_ensure.rb:36:11:36:15 | break | 1 | -| break_ensure.rb:33:11:33:11 | [ensure: raise] y | break_ensure.rb:27:1:42:3 | enter m3 | 0 | -| break_ensure.rb:33:11:33:11 | [ensure: raise] y | break_ensure.rb:35:9:37:11 | [ensure: raise] if ... | 1 | +| break_ensure.rb:33:11:33:11 | [ensure: exception] y | break_ensure.rb:27:1:42:3 | enter m3 | 0 | +| break_ensure.rb:33:11:33:11 | [ensure: exception] y | break_ensure.rb:35:9:37:11 | [ensure: exception] if ... | 1 | | break_ensure.rb:33:11:33:11 | [ensure: return] y | break_ensure.rb:30:7:30:12 | return | 0 | | break_ensure.rb:33:11:33:11 | [ensure: return] y | break_ensure.rb:35:9:37:11 | [ensure: return] if ... | 1 | | break_ensure.rb:33:11:33:11 | y | break_ensure.rb:29:5:31:7 | if ... | 0 | | break_ensure.rb:33:11:33:11 | y | break_ensure.rb:35:9:37:11 | if ... | 1 | | break_ensure.rb:45:3:55:5 | while ... | break_ensure.rb:45:9:45:9 | x | 0 | -| break_ensure.rb:45:3:55:5 | while ... | break_ensure.rb:51:7:53:9 | [ensure: raise] if ... | 1 | +| break_ensure.rb:45:3:55:5 | while ... | break_ensure.rb:51:7:53:9 | [ensure: exception] if ... | 1 | | break_ensure.rb:45:3:55:5 | while ... | break_ensure.rb:52:15:52:16 | 10 | 2 | -| break_ensure.rb:45:3:55:5 | while ... | break_ensure.rb:52:15:52:16 | [ensure: raise] 10 | 3 | +| break_ensure.rb:45:3:55:5 | while ... | break_ensure.rb:52:15:52:16 | [ensure: exception] 10 | 3 | | break_ensure.rb:45:9:45:9 | x | break_ensure.rb:44:1:56:3 | enter m4 | 0 | | break_ensure.rb:45:9:45:9 | x | break_ensure.rb:51:7:53:9 | if ... | 1 | -| break_ensure.rb:51:10:51:10 | [ensure: raise] x | break_ensure.rb:47:10:47:10 | x | 0 | -| break_ensure.rb:51:10:51:10 | [ensure: raise] x | break_ensure.rb:48:9:48:16 | self | 1 | +| break_ensure.rb:51:10:51:10 | [ensure: exception] x | break_ensure.rb:47:10:47:10 | x | 0 | +| break_ensure.rb:51:10:51:10 | [ensure: exception] x | break_ensure.rb:48:9:48:16 | self | 1 | | case.rb:2:3:5:5 | case ... | case.rb:3:18:3:41 | if ... | 0 | | case.rb:2:3:5:5 | case ... | case.rb:4:5:4:24 | [no-match] when ... | 1 | | case.rb:2:3:5:5 | case ... | case.rb:4:17:4:24 | self | 2 | @@ -6468,48 +6468,48 @@ joinBlockPredecessor | raise.rb:62:36:62:36 | e | raise.rb:62:22:62:31 | ExceptionB | 1 | | raise.rb:65:3:65:15 | self | raise.rb:59:5:61:7 | if ... | 0 | | raise.rb:65:3:65:15 | self | raise.rb:62:36:62:36 | e | 1 | -| raise.rb:68:1:77:3 | exit m7 | raise.rb:76:3:76:15 | [ensure: raise] self | 0 | +| raise.rb:68:1:77:3 | exit m7 | raise.rb:76:3:76:15 | [ensure: exception] self | 0 | | raise.rb:68:1:77:3 | exit m7 (normal) | raise.rb:72:13:72:17 | x < 0 | 0 | | raise.rb:68:1:77:3 | exit m7 (normal) | raise.rb:76:3:76:15 | self | 1 | -| raise.rb:76:3:76:15 | [ensure: raise] self | raise.rb:68:1:77:3 | enter m7 | 0 | -| raise.rb:76:3:76:15 | [ensure: raise] self | raise.rb:70:5:70:17 | self | 1 | -| raise.rb:76:3:76:15 | [ensure: raise] self | raise.rb:71:3:72:18 | elsif ... | 2 | -| raise.rb:76:3:76:15 | [ensure: raise] self | raise.rb:71:9:71:9 | x | 3 | -| raise.rb:79:1:92:3 | exit m8 | raise.rb:89:5:89:17 | [ensure: raise] self | 0 | +| raise.rb:76:3:76:15 | [ensure: exception] self | raise.rb:68:1:77:3 | enter m7 | 0 | +| raise.rb:76:3:76:15 | [ensure: exception] self | raise.rb:70:5:70:17 | self | 1 | +| raise.rb:76:3:76:15 | [ensure: exception] self | raise.rb:71:3:72:18 | elsif ... | 2 | +| raise.rb:76:3:76:15 | [ensure: exception] self | raise.rb:71:9:71:9 | x | 3 | +| raise.rb:79:1:92:3 | exit m8 | raise.rb:89:5:89:17 | [ensure: exception] self | 0 | | raise.rb:79:1:92:3 | exit m8 (normal) | raise.rb:85:15:85:19 | x < 0 | 0 | | raise.rb:79:1:92:3 | exit m8 (normal) | raise.rb:89:5:89:17 | self | 1 | -| raise.rb:89:5:89:17 | [ensure: raise] self | raise.rb:79:1:92:3 | enter m8 | 0 | -| raise.rb:89:5:89:17 | [ensure: raise] self | raise.rb:83:7:83:19 | self | 1 | -| raise.rb:89:5:89:17 | [ensure: raise] self | raise.rb:84:5:85:20 | elsif ... | 2 | -| raise.rb:89:5:89:17 | [ensure: raise] self | raise.rb:84:11:84:11 | x | 3 | -| raise.rb:94:1:119:3 | exit m9 (abnormal) | raise.rb:116:3:118:5 | [ensure: raise] if ... | 0 | -| raise.rb:94:1:119:3 | exit m9 (abnormal) | raise.rb:117:5:117:22 | [ensure: raise] self | 2 | +| raise.rb:89:5:89:17 | [ensure: exception] self | raise.rb:79:1:92:3 | enter m8 | 0 | +| raise.rb:89:5:89:17 | [ensure: exception] self | raise.rb:83:7:83:19 | self | 1 | +| raise.rb:89:5:89:17 | [ensure: exception] self | raise.rb:84:5:85:20 | elsif ... | 2 | +| raise.rb:89:5:89:17 | [ensure: exception] self | raise.rb:84:11:84:11 | x | 3 | +| raise.rb:94:1:119:3 | exit m9 (abnormal) | raise.rb:116:3:118:5 | [ensure: exception] if ... | 0 | +| raise.rb:94:1:119:3 | exit m9 (abnormal) | raise.rb:117:5:117:22 | [ensure: exception] self | 2 | | raise.rb:94:1:119:3 | exit m9 (abnormal) | raise.rb:117:5:117:22 | [ensure: return] self | 3 | | raise.rb:94:1:119:3 | exit m9 (abnormal) | raise.rb:117:5:117:22 | self | 1 | | raise.rb:94:1:119:3 | exit m9 (normal) | raise.rb:116:3:118:5 | [ensure: return] if ... | 1 | | raise.rb:94:1:119:3 | exit m9 (normal) | raise.rb:116:3:118:5 | if ... | 0 | -| raise.rb:104:5:104:23 | [ensure: raise] self | raise.rb:97:8:97:8 | x | 0 | -| raise.rb:104:5:104:23 | [ensure: raise] self | raise.rb:98:7:98:19 | self | 1 | -| raise.rb:104:5:104:23 | [ensure: raise] self | raise.rb:99:5:100:20 | elsif ... | 2 | -| raise.rb:104:5:104:23 | [ensure: raise] self | raise.rb:99:11:99:11 | x | 3 | -| raise.rb:115:3:115:22 | [ensure: raise] self | raise.rb:94:1:119:3 | enter m9 | 0 | -| raise.rb:115:3:115:22 | [ensure: raise] self | raise.rb:100:15:100:19 | x < 0 | 1 | -| raise.rb:115:3:115:22 | [ensure: raise] self | raise.rb:104:5:104:23 | [ensure: raise] self | 3 | -| raise.rb:115:3:115:22 | [ensure: raise] self | raise.rb:104:5:104:23 | self | 2 | -| raise.rb:115:3:115:22 | [ensure: raise] self | raise.rb:106:7:108:9 | [ensure: raise] if ... | 5 | -| raise.rb:115:3:115:22 | [ensure: raise] self | raise.rb:106:7:108:9 | [ensure: return] if ... | 6 | -| raise.rb:115:3:115:22 | [ensure: raise] self | raise.rb:106:7:108:9 | if ... | 4 | -| raise.rb:115:3:115:22 | [ensure: raise] self | raise.rb:107:9:107:26 | [ensure: raise] self | 8 | -| raise.rb:115:3:115:22 | [ensure: raise] self | raise.rb:107:9:107:26 | [ensure: return] self | 9 | -| raise.rb:115:3:115:22 | [ensure: raise] self | raise.rb:107:9:107:26 | self | 7 | -| raise.rb:115:3:115:22 | [ensure: raise] self | raise.rb:109:5:110:25 | [ensure(1): raise] ensure ... | 11 | -| raise.rb:115:3:115:22 | [ensure: raise] self | raise.rb:109:5:110:25 | [ensure: raise, ensure(1): raise] ensure ... | 13 | -| raise.rb:115:3:115:22 | [ensure: raise] self | raise.rb:109:5:110:25 | [ensure: raise] ensure ... | 12 | -| raise.rb:115:3:115:22 | [ensure: raise] self | raise.rb:109:5:110:25 | [ensure: return, ensure(1): raise] ensure ... | 14 | -| raise.rb:115:3:115:22 | [ensure: raise] self | raise.rb:109:5:110:25 | ensure ... | 10 | +| raise.rb:104:5:104:23 | [ensure: exception] self | raise.rb:97:8:97:8 | x | 0 | +| raise.rb:104:5:104:23 | [ensure: exception] self | raise.rb:98:7:98:19 | self | 1 | +| raise.rb:104:5:104:23 | [ensure: exception] self | raise.rb:99:5:100:20 | elsif ... | 2 | +| raise.rb:104:5:104:23 | [ensure: exception] self | raise.rb:99:11:99:11 | x | 3 | +| raise.rb:115:3:115:22 | [ensure: exception] self | raise.rb:94:1:119:3 | enter m9 | 0 | +| raise.rb:115:3:115:22 | [ensure: exception] self | raise.rb:100:15:100:19 | x < 0 | 1 | +| raise.rb:115:3:115:22 | [ensure: exception] self | raise.rb:104:5:104:23 | [ensure: exception] self | 3 | +| raise.rb:115:3:115:22 | [ensure: exception] self | raise.rb:104:5:104:23 | self | 2 | +| raise.rb:115:3:115:22 | [ensure: exception] self | raise.rb:106:7:108:9 | [ensure: exception] if ... | 5 | +| raise.rb:115:3:115:22 | [ensure: exception] self | raise.rb:106:7:108:9 | [ensure: return] if ... | 6 | +| raise.rb:115:3:115:22 | [ensure: exception] self | raise.rb:106:7:108:9 | if ... | 4 | +| raise.rb:115:3:115:22 | [ensure: exception] self | raise.rb:107:9:107:26 | [ensure: exception] self | 8 | +| raise.rb:115:3:115:22 | [ensure: exception] self | raise.rb:107:9:107:26 | [ensure: return] self | 9 | +| raise.rb:115:3:115:22 | [ensure: exception] self | raise.rb:107:9:107:26 | self | 7 | +| raise.rb:115:3:115:22 | [ensure: exception] self | raise.rb:109:5:110:25 | [ensure(1): exception] ensure ... | 11 | +| raise.rb:115:3:115:22 | [ensure: exception] self | raise.rb:109:5:110:25 | [ensure: exception, ensure(1): exception] ensure ... | 13 | +| raise.rb:115:3:115:22 | [ensure: exception] self | raise.rb:109:5:110:25 | [ensure: exception] ensure ... | 12 | +| raise.rb:115:3:115:22 | [ensure: exception] self | raise.rb:109:5:110:25 | [ensure: return, ensure(1): exception] ensure ... | 14 | +| raise.rb:115:3:115:22 | [ensure: exception] self | raise.rb:109:5:110:25 | ensure ... | 10 | | raise.rb:121:1:126:3 | exit m10 | raise.rb:121:14:121:30 | self | 0 | | raise.rb:121:1:126:3 | exit m10 | raise.rb:125:3:125:51 | self | 1 | -| raise.rb:128:1:140:3 | exit m11 | raise.rb:137:5:137:17 | [ensure: raise] self | 1 | +| raise.rb:128:1:140:3 | exit m11 | raise.rb:137:5:137:17 | [ensure: exception] self | 1 | | raise.rb:128:1:140:3 | exit m11 | raise.rb:137:5:137:17 | self | 0 | | raise.rb:137:5:137:17 | self | raise.rb:130:5:132:7 | if ... | 0 | | raise.rb:137:5:137:17 | self | raise.rb:133:3:133:19 | rescue ... | 1 | diff --git a/ruby/ql/test/library-tests/controlflow/graph/Cfg.expected b/ruby/ql/test/library-tests/controlflow/graph/Cfg.expected index 243e107906ab..583ca5d46a80 100644 --- a/ruby/ql/test/library-tests/controlflow/graph/Cfg.expected +++ b/ruby/ql/test/library-tests/controlflow/graph/Cfg.expected @@ -9,37 +9,37 @@ | break_ensure.rb:2:9:2:9 | x | break_ensure.rb:2:13:2:13 | 0 | | | break_ensure.rb:2:9:2:13 | ... < ... | break_ensure.rb:2:3:6:5 | while ... | false | | break_ensure.rb:2:9:2:13 | ... < ... | break_ensure.rb:3:8:3:8 | x | true | -| break_ensure.rb:2:9:2:13 | ... < ... | break_ensure.rb:8:6:8:13 | [ensure: raise] self | raise | +| break_ensure.rb:2:9:2:13 | ... < ... | break_ensure.rb:8:6:8:13 | [ensure: exception] self | exception | | break_ensure.rb:2:13:2:13 | 0 | break_ensure.rb:2:9:2:13 | ... < ... | | | break_ensure.rb:2:14:6:5 | do ... | break_ensure.rb:2:9:2:9 | x | | | break_ensure.rb:3:5:5:7 | if ... | break_ensure.rb:2:14:6:5 | do ... | | | break_ensure.rb:3:8:3:8 | x | break_ensure.rb:3:12:3:12 | 0 | | -| break_ensure.rb:3:8:3:12 | ... > ... | break_ensure.rb:2:3:6:5 | while ... | raise | +| break_ensure.rb:3:8:3:12 | ... > ... | break_ensure.rb:2:3:6:5 | while ... | exception | | break_ensure.rb:3:8:3:12 | ... > ... | break_ensure.rb:3:5:5:7 | if ... | false | | break_ensure.rb:3:8:3:12 | ... > ... | break_ensure.rb:4:7:4:11 | break | true | | break_ensure.rb:3:12:3:12 | 0 | break_ensure.rb:3:8:3:12 | ... > ... | | | break_ensure.rb:4:7:4:11 | break | break_ensure.rb:2:3:6:5 | while ... | break | -| break_ensure.rb:7:1:10:5 | [ensure: raise] ensure ... | break_ensure.rb:1:1:11:3 | exit m1 (abnormal) | raise | +| break_ensure.rb:7:1:10:5 | [ensure: exception] ensure ... | break_ensure.rb:1:1:11:3 | exit m1 (abnormal) | exception | | break_ensure.rb:7:1:10:5 | ensure ... | break_ensure.rb:1:1:11:3 | exit m1 (normal) | | -| break_ensure.rb:8:3:10:5 | [ensure: raise] if ... | break_ensure.rb:7:1:10:5 | [ensure: raise] ensure ... | | +| break_ensure.rb:8:3:10:5 | [ensure: exception] if ... | break_ensure.rb:7:1:10:5 | [ensure: exception] ensure ... | | | break_ensure.rb:8:3:10:5 | if ... | break_ensure.rb:7:1:10:5 | ensure ... | | -| break_ensure.rb:8:6:8:13 | [ensure: raise] call to elements | break_ensure.rb:8:6:8:18 | [ensure: raise] call to nil? | | -| break_ensure.rb:8:6:8:13 | [ensure: raise] self | break_ensure.rb:8:6:8:13 | [ensure: raise] call to elements | | +| break_ensure.rb:8:6:8:13 | [ensure: exception] call to elements | break_ensure.rb:8:6:8:18 | [ensure: exception] call to nil? | | +| break_ensure.rb:8:6:8:13 | [ensure: exception] self | break_ensure.rb:8:6:8:13 | [ensure: exception] call to elements | | | break_ensure.rb:8:6:8:13 | call to elements | break_ensure.rb:8:6:8:18 | call to nil? | | | break_ensure.rb:8:6:8:13 | self | break_ensure.rb:8:6:8:13 | call to elements | | -| break_ensure.rb:8:6:8:18 | [ensure: raise] call to nil? | break_ensure.rb:8:3:10:5 | [ensure: raise] if ... | false | -| break_ensure.rb:8:6:8:18 | [ensure: raise] call to nil? | break_ensure.rb:9:5:9:23 | [ensure: raise] self | true | +| break_ensure.rb:8:6:8:18 | [ensure: exception] call to nil? | break_ensure.rb:8:3:10:5 | [ensure: exception] if ... | false | +| break_ensure.rb:8:6:8:18 | [ensure: exception] call to nil? | break_ensure.rb:9:5:9:23 | [ensure: exception] self | true | | break_ensure.rb:8:6:8:18 | call to nil? | break_ensure.rb:8:3:10:5 | if ... | false | | break_ensure.rb:8:6:8:18 | call to nil? | break_ensure.rb:9:5:9:23 | self | true | -| break_ensure.rb:8:20:9:23 | [ensure: raise] then ... | break_ensure.rb:8:3:10:5 | [ensure: raise] if ... | | +| break_ensure.rb:8:20:9:23 | [ensure: exception] then ... | break_ensure.rb:8:3:10:5 | [ensure: exception] if ... | | | break_ensure.rb:8:20:9:23 | then ... | break_ensure.rb:8:3:10:5 | if ... | | -| break_ensure.rb:9:5:9:23 | [ensure: raise] call to puts | break_ensure.rb:8:20:9:23 | [ensure: raise] then ... | | -| break_ensure.rb:9:5:9:23 | [ensure: raise] self | break_ensure.rb:9:11:9:22 | [ensure: raise] elements nil | | +| break_ensure.rb:9:5:9:23 | [ensure: exception] call to puts | break_ensure.rb:8:20:9:23 | [ensure: exception] then ... | | +| break_ensure.rb:9:5:9:23 | [ensure: exception] self | break_ensure.rb:9:11:9:22 | [ensure: exception] elements nil | | | break_ensure.rb:9:5:9:23 | call to puts | break_ensure.rb:8:20:9:23 | then ... | | | break_ensure.rb:9:5:9:23 | self | break_ensure.rb:9:11:9:22 | elements nil | | | break_ensure.rb:9:10:9:23 | "elements nil" | break_ensure.rb:9:5:9:23 | call to puts | | -| break_ensure.rb:9:10:9:23 | [ensure: raise] "elements nil" | break_ensure.rb:9:5:9:23 | [ensure: raise] call to puts | | -| break_ensure.rb:9:11:9:22 | [ensure: raise] elements nil | break_ensure.rb:9:10:9:23 | [ensure: raise] "elements nil" | | +| break_ensure.rb:9:10:9:23 | [ensure: exception] "elements nil" | break_ensure.rb:9:5:9:23 | [ensure: exception] call to puts | | +| break_ensure.rb:9:11:9:22 | [ensure: exception] elements nil | break_ensure.rb:9:10:9:23 | [ensure: exception] "elements nil" | | | break_ensure.rb:9:11:9:22 | elements nil | break_ensure.rb:9:10:9:23 | "elements nil" | | | break_ensure.rb:13:1:25:3 | enter m2 | break_ensure.rb:13:8:13:8 | x | | | break_ensure.rb:13:1:25:3 | exit m2 (normal) | break_ensure.rb:13:1:25:3 | exit m2 | | @@ -56,38 +56,38 @@ | break_ensure.rb:16:10:16:10 | x | break_ensure.rb:16:14:16:14 | 0 | | | break_ensure.rb:16:10:16:14 | ... > ... | break_ensure.rb:16:7:18:9 | if ... | false | | break_ensure.rb:16:10:16:14 | ... > ... | break_ensure.rb:17:9:17:13 | break | true | -| break_ensure.rb:16:10:16:14 | ... > ... | break_ensure.rb:20:10:20:10 | [ensure: raise] y | raise | +| break_ensure.rb:16:10:16:14 | ... > ... | break_ensure.rb:20:10:20:10 | [ensure: exception] y | exception | | break_ensure.rb:16:14:16:14 | 0 | break_ensure.rb:16:10:16:14 | ... > ... | | | break_ensure.rb:17:9:17:13 | break | break_ensure.rb:20:10:20:10 | [ensure: break] y | break | | break_ensure.rb:19:5:22:9 | [ensure: break] ensure ... | break_ensure.rb:14:3:24:5 | while ... | break | -| break_ensure.rb:19:5:22:9 | [ensure: raise] ensure ... | break_ensure.rb:14:3:24:5 | while ... | raise | +| break_ensure.rb:19:5:22:9 | [ensure: exception] ensure ... | break_ensure.rb:14:3:24:5 | while ... | exception | | break_ensure.rb:19:5:22:9 | ensure ... | break_ensure.rb:14:14:24:5 | do ... | | | break_ensure.rb:20:7:22:9 | [ensure: break] if ... | break_ensure.rb:19:5:22:9 | [ensure: break] ensure ... | | -| break_ensure.rb:20:7:22:9 | [ensure: raise] if ... | break_ensure.rb:19:5:22:9 | [ensure: raise] ensure ... | | +| break_ensure.rb:20:7:22:9 | [ensure: exception] if ... | break_ensure.rb:19:5:22:9 | [ensure: exception] ensure ... | | | break_ensure.rb:20:7:22:9 | if ... | break_ensure.rb:19:5:22:9 | ensure ... | | | break_ensure.rb:20:10:20:10 | [ensure: break] y | break_ensure.rb:20:10:20:15 | [ensure: break] call to nil? | | -| break_ensure.rb:20:10:20:10 | [ensure: raise] y | break_ensure.rb:20:10:20:15 | [ensure: raise] call to nil? | | +| break_ensure.rb:20:10:20:10 | [ensure: exception] y | break_ensure.rb:20:10:20:15 | [ensure: exception] call to nil? | | | break_ensure.rb:20:10:20:10 | y | break_ensure.rb:20:10:20:15 | call to nil? | | | break_ensure.rb:20:10:20:15 | [ensure: break] call to nil? | break_ensure.rb:20:7:22:9 | [ensure: break] if ... | false | | break_ensure.rb:20:10:20:15 | [ensure: break] call to nil? | break_ensure.rb:21:9:21:20 | [ensure: break] self | true | -| break_ensure.rb:20:10:20:15 | [ensure: raise] call to nil? | break_ensure.rb:20:7:22:9 | [ensure: raise] if ... | false | -| break_ensure.rb:20:10:20:15 | [ensure: raise] call to nil? | break_ensure.rb:21:9:21:20 | [ensure: raise] self | true | +| break_ensure.rb:20:10:20:15 | [ensure: exception] call to nil? | break_ensure.rb:20:7:22:9 | [ensure: exception] if ... | false | +| break_ensure.rb:20:10:20:15 | [ensure: exception] call to nil? | break_ensure.rb:21:9:21:20 | [ensure: exception] self | true | | break_ensure.rb:20:10:20:15 | call to nil? | break_ensure.rb:20:7:22:9 | if ... | false | | break_ensure.rb:20:10:20:15 | call to nil? | break_ensure.rb:21:9:21:20 | self | true | | break_ensure.rb:20:17:21:20 | [ensure: break] then ... | break_ensure.rb:20:7:22:9 | [ensure: break] if ... | | -| break_ensure.rb:20:17:21:20 | [ensure: raise] then ... | break_ensure.rb:20:7:22:9 | [ensure: raise] if ... | | +| break_ensure.rb:20:17:21:20 | [ensure: exception] then ... | break_ensure.rb:20:7:22:9 | [ensure: exception] if ... | | | break_ensure.rb:20:17:21:20 | then ... | break_ensure.rb:20:7:22:9 | if ... | | | break_ensure.rb:21:9:21:20 | [ensure: break] call to puts | break_ensure.rb:20:17:21:20 | [ensure: break] then ... | | | break_ensure.rb:21:9:21:20 | [ensure: break] self | break_ensure.rb:21:15:21:19 | [ensure: break] y nil | | -| break_ensure.rb:21:9:21:20 | [ensure: raise] call to puts | break_ensure.rb:20:17:21:20 | [ensure: raise] then ... | | -| break_ensure.rb:21:9:21:20 | [ensure: raise] self | break_ensure.rb:21:15:21:19 | [ensure: raise] y nil | | +| break_ensure.rb:21:9:21:20 | [ensure: exception] call to puts | break_ensure.rb:20:17:21:20 | [ensure: exception] then ... | | +| break_ensure.rb:21:9:21:20 | [ensure: exception] self | break_ensure.rb:21:15:21:19 | [ensure: exception] y nil | | | break_ensure.rb:21:9:21:20 | call to puts | break_ensure.rb:20:17:21:20 | then ... | | | break_ensure.rb:21:9:21:20 | self | break_ensure.rb:21:15:21:19 | y nil | | | break_ensure.rb:21:14:21:20 | "y nil" | break_ensure.rb:21:9:21:20 | call to puts | | | break_ensure.rb:21:14:21:20 | [ensure: break] "y nil" | break_ensure.rb:21:9:21:20 | [ensure: break] call to puts | | -| break_ensure.rb:21:14:21:20 | [ensure: raise] "y nil" | break_ensure.rb:21:9:21:20 | [ensure: raise] call to puts | | +| break_ensure.rb:21:14:21:20 | [ensure: exception] "y nil" | break_ensure.rb:21:9:21:20 | [ensure: exception] call to puts | | | break_ensure.rb:21:15:21:19 | [ensure: break] y nil | break_ensure.rb:21:14:21:20 | [ensure: break] "y nil" | | -| break_ensure.rb:21:15:21:19 | [ensure: raise] y nil | break_ensure.rb:21:14:21:20 | [ensure: raise] "y nil" | | +| break_ensure.rb:21:15:21:19 | [ensure: exception] y nil | break_ensure.rb:21:14:21:20 | [ensure: exception] "y nil" | | | break_ensure.rb:21:15:21:19 | y nil | break_ensure.rb:21:14:21:20 | "y nil" | | | break_ensure.rb:27:1:42:3 | enter m3 | break_ensure.rb:27:8:27:8 | x | | | break_ensure.rb:27:1:42:3 | exit m3 (abnormal) | break_ensure.rb:27:1:42:3 | exit m3 | | @@ -99,45 +99,45 @@ | break_ensure.rb:29:8:29:8 | x | break_ensure.rb:29:8:29:13 | call to nil? | | | break_ensure.rb:29:8:29:13 | call to nil? | break_ensure.rb:29:5:31:7 | if ... | false | | break_ensure.rb:29:8:29:13 | call to nil? | break_ensure.rb:30:7:30:12 | return | true | -| break_ensure.rb:29:8:29:13 | call to nil? | break_ensure.rb:33:11:33:11 | [ensure: raise] y | raise | +| break_ensure.rb:29:8:29:13 | call to nil? | break_ensure.rb:33:11:33:11 | [ensure: exception] y | exception | | break_ensure.rb:30:7:30:12 | return | break_ensure.rb:33:11:33:11 | [ensure: return] y | return | -| break_ensure.rb:32:3:39:7 | [ensure: raise] ensure ... | break_ensure.rb:27:1:42:3 | exit m3 (abnormal) | raise | +| break_ensure.rb:32:3:39:7 | [ensure: exception] ensure ... | break_ensure.rb:27:1:42:3 | exit m3 (abnormal) | exception | | break_ensure.rb:32:3:39:7 | [ensure: return] ensure ... | break_ensure.rb:27:1:42:3 | exit m3 (normal) | return | | break_ensure.rb:32:3:39:7 | ensure ... | break_ensure.rb:41:3:41:13 | self | | -| break_ensure.rb:33:5:39:7 | [ensure: raise] while ... | break_ensure.rb:32:3:39:7 | [ensure: raise] ensure ... | | +| break_ensure.rb:33:5:39:7 | [ensure: exception] while ... | break_ensure.rb:32:3:39:7 | [ensure: exception] ensure ... | | | break_ensure.rb:33:5:39:7 | [ensure: return] while ... | break_ensure.rb:32:3:39:7 | [ensure: return] ensure ... | | | break_ensure.rb:33:5:39:7 | while ... | break_ensure.rb:32:3:39:7 | ensure ... | | -| break_ensure.rb:33:11:33:11 | [ensure: raise] y | break_ensure.rb:33:15:33:15 | [ensure: raise] 0 | | +| break_ensure.rb:33:11:33:11 | [ensure: exception] y | break_ensure.rb:33:15:33:15 | [ensure: exception] 0 | | | break_ensure.rb:33:11:33:11 | [ensure: return] y | break_ensure.rb:33:15:33:15 | [ensure: return] 0 | | | break_ensure.rb:33:11:33:11 | y | break_ensure.rb:33:15:33:15 | 0 | | | break_ensure.rb:33:11:33:15 | ... < ... | break_ensure.rb:33:5:39:7 | while ... | false | | break_ensure.rb:33:11:33:15 | ... < ... | break_ensure.rb:35:12:35:12 | x | true | -| break_ensure.rb:33:11:33:15 | [ensure: raise] ... < ... | break_ensure.rb:33:5:39:7 | [ensure: raise] while ... | false | -| break_ensure.rb:33:11:33:15 | [ensure: raise] ... < ... | break_ensure.rb:35:12:35:12 | [ensure: raise] x | true | +| break_ensure.rb:33:11:33:15 | [ensure: exception] ... < ... | break_ensure.rb:33:5:39:7 | [ensure: exception] while ... | false | +| break_ensure.rb:33:11:33:15 | [ensure: exception] ... < ... | break_ensure.rb:35:12:35:12 | [ensure: exception] x | true | | break_ensure.rb:33:11:33:15 | [ensure: return] ... < ... | break_ensure.rb:33:5:39:7 | [ensure: return] while ... | false | | break_ensure.rb:33:11:33:15 | [ensure: return] ... < ... | break_ensure.rb:35:12:35:12 | [ensure: return] x | true | | break_ensure.rb:33:15:33:15 | 0 | break_ensure.rb:33:11:33:15 | ... < ... | | -| break_ensure.rb:33:15:33:15 | [ensure: raise] 0 | break_ensure.rb:33:11:33:15 | [ensure: raise] ... < ... | | +| break_ensure.rb:33:15:33:15 | [ensure: exception] 0 | break_ensure.rb:33:11:33:15 | [ensure: exception] ... < ... | | | break_ensure.rb:33:15:33:15 | [ensure: return] 0 | break_ensure.rb:33:11:33:15 | [ensure: return] ... < ... | | -| break_ensure.rb:33:16:39:7 | [ensure: raise] do ... | break_ensure.rb:33:11:33:11 | [ensure: raise] y | | +| break_ensure.rb:33:16:39:7 | [ensure: exception] do ... | break_ensure.rb:33:11:33:11 | [ensure: exception] y | | | break_ensure.rb:33:16:39:7 | [ensure: return] do ... | break_ensure.rb:33:11:33:11 | [ensure: return] y | | | break_ensure.rb:33:16:39:7 | do ... | break_ensure.rb:33:11:33:11 | y | | -| break_ensure.rb:35:9:37:11 | [ensure: raise] if ... | break_ensure.rb:33:16:39:7 | [ensure: raise] do ... | | +| break_ensure.rb:35:9:37:11 | [ensure: exception] if ... | break_ensure.rb:33:16:39:7 | [ensure: exception] do ... | | | break_ensure.rb:35:9:37:11 | [ensure: return] if ... | break_ensure.rb:33:16:39:7 | [ensure: return] do ... | | | break_ensure.rb:35:9:37:11 | if ... | break_ensure.rb:33:16:39:7 | do ... | | -| break_ensure.rb:35:12:35:12 | [ensure: raise] x | break_ensure.rb:35:16:35:16 | [ensure: raise] 0 | | +| break_ensure.rb:35:12:35:12 | [ensure: exception] x | break_ensure.rb:35:16:35:16 | [ensure: exception] 0 | | | break_ensure.rb:35:12:35:12 | [ensure: return] x | break_ensure.rb:35:16:35:16 | [ensure: return] 0 | | | break_ensure.rb:35:12:35:12 | x | break_ensure.rb:35:16:35:16 | 0 | | | break_ensure.rb:35:12:35:16 | ... > ... | break_ensure.rb:35:9:37:11 | if ... | false | | break_ensure.rb:35:12:35:16 | ... > ... | break_ensure.rb:36:11:36:15 | break | true | -| break_ensure.rb:35:12:35:16 | [ensure: raise] ... > ... | break_ensure.rb:35:9:37:11 | [ensure: raise] if ... | false | -| break_ensure.rb:35:12:35:16 | [ensure: raise] ... > ... | break_ensure.rb:36:11:36:15 | [ensure: raise] break | true | +| break_ensure.rb:35:12:35:16 | [ensure: exception] ... > ... | break_ensure.rb:35:9:37:11 | [ensure: exception] if ... | false | +| break_ensure.rb:35:12:35:16 | [ensure: exception] ... > ... | break_ensure.rb:36:11:36:15 | [ensure: exception] break | true | | break_ensure.rb:35:12:35:16 | [ensure: return] ... > ... | break_ensure.rb:35:9:37:11 | [ensure: return] if ... | false | | break_ensure.rb:35:12:35:16 | [ensure: return] ... > ... | break_ensure.rb:36:11:36:15 | [ensure: return] break | true | | break_ensure.rb:35:16:35:16 | 0 | break_ensure.rb:35:12:35:16 | ... > ... | | -| break_ensure.rb:35:16:35:16 | [ensure: raise] 0 | break_ensure.rb:35:12:35:16 | [ensure: raise] ... > ... | | +| break_ensure.rb:35:16:35:16 | [ensure: exception] 0 | break_ensure.rb:35:12:35:16 | [ensure: exception] ... > ... | | | break_ensure.rb:35:16:35:16 | [ensure: return] 0 | break_ensure.rb:35:12:35:16 | [ensure: return] ... > ... | | -| break_ensure.rb:36:11:36:15 | [ensure: raise] break | break_ensure.rb:33:5:39:7 | [ensure: raise] while ... | break | +| break_ensure.rb:36:11:36:15 | [ensure: exception] break | break_ensure.rb:33:5:39:7 | [ensure: exception] while ... | break | | break_ensure.rb:36:11:36:15 | [ensure: return] break | break_ensure.rb:33:5:39:7 | [ensure: return] while ... | break | | break_ensure.rb:36:11:36:15 | break | break_ensure.rb:33:5:39:7 | while ... | break | | break_ensure.rb:41:3:41:13 | call to puts | break_ensure.rb:27:1:42:3 | exit m3 (normal) | | @@ -158,27 +158,27 @@ | break_ensure.rb:47:10:47:10 | x | break_ensure.rb:47:14:47:14 | 1 | | | break_ensure.rb:47:10:47:14 | ... > ... | break_ensure.rb:47:7:49:9 | if ... | false | | break_ensure.rb:47:10:47:14 | ... > ... | break_ensure.rb:48:9:48:16 | self | true | -| break_ensure.rb:47:10:47:14 | ... > ... | break_ensure.rb:51:10:51:10 | [ensure: raise] x | raise | +| break_ensure.rb:47:10:47:14 | ... > ... | break_ensure.rb:51:10:51:10 | [ensure: exception] x | exception | | break_ensure.rb:47:14:47:14 | 1 | break_ensure.rb:47:10:47:14 | ... > ... | | -| break_ensure.rb:48:9:48:16 | call to raise | break_ensure.rb:51:10:51:10 | [ensure: raise] x | raise | +| break_ensure.rb:48:9:48:16 | call to raise | break_ensure.rb:51:10:51:10 | [ensure: exception] x | exception | | break_ensure.rb:48:9:48:16 | self | break_ensure.rb:48:15:48:16 | "" | | | break_ensure.rb:48:15:48:16 | "" | break_ensure.rb:48:9:48:16 | call to raise | | -| break_ensure.rb:50:5:53:9 | [ensure: raise] ensure ... | break_ensure.rb:45:3:55:5 | while ... | raise | +| break_ensure.rb:50:5:53:9 | [ensure: exception] ensure ... | break_ensure.rb:45:3:55:5 | while ... | exception | | break_ensure.rb:50:5:53:9 | ensure ... | break_ensure.rb:45:14:55:5 | do ... | | -| break_ensure.rb:51:7:53:9 | [ensure: raise] if ... | break_ensure.rb:50:5:53:9 | [ensure: raise] ensure ... | | +| break_ensure.rb:51:7:53:9 | [ensure: exception] if ... | break_ensure.rb:50:5:53:9 | [ensure: exception] ensure ... | | | break_ensure.rb:51:7:53:9 | if ... | break_ensure.rb:50:5:53:9 | ensure ... | | -| break_ensure.rb:51:10:51:10 | [ensure: raise] x | break_ensure.rb:51:14:51:14 | [ensure: raise] 0 | | +| break_ensure.rb:51:10:51:10 | [ensure: exception] x | break_ensure.rb:51:14:51:14 | [ensure: exception] 0 | | | break_ensure.rb:51:10:51:10 | x | break_ensure.rb:51:14:51:14 | 0 | | | break_ensure.rb:51:10:51:14 | ... > ... | break_ensure.rb:51:7:53:9 | if ... | false | | break_ensure.rb:51:10:51:14 | ... > ... | break_ensure.rb:52:15:52:16 | 10 | true | -| break_ensure.rb:51:10:51:14 | [ensure: raise] ... > ... | break_ensure.rb:51:7:53:9 | [ensure: raise] if ... | false | -| break_ensure.rb:51:10:51:14 | [ensure: raise] ... > ... | break_ensure.rb:52:15:52:16 | [ensure: raise] 10 | true | +| break_ensure.rb:51:10:51:14 | [ensure: exception] ... > ... | break_ensure.rb:51:7:53:9 | [ensure: exception] if ... | false | +| break_ensure.rb:51:10:51:14 | [ensure: exception] ... > ... | break_ensure.rb:52:15:52:16 | [ensure: exception] 10 | true | | break_ensure.rb:51:14:51:14 | 0 | break_ensure.rb:51:10:51:14 | ... > ... | | -| break_ensure.rb:51:14:51:14 | [ensure: raise] 0 | break_ensure.rb:51:10:51:14 | [ensure: raise] ... > ... | | -| break_ensure.rb:52:9:52:16 | [ensure: raise] break | break_ensure.rb:45:3:55:5 | while ... | break | +| break_ensure.rb:51:14:51:14 | [ensure: exception] 0 | break_ensure.rb:51:10:51:14 | [ensure: exception] ... > ... | | +| break_ensure.rb:52:9:52:16 | [ensure: exception] break | break_ensure.rb:45:3:55:5 | while ... | break | | break_ensure.rb:52:9:52:16 | break | break_ensure.rb:45:3:55:5 | while ... | break | | break_ensure.rb:52:15:52:16 | 10 | break_ensure.rb:52:9:52:16 | break | | -| break_ensure.rb:52:15:52:16 | [ensure: raise] 10 | break_ensure.rb:52:9:52:16 | [ensure: raise] break | | +| break_ensure.rb:52:15:52:16 | [ensure: exception] 10 | break_ensure.rb:52:9:52:16 | [ensure: exception] break | | | case.rb:1:1:6:3 | enter if_in_case | case.rb:2:8:2:9 | self | | | case.rb:1:1:6:3 | exit if_in_case (normal) | case.rb:1:1:6:3 | exit if_in_case | | | case.rb:1:1:6:3 | if_in_case | case.rb:8:1:18:3 | case_match | | @@ -256,7 +256,7 @@ | case.rb:21:3:23:5 | case ... | case.rb:20:1:24:3 | exit case_match_no_match (normal) | | | case.rb:21:8:21:12 | value | case.rb:22:5:22:8 | in ... then ... | | | case.rb:22:5:22:8 | in ... then ... | case.rb:22:8:22:8 | 1 | | -| case.rb:22:8:22:8 | 1 | case.rb:20:1:24:3 | exit case_match_no_match (abnormal) | raise | +| case.rb:22:8:22:8 | 1 | case.rb:20:1:24:3 | exit case_match_no_match (abnormal) | exception | | case.rb:22:8:22:8 | 1 | case.rb:21:3:23:5 | case ... | match | | case.rb:26:1:30:3 | case_match_raise | case.rb:32:1:39:3 | case_match_array | | | case.rb:26:1:30:3 | enter case_match_raise | case.rb:26:22:26:26 | value | | @@ -266,12 +266,12 @@ | case.rb:27:3:29:5 | case ... | case.rb:26:1:30:3 | exit case_match_raise (normal) | | | case.rb:27:8:27:12 | value | case.rb:28:4:28:28 | in ... then ... | | | case.rb:28:4:28:28 | in ... then ... | case.rb:28:7:28:28 | -> { ... } | | -| case.rb:28:7:28:28 | -> { ... } | case.rb:26:1:30:3 | exit case_match_raise (abnormal) | raise | +| case.rb:28:7:28:28 | -> { ... } | case.rb:26:1:30:3 | exit case_match_raise (abnormal) | exception | | case.rb:28:7:28:28 | -> { ... } | case.rb:27:3:29:5 | case ... | match | | case.rb:28:7:28:28 | enter -> { ... } | case.rb:28:10:28:10 | x | | | case.rb:28:7:28:28 | exit -> { ... } (abnormal) | case.rb:28:7:28:28 | exit -> { ... } | | | case.rb:28:10:28:10 | x | case.rb:28:14:28:25 | self | | -| case.rb:28:14:28:25 | call to raise | case.rb:28:7:28:28 | exit -> { ... } (abnormal) | raise | +| case.rb:28:14:28:25 | call to raise | case.rb:28:7:28:28 | exit -> { ... } (abnormal) | exception | | case.rb:28:14:28:25 | self | case.rb:28:21:28:24 | oops | | | case.rb:28:20:28:25 | "oops" | case.rb:28:14:28:25 | call to raise | | | case.rb:28:21:28:24 | oops | case.rb:28:20:28:25 | "oops" | | @@ -294,9 +294,9 @@ | case.rb:36:8:36:12 | [ ..., * ] | case.rb:37:5:37:27 | in ... then ... | no-match | | case.rb:36:9:36:9 | x | case.rb:33:3:38:5 | case ... | match | | case.rb:37:5:37:27 | in ... then ... | case.rb:37:8:37:10 | Bar | | -| case.rb:37:8:37:10 | Bar | case.rb:32:1:39:3 | exit case_match_array (abnormal) | raise | +| case.rb:37:8:37:10 | Bar | case.rb:32:1:39:3 | exit case_match_array (abnormal) | exception | | case.rb:37:8:37:10 | Bar | case.rb:37:8:37:26 | [ ..., * ] | match | -| case.rb:37:8:37:26 | [ ..., * ] | case.rb:32:1:39:3 | exit case_match_array (abnormal) | raise | +| case.rb:37:8:37:26 | [ ..., * ] | case.rb:32:1:39:3 | exit case_match_array (abnormal) | exception | | case.rb:37:8:37:26 | [ ..., * ] | case.rb:37:12:37:12 | a | false, match, true | | case.rb:37:12:37:12 | a | case.rb:37:15:37:15 | b | match | | case.rb:37:15:37:15 | b | case.rb:37:19:37:19 | c | match | @@ -311,12 +311,12 @@ | case.rb:42:3:44:5 | case ... | case.rb:41:1:45:3 | exit case_match_find (normal) | | | case.rb:42:8:42:12 | value | case.rb:43:5:43:22 | in ... then ... | | | case.rb:43:5:43:22 | in ... then ... | case.rb:43:8:43:21 | [ *,...,* ] | | -| case.rb:43:8:43:21 | [ *,...,* ] | case.rb:41:1:45:3 | exit case_match_find (abnormal) | raise | +| case.rb:43:8:43:21 | [ *,...,* ] | case.rb:41:1:45:3 | exit case_match_find (abnormal) | exception | | case.rb:43:8:43:21 | [ *,...,* ] | case.rb:43:10:43:10 | x | false, match, true | | case.rb:43:10:43:10 | x | case.rb:43:13:43:13 | 1 | | -| case.rb:43:13:43:13 | 1 | case.rb:41:1:45:3 | exit case_match_find (abnormal) | raise | +| case.rb:43:13:43:13 | 1 | case.rb:41:1:45:3 | exit case_match_find (abnormal) | exception | | case.rb:43:13:43:13 | 1 | case.rb:43:16:43:16 | 2 | match | -| case.rb:43:16:43:16 | 2 | case.rb:41:1:45:3 | exit case_match_find (abnormal) | raise | +| case.rb:43:16:43:16 | 2 | case.rb:41:1:45:3 | exit case_match_find (abnormal) | exception | | case.rb:43:16:43:16 | 2 | case.rb:43:20:43:20 | y | match | | case.rb:43:20:43:20 | y | case.rb:42:3:44:5 | case ... | | | case.rb:47:1:53:3 | case_match_hash | case.rb:55:1:61:3 | case_match_variable | | @@ -344,9 +344,9 @@ | case.rb:50:16:50:16 | 1 | case.rb:48:3:52:5 | case ... | match | | case.rb:50:16:50:16 | 1 | case.rb:51:5:51:17 | in ... then ... | no-match | | case.rb:51:5:51:17 | in ... then ... | case.rb:51:8:51:10 | Bar | | -| case.rb:51:8:51:10 | Bar | case.rb:47:1:53:3 | exit case_match_hash (abnormal) | raise | +| case.rb:51:8:51:10 | Bar | case.rb:47:1:53:3 | exit case_match_hash (abnormal) | exception | | case.rb:51:8:51:10 | Bar | case.rb:51:8:51:16 | { ..., ** } | match | -| case.rb:51:8:51:16 | { ..., ** } | case.rb:47:1:53:3 | exit case_match_hash (abnormal) | raise | +| case.rb:51:8:51:16 | { ..., ** } | case.rb:47:1:53:3 | exit case_match_hash (abnormal) | exception | | case.rb:51:8:51:16 | { ..., ** } | case.rb:48:3:52:5 | case ... | false, match, true | | case.rb:55:1:61:3 | case_match_variable | case.rb:63:1:67:3 | case_match_underscore | | | case.rb:55:1:61:3 | enter case_match_variable | case.rb:55:25:55:29 | value | | @@ -500,7 +500,7 @@ | case.rb:91:13:91:14 | "" | case.rb:91:18:91:19 | [ ..., * ] | no-match | | case.rb:91:18:91:19 | [ ..., * ] | case.rb:72:3:92:5 | case ... | match | | case.rb:91:18:91:19 | [ ..., * ] | case.rb:91:23:91:24 | { ..., ** } | no-match | -| case.rb:91:23:91:24 | { ..., ** } | case.rb:69:1:93:3 | exit case_match_various (abnormal) | raise | +| case.rb:91:23:91:24 | { ..., ** } | case.rb:69:1:93:3 | exit case_match_various (abnormal) | exception | | case.rb:91:23:91:24 | { ..., ** } | case.rb:72:3:92:5 | case ... | false, match, true | | case.rb:95:1:99:3 | case_match_guard_no_else | case.rb:1:1:99:4 | exit case.rb (normal) | | | case.rb:95:1:99:3 | enter case_match_guard_no_else | case.rb:95:30:95:34 | value | | @@ -512,7 +512,7 @@ | case.rb:97:5:97:25 | in ... then ... | case.rb:97:8:97:8 | x | | | case.rb:97:8:97:8 | x | case.rb:97:13:97:13 | x | match | | case.rb:97:13:97:13 | x | case.rb:97:18:97:18 | 5 | | -| case.rb:97:13:97:18 | ... == ... | case.rb:95:1:99:3 | exit case_match_guard_no_else (abnormal) | raise | +| case.rb:97:13:97:18 | ... == ... | case.rb:95:1:99:3 | exit case_match_guard_no_else (abnormal) | exception | | case.rb:97:13:97:18 | ... == ... | case.rb:97:25:97:25 | 6 | true | | case.rb:97:18:97:18 | 5 | case.rb:97:13:97:18 | ... == ... | | | case.rb:97:20:97:25 | then ... | case.rb:96:3:98:5 | case ... | | @@ -870,7 +870,7 @@ | cfg.rb:91:6:91:10 | ... > ... | cfg.rb:91:3:91:24 | if ... | false | | cfg.rb:91:6:91:10 | ... > ... | cfg.rb:91:17:91:20 | next | true | | cfg.rb:91:10:91:10 | 3 | cfg.rb:91:6:91:10 | ... > ... | | -| cfg.rb:91:17:91:20 | next | cfg.rb:90:1:93:3 | exit { ... } (normal) | next | +| cfg.rb:91:17:91:20 | next | cfg.rb:90:1:93:3 | exit { ... } (normal) | continue | | cfg.rb:92:3:92:8 | call to puts | cfg.rb:90:1:93:3 | exit { ... } (normal) | | | cfg.rb:92:3:92:8 | self | cfg.rb:92:8:92:8 | x | | | cfg.rb:92:8:92:8 | x | cfg.rb:92:3:92:8 | call to puts | | @@ -1024,7 +1024,7 @@ | cfg.rb:134:1:134:23 | EmptyModule | cfg.rb:136:1:136:1 | 1 | | | cfg.rb:136:1:136:1 | 1 | cfg.rb:136:3:136:3 | 0 | | | cfg.rb:136:1:136:3 | ... / ... | cfg.rb:136:1:136:29 | ... rescue ... | | -| cfg.rb:136:1:136:3 | ... / ... | cfg.rb:136:12:136:29 | self | raise | +| cfg.rb:136:1:136:3 | ... / ... | cfg.rb:136:12:136:29 | self | exception | | cfg.rb:136:1:136:29 | ... rescue ... | cfg.rb:138:17:138:23 | __synth__2 | | | cfg.rb:136:3:136:3 | 0 | cfg.rb:136:1:136:3 | ... / ... | | | cfg.rb:136:12:136:29 | call to puts | cfg.rb:136:1:136:29 | ... rescue ... | | @@ -1828,7 +1828,7 @@ | loops.rb:14:11:14:16 | ... > ... | loops.rb:15:7:15:10 | next | true | | loops.rb:14:11:14:16 | ... > ... | loops.rb:16:11:16:11 | x | false | | loops.rb:14:15:14:16 | 50 | loops.rb:14:11:14:16 | ... > ... | | -| loops.rb:15:7:15:10 | next | loops.rb:9:9:9:9 | x | next | +| loops.rb:15:7:15:10 | next | loops.rb:9:9:9:9 | x | continue | | loops.rb:16:5:17:10 | elsif ... | loops.rb:14:5:17:10 | elsif ... | | | loops.rb:16:11:16:11 | x | loops.rb:16:15:16:16 | 10 | | | loops.rb:16:11:16:16 | ... > ... | loops.rb:16:5:17:10 | elsif ... | false | @@ -1886,7 +1886,7 @@ | raise.rb:8:6:8:10 | ... > ... | raise.rb:8:3:10:5 | if ... | false | | raise.rb:8:6:8:10 | ... > ... | raise.rb:9:5:9:17 | self | true | | raise.rb:8:10:8:10 | 2 | raise.rb:8:6:8:10 | ... > ... | | -| raise.rb:9:5:9:17 | call to raise | raise.rb:7:1:12:3 | exit m1 (abnormal) | raise | +| raise.rb:9:5:9:17 | call to raise | raise.rb:7:1:12:3 | exit m1 (abnormal) | exception | | raise.rb:9:5:9:17 | self | raise.rb:9:12:9:16 | x > 2 | | | raise.rb:9:11:9:17 | "x > 2" | raise.rb:9:5:9:17 | call to raise | | | raise.rb:9:12:9:16 | x > 2 | raise.rb:9:11:9:17 | "x > 2" | | @@ -1902,11 +1902,11 @@ | raise.rb:16:5:18:7 | if ... | raise.rb:22:3:22:15 | self | | | raise.rb:16:8:16:8 | b | raise.rb:16:5:18:7 | if ... | false | | raise.rb:16:8:16:8 | b | raise.rb:17:7:17:22 | self | true | -| raise.rb:17:7:17:22 | call to raise | raise.rb:19:10:19:19 | ExceptionA | raise | +| raise.rb:17:7:17:22 | call to raise | raise.rb:19:10:19:19 | ExceptionA | exception | | raise.rb:17:7:17:22 | self | raise.rb:17:13:17:22 | ExceptionA | | | raise.rb:17:13:17:22 | ExceptionA | raise.rb:17:7:17:22 | call to raise | | | raise.rb:19:3:20:18 | rescue ... | raise.rb:22:3:22:15 | self | | -| raise.rb:19:10:19:19 | ExceptionA | raise.rb:14:1:23:3 | exit m2 (abnormal) | raise | +| raise.rb:19:10:19:19 | ExceptionA | raise.rb:14:1:23:3 | exit m2 (abnormal) | exception | | raise.rb:19:10:19:19 | ExceptionA | raise.rb:20:5:20:18 | self | match | | raise.rb:19:20:20:18 | then ... | raise.rb:19:3:20:18 | rescue ... | | | raise.rb:20:5:20:18 | call to puts | raise.rb:19:20:20:18 | then ... | | @@ -1924,7 +1924,7 @@ | raise.rb:27:5:29:7 | if ... | raise.rb:33:3:33:15 | self | | | raise.rb:27:8:27:8 | b | raise.rb:27:5:29:7 | if ... | false | | raise.rb:27:8:27:8 | b | raise.rb:28:7:28:22 | self | true | -| raise.rb:28:7:28:22 | call to raise | raise.rb:31:5:31:18 | self | raise | +| raise.rb:28:7:28:22 | call to raise | raise.rb:31:5:31:18 | self | exception | | raise.rb:28:7:28:22 | self | raise.rb:28:13:28:22 | ExceptionA | | | raise.rb:28:13:28:22 | ExceptionA | raise.rb:28:7:28:22 | call to raise | | | raise.rb:30:3:31:18 | rescue ... | raise.rb:33:3:33:15 | self | | @@ -1944,7 +1944,7 @@ | raise.rb:38:5:40:7 | if ... | raise.rb:44:3:44:15 | self | | | raise.rb:38:8:38:8 | b | raise.rb:38:5:40:7 | if ... | false | | raise.rb:38:8:38:8 | b | raise.rb:39:7:39:22 | self | true | -| raise.rb:39:7:39:22 | call to raise | raise.rb:41:13:41:13 | e | raise | +| raise.rb:39:7:39:22 | call to raise | raise.rb:41:13:41:13 | e | exception | | raise.rb:39:7:39:22 | self | raise.rb:39:13:39:22 | ExceptionA | | | raise.rb:39:13:39:22 | ExceptionA | raise.rb:39:7:39:22 | call to raise | | | raise.rb:41:3:42:22 | rescue ... | raise.rb:44:3:44:15 | self | | @@ -1965,7 +1965,7 @@ | raise.rb:49:5:51:7 | if ... | raise.rb:54:3:54:15 | self | | | raise.rb:49:8:49:8 | b | raise.rb:49:5:51:7 | if ... | false | | raise.rb:49:8:49:8 | b | raise.rb:50:7:50:22 | self | true | -| raise.rb:50:7:50:22 | call to raise | raise.rb:52:13:52:13 | e | raise | +| raise.rb:50:7:50:22 | call to raise | raise.rb:52:13:52:13 | e | exception | | raise.rb:50:7:50:22 | self | raise.rb:50:13:50:22 | ExceptionA | | | raise.rb:50:13:50:22 | ExceptionA | raise.rb:50:7:50:22 | call to raise | | | raise.rb:52:3:52:13 | rescue ... | raise.rb:54:3:54:15 | self | | @@ -1982,13 +1982,13 @@ | raise.rb:59:5:61:7 | if ... | raise.rb:65:3:65:15 | self | | | raise.rb:59:8:59:8 | b | raise.rb:59:5:61:7 | if ... | false | | raise.rb:59:8:59:8 | b | raise.rb:60:7:60:22 | self | true | -| raise.rb:60:7:60:22 | call to raise | raise.rb:62:10:62:19 | ExceptionA | raise | +| raise.rb:60:7:60:22 | call to raise | raise.rb:62:10:62:19 | ExceptionA | exception | | raise.rb:60:7:60:22 | self | raise.rb:60:13:60:22 | ExceptionA | | | raise.rb:60:13:60:22 | ExceptionA | raise.rb:60:7:60:22 | call to raise | | | raise.rb:62:3:63:22 | rescue ... | raise.rb:65:3:65:15 | self | | | raise.rb:62:10:62:19 | ExceptionA | raise.rb:62:22:62:31 | ExceptionB | no-match | | raise.rb:62:10:62:19 | ExceptionA | raise.rb:62:36:62:36 | e | match | -| raise.rb:62:22:62:31 | ExceptionB | raise.rb:57:1:66:3 | exit m6 (abnormal) | raise | +| raise.rb:62:22:62:31 | ExceptionB | raise.rb:57:1:66:3 | exit m6 (abnormal) | exception | | raise.rb:62:22:62:31 | ExceptionB | raise.rb:62:36:62:36 | e | match | | raise.rb:62:36:62:36 | e | raise.rb:63:5:63:22 | self | | | raise.rb:62:37:63:22 | then ... | raise.rb:62:3:63:22 | rescue ... | | @@ -2009,9 +2009,9 @@ | raise.rb:69:6:69:6 | x | raise.rb:69:10:69:10 | 2 | | | raise.rb:69:6:69:10 | ... > ... | raise.rb:70:5:70:17 | self | true | | raise.rb:69:6:69:10 | ... > ... | raise.rb:71:9:71:9 | x | false | -| raise.rb:69:6:69:10 | ... > ... | raise.rb:76:3:76:15 | [ensure: raise] self | raise | +| raise.rb:69:6:69:10 | ... > ... | raise.rb:76:3:76:15 | [ensure: exception] self | exception | | raise.rb:69:10:69:10 | 2 | raise.rb:69:6:69:10 | ... > ... | | -| raise.rb:70:5:70:17 | call to raise | raise.rb:76:3:76:15 | [ensure: raise] self | raise | +| raise.rb:70:5:70:17 | call to raise | raise.rb:76:3:76:15 | [ensure: exception] self | exception | | raise.rb:70:5:70:17 | self | raise.rb:70:12:70:16 | x > 2 | | | raise.rb:70:11:70:17 | "x > 2" | raise.rb:70:5:70:17 | call to raise | | | raise.rb:70:12:70:16 | x > 2 | raise.rb:70:11:70:17 | "x > 2" | | @@ -2019,29 +2019,29 @@ | raise.rb:71:9:71:9 | x | raise.rb:71:13:71:13 | 0 | | | raise.rb:71:9:71:13 | ... < ... | raise.rb:71:3:72:18 | elsif ... | false | | raise.rb:71:9:71:13 | ... < ... | raise.rb:72:13:72:17 | x < 0 | true | -| raise.rb:71:9:71:13 | ... < ... | raise.rb:76:3:76:15 | [ensure: raise] self | raise | +| raise.rb:71:9:71:13 | ... < ... | raise.rb:76:3:76:15 | [ensure: exception] self | exception | | raise.rb:71:13:71:13 | 0 | raise.rb:71:9:71:13 | ... < ... | | | raise.rb:72:5:72:18 | return | raise.rb:76:3:76:15 | [ensure: return] self | return | | raise.rb:72:12:72:18 | "x < 0" | raise.rb:72:5:72:18 | return | | | raise.rb:72:13:72:17 | x < 0 | raise.rb:72:12:72:18 | "x < 0" | | -| raise.rb:74:3:74:20 | call to puts | raise.rb:76:3:76:15 | [ensure: raise] self | raise | +| raise.rb:74:3:74:20 | call to puts | raise.rb:76:3:76:15 | [ensure: exception] self | exception | | raise.rb:74:3:74:20 | call to puts | raise.rb:76:3:76:15 | self | | | raise.rb:74:3:74:20 | self | raise.rb:74:9:74:19 | 0 <= x <= 2 | | | raise.rb:74:8:74:20 | "0 <= x <= 2" | raise.rb:74:3:74:20 | call to puts | | | raise.rb:74:9:74:19 | 0 <= x <= 2 | raise.rb:74:8:74:20 | "0 <= x <= 2" | | -| raise.rb:75:1:76:15 | [ensure: raise] ensure ... | raise.rb:68:1:77:3 | exit m7 (abnormal) | raise | +| raise.rb:75:1:76:15 | [ensure: exception] ensure ... | raise.rb:68:1:77:3 | exit m7 (abnormal) | exception | | raise.rb:75:1:76:15 | [ensure: return] ensure ... | raise.rb:68:1:77:3 | exit m7 (normal) | return | | raise.rb:75:1:76:15 | ensure ... | raise.rb:68:1:77:3 | exit m7 (normal) | | -| raise.rb:76:3:76:15 | [ensure: raise] call to puts | raise.rb:75:1:76:15 | [ensure: raise] ensure ... | | -| raise.rb:76:3:76:15 | [ensure: raise] self | raise.rb:76:9:76:14 | [ensure: raise] ensure | | +| raise.rb:76:3:76:15 | [ensure: exception] call to puts | raise.rb:75:1:76:15 | [ensure: exception] ensure ... | | +| raise.rb:76:3:76:15 | [ensure: exception] self | raise.rb:76:9:76:14 | [ensure: exception] ensure | | | raise.rb:76:3:76:15 | [ensure: return] call to puts | raise.rb:75:1:76:15 | [ensure: return] ensure ... | | | raise.rb:76:3:76:15 | [ensure: return] self | raise.rb:76:9:76:14 | [ensure: return] ensure | | | raise.rb:76:3:76:15 | call to puts | raise.rb:75:1:76:15 | ensure ... | | | raise.rb:76:3:76:15 | self | raise.rb:76:9:76:14 | ensure | | | raise.rb:76:8:76:15 | "ensure" | raise.rb:76:3:76:15 | call to puts | | -| raise.rb:76:8:76:15 | [ensure: raise] "ensure" | raise.rb:76:3:76:15 | [ensure: raise] call to puts | | +| raise.rb:76:8:76:15 | [ensure: exception] "ensure" | raise.rb:76:3:76:15 | [ensure: exception] call to puts | | | raise.rb:76:8:76:15 | [ensure: return] "ensure" | raise.rb:76:3:76:15 | [ensure: return] call to puts | | -| raise.rb:76:9:76:14 | [ensure: raise] ensure | raise.rb:76:8:76:15 | [ensure: raise] "ensure" | | +| raise.rb:76:9:76:14 | [ensure: exception] ensure | raise.rb:76:8:76:15 | [ensure: exception] "ensure" | | | raise.rb:76:9:76:14 | [ensure: return] ensure | raise.rb:76:8:76:15 | [ensure: return] "ensure" | | | raise.rb:76:9:76:14 | ensure | raise.rb:76:8:76:15 | "ensure" | | | raise.rb:79:1:92:3 | enter m8 | raise.rb:79:8:79:8 | x | | @@ -2057,9 +2057,9 @@ | raise.rb:82:8:82:8 | x | raise.rb:82:12:82:12 | 2 | | | raise.rb:82:8:82:12 | ... > ... | raise.rb:83:7:83:19 | self | true | | raise.rb:82:8:82:12 | ... > ... | raise.rb:84:11:84:11 | x | false | -| raise.rb:82:8:82:12 | ... > ... | raise.rb:89:5:89:17 | [ensure: raise] self | raise | +| raise.rb:82:8:82:12 | ... > ... | raise.rb:89:5:89:17 | [ensure: exception] self | exception | | raise.rb:82:12:82:12 | 2 | raise.rb:82:8:82:12 | ... > ... | | -| raise.rb:83:7:83:19 | call to raise | raise.rb:89:5:89:17 | [ensure: raise] self | raise | +| raise.rb:83:7:83:19 | call to raise | raise.rb:89:5:89:17 | [ensure: exception] self | exception | | raise.rb:83:7:83:19 | self | raise.rb:83:14:83:18 | x > 2 | | | raise.rb:83:13:83:19 | "x > 2" | raise.rb:83:7:83:19 | call to raise | | | raise.rb:83:14:83:18 | x > 2 | raise.rb:83:13:83:19 | "x > 2" | | @@ -2067,29 +2067,29 @@ | raise.rb:84:11:84:11 | x | raise.rb:84:15:84:15 | 0 | | | raise.rb:84:11:84:15 | ... < ... | raise.rb:84:5:85:20 | elsif ... | false | | raise.rb:84:11:84:15 | ... < ... | raise.rb:85:15:85:19 | x < 0 | true | -| raise.rb:84:11:84:15 | ... < ... | raise.rb:89:5:89:17 | [ensure: raise] self | raise | +| raise.rb:84:11:84:15 | ... < ... | raise.rb:89:5:89:17 | [ensure: exception] self | exception | | raise.rb:84:15:84:15 | 0 | raise.rb:84:11:84:15 | ... < ... | | | raise.rb:85:7:85:20 | return | raise.rb:89:5:89:17 | [ensure: return] self | return | | raise.rb:85:14:85:20 | "x < 0" | raise.rb:85:7:85:20 | return | | | raise.rb:85:15:85:19 | x < 0 | raise.rb:85:14:85:20 | "x < 0" | | -| raise.rb:87:5:87:22 | call to puts | raise.rb:89:5:89:17 | [ensure: raise] self | raise | +| raise.rb:87:5:87:22 | call to puts | raise.rb:89:5:89:17 | [ensure: exception] self | exception | | raise.rb:87:5:87:22 | call to puts | raise.rb:89:5:89:17 | self | | | raise.rb:87:5:87:22 | self | raise.rb:87:11:87:21 | 0 <= x <= 2 | | | raise.rb:87:10:87:22 | "0 <= x <= 2" | raise.rb:87:5:87:22 | call to puts | | | raise.rb:87:11:87:21 | 0 <= x <= 2 | raise.rb:87:10:87:22 | "0 <= x <= 2" | | -| raise.rb:88:3:89:17 | [ensure: raise] ensure ... | raise.rb:79:1:92:3 | exit m8 (abnormal) | raise | +| raise.rb:88:3:89:17 | [ensure: exception] ensure ... | raise.rb:79:1:92:3 | exit m8 (abnormal) | exception | | raise.rb:88:3:89:17 | [ensure: return] ensure ... | raise.rb:79:1:92:3 | exit m8 (normal) | return | | raise.rb:88:3:89:17 | ensure ... | raise.rb:91:3:91:15 | self | | -| raise.rb:89:5:89:17 | [ensure: raise] call to puts | raise.rb:88:3:89:17 | [ensure: raise] ensure ... | | -| raise.rb:89:5:89:17 | [ensure: raise] self | raise.rb:89:11:89:16 | [ensure: raise] ensure | | +| raise.rb:89:5:89:17 | [ensure: exception] call to puts | raise.rb:88:3:89:17 | [ensure: exception] ensure ... | | +| raise.rb:89:5:89:17 | [ensure: exception] self | raise.rb:89:11:89:16 | [ensure: exception] ensure | | | raise.rb:89:5:89:17 | [ensure: return] call to puts | raise.rb:88:3:89:17 | [ensure: return] ensure ... | | | raise.rb:89:5:89:17 | [ensure: return] self | raise.rb:89:11:89:16 | [ensure: return] ensure | | | raise.rb:89:5:89:17 | call to puts | raise.rb:88:3:89:17 | ensure ... | | | raise.rb:89:5:89:17 | self | raise.rb:89:11:89:16 | ensure | | | raise.rb:89:10:89:17 | "ensure" | raise.rb:89:5:89:17 | call to puts | | -| raise.rb:89:10:89:17 | [ensure: raise] "ensure" | raise.rb:89:5:89:17 | [ensure: raise] call to puts | | +| raise.rb:89:10:89:17 | [ensure: exception] "ensure" | raise.rb:89:5:89:17 | [ensure: exception] call to puts | | | raise.rb:89:10:89:17 | [ensure: return] "ensure" | raise.rb:89:5:89:17 | [ensure: return] call to puts | | -| raise.rb:89:11:89:16 | [ensure: raise] ensure | raise.rb:89:10:89:17 | [ensure: raise] "ensure" | | +| raise.rb:89:11:89:16 | [ensure: exception] ensure | raise.rb:89:10:89:17 | [ensure: exception] "ensure" | | | raise.rb:89:11:89:16 | [ensure: return] ensure | raise.rb:89:10:89:17 | [ensure: return] "ensure" | | | raise.rb:89:11:89:16 | ensure | raise.rb:89:10:89:17 | "ensure" | | | raise.rb:91:3:91:15 | call to puts | raise.rb:79:1:92:3 | exit m8 (normal) | | @@ -2104,7 +2104,7 @@ | raise.rb:94:11:94:12 | b1 | raise.rb:94:15:94:16 | b2 | | | raise.rb:94:15:94:16 | b2 | raise.rb:95:3:95:17 | self | | | raise.rb:95:3:95:17 | call to puts | raise.rb:97:8:97:8 | x | | -| raise.rb:95:3:95:17 | call to puts | raise.rb:115:3:115:22 | [ensure: raise] self | raise | +| raise.rb:95:3:95:17 | call to puts | raise.rb:115:3:115:22 | [ensure: exception] self | exception | | raise.rb:95:3:95:17 | self | raise.rb:95:9:95:16 | Begin m9 | | | raise.rb:95:8:95:17 | "Begin m9" | raise.rb:95:3:95:17 | call to puts | | | raise.rb:95:9:95:16 | Begin m9 | raise.rb:95:8:95:17 | "Begin m9" | | @@ -2112,9 +2112,9 @@ | raise.rb:97:8:97:8 | x | raise.rb:97:12:97:12 | 2 | | | raise.rb:97:8:97:12 | ... > ... | raise.rb:98:7:98:19 | self | true | | raise.rb:97:8:97:12 | ... > ... | raise.rb:99:11:99:11 | x | false | -| raise.rb:97:8:97:12 | ... > ... | raise.rb:104:5:104:23 | [ensure: raise] self | raise | +| raise.rb:97:8:97:12 | ... > ... | raise.rb:104:5:104:23 | [ensure: exception] self | exception | | raise.rb:97:12:97:12 | 2 | raise.rb:97:8:97:12 | ... > ... | | -| raise.rb:98:7:98:19 | call to raise | raise.rb:104:5:104:23 | [ensure: raise] self | raise | +| raise.rb:98:7:98:19 | call to raise | raise.rb:104:5:104:23 | [ensure: exception] self | exception | | raise.rb:98:7:98:19 | self | raise.rb:98:14:98:18 | x > 2 | | | raise.rb:98:13:98:19 | "x > 2" | raise.rb:98:7:98:19 | call to raise | | | raise.rb:98:14:98:18 | x > 2 | raise.rb:98:13:98:19 | "x > 2" | | @@ -2122,130 +2122,130 @@ | raise.rb:99:11:99:11 | x | raise.rb:99:15:99:15 | 0 | | | raise.rb:99:11:99:15 | ... < ... | raise.rb:99:5:100:20 | elsif ... | false | | raise.rb:99:11:99:15 | ... < ... | raise.rb:100:15:100:19 | x < 0 | true | -| raise.rb:99:11:99:15 | ... < ... | raise.rb:104:5:104:23 | [ensure: raise] self | raise | +| raise.rb:99:11:99:15 | ... < ... | raise.rb:104:5:104:23 | [ensure: exception] self | exception | | raise.rb:99:15:99:15 | 0 | raise.rb:99:11:99:15 | ... < ... | | | raise.rb:100:7:100:20 | return | raise.rb:104:5:104:23 | [ensure: return] self | return | | raise.rb:100:14:100:20 | "x < 0" | raise.rb:100:7:100:20 | return | | | raise.rb:100:15:100:19 | x < 0 | raise.rb:100:14:100:20 | "x < 0" | | -| raise.rb:102:5:102:22 | call to puts | raise.rb:104:5:104:23 | [ensure: raise] self | raise | +| raise.rb:102:5:102:22 | call to puts | raise.rb:104:5:104:23 | [ensure: exception] self | exception | | raise.rb:102:5:102:22 | call to puts | raise.rb:104:5:104:23 | self | | | raise.rb:102:5:102:22 | self | raise.rb:102:11:102:21 | 0 <= x <= 2 | | | raise.rb:102:10:102:22 | "0 <= x <= 2" | raise.rb:102:5:102:22 | call to puts | | | raise.rb:102:11:102:21 | 0 <= x <= 2 | raise.rb:102:10:102:22 | "0 <= x <= 2" | | -| raise.rb:103:3:111:7 | [ensure: raise] ensure ... | raise.rb:115:3:115:22 | [ensure: raise] self | raise | +| raise.rb:103:3:111:7 | [ensure: exception] ensure ... | raise.rb:115:3:115:22 | [ensure: exception] self | exception | | raise.rb:103:3:111:7 | [ensure: return] ensure ... | raise.rb:115:3:115:22 | [ensure: return] self | return | | raise.rb:103:3:111:7 | ensure ... | raise.rb:113:3:113:15 | self | | -| raise.rb:104:5:104:23 | [ensure: raise] call to puts | raise.rb:106:10:106:11 | [ensure: raise] b1 | | -| raise.rb:104:5:104:23 | [ensure: raise] call to puts | raise.rb:115:3:115:22 | [ensure: raise] self | raise | -| raise.rb:104:5:104:23 | [ensure: raise] self | raise.rb:104:11:104:22 | [ensure: raise] outer ensure | | +| raise.rb:104:5:104:23 | [ensure: exception] call to puts | raise.rb:106:10:106:11 | [ensure: exception] b1 | | +| raise.rb:104:5:104:23 | [ensure: exception] call to puts | raise.rb:115:3:115:22 | [ensure: exception] self | exception | +| raise.rb:104:5:104:23 | [ensure: exception] self | raise.rb:104:11:104:22 | [ensure: exception] outer ensure | | | raise.rb:104:5:104:23 | [ensure: return] call to puts | raise.rb:106:10:106:11 | [ensure: return] b1 | | -| raise.rb:104:5:104:23 | [ensure: return] call to puts | raise.rb:115:3:115:22 | [ensure: raise] self | raise | +| raise.rb:104:5:104:23 | [ensure: return] call to puts | raise.rb:115:3:115:22 | [ensure: exception] self | exception | | raise.rb:104:5:104:23 | [ensure: return] self | raise.rb:104:11:104:22 | [ensure: return] outer ensure | | | raise.rb:104:5:104:23 | call to puts | raise.rb:106:10:106:11 | b1 | | -| raise.rb:104:5:104:23 | call to puts | raise.rb:115:3:115:22 | [ensure: raise] self | raise | +| raise.rb:104:5:104:23 | call to puts | raise.rb:115:3:115:22 | [ensure: exception] self | exception | | raise.rb:104:5:104:23 | self | raise.rb:104:11:104:22 | outer ensure | | | raise.rb:104:10:104:23 | "outer ensure" | raise.rb:104:5:104:23 | call to puts | | -| raise.rb:104:10:104:23 | [ensure: raise] "outer ensure" | raise.rb:104:5:104:23 | [ensure: raise] call to puts | | +| raise.rb:104:10:104:23 | [ensure: exception] "outer ensure" | raise.rb:104:5:104:23 | [ensure: exception] call to puts | | | raise.rb:104:10:104:23 | [ensure: return] "outer ensure" | raise.rb:104:5:104:23 | [ensure: return] call to puts | | -| raise.rb:104:11:104:22 | [ensure: raise] outer ensure | raise.rb:104:10:104:23 | [ensure: raise] "outer ensure" | | +| raise.rb:104:11:104:22 | [ensure: exception] outer ensure | raise.rb:104:10:104:23 | [ensure: exception] "outer ensure" | | | raise.rb:104:11:104:22 | [ensure: return] outer ensure | raise.rb:104:10:104:23 | [ensure: return] "outer ensure" | | | raise.rb:104:11:104:22 | outer ensure | raise.rb:104:10:104:23 | "outer ensure" | | -| raise.rb:106:7:108:9 | [ensure: raise] if ... | raise.rb:110:7:110:25 | [ensure: raise] self | | +| raise.rb:106:7:108:9 | [ensure: exception] if ... | raise.rb:110:7:110:25 | [ensure: exception] self | | | raise.rb:106:7:108:9 | [ensure: return] if ... | raise.rb:110:7:110:25 | [ensure: return] self | | | raise.rb:106:7:108:9 | if ... | raise.rb:110:7:110:25 | self | | -| raise.rb:106:10:106:11 | [ensure: raise] b1 | raise.rb:106:7:108:9 | [ensure: raise] if ... | false | -| raise.rb:106:10:106:11 | [ensure: raise] b1 | raise.rb:107:9:107:26 | [ensure: raise] self | true | +| raise.rb:106:10:106:11 | [ensure: exception] b1 | raise.rb:106:7:108:9 | [ensure: exception] if ... | false | +| raise.rb:106:10:106:11 | [ensure: exception] b1 | raise.rb:107:9:107:26 | [ensure: exception] self | true | | raise.rb:106:10:106:11 | [ensure: return] b1 | raise.rb:106:7:108:9 | [ensure: return] if ... | false | | raise.rb:106:10:106:11 | [ensure: return] b1 | raise.rb:107:9:107:26 | [ensure: return] self | true | | raise.rb:106:10:106:11 | b1 | raise.rb:106:7:108:9 | if ... | false | | raise.rb:106:10:106:11 | b1 | raise.rb:107:9:107:26 | self | true | -| raise.rb:107:9:107:26 | [ensure: raise] call to raise | raise.rb:110:7:110:25 | [ensure: raise, ensure(1): raise] self | raise | -| raise.rb:107:9:107:26 | [ensure: raise] self | raise.rb:107:16:107:25 | [ensure: raise] b1 is true | | -| raise.rb:107:9:107:26 | [ensure: return] call to raise | raise.rb:110:7:110:25 | [ensure: return, ensure(1): raise] self | raise | +| raise.rb:107:9:107:26 | [ensure: exception] call to raise | raise.rb:110:7:110:25 | [ensure: exception, ensure(1): exception] self | exception | +| raise.rb:107:9:107:26 | [ensure: exception] self | raise.rb:107:16:107:25 | [ensure: exception] b1 is true | | +| raise.rb:107:9:107:26 | [ensure: return] call to raise | raise.rb:110:7:110:25 | [ensure: return, ensure(1): exception] self | exception | | raise.rb:107:9:107:26 | [ensure: return] self | raise.rb:107:16:107:25 | [ensure: return] b1 is true | | -| raise.rb:107:9:107:26 | call to raise | raise.rb:110:7:110:25 | [ensure(1): raise] self | raise | +| raise.rb:107:9:107:26 | call to raise | raise.rb:110:7:110:25 | [ensure(1): exception] self | exception | | raise.rb:107:9:107:26 | self | raise.rb:107:16:107:25 | b1 is true | | | raise.rb:107:15:107:26 | "b1 is true" | raise.rb:107:9:107:26 | call to raise | | -| raise.rb:107:15:107:26 | [ensure: raise] "b1 is true" | raise.rb:107:9:107:26 | [ensure: raise] call to raise | | +| raise.rb:107:15:107:26 | [ensure: exception] "b1 is true" | raise.rb:107:9:107:26 | [ensure: exception] call to raise | | | raise.rb:107:15:107:26 | [ensure: return] "b1 is true" | raise.rb:107:9:107:26 | [ensure: return] call to raise | | -| raise.rb:107:16:107:25 | [ensure: raise] b1 is true | raise.rb:107:15:107:26 | [ensure: raise] "b1 is true" | | +| raise.rb:107:16:107:25 | [ensure: exception] b1 is true | raise.rb:107:15:107:26 | [ensure: exception] "b1 is true" | | | raise.rb:107:16:107:25 | [ensure: return] b1 is true | raise.rb:107:15:107:26 | [ensure: return] "b1 is true" | | | raise.rb:107:16:107:25 | b1 is true | raise.rb:107:15:107:26 | "b1 is true" | | -| raise.rb:109:5:110:25 | [ensure(1): raise] ensure ... | raise.rb:115:3:115:22 | [ensure: raise] self | raise | -| raise.rb:109:5:110:25 | [ensure: raise, ensure(1): raise] ensure ... | raise.rb:115:3:115:22 | [ensure: raise] self | raise | -| raise.rb:109:5:110:25 | [ensure: raise] ensure ... | raise.rb:103:3:111:7 | [ensure: raise] ensure ... | | -| raise.rb:109:5:110:25 | [ensure: return, ensure(1): raise] ensure ... | raise.rb:115:3:115:22 | [ensure: raise] self | raise | +| raise.rb:109:5:110:25 | [ensure(1): exception] ensure ... | raise.rb:115:3:115:22 | [ensure: exception] self | exception | +| raise.rb:109:5:110:25 | [ensure: exception, ensure(1): exception] ensure ... | raise.rb:115:3:115:22 | [ensure: exception] self | exception | +| raise.rb:109:5:110:25 | [ensure: exception] ensure ... | raise.rb:103:3:111:7 | [ensure: exception] ensure ... | | +| raise.rb:109:5:110:25 | [ensure: return, ensure(1): exception] ensure ... | raise.rb:115:3:115:22 | [ensure: exception] self | exception | | raise.rb:109:5:110:25 | [ensure: return] ensure ... | raise.rb:103:3:111:7 | [ensure: return] ensure ... | | | raise.rb:109:5:110:25 | ensure ... | raise.rb:103:3:111:7 | ensure ... | | -| raise.rb:110:7:110:25 | [ensure(1): raise] call to puts | raise.rb:109:5:110:25 | [ensure(1): raise] ensure ... | | -| raise.rb:110:7:110:25 | [ensure(1): raise] call to puts | raise.rb:115:3:115:22 | [ensure: raise] self | raise | -| raise.rb:110:7:110:25 | [ensure(1): raise] self | raise.rb:110:13:110:24 | [ensure(1): raise] inner ensure | | -| raise.rb:110:7:110:25 | [ensure: raise, ensure(1): raise] call to puts | raise.rb:109:5:110:25 | [ensure: raise, ensure(1): raise] ensure ... | | -| raise.rb:110:7:110:25 | [ensure: raise, ensure(1): raise] call to puts | raise.rb:115:3:115:22 | [ensure: raise] self | raise | -| raise.rb:110:7:110:25 | [ensure: raise, ensure(1): raise] self | raise.rb:110:13:110:24 | [ensure: raise, ensure(1): raise] inner ensure | | -| raise.rb:110:7:110:25 | [ensure: raise] call to puts | raise.rb:109:5:110:25 | [ensure: raise] ensure ... | | -| raise.rb:110:7:110:25 | [ensure: raise] call to puts | raise.rb:115:3:115:22 | [ensure: raise] self | raise | -| raise.rb:110:7:110:25 | [ensure: raise] self | raise.rb:110:13:110:24 | [ensure: raise] inner ensure | | -| raise.rb:110:7:110:25 | [ensure: return, ensure(1): raise] call to puts | raise.rb:109:5:110:25 | [ensure: return, ensure(1): raise] ensure ... | | -| raise.rb:110:7:110:25 | [ensure: return, ensure(1): raise] call to puts | raise.rb:115:3:115:22 | [ensure: raise] self | raise | -| raise.rb:110:7:110:25 | [ensure: return, ensure(1): raise] self | raise.rb:110:13:110:24 | [ensure: return, ensure(1): raise] inner ensure | | +| raise.rb:110:7:110:25 | [ensure(1): exception] call to puts | raise.rb:109:5:110:25 | [ensure(1): exception] ensure ... | | +| raise.rb:110:7:110:25 | [ensure(1): exception] call to puts | raise.rb:115:3:115:22 | [ensure: exception] self | exception | +| raise.rb:110:7:110:25 | [ensure(1): exception] self | raise.rb:110:13:110:24 | [ensure(1): exception] inner ensure | | +| raise.rb:110:7:110:25 | [ensure: exception, ensure(1): exception] call to puts | raise.rb:109:5:110:25 | [ensure: exception, ensure(1): exception] ensure ... | | +| raise.rb:110:7:110:25 | [ensure: exception, ensure(1): exception] call to puts | raise.rb:115:3:115:22 | [ensure: exception] self | exception | +| raise.rb:110:7:110:25 | [ensure: exception, ensure(1): exception] self | raise.rb:110:13:110:24 | [ensure: exception, ensure(1): exception] inner ensure | | +| raise.rb:110:7:110:25 | [ensure: exception] call to puts | raise.rb:109:5:110:25 | [ensure: exception] ensure ... | | +| raise.rb:110:7:110:25 | [ensure: exception] call to puts | raise.rb:115:3:115:22 | [ensure: exception] self | exception | +| raise.rb:110:7:110:25 | [ensure: exception] self | raise.rb:110:13:110:24 | [ensure: exception] inner ensure | | +| raise.rb:110:7:110:25 | [ensure: return, ensure(1): exception] call to puts | raise.rb:109:5:110:25 | [ensure: return, ensure(1): exception] ensure ... | | +| raise.rb:110:7:110:25 | [ensure: return, ensure(1): exception] call to puts | raise.rb:115:3:115:22 | [ensure: exception] self | exception | +| raise.rb:110:7:110:25 | [ensure: return, ensure(1): exception] self | raise.rb:110:13:110:24 | [ensure: return, ensure(1): exception] inner ensure | | | raise.rb:110:7:110:25 | [ensure: return] call to puts | raise.rb:109:5:110:25 | [ensure: return] ensure ... | | -| raise.rb:110:7:110:25 | [ensure: return] call to puts | raise.rb:115:3:115:22 | [ensure: raise] self | raise | +| raise.rb:110:7:110:25 | [ensure: return] call to puts | raise.rb:115:3:115:22 | [ensure: exception] self | exception | | raise.rb:110:7:110:25 | [ensure: return] self | raise.rb:110:13:110:24 | [ensure: return] inner ensure | | | raise.rb:110:7:110:25 | call to puts | raise.rb:109:5:110:25 | ensure ... | | -| raise.rb:110:7:110:25 | call to puts | raise.rb:115:3:115:22 | [ensure: raise] self | raise | +| raise.rb:110:7:110:25 | call to puts | raise.rb:115:3:115:22 | [ensure: exception] self | exception | | raise.rb:110:7:110:25 | self | raise.rb:110:13:110:24 | inner ensure | | | raise.rb:110:12:110:25 | "inner ensure" | raise.rb:110:7:110:25 | call to puts | | -| raise.rb:110:12:110:25 | [ensure(1): raise] "inner ensure" | raise.rb:110:7:110:25 | [ensure(1): raise] call to puts | | -| raise.rb:110:12:110:25 | [ensure: raise, ensure(1): raise] "inner ensure" | raise.rb:110:7:110:25 | [ensure: raise, ensure(1): raise] call to puts | | -| raise.rb:110:12:110:25 | [ensure: raise] "inner ensure" | raise.rb:110:7:110:25 | [ensure: raise] call to puts | | -| raise.rb:110:12:110:25 | [ensure: return, ensure(1): raise] "inner ensure" | raise.rb:110:7:110:25 | [ensure: return, ensure(1): raise] call to puts | | +| raise.rb:110:12:110:25 | [ensure(1): exception] "inner ensure" | raise.rb:110:7:110:25 | [ensure(1): exception] call to puts | | +| raise.rb:110:12:110:25 | [ensure: exception, ensure(1): exception] "inner ensure" | raise.rb:110:7:110:25 | [ensure: exception, ensure(1): exception] call to puts | | +| raise.rb:110:12:110:25 | [ensure: exception] "inner ensure" | raise.rb:110:7:110:25 | [ensure: exception] call to puts | | +| raise.rb:110:12:110:25 | [ensure: return, ensure(1): exception] "inner ensure" | raise.rb:110:7:110:25 | [ensure: return, ensure(1): exception] call to puts | | | raise.rb:110:12:110:25 | [ensure: return] "inner ensure" | raise.rb:110:7:110:25 | [ensure: return] call to puts | | -| raise.rb:110:13:110:24 | [ensure(1): raise] inner ensure | raise.rb:110:12:110:25 | [ensure(1): raise] "inner ensure" | | -| raise.rb:110:13:110:24 | [ensure: raise, ensure(1): raise] inner ensure | raise.rb:110:12:110:25 | [ensure: raise, ensure(1): raise] "inner ensure" | | -| raise.rb:110:13:110:24 | [ensure: raise] inner ensure | raise.rb:110:12:110:25 | [ensure: raise] "inner ensure" | | -| raise.rb:110:13:110:24 | [ensure: return, ensure(1): raise] inner ensure | raise.rb:110:12:110:25 | [ensure: return, ensure(1): raise] "inner ensure" | | +| raise.rb:110:13:110:24 | [ensure(1): exception] inner ensure | raise.rb:110:12:110:25 | [ensure(1): exception] "inner ensure" | | +| raise.rb:110:13:110:24 | [ensure: exception, ensure(1): exception] inner ensure | raise.rb:110:12:110:25 | [ensure: exception, ensure(1): exception] "inner ensure" | | +| raise.rb:110:13:110:24 | [ensure: exception] inner ensure | raise.rb:110:12:110:25 | [ensure: exception] "inner ensure" | | +| raise.rb:110:13:110:24 | [ensure: return, ensure(1): exception] inner ensure | raise.rb:110:12:110:25 | [ensure: return, ensure(1): exception] "inner ensure" | | | raise.rb:110:13:110:24 | [ensure: return] inner ensure | raise.rb:110:12:110:25 | [ensure: return] "inner ensure" | | | raise.rb:110:13:110:24 | inner ensure | raise.rb:110:12:110:25 | "inner ensure" | | -| raise.rb:113:3:113:15 | call to puts | raise.rb:115:3:115:22 | [ensure: raise] self | raise | +| raise.rb:113:3:113:15 | call to puts | raise.rb:115:3:115:22 | [ensure: exception] self | exception | | raise.rb:113:3:113:15 | call to puts | raise.rb:115:3:115:22 | self | | | raise.rb:113:3:113:15 | self | raise.rb:113:9:113:14 | End m9 | | | raise.rb:113:8:113:15 | "End m9" | raise.rb:113:3:113:15 | call to puts | | | raise.rb:113:9:113:14 | End m9 | raise.rb:113:8:113:15 | "End m9" | | -| raise.rb:114:1:118:5 | [ensure: raise] ensure ... | raise.rb:94:1:119:3 | exit m9 (abnormal) | raise | +| raise.rb:114:1:118:5 | [ensure: exception] ensure ... | raise.rb:94:1:119:3 | exit m9 (abnormal) | exception | | raise.rb:114:1:118:5 | [ensure: return] ensure ... | raise.rb:94:1:119:3 | exit m9 (normal) | return | | raise.rb:114:1:118:5 | ensure ... | raise.rb:94:1:119:3 | exit m9 (normal) | | -| raise.rb:115:3:115:22 | [ensure: raise] call to puts | raise.rb:116:6:116:7 | [ensure: raise] b2 | | -| raise.rb:115:3:115:22 | [ensure: raise] self | raise.rb:115:9:115:21 | [ensure: raise] method ensure | | +| raise.rb:115:3:115:22 | [ensure: exception] call to puts | raise.rb:116:6:116:7 | [ensure: exception] b2 | | +| raise.rb:115:3:115:22 | [ensure: exception] self | raise.rb:115:9:115:21 | [ensure: exception] method ensure | | | raise.rb:115:3:115:22 | [ensure: return] call to puts | raise.rb:116:6:116:7 | [ensure: return] b2 | | | raise.rb:115:3:115:22 | [ensure: return] self | raise.rb:115:9:115:21 | [ensure: return] method ensure | | | raise.rb:115:3:115:22 | call to puts | raise.rb:116:6:116:7 | b2 | | | raise.rb:115:3:115:22 | self | raise.rb:115:9:115:21 | method ensure | | | raise.rb:115:8:115:22 | "method ensure" | raise.rb:115:3:115:22 | call to puts | | -| raise.rb:115:8:115:22 | [ensure: raise] "method ensure" | raise.rb:115:3:115:22 | [ensure: raise] call to puts | | +| raise.rb:115:8:115:22 | [ensure: exception] "method ensure" | raise.rb:115:3:115:22 | [ensure: exception] call to puts | | | raise.rb:115:8:115:22 | [ensure: return] "method ensure" | raise.rb:115:3:115:22 | [ensure: return] call to puts | | -| raise.rb:115:9:115:21 | [ensure: raise] method ensure | raise.rb:115:8:115:22 | [ensure: raise] "method ensure" | | +| raise.rb:115:9:115:21 | [ensure: exception] method ensure | raise.rb:115:8:115:22 | [ensure: exception] "method ensure" | | | raise.rb:115:9:115:21 | [ensure: return] method ensure | raise.rb:115:8:115:22 | [ensure: return] "method ensure" | | | raise.rb:115:9:115:21 | method ensure | raise.rb:115:8:115:22 | "method ensure" | | -| raise.rb:116:3:118:5 | [ensure: raise] if ... | raise.rb:114:1:118:5 | [ensure: raise] ensure ... | | +| raise.rb:116:3:118:5 | [ensure: exception] if ... | raise.rb:114:1:118:5 | [ensure: exception] ensure ... | | | raise.rb:116:3:118:5 | [ensure: return] if ... | raise.rb:114:1:118:5 | [ensure: return] ensure ... | | | raise.rb:116:3:118:5 | if ... | raise.rb:114:1:118:5 | ensure ... | | -| raise.rb:116:6:116:7 | [ensure: raise] b2 | raise.rb:116:3:118:5 | [ensure: raise] if ... | false | -| raise.rb:116:6:116:7 | [ensure: raise] b2 | raise.rb:117:5:117:22 | [ensure: raise] self | true | +| raise.rb:116:6:116:7 | [ensure: exception] b2 | raise.rb:116:3:118:5 | [ensure: exception] if ... | false | +| raise.rb:116:6:116:7 | [ensure: exception] b2 | raise.rb:117:5:117:22 | [ensure: exception] self | true | | raise.rb:116:6:116:7 | [ensure: return] b2 | raise.rb:116:3:118:5 | [ensure: return] if ... | false | | raise.rb:116:6:116:7 | [ensure: return] b2 | raise.rb:117:5:117:22 | [ensure: return] self | true | | raise.rb:116:6:116:7 | b2 | raise.rb:116:3:118:5 | if ... | false | | raise.rb:116:6:116:7 | b2 | raise.rb:117:5:117:22 | self | true | -| raise.rb:117:5:117:22 | [ensure: raise] call to raise | raise.rb:94:1:119:3 | exit m9 (abnormal) | raise | -| raise.rb:117:5:117:22 | [ensure: raise] self | raise.rb:117:12:117:21 | [ensure: raise] b2 is true | | -| raise.rb:117:5:117:22 | [ensure: return] call to raise | raise.rb:94:1:119:3 | exit m9 (abnormal) | raise | +| raise.rb:117:5:117:22 | [ensure: exception] call to raise | raise.rb:94:1:119:3 | exit m9 (abnormal) | exception | +| raise.rb:117:5:117:22 | [ensure: exception] self | raise.rb:117:12:117:21 | [ensure: exception] b2 is true | | +| raise.rb:117:5:117:22 | [ensure: return] call to raise | raise.rb:94:1:119:3 | exit m9 (abnormal) | exception | | raise.rb:117:5:117:22 | [ensure: return] self | raise.rb:117:12:117:21 | [ensure: return] b2 is true | | -| raise.rb:117:5:117:22 | call to raise | raise.rb:94:1:119:3 | exit m9 (abnormal) | raise | +| raise.rb:117:5:117:22 | call to raise | raise.rb:94:1:119:3 | exit m9 (abnormal) | exception | | raise.rb:117:5:117:22 | self | raise.rb:117:12:117:21 | b2 is true | | | raise.rb:117:11:117:22 | "b2 is true" | raise.rb:117:5:117:22 | call to raise | | -| raise.rb:117:11:117:22 | [ensure: raise] "b2 is true" | raise.rb:117:5:117:22 | [ensure: raise] call to raise | | +| raise.rb:117:11:117:22 | [ensure: exception] "b2 is true" | raise.rb:117:5:117:22 | [ensure: exception] call to raise | | | raise.rb:117:11:117:22 | [ensure: return] "b2 is true" | raise.rb:117:5:117:22 | [ensure: return] call to raise | | -| raise.rb:117:12:117:21 | [ensure: raise] b2 is true | raise.rb:117:11:117:22 | [ensure: raise] "b2 is true" | | +| raise.rb:117:12:117:21 | [ensure: exception] b2 is true | raise.rb:117:11:117:22 | [ensure: exception] "b2 is true" | | | raise.rb:117:12:117:21 | [ensure: return] b2 is true | raise.rb:117:11:117:22 | [ensure: return] "b2 is true" | | | raise.rb:117:12:117:21 | b2 is true | raise.rb:117:11:117:22 | "b2 is true" | | | raise.rb:121:1:126:3 | enter m10 | raise.rb:121:9:121:9 | p | | @@ -2254,7 +2254,7 @@ | raise.rb:121:1:126:3 | m10 | raise.rb:128:1:140:3 | m11 | | | raise.rb:121:9:121:9 | p | raise.rb:121:14:121:30 | self | false, no-match, true | | raise.rb:121:9:121:9 | p | raise.rb:125:3:125:51 | self | match | -| raise.rb:121:14:121:30 | call to raise | raise.rb:121:1:126:3 | exit m10 (abnormal) | raise | +| raise.rb:121:14:121:30 | call to raise | raise.rb:121:1:126:3 | exit m10 (abnormal) | exception | | raise.rb:121:14:121:30 | self | raise.rb:121:21:121:29 | Exception | | | raise.rb:121:20:121:30 | "Exception" | raise.rb:121:14:121:30 | call to raise | | | raise.rb:121:21:121:29 | Exception | raise.rb:121:20:121:30 | "Exception" | | @@ -2271,7 +2271,7 @@ | raise.rb:130:5:132:7 | if ... | raise.rb:137:5:137:17 | self | | | raise.rb:130:8:130:8 | b | raise.rb:130:5:132:7 | if ... | false | | raise.rb:130:8:130:8 | b | raise.rb:131:7:131:22 | self | true | -| raise.rb:131:7:131:22 | call to raise | raise.rb:133:10:133:19 | ExceptionA | raise | +| raise.rb:131:7:131:22 | call to raise | raise.rb:133:10:133:19 | ExceptionA | exception | | raise.rb:131:7:131:22 | self | raise.rb:131:13:131:22 | ExceptionA | | | raise.rb:131:13:131:22 | ExceptionA | raise.rb:131:7:131:22 | call to raise | | | raise.rb:133:3:133:19 | rescue ... | raise.rb:137:5:137:17 | self | | @@ -2279,22 +2279,22 @@ | raise.rb:133:10:133:19 | ExceptionA | raise.rb:134:10:134:19 | ExceptionB | no-match | | raise.rb:134:3:135:21 | rescue ... | raise.rb:137:5:137:17 | self | | | raise.rb:134:10:134:19 | ExceptionB | raise.rb:135:5:135:21 | self | match | -| raise.rb:134:10:134:19 | ExceptionB | raise.rb:137:5:137:17 | [ensure: raise] self | raise | +| raise.rb:134:10:134:19 | ExceptionB | raise.rb:137:5:137:17 | [ensure: exception] self | exception | | raise.rb:134:20:135:21 | then ... | raise.rb:134:3:135:21 | rescue ... | | | raise.rb:135:5:135:21 | call to puts | raise.rb:134:20:135:21 | then ... | | | raise.rb:135:5:135:21 | self | raise.rb:135:11:135:20 | ExceptionB | | | raise.rb:135:10:135:21 | "ExceptionB" | raise.rb:135:5:135:21 | call to puts | | | raise.rb:135:11:135:20 | ExceptionB | raise.rb:135:10:135:21 | "ExceptionB" | | -| raise.rb:136:3:137:17 | [ensure: raise] ensure ... | raise.rb:128:1:140:3 | exit m11 (abnormal) | raise | +| raise.rb:136:3:137:17 | [ensure: exception] ensure ... | raise.rb:128:1:140:3 | exit m11 (abnormal) | exception | | raise.rb:136:3:137:17 | ensure ... | raise.rb:139:3:139:16 | self | | -| raise.rb:137:5:137:17 | [ensure: raise] call to puts | raise.rb:136:3:137:17 | [ensure: raise] ensure ... | | -| raise.rb:137:5:137:17 | [ensure: raise] self | raise.rb:137:11:137:16 | [ensure: raise] Ensure | | +| raise.rb:137:5:137:17 | [ensure: exception] call to puts | raise.rb:136:3:137:17 | [ensure: exception] ensure ... | | +| raise.rb:137:5:137:17 | [ensure: exception] self | raise.rb:137:11:137:16 | [ensure: exception] Ensure | | | raise.rb:137:5:137:17 | call to puts | raise.rb:136:3:137:17 | ensure ... | | | raise.rb:137:5:137:17 | self | raise.rb:137:11:137:16 | Ensure | | | raise.rb:137:10:137:17 | "Ensure" | raise.rb:137:5:137:17 | call to puts | | -| raise.rb:137:10:137:17 | [ensure: raise] "Ensure" | raise.rb:137:5:137:17 | [ensure: raise] call to puts | | +| raise.rb:137:10:137:17 | [ensure: exception] "Ensure" | raise.rb:137:5:137:17 | [ensure: exception] call to puts | | | raise.rb:137:11:137:16 | Ensure | raise.rb:137:10:137:17 | "Ensure" | | -| raise.rb:137:11:137:16 | [ensure: raise] Ensure | raise.rb:137:10:137:17 | [ensure: raise] "Ensure" | | +| raise.rb:137:11:137:16 | [ensure: exception] Ensure | raise.rb:137:10:137:17 | [ensure: exception] "Ensure" | | | raise.rb:139:3:139:16 | call to puts | raise.rb:128:1:140:3 | exit m11 (normal) | | | raise.rb:139:3:139:16 | self | raise.rb:139:9:139:15 | End m11 | | | raise.rb:139:8:139:16 | "End m11" | raise.rb:139:3:139:16 | call to puts | | @@ -2306,13 +2306,13 @@ | raise.rb:143:3:145:5 | if ... | raise.rb:147:10:147:10 | 3 | | | raise.rb:143:6:143:6 | b | raise.rb:143:3:145:5 | if ... | false | | raise.rb:143:6:143:6 | b | raise.rb:144:5:144:12 | self | true | -| raise.rb:144:5:144:12 | call to raise | raise.rb:147:10:147:10 | [ensure: raise] 3 | raise | +| raise.rb:144:5:144:12 | call to raise | raise.rb:147:10:147:10 | [ensure: exception] 3 | exception | | raise.rb:144:5:144:12 | self | raise.rb:144:11:144:12 | "" | | | raise.rb:144:11:144:12 | "" | raise.rb:144:5:144:12 | call to raise | | -| raise.rb:147:3:147:10 | [ensure: raise] return | raise.rb:142:1:148:3 | exit m12 (normal) | return | +| raise.rb:147:3:147:10 | [ensure: exception] return | raise.rb:142:1:148:3 | exit m12 (normal) | return | | raise.rb:147:3:147:10 | return | raise.rb:142:1:148:3 | exit m12 (normal) | return | | raise.rb:147:10:147:10 | 3 | raise.rb:147:3:147:10 | return | | -| raise.rb:147:10:147:10 | [ensure: raise] 3 | raise.rb:147:3:147:10 | [ensure: raise] return | | +| raise.rb:147:10:147:10 | [ensure: exception] 3 | raise.rb:147:3:147:10 | [ensure: exception] return | | | raise.rb:150:1:152:3 | enter m13 | raise.rb:151:1:151:6 | ensure ... | | | raise.rb:150:1:152:3 | exit m13 (normal) | raise.rb:150:1:152:3 | exit m13 | | | raise.rb:150:1:152:3 | m13 | raise.rb:154:1:156:3 | m14 | | @@ -2328,7 +2328,7 @@ | raise.rb:155:16:155:50 | exit { ... } (normal) | raise.rb:155:16:155:50 | exit { ... } | | | raise.rb:155:16:155:50 | { ... } | raise.rb:155:3:155:50 | call to each | | | raise.rb:155:19:155:22 | elem | raise.rb:155:37:155:43 | element | | -| raise.rb:155:25:155:32 | call to raise | raise.rb:155:16:155:50 | exit { ... } (abnormal) | raise | +| raise.rb:155:25:155:32 | call to raise | raise.rb:155:16:155:50 | exit { ... } (abnormal) | exception | | raise.rb:155:25:155:32 | self | raise.rb:155:31:155:32 | "" | | | raise.rb:155:25:155:48 | ... if ... | raise.rb:155:16:155:50 | exit { ... } (normal) | | | raise.rb:155:31:155:32 | "" | raise.rb:155:25:155:32 | call to raise | | @@ -2350,7 +2350,7 @@ | raise.rb:160:9:162:7 | exit -> { ... } (abnormal) | raise.rb:160:9:162:7 | exit -> { ... } | | | raise.rb:160:9:162:7 | exit -> { ... } (normal) | raise.rb:160:9:162:7 | exit -> { ... } | | | raise.rb:160:12:160:12 | x | raise.rb:161:23:161:23 | x | | -| raise.rb:161:7:161:14 | call to raise | raise.rb:160:9:162:7 | exit -> { ... } (abnormal) | raise | +| raise.rb:161:7:161:14 | call to raise | raise.rb:160:9:162:7 | exit -> { ... } (abnormal) | exception | | raise.rb:161:7:161:14 | self | raise.rb:161:13:161:14 | "" | | | raise.rb:161:7:161:23 | ... unless ... | raise.rb:160:9:162:7 | exit -> { ... } (normal) | | | raise.rb:161:13:161:14 | "" | raise.rb:161:7:161:14 | call to raise | | @@ -2361,7 +2361,7 @@ | raise.rb:167:3:169:5 | exit m (abnormal) | raise.rb:167:3:169:5 | exit m | | | raise.rb:167:3:169:5 | m | raise.rb:172:1:182:3 | m16 | | | raise.rb:167:7:167:10 | self | raise.rb:167:3:169:5 | m | | -| raise.rb:168:5:168:12 | call to raise | raise.rb:167:3:169:5 | exit m (abnormal) | raise | +| raise.rb:168:5:168:12 | call to raise | raise.rb:167:3:169:5 | exit m (abnormal) | exception | | raise.rb:168:5:168:12 | self | raise.rb:168:11:168:12 | "" | | | raise.rb:168:11:168:12 | "" | raise.rb:168:5:168:12 | call to raise | | | raise.rb:172:1:182:3 | enter m16 | raise.rb:172:9:172:10 | b1 | | @@ -2373,19 +2373,19 @@ | raise.rb:174:8:174:9 | b1 | raise.rb:174:8:174:23 | [true] ... \|\| ... | true | | raise.rb:174:8:174:9 | b1 | raise.rb:174:14:174:15 | b2 | false | | raise.rb:174:8:174:23 | [false] ... \|\| ... | raise.rb:177:14:177:14 | 2 | false | -| raise.rb:174:8:174:23 | [false] ... \|\| ... | raise.rb:179:10:179:19 | ExceptionA | raise | +| raise.rb:174:8:174:23 | [false] ... \|\| ... | raise.rb:179:10:179:19 | ExceptionA | exception | | raise.rb:174:8:174:23 | [true] ... \|\| ... | raise.rb:175:14:175:14 | 1 | true | -| raise.rb:174:8:174:23 | [true] ... \|\| ... | raise.rb:179:10:179:19 | ExceptionA | raise | +| raise.rb:174:8:174:23 | [true] ... \|\| ... | raise.rb:179:10:179:19 | ExceptionA | exception | | raise.rb:174:14:174:15 | b2 | raise.rb:174:20:174:23 | true | | | raise.rb:174:14:174:23 | ... == ... | raise.rb:174:8:174:23 | [false] ... \|\| ... | false | | raise.rb:174:14:174:23 | ... == ... | raise.rb:174:8:174:23 | [true] ... \|\| ... | true | -| raise.rb:174:14:174:23 | ... == ... | raise.rb:179:10:179:19 | ExceptionA | raise | +| raise.rb:174:14:174:23 | ... == ... | raise.rb:179:10:179:19 | ExceptionA | exception | | raise.rb:174:20:174:23 | true | raise.rb:174:14:174:23 | ... == ... | | | raise.rb:175:7:175:14 | return | raise.rb:172:1:182:3 | exit m16 (normal) | return | | raise.rb:175:14:175:14 | 1 | raise.rb:175:7:175:14 | return | | | raise.rb:177:7:177:14 | return | raise.rb:172:1:182:3 | exit m16 (normal) | return | | raise.rb:177:14:177:14 | 2 | raise.rb:177:7:177:14 | return | | -| raise.rb:179:10:179:19 | ExceptionA | raise.rb:172:1:182:3 | exit m16 (abnormal) | raise | +| raise.rb:179:10:179:19 | ExceptionA | raise.rb:172:1:182:3 | exit m16 (abnormal) | exception | | raise.rb:179:10:179:19 | ExceptionA | raise.rb:180:12:180:12 | 3 | match | | raise.rb:180:5:180:12 | return | raise.rb:172:1:182:3 | exit m16 (normal) | return | | raise.rb:180:12:180:12 | 3 | raise.rb:180:5:180:12 | return | | diff --git a/ruby/ql/test/library-tests/controlflow/graph/Nodes.expected b/ruby/ql/test/library-tests/controlflow/graph/Nodes.expected index 2bc683f894e4..54cf1d085433 100644 --- a/ruby/ql/test/library-tests/controlflow/graph/Nodes.expected +++ b/ruby/ql/test/library-tests/controlflow/graph/Nodes.expected @@ -1,10 +1,10 @@ callsWithNoArguments -| break_ensure.rb:8:6:8:13 | [ensure: raise] call to elements | +| break_ensure.rb:8:6:8:13 | [ensure: exception] call to elements | | break_ensure.rb:8:6:8:13 | call to elements | -| break_ensure.rb:8:6:8:18 | [ensure: raise] call to nil? | +| break_ensure.rb:8:6:8:18 | [ensure: exception] call to nil? | | break_ensure.rb:8:6:8:18 | call to nil? | | break_ensure.rb:20:10:20:15 | [ensure: break] call to nil? | -| break_ensure.rb:20:10:20:15 | [ensure: raise] call to nil? | +| break_ensure.rb:20:10:20:15 | [ensure: exception] call to nil? | | break_ensure.rb:20:10:20:15 | call to nil? | | break_ensure.rb:29:8:29:13 | call to nil? | | case.rb:2:8:2:9 | call to x1 | @@ -72,25 +72,25 @@ callsWithNoArguments positionalArguments | break_ensure.rb:2:9:2:13 | ... < ... | break_ensure.rb:2:13:2:13 | 0 | | break_ensure.rb:3:8:3:12 | ... > ... | break_ensure.rb:3:12:3:12 | 0 | -| break_ensure.rb:9:5:9:23 | [ensure: raise] call to puts | break_ensure.rb:9:10:9:23 | [ensure: raise] "elements nil" | +| break_ensure.rb:9:5:9:23 | [ensure: exception] call to puts | break_ensure.rb:9:10:9:23 | [ensure: exception] "elements nil" | | break_ensure.rb:9:5:9:23 | call to puts | break_ensure.rb:9:10:9:23 | "elements nil" | | break_ensure.rb:14:9:14:13 | ... < ... | break_ensure.rb:14:13:14:13 | 0 | | break_ensure.rb:16:10:16:14 | ... > ... | break_ensure.rb:16:14:16:14 | 0 | | break_ensure.rb:21:9:21:20 | [ensure: break] call to puts | break_ensure.rb:21:14:21:20 | [ensure: break] "y nil" | -| break_ensure.rb:21:9:21:20 | [ensure: raise] call to puts | break_ensure.rb:21:14:21:20 | [ensure: raise] "y nil" | +| break_ensure.rb:21:9:21:20 | [ensure: exception] call to puts | break_ensure.rb:21:14:21:20 | [ensure: exception] "y nil" | | break_ensure.rb:21:9:21:20 | call to puts | break_ensure.rb:21:14:21:20 | "y nil" | | break_ensure.rb:33:11:33:15 | ... < ... | break_ensure.rb:33:15:33:15 | 0 | -| break_ensure.rb:33:11:33:15 | [ensure: raise] ... < ... | break_ensure.rb:33:15:33:15 | [ensure: raise] 0 | +| break_ensure.rb:33:11:33:15 | [ensure: exception] ... < ... | break_ensure.rb:33:15:33:15 | [ensure: exception] 0 | | break_ensure.rb:33:11:33:15 | [ensure: return] ... < ... | break_ensure.rb:33:15:33:15 | [ensure: return] 0 | | break_ensure.rb:35:12:35:16 | ... > ... | break_ensure.rb:35:16:35:16 | 0 | -| break_ensure.rb:35:12:35:16 | [ensure: raise] ... > ... | break_ensure.rb:35:16:35:16 | [ensure: raise] 0 | +| break_ensure.rb:35:12:35:16 | [ensure: exception] ... > ... | break_ensure.rb:35:16:35:16 | [ensure: exception] 0 | | break_ensure.rb:35:12:35:16 | [ensure: return] ... > ... | break_ensure.rb:35:16:35:16 | [ensure: return] 0 | | break_ensure.rb:41:3:41:13 | call to puts | break_ensure.rb:41:8:41:13 | "Done" | | break_ensure.rb:45:9:45:13 | ... < ... | break_ensure.rb:45:13:45:13 | 0 | | break_ensure.rb:47:10:47:14 | ... > ... | break_ensure.rb:47:14:47:14 | 1 | | break_ensure.rb:48:9:48:16 | call to raise | break_ensure.rb:48:15:48:16 | "" | | break_ensure.rb:51:10:51:14 | ... > ... | break_ensure.rb:51:14:51:14 | 0 | -| break_ensure.rb:51:10:51:14 | [ensure: raise] ... > ... | break_ensure.rb:51:14:51:14 | [ensure: raise] 0 | +| break_ensure.rb:51:10:51:14 | [ensure: exception] ... > ... | break_ensure.rb:51:14:51:14 | [ensure: exception] 0 | | case.rb:3:29:3:37 | call to puts | case.rb:3:34:3:37 | "x2" | | case.rb:4:17:4:24 | call to puts | case.rb:4:22:4:24 | "2" | | case.rb:14:13:14:18 | ... == ... | case.rb:14:18:14:18 | 5 | @@ -319,7 +319,7 @@ positionalArguments | raise.rb:70:5:70:17 | call to raise | raise.rb:70:11:70:17 | "x > 2" | | raise.rb:71:9:71:13 | ... < ... | raise.rb:71:13:71:13 | 0 | | raise.rb:74:3:74:20 | call to puts | raise.rb:74:8:74:20 | "0 <= x <= 2" | -| raise.rb:76:3:76:15 | [ensure: raise] call to puts | raise.rb:76:8:76:15 | [ensure: raise] "ensure" | +| raise.rb:76:3:76:15 | [ensure: exception] call to puts | raise.rb:76:8:76:15 | [ensure: exception] "ensure" | | raise.rb:76:3:76:15 | [ensure: return] call to puts | raise.rb:76:8:76:15 | [ensure: return] "ensure" | | raise.rb:76:3:76:15 | call to puts | raise.rb:76:8:76:15 | "ensure" | | raise.rb:80:3:80:17 | call to puts | raise.rb:80:8:80:17 | "Begin m8" | @@ -327,7 +327,7 @@ positionalArguments | raise.rb:83:7:83:19 | call to raise | raise.rb:83:13:83:19 | "x > 2" | | raise.rb:84:11:84:15 | ... < ... | raise.rb:84:15:84:15 | 0 | | raise.rb:87:5:87:22 | call to puts | raise.rb:87:10:87:22 | "0 <= x <= 2" | -| raise.rb:89:5:89:17 | [ensure: raise] call to puts | raise.rb:89:10:89:17 | [ensure: raise] "ensure" | +| raise.rb:89:5:89:17 | [ensure: exception] call to puts | raise.rb:89:10:89:17 | [ensure: exception] "ensure" | | raise.rb:89:5:89:17 | [ensure: return] call to puts | raise.rb:89:10:89:17 | [ensure: return] "ensure" | | raise.rb:89:5:89:17 | call to puts | raise.rb:89:10:89:17 | "ensure" | | raise.rb:91:3:91:15 | call to puts | raise.rb:91:8:91:15 | "End m8" | @@ -336,30 +336,30 @@ positionalArguments | raise.rb:98:7:98:19 | call to raise | raise.rb:98:13:98:19 | "x > 2" | | raise.rb:99:11:99:15 | ... < ... | raise.rb:99:15:99:15 | 0 | | raise.rb:102:5:102:22 | call to puts | raise.rb:102:10:102:22 | "0 <= x <= 2" | -| raise.rb:104:5:104:23 | [ensure: raise] call to puts | raise.rb:104:10:104:23 | [ensure: raise] "outer ensure" | +| raise.rb:104:5:104:23 | [ensure: exception] call to puts | raise.rb:104:10:104:23 | [ensure: exception] "outer ensure" | | raise.rb:104:5:104:23 | [ensure: return] call to puts | raise.rb:104:10:104:23 | [ensure: return] "outer ensure" | | raise.rb:104:5:104:23 | call to puts | raise.rb:104:10:104:23 | "outer ensure" | -| raise.rb:107:9:107:26 | [ensure: raise] call to raise | raise.rb:107:15:107:26 | [ensure: raise] "b1 is true" | +| raise.rb:107:9:107:26 | [ensure: exception] call to raise | raise.rb:107:15:107:26 | [ensure: exception] "b1 is true" | | raise.rb:107:9:107:26 | [ensure: return] call to raise | raise.rb:107:15:107:26 | [ensure: return] "b1 is true" | | raise.rb:107:9:107:26 | call to raise | raise.rb:107:15:107:26 | "b1 is true" | -| raise.rb:110:7:110:25 | [ensure(1): raise] call to puts | raise.rb:110:12:110:25 | [ensure(1): raise] "inner ensure" | -| raise.rb:110:7:110:25 | [ensure: raise, ensure(1): raise] call to puts | raise.rb:110:12:110:25 | [ensure: raise, ensure(1): raise] "inner ensure" | -| raise.rb:110:7:110:25 | [ensure: raise] call to puts | raise.rb:110:12:110:25 | [ensure: raise] "inner ensure" | -| raise.rb:110:7:110:25 | [ensure: return, ensure(1): raise] call to puts | raise.rb:110:12:110:25 | [ensure: return, ensure(1): raise] "inner ensure" | +| raise.rb:110:7:110:25 | [ensure(1): exception] call to puts | raise.rb:110:12:110:25 | [ensure(1): exception] "inner ensure" | +| raise.rb:110:7:110:25 | [ensure: exception, ensure(1): exception] call to puts | raise.rb:110:12:110:25 | [ensure: exception, ensure(1): exception] "inner ensure" | +| raise.rb:110:7:110:25 | [ensure: exception] call to puts | raise.rb:110:12:110:25 | [ensure: exception] "inner ensure" | +| raise.rb:110:7:110:25 | [ensure: return, ensure(1): exception] call to puts | raise.rb:110:12:110:25 | [ensure: return, ensure(1): exception] "inner ensure" | | raise.rb:110:7:110:25 | [ensure: return] call to puts | raise.rb:110:12:110:25 | [ensure: return] "inner ensure" | | raise.rb:110:7:110:25 | call to puts | raise.rb:110:12:110:25 | "inner ensure" | | raise.rb:113:3:113:15 | call to puts | raise.rb:113:8:113:15 | "End m9" | -| raise.rb:115:3:115:22 | [ensure: raise] call to puts | raise.rb:115:8:115:22 | [ensure: raise] "method ensure" | +| raise.rb:115:3:115:22 | [ensure: exception] call to puts | raise.rb:115:8:115:22 | [ensure: exception] "method ensure" | | raise.rb:115:3:115:22 | [ensure: return] call to puts | raise.rb:115:8:115:22 | [ensure: return] "method ensure" | | raise.rb:115:3:115:22 | call to puts | raise.rb:115:8:115:22 | "method ensure" | -| raise.rb:117:5:117:22 | [ensure: raise] call to raise | raise.rb:117:11:117:22 | [ensure: raise] "b2 is true" | +| raise.rb:117:5:117:22 | [ensure: exception] call to raise | raise.rb:117:11:117:22 | [ensure: exception] "b2 is true" | | raise.rb:117:5:117:22 | [ensure: return] call to raise | raise.rb:117:11:117:22 | [ensure: return] "b2 is true" | | raise.rb:117:5:117:22 | call to raise | raise.rb:117:11:117:22 | "b2 is true" | | raise.rb:121:14:121:30 | call to raise | raise.rb:121:20:121:30 | "Exception" | | raise.rb:125:3:125:51 | call to puts | raise.rb:125:8:125:51 | "Will not get executed if p is..." | | raise.rb:131:7:131:22 | call to raise | raise.rb:131:13:131:22 | ExceptionA | | raise.rb:135:5:135:21 | call to puts | raise.rb:135:10:135:21 | "ExceptionB" | -| raise.rb:137:5:137:17 | [ensure: raise] call to puts | raise.rb:137:10:137:17 | [ensure: raise] "Ensure" | +| raise.rb:137:5:137:17 | [ensure: exception] call to puts | raise.rb:137:10:137:17 | [ensure: exception] "Ensure" | | raise.rb:137:5:137:17 | call to puts | raise.rb:137:10:137:17 | "Ensure" | | raise.rb:139:3:139:16 | call to puts | raise.rb:139:8:139:16 | "End m11" | | raise.rb:144:5:144:12 | call to raise | raise.rb:144:11:144:12 | "" | From 1e25b4de4b392af578af356f2a2fc9df0321bd22 Mon Sep 17 00:00:00 2001 From: Anders Schack-Mulligen Date: Thu, 28 Aug 2025 10:12:48 +0200 Subject: [PATCH 029/308] Swift: Use shared SuccessorType. --- .../codeql/swift/controlflow/BasicBlocks.qll | 1 - .../swift/controlflow/ControlFlowGraph.qll | 71 +------------------ .../swift/controlflow/internal/Completion.qll | 5 +- .../internal/ControlFlowGraphImpl.qll | 12 ---- .../internal/ControlFlowGraphImplSpecific.qll | 18 ++--- .../security/PathInjectionExtensions.qll | 2 +- 6 files changed, 11 insertions(+), 98 deletions(-) diff --git a/swift/ql/lib/codeql/swift/controlflow/BasicBlocks.qll b/swift/ql/lib/codeql/swift/controlflow/BasicBlocks.qll index b6ac7144ac4e..3ff42e01d188 100644 --- a/swift/ql/lib/codeql/swift/controlflow/BasicBlocks.qll +++ b/swift/ql/lib/codeql/swift/controlflow/BasicBlocks.qll @@ -3,7 +3,6 @@ private import swift private import ControlFlowGraph private import internal.ControlFlowGraphImpl as CfgImpl -private import SuccessorTypes private import CfgImpl::BasicBlocks as BasicBlocksImpl private import codeql.controlflow.BasicBlock as BB diff --git a/swift/ql/lib/codeql/swift/controlflow/ControlFlowGraph.qll b/swift/ql/lib/codeql/swift/controlflow/ControlFlowGraph.qll index 4d1be28b0012..ef443f301841 100644 --- a/swift/ql/lib/codeql/swift/controlflow/ControlFlowGraph.qll +++ b/swift/ql/lib/codeql/swift/controlflow/ControlFlowGraph.qll @@ -2,11 +2,11 @@ private import swift private import BasicBlocks -private import SuccessorTypes private import internal.ControlFlowGraphImpl as CfgImpl private import internal.Completion private import internal.Scope private import internal.ControlFlowElements +import codeql.controlflow.SuccessorType /** An AST node with an associated control-flow graph. */ class CfgScope extends Scope instanceof CfgImpl::CfgScope::Range_ { @@ -61,72 +61,3 @@ class ControlFlowNode extends CfgImpl::Node { /** Holds if this node has more than one successor. */ final predicate isBranch() { strictcount(this.getASuccessor()) > 1 } } - -/** The type of a control flow successor. */ -class SuccessorType extends CfgImpl::TSuccessorType { - /** Gets a textual representation of successor type. */ - string toString() { none() } -} - -/** Provides different types of control flow successor types. */ -module SuccessorTypes { - /** A normal control flow successor. */ - class NormalSuccessor extends SuccessorType, CfgImpl::TSuccessorSuccessor { - final override string toString() { result = "successor" } - } - - /** A conditional control flow successor. */ - abstract class ConditionalSuccessor extends SuccessorType { - boolean value; - - bindingset[value] - ConditionalSuccessor() { any() } - - /** Gets the Boolean value of this successor. */ - final boolean getValue() { result = value } - - override string toString() { result = this.getValue().toString() } - } - - /** A Boolean control flow successor. */ - class BooleanSuccessor extends ConditionalSuccessor, CfgImpl::TBooleanSuccessor { - BooleanSuccessor() { this = CfgImpl::TBooleanSuccessor(value) } - } - - class BreakSuccessor extends SuccessorType, CfgImpl::TBreakSuccessor { - final override string toString() { result = "break" } - } - - class ContinueSuccessor extends SuccessorType, CfgImpl::TContinueSuccessor { - final override string toString() { result = "continue" } - } - - class ReturnSuccessor extends SuccessorType, CfgImpl::TReturnSuccessor { - final override string toString() { result = "return" } - } - - class MatchingSuccessor extends ConditionalSuccessor, CfgImpl::TMatchingSuccessor { - MatchingSuccessor() { this = CfgImpl::TMatchingSuccessor(value) } - - /** Holds if this is a match successor. */ - predicate isMatch() { value = true } - - override string toString() { if this.isMatch() then result = "match" else result = "no-match" } - } - - class FallthroughSuccessor extends SuccessorType, CfgImpl::TFallthroughSuccessor { - final override string toString() { result = "fallthrough" } - } - - class EmptinessSuccessor extends ConditionalSuccessor, CfgImpl::TEmptinessSuccessor { - EmptinessSuccessor() { this = CfgImpl::TEmptinessSuccessor(value) } - - predicate isEmpty() { value = true } - - override string toString() { if this.isEmpty() then result = "empty" else result = "non-empty" } - } - - class ExceptionSuccessor extends SuccessorType, CfgImpl::TExceptionSuccessor { - override string toString() { result = "exception" } - } -} diff --git a/swift/ql/lib/codeql/swift/controlflow/internal/Completion.qll b/swift/ql/lib/codeql/swift/controlflow/internal/Completion.qll index 9e7975890e62..4a2acdf9e20e 100644 --- a/swift/ql/lib/codeql/swift/controlflow/internal/Completion.qll +++ b/swift/ql/lib/codeql/swift/controlflow/internal/Completion.qll @@ -8,7 +8,6 @@ private import swift private import codeql.swift.controlflow.ControlFlowGraph private import ControlFlowElements private import ControlFlowGraphImpl -private import SuccessorTypes private newtype TCompletion = TSimpleCompletion() or @@ -324,7 +323,7 @@ abstract class NormalCompletion extends Completion { /** A simple (normal) completion. */ class SimpleCompletion extends NormalCompletion, TSimpleCompletion { - override NormalSuccessor getAMatchingSuccessorType() { any() } + override DirectSuccessor getAMatchingSuccessorType() { any() } override string toString() { result = "simple" } } @@ -468,7 +467,7 @@ class FallthroughCompletion extends Completion, TFallthroughCompletion { FallthroughCompletion() { this = TFallthroughCompletion(dest) } - override FallthroughSuccessor getAMatchingSuccessorType() { any() } + override DirectSuccessor getAMatchingSuccessorType() { any() } CaseStmt getDestination() { result = dest } diff --git a/swift/ql/lib/codeql/swift/controlflow/internal/ControlFlowGraphImpl.qll b/swift/ql/lib/codeql/swift/controlflow/internal/ControlFlowGraphImpl.qll index b610ff0b0f3d..59d2acb5857f 100644 --- a/swift/ql/lib/codeql/swift/controlflow/internal/ControlFlowGraphImpl.qll +++ b/swift/ql/lib/codeql/swift/controlflow/internal/ControlFlowGraphImpl.qll @@ -1976,18 +1976,6 @@ private module Cached { result = n.(FuncDeclElement).getAst() or result = n.(KeyPathElement).getAst() } - - cached - newtype TSuccessorType = - TSuccessorSuccessor() or - TBooleanSuccessor(boolean b) { b in [false, true] } or - TBreakSuccessor() or - TContinueSuccessor() or - TReturnSuccessor() or - TMatchingSuccessor(boolean match) { match in [false, true] } or - TFallthroughSuccessor() or - TEmptinessSuccessor(boolean isEmpty) { isEmpty in [false, true] } or - TExceptionSuccessor() } import Cached diff --git a/swift/ql/lib/codeql/swift/controlflow/internal/ControlFlowGraphImplSpecific.qll b/swift/ql/lib/codeql/swift/controlflow/internal/ControlFlowGraphImplSpecific.qll index 24548290ea07..1902e0454671 100644 --- a/swift/ql/lib/codeql/swift/controlflow/internal/ControlFlowGraphImplSpecific.qll +++ b/swift/ql/lib/codeql/swift/controlflow/internal/ControlFlowGraphImplSpecific.qll @@ -57,22 +57,18 @@ module CfgInput implements InputSig { * Hold if `c` represents simple (normal) evaluation of a statement or an * expression. */ - predicate successorTypeIsSimple(SuccessorType t) { - t instanceof Cfg::SuccessorTypes::NormalSuccessor - } + predicate successorTypeIsSimple(SuccessorType t) { t instanceof Cfg::DirectSuccessor } /** Holds if `t` is an abnormal exit type out of a CFG scope. */ - predicate isAbnormalExitType(SuccessorType t) { - t instanceof Cfg::SuccessorTypes::ExceptionSuccessor - } + predicate isAbnormalExitType(SuccessorType t) { t instanceof Cfg::ExceptionSuccessor } /** Hold if `t` represents a conditional successor type. */ predicate successorTypeIsCondition(SuccessorType t) { - t instanceof Cfg::SuccessorTypes::BooleanSuccessor or - t instanceof Cfg::SuccessorTypes::BreakSuccessor or - t instanceof Cfg::SuccessorTypes::ContinueSuccessor or - t instanceof Cfg::SuccessorTypes::MatchingSuccessor or - t instanceof Cfg::SuccessorTypes::EmptinessSuccessor + t instanceof Cfg::BooleanSuccessor or + t instanceof Cfg::BreakSuccessor or + t instanceof Cfg::ContinueSuccessor or + t instanceof Cfg::MatchingSuccessor or + t instanceof Cfg::EmptinessSuccessor } /** Holds if `first` is first executed when entering `scope`. */ diff --git a/swift/ql/lib/codeql/swift/security/PathInjectionExtensions.qll b/swift/ql/lib/codeql/swift/security/PathInjectionExtensions.qll index 72608f50fe66..1ad4e7734561 100644 --- a/swift/ql/lib/codeql/swift/security/PathInjectionExtensions.qll +++ b/swift/ql/lib/codeql/swift/security/PathInjectionExtensions.qll @@ -108,7 +108,7 @@ private class DefaultPathInjectionBarrier extends PathInjectionBarrier { TaintTracking::localTaint(validated, DataFlow::exprNode(normalize.getQualifier())) and DataFlow::localExprFlow(normalize, starts.getQualifier()) and DataFlow::localFlow(validated, this) and - exists(ConditionBlock bb, SuccessorTypes::BooleanSuccessor b | + exists(ConditionBlock bb, BooleanSuccessor b | bb.getANode().getNode().asAstNode().(IfStmt).getACondition() = getImmediateParent*(starts) and b.getValue() = true | From 92fcda3cc70ea1b964476892ec11fba30427aa7c Mon Sep 17 00:00:00 2001 From: Anders Schack-Mulligen Date: Thu, 28 Aug 2025 10:18:46 +0200 Subject: [PATCH 030/308] Actions: Use shared SuccessorType. --- .../actions/controlflow/internal/Cfg.qll | 34 +++---------------- 1 file changed, 4 insertions(+), 30 deletions(-) diff --git a/actions/ql/lib/codeql/actions/controlflow/internal/Cfg.qll b/actions/ql/lib/codeql/actions/controlflow/internal/Cfg.qll index 06295e3d88d4..76187d860b42 100644 --- a/actions/ql/lib/codeql/actions/controlflow/internal/Cfg.qll +++ b/actions/ql/lib/codeql/actions/controlflow/internal/Cfg.qll @@ -3,6 +3,8 @@ private import codeql.controlflow.Cfg as CfgShared private import codeql.Locations module Completion { + import codeql.controlflow.SuccessorType + private newtype TCompletion = TSimpleCompletion() or TBooleanCompletion(boolean b) { b in [false, true] } or @@ -25,7 +27,7 @@ module Completion { override predicate isValidFor(AstNode e) { not any(Completion c).isValidForSpecific(e) } - override NormalSuccessor getAMatchingSuccessorType() { any() } + override DirectSuccessor getAMatchingSuccessorType() { any() } } class BooleanCompletion extends NormalCompletion, TBooleanCompletion { @@ -49,34 +51,6 @@ module Completion { override ReturnSuccessor getAMatchingSuccessorType() { any() } } - - cached - private newtype TSuccessorType = - TNormalSuccessor() or - TBooleanSuccessor(boolean b) { b in [false, true] } or - TReturnSuccessor() - - class SuccessorType extends TSuccessorType { - string toString() { none() } - } - - class NormalSuccessor extends SuccessorType, TNormalSuccessor { - override string toString() { result = "successor" } - } - - class BooleanSuccessor extends SuccessorType, TBooleanSuccessor { - boolean value; - - BooleanSuccessor() { this = TBooleanSuccessor(value) } - - override string toString() { result = value.toString() } - - boolean getValue() { result = value } - } - - class ReturnSuccessor extends SuccessorType, TReturnSuccessor { - override string toString() { result = "return" } - } } module CfgScope { @@ -127,7 +101,7 @@ private module Implementation implements CfgShared::InputSig { last(scope.(CompositeAction), e, c) } - predicate successorTypeIsSimple(SuccessorType t) { t instanceof NormalSuccessor } + predicate successorTypeIsSimple(SuccessorType t) { t instanceof DirectSuccessor } predicate successorTypeIsCondition(SuccessorType t) { t instanceof BooleanSuccessor } From ca393a9afe30581ca7080947246b3c65e641487f Mon Sep 17 00:00:00 2001 From: Asger F Date: Mon, 1 Sep 2025 09:53:18 +0200 Subject: [PATCH 031/308] JS: Do not override AST methods in React model --- .../semmle/javascript/frameworks/React.qll | 34 +++++++++++++------ 1 file changed, 23 insertions(+), 11 deletions(-) diff --git a/javascript/ql/lib/semmle/javascript/frameworks/React.qll b/javascript/ql/lib/semmle/javascript/frameworks/React.qll index 3a361e705940..41b1988b5bb2 100644 --- a/javascript/ql/lib/semmle/javascript/frameworks/React.qll +++ b/javascript/ql/lib/semmle/javascript/frameworks/React.qll @@ -311,14 +311,15 @@ class FunctionalComponent extends ReactComponent, Function { /** * A React/Preact component implemented as a class. */ -abstract private class SharedReactPreactClassComponent extends ReactComponent, ClassDefinition { +abstract private class SharedReactPreactClassComponent extends ReactComponent instanceof ClassDefinition +{ override Function getInstanceMethod(string name) { result = ClassDefinition.super.getInstanceMethod(name) } override Function getStaticMethod(string name) { exists(MethodDeclaration decl | - decl = this.getMethod(name) and + decl = ClassDefinition.super.getMethod(name) and decl.isStatic() and result = decl.getBody() ) @@ -327,7 +328,8 @@ abstract private class SharedReactPreactClassComponent extends ReactComponent, C override DataFlow::SourceNode getADirectPropsAccess() { result = this.getAnInstanceReference().getAPropertyRead("props") or - result = DataFlow::parameterNode(this.getConstructor().getBody().getParameter(0)) + result = + DataFlow::parameterNode(ClassDefinition.super.getConstructor().getBody().getParameter(0)) } override AbstractValue getAbstractComponent() { result = AbstractInstance::of(this) } @@ -340,7 +342,7 @@ abstract private class SharedReactPreactClassComponent extends ReactComponent, C override DataFlow::SourceNode getACandidateStateSource() { result = ReactComponent.super.getACandidateStateSource() or - result.flowsToExpr(this.getField("state").getInit()) + result.flowsToExpr(ClassDefinition.super.getField("state").getInit()) } override DataFlow::SourceNode getADefaultPropsSource() { @@ -349,6 +351,17 @@ abstract private class SharedReactPreactClassComponent extends ReactComponent, C DataFlow::valueNode(this).(DataFlow::SourceNode).hasPropertyWrite("defaultProps", props) ) } + + /** Gets the expression denoting the super class of the defined class, if any. */ + Expr getSuperClass() { result = ClassDefinition.super.getSuperClass() } + + /** + * Gets the constructor of this class. + * + * Note that every class has a constructor: if no explicit constructor + * is declared, it has a synthetic default constructor. + */ + ConstructorDeclaration getConstructor() { result = ClassDefinition.super.getAMethod() } } /** @@ -362,7 +375,7 @@ abstract class ES2015Component extends SharedReactPreactClassComponent { } */ private class DefiniteES2015Component extends ES2015Component { DefiniteES2015Component() { - exists(DataFlow::SourceNode sup | sup.flowsToExpr(this.getSuperClass()) | + exists(DataFlow::SourceNode sup | sup.flowsToExpr(this.(ClassDefinition).getSuperClass()) | exists(PropAccess access, string globalReactName | (globalReactName = "react" or globalReactName = "React") and access = sup.asExpr() @@ -400,7 +413,7 @@ abstract class PreactComponent extends SharedReactPreactClassComponent { */ private class DefinitePreactComponent extends PreactComponent { DefinitePreactComponent() { - exists(DataFlow::SourceNode sup | sup.flowsToExpr(this.getSuperClass()) | + exists(DataFlow::SourceNode sup | sup.flowsToExpr(this.(ClassDefinition).getSuperClass()) | exists(PropAccess access, string globalPreactName | (globalPreactName = "preact" or globalPreactName = "Preact") and access = sup.asExpr() @@ -419,12 +432,11 @@ private class DefinitePreactComponent extends PreactComponent { * - extends class called `Component` * - has a `render` method that returns JSX or React elements. */ -private class HeuristicReactPreactComponent extends ClassDefinition, PreactComponent, - ES2015Component -{ +private class HeuristicReactPreactComponent extends PreactComponent, ES2015Component { HeuristicReactPreactComponent() { - any(DataFlow::GlobalVarRefNode c | c.getName() = "Component").flowsToExpr(this.getSuperClass()) and - alwaysReturnsJsxOrReactElements(ClassDefinition.super.getInstanceMethod("render")) + any(DataFlow::GlobalVarRefNode c | c.getName() = "Component") + .flowsToExpr(this.(ClassDefinition).getSuperClass()) and + alwaysReturnsJsxOrReactElements(this.(ClassDefinition).getInstanceMethod("render")) } } From 4685b4f8a9eb4caed4eafa81c5f7b8e15c822b97 Mon Sep 17 00:00:00 2001 From: Anders Schack-Mulligen Date: Thu, 28 Aug 2025 10:37:43 +0200 Subject: [PATCH 032/308] Java: Use shared SuccessorType. --- .../code/java/controlflow/BasicBlocks.qll | 4 +- .../semmle/code/java/controlflow/Guards.qll | 2 +- .../code/java/controlflow/SuccessorType.qll | 74 ------------------- 3 files changed, 3 insertions(+), 77 deletions(-) delete mode 100644 java/ql/lib/semmle/code/java/controlflow/SuccessorType.qll diff --git a/java/ql/lib/semmle/code/java/controlflow/BasicBlocks.qll b/java/ql/lib/semmle/code/java/controlflow/BasicBlocks.qll index 1657a81816f8..1ead72a2087b 100644 --- a/java/ql/lib/semmle/code/java/controlflow/BasicBlocks.qll +++ b/java/ql/lib/semmle/code/java/controlflow/BasicBlocks.qll @@ -9,7 +9,7 @@ import Dominance private import codeql.controlflow.BasicBlock as BB private module Input implements BB::InputSig { - import SuccessorType + import codeql.controlflow.SuccessorType /** Hold if `t` represents a conditional successor type. */ predicate successorTypeIsCondition(SuccessorType t) { none() } @@ -34,7 +34,7 @@ private module Input implements BB::InputSig { result = getASpecificSuccessor(node, t) or node.getASuccessor() = result and - t instanceof NormalSuccessor and + t instanceof DirectSuccessor and not result = getASpecificSuccessor(node, _) } diff --git a/java/ql/lib/semmle/code/java/controlflow/Guards.qll b/java/ql/lib/semmle/code/java/controlflow/Guards.qll index 041050e23966..d009b625d9c0 100644 --- a/java/ql/lib/semmle/code/java/controlflow/Guards.qll +++ b/java/ql/lib/semmle/code/java/controlflow/Guards.qll @@ -140,7 +140,7 @@ private predicate isNonFallThroughPredecessor(SwitchCase sc, ControlFlowNode pre } private module SuccessorTypes implements SharedGuards::SuccessorTypesSig { - import SuccessorType + import codeql.controlflow.SuccessorType } private module GuardsInput implements SharedGuards::InputSig { diff --git a/java/ql/lib/semmle/code/java/controlflow/SuccessorType.qll b/java/ql/lib/semmle/code/java/controlflow/SuccessorType.qll deleted file mode 100644 index feabc47552f3..000000000000 --- a/java/ql/lib/semmle/code/java/controlflow/SuccessorType.qll +++ /dev/null @@ -1,74 +0,0 @@ -/** - * Provides different types of control flow successor types. - */ -overlay[local?] -module; - -import java -private import codeql.util.Boolean - -private newtype TSuccessorType = - TNormalSuccessor() or - TBooleanSuccessor(Boolean branch) or - TExceptionSuccessor() - -/** The type of a control flow successor. */ -class SuccessorType extends TSuccessorType { - /** Gets a textual representation of successor type. */ - string toString() { result = "SuccessorType" } -} - -/** A normal control flow successor. */ -class NormalSuccessor extends SuccessorType, TNormalSuccessor { } - -/** - * An exceptional control flow successor. - * - * This marks control flow edges that are taken when an exception is thrown. - */ -class ExceptionSuccessor extends SuccessorType, TExceptionSuccessor { } - -/** - * A conditional control flow successor. - * - * This currently only includes boolean successors (`BooleanSuccessor`). - */ -class ConditionalSuccessor extends SuccessorType, TBooleanSuccessor { - /** Gets the Boolean value of this successor. */ - boolean getValue() { this = TBooleanSuccessor(result) } -} - -/** - * A Boolean control flow successor. - * - * For example, this program fragment: - * - * ```java - * if (x < 0) - * return 0; - * else - * return 1; - * ``` - * - * has a control flow graph containing Boolean successors: - * - * ``` - * if - * | - * x < 0 - * / \ - * / \ - * / \ - * true false - * | \ - * return 0 return 1 - * ``` - */ -class BooleanSuccessor = ConditionalSuccessor; - -/** - * A nullness control flow successor. This is currently unused for Java. - */ -class NullnessSuccessor extends ConditionalSuccessor { - NullnessSuccessor() { none() } -} From 45b8158fe53acc55a0acf09da53b1f6a5ac9c950 Mon Sep 17 00:00:00 2001 From: Asger F Date: Mon, 1 Sep 2025 13:26:45 +0200 Subject: [PATCH 033/308] JS: Remove totalorder() This was once as input to the shared data flow library, but has since been removed from the input signature. --- .../dataflow/internal/DataFlowPrivate.qll | 58 ------------------- 1 file changed, 58 deletions(-) diff --git a/javascript/ql/lib/semmle/javascript/dataflow/internal/DataFlowPrivate.qll b/javascript/ql/lib/semmle/javascript/dataflow/internal/DataFlowPrivate.qll index 2fcc2acbd167..dd3bf4770cb2 100644 --- a/javascript/ql/lib/semmle/javascript/dataflow/internal/DataFlowPrivate.qll +++ b/javascript/ql/lib/semmle/javascript/dataflow/internal/DataFlowPrivate.qll @@ -408,12 +408,6 @@ class DataFlowCallable extends TDataFlowCallable { /** Gets the corresponding `LibraryCallable` if this is a library callable. */ LibraryCallable asLibraryCallable() { this = MkLibraryCallable(result) } - - int totalorder() { - result = TotalOrdering::astNodeId(this.asSourceCallable()).bitShiftLeft(1) - or - result = TotalOrdering::libraryCallableId(this.asLibraryCallable()).bitShiftLeft(1) + 1 - } } /** A callable defined in library code, identified by a unique string. */ @@ -797,47 +791,6 @@ private newtype TDataFlowCall = FlowSummaryImpl::Private::summaryCallbackRange(c, receiver) } -private module TotalOrdering { - private predicate astNodeRefl(AstNode x, AstNode y) { x = y } - - int astNodeId(AstNode n) = equivalenceRelation(astNodeRefl/2)(n, result) - - predicate dataFlowNodeId(DataFlow::Node node, int cls, int content) { - exists(AstNode n | - node = TValueNode(n) and cls = 1 and content = astNodeId(n) - or - node = TReflectiveCallNode(n, _) and cls = 2 and content = astNodeId(n) - ) - } - - predicate callId(DataFlowCall call, int cls, int child, int extra) { - exists(DataFlow::Node node | - call = MkOrdinaryCall(node) and dataFlowNodeId(node, cls - 1000, child) and extra = 0 - or - call = MkPartialCall(node, _) and dataFlowNodeId(node, cls - 2000, child) and extra = 0 - or - call = MkBoundCall(node, extra) and dataFlowNodeId(node, cls - 3000, child) - or - call = MkAccessorCall(node) and dataFlowNodeId(node, cls - 4000, child) and extra = 0 - ) - or - exists(Function f | - call = MkImpliedLambdaCall(f) and cls = 5000 and child = astNodeId(f) and extra = 0 - ) - or - exists( - FlowSummaryImpl::Public::SummarizedCallable c, FlowSummaryImpl::Private::SummaryNode receiver - | - call = MkSummaryCall(c, receiver) and - cls = 6000 and - c = rank[child](FlowSummaryImpl::Public::SummarizedCallable cs) and - extra = 0 - ) - } - - int libraryCallableId(LibraryCallable callable) { callable = rank[result](LibraryCallable c) } -} - class DataFlowCall extends TDataFlowCall { DataFlowCallable getEnclosingCallable() { none() } // Overridden in subclass @@ -861,15 +814,6 @@ class DataFlowCall extends TDataFlowCall { } Location getLocation() { none() } // Overridden in subclass - - int totalorder() { - this = - rank[result](DataFlowCall call, int x, int y, int z | - TotalOrdering::callId(call, x, y, z) - | - call order by x, y, z - ) - } } private class OrdinaryCall extends DataFlowCall, MkOrdinaryCall { @@ -1653,8 +1597,6 @@ abstract class NodeRegion extends Unit { /** Holds if this region contains `n`. */ predicate contains(Node n) { none() } - - int totalOrder() { none() } } /** From 144e34c669c0f0238ce00d18d9abd1a18da3f9eb Mon Sep 17 00:00:00 2001 From: Anders Schack-Mulligen Date: Thu, 28 Aug 2025 11:03:45 +0200 Subject: [PATCH 034/308] Shared: Use shared SuccessorType in shared Cfg and BasicBlock libs. --- .../actions/controlflow/internal/Cfg.qll | 6 ----- .../code/cpp/ir/implementation/EdgeKind.qll | 16 ++++++++++++ .../ir/implementation/aliased_ssa/IRBlock.qll | 11 +++++--- .../cpp/ir/implementation/raw/IRBlock.qll | 11 +++++--- .../implementation/unaliased_ssa/IRBlock.qll | 11 +++++--- .../code/csharp/controlflow/BasicBlocks.qll | 2 -- .../internal/ControlFlowGraphImpl.qll | 11 +------- .../controlflow/internal/PreBasicBlocks.qll | 2 -- .../code/java/controlflow/BasicBlocks.qll | 7 ++--- .../semmle/code/java/controlflow/Guards.qll | 2 +- .../internal/BasicBlockInternal.qll | 18 ++++++++++--- python/ql/lib/semmle/python/Flow.qll | 23 +++++++++++++--- .../codeql/ruby/controlflow/BasicBlocks.qll | 4 --- .../internal/ControlFlowGraphImpl.qll | 11 +------- .../codeql/rust/controlflow/BasicBlocks.qll | 2 -- .../internal/ControlFlowGraphImpl.qll | 10 +------ .../codeql/controlflow/BasicBlock.qll | 17 ++---------- shared/controlflow/codeql/controlflow/Cfg.qll | 26 ++++--------------- .../controlflow/codeql/controlflow/Guards.qll | 12 ++++----- .../codeql/controlflow/SuccessorType.qll | 6 +++++ .../codeql/swift/controlflow/BasicBlocks.qll | 4 --- .../internal/ControlFlowGraphImplSpecific.qll | 20 +------------- 22 files changed, 101 insertions(+), 131 deletions(-) diff --git a/actions/ql/lib/codeql/actions/controlflow/internal/Cfg.qll b/actions/ql/lib/codeql/actions/controlflow/internal/Cfg.qll index 76187d860b42..38ce9e7e03db 100644 --- a/actions/ql/lib/codeql/actions/controlflow/internal/Cfg.qll +++ b/actions/ql/lib/codeql/actions/controlflow/internal/Cfg.qll @@ -101,14 +101,8 @@ private module Implementation implements CfgShared::InputSig { last(scope.(CompositeAction), e, c) } - predicate successorTypeIsSimple(SuccessorType t) { t instanceof DirectSuccessor } - - predicate successorTypeIsCondition(SuccessorType t) { t instanceof BooleanSuccessor } - SuccessorType getAMatchingSuccessorType(Completion c) { result = c.getAMatchingSuccessorType() } - predicate isAbnormalExitType(SuccessorType t) { none() } - int idOfAstNode(AstNode node) { none() } int idOfCfgScope(CfgScope scope) { none() } diff --git a/cpp/ql/lib/semmle/code/cpp/ir/implementation/EdgeKind.qll b/cpp/ql/lib/semmle/code/cpp/ir/implementation/EdgeKind.qll index 0a0703fe16f4..c7ab5edf6249 100644 --- a/cpp/ql/lib/semmle/code/cpp/ir/implementation/EdgeKind.qll +++ b/cpp/ql/lib/semmle/code/cpp/ir/implementation/EdgeKind.qll @@ -2,6 +2,7 @@ * Provides classes that specify the conditions under which control flows along a given edge. */ +private import codeql.controlflow.SuccessorType private import internal.EdgeKindInternal private newtype TEdgeKind = @@ -28,6 +29,21 @@ abstract private class EdgeKindImpl extends TEdgeKind { final class EdgeKind = EdgeKindImpl; +private SuccessorType getAMatchingSpecificSuccessorType(EdgeKind k) { + result.(BooleanSuccessor).getValue() = true and k instanceof TrueEdge + or + result.(BooleanSuccessor).getValue() = false and k instanceof FalseEdge + or + result instanceof ExceptionSuccessor and k instanceof ExceptionEdge +} + +SuccessorType getAMatchingSuccessorType(EdgeKind k) { + result = getAMatchingSpecificSuccessorType(k) + or + not exists(getAMatchingSpecificSuccessorType(k)) and + result instanceof DirectSuccessor +} + /** * A "goto" edge, representing the unconditional successor of an `Instruction` * or `IRBlock`. diff --git a/cpp/ql/lib/semmle/code/cpp/ir/implementation/aliased_ssa/IRBlock.qll b/cpp/ql/lib/semmle/code/cpp/ir/implementation/aliased_ssa/IRBlock.qll index 89efaa8e15af..7f7c5cd0a4da 100644 --- a/cpp/ql/lib/semmle/code/cpp/ir/implementation/aliased_ssa/IRBlock.qll +++ b/cpp/ql/lib/semmle/code/cpp/ir/implementation/aliased_ssa/IRBlock.qll @@ -265,9 +265,9 @@ private predicate isEntryBlock(TIRBlock block) { } module IRCfg implements BB::CfgSig { - class ControlFlowNode = Instruction; + private import codeql.controlflow.SuccessorType - class SuccessorType = EdgeKind; + class ControlFlowNode = Instruction; final private class FinalIRBlock = IRBlock; @@ -280,7 +280,12 @@ module IRCfg implements BB::CfgSig { BasicBlock getASuccessor() { result = super.getASuccessor() } - BasicBlock getASuccessor(SuccessorType t) { result = super.getSuccessor(t) } + BasicBlock getASuccessor(SuccessorType t) { + exists(EdgeKind k | + result = super.getSuccessor(k) and + t = getAMatchingSuccessorType(k) + ) + } predicate strictlyDominates(BasicBlock bb) { super.strictlyDominates(bb) } diff --git a/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/IRBlock.qll b/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/IRBlock.qll index 89efaa8e15af..7f7c5cd0a4da 100644 --- a/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/IRBlock.qll +++ b/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/IRBlock.qll @@ -265,9 +265,9 @@ private predicate isEntryBlock(TIRBlock block) { } module IRCfg implements BB::CfgSig { - class ControlFlowNode = Instruction; + private import codeql.controlflow.SuccessorType - class SuccessorType = EdgeKind; + class ControlFlowNode = Instruction; final private class FinalIRBlock = IRBlock; @@ -280,7 +280,12 @@ module IRCfg implements BB::CfgSig { BasicBlock getASuccessor() { result = super.getASuccessor() } - BasicBlock getASuccessor(SuccessorType t) { result = super.getSuccessor(t) } + BasicBlock getASuccessor(SuccessorType t) { + exists(EdgeKind k | + result = super.getSuccessor(k) and + t = getAMatchingSuccessorType(k) + ) + } predicate strictlyDominates(BasicBlock bb) { super.strictlyDominates(bb) } diff --git a/cpp/ql/lib/semmle/code/cpp/ir/implementation/unaliased_ssa/IRBlock.qll b/cpp/ql/lib/semmle/code/cpp/ir/implementation/unaliased_ssa/IRBlock.qll index 89efaa8e15af..7f7c5cd0a4da 100644 --- a/cpp/ql/lib/semmle/code/cpp/ir/implementation/unaliased_ssa/IRBlock.qll +++ b/cpp/ql/lib/semmle/code/cpp/ir/implementation/unaliased_ssa/IRBlock.qll @@ -265,9 +265,9 @@ private predicate isEntryBlock(TIRBlock block) { } module IRCfg implements BB::CfgSig { - class ControlFlowNode = Instruction; + private import codeql.controlflow.SuccessorType - class SuccessorType = EdgeKind; + class ControlFlowNode = Instruction; final private class FinalIRBlock = IRBlock; @@ -280,7 +280,12 @@ module IRCfg implements BB::CfgSig { BasicBlock getASuccessor() { result = super.getASuccessor() } - BasicBlock getASuccessor(SuccessorType t) { result = super.getSuccessor(t) } + BasicBlock getASuccessor(SuccessorType t) { + exists(EdgeKind k | + result = super.getSuccessor(k) and + t = getAMatchingSuccessorType(k) + ) + } predicate strictlyDominates(BasicBlock bb) { super.strictlyDominates(bb) } diff --git a/csharp/ql/lib/semmle/code/csharp/controlflow/BasicBlocks.qll b/csharp/ql/lib/semmle/code/csharp/controlflow/BasicBlocks.qll index cc628d9792ba..bf6a97728574 100644 --- a/csharp/ql/lib/semmle/code/csharp/controlflow/BasicBlocks.qll +++ b/csharp/ql/lib/semmle/code/csharp/controlflow/BasicBlocks.qll @@ -346,8 +346,6 @@ private class EntryBasicBlockAlias = EntryBasicBlock; module Cfg implements BB::CfgSig { class ControlFlowNode = ControlFlow::Node; - class SuccessorType = ControlFlow::SuccessorType; - class BasicBlock = BasicBlockAlias; class EntryBasicBlock = EntryBasicBlockAlias; diff --git a/csharp/ql/lib/semmle/code/csharp/controlflow/internal/ControlFlowGraphImpl.qll b/csharp/ql/lib/semmle/code/csharp/controlflow/internal/ControlFlowGraphImpl.qll index cde366f00146..5f62d6d21df1 100644 --- a/csharp/ql/lib/semmle/code/csharp/controlflow/internal/ControlFlowGraphImpl.qll +++ b/csharp/ql/lib/semmle/code/csharp/controlflow/internal/ControlFlowGraphImpl.qll @@ -79,19 +79,10 @@ private module CfgInput implements CfgShared::InputSig { Impl::scopeLast(scope, last, c) } - class SuccessorType = ST::SuccessorType; + private class SuccessorType = ST::SuccessorType; SuccessorType getAMatchingSuccessorType(Completion c) { result = c.getAMatchingSuccessorType() } - predicate successorTypeIsSimple(SuccessorType t) { t instanceof ST::DirectSuccessor } - - predicate successorTypeIsCondition(SuccessorType t) { t instanceof ST::ConditionalSuccessor } - - predicate isAbnormalExitType(SuccessorType t) { - t instanceof ST::ExceptionSuccessor or - t instanceof ST::ExitSuccessor - } - int idOfAstNode(AstNode node) { result = node.getId() } int idOfCfgScope(CfgScope node) { result = idOfAstNode(node) } diff --git a/csharp/ql/lib/semmle/code/csharp/controlflow/internal/PreBasicBlocks.qll b/csharp/ql/lib/semmle/code/csharp/controlflow/internal/PreBasicBlocks.qll index 3997207ed99a..38eca378edf2 100644 --- a/csharp/ql/lib/semmle/code/csharp/controlflow/internal/PreBasicBlocks.qll +++ b/csharp/ql/lib/semmle/code/csharp/controlflow/internal/PreBasicBlocks.qll @@ -163,8 +163,6 @@ class ConditionBlock extends PreBasicBlock { module PreCfg implements BB::CfgSig { class ControlFlowNode = ControlFlowElement; - class SuccessorType = Cfg::SuccessorType; - class BasicBlock = PreBasicBlock; class EntryBasicBlock extends BasicBlock { diff --git a/java/ql/lib/semmle/code/java/controlflow/BasicBlocks.qll b/java/ql/lib/semmle/code/java/controlflow/BasicBlocks.qll index 1ead72a2087b..b08c59d46302 100644 --- a/java/ql/lib/semmle/code/java/controlflow/BasicBlocks.qll +++ b/java/ql/lib/semmle/code/java/controlflow/BasicBlocks.qll @@ -7,10 +7,9 @@ module; import java import Dominance private import codeql.controlflow.BasicBlock as BB +private import codeql.controlflow.SuccessorType private module Input implements BB::InputSig { - import codeql.controlflow.SuccessorType - /** Hold if `t` represents a conditional successor type. */ predicate successorTypeIsCondition(SuccessorType t) { none() } @@ -96,7 +95,7 @@ class BasicBlock extends BbImpl::BasicBlock { predicate strictlyDominates(BasicBlock bb) { super.strictlyDominates(bb) } /** Gets an immediate successor of this basic block of a given type, if any. */ - BasicBlock getASuccessor(Input::SuccessorType t) { result = super.getASuccessor(t) } + BasicBlock getASuccessor(SuccessorType t) { result = super.getASuccessor(t) } BasicBlock getASuccessor() { result = super.getASuccessor() } @@ -161,8 +160,6 @@ private class BasicBlockAlias = BasicBlock; module Cfg implements BB::CfgSig { class ControlFlowNode = BbImpl::ControlFlowNode; - class SuccessorType = BbImpl::SuccessorType; - class BasicBlock = BasicBlockAlias; class EntryBasicBlock extends BasicBlock instanceof BbImpl::EntryBasicBlock { } diff --git a/java/ql/lib/semmle/code/java/controlflow/Guards.qll b/java/ql/lib/semmle/code/java/controlflow/Guards.qll index d009b625d9c0..45983a10a278 100644 --- a/java/ql/lib/semmle/code/java/controlflow/Guards.qll +++ b/java/ql/lib/semmle/code/java/controlflow/Guards.qll @@ -139,7 +139,7 @@ private predicate isNonFallThroughPredecessor(SwitchCase sc, ControlFlowNode pre ) } -private module SuccessorTypes implements SharedGuards::SuccessorTypesSig { +private module SuccessorTypes implements SharedGuards::SuccessorTypesSig { import codeql.controlflow.SuccessorType } diff --git a/javascript/ql/lib/semmle/javascript/internal/BasicBlockInternal.qll b/javascript/ql/lib/semmle/javascript/internal/BasicBlockInternal.qll index 6742429b15e4..d8e4a18dfc17 100644 --- a/javascript/ql/lib/semmle/javascript/internal/BasicBlockInternal.qll +++ b/javascript/ql/lib/semmle/javascript/internal/BasicBlockInternal.qll @@ -372,16 +372,28 @@ module Public { module Cfg implements BB::CfgSig { private import javascript as Js - private import codeql.util.Unit + private import codeql.controlflow.SuccessorType class ControlFlowNode = Js::ControlFlowNode; - class SuccessorType = Unit; + private predicate conditionSucc(BasicBlock bb1, BasicBlock bb2, boolean branch) { + exists(ConditionGuardNode g | + bb1 = g.getTest().getBasicBlock() and + bb2 = g.getBasicBlock() and + branch = g.getOutcome() + ) + } class BasicBlock extends FinalBasicBlock { BasicBlock getASuccessor() { result = super.getASuccessor() } - BasicBlock getASuccessor(SuccessorType t) { result = super.getASuccessor() and exists(t) } + BasicBlock getASuccessor(SuccessorType t) { + conditionSucc(this, result, t.(BooleanSuccessor).getValue()) + or + result = super.getASuccessor() and + t instanceof DirectSuccessor and + not conditionSucc(this, result, _) + } predicate strictlyDominates(BasicBlock bb) { this.(ReachableBasicBlock).strictlyDominates(bb) diff --git a/python/ql/lib/semmle/python/Flow.qll b/python/ql/lib/semmle/python/Flow.qll index c91a492e269e..621013adcd56 100644 --- a/python/ql/lib/semmle/python/Flow.qll +++ b/python/ql/lib/semmle/python/Flow.qll @@ -1259,9 +1259,9 @@ private class ControlFlowNodeAlias = ControlFlowNode; final private class FinalBasicBlock = BasicBlock; module Cfg implements BB::CfgSig { - class ControlFlowNode = ControlFlowNodeAlias; + private import codeql.controlflow.SuccessorType - class SuccessorType = Unit; + class ControlFlowNode = ControlFlowNodeAlias; class BasicBlock extends FinalBasicBlock { // Note `PY:BasicBlock` does not have a `getLocation`. @@ -1275,7 +1275,24 @@ module Cfg implements BB::CfgSig { BasicBlock getASuccessor() { result = super.getASuccessor() } - BasicBlock getASuccessor(SuccessorType t) { result = super.getASuccessor() and exists(t) } + private BasicBlock getANonDirectSuccessor(SuccessorType t) { + result = this.getATrueSuccessor() and + t.(BooleanSuccessor).getValue() = true + or + result = this.getAFalseSuccessor() and + t.(BooleanSuccessor).getValue() = false + or + result = this.getAnExceptionalSuccessor() and + t instanceof ExceptionSuccessor + } + + BasicBlock getASuccessor(SuccessorType t) { + result = this.getANonDirectSuccessor(t) + or + result = super.getASuccessor() and + t instanceof DirectSuccessor and + not result = this.getANonDirectSuccessor(_) + } predicate strictlyDominates(BasicBlock bb) { super.strictlyDominates(bb) } diff --git a/ruby/ql/lib/codeql/ruby/controlflow/BasicBlocks.qll b/ruby/ql/lib/codeql/ruby/controlflow/BasicBlocks.qll index 72d8360b24c0..e085dbd90a38 100644 --- a/ruby/ql/lib/codeql/ruby/controlflow/BasicBlocks.qll +++ b/ruby/ql/lib/codeql/ruby/controlflow/BasicBlocks.qll @@ -301,13 +301,9 @@ private class BasicBlockAlias = BasicBlock; private class EntryBasicBlockAlias = EntryBasicBlock; -private class SuccessorTypeAlias = SuccessorType; - module Cfg implements BB::CfgSig { class ControlFlowNode = CfgNode; - class SuccessorType = SuccessorTypeAlias; - class BasicBlock = BasicBlockAlias; class EntryBasicBlock = EntryBasicBlockAlias; diff --git a/ruby/ql/lib/codeql/ruby/controlflow/internal/ControlFlowGraphImpl.qll b/ruby/ql/lib/codeql/ruby/controlflow/internal/ControlFlowGraphImpl.qll index d45f6f19cdf3..f564633bb00f 100644 --- a/ruby/ql/lib/codeql/ruby/controlflow/internal/ControlFlowGraphImpl.qll +++ b/ruby/ql/lib/codeql/ruby/controlflow/internal/ControlFlowGraphImpl.qll @@ -46,19 +46,10 @@ private module CfgInput implements CfgShared::InputSig { scope.(Impl::CfgScopeImpl).exit(last, c) } - class SuccessorType = Cfg::SuccessorType; + private class SuccessorType = Cfg::SuccessorType; SuccessorType getAMatchingSuccessorType(Completion c) { result = c.getAMatchingSuccessorType() } - predicate successorTypeIsSimple(SuccessorType t) { t instanceof Cfg::DirectSuccessor } - - predicate successorTypeIsCondition(SuccessorType t) { t instanceof Cfg::ConditionalSuccessor } - - predicate isAbnormalExitType(SuccessorType t) { - t instanceof Cfg::ExceptionSuccessor or - t instanceof Cfg::ExitSuccessor - } - private predicate id(Ruby::AstNode node1, Ruby::AstNode node2) { node1 = node2 } private predicate idOf(Ruby::AstNode node, int id) = equivalenceRelation(id/2)(node, id) diff --git a/rust/ql/lib/codeql/rust/controlflow/BasicBlocks.qll b/rust/ql/lib/codeql/rust/controlflow/BasicBlocks.qll index daa2cb1e818b..4ed935440234 100644 --- a/rust/ql/lib/codeql/rust/controlflow/BasicBlocks.qll +++ b/rust/ql/lib/codeql/rust/controlflow/BasicBlocks.qll @@ -21,8 +21,6 @@ final class JoinPredecessorBasicBlock = BasicBlocksImpl::JoinPredecessorBasicBlo module Cfg implements BB::CfgSig { class ControlFlowNode = ControlFlowGraph::CfgNode; - class SuccessorType = ControlFlowGraph::SuccessorType; - class BasicBlock = BasicBlocksImpl::BasicBlock; class EntryBasicBlock = BasicBlocksImpl::EntryBasicBlock; diff --git a/rust/ql/lib/codeql/rust/controlflow/internal/ControlFlowGraphImpl.qll b/rust/ql/lib/codeql/rust/controlflow/internal/ControlFlowGraphImpl.qll index b7607aa025b5..ddc4dae9b958 100644 --- a/rust/ql/lib/codeql/rust/controlflow/internal/ControlFlowGraphImpl.qll +++ b/rust/ql/lib/codeql/rust/controlflow/internal/ControlFlowGraphImpl.qll @@ -29,19 +29,11 @@ private module CfgInput implements InputSig { Stages::CfgStage::ref() } - class SuccessorType = Cfg::SuccessorType; + private class SuccessorType = Cfg::SuccessorType; /** Gets a successor type that matches completion `c`. */ SuccessorType getAMatchingSuccessorType(Completion c) { result = c.getAMatchingSuccessorType() } - /** - * Hold if `c` represents simple (normal) evaluation of a statement or an expression. - */ - predicate successorTypeIsSimple(SuccessorType t) { t instanceof Cfg::DirectSuccessor } - - /** Holds if `t` is an abnormal exit type out of a CFG scope. */ - predicate isAbnormalExitType(SuccessorType t) { none() } - /** Hold if `t` represents a conditional successor type. */ predicate successorTypeIsCondition(SuccessorType t) { t instanceof Cfg::BooleanSuccessor } diff --git a/shared/controlflow/codeql/controlflow/BasicBlock.qll b/shared/controlflow/codeql/controlflow/BasicBlock.qll index 7aa541b46302..ed86ae5aa8be 100644 --- a/shared/controlflow/codeql/controlflow/BasicBlock.qll +++ b/shared/controlflow/codeql/controlflow/BasicBlock.qll @@ -9,17 +9,12 @@ overlay[local?] module; private import codeql.util.Location +private import SuccessorType /** Provides the language-specific input specification. */ signature module InputSig { - /** The type of a control flow successor. */ - class SuccessorType { - /** Gets a textual representation of this successor type. */ - string toString(); - } - /** Hold if `t` represents a conditional successor type. */ - predicate successorTypeIsCondition(SuccessorType t); + default predicate successorTypeIsCondition(SuccessorType t) { t instanceof ConditionalSuccessor } /** A delineated part of the AST with its own CFG. */ class CfgScope; @@ -61,12 +56,6 @@ signature module CfgSig { Location getLocation(); } - /** The type of a control flow successor. */ - class SuccessorType { - /** Gets a textual representation of this successor type. */ - string toString(); - } - /** * A basic block, that is, a maximal straight-line sequence of control flow nodes * without branches or joins. @@ -180,8 +169,6 @@ module Make Input> implements CfgSig { @@ -59,26 +60,11 @@ signature module InputSig { /** Holds if `scope` is exited when `last` finishes with completion `c`. */ predicate scopeLast(CfgScope scope, AstNode last, Completion c); - /** A type of a control flow successor. */ - class SuccessorType { - /** Gets a textual representation of this successor type. */ - string toString(); - } - /** Gets a successor type that matches completion `c`. */ SuccessorType getAMatchingSuccessorType(Completion c); - /** - * Hold if `t` represents simple (normal) evaluation of a statement or an - * expression. - */ - predicate successorTypeIsSimple(SuccessorType t); - /** Hold if `t` represents a conditional successor type. */ - predicate successorTypeIsCondition(SuccessorType t); - - /** Holds if `t` is an abnormal exit type out of a CFG scope. */ - predicate isAbnormalExitType(SuccessorType t); + default predicate successorTypeIsCondition(SuccessorType t) { t instanceof ConditionalSuccessor } /** * Gets an `id` of `node`. This is used to order the predecessors of a join @@ -522,7 +508,7 @@ module MakeWithSplitting< private predicate succEntrySplits(CfgScope pred, AstNode succ, Splits succSplits, SuccessorType t) { exists(int rnk | scopeFirst(pred, succ) and - successorTypeIsSimple(t) and + t instanceof DirectSuccessor and succEntrySplitsFromRank(pred, succ, succSplits, rnk) | rnk = 0 and @@ -1016,7 +1002,7 @@ module MakeWithSplitting< exists(CfgScope scope | pred = TAnnotatedExitNode(scope, _) and result = TExitNode(scope) and - successorTypeIsSimple(t) + t instanceof DirectSuccessor ) } @@ -1320,7 +1306,7 @@ module MakeWithSplitting< label = strictconcat(SuccessorType t, string s | succ = getASuccessor(pred, t) and - if successorTypeIsSimple(t) then s = "" else s = t.toString() + if t instanceof DirectSuccessor then s = "" else s = t.toString() | s, ", " order by s ) @@ -1590,8 +1576,6 @@ module MakeWithSplitting< private class NodeAlias = Node; private module BasicBlockInputSig implements BB::InputSig { - class SuccessorType = Input::SuccessorType; - predicate successorTypeIsCondition = Input::successorTypeIsCondition/1; class CfgScope = CfgScopeAlias; diff --git a/shared/controlflow/codeql/controlflow/Guards.qll b/shared/controlflow/codeql/controlflow/Guards.qll index f39cb67b7e1a..fb32157654bd 100644 --- a/shared/controlflow/codeql/controlflow/Guards.qll +++ b/shared/controlflow/codeql/controlflow/Guards.qll @@ -51,16 +51,17 @@ overlay[local?] module; private import codeql.controlflow.BasicBlock as BB +private import codeql.controlflow.SuccessorType as ST private import codeql.util.Boolean private import codeql.util.Location private import codeql.util.Unit signature class TypSig; -signature module SuccessorTypesSig { - class ExceptionSuccessor extends SuccessorType; +signature module SuccessorTypesSig { + class ExceptionSuccessor extends ST::SuccessorType; - class ConditionalSuccessor extends SuccessorType { + class ConditionalSuccessor extends ST::SuccessorType { /** Gets the Boolean value of this successor. */ boolean getValue(); } @@ -204,8 +205,7 @@ signature module InputSig Cfg, - SuccessorTypesSig SuccessorTypes, + LocationSig Location, BB::CfgSig Cfg, SuccessorTypesSig SuccessorTypes, InputSig Input> { private module Cfg_ = Cfg; @@ -320,7 +320,7 @@ module Make< } private predicate exceptionBranchPoint(BasicBlock bb1, BasicBlock normalSucc, BasicBlock excSucc) { - exists(SuccessorType norm, ExceptionSuccessor exc | + exists(ST::SuccessorType norm, ExceptionSuccessor exc | bb1.getASuccessor(norm) = normalSucc and bb1.getASuccessor(exc) = excSucc and normalSucc != excSucc and diff --git a/shared/controlflow/codeql/controlflow/SuccessorType.qll b/shared/controlflow/codeql/controlflow/SuccessorType.qll index 029d52f5cb74..9dcbbc9bd271 100644 --- a/shared/controlflow/codeql/controlflow/SuccessorType.qll +++ b/shared/controlflow/codeql/controlflow/SuccessorType.qll @@ -339,3 +339,9 @@ class RetrySuccessor extends JumpSuccessor, TRetrySuccessor { class JavaYieldSuccessor extends JumpSuccessor, TJavaYieldSuccessor { override string toString() { result = "yield" } } + +/** Holds if `t` is an abnormal exit type out of a CFG scope. */ +predicate isAbnormalExitType(SuccessorType t) { + t instanceof ExceptionSuccessor or + t instanceof ExitSuccessor +} diff --git a/swift/ql/lib/codeql/swift/controlflow/BasicBlocks.qll b/swift/ql/lib/codeql/swift/controlflow/BasicBlocks.qll index 3ff42e01d188..e5acea49fdad 100644 --- a/swift/ql/lib/codeql/swift/controlflow/BasicBlocks.qll +++ b/swift/ql/lib/codeql/swift/controlflow/BasicBlocks.qll @@ -119,13 +119,9 @@ private class EntryBasicBlockAlias = EntryBasicBlock; private class ControlFlowNodeAlias = ControlFlowNode; -private class SuccessorTypeAlias = SuccessorType; - module Cfg implements BB::CfgSig { class ControlFlowNode = ControlFlowNodeAlias; - class SuccessorType = SuccessorTypeAlias; - class BasicBlock = BasicBlockAlias; class EntryBasicBlock = EntryBasicBlockAlias; diff --git a/swift/ql/lib/codeql/swift/controlflow/internal/ControlFlowGraphImplSpecific.qll b/swift/ql/lib/codeql/swift/controlflow/internal/ControlFlowGraphImplSpecific.qll index 1902e0454671..37625e0be10c 100644 --- a/swift/ql/lib/codeql/swift/controlflow/internal/ControlFlowGraphImplSpecific.qll +++ b/swift/ql/lib/codeql/swift/controlflow/internal/ControlFlowGraphImplSpecific.qll @@ -48,29 +48,11 @@ module CfgInput implements InputSig { CfgScope getCfgScope(AstNode n) { result = scopeOfAst(n.asAstNode()) } - class SuccessorType = Cfg::SuccessorType; + private class SuccessorType = Cfg::SuccessorType; /** Gets a successor type that matches completion `c`. */ SuccessorType getAMatchingSuccessorType(Completion c) { result = c.getAMatchingSuccessorType() } - /** - * Hold if `c` represents simple (normal) evaluation of a statement or an - * expression. - */ - predicate successorTypeIsSimple(SuccessorType t) { t instanceof Cfg::DirectSuccessor } - - /** Holds if `t` is an abnormal exit type out of a CFG scope. */ - predicate isAbnormalExitType(SuccessorType t) { t instanceof Cfg::ExceptionSuccessor } - - /** Hold if `t` represents a conditional successor type. */ - predicate successorTypeIsCondition(SuccessorType t) { - t instanceof Cfg::BooleanSuccessor or - t instanceof Cfg::BreakSuccessor or - t instanceof Cfg::ContinueSuccessor or - t instanceof Cfg::MatchingSuccessor or - t instanceof Cfg::EmptinessSuccessor - } - /** Holds if `first` is first executed when entering `scope`. */ predicate scopeFirst(CfgScope scope, AstNode first) { scope.(Impl::CfgScope::Range_).entry(first) From bbf799510092248780107c9ba944639c0fd86915 Mon Sep 17 00:00:00 2001 From: Anders Schack-Mulligen Date: Thu, 28 Aug 2025 13:18:27 +0200 Subject: [PATCH 035/308] C#: Fix caching dependencies. --- csharp/ql/lib/semmle/code/csharp/controlflow/Guards.qll | 1 + .../ql/lib/semmle/code/csharp/controlflow/internal/PreSsa.qll | 3 +++ 2 files changed, 4 insertions(+) diff --git a/csharp/ql/lib/semmle/code/csharp/controlflow/Guards.qll b/csharp/ql/lib/semmle/code/csharp/controlflow/Guards.qll index 459028aa6ea7..82ab4b638126 100644 --- a/csharp/ql/lib/semmle/code/csharp/controlflow/Guards.qll +++ b/csharp/ql/lib/semmle/code/csharp/controlflow/Guards.qll @@ -1424,6 +1424,7 @@ module Internal { cached predicate isGuard(Expr e, AbstractValue val) { + Stages::ControlFlowStage::forceCachingInSameStage() and ( e.getType() instanceof BoolType and not e instanceof BoolLiteral and diff --git a/csharp/ql/lib/semmle/code/csharp/controlflow/internal/PreSsa.qll b/csharp/ql/lib/semmle/code/csharp/controlflow/internal/PreSsa.qll index ce9fdd406fd8..4921e6926232 100644 --- a/csharp/ql/lib/semmle/code/csharp/controlflow/internal/PreSsa.qll +++ b/csharp/ql/lib/semmle/code/csharp/controlflow/internal/PreSsa.qll @@ -82,6 +82,8 @@ module PreSsa { } module SsaInput implements SsaImplCommon::InputSig { + private import semmle.code.csharp.Caching + private class ExitBasicBlock extends PreBasicBlocks::PreBasicBlock { ExitBasicBlock() { scopeLast(_, this.getLastNode(), _) } } @@ -124,6 +126,7 @@ module PreSsa { predicate variableWrite( PreBasicBlocks::PreBasicBlock bb, int i, SourceVariable v, boolean certain ) { + Stages::ControlFlowStage::forceCachingInSameStage() and exists(AssignableDefinition def | definitionAt(def, bb, i, v) and if def.getTargetAccess().isRefArgument() then certain = false else certain = true From 0d9b8d059250427434bc13f58d55895638c7bf27 Mon Sep 17 00:00:00 2001 From: Anders Schack-Mulligen Date: Thu, 28 Aug 2025 16:04:06 +0200 Subject: [PATCH 036/308] Cfg: Allow for multiple exception successors. --- shared/controlflow/codeql/controlflow/Cfg.qll | 2 ++ 1 file changed, 2 insertions(+) diff --git a/shared/controlflow/codeql/controlflow/Cfg.qll b/shared/controlflow/codeql/controlflow/Cfg.qll index ab89ca98ab42..20801e7438e7 100644 --- a/shared/controlflow/codeql/controlflow/Cfg.qll +++ b/shared/controlflow/codeql/controlflow/Cfg.qll @@ -1521,6 +1521,8 @@ module MakeWithSplitting< query predicate multipleSuccessors(Node node, SuccessorType t, Node successor) { strictcount(getASuccessor(node, t)) > 1 and successor = getASuccessor(node, t) and + // allow for multiple exception successors + not t instanceof ExceptionSuccessor and // allow for functions with multiple bodies not (t instanceof SimpleSuccessorType and node instanceof EntryNode) } From 4e706276292e57b5d1fa0f1034a4b5c184d58c6b Mon Sep 17 00:00:00 2001 From: Anders Schack-Mulligen Date: Fri, 29 Aug 2025 11:01:46 +0200 Subject: [PATCH 037/308] Guards: Use shared SuccessorType. --- .../semmle/code/java/controlflow/Guards.qll | 6 +----- .../controlflow/codeql/controlflow/Guards.qll | 20 +++---------------- 2 files changed, 4 insertions(+), 22 deletions(-) diff --git a/java/ql/lib/semmle/code/java/controlflow/Guards.qll b/java/ql/lib/semmle/code/java/controlflow/Guards.qll index 45983a10a278..51d6a62f43bb 100644 --- a/java/ql/lib/semmle/code/java/controlflow/Guards.qll +++ b/java/ql/lib/semmle/code/java/controlflow/Guards.qll @@ -139,10 +139,6 @@ private predicate isNonFallThroughPredecessor(SwitchCase sc, ControlFlowNode pre ) } -private module SuccessorTypes implements SharedGuards::SuccessorTypesSig { - import codeql.controlflow.SuccessorType -} - private module GuardsInput implements SharedGuards::InputSig { private import java as J private import semmle.code.java.dataflow.internal.BaseSSA @@ -379,7 +375,7 @@ private module GuardsInput implements SharedGuards::InputSig; +private module GuardsImpl = SharedGuards::Make; private module LogicInputCommon { private import semmle.code.java.dataflow.NullGuards as NullGuards diff --git a/shared/controlflow/codeql/controlflow/Guards.qll b/shared/controlflow/codeql/controlflow/Guards.qll index fb32157654bd..3fe63a7118c7 100644 --- a/shared/controlflow/codeql/controlflow/Guards.qll +++ b/shared/controlflow/codeql/controlflow/Guards.qll @@ -51,26 +51,13 @@ overlay[local?] module; private import codeql.controlflow.BasicBlock as BB -private import codeql.controlflow.SuccessorType as ST +private import codeql.controlflow.SuccessorType private import codeql.util.Boolean private import codeql.util.Location private import codeql.util.Unit signature class TypSig; -signature module SuccessorTypesSig { - class ExceptionSuccessor extends ST::SuccessorType; - - class ConditionalSuccessor extends ST::SuccessorType { - /** Gets the Boolean value of this successor. */ - boolean getValue(); - } - - class BooleanSuccessor extends ConditionalSuccessor; - - class NullnessSuccessor extends ConditionalSuccessor; -} - signature module InputSig { /** A control flow node indicating normal termination of a callable. */ class NormalExitNode extends ControlFlowNode; @@ -205,13 +192,12 @@ signature module InputSig Cfg, SuccessorTypesSig SuccessorTypes, + LocationSig Location, BB::CfgSig Cfg, InputSig Input> { private module Cfg_ = Cfg; private import Cfg_ - private import SuccessorTypes private import Input private newtype TAbstractSingleValue = @@ -320,7 +306,7 @@ module Make< } private predicate exceptionBranchPoint(BasicBlock bb1, BasicBlock normalSucc, BasicBlock excSucc) { - exists(ST::SuccessorType norm, ExceptionSuccessor exc | + exists(SuccessorType norm, ExceptionSuccessor exc | bb1.getASuccessor(norm) = normalSucc and bb1.getASuccessor(exc) = excSucc and normalSucc != excSucc and From 64f9758c29eca0d36a637c6fe12b2bb0bc594735 Mon Sep 17 00:00:00 2001 From: Michael Nebel Date: Mon, 1 Sep 2025 14:45:00 +0200 Subject: [PATCH 038/308] Actions: Fix some Ql4Ql violations. --- actions/ql/lib/codeql/Locations.qll | 4 +- actions/ql/lib/codeql/actions/Ast.qll | 2 +- .../lib/codeql/actions/ast/internal/Ast.qll | 16 +++---- .../actions/controlflow/BasicBlocks.qll | 2 +- .../codeql/actions/dataflow/ExternalFlow.qll | 8 ++-- .../codeql/actions/dataflow/FlowSources.qll | 15 +++--- .../security/ArgumentInjectionQuery.qll | 6 +-- .../security/ArtifactPoisoningQuery.qll | 47 ++++++++++--------- .../codeql/actions/security/ControlChecks.qll | 5 +- .../actions/security/EnvVarInjectionQuery.qll | 12 +---- .../security/OutputClobberingQuery.qll | 8 +--- .../UseOfUnversionedImmutableAction.qll | 4 +- .../CWE-829/ArtifactPoisoningPathTraversal.ql | 4 +- 13 files changed, 55 insertions(+), 78 deletions(-) diff --git a/actions/ql/lib/codeql/Locations.qll b/actions/ql/lib/codeql/Locations.qll index 96b5d45f18e0..24c6ae9cda1d 100644 --- a/actions/ql/lib/codeql/Locations.qll +++ b/actions/ql/lib/codeql/Locations.qll @@ -70,8 +70,8 @@ class Location extends TLocation, TBaseLocation { /** * Holds if this element is at the specified location. - * The location spans column `startcolumn` of line `startline` to - * column `endcolumn` of line `endline` in file `filepath`. + * The location spans column `sc` of line `sl` to + * column `ec` of line `el` in file `p`. * For more information, see * [Providing locations in CodeQL queries](https://codeql.github.com/docs/writing-codeql-queries/providing-locations-in-codeql-queries/). */ diff --git a/actions/ql/lib/codeql/actions/Ast.qll b/actions/ql/lib/codeql/actions/Ast.qll index ae19a7a7e8ca..6e76e4cd665a 100644 --- a/actions/ql/lib/codeql/actions/Ast.qll +++ b/actions/ql/lib/codeql/actions/Ast.qll @@ -261,7 +261,7 @@ class If extends AstNode instanceof IfImpl { } /** - * An Environemnt node representing a deployment environment. + * An Environment node representing a deployment environment. */ class Environment extends AstNode instanceof EnvironmentImpl { string getName() { result = super.getName() } diff --git a/actions/ql/lib/codeql/actions/ast/internal/Ast.qll b/actions/ql/lib/codeql/actions/ast/internal/Ast.qll index b0cbb8a1d79e..b922214e21c5 100644 --- a/actions/ql/lib/codeql/actions/ast/internal/Ast.qll +++ b/actions/ql/lib/codeql/actions/ast/internal/Ast.qll @@ -125,12 +125,11 @@ abstract class AstNodeImpl extends TAstNode { * Gets the enclosing Step. */ StepImpl getEnclosingStep() { - if this instanceof StepImpl - then result = this - else - if this instanceof ScalarValueImpl - then result.getAChildNode*() = this.getParentNode() - else none() + this instanceof StepImpl and + result = this + or + this instanceof ScalarValueImpl and + result.getAChildNode*() = this.getParentNode() } /** @@ -1416,9 +1415,8 @@ class ExternalJobImpl extends JobImpl, UsesImpl { override string getVersion() { exists(YamlString name | n.lookup("uses") = name and - if not name.getValue().matches("\\.%") - then result = name.getValue().regexpCapture(repoUsesParser(), 4) - else none() + not name.getValue().matches("\\.%") and + result = name.getValue().regexpCapture(repoUsesParser(), 4) ) } } diff --git a/actions/ql/lib/codeql/actions/controlflow/BasicBlocks.qll b/actions/ql/lib/codeql/actions/controlflow/BasicBlocks.qll index af5e0f62552f..2dcfd81a47dc 100644 --- a/actions/ql/lib/codeql/actions/controlflow/BasicBlocks.qll +++ b/actions/ql/lib/codeql/actions/controlflow/BasicBlocks.qll @@ -286,7 +286,7 @@ private module Cached { /** * Holds if `cfn` is the `i`th node in basic block `bb`. * - * In other words, `i` is the shortest distance from a node `bb` + * In other words, `i` is the shortest distance from a node `bbStart` * that starts a basic block to `cfn` along the `intraBBSucc` relation. */ cached diff --git a/actions/ql/lib/codeql/actions/dataflow/ExternalFlow.qll b/actions/ql/lib/codeql/actions/dataflow/ExternalFlow.qll index 2914dac5f0a6..9667c6e525ea 100644 --- a/actions/ql/lib/codeql/actions/dataflow/ExternalFlow.qll +++ b/actions/ql/lib/codeql/actions/dataflow/ExternalFlow.qll @@ -63,10 +63,10 @@ predicate madSource(DataFlow::Node source, string kind, string fieldName) { ( if fieldName.trim().matches("env.%") then source.asExpr() = uses.getInScopeEnvVarExpr(fieldName.trim().replaceAll("env.", "")) - else - if fieldName.trim().matches("output.%") - then source.asExpr() = uses - else none() + else ( + fieldName.trim().matches("output.%") and + source.asExpr() = uses + ) ) ) } diff --git a/actions/ql/lib/codeql/actions/dataflow/FlowSources.qll b/actions/ql/lib/codeql/actions/dataflow/FlowSources.qll index df3d513d0050..18cc4322c81b 100644 --- a/actions/ql/lib/codeql/actions/dataflow/FlowSources.qll +++ b/actions/ql/lib/codeql/actions/dataflow/FlowSources.qll @@ -31,14 +31,14 @@ abstract class RemoteFlowSource extends SourceNode { class GitHubCtxSource extends RemoteFlowSource { string flag; string event; - GitHubExpression e; GitHubCtxSource() { - this.asExpr() = e and - // github.head_ref - e.getFieldName() = "head_ref" and - flag = "branch" and - ( + exists(GitHubExpression e | + this.asExpr() = e and + // github.head_ref + e.getFieldName() = "head_ref" and + flag = "branch" + | event = e.getATriggerEvent().getName() and event = "pull_request_target" or @@ -148,7 +148,6 @@ class GhCLICommandSource extends RemoteFlowSource, CommandSource { class GitHubEventPathSource extends RemoteFlowSource, CommandSource { string cmd; string flag; - string access_path; Run run; // Examples @@ -163,7 +162,7 @@ class GitHubEventPathSource extends RemoteFlowSource, CommandSource { run.getScript().getACommand() = cmd and cmd.matches("jq%") and cmd.matches("%GITHUB_EVENT_PATH%") and - exists(string regexp | + exists(string regexp, string access_path | untrustedEventPropertiesDataModel(regexp, flag) and not flag = "json" and access_path = "github.event" + cmd.regexpCapture(".*\\s+([^\\s]+)\\s+.*", 1) and diff --git a/actions/ql/lib/codeql/actions/security/ArgumentInjectionQuery.qll b/actions/ql/lib/codeql/actions/security/ArgumentInjectionQuery.qll index 679b8977cf91..1795e9493cb4 100644 --- a/actions/ql/lib/codeql/actions/security/ArgumentInjectionQuery.qll +++ b/actions/ql/lib/codeql/actions/security/ArgumentInjectionQuery.qll @@ -19,7 +19,6 @@ abstract class ArgumentInjectionSink extends DataFlow::Node { */ class ArgumentInjectionFromEnvVarSink extends ArgumentInjectionSink { string command; - string argument; ArgumentInjectionFromEnvVarSink() { exists(Run run, string var | @@ -28,7 +27,7 @@ class ArgumentInjectionFromEnvVarSink extends ArgumentInjectionSink { exists(run.getInScopeEnvVarExpr(var)) or var = "GITHUB_HEAD_REF" ) and - run.getScript().getAnEnvReachingArgumentInjectionSink(var, command, argument) + run.getScript().getAnEnvReachingArgumentInjectionSink(var, command, _) ) } @@ -44,13 +43,12 @@ class ArgumentInjectionFromEnvVarSink extends ArgumentInjectionSink { */ class ArgumentInjectionFromCommandSink extends ArgumentInjectionSink { string command; - string argument; ArgumentInjectionFromCommandSink() { exists(CommandSource source, Run run | run = source.getEnclosingRun() and this.asExpr() = run.getScript() and - run.getScript().getACmdReachingArgumentInjectionSink(source.getCommand(), command, argument) + run.getScript().getACmdReachingArgumentInjectionSink(source.getCommand(), command, _) ) } diff --git a/actions/ql/lib/codeql/actions/security/ArtifactPoisoningQuery.qll b/actions/ql/lib/codeql/actions/security/ArtifactPoisoningQuery.qll index 76025a9ba0db..9f3ed33db961 100644 --- a/actions/ql/lib/codeql/actions/security/ArtifactPoisoningQuery.qll +++ b/actions/ql/lib/codeql/actions/security/ArtifactPoisoningQuery.qll @@ -125,8 +125,6 @@ class LegitLabsDownloadArtifactActionStep extends UntrustedArtifactDownloadStep, } class ActionsGitHubScriptDownloadStep extends UntrustedArtifactDownloadStep, UsesStep { - string script; - ActionsGitHubScriptDownloadStep() { // eg: // - uses: actions/github-script@v6 @@ -149,12 +147,14 @@ class ActionsGitHubScriptDownloadStep extends UntrustedArtifactDownloadStep, Use // var fs = require('fs'); // fs.writeFileSync('${{github.workspace}}/test-results.zip', Buffer.from(download.data)); this.getCallee() = "actions/github-script" and - this.getArgument("script") = script and - script.matches("%listWorkflowRunArtifacts(%") and - script.matches("%downloadArtifact(%") and - script.matches("%writeFileSync(%") and - // Filter out artifacts that were created by pull-request. - not script.matches("%exclude_pull_requests: true%") + exists(string script | + this.getArgument("script") = script and + script.matches("%listWorkflowRunArtifacts(%") and + script.matches("%downloadArtifact(%") and + script.matches("%writeFileSync(%") and + // Filter out artifacts that were created by pull-request. + not script.matches("%exclude_pull_requests: true%") + ) } override string getPath() { @@ -171,10 +171,10 @@ class ActionsGitHubScriptDownloadStep extends UntrustedArtifactDownloadStep, Use .getScript() .getACommand() .regexpCapture(unzipRegexp() + unzipDirArgRegexp(), 3))) - else - if this.getAFollowingStep().(Run).getScript().getACommand().regexpMatch(unzipRegexp()) - then result = "GITHUB_WORKSPACE/" - else none() + else ( + this.getAFollowingStep().(Run).getScript().getACommand().regexpMatch(unzipRegexp()) and + result = "GITHUB_WORKSPACE/" + ) } } @@ -207,12 +207,13 @@ class GHRunArtifactDownloadStep extends UntrustedArtifactDownloadStep, Run { .getScript() .getACommand() .regexpCapture(unzipRegexp() + unzipDirArgRegexp(), 3))) - else - if + else ( + ( this.getAFollowingStep().(Run).getScript().getACommand().regexpMatch(unzipRegexp()) or this.getScript().getACommand().regexpMatch(unzipRegexp()) - then result = "GITHUB_WORKSPACE/" - else none() + ) and + result = "GITHUB_WORKSPACE/" + ) } } @@ -259,15 +260,15 @@ class DirectArtifactDownloadStep extends UntrustedArtifactDownloadStep, Run { class ArtifactPoisoningSink extends DataFlow::Node { UntrustedArtifactDownloadStep download; - PoisonableStep poisonable; ArtifactPoisoningSink() { - download.getAFollowingStep() = poisonable and - // excluding artifacts downloaded to the temporary directory - not download.getPath().regexpMatch("^/tmp.*") and - not download.getPath().regexpMatch("^\\$\\{\\{\\s*runner\\.temp\\s*}}.*") and - not download.getPath().regexpMatch("^\\$RUNNER_TEMP.*") and - ( + exists(PoisonableStep poisonable | + download.getAFollowingStep() = poisonable and + // excluding artifacts downloaded to the temporary directory + not download.getPath().regexpMatch("^/tmp.*") and + not download.getPath().regexpMatch("^\\$\\{\\{\\s*runner\\.temp\\s*}}.*") and + not download.getPath().regexpMatch("^\\$RUNNER_TEMP.*") + | poisonable.(Run).getScript() = this.asExpr() and ( // Check if the poisonable step is a local script execution step diff --git a/actions/ql/lib/codeql/actions/security/ControlChecks.qll b/actions/ql/lib/codeql/actions/security/ControlChecks.qll index 244c04310d6d..41f512abbc34 100644 --- a/actions/ql/lib/codeql/actions/security/ControlChecks.qll +++ b/actions/ql/lib/codeql/actions/security/ControlChecks.qll @@ -159,11 +159,8 @@ abstract class CommentVsHeadDateCheck extends ControlCheck { /* Specific implementations of control checks */ class LabelIfCheck extends LabelCheck instanceof If { - string condition; - LabelIfCheck() { - condition = normalizeExpr(this.getCondition()) and - ( + exists(string condition | condition = normalizeExpr(this.getCondition()) | // eg: contains(github.event.pull_request.labels.*.name, 'safe to test') condition.regexpMatch(".*(^|[^!])contains\\(\\s*github\\.event\\.pull_request\\.labels\\b.*") or diff --git a/actions/ql/lib/codeql/actions/security/EnvVarInjectionQuery.qll b/actions/ql/lib/codeql/actions/security/EnvVarInjectionQuery.qll index 2022e3dca998..ea8a800ef3f6 100644 --- a/actions/ql/lib/codeql/actions/security/EnvVarInjectionQuery.qll +++ b/actions/ql/lib/codeql/actions/security/EnvVarInjectionQuery.qll @@ -55,12 +55,8 @@ class EnvVarInjectionFromFileReadSink extends EnvVarInjectionSink { * echo "COMMIT_MESSAGE=${COMMIT_MESSAGE}" >> $GITHUB_ENV */ class EnvVarInjectionFromCommandSink extends EnvVarInjectionSink { - CommandSource inCommand; - string injectedVar; - string command; - EnvVarInjectionFromCommandSink() { - exists(Run run | + exists(Run run, CommandSource inCommand, string injectedVar, string command | this.asExpr() = inCommand.getEnclosingRun().getScript() and run = inCommand.getEnclosingRun() and run.getScript().getACmdReachingGitHubEnvWrite(inCommand.getCommand(), injectedVar) and @@ -86,12 +82,8 @@ class EnvVarInjectionFromCommandSink extends EnvVarInjectionSink { * echo "FOO=$BODY" >> $GITHUB_ENV */ class EnvVarInjectionFromEnvVarSink extends EnvVarInjectionSink { - string inVar; - string injectedVar; - string command; - EnvVarInjectionFromEnvVarSink() { - exists(Run run | + exists(Run run, string inVar, string injectedVar, string command | run.getScript() = this.asExpr() and exists(run.getInScopeEnvVarExpr(inVar)) and run.getScript().getAnEnvReachingGitHubEnvWrite(inVar, injectedVar) and diff --git a/actions/ql/lib/codeql/actions/security/OutputClobberingQuery.qll b/actions/ql/lib/codeql/actions/security/OutputClobberingQuery.qll index c67d2876b091..4454a5496a2f 100644 --- a/actions/ql/lib/codeql/actions/security/OutputClobberingQuery.qll +++ b/actions/ql/lib/codeql/actions/security/OutputClobberingQuery.qll @@ -99,18 +99,14 @@ class OutputClobberingFromEnvVarSink extends OutputClobberingSink { * echo $BODY */ class WorkflowCommandClobberingFromEnvVarSink extends OutputClobberingSink { - string clobbering_var; - string clobbered_value; - WorkflowCommandClobberingFromEnvVarSink() { - exists(Run run, string workflow_cmd_stmt, string clobbering_stmt | + exists(Run run, string workflow_cmd_stmt, string clobbering_stmt, string clobbering_var | run.getScript() = this.asExpr() and run.getScript().getAStmt() = clobbering_stmt and clobbering_stmt.regexpMatch("echo\\s+(-e\\s+)?(\"|')?\\$(\\{)?" + clobbering_var + ".*") and exists(run.getInScopeEnvVarExpr(clobbering_var)) and run.getScript().getAStmt() = workflow_cmd_stmt and - clobbered_value = - trimQuotes(workflow_cmd_stmt.regexpCapture(".*::set-output\\s+name=.*::(.*)", 1)) + exists(trimQuotes(workflow_cmd_stmt.regexpCapture(".*::set-output\\s+name=.*::(.*)", 1))) ) } } diff --git a/actions/ql/lib/codeql/actions/security/UseOfUnversionedImmutableAction.qll b/actions/ql/lib/codeql/actions/security/UseOfUnversionedImmutableAction.qll index ef258fce2e5c..8595cd1086d6 100644 --- a/actions/ql/lib/codeql/actions/security/UseOfUnversionedImmutableAction.qll +++ b/actions/ql/lib/codeql/actions/security/UseOfUnversionedImmutableAction.qll @@ -1,10 +1,8 @@ import actions class UnversionedImmutableAction extends UsesStep { - string immutable_action; - UnversionedImmutableAction() { - isImmutableAction(this, immutable_action) and + isImmutableAction(this, _) and not isSemVer(this.getVersion()) } } diff --git a/actions/ql/src/experimental/Security/CWE-829/ArtifactPoisoningPathTraversal.ql b/actions/ql/src/experimental/Security/CWE-829/ArtifactPoisoningPathTraversal.ql index 519437ddb229..517a9d1eaad7 100644 --- a/actions/ql/src/experimental/Security/CWE-829/ArtifactPoisoningPathTraversal.ql +++ b/actions/ql/src/experimental/Security/CWE-829/ArtifactPoisoningPathTraversal.ql @@ -37,8 +37,6 @@ where ) or // upload artifact is not used in the same workflow - not exists(UsesStep upload | - download.getEnclosingWorkflow().getAJob().(LocalJob).getAStep() = upload - ) + not download.getEnclosingWorkflow().getAJob().(LocalJob).getAStep() instanceof UsesStep ) select download, "Potential artifact poisoning" From bea8502cc5cdc572bfcaf205744988db5266e818 Mon Sep 17 00:00:00 2001 From: Joe Farebrother Date: Mon, 30 Jun 2025 10:21:31 +0100 Subject: [PATCH 039/308] Move missing/multiple calls to init/del queries to folder --- .../CallsToInitDel/MethodCallOrder.qll | 77 +++++++++++++++++++ .../{ => CallsToInitDel}/MissingCallToDel.py | 0 .../MissingCallToDel.qhelp | 0 .../{ => CallsToInitDel}/MissingCallToDel.ql | 0 .../{ => CallsToInitDel}/MissingCallToInit.py | 0 .../MissingCallToInit.qhelp | 0 .../{ => CallsToInitDel}/MissingCallToInit.ql | 0 .../SuperclassDelCalledMultipleTimes.py | 0 .../SuperclassDelCalledMultipleTimes.qhelp | 0 .../SuperclassDelCalledMultipleTimes.ql | 0 .../SuperclassDelCalledMultipleTimes2.py | 0 .../SuperclassInitCalledMultipleTimes.py | 0 .../SuperclassInitCalledMultipleTimes.qhelp | 0 .../SuperclassInitCalledMultipleTimes.ql | 0 .../SuperclassInitCalledMultipleTimes2.py | 0 python/ql/src/Classes/MethodCallOrder.qll | 2 + 16 files changed, 79 insertions(+) create mode 100644 python/ql/src/Classes/CallsToInitDel/MethodCallOrder.qll rename python/ql/src/Classes/{ => CallsToInitDel}/MissingCallToDel.py (100%) rename python/ql/src/Classes/{ => CallsToInitDel}/MissingCallToDel.qhelp (100%) rename python/ql/src/Classes/{ => CallsToInitDel}/MissingCallToDel.ql (100%) rename python/ql/src/Classes/{ => CallsToInitDel}/MissingCallToInit.py (100%) rename python/ql/src/Classes/{ => CallsToInitDel}/MissingCallToInit.qhelp (100%) rename python/ql/src/Classes/{ => CallsToInitDel}/MissingCallToInit.ql (100%) rename python/ql/src/Classes/{ => CallsToInitDel}/SuperclassDelCalledMultipleTimes.py (100%) rename python/ql/src/Classes/{ => CallsToInitDel}/SuperclassDelCalledMultipleTimes.qhelp (100%) rename python/ql/src/Classes/{ => CallsToInitDel}/SuperclassDelCalledMultipleTimes.ql (100%) rename python/ql/src/Classes/{ => CallsToInitDel}/SuperclassDelCalledMultipleTimes2.py (100%) rename python/ql/src/Classes/{ => CallsToInitDel}/SuperclassInitCalledMultipleTimes.py (100%) rename python/ql/src/Classes/{ => CallsToInitDel}/SuperclassInitCalledMultipleTimes.qhelp (100%) rename python/ql/src/Classes/{ => CallsToInitDel}/SuperclassInitCalledMultipleTimes.ql (100%) rename python/ql/src/Classes/{ => CallsToInitDel}/SuperclassInitCalledMultipleTimes2.py (100%) diff --git a/python/ql/src/Classes/CallsToInitDel/MethodCallOrder.qll b/python/ql/src/Classes/CallsToInitDel/MethodCallOrder.qll new file mode 100644 index 000000000000..b911ee0183e1 --- /dev/null +++ b/python/ql/src/Classes/CallsToInitDel/MethodCallOrder.qll @@ -0,0 +1,77 @@ +deprecated module; + +import python + +// Helper predicates for multiple call to __init__/__del__ queries. +pragma[noinline] +private predicate multiple_invocation_paths_helper( + FunctionInvocation top, FunctionInvocation i1, FunctionInvocation i2, FunctionObject multi +) { + i1 != i2 and + i1 = top.getACallee+() and + i2 = top.getACallee+() and + i1.getFunction() = multi +} + +pragma[noinline] +private predicate multiple_invocation_paths( + FunctionInvocation top, FunctionInvocation i1, FunctionInvocation i2, FunctionObject multi +) { + multiple_invocation_paths_helper(top, i1, i2, multi) and + i2.getFunction() = multi +} + +/** Holds if `self.name` calls `multi` by multiple paths, and thus calls it more than once. */ +predicate multiple_calls_to_superclass_method(ClassObject self, FunctionObject multi, string name) { + exists(FunctionInvocation top, FunctionInvocation i1, FunctionInvocation i2 | + multiple_invocation_paths(top, i1, i2, multi) and + top.runtime(self.declaredAttribute(name)) and + self.getASuperType().declaredAttribute(name) = multi + | + // Only called twice if called from different functions, + // or if one call-site can reach the other. + i1.getCall().getScope() != i2.getCall().getScope() + or + i1.getCall().strictlyReaches(i2.getCall()) + ) +} + +/** Holds if all attributes called `name` can be inferred to be methods. */ +private predicate named_attributes_not_method(ClassObject cls, string name) { + cls.declaresAttribute(name) and not cls.declaredAttribute(name) instanceof FunctionObject +} + +/** Holds if `f` actually does something. */ +private predicate does_something(FunctionObject f) { + f.isBuiltin() and not f = theObjectType().lookupAttribute("__init__") + or + exists(Stmt s | s = f.getFunction().getAStmt() and not s instanceof Pass) +} + +/** Holds if `meth` looks like it should have a call to `name`, but does not */ +private predicate missing_call(FunctionObject meth, string name) { + exists(CallNode call, AttrNode attr | + call.getScope() = meth.getFunction() and + call.getFunction() = attr and + attr.getName() = name and + not exists(FunctionObject f | f.getACall() = call) + ) +} + +/** Holds if `self.name` does not call `missing`, even though it is expected to. */ +predicate missing_call_to_superclass_method( + ClassObject self, FunctionObject top, FunctionObject missing, string name +) { + missing = self.getASuperType().declaredAttribute(name) and + top = self.lookupAttribute(name) and + /* There is no call to missing originating from top */ + not top.getACallee*() = missing and + /* Make sure that all named 'methods' are objects that we can understand. */ + not exists(ClassObject sup | + sup = self.getAnImproperSuperType() and + named_attributes_not_method(sup, name) + ) and + not self.isAbstract() and + does_something(missing) and + not missing_call(top, name) +} diff --git a/python/ql/src/Classes/MissingCallToDel.py b/python/ql/src/Classes/CallsToInitDel/MissingCallToDel.py similarity index 100% rename from python/ql/src/Classes/MissingCallToDel.py rename to python/ql/src/Classes/CallsToInitDel/MissingCallToDel.py diff --git a/python/ql/src/Classes/MissingCallToDel.qhelp b/python/ql/src/Classes/CallsToInitDel/MissingCallToDel.qhelp similarity index 100% rename from python/ql/src/Classes/MissingCallToDel.qhelp rename to python/ql/src/Classes/CallsToInitDel/MissingCallToDel.qhelp diff --git a/python/ql/src/Classes/MissingCallToDel.ql b/python/ql/src/Classes/CallsToInitDel/MissingCallToDel.ql similarity index 100% rename from python/ql/src/Classes/MissingCallToDel.ql rename to python/ql/src/Classes/CallsToInitDel/MissingCallToDel.ql diff --git a/python/ql/src/Classes/MissingCallToInit.py b/python/ql/src/Classes/CallsToInitDel/MissingCallToInit.py similarity index 100% rename from python/ql/src/Classes/MissingCallToInit.py rename to python/ql/src/Classes/CallsToInitDel/MissingCallToInit.py diff --git a/python/ql/src/Classes/MissingCallToInit.qhelp b/python/ql/src/Classes/CallsToInitDel/MissingCallToInit.qhelp similarity index 100% rename from python/ql/src/Classes/MissingCallToInit.qhelp rename to python/ql/src/Classes/CallsToInitDel/MissingCallToInit.qhelp diff --git a/python/ql/src/Classes/MissingCallToInit.ql b/python/ql/src/Classes/CallsToInitDel/MissingCallToInit.ql similarity index 100% rename from python/ql/src/Classes/MissingCallToInit.ql rename to python/ql/src/Classes/CallsToInitDel/MissingCallToInit.ql diff --git a/python/ql/src/Classes/SuperclassDelCalledMultipleTimes.py b/python/ql/src/Classes/CallsToInitDel/SuperclassDelCalledMultipleTimes.py similarity index 100% rename from python/ql/src/Classes/SuperclassDelCalledMultipleTimes.py rename to python/ql/src/Classes/CallsToInitDel/SuperclassDelCalledMultipleTimes.py diff --git a/python/ql/src/Classes/SuperclassDelCalledMultipleTimes.qhelp b/python/ql/src/Classes/CallsToInitDel/SuperclassDelCalledMultipleTimes.qhelp similarity index 100% rename from python/ql/src/Classes/SuperclassDelCalledMultipleTimes.qhelp rename to python/ql/src/Classes/CallsToInitDel/SuperclassDelCalledMultipleTimes.qhelp diff --git a/python/ql/src/Classes/SuperclassDelCalledMultipleTimes.ql b/python/ql/src/Classes/CallsToInitDel/SuperclassDelCalledMultipleTimes.ql similarity index 100% rename from python/ql/src/Classes/SuperclassDelCalledMultipleTimes.ql rename to python/ql/src/Classes/CallsToInitDel/SuperclassDelCalledMultipleTimes.ql diff --git a/python/ql/src/Classes/SuperclassDelCalledMultipleTimes2.py b/python/ql/src/Classes/CallsToInitDel/SuperclassDelCalledMultipleTimes2.py similarity index 100% rename from python/ql/src/Classes/SuperclassDelCalledMultipleTimes2.py rename to python/ql/src/Classes/CallsToInitDel/SuperclassDelCalledMultipleTimes2.py diff --git a/python/ql/src/Classes/SuperclassInitCalledMultipleTimes.py b/python/ql/src/Classes/CallsToInitDel/SuperclassInitCalledMultipleTimes.py similarity index 100% rename from python/ql/src/Classes/SuperclassInitCalledMultipleTimes.py rename to python/ql/src/Classes/CallsToInitDel/SuperclassInitCalledMultipleTimes.py diff --git a/python/ql/src/Classes/SuperclassInitCalledMultipleTimes.qhelp b/python/ql/src/Classes/CallsToInitDel/SuperclassInitCalledMultipleTimes.qhelp similarity index 100% rename from python/ql/src/Classes/SuperclassInitCalledMultipleTimes.qhelp rename to python/ql/src/Classes/CallsToInitDel/SuperclassInitCalledMultipleTimes.qhelp diff --git a/python/ql/src/Classes/SuperclassInitCalledMultipleTimes.ql b/python/ql/src/Classes/CallsToInitDel/SuperclassInitCalledMultipleTimes.ql similarity index 100% rename from python/ql/src/Classes/SuperclassInitCalledMultipleTimes.ql rename to python/ql/src/Classes/CallsToInitDel/SuperclassInitCalledMultipleTimes.ql diff --git a/python/ql/src/Classes/SuperclassInitCalledMultipleTimes2.py b/python/ql/src/Classes/CallsToInitDel/SuperclassInitCalledMultipleTimes2.py similarity index 100% rename from python/ql/src/Classes/SuperclassInitCalledMultipleTimes2.py rename to python/ql/src/Classes/CallsToInitDel/SuperclassInitCalledMultipleTimes2.py diff --git a/python/ql/src/Classes/MethodCallOrder.qll b/python/ql/src/Classes/MethodCallOrder.qll index 620cb8028780..b911ee0183e1 100644 --- a/python/ql/src/Classes/MethodCallOrder.qll +++ b/python/ql/src/Classes/MethodCallOrder.qll @@ -1,3 +1,5 @@ +deprecated module; + import python // Helper predicates for multiple call to __init__/__del__ queries. From 38af3ac92567d257cbb0faaf9ebbfeb361dd583b Mon Sep 17 00:00:00 2001 From: Joe Farebrother Date: Mon, 30 Jun 2025 16:21:17 +0100 Subject: [PATCH 040/308] Update missing call to init --- .../CallsToInitDel/MethodCallOrder.qll | 99 +++++++++++++------ .../CallsToInitDel/MissingCallToInit.ql | 31 +++--- 2 files changed, 86 insertions(+), 44 deletions(-) diff --git a/python/ql/src/Classes/CallsToInitDel/MethodCallOrder.qll b/python/ql/src/Classes/CallsToInitDel/MethodCallOrder.qll index b911ee0183e1..b14c6138015f 100644 --- a/python/ql/src/Classes/CallsToInitDel/MethodCallOrder.qll +++ b/python/ql/src/Classes/CallsToInitDel/MethodCallOrder.qll @@ -1,6 +1,8 @@ -deprecated module; +/** Definitions for reasoning about multiple or missing calls to superclass methods. */ import python +import semmle.python.ApiGraphs +import semmle.python.dataflow.new.internal.DataFlowDispatch // Helper predicates for multiple call to __init__/__del__ queries. pragma[noinline] @@ -36,42 +38,77 @@ predicate multiple_calls_to_superclass_method(ClassObject self, FunctionObject m ) } -/** Holds if all attributes called `name` can be inferred to be methods. */ -private predicate named_attributes_not_method(ClassObject cls, string name) { - cls.declaresAttribute(name) and not cls.declaredAttribute(name) instanceof FunctionObject +predicate nonTrivial(Function meth) { + exists(Stmt s | s = meth.getAStmt() | + not s instanceof Pass and + not exists(DataFlow::Node call | call.asExpr() = s.(ExprStmt).getValue() | + superCall(call, meth.getName()) + or + callsMethodOnClassWithSelf(meth, call, _, meth.getName()) + ) + ) and + exists(meth.getANormalExit()) // doesn't always raise an exception } -/** Holds if `f` actually does something. */ -private predicate does_something(FunctionObject f) { - f.isBuiltin() and not f = theObjectType().lookupAttribute("__init__") - or - exists(Stmt s | s = f.getFunction().getAStmt() and not s instanceof Pass) +predicate superCall(DataFlow::MethodCallNode call, string name) { + exists(DataFlow::Node sup | + call.calls(sup, name) and + sup = API::builtin("super").getACall() + ) } -/** Holds if `meth` looks like it should have a call to `name`, but does not */ -private predicate missing_call(FunctionObject meth, string name) { - exists(CallNode call, AttrNode attr | - call.getScope() = meth.getFunction() and - call.getFunction() = attr and - attr.getName() = name and - not exists(FunctionObject f | f.getACall() = call) +predicate callsSuper(Function meth) { + exists(DataFlow::MethodCallNode call | + call.getScope() = meth and + superCall(call, meth.getName()) ) } -/** Holds if `self.name` does not call `missing`, even though it is expected to. */ -predicate missing_call_to_superclass_method( - ClassObject self, FunctionObject top, FunctionObject missing, string name +predicate callsMethodOnClassWithSelf( + Function meth, DataFlow::MethodCallNode call, Class target, string name ) { - missing = self.getASuperType().declaredAttribute(name) and - top = self.lookupAttribute(name) and - /* There is no call to missing originating from top */ - not top.getACallee*() = missing and - /* Make sure that all named 'methods' are objects that we can understand. */ - not exists(ClassObject sup | - sup = self.getAnImproperSuperType() and - named_attributes_not_method(sup, name) - ) and - not self.isAbstract() and - does_something(missing) and - not missing_call(top, name) + exists(DataFlow::Node callTarget, DataFlow::ParameterNode self | + call.calls(callTarget, name) and + self.getParameter() = meth.getArg(0) and + self.(DataFlow::LocalSourceNode).flowsTo(call.getArg(0)) and + callTarget = classTracker(target) + ) +} + +predicate callsMethodOnUnknownClassWithSelf(Function meth, string name) { + exists(DataFlow::MethodCallNode call, DataFlow::Node callTarget, DataFlow::ParameterNode self | + call.calls(callTarget, name) and + self.getParameter() = meth.getArg(0) and + self.(DataFlow::LocalSourceNode).flowsTo(call.getArg(0)) and + not exists(Class target | callTarget = classTracker(target)) + ) +} + +predicate mayProceedInMro(Class a, Class b, Class mroStart) { + b = getNextClassInMroKnownStartingClass(a, mroStart) + or + exists(Class mid | + mid = getNextClassInMroKnownStartingClass(a, mroStart) and + mayProceedInMro(mid, b, mroStart) + ) +} + +predicate missingCallToSuperclassMethod( + Function base, Function shouldCall, Class mroStart, string name +) { + base.getName() = name and + shouldCall.getName() = name and + not callsSuper(base) and + not callsMethodOnUnknownClassWithSelf(base, name) and + nonTrivial(shouldCall) and + base.getScope() = getADirectSuperclass*(mroStart) and + mayProceedInMro(base.getScope(), shouldCall.getScope(), mroStart) and + not exists(Class called | + ( + callsMethodOnClassWithSelf(base, _, called, name) + or + callsMethodOnClassWithSelf(findFunctionAccordingToMro(mroStart, name), _, called, name) + ) and + shouldCall.getScope() = getADirectSuperclass*(called) + ) } diff --git a/python/ql/src/Classes/CallsToInitDel/MissingCallToInit.ql b/python/ql/src/Classes/CallsToInitDel/MissingCallToInit.ql index 4f5d3d90e84a..a8f1c5b6179c 100644 --- a/python/ql/src/Classes/CallsToInitDel/MissingCallToInit.ql +++ b/python/ql/src/Classes/CallsToInitDel/MissingCallToInit.ql @@ -1,5 +1,5 @@ /** - * @name Missing call to `__init__` during object initialization + * @name Missing call to superclass `__init__` during object initialization * @description An omitted call to a super-class `__init__` method may lead to objects of this class not being fully initialized. * @kind problem * @tags quality @@ -14,16 +14,21 @@ import python import MethodCallOrder -from ClassObject self, FunctionObject initializer, FunctionObject missing +predicate missingCallToSuperclassInit(Function base, Function shouldCall, Class mroStart) { + missingCallToSuperclassMethod(base, shouldCall, mroStart, "__init__") +} + +from Function base, Function shouldCall, Class mroStart, string msg where - self.lookupAttribute("__init__") = initializer and - missing_call_to_superclass_method(self, initializer, missing, "__init__") and - // If a superclass is incorrect, don't flag this class as well. - not missing_call_to_superclass_method(self.getASuperType(), _, missing, "__init__") and - not missing.neverReturns() and - not self.failedInference() and - not missing.isBuiltin() and - not self.isAbstract() -select self, - "Class " + self.getName() + " may not be initialized properly as $@ is not called from its $@.", - missing, missing.descriptiveString(), initializer, "__init__ method" + missingCallToSuperclassInit(base, shouldCall, mroStart) and + ( + // Simple case: the method that should be called is directly overridden + mroStart = base.getScope() and + msg = "This initialization method does not call $@, which may leave $@ partially initialized." + or + // Only alert for a different mro base if there are no alerts for direct overrides + not missingCallToSuperclassInit(base, _, base.getScope()) and + msg = + "This initialization method does not call $@, which follows it in the MRO of $@, leaving it partially initialized." + ) +select base, msg, shouldCall, shouldCall.getQualifiedName(), mroStart, mroStart.getName() From a02016a95f6555f93a51ee86bab7d437654f0567 Mon Sep 17 00:00:00 2001 From: Joe Farebrother Date: Mon, 30 Jun 2025 16:59:51 +0100 Subject: [PATCH 041/308] Add missing call to del --- .../CallsToInitDel/MissingCallToDel.ql | 29 ++++++++++++------- .../CallsToInitDel/MissingCallToInit.ql | 2 +- 2 files changed, 20 insertions(+), 11 deletions(-) diff --git a/python/ql/src/Classes/CallsToInitDel/MissingCallToDel.ql b/python/ql/src/Classes/CallsToInitDel/MissingCallToDel.ql index be49dc48b5f4..1c0bf6f6ec4a 100644 --- a/python/ql/src/Classes/CallsToInitDel/MissingCallToDel.ql +++ b/python/ql/src/Classes/CallsToInitDel/MissingCallToDel.ql @@ -1,6 +1,6 @@ /** - * @name Missing call to `__del__` during object destruction - * @description An omitted call to a super-class `__del__` method may lead to class instances not being cleaned up properly. + * @name Missing call to superclass `__del__` during object destruction + * @description An omitted call to a superclass `__del__` method may lead to class instances not being cleaned up properly. * @kind problem * @tags quality * reliability @@ -15,12 +15,21 @@ import python import MethodCallOrder -from ClassObject self, FunctionObject missing +predicate missingCallToSuperclassDel(Function base, Function shouldCall, Class mroStart) { + missingCallToSuperclassMethod(base, shouldCall, mroStart, "__del__") +} + +from Function base, Function shouldCall, Class mroStart, string msg where - missing_call_to_superclass_method(self, _, missing, "__del__") and - not missing.neverReturns() and - not self.failedInference() and - not missing.isBuiltin() -select self, - "Class " + self.getName() + " may not be cleaned up properly as $@ is not called during deletion.", - missing, missing.descriptiveString() + missingCallToSuperclassDel(base, shouldCall, mroStart) and + ( + // Simple case: the method that should be called is directly overridden + mroStart = base.getScope() and + msg = "This deletion method does not call $@, which may leave $@ not properly cleaned up." + or + // Only alert for a different mro base if there are no alerts for direct overrides + not missingCallToSuperclassDel(base, _, base.getScope()) and + msg = + "This deletion method does not call $@, which follows it in the MRO of $@, leaving it not properly cleaned up." + ) +select base, msg, shouldCall, shouldCall.getQualifiedName(), mroStart, mroStart.getName() diff --git a/python/ql/src/Classes/CallsToInitDel/MissingCallToInit.ql b/python/ql/src/Classes/CallsToInitDel/MissingCallToInit.ql index a8f1c5b6179c..9adcad3e46a1 100644 --- a/python/ql/src/Classes/CallsToInitDel/MissingCallToInit.ql +++ b/python/ql/src/Classes/CallsToInitDel/MissingCallToInit.ql @@ -1,6 +1,6 @@ /** * @name Missing call to superclass `__init__` during object initialization - * @description An omitted call to a super-class `__init__` method may lead to objects of this class not being fully initialized. + * @description An omitted call to a superclass `__init__` method may lead to objects of this class not being fully initialized. * @kind problem * @tags quality * reliability From d0daacd17eaea0adf2e9294dff4d11e3ec2e79c7 Mon Sep 17 00:00:00 2001 From: Joe Farebrother Date: Tue, 1 Jul 2025 11:25:06 +0100 Subject: [PATCH 042/308] Modernize multple calls to init/del --- .../new/internal/DataFlowDispatch.qll | 13 +++-- .../CallsToInitDel/MethodCallOrder.qll | 49 +++++++++---------- .../SuperclassDelCalledMultipleTimes.ql | 27 +++++----- .../SuperclassInitCalledMultipleTimes.ql | 28 +++++------ 4 files changed, 59 insertions(+), 58 deletions(-) diff --git a/python/ql/lib/semmle/python/dataflow/new/internal/DataFlowDispatch.qll b/python/ql/lib/semmle/python/dataflow/new/internal/DataFlowDispatch.qll index 781023a9658b..c717cd7bc97b 100644 --- a/python/ql/lib/semmle/python/dataflow/new/internal/DataFlowDispatch.qll +++ b/python/ql/lib/semmle/python/dataflow/new/internal/DataFlowDispatch.qll @@ -856,9 +856,14 @@ Class getNextClassInMroKnownStartingClass(Class cls, Class startingClass) { ) } -private Function findFunctionAccordingToMroKnownStartingClass( - Class cls, Class startingClass, string name -) { +/** + * Gets a potential definition of the function `name` of the class `cls` according to our approximation of + * MRO for the class `startingCls` (see `getNextClassInMroKnownStartingClass` for more information). + * + * Note: this is almost the same as `findFunctionAccordingToMro`, except we know the + * `startingClass`, which can give slightly more precise results. + */ +Function findFunctionAccordingToMroKnownStartingClass(Class cls, Class startingClass, string name) { result = cls.getAMethod() and result.getName() = name and cls = getADirectSuperclass*(startingClass) @@ -871,7 +876,7 @@ private Function findFunctionAccordingToMroKnownStartingClass( /** * Gets a potential definition of the function `name` according to our approximation of - * MRO for the class `cls` (see `getNextClassInMroKnownStartingClass` for more information). + * MRO for the class `startingCls` (see `getNextClassInMroKnownStartingClass` for more information). * * Note: this is almost the same as `findFunctionAccordingToMro`, except we know the * `startingClass`, which can give slightly more precise results. diff --git a/python/ql/src/Classes/CallsToInitDel/MethodCallOrder.qll b/python/ql/src/Classes/CallsToInitDel/MethodCallOrder.qll index b14c6138015f..253360bf2275 100644 --- a/python/ql/src/Classes/CallsToInitDel/MethodCallOrder.qll +++ b/python/ql/src/Classes/CallsToInitDel/MethodCallOrder.qll @@ -4,37 +4,32 @@ import python import semmle.python.ApiGraphs import semmle.python.dataflow.new.internal.DataFlowDispatch -// Helper predicates for multiple call to __init__/__del__ queries. -pragma[noinline] -private predicate multiple_invocation_paths_helper( - FunctionInvocation top, FunctionInvocation i1, FunctionInvocation i2, FunctionObject multi -) { - i1 != i2 and - i1 = top.getACallee+() and - i2 = top.getACallee+() and - i1.getFunction() = multi -} - -pragma[noinline] -private predicate multiple_invocation_paths( - FunctionInvocation top, FunctionInvocation i1, FunctionInvocation i2, FunctionObject multi -) { - multiple_invocation_paths_helper(top, i1, i2, multi) and - i2.getFunction() = multi +predicate multipleCallsToSuperclassMethod(Function meth, Function calledMulti, string name) { + exists(DataFlow::MethodCallNode call1, DataFlow::MethodCallNode call2, Class cls | + meth.getName() = name and + meth.getScope() = cls and + not call1 = call2 and + calledMulti = getASuperCallTarget(cls, meth, call1) and + calledMulti = getASuperCallTarget(cls, meth, call2) and + nonTrivial(calledMulti) + ) } -/** Holds if `self.name` calls `multi` by multiple paths, and thus calls it more than once. */ -predicate multiple_calls_to_superclass_method(ClassObject self, FunctionObject multi, string name) { - exists(FunctionInvocation top, FunctionInvocation i1, FunctionInvocation i2 | - multiple_invocation_paths(top, i1, i2, multi) and - top.runtime(self.declaredAttribute(name)) and - self.getASuperType().declaredAttribute(name) = multi +Function getASuperCallTarget(Class mroBase, Function meth, DataFlow::MethodCallNode call) { + meth = call.getScope() and + getADirectSuperclass*(mroBase) = meth.getScope() and + call.calls(_, meth.getName()) and + exists(Function target, Class nextMroBase | + (result = target or result = getASuperCallTarget(nextMroBase, target, _)) | - // Only called twice if called from different functions, - // or if one call-site can reach the other. - i1.getCall().getScope() != i2.getCall().getScope() + superCall(call, _) and + nextMroBase = mroBase and + target = + findFunctionAccordingToMroKnownStartingClass(getNextClassInMroKnownStartingClass(meth.getScope(), + mroBase), mroBase, meth.getName()) or - i1.getCall().strictlyReaches(i2.getCall()) + callsMethodOnClassWithSelf(meth, call, nextMroBase, _) and + target = findFunctionAccordingToMro(nextMroBase, meth.getName()) ) } diff --git a/python/ql/src/Classes/CallsToInitDel/SuperclassDelCalledMultipleTimes.ql b/python/ql/src/Classes/CallsToInitDel/SuperclassDelCalledMultipleTimes.ql index 019da4257aa0..d75d948809dc 100644 --- a/python/ql/src/Classes/CallsToInitDel/SuperclassDelCalledMultipleTimes.ql +++ b/python/ql/src/Classes/CallsToInitDel/SuperclassDelCalledMultipleTimes.ql @@ -1,6 +1,6 @@ /** * @name Multiple calls to `__del__` during object destruction - * @description A duplicated call to a super-class `__del__` method may lead to class instances not be cleaned up properly. + * @description A duplicated call to a superclass `__del__` method may lead to class instances not be cleaned up properly. * @kind problem * @tags quality * reliability @@ -14,16 +14,17 @@ import python import MethodCallOrder -from ClassObject self, FunctionObject multi +predicate multipleCallsToSuperclassDel(Function meth, Function calledMulti) { + multipleCallsToSuperclassMethod(meth, calledMulti, "__sel__") +} + +from Function meth, Function calledMulti where - multiple_calls_to_superclass_method(self, multi, "__del__") and - not multiple_calls_to_superclass_method(self.getABaseType(), multi, "__del__") and - not exists(FunctionObject better | - multiple_calls_to_superclass_method(self, better, "__del__") and - better.overrides(multi) - ) and - not self.failedInference() -select self, - "Class " + self.getName() + - " may not be cleaned up properly as $@ may be called multiple times during destruction.", multi, - multi.descriptiveString() + multipleCallsToSuperclassDel(meth, calledMulti) and + // Don't alert for multiple calls to a superclass del when a subclass will do. + not exists(Function subMulti | + multipleCallsToSuperclassDel(meth, subMulti) and + calledMulti.getScope() = getADirectSuperclass+(subMulti.getScope()) + ) +select meth, "This delete method calls $@ multiple times.", calledMulti, + calledMulti.getQualifiedName() diff --git a/python/ql/src/Classes/CallsToInitDel/SuperclassInitCalledMultipleTimes.ql b/python/ql/src/Classes/CallsToInitDel/SuperclassInitCalledMultipleTimes.ql index 6251ef274dac..1f6f61222bfe 100644 --- a/python/ql/src/Classes/CallsToInitDel/SuperclassInitCalledMultipleTimes.ql +++ b/python/ql/src/Classes/CallsToInitDel/SuperclassInitCalledMultipleTimes.ql @@ -1,6 +1,6 @@ /** * @name Multiple calls to `__init__` during object initialization - * @description A duplicated call to a super-class `__init__` method may lead to objects of this class not being properly initialized. + * @description A duplicated call to a superclass `__init__` method may lead to objects of this class not being properly initialized. * @kind problem * @tags quality * reliability @@ -14,17 +14,17 @@ import python import MethodCallOrder -from ClassObject self, FunctionObject multi +predicate multipleCallsToSuperclassInit(Function meth, Function calledMulti) { + multipleCallsToSuperclassMethod(meth, calledMulti, "__init__") +} + +from Function meth, Function calledMulti where - multi != theObjectType().lookupAttribute("__init__") and - multiple_calls_to_superclass_method(self, multi, "__init__") and - not multiple_calls_to_superclass_method(self.getABaseType(), multi, "__init__") and - not exists(FunctionObject better | - multiple_calls_to_superclass_method(self, better, "__init__") and - better.overrides(multi) - ) and - not self.failedInference() -select self, - "Class " + self.getName() + - " may not be initialized properly as $@ may be called multiple times during initialization.", - multi, multi.descriptiveString() + multipleCallsToSuperclassInit(meth, calledMulti) and + // Don't alert for multiple calls to a superclass init when a subclass will do. + not exists(Function subMulti | + multipleCallsToSuperclassInit(meth, subMulti) and + calledMulti.getScope() = getADirectSuperclass+(subMulti.getScope()) + ) +select meth, "This initializer method calls $@ multiple times.", calledMulti, + calledMulti.getQualifiedName() From 4f63528844bcb9ffbf4a0c7bf3d3e5004836a935 Mon Sep 17 00:00:00 2001 From: Joe Farebrother Date: Tue, 1 Jul 2025 11:38:12 +0100 Subject: [PATCH 043/308] Update alert messages --- python/ql/src/Classes/CallsToInitDel/MissingCallToDel.ql | 4 ++-- python/ql/src/Classes/CallsToInitDel/MissingCallToInit.ql | 2 +- .../CallsToInitDel/SuperclassInitCalledMultipleTimes.ql | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/python/ql/src/Classes/CallsToInitDel/MissingCallToDel.ql b/python/ql/src/Classes/CallsToInitDel/MissingCallToDel.ql index 1c0bf6f6ec4a..4cc72ee9facd 100644 --- a/python/ql/src/Classes/CallsToInitDel/MissingCallToDel.ql +++ b/python/ql/src/Classes/CallsToInitDel/MissingCallToDel.ql @@ -25,11 +25,11 @@ where ( // Simple case: the method that should be called is directly overridden mroStart = base.getScope() and - msg = "This deletion method does not call $@, which may leave $@ not properly cleaned up." + msg = "This delete method does not call $@, which may leave $@ not properly cleaned up." or // Only alert for a different mro base if there are no alerts for direct overrides not missingCallToSuperclassDel(base, _, base.getScope()) and msg = - "This deletion method does not call $@, which follows it in the MRO of $@, leaving it not properly cleaned up." + "This delete method does not call super().__del__, which may cause $@ to be missed during the cleanup of $@." ) select base, msg, shouldCall, shouldCall.getQualifiedName(), mroStart, mroStart.getName() diff --git a/python/ql/src/Classes/CallsToInitDel/MissingCallToInit.ql b/python/ql/src/Classes/CallsToInitDel/MissingCallToInit.ql index 9adcad3e46a1..56c6bd258cd2 100644 --- a/python/ql/src/Classes/CallsToInitDel/MissingCallToInit.ql +++ b/python/ql/src/Classes/CallsToInitDel/MissingCallToInit.ql @@ -29,6 +29,6 @@ where // Only alert for a different mro base if there are no alerts for direct overrides not missingCallToSuperclassInit(base, _, base.getScope()) and msg = - "This initialization method does not call $@, which follows it in the MRO of $@, leaving it partially initialized." + "This initialization method does not call super().__init__, which may cause $@ to be missed during the initialization of $@." ) select base, msg, shouldCall, shouldCall.getQualifiedName(), mroStart, mroStart.getName() diff --git a/python/ql/src/Classes/CallsToInitDel/SuperclassInitCalledMultipleTimes.ql b/python/ql/src/Classes/CallsToInitDel/SuperclassInitCalledMultipleTimes.ql index 1f6f61222bfe..4f577dc4a764 100644 --- a/python/ql/src/Classes/CallsToInitDel/SuperclassInitCalledMultipleTimes.ql +++ b/python/ql/src/Classes/CallsToInitDel/SuperclassInitCalledMultipleTimes.ql @@ -26,5 +26,5 @@ where multipleCallsToSuperclassInit(meth, subMulti) and calledMulti.getScope() = getADirectSuperclass+(subMulti.getScope()) ) -select meth, "This initializer method calls $@ multiple times.", calledMulti, +select meth, "This initialization method calls $@ multiple times.", calledMulti, calledMulti.getQualifiedName() From 45b5efad25a4138ac18a34d533d17ffa3d637871 Mon Sep 17 00:00:00 2001 From: Joe Farebrother Date: Tue, 1 Jul 2025 16:39:12 +0100 Subject: [PATCH 044/308] Fix FPs and typo --- python/ql/src/Classes/CallsToInitDel/MethodCallOrder.qll | 2 +- .../Classes/CallsToInitDel/SuperclassDelCalledMultipleTimes.ql | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/python/ql/src/Classes/CallsToInitDel/MethodCallOrder.qll b/python/ql/src/Classes/CallsToInitDel/MethodCallOrder.qll index 253360bf2275..5fd28ef9ddf7 100644 --- a/python/ql/src/Classes/CallsToInitDel/MethodCallOrder.qll +++ b/python/ql/src/Classes/CallsToInitDel/MethodCallOrder.qll @@ -8,7 +8,7 @@ predicate multipleCallsToSuperclassMethod(Function meth, Function calledMulti, s exists(DataFlow::MethodCallNode call1, DataFlow::MethodCallNode call2, Class cls | meth.getName() = name and meth.getScope() = cls and - not call1 = call2 and + call1.asExpr() != call2.asExpr() and calledMulti = getASuperCallTarget(cls, meth, call1) and calledMulti = getASuperCallTarget(cls, meth, call2) and nonTrivial(calledMulti) diff --git a/python/ql/src/Classes/CallsToInitDel/SuperclassDelCalledMultipleTimes.ql b/python/ql/src/Classes/CallsToInitDel/SuperclassDelCalledMultipleTimes.ql index d75d948809dc..7aca3dee1892 100644 --- a/python/ql/src/Classes/CallsToInitDel/SuperclassDelCalledMultipleTimes.ql +++ b/python/ql/src/Classes/CallsToInitDel/SuperclassDelCalledMultipleTimes.ql @@ -15,7 +15,7 @@ import python import MethodCallOrder predicate multipleCallsToSuperclassDel(Function meth, Function calledMulti) { - multipleCallsToSuperclassMethod(meth, calledMulti, "__sel__") + multipleCallsToSuperclassMethod(meth, calledMulti, "__del__") } from Function meth, Function calledMulti From 732c8189160dcb2f1c90e85f429d03c8cd3e150c Mon Sep 17 00:00:00 2001 From: Joe Farebrother Date: Wed, 2 Jul 2025 10:09:51 +0100 Subject: [PATCH 045/308] Move tests and add inline expectation postprocessing --- .../query-tests/Classes/missing-del/MissingCallToDel.qlref | 3 ++- .../query-tests/Classes/missing-init/MissingCallToInit.qlref | 3 ++- .../Classes/multiple/SuperclassDelCalledMultipleTimes.qlref | 1 - .../Classes/multiple/SuperclassInitCalledMultipleTimes.qlref | 1 - .../SuperclassDelCalledMultipleTimes.expected | 0 .../multiple-del/SuperclassDelCalledMultipleTimes.qlref | 2 ++ .../Classes/multiple/{ => multiple-del}/multiple_del.py | 0 .../SuperclassInitCalledMultipleTimes.expected | 0 .../multiple-init/SuperclassInitCalledMultipleTimes.qlref | 2 ++ .../Classes/multiple/{ => multiple-init}/multiple_init.py | 2 +- 10 files changed, 9 insertions(+), 5 deletions(-) delete mode 100644 python/ql/test/query-tests/Classes/multiple/SuperclassDelCalledMultipleTimes.qlref delete mode 100644 python/ql/test/query-tests/Classes/multiple/SuperclassInitCalledMultipleTimes.qlref rename python/ql/test/query-tests/Classes/multiple/{ => multiple-del}/SuperclassDelCalledMultipleTimes.expected (100%) create mode 100644 python/ql/test/query-tests/Classes/multiple/multiple-del/SuperclassDelCalledMultipleTimes.qlref rename python/ql/test/query-tests/Classes/multiple/{ => multiple-del}/multiple_del.py (100%) rename python/ql/test/query-tests/Classes/multiple/{ => multiple-init}/SuperclassInitCalledMultipleTimes.expected (100%) create mode 100644 python/ql/test/query-tests/Classes/multiple/multiple-init/SuperclassInitCalledMultipleTimes.qlref rename python/ql/test/query-tests/Classes/multiple/{ => multiple-init}/multiple_init.py (98%) diff --git a/python/ql/test/query-tests/Classes/missing-del/MissingCallToDel.qlref b/python/ql/test/query-tests/Classes/missing-del/MissingCallToDel.qlref index 8bf1811d0fab..b7ff00870542 100644 --- a/python/ql/test/query-tests/Classes/missing-del/MissingCallToDel.qlref +++ b/python/ql/test/query-tests/Classes/missing-del/MissingCallToDel.qlref @@ -1 +1,2 @@ -Classes/MissingCallToDel.ql +query: Classes/CallsToInitDel/MissingCallToDel.ql +postprocess: utils/test/InlineExpectationsTestQuery.ql \ No newline at end of file diff --git a/python/ql/test/query-tests/Classes/missing-init/MissingCallToInit.qlref b/python/ql/test/query-tests/Classes/missing-init/MissingCallToInit.qlref index b8635a5f8d92..86700427963a 100644 --- a/python/ql/test/query-tests/Classes/missing-init/MissingCallToInit.qlref +++ b/python/ql/test/query-tests/Classes/missing-init/MissingCallToInit.qlref @@ -1 +1,2 @@ -Classes/MissingCallToInit.ql +query: Classes/CallsToInitDel/MissingCallToInit.ql +postprocess: utils/test/InlineExpectationsTestQuery.ql \ No newline at end of file diff --git a/python/ql/test/query-tests/Classes/multiple/SuperclassDelCalledMultipleTimes.qlref b/python/ql/test/query-tests/Classes/multiple/SuperclassDelCalledMultipleTimes.qlref deleted file mode 100644 index 560d7b7dc416..000000000000 --- a/python/ql/test/query-tests/Classes/multiple/SuperclassDelCalledMultipleTimes.qlref +++ /dev/null @@ -1 +0,0 @@ -Classes/SuperclassDelCalledMultipleTimes.ql diff --git a/python/ql/test/query-tests/Classes/multiple/SuperclassInitCalledMultipleTimes.qlref b/python/ql/test/query-tests/Classes/multiple/SuperclassInitCalledMultipleTimes.qlref deleted file mode 100644 index 042ddb76904c..000000000000 --- a/python/ql/test/query-tests/Classes/multiple/SuperclassInitCalledMultipleTimes.qlref +++ /dev/null @@ -1 +0,0 @@ -Classes/SuperclassInitCalledMultipleTimes.ql diff --git a/python/ql/test/query-tests/Classes/multiple/SuperclassDelCalledMultipleTimes.expected b/python/ql/test/query-tests/Classes/multiple/multiple-del/SuperclassDelCalledMultipleTimes.expected similarity index 100% rename from python/ql/test/query-tests/Classes/multiple/SuperclassDelCalledMultipleTimes.expected rename to python/ql/test/query-tests/Classes/multiple/multiple-del/SuperclassDelCalledMultipleTimes.expected diff --git a/python/ql/test/query-tests/Classes/multiple/multiple-del/SuperclassDelCalledMultipleTimes.qlref b/python/ql/test/query-tests/Classes/multiple/multiple-del/SuperclassDelCalledMultipleTimes.qlref new file mode 100644 index 000000000000..8fa7d25474b0 --- /dev/null +++ b/python/ql/test/query-tests/Classes/multiple/multiple-del/SuperclassDelCalledMultipleTimes.qlref @@ -0,0 +1,2 @@ +query: Classes/CallsToInitDel/SuperclassDelCalledMultipleTimes.ql +postprocess: utils/test/InlineExpectationsTestQuery.ql \ No newline at end of file diff --git a/python/ql/test/query-tests/Classes/multiple/multiple_del.py b/python/ql/test/query-tests/Classes/multiple/multiple-del/multiple_del.py similarity index 100% rename from python/ql/test/query-tests/Classes/multiple/multiple_del.py rename to python/ql/test/query-tests/Classes/multiple/multiple-del/multiple_del.py diff --git a/python/ql/test/query-tests/Classes/multiple/SuperclassInitCalledMultipleTimes.expected b/python/ql/test/query-tests/Classes/multiple/multiple-init/SuperclassInitCalledMultipleTimes.expected similarity index 100% rename from python/ql/test/query-tests/Classes/multiple/SuperclassInitCalledMultipleTimes.expected rename to python/ql/test/query-tests/Classes/multiple/multiple-init/SuperclassInitCalledMultipleTimes.expected diff --git a/python/ql/test/query-tests/Classes/multiple/multiple-init/SuperclassInitCalledMultipleTimes.qlref b/python/ql/test/query-tests/Classes/multiple/multiple-init/SuperclassInitCalledMultipleTimes.qlref new file mode 100644 index 000000000000..9a2b156acd35 --- /dev/null +++ b/python/ql/test/query-tests/Classes/multiple/multiple-init/SuperclassInitCalledMultipleTimes.qlref @@ -0,0 +1,2 @@ +query: Classes/CallsToInitDel/SuperclassInitCalledMultipleTimes.ql +postprocess: utils/test/InlineExpectationsTestQuery.ql \ No newline at end of file diff --git a/python/ql/test/query-tests/Classes/multiple/multiple_init.py b/python/ql/test/query-tests/Classes/multiple/multiple-init/multiple_init.py similarity index 98% rename from python/ql/test/query-tests/Classes/multiple/multiple_init.py rename to python/ql/test/query-tests/Classes/multiple/multiple-init/multiple_init.py index 6a97ef67f6ca..28dd16eeed1e 100644 --- a/python/ql/test/query-tests/Classes/multiple/multiple_init.py +++ b/python/ql/test/query-tests/Classes/multiple/multiple-init/multiple_init.py @@ -2,7 +2,7 @@ class Base(object): def __init__(self): - pass + print("Base init") class C1(Base): From 99a05ed5a45fe9c05a7e77379904e49abb663289 Mon Sep 17 00:00:00 2001 From: Joe Farebrother Date: Wed, 2 Jul 2025 10:53:28 +0100 Subject: [PATCH 046/308] Update test outputs + fix semantics --- .../CallsToInitDel/MethodCallOrder.qll | 11 +++--- .../SuperclassDelCalledMultipleTimes.expected | 4 +- .../multiple/multiple-del/multiple_del.py | 19 ++++++++-- ...SuperclassInitCalledMultipleTimes.expected | 4 +- .../multiple/multiple-init/multiple_init.py | 38 ++++++++----------- 5 files changed, 40 insertions(+), 36 deletions(-) diff --git a/python/ql/src/Classes/CallsToInitDel/MethodCallOrder.qll b/python/ql/src/Classes/CallsToInitDel/MethodCallOrder.qll index 5fd28ef9ddf7..58330eeb9999 100644 --- a/python/ql/src/Classes/CallsToInitDel/MethodCallOrder.qll +++ b/python/ql/src/Classes/CallsToInitDel/MethodCallOrder.qll @@ -19,17 +19,16 @@ Function getASuperCallTarget(Class mroBase, Function meth, DataFlow::MethodCallN meth = call.getScope() and getADirectSuperclass*(mroBase) = meth.getScope() and call.calls(_, meth.getName()) and - exists(Function target, Class nextMroBase | - (result = target or result = getASuperCallTarget(nextMroBase, target, _)) - | + exists(Function target | (result = target or result = getASuperCallTarget(mroBase, target, _)) | superCall(call, _) and - nextMroBase = mroBase and target = findFunctionAccordingToMroKnownStartingClass(getNextClassInMroKnownStartingClass(meth.getScope(), mroBase), mroBase, meth.getName()) or - callsMethodOnClassWithSelf(meth, call, nextMroBase, _) and - target = findFunctionAccordingToMro(nextMroBase, meth.getName()) + exists(Class called | + callsMethodOnClassWithSelf(meth, call, called, _) and + target = findFunctionAccordingToMroKnownStartingClass(called, mroBase, meth.getName()) + ) ) } diff --git a/python/ql/test/query-tests/Classes/multiple/multiple-del/SuperclassDelCalledMultipleTimes.expected b/python/ql/test/query-tests/Classes/multiple/multiple-del/SuperclassDelCalledMultipleTimes.expected index 210f24c7525d..ad9858397dff 100644 --- a/python/ql/test/query-tests/Classes/multiple/multiple-del/SuperclassDelCalledMultipleTimes.expected +++ b/python/ql/test/query-tests/Classes/multiple/multiple-del/SuperclassDelCalledMultipleTimes.expected @@ -1,2 +1,2 @@ -| multiple_del.py:17:1:17:17 | class Y3 | Class Y3 may not be cleaned up properly as $@ may be called multiple times during destruction. | multiple_del.py:9:5:9:22 | Function __del__ | method Y1.__del__ | -| multiple_del.py:34:1:34:17 | class Z3 | Class Z3 may not be cleaned up properly as $@ may be called multiple times during destruction. | multiple_del.py:26:5:26:22 | Function __del__ | method Z1.__del__ | +| multiple_del.py:21:5:21:22 | Function __del__ | This delete method calls $@ multiple times. | multiple_del.py:9:5:9:22 | Function __del__ | Y1.__del__ | +| multiple_del.py:43:5:43:22 | Function __del__ | This delete method calls $@ multiple times. | multiple_del.py:32:5:32:22 | Function __del__ | Z1.__del__ | diff --git a/python/ql/test/query-tests/Classes/multiple/multiple-del/multiple_del.py b/python/ql/test/query-tests/Classes/multiple/multiple-del/multiple_del.py index 284f6bf6969f..f72e7c5d00ad 100644 --- a/python/ql/test/query-tests/Classes/multiple/multiple-del/multiple_del.py +++ b/python/ql/test/query-tests/Classes/multiple/multiple-del/multiple_del.py @@ -2,37 +2,48 @@ class Base(object): def __del__(self): - pass + print("Base del") class Y1(Base): def __del__(self): + print("Y1 del") super(Y1, self).__del__() class Y2(Base): def __del__(self): + print("Y2 del") super(Y2, self).__del__() #When `type(self) == Y3` this calls `Y1.__del__` class Y3(Y2, Y1): - def __del__(self): + def __del__(self): # $ Alert + print("Y3 del") Y1.__del__(self) Y2.__del__(self) +a = Y3() +del a + #Calling a method multiple times by using explicit calls when a base inherits from other base class Z1(object): def __del__(self): - pass + print("Z1 del") class Z2(Z1): def __del__(self): + print("Z2 del") Z1.__del__(self) class Z3(Z2, Z1): - def __del__(self): + def __del__(self): # $ Alert + print("Z3 del") Z1.__del__(self) Z2.__del__(self) + +b = Z3() +del b diff --git a/python/ql/test/query-tests/Classes/multiple/multiple-init/SuperclassInitCalledMultipleTimes.expected b/python/ql/test/query-tests/Classes/multiple/multiple-init/SuperclassInitCalledMultipleTimes.expected index 04ce8c0f3730..42d019e7f710 100644 --- a/python/ql/test/query-tests/Classes/multiple/multiple-init/SuperclassInitCalledMultipleTimes.expected +++ b/python/ql/test/query-tests/Classes/multiple/multiple-init/SuperclassInitCalledMultipleTimes.expected @@ -1,2 +1,2 @@ -| multiple_init.py:17:1:17:17 | class C3 | Class C3 may not be initialized properly as $@ may be called multiple times during initialization. | multiple_init.py:9:5:9:23 | Function __init__ | method C1.__init__ | -| multiple_init.py:34:1:34:17 | class D3 | Class D3 may not be initialized properly as $@ may be called multiple times during initialization. | multiple_init.py:26:5:26:23 | Function __init__ | method D1.__init__ | +| multiple_init.py:21:5:21:23 | Function __init__ | This initialization method calls $@ multiple times. | multiple_init.py:9:5:9:23 | Function __init__ | C1.__init__ | +| multiple_init.py:42:5:42:23 | Function __init__ | This initialization method calls $@ multiple times. | multiple_init.py:31:5:31:23 | Function __init__ | D1.__init__ | diff --git a/python/ql/test/query-tests/Classes/multiple/multiple-init/multiple_init.py b/python/ql/test/query-tests/Classes/multiple/multiple-init/multiple_init.py index 28dd16eeed1e..cba8b24523fa 100644 --- a/python/ql/test/query-tests/Classes/multiple/multiple-init/multiple_init.py +++ b/python/ql/test/query-tests/Classes/multiple/multiple-init/multiple_init.py @@ -7,70 +7,64 @@ def __init__(self): class C1(Base): def __init__(self): + print("C1 init") super(C1, self).__init__() class C2(Base): def __init__(self): + print("C2 init") super(C2, self).__init__() #When `type(self) == C3` this calls `C1.__init__` class C3(C2, C1): - def __init__(self): + def __init__(self): # $ Alert + print("C3 init") C1.__init__(self) C2.__init__(self) +C3() + #Calling a method multiple times by using explicit calls when a base inherits from other base class D1(object): def __init__(self): - pass + print("D1 init") class D2(D1): def __init__(self): + print("D2 init") D1.__init__(self) class D3(D2, D1): - def __init__(self): + def __init__(self): # $ Alert + print("D3 init") D1.__init__(self) D2.__init__(self) +D3() + #OK to call object.__init__ multiple times class E1(object): def __init__(self): + print("E1 init") super(E1, self).__init__() class E2(object): def __init__(self): + print("E2 init") object.__init__(self) class E3(E2, E1): - def __init__(self): + def __init__(self): # OK: builtin init methods are fine. E1.__init__(self) E2.__init__(self) -#Two invocations, but can only be called once -class F1(Base): - - def __init__(self, cond): - if cond: - Base.__init__(self) - else: - Base.__init__(self) - -#Single call, splitting causes what seems to be multiple invocations. -class F2(Base): - - def __init__(self, cond): - if cond: - pass - if cond: - pass - Base.__init__(self) +E3() From 3c74e12b9ccc327c6d1e1cc1b2df9bf772574550 Mon Sep 17 00:00:00 2001 From: Joe Farebrother Date: Thu, 3 Jul 2025 14:22:04 +0100 Subject: [PATCH 047/308] Change implenetation of missing calls to use getASuperCallTarget, and change alerts to alert on the class and provide clearer information, using optional location links. --- .../CallsToInitDel/MethodCallOrder.qll | 128 +++++++++++++----- .../CallsToInitDel/MissingCallToDel.ql | 42 ++++-- .../CallsToInitDel/MissingCallToInit.ql | 41 +++--- 3 files changed, 146 insertions(+), 65 deletions(-) diff --git a/python/ql/src/Classes/CallsToInitDel/MethodCallOrder.qll b/python/ql/src/Classes/CallsToInitDel/MethodCallOrder.qll index 58330eeb9999..1ebde88083a8 100644 --- a/python/ql/src/Classes/CallsToInitDel/MethodCallOrder.qll +++ b/python/ql/src/Classes/CallsToInitDel/MethodCallOrder.qll @@ -3,32 +3,38 @@ import python import semmle.python.ApiGraphs import semmle.python.dataflow.new.internal.DataFlowDispatch +import codeql.util.Option predicate multipleCallsToSuperclassMethod(Function meth, Function calledMulti, string name) { exists(DataFlow::MethodCallNode call1, DataFlow::MethodCallNode call2, Class cls | meth.getName() = name and meth.getScope() = cls and call1.asExpr() != call2.asExpr() and - calledMulti = getASuperCallTarget(cls, meth, call1) and - calledMulti = getASuperCallTarget(cls, meth, call2) and + calledMulti = getASuperCallTargetFromCall(cls, meth, call1, name) and + calledMulti = getASuperCallTargetFromCall(cls, meth, call2, name) and nonTrivial(calledMulti) ) } -Function getASuperCallTarget(Class mroBase, Function meth, DataFlow::MethodCallNode call) { +Function getASuperCallTargetFromCall( + Class mroBase, Function meth, DataFlow::MethodCallNode call, string name +) { meth = call.getScope() and getADirectSuperclass*(mroBase) = meth.getScope() and - call.calls(_, meth.getName()) and - exists(Function target | (result = target or result = getASuperCallTarget(mroBase, target, _)) | + meth.getName() = name and + call.calls(_, name) and + exists(Class targetCls | result = getASuperCallTargetFromClass(mroBase, targetCls, name) | superCall(call, _) and - target = - findFunctionAccordingToMroKnownStartingClass(getNextClassInMroKnownStartingClass(meth.getScope(), - mroBase), mroBase, meth.getName()) + targetCls = getNextClassInMroKnownStartingClass(meth.getScope(), mroBase) or - exists(Class called | - callsMethodOnClassWithSelf(meth, call, called, _) and - target = findFunctionAccordingToMroKnownStartingClass(called, mroBase, meth.getName()) - ) + callsMethodOnClassWithSelf(meth, call, targetCls, _) + ) +} + +Function getASuperCallTargetFromClass(Class mroBase, Class cls, string name) { + exists(Function target | + target = findFunctionAccordingToMroKnownStartingClass(cls, mroBase, name) and + (result = target or result = getASuperCallTargetFromCall(mroBase, target, _, name)) ) } @@ -78,31 +84,83 @@ predicate callsMethodOnUnknownClassWithSelf(Function meth, string name) { ) } -predicate mayProceedInMro(Class a, Class b, Class mroStart) { - b = getNextClassInMroKnownStartingClass(a, mroStart) - or - exists(Class mid | - mid = getNextClassInMroKnownStartingClass(a, mroStart) and - mayProceedInMro(mid, b, mroStart) - ) -} - -predicate missingCallToSuperclassMethod( - Function base, Function shouldCall, Class mroStart, string name -) { +predicate missingCallToSuperclassMethod(Class base, Function shouldCall, string name) { base.getName() = name and shouldCall.getName() = name and - not callsSuper(base) and - not callsMethodOnUnknownClassWithSelf(base, name) and + base = getADirectSuperclass*(base.getScope()) and + not shouldCall = getASuperCallTargetFromClass(base, base, name) and nonTrivial(shouldCall) and - base.getScope() = getADirectSuperclass*(mroStart) and - mayProceedInMro(base.getScope(), shouldCall.getScope(), mroStart) and - not exists(Class called | - ( - callsMethodOnClassWithSelf(base, _, called, name) - or - callsMethodOnClassWithSelf(findFunctionAccordingToMro(mroStart, name), _, called, name) - ) and - shouldCall.getScope() = getADirectSuperclass*(called) + // "Benefit of the doubt" - if somewhere in the chain we call an unknown superclass, assume all the necessary parent methods are called from it + not callsMethodOnUnknownClassWithSelf(getASuperCallTargetFromClass(base, base, name), name) +} + +predicate missingCallToSuperclassMethodRestricted(Class base, Function shouldCall, string name) { + missingCallToSuperclassMethod(base, shouldCall, name) and + not exists(Class subBase | + subBase = getADirectSubclass+(base) and + missingCallToSuperclassMethod(subBase, shouldCall, name) + ) and + not exists(Function superShouldCall | + superShouldCall.getScope() = getADirectSuperclass+(shouldCall.getScope()) and + missingCallToSuperclassMethod(base, superShouldCall, name) + ) +} + +Function getPossibleMissingSuper(Class base, Function shouldCall, string name) { + missingCallToSuperclassMethod(base, shouldCall, name) and + exists(Function baseMethod | + baseMethod.getScope() = base and + baseMethod.getName() = name and + // the base method calls super, so is presumably expecting every method called in the MRO chain to do so + callsSuper(baseMethod) and + // result is something that does get called in the chain + result = getASuperCallTargetFromClass(base, base, name) and + // it doesn't call super + not callsSuper(result) and + // if it did call super, it would resolve to the missing method + shouldCall = + findFunctionAccordingToMroKnownStartingClass(getNextClassInMroKnownStartingClass(result + .getScope(), base), base, name) ) } + +private module FunctionOption = Option; + +class FunctionOption extends FunctionOption::Option { + /** + * Holds if this element is at the specified location. + * The location spans column `startcolumn` of line `startline` to + * column `endcolumn` of line `endline` in file `filepath`. + * For more information, see + * [Locations](https://codeql.github.com/docs/writing-codeql-queries/providing-locations-in-codeql-queries/). + */ + predicate hasLocationInfo( + string filepath, int startline, int startcolumn, int endline, int endcolumn + ) { + this.asSome() + .getLocation() + .hasLocationInfo(filepath, startline, startcolumn, endline, endcolumn) + or + this.isNone() and + filepath = "" and + startline = 0 and + startcolumn = 0 and + endline = 0 and + endcolumn = 0 + } + + string getQualifiedName() { + result = this.asSome().getQualifiedName() + or + this.isNone() and + result = "" + } +} + +bindingset[name] +FunctionOption getPossibleMissingSuperOption(Class base, Function shouldCall, string name) { + result.asSome() = getPossibleMissingSuper(base, shouldCall, name) + or + not exists(getPossibleMissingSuper(base, shouldCall, name)) and + result.isNone() +} diff --git a/python/ql/src/Classes/CallsToInitDel/MissingCallToDel.ql b/python/ql/src/Classes/CallsToInitDel/MissingCallToDel.ql index 4cc72ee9facd..3d742d45a006 100644 --- a/python/ql/src/Classes/CallsToInitDel/MissingCallToDel.ql +++ b/python/ql/src/Classes/CallsToInitDel/MissingCallToDel.ql @@ -15,21 +15,35 @@ import python import MethodCallOrder -predicate missingCallToSuperclassDel(Function base, Function shouldCall, Class mroStart) { - missingCallToSuperclassMethod(base, shouldCall, mroStart, "__del__") +Function getDelMethod(Class c) { + result = c.getAMethod() and + result.getName() = "__del__" } -from Function base, Function shouldCall, Class mroStart, string msg +from Class base, Function shouldCall, FunctionOption possibleIssue, string msg where - missingCallToSuperclassDel(base, shouldCall, mroStart) and - ( - // Simple case: the method that should be called is directly overridden - mroStart = base.getScope() and - msg = "This delete method does not call $@, which may leave $@ not properly cleaned up." - or - // Only alert for a different mro base if there are no alerts for direct overrides - not missingCallToSuperclassDel(base, _, base.getScope()) and - msg = - "This delete method does not call super().__del__, which may cause $@ to be missed during the cleanup of $@." + not exists(Function newMethod | newMethod = base.getAMethod() and newMethod.getName() = "__new__") and + exists(FunctionOption possiblyMissingSuper | + missingCallToSuperclassMethodRestricted(base, shouldCall, "__del__") and + possiblyMissingSuper = getPossibleMissingSuperOption(base, shouldCall, "__del__") and + ( + not possiblyMissingSuper.isNone() and + possibleIssue = possiblyMissingSuper and + msg = + "This class does not call $@ during destruction. ($@ may be missing a call to super().__del__)" + or + possiblyMissingSuper.isNone() and + ( + possibleIssue.asSome() = getDelMethod(base) and + msg = + "This class does not call $@ during destruction. ($@ may be missing a call to a base class __del__)" + or + not getDelMethod(base) and + possibleIssue.isNone() and + msg = + "This class does not call $@ during destruction. (The class lacks an __del__ method to ensure every base class __del__ is called.)" + ) + ) ) -select base, msg, shouldCall, shouldCall.getQualifiedName(), mroStart, mroStart.getName() +select base, msg, shouldCall, shouldCall.getQualifiedName(), possibleIssue, + possibleIssue.getQualifiedName() diff --git a/python/ql/src/Classes/CallsToInitDel/MissingCallToInit.ql b/python/ql/src/Classes/CallsToInitDel/MissingCallToInit.ql index 56c6bd258cd2..1b13fef46c73 100644 --- a/python/ql/src/Classes/CallsToInitDel/MissingCallToInit.ql +++ b/python/ql/src/Classes/CallsToInitDel/MissingCallToInit.ql @@ -14,21 +14,30 @@ import python import MethodCallOrder -predicate missingCallToSuperclassInit(Function base, Function shouldCall, Class mroStart) { - missingCallToSuperclassMethod(base, shouldCall, mroStart, "__init__") -} - -from Function base, Function shouldCall, Class mroStart, string msg +from Class base, Function shouldCall, FunctionOption possibleIssue, string msg where - missingCallToSuperclassInit(base, shouldCall, mroStart) and - ( - // Simple case: the method that should be called is directly overridden - mroStart = base.getScope() and - msg = "This initialization method does not call $@, which may leave $@ partially initialized." - or - // Only alert for a different mro base if there are no alerts for direct overrides - not missingCallToSuperclassInit(base, _, base.getScope()) and - msg = - "This initialization method does not call super().__init__, which may cause $@ to be missed during the initialization of $@." + not exists(Function newMethod | newMethod = base.getAMethod() and newMethod.getName() = "__new__") and + exists(FunctionOption possiblyMissingSuper | + missingCallToSuperclassMethodRestricted(base, shouldCall, "__init__") and + possiblyMissingSuper = getPossibleMissingSuperOption(base, shouldCall, "__init__") and + ( + not possiblyMissingSuper.isNone() and + possibleIssue = possiblyMissingSuper and + msg = + "This class does not call $@ during initialization. ($@ may be missing a call to super().__init__)" + or + possiblyMissingSuper.isNone() and + ( + possibleIssue.asSome() = base.getInitMethod() and + msg = + "This class does not call $@ during initialization. ($@ may be missing a call to a base class __init__)" + or + not exists(base.getInitMethod()) and + possibleIssue.isNone() and + msg = + "This class does not call $@ during initialization. (The class lacks an __init__ method to ensure every base class __init__ is called.)" + ) + ) ) -select base, msg, shouldCall, shouldCall.getQualifiedName(), mroStart, mroStart.getName() +select base, msg, shouldCall, shouldCall.getQualifiedName(), possibleIssue, + possibleIssue.getQualifiedName() From 9ac95266c7f338ae6336912346298f99e9e9728f Mon Sep 17 00:00:00 2001 From: Joe Farebrother Date: Thu, 3 Jul 2025 15:32:54 +0100 Subject: [PATCH 048/308] Fixes --- python/ql/src/Classes/CallsToInitDel/MethodCallOrder.qll | 3 +-- python/ql/src/Classes/CallsToInitDel/MissingCallToDel.ql | 2 +- python/ql/src/Classes/CallsToInitDel/MissingCallToInit.ql | 3 +-- 3 files changed, 3 insertions(+), 5 deletions(-) diff --git a/python/ql/src/Classes/CallsToInitDel/MethodCallOrder.qll b/python/ql/src/Classes/CallsToInitDel/MethodCallOrder.qll index 1ebde88083a8..f5853e686734 100644 --- a/python/ql/src/Classes/CallsToInitDel/MethodCallOrder.qll +++ b/python/ql/src/Classes/CallsToInitDel/MethodCallOrder.qll @@ -85,9 +85,8 @@ predicate callsMethodOnUnknownClassWithSelf(Function meth, string name) { } predicate missingCallToSuperclassMethod(Class base, Function shouldCall, string name) { - base.getName() = name and shouldCall.getName() = name and - base = getADirectSuperclass*(base.getScope()) and + shouldCall.getScope() = getADirectSuperclass+(base) and not shouldCall = getASuperCallTargetFromClass(base, base, name) and nonTrivial(shouldCall) and // "Benefit of the doubt" - if somewhere in the chain we call an unknown superclass, assume all the necessary parent methods are called from it diff --git a/python/ql/src/Classes/CallsToInitDel/MissingCallToDel.ql b/python/ql/src/Classes/CallsToInitDel/MissingCallToDel.ql index 3d742d45a006..a6ade1f1d312 100644 --- a/python/ql/src/Classes/CallsToInitDel/MissingCallToDel.ql +++ b/python/ql/src/Classes/CallsToInitDel/MissingCallToDel.ql @@ -38,7 +38,7 @@ where msg = "This class does not call $@ during destruction. ($@ may be missing a call to a base class __del__)" or - not getDelMethod(base) and + not exists(getDelMethod(base)) and possibleIssue.isNone() and msg = "This class does not call $@ during destruction. (The class lacks an __del__ method to ensure every base class __del__ is called.)" diff --git a/python/ql/src/Classes/CallsToInitDel/MissingCallToInit.ql b/python/ql/src/Classes/CallsToInitDel/MissingCallToInit.ql index 1b13fef46c73..9081960a75bb 100644 --- a/python/ql/src/Classes/CallsToInitDel/MissingCallToInit.ql +++ b/python/ql/src/Classes/CallsToInitDel/MissingCallToInit.ql @@ -21,8 +21,7 @@ where missingCallToSuperclassMethodRestricted(base, shouldCall, "__init__") and possiblyMissingSuper = getPossibleMissingSuperOption(base, shouldCall, "__init__") and ( - not possiblyMissingSuper.isNone() and - possibleIssue = possiblyMissingSuper and + possibleIssue.asSome() = possiblyMissingSuper.asSome() and msg = "This class does not call $@ during initialization. ($@ may be missing a call to super().__init__)" or From c9932e187a07d718803afa8147cb10568b8e5d1b Mon Sep 17 00:00:00 2001 From: Joe Farebrother Date: Thu, 3 Jul 2025 15:48:52 +0100 Subject: [PATCH 049/308] Update tests for calls to init + fixes --- .../CallsToInitDel/MethodCallOrder.qll | 14 +- .../missing-init/MissingCallToInit.expected | 8 +- .../Classes/missing-init/missing_init.py | 124 +++++++++--------- 3 files changed, 77 insertions(+), 69 deletions(-) diff --git a/python/ql/src/Classes/CallsToInitDel/MethodCallOrder.qll b/python/ql/src/Classes/CallsToInitDel/MethodCallOrder.qll index f5853e686734..191243e03328 100644 --- a/python/ql/src/Classes/CallsToInitDel/MethodCallOrder.qll +++ b/python/ql/src/Classes/CallsToInitDel/MethodCallOrder.qll @@ -95,13 +95,15 @@ predicate missingCallToSuperclassMethod(Class base, Function shouldCall, string predicate missingCallToSuperclassMethodRestricted(Class base, Function shouldCall, string name) { missingCallToSuperclassMethod(base, shouldCall, name) and - not exists(Class subBase | - subBase = getADirectSubclass+(base) and - missingCallToSuperclassMethod(subBase, shouldCall, name) + not exists(Class superBase | + // Alert only on the highest base class that has the issue + superBase = getADirectSuperclass+(base) and + missingCallToSuperclassMethod(superBase, shouldCall, name) ) and - not exists(Function superShouldCall | - superShouldCall.getScope() = getADirectSuperclass+(shouldCall.getScope()) and - missingCallToSuperclassMethod(base, superShouldCall, name) + not exists(Function subShouldCall | + // Mention in the alert only the lowest method we're missing the call to + subShouldCall.getScope() = getADirectSubclass+(shouldCall.getScope()) and + missingCallToSuperclassMethod(base, subShouldCall, name) ) } diff --git a/python/ql/test/query-tests/Classes/missing-init/MissingCallToInit.expected b/python/ql/test/query-tests/Classes/missing-init/MissingCallToInit.expected index 6cb92041a630..90ca4bf49e77 100644 --- a/python/ql/test/query-tests/Classes/missing-init/MissingCallToInit.expected +++ b/python/ql/test/query-tests/Classes/missing-init/MissingCallToInit.expected @@ -1,3 +1,5 @@ -| missing_init.py:12:1:12:13 | class B3 | Class B3 may not be initialized properly as $@ is not called from its $@. | missing_init.py:9:5:9:23 | Function __init__ | method B2.__init__ | missing_init.py:14:5:14:23 | Function __init__ | __init__ method | -| missing_init.py:39:1:39:21 | class IUVT | Class IUVT may not be initialized properly as $@ is not called from its $@. | missing_init.py:30:5:30:23 | Function __init__ | method UT.__init__ | missing_init.py:26:5:26:23 | Function __init__ | __init__ method | -| missing_init.py:72:1:72:13 | class AB | Class AB may not be initialized properly as $@ is not called from its $@. | missing_init.py:69:5:69:23 | Function __init__ | method AA.__init__ | missing_init.py:75:5:75:23 | Function __init__ | __init__ method | +| missing_init.py:14:5:14:23 | Function __init__ | This initialization method does not call $@, which may leave $@ partially initialized. | missing_init.py:9:5:9:23 | Function __init__ | B2.__init__ | missing_init.py:13:1:13:13 | Class B3 | B3 | +| missing_init.py:29:5:29:23 | Function __init__ | This initialization method does not call super().__init__, which may cause $@ to be missed during the initialization of $@. | missing_init.py:33:5:33:23 | Function __init__ | UT.__init__ | missing_init.py:42:1:42:21 | Class IUVT | IUVT | +| missing_init.py:70:5:70:23 | Function __init__ | This initialization method does not call $@, which may leave $@ partially initialized. | missing_init.py:64:5:64:23 | Function __init__ | AA.__init__ | missing_init.py:67:1:67:13 | Class AB | AB | +| missing_init.py:124:9:124:27 | Function __init__ | This initialization method does not call $@, which may leave $@ partially initialized. | missing_init.py:117:5:117:23 | Function __init__ | DA.__init__ | missing_init.py:122:5:122:17 | Class DC | DC | +| missing_init.py:134:5:134:23 | Function __init__ | This initialization method does not call $@, which may leave $@ partially initialized. | missing_init.py:117:5:117:23 | Function __init__ | DA.__init__ | missing_init.py:132:1:132:13 | Class DD | DD | diff --git a/python/ql/test/query-tests/Classes/missing-init/missing_init.py b/python/ql/test/query-tests/Classes/missing-init/missing_init.py index b1651557759f..68c5b1fad7b5 100644 --- a/python/ql/test/query-tests/Classes/missing-init/missing_init.py +++ b/python/ql/test/query-tests/Classes/missing-init/missing_init.py @@ -2,18 +2,21 @@ class B1(object): def __init__(self): - do_something() + print("B1 init") class B2(B1): def __init__(self): + print("B2 init") B1.__init__(self) -class B3(B2): - - def __init__(self): +class B3(B2): # $ Alert + def __init__(self): + print("B3 init") B1.__init__(self) +B3() + #OK if superclass __init__ is builtin as #builtin classes tend to rely on __new__ class MyException(Exception): @@ -23,11 +26,11 @@ def __init__(self): #ODASA-4107 class IUT(object): - def __init__(self): + def __init__(self): print("IUT init") class UT(object): - def __init__(self): + def __init__(self): print("UT init") class PU(object): @@ -36,150 +39,151 @@ class PU(object): class UVT(UT, PU): pass -class IUVT(IUT, UVT): +class IUVT(IUT, UVT): # $ Alert pass -#False positive +print("IUVT") +IUVT() + class M1(object): def __init__(self): - print("A") + print("M1 init") class M2(object): pass class Mult(M2, M1): def __init__(self): - super(Mult, self).__init__() # Calls M1.__init__ - -class X: - def __init__(self): - do_something() - -class Y(X): - @decorated - def __init__(self): - X.__init__(self) + print("Mult init") + super(Mult, self).__init__() # OK - Calls M1.__init__ -class Z(Y): - def __init__(self): - Y.__init__(self) +Mult() class AA(object): def __init__(self): - do_something() + print("AA init") -class AB(AA): +class AB(AA): # $ Alert - #Don't call super class init - def __init__(self): - do_something() + # Doesn't call super class init + def __init__(self): + print("AB init") class AC(AB): def __init__(self): - #Missing call to AA.__init__ but not AC's fault. + # Doesn't call AA init, but we don't alert here as the issue is with AB. + print("AC init") super(AC, self).__init__() +AC() + import six import abc class BA(object): def __init__(self): - do_something() + print("BA init") @six.add_metaclass(abc.ABCMeta) class BB(BA): def __init__(self): + print("BB init") super(BB,self).__init__() +BB() + @six.add_metaclass(abc.ABCMeta) class CA(object): def __init__(self): - do_something() + print("CA init") -class CB(BA): +class CB(CA): def __init__(self): + print("CB init") super(CB,self).__init__() +CB() + #ODASA-5799 class DA(object): def __init__(self): - do_something() + print("DA init") class DB(DA): - class DC(DA): + class DC(DA): # $ SPURIOUS: Alert # We only consider direct super calls, so have an FP here - def __init__(self): + def __init__(self): + print("DC init") sup = super(DB.DC, self) sup.__init__() +DB.DC() + #Simpler variants -class DD(DA): +class DD(DA): # $ SPURIOUS: Alert # We only consider direct super calls, so have an FP here - def __init__(self): + def __init__(self): + print("DD init") sup = super(DD, self) sup.__init__() +DD() + class DE(DA): - class DF(DA): + class DF(DA): # No alert here - def __init__(self): + def __init__(self): + print("DF init") sup = super(DE.DF, self).__init__() +DE.DF() + class FA(object): def __init__(self): - pass + pass # does nothing, thus is considered a trivial method and ok to not call class FB(object): def __init__(self): - do_something() + print("FB init") class FC(FA, FB): def __init__(self): - #OK to skip call to FA.__init__ as that does nothing. + # No alert here - ok to skip call to trivial FA init FB.__init__(self) #Potential false positives. class ConfusingInit(B1): - def __init__(self): + def __init__(self): # We track this correctly and don't alert. super_call = super(ConfusingInit, self).__init__ super_call() -# Library class -import collections - -class G1(collections.Counter): - +class G1: def __init__(self): - collections.Counter.__init__(self) - -class G2(G1): + print("G1 init") +class G2: def __init__(self): - super(G2, self).__init__() + print("G2 init") -class G3(collections.Counter): - - def __init__(self): - super(G3, self).__init__() - -class G4(G3): - - def __init__(self): - G3.__init__(self) +class G3(G1, G2): + def __init__(self): + print("G3 init") + for cls in self.__class__.__bases__: + cls.__init__(self) # We dont track which classes this could refer to, but assume it calls all required init methods and don't alert. From 9619ae8a2dc476e7af91ade9ab928af8f11f8994 Mon Sep 17 00:00:00 2001 From: Joe Farebrother Date: Thu, 3 Jul 2025 15:56:28 +0100 Subject: [PATCH 050/308] Add additional test case + update missing del tests --- .../missing-del/MissingCallToDel.expected | 2 +- .../Classes/missing-del/missing_del.py | 9 +++++++-- .../missing-init/MissingCallToInit.expected | 11 ++++++----- .../Classes/missing-init/missing_init.py | 16 ++++++++++++++++ 4 files changed, 30 insertions(+), 8 deletions(-) diff --git a/python/ql/test/query-tests/Classes/missing-del/MissingCallToDel.expected b/python/ql/test/query-tests/Classes/missing-del/MissingCallToDel.expected index 7f080b1d729b..80e02da0e132 100644 --- a/python/ql/test/query-tests/Classes/missing-del/MissingCallToDel.expected +++ b/python/ql/test/query-tests/Classes/missing-del/MissingCallToDel.expected @@ -1 +1 @@ -| missing_del.py:12:1:12:13 | class X3 | Class X3 may not be cleaned up properly as $@ is not called during deletion. | missing_del.py:9:5:9:22 | Function __del__ | method X2.__del__ | +| missing_del.py:13:1:13:13 | Class X3 | This class does not call $@ during destruction. ($@ may be missing a call to a base class __del__) | missing_del.py:9:5:9:22 | Function __del__ | X2.__del__ | missing_del.py:15:5:15:22 | Function __del__ | X3.__del__ | diff --git a/python/ql/test/query-tests/Classes/missing-del/missing_del.py b/python/ql/test/query-tests/Classes/missing-del/missing_del.py index 5d4e30e681d2..6548bb1fa3b4 100644 --- a/python/ql/test/query-tests/Classes/missing-del/missing_del.py +++ b/python/ql/test/query-tests/Classes/missing-del/missing_del.py @@ -2,14 +2,19 @@ class X1(object): def __del__(self): - pass + print("X1 del") class X2(X1): def __del__(self): + print("X2 del") X1.__del__(self) -class X3(X2): +class X3(X2): # $ Alert - skips X2 del def __del__(self): + print("X3 del") X1.__del__(self) + +a = X3() +del a diff --git a/python/ql/test/query-tests/Classes/missing-init/MissingCallToInit.expected b/python/ql/test/query-tests/Classes/missing-init/MissingCallToInit.expected index 90ca4bf49e77..c0f35be3ff9b 100644 --- a/python/ql/test/query-tests/Classes/missing-init/MissingCallToInit.expected +++ b/python/ql/test/query-tests/Classes/missing-init/MissingCallToInit.expected @@ -1,5 +1,6 @@ -| missing_init.py:14:5:14:23 | Function __init__ | This initialization method does not call $@, which may leave $@ partially initialized. | missing_init.py:9:5:9:23 | Function __init__ | B2.__init__ | missing_init.py:13:1:13:13 | Class B3 | B3 | -| missing_init.py:29:5:29:23 | Function __init__ | This initialization method does not call super().__init__, which may cause $@ to be missed during the initialization of $@. | missing_init.py:33:5:33:23 | Function __init__ | UT.__init__ | missing_init.py:42:1:42:21 | Class IUVT | IUVT | -| missing_init.py:70:5:70:23 | Function __init__ | This initialization method does not call $@, which may leave $@ partially initialized. | missing_init.py:64:5:64:23 | Function __init__ | AA.__init__ | missing_init.py:67:1:67:13 | Class AB | AB | -| missing_init.py:124:9:124:27 | Function __init__ | This initialization method does not call $@, which may leave $@ partially initialized. | missing_init.py:117:5:117:23 | Function __init__ | DA.__init__ | missing_init.py:122:5:122:17 | Class DC | DC | -| missing_init.py:134:5:134:23 | Function __init__ | This initialization method does not call $@, which may leave $@ partially initialized. | missing_init.py:117:5:117:23 | Function __init__ | DA.__init__ | missing_init.py:132:1:132:13 | Class DD | DD | +| missing_init.py:13:1:13:13 | Class B3 | This class does not call $@ during initialization. ($@ may be missing a call to a base class __init__) | missing_init.py:9:5:9:23 | Function __init__ | B2.__init__ | missing_init.py:14:5:14:23 | Function __init__ | B3.__init__ | +| missing_init.py:42:1:42:21 | Class IUVT | This class does not call $@ during initialization. (The class lacks an __init__ method to ensure every base class __init__ is called.) | missing_init.py:33:5:33:23 | Function __init__ | UT.__init__ | file://:0:0:0:0 | (none) | | +| missing_init.py:67:1:67:13 | Class AB | This class does not call $@ during initialization. ($@ may be missing a call to a base class __init__) | missing_init.py:64:5:64:23 | Function __init__ | AA.__init__ | missing_init.py:70:5:70:23 | Function __init__ | AB.__init__ | +| missing_init.py:122:5:122:17 | Class DC | This class does not call $@ during initialization. ($@ may be missing a call to a base class __init__) | missing_init.py:117:5:117:23 | Function __init__ | DA.__init__ | missing_init.py:124:9:124:27 | Function __init__ | DB.DC.__init__ | +| missing_init.py:132:1:132:13 | Class DD | This class does not call $@ during initialization. ($@ may be missing a call to a base class __init__) | missing_init.py:117:5:117:23 | Function __init__ | DA.__init__ | missing_init.py:134:5:134:23 | Function __init__ | DD.__init__ | +| missing_init.py:200:1:200:17 | Class H3 | This class does not call $@ during initialization. ($@ may be missing a call to super().__init__) | missing_init.py:197:5:197:23 | Function __init__ | H2.__init__ | missing_init.py:193:5:193:23 | Function __init__ | H1.__init__ | diff --git a/python/ql/test/query-tests/Classes/missing-init/missing_init.py b/python/ql/test/query-tests/Classes/missing-init/missing_init.py index 68c5b1fad7b5..68498765f75f 100644 --- a/python/ql/test/query-tests/Classes/missing-init/missing_init.py +++ b/python/ql/test/query-tests/Classes/missing-init/missing_init.py @@ -187,3 +187,19 @@ def __init__(self): for cls in self.__class__.__bases__: cls.__init__(self) # We dont track which classes this could refer to, but assume it calls all required init methods and don't alert. +G3() + +class H1: + def __init__(self): + print("H1 init") + +class H2: + def __init__(self): + print("H2 init") + +class H3(H1, H2): # $ Alert # The alert should also mention that H1.__init__ may be missing a call to super().__init__ + def __init__(self): + print("H3 init") + super().__init__() + +H3() \ No newline at end of file From 18b949c0a948dd2b03cbaf8bb315e518e653728c Mon Sep 17 00:00:00 2001 From: Joe Farebrother Date: Thu, 3 Jul 2025 16:07:17 +0100 Subject: [PATCH 051/308] Remove case excluding classes with a __new__ method; as it doesn't make much sense (__init__ is still called anyway) --- python/ql/src/Classes/CallsToInitDel/MissingCallToInit.ql | 1 - 1 file changed, 1 deletion(-) diff --git a/python/ql/src/Classes/CallsToInitDel/MissingCallToInit.ql b/python/ql/src/Classes/CallsToInitDel/MissingCallToInit.ql index 9081960a75bb..566d8320a29b 100644 --- a/python/ql/src/Classes/CallsToInitDel/MissingCallToInit.ql +++ b/python/ql/src/Classes/CallsToInitDel/MissingCallToInit.ql @@ -16,7 +16,6 @@ import MethodCallOrder from Class base, Function shouldCall, FunctionOption possibleIssue, string msg where - not exists(Function newMethod | newMethod = base.getAMethod() and newMethod.getName() = "__new__") and exists(FunctionOption possiblyMissingSuper | missingCallToSuperclassMethodRestricted(base, shouldCall, "__init__") and possiblyMissingSuper = getPossibleMissingSuperOption(base, shouldCall, "__init__") and From b4b20d7d3f970a2eec359d3da189c4e86d3863e3 Mon Sep 17 00:00:00 2001 From: Joe Farebrother Date: Fri, 4 Jul 2025 10:30:20 +0100 Subject: [PATCH 052/308] Update multiple calls queries to include call targets in alert message --- .../CallsToInitDel/MethodCallOrder.qll | 38 +++++++++++++++---- .../SuperclassDelCalledMultipleTimes.ql | 33 ++++++++++++---- .../SuperclassInitCalledMultipleTimes.ql | 33 ++++++++++++---- 3 files changed, 81 insertions(+), 23 deletions(-) diff --git a/python/ql/src/Classes/CallsToInitDel/MethodCallOrder.qll b/python/ql/src/Classes/CallsToInitDel/MethodCallOrder.qll index 191243e03328..02d60ca420e0 100644 --- a/python/ql/src/Classes/CallsToInitDel/MethodCallOrder.qll +++ b/python/ql/src/Classes/CallsToInitDel/MethodCallOrder.qll @@ -5,11 +5,14 @@ import semmle.python.ApiGraphs import semmle.python.dataflow.new.internal.DataFlowDispatch import codeql.util.Option -predicate multipleCallsToSuperclassMethod(Function meth, Function calledMulti, string name) { - exists(DataFlow::MethodCallNode call1, DataFlow::MethodCallNode call2, Class cls | +predicate multipleCallsToSuperclassMethod( + Function meth, Function calledMulti, DataFlow::MethodCallNode call1, + DataFlow::MethodCallNode call2, string name +) { + exists(Class cls | meth.getName() = name and meth.getScope() = cls and - call1.asExpr() != call2.asExpr() and + call1.getLocation().toString() < call2.getLocation().toString() and calledMulti = getASuperCallTargetFromCall(cls, meth, call1, name) and calledMulti = getASuperCallTargetFromCall(cls, meth, call2, name) and nonTrivial(calledMulti) @@ -18,23 +21,44 @@ predicate multipleCallsToSuperclassMethod(Function meth, Function calledMulti, s Function getASuperCallTargetFromCall( Class mroBase, Function meth, DataFlow::MethodCallNode call, string name +) { + exists(Function target | target = getDirectSuperCallTargetFromCall(mroBase, meth, call, name) | + result = target + or + result = getASuperCallTargetFromCall(mroBase, target, _, name) + ) +} + +Function getDirectSuperCallTargetFromCall( + Class mroBase, Function meth, DataFlow::MethodCallNode call, string name ) { meth = call.getScope() and getADirectSuperclass*(mroBase) = meth.getScope() and meth.getName() = name and call.calls(_, name) and - exists(Class targetCls | result = getASuperCallTargetFromClass(mroBase, targetCls, name) | + mroBase = getADirectSubclass*(meth.getScope()) and + exists(Class targetCls | + // the differences between 0-arg and 2-arg super is not considered; we assume each super uses the mro of the instance `self` superCall(call, _) and - targetCls = getNextClassInMroKnownStartingClass(meth.getScope(), mroBase) + targetCls = getNextClassInMroKnownStartingClass(meth.getScope(), mroBase) and + result = findFunctionAccordingToMroKnownStartingClass(targetCls, mroBase, name) or - callsMethodOnClassWithSelf(meth, call, targetCls, _) + // targetCls is the mro base for this lookup. + // note however that if the call we find uses super(), that still uses the mro of the instance `self` will sill be used + // assuming it's 0-arg or is 2-arg with `self` as second arg. + callsMethodOnClassWithSelf(meth, call, targetCls, _) and + result = findFunctionAccordingToMroKnownStartingClass(targetCls, targetCls, name) ) } Function getASuperCallTargetFromClass(Class mroBase, Class cls, string name) { exists(Function target | target = findFunctionAccordingToMroKnownStartingClass(cls, mroBase, name) and - (result = target or result = getASuperCallTargetFromCall(mroBase, target, _, name)) + ( + result = target + or + result = getASuperCallTargetFromCall(mroBase, target, _, name) + ) ) } diff --git a/python/ql/src/Classes/CallsToInitDel/SuperclassDelCalledMultipleTimes.ql b/python/ql/src/Classes/CallsToInitDel/SuperclassDelCalledMultipleTimes.ql index 7aca3dee1892..7772aa153730 100644 --- a/python/ql/src/Classes/CallsToInitDel/SuperclassDelCalledMultipleTimes.ql +++ b/python/ql/src/Classes/CallsToInitDel/SuperclassDelCalledMultipleTimes.ql @@ -14,17 +14,34 @@ import python import MethodCallOrder -predicate multipleCallsToSuperclassDel(Function meth, Function calledMulti) { - multipleCallsToSuperclassMethod(meth, calledMulti, "__del__") +predicate multipleCallsToSuperclassDel( + Function meth, Function calledMulti, DataFlow::MethodCallNode call1, + DataFlow::MethodCallNode call2 +) { + multipleCallsToSuperclassMethod(meth, calledMulti, call1, call2, "__del__") } -from Function meth, Function calledMulti +from + Function meth, Function calledMulti, DataFlow::MethodCallNode call1, + DataFlow::MethodCallNode call2, Function target1, Function target2, string msg where - multipleCallsToSuperclassDel(meth, calledMulti) and - // Don't alert for multiple calls to a superclass del when a subclass will do. + multipleCallsToSuperclassDel(meth, calledMulti, call1, call2) and + // Only alert for the lowest method in the hierarchy that both calls will call. not exists(Function subMulti | - multipleCallsToSuperclassDel(meth, subMulti) and + multipleCallsToSuperclassDel(meth, subMulti, _, _) and calledMulti.getScope() = getADirectSuperclass+(subMulti.getScope()) + ) and + target1 = getDirectSuperCallTargetFromCall(meth.getScope(), meth, call1, _) and + target2 = getDirectSuperCallTargetFromCall(meth.getScope(), meth, call2, _) and + ( + target1 != target2 and + msg = + "This deletion method calls $@ multiple times, via $@ and $@, resolving to $@ and $@ respectively." + or + target1 = target2 and + // The targets themselves are called multiple times (either is calledMulti, or something earlier in the MRO) + // Mentioning them again would be redundant. + msg = "This deletion method calls $@ multiple times, via $@ and $@." ) -select meth, "This delete method calls $@ multiple times.", calledMulti, - calledMulti.getQualifiedName() +select meth, msg, calledMulti, calledMulti.getQualifiedName(), call1, "this call", call2, + "this call", target1, target1.getQualifiedName(), target2, target2.getQualifiedName() diff --git a/python/ql/src/Classes/CallsToInitDel/SuperclassInitCalledMultipleTimes.ql b/python/ql/src/Classes/CallsToInitDel/SuperclassInitCalledMultipleTimes.ql index 4f577dc4a764..04c226aa1951 100644 --- a/python/ql/src/Classes/CallsToInitDel/SuperclassInitCalledMultipleTimes.ql +++ b/python/ql/src/Classes/CallsToInitDel/SuperclassInitCalledMultipleTimes.ql @@ -14,17 +14,34 @@ import python import MethodCallOrder -predicate multipleCallsToSuperclassInit(Function meth, Function calledMulti) { - multipleCallsToSuperclassMethod(meth, calledMulti, "__init__") +predicate multipleCallsToSuperclassInit( + Function meth, Function calledMulti, DataFlow::MethodCallNode call1, + DataFlow::MethodCallNode call2 +) { + multipleCallsToSuperclassMethod(meth, calledMulti, call1, call2, "__init__") } -from Function meth, Function calledMulti +from + Function meth, Function calledMulti, DataFlow::MethodCallNode call1, + DataFlow::MethodCallNode call2, Function target1, Function target2, string msg where - multipleCallsToSuperclassInit(meth, calledMulti) and - // Don't alert for multiple calls to a superclass init when a subclass will do. + multipleCallsToSuperclassInit(meth, calledMulti, call1, call2) and + // Only alert for the lowest method in the hierarchy that both calls will call. not exists(Function subMulti | - multipleCallsToSuperclassInit(meth, subMulti) and + multipleCallsToSuperclassInit(meth, subMulti, _, _) and calledMulti.getScope() = getADirectSuperclass+(subMulti.getScope()) + ) and + target1 = getDirectSuperCallTargetFromCall(meth.getScope(), meth, call1, _) and + target2 = getDirectSuperCallTargetFromCall(meth.getScope(), meth, call2, _) and + ( + target1 != target2 and + msg = + "This initialization method calls $@ multiple times, via $@ and $@, resolving to $@ and $@ respectively." + or + target1 = target2 and + // The targets themselves are called multiple times (either is calledMulti, or something earlier in the MRO) + // Mentioning them again would be redundant. + msg = "This initialization method calls $@ multiple times, via $@ and $@." ) -select meth, "This initialization method calls $@ multiple times.", calledMulti, - calledMulti.getQualifiedName() +select meth, msg, calledMulti, calledMulti.getQualifiedName(), call1, "this call", call2, + "this call", target1, target1.getQualifiedName(), target2, target2.getQualifiedName() From daa5525a105f59a3b7af4821b3f3271e68280e41 Mon Sep 17 00:00:00 2001 From: Joe Farebrother Date: Fri, 4 Jul 2025 11:08:33 +0100 Subject: [PATCH 053/308] Update tests and add an additional test --- .../SuperclassDelCalledMultipleTimes.expected | 4 ++-- ...SuperclassInitCalledMultipleTimes.expected | 5 +++-- .../multiple/multiple-init/multiple_init.py | 19 +++++++++++++++++++ 3 files changed, 24 insertions(+), 4 deletions(-) diff --git a/python/ql/test/query-tests/Classes/multiple/multiple-del/SuperclassDelCalledMultipleTimes.expected b/python/ql/test/query-tests/Classes/multiple/multiple-del/SuperclassDelCalledMultipleTimes.expected index ad9858397dff..0df0670b2191 100644 --- a/python/ql/test/query-tests/Classes/multiple/multiple-del/SuperclassDelCalledMultipleTimes.expected +++ b/python/ql/test/query-tests/Classes/multiple/multiple-del/SuperclassDelCalledMultipleTimes.expected @@ -1,2 +1,2 @@ -| multiple_del.py:21:5:21:22 | Function __del__ | This delete method calls $@ multiple times. | multiple_del.py:9:5:9:22 | Function __del__ | Y1.__del__ | -| multiple_del.py:43:5:43:22 | Function __del__ | This delete method calls $@ multiple times. | multiple_del.py:32:5:32:22 | Function __del__ | Z1.__del__ | +| multiple_del.py:21:5:21:22 | Function __del__ | This deletion method calls $@ multiple times, via $@ and $@, resolving to $@ and $@ respectively. | multiple_del.py:9:5:9:22 | Function __del__ | Y1.__del__ | multiple_del.py:23:9:23:24 | ControlFlowNode for Attribute() | this call | multiple_del.py:24:9:24:24 | ControlFlowNode for Attribute() | this call | multiple_del.py:9:5:9:22 | Function __del__ | Y1.__del__ | multiple_del.py:15:5:15:22 | Function __del__ | Y2.__del__ | +| multiple_del.py:43:5:43:22 | Function __del__ | This deletion method calls $@ multiple times, via $@ and $@, resolving to $@ and $@ respectively. | multiple_del.py:32:5:32:22 | Function __del__ | Z1.__del__ | multiple_del.py:45:9:45:24 | ControlFlowNode for Attribute() | this call | multiple_del.py:46:9:46:24 | ControlFlowNode for Attribute() | this call | multiple_del.py:32:5:32:22 | Function __del__ | Z1.__del__ | multiple_del.py:37:5:37:22 | Function __del__ | Z2.__del__ | diff --git a/python/ql/test/query-tests/Classes/multiple/multiple-init/SuperclassInitCalledMultipleTimes.expected b/python/ql/test/query-tests/Classes/multiple/multiple-init/SuperclassInitCalledMultipleTimes.expected index 42d019e7f710..e2a0934e9027 100644 --- a/python/ql/test/query-tests/Classes/multiple/multiple-init/SuperclassInitCalledMultipleTimes.expected +++ b/python/ql/test/query-tests/Classes/multiple/multiple-init/SuperclassInitCalledMultipleTimes.expected @@ -1,2 +1,3 @@ -| multiple_init.py:21:5:21:23 | Function __init__ | This initialization method calls $@ multiple times. | multiple_init.py:9:5:9:23 | Function __init__ | C1.__init__ | -| multiple_init.py:42:5:42:23 | Function __init__ | This initialization method calls $@ multiple times. | multiple_init.py:31:5:31:23 | Function __init__ | D1.__init__ | +| multiple_init.py:21:5:21:23 | Function __init__ | This initialization method calls $@ multiple times, via $@ and $@, resolving to $@ and $@ respectively. | multiple_init.py:9:5:9:23 | Function __init__ | C1.__init__ | multiple_init.py:23:9:23:25 | ControlFlowNode for Attribute() | this call | multiple_init.py:24:9:24:25 | ControlFlowNode for Attribute() | this call | multiple_init.py:9:5:9:23 | Function __init__ | C1.__init__ | multiple_init.py:15:5:15:23 | Function __init__ | C2.__init__ | +| multiple_init.py:42:5:42:23 | Function __init__ | This initialization method calls $@ multiple times, via $@ and $@, resolving to $@ and $@ respectively. | multiple_init.py:31:5:31:23 | Function __init__ | D1.__init__ | multiple_init.py:44:9:44:25 | ControlFlowNode for Attribute() | this call | multiple_init.py:45:9:45:25 | ControlFlowNode for Attribute() | this call | multiple_init.py:31:5:31:23 | Function __init__ | D1.__init__ | multiple_init.py:36:5:36:23 | Function __init__ | D2.__init__ | +| multiple_init.py:84:5:84:23 | Function __init__ | This initialization method calls $@ multiple times, via $@ and $@, resolving to $@ and $@ respectively. | multiple_init.py:80:5:80:23 | Function __init__ | F3.__init__ | multiple_init.py:86:9:86:25 | ControlFlowNode for Attribute() | this call | multiple_init.py:87:9:87:25 | ControlFlowNode for Attribute() | this call | multiple_init.py:75:5:75:23 | Function __init__ | F2.__init__ | multiple_init.py:80:5:80:23 | Function __init__ | F3.__init__ | diff --git a/python/ql/test/query-tests/Classes/multiple/multiple-init/multiple_init.py b/python/ql/test/query-tests/Classes/multiple/multiple-init/multiple_init.py index cba8b24523fa..59efb28e691e 100644 --- a/python/ql/test/query-tests/Classes/multiple/multiple-init/multiple_init.py +++ b/python/ql/test/query-tests/Classes/multiple/multiple-init/multiple_init.py @@ -68,3 +68,22 @@ def __init__(self): # OK: builtin init methods are fine. E3() +class F1: + pass + +class F2(F1): + def __init__(self): + print("F2 init") + super().__init__() + +class F3(F1): + def __init__(self): + print("F3 init") + +class F4(F2, F3): + def __init__(self): # $ Alert # F2's super call calls F3 + print("F4 init") + F2.__init__(self) + F3.__init__(self) + +F4() \ No newline at end of file From 86bb0e8af22e767a1a7e68075fae46b1222351e9 Mon Sep 17 00:00:00 2001 From: Joe Farebrother Date: Fri, 4 Jul 2025 11:32:39 +0100 Subject: [PATCH 054/308] qhelp: move examples to subfolder --- .../Classes/CallsToInitDel/{ => examples}/MissingCallToDel.py | 0 .../CallsToInitDel/{ => examples}/MissingCallToInit.py | 4 ++-- .../{ => examples}/SuperclassDelCalledMultipleTimes.py | 0 .../{ => examples}/SuperclassDelCalledMultipleTimes2.py | 0 .../{ => examples}/SuperclassInitCalledMultipleTimes.py | 0 .../{ => examples}/SuperclassInitCalledMultipleTimes2.py | 0 6 files changed, 2 insertions(+), 2 deletions(-) rename python/ql/src/Classes/CallsToInitDel/{ => examples}/MissingCallToDel.py (100%) rename python/ql/src/Classes/CallsToInitDel/{ => examples}/MissingCallToInit.py (85%) rename python/ql/src/Classes/CallsToInitDel/{ => examples}/SuperclassDelCalledMultipleTimes.py (100%) rename python/ql/src/Classes/CallsToInitDel/{ => examples}/SuperclassDelCalledMultipleTimes2.py (100%) rename python/ql/src/Classes/CallsToInitDel/{ => examples}/SuperclassInitCalledMultipleTimes.py (100%) rename python/ql/src/Classes/CallsToInitDel/{ => examples}/SuperclassInitCalledMultipleTimes2.py (100%) diff --git a/python/ql/src/Classes/CallsToInitDel/MissingCallToDel.py b/python/ql/src/Classes/CallsToInitDel/examples/MissingCallToDel.py similarity index 100% rename from python/ql/src/Classes/CallsToInitDel/MissingCallToDel.py rename to python/ql/src/Classes/CallsToInitDel/examples/MissingCallToDel.py diff --git a/python/ql/src/Classes/CallsToInitDel/MissingCallToInit.py b/python/ql/src/Classes/CallsToInitDel/examples/MissingCallToInit.py similarity index 85% rename from python/ql/src/Classes/CallsToInitDel/MissingCallToInit.py rename to python/ql/src/Classes/CallsToInitDel/examples/MissingCallToInit.py index 1b3e0e3aee59..14d7c5a80fd3 100644 --- a/python/ql/src/Classes/CallsToInitDel/MissingCallToInit.py +++ b/python/ql/src/Classes/CallsToInitDel/examples/MissingCallToInit.py @@ -10,14 +10,14 @@ def __init__(self): Vehicle.__init__(self) self.car_init() -#Car.__init__ is missed out. +# BAD: Car.__init__ is not called. class SportsCar(Car, Vehicle): def __init__(self): Vehicle.__init__(self) self.sports_car_init() -#Fix SportsCar by calling Car.__init__ +# GOOD: Car.__init__ is called correctly. class FixedSportsCar(Car, Vehicle): def __init__(self): diff --git a/python/ql/src/Classes/CallsToInitDel/SuperclassDelCalledMultipleTimes.py b/python/ql/src/Classes/CallsToInitDel/examples/SuperclassDelCalledMultipleTimes.py similarity index 100% rename from python/ql/src/Classes/CallsToInitDel/SuperclassDelCalledMultipleTimes.py rename to python/ql/src/Classes/CallsToInitDel/examples/SuperclassDelCalledMultipleTimes.py diff --git a/python/ql/src/Classes/CallsToInitDel/SuperclassDelCalledMultipleTimes2.py b/python/ql/src/Classes/CallsToInitDel/examples/SuperclassDelCalledMultipleTimes2.py similarity index 100% rename from python/ql/src/Classes/CallsToInitDel/SuperclassDelCalledMultipleTimes2.py rename to python/ql/src/Classes/CallsToInitDel/examples/SuperclassDelCalledMultipleTimes2.py diff --git a/python/ql/src/Classes/CallsToInitDel/SuperclassInitCalledMultipleTimes.py b/python/ql/src/Classes/CallsToInitDel/examples/SuperclassInitCalledMultipleTimes.py similarity index 100% rename from python/ql/src/Classes/CallsToInitDel/SuperclassInitCalledMultipleTimes.py rename to python/ql/src/Classes/CallsToInitDel/examples/SuperclassInitCalledMultipleTimes.py diff --git a/python/ql/src/Classes/CallsToInitDel/SuperclassInitCalledMultipleTimes2.py b/python/ql/src/Classes/CallsToInitDel/examples/SuperclassInitCalledMultipleTimes2.py similarity index 100% rename from python/ql/src/Classes/CallsToInitDel/SuperclassInitCalledMultipleTimes2.py rename to python/ql/src/Classes/CallsToInitDel/examples/SuperclassInitCalledMultipleTimes2.py From ba8658491aeb6ffb6bf68603b3c5c2275af7aacb Mon Sep 17 00:00:00 2001 From: Joe Farebrother Date: Fri, 4 Jul 2025 15:44:37 +0100 Subject: [PATCH 055/308] Update qhelp + alert messages --- .../CallsToInitDel/MissingCallToDel.qhelp | 38 ++++++------ .../CallsToInitDel/MissingCallToDel.ql | 6 +- .../CallsToInitDel/MissingCallToInit.qhelp | 40 ++++++------- .../SuperclassDelCalledMultipleTimes.qhelp | 49 +++++++-------- .../SuperclassDelCalledMultipleTimes.ql | 4 +- .../SuperclassInitCalledMultipleTimes.qhelp | 60 ++++++++++++------- .../examples/MissingCallToDel.py | 4 +- .../SuperclassDelCalledMultipleTimes.py | 21 ++++--- .../SuperclassDelCalledMultipleTimes2.py | 32 ---------- .../SuperclassInitCalledMultipleTimes.py | 36 ----------- .../SuperclassInitCalledMultipleTimes2.py | 38 ------------ .../SuperclassInitCalledMultipleTimesBad1.py | 20 +++++++ .../SuperclassInitCalledMultipleTimesBad3.py | 22 +++++++ .../SuperclassInitCalledMultipleTimesGood2.py | 22 +++++++ .../missing-del/MissingCallToDel.expected | 2 +- .../SuperclassDelCalledMultipleTimes.expected | 4 +- 16 files changed, 186 insertions(+), 212 deletions(-) delete mode 100644 python/ql/src/Classes/CallsToInitDel/examples/SuperclassDelCalledMultipleTimes2.py delete mode 100644 python/ql/src/Classes/CallsToInitDel/examples/SuperclassInitCalledMultipleTimes.py delete mode 100644 python/ql/src/Classes/CallsToInitDel/examples/SuperclassInitCalledMultipleTimes2.py create mode 100644 python/ql/src/Classes/CallsToInitDel/examples/SuperclassInitCalledMultipleTimesBad1.py create mode 100644 python/ql/src/Classes/CallsToInitDel/examples/SuperclassInitCalledMultipleTimesBad3.py create mode 100644 python/ql/src/Classes/CallsToInitDel/examples/SuperclassInitCalledMultipleTimesGood2.py diff --git a/python/ql/src/Classes/CallsToInitDel/MissingCallToDel.qhelp b/python/ql/src/Classes/CallsToInitDel/MissingCallToDel.qhelp index 864ddd1b56b8..a9897d3c682e 100644 --- a/python/ql/src/Classes/CallsToInitDel/MissingCallToDel.qhelp +++ b/python/ql/src/Classes/CallsToInitDel/MissingCallToDel.qhelp @@ -4,47 +4,49 @@ -

    Python, unlike statically typed languages such as Java, allows complete freedom when calling methods during object destruction. -However, standard object-oriented principles apply to Python classes using deep inheritance hierarchies. -Therefore the developer has responsibility for ensuring that objects are properly cleaned up when -there are multiple __del__ methods that need to be called. +

    +Python, unlike some other object-oriented languages such as Java, allows the developer complete freedom in +when and how superclass finalizers are called during object finalization. +However, the developer has responsibility for ensuring that objects are properly cleaned up, and that all superclass __del__ +methods are called.

    -If the __del__ method of a superclass is not called during object destruction it is likely that +Classes with a __del__ method (a finalizer) typically hold some resource such as a file handle that needs to be cleaned up. +If the __del__ method of a superclass is not called during object finalization, it is likely that that resources may be leaked.

    -

    A call to the __del__ method of a superclass during object destruction may be omitted: +

    A call to the __init__ method of a superclass during object initialization may be unintentionally skipped:

      -
    • When a subclass calls the __del__ method of the wrong class.
    • -
    • When a call to the __del__ method of one its base classes is omitted.
    • +
    • If a subclass calls the __del__ method of the wrong class.
    • +
    • If a call to the __del__ method of one its base classes is omitted.
    • +
    • If a call to super().__del__ is used, but not all __del__ methods in the Method Resolution Order (MRO) + chain themselves call super(). This in particular arises more often in cases of multiple inheritance.
    -

    Either be careful to explicitly call the __del__ of the correct base class, or -use super() throughout the inheritance hierarchy.

    - -

    Alternatively refactor one or more of the classes to use composition rather than inheritance.

    +

    Ensure that all superclass __del__ methods are properly called. +Either each base class's finalize method should be explicitly called, or super() calls +should be consistently used throughout the inheritance hierarchy.

    -

    In this example, explicit calls to __del__ are used, but SportsCar erroneously calls +

    In the following example, explicit calls to __del__ are used, but SportsCar erroneously calls Vehicle.__del__. This is fixed in FixedSportsCar by calling Car.__del__.

    - +
    -
  • Python Tutorial: Classes.
  • -
  • Python Standard Library: super.
  • -
  • Artima Developer: Things to Know About Python Super.
  • -
  • Wikipedia: Composition over inheritance.
  • +
  • Python Reference: __del__.
  • +
  • Python Standard Library: super.
  • +
  • Python Glossary: Method resolution order.
  • diff --git a/python/ql/src/Classes/CallsToInitDel/MissingCallToDel.ql b/python/ql/src/Classes/CallsToInitDel/MissingCallToDel.ql index a6ade1f1d312..7d8e11b569d7 100644 --- a/python/ql/src/Classes/CallsToInitDel/MissingCallToDel.ql +++ b/python/ql/src/Classes/CallsToInitDel/MissingCallToDel.ql @@ -30,18 +30,18 @@ where not possiblyMissingSuper.isNone() and possibleIssue = possiblyMissingSuper and msg = - "This class does not call $@ during destruction. ($@ may be missing a call to super().__del__)" + "This class does not call $@ during finalization. ($@ may be missing a call to super().__del__)" or possiblyMissingSuper.isNone() and ( possibleIssue.asSome() = getDelMethod(base) and msg = - "This class does not call $@ during destruction. ($@ may be missing a call to a base class __del__)" + "This class does not call $@ during finalization. ($@ may be missing a call to a base class __del__)" or not exists(getDelMethod(base)) and possibleIssue.isNone() and msg = - "This class does not call $@ during destruction. (The class lacks an __del__ method to ensure every base class __del__ is called.)" + "This class does not call $@ during finalization. (The class lacks an __del__ method to ensure every base class __del__ is called.)" ) ) ) diff --git a/python/ql/src/Classes/CallsToInitDel/MissingCallToInit.qhelp b/python/ql/src/Classes/CallsToInitDel/MissingCallToInit.qhelp index 31ad3d693a5d..76121446f99e 100644 --- a/python/ql/src/Classes/CallsToInitDel/MissingCallToInit.qhelp +++ b/python/ql/src/Classes/CallsToInitDel/MissingCallToInit.qhelp @@ -4,49 +4,47 @@ -

    Python, unlike statically typed languages such as Java, allows complete freedom when calling methods during object initialization. -However, standard object-oriented principles apply to Python classes using deep inheritance hierarchies. -Therefore the developer has responsibility for ensuring that objects are properly initialized when -there are multiple __init__ methods that need to be called. +

    Python, unlike some other object-oriented languages such as Java, allows the developer complete freedom in +when and how superclass initializers are called during object initialization. +However, the developer has responsibility for ensuring that objects are properly initialized, and that all superclass __init__ +methods are called.

    -If the __init__ method of a superclass is not called during object initialization it is likely that -that object will end up in an incorrect state. +If the __init__ method of a superclass is not called during object initialization, this can lead to errors due to +the object not being fully initialized, such as having missing attributes.

    -

    A call to the __init__ method of a superclass during object initialization may be omitted: +

    A call to the __init__ method of a superclass during object initialization may be unintentionally skipped:

      -
    • When a subclass calls the __init__ method of the wrong class.
    • -
    • When a call to the __init__ method of one its base classes is omitted.
    • -
    • When multiple inheritance is used and a class inherits from several base classes, - and at least one of those does not use super() in its own __init__ method.
    • +
    • If a subclass calls the __init__ method of the wrong class.
    • +
    • If a call to the __init__ method of one its base classes is omitted.
    • +
    • If a call to super().__init__ is used, but not all __init__ methods in the Method Resolution Order (MRO) + chain themselves call super(). This in particular arises more often in cases of multiple inheritance.
    -

    Either be careful to explicitly call the __init__ of the correct base class, or -use super() throughout the inheritance hierarchy.

    - -

    Alternatively refactor one or more of the classes to use composition rather than inheritance.

    +

    Ensure that all superclass __init__ methods are properly called. +Either each base class's initialize method should be explicitly called, or super() calls +should be consistently used throughout the inheritance hierarchy.

    -

    In this example, explicit calls to __init__ are used, but SportsCar erroneously calls +

    In the following example, explicit calls to __init__ are used, but SportsCar erroneously calls Vehicle.__init__. This is fixed in FixedSportsCar by calling Car.__init__.

    - +
    -
  • Python Tutorial: Classes.
  • -
  • Python Standard Library: super.
  • -
  • Artima Developer: Things to Know About Python Super.
  • -
  • Wikipedia: Composition over inheritance.
  • +
  • Python Reference: __init__.
  • +
  • Python Standard Library: super.
  • +
  • Python Glossary: Method resolution order.
  • diff --git a/python/ql/src/Classes/CallsToInitDel/SuperclassDelCalledMultipleTimes.qhelp b/python/ql/src/Classes/CallsToInitDel/SuperclassDelCalledMultipleTimes.qhelp index d9514b2c68c4..f828cfb8e648 100644 --- a/python/ql/src/Classes/CallsToInitDel/SuperclassDelCalledMultipleTimes.qhelp +++ b/python/ql/src/Classes/CallsToInitDel/SuperclassDelCalledMultipleTimes.qhelp @@ -4,55 +4,52 @@ -

    Python, unlike statically typed languages such as Java, allows complete freedom when calling methods during object destruction. -However, standard object-oriented principles apply to Python classes using deep inheritance hierarchies. -Therefore the developer has responsibility for ensuring that objects are properly cleaned up when -there are multiple __del__ methods that need to be called. +

    +Python, unlike some other object-oriented languages such as Java, allows the developer complete freedom in +when and how superclass finalizers are called during object finalization. +However, the developer has responsibility for ensuring that objects are properly cleaned up.

    -Calling a __del__ method more than once during object destruction risks resources being released multiple -times. The relevant __del__ method may not be designed to be called more than once. +Objects with a __del__ method (a finalizer) often hold resources such as file handles that need to be cleaned up. +If a superclass finalizer is called multiple times, this may lead to errors such as closing an already closed file, and lead to objects not being +cleaned up properly as expected.

    There are a number of ways that a __del__ method may be be called more than once.

    • There may be more than one explicit call to the method in the hierarchy of __del__ methods.
    • -
    • A class using multiple inheritance directly calls the __del__ methods of its base types. - One or more of those base types uses super() to pass down the inheritance chain.
    • +
    • In situations involving multiple inheritance, an finalization method may call the finalizers of each of its base types, + which themselves both call the finalizer of a shared base type. (This is an example of the Diamond Inheritance problem)
    • +
    • Another situation involving multiple inheritance arises when a subclass calls the __del__ methods of each of its base classes, + one of which calls super().__del__. This super call resolves to the next class in the Method Resolution Order (MRO) of the subclass, + which may be another base class that already has its initializer explicitly called.
    -

    Either be careful not to explicitly call a __del__ method more than once, or -use super() throughout the inheritance hierarchy.

    - -

    Alternatively refactor one or more of the classes to use composition rather than inheritance.

    +

    Ensure that each finalizer method is called exactly once during finalization. +This can be ensured by calling super().__del__ for each finalizer methid in the inheritance chain. +

    -

    In the first example, explicit calls to __del__ are used, but SportsCar erroneously calls -both Vehicle.__del__ and Car.__del__. -This can be fixed by removing the call to Vehicle.__del__, as shown in FixedSportsCar. -

    - - -

    In the second example, there is a mixture of explicit calls to __del__ and calls using super(). -To fix this example, super() should be used throughout. +

    In the following example, there is a mixture of explicit calls to __del__ and calls using super(), resulting in Vehicle.__del__ +being called twice. +FixedSportsCar.__del__ fixes this by using super() consistently with the other delete methods.

    - -
  • Python Tutorial: Classes.
  • -
  • Python Standard Library: super.
  • -
  • Artima Developer: Things to Know About Python Super.
  • -
  • Wikipedia: Composition over inheritance.
  • - + +
  • Python Reference: __del__.
  • +
  • Python Standard Library: super.
  • +
  • Python Glossary: Method resolution order.
  • +
  • Wikipedia: The Diamond Problem.
  • diff --git a/python/ql/src/Classes/CallsToInitDel/SuperclassDelCalledMultipleTimes.ql b/python/ql/src/Classes/CallsToInitDel/SuperclassDelCalledMultipleTimes.ql index 7772aa153730..dfdc3545e64f 100644 --- a/python/ql/src/Classes/CallsToInitDel/SuperclassDelCalledMultipleTimes.ql +++ b/python/ql/src/Classes/CallsToInitDel/SuperclassDelCalledMultipleTimes.ql @@ -36,12 +36,12 @@ where ( target1 != target2 and msg = - "This deletion method calls $@ multiple times, via $@ and $@, resolving to $@ and $@ respectively." + "This finalization method calls $@ multiple times, via $@ and $@, resolving to $@ and $@ respectively." or target1 = target2 and // The targets themselves are called multiple times (either is calledMulti, or something earlier in the MRO) // Mentioning them again would be redundant. - msg = "This deletion method calls $@ multiple times, via $@ and $@." + msg = "This finalization method calls $@ multiple times, via $@ and $@." ) select meth, msg, calledMulti, calledMulti.getQualifiedName(), call1, "this call", call2, "this call", target1, target1.getQualifiedName(), target2, target2.getQualifiedName() diff --git a/python/ql/src/Classes/CallsToInitDel/SuperclassInitCalledMultipleTimes.qhelp b/python/ql/src/Classes/CallsToInitDel/SuperclassInitCalledMultipleTimes.qhelp index f1140d68b891..d7060adef8d9 100644 --- a/python/ql/src/Classes/CallsToInitDel/SuperclassInitCalledMultipleTimes.qhelp +++ b/python/ql/src/Classes/CallsToInitDel/SuperclassInitCalledMultipleTimes.qhelp @@ -4,54 +4,70 @@ -

    Python, unlike statically typed languages such as Java, allows complete freedom when calling methods during object initialization. -However, standard object-oriented principles apply to Python classes using deep inheritance hierarchies. -Therefore the developer has responsibility for ensuring that objects are properly initialized when -there are multiple __init__ methods that need to be called. +

    Python, unlike some other object-oriented languages such as Java, allows the developer complete freedom in +when and how superclass initializers are called during object initialization. +However, the developer has responsibility for ensuring that objects are properly initialized.

    -Calling an __init__ method more than once during object initialization risks the object being incorrectly initialized. -It is unlikely that the relevant __init__ method is designed to be called more than once. +Calling an __init__ method more than once during object initialization risks the object being incorrectly +initialized, as the method and the rest of the inheritance chain may not have been written with the expectation +that it could be called multiple times. For example, it may set attributes to a default value in a way that unexpectedly overwrites +values setting those attributes in a subclass.

    There are a number of ways that an __init__ method may be be called more than once.

    • There may be more than one explicit call to the method in the hierarchy of __init__ methods.
    • -
    • A class using multiple inheritance directly calls the __init__ methods of its base types. - One or more of those base types uses super() to pass down the inheritance chain.
    • +
    • In situations involving multiple inheritance, an initialization method may call the initializers of each of its base types, + which themselves both call the initializer of a shared base type. (This is an example of the Diamond Inheritance problem)
    • +
    • Another situation involving multiple inheritance arises when a subclass calls the __init__ methods of each of its base classes, + one of which calls super().__init__. This super call resolves to the next class in the Method Resolution Order (MRO) of the subclass, + which may be another base class that already has its initializer explicitly called.
    -

    Either be careful not to explicitly call an __init__ method more than once, or -use super() throughout the inheritance hierarchy.

    +

    +Take care whenever possible not to call an an initializer multiple times. If each __init__ method in the hierarchy +calls super().__init__(), then each initializer will be called exactly once according to the MRO of the subclass. + +When explicitly calling base class initializers (such as to pass different arguments to different initializers), +ensure this is done consistently throughout, rather than using super() calls in the base classes. +

    +

    +In some cases, it may not be possible to avoid calling a base initializer multiple times without significant refactoring. +In this case, carefully check that the initializer does not interfere with subclass initializers + when called multiple times (such as by overwriting attributes), and ensure this behavior is documented. +

    -

    Alternatively refactor one or more of the classes to use composition rather than inheritance.

    -

    In the first example, explicit calls to __init__ are used, but SportsCar erroneously calls -both Vehicle.__init__ and Car.__init__. -This can be fixed by removing the call to Vehicle.__init__, as shown in FixedSportsCar. +

    In the following (BAD) example, the class D calls B.__init__ and C.__init__, +which each call A.__init__. This results in self.state being set to None as +A.__init__ is called again after B.__init__ had finished. This may lead to unexpected results.

    - + -

    In the second example, there is a mixture of explicit calls to __init__ and calls using super(). -To fix this example, super() should be used throughout. +

    In the following (GOOD) example, a call to super().__init__ is made in each class +in the inheritance hierarchy, ensuring each initializer is called exactly once.

    - + + +

    In the following (BAD) example, explicit base class calls are mixed with super() calls, and C.__init__ is called twice.

    +
    -
  • Python Tutorial: Classes.
  • -
  • Python Standard Library: super.
  • -
  • Artima Developer: Things to Know About Python Super.
  • -
  • Wikipedia: Composition over inheritance.
  • +
  • Python Reference: __init__.
  • +
  • Python Standard Library: super.
  • +
  • Python Glossary: Method resolution order.
  • +
  • Wikipedia: The Diamond Problem.
  • diff --git a/python/ql/src/Classes/CallsToInitDel/examples/MissingCallToDel.py b/python/ql/src/Classes/CallsToInitDel/examples/MissingCallToDel.py index 37520071b3ae..296d36be7d8f 100644 --- a/python/ql/src/Classes/CallsToInitDel/examples/MissingCallToDel.py +++ b/python/ql/src/Classes/CallsToInitDel/examples/MissingCallToDel.py @@ -10,14 +10,14 @@ def __del__(self): recycle(self.car_parts) Vehicle.__del__(self) -#Car.__del__ is missed out. +#BAD: Car.__del__ is not called. class SportsCar(Car, Vehicle): def __del__(self): recycle(self.sports_car_parts) Vehicle.__del__(self) -#Fix SportsCar by calling Car.__del__ +#GOOD: Car.__del__ is called correctly. class FixedSportsCar(Car, Vehicle): def __del__(self): diff --git a/python/ql/src/Classes/CallsToInitDel/examples/SuperclassDelCalledMultipleTimes.py b/python/ql/src/Classes/CallsToInitDel/examples/SuperclassDelCalledMultipleTimes.py index 0ee6e61bcb1a..f48f325f8b57 100644 --- a/python/ql/src/Classes/CallsToInitDel/examples/SuperclassDelCalledMultipleTimes.py +++ b/python/ql/src/Classes/CallsToInitDel/examples/SuperclassDelCalledMultipleTimes.py @@ -1,29 +1,32 @@ -#Calling a method multiple times by using explicit calls when a base inherits from other base + +#Calling a method multiple times by using explicit calls when a base uses super() class Vehicle(object): - + def __del__(self): recycle(self.base_parts) - + super(Vehicle, self).__del__() class Car(Vehicle): def __del__(self): recycle(self.car_parts) - Vehicle.__del__(self) - - + super(Car, self).__del__() + + class SportsCar(Car, Vehicle): - # Vehicle.__del__ will get called twice + # BAD: Vehicle.__del__ will get called twice def __del__(self): recycle(self.sports_car_parts) Car.__del__(self) Vehicle.__del__(self) -#Fix SportsCar by only calling Car.__del__ +# GOOD: super() is used ensuring each del method is called once. class FixedSportsCar(Car, Vehicle): def __del__(self): recycle(self.sports_car_parts) - Car.__del__(self) + super(SportsCar, self).__del__() + + diff --git a/python/ql/src/Classes/CallsToInitDel/examples/SuperclassDelCalledMultipleTimes2.py b/python/ql/src/Classes/CallsToInitDel/examples/SuperclassDelCalledMultipleTimes2.py deleted file mode 100644 index 8cb1433ac0c4..000000000000 --- a/python/ql/src/Classes/CallsToInitDel/examples/SuperclassDelCalledMultipleTimes2.py +++ /dev/null @@ -1,32 +0,0 @@ - -#Calling a method multiple times by using explicit calls when a base uses super() -class Vehicle(object): - - def __del__(self): - recycle(self.base_parts) - super(Vehicle, self).__del__() - -class Car(Vehicle): - - def __del__(self): - recycle(self.car_parts) - super(Car, self).__del__() - - -class SportsCar(Car, Vehicle): - - # Vehicle.__del__ will get called twice - def __del__(self): - recycle(self.sports_car_parts) - Car.__del__(self) - Vehicle.__del__(self) - - -#Fix SportsCar by using super() -class FixedSportsCar(Car, Vehicle): - - def __del__(self): - recycle(self.sports_car_parts) - super(SportsCar, self).__del__() - - diff --git a/python/ql/src/Classes/CallsToInitDel/examples/SuperclassInitCalledMultipleTimes.py b/python/ql/src/Classes/CallsToInitDel/examples/SuperclassInitCalledMultipleTimes.py deleted file mode 100644 index 050d5d389d61..000000000000 --- a/python/ql/src/Classes/CallsToInitDel/examples/SuperclassInitCalledMultipleTimes.py +++ /dev/null @@ -1,36 +0,0 @@ -#Calling a method multiple times by using explicit calls when a base inherits from other base -class Vehicle(object): - - def __init__(self): - self.mobile = True - -class Car(Vehicle): - - def __init__(self): - Vehicle.__init__(self) - self.car_init() - - def car_init(self): - pass - -class SportsCar(Car, Vehicle): - - # Vehicle.__init__ will get called twice - def __init__(self): - Vehicle.__init__(self) - Car.__init__(self) - self.sports_car_init() - - def sports_car_init(self): - pass - -#Fix SportsCar by only calling Car.__init__ -class FixedSportsCar(Car, Vehicle): - - def __init__(self): - Car.__init__(self) - self.sports_car_init() - - def sports_car_init(self): - pass - diff --git a/python/ql/src/Classes/CallsToInitDel/examples/SuperclassInitCalledMultipleTimes2.py b/python/ql/src/Classes/CallsToInitDel/examples/SuperclassInitCalledMultipleTimes2.py deleted file mode 100644 index e12e86a079ee..000000000000 --- a/python/ql/src/Classes/CallsToInitDel/examples/SuperclassInitCalledMultipleTimes2.py +++ /dev/null @@ -1,38 +0,0 @@ - -#Calling a method multiple times by using explicit calls when a base uses super() -class Vehicle(object): - - def __init__(self): - super(Vehicle, self).__init__() - self.mobile = True - -class Car(Vehicle): - - def __init__(self): - super(Car, self).__init__() - self.car_init() - - def car_init(self): - pass - -class SportsCar(Car, Vehicle): - - # Vehicle.__init__ will get called twice - def __init__(self): - Vehicle.__init__(self) - Car.__init__(self) - self.sports_car_init() - - def sports_car_init(self): - pass - -#Fix SportsCar by using super() -class FixedSportsCar(Car, Vehicle): - - def __init__(self): - super(SportsCar, self).__init__() - self.sports_car_init() - - def sports_car_init(self): - pass - diff --git a/python/ql/src/Classes/CallsToInitDel/examples/SuperclassInitCalledMultipleTimesBad1.py b/python/ql/src/Classes/CallsToInitDel/examples/SuperclassInitCalledMultipleTimesBad1.py new file mode 100644 index 000000000000..0f595a534dac --- /dev/null +++ b/python/ql/src/Classes/CallsToInitDel/examples/SuperclassInitCalledMultipleTimesBad1.py @@ -0,0 +1,20 @@ +class A: + def __init__(self): + self.state = None + +class B(A): + def __init__(self): + A.__init__(self) + self.state = "B" + self.b = 3 + +class C(A): + def __init__(self): + A.__init__(self) + self.c = 2 + +class D(B,C): + def __init__(self): + B.__init__(self) + C.__init__(self) # BAD: This calls A.__init__ a second time, setting self.state to None. + diff --git a/python/ql/src/Classes/CallsToInitDel/examples/SuperclassInitCalledMultipleTimesBad3.py b/python/ql/src/Classes/CallsToInitDel/examples/SuperclassInitCalledMultipleTimesBad3.py new file mode 100644 index 000000000000..9a70876e7a85 --- /dev/null +++ b/python/ql/src/Classes/CallsToInitDel/examples/SuperclassInitCalledMultipleTimesBad3.py @@ -0,0 +1,22 @@ +class A: + def __init__(self): + print("A") + self.state = None + +class B(A): + def __init__(self): + print("B") + super().__init__() # When called from D, this calls C.__init__ + self.state = "B" + self.b = 3 + +class C(A): + def __init__(self): + print("C") + super().__init__() + self.c = 2 + +class D(B,C): + def __init__(self): + B.__init__(self) + C.__init__(self) # BAD: C.__init__ is called a second time \ No newline at end of file diff --git a/python/ql/src/Classes/CallsToInitDel/examples/SuperclassInitCalledMultipleTimesGood2.py b/python/ql/src/Classes/CallsToInitDel/examples/SuperclassInitCalledMultipleTimesGood2.py new file mode 100644 index 000000000000..ab8d98116aaf --- /dev/null +++ b/python/ql/src/Classes/CallsToInitDel/examples/SuperclassInitCalledMultipleTimesGood2.py @@ -0,0 +1,22 @@ +class A: + def __init__(self): + self.state = None + +class B(A): + def __init__(self): + super().__init__() + self.state = "B" + self.b = 3 + +class C(A): + def __init__(self): + super().__init__() + self.c = 2 + +class D(B,C): + def __init__(self): # GOOD: Each method calls super, so each init method runs once. self.stat =e will be set to "B". + super().__init__() + self.d = 1 + + + diff --git a/python/ql/test/query-tests/Classes/missing-del/MissingCallToDel.expected b/python/ql/test/query-tests/Classes/missing-del/MissingCallToDel.expected index 80e02da0e132..2ec5e1352584 100644 --- a/python/ql/test/query-tests/Classes/missing-del/MissingCallToDel.expected +++ b/python/ql/test/query-tests/Classes/missing-del/MissingCallToDel.expected @@ -1 +1 @@ -| missing_del.py:13:1:13:13 | Class X3 | This class does not call $@ during destruction. ($@ may be missing a call to a base class __del__) | missing_del.py:9:5:9:22 | Function __del__ | X2.__del__ | missing_del.py:15:5:15:22 | Function __del__ | X3.__del__ | +| missing_del.py:13:1:13:13 | Class X3 | This class does not call $@ during finalization. ($@ may be missing a call to a base class __del__) | missing_del.py:9:5:9:22 | Function __del__ | X2.__del__ | missing_del.py:15:5:15:22 | Function __del__ | X3.__del__ | diff --git a/python/ql/test/query-tests/Classes/multiple/multiple-del/SuperclassDelCalledMultipleTimes.expected b/python/ql/test/query-tests/Classes/multiple/multiple-del/SuperclassDelCalledMultipleTimes.expected index 0df0670b2191..b7ee48feba78 100644 --- a/python/ql/test/query-tests/Classes/multiple/multiple-del/SuperclassDelCalledMultipleTimes.expected +++ b/python/ql/test/query-tests/Classes/multiple/multiple-del/SuperclassDelCalledMultipleTimes.expected @@ -1,2 +1,2 @@ -| multiple_del.py:21:5:21:22 | Function __del__ | This deletion method calls $@ multiple times, via $@ and $@, resolving to $@ and $@ respectively. | multiple_del.py:9:5:9:22 | Function __del__ | Y1.__del__ | multiple_del.py:23:9:23:24 | ControlFlowNode for Attribute() | this call | multiple_del.py:24:9:24:24 | ControlFlowNode for Attribute() | this call | multiple_del.py:9:5:9:22 | Function __del__ | Y1.__del__ | multiple_del.py:15:5:15:22 | Function __del__ | Y2.__del__ | -| multiple_del.py:43:5:43:22 | Function __del__ | This deletion method calls $@ multiple times, via $@ and $@, resolving to $@ and $@ respectively. | multiple_del.py:32:5:32:22 | Function __del__ | Z1.__del__ | multiple_del.py:45:9:45:24 | ControlFlowNode for Attribute() | this call | multiple_del.py:46:9:46:24 | ControlFlowNode for Attribute() | this call | multiple_del.py:32:5:32:22 | Function __del__ | Z1.__del__ | multiple_del.py:37:5:37:22 | Function __del__ | Z2.__del__ | +| multiple_del.py:21:5:21:22 | Function __del__ | This finalization method calls $@ multiple times, via $@ and $@, resolving to $@ and $@ respectively. | multiple_del.py:9:5:9:22 | Function __del__ | Y1.__del__ | multiple_del.py:23:9:23:24 | ControlFlowNode for Attribute() | this call | multiple_del.py:24:9:24:24 | ControlFlowNode for Attribute() | this call | multiple_del.py:9:5:9:22 | Function __del__ | Y1.__del__ | multiple_del.py:15:5:15:22 | Function __del__ | Y2.__del__ | +| multiple_del.py:43:5:43:22 | Function __del__ | This finalization method calls $@ multiple times, via $@ and $@, resolving to $@ and $@ respectively. | multiple_del.py:32:5:32:22 | Function __del__ | Z1.__del__ | multiple_del.py:45:9:45:24 | ControlFlowNode for Attribute() | this call | multiple_del.py:46:9:46:24 | ControlFlowNode for Attribute() | this call | multiple_del.py:32:5:32:22 | Function __del__ | Z1.__del__ | multiple_del.py:37:5:37:22 | Function __del__ | Z2.__del__ | From dbd31259b3e62de0ffd7bb7103b402d4616d06cd Mon Sep 17 00:00:00 2001 From: Michael Nebel Date: Mon, 1 Sep 2025 15:16:25 +0200 Subject: [PATCH 056/308] Python: Fix some Ql4Ql violations. --- python/ql/lib/analysis/DefinitionTracking.qll | 2 +- .../cryptography/CryptoArtifact.qll | 2 +- .../modules/CryptographyModule.qll | 40 ++++++++----------- .../modules/stdlib/HashlibModule.qll | 2 +- .../dataflow/new/internal/DataFlowPrivate.qll | 8 ++-- .../lib/semmle/python/frameworks/Stdlib.qll | 5 +-- .../semmle/python/objects/ObjectInternal.qll | 4 +- .../semmle/python/types/FunctionObject.qll | 4 +- .../src/Security/CWE-327/FluentApiModel.qll | 9 ++++- .../Security/CWE-022bis/TarSlipImprov.ql | 2 +- 10 files changed, 35 insertions(+), 43 deletions(-) diff --git a/python/ql/lib/analysis/DefinitionTracking.qll b/python/ql/lib/analysis/DefinitionTracking.qll index 5a9811f62488..e015d0f70a97 100644 --- a/python/ql/lib/analysis/DefinitionTracking.qll +++ b/python/ql/lib/analysis/DefinitionTracking.qll @@ -83,7 +83,7 @@ private predicate ssa_phi_defn(PhiFunction phi, Definition defn) { ssa_variable_defn(phi.getAnInput(), defn) } -/** Holds if the ESSA defn `def` refers to (`value`, `cls`, `origin`) given the context `context`. */ +/** Holds if the ESSA defn `def` refers to (`value`, `cls`, `origin`) given the context `context`. */ private predicate ssa_defn_defn(EssaDefinition def, Definition defn) { ssa_phi_defn(def, defn) or diff --git a/python/ql/lib/experimental/cryptography/CryptoArtifact.qll b/python/ql/lib/experimental/cryptography/CryptoArtifact.qll index fc5c75a4e441..e8939c981113 100644 --- a/python/ql/lib/experimental/cryptography/CryptoArtifact.qll +++ b/python/ql/lib/experimental/cryptography/CryptoArtifact.qll @@ -95,7 +95,7 @@ abstract class CryptographicAlgorithm extends CryptographicArtifact { /** * Normalizes a raw name into a normalized name as found in `CryptoAlgorithmNames.qll`. * Subclassess should override for more api-specific normalization. - * By deafult, converts a raw name to upper-case with no hyphen, underscore, hash, or space. + * By default, converts a raw name to upper-case with no hyphen, underscore, hash, or space. */ bindingset[s] string normalizeName(string s) { diff --git a/python/ql/lib/experimental/cryptography/modules/CryptographyModule.qll b/python/ql/lib/experimental/cryptography/modules/CryptographyModule.qll index 405433b07354..0831d625d803 100644 --- a/python/ql/lib/experimental/cryptography/modules/CryptographyModule.qll +++ b/python/ql/lib/experimental/cryptography/modules/CryptographyModule.qll @@ -117,31 +117,25 @@ module KDF { override predicate requiresIteration() { this.getAlgorithm().getKDFName() in ["PBKDF2HMAC"] } override DataFlow::Node getIterationSizeSrc() { - if this.requiresIteration() - then - // ASSUMPTION: ONLY EVER in arg 3 in PBKDF2HMAC - result = Utils::getUltimateSrcFromApiNode(this.getParameter(3, "iterations")) - else none() + this.requiresIteration() and + // ASSUMPTION: ONLY EVER in arg 3 in PBKDF2HMAC + result = Utils::getUltimateSrcFromApiNode(this.getParameter(3, "iterations")) } override DataFlow::Node getSaltConfigSrc() { - if this.requiresSalt() - then - // SCRYPT has it in arg 1 - if this.getAlgorithm().getKDFName() = "SCRYPT" - then result = Utils::getUltimateSrcFromApiNode(this.getParameter(1, "salt")) - else - // EVERYTHING ELSE that uses salt is in arg 2 - result = Utils::getUltimateSrcFromApiNode(this.getParameter(2, "salt")) - else none() + this.requiresSalt() and + // SCRYPT has it in arg 1 + if this.getAlgorithm().getKDFName() = "SCRYPT" + then result = Utils::getUltimateSrcFromApiNode(this.getParameter(1, "salt")) + else + // EVERYTHING ELSE that uses salt is in arg 2 + result = Utils::getUltimateSrcFromApiNode(this.getParameter(2, "salt")) } override DataFlow::Node getHashConfigSrc() { - if this.requiresHash() - then - // ASSUMPTION: ONLY EVER in arg 0 - result = Utils::getUltimateSrcFromApiNode(this.getParameter(0, "algorithm")) - else none() + this.requiresHash() and + // ASSUMPTION: ONLY EVER in arg 0 + result = Utils::getUltimateSrcFromApiNode(this.getParameter(0, "algorithm")) } // TODO: get encryption algorithm for CBC-based KDF? @@ -152,11 +146,9 @@ module KDF { } override DataFlow::Node getModeSrc() { - if this.requiresMode() - then - // ASSUMPTION: ONLY EVER in arg 1 - result = Utils::getUltimateSrcFromApiNode(this.getParameter(1, "mode")) - else none() + this.requiresMode() and + // ASSUMPTION: ONLY EVER in arg 1 + result = Utils::getUltimateSrcFromApiNode(this.getParameter(1, "mode")) } } } diff --git a/python/ql/lib/experimental/cryptography/modules/stdlib/HashlibModule.qll b/python/ql/lib/experimental/cryptography/modules/stdlib/HashlibModule.qll index 5b2586dc54a6..346512e9a2db 100644 --- a/python/ql/lib/experimental/cryptography/modules/stdlib/HashlibModule.qll +++ b/python/ql/lib/experimental/cryptography/modules/stdlib/HashlibModule.qll @@ -201,7 +201,7 @@ module KDF { // TODO: better modeling of scrypt /** - * Identifies key derivation fucntion hashlib.scrypt accesses. + * Identifies key derivation function hashlib.scrypt accesses. */ class HashlibScryptAlgorithm extends KeyDerivationAlgorithm, KeyDerivationOperation { HashlibScryptAlgorithm() { this = API::moduleImport("hashlib").getMember("scrypt").getACall() } diff --git a/python/ql/lib/semmle/python/dataflow/new/internal/DataFlowPrivate.qll b/python/ql/lib/semmle/python/dataflow/new/internal/DataFlowPrivate.qll index b29be706c4fc..724ae82aa0dd 100644 --- a/python/ql/lib/semmle/python/dataflow/new/internal/DataFlowPrivate.qll +++ b/python/ql/lib/semmle/python/dataflow/new/internal/DataFlowPrivate.qll @@ -613,7 +613,7 @@ DataFlowType getNodeType(Node node) { // Extra flow //-------- /** - * Holds if `pred` can flow to `succ`, by jumping from one callable to + * Holds if `nodeFrom` can flow to `nodeTo`, by jumping from one callable to * another. Additional steps specified by the configuration are *not* * taken into account. */ @@ -634,7 +634,7 @@ predicate jumpStep(Node nodeFrom, Node nodeTo) { * the type-trackers as well, as that would make evaluation of type-tracking recursive * with the new jumpsteps. * - * Holds if `pred` can flow to `succ`, by jumping from one callable to + * Holds if `nodeFrom` can flow to `nodeTo`, by jumping from one callable to * another. Additional steps specified by the configuration are *not* * taken into account. */ @@ -657,7 +657,7 @@ predicate jumpStepSharedWithTypeTracker(Node nodeFrom, Node nodeTo) { * the type-trackers as well, as that would make evaluation of type-tracking recursive * with the new jumpsteps. * - * Holds if `pred` can flow to `succ`, by jumping from one callable to + * Holds if `nodeFrom` can flow to `nodeTo`, by jumping from one callable to * another. Additional steps specified by the configuration are *not* * taken into account. */ @@ -766,7 +766,7 @@ module Orm { abstract predicate storeStep(Node nodeFrom, Content c, Node nodeTo); /** - * Holds if `pred` can flow to `succ`, by jumping from one callable to + * Holds if `nodeFrom` can flow to `nodeTo`, by jumping from one callable to * another. Additional steps specified by the configuration are *not* * taken into account. */ diff --git a/python/ql/lib/semmle/python/frameworks/Stdlib.qll b/python/ql/lib/semmle/python/frameworks/Stdlib.qll index ceb2f1952a02..c6b671e8b781 100644 --- a/python/ql/lib/semmle/python/frameworks/Stdlib.qll +++ b/python/ql/lib/semmle/python/frameworks/Stdlib.qll @@ -3702,11 +3702,8 @@ module StdlibPrivate { * A call to a find method on a tree or an element will execute an XPath expression. */ private class ElementTreeFindCall extends XML::XPathExecution::Range, DataFlow::CallCfgNode { - string methodName; - ElementTreeFindCall() { - methodName in ["find", "findall", "findtext"] and - ( + exists(string methodName | methodName in ["find", "findall", "findtext"] | this = elementTreeInstance().getMember(methodName).getACall() or this = elementInstance().getMember(methodName).getACall() diff --git a/python/ql/lib/semmle/python/objects/ObjectInternal.qll b/python/ql/lib/semmle/python/objects/ObjectInternal.qll index a58b8b5f0a91..aa78caa2c9d7 100644 --- a/python/ql/lib/semmle/python/objects/ObjectInternal.qll +++ b/python/ql/lib/semmle/python/objects/ObjectInternal.qll @@ -174,9 +174,9 @@ class ObjectInternal extends TObject { abstract int length(); /** - * Holds if the object `function` is called when this object is called and `paramOffset` + * Holds if the object `function` is called when this object is called and `offset` * is the difference from the parameter position and the argument position. - * For a normal function `paramOffset` is 0. For classes and bound-methods it is 1. + * For a normal function `offset` is 0. For classes and bound-methods it is 1. * This is used to implement the `CallableValue` public API. */ predicate functionAndOffset(CallableObjectInternal function, int offset) { none() } diff --git a/python/ql/lib/semmle/python/types/FunctionObject.qll b/python/ql/lib/semmle/python/types/FunctionObject.qll index d52a885a832c..f64c02b9c6bf 100644 --- a/python/ql/lib/semmle/python/types/FunctionObject.qll +++ b/python/ql/lib/semmle/python/types/FunctionObject.qll @@ -46,9 +46,7 @@ abstract class FunctionObject extends Object { ControlFlowNode getACall() { result = this.theCallable().getACall() } /** Gets a call-site from where this function is called, given the `context` */ - ControlFlowNode getACall(Context caller_context) { - result = this.theCallable().getACall(caller_context) - } + ControlFlowNode getACall(Context context) { result = this.theCallable().getACall(context) } /** * Gets the `ControlFlowNode` that will be passed as the nth argument to `this` when called at `call`. diff --git a/python/ql/src/Security/CWE-327/FluentApiModel.qll b/python/ql/src/Security/CWE-327/FluentApiModel.qll index 8dd90a588217..cd20a852d51f 100644 --- a/python/ql/src/Security/CWE-327/FluentApiModel.qll +++ b/python/ql/src/Security/CWE-327/FluentApiModel.qll @@ -15,7 +15,7 @@ import TlsLibraryModel * The state is represented as a bit vector, where each bit corresponds to a * protocol version. The bit is set if the protocol is allowed. */ -module InsecureContextConfiguration implements DataFlow::StateConfigSig { +module InsecureContextConfig implements DataFlow::StateConfigSig { private newtype TFlowState = TMkFlowState(TlsLibrary library, int bits) { bits in [0 .. max(any(ProtocolVersion v).getBit()) * 2 - 1] @@ -116,7 +116,12 @@ module InsecureContextConfiguration implements DataFlow::StateConfigSig { } } -private module InsecureContextFlow = DataFlow::GlobalWithState; +/** + * DEPRECATED: Will be removed in the future. + */ +deprecated module InsecureContextConfiguration = InsecureContextConfig; + +private module InsecureContextFlow = DataFlow::GlobalWithState; /** * Holds if `conectionCreation` marks the creation of a connection based on the contex diff --git a/python/ql/src/experimental/Security/CWE-022bis/TarSlipImprov.ql b/python/ql/src/experimental/Security/CWE-022bis/TarSlipImprov.ql index 1727da1bcf55..42c0bc170fd9 100755 --- a/python/ql/src/experimental/Security/CWE-022bis/TarSlipImprov.ql +++ b/python/ql/src/experimental/Security/CWE-022bis/TarSlipImprov.ql @@ -63,7 +63,7 @@ private module TarSlipImprovConfig implements DataFlow::ConfigSig { // For a call to `file.extractall` without `members` argument, `file` is considered a sink. exists(MethodCallNode call, AllTarfileOpens atfo | call = atfo.getReturn().getMember("extractall").getACall() and - not exists(Node arg | arg = call.getArgByName("members")) and + not exists(call.getArgByName("members")) and sink = call.getObject() ) or From 8b10ad49d745a22f94e5b172b3f49fefb0155603 Mon Sep 17 00:00:00 2001 From: Michael Nebel Date: Mon, 1 Sep 2025 15:17:53 +0200 Subject: [PATCH 057/308] JS: Fix some Ql4Ql violations. --- .../javascript/dataflow/FlowSummary.qll | 4 +- .../dataflow/internal/BarrierGuards.qll | 45 ++++++++++--------- .../dataflow/internal/DataFlowPrivate.qll | 4 +- .../dataflow/internal/VariableCapture.qll | 2 +- .../semmle/javascript/frameworks/Babel.qll | 7 +-- .../data/internal/ApiGraphModelsSpecific.qll | 2 +- .../internal/flow_summaries/Arrays.qll | 6 +-- .../internal/flow_summaries/AsyncAwait.qll | 2 +- .../internal/flow_summaries/Generators.qll | 2 +- .../internal/flow_summaries/Iterators.qll | 2 +- .../internal/flow_summaries/Maps.qll | 2 +- .../internal/flow_summaries/Promises.qll | 2 +- .../internal/flow_summaries/Sets.qll | 2 +- .../internal/flow_summaries/Strings.qll | 4 +- .../TaintedUrlSuffixCustomizations.qll | 2 +- .../UnreachableMethodOverloads.ql | 4 +- .../ql/test/library-tests/FlowSummary/test.ql | 6 +-- 17 files changed, 49 insertions(+), 49 deletions(-) diff --git a/javascript/ql/lib/semmle/javascript/dataflow/FlowSummary.qll b/javascript/ql/lib/semmle/javascript/dataflow/FlowSummary.qll index c4a6e12b2104..eb7160683a76 100644 --- a/javascript/ql/lib/semmle/javascript/dataflow/FlowSummary.qll +++ b/javascript/ql/lib/semmle/javascript/dataflow/FlowSummary.qll @@ -17,10 +17,10 @@ private import semmle.javascript.dataflow.internal.DataFlowPrivate * * - The relevant call sites cannot be matched by the access path syntax, and require the full power of CodeQL. * For example, complex overloading patterns might require more local reasoning at the call site. - * - The input/output behaviour cannot be described statically in the access path syntax, but the relevant access paths + * - The input/output behavior cannot be described statically in the access path syntax, but the relevant access paths * can be generated dynamically in CodeQL, based on the usages found in the codebase. * - * Subclasses should bind `this` to a unique identifier for the function being modelled. There is no special + * Subclasses should bind `this` to a unique identifier for the function being modeled. There is no special * interpreation of the `this` value, it should just not clash with the `this`-value used by other classes. * * For example, this models flow through calls such as `require("my-library").myFunction()`: diff --git a/javascript/ql/lib/semmle/javascript/dataflow/internal/BarrierGuards.qll b/javascript/ql/lib/semmle/javascript/dataflow/internal/BarrierGuards.qll index 0af57ec01869..6dd0ebf0bb1c 100644 --- a/javascript/ql/lib/semmle/javascript/dataflow/internal/BarrierGuards.qll +++ b/javascript/ql/lib/semmle/javascript/dataflow/internal/BarrierGuards.qll @@ -386,34 +386,35 @@ module MakeStateBarrierGuard< */ private class BarrierGuardFunction extends FinalFunction { DataFlow::ParameterNode sanitizedParameter; - BarrierGuard guard; boolean guardOutcome; FlowState state; int paramIndex; BarrierGuardFunction() { - barrierGuardIsRelevant(guard) and - exists(Expr e | - exists(Expr returnExpr | - returnExpr = guard.asExpr() - or - // ad hoc support for conjunctions: - getALogicalAndParent(guard) = returnExpr and guardOutcome = true - or - // ad hoc support for disjunctions: - getALogicalOrParent(guard) = returnExpr and guardOutcome = false - | - exists(SsaExplicitDefinition ssa | - ssa.getDef().getSource() = returnExpr and - ssa.getVariable().getAUse() = this.getAReturnedExpr() - ) - or - returnExpr = this.getAReturnedExpr() + exists(BarrierGuard guard | + barrierGuardIsRelevant(guard) and + exists(Expr e | + exists(Expr returnExpr | + returnExpr = guard.asExpr() + or + // ad hoc support for conjunctions: + getALogicalAndParent(guard) = returnExpr and guardOutcome = true + or + // ad hoc support for disjunctions: + getALogicalOrParent(guard) = returnExpr and guardOutcome = false + | + exists(SsaExplicitDefinition ssa | + ssa.getDef().getSource() = returnExpr and + ssa.getVariable().getAUse() = this.getAReturnedExpr() + ) + or + returnExpr = this.getAReturnedExpr() + ) and + sanitizedParameter.flowsToExpr(e) and + barrierGuardBlocksExpr(guard, guardOutcome, e, state) ) and - sanitizedParameter.flowsToExpr(e) and - barrierGuardBlocksExpr(guard, guardOutcome, e, state) - ) and - sanitizedParameter.getParameter() = this.getParameter(paramIndex) + sanitizedParameter.getParameter() = this.getParameter(paramIndex) + ) } /** diff --git a/javascript/ql/lib/semmle/javascript/dataflow/internal/DataFlowPrivate.qll b/javascript/ql/lib/semmle/javascript/dataflow/internal/DataFlowPrivate.qll index 2fcc2acbd167..b7e955b94198 100644 --- a/javascript/ql/lib/semmle/javascript/dataflow/internal/DataFlowPrivate.qll +++ b/javascript/ql/lib/semmle/javascript/dataflow/internal/DataFlowPrivate.qll @@ -680,7 +680,7 @@ predicate neverSkipInPathGraph(Node node) { // Include the return-value expression node.asExpr() = any(Function f).getAReturnedExpr() or - // Include calls (which may have been modelled as steps) + // Include calls (which may have been modeled as steps) node.asExpr() instanceof InvokeExpr or // Include references to a variable @@ -1159,7 +1159,7 @@ private predicate legacyBarrier(DataFlow::Node node) { pragma[nomagic] private predicate isBlockedLegacyNode(Node node) { // Ignore captured variable nodes for those variables that are handled by the captured-variable library. - // Note that some variables, such as top-level variables, are still modelled with these nodes (which will result in jump steps). + // Note that some variables, such as top-level variables, are still modeled with these nodes (which will result in jump steps). exists(LocalVariable variable | node = TCapturedVariableNode(variable) and variable = any(VariableCaptureConfig::CapturedVariable v).asLocalVariable() diff --git a/javascript/ql/lib/semmle/javascript/dataflow/internal/VariableCapture.qll b/javascript/ql/lib/semmle/javascript/dataflow/internal/VariableCapture.qll index 75f21bab38ac..b3182dfc7b8e 100644 --- a/javascript/ql/lib/semmle/javascript/dataflow/internal/VariableCapture.qll +++ b/javascript/ql/lib/semmle/javascript/dataflow/internal/VariableCapture.qll @@ -172,7 +172,7 @@ module VariableCaptureConfig implements InputSig { predicate hasCfgNode(BasicBlock bb, int i) { none() } // Overridden in subclass - // note: langauge-specific + // note: language-specific js::DataFlow::Node getSource() { none() } // Overridden in subclass } diff --git a/javascript/ql/lib/semmle/javascript/frameworks/Babel.qll b/javascript/ql/lib/semmle/javascript/frameworks/Babel.qll index 4b3f70b77725..9ca47fb47276 100644 --- a/javascript/ql/lib/semmle/javascript/frameworks/Babel.qll +++ b/javascript/ql/lib/semmle/javascript/frameworks/Babel.qll @@ -141,16 +141,17 @@ module Babel { */ deprecated private class BabelRootTransformedPathExpr extends PathExpr, Expr { RootImportConfig plugin; - string prefix; string mappedPrefix; string suffix; BabelRootTransformedPathExpr() { this instanceof PathExpr and plugin.appliesTo(this.getTopLevel()) and - prefix = this.getStringValue().regexpCapture("(.)/(.*)", 1) and suffix = this.getStringValue().regexpCapture("(.)/(.*)", 2) and - mappedPrefix = plugin.getRoot(prefix) + exists(string prefix | + prefix = this.getStringValue().regexpCapture("(.)/(.*)", 1) and + mappedPrefix = plugin.getRoot(prefix) + ) } /** Gets the configuration that applies to this path. */ diff --git a/javascript/ql/lib/semmle/javascript/frameworks/data/internal/ApiGraphModelsSpecific.qll b/javascript/ql/lib/semmle/javascript/frameworks/data/internal/ApiGraphModelsSpecific.qll index c61ecc138ef6..f0d751ad31b6 100644 --- a/javascript/ql/lib/semmle/javascript/frameworks/data/internal/ApiGraphModelsSpecific.qll +++ b/javascript/ql/lib/semmle/javascript/frameworks/data/internal/ApiGraphModelsSpecific.qll @@ -35,7 +35,7 @@ class Location = JS::Location; * Type names have form `package.type` or just `package` if referring to the package export * object. If `package` contains a `.` character it must be enclosed in single quotes, such as `'package'.type`. * - * A type name of form `(package)` may also be used when refering to the package export object. + * A type name of form `(package)` may also be used when referring to the package export object. * We allow this syntax as an alternative to the above, so models generated based on `EndpointNaming` look more consistent. * However, access paths are deliberately not parsed here, as we can not handle aliasing at this stage. * The model generator must explicitly generate the step between `(package)` and `(package).foo`, for example. diff --git a/javascript/ql/lib/semmle/javascript/internal/flow_summaries/Arrays.qll b/javascript/ql/lib/semmle/javascript/internal/flow_summaries/Arrays.qll index 00fed9c4f093..b56968377816 100644 --- a/javascript/ql/lib/semmle/javascript/internal/flow_summaries/Arrays.qll +++ b/javascript/ql/lib/semmle/javascript/internal/flow_summaries/Arrays.qll @@ -1,7 +1,7 @@ /** * Contains a summary for relevant methods on arrays. * - * Note that some of Array methods are modelled in `AmbiguousCoreMethods.qll`, and `toString` is special-cased elsewhere. + * Note that some of Array methods are modeled in `AmbiguousCoreMethods.qll`, and `toString` is special-cased elsewhere. */ private import javascript @@ -60,7 +60,7 @@ private predicate isForLoopVariable(Variable v) { private predicate isLikelyArrayIndex(Expr e) { // Require that 'e' is of type number and refers to a for-loop variable. - // TODO: This is here to mirror the old behaviour. Experiment with turning the 'and' into an 'or'. + // TODO: This is here to mirror the old behavior. Experiment with turning the 'and' into an 'or'. TTNumber() = unique(InferredType type | type = e.flow().analyze().getAType()) and isForLoopVariable(e.(VarAccess).getVariable()) or @@ -114,7 +114,7 @@ class ArrayConstructorSummary extends SummarizedCallable { /** * A call to `join` with a separator argument. * - * Calls without separators are modelled in `StringConcatenation.qll`. + * Calls without separators are modeled in `StringConcatenation.qll`. */ class Join extends SummarizedCallable { Join() { this = "Array#join" } diff --git a/javascript/ql/lib/semmle/javascript/internal/flow_summaries/AsyncAwait.qll b/javascript/ql/lib/semmle/javascript/internal/flow_summaries/AsyncAwait.qll index a39b0e6f43d7..246ac0f19d08 100644 --- a/javascript/ql/lib/semmle/javascript/internal/flow_summaries/AsyncAwait.qll +++ b/javascript/ql/lib/semmle/javascript/internal/flow_summaries/AsyncAwait.qll @@ -8,7 +8,7 @@ private import semmle.javascript.dataflow.internal.AdditionalFlowInternal private import semmle.javascript.dataflow.internal.DataFlowPrivate /** - * Steps modelling flow in an `async` function. + * Steps modeling flow in an `async` function. * * Note about promise-coercion and flattening: * - `await` preserves non-promise values, e.g. `await "foo"` is just `"foo"`. diff --git a/javascript/ql/lib/semmle/javascript/internal/flow_summaries/Generators.qll b/javascript/ql/lib/semmle/javascript/internal/flow_summaries/Generators.qll index e187b5751cfd..75815d00341d 100644 --- a/javascript/ql/lib/semmle/javascript/internal/flow_summaries/Generators.qll +++ b/javascript/ql/lib/semmle/javascript/internal/flow_summaries/Generators.qll @@ -7,7 +7,7 @@ private import semmle.javascript.dataflow.internal.DataFlowNode private import semmle.javascript.dataflow.internal.AdditionalFlowInternal /** - * Steps modelling flow out of a generator function: + * Steps modeling flow out of a generator function: * ```js * function* foo() { * yield x; // store 'x' in the return value's IteratorElement diff --git a/javascript/ql/lib/semmle/javascript/internal/flow_summaries/Iterators.qll b/javascript/ql/lib/semmle/javascript/internal/flow_summaries/Iterators.qll index e9937363c01d..6b1a182a49bd 100644 --- a/javascript/ql/lib/semmle/javascript/internal/flow_summaries/Iterators.qll +++ b/javascript/ql/lib/semmle/javascript/internal/flow_summaries/Iterators.qll @@ -1,5 +1,5 @@ /** - * Contains flow summaries and steps modelling flow through iterators. + * Contains flow summaries and steps modeling flow through iterators. */ private import javascript diff --git a/javascript/ql/lib/semmle/javascript/internal/flow_summaries/Maps.qll b/javascript/ql/lib/semmle/javascript/internal/flow_summaries/Maps.qll index 61cc1d148c6b..d9649d407c61 100644 --- a/javascript/ql/lib/semmle/javascript/internal/flow_summaries/Maps.qll +++ b/javascript/ql/lib/semmle/javascript/internal/flow_summaries/Maps.qll @@ -1,5 +1,5 @@ /** - * Contains flow summaries and steps modelling flow through `Map` objects. + * Contains flow summaries and steps modeling flow through `Map` objects. */ private import javascript diff --git a/javascript/ql/lib/semmle/javascript/internal/flow_summaries/Promises.qll b/javascript/ql/lib/semmle/javascript/internal/flow_summaries/Promises.qll index 1122c38320a5..7587ab11dc47 100644 --- a/javascript/ql/lib/semmle/javascript/internal/flow_summaries/Promises.qll +++ b/javascript/ql/lib/semmle/javascript/internal/flow_summaries/Promises.qll @@ -1,5 +1,5 @@ /** - * Contains flow summaries and steps modelling flow through `Promise` objects. + * Contains flow summaries and steps modeling flow through `Promise` objects. */ private import javascript diff --git a/javascript/ql/lib/semmle/javascript/internal/flow_summaries/Sets.qll b/javascript/ql/lib/semmle/javascript/internal/flow_summaries/Sets.qll index 34f7d222df8b..6b4f089b38ec 100644 --- a/javascript/ql/lib/semmle/javascript/internal/flow_summaries/Sets.qll +++ b/javascript/ql/lib/semmle/javascript/internal/flow_summaries/Sets.qll @@ -1,5 +1,5 @@ /** - * Contains flow summaries and steps modelling flow through `Set` objects. + * Contains flow summaries and steps modeling flow through `Set` objects. */ private import javascript diff --git a/javascript/ql/lib/semmle/javascript/internal/flow_summaries/Strings.qll b/javascript/ql/lib/semmle/javascript/internal/flow_summaries/Strings.qll index d18e21819653..bf9442219a75 100644 --- a/javascript/ql/lib/semmle/javascript/internal/flow_summaries/Strings.qll +++ b/javascript/ql/lib/semmle/javascript/internal/flow_summaries/Strings.qll @@ -1,5 +1,5 @@ /** - * Contains flow summaries and steps modelling flow through string methods. + * Contains flow summaries and steps modeling flow through string methods. */ private import javascript @@ -73,7 +73,7 @@ class StringSplit extends SummarizedCallable { * These are of special significance when tracking a tainted URL suffix, such as `window.location.href`, * because the first element of the resulting array should not be considered tainted. * - * This summary defaults to the same behaviour as the general `.split()` case, but it contains optional steps + * This summary defaults to the same behavior as the general `.split()` case, but it contains optional steps * and barriers named `tainted-url-suffix` that should be activated when tracking a tainted URL suffix. */ class StringSplitHashOrQuestionMark extends SummarizedCallable { diff --git a/javascript/ql/lib/semmle/javascript/security/TaintedUrlSuffixCustomizations.qll b/javascript/ql/lib/semmle/javascript/security/TaintedUrlSuffixCustomizations.qll index d4bce73be197..841f830f2bf9 100644 --- a/javascript/ql/lib/semmle/javascript/security/TaintedUrlSuffixCustomizations.qll +++ b/javascript/ql/lib/semmle/javascript/security/TaintedUrlSuffixCustomizations.qll @@ -76,7 +76,7 @@ module TaintedUrlSuffix { // // x [tainted-url-suffix] --> x.split('#') [array element 1] [taint] // - // Technically we should also preverse tainted-url-suffix when entering the first array element of such + // Technically we should also preserve tainted-url-suffix when entering the first array element of such // a split, but this mostly leads to FPs since we currently don't track if the taint has been through URI-decoding. // (The query/fragment parts are often URI-decoded in practice, but not the other URL parts are not) state1.isTaintedUrlSuffix() and diff --git a/javascript/ql/src/Declarations/UnreachableMethodOverloads.ql b/javascript/ql/src/Declarations/UnreachableMethodOverloads.ql index 912d58ab54ca..0088af1a2c0c 100644 --- a/javascript/ql/src/Declarations/UnreachableMethodOverloads.ql +++ b/javascript/ql/src/Declarations/UnreachableMethodOverloads.ql @@ -46,9 +46,7 @@ string getKind(MemberDeclaration m) { * A call-signature that originates from a MethodSignature in the AST. */ private class MethodCallSig extends Function { - private MethodSignature signature; - - MethodCallSig() { this = signature.getBody() } + MethodCallSig() { this = any(MethodSignature signature).getBody() } int getNumOptionalParameter() { result = count(Parameter p | p = this.getParameter(_) and p.isDeclaredOptional()) diff --git a/javascript/ql/test/library-tests/FlowSummary/test.ql b/javascript/ql/test/library-tests/FlowSummary/test.ql index e8ca23a423cd..0e40dcdadb09 100644 --- a/javascript/ql/test/library-tests/FlowSummary/test.ql +++ b/javascript/ql/test/library-tests/FlowSummary/test.ql @@ -8,7 +8,7 @@ DataFlow::CallNode getACall(string name) { result.getCalleeNode().getALocalSource() = DataFlow::globalVarRef(name) } -module ConfigArg implements DataFlow::ConfigSig { +module FlowConfig implements DataFlow::ConfigSig { predicate isSource(DataFlow::Node node) { node = getACall("source") } predicate isSink(DataFlow::Node node) { node = getACall("sink").getAnArgument() } @@ -19,7 +19,7 @@ module ConfigArg implements DataFlow::ConfigSig { } } -module Configuration = DataFlow::Global; +module Flow = DataFlow::Global; class BasicBarrierGuard extends DataFlow::CallNode { BasicBarrierGuard() { this = getACall("isSafe") } @@ -32,5 +32,5 @@ class BasicBarrierGuard extends DataFlow::CallNode { deprecated class ConsistencyConfig extends ConsistencyConfiguration { ConsistencyConfig() { this = "ConsistencyConfig" } - override DataFlow::Node getAnAlert() { Configuration::flow(_, result) } + override DataFlow::Node getAnAlert() { Flow::flow(_, result) } } From 37997c05610f6fe5e55d9a570ff6d8de8f5a43c3 Mon Sep 17 00:00:00 2001 From: Michael Nebel Date: Mon, 1 Sep 2025 15:21:41 +0200 Subject: [PATCH 058/308] Rust: Fix some Ql4Ql violations. --- rust/ql/lib/codeql/rust/dataflow/internal/DataFlowImpl.qll | 3 ++- rust/ql/lib/codeql/rust/dataflow/internal/ModelsAsData.qll | 3 +++ rust/ql/lib/codeql/rust/elements/internal/CallImpl.qll | 3 +-- rust/ql/lib/codeql/rust/internal/Type.qll | 4 +--- 4 files changed, 7 insertions(+), 6 deletions(-) diff --git a/rust/ql/lib/codeql/rust/dataflow/internal/DataFlowImpl.qll b/rust/ql/lib/codeql/rust/dataflow/internal/DataFlowImpl.qll index 727f14bb94ab..47ae294492eb 100644 --- a/rust/ql/lib/codeql/rust/dataflow/internal/DataFlowImpl.qll +++ b/rust/ql/lib/codeql/rust/dataflow/internal/DataFlowImpl.qll @@ -196,7 +196,8 @@ private ExprCfgNode getALastEvalNode(ExprCfgNode e) { /** * Holds if a reverse local flow step should be added from the post-update node - * for `e` to the post-update node for the result. + * for `e` to the post-update node for the result. `preservesValue` is true + * if the step is value preserving. * * This is needed to allow for side-effects on compound expressions to propagate * to sub components. For example, in diff --git a/rust/ql/lib/codeql/rust/dataflow/internal/ModelsAsData.qll b/rust/ql/lib/codeql/rust/dataflow/internal/ModelsAsData.qll index 7f8df8d144ba..e5f6f09e17ad 100644 --- a/rust/ql/lib/codeql/rust/dataflow/internal/ModelsAsData.qll +++ b/rust/ql/lib/codeql/rust/dataflow/internal/ModelsAsData.qll @@ -52,6 +52,7 @@ private import codeql.rust.elements.internal.CallExprBaseImpl::Impl as CallExprB /** * Holds if in a call to the function with canonical path `path`, the value referred * to by `output` is a flow source of the given `kind`. + * The `madId` is the data extension row number. * * `output = "ReturnValue"` simply means the result of the call itself. * @@ -65,6 +66,7 @@ extensible predicate sourceModel( /** * Holds if in a call to the function with canonical path `path`, the value referred * to by `input` is a flow sink of the given `kind`. + * The `madId` is the data extension row number. * * For example, `input = Argument[0]` means the first argument of the call. * @@ -78,6 +80,7 @@ extensible predicate sinkModel( /** * Holds if in a call to the function with canonical path `path`, the value referred * to by `input` can flow to the value referred to by `output`. + * The `madId` is the data extension row number. * * `kind` should be either `value` or `taint`, for value-preserving or taint-preserving * steps, respectively. diff --git a/rust/ql/lib/codeql/rust/elements/internal/CallImpl.qll b/rust/ql/lib/codeql/rust/elements/internal/CallImpl.qll index ac6e08bb9cf7..020b50594a6d 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/CallImpl.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/CallImpl.qll @@ -123,11 +123,10 @@ module Impl { } class CallExprMethodCall extends Call instanceof CallExpr { - Path qualifier; string methodName; boolean selfIsRef; - CallExprMethodCall() { callIsMethodCall(this, qualifier, methodName, selfIsRef) } + CallExprMethodCall() { callIsMethodCall(this, _, methodName, selfIsRef) } /** * Holds if this call must have an explicit borrow for the `self` argument, diff --git a/rust/ql/lib/codeql/rust/internal/Type.qll b/rust/ql/lib/codeql/rust/internal/Type.qll index 56c179354b40..eaa7e83fc6da 100644 --- a/rust/ql/lib/codeql/rust/internal/Type.qll +++ b/rust/ql/lib/codeql/rust/internal/Type.qll @@ -620,9 +620,7 @@ final class TypeBoundTypeAbstraction extends TypeAbstraction, TypeBound { } final class SelfTypeBoundTypeAbstraction extends TypeAbstraction, Name { - private TraitTypeAbstraction trait; - - SelfTypeBoundTypeAbstraction() { trait.getName() = this } + SelfTypeBoundTypeAbstraction() { any(TraitTypeAbstraction trait).getName() = this } override TypeParameter getATypeParameter() { none() } } From 74a312735c80a11c8e7ec3894c51443ab9fea665 Mon Sep 17 00:00:00 2001 From: Joe Farebrother Date: Fri, 4 Jul 2025 15:53:02 +0100 Subject: [PATCH 059/308] Update integration test output --- .../query-suite/python-code-quality-extended.qls.expected | 8 ++++---- .../query-suite/python-code-quality.qls.expected | 8 ++++---- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/python/ql/integration-tests/query-suite/python-code-quality-extended.qls.expected b/python/ql/integration-tests/query-suite/python-code-quality-extended.qls.expected index 25790385f576..b0cb45325412 100644 --- a/python/ql/integration-tests/query-suite/python-code-quality-extended.qls.expected +++ b/python/ql/integration-tests/query-suite/python-code-quality-extended.qls.expected @@ -1,3 +1,7 @@ +ql/python/ql/src/Classes/CallsToInitDel/MissingCallToDel.ql +ql/python/ql/src/Classes/CallsToInitDel/MissingCallToInit.ql +ql/python/ql/src/Classes/CallsToInitDel/SuperclassDelCalledMultipleTimes.ql +ql/python/ql/src/Classes/CallsToInitDel/SuperclassInitCalledMultipleTimes.ql ql/python/ql/src/Classes/Comparisons/EqualsOrHash.ql ql/python/ql/src/Classes/Comparisons/EqualsOrNotEquals.ql ql/python/ql/src/Classes/Comparisons/IncompleteOrdering.ql @@ -5,12 +9,8 @@ ql/python/ql/src/Classes/ConflictingAttributesInBaseClasses.ql ql/python/ql/src/Classes/DefineEqualsWhenAddingAttributes.ql ql/python/ql/src/Classes/InconsistentMRO.ql ql/python/ql/src/Classes/InitCallsSubclass/InitCallsSubclassMethod.ql -ql/python/ql/src/Classes/MissingCallToDel.ql -ql/python/ql/src/Classes/MissingCallToInit.ql ql/python/ql/src/Classes/MutatingDescriptor.ql ql/python/ql/src/Classes/SubclassShadowing/SubclassShadowing.ql -ql/python/ql/src/Classes/SuperclassDelCalledMultipleTimes.ql -ql/python/ql/src/Classes/SuperclassInitCalledMultipleTimes.ql ql/python/ql/src/Classes/WrongNameForArgumentInClassInstantiation.ql ql/python/ql/src/Classes/WrongNumberArgumentsInClassInstantiation.ql ql/python/ql/src/Exceptions/CatchingBaseException.ql diff --git a/python/ql/integration-tests/query-suite/python-code-quality.qls.expected b/python/ql/integration-tests/query-suite/python-code-quality.qls.expected index 25790385f576..b0cb45325412 100644 --- a/python/ql/integration-tests/query-suite/python-code-quality.qls.expected +++ b/python/ql/integration-tests/query-suite/python-code-quality.qls.expected @@ -1,3 +1,7 @@ +ql/python/ql/src/Classes/CallsToInitDel/MissingCallToDel.ql +ql/python/ql/src/Classes/CallsToInitDel/MissingCallToInit.ql +ql/python/ql/src/Classes/CallsToInitDel/SuperclassDelCalledMultipleTimes.ql +ql/python/ql/src/Classes/CallsToInitDel/SuperclassInitCalledMultipleTimes.ql ql/python/ql/src/Classes/Comparisons/EqualsOrHash.ql ql/python/ql/src/Classes/Comparisons/EqualsOrNotEquals.ql ql/python/ql/src/Classes/Comparisons/IncompleteOrdering.ql @@ -5,12 +9,8 @@ ql/python/ql/src/Classes/ConflictingAttributesInBaseClasses.ql ql/python/ql/src/Classes/DefineEqualsWhenAddingAttributes.ql ql/python/ql/src/Classes/InconsistentMRO.ql ql/python/ql/src/Classes/InitCallsSubclass/InitCallsSubclassMethod.ql -ql/python/ql/src/Classes/MissingCallToDel.ql -ql/python/ql/src/Classes/MissingCallToInit.ql ql/python/ql/src/Classes/MutatingDescriptor.ql ql/python/ql/src/Classes/SubclassShadowing/SubclassShadowing.ql -ql/python/ql/src/Classes/SuperclassDelCalledMultipleTimes.ql -ql/python/ql/src/Classes/SuperclassInitCalledMultipleTimes.ql ql/python/ql/src/Classes/WrongNameForArgumentInClassInstantiation.ql ql/python/ql/src/Classes/WrongNumberArgumentsInClassInstantiation.ql ql/python/ql/src/Exceptions/CatchingBaseException.ql From e01519f547b458c9a02479f85624ba77d49f8651 Mon Sep 17 00:00:00 2001 From: Joe Farebrother Date: Fri, 4 Jul 2025 16:03:50 +0100 Subject: [PATCH 060/308] Add change note --- .../2025-06-04-missing-multiple-calls-to-init-del.md | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 python/ql/src/change-notes/2025-06-04-missing-multiple-calls-to-init-del.md diff --git a/python/ql/src/change-notes/2025-06-04-missing-multiple-calls-to-init-del.md b/python/ql/src/change-notes/2025-06-04-missing-multiple-calls-to-init-del.md new file mode 100644 index 000000000000..fe9a0cc110df --- /dev/null +++ b/python/ql/src/change-notes/2025-06-04-missing-multiple-calls-to-init-del.md @@ -0,0 +1,4 @@ +--- +minorAnalysis +--- +The queries `py/missing-call-to-init`, `py/missing-calls-to-del`, `py/multiple-calls-to-init`, and `py/multiple-calls-to-del` queries have been modernized; no longer relying on outdated libraries, and producing more precise results with more descriptive alert messages, and improved documentation. \ No newline at end of file From 5992dc3b0afea17e965054948282711fbdc26303 Mon Sep 17 00:00:00 2001 From: Joe Farebrother Date: Fri, 4 Jul 2025 16:26:07 +0100 Subject: [PATCH 061/308] Add qldoc --- .../CallsToInitDel/MethodCallOrder.qll | 21 +++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/python/ql/src/Classes/CallsToInitDel/MethodCallOrder.qll b/python/ql/src/Classes/CallsToInitDel/MethodCallOrder.qll index 02d60ca420e0..321da002fdc8 100644 --- a/python/ql/src/Classes/CallsToInitDel/MethodCallOrder.qll +++ b/python/ql/src/Classes/CallsToInitDel/MethodCallOrder.qll @@ -5,6 +5,7 @@ import semmle.python.ApiGraphs import semmle.python.dataflow.new.internal.DataFlowDispatch import codeql.util.Option +/** Holds if `meth` is a method named `name` that transitively calls `calledMulti` of the same name via the calls `call1` and `call2`. */ predicate multipleCallsToSuperclassMethod( Function meth, Function calledMulti, DataFlow::MethodCallNode call1, DataFlow::MethodCallNode call2, string name @@ -19,6 +20,7 @@ predicate multipleCallsToSuperclassMethod( ) } +/** Gets a method transitively called by `meth` named `name` with `call` that it overrides, with `mroBase` as the type determining the MRO to search. */ Function getASuperCallTargetFromCall( Class mroBase, Function meth, DataFlow::MethodCallNode call, string name ) { @@ -29,6 +31,7 @@ Function getASuperCallTargetFromCall( ) } +/** Gets the method called by `meth` named `name` with `call`, with `mroBase` as the type determining the MRO to search. */ Function getDirectSuperCallTargetFromCall( Class mroBase, Function meth, DataFlow::MethodCallNode call, string name ) { @@ -51,6 +54,7 @@ Function getDirectSuperCallTargetFromCall( ) } +/** Gets a method that is transitively called by a call to `cls.`, with `mroBase` as the type determining the MRO to search. */ Function getASuperCallTargetFromClass(Class mroBase, Class cls, string name) { exists(Function target | target = findFunctionAccordingToMroKnownStartingClass(cls, mroBase, name) and @@ -62,6 +66,7 @@ Function getASuperCallTargetFromClass(Class mroBase, Class cls, string name) { ) } +/** Holds if `meth` does something besides calling a superclass method. */ predicate nonTrivial(Function meth) { exists(Stmt s | s = meth.getAStmt() | not s instanceof Pass and @@ -74,6 +79,7 @@ predicate nonTrivial(Function meth) { exists(meth.getANormalExit()) // doesn't always raise an exception } +/** Holds if `call` is a call to `super().`. No distinction is made btween 0- and 2- arg super calls. */ predicate superCall(DataFlow::MethodCallNode call, string name) { exists(DataFlow::Node sup | call.calls(sup, name) and @@ -81,6 +87,7 @@ predicate superCall(DataFlow::MethodCallNode call, string name) { ) } +/** Holds if `meth` calls `super().` where `name` is the name of the method. */ predicate callsSuper(Function meth) { exists(DataFlow::MethodCallNode call | call.getScope() = meth and @@ -88,6 +95,7 @@ predicate callsSuper(Function meth) { ) } +/** Holds if `meth` calls `target.(self, ...)` with the call `call`. */ predicate callsMethodOnClassWithSelf( Function meth, DataFlow::MethodCallNode call, Class target, string name ) { @@ -99,6 +107,7 @@ predicate callsMethodOnClassWithSelf( ) } +/** Holds if `meth` calls a method named `name` passing its `self` argument as its first parameter, but the class it refers to is unknown. */ predicate callsMethodOnUnknownClassWithSelf(Function meth, string name) { exists(DataFlow::MethodCallNode call, DataFlow::Node callTarget, DataFlow::ParameterNode self | call.calls(callTarget, name) and @@ -108,6 +117,7 @@ predicate callsMethodOnUnknownClassWithSelf(Function meth, string name) { ) } +/** Holds if `base` does not call a superclass method `shouldCall` named `name` when it appears it should. */ predicate missingCallToSuperclassMethod(Class base, Function shouldCall, string name) { shouldCall.getName() = name and shouldCall.getScope() = getADirectSuperclass+(base) and @@ -117,6 +127,9 @@ predicate missingCallToSuperclassMethod(Class base, Function shouldCall, string not callsMethodOnUnknownClassWithSelf(getASuperCallTargetFromClass(base, base, name), name) } +/** Holds if `base` does not call a superclass method `shouldCall` named `name` when it appears it should. + * Results are restricted to hold only for the highest `base` class and the lowest `shouldCall` method in the heirarchy for which this applies. + */ predicate missingCallToSuperclassMethodRestricted(Class base, Function shouldCall, string name) { missingCallToSuperclassMethod(base, shouldCall, name) and not exists(Class superBase | @@ -131,6 +144,11 @@ predicate missingCallToSuperclassMethodRestricted(Class base, Function shouldCal ) } +/** + * If `base` contains a `super()` call, gets a method in the inheritence heirarchy of `name` in the MRO of `base` + * that does not contain a `super()` call, but would call `shouldCall` if it did, which does not otherwise get called + * during a call to `base.`. + * */ Function getPossibleMissingSuper(Class base, Function shouldCall, string name) { missingCallToSuperclassMethod(base, shouldCall, name) and exists(Function baseMethod | @@ -151,6 +169,7 @@ Function getPossibleMissingSuper(Class base, Function shouldCall, string name) { private module FunctionOption = Option; +/** An optional `Function`. */ class FunctionOption extends FunctionOption::Option { /** * Holds if this element is at the specified location. @@ -174,6 +193,7 @@ class FunctionOption extends FunctionOption::Option { endcolumn = 0 } + /** Gets the qualified name of this function. */ string getQualifiedName() { result = this.asSome().getQualifiedName() or @@ -182,6 +202,7 @@ class FunctionOption extends FunctionOption::Option { } } +/** Gets the result of `getPossibleMissingSuper`, or None if none exists. */ bindingset[name] FunctionOption getPossibleMissingSuperOption(Class base, Function shouldCall, string name) { result.asSome() = getPossibleMissingSuper(base, shouldCall, name) From 58f2bd4000f955b710a7b34d9655e357632d49ae Mon Sep 17 00:00:00 2001 From: Joe Farebrother Date: Fri, 4 Jul 2025 16:32:49 +0100 Subject: [PATCH 062/308] Fix changenote formatting --- .../2025-06-04-missing-multiple-calls-to-init-del.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/python/ql/src/change-notes/2025-06-04-missing-multiple-calls-to-init-del.md b/python/ql/src/change-notes/2025-06-04-missing-multiple-calls-to-init-del.md index fe9a0cc110df..5dfe5c2b8413 100644 --- a/python/ql/src/change-notes/2025-06-04-missing-multiple-calls-to-init-del.md +++ b/python/ql/src/change-notes/2025-06-04-missing-multiple-calls-to-init-del.md @@ -1,4 +1,4 @@ --- -minorAnalysis +category: minorAnalysis --- -The queries `py/missing-call-to-init`, `py/missing-calls-to-del`, `py/multiple-calls-to-init`, and `py/multiple-calls-to-del` queries have been modernized; no longer relying on outdated libraries, and producing more precise results with more descriptive alert messages, and improved documentation. \ No newline at end of file +* The queries `py/missing-call-to-init`, `py/missing-calls-to-del`, `py/multiple-calls-to-init`, and `py/multiple-calls-to-del` queries have been modernized; no longer relying on outdated libraries, producing more precise results with more descriptive alert messages, and improved documentation. \ No newline at end of file From c9dc54abf88261468efaed8d499adc72aba37bbf Mon Sep 17 00:00:00 2001 From: Joe Farebrother Date: Fri, 4 Jul 2025 16:35:52 +0100 Subject: [PATCH 063/308] Fix typos --- .../CallsToInitDel/MethodCallOrder.qll | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-) diff --git a/python/ql/src/Classes/CallsToInitDel/MethodCallOrder.qll b/python/ql/src/Classes/CallsToInitDel/MethodCallOrder.qll index 321da002fdc8..6506cb1a1933 100644 --- a/python/ql/src/Classes/CallsToInitDel/MethodCallOrder.qll +++ b/python/ql/src/Classes/CallsToInitDel/MethodCallOrder.qll @@ -31,7 +31,7 @@ Function getASuperCallTargetFromCall( ) } -/** Gets the method called by `meth` named `name` with `call`, with `mroBase` as the type determining the MRO to search. */ +/** Gets the method called by `meth` named `name` with `call`, with `mroBase` as the type determining the MRO to search. */ Function getDirectSuperCallTargetFromCall( Class mroBase, Function meth, DataFlow::MethodCallNode call, string name ) { @@ -54,7 +54,7 @@ Function getDirectSuperCallTargetFromCall( ) } -/** Gets a method that is transitively called by a call to `cls.`, with `mroBase` as the type determining the MRO to search. */ +/** Gets a method that is transitively called by a call to `cls.`, with `mroBase` as the type determining the MRO to search. */ Function getASuperCallTargetFromClass(Class mroBase, Class cls, string name) { exists(Function target | target = findFunctionAccordingToMroKnownStartingClass(cls, mroBase, name) and @@ -79,7 +79,7 @@ predicate nonTrivial(Function meth) { exists(meth.getANormalExit()) // doesn't always raise an exception } -/** Holds if `call` is a call to `super().`. No distinction is made btween 0- and 2- arg super calls. */ +/** Holds if `call` is a call to `super().`. No distinction is made between 0- and 2- arg super calls. */ predicate superCall(DataFlow::MethodCallNode call, string name) { exists(DataFlow::Node sup | call.calls(sup, name) and @@ -127,8 +127,9 @@ predicate missingCallToSuperclassMethod(Class base, Function shouldCall, string not callsMethodOnUnknownClassWithSelf(getASuperCallTargetFromClass(base, base, name), name) } -/** Holds if `base` does not call a superclass method `shouldCall` named `name` when it appears it should. - * Results are restricted to hold only for the highest `base` class and the lowest `shouldCall` method in the heirarchy for which this applies. +/** + * Holds if `base` does not call a superclass method `shouldCall` named `name` when it appears it should. + * Results are restricted to hold only for the highest `base` class and the lowest `shouldCall` method in the hierarchy for which this applies. */ predicate missingCallToSuperclassMethodRestricted(Class base, Function shouldCall, string name) { missingCallToSuperclassMethod(base, shouldCall, name) and @@ -144,11 +145,11 @@ predicate missingCallToSuperclassMethodRestricted(Class base, Function shouldCal ) } -/** - * If `base` contains a `super()` call, gets a method in the inheritence heirarchy of `name` in the MRO of `base` +/** + * If `base` contains a `super()` call, gets a method in the inheritance hierarchy of `name` in the MRO of `base` * that does not contain a `super()` call, but would call `shouldCall` if it did, which does not otherwise get called - * during a call to `base.`. - * */ + * during a call to `base.`. + */ Function getPossibleMissingSuper(Class base, Function shouldCall, string name) { missingCallToSuperclassMethod(base, shouldCall, name) and exists(Function baseMethod | From 72df584e9b202052ee80fedce966c114e068c2f5 Mon Sep 17 00:00:00 2001 From: Joe Farebrother Date: Mon, 7 Jul 2025 09:49:23 +0100 Subject: [PATCH 064/308] Update integration test outout and fix qhelp --- .../query-suite/python-security-and-quality.qls.expected | 8 ++++---- .../ql/src/Classes/CallsToInitDel/MissingCallToDel.qhelp | 2 +- .../CallsToInitDel/SuperclassDelCalledMultipleTimes.qhelp | 4 ++-- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/python/ql/integration-tests/query-suite/python-security-and-quality.qls.expected b/python/ql/integration-tests/query-suite/python-security-and-quality.qls.expected index 8f581e166c38..faa4204c3c71 100644 --- a/python/ql/integration-tests/query-suite/python-security-and-quality.qls.expected +++ b/python/ql/integration-tests/query-suite/python-security-and-quality.qls.expected @@ -1,3 +1,7 @@ +ql/python/ql/src/Classes/CallsToInitDel/MissingCallToDel.ql +ql/python/ql/src/Classes/CallsToInitDel/MissingCallToInit.ql +ql/python/ql/src/Classes/CallsToInitDel/SuperclassDelCalledMultipleTimes.ql +ql/python/ql/src/Classes/CallsToInitDel/SuperclassInitCalledMultipleTimes.ql ql/python/ql/src/Classes/Comparisons/EqualsOrHash.ql ql/python/ql/src/Classes/Comparisons/EqualsOrNotEquals.ql ql/python/ql/src/Classes/Comparisons/IncompleteOrdering.ql @@ -5,16 +9,12 @@ ql/python/ql/src/Classes/ConflictingAttributesInBaseClasses.ql ql/python/ql/src/Classes/DefineEqualsWhenAddingAttributes.ql ql/python/ql/src/Classes/InconsistentMRO.ql ql/python/ql/src/Classes/InitCallsSubclass/InitCallsSubclassMethod.ql -ql/python/ql/src/Classes/MissingCallToDel.ql -ql/python/ql/src/Classes/MissingCallToInit.ql ql/python/ql/src/Classes/MutatingDescriptor.ql ql/python/ql/src/Classes/OverwritingAttributeInSuperClass.ql ql/python/ql/src/Classes/PropertyInOldStyleClass.ql ql/python/ql/src/Classes/SlotsInOldStyleClass.ql ql/python/ql/src/Classes/SubclassShadowing/SubclassShadowing.ql ql/python/ql/src/Classes/SuperInOldStyleClass.ql -ql/python/ql/src/Classes/SuperclassDelCalledMultipleTimes.ql -ql/python/ql/src/Classes/SuperclassInitCalledMultipleTimes.ql ql/python/ql/src/Classes/WrongNameForArgumentInClassInstantiation.ql ql/python/ql/src/Classes/WrongNumberArgumentsInClassInstantiation.ql ql/python/ql/src/Diagnostics/ExtractedFiles.ql diff --git a/python/ql/src/Classes/CallsToInitDel/MissingCallToDel.qhelp b/python/ql/src/Classes/CallsToInitDel/MissingCallToDel.qhelp index a9897d3c682e..e461aebdc028 100644 --- a/python/ql/src/Classes/CallsToInitDel/MissingCallToDel.qhelp +++ b/python/ql/src/Classes/CallsToInitDel/MissingCallToDel.qhelp @@ -13,7 +13,7 @@ methods are called.

    Classes with a __del__ method (a finalizer) typically hold some resource such as a file handle that needs to be cleaned up. If the __del__ method of a superclass is not called during object finalization, it is likely that -that resources may be leaked. +resources may be leaked.

    A call to the __init__ method of a superclass during object initialization may be unintentionally skipped: diff --git a/python/ql/src/Classes/CallsToInitDel/SuperclassDelCalledMultipleTimes.qhelp b/python/ql/src/Classes/CallsToInitDel/SuperclassDelCalledMultipleTimes.qhelp index f828cfb8e648..df9c073fcceb 100644 --- a/python/ql/src/Classes/CallsToInitDel/SuperclassDelCalledMultipleTimes.qhelp +++ b/python/ql/src/Classes/CallsToInitDel/SuperclassDelCalledMultipleTimes.qhelp @@ -30,7 +30,7 @@ cleaned up properly as expected.

    Ensure that each finalizer method is called exactly once during finalization. -This can be ensured by calling super().__del__ for each finalizer methid in the inheritance chain. +This can be ensured by calling super().__del__ for each finalizer method in the inheritance chain.

    @@ -41,7 +41,7 @@ being called twice. FixedSportsCar.__del__ fixes this by using super() consistently with the other delete methods.

    - + From cc486ddb08ab2d7edb2325d1301907535a7d5004 Mon Sep 17 00:00:00 2001 From: Joe Farebrother Date: Mon, 7 Jul 2025 11:02:48 +0100 Subject: [PATCH 065/308] Remove tostring --- .../ql/src/Classes/CallsToInitDel/MethodCallOrder.qll | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/python/ql/src/Classes/CallsToInitDel/MethodCallOrder.qll b/python/ql/src/Classes/CallsToInitDel/MethodCallOrder.qll index 6506cb1a1933..6bb5a5862535 100644 --- a/python/ql/src/Classes/CallsToInitDel/MethodCallOrder.qll +++ b/python/ql/src/Classes/CallsToInitDel/MethodCallOrder.qll @@ -13,13 +13,21 @@ predicate multipleCallsToSuperclassMethod( exists(Class cls | meth.getName() = name and meth.getScope() = cls and - call1.getLocation().toString() < call2.getLocation().toString() and + locationBefore(call1.getLocation(), call2.getLocation()) and calledMulti = getASuperCallTargetFromCall(cls, meth, call1, name) and calledMulti = getASuperCallTargetFromCall(cls, meth, call2, name) and nonTrivial(calledMulti) ) } +/** Holds if l1 comes before l2, assuming they're in the same file. */ +private predicate locationBefore(Location l1, Location l2) { + l1.getStartLine() < l2.getStartLine() + or + l1.getStartLine() = l2.getStartLine() and + l1.getStartColumn() < l2.getStartColumn() +} + /** Gets a method transitively called by `meth` named `name` with `call` that it overrides, with `mroBase` as the type determining the MRO to search. */ Function getASuperCallTargetFromCall( Class mroBase, Function meth, DataFlow::MethodCallNode call, string name From fb0380bfbc719b76c1e3752009986b2364370351 Mon Sep 17 00:00:00 2001 From: Joe Farebrother Date: Mon, 14 Jul 2025 13:18:59 +0100 Subject: [PATCH 066/308] Inline locationBefore --- python/ql/src/Classes/CallsToInitDel/MethodCallOrder.qll | 1 + 1 file changed, 1 insertion(+) diff --git a/python/ql/src/Classes/CallsToInitDel/MethodCallOrder.qll b/python/ql/src/Classes/CallsToInitDel/MethodCallOrder.qll index 6bb5a5862535..98a1d70915b2 100644 --- a/python/ql/src/Classes/CallsToInitDel/MethodCallOrder.qll +++ b/python/ql/src/Classes/CallsToInitDel/MethodCallOrder.qll @@ -21,6 +21,7 @@ predicate multipleCallsToSuperclassMethod( } /** Holds if l1 comes before l2, assuming they're in the same file. */ +pragma[inline] private predicate locationBefore(Location l1, Location l2) { l1.getStartLine() < l2.getStartLine() or From ba68fe9a0f27036a86a4e05c1fc04e4b8199ba21 Mon Sep 17 00:00:00 2001 From: Joe Farebrother Date: Mon, 14 Jul 2025 13:30:56 +0100 Subject: [PATCH 067/308] Adress review suggestions - cleanups --- python/ql/src/Classes/CallsToInitDel/MethodCallOrder.qll | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/python/ql/src/Classes/CallsToInitDel/MethodCallOrder.qll b/python/ql/src/Classes/CallsToInitDel/MethodCallOrder.qll index 98a1d70915b2..bd98f3fb0fb7 100644 --- a/python/ql/src/Classes/CallsToInitDel/MethodCallOrder.qll +++ b/python/ql/src/Classes/CallsToInitDel/MethodCallOrder.qll @@ -45,7 +45,6 @@ Function getDirectSuperCallTargetFromCall( Class mroBase, Function meth, DataFlow::MethodCallNode call, string name ) { meth = call.getScope() and - getADirectSuperclass*(mroBase) = meth.getScope() and meth.getName() = name and call.calls(_, name) and mroBase = getADirectSubclass*(meth.getScope()) and @@ -56,7 +55,7 @@ Function getDirectSuperCallTargetFromCall( result = findFunctionAccordingToMroKnownStartingClass(targetCls, mroBase, name) or // targetCls is the mro base for this lookup. - // note however that if the call we find uses super(), that still uses the mro of the instance `self` will sill be used + // note however that if the call we find uses super(), that still uses the mro of the instance `self` // assuming it's 0-arg or is 2-arg with `self` as second arg. callsMethodOnClassWithSelf(meth, call, targetCls, _) and result = findFunctionAccordingToMroKnownStartingClass(targetCls, targetCls, name) @@ -96,7 +95,7 @@ predicate superCall(DataFlow::MethodCallNode call, string name) { ) } -/** Holds if `meth` calls `super().` where `name` is the name of the method. */ +/** Holds if `meth` calls a `super()` method of the same name. */ predicate callsSuper(Function meth) { exists(DataFlow::MethodCallNode call | call.getScope() = meth and @@ -122,7 +121,7 @@ predicate callsMethodOnUnknownClassWithSelf(Function meth, string name) { call.calls(callTarget, name) and self.getParameter() = meth.getArg(0) and self.(DataFlow::LocalSourceNode).flowsTo(call.getArg(0)) and - not exists(Class target | callTarget = classTracker(target)) + not callTarget = classTracker(any(Class target)) ) } From 8c9c66c0025758f694d82fbf1195ec7a423641d1 Mon Sep 17 00:00:00 2001 From: Joe Farebrother Date: Fri, 18 Jul 2025 14:18:03 +0100 Subject: [PATCH 068/308] Fix typo in example --- .../examples/SuperclassInitCalledMultipleTimesGood2.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/python/ql/src/Classes/CallsToInitDel/examples/SuperclassInitCalledMultipleTimesGood2.py b/python/ql/src/Classes/CallsToInitDel/examples/SuperclassInitCalledMultipleTimesGood2.py index ab8d98116aaf..9e4bbdea0584 100644 --- a/python/ql/src/Classes/CallsToInitDel/examples/SuperclassInitCalledMultipleTimesGood2.py +++ b/python/ql/src/Classes/CallsToInitDel/examples/SuperclassInitCalledMultipleTimesGood2.py @@ -14,7 +14,7 @@ def __init__(self): self.c = 2 class D(B,C): - def __init__(self): # GOOD: Each method calls super, so each init method runs once. self.stat =e will be set to "B". + def __init__(self): # GOOD: Each method calls super, so each init method runs once. self.state will be set to "B". super().__init__() self.d = 1 From 8545c7d36fc062453e35c745c5d7e1f11cbb3551 Mon Sep 17 00:00:00 2001 From: Joe Farebrother Date: Mon, 21 Jul 2025 15:54:36 +0100 Subject: [PATCH 069/308] Fix doc typo --- python/ql/src/Classes/CallsToInitDel/MissingCallToDel.qhelp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/python/ql/src/Classes/CallsToInitDel/MissingCallToDel.qhelp b/python/ql/src/Classes/CallsToInitDel/MissingCallToDel.qhelp index e461aebdc028..83aac7629eba 100644 --- a/python/ql/src/Classes/CallsToInitDel/MissingCallToDel.qhelp +++ b/python/ql/src/Classes/CallsToInitDel/MissingCallToDel.qhelp @@ -16,7 +16,7 @@ If the __del__ method of a superclass is not called during object resources may be leaked.

    -

    A call to the __init__ method of a superclass during object initialization may be unintentionally skipped: +

    A call to the __del__ method of a superclass during object initialization may be unintentionally skipped: