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:
- If a subclass calls the
__del__ method of the wrong class.
From f7097136f1fbf647bf5aa887f65133db56c9d6b8 Mon Sep 17 00:00:00 2001
From: Joe Farebrother
Date: Mon, 1 Sep 2025 16:23:42 +0100
Subject: [PATCH 070/308] Rank multiple calls so only the first 2 calls are
alerted
---
.../CallsToInitDel/MethodCallOrder.qll | 50 ++++++-------------
.../multiple/multiple-init/multiple_init.py | 30 ++++++++++-
2 files changed, 43 insertions(+), 37 deletions(-)
diff --git a/python/ql/src/Classes/CallsToInitDel/MethodCallOrder.qll b/python/ql/src/Classes/CallsToInitDel/MethodCallOrder.qll
index bd98f3fb0fb7..c0f35658788a 100644
--- a/python/ql/src/Classes/CallsToInitDel/MethodCallOrder.qll
+++ b/python/ql/src/Classes/CallsToInitDel/MethodCallOrder.qll
@@ -14,12 +14,23 @@ predicate multipleCallsToSuperclassMethod(
meth.getName() = name and
meth.getScope() = cls and
locationBefore(call1.getLocation(), call2.getLocation()) and
- calledMulti = getASuperCallTargetFromCall(cls, meth, call1, name) and
- calledMulti = getASuperCallTargetFromCall(cls, meth, call2, name) and
+ rankedSuperCallByLocation(1, cls, meth, call1, name, calledMulti) and
+ rankedSuperCallByLocation(2, cls, meth, call2, name, calledMulti) and
nonTrivial(calledMulti)
)
}
+predicate rankedSuperCallByLocation(
+ int i, Class mroBase, Function meth, DataFlow::MethodCallNode call, string name, Function target
+) {
+ call =
+ rank[i](DataFlow::MethodCallNode calli |
+ target = getASuperCallTargetFromCall(mroBase, meth, calli, name)
+ |
+ calli order by calli.getLocation().getStartLine(), calli.getLocation().getStartColumn()
+ )
+}
+
/** Holds if l1 comes before l2, assuming they're in the same file. */
pragma[inline]
private predicate locationBefore(Location l1, Location l2) {
@@ -176,40 +187,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.
- * 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
- }
-
- /** Gets the qualified name of this function. */
- string getQualifiedName() {
- result = this.asSome().getQualifiedName()
- or
- this.isNone() and
- result = ""
- }
-}
+private class FunctionOption = LocatableOption::Option;
/** Gets the result of `getPossibleMissingSuper`, or None if none exists. */
bindingset[name]
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 59efb28e691e..faa0a71c6db3 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
@@ -86,4 +86,32 @@ def __init__(self): # $ Alert # F2's super call calls F3
F2.__init__(self)
F3.__init__(self)
-F4()
\ No newline at end of file
+F4()
+
+class G1:
+ def __init__(self):
+ print("G1 init")
+
+class G2(G1):
+ def __init__(self):
+ print("G2 init")
+ G1.__init__(self)
+
+class G3(G1):
+ def __init__(self):
+ print("G3 init")
+ G1.__init__(self)
+
+class G4(G1):
+ def __init__(self):
+ print("G4 init")
+ G1.__init__(self)
+
+class G5(G2,G3,G4):
+ def __init__(self): # $ Alert # Only one alert is generated, that mentions the first two calls
+ print("G5 init")
+ G2.__init__(self)
+ G3.__init__(self)
+ G4.__init__(self)
+
+G5()
\ No newline at end of file
From 3d4d347150224d68a2048d4f0195cb42b34b28ca Mon Sep 17 00:00:00 2001
From: Anders Schack-Mulligen
Date: Tue, 2 Sep 2025 11:10:00 +0200
Subject: [PATCH 071/308] SuccessorType: Address review comments.
---
.../csharp/controlflow/internal/Splitting.qll | 5 +-
.../ruby/controlflow/internal/Splitting.qll | 5 +-
shared/controlflow/codeql/controlflow/Cfg.qll | 6 ++
.../codeql/controlflow/SuccessorType.qll | 88 +++++++++----------
4 files changed, 50 insertions(+), 54 deletions(-)
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 2c026c9370be..bcc4c48ec924 100644
--- a/csharp/ql/lib/semmle/code/csharp/controlflow/internal/Splitting.qll
+++ b/csharp/ql/lib/semmle/code/csharp/controlflow/internal/Splitting.qll
@@ -470,12 +470,9 @@ module FinallySplitting {
* then the `finally` block must end with a `return` as well (provided that
* the `finally` block exits normally).
*/
- class FinallySplitType instanceof Cfg::SuccessorType {
+ class FinallySplitType extends 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) {
if c instanceof NormalCompletion
diff --git a/ruby/ql/lib/codeql/ruby/controlflow/internal/Splitting.qll b/ruby/ql/lib/codeql/ruby/controlflow/internal/Splitting.qll
index 6a8092922171..782315dc14ca 100644
--- a/ruby/ql/lib/codeql/ruby/controlflow/internal/Splitting.qll
+++ b/ruby/ql/lib/codeql/ruby/controlflow/internal/Splitting.qll
@@ -122,12 +122,9 @@ module EnsureSplitting {
* the `ensure` block must end with a `return` as well (provided that
* the `ensure` block executes normally).
*/
- class EnsureSplitType instanceof SuccessorType {
+ class EnsureSplitType extends 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
diff --git a/shared/controlflow/codeql/controlflow/Cfg.qll b/shared/controlflow/codeql/controlflow/Cfg.qll
index 20801e7438e7..4945c8da9cfa 100644
--- a/shared/controlflow/codeql/controlflow/Cfg.qll
+++ b/shared/controlflow/codeql/controlflow/Cfg.qll
@@ -945,6 +945,12 @@ module MakeWithSplitting<
)
}
+ /** Holds if `t` is an abnormal exit type out of a CFG scope. */
+ private predicate isAbnormalExitType(SuccessorType t) {
+ t instanceof ExceptionSuccessor or
+ t instanceof ExitSuccessor
+ }
+
/**
* Internal representation of control flow nodes in the control flow graph.
* The control flow graph is pruned for unreachable nodes.
diff --git a/shared/controlflow/codeql/controlflow/SuccessorType.qll b/shared/controlflow/codeql/controlflow/SuccessorType.qll
index 9dcbbc9bd271..cc673c9e5cab 100644
--- a/shared/controlflow/codeql/controlflow/SuccessorType.qll
+++ b/shared/controlflow/codeql/controlflow/SuccessorType.qll
@@ -1,13 +1,8 @@
/**
* 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
-
-/*
+ *
+ * ```text
* SuccessorType
* |- NormalSuccessor
* | |- DirectSuccessor
@@ -25,9 +20,13 @@ private import codeql.util.Boolean
* |- ContinueSuccessor
* |- GotoSuccessor
* |- RedoSuccessor // rare, used in Ruby
- * |- RetrySuccessor // rare, used in Ruby
- * \- JavaYieldSuccessor
+ * \- RetrySuccessor // rare, used in Ruby
+ * ```
*/
+overlay[local]
+module;
+
+private import codeql.util.Boolean
private newtype TSuccessorType =
TDirectSuccessor() or
@@ -42,8 +41,7 @@ private newtype TSuccessorType =
TContinueSuccessor() or
TGotoSuccessor() or
TRedoSuccessor() or
- TRetrySuccessor() or
- TJavaYieldSuccessor()
+ TRetrySuccessor()
/**
* The type of a control flow successor.
@@ -52,21 +50,25 @@ private newtype TSuccessorType =
* successors, or abrupt, which covers all other types of successors including
* for example exceptions, returns, and other jumps.
*/
-class SuccessorType extends TSuccessorType {
+private class SuccessorTypeImpl extends TSuccessorType {
/** Gets a textual representation of this successor type. */
abstract string toString();
}
+final class SuccessorType = SuccessorTypeImpl;
+
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 { }
+abstract private class NormalSuccessorImpl extends SuccessorTypeImpl, TNormalSuccessor { }
+
+final class NormalSuccessor = NormalSuccessorImpl;
/** A direct control flow successor. */
-class DirectSuccessor extends NormalSuccessor, TDirectSuccessor {
+class DirectSuccessor extends NormalSuccessorImpl, TDirectSuccessor {
override string toString() { result = "successor" }
}
@@ -78,11 +80,13 @@ private class TConditionalSuccessor =
* a nullness successor (`NullnessSuccessor`), a matching successor (`MatchingSuccessor`),
* or an emptiness successor (`EmptinessSuccessor`).
*/
-abstract class ConditionalSuccessor extends NormalSuccessor, TConditionalSuccessor {
+abstract private class ConditionalSuccessorImpl extends NormalSuccessorImpl, TConditionalSuccessor {
/** Gets the Boolean value of this successor. */
abstract boolean getValue();
}
+final class ConditionalSuccessor = ConditionalSuccessorImpl;
+
/**
* A Boolean control flow successor.
*
@@ -97,7 +101,7 @@ abstract class ConditionalSuccessor extends NormalSuccessor, TConditionalSuccess
*
* has a control flow graph containing Boolean successors:
*
- * ```
+ * ```text
* if
* |
* x < 0
@@ -109,7 +113,7 @@ abstract class ConditionalSuccessor extends NormalSuccessor, TConditionalSuccess
* return 0 return 1
* ```
*/
-class BooleanSuccessor extends ConditionalSuccessor, TBooleanSuccessor {
+class BooleanSuccessor extends ConditionalSuccessorImpl, TBooleanSuccessor {
override boolean getValue() { this = TBooleanSuccessor(result) }
override string toString() { result = this.getValue().toString() }
@@ -126,7 +130,7 @@ class BooleanSuccessor extends ConditionalSuccessor, TBooleanSuccessor {
*
* has a control flow graph containing nullness successors:
*
- * ```
+ * ```text
* enter M
* |
* s
@@ -141,7 +145,7 @@ class BooleanSuccessor extends ConditionalSuccessor, TBooleanSuccessor {
* exit M
* ```
*/
-class NullnessSuccessor extends ConditionalSuccessor, TNullnessSuccessor {
+class NullnessSuccessor extends ConditionalSuccessorImpl, TNullnessSuccessor {
/** Holds if this is a `null` successor. */
predicate isNull() { this = TNullnessSuccessor(true) }
@@ -166,7 +170,7 @@ class NullnessSuccessor extends ConditionalSuccessor, TNullnessSuccessor {
*
* has a control flow graph containing matching successors:
*
- * ```
+ * ```text
* switch
* |
* x
@@ -182,7 +186,7 @@ class NullnessSuccessor extends ConditionalSuccessor, TNullnessSuccessor {
* return 1
* ```
*/
-class MatchingSuccessor extends ConditionalSuccessor, TMatchingSuccessor {
+class MatchingSuccessor extends ConditionalSuccessorImpl, TMatchingSuccessor {
/** Holds if this is a match successor. */
predicate isMatch() { this = TMatchingSuccessor(true) }
@@ -206,7 +210,7 @@ class MatchingSuccessor extends ConditionalSuccessor, TMatchingSuccessor {
*
* has a control flow graph containing emptiness successors:
*
- * ```
+ * ```text
* args
* |
* loop-header------<-----
@@ -223,7 +227,7 @@ class MatchingSuccessor extends ConditionalSuccessor, TMatchingSuccessor {
* \_________/
* ```
*/
-class EmptinessSuccessor extends ConditionalSuccessor, TEmptinessSuccessor {
+class EmptinessSuccessor extends ConditionalSuccessorImpl, TEmptinessSuccessor {
/** Holds if this is an empty successor. */
predicate isEmpty() { this = TEmptinessSuccessor(true) }
@@ -236,7 +240,9 @@ private class TAbruptSuccessor =
TExceptionSuccessor or TReturnSuccessor or TExitSuccessor or TJumpSuccessor;
/** An abrupt control flow successor. */
-abstract class AbruptSuccessor extends SuccessorType, TAbruptSuccessor { }
+abstract private class AbruptSuccessorImpl extends SuccessorTypeImpl, TAbruptSuccessor { }
+
+final class AbruptSuccessor = AbruptSuccessorImpl;
/**
* An exceptional control flow successor.
@@ -255,7 +261,7 @@ abstract class AbruptSuccessor extends SuccessorType, TAbruptSuccessor { }
* The callable exit node of `M` is an exceptional successor of the node
* `throw new ArgumentNullException(nameof(s));`.
*/
-class ExceptionSuccessor extends AbruptSuccessor, TExceptionSuccessor {
+class ExceptionSuccessor extends AbruptSuccessorImpl, TExceptionSuccessor {
override string toString() { result = "exception" }
}
@@ -274,7 +280,7 @@ class ExceptionSuccessor extends AbruptSuccessor, TExceptionSuccessor {
* The callable exit node of `M` is a `return` successor of the `return;`
* statement.
*/
-class ReturnSuccessor extends AbruptSuccessor, TReturnSuccessor {
+class ReturnSuccessor extends AbruptSuccessorImpl, TReturnSuccessor {
override string toString() { result = "return" }
}
@@ -294,13 +300,12 @@ class ReturnSuccessor extends AbruptSuccessor, TReturnSuccessor {
*
* The callable exit node of `M` is an exit successor of the node on line 4.
*/
-class ExitSuccessor extends AbruptSuccessor, TExitSuccessor {
+class ExitSuccessor extends AbruptSuccessorImpl, TExitSuccessor {
override string toString() { result = "exit" }
}
private class TJumpSuccessor =
- TBreakSuccessor or TContinueSuccessor or TGotoSuccessor or TRedoSuccessor or TRetrySuccessor or
- TJavaYieldSuccessor;
+ TBreakSuccessor or TContinueSuccessor or TGotoSuccessor or TRedoSuccessor or TRetrySuccessor;
/**
* A jump control flow successor.
@@ -308,40 +313,31 @@ private class TJumpSuccessor =
* This covers non-exceptional, non-local control flow, such as `break`,
* `continue`, and `goto`.
*/
-abstract class JumpSuccessor extends AbruptSuccessor, TJumpSuccessor { }
+abstract private class JumpSuccessorImpl extends AbruptSuccessorImpl, TJumpSuccessor { }
+
+final class JumpSuccessor = JumpSuccessorImpl;
/** A `break` control flow successor. */
-class BreakSuccessor extends JumpSuccessor, TBreakSuccessor {
+class BreakSuccessor extends JumpSuccessorImpl, TBreakSuccessor {
override string toString() { result = "break" }
}
/** A `continue` control flow successor. */
-class ContinueSuccessor extends JumpSuccessor, TContinueSuccessor {
+class ContinueSuccessor extends JumpSuccessorImpl, TContinueSuccessor {
override string toString() { result = "continue" }
}
/** A `goto` control flow successor. */
-class GotoSuccessor extends JumpSuccessor, TGotoSuccessor {
+class GotoSuccessor extends JumpSuccessorImpl, TGotoSuccessor {
override string toString() { result = "goto" }
}
/** A `redo` control flow successor (rare, used in Ruby). */
-class RedoSuccessor extends JumpSuccessor, TRedoSuccessor {
+class RedoSuccessor extends JumpSuccessorImpl, TRedoSuccessor {
override string toString() { result = "redo" }
}
/** A `retry` control flow successor (rare, used in Ruby). */
-class RetrySuccessor extends JumpSuccessor, TRetrySuccessor {
+class RetrySuccessor extends JumpSuccessorImpl, TRetrySuccessor {
override string toString() { result = "retry" }
}
-
-/** A Java `yield` control flow successor. */
-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
-}
From 60845001dd22dd5c35849597b424c08bd160774e Mon Sep 17 00:00:00 2001
From: Jeroen Ketema
Date: Fri, 29 Aug 2025 17:46:19 +0200
Subject: [PATCH 072/308] C++: Add `sizeof` VLA IR test cases
---
.../library-tests/ir/ir/PrintAST.expected | 180 ++++++++++++++++++
.../library-tests/ir/ir/aliased_ir.expected | 19 ++
.../ir/ir/aliased_ssa_consistency.expected | 1 +
.../aliased_ssa_consistency_unsound.expected | 1 +
cpp/ql/test/library-tests/ir/ir/ir.cpp | 14 ++
.../ir/ir/raw_consistency.expected | 24 +++
.../test/library-tests/ir/ir/raw_ir.expected | 90 +++++++++
.../ir/ir/unaliased_ssa_consistency.expected | 1 +
...unaliased_ssa_consistency_unsound.expected | 1 +
9 files changed, 331 insertions(+)
diff --git a/cpp/ql/test/library-tests/ir/ir/PrintAST.expected b/cpp/ql/test/library-tests/ir/ir/PrintAST.expected
index c3085da03ab5..b03bd3266044 100644
--- a/cpp/ql/test/library-tests/ir/ir/PrintAST.expected
+++ b/cpp/ql/test/library-tests/ir/ir/PrintAST.expected
@@ -24581,6 +24581,186 @@ ir.cpp:
# 2776| Value = [CStyleCast] 42
# 2776| ValueCategory = prvalue
# 2777| getStmt(2): [ReturnStmt] return ...
+# 2779| [TopLevelFunction] void vla_sizeof_test(int, size_t, char)
+# 2779| :
+# 2779| getParameter(0): [Parameter] len1
+# 2779| Type = [IntType] int
+# 2779| getParameter(1): [Parameter] len2
+# 2779| Type = [CTypedefType,Size_t] size_t
+# 2779| getParameter(2): [Parameter] len3
+# 2779| Type = [PlainCharType] char
+# 2780| getEntryPoint(): [BlockStmt] { ... }
+# 2781| getStmt(0): [DeclStmt] declaration
+# 2781| getDeclarationEntry(0): [VariableDeclarationEntry] definition of tmp1
+# 2781| Type = [ArrayType] char[]
+# 2781| getStmt(1): [VlaDimensionStmt] VLA dimension size
+# 2781| getDimensionExpr(): [VariableAccess] len1
+# 2781| Type = [IntType] int
+# 2781| ValueCategory = prvalue(load)
+# 2781| getStmt(2): [VlaDeclStmt] VLA declaration
+# 2782| getStmt(3): [DeclStmt] declaration
+# 2782| getDeclarationEntry(0): [VariableDeclarationEntry] definition of x
+# 2782| Type = [CTypedefType,Size_t] size_t
+# 2782| getVariable().getInitializer(): [Initializer] initializer for x
+# 2782| getExpr(): [SizeofExprOperator] sizeof()
+# 2782| Type = [LongType] unsigned long
+# 2782| ValueCategory = prvalue
+# 2782| getExprOperand(): [VariableAccess] tmp1
+# 2782| Type = [ArrayType] char[]
+# 2782| ValueCategory = lvalue
+# 2782| getExprOperand().getFullyConverted(): [ParenthesisExpr] (...)
+# 2782| Type = [ArrayType] char[]
+# 2782| ValueCategory = lvalue
+# 2783| getStmt(4): [DeclStmt] declaration
+# 2783| getDeclarationEntry(0): [VariableDeclarationEntry] definition of tmp2
+# 2783| Type = [ArrayType] int[][]
+# 2783| getStmt(5): [VlaDimensionStmt] VLA dimension size
+# 2783| getDimensionExpr(): [VariableAccess] len1
+# 2783| Type = [IntType] int
+# 2783| ValueCategory = prvalue(load)
+# 2783| getStmt(6): [VlaDimensionStmt] VLA dimension size
+# 2783| getDimensionExpr(): [VariableAccess] len2
+# 2783| Type = [CTypedefType,Size_t] size_t
+# 2783| ValueCategory = prvalue(load)
+# 2783| getStmt(7): [VlaDeclStmt] VLA declaration
+# 2784| getStmt(8): [DeclStmt] declaration
+# 2784| getDeclarationEntry(0): [VariableDeclarationEntry] definition of y
+# 2784| Type = [CTypedefType,Size_t] size_t
+# 2784| getVariable().getInitializer(): [Initializer] initializer for y
+# 2784| getExpr(): [SizeofExprOperator] sizeof()
+# 2784| Type = [LongType] unsigned long
+# 2784| ValueCategory = prvalue
+# 2784| getExprOperand(): [VariableAccess] tmp2
+# 2784| Type = [ArrayType] int[][]
+# 2784| ValueCategory = lvalue
+# 2784| getExprOperand().getFullyConverted(): [ParenthesisExpr] (...)
+# 2784| Type = [ArrayType] int[][]
+# 2784| ValueCategory = lvalue
+# 2785| getStmt(9): [DeclStmt] declaration
+# 2785| getDeclarationEntry(0): [VariableDeclarationEntry] definition of z
+# 2785| Type = [CTypedefType,Size_t] size_t
+# 2785| getVariable().getInitializer(): [Initializer] initializer for z
+# 2785| getExpr(): [SizeofExprOperator] sizeof()
+# 2785| Type = [LongType] unsigned long
+# 2785| ValueCategory = prvalue
+# 2785| getExprOperand(): [PointerDereferenceExpr] * ...
+# 2785| Type = [ArrayType] int[]
+# 2785| ValueCategory = lvalue
+# 2785| getOperand(): [VariableAccess] tmp2
+# 2785| Type = [ArrayType] int[][]
+# 2785| ValueCategory = lvalue
+# 2785| getOperand().getFullyConverted(): [ArrayToPointerConversion] array to pointer conversion
+# 2785| Type = [PointerType] int(*)[]
+# 2785| ValueCategory = prvalue
+# 2785| getExprOperand().getFullyConverted(): [ParenthesisExpr] (...)
+# 2785| Type = [ArrayType] int[]
+# 2785| ValueCategory = lvalue
+# 2786| getStmt(10): [DeclStmt] declaration
+# 2786| getDeclarationEntry(0): [VariableDeclarationEntry] definition of tmp3
+# 2786| Type = [ArrayType] int[][][]
+# 2786| getStmt(11): [VlaDimensionStmt] VLA dimension size
+# 2786| getDimensionExpr(): [VariableAccess] len1
+# 2786| Type = [IntType] int
+# 2786| ValueCategory = prvalue(load)
+# 2786| getStmt(12): [VlaDimensionStmt] VLA dimension size
+# 2786| getDimensionExpr(): [VariableAccess] len2
+# 2786| Type = [CTypedefType,Size_t] size_t
+# 2786| ValueCategory = prvalue(load)
+# 2786| getStmt(13): [VlaDimensionStmt] VLA dimension size
+# 2786| getDimensionExpr(): [VariableAccess] len3
+# 2786| Type = [PlainCharType] char
+# 2786| ValueCategory = prvalue(load)
+# 2786| getStmt(14): [VlaDeclStmt] VLA declaration
+# 2787| getStmt(15): [DeclStmt] declaration
+# 2787| getDeclarationEntry(0): [VariableDeclarationEntry] definition of w
+# 2787| Type = [CTypedefType,Size_t] size_t
+# 2787| getVariable().getInitializer(): [Initializer] initializer for w
+# 2787| getExpr(): [SizeofExprOperator] sizeof()
+# 2787| Type = [LongType] unsigned long
+# 2787| ValueCategory = prvalue
+# 2787| getExprOperand(): [VariableAccess] tmp3
+# 2787| Type = [ArrayType] int[][][]
+# 2787| ValueCategory = lvalue
+# 2787| getExprOperand().getFullyConverted(): [ParenthesisExpr] (...)
+# 2787| Type = [ArrayType] int[][][]
+# 2787| ValueCategory = lvalue
+# 2788| getStmt(16): [DeclStmt] declaration
+# 2788| getDeclarationEntry(0): [VariableDeclarationEntry] definition of v
+# 2788| Type = [CTypedefType,Size_t] size_t
+# 2788| getVariable().getInitializer(): [Initializer] initializer for v
+# 2788| getExpr(): [SizeofExprOperator] sizeof()
+# 2788| Type = [LongType] unsigned long
+# 2788| ValueCategory = prvalue
+# 2788| getExprOperand(): [PointerDereferenceExpr] * ...
+# 2788| Type = [ArrayType] int[][]
+# 2788| ValueCategory = lvalue
+# 2788| getOperand(): [VariableAccess] tmp3
+# 2788| Type = [ArrayType] int[][][]
+# 2788| ValueCategory = lvalue
+# 2788| getOperand().getFullyConverted(): [ArrayToPointerConversion] array to pointer conversion
+# 2788| Type = [PointerType] int(*)[][]
+# 2788| ValueCategory = prvalue
+# 2788| getExprOperand().getFullyConverted(): [ParenthesisExpr] (...)
+# 2788| Type = [ArrayType] int[][]
+# 2788| ValueCategory = lvalue
+# 2789| getStmt(17): [DeclStmt] declaration
+# 2789| getDeclarationEntry(0): [VariableDeclarationEntry] definition of u
+# 2789| Type = [CTypedefType,Size_t] size_t
+# 2789| getVariable().getInitializer(): [Initializer] initializer for u
+# 2789| getExpr(): [SizeofExprOperator] sizeof()
+# 2789| Type = [LongType] unsigned long
+# 2789| ValueCategory = prvalue
+# 2789| getExprOperand(): [PointerDereferenceExpr] * ...
+# 2789| Type = [ArrayType] int[]
+# 2789| ValueCategory = lvalue
+# 2789| getOperand(): [PointerDereferenceExpr] * ...
+# 2789| Type = [ArrayType] int[][]
+# 2789| ValueCategory = lvalue
+# 2789| getOperand(): [VariableAccess] tmp3
+# 2789| Type = [ArrayType] int[][][]
+# 2789| ValueCategory = lvalue
+# 2789| getOperand().getFullyConverted(): [ArrayToPointerConversion] array to pointer conversion
+# 2789| Type = [PointerType] int(*)[][]
+# 2789| ValueCategory = prvalue
+# 2789| getOperand().getFullyConverted(): [ArrayToPointerConversion] array to pointer conversion
+# 2789| Type = [PointerType] int(*)[]
+# 2789| ValueCategory = prvalue
+# 2789| getExprOperand().getFullyConverted(): [ParenthesisExpr] (...)
+# 2789| Type = [ArrayType] int[]
+# 2789| ValueCategory = lvalue
+# 2790| getStmt(18): [DeclStmt] declaration
+# 2790| getDeclarationEntry(0): [VariableDeclarationEntry] definition of t
+# 2790| Type = [CTypedefType,Size_t] size_t
+# 2790| getVariable().getInitializer(): [Initializer] initializer for t
+# 2790| getExpr(): [SizeofExprOperator] sizeof()
+# 2790| Type = [LongType] unsigned long
+# 2790| Value = [SizeofExprOperator] 4
+# 2790| ValueCategory = prvalue
+# 2790| getExprOperand(): [PointerDereferenceExpr] * ...
+# 2790| Type = [IntType] int
+# 2790| ValueCategory = lvalue
+# 2790| getOperand(): [PointerDereferenceExpr] * ...
+# 2790| Type = [ArrayType] int[]
+# 2790| ValueCategory = lvalue
+# 2790| getOperand(): [PointerDereferenceExpr] * ...
+# 2790| Type = [ArrayType] int[][]
+# 2790| ValueCategory = lvalue
+# 2790| getOperand(): [VariableAccess] tmp3
+# 2790| Type = [ArrayType] int[][][]
+# 2790| ValueCategory = lvalue
+# 2790| getOperand().getFullyConverted(): [ArrayToPointerConversion] array to pointer conversion
+# 2790| Type = [PointerType] int(*)[][]
+# 2790| ValueCategory = prvalue
+# 2790| getOperand().getFullyConverted(): [ArrayToPointerConversion] array to pointer conversion
+# 2790| Type = [PointerType] int(*)[]
+# 2790| ValueCategory = prvalue
+# 2790| getOperand().getFullyConverted(): [ArrayToPointerConversion] array to pointer conversion
+# 2790| Type = [IntPointerType] int *
+# 2790| ValueCategory = prvalue
+# 2790| getExprOperand().getFullyConverted(): [ParenthesisExpr] (...)
+# 2790| Type = [IntType] int
+# 2790| ValueCategory = lvalue
+# 2791| getStmt(19): [ReturnStmt] return ...
ir23.cpp:
# 1| [TopLevelFunction] bool consteval_1()
# 1| :
diff --git a/cpp/ql/test/library-tests/ir/ir/aliased_ir.expected b/cpp/ql/test/library-tests/ir/ir/aliased_ir.expected
index d8babdb54e20..bedfe5dd1c12 100644
--- a/cpp/ql/test/library-tests/ir/ir/aliased_ir.expected
+++ b/cpp/ql/test/library-tests/ir/ir/aliased_ir.expected
@@ -20430,6 +20430,25 @@ ir.cpp:
# 2774| v2774_6(void) = AliasedUse : ~m2776_6
# 2774| v2774_7(void) = ExitFunction :
+# 2779| void vla_sizeof_test(int, size_t, char)
+# 2779| Block 0
+# 2779| v2779_1(void) = EnterFunction :
+# 2779| m2779_2(unknown) = AliasedDefinition :
+# 2779| m2779_3(unknown) = InitializeNonLocal :
+# 2779| m2779_4(unknown) = Chi : total:m2779_2, partial:m2779_3
+# 2779| r2779_5(glval) = VariableAddress[len1] :
+# 2779| m2779_6(int) = InitializeParameter[len1] : &:r2779_5
+# 2779| r2779_7(glval) = VariableAddress[len2] :
+# 2779| m2779_8(unsigned long) = InitializeParameter[len2] : &:r2779_7
+# 2779| r2779_9(glval) = VariableAddress[len3] :
+# 2779| m2779_10(char) = InitializeParameter[len3] : &:r2779_9
+# 2781| r2781_1(glval) = VariableAddress[tmp1] :
+# 2781| m2781_2(char[]) = Uninitialized[tmp1] : &:r2781_1
+# 2781| r2781_3(glval) = VariableAddress[len1] :
+# 2781| r2781_4(int) = Load[len1] : &:r2781_3, m2779_6
+# 2781| v2781_5(void) = NoOp :
+# 2782| r2782_1(glval) = VariableAddress[x] :
+
ir23.cpp:
# 1| bool consteval_1()
# 1| Block 0
diff --git a/cpp/ql/test/library-tests/ir/ir/aliased_ssa_consistency.expected b/cpp/ql/test/library-tests/ir/ir/aliased_ssa_consistency.expected
index b83d9ea47e38..e748890d80d6 100644
--- a/cpp/ql/test/library-tests/ir/ir/aliased_ssa_consistency.expected
+++ b/cpp/ql/test/library-tests/ir/ir/aliased_ssa_consistency.expected
@@ -6,6 +6,7 @@ missingOperandType
duplicateChiOperand
sideEffectWithoutPrimary
instructionWithoutSuccessor
+| ir.cpp:2782:10:2782:10 | VariableAddress: definition of x | Instruction 'VariableAddress: definition of x' has no successors in function '$@'. | ir.cpp:2779:6:2779:20 | void vla_sizeof_test(int, size_t, char) | void vla_sizeof_test(int, size_t, char) |
ambiguousSuccessors
unexplainedLoop
unnecessaryPhiInstruction
diff --git a/cpp/ql/test/library-tests/ir/ir/aliased_ssa_consistency_unsound.expected b/cpp/ql/test/library-tests/ir/ir/aliased_ssa_consistency_unsound.expected
index b83d9ea47e38..e748890d80d6 100644
--- a/cpp/ql/test/library-tests/ir/ir/aliased_ssa_consistency_unsound.expected
+++ b/cpp/ql/test/library-tests/ir/ir/aliased_ssa_consistency_unsound.expected
@@ -6,6 +6,7 @@ missingOperandType
duplicateChiOperand
sideEffectWithoutPrimary
instructionWithoutSuccessor
+| ir.cpp:2782:10:2782:10 | VariableAddress: definition of x | Instruction 'VariableAddress: definition of x' has no successors in function '$@'. | ir.cpp:2779:6:2779:20 | void vla_sizeof_test(int, size_t, char) | void vla_sizeof_test(int, size_t, char) |
ambiguousSuccessors
unexplainedLoop
unnecessaryPhiInstruction
diff --git a/cpp/ql/test/library-tests/ir/ir/ir.cpp b/cpp/ql/test/library-tests/ir/ir/ir.cpp
index 66af788db12d..b4fb243ecdfc 100644
--- a/cpp/ql/test/library-tests/ir/ir/ir.cpp
+++ b/cpp/ql/test/library-tests/ir/ir/ir.cpp
@@ -2776,4 +2776,18 @@ void test_allocation_with_initializer() {
long* p2 = new long(42);
}
+void vla_sizeof_test(int len1, size_t len2, char len3)
+{
+ char tmp1[len1];
+ size_t x = sizeof(tmp1);
+ int tmp2[len1][len2];
+ size_t y = sizeof(tmp2);
+ size_t z = sizeof(*tmp2);
+ int tmp3[len1][len2][len3];
+ size_t w = sizeof(tmp3);
+ size_t v = sizeof(*tmp3);
+ size_t u = sizeof(**tmp3);
+ size_t t = sizeof(***tmp3);
+}
+
// semmle-extractor-options: -std=c++20 --clang
diff --git a/cpp/ql/test/library-tests/ir/ir/raw_consistency.expected b/cpp/ql/test/library-tests/ir/ir/raw_consistency.expected
index e30106d35204..be7e3801c665 100644
--- a/cpp/ql/test/library-tests/ir/ir/raw_consistency.expected
+++ b/cpp/ql/test/library-tests/ir/ir/raw_consistency.expected
@@ -1,4 +1,10 @@
missingOperand
+| ir.cpp:2782:14:2782:25 | Store: sizeof() | Instruction 'Store' is missing an expected operand with tag 'StoreValue' in function '$@'. | ir.cpp:2779:6:2779:20 | void vla_sizeof_test(int, size_t, char) | void vla_sizeof_test(int, size_t, char) |
+| ir.cpp:2784:14:2784:25 | Store: sizeof() | Instruction 'Store' is missing an expected operand with tag 'StoreValue' in function '$@'. | ir.cpp:2779:6:2779:20 | void vla_sizeof_test(int, size_t, char) | void vla_sizeof_test(int, size_t, char) |
+| ir.cpp:2785:14:2785:26 | Store: sizeof() | Instruction 'Store' is missing an expected operand with tag 'StoreValue' in function '$@'. | ir.cpp:2779:6:2779:20 | void vla_sizeof_test(int, size_t, char) | void vla_sizeof_test(int, size_t, char) |
+| ir.cpp:2787:14:2787:25 | Store: sizeof() | Instruction 'Store' is missing an expected operand with tag 'StoreValue' in function '$@'. | ir.cpp:2779:6:2779:20 | void vla_sizeof_test(int, size_t, char) | void vla_sizeof_test(int, size_t, char) |
+| ir.cpp:2788:14:2788:26 | Store: sizeof() | Instruction 'Store' is missing an expected operand with tag 'StoreValue' in function '$@'. | ir.cpp:2779:6:2779:20 | void vla_sizeof_test(int, size_t, char) | void vla_sizeof_test(int, size_t, char) |
+| ir.cpp:2789:14:2789:27 | Store: sizeof() | Instruction 'Store' is missing an expected operand with tag 'StoreValue' in function '$@'. | ir.cpp:2779:6:2779:20 | void vla_sizeof_test(int, size_t, char) | void vla_sizeof_test(int, size_t, char) |
unexpectedOperand
duplicateOperand
missingPhiOperand
@@ -6,6 +12,18 @@ missingOperandType
duplicateChiOperand
sideEffectWithoutPrimary
instructionWithoutSuccessor
+| ir.cpp:2782:10:2782:10 | VariableAddress: definition of x | Instruction 'VariableAddress: definition of x' has no successors in function '$@'. | ir.cpp:2779:6:2779:20 | void vla_sizeof_test(int, size_t, char) | void vla_sizeof_test(int, size_t, char) |
+| ir.cpp:2782:21:2782:24 | VariableAddress: tmp1 | Instruction 'VariableAddress: tmp1' has no successors in function '$@'. | ir.cpp:2779:6:2779:20 | void vla_sizeof_test(int, size_t, char) | void vla_sizeof_test(int, size_t, char) |
+| ir.cpp:2784:10:2784:10 | VariableAddress: definition of y | Instruction 'VariableAddress: definition of y' has no successors in function '$@'. | ir.cpp:2779:6:2779:20 | void vla_sizeof_test(int, size_t, char) | void vla_sizeof_test(int, size_t, char) |
+| ir.cpp:2784:21:2784:24 | VariableAddress: tmp2 | Instruction 'VariableAddress: tmp2' has no successors in function '$@'. | ir.cpp:2779:6:2779:20 | void vla_sizeof_test(int, size_t, char) | void vla_sizeof_test(int, size_t, char) |
+| ir.cpp:2785:10:2785:10 | VariableAddress: definition of z | Instruction 'VariableAddress: definition of z' has no successors in function '$@'. | ir.cpp:2779:6:2779:20 | void vla_sizeof_test(int, size_t, char) | void vla_sizeof_test(int, size_t, char) |
+| ir.cpp:2785:21:2785:25 | CopyValue: * ... | Instruction 'CopyValue: * ...' has no successors in function '$@'. | ir.cpp:2779:6:2779:20 | void vla_sizeof_test(int, size_t, char) | void vla_sizeof_test(int, size_t, char) |
+| ir.cpp:2787:10:2787:10 | VariableAddress: definition of w | Instruction 'VariableAddress: definition of w' has no successors in function '$@'. | ir.cpp:2779:6:2779:20 | void vla_sizeof_test(int, size_t, char) | void vla_sizeof_test(int, size_t, char) |
+| ir.cpp:2787:21:2787:24 | VariableAddress: tmp3 | Instruction 'VariableAddress: tmp3' has no successors in function '$@'. | ir.cpp:2779:6:2779:20 | void vla_sizeof_test(int, size_t, char) | void vla_sizeof_test(int, size_t, char) |
+| ir.cpp:2788:10:2788:10 | VariableAddress: definition of v | Instruction 'VariableAddress: definition of v' has no successors in function '$@'. | ir.cpp:2779:6:2779:20 | void vla_sizeof_test(int, size_t, char) | void vla_sizeof_test(int, size_t, char) |
+| ir.cpp:2788:21:2788:25 | CopyValue: * ... | Instruction 'CopyValue: * ...' has no successors in function '$@'. | ir.cpp:2779:6:2779:20 | void vla_sizeof_test(int, size_t, char) | void vla_sizeof_test(int, size_t, char) |
+| ir.cpp:2789:10:2789:10 | VariableAddress: definition of u | Instruction 'VariableAddress: definition of u' has no successors in function '$@'. | ir.cpp:2779:6:2779:20 | void vla_sizeof_test(int, size_t, char) | void vla_sizeof_test(int, size_t, char) |
+| ir.cpp:2789:21:2789:26 | CopyValue: * ... | Instruction 'CopyValue: * ...' has no successors in function '$@'. | ir.cpp:2779:6:2779:20 | void vla_sizeof_test(int, size_t, char) | void vla_sizeof_test(int, size_t, char) |
ambiguousSuccessors
unexplainedLoop
unnecessaryPhiInstruction
@@ -21,6 +39,12 @@ lostReachability
backEdgeCountMismatch
useNotDominatedByDefinition
| ir.cpp:1535:8:1535:8 | Unary | Operand 'Unary' is not dominated by its definition in function '$@'. | ir.cpp:1535:8:1535:8 | void StructuredBindingDataMemberStruct::StructuredBindingDataMemberStruct() | void StructuredBindingDataMemberStruct::StructuredBindingDataMemberStruct() |
+| ir.cpp:2782:10:2782:10 | Address | Operand 'Address' is not dominated by its definition in function '$@'. | ir.cpp:2779:6:2779:20 | void vla_sizeof_test(int, size_t, char) | void vla_sizeof_test(int, size_t, char) |
+| ir.cpp:2784:10:2784:10 | Address | Operand 'Address' is not dominated by its definition in function '$@'. | ir.cpp:2779:6:2779:20 | void vla_sizeof_test(int, size_t, char) | void vla_sizeof_test(int, size_t, char) |
+| ir.cpp:2785:10:2785:10 | Address | Operand 'Address' is not dominated by its definition in function '$@'. | ir.cpp:2779:6:2779:20 | void vla_sizeof_test(int, size_t, char) | void vla_sizeof_test(int, size_t, char) |
+| ir.cpp:2787:10:2787:10 | Address | Operand 'Address' is not dominated by its definition in function '$@'. | ir.cpp:2779:6:2779:20 | void vla_sizeof_test(int, size_t, char) | void vla_sizeof_test(int, size_t, char) |
+| ir.cpp:2788:10:2788:10 | Address | Operand 'Address' is not dominated by its definition in function '$@'. | ir.cpp:2779:6:2779:20 | void vla_sizeof_test(int, size_t, char) | void vla_sizeof_test(int, size_t, char) |
+| ir.cpp:2789:10:2789:10 | Address | Operand 'Address' is not dominated by its definition in function '$@'. | ir.cpp:2779:6:2779:20 | void vla_sizeof_test(int, size_t, char) | void vla_sizeof_test(int, size_t, char) |
switchInstructionWithoutDefaultEdge
notMarkedAsConflated
wronglyMarkedAsConflated
diff --git a/cpp/ql/test/library-tests/ir/ir/raw_ir.expected b/cpp/ql/test/library-tests/ir/ir/raw_ir.expected
index a567c651ca24..d7269265fa88 100644
--- a/cpp/ql/test/library-tests/ir/ir/raw_ir.expected
+++ b/cpp/ql/test/library-tests/ir/ir/raw_ir.expected
@@ -18577,6 +18577,96 @@ ir.cpp:
# 2774| v2774_5(void) = AliasedUse : ~m?
# 2774| v2774_6(void) = ExitFunction :
+# 2779| void vla_sizeof_test(int, size_t, char)
+# 2779| Block 0
+# 2779| v2779_1(void) = EnterFunction :
+# 2779| mu2779_2(unknown) = AliasedDefinition :
+# 2779| mu2779_3(unknown) = InitializeNonLocal :
+# 2779| r2779_4(glval) = VariableAddress[len1] :
+# 2779| mu2779_5(int) = InitializeParameter[len1] : &:r2779_4
+# 2779| r2779_6(glval) = VariableAddress[len2] :
+# 2779| mu2779_7(unsigned long) = InitializeParameter[len2] : &:r2779_6
+# 2779| r2779_8(glval) = VariableAddress[len3] :
+# 2779| mu2779_9(char) = InitializeParameter[len3] : &:r2779_8
+# 2781| r2781_1(glval) = VariableAddress[tmp1] :
+# 2781| mu2781_2(char[]) = Uninitialized[tmp1] : &:r2781_1
+# 2781| r2781_3(glval) = VariableAddress[len1] :
+# 2781| r2781_4(int) = Load[len1] : &:r2781_3, ~m?
+# 2781| v2781_5(void) = NoOp :
+# 2782| r2782_1(glval) = VariableAddress[x] :
+
+# 2782| Block 1
+# 2782| r2782_2(glval) = VariableAddress[tmp1] :
+
+# 2784| Block 1
+# 2784| r2784_1(glval) = VariableAddress[tmp2] :
+
+# 2787| Block 1
+# 2787| r2787_1(glval) = VariableAddress[tmp3] :
+
+# 2785| Block 4
+# 2785| r2785_1(glval) = VariableAddress[tmp2] :
+# 2785| r2785_2(int(*)[]) = Convert : r2785_1
+# 2785| r2785_3(glval) = CopyValue : r2785_2
+
+# 2788| Block 4
+# 2788| r2788_1(glval) = VariableAddress[tmp3] :
+# 2788| r2788_2(int(*)[][]) = Convert : r2788_1
+# 2788| r2788_3(glval) = CopyValue : r2788_2
+
+# 2789| Block 6
+# 2789| r2789_1(glval) = VariableAddress[tmp3] :
+# 2789| r2789_2(int(*)[][]) = Convert : r2789_1
+# 2789| r2789_3(glval) = CopyValue : r2789_2
+# 2789| r2789_4(int(*)[]) = Convert : r2789_3
+# 2789| r2789_5(glval) = CopyValue : r2789_4
+
+# 2782| Block 7
+# 2782| mu2782_3(unsigned long) = Store[x] : &:r2782_1
+# 2783| r2783_1(glval) = VariableAddress[tmp2] :
+# 2783| mu2783_2(int[][]) = Uninitialized[tmp2] : &:r2783_1
+# 2783| r2783_3(glval) = VariableAddress[len1] :
+# 2783| r2783_4(int) = Load[len1] : &:r2783_3, ~m?
+# 2783| r2783_5(glval) = VariableAddress[len2] :
+# 2783| r2783_6(unsigned long) = Load[len2] : &:r2783_5, ~m?
+# 2783| v2783_7(void) = NoOp :
+# 2784| r2784_2(glval) = VariableAddress[y] :
+
+# 2784| Block 8
+# 2784| mu2784_3(unsigned long) = Store[y] : &:r2784_2
+# 2785| r2785_4(glval) = VariableAddress[z] :
+
+# 2785| Block 9
+# 2785| mu2785_5(unsigned long) = Store[z] : &:r2785_4
+# 2786| r2786_1(glval) = VariableAddress[tmp3] :
+# 2786| mu2786_2(int[][][]) = Uninitialized[tmp3] : &:r2786_1
+# 2786| r2786_3(glval) = VariableAddress[len1] :
+# 2786| r2786_4(int) = Load[len1] : &:r2786_3, ~m?
+# 2786| r2786_5(glval) = VariableAddress[len2] :
+# 2786| r2786_6(unsigned long) = Load[len2] : &:r2786_5, ~m?
+# 2786| r2786_7(glval) = VariableAddress[len3] :
+# 2786| r2786_8(char) = Load[len3] : &:r2786_7, ~m?
+# 2786| v2786_9(void) = NoOp :
+# 2787| r2787_2(glval) = VariableAddress[w] :
+
+# 2787| Block 10
+# 2787| mu2787_3(unsigned long) = Store[w] : &:r2787_2
+# 2788| r2788_4(glval) = VariableAddress[v] :
+
+# 2788| Block 11
+# 2788| mu2788_5(unsigned long) = Store[v] : &:r2788_4
+# 2789| r2789_6(glval) = VariableAddress[u] :
+
+# 2789| Block 12
+# 2789| mu2789_7(unsigned long) = Store[u] : &:r2789_6
+# 2790| r2790_1(glval) = VariableAddress[t] :
+# 2790| r2790_2(unsigned long) = Constant[4] :
+# 2790| mu2790_3(unsigned long) = Store[t] : &:r2790_1, r2790_2
+# 2791| v2791_1(void) = NoOp :
+# 2779| v2779_10(void) = ReturnVoid :
+# 2779| v2779_11(void) = AliasedUse : ~m?
+# 2779| v2779_12(void) = ExitFunction :
+
ir23.cpp:
# 1| bool consteval_1()
# 1| Block 0
diff --git a/cpp/ql/test/library-tests/ir/ir/unaliased_ssa_consistency.expected b/cpp/ql/test/library-tests/ir/ir/unaliased_ssa_consistency.expected
index b83d9ea47e38..e748890d80d6 100644
--- a/cpp/ql/test/library-tests/ir/ir/unaliased_ssa_consistency.expected
+++ b/cpp/ql/test/library-tests/ir/ir/unaliased_ssa_consistency.expected
@@ -6,6 +6,7 @@ missingOperandType
duplicateChiOperand
sideEffectWithoutPrimary
instructionWithoutSuccessor
+| ir.cpp:2782:10:2782:10 | VariableAddress: definition of x | Instruction 'VariableAddress: definition of x' has no successors in function '$@'. | ir.cpp:2779:6:2779:20 | void vla_sizeof_test(int, size_t, char) | void vla_sizeof_test(int, size_t, char) |
ambiguousSuccessors
unexplainedLoop
unnecessaryPhiInstruction
diff --git a/cpp/ql/test/library-tests/ir/ir/unaliased_ssa_consistency_unsound.expected b/cpp/ql/test/library-tests/ir/ir/unaliased_ssa_consistency_unsound.expected
index b83d9ea47e38..e748890d80d6 100644
--- a/cpp/ql/test/library-tests/ir/ir/unaliased_ssa_consistency_unsound.expected
+++ b/cpp/ql/test/library-tests/ir/ir/unaliased_ssa_consistency_unsound.expected
@@ -6,6 +6,7 @@ missingOperandType
duplicateChiOperand
sideEffectWithoutPrimary
instructionWithoutSuccessor
+| ir.cpp:2782:10:2782:10 | VariableAddress: definition of x | Instruction 'VariableAddress: definition of x' has no successors in function '$@'. | ir.cpp:2779:6:2779:20 | void vla_sizeof_test(int, size_t, char) | void vla_sizeof_test(int, size_t, char) |
ambiguousSuccessors
unexplainedLoop
unnecessaryPhiInstruction
From d9320b3c16b08818e8a189bacaa1dee8cc3ae2ae Mon Sep 17 00:00:00 2001
From: Jeroen Ketema
Date: Fri, 29 Aug 2025 17:51:51 +0200
Subject: [PATCH 073/308] C++: Support `sizeof` VLAs in the IR
---
.../raw/internal/InstructionTag.qll | 7 +-
.../raw/internal/TranslatedElement.qll | 7 +-
.../raw/internal/TranslatedExpr.qll | 99 ++++++++++++++++++-
3 files changed, 109 insertions(+), 4 deletions(-)
diff --git a/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/internal/InstructionTag.qll b/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/internal/InstructionTag.qll
index d864e86aa040..da93976c4e26 100644
--- a/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/internal/InstructionTag.qll
+++ b/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/internal/InstructionTag.qll
@@ -97,7 +97,12 @@ newtype TInstructionTag =
exists(Stmt s | exists(s.getImplicitDestructorCall(index)))
} or
CoAwaitBranchTag() or
- BoolToIntConversionTag()
+ BoolToIntConversionTag() or
+ SizeofVlaDimensionTag(int index) {
+ index = -1
+ or
+ exists(VlaDeclStmt v | exists(v.getVlaDimensionStmt(index)))
+ }
class InstructionTag extends TInstructionTag {
final string toString() { result = getInstructionTagId(this) }
diff --git a/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/internal/TranslatedElement.qll b/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/internal/TranslatedElement.qll
index e1314035437e..330362f55603 100644
--- a/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/internal/TranslatedElement.qll
+++ b/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/internal/TranslatedElement.qll
@@ -123,13 +123,16 @@ private predicate ignoreExprAndDescendants(Expr expr) {
// or
ignoreExprAndDescendants(getRealParent(expr)) // recursive case
or
- // va_start doesn't evaluate its argument, so we don't need to translate it.
+ // va_start does not evaluate its argument, so we do not need to translate it.
exists(BuiltInVarArgsStart vaStartExpr |
vaStartExpr.getLastNamedParameter().getFullyConverted() = expr
)
or
+ // sizeof does not evaluate its argument, so we do not need to translate it.
+ exists(SizeofExprOperator sizeofExpr | sizeofExpr.getExprOperand().getFullyConverted() = expr)
+ or
// The children of C11 _Generic expressions are just surface syntax.
- exists(C11GenericExpr generic | generic.getAChild() = expr)
+ exists(C11GenericExpr generic | generic.getAChild().getFullyConverted() = expr)
or
// Do not translate implicit destructor calls for unnamed temporary variables that are
// conditionally constructed (until we have a mechanism for calling these only when the
diff --git a/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/internal/TranslatedExpr.qll b/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/internal/TranslatedExpr.qll
index f749f8b7502c..463f13f1aee7 100644
--- a/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/internal/TranslatedExpr.qll
+++ b/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/internal/TranslatedExpr.qll
@@ -187,7 +187,7 @@ Variable getEnclosingVariable(Expr e) {
}
/**
- * The IR translation of the "core" part of an expression. This is the part of
+ * The IR translation of the "core" part of an expression. This is the part of
* the expression that produces the result value of the expression, before any
* lvalue-to-rvalue conversion on the result. Every expression has a single
* `TranslatedCoreExpr`.
@@ -4094,6 +4094,103 @@ class TranslatedStmtExpr extends TranslatedNonConstantExpr {
TranslatedStmt getStmt() { result = getTranslatedStmt(expr.getStmt()) }
}
+private VlaDeclStmt getVlaDeclStmt(Expr expr, int pointerDerefCount) {
+ expr.(VariableAccess).getTarget() = result.getVariable() and
+ pointerDerefCount = 0
+ or
+ result = getVlaDeclStmt(expr.(PointerDereferenceExpr).getOperand(), pointerDerefCount - 1)
+}
+
+class TranslatedSizeofExpr extends TranslatedNonConstantExpr {
+ override SizeofExprOperator expr;
+ VlaDeclStmt vlaDeclStmt;
+ int pointerDerefCount;
+
+ TranslatedSizeofExpr() {
+ vlaDeclStmt = getVlaDeclStmt(expr.getExprOperand(), pointerDerefCount) and
+ pointerDerefCount < vlaDeclStmt.getNumberOfVlaDimensionStmts()
+ }
+
+ final override Instruction getFirstInstruction(EdgeKind kind) {
+ result = this.getInstruction(SizeofVlaDimensionTag(-1)) and
+ kind instanceof GotoEdge
+ }
+
+ override Instruction getALastInstructionInternal() {
+ result =
+ this.getInstruction(SizeofVlaDimensionTag(vlaDeclStmt.getNumberOfVlaDimensionStmts() - 1))
+ }
+
+ final override TranslatedElement getChildInternal(int id) { none() }
+
+ final override predicate hasInstruction(Opcode opcode, InstructionTag tag, CppType resultType) {
+ opcode instanceof Opcode::Constant and
+ tag = SizeofVlaDimensionTag(-1) and
+ resultType = this.getResultType()
+ or
+ opcode instanceof Opcode::Mul and
+ exists(int n | pointerDerefCount <= n and n < vlaDeclStmt.getNumberOfVlaDimensionStmts() |
+ tag = SizeofVlaDimensionTag(n)
+ ) and
+ resultType = this.getResultType()
+ }
+
+ final override Instruction getInstructionSuccessorInternal(InstructionTag tag, EdgeKind kind) {
+ tag = SizeofVlaDimensionTag(-1) and
+ result = this.getInstruction(SizeofVlaDimensionTag(pointerDerefCount)) and
+ kind instanceof GotoEdge
+ or
+ exists(int n | pointerDerefCount <= n and n < vlaDeclStmt.getNumberOfVlaDimensionStmts() - 1 |
+ tag = SizeofVlaDimensionTag(n) and
+ result = this.getInstruction(SizeofVlaDimensionTag(n + 1))
+ ) and
+ kind instanceof GotoEdge
+ or
+ tag = SizeofVlaDimensionTag(vlaDeclStmt.getNumberOfVlaDimensionStmts() - 1) and
+ result = this.getParent().getChildSuccessor(this, kind)
+ }
+
+ override string getInstructionConstantValue(InstructionTag tag) {
+ tag = SizeofVlaDimensionTag(-1) and
+ result =
+ this.getBaseSize(vlaDeclStmt.getVariable().getType(),
+ vlaDeclStmt.getNumberOfVlaDimensionStmts() - 1).toString()
+ }
+
+ private int getBaseSize(DerivedType type, int n) {
+ n = 0 and
+ result = type.getBaseType().getSize()
+ or
+ n = [1 .. vlaDeclStmt.getNumberOfVlaDimensionStmts() - 1] and
+ result = this.getBaseSize(type.getBaseType(), n - 1)
+ }
+
+ override Instruction getInstructionRegisterOperand(InstructionTag tag, OperandTag operandTag) {
+ exists(int n | pointerDerefCount <= n and n < vlaDeclStmt.getNumberOfVlaDimensionStmts() |
+ tag = SizeofVlaDimensionTag(n) and
+ (
+ operandTag instanceof LeftOperandTag and
+ (
+ n - 1 >= pointerDerefCount and
+ result = this.getInstruction(SizeofVlaDimensionTag(n - 1))
+ or
+ n - 1 < pointerDerefCount and
+ result = this.getInstruction(SizeofVlaDimensionTag(-1))
+ )
+ or
+ operandTag instanceof RightOperandTag and
+ result =
+ getTranslatedExpr(vlaDeclStmt.getVlaDimensionStmt(n).getDimensionExpr()).getResult()
+ )
+ )
+ }
+
+ final override Instruction getResult() {
+ result =
+ this.getInstruction(SizeofVlaDimensionTag(vlaDeclStmt.getNumberOfVlaDimensionStmts() - 1))
+ }
+}
+
class TranslatedErrorExpr extends TranslatedSingleInstructionExpr {
override ErrorExpr expr;
From dc7833052964fbab41425a9e4148a1fc3393e448 Mon Sep 17 00:00:00 2001
From: Jeroen Ketema
Date: Fri, 29 Aug 2025 17:58:00 +0200
Subject: [PATCH 074/308] C++: Update expected test results
---
.../library-tests/ir/ir/aliased_ir.expected | 50 +++++++
.../ir/ir/aliased_ssa_consistency.expected | 1 -
.../aliased_ssa_consistency_unsound.expected | 1 -
.../ir/ir/raw_consistency.expected | 24 ----
.../test/library-tests/ir/ir/raw_ir.expected | 122 +++++++-----------
.../ir/ir/unaliased_ssa_consistency.expected | 1 -
...unaliased_ssa_consistency_unsound.expected | 1 -
7 files changed, 100 insertions(+), 100 deletions(-)
diff --git a/cpp/ql/test/library-tests/ir/ir/aliased_ir.expected b/cpp/ql/test/library-tests/ir/ir/aliased_ir.expected
index bedfe5dd1c12..a9896a1b3d8d 100644
--- a/cpp/ql/test/library-tests/ir/ir/aliased_ir.expected
+++ b/cpp/ql/test/library-tests/ir/ir/aliased_ir.expected
@@ -20448,6 +20448,56 @@ ir.cpp:
# 2781| r2781_4(int) = Load[len1] : &:r2781_3, m2779_6
# 2781| v2781_5(void) = NoOp :
# 2782| r2782_1(glval) = VariableAddress[x] :
+# 2782| r2782_2(unsigned long) = Constant[1] :
+# 2782| r2782_3(unsigned long) = Mul : r2782_2, r2781_4
+# 2782| m2782_4(unsigned long) = Store[x] : &:r2782_1, r2782_3
+# 2783| r2783_1(glval) = VariableAddress[tmp2] :
+# 2783| m2783_2(int[][]) = Uninitialized[tmp2] : &:r2783_1
+# 2783| r2783_3(glval) = VariableAddress[len1] :
+# 2783| r2783_4(int) = Load[len1] : &:r2783_3, m2779_6
+# 2783| r2783_5(glval) = VariableAddress[len2] :
+# 2783| r2783_6(unsigned long) = Load[len2] : &:r2783_5, m2779_8
+# 2783| v2783_7(void) = NoOp :
+# 2784| r2784_1(glval) = VariableAddress[y] :
+# 2784| r2784_2(unsigned long) = Constant[4] :
+# 2784| r2784_3(unsigned long) = Mul : r2784_2, r2783_4
+# 2784| r2784_4(unsigned long) = Mul : r2784_3, r2783_6
+# 2784| m2784_5(unsigned long) = Store[y] : &:r2784_1, r2784_4
+# 2785| r2785_1(glval) = VariableAddress[z] :
+# 2785| r2785_2(unsigned long) = Constant[4] :
+# 2785| r2785_3(unsigned long) = Mul : r2785_2, r2783_6
+# 2785| m2785_4(unsigned long) = Store[z] : &:r2785_1, r2785_3
+# 2786| r2786_1(glval) = VariableAddress[tmp3] :
+# 2786| m2786_2(int[][][]) = Uninitialized[tmp3] : &:r2786_1
+# 2786| r2786_3(glval) = VariableAddress[len1] :
+# 2786| r2786_4(int) = Load[len1] : &:r2786_3, m2779_6
+# 2786| r2786_5(glval) = VariableAddress[len2] :
+# 2786| r2786_6(unsigned long) = Load[len2] : &:r2786_5, m2779_8
+# 2786| r2786_7(glval) = VariableAddress[len3] :
+# 2786| r2786_8(char) = Load[len3] : &:r2786_7, m2779_10
+# 2786| v2786_9(void) = NoOp :
+# 2787| r2787_1(glval) = VariableAddress[w] :
+# 2787| r2787_2(unsigned long) = Constant[4] :
+# 2787| r2787_3(unsigned long) = Mul : r2787_2, r2786_4
+# 2787| r2787_4(unsigned long) = Mul : r2787_3, r2786_6
+# 2787| r2787_5(unsigned long) = Mul : r2787_4, r2786_8
+# 2787| m2787_6(unsigned long) = Store[w] : &:r2787_1, r2787_5
+# 2788| r2788_1(glval) = VariableAddress[v] :
+# 2788| r2788_2(unsigned long) = Constant[4] :
+# 2788| r2788_3(unsigned long) = Mul : r2788_2, r2786_6
+# 2788| r2788_4(unsigned long) = Mul : r2788_3, r2786_8
+# 2788| m2788_5(unsigned long) = Store[v] : &:r2788_1, r2788_4
+# 2789| r2789_1(glval) = VariableAddress[u] :
+# 2789| r2789_2(unsigned long) = Constant[4] :
+# 2789| r2789_3(unsigned long) = Mul : r2789_2, r2786_8
+# 2789| m2789_4(unsigned long) = Store[u] : &:r2789_1, r2789_3
+# 2790| r2790_1(glval) = VariableAddress[t] :
+# 2790| r2790_2(unsigned long) = Constant[4] :
+# 2790| m2790_3(unsigned long) = Store[t] : &:r2790_1, r2790_2
+# 2791| v2791_1(void) = NoOp :
+# 2779| v2779_11(void) = ReturnVoid :
+# 2779| v2779_12(void) = AliasedUse : m2779_3
+# 2779| v2779_13(void) = ExitFunction :
ir23.cpp:
# 1| bool consteval_1()
diff --git a/cpp/ql/test/library-tests/ir/ir/aliased_ssa_consistency.expected b/cpp/ql/test/library-tests/ir/ir/aliased_ssa_consistency.expected
index e748890d80d6..b83d9ea47e38 100644
--- a/cpp/ql/test/library-tests/ir/ir/aliased_ssa_consistency.expected
+++ b/cpp/ql/test/library-tests/ir/ir/aliased_ssa_consistency.expected
@@ -6,7 +6,6 @@ missingOperandType
duplicateChiOperand
sideEffectWithoutPrimary
instructionWithoutSuccessor
-| ir.cpp:2782:10:2782:10 | VariableAddress: definition of x | Instruction 'VariableAddress: definition of x' has no successors in function '$@'. | ir.cpp:2779:6:2779:20 | void vla_sizeof_test(int, size_t, char) | void vla_sizeof_test(int, size_t, char) |
ambiguousSuccessors
unexplainedLoop
unnecessaryPhiInstruction
diff --git a/cpp/ql/test/library-tests/ir/ir/aliased_ssa_consistency_unsound.expected b/cpp/ql/test/library-tests/ir/ir/aliased_ssa_consistency_unsound.expected
index e748890d80d6..b83d9ea47e38 100644
--- a/cpp/ql/test/library-tests/ir/ir/aliased_ssa_consistency_unsound.expected
+++ b/cpp/ql/test/library-tests/ir/ir/aliased_ssa_consistency_unsound.expected
@@ -6,7 +6,6 @@ missingOperandType
duplicateChiOperand
sideEffectWithoutPrimary
instructionWithoutSuccessor
-| ir.cpp:2782:10:2782:10 | VariableAddress: definition of x | Instruction 'VariableAddress: definition of x' has no successors in function '$@'. | ir.cpp:2779:6:2779:20 | void vla_sizeof_test(int, size_t, char) | void vla_sizeof_test(int, size_t, char) |
ambiguousSuccessors
unexplainedLoop
unnecessaryPhiInstruction
diff --git a/cpp/ql/test/library-tests/ir/ir/raw_consistency.expected b/cpp/ql/test/library-tests/ir/ir/raw_consistency.expected
index be7e3801c665..e30106d35204 100644
--- a/cpp/ql/test/library-tests/ir/ir/raw_consistency.expected
+++ b/cpp/ql/test/library-tests/ir/ir/raw_consistency.expected
@@ -1,10 +1,4 @@
missingOperand
-| ir.cpp:2782:14:2782:25 | Store: sizeof() | Instruction 'Store' is missing an expected operand with tag 'StoreValue' in function '$@'. | ir.cpp:2779:6:2779:20 | void vla_sizeof_test(int, size_t, char) | void vla_sizeof_test(int, size_t, char) |
-| ir.cpp:2784:14:2784:25 | Store: sizeof() | Instruction 'Store' is missing an expected operand with tag 'StoreValue' in function '$@'. | ir.cpp:2779:6:2779:20 | void vla_sizeof_test(int, size_t, char) | void vla_sizeof_test(int, size_t, char) |
-| ir.cpp:2785:14:2785:26 | Store: sizeof() | Instruction 'Store' is missing an expected operand with tag 'StoreValue' in function '$@'. | ir.cpp:2779:6:2779:20 | void vla_sizeof_test(int, size_t, char) | void vla_sizeof_test(int, size_t, char) |
-| ir.cpp:2787:14:2787:25 | Store: sizeof() | Instruction 'Store' is missing an expected operand with tag 'StoreValue' in function '$@'. | ir.cpp:2779:6:2779:20 | void vla_sizeof_test(int, size_t, char) | void vla_sizeof_test(int, size_t, char) |
-| ir.cpp:2788:14:2788:26 | Store: sizeof() | Instruction 'Store' is missing an expected operand with tag 'StoreValue' in function '$@'. | ir.cpp:2779:6:2779:20 | void vla_sizeof_test(int, size_t, char) | void vla_sizeof_test(int, size_t, char) |
-| ir.cpp:2789:14:2789:27 | Store: sizeof() | Instruction 'Store' is missing an expected operand with tag 'StoreValue' in function '$@'. | ir.cpp:2779:6:2779:20 | void vla_sizeof_test(int, size_t, char) | void vla_sizeof_test(int, size_t, char) |
unexpectedOperand
duplicateOperand
missingPhiOperand
@@ -12,18 +6,6 @@ missingOperandType
duplicateChiOperand
sideEffectWithoutPrimary
instructionWithoutSuccessor
-| ir.cpp:2782:10:2782:10 | VariableAddress: definition of x | Instruction 'VariableAddress: definition of x' has no successors in function '$@'. | ir.cpp:2779:6:2779:20 | void vla_sizeof_test(int, size_t, char) | void vla_sizeof_test(int, size_t, char) |
-| ir.cpp:2782:21:2782:24 | VariableAddress: tmp1 | Instruction 'VariableAddress: tmp1' has no successors in function '$@'. | ir.cpp:2779:6:2779:20 | void vla_sizeof_test(int, size_t, char) | void vla_sizeof_test(int, size_t, char) |
-| ir.cpp:2784:10:2784:10 | VariableAddress: definition of y | Instruction 'VariableAddress: definition of y' has no successors in function '$@'. | ir.cpp:2779:6:2779:20 | void vla_sizeof_test(int, size_t, char) | void vla_sizeof_test(int, size_t, char) |
-| ir.cpp:2784:21:2784:24 | VariableAddress: tmp2 | Instruction 'VariableAddress: tmp2' has no successors in function '$@'. | ir.cpp:2779:6:2779:20 | void vla_sizeof_test(int, size_t, char) | void vla_sizeof_test(int, size_t, char) |
-| ir.cpp:2785:10:2785:10 | VariableAddress: definition of z | Instruction 'VariableAddress: definition of z' has no successors in function '$@'. | ir.cpp:2779:6:2779:20 | void vla_sizeof_test(int, size_t, char) | void vla_sizeof_test(int, size_t, char) |
-| ir.cpp:2785:21:2785:25 | CopyValue: * ... | Instruction 'CopyValue: * ...' has no successors in function '$@'. | ir.cpp:2779:6:2779:20 | void vla_sizeof_test(int, size_t, char) | void vla_sizeof_test(int, size_t, char) |
-| ir.cpp:2787:10:2787:10 | VariableAddress: definition of w | Instruction 'VariableAddress: definition of w' has no successors in function '$@'. | ir.cpp:2779:6:2779:20 | void vla_sizeof_test(int, size_t, char) | void vla_sizeof_test(int, size_t, char) |
-| ir.cpp:2787:21:2787:24 | VariableAddress: tmp3 | Instruction 'VariableAddress: tmp3' has no successors in function '$@'. | ir.cpp:2779:6:2779:20 | void vla_sizeof_test(int, size_t, char) | void vla_sizeof_test(int, size_t, char) |
-| ir.cpp:2788:10:2788:10 | VariableAddress: definition of v | Instruction 'VariableAddress: definition of v' has no successors in function '$@'. | ir.cpp:2779:6:2779:20 | void vla_sizeof_test(int, size_t, char) | void vla_sizeof_test(int, size_t, char) |
-| ir.cpp:2788:21:2788:25 | CopyValue: * ... | Instruction 'CopyValue: * ...' has no successors in function '$@'. | ir.cpp:2779:6:2779:20 | void vla_sizeof_test(int, size_t, char) | void vla_sizeof_test(int, size_t, char) |
-| ir.cpp:2789:10:2789:10 | VariableAddress: definition of u | Instruction 'VariableAddress: definition of u' has no successors in function '$@'. | ir.cpp:2779:6:2779:20 | void vla_sizeof_test(int, size_t, char) | void vla_sizeof_test(int, size_t, char) |
-| ir.cpp:2789:21:2789:26 | CopyValue: * ... | Instruction 'CopyValue: * ...' has no successors in function '$@'. | ir.cpp:2779:6:2779:20 | void vla_sizeof_test(int, size_t, char) | void vla_sizeof_test(int, size_t, char) |
ambiguousSuccessors
unexplainedLoop
unnecessaryPhiInstruction
@@ -39,12 +21,6 @@ lostReachability
backEdgeCountMismatch
useNotDominatedByDefinition
| ir.cpp:1535:8:1535:8 | Unary | Operand 'Unary' is not dominated by its definition in function '$@'. | ir.cpp:1535:8:1535:8 | void StructuredBindingDataMemberStruct::StructuredBindingDataMemberStruct() | void StructuredBindingDataMemberStruct::StructuredBindingDataMemberStruct() |
-| ir.cpp:2782:10:2782:10 | Address | Operand 'Address' is not dominated by its definition in function '$@'. | ir.cpp:2779:6:2779:20 | void vla_sizeof_test(int, size_t, char) | void vla_sizeof_test(int, size_t, char) |
-| ir.cpp:2784:10:2784:10 | Address | Operand 'Address' is not dominated by its definition in function '$@'. | ir.cpp:2779:6:2779:20 | void vla_sizeof_test(int, size_t, char) | void vla_sizeof_test(int, size_t, char) |
-| ir.cpp:2785:10:2785:10 | Address | Operand 'Address' is not dominated by its definition in function '$@'. | ir.cpp:2779:6:2779:20 | void vla_sizeof_test(int, size_t, char) | void vla_sizeof_test(int, size_t, char) |
-| ir.cpp:2787:10:2787:10 | Address | Operand 'Address' is not dominated by its definition in function '$@'. | ir.cpp:2779:6:2779:20 | void vla_sizeof_test(int, size_t, char) | void vla_sizeof_test(int, size_t, char) |
-| ir.cpp:2788:10:2788:10 | Address | Operand 'Address' is not dominated by its definition in function '$@'. | ir.cpp:2779:6:2779:20 | void vla_sizeof_test(int, size_t, char) | void vla_sizeof_test(int, size_t, char) |
-| ir.cpp:2789:10:2789:10 | Address | Operand 'Address' is not dominated by its definition in function '$@'. | ir.cpp:2779:6:2779:20 | void vla_sizeof_test(int, size_t, char) | void vla_sizeof_test(int, size_t, char) |
switchInstructionWithoutDefaultEdge
notMarkedAsConflated
wronglyMarkedAsConflated
diff --git a/cpp/ql/test/library-tests/ir/ir/raw_ir.expected b/cpp/ql/test/library-tests/ir/ir/raw_ir.expected
index d7269265fa88..5b696e8460f6 100644
--- a/cpp/ql/test/library-tests/ir/ir/raw_ir.expected
+++ b/cpp/ql/test/library-tests/ir/ir/raw_ir.expected
@@ -18594,78 +18594,56 @@ ir.cpp:
# 2781| r2781_4(int) = Load[len1] : &:r2781_3, ~m?
# 2781| v2781_5(void) = NoOp :
# 2782| r2782_1(glval) = VariableAddress[x] :
-
-# 2782| Block 1
-# 2782| r2782_2(glval) = VariableAddress[tmp1] :
-
-# 2784| Block 1
-# 2784| r2784_1(glval) = VariableAddress[tmp2] :
-
-# 2787| Block 1
-# 2787| r2787_1(glval) = VariableAddress[tmp3] :
-
-# 2785| Block 4
-# 2785| r2785_1(glval) = VariableAddress[tmp2] :
-# 2785| r2785_2(int(*)[]) = Convert : r2785_1
-# 2785| r2785_3(glval) = CopyValue : r2785_2
-
-# 2788| Block 4
-# 2788| r2788_1(glval) = VariableAddress[tmp3] :
-# 2788| r2788_2(int(*)[][]) = Convert : r2788_1
-# 2788| r2788_3(glval) = CopyValue : r2788_2
-
-# 2789| Block 6
-# 2789| r2789_1(glval) = VariableAddress[tmp3] :
-# 2789| r2789_2(int(*)[][]) = Convert : r2789_1
-# 2789| r2789_3(glval) = CopyValue : r2789_2
-# 2789| r2789_4(int(*)[]) = Convert : r2789_3
-# 2789| r2789_5(glval) = CopyValue : r2789_4
-
-# 2782| Block 7
-# 2782| mu2782_3(unsigned long) = Store[x] : &:r2782_1
-# 2783| r2783_1(glval) = VariableAddress[tmp2] :
-# 2783| mu2783_2(int[][]) = Uninitialized[tmp2] : &:r2783_1
-# 2783| r2783_3(glval) = VariableAddress[len1] :
-# 2783| r2783_4(int) = Load[len1] : &:r2783_3, ~m?
-# 2783| r2783_5(glval) = VariableAddress[len2] :
-# 2783| r2783_6(unsigned long) = Load[len2] : &:r2783_5, ~m?
-# 2783| v2783_7(void) = NoOp :
-# 2784| r2784_2(glval) = VariableAddress[y] :
-
-# 2784| Block 8
-# 2784| mu2784_3(unsigned long) = Store[y] : &:r2784_2
-# 2785| r2785_4(glval) = VariableAddress[z] :
-
-# 2785| Block 9
-# 2785| mu2785_5(unsigned long) = Store[z] : &:r2785_4
-# 2786| r2786_1(glval) = VariableAddress[tmp3] :
-# 2786| mu2786_2(int[][][]) = Uninitialized[tmp3] : &:r2786_1
-# 2786| r2786_3(glval) = VariableAddress[len1] :
-# 2786| r2786_4(int) = Load[len1] : &:r2786_3, ~m?
-# 2786| r2786_5(glval) = VariableAddress[len2] :
-# 2786| r2786_6(unsigned long) = Load[len2] : &:r2786_5, ~m?
-# 2786| r2786_7(glval) = VariableAddress[len3] :
-# 2786| r2786_8(char) = Load[len3] : &:r2786_7, ~m?
-# 2786| v2786_9(void) = NoOp :
-# 2787| r2787_2(glval) = VariableAddress[w] :
-
-# 2787| Block 10
-# 2787| mu2787_3(unsigned long) = Store[w] : &:r2787_2
-# 2788| r2788_4(glval) = VariableAddress[v] :
-
-# 2788| Block 11
-# 2788| mu2788_5(unsigned long) = Store[v] : &:r2788_4
-# 2789| r2789_6(glval) = VariableAddress[u] :
-
-# 2789| Block 12
-# 2789| mu2789_7(unsigned long) = Store[u] : &:r2789_6
-# 2790| r2790_1(glval) = VariableAddress[t] :
-# 2790| r2790_2(unsigned long) = Constant[4] :
-# 2790| mu2790_3(unsigned long) = Store[t] : &:r2790_1, r2790_2
-# 2791| v2791_1(void) = NoOp :
-# 2779| v2779_10(void) = ReturnVoid :
-# 2779| v2779_11(void) = AliasedUse : ~m?
-# 2779| v2779_12(void) = ExitFunction :
+# 2782| r2782_2(unsigned long) = Constant[1] :
+# 2782| r2782_3(unsigned long) = Mul : r2782_2, r2781_4
+# 2782| mu2782_4(unsigned long) = Store[x] : &:r2782_1, r2782_3
+# 2783| r2783_1(glval) = VariableAddress[tmp2] :
+# 2783| mu2783_2(int[][]) = Uninitialized[tmp2] : &:r2783_1
+# 2783| r2783_3(glval) = VariableAddress[len1] :
+# 2783| r2783_4(int) = Load[len1] : &:r2783_3, ~m?
+# 2783| r2783_5(glval) = VariableAddress[len2] :
+# 2783| r2783_6(unsigned long) = Load[len2] : &:r2783_5, ~m?
+# 2783| v2783_7(void) = NoOp :
+# 2784| r2784_1(glval) = VariableAddress[y] :
+# 2784| r2784_2(unsigned long) = Constant[4] :
+# 2784| r2784_3(unsigned long) = Mul : r2784_2, r2783_4
+# 2784| r2784_4(unsigned long) = Mul : r2784_3, r2783_6
+# 2784| mu2784_5(unsigned long) = Store[y] : &:r2784_1, r2784_4
+# 2785| r2785_1(glval) = VariableAddress[z] :
+# 2785| r2785_2(unsigned long) = Constant[4] :
+# 2785| r2785_3(unsigned long) = Mul : r2785_2, r2783_6
+# 2785| mu2785_4(unsigned long) = Store[z] : &:r2785_1, r2785_3
+# 2786| r2786_1(glval) = VariableAddress[tmp3] :
+# 2786| mu2786_2(int[][][]) = Uninitialized[tmp3] : &:r2786_1
+# 2786| r2786_3(glval) = VariableAddress[len1] :
+# 2786| r2786_4(int) = Load[len1] : &:r2786_3, ~m?
+# 2786| r2786_5(glval) = VariableAddress[len2] :
+# 2786| r2786_6(unsigned long) = Load[len2] : &:r2786_5, ~m?
+# 2786| r2786_7(glval) = VariableAddress[len3] :
+# 2786| r2786_8(char) = Load[len3] : &:r2786_7, ~m?
+# 2786| v2786_9(void) = NoOp :
+# 2787| r2787_1(glval) = VariableAddress[w] :
+# 2787| r2787_2(unsigned long) = Constant[4] :
+# 2787| r2787_3(unsigned long) = Mul : r2787_2, r2786_4
+# 2787| r2787_4(unsigned long) = Mul : r2787_3, r2786_6
+# 2787| r2787_5(unsigned long) = Mul : r2787_4, r2786_8
+# 2787| mu2787_6(unsigned long) = Store[w] : &:r2787_1, r2787_5
+# 2788| r2788_1(glval) = VariableAddress[v] :
+# 2788| r2788_2(unsigned long) = Constant[4] :
+# 2788| r2788_3(unsigned long) = Mul : r2788_2, r2786_6
+# 2788| r2788_4(unsigned long) = Mul : r2788_3, r2786_8
+# 2788| mu2788_5(unsigned long) = Store[v] : &:r2788_1, r2788_4
+# 2789| r2789_1(glval) = VariableAddress[u] :
+# 2789| r2789_2(unsigned long) = Constant[4] :
+# 2789| r2789_3(unsigned long) = Mul : r2789_2, r2786_8
+# 2789| mu2789_4(unsigned long) = Store[u] : &:r2789_1, r2789_3
+# 2790| r2790_1(glval) = VariableAddress[t] :
+# 2790| r2790_2(unsigned long) = Constant[4] :
+# 2790| mu2790_3(unsigned long) = Store[t] : &:r2790_1, r2790_2
+# 2791| v2791_1(void) = NoOp :
+# 2779| v2779_10(void) = ReturnVoid :
+# 2779| v2779_11(void) = AliasedUse : ~m?
+# 2779| v2779_12(void) = ExitFunction :
ir23.cpp:
# 1| bool consteval_1()
diff --git a/cpp/ql/test/library-tests/ir/ir/unaliased_ssa_consistency.expected b/cpp/ql/test/library-tests/ir/ir/unaliased_ssa_consistency.expected
index e748890d80d6..b83d9ea47e38 100644
--- a/cpp/ql/test/library-tests/ir/ir/unaliased_ssa_consistency.expected
+++ b/cpp/ql/test/library-tests/ir/ir/unaliased_ssa_consistency.expected
@@ -6,7 +6,6 @@ missingOperandType
duplicateChiOperand
sideEffectWithoutPrimary
instructionWithoutSuccessor
-| ir.cpp:2782:10:2782:10 | VariableAddress: definition of x | Instruction 'VariableAddress: definition of x' has no successors in function '$@'. | ir.cpp:2779:6:2779:20 | void vla_sizeof_test(int, size_t, char) | void vla_sizeof_test(int, size_t, char) |
ambiguousSuccessors
unexplainedLoop
unnecessaryPhiInstruction
diff --git a/cpp/ql/test/library-tests/ir/ir/unaliased_ssa_consistency_unsound.expected b/cpp/ql/test/library-tests/ir/ir/unaliased_ssa_consistency_unsound.expected
index e748890d80d6..b83d9ea47e38 100644
--- a/cpp/ql/test/library-tests/ir/ir/unaliased_ssa_consistency_unsound.expected
+++ b/cpp/ql/test/library-tests/ir/ir/unaliased_ssa_consistency_unsound.expected
@@ -6,7 +6,6 @@ missingOperandType
duplicateChiOperand
sideEffectWithoutPrimary
instructionWithoutSuccessor
-| ir.cpp:2782:10:2782:10 | VariableAddress: definition of x | Instruction 'VariableAddress: definition of x' has no successors in function '$@'. | ir.cpp:2779:6:2779:20 | void vla_sizeof_test(int, size_t, char) | void vla_sizeof_test(int, size_t, char) |
ambiguousSuccessors
unexplainedLoop
unnecessaryPhiInstruction
From 5bd08e817444b909b8b541d2f23a68e61f58beab Mon Sep 17 00:00:00 2001
From: Jeroen Ketema
Date: Mon, 1 Sep 2025 10:59:17 +0200
Subject: [PATCH 075/308] C++: Add more `sizeof` VLA tests
---
.../library-tests/ir/ir/PrintAST.expected | 491 +++++++++++++-----
.../library-tests/ir/ir/aliased_ir.expected | 163 ++++--
.../ir/ir/aliased_ssa_consistency.expected | 2 +
.../aliased_ssa_consistency_unsound.expected | 2 +
cpp/ql/test/library-tests/ir/ir/ir.cpp | 25 +-
.../ir/ir/raw_consistency.expected | 12 +
.../test/library-tests/ir/ir/raw_ir.expected | 195 +++++--
.../ir/ir/unaliased_ssa_consistency.expected | 2 +
...unaliased_ssa_consistency_unsound.expected | 2 +
9 files changed, 666 insertions(+), 228 deletions(-)
diff --git a/cpp/ql/test/library-tests/ir/ir/PrintAST.expected b/cpp/ql/test/library-tests/ir/ir/PrintAST.expected
index b03bd3266044..34d231f8ebd4 100644
--- a/cpp/ql/test/library-tests/ir/ir/PrintAST.expected
+++ b/cpp/ql/test/library-tests/ir/ir/PrintAST.expected
@@ -24589,178 +24589,413 @@ ir.cpp:
# 2779| Type = [CTypedefType,Size_t] size_t
# 2779| getParameter(2): [Parameter] len3
# 2779| Type = [PlainCharType] char
-# 2780| getEntryPoint(): [BlockStmt] { ... }
-# 2781| getStmt(0): [DeclStmt] declaration
-# 2781| getDeclarationEntry(0): [VariableDeclarationEntry] definition of tmp1
-# 2781| Type = [ArrayType] char[]
-# 2781| getStmt(1): [VlaDimensionStmt] VLA dimension size
-# 2781| getDimensionExpr(): [VariableAccess] len1
-# 2781| Type = [IntType] int
-# 2781| ValueCategory = prvalue(load)
-# 2781| getStmt(2): [VlaDeclStmt] VLA declaration
-# 2782| getStmt(3): [DeclStmt] declaration
-# 2782| getDeclarationEntry(0): [VariableDeclarationEntry] definition of x
+# 2779| getEntryPoint(): [BlockStmt] { ... }
+# 2780| getStmt(0): [DeclStmt] declaration
+# 2780| getDeclarationEntry(0): [VariableDeclarationEntry] definition of tmp1
+# 2780| Type = [ArrayType] char[]
+# 2780| getStmt(1): [VlaDimensionStmt] VLA dimension size
+# 2780| getDimensionExpr(): [VariableAccess] len1
+# 2780| Type = [IntType] int
+# 2780| ValueCategory = prvalue(load)
+# 2780| getStmt(2): [VlaDeclStmt] VLA declaration
+# 2781| getStmt(3): [DeclStmt] declaration
+# 2781| getDeclarationEntry(0): [VariableDeclarationEntry] definition of x
+# 2781| Type = [CTypedefType,Size_t] size_t
+# 2781| getVariable().getInitializer(): [Initializer] initializer for x
+# 2781| getExpr(): [SizeofExprOperator] sizeof()
+# 2781| Type = [LongType] unsigned long
+# 2781| ValueCategory = prvalue
+# 2781| getExprOperand(): [VariableAccess] tmp1
+# 2781| Type = [ArrayType] char[]
+# 2781| ValueCategory = lvalue
+# 2781| getExprOperand().getFullyConverted(): [ParenthesisExpr] (...)
+# 2781| Type = [ArrayType] char[]
+# 2781| ValueCategory = lvalue
+# 2782| getStmt(4): [DeclStmt] declaration
+# 2782| getDeclarationEntry(0): [VariableDeclarationEntry] definition of tmp2
+# 2782| Type = [ArrayType] int[][]
+# 2782| getStmt(5): [VlaDimensionStmt] VLA dimension size
+# 2782| getDimensionExpr(): [VariableAccess] len1
+# 2782| Type = [IntType] int
+# 2782| ValueCategory = prvalue(load)
+# 2782| getStmt(6): [VlaDimensionStmt] VLA dimension size
+# 2782| getDimensionExpr(): [VariableAccess] len2
# 2782| Type = [CTypedefType,Size_t] size_t
-# 2782| getVariable().getInitializer(): [Initializer] initializer for x
-# 2782| getExpr(): [SizeofExprOperator] sizeof()
-# 2782| Type = [LongType] unsigned long
-# 2782| ValueCategory = prvalue
-# 2782| getExprOperand(): [VariableAccess] tmp1
-# 2782| Type = [ArrayType] char[]
-# 2782| ValueCategory = lvalue
-# 2782| getExprOperand().getFullyConverted(): [ParenthesisExpr] (...)
-# 2782| Type = [ArrayType] char[]
-# 2782| ValueCategory = lvalue
-# 2783| getStmt(4): [DeclStmt] declaration
-# 2783| getDeclarationEntry(0): [VariableDeclarationEntry] definition of tmp2
-# 2783| Type = [ArrayType] int[][]
-# 2783| getStmt(5): [VlaDimensionStmt] VLA dimension size
-# 2783| getDimensionExpr(): [VariableAccess] len1
-# 2783| Type = [IntType] int
-# 2783| ValueCategory = prvalue(load)
-# 2783| getStmt(6): [VlaDimensionStmt] VLA dimension size
-# 2783| getDimensionExpr(): [VariableAccess] len2
+# 2782| ValueCategory = prvalue(load)
+# 2782| getStmt(7): [VlaDeclStmt] VLA declaration
+# 2783| getStmt(8): [DeclStmt] declaration
+# 2783| getDeclarationEntry(0): [VariableDeclarationEntry] definition of y
# 2783| Type = [CTypedefType,Size_t] size_t
-# 2783| ValueCategory = prvalue(load)
-# 2783| getStmt(7): [VlaDeclStmt] VLA declaration
-# 2784| getStmt(8): [DeclStmt] declaration
-# 2784| getDeclarationEntry(0): [VariableDeclarationEntry] definition of y
+# 2783| getVariable().getInitializer(): [Initializer] initializer for y
+# 2783| getExpr(): [SizeofExprOperator] sizeof()
+# 2783| Type = [LongType] unsigned long
+# 2783| ValueCategory = prvalue
+# 2783| getExprOperand(): [VariableAccess] tmp2
+# 2783| Type = [ArrayType] int[][]
+# 2783| ValueCategory = lvalue
+# 2783| getExprOperand().getFullyConverted(): [ParenthesisExpr] (...)
+# 2783| Type = [ArrayType] int[][]
+# 2783| ValueCategory = lvalue
+# 2784| getStmt(9): [DeclStmt] declaration
+# 2784| getDeclarationEntry(0): [VariableDeclarationEntry] definition of z
# 2784| Type = [CTypedefType,Size_t] size_t
-# 2784| getVariable().getInitializer(): [Initializer] initializer for y
+# 2784| getVariable().getInitializer(): [Initializer] initializer for z
# 2784| getExpr(): [SizeofExprOperator] sizeof()
# 2784| Type = [LongType] unsigned long
# 2784| ValueCategory = prvalue
-# 2784| getExprOperand(): [VariableAccess] tmp2
-# 2784| Type = [ArrayType] int[][]
+# 2784| getExprOperand(): [PointerDereferenceExpr] * ...
+# 2784| Type = [ArrayType] int[]
# 2784| ValueCategory = lvalue
+# 2784| getOperand(): [VariableAccess] tmp2
+# 2784| Type = [ArrayType] int[][]
+# 2784| ValueCategory = lvalue
+# 2784| getOperand().getFullyConverted(): [ArrayToPointerConversion] array to pointer conversion
+# 2784| Type = [PointerType] int(*)[]
+# 2784| ValueCategory = prvalue
# 2784| getExprOperand().getFullyConverted(): [ParenthesisExpr] (...)
-# 2784| Type = [ArrayType] int[][]
+# 2784| Type = [ArrayType] int[]
# 2784| ValueCategory = lvalue
-# 2785| getStmt(9): [DeclStmt] declaration
-# 2785| getDeclarationEntry(0): [VariableDeclarationEntry] definition of z
+# 2785| getStmt(10): [DeclStmt] declaration
+# 2785| getDeclarationEntry(0): [VariableDeclarationEntry] definition of tmp3
+# 2785| Type = [ArrayType] int[][][]
+# 2785| getStmt(11): [VlaDimensionStmt] VLA dimension size
+# 2785| getDimensionExpr(): [VariableAccess] len1
+# 2785| Type = [IntType] int
+# 2785| ValueCategory = prvalue(load)
+# 2785| getStmt(12): [VlaDimensionStmt] VLA dimension size
+# 2785| getDimensionExpr(): [VariableAccess] len2
# 2785| Type = [CTypedefType,Size_t] size_t
-# 2785| getVariable().getInitializer(): [Initializer] initializer for z
-# 2785| getExpr(): [SizeofExprOperator] sizeof()
-# 2785| Type = [LongType] unsigned long
-# 2785| ValueCategory = prvalue
-# 2785| getExprOperand(): [PointerDereferenceExpr] * ...
-# 2785| Type = [ArrayType] int[]
-# 2785| ValueCategory = lvalue
-# 2785| getOperand(): [VariableAccess] tmp2
-# 2785| Type = [ArrayType] int[][]
-# 2785| ValueCategory = lvalue
-# 2785| getOperand().getFullyConverted(): [ArrayToPointerConversion] array to pointer conversion
-# 2785| Type = [PointerType] int(*)[]
-# 2785| ValueCategory = prvalue
-# 2785| getExprOperand().getFullyConverted(): [ParenthesisExpr] (...)
-# 2785| Type = [ArrayType] int[]
-# 2785| ValueCategory = lvalue
-# 2786| getStmt(10): [DeclStmt] declaration
-# 2786| getDeclarationEntry(0): [VariableDeclarationEntry] definition of tmp3
-# 2786| Type = [ArrayType] int[][][]
-# 2786| getStmt(11): [VlaDimensionStmt] VLA dimension size
-# 2786| getDimensionExpr(): [VariableAccess] len1
-# 2786| Type = [IntType] int
-# 2786| ValueCategory = prvalue(load)
-# 2786| getStmt(12): [VlaDimensionStmt] VLA dimension size
-# 2786| getDimensionExpr(): [VariableAccess] len2
+# 2785| ValueCategory = prvalue(load)
+# 2785| getStmt(13): [VlaDimensionStmt] VLA dimension size
+# 2785| getDimensionExpr(): [VariableAccess] len3
+# 2785| Type = [PlainCharType] char
+# 2785| ValueCategory = prvalue(load)
+# 2785| getStmt(14): [VlaDeclStmt] VLA declaration
+# 2786| getStmt(15): [DeclStmt] declaration
+# 2786| getDeclarationEntry(0): [VariableDeclarationEntry] definition of w
# 2786| Type = [CTypedefType,Size_t] size_t
-# 2786| ValueCategory = prvalue(load)
-# 2786| getStmt(13): [VlaDimensionStmt] VLA dimension size
-# 2786| getDimensionExpr(): [VariableAccess] len3
-# 2786| Type = [PlainCharType] char
-# 2786| ValueCategory = prvalue(load)
-# 2786| getStmt(14): [VlaDeclStmt] VLA declaration
-# 2787| getStmt(15): [DeclStmt] declaration
-# 2787| getDeclarationEntry(0): [VariableDeclarationEntry] definition of w
+# 2786| getVariable().getInitializer(): [Initializer] initializer for w
+# 2786| getExpr(): [SizeofExprOperator] sizeof()
+# 2786| Type = [LongType] unsigned long
+# 2786| ValueCategory = prvalue
+# 2786| getExprOperand(): [VariableAccess] tmp3
+# 2786| Type = [ArrayType] int[][][]
+# 2786| ValueCategory = lvalue
+# 2786| getExprOperand().getFullyConverted(): [ParenthesisExpr] (...)
+# 2786| Type = [ArrayType] int[][][]
+# 2786| ValueCategory = lvalue
+# 2787| getStmt(16): [DeclStmt] declaration
+# 2787| getDeclarationEntry(0): [VariableDeclarationEntry] definition of v
# 2787| Type = [CTypedefType,Size_t] size_t
-# 2787| getVariable().getInitializer(): [Initializer] initializer for w
+# 2787| getVariable().getInitializer(): [Initializer] initializer for v
# 2787| getExpr(): [SizeofExprOperator] sizeof()
# 2787| Type = [LongType] unsigned long
# 2787| ValueCategory = prvalue
-# 2787| getExprOperand(): [VariableAccess] tmp3
-# 2787| Type = [ArrayType] int[][][]
+# 2787| getExprOperand(): [PointerDereferenceExpr] * ...
+# 2787| Type = [ArrayType] int[][]
# 2787| ValueCategory = lvalue
+# 2787| getOperand(): [VariableAccess] tmp3
+# 2787| Type = [ArrayType] int[][][]
+# 2787| ValueCategory = lvalue
+# 2787| getOperand().getFullyConverted(): [ArrayToPointerConversion] array to pointer conversion
+# 2787| Type = [PointerType] int(*)[][]
+# 2787| ValueCategory = prvalue
# 2787| getExprOperand().getFullyConverted(): [ParenthesisExpr] (...)
-# 2787| Type = [ArrayType] int[][][]
+# 2787| Type = [ArrayType] int[][]
# 2787| ValueCategory = lvalue
-# 2788| getStmt(16): [DeclStmt] declaration
-# 2788| getDeclarationEntry(0): [VariableDeclarationEntry] definition of v
+# 2788| getStmt(17): [DeclStmt] declaration
+# 2788| getDeclarationEntry(0): [VariableDeclarationEntry] definition of u
# 2788| Type = [CTypedefType,Size_t] size_t
-# 2788| getVariable().getInitializer(): [Initializer] initializer for v
+# 2788| getVariable().getInitializer(): [Initializer] initializer for u
# 2788| getExpr(): [SizeofExprOperator] sizeof()
# 2788| Type = [LongType] unsigned long
# 2788| ValueCategory = prvalue
# 2788| getExprOperand(): [PointerDereferenceExpr] * ...
-# 2788| Type = [ArrayType] int[][]
+# 2788| Type = [ArrayType] int[]
# 2788| ValueCategory = lvalue
-# 2788| getOperand(): [VariableAccess] tmp3
-# 2788| Type = [ArrayType] int[][][]
+# 2788| getOperand(): [PointerDereferenceExpr] * ...
+# 2788| Type = [ArrayType] int[][]
# 2788| ValueCategory = lvalue
+# 2788| getOperand(): [VariableAccess] tmp3
+# 2788| Type = [ArrayType] int[][][]
+# 2788| ValueCategory = lvalue
+# 2788| getOperand().getFullyConverted(): [ArrayToPointerConversion] array to pointer conversion
+# 2788| Type = [PointerType] int(*)[][]
+# 2788| ValueCategory = prvalue
# 2788| getOperand().getFullyConverted(): [ArrayToPointerConversion] array to pointer conversion
-# 2788| Type = [PointerType] int(*)[][]
+# 2788| Type = [PointerType] int(*)[]
# 2788| ValueCategory = prvalue
# 2788| getExprOperand().getFullyConverted(): [ParenthesisExpr] (...)
-# 2788| Type = [ArrayType] int[][]
+# 2788| Type = [ArrayType] int[]
# 2788| ValueCategory = lvalue
-# 2789| getStmt(17): [DeclStmt] declaration
-# 2789| getDeclarationEntry(0): [VariableDeclarationEntry] definition of u
+# 2789| getStmt(18): [DeclStmt] declaration
+# 2789| getDeclarationEntry(0): [VariableDeclarationEntry] definition of t
# 2789| Type = [CTypedefType,Size_t] size_t
-# 2789| getVariable().getInitializer(): [Initializer] initializer for u
+# 2789| getVariable().getInitializer(): [Initializer] initializer for t
# 2789| getExpr(): [SizeofExprOperator] sizeof()
# 2789| Type = [LongType] unsigned long
+# 2789| Value = [SizeofExprOperator] 4
# 2789| ValueCategory = prvalue
# 2789| getExprOperand(): [PointerDereferenceExpr] * ...
-# 2789| Type = [ArrayType] int[]
+# 2789| Type = [IntType] int
# 2789| ValueCategory = lvalue
# 2789| getOperand(): [PointerDereferenceExpr] * ...
-# 2789| Type = [ArrayType] int[][]
+# 2789| Type = [ArrayType] int[]
# 2789| ValueCategory = lvalue
-# 2789| getOperand(): [VariableAccess] tmp3
-# 2789| Type = [ArrayType] int[][][]
+# 2789| getOperand(): [PointerDereferenceExpr] * ...
+# 2789| Type = [ArrayType] int[][]
# 2789| ValueCategory = lvalue
+# 2789| getOperand(): [VariableAccess] tmp3
+# 2789| Type = [ArrayType] int[][][]
+# 2789| ValueCategory = lvalue
+# 2789| getOperand().getFullyConverted(): [ArrayToPointerConversion] array to pointer conversion
+# 2789| Type = [PointerType] int(*)[][]
+# 2789| ValueCategory = prvalue
# 2789| getOperand().getFullyConverted(): [ArrayToPointerConversion] array to pointer conversion
-# 2789| Type = [PointerType] int(*)[][]
+# 2789| Type = [PointerType] int(*)[]
# 2789| ValueCategory = prvalue
# 2789| getOperand().getFullyConverted(): [ArrayToPointerConversion] array to pointer conversion
-# 2789| Type = [PointerType] int(*)[]
+# 2789| Type = [IntPointerType] int *
# 2789| ValueCategory = prvalue
# 2789| getExprOperand().getFullyConverted(): [ParenthesisExpr] (...)
-# 2789| Type = [ArrayType] int[]
+# 2789| Type = [IntType] int
# 2789| ValueCategory = lvalue
-# 2790| getStmt(18): [DeclStmt] declaration
-# 2790| getDeclarationEntry(0): [VariableDeclarationEntry] definition of t
-# 2790| Type = [CTypedefType,Size_t] size_t
-# 2790| getVariable().getInitializer(): [Initializer] initializer for t
-# 2790| getExpr(): [SizeofExprOperator] sizeof()
-# 2790| Type = [LongType] unsigned long
-# 2790| Value = [SizeofExprOperator] 4
-# 2790| ValueCategory = prvalue
-# 2790| getExprOperand(): [PointerDereferenceExpr] * ...
-# 2790| Type = [IntType] int
-# 2790| ValueCategory = lvalue
-# 2790| getOperand(): [PointerDereferenceExpr] * ...
-# 2790| Type = [ArrayType] int[]
-# 2790| ValueCategory = lvalue
-# 2790| getOperand(): [PointerDereferenceExpr] * ...
-# 2790| Type = [ArrayType] int[][]
-# 2790| ValueCategory = lvalue
-# 2790| getOperand(): [VariableAccess] tmp3
-# 2790| Type = [ArrayType] int[][][]
-# 2790| ValueCategory = lvalue
-# 2790| getOperand().getFullyConverted(): [ArrayToPointerConversion] array to pointer conversion
-# 2790| Type = [PointerType] int(*)[][]
-# 2790| ValueCategory = prvalue
-# 2790| getOperand().getFullyConverted(): [ArrayToPointerConversion] array to pointer conversion
-# 2790| Type = [PointerType] int(*)[]
-# 2790| ValueCategory = prvalue
-# 2790| getOperand().getFullyConverted(): [ArrayToPointerConversion] array to pointer conversion
-# 2790| Type = [IntPointerType] int *
-# 2790| ValueCategory = prvalue
-# 2790| getExprOperand().getFullyConverted(): [ParenthesisExpr] (...)
-# 2790| Type = [IntType] int
-# 2790| ValueCategory = lvalue
-# 2791| getStmt(19): [ReturnStmt] return ...
+# 2790| getStmt(19): [ReturnStmt] return ...
+# 2792| [TopLevelFunction] void vla_sizeof_test2(int, size_t, char)
+# 2792|