Merge branch 'main' into angular-sources-sinks

This commit is contained in:
Paul Hodgkinson
2025-01-24 15:46:48 +00:00
committed by GitHub
119 changed files with 13233 additions and 4129 deletions

View File

@@ -0,0 +1,4 @@
---
category: fix
---
* Fixed data for vulnerable versions of `actions/download-artifact` and `rlespinasse/github-slug-action` (following GHSA-cxww-7g56-2vh6 and GHSA-6q4m-7476-932w).

View File

@@ -134,6 +134,10 @@ private module Implementation implements CfgShared::InputSig<Location> {
SuccessorType getAMatchingSuccessorType(Completion c) { result = c.getAMatchingSuccessorType() }
predicate isAbnormalExitType(SuccessorType t) { none() }
int idOfAstNode(AstNode node) { none() }
int idOfCfgScope(CfgScope scope) { none() }
}
module CfgImpl = CfgShared::Make<Location, Implementation>;

View File

@@ -6,38 +6,12 @@ extensions:
# gh api /repos/actions/download-artifact/tags --jq 'map({name: .name, sha: .commit.sha})' --paginate | jq -r '.[] | "- \"\(.name)\", \"\(.sha)\""'
#
# actions/download-artifact
- ["actions/download-artifact", "v4.1.6", "9c19ed7fe5d278cd354c7dfd5d3b88589c7e2395", "4.1.7"]
- ["actions/download-artifact", "v4.1.5", "8caf195ad4b1dee92908e23f56eeb0696f1dd42d", "4.1.7"]
- ["actions/download-artifact", "v4.1.4", "c850b930e6ba138125429b7e5c93fc707a7f8427", "4.1.7"]
- ["actions/download-artifact", "v4.1.3", "87c55149d96e628cc2ef7e6fc2aab372015aec85", "4.1.7"]
- ["actions/download-artifact", "v4.1.2", "eaceaf801fd36c7dee90939fad912460b18a1ffe", "4.1.7"]
- ["actions/download-artifact", "v4.1.1", "6b208ae046db98c579e8a3aa621ab581ff575935", "4.1.7"]
- ["actions/download-artifact", "v4.1.0", "f44cd7b40bfd40b6aa1cc1b9b5b7bf03d3c67110", "4.1.7"]
- ["actions/download-artifact", "v4.0.0", "7a1cd3216ca9260cd8022db641d960b1db4d1be4", "4.1.7"]
- ["actions/download-artifact", "v3.0.2", "9bc31d5ccc31df68ecc42ccf4149144866c47d8a", "4.1.7"]
- ["actions/download-artifact", "v3.0.1", "9782bd6a9848b53b110e712e20e42d89988822b7", "4.1.7"]
- ["actions/download-artifact", "v3.0.0", "fb598a63ae348fa914e94cd0ff38f362e927b741", "4.1.7"]
- ["actions/download-artifact", "v3", "9bc31d5ccc31df68ecc42ccf4149144866c47d8a", "4.1.7"]
- ["actions/download-artifact", "v3-node20", "246d7188e736d3686f6d19628d253ede9697bd55", "4.1.7"]
- ["actions/download-artifact", "v2.1.1", "cbed621e49e4c01b044d60f6c80ea4ed6328b281", "4.1.7"]
- ["actions/download-artifact", "v2.1.0", "f023be2c48cc18debc3bacd34cb396e0295e2869", "4.1.7"]
- ["actions/download-artifact", "v2.0.10", "3be87be14a055c47b01d3bd88f8fe02320a9bb60", "4.1.7"]
- ["actions/download-artifact", "v2.0.9", "158ca71f7c614ae705e79f25522ef4658df18253", "4.1.7"]
- ["actions/download-artifact", "v2.0.8", "4a7a711286f30c025902c28b541c10e147a9b843", "4.1.7"]
- ["actions/download-artifact", "v2.0.7", "f144d3c3916a86f4d6b11ff379d17a49d8f85dbc", "4.1.7"]
- ["actions/download-artifact", "v2.0.6", "f8e41fbffeebb48c0273438d220bb2387727471f", "4.1.7"]
- ["actions/download-artifact", "v2.0.5", "c3f5d00c8784369c43779f3d2611769594a61f7a", "4.1.7"]
- ["actions/download-artifact", "v2.0.4", "b3cedea9bed36890c824f4065163b667eeca272b", "4.1.7"]
- ["actions/download-artifact", "v2.0.3", "80d2d4023c185001eacb50e37afd7dd667ba8044", "4.1.7"]
- ["actions/download-artifact", "v2.0.2", "381af06b4268a1e0ad7b7c7e5a09f1894977120f", "4.1.7"]
- ["actions/download-artifact", "v2.0.1", "1ac47ba4b6af92e65d0438b64ce1ea49ce1cc48d", "4.1.7"]
- ["actions/download-artifact", "v2.0", "1de1dea89c32dcb1f37183c96fe85cfe067b682a", "4.1.7"]
- ["actions/download-artifact", "v2", "cbed621e49e4c01b044d60f6c80ea4ed6328b281", "4.1.7"]
- ["actions/download-artifact", "v1.0.0", "18f0f591fbc635562c815484d73b6e8e3980482e", "4.1.7"]
- ["actions/download-artifact", "v1", "18f0f591fbc635562c815484d73b6e8e3980482e", "4.1.7"]
- ["actions/download-artifact", "1.0.0", "18f0f591fbc635562c815484d73b6e8e3980482e", "4.1.7"]
# https://github.com/advisories/GHSA-cxww-7g56-2vh6 Affected versions: >= 4.0.0, < 4.1.3
- ["actions/download-artifact", "v4.1.2", "eaceaf801fd36c7dee90939fad912460b18a1ffe", "4.1.3"]
- ["actions/download-artifact", "v4.1.1", "6b208ae046db98c579e8a3aa621ab581ff575935", "4.1.3"]
- ["actions/download-artifact", "v4.1.0", "f44cd7b40bfd40b6aa1cc1b9b5b7bf03d3c67110", "4.1.3"]
- ["actions/download-artifact", "v4.0.0", "7a1cd3216ca9260cd8022db641d960b1db4d1be4", "4.1.3"]
# tj-actions/changed-files
# https://github.com/advisories/GHSA-mcph-m25j-8j63
@@ -530,22 +504,13 @@ extensions:
- ["gradle/gradle-build-action", "v1", "b3afdc78a7849557ab26e243ccf07548086da025", "2.4.2"]
# rlespinasse/github-slug-action
# https://github.com/advisories/GHSA-6q4m-7476-932w
# https://github.com/advisories/GHSA-6q4m-7476-932w Affected versions: >= 4.0.0, < 4.4.1
# CVE-2023-27581
- ["rlespinasse/github-slug-action", "v4.4.1", "102b1a064a9b145e56556e22b18b19c624538d94", "4.4.1"]
- ["rlespinasse/github-slug-action", "v4.4.0", "a362e5fb42057a3a23a62218b050838f1bacca5d", "4.4.1"]
- ["rlespinasse/github-slug-action", "v4.3.2", "b011e83cf8cb29e22dda828db30586691ae164e4", "4.4.1"]
- ["rlespinasse/github-slug-action", "v4.3.1", "00198f89920d4454e37e4b27af2b7a8eba79c530", "4.4.1"]
- ["rlespinasse/github-slug-action", "v4.3.0", "9c3571fd3dba541bfdaebc001482a49a1c1f136a", "4.4.1"]
- ["rlespinasse/github-slug-action", "v4.2.5", "0141d9b38d1f21c3b3de63229e20b7b0ad7ef0f4", "4.4.1"]
- ["rlespinasse/github-slug-action", "v3.9.0", "2daab132aa3a6e23ea9d409f9946b3bf6468cc77", "4.4.1"]
- ["rlespinasse/github-slug-action", "v3.8.0", "4a00c29bc1c0a737315b4200af6c6991bb4ace18", "4.4.1"]
- ["rlespinasse/github-slug-action", "v3.7.1", "5150a26d43ce06608443c66efea46fc6f3c50d38", "4.4.1"]
- ["rlespinasse/github-slug-action", "v3.7.0", "ebfc49c0e9cd081acb7ba0634d8d6a711b4c73cf", "4.4.1"]
- ["rlespinasse/github-slug-action", "v3", "2daab132aa3a6e23ea9d409f9946b3bf6468cc77", "4.4.1"]
- ["rlespinasse/github-slug-action", "v3.x", "2daab132aa3a6e23ea9d409f9946b3bf6468cc77", "4.4.1"]
- ["rlespinasse/github-slug-action", "v2.x", "9d2c65418d6ecbbd3c08e686997b30482e9f4a80", "4.4.1"]
- ["rlespinasse/github-slug-action", "v1.1.x", "fbf6d7b9c7af4e8d06135dbc7d774e717d788731", "4.4.1"]
- ["rlespinasse/github-slug-action", "4.2.5", "0141d9b38d1f21c3b3de63229e20b7b0ad7ef0f4", "4.4.1"]
- ["rlespinasse/github-slug-action", "4.2.4", "33cd7a701db9c2baf4ad705d930ade51a9f25c14", "4.4.1"]
- ["rlespinasse/github-slug-action", "4.2.3", "1615fcb48b5315152b3733b7bed1a9f5dfada6e3", "4.4.1"]
@@ -555,25 +520,6 @@ extensions:
- ["rlespinasse/github-slug-action", "4.1.0", "88f3ee8f6f5d1955de92f1fe2fdb301fd40207c6", "4.4.1"]
- ["rlespinasse/github-slug-action", "4.0.1", "cd9871b66e11e9562e3f72469772fe100be4c95a", "4.4.1"]
- ["rlespinasse/github-slug-action", "4.0.0", "bd31a9f564f7930eea1ecfc8d0e6aebc4bc3279f", "4.4.1"]
- ["rlespinasse/github-slug-action", "3.6.1", "1bf76b7bc6ef7dc6ba597ff790f956d9082479d7", "4.4.1"]
- ["rlespinasse/github-slug-action", "3.6.0", "172fe43594a58b5938e248ec757ada60cdb17e18", "4.4.1"]
- ["rlespinasse/github-slug-action", "3.5.1", "016823880d193a56b180527cf7ee52f13c3cfe33", "4.4.1"]
- ["rlespinasse/github-slug-action", "3.5.0", "4060fda2690bcebaabcd86db4fbc8e1c2817c835", "4.4.1"]
- ["rlespinasse/github-slug-action", "3.4.0", "0c099abd978b382cb650281af13913c1905fdd50", "4.4.1"]
- ["rlespinasse/github-slug-action", "3.3.0", "d1880ea5b39f611effb9f3f83f4d35bff34083a6", "4.4.1"]
- ["rlespinasse/github-slug-action", "3.2.0", "c8d8ee50d00177c1e80dd57905fc61f81e437279", "4.4.1"]
- ["rlespinasse/github-slug-action", "3.1.0", "e4699e49fcf890a3172a02c56ba78d867dbb9fd5", "4.4.1"]
- ["rlespinasse/github-slug-action", "3.0.0", "6a873bec5ac11c6d2a11756b8763356da63a8939", "4.4.1"]
- ["rlespinasse/github-slug-action", "2.2.0", "9d2c65418d6ecbbd3c08e686997b30482e9f4a80", "4.4.1"]
- ["rlespinasse/github-slug-action", "2.1.1", "72cfc4cb1f36c102c48541cb59511a6267e89c95", "4.4.1"]
- ["rlespinasse/github-slug-action", "2.1.0", "1172ed1802078eb665a55c252fc180138b907c51", "4.4.1"]
- ["rlespinasse/github-slug-action", "2.0.0", "ca9a67fa1f1126b377a9d80dc1ea354284c71d21", "4.4.1"]
- ["rlespinasse/github-slug-action", "1.2.0", "fbf6d7b9c7af4e8d06135dbc7d774e717d788731", "4.4.1"]
- ["rlespinasse/github-slug-action", "1.1.1", "242e04c2d28ac5db296e5d8203dfd7dc6bcc17a9", "4.4.1"]
- ["rlespinasse/github-slug-action", "1.1.0", "881085bcae8c3443a89cc9401f3e1c60fb014ed2", "4.4.1"]
- ["rlespinasse/github-slug-action", "1.0.2", "a35a1a486a260cfd99c5b6f8c6034a2929ba9b3f", "4.4.1"]
- ["rlespinasse/github-slug-action", "1.0.1", "e46186066296e23235242d0877e2b4fe54003d54", "4.4.1"]
- ["rlespinasse/github-slug-action", "1.0.0", "9671420482a6e4c59c06f2d2d9e0605e941b1287", "4.4.1"]
# Azure/setup-kubectl
# https://github.com/advisories/GHSA-p756-rfxh-x63h

View File

@@ -7,15 +7,15 @@ jobs:
test1:
runs-on: ubuntu-latest
steps:
- uses: actions/download-artifact@v1
- uses: actions/download-artifact@v1.0.0
- uses: actions/download-artifact@v2
- uses: actions/download-artifact@v2.1.0
- uses: actions/download-artifact@v3
- uses: actions/download-artifact@v3.0.2
- uses: actions/download-artifact@v1 # SECURE
- uses: actions/download-artifact@v1.0.0 # SECURE
- uses: actions/download-artifact@v2 # SECURE
- uses: actions/download-artifact@v2.1.0 # SECURE
- uses: actions/download-artifact@v3 # SECURE
- uses: actions/download-artifact@v3.0.2 # SECURE
- uses: actions/download-artifact@v4.1.0
- uses: actions/download-artifact@87c55149d96e628cc2ef7e6fc2aab372015aec85 # v4.1.3
- uses: actions/download-artifact@9bc31d5ccc31df68ecc42ccf4149144866c47d8a # v3.0.2
- uses: actions/download-artifact@eaceaf801fd36c7dee90939fad912460b18a1ffe # v4.1.2
- uses: actions/download-artifact@9bc31d5ccc31df68ecc42ccf4149144866c47d8a # v3.0.2 # SECURE
- uses: actions/download-artifact@v4 # SECURE
- uses: actions/download-artifact@v4.1.7 # SECURE
- uses: actions/download-artifact@v4.1.8 # SECURE

View File

@@ -1,9 +1,2 @@
| .github/workflows/test1.yml:10:9:11:6 | Uses Step | The workflow is using a known vulnerable version ($@) of the $@ action. Update it to $@ | .github/workflows/test1.yml:10:9:11:6 | Uses Step | v1 | .github/workflows/test1.yml:10:9:11:6 | Uses Step | actions/download-artifact | .github/workflows/test1.yml:10:9:11:6 | Uses Step | 4.1.7 |
| .github/workflows/test1.yml:11:9:12:6 | Uses Step | The workflow is using a known vulnerable version ($@) of the $@ action. Update it to $@ | .github/workflows/test1.yml:11:9:12:6 | Uses Step | v1.0.0 | .github/workflows/test1.yml:11:9:12:6 | Uses Step | actions/download-artifact | .github/workflows/test1.yml:11:9:12:6 | Uses Step | 4.1.7 |
| .github/workflows/test1.yml:12:9:13:6 | Uses Step | The workflow is using a known vulnerable version ($@) of the $@ action. Update it to $@ | .github/workflows/test1.yml:12:9:13:6 | Uses Step | v2 | .github/workflows/test1.yml:12:9:13:6 | Uses Step | actions/download-artifact | .github/workflows/test1.yml:12:9:13:6 | Uses Step | 4.1.7 |
| .github/workflows/test1.yml:13:9:14:6 | Uses Step | The workflow is using a known vulnerable version ($@) of the $@ action. Update it to $@ | .github/workflows/test1.yml:13:9:14:6 | Uses Step | v2.1.0 | .github/workflows/test1.yml:13:9:14:6 | Uses Step | actions/download-artifact | .github/workflows/test1.yml:13:9:14:6 | Uses Step | 4.1.7 |
| .github/workflows/test1.yml:14:9:15:6 | Uses Step | The workflow is using a known vulnerable version ($@) of the $@ action. Update it to $@ | .github/workflows/test1.yml:14:9:15:6 | Uses Step | v3 | .github/workflows/test1.yml:14:9:15:6 | Uses Step | actions/download-artifact | .github/workflows/test1.yml:14:9:15:6 | Uses Step | 4.1.7 |
| .github/workflows/test1.yml:15:9:16:6 | Uses Step | The workflow is using a known vulnerable version ($@) of the $@ action. Update it to $@ | .github/workflows/test1.yml:15:9:16:6 | Uses Step | v3.0.2 | .github/workflows/test1.yml:15:9:16:6 | Uses Step | actions/download-artifact | .github/workflows/test1.yml:15:9:16:6 | Uses Step | 4.1.7 |
| .github/workflows/test1.yml:16:9:17:6 | Uses Step | The workflow is using a known vulnerable version ($@) of the $@ action. Update it to $@ | .github/workflows/test1.yml:16:9:17:6 | Uses Step | v4.1.0 | .github/workflows/test1.yml:16:9:17:6 | Uses Step | actions/download-artifact | .github/workflows/test1.yml:16:9:17:6 | Uses Step | 4.1.7 |
| .github/workflows/test1.yml:17:9:18:6 | Uses Step | The workflow is using a known vulnerable version ($@) of the $@ action. Update it to $@ | .github/workflows/test1.yml:17:9:18:6 | Uses Step | 87c55149d96e628cc2ef7e6fc2aab372015aec85 | .github/workflows/test1.yml:17:9:18:6 | Uses Step | actions/download-artifact | .github/workflows/test1.yml:17:9:18:6 | Uses Step | 4.1.7 |
| .github/workflows/test1.yml:18:9:19:6 | Uses Step | The workflow is using a known vulnerable version ($@) of the $@ action. Update it to $@ | .github/workflows/test1.yml:18:9:19:6 | Uses Step | 9bc31d5ccc31df68ecc42ccf4149144866c47d8a | .github/workflows/test1.yml:18:9:19:6 | Uses Step | actions/download-artifact | .github/workflows/test1.yml:18:9:19:6 | Uses Step | 4.1.7 |
| .github/workflows/test1.yml:16:9:17:6 | Uses Step | The workflow is using a known vulnerable version ($@) of the $@ action. Update it to $@ | .github/workflows/test1.yml:16:9:17:6 | Uses Step | v4.1.0 | .github/workflows/test1.yml:16:9:17:6 | Uses Step | actions/download-artifact | .github/workflows/test1.yml:16:9:17:6 | Uses Step | 4.1.3 |
| .github/workflows/test1.yml:17:9:18:6 | Uses Step | The workflow is using a known vulnerable version ($@) of the $@ action. Update it to $@ | .github/workflows/test1.yml:17:9:18:6 | Uses Step | eaceaf801fd36c7dee90939fad912460b18a1ffe | .github/workflows/test1.yml:17:9:18:6 | Uses Step | actions/download-artifact | .github/workflows/test1.yml:17:9:18:6 | Uses Step | 4.1.3 |

View File

@@ -25,7 +25,7 @@ jobs:
permissions:
contents: write
steps:
- uses: actions/download-artifact@v3
- uses: actions/download-artifact@v4.0.0
with:
name: results
- run: python test.py

View File

@@ -0,0 +1,4 @@
---
category: minorAnalysis
---
* C# 13: Added support for the overload resolution priority attribute (`OverloadResolutionPriority`). Usages of the attribute and the corresponding priority can be found using the QL class `SystemRuntimeCompilerServicesOverloadResolutionPriorityAttribute`.

View File

@@ -69,6 +69,9 @@ class Attribute extends TopLevelExprParent, @attribute {
attributes(this, _, getTypeRef(result), _)
}
/** Gets the namespace containing the attribute type declaration. */
Namespace getNamespace() { result = this.getType().getNamespace() }
/** Gets the element that this attribute is attached to. */
Attributable getTarget() { attributes(this, _, _, result) }

View File

@@ -4,26 +4,20 @@
import csharp
private import ControlFlow::SuccessorTypes
private import semmle.code.csharp.controlflow.internal.ControlFlowGraphImpl as CfgImpl
private import CfgImpl::BasicBlocks as BasicBlocksImpl
/**
* A basic block, that is, a maximal straight-line sequence of control flow nodes
* without branches or joins.
*/
class BasicBlock extends TBasicBlockStart {
/** Gets an immediate successor of this basic block, if any. */
BasicBlock getASuccessor() { result.getFirstNode() = this.getLastNode().getASuccessor() }
final class BasicBlock extends BasicBlocksImpl::BasicBlock {
/** Gets an immediate successor of this basic block of a given type, if any. */
BasicBlock getASuccessorByType(ControlFlow::SuccessorType t) {
result.getFirstNode() = this.getLastNode().getASuccessorByType(t)
}
/** Gets an immediate predecessor of this basic block, if any. */
BasicBlock getAPredecessor() { result.getASuccessor() = this }
BasicBlock getASuccessorByType(ControlFlow::SuccessorType t) { result = this.getASuccessor(t) }
/** Gets an immediate predecessor of this basic block of a given type, if any. */
BasicBlock getAPredecessorByType(ControlFlow::SuccessorType t) {
result.getASuccessorByType(t) = this
result = this.getAPredecessor(t)
}
/**
@@ -65,29 +59,30 @@ class BasicBlock extends TBasicBlockStart {
}
/** Gets the control flow node at a specific (zero-indexed) position in this basic block. */
ControlFlow::Node getNode(int pos) { bbIndex(this.getFirstNode(), result, pos) }
ControlFlow::Node getNode(int pos) { result = super.getNode(pos) }
/** Gets a control flow node in this basic block. */
ControlFlow::Node getANode() { result = this.getNode(_) }
ControlFlow::Node getANode() { result = super.getANode() }
/** Gets the first control flow node in this basic block. */
ControlFlow::Node getFirstNode() { this = TBasicBlockStart(result) }
ControlFlow::Node getFirstNode() { result = super.getFirstNode() }
/** Gets the last control flow node in this basic block. */
ControlFlow::Node getLastNode() { result = this.getNode(this.length() - 1) }
ControlFlow::Node getLastNode() { result = super.getLastNode() }
/** Gets the callable that this basic block belongs to. */
final Callable getCallable() { result = this.getFirstNode().getEnclosingCallable() }
/** Gets the length of this basic block. */
int length() { result = strictcount(this.getANode()) }
/**
* Holds if this basic block immediately dominates basic block `bb`.
*
* That is, all paths reaching basic block `bb` from some entry point
* basic block must go through this basic block (which is an immediate
* predecessor of `bb`).
* That is, this basic block is the unique basic block satisfying:
* 1. This basic block strictly dominates `bb`
* 2. There exists no other basic block that is strictly dominated by this
* basic block and which strictly dominates `bb`.
*
* All basic blocks, except entry basic blocks, have a unique immediate
* dominator.
*
* Example:
*
@@ -103,7 +98,7 @@ class BasicBlock extends TBasicBlockStart {
* basic block on line 4 (all paths from the entry point of `M`
* to `return s.Length;` must go through the null check).
*/
predicate immediatelyDominates(BasicBlock bb) { bbIDominates(this, bb) }
predicate immediatelyDominates(BasicBlock bb) { super.immediatelyDominates(bb) }
/**
* Holds if this basic block strictly dominates basic block `bb`.
@@ -126,7 +121,7 @@ class BasicBlock extends TBasicBlockStart {
* basic block on line 4 (all paths from the entry point of `M`
* to `return s.Length;` must go through the null check).
*/
predicate strictlyDominates(BasicBlock bb) { bbIDominates+(this, bb) }
predicate strictlyDominates(BasicBlock bb) { super.strictlyDominates(bb) }
/**
* Holds if this basic block dominates basic block `bb`.
@@ -178,21 +173,18 @@ class BasicBlock extends TBasicBlockStart {
* `Console.Write(x);`. Also, the basic block starting on line 2
* does not dominate the basic block on line 6.
*/
predicate inDominanceFrontier(BasicBlock df) {
this.dominatesPredecessor(df) and
not this.strictlyDominates(df)
}
/**
* Holds if this basic block dominates a predecessor of `df`.
*/
private predicate dominatesPredecessor(BasicBlock df) { this.dominates(df.getAPredecessor()) }
predicate inDominanceFrontier(BasicBlock df) { super.inDominanceFrontier(df) }
/**
* Gets the basic block that immediately dominates this basic block, if any.
*
* That is, all paths reaching this basic block from some entry point
* basic block must go through the result.
* That is, the result is the unique basic block satisfying:
* 1. The result strictly dominates this basic block.
* 2. There exists no other basic block that is strictly dominated by the
* result and which strictly dominates this basic block.
*
* All basic blocks, except entry basic blocks, have a unique immediate
* dominator.
*
* Example:
*
@@ -208,7 +200,7 @@ class BasicBlock extends TBasicBlockStart {
* the basic block online 4 (all paths from the entry point of `M`
* to `return s.Length;` must go through the null check.
*/
BasicBlock getImmediateDominator() { bbIDominates(result, this) }
BasicBlock getImmediateDominator() { result = super.getImmediateDominator() }
/**
* Holds if this basic block strictly post-dominates basic block `bb`.
@@ -234,7 +226,7 @@ class BasicBlock extends TBasicBlockStart {
* line 3 (all paths to the exit point of `M` from `return s.Length;`
* must go through the `WriteLine` call).
*/
predicate strictlyPostDominates(BasicBlock bb) { bbIPostDominates+(this, bb) }
predicate strictlyPostDominates(BasicBlock bb) { super.strictlyPostDominates(bb) }
/**
* Holds if this basic block post-dominates basic block `bb`.
@@ -262,10 +254,7 @@ class BasicBlock extends TBasicBlockStart {
* This predicate is *reflexive*, so for example `Console.WriteLine("M");`
* post-dominates itself.
*/
predicate postDominates(BasicBlock bb) {
this.strictlyPostDominates(bb) or
this = bb
}
predicate postDominates(BasicBlock bb) { super.postDominates(bb) }
/**
* Holds if this basic block is in a loop in the control flow graph. This
@@ -274,230 +263,44 @@ class BasicBlock extends TBasicBlockStart {
* necessary back edges are unreachable.
*/
predicate inLoop() { this.getASuccessor+() = this }
/** Gets a textual representation of this basic block. */
string toString() { result = this.getFirstNode().toString() }
/** Gets the location of this basic block. */
Location getLocation() { result = this.getFirstNode().getLocation() }
}
/**
* Internal implementation details.
*/
cached
private module Internal {
/** Internal representation of basic blocks. */
cached
newtype TBasicBlock = TBasicBlockStart(ControlFlow::Node cfn) { startsBB(cfn) }
/** Holds if `cfn` starts a new basic block. */
private predicate startsBB(ControlFlow::Node cfn) {
not exists(cfn.getAPredecessor()) and exists(cfn.getASuccessor())
or
cfn.isJoin()
or
cfn.getAPredecessor().isBranch()
or
/*
* In cases such as
* ```csharp
* if (b)
* M()
* ```
* where the `false` edge out of `b` is not present (because we can prove it
* impossible), we still split up the basic block in two, in order to generate
* a `ConditionBlock` which can be used by the guards library.
*/
exists(cfn.getAPredecessorByType(any(ControlFlow::SuccessorTypes::ConditionalSuccessor s)))
}
/**
* Holds if `succ` is a control flow successor of `pred` within
* the same basic block.
*/
private predicate intraBBSucc(ControlFlow::Node pred, ControlFlow::Node succ) {
succ = pred.getASuccessor() and
not startsBB(succ)
}
/**
* Holds if `cfn` is the `i`th node in basic block `bb`.
*
* In other words, `i` is the shortest distance from a node `bb`
* that starts a basic block to `cfn` along the `intraBBSucc` relation.
*/
cached
predicate bbIndex(ControlFlow::Node bbStart, ControlFlow::Node cfn, int i) =
shortestDistances(startsBB/1, intraBBSucc/2)(bbStart, cfn, i)
/**
* Holds if the first node of basic block `succ` is a control flow
* successor of the last node of basic block `pred`.
*/
private predicate succBB(BasicBlock pred, BasicBlock succ) { succ = pred.getASuccessor() }
/** Holds if `dom` is an immediate dominator of `bb`. */
cached
predicate bbIDominates(BasicBlock dom, BasicBlock bb) =
idominance(entryBB/1, succBB/2)(_, dom, bb)
/** Holds if `pred` is a basic block predecessor of `succ`. */
private predicate predBB(BasicBlock succ, BasicBlock pred) { succBB(pred, succ) }
/** Holds if `bb` is an exit basic block that represents normal exit. */
private predicate normalExitBB(BasicBlock bb) {
bb.getANode().(ControlFlow::Nodes::AnnotatedExitNode).isNormal()
}
/** Holds if `dom` is an immediate post-dominator of `bb`. */
cached
predicate bbIPostDominates(BasicBlock dom, BasicBlock bb) =
idominance(normalExitBB/1, predBB/2)(_, dom, bb)
}
private import Internal
/**
* An entry basic block, that is, a basic block whose first node is
* the entry node of a callable.
* an entry node.
*/
class EntryBasicBlock extends BasicBlock {
EntryBasicBlock() { entryBB(this) }
}
/** Holds if `bb` is an entry basic block. */
private predicate entryBB(BasicBlock bb) {
bb.getFirstNode() instanceof ControlFlow::Nodes::EntryNode
}
final class EntryBasicBlock extends BasicBlock, BasicBlocksImpl::EntryBasicBlock { }
/**
* An annotated exit basic block, that is, a basic block that contains
* an annotated exit node.
* An annotated exit basic block, that is, a basic block that contains an
* annotated exit node.
*/
class AnnotatedExitBasicBlock extends BasicBlock {
private boolean isNormal;
AnnotatedExitBasicBlock() {
this.getANode() =
any(ControlFlow::Nodes::AnnotatedExitNode n |
if n.isNormal() then isNormal = true else isNormal = false
)
}
/** Holds if this block represents a normal exit. */
predicate isNormal() { isNormal = true }
}
final class AnnotatedExitBasicBlock extends BasicBlock, BasicBlocksImpl::AnnotatedExitBasicBlock { }
/**
* An exit basic block, that is, a basic block whose last node is
* the exit node of a callable.
* an exit node.
*/
class ExitBasicBlock extends BasicBlock {
ExitBasicBlock() { this.getLastNode() instanceof ControlFlow::Nodes::ExitNode }
}
private module JoinBlockPredecessors {
private import ControlFlow::Nodes
private import semmle.code.csharp.controlflow.internal.ControlFlowGraphImpl as Impl
int getId(JoinBlockPredecessor jbp) {
exists(Impl::AstNode n | result = n.getId() |
n = jbp.getFirstNode().getAstNode()
or
n = jbp.(EntryBasicBlock).getCallable()
)
}
string getSplitString(JoinBlockPredecessor jbp) {
result = jbp.getFirstNode().(ElementNode).getSplitsString()
or
not exists(jbp.getFirstNode().(ElementNode).getSplitsString()) and
result = ""
}
}
final class ExitBasicBlock extends BasicBlock, BasicBlocksImpl::ExitBasicBlock { }
/** A basic block with more than one predecessor. */
class JoinBlock extends BasicBlock {
JoinBlock() { this.getFirstNode().isJoin() }
/**
* Gets the `i`th predecessor of this join block, with respect to some
* arbitrary order.
*/
cached
JoinBlockPredecessor getJoinBlockPredecessor(int i) {
result =
rank[i + 1](JoinBlockPredecessor jbp |
jbp = this.getAPredecessor()
|
jbp order by JoinBlockPredecessors::getId(jbp), JoinBlockPredecessors::getSplitString(jbp)
)
}
final class JoinBlock extends BasicBlock, BasicBlocksImpl::JoinBasicBlock {
JoinBlockPredecessor getJoinBlockPredecessor(int i) { result = super.getJoinBlockPredecessor(i) }
}
/** A basic block that is an immediate predecessor of a join block. */
class JoinBlockPredecessor extends BasicBlock {
JoinBlockPredecessor() { this.getASuccessor() instanceof JoinBlock }
}
final class JoinBlockPredecessor extends BasicBlock, BasicBlocksImpl::JoinPredecessorBasicBlock { }
/** A basic block that terminates in a condition, splitting the subsequent control flow. */
class ConditionBlock extends BasicBlock {
ConditionBlock() { this.getLastNode().isCondition() }
/**
* Holds if basic block `succ` is immediately controlled by this basic
* block with conditional value `s`. That is, `succ` is an immediate
* successor of this block, and `succ` can only be reached from
* the callable entry point by going via the `s` edge out of this basic block.
*/
pragma[nomagic]
/**
* A basic block that terminates in a condition, splitting the subsequent
* control flow.
*/
final class ConditionBlock extends BasicBlock, BasicBlocksImpl::ConditionBasicBlock {
predicate immediatelyControls(BasicBlock succ, ConditionalSuccessor s) {
succ = this.getASuccessorByType(s) and
forall(BasicBlock pred | pred = succ.getAPredecessor() and pred != this | succ.dominates(pred))
super.immediatelyControls(succ, s)
}
/**
* Holds if basic block `controlled` is controlled by this basic block with
* conditional value `s`. That is, `controlled` can only be reached from
* the callable entry point by going via the `s` edge out of this basic block.
*/
predicate controls(BasicBlock controlled, ConditionalSuccessor s) {
/*
* For this block to control the block `controlled` with `testIsTrue` the following must be true:
* Execution must have passed through the test i.e. `this` must strictly dominate `controlled`.
* Execution must have passed through the `testIsTrue` edge leaving `this`.
*
* Although "passed through the true edge" implies that `this.getATrueSuccessor()` dominates `controlled`,
* the reverse is not true, as flow may have passed through another edge to get to `this.getATrueSuccessor()`
* so we need to assert that `this.getATrueSuccessor()` dominates `controlled` *and* that
* all predecessors of `this.getATrueSuccessor()` are either `this` or dominated by `this.getATrueSuccessor()`.
*
* For example, in the following C# snippet:
* ```csharp
* if (x)
* controlled;
* false_successor;
* uncontrolled;
* ```
* `false_successor` dominates `uncontrolled`, but not all of its predecessors are `this` (`if (x)`)
* or dominated by itself. Whereas in the following code:
* ```csharp
* if (x)
* while (controlled)
* also_controlled;
* false_successor;
* uncontrolled;
* ```
* the block `while controlled` is controlled because all of its predecessors are `this` (`if (x)`)
* or (in the case of `also_controlled`) dominated by itself.
*
* The additional constraint on the predecessors of the test successor implies
* that `this` strictly dominates `controlled` so that isn't necessary to check
* directly.
*/
exists(BasicBlock succ | this.immediatelyControls(succ, s) | succ.dominates(controlled))
super.controls(controlled, s)
}
}

View File

@@ -95,6 +95,10 @@ private module CfgInput implements CfgShared::InputSig<Location> {
t instanceof ST::SuccessorTypes::ExceptionSuccessor or
t instanceof ST::SuccessorTypes::ExitSuccessor
}
int idOfAstNode(AstNode node) { result = node.getId() }
int idOfCfgScope(CfgScope node) { result = idOfAstNode(node) }
}
private module CfgSplittingInput implements CfgShared::SplittingInputSig<Location, CfgInput> {

View File

@@ -74,7 +74,8 @@ class SystemRuntimeCompilerServicesConfiguredTaskAwaitableTConfiguredTaskAwaiter
/** An attribute of type `System.Runtime.CompilerServices.InlineArrayAttribute`. */
class SystemRuntimeCompilerServicesInlineArrayAttribute extends Attribute {
SystemRuntimeCompilerServicesInlineArrayAttribute() {
this.getType().hasFullyQualifiedName("System.Runtime.CompilerServices", "InlineArrayAttribute")
this.getNamespace() instanceof SystemRuntimeCompilerServicesNamespace and
this.getType().hasName("InlineArrayAttribute")
}
/**
@@ -82,3 +83,16 @@ class SystemRuntimeCompilerServicesInlineArrayAttribute extends Attribute {
*/
int getLength() { result = this.getConstructorArgument(0).getValue().toInt() }
}
/** An attribute of type `System.Runtime.CompilerServices.OverloadResolutionPriority`. */
class SystemRuntimeCompilerServicesOverloadResolutionPriorityAttribute extends Attribute {
SystemRuntimeCompilerServicesOverloadResolutionPriorityAttribute() {
this.getNamespace() instanceof SystemRuntimeCompilerServicesNamespace and
this.getType().hasName("OverloadResolutionPriorityAttribute")
}
/**
* Gets the priority number.
*/
int getPriority() { result = this.getConstructorArgument(0).getValue().toInt() }
}

View File

@@ -23,93 +23,96 @@ arguments
| Assembly1.dll:0:0:0:0 | [return: Custom(...)] | 3 | Assembly1.dll:0:0:0:0 | (...) ... |
| Assembly1.dll:0:0:0:0 | [return: Custom(...)] | 4 | Assembly1.dll:0:0:0:0 | array creation of type Int32[] |
| Assembly1.dll:0:0:0:0 | [return: Custom(...)] | 5 | Assembly1.dll:0:0:0:0 | array creation of type Object[] |
| attributes.cs:11:12:11:24 | [assembly: AssemblyTitle(...)] | 0 | attributes.cs:11:26:11:45 | "C# attributes test" |
| attributes.cs:12:12:12:30 | [assembly: AssemblyDescription(...)] | 0 | attributes.cs:12:32:12:56 | "A test of C# attributes" |
| attributes.cs:13:12:13:32 | [assembly: AssemblyConfiguration(...)] | 0 | attributes.cs:13:34:13:35 | "" |
| attributes.cs:14:12:14:26 | [assembly: AssemblyCompany(...)] | 0 | attributes.cs:14:28:14:39 | "Semmle Plc" |
| attributes.cs:15:12:15:26 | [assembly: AssemblyProduct(...)] | 0 | attributes.cs:15:28:15:34 | "Odasa" |
| attributes.cs:16:12:16:28 | [assembly: AssemblyCopyright(...)] | 0 | attributes.cs:16:30:16:54 | "Copyright \u00a9 Semmle 2018" |
| attributes.cs:17:12:17:28 | [assembly: AssemblyTrademark(...)] | 0 | attributes.cs:17:30:17:31 | "" |
| attributes.cs:18:12:18:26 | [assembly: AssemblyCulture(...)] | 0 | attributes.cs:18:28:18:29 | "" |
| attributes.cs:23:12:23:21 | [assembly: ComVisible(...)] | 0 | attributes.cs:23:23:23:27 | false |
| attributes.cs:26:12:26:15 | [assembly: Guid(...)] | 0 | attributes.cs:26:17:26:54 | "2f70fdd6-14aa-4850-b053-d547adb1f476" |
| attributes.cs:38:12:38:26 | [assembly: AssemblyVersion(...)] | 0 | attributes.cs:38:28:38:36 | "1.0.0.0" |
| attributes.cs:39:12:39:30 | [assembly: AssemblyFileVersion(...)] | 0 | attributes.cs:39:32:39:40 | "1.0.0.0" |
| attributes.cs:41:12:41:15 | [assembly: Args(...)] | 0 | attributes.cs:41:17:41:17 | 0 |
| attributes.cs:41:12:41:15 | [assembly: Args(...)] | 1 | attributes.cs:41:20:41:46 | array creation of type Object[] |
| attributes.cs:41:12:41:15 | [assembly: Args(...)] | 2 | attributes.cs:41:49:41:69 | typeof(...) |
| attributes.cs:41:12:41:15 | [assembly: Args(...)] | 3 | attributes.cs:41:72:41:76 | (...) ... |
| attributes.cs:41:12:41:15 | [assembly: Args(...)] | 4 | attributes.cs:41:79:41:82 | null |
| attributes.cs:41:12:41:15 | [assembly: Args(...)] | 5 | attributes.cs:41:92:41:122 | array creation of type Object[] |
| attributes.cs:42:10:42:13 | [module: Args(...)] | 0 | attributes.cs:42:15:42:15 | 0 |
| attributes.cs:42:10:42:13 | [module: Args(...)] | 1 | attributes.cs:42:18:42:44 | array creation of type Object[] |
| attributes.cs:42:10:42:13 | [module: Args(...)] | 2 | attributes.cs:42:47:42:67 | typeof(...) |
| attributes.cs:42:10:42:13 | [module: Args(...)] | 3 | attributes.cs:42:70:42:74 | (...) ... |
| attributes.cs:42:10:42:13 | [module: Args(...)] | 4 | attributes.cs:42:77:42:80 | null |
| attributes.cs:42:10:42:13 | [module: Args(...)] | 5 | attributes.cs:42:90:42:120 | array creation of type Object[] |
| attributes.cs:44:2:44:22 | [AttributeUsage(...)] | 0 | attributes.cs:44:24:44:50 | access to constant All |
| attributes.cs:47:6:47:16 | [Conditional(...)] | 0 | attributes.cs:47:18:47:25 | "DEBUG2" |
| attributes.cs:55:6:55:16 | [My(...)] | 0 | attributes.cs:55:18:55:22 | false |
| attributes.cs:58:6:58:16 | [My(...)] | 0 | attributes.cs:58:18:58:21 | true |
| attributes.cs:58:6:58:16 | [My(...)] | 1 | attributes.cs:58:28:58:29 | "" |
| attributes.cs:58:6:58:16 | [My(...)] | 2 | attributes.cs:58:36:58:36 | 0 |
| attributes.cs:59:6:59:8 | [My2(...)] | 0 | attributes.cs:59:28:59:32 | false |
| attributes.cs:59:6:59:8 | [My2(...)] | 1 | attributes.cs:59:13:59:16 | true |
| attributes.cs:59:6:59:8 | [My2(...)] | 2 | attributes.cs:59:6:59:8 | 12 |
| attributes.cs:59:6:59:8 | [My2(...)] | 3 | attributes.cs:59:22:59:22 | 1 |
| attributes.cs:59:6:59:8 | [My2(...)] | 4 | attributes.cs:59:39:59:40 | 42 |
| attributes.cs:78:2:78:5 | [Args(...)] | 0 | attributes.cs:78:7:78:8 | 42 |
| attributes.cs:78:2:78:5 | [Args(...)] | 1 | attributes.cs:78:11:78:14 | null |
| attributes.cs:78:2:78:5 | [Args(...)] | 2 | attributes.cs:78:17:78:25 | typeof(...) |
| attributes.cs:78:2:78:5 | [Args(...)] | 3 | attributes.cs:78:28:78:30 | access to constant A |
| attributes.cs:78:2:78:5 | [Args(...)] | 4 | attributes.cs:78:33:78:53 | array creation of type Int32[] |
| attributes.cs:78:2:78:5 | [Args(...)] | 5 | attributes.cs:78:63:78:93 | array creation of type Object[] |
| attributes.cs:81:6:81:9 | [Args(...)] | 0 | attributes.cs:81:11:81:16 | ... + ... |
| attributes.cs:81:6:81:9 | [Args(...)] | 1 | attributes.cs:81:19:81:39 | array creation of type Int32[] |
| attributes.cs:81:6:81:9 | [Args(...)] | 2 | attributes.cs:81:42:81:45 | null |
| attributes.cs:81:6:81:9 | [Args(...)] | 3 | attributes.cs:81:48:81:52 | (...) ... |
| attributes.cs:81:6:81:9 | [Args(...)] | 4 | attributes.cs:81:55:81:58 | null |
| attributes.cs:81:6:81:9 | [Args(...)] | 5 | attributes.cs:81:68:81:98 | array creation of type Object[] |
| attributes.cs:82:14:82:17 | [return: Args(...)] | 0 | attributes.cs:82:19:82:24 | ... + ... |
| attributes.cs:82:14:82:17 | [return: Args(...)] | 1 | attributes.cs:82:27:82:47 | array creation of type Int32[] |
| attributes.cs:82:14:82:17 | [return: Args(...)] | 2 | attributes.cs:82:50:82:53 | null |
| attributes.cs:82:14:82:17 | [return: Args(...)] | 3 | attributes.cs:82:56:82:60 | (...) ... |
| attributes.cs:82:14:82:17 | [return: Args(...)] | 4 | attributes.cs:82:63:82:66 | null |
| attributes.cs:82:14:82:17 | [return: Args(...)] | 5 | attributes.cs:82:76:82:106 | array creation of type Object[] |
| attributes.cs:97:2:97:13 | [My3(...)] | 0 | attributes.cs:97:15:97:15 | 1 |
| attributes.cs:98:10:98:21 | [return: My3(...)] | 0 | attributes.cs:98:23:98:23 | 2 |
| attributes.cs:101:10:101:21 | [return: My3(...)] | 0 | attributes.cs:101:23:101:23 | 3 |
| attributes.cs:102:8:102:19 | [My3(...)] | 0 | attributes.cs:102:21:102:21 | 4 |
| attributes.cs:107:6:107:17 | [My3(...)] | 0 | attributes.cs:107:19:107:19 | 5 |
| attributes.cs:108:14:108:25 | [return: My3(...)] | 0 | attributes.cs:108:27:108:27 | 6 |
| attributes.cs:111:6:111:17 | [My3(...)] | 0 | attributes.cs:111:19:111:20 | 15 |
| attributes.cs:114:10:114:21 | [My3(...)] | 0 | attributes.cs:114:23:114:23 | 7 |
| attributes.cs:115:18:115:29 | [return: My3(...)] | 0 | attributes.cs:115:31:115:31 | 8 |
| attributes.cs:118:18:118:29 | [My3(...)] | 0 | attributes.cs:118:31:118:31 | 9 |
| attributes.cs:119:17:119:28 | [My3(...)] | 0 | attributes.cs:119:30:119:31 | 10 |
| attributes.cs:124:6:124:17 | [My3(...)] | 0 | attributes.cs:124:19:124:20 | 16 |
| attributes.cs:127:18:127:29 | [My3(...)] | 0 | attributes.cs:127:31:127:32 | 11 |
| attributes.cs:128:18:128:29 | [return: My3(...)] | 0 | attributes.cs:128:31:128:32 | 12 |
| attributes.cs:131:10:131:21 | [My3(...)] | 0 | attributes.cs:131:23:131:24 | 13 |
| attributes.cs:132:17:132:28 | [My3(...)] | 0 | attributes.cs:132:30:132:31 | 14 |
| attributes.cs:144:6:144:11 | [Params(...)] | 0 | attributes.cs:144:13:144:15 | "a" |
| attributes.cs:144:6:144:11 | [Params(...)] | 1 | attributes.cs:144:18:144:20 | "b" |
| attributes.cs:144:6:144:11 | [Params(...)] | 2 | attributes.cs:144:23:144:23 | 1 |
| attributes.cs:144:6:144:11 | [Params(...)] | 3 | attributes.cs:144:26:144:26 | 2 |
| attributes.cs:144:6:144:11 | [Params(...)] | 4 | attributes.cs:144:29:144:29 | 3 |
| attributes.cs:147:6:147:11 | [Params(...)] | 0 | attributes.cs:147:17:147:19 | "a" |
| attributes.cs:147:6:147:11 | [Params(...)] | 1 | attributes.cs:147:26:147:28 | "b" |
| attributes.cs:147:6:147:11 | [Params(...)] | 2 | attributes.cs:147:31:147:31 | 1 |
| attributes.cs:147:6:147:11 | [Params(...)] | 3 | attributes.cs:147:34:147:34 | 2 |
| attributes.cs:147:6:147:11 | [Params(...)] | 4 | attributes.cs:147:37:147:37 | 3 |
| attributes.cs:150:6:150:11 | [Params(...)] | 0 | attributes.cs:150:35:150:37 | "a" |
| attributes.cs:150:6:150:11 | [Params(...)] | 1 | attributes.cs:150:26:150:28 | "b" |
| attributes.cs:150:6:150:11 | [Params(...)] | 2 | attributes.cs:150:19:150:19 | 1 |
| attributes.cs:153:6:153:11 | [Params(...)] | 0 | attributes.cs:153:45:153:47 | "a" |
| attributes.cs:153:6:153:11 | [Params(...)] | 1 | attributes.cs:153:36:153:38 | "b" |
| attributes.cs:153:6:153:11 | [Params(...)] | 2 | attributes.cs:153:19:153:29 | array creation of type Int32[] |
| attributes.cs:157:2:157:13 | [Experimental(...)] | 0 | attributes.cs:157:15:157:37 | "MyExperimentalClassId" |
| attributes.cs:160:6:160:17 | [Experimental(...)] | 0 | attributes.cs:160:19:160:42 | "MyExperimentalMethodId" |
| attributes.cs:12:12:12:24 | [assembly: AssemblyTitle(...)] | 0 | attributes.cs:12:26:12:45 | "C# attributes test" |
| attributes.cs:13:12:13:30 | [assembly: AssemblyDescription(...)] | 0 | attributes.cs:13:32:13:56 | "A test of C# attributes" |
| attributes.cs:14:12:14:32 | [assembly: AssemblyConfiguration(...)] | 0 | attributes.cs:14:34:14:35 | "" |
| attributes.cs:15:12:15:26 | [assembly: AssemblyCompany(...)] | 0 | attributes.cs:15:28:15:39 | "Semmle Plc" |
| attributes.cs:16:12:16:26 | [assembly: AssemblyProduct(...)] | 0 | attributes.cs:16:28:16:34 | "Odasa" |
| attributes.cs:17:12:17:28 | [assembly: AssemblyCopyright(...)] | 0 | attributes.cs:17:30:17:54 | "Copyright \u00a9 Semmle 2018" |
| attributes.cs:18:12:18:28 | [assembly: AssemblyTrademark(...)] | 0 | attributes.cs:18:30:18:31 | "" |
| attributes.cs:19:12:19:26 | [assembly: AssemblyCulture(...)] | 0 | attributes.cs:19:28:19:29 | "" |
| attributes.cs:24:12:24:21 | [assembly: ComVisible(...)] | 0 | attributes.cs:24:23:24:27 | false |
| attributes.cs:27:12:27:15 | [assembly: Guid(...)] | 0 | attributes.cs:27:17:27:54 | "2f70fdd6-14aa-4850-b053-d547adb1f476" |
| attributes.cs:39:12:39:26 | [assembly: AssemblyVersion(...)] | 0 | attributes.cs:39:28:39:36 | "1.0.0.0" |
| attributes.cs:40:12:40:30 | [assembly: AssemblyFileVersion(...)] | 0 | attributes.cs:40:32:40:40 | "1.0.0.0" |
| attributes.cs:42:12:42:15 | [assembly: Args(...)] | 0 | attributes.cs:42:17:42:17 | 0 |
| attributes.cs:42:12:42:15 | [assembly: Args(...)] | 1 | attributes.cs:42:20:42:46 | array creation of type Object[] |
| attributes.cs:42:12:42:15 | [assembly: Args(...)] | 2 | attributes.cs:42:49:42:69 | typeof(...) |
| attributes.cs:42:12:42:15 | [assembly: Args(...)] | 3 | attributes.cs:42:72:42:76 | (...) ... |
| attributes.cs:42:12:42:15 | [assembly: Args(...)] | 4 | attributes.cs:42:79:42:82 | null |
| attributes.cs:42:12:42:15 | [assembly: Args(...)] | 5 | attributes.cs:42:92:42:122 | array creation of type Object[] |
| attributes.cs:43:10:43:13 | [module: Args(...)] | 0 | attributes.cs:43:15:43:15 | 0 |
| attributes.cs:43:10:43:13 | [module: Args(...)] | 1 | attributes.cs:43:18:43:44 | array creation of type Object[] |
| attributes.cs:43:10:43:13 | [module: Args(...)] | 2 | attributes.cs:43:47:43:67 | typeof(...) |
| attributes.cs:43:10:43:13 | [module: Args(...)] | 3 | attributes.cs:43:70:43:74 | (...) ... |
| attributes.cs:43:10:43:13 | [module: Args(...)] | 4 | attributes.cs:43:77:43:80 | null |
| attributes.cs:43:10:43:13 | [module: Args(...)] | 5 | attributes.cs:43:90:43:120 | array creation of type Object[] |
| attributes.cs:45:2:45:22 | [AttributeUsage(...)] | 0 | attributes.cs:45:24:45:50 | access to constant All |
| attributes.cs:48:6:48:16 | [Conditional(...)] | 0 | attributes.cs:48:18:48:25 | "DEBUG2" |
| attributes.cs:56:6:56:16 | [My(...)] | 0 | attributes.cs:56:18:56:22 | false |
| attributes.cs:59:6:59:16 | [My(...)] | 0 | attributes.cs:59:18:59:21 | true |
| attributes.cs:59:6:59:16 | [My(...)] | 1 | attributes.cs:59:28:59:29 | "" |
| attributes.cs:59:6:59:16 | [My(...)] | 2 | attributes.cs:59:36:59:36 | 0 |
| attributes.cs:60:6:60:8 | [My2(...)] | 0 | attributes.cs:60:28:60:32 | false |
| attributes.cs:60:6:60:8 | [My2(...)] | 1 | attributes.cs:60:13:60:16 | true |
| attributes.cs:60:6:60:8 | [My2(...)] | 2 | attributes.cs:60:6:60:8 | 12 |
| attributes.cs:60:6:60:8 | [My2(...)] | 3 | attributes.cs:60:22:60:22 | 1 |
| attributes.cs:60:6:60:8 | [My2(...)] | 4 | attributes.cs:60:39:60:40 | 42 |
| attributes.cs:79:2:79:5 | [Args(...)] | 0 | attributes.cs:79:7:79:8 | 42 |
| attributes.cs:79:2:79:5 | [Args(...)] | 1 | attributes.cs:79:11:79:14 | null |
| attributes.cs:79:2:79:5 | [Args(...)] | 2 | attributes.cs:79:17:79:25 | typeof(...) |
| attributes.cs:79:2:79:5 | [Args(...)] | 3 | attributes.cs:79:28:79:30 | access to constant A |
| attributes.cs:79:2:79:5 | [Args(...)] | 4 | attributes.cs:79:33:79:53 | array creation of type Int32[] |
| attributes.cs:79:2:79:5 | [Args(...)] | 5 | attributes.cs:79:63:79:93 | array creation of type Object[] |
| attributes.cs:82:6:82:9 | [Args(...)] | 0 | attributes.cs:82:11:82:16 | ... + ... |
| attributes.cs:82:6:82:9 | [Args(...)] | 1 | attributes.cs:82:19:82:39 | array creation of type Int32[] |
| attributes.cs:82:6:82:9 | [Args(...)] | 2 | attributes.cs:82:42:82:45 | null |
| attributes.cs:82:6:82:9 | [Args(...)] | 3 | attributes.cs:82:48:82:52 | (...) ... |
| attributes.cs:82:6:82:9 | [Args(...)] | 4 | attributes.cs:82:55:82:58 | null |
| attributes.cs:82:6:82:9 | [Args(...)] | 5 | attributes.cs:82:68:82:98 | array creation of type Object[] |
| attributes.cs:83:14:83:17 | [return: Args(...)] | 0 | attributes.cs:83:19:83:24 | ... + ... |
| attributes.cs:83:14:83:17 | [return: Args(...)] | 1 | attributes.cs:83:27:83:47 | array creation of type Int32[] |
| attributes.cs:83:14:83:17 | [return: Args(...)] | 2 | attributes.cs:83:50:83:53 | null |
| attributes.cs:83:14:83:17 | [return: Args(...)] | 3 | attributes.cs:83:56:83:60 | (...) ... |
| attributes.cs:83:14:83:17 | [return: Args(...)] | 4 | attributes.cs:83:63:83:66 | null |
| attributes.cs:83:14:83:17 | [return: Args(...)] | 5 | attributes.cs:83:76:83:106 | array creation of type Object[] |
| attributes.cs:98:2:98:13 | [My3(...)] | 0 | attributes.cs:98:15:98:15 | 1 |
| attributes.cs:99:10:99:21 | [return: My3(...)] | 0 | attributes.cs:99:23:99:23 | 2 |
| attributes.cs:102:10:102:21 | [return: My3(...)] | 0 | attributes.cs:102:23:102:23 | 3 |
| attributes.cs:103:8:103:19 | [My3(...)] | 0 | attributes.cs:103:21:103:21 | 4 |
| attributes.cs:108:6:108:17 | [My3(...)] | 0 | attributes.cs:108:19:108:19 | 5 |
| attributes.cs:109:14:109:25 | [return: My3(...)] | 0 | attributes.cs:109:27:109:27 | 6 |
| attributes.cs:112:6:112:17 | [My3(...)] | 0 | attributes.cs:112:19:112:20 | 15 |
| attributes.cs:115:10:115:21 | [My3(...)] | 0 | attributes.cs:115:23:115:23 | 7 |
| attributes.cs:116:18:116:29 | [return: My3(...)] | 0 | attributes.cs:116:31:116:31 | 8 |
| attributes.cs:119:18:119:29 | [My3(...)] | 0 | attributes.cs:119:31:119:31 | 9 |
| attributes.cs:120:17:120:28 | [My3(...)] | 0 | attributes.cs:120:30:120:31 | 10 |
| attributes.cs:125:6:125:17 | [My3(...)] | 0 | attributes.cs:125:19:125:20 | 16 |
| attributes.cs:128:18:128:29 | [My3(...)] | 0 | attributes.cs:128:31:128:32 | 11 |
| attributes.cs:129:18:129:29 | [return: My3(...)] | 0 | attributes.cs:129:31:129:32 | 12 |
| attributes.cs:132:10:132:21 | [My3(...)] | 0 | attributes.cs:132:23:132:24 | 13 |
| attributes.cs:133:17:133:28 | [My3(...)] | 0 | attributes.cs:133:30:133:31 | 14 |
| attributes.cs:145:6:145:11 | [Params(...)] | 0 | attributes.cs:145:13:145:15 | "a" |
| attributes.cs:145:6:145:11 | [Params(...)] | 1 | attributes.cs:145:18:145:20 | "b" |
| attributes.cs:145:6:145:11 | [Params(...)] | 2 | attributes.cs:145:23:145:23 | 1 |
| attributes.cs:145:6:145:11 | [Params(...)] | 3 | attributes.cs:145:26:145:26 | 2 |
| attributes.cs:145:6:145:11 | [Params(...)] | 4 | attributes.cs:145:29:145:29 | 3 |
| attributes.cs:148:6:148:11 | [Params(...)] | 0 | attributes.cs:148:17:148:19 | "a" |
| attributes.cs:148:6:148:11 | [Params(...)] | 1 | attributes.cs:148:26:148:28 | "b" |
| attributes.cs:148:6:148:11 | [Params(...)] | 2 | attributes.cs:148:31:148:31 | 1 |
| attributes.cs:148:6:148:11 | [Params(...)] | 3 | attributes.cs:148:34:148:34 | 2 |
| attributes.cs:148:6:148:11 | [Params(...)] | 4 | attributes.cs:148:37:148:37 | 3 |
| attributes.cs:151:6:151:11 | [Params(...)] | 0 | attributes.cs:151:35:151:37 | "a" |
| attributes.cs:151:6:151:11 | [Params(...)] | 1 | attributes.cs:151:26:151:28 | "b" |
| attributes.cs:151:6:151:11 | [Params(...)] | 2 | attributes.cs:151:19:151:19 | 1 |
| attributes.cs:154:6:154:11 | [Params(...)] | 0 | attributes.cs:154:45:154:47 | "a" |
| attributes.cs:154:6:154:11 | [Params(...)] | 1 | attributes.cs:154:36:154:38 | "b" |
| attributes.cs:154:6:154:11 | [Params(...)] | 2 | attributes.cs:154:19:154:29 | array creation of type Int32[] |
| attributes.cs:158:2:158:13 | [Experimental(...)] | 0 | attributes.cs:158:15:158:37 | "MyExperimentalClassId" |
| attributes.cs:161:6:161:17 | [Experimental(...)] | 0 | attributes.cs:161:19:161:42 | "MyExperimentalMethodId" |
| attributes.cs:167:6:167:31 | [OverloadResolutionPriority(...)] | 0 | attributes.cs:167:33:167:34 | -... |
| attributes.cs:170:6:170:31 | [OverloadResolutionPriority(...)] | 0 | attributes.cs:170:33:170:33 | 1 |
| attributes.cs:173:6:173:31 | [OverloadResolutionPriority(...)] | 0 | attributes.cs:173:33:173:33 | 2 |
constructorArguments
| Assembly1.dll:0:0:0:0 | [Custom(...)] | 0 | Assembly1.dll:0:0:0:0 | 1 |
| Assembly1.dll:0:0:0:0 | [Custom(...)] | 0 | Assembly1.dll:0:0:0:0 | 3 |
@@ -131,95 +134,98 @@ constructorArguments
| Assembly1.dll:0:0:0:0 | [return: Custom(...)] | 2 | Assembly1.dll:0:0:0:0 | null |
| Assembly1.dll:0:0:0:0 | [return: Custom(...)] | 3 | Assembly1.dll:0:0:0:0 | (...) ... |
| Assembly1.dll:0:0:0:0 | [return: Custom(...)] | 4 | Assembly1.dll:0:0:0:0 | array creation of type Int32[] |
| attributes.cs:11:12:11:24 | [assembly: AssemblyTitle(...)] | 0 | attributes.cs:11:26:11:45 | "C# attributes test" |
| attributes.cs:12:12:12:30 | [assembly: AssemblyDescription(...)] | 0 | attributes.cs:12:32:12:56 | "A test of C# attributes" |
| attributes.cs:13:12:13:32 | [assembly: AssemblyConfiguration(...)] | 0 | attributes.cs:13:34:13:35 | "" |
| attributes.cs:14:12:14:26 | [assembly: AssemblyCompany(...)] | 0 | attributes.cs:14:28:14:39 | "Semmle Plc" |
| attributes.cs:15:12:15:26 | [assembly: AssemblyProduct(...)] | 0 | attributes.cs:15:28:15:34 | "Odasa" |
| attributes.cs:16:12:16:28 | [assembly: AssemblyCopyright(...)] | 0 | attributes.cs:16:30:16:54 | "Copyright \u00a9 Semmle 2018" |
| attributes.cs:17:12:17:28 | [assembly: AssemblyTrademark(...)] | 0 | attributes.cs:17:30:17:31 | "" |
| attributes.cs:18:12:18:26 | [assembly: AssemblyCulture(...)] | 0 | attributes.cs:18:28:18:29 | "" |
| attributes.cs:23:12:23:21 | [assembly: ComVisible(...)] | 0 | attributes.cs:23:23:23:27 | false |
| attributes.cs:26:12:26:15 | [assembly: Guid(...)] | 0 | attributes.cs:26:17:26:54 | "2f70fdd6-14aa-4850-b053-d547adb1f476" |
| attributes.cs:38:12:38:26 | [assembly: AssemblyVersion(...)] | 0 | attributes.cs:38:28:38:36 | "1.0.0.0" |
| attributes.cs:39:12:39:30 | [assembly: AssemblyFileVersion(...)] | 0 | attributes.cs:39:32:39:40 | "1.0.0.0" |
| attributes.cs:41:12:41:15 | [assembly: Args(...)] | 0 | attributes.cs:41:17:41:17 | 0 |
| attributes.cs:41:12:41:15 | [assembly: Args(...)] | 1 | attributes.cs:41:20:41:46 | array creation of type Object[] |
| attributes.cs:41:12:41:15 | [assembly: Args(...)] | 2 | attributes.cs:41:49:41:69 | typeof(...) |
| attributes.cs:41:12:41:15 | [assembly: Args(...)] | 3 | attributes.cs:41:72:41:76 | (...) ... |
| attributes.cs:41:12:41:15 | [assembly: Args(...)] | 4 | attributes.cs:41:79:41:82 | null |
| attributes.cs:42:10:42:13 | [module: Args(...)] | 0 | attributes.cs:42:15:42:15 | 0 |
| attributes.cs:42:10:42:13 | [module: Args(...)] | 1 | attributes.cs:42:18:42:44 | array creation of type Object[] |
| attributes.cs:42:10:42:13 | [module: Args(...)] | 2 | attributes.cs:42:47:42:67 | typeof(...) |
| attributes.cs:42:10:42:13 | [module: Args(...)] | 3 | attributes.cs:42:70:42:74 | (...) ... |
| attributes.cs:42:10:42:13 | [module: Args(...)] | 4 | attributes.cs:42:77:42:80 | null |
| attributes.cs:44:2:44:22 | [AttributeUsage(...)] | 0 | attributes.cs:44:24:44:50 | access to constant All |
| attributes.cs:47:6:47:16 | [Conditional(...)] | 0 | attributes.cs:47:18:47:25 | "DEBUG2" |
| attributes.cs:55:6:55:16 | [My(...)] | 0 | attributes.cs:55:18:55:22 | false |
| attributes.cs:58:6:58:16 | [My(...)] | 0 | attributes.cs:58:18:58:21 | true |
| attributes.cs:59:6:59:8 | [My2(...)] | 0 | attributes.cs:59:28:59:32 | false |
| attributes.cs:59:6:59:8 | [My2(...)] | 1 | attributes.cs:59:13:59:16 | true |
| attributes.cs:59:6:59:8 | [My2(...)] | 2 | attributes.cs:59:6:59:8 | 12 |
| attributes.cs:59:6:59:8 | [My2(...)] | 3 | attributes.cs:59:22:59:22 | 1 |
| attributes.cs:78:2:78:5 | [Args(...)] | 0 | attributes.cs:78:7:78:8 | 42 |
| attributes.cs:78:2:78:5 | [Args(...)] | 1 | attributes.cs:78:11:78:14 | null |
| attributes.cs:78:2:78:5 | [Args(...)] | 2 | attributes.cs:78:17:78:25 | typeof(...) |
| attributes.cs:78:2:78:5 | [Args(...)] | 3 | attributes.cs:78:28:78:30 | access to constant A |
| attributes.cs:78:2:78:5 | [Args(...)] | 4 | attributes.cs:78:33:78:53 | array creation of type Int32[] |
| attributes.cs:81:6:81:9 | [Args(...)] | 0 | attributes.cs:81:11:81:16 | ... + ... |
| attributes.cs:81:6:81:9 | [Args(...)] | 1 | attributes.cs:81:19:81:39 | array creation of type Int32[] |
| attributes.cs:81:6:81:9 | [Args(...)] | 2 | attributes.cs:81:42:81:45 | null |
| attributes.cs:81:6:81:9 | [Args(...)] | 3 | attributes.cs:81:48:81:52 | (...) ... |
| attributes.cs:81:6:81:9 | [Args(...)] | 4 | attributes.cs:81:55:81:58 | null |
| attributes.cs:82:14:82:17 | [return: Args(...)] | 0 | attributes.cs:82:19:82:24 | ... + ... |
| attributes.cs:82:14:82:17 | [return: Args(...)] | 1 | attributes.cs:82:27:82:47 | array creation of type Int32[] |
| attributes.cs:82:14:82:17 | [return: Args(...)] | 2 | attributes.cs:82:50:82:53 | null |
| attributes.cs:82:14:82:17 | [return: Args(...)] | 3 | attributes.cs:82:56:82:60 | (...) ... |
| attributes.cs:82:14:82:17 | [return: Args(...)] | 4 | attributes.cs:82:63:82:66 | null |
| attributes.cs:97:2:97:13 | [My3(...)] | 0 | attributes.cs:97:15:97:15 | 1 |
| attributes.cs:98:10:98:21 | [return: My3(...)] | 0 | attributes.cs:98:23:98:23 | 2 |
| attributes.cs:101:10:101:21 | [return: My3(...)] | 0 | attributes.cs:101:23:101:23 | 3 |
| attributes.cs:102:8:102:19 | [My3(...)] | 0 | attributes.cs:102:21:102:21 | 4 |
| attributes.cs:107:6:107:17 | [My3(...)] | 0 | attributes.cs:107:19:107:19 | 5 |
| attributes.cs:108:14:108:25 | [return: My3(...)] | 0 | attributes.cs:108:27:108:27 | 6 |
| attributes.cs:111:6:111:17 | [My3(...)] | 0 | attributes.cs:111:19:111:20 | 15 |
| attributes.cs:114:10:114:21 | [My3(...)] | 0 | attributes.cs:114:23:114:23 | 7 |
| attributes.cs:115:18:115:29 | [return: My3(...)] | 0 | attributes.cs:115:31:115:31 | 8 |
| attributes.cs:118:18:118:29 | [My3(...)] | 0 | attributes.cs:118:31:118:31 | 9 |
| attributes.cs:119:17:119:28 | [My3(...)] | 0 | attributes.cs:119:30:119:31 | 10 |
| attributes.cs:124:6:124:17 | [My3(...)] | 0 | attributes.cs:124:19:124:20 | 16 |
| attributes.cs:127:18:127:29 | [My3(...)] | 0 | attributes.cs:127:31:127:32 | 11 |
| attributes.cs:128:18:128:29 | [return: My3(...)] | 0 | attributes.cs:128:31:128:32 | 12 |
| attributes.cs:131:10:131:21 | [My3(...)] | 0 | attributes.cs:131:23:131:24 | 13 |
| attributes.cs:132:17:132:28 | [My3(...)] | 0 | attributes.cs:132:30:132:31 | 14 |
| attributes.cs:144:6:144:11 | [Params(...)] | 0 | attributes.cs:144:13:144:15 | "a" |
| attributes.cs:144:6:144:11 | [Params(...)] | 1 | attributes.cs:144:18:144:20 | "b" |
| attributes.cs:144:6:144:11 | [Params(...)] | 2 | attributes.cs:144:23:144:23 | 1 |
| attributes.cs:144:6:144:11 | [Params(...)] | 3 | attributes.cs:144:26:144:26 | 2 |
| attributes.cs:144:6:144:11 | [Params(...)] | 4 | attributes.cs:144:29:144:29 | 3 |
| attributes.cs:147:6:147:11 | [Params(...)] | 0 | attributes.cs:147:17:147:19 | "a" |
| attributes.cs:147:6:147:11 | [Params(...)] | 1 | attributes.cs:147:26:147:28 | "b" |
| attributes.cs:147:6:147:11 | [Params(...)] | 2 | attributes.cs:147:31:147:31 | 1 |
| attributes.cs:147:6:147:11 | [Params(...)] | 3 | attributes.cs:147:34:147:34 | 2 |
| attributes.cs:147:6:147:11 | [Params(...)] | 4 | attributes.cs:147:37:147:37 | 3 |
| attributes.cs:150:6:150:11 | [Params(...)] | 0 | attributes.cs:150:35:150:37 | "a" |
| attributes.cs:150:6:150:11 | [Params(...)] | 1 | attributes.cs:150:26:150:28 | "b" |
| attributes.cs:150:6:150:11 | [Params(...)] | 2 | attributes.cs:150:19:150:19 | 1 |
| attributes.cs:153:6:153:11 | [Params(...)] | 0 | attributes.cs:153:45:153:47 | "a" |
| attributes.cs:153:6:153:11 | [Params(...)] | 1 | attributes.cs:153:36:153:38 | "b" |
| attributes.cs:153:6:153:11 | [Params(...)] | 2 | attributes.cs:153:19:153:29 | array creation of type Int32[] |
| attributes.cs:157:2:157:13 | [Experimental(...)] | 0 | attributes.cs:157:15:157:37 | "MyExperimentalClassId" |
| attributes.cs:160:6:160:17 | [Experimental(...)] | 0 | attributes.cs:160:19:160:42 | "MyExperimentalMethodId" |
| attributes.cs:12:12:12:24 | [assembly: AssemblyTitle(...)] | 0 | attributes.cs:12:26:12:45 | "C# attributes test" |
| attributes.cs:13:12:13:30 | [assembly: AssemblyDescription(...)] | 0 | attributes.cs:13:32:13:56 | "A test of C# attributes" |
| attributes.cs:14:12:14:32 | [assembly: AssemblyConfiguration(...)] | 0 | attributes.cs:14:34:14:35 | "" |
| attributes.cs:15:12:15:26 | [assembly: AssemblyCompany(...)] | 0 | attributes.cs:15:28:15:39 | "Semmle Plc" |
| attributes.cs:16:12:16:26 | [assembly: AssemblyProduct(...)] | 0 | attributes.cs:16:28:16:34 | "Odasa" |
| attributes.cs:17:12:17:28 | [assembly: AssemblyCopyright(...)] | 0 | attributes.cs:17:30:17:54 | "Copyright \u00a9 Semmle 2018" |
| attributes.cs:18:12:18:28 | [assembly: AssemblyTrademark(...)] | 0 | attributes.cs:18:30:18:31 | "" |
| attributes.cs:19:12:19:26 | [assembly: AssemblyCulture(...)] | 0 | attributes.cs:19:28:19:29 | "" |
| attributes.cs:24:12:24:21 | [assembly: ComVisible(...)] | 0 | attributes.cs:24:23:24:27 | false |
| attributes.cs:27:12:27:15 | [assembly: Guid(...)] | 0 | attributes.cs:27:17:27:54 | "2f70fdd6-14aa-4850-b053-d547adb1f476" |
| attributes.cs:39:12:39:26 | [assembly: AssemblyVersion(...)] | 0 | attributes.cs:39:28:39:36 | "1.0.0.0" |
| attributes.cs:40:12:40:30 | [assembly: AssemblyFileVersion(...)] | 0 | attributes.cs:40:32:40:40 | "1.0.0.0" |
| attributes.cs:42:12:42:15 | [assembly: Args(...)] | 0 | attributes.cs:42:17:42:17 | 0 |
| attributes.cs:42:12:42:15 | [assembly: Args(...)] | 1 | attributes.cs:42:20:42:46 | array creation of type Object[] |
| attributes.cs:42:12:42:15 | [assembly: Args(...)] | 2 | attributes.cs:42:49:42:69 | typeof(...) |
| attributes.cs:42:12:42:15 | [assembly: Args(...)] | 3 | attributes.cs:42:72:42:76 | (...) ... |
| attributes.cs:42:12:42:15 | [assembly: Args(...)] | 4 | attributes.cs:42:79:42:82 | null |
| attributes.cs:43:10:43:13 | [module: Args(...)] | 0 | attributes.cs:43:15:43:15 | 0 |
| attributes.cs:43:10:43:13 | [module: Args(...)] | 1 | attributes.cs:43:18:43:44 | array creation of type Object[] |
| attributes.cs:43:10:43:13 | [module: Args(...)] | 2 | attributes.cs:43:47:43:67 | typeof(...) |
| attributes.cs:43:10:43:13 | [module: Args(...)] | 3 | attributes.cs:43:70:43:74 | (...) ... |
| attributes.cs:43:10:43:13 | [module: Args(...)] | 4 | attributes.cs:43:77:43:80 | null |
| attributes.cs:45:2:45:22 | [AttributeUsage(...)] | 0 | attributes.cs:45:24:45:50 | access to constant All |
| attributes.cs:48:6:48:16 | [Conditional(...)] | 0 | attributes.cs:48:18:48:25 | "DEBUG2" |
| attributes.cs:56:6:56:16 | [My(...)] | 0 | attributes.cs:56:18:56:22 | false |
| attributes.cs:59:6:59:16 | [My(...)] | 0 | attributes.cs:59:18:59:21 | true |
| attributes.cs:60:6:60:8 | [My2(...)] | 0 | attributes.cs:60:28:60:32 | false |
| attributes.cs:60:6:60:8 | [My2(...)] | 1 | attributes.cs:60:13:60:16 | true |
| attributes.cs:60:6:60:8 | [My2(...)] | 2 | attributes.cs:60:6:60:8 | 12 |
| attributes.cs:60:6:60:8 | [My2(...)] | 3 | attributes.cs:60:22:60:22 | 1 |
| attributes.cs:79:2:79:5 | [Args(...)] | 0 | attributes.cs:79:7:79:8 | 42 |
| attributes.cs:79:2:79:5 | [Args(...)] | 1 | attributes.cs:79:11:79:14 | null |
| attributes.cs:79:2:79:5 | [Args(...)] | 2 | attributes.cs:79:17:79:25 | typeof(...) |
| attributes.cs:79:2:79:5 | [Args(...)] | 3 | attributes.cs:79:28:79:30 | access to constant A |
| attributes.cs:79:2:79:5 | [Args(...)] | 4 | attributes.cs:79:33:79:53 | array creation of type Int32[] |
| attributes.cs:82:6:82:9 | [Args(...)] | 0 | attributes.cs:82:11:82:16 | ... + ... |
| attributes.cs:82:6:82:9 | [Args(...)] | 1 | attributes.cs:82:19:82:39 | array creation of type Int32[] |
| attributes.cs:82:6:82:9 | [Args(...)] | 2 | attributes.cs:82:42:82:45 | null |
| attributes.cs:82:6:82:9 | [Args(...)] | 3 | attributes.cs:82:48:82:52 | (...) ... |
| attributes.cs:82:6:82:9 | [Args(...)] | 4 | attributes.cs:82:55:82:58 | null |
| attributes.cs:83:14:83:17 | [return: Args(...)] | 0 | attributes.cs:83:19:83:24 | ... + ... |
| attributes.cs:83:14:83:17 | [return: Args(...)] | 1 | attributes.cs:83:27:83:47 | array creation of type Int32[] |
| attributes.cs:83:14:83:17 | [return: Args(...)] | 2 | attributes.cs:83:50:83:53 | null |
| attributes.cs:83:14:83:17 | [return: Args(...)] | 3 | attributes.cs:83:56:83:60 | (...) ... |
| attributes.cs:83:14:83:17 | [return: Args(...)] | 4 | attributes.cs:83:63:83:66 | null |
| attributes.cs:98:2:98:13 | [My3(...)] | 0 | attributes.cs:98:15:98:15 | 1 |
| attributes.cs:99:10:99:21 | [return: My3(...)] | 0 | attributes.cs:99:23:99:23 | 2 |
| attributes.cs:102:10:102:21 | [return: My3(...)] | 0 | attributes.cs:102:23:102:23 | 3 |
| attributes.cs:103:8:103:19 | [My3(...)] | 0 | attributes.cs:103:21:103:21 | 4 |
| attributes.cs:108:6:108:17 | [My3(...)] | 0 | attributes.cs:108:19:108:19 | 5 |
| attributes.cs:109:14:109:25 | [return: My3(...)] | 0 | attributes.cs:109:27:109:27 | 6 |
| attributes.cs:112:6:112:17 | [My3(...)] | 0 | attributes.cs:112:19:112:20 | 15 |
| attributes.cs:115:10:115:21 | [My3(...)] | 0 | attributes.cs:115:23:115:23 | 7 |
| attributes.cs:116:18:116:29 | [return: My3(...)] | 0 | attributes.cs:116:31:116:31 | 8 |
| attributes.cs:119:18:119:29 | [My3(...)] | 0 | attributes.cs:119:31:119:31 | 9 |
| attributes.cs:120:17:120:28 | [My3(...)] | 0 | attributes.cs:120:30:120:31 | 10 |
| attributes.cs:125:6:125:17 | [My3(...)] | 0 | attributes.cs:125:19:125:20 | 16 |
| attributes.cs:128:18:128:29 | [My3(...)] | 0 | attributes.cs:128:31:128:32 | 11 |
| attributes.cs:129:18:129:29 | [return: My3(...)] | 0 | attributes.cs:129:31:129:32 | 12 |
| attributes.cs:132:10:132:21 | [My3(...)] | 0 | attributes.cs:132:23:132:24 | 13 |
| attributes.cs:133:17:133:28 | [My3(...)] | 0 | attributes.cs:133:30:133:31 | 14 |
| attributes.cs:145:6:145:11 | [Params(...)] | 0 | attributes.cs:145:13:145:15 | "a" |
| attributes.cs:145:6:145:11 | [Params(...)] | 1 | attributes.cs:145:18:145:20 | "b" |
| attributes.cs:145:6:145:11 | [Params(...)] | 2 | attributes.cs:145:23:145:23 | 1 |
| attributes.cs:145:6:145:11 | [Params(...)] | 3 | attributes.cs:145:26:145:26 | 2 |
| attributes.cs:145:6:145:11 | [Params(...)] | 4 | attributes.cs:145:29:145:29 | 3 |
| attributes.cs:148:6:148:11 | [Params(...)] | 0 | attributes.cs:148:17:148:19 | "a" |
| attributes.cs:148:6:148:11 | [Params(...)] | 1 | attributes.cs:148:26:148:28 | "b" |
| attributes.cs:148:6:148:11 | [Params(...)] | 2 | attributes.cs:148:31:148:31 | 1 |
| attributes.cs:148:6:148:11 | [Params(...)] | 3 | attributes.cs:148:34:148:34 | 2 |
| attributes.cs:148:6:148:11 | [Params(...)] | 4 | attributes.cs:148:37:148:37 | 3 |
| attributes.cs:151:6:151:11 | [Params(...)] | 0 | attributes.cs:151:35:151:37 | "a" |
| attributes.cs:151:6:151:11 | [Params(...)] | 1 | attributes.cs:151:26:151:28 | "b" |
| attributes.cs:151:6:151:11 | [Params(...)] | 2 | attributes.cs:151:19:151:19 | 1 |
| attributes.cs:154:6:154:11 | [Params(...)] | 0 | attributes.cs:154:45:154:47 | "a" |
| attributes.cs:154:6:154:11 | [Params(...)] | 1 | attributes.cs:154:36:154:38 | "b" |
| attributes.cs:154:6:154:11 | [Params(...)] | 2 | attributes.cs:154:19:154:29 | array creation of type Int32[] |
| attributes.cs:158:2:158:13 | [Experimental(...)] | 0 | attributes.cs:158:15:158:37 | "MyExperimentalClassId" |
| attributes.cs:161:6:161:17 | [Experimental(...)] | 0 | attributes.cs:161:19:161:42 | "MyExperimentalMethodId" |
| attributes.cs:167:6:167:31 | [OverloadResolutionPriority(...)] | 0 | attributes.cs:167:33:167:34 | -... |
| attributes.cs:170:6:170:31 | [OverloadResolutionPriority(...)] | 0 | attributes.cs:170:33:170:33 | 1 |
| attributes.cs:173:6:173:31 | [OverloadResolutionPriority(...)] | 0 | attributes.cs:173:33:173:33 | 2 |
namedArguments
| Assembly1.dll:0:0:0:0 | [Custom(...)] | Prop2 | Assembly1.dll:0:0:0:0 | array creation of type Object[] |
| Assembly1.dll:0:0:0:0 | [Custom(...)] | Prop2 | Assembly1.dll:0:0:0:0 | array creation of type Object[] |
| Assembly1.dll:0:0:0:0 | [Custom(...)] | Prop2 | Assembly1.dll:0:0:0:0 | array creation of type Object[] |
| Assembly1.dll:0:0:0:0 | [return: Custom(...)] | Prop2 | Assembly1.dll:0:0:0:0 | array creation of type Object[] |
| attributes.cs:41:12:41:15 | [assembly: Args(...)] | Prop | attributes.cs:41:92:41:122 | array creation of type Object[] |
| attributes.cs:42:10:42:13 | [module: Args(...)] | Prop | attributes.cs:42:90:42:120 | array creation of type Object[] |
| attributes.cs:58:6:58:16 | [My(...)] | x | attributes.cs:58:36:58:36 | 0 |
| attributes.cs:58:6:58:16 | [My(...)] | y | attributes.cs:58:28:58:29 | "" |
| attributes.cs:59:6:59:8 | [My2(...)] | X | attributes.cs:59:39:59:40 | 42 |
| attributes.cs:78:2:78:5 | [Args(...)] | Prop | attributes.cs:78:63:78:93 | array creation of type Object[] |
| attributes.cs:81:6:81:9 | [Args(...)] | Prop | attributes.cs:81:68:81:98 | array creation of type Object[] |
| attributes.cs:82:14:82:17 | [return: Args(...)] | Prop | attributes.cs:82:76:82:106 | array creation of type Object[] |
| attributes.cs:42:12:42:15 | [assembly: Args(...)] | Prop | attributes.cs:42:92:42:122 | array creation of type Object[] |
| attributes.cs:43:10:43:13 | [module: Args(...)] | Prop | attributes.cs:43:90:43:120 | array creation of type Object[] |
| attributes.cs:59:6:59:16 | [My(...)] | x | attributes.cs:59:36:59:36 | 0 |
| attributes.cs:59:6:59:16 | [My(...)] | y | attributes.cs:59:28:59:29 | "" |
| attributes.cs:60:6:60:8 | [My2(...)] | X | attributes.cs:60:39:60:40 | 42 |
| attributes.cs:79:2:79:5 | [Args(...)] | Prop | attributes.cs:79:63:79:93 | array creation of type Object[] |
| attributes.cs:82:6:82:9 | [Args(...)] | Prop | attributes.cs:82:68:82:98 | array creation of type Object[] |
| attributes.cs:83:14:83:17 | [return: Args(...)] | Prop | attributes.cs:83:76:83:106 | array creation of type Object[] |

View File

@@ -1,4 +1,4 @@
| attributes.cs:11:12:11:24 | [assembly: AssemblyTitle(...)] | attributes.cs:8:1:10:31 | // ... |
| attributes.cs:23:12:23:21 | [assembly: ComVisible(...)] | attributes.cs:20:1:22:58 | // ... |
| attributes.cs:26:12:26:15 | [assembly: Guid(...)] | attributes.cs:25:1:25:84 | // ... |
| attributes.cs:38:12:38:26 | [assembly: AssemblyVersion(...)] | attributes.cs:28:1:37:39 | // ... |
| attributes.cs:12:12:12:24 | [assembly: AssemblyTitle(...)] | attributes.cs:9:1:11:31 | // ... |
| attributes.cs:24:12:24:21 | [assembly: ComVisible(...)] | attributes.cs:21:1:23:58 | // ... |
| attributes.cs:27:12:27:15 | [assembly: Guid(...)] | attributes.cs:26:1:26:84 | // ... |
| attributes.cs:39:12:39:26 | [assembly: AssemblyVersion(...)] | attributes.cs:29:1:38:39 | // ... |

View File

@@ -9,48 +9,51 @@
| Assembly1.dll:0:0:0:0 | Assembly1, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null | Assembly1.dll:0:0:0:0 | [Debuggable(...)] | System.Diagnostics.DebuggableAttribute |
| Assembly1.dll:0:0:0:0 | Assembly1, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null | Assembly1.dll:0:0:0:0 | [RuntimeCompatibility(...)] | System.Runtime.CompilerServices.RuntimeCompatibilityAttribute |
| Assembly1.dll:0:0:0:0 | Assembly1, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null | Assembly1.dll:0:0:0:0 | [TargetFramework(...)] | System.Runtime.Versioning.TargetFrameworkAttribute |
| attributes.cs:45:7:45:9 | Foo | attributes.cs:44:2:44:22 | [AttributeUsage(...)] | System.AttributeUsageAttribute |
| attributes.cs:48:17:48:19 | foo | attributes.cs:47:6:47:16 | [Conditional(...)] | System.Diagnostics.ConditionalAttribute |
| attributes.cs:53:23:53:23 | x | attributes.cs:53:14:53:16 | [Foo(...)] | Foo |
| attributes.cs:56:10:56:11 | M1 | attributes.cs:55:6:55:16 | [My(...)] | MyAttribute |
| attributes.cs:60:10:60:11 | M2 | attributes.cs:58:6:58:16 | [My(...)] | MyAttribute |
| attributes.cs:60:10:60:11 | M2 | attributes.cs:59:6:59:8 | [My2(...)] | My2Attribute |
| attributes.cs:79:14:79:14 | X | attributes.cs:78:2:78:5 | [Args(...)] | ArgsAttribute |
| attributes.cs:83:9:83:18 | SomeMethod | attributes.cs:81:6:81:9 | [Args(...)] | ArgsAttribute |
| attributes.cs:83:9:83:18 | SomeMethod | attributes.cs:82:14:82:17 | [return: Args(...)] | ArgsAttribute |
| attributes.cs:99:14:99:24 | Invoke | attributes.cs:98:10:98:21 | [return: My3(...)] | My3Attribute |
| attributes.cs:99:14:99:24 | My1Delegate | attributes.cs:97:2:97:13 | [My3(...)] | My3Attribute |
| attributes.cs:103:17:103:27 | Invoke | attributes.cs:101:10:101:21 | [return: My3(...)] | My3Attribute |
| attributes.cs:103:17:103:27 | My2Delegate | attributes.cs:102:8:102:19 | [My3(...)] | My3Attribute |
| attributes.cs:109:32:109:32 | + | attributes.cs:107:6:107:17 | [My3(...)] | My3Attribute |
| attributes.cs:109:32:109:32 | + | attributes.cs:108:14:108:25 | [return: My3(...)] | My3Attribute |
| attributes.cs:112:16:112:19 | Item | attributes.cs:111:6:111:17 | [My3(...)] | My3Attribute |
| attributes.cs:116:9:116:11 | get_Item | attributes.cs:114:10:114:21 | [My3(...)] | My3Attribute |
| attributes.cs:116:9:116:11 | get_Item | attributes.cs:115:18:115:29 | [return: My3(...)] | My3Attribute |
| attributes.cs:120:9:120:11 | set_Item | attributes.cs:118:18:118:29 | [My3(...)] | My3Attribute |
| attributes.cs:120:9:120:11 | value | attributes.cs:119:17:119:28 | [My3(...)] | My3Attribute |
| attributes.cs:125:16:125:20 | Prop1 | attributes.cs:124:6:124:17 | [My3(...)] | My3Attribute |
| attributes.cs:129:9:129:11 | get_Prop1 | attributes.cs:127:18:127:29 | [My3(...)] | My3Attribute |
| attributes.cs:129:9:129:11 | get_Prop1 | attributes.cs:128:18:128:29 | [return: My3(...)] | My3Attribute |
| attributes.cs:133:9:133:11 | set_Prop1 | attributes.cs:131:10:131:21 | [My3(...)] | My3Attribute |
| attributes.cs:133:9:133:11 | value | attributes.cs:132:17:132:28 | [My3(...)] | My3Attribute |
| attributes.cs:145:17:145:18 | M1 | attributes.cs:144:6:144:11 | [Params(...)] | Class1+ParamsAttribute |
| attributes.cs:148:17:148:18 | M2 | attributes.cs:147:6:147:11 | [Params(...)] | Class1+ParamsAttribute |
| attributes.cs:151:17:151:18 | M3 | attributes.cs:150:6:150:11 | [Params(...)] | Class1+ParamsAttribute |
| attributes.cs:154:17:154:18 | M4 | attributes.cs:153:6:153:11 | [Params(...)] | Class1+ParamsAttribute |
| attributes.cs:158:14:158:32 | MyExperimentalClass | attributes.cs:157:2:157:13 | [Experimental(...)] | System.Diagnostics.CodeAnalysis.ExperimentalAttribute |
| attributes.cs:161:17:161:36 | MyExperimentalMethod | attributes.cs:160:6:160:17 | [Experimental(...)] | System.Diagnostics.CodeAnalysis.ExperimentalAttribute |
| attributes.dll:0:0:0:0 | attributes, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null | attributes.cs:11:12:11:24 | [assembly: AssemblyTitle(...)] | System.Reflection.AssemblyTitleAttribute |
| attributes.dll:0:0:0:0 | attributes, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null | attributes.cs:12:12:12:30 | [assembly: AssemblyDescription(...)] | System.Reflection.AssemblyDescriptionAttribute |
| attributes.dll:0:0:0:0 | attributes, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null | attributes.cs:13:12:13:32 | [assembly: AssemblyConfiguration(...)] | System.Reflection.AssemblyConfigurationAttribute |
| attributes.dll:0:0:0:0 | attributes, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null | attributes.cs:14:12:14:26 | [assembly: AssemblyCompany(...)] | System.Reflection.AssemblyCompanyAttribute |
| attributes.dll:0:0:0:0 | attributes, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null | attributes.cs:15:12:15:26 | [assembly: AssemblyProduct(...)] | System.Reflection.AssemblyProductAttribute |
| attributes.dll:0:0:0:0 | attributes, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null | attributes.cs:16:12:16:28 | [assembly: AssemblyCopyright(...)] | System.Reflection.AssemblyCopyrightAttribute |
| attributes.dll:0:0:0:0 | attributes, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null | attributes.cs:17:12:17:28 | [assembly: AssemblyTrademark(...)] | System.Reflection.AssemblyTrademarkAttribute |
| attributes.dll:0:0:0:0 | attributes, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null | attributes.cs:18:12:18:26 | [assembly: AssemblyCulture(...)] | System.Reflection.AssemblyCultureAttribute |
| attributes.dll:0:0:0:0 | attributes, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null | attributes.cs:23:12:23:21 | [assembly: ComVisible(...)] | System.Runtime.InteropServices.ComVisibleAttribute |
| attributes.dll:0:0:0:0 | attributes, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null | attributes.cs:26:12:26:15 | [assembly: Guid(...)] | System.Runtime.InteropServices.GuidAttribute |
| attributes.dll:0:0:0:0 | attributes, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null | attributes.cs:38:12:38:26 | [assembly: AssemblyVersion(...)] | System.Reflection.AssemblyVersionAttribute |
| attributes.dll:0:0:0:0 | attributes, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null | attributes.cs:39:12:39:30 | [assembly: AssemblyFileVersion(...)] | System.Reflection.AssemblyFileVersionAttribute |
| attributes.dll:0:0:0:0 | attributes, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null | attributes.cs:41:12:41:15 | [assembly: Args(...)] | ArgsAttribute |
| attributes.dll:0:0:0:0 | attributes, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null | attributes.cs:42:10:42:13 | [module: Args(...)] | ArgsAttribute |
| attributes.cs:46:7:46:9 | Foo | attributes.cs:45:2:45:22 | [AttributeUsage(...)] | System.AttributeUsageAttribute |
| attributes.cs:49:17:49:19 | foo | attributes.cs:48:6:48:16 | [Conditional(...)] | System.Diagnostics.ConditionalAttribute |
| attributes.cs:54:23:54:23 | x | attributes.cs:54:14:54:16 | [Foo(...)] | Foo |
| attributes.cs:57:10:57:11 | M1 | attributes.cs:56:6:56:16 | [My(...)] | MyAttribute |
| attributes.cs:61:10:61:11 | M2 | attributes.cs:59:6:59:16 | [My(...)] | MyAttribute |
| attributes.cs:61:10:61:11 | M2 | attributes.cs:60:6:60:8 | [My2(...)] | My2Attribute |
| attributes.cs:80:14:80:14 | X | attributes.cs:79:2:79:5 | [Args(...)] | ArgsAttribute |
| attributes.cs:84:9:84:18 | SomeMethod | attributes.cs:82:6:82:9 | [Args(...)] | ArgsAttribute |
| attributes.cs:84:9:84:18 | SomeMethod | attributes.cs:83:14:83:17 | [return: Args(...)] | ArgsAttribute |
| attributes.cs:100:14:100:24 | Invoke | attributes.cs:99:10:99:21 | [return: My3(...)] | My3Attribute |
| attributes.cs:100:14:100:24 | My1Delegate | attributes.cs:98:2:98:13 | [My3(...)] | My3Attribute |
| attributes.cs:104:17:104:27 | Invoke | attributes.cs:102:10:102:21 | [return: My3(...)] | My3Attribute |
| attributes.cs:104:17:104:27 | My2Delegate | attributes.cs:103:8:103:19 | [My3(...)] | My3Attribute |
| attributes.cs:110:32:110:32 | + | attributes.cs:108:6:108:17 | [My3(...)] | My3Attribute |
| attributes.cs:110:32:110:32 | + | attributes.cs:109:14:109:25 | [return: My3(...)] | My3Attribute |
| attributes.cs:113:16:113:19 | Item | attributes.cs:112:6:112:17 | [My3(...)] | My3Attribute |
| attributes.cs:117:9:117:11 | get_Item | attributes.cs:115:10:115:21 | [My3(...)] | My3Attribute |
| attributes.cs:117:9:117:11 | get_Item | attributes.cs:116:18:116:29 | [return: My3(...)] | My3Attribute |
| attributes.cs:121:9:121:11 | set_Item | attributes.cs:119:18:119:29 | [My3(...)] | My3Attribute |
| attributes.cs:121:9:121:11 | value | attributes.cs:120:17:120:28 | [My3(...)] | My3Attribute |
| attributes.cs:126:16:126:20 | Prop1 | attributes.cs:125:6:125:17 | [My3(...)] | My3Attribute |
| attributes.cs:130:9:130:11 | get_Prop1 | attributes.cs:128:18:128:29 | [My3(...)] | My3Attribute |
| attributes.cs:130:9:130:11 | get_Prop1 | attributes.cs:129:18:129:29 | [return: My3(...)] | My3Attribute |
| attributes.cs:134:9:134:11 | set_Prop1 | attributes.cs:132:10:132:21 | [My3(...)] | My3Attribute |
| attributes.cs:134:9:134:11 | value | attributes.cs:133:17:133:28 | [My3(...)] | My3Attribute |
| attributes.cs:146:17:146:18 | M1 | attributes.cs:145:6:145:11 | [Params(...)] | Class1+ParamsAttribute |
| attributes.cs:149:17:149:18 | M2 | attributes.cs:148:6:148:11 | [Params(...)] | Class1+ParamsAttribute |
| attributes.cs:152:17:152:18 | M3 | attributes.cs:151:6:151:11 | [Params(...)] | Class1+ParamsAttribute |
| attributes.cs:155:17:155:18 | M4 | attributes.cs:154:6:154:11 | [Params(...)] | Class1+ParamsAttribute |
| attributes.cs:159:14:159:32 | MyExperimentalClass | attributes.cs:158:2:158:13 | [Experimental(...)] | System.Diagnostics.CodeAnalysis.ExperimentalAttribute |
| attributes.cs:162:17:162:36 | MyExperimentalMethod | attributes.cs:161:6:161:17 | [Experimental(...)] | System.Diagnostics.CodeAnalysis.ExperimentalAttribute |
| attributes.cs:168:17:168:17 | M | attributes.cs:167:6:167:31 | [OverloadResolutionPriority(...)] | System.Runtime.CompilerServices.OverloadResolutionPriorityAttribute |
| attributes.cs:171:17:171:17 | M | attributes.cs:170:6:170:31 | [OverloadResolutionPriority(...)] | System.Runtime.CompilerServices.OverloadResolutionPriorityAttribute |
| attributes.cs:174:17:174:17 | M | attributes.cs:173:6:173:31 | [OverloadResolutionPriority(...)] | System.Runtime.CompilerServices.OverloadResolutionPriorityAttribute |
| attributes.dll:0:0:0:0 | attributes, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null | attributes.cs:12:12:12:24 | [assembly: AssemblyTitle(...)] | System.Reflection.AssemblyTitleAttribute |
| attributes.dll:0:0:0:0 | attributes, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null | attributes.cs:13:12:13:30 | [assembly: AssemblyDescription(...)] | System.Reflection.AssemblyDescriptionAttribute |
| attributes.dll:0:0:0:0 | attributes, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null | attributes.cs:14:12:14:32 | [assembly: AssemblyConfiguration(...)] | System.Reflection.AssemblyConfigurationAttribute |
| attributes.dll:0:0:0:0 | attributes, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null | attributes.cs:15:12:15:26 | [assembly: AssemblyCompany(...)] | System.Reflection.AssemblyCompanyAttribute |
| attributes.dll:0:0:0:0 | attributes, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null | attributes.cs:16:12:16:26 | [assembly: AssemblyProduct(...)] | System.Reflection.AssemblyProductAttribute |
| attributes.dll:0:0:0:0 | attributes, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null | attributes.cs:17:12:17:28 | [assembly: AssemblyCopyright(...)] | System.Reflection.AssemblyCopyrightAttribute |
| attributes.dll:0:0:0:0 | attributes, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null | attributes.cs:18:12:18:28 | [assembly: AssemblyTrademark(...)] | System.Reflection.AssemblyTrademarkAttribute |
| attributes.dll:0:0:0:0 | attributes, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null | attributes.cs:19:12:19:26 | [assembly: AssemblyCulture(...)] | System.Reflection.AssemblyCultureAttribute |
| attributes.dll:0:0:0:0 | attributes, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null | attributes.cs:24:12:24:21 | [assembly: ComVisible(...)] | System.Runtime.InteropServices.ComVisibleAttribute |
| attributes.dll:0:0:0:0 | attributes, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null | attributes.cs:27:12:27:15 | [assembly: Guid(...)] | System.Runtime.InteropServices.GuidAttribute |
| attributes.dll:0:0:0:0 | attributes, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null | attributes.cs:39:12:39:26 | [assembly: AssemblyVersion(...)] | System.Reflection.AssemblyVersionAttribute |
| attributes.dll:0:0:0:0 | attributes, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null | attributes.cs:40:12:40:30 | [assembly: AssemblyFileVersion(...)] | System.Reflection.AssemblyFileVersionAttribute |
| attributes.dll:0:0:0:0 | attributes, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null | attributes.cs:42:12:42:15 | [assembly: Args(...)] | ArgsAttribute |
| attributes.dll:0:0:0:0 | attributes, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null | attributes.cs:43:10:43:13 | [module: Args(...)] | ArgsAttribute |

View File

@@ -1,2 +1,2 @@
| attributes.cs:158:14:158:32 | MyExperimentalClass | attributes.cs:157:2:157:13 | [Experimental(...)] | MyExperimentalClassId |
| attributes.cs:161:17:161:36 | MyExperimentalMethod | attributes.cs:160:6:160:17 | [Experimental(...)] | MyExperimentalMethodId |
| attributes.cs:159:14:159:32 | MyExperimentalClass | attributes.cs:158:2:158:13 | [Experimental(...)] | MyExperimentalClassId |
| attributes.cs:162:17:162:36 | MyExperimentalMethod | attributes.cs:161:6:161:17 | [Experimental(...)] | MyExperimentalMethodId |

View File

@@ -0,0 +1,3 @@
| attributes.cs:168:17:168:17 | M | attributes.cs:167:6:167:31 | [OverloadResolutionPriority(...)] | -1 |
| attributes.cs:171:17:171:17 | M | attributes.cs:170:6:170:31 | [OverloadResolutionPriority(...)] | 1 |
| attributes.cs:174:17:174:17 | M | attributes.cs:173:6:173:31 | [OverloadResolutionPriority(...)] | 2 |

View File

@@ -0,0 +1,7 @@
import csharp
import semmle.code.csharp.frameworks.system.runtime.CompilerServices
from
Attributable element, SystemRuntimeCompilerServicesOverloadResolutionPriorityAttribute attribute
where attribute = element.getAnAttribute() and attribute.fromSource()
select element, attribute, attribute.getPriority()

View File

@@ -1,70 +1,41 @@
attributes.cs:
# 11| [AssemblyAttribute] [assembly: AssemblyTitle(...)]
# 11| -1: [TypeMention] AssemblyTitleAttribute
# 11| 0: [StringLiteralUtf16] "C# attributes test"
# 12| [AssemblyAttribute] [assembly: AssemblyDescription(...)]
# 12| -1: [TypeMention] AssemblyDescriptionAttribute
# 12| 0: [StringLiteralUtf16] "A test of C# attributes"
# 13| [AssemblyAttribute] [assembly: AssemblyConfiguration(...)]
# 13| -1: [TypeMention] AssemblyConfigurationAttribute
# 13| 0: [StringLiteralUtf16] ""
# 14| [AssemblyAttribute] [assembly: AssemblyCompany(...)]
# 14| -1: [TypeMention] AssemblyCompanyAttribute
# 14| 0: [StringLiteralUtf16] "Semmle Plc"
# 15| [AssemblyAttribute] [assembly: AssemblyProduct(...)]
# 15| -1: [TypeMention] AssemblyProductAttribute
# 15| 0: [StringLiteralUtf16] "Odasa"
# 16| [AssemblyAttribute] [assembly: AssemblyCopyright(...)]
# 16| -1: [TypeMention] AssemblyCopyrightAttribute
# 16| 0: [StringLiteralUtf16] "Copyright © Semmle 2018"
# 17| [AssemblyAttribute] [assembly: AssemblyTrademark(...)]
# 17| -1: [TypeMention] AssemblyTrademarkAttribute
# 17| 0: [StringLiteralUtf16] ""
# 18| [AssemblyAttribute] [assembly: AssemblyCulture(...)]
# 18| -1: [TypeMention] AssemblyCultureAttribute
# 12| [AssemblyAttribute] [assembly: AssemblyTitle(...)]
# 12| -1: [TypeMention] AssemblyTitleAttribute
# 12| 0: [StringLiteralUtf16] "C# attributes test"
# 13| [AssemblyAttribute] [assembly: AssemblyDescription(...)]
# 13| -1: [TypeMention] AssemblyDescriptionAttribute
# 13| 0: [StringLiteralUtf16] "A test of C# attributes"
# 14| [AssemblyAttribute] [assembly: AssemblyConfiguration(...)]
# 14| -1: [TypeMention] AssemblyConfigurationAttribute
# 14| 0: [StringLiteralUtf16] ""
# 15| [AssemblyAttribute] [assembly: AssemblyCompany(...)]
# 15| -1: [TypeMention] AssemblyCompanyAttribute
# 15| 0: [StringLiteralUtf16] "Semmle Plc"
# 16| [AssemblyAttribute] [assembly: AssemblyProduct(...)]
# 16| -1: [TypeMention] AssemblyProductAttribute
# 16| 0: [StringLiteralUtf16] "Odasa"
# 17| [AssemblyAttribute] [assembly: AssemblyCopyright(...)]
# 17| -1: [TypeMention] AssemblyCopyrightAttribute
# 17| 0: [StringLiteralUtf16] "Copyright © Semmle 2018"
# 18| [AssemblyAttribute] [assembly: AssemblyTrademark(...)]
# 18| -1: [TypeMention] AssemblyTrademarkAttribute
# 18| 0: [StringLiteralUtf16] ""
# 23| [AssemblyAttribute] [assembly: ComVisible(...)]
# 23| -1: [TypeMention] ComVisibleAttribute
# 23| 0: [BoolLiteral] false
# 26| [AssemblyAttribute] [assembly: Guid(...)]
# 26| -1: [TypeMention] GuidAttribute
# 26| 0: [StringLiteralUtf16] "2f70fdd6-14aa-4850-b053-d547adb1f476"
# 38| [AssemblyAttribute] [assembly: AssemblyVersion(...)]
# 38| -1: [TypeMention] AssemblyVersionAttribute
# 38| 0: [StringLiteralUtf16] "1.0.0.0"
# 39| [AssemblyAttribute] [assembly: AssemblyFileVersion(...)]
# 39| -1: [TypeMention] AssemblyFileVersionAttribute
# 19| [AssemblyAttribute] [assembly: AssemblyCulture(...)]
# 19| -1: [TypeMention] AssemblyCultureAttribute
# 19| 0: [StringLiteralUtf16] ""
# 24| [AssemblyAttribute] [assembly: ComVisible(...)]
# 24| -1: [TypeMention] ComVisibleAttribute
# 24| 0: [BoolLiteral] false
# 27| [AssemblyAttribute] [assembly: Guid(...)]
# 27| -1: [TypeMention] GuidAttribute
# 27| 0: [StringLiteralUtf16] "2f70fdd6-14aa-4850-b053-d547adb1f476"
# 39| [AssemblyAttribute] [assembly: AssemblyVersion(...)]
# 39| -1: [TypeMention] AssemblyVersionAttribute
# 39| 0: [StringLiteralUtf16] "1.0.0.0"
# 41| [AssemblyAttribute] [assembly: Args(...)]
# 41| -1: [TypeMention] ArgsAttribute
# 41| 0: [IntLiteral] 0
# 41| 1: [ArrayCreation] array creation of type Object[]
# 41| -2: [TypeMention] Object[]
# 41| 1: [TypeMention] object
# 41| -1: [ArrayInitializer] { ..., ... }
# 41| 0: [CastExpr] (...) ...
# 41| 1: [IntLiteral] 1
# 41| 1: [CastExpr] (...) ...
# 41| 1: [IntLiteral] 2
# 41| 2: [NullLiteral] null
# 41| 2: [TypeofExpr] typeof(...)
# 41| 0: [TypeAccess] access to type ArgsAttribute
# 41| 0: [TypeMention] ArgsAttribute
# 41| 3: [CastExpr] (...) ...
# 41| 0: [TypeAccess] access to type E
# 41| 0: [TypeMention] E
# 41| 1: [IntLiteral] 12
# 41| 4: [NullLiteral] null
# 41| 5: [ArrayCreation] array creation of type Object[]
# 41| -2: [TypeMention] Object[]
# 41| 1: [TypeMention] object
# 41| -1: [ArrayInitializer] { ..., ... }
# 41| 0: [CastExpr] (...) ...
# 41| 1: [IntLiteral] 1
# 41| 1: [TypeofExpr] typeof(...)
# 41| 0: [TypeAccess] access to type Int32
# 41| 0: [TypeMention] int
# 42| [ModuleAttribute] [module: Args(...)]
# 40| [AssemblyAttribute] [assembly: AssemblyFileVersion(...)]
# 40| -1: [TypeMention] AssemblyFileVersionAttribute
# 40| 0: [StringLiteralUtf16] "1.0.0.0"
# 42| [AssemblyAttribute] [assembly: Args(...)]
# 42| -1: [TypeMention] ArgsAttribute
# 42| 0: [IntLiteral] 0
# 42| 1: [ArrayCreation] array creation of type Object[]
@@ -93,160 +64,162 @@ attributes.cs:
# 42| 1: [TypeofExpr] typeof(...)
# 42| 0: [TypeAccess] access to type Int32
# 42| 0: [TypeMention] int
# 45| [Class] Foo
# 43| [ModuleAttribute] [module: Args(...)]
# 43| -1: [TypeMention] ArgsAttribute
# 43| 0: [IntLiteral] 0
# 43| 1: [ArrayCreation] array creation of type Object[]
# 43| -2: [TypeMention] Object[]
# 43| 1: [TypeMention] object
# 43| -1: [ArrayInitializer] { ..., ... }
# 43| 0: [CastExpr] (...) ...
# 43| 1: [IntLiteral] 1
# 43| 1: [CastExpr] (...) ...
# 43| 1: [IntLiteral] 2
# 43| 2: [NullLiteral] null
# 43| 2: [TypeofExpr] typeof(...)
# 43| 0: [TypeAccess] access to type ArgsAttribute
# 43| 0: [TypeMention] ArgsAttribute
# 43| 3: [CastExpr] (...) ...
# 43| 0: [TypeAccess] access to type E
# 43| 0: [TypeMention] E
# 43| 1: [IntLiteral] 12
# 43| 4: [NullLiteral] null
# 43| 5: [ArrayCreation] array creation of type Object[]
# 43| -2: [TypeMention] Object[]
# 43| 1: [TypeMention] object
# 43| -1: [ArrayInitializer] { ..., ... }
# 43| 0: [CastExpr] (...) ...
# 43| 1: [IntLiteral] 1
# 43| 1: [TypeofExpr] typeof(...)
# 43| 0: [TypeAccess] access to type Int32
# 43| 0: [TypeMention] int
# 46| [Class] Foo
#-----| 0: (Attributes)
# 44| 1: [DefaultAttribute] [AttributeUsage(...)]
# 44| -1: [TypeMention] AttributeUsageAttribute
# 44| 0: [MemberConstantAccess] access to constant All
# 44| -1: [TypeAccess] access to type AttributeTargets
# 44| 0: [TypeMention] AttributeTargets
# 45| 1: [DefaultAttribute] [AttributeUsage(...)]
# 45| -1: [TypeMention] AttributeUsageAttribute
# 45| 0: [MemberConstantAccess] access to constant All
# 45| -1: [TypeAccess] access to type AttributeTargets
# 45| 0: [TypeMention] AttributeTargets
#-----| 3: (Base types)
# 45| 0: [TypeMention] Attribute
# 48| 5: [Method] foo
# 48| -1: [TypeMention] Void
# 46| 0: [TypeMention] Attribute
# 49| 5: [Method] foo
# 49| -1: [TypeMention] Void
#-----| 0: (Attributes)
# 47| 1: [DefaultAttribute] [Conditional(...)]
# 47| -1: [TypeMention] ConditionalAttribute
# 47| 0: [StringLiteralUtf16] "DEBUG2"
# 48| 4: [BlockStmt] {...}
# 51| [Class] Bar
# 53| 5: [Method] inc
# 53| -1: [TypeMention] int
# 48| 1: [DefaultAttribute] [Conditional(...)]
# 48| -1: [TypeMention] ConditionalAttribute
# 48| 0: [StringLiteralUtf16] "DEBUG2"
# 49| 4: [BlockStmt] {...}
# 52| [Class] Bar
# 54| 5: [Method] inc
# 54| -1: [TypeMention] int
#-----| 2: (Parameters)
# 53| 0: [Parameter] x
# 53| -1: [TypeMention] int
# 54| 0: [Parameter] x
# 54| -1: [TypeMention] int
#-----| 0: (Attributes)
# 53| 1: [DefaultAttribute] [Foo(...)]
# 53| 0: [TypeMention] Foo
# 53| 4: [BlockStmt] {...}
# 53| 0: [ReturnStmt] return ...;
# 53| 0: [AddExpr] ... + ...
# 53| 0: [ParameterAccess] access to parameter x
# 53| 1: [IntLiteral] 1
# 56| 6: [Method] M1
# 56| -1: [TypeMention] Void
# 54| 1: [DefaultAttribute] [Foo(...)]
# 54| 0: [TypeMention] Foo
# 54| 4: [BlockStmt] {...}
# 54| 0: [ReturnStmt] return ...;
# 54| 0: [AddExpr] ... + ...
# 54| 0: [ParameterAccess] access to parameter x
# 54| 1: [IntLiteral] 1
# 57| 6: [Method] M1
# 57| -1: [TypeMention] Void
#-----| 0: (Attributes)
# 55| 1: [DefaultAttribute] [My(...)]
# 55| -1: [TypeMention] MyAttribute
# 55| 0: [BoolLiteral] false
# 56| 4: [BlockStmt] {...}
# 60| 7: [Method] M2
# 60| -1: [TypeMention] Void
# 56| 1: [DefaultAttribute] [My(...)]
# 56| -1: [TypeMention] MyAttribute
# 56| 0: [BoolLiteral] false
# 57| 4: [BlockStmt] {...}
# 61| 7: [Method] M2
# 61| -1: [TypeMention] Void
#-----| 0: (Attributes)
# 58| 1: [DefaultAttribute] [My(...)]
# 58| -1: [TypeMention] MyAttribute
# 58| 0: [BoolLiteral] true
# 58| 1: [StringLiteralUtf16] ""
# 58| 2: [IntLiteral] 0
# 59| 2: [DefaultAttribute] [My2(...)]
# 59| -1: [TypeMention] My2Attribute
# 59| 0: [BoolLiteral] false
# 59| 1: [BoolLiteral] true
# 59| 3: [IntLiteral] 1
# 59| 4: [IntLiteral] 42
# 60| 4: [BlockStmt] {...}
# 63| [Class] MyAttribute
# 59| 1: [DefaultAttribute] [My(...)]
# 59| -1: [TypeMention] MyAttribute
# 59| 0: [BoolLiteral] true
# 59| 1: [StringLiteralUtf16] ""
# 59| 2: [IntLiteral] 0
# 60| 2: [DefaultAttribute] [My2(...)]
# 60| -1: [TypeMention] My2Attribute
# 60| 0: [BoolLiteral] false
# 60| 1: [BoolLiteral] true
# 60| 3: [IntLiteral] 1
# 60| 4: [IntLiteral] 42
# 61| 4: [BlockStmt] {...}
# 64| [Class] MyAttribute
#-----| 3: (Base types)
# 63| 0: [TypeMention] Attribute
# 65| 4: [Field] x
# 65| -1: [TypeMention] int
# 66| 5: [Property] y
# 66| -1: [TypeMention] string
# 66| 3: [Getter] get_y
# 66| 4: [Setter] set_y
# 64| 0: [TypeMention] Attribute
# 66| 4: [Field] x
# 66| -1: [TypeMention] int
# 67| 5: [Property] y
# 67| -1: [TypeMention] string
# 67| 3: [Getter] get_y
# 67| 4: [Setter] set_y
#-----| 2: (Parameters)
# 66| 0: [Parameter] value
# 67| 6: [InstanceConstructor] MyAttribute
# 67| 0: [Parameter] value
# 68| 6: [InstanceConstructor] MyAttribute
#-----| 2: (Parameters)
# 67| 0: [Parameter] b
# 67| -1: [TypeMention] bool
# 67| 4: [BlockStmt] {...}
# 70| [Enum] E
# 70| 5: [Field] A
# 70| 1: [IntLiteral] 42
# 72| [Class] ArgsAttribute
# 68| 0: [Parameter] b
# 68| -1: [TypeMention] bool
# 68| 4: [BlockStmt] {...}
# 71| [Enum] E
# 71| 5: [Field] A
# 71| 1: [IntLiteral] 42
# 73| [Class] ArgsAttribute
#-----| 3: (Base types)
# 72| 0: [TypeMention] Attribute
# 74| 4: [Property] Prop
# 74| -1: [TypeMention] Object[]
# 74| 1: [TypeMention] object
# 74| 3: [Getter] get_Prop
# 74| 4: [Setter] set_Prop
# 73| 0: [TypeMention] Attribute
# 75| 4: [Property] Prop
# 75| -1: [TypeMention] Object[]
# 75| 1: [TypeMention] object
# 75| 3: [Getter] get_Prop
# 75| 4: [Setter] set_Prop
#-----| 2: (Parameters)
# 74| 0: [Parameter] value
# 75| 5: [InstanceConstructor] ArgsAttribute
# 75| 0: [Parameter] value
# 76| 5: [InstanceConstructor] ArgsAttribute
#-----| 2: (Parameters)
# 75| 0: [Parameter] i
# 75| -1: [TypeMention] int
# 75| 1: [Parameter] o
# 75| -1: [TypeMention] object
# 75| 2: [Parameter] t
# 75| -1: [TypeMention] Type
# 75| 3: [Parameter] e
# 75| -1: [TypeMention] E
# 75| 4: [Parameter] arr
# 75| -1: [TypeMention] Int32[]
# 75| 1: [TypeMention] int
# 75| 4: [BlockStmt] {...}
# 79| [Class] X
# 76| 0: [Parameter] i
# 76| -1: [TypeMention] int
# 76| 1: [Parameter] o
# 76| -1: [TypeMention] object
# 76| 2: [Parameter] t
# 76| -1: [TypeMention] Type
# 76| 3: [Parameter] e
# 76| -1: [TypeMention] E
# 76| 4: [Parameter] arr
# 76| -1: [TypeMention] Int32[]
# 76| 1: [TypeMention] int
# 76| 4: [BlockStmt] {...}
# 80| [Class] X
#-----| 0: (Attributes)
# 78| 1: [DefaultAttribute] [Args(...)]
# 78| -1: [TypeMention] ArgsAttribute
# 78| 0: [IntLiteral] 42
# 78| 1: [NullLiteral] null
# 78| 2: [TypeofExpr] typeof(...)
# 78| 0: [TypeAccess] access to type X
# 78| 0: [TypeMention] X
# 78| 3: [MemberConstantAccess] access to constant A
# 78| -1: [TypeAccess] access to type E
# 78| 0: [TypeMention] E
# 78| 4: [ArrayCreation] array creation of type Int32[]
# 78| -2: [TypeMention] Int32[]
# 78| 1: [TypeMention] int
# 78| -1: [ArrayInitializer] { ..., ... }
# 78| 0: [IntLiteral] 1
# 78| 1: [IntLiteral] 2
# 78| 2: [IntLiteral] 3
# 78| 5: [ArrayCreation] array creation of type Object[]
# 78| -2: [TypeMention] Object[]
# 78| 1: [TypeMention] object
# 78| -1: [ArrayInitializer] { ..., ... }
# 78| 0: [CastExpr] (...) ...
# 78| 1: [IntLiteral] 1
# 78| 1: [TypeofExpr] typeof(...)
# 78| 0: [TypeAccess] access to type Int32
# 78| 0: [TypeMention] int
# 83| 5: [Method] SomeMethod
# 83| -1: [TypeMention] int
# 79| 1: [DefaultAttribute] [Args(...)]
# 79| -1: [TypeMention] ArgsAttribute
# 79| 0: [IntLiteral] 42
# 79| 1: [NullLiteral] null
# 79| 2: [TypeofExpr] typeof(...)
# 79| 0: [TypeAccess] access to type X
# 79| 0: [TypeMention] X
# 79| 3: [MemberConstantAccess] access to constant A
# 79| -1: [TypeAccess] access to type E
# 79| 0: [TypeMention] E
# 79| 4: [ArrayCreation] array creation of type Int32[]
# 79| -2: [TypeMention] Int32[]
# 79| 1: [TypeMention] int
# 79| -1: [ArrayInitializer] { ..., ... }
# 79| 0: [IntLiteral] 1
# 79| 1: [IntLiteral] 2
# 79| 2: [IntLiteral] 3
# 79| 5: [ArrayCreation] array creation of type Object[]
# 79| -2: [TypeMention] Object[]
# 79| 1: [TypeMention] object
# 79| -1: [ArrayInitializer] { ..., ... }
# 79| 0: [CastExpr] (...) ...
# 79| 1: [IntLiteral] 1
# 79| 1: [TypeofExpr] typeof(...)
# 79| 0: [TypeAccess] access to type Int32
# 79| 0: [TypeMention] int
# 84| 5: [Method] SomeMethod
# 84| -1: [TypeMention] int
#-----| 0: (Attributes)
# 81| 1: [DefaultAttribute] [Args(...)]
# 81| -1: [TypeMention] ArgsAttribute
# 81| 0: [AddExpr] ... + ...
# 81| 0: [IntLiteral] 42
# 81| 1: [IntLiteral] 0
# 81| 1: [ArrayCreation] array creation of type Int32[]
# 81| -2: [TypeMention] Int32[]
# 81| 1: [TypeMention] int
# 81| -1: [ArrayInitializer] { ..., ... }
# 81| 0: [IntLiteral] 1
# 81| 1: [IntLiteral] 2
# 81| 2: [IntLiteral] 3
# 81| 2: [NullLiteral] null
# 81| 3: [CastExpr] (...) ...
# 81| 0: [TypeAccess] access to type E
# 81| 0: [TypeMention] E
# 81| 1: [IntLiteral] 12
# 81| 4: [NullLiteral] null
# 81| 5: [ArrayCreation] array creation of type Object[]
# 81| -2: [TypeMention] Object[]
# 81| 1: [TypeMention] object
# 81| -1: [ArrayInitializer] { ..., ... }
# 81| 0: [CastExpr] (...) ...
# 81| 1: [IntLiteral] 1
# 81| 1: [TypeofExpr] typeof(...)
# 81| 0: [TypeAccess] access to type Int32
# 81| 0: [TypeMention] int
# 82| 2: [ReturnAttribute] [return: Args(...)]
# 82| 1: [DefaultAttribute] [Args(...)]
# 82| -1: [TypeMention] ArgsAttribute
# 82| 0: [AddExpr] ... + ...
# 82| 0: [IntLiteral] 42
@@ -273,209 +246,271 @@ attributes.cs:
# 82| 1: [TypeofExpr] typeof(...)
# 82| 0: [TypeAccess] access to type Int32
# 82| 0: [TypeMention] int
# 83| 4: [BlockStmt] {...}
# 83| 0: [ReturnStmt] return ...;
# 83| 0: [IntLiteral] 1
# 86| [Class] My2Attribute
# 83| 2: [ReturnAttribute] [return: Args(...)]
# 83| -1: [TypeMention] ArgsAttribute
# 83| 0: [AddExpr] ... + ...
# 83| 0: [IntLiteral] 42
# 83| 1: [IntLiteral] 0
# 83| 1: [ArrayCreation] array creation of type Int32[]
# 83| -2: [TypeMention] Int32[]
# 83| 1: [TypeMention] int
# 83| -1: [ArrayInitializer] { ..., ... }
# 83| 0: [IntLiteral] 1
# 83| 1: [IntLiteral] 2
# 83| 2: [IntLiteral] 3
# 83| 2: [NullLiteral] null
# 83| 3: [CastExpr] (...) ...
# 83| 0: [TypeAccess] access to type E
# 83| 0: [TypeMention] E
# 83| 1: [IntLiteral] 12
# 83| 4: [NullLiteral] null
# 83| 5: [ArrayCreation] array creation of type Object[]
# 83| -2: [TypeMention] Object[]
# 83| 1: [TypeMention] object
# 83| -1: [ArrayInitializer] { ..., ... }
# 83| 0: [CastExpr] (...) ...
# 83| 1: [IntLiteral] 1
# 83| 1: [TypeofExpr] typeof(...)
# 83| 0: [TypeAccess] access to type Int32
# 83| 0: [TypeMention] int
# 84| 4: [BlockStmt] {...}
# 84| 0: [ReturnStmt] return ...;
# 84| 0: [IntLiteral] 1
# 87| [Class] My2Attribute
#-----| 3: (Base types)
# 86| 0: [TypeMention] Attribute
# 88| 4: [Property] X
# 88| -1: [TypeMention] int
# 88| 3: [Getter] get_X
# 88| 4: [Setter] set_X
# 87| 0: [TypeMention] Attribute
# 89| 4: [Property] X
# 89| -1: [TypeMention] int
# 89| 3: [Getter] get_X
# 89| 4: [Setter] set_X
#-----| 2: (Parameters)
# 88| 0: [Parameter] value
# 89| 5: [InstanceConstructor] My2Attribute
# 89| 0: [Parameter] value
# 90| 5: [InstanceConstructor] My2Attribute
#-----| 2: (Parameters)
# 89| 0: [Parameter] a
# 89| -1: [TypeMention] bool
# 89| 1: [Parameter] b
# 89| -1: [TypeMention] bool
# 89| 2: [Parameter] i
# 89| -1: [TypeMention] int
# 89| 1: [IntLiteral] 12
# 89| 3: [Parameter] j
# 89| -1: [TypeMention] int
# 89| 1: [IntLiteral] 13
# 89| 4: [BlockStmt] {...}
# 92| [Class] My3Attribute
# 90| 0: [Parameter] a
# 90| -1: [TypeMention] bool
# 90| 1: [Parameter] b
# 90| -1: [TypeMention] bool
# 90| 2: [Parameter] i
# 90| -1: [TypeMention] int
# 90| 1: [IntLiteral] 12
# 90| 3: [Parameter] j
# 90| -1: [TypeMention] int
# 90| 1: [IntLiteral] 13
# 90| 4: [BlockStmt] {...}
# 93| [Class] My3Attribute
#-----| 3: (Base types)
# 92| 0: [TypeMention] Attribute
# 94| 4: [InstanceConstructor] My3Attribute
# 93| 0: [TypeMention] Attribute
# 95| 4: [InstanceConstructor] My3Attribute
#-----| 2: (Parameters)
# 94| 0: [Parameter] x
# 94| -1: [TypeMention] int
# 94| 4: [BlockStmt] {...}
# 99| [DelegateType] My1Delegate
# 95| 0: [Parameter] x
# 95| -1: [TypeMention] int
# 95| 4: [BlockStmt] {...}
# 100| [DelegateType] My1Delegate
#-----| 0: (Attributes)
# 97| 1: [DefaultAttribute] [My3(...)]
# 97| -1: [TypeMention] My3Attribute
# 97| 0: [IntLiteral] 1
# 98| 1: [DefaultAttribute] [My3(...)]
# 98| -1: [TypeMention] My3Attribute
# 98| 0: [IntLiteral] 1
#-----| 2: (Parameters)
# 99| 0: [Parameter] message
# 99| -1: [TypeMention] string
# 103| [DelegateType] My2Delegate
# 100| 0: [Parameter] message
# 100| -1: [TypeMention] string
# 104| [DelegateType] My2Delegate
#-----| 0: (Attributes)
# 102| 1: [DefaultAttribute] [My3(...)]
# 102| -1: [TypeMention] My3Attribute
# 102| 0: [IntLiteral] 4
# 103| 1: [DefaultAttribute] [My3(...)]
# 103| -1: [TypeMention] My3Attribute
# 103| 0: [IntLiteral] 4
#-----| 2: (Parameters)
# 103| 0: [Parameter] message
# 103| -1: [TypeMention] string
# 105| [Class] MyAttributeUsage
# 109| 5: [AddOperator] +
# 109| -1: [TypeMention] int
# 104| 0: [Parameter] message
# 104| -1: [TypeMention] string
# 106| [Class] MyAttributeUsage
# 110| 5: [AddOperator] +
# 110| -1: [TypeMention] int
#-----| 0: (Attributes)
# 107| 1: [DefaultAttribute] [My3(...)]
# 107| -1: [TypeMention] My3Attribute
# 107| 0: [IntLiteral] 5
# 108| 2: [ReturnAttribute] [return: My3(...)]
# 108| 1: [DefaultAttribute] [My3(...)]
# 108| -1: [TypeMention] My3Attribute
# 108| 0: [IntLiteral] 6
# 108| 0: [IntLiteral] 5
# 109| 2: [ReturnAttribute] [return: My3(...)]
# 109| -1: [TypeMention] My3Attribute
# 109| 0: [IntLiteral] 6
#-----| 2: (Parameters)
# 109| 0: [Parameter] a
# 109| -1: [TypeMention] MyAttributeUsage
# 109| 1: [Parameter] b
# 109| -1: [TypeMention] MyAttributeUsage
# 109| 4: [IntLiteral] 0
# 112| 6: [Indexer] Item
# 112| -1: [TypeMention] int
# 110| 0: [Parameter] a
# 110| -1: [TypeMention] MyAttributeUsage
# 110| 1: [Parameter] b
# 110| -1: [TypeMention] MyAttributeUsage
# 110| 4: [IntLiteral] 0
# 113| 6: [Indexer] Item
# 113| -1: [TypeMention] int
#-----| 0: (Attributes)
# 111| 1: [DefaultAttribute] [My3(...)]
# 111| -1: [TypeMention] My3Attribute
# 111| 0: [IntLiteral] 15
# 112| 1: [DefaultAttribute] [My3(...)]
# 112| -1: [TypeMention] My3Attribute
# 112| 0: [IntLiteral] 15
#-----| 1: (Parameters)
# 112| 0: [Parameter] x
# 112| -1: [TypeMention] int
# 116| 3: [Getter] get_Item
# 113| 0: [Parameter] x
# 113| -1: [TypeMention] int
# 117| 3: [Getter] get_Item
#-----| 0: (Attributes)
# 114| 1: [DefaultAttribute] [My3(...)]
# 114| -1: [TypeMention] My3Attribute
# 114| 0: [IntLiteral] 7
# 115| 2: [ReturnAttribute] [return: My3(...)]
# 115| 1: [DefaultAttribute] [My3(...)]
# 115| -1: [TypeMention] My3Attribute
# 115| 0: [IntLiteral] 8
# 115| 0: [IntLiteral] 7
# 116| 2: [ReturnAttribute] [return: My3(...)]
# 116| -1: [TypeMention] My3Attribute
# 116| 0: [IntLiteral] 8
#-----| 2: (Parameters)
# 112| 0: [Parameter] x
# 116| 4: [BlockStmt] {...}
# 116| 0: [ReturnStmt] return ...;
# 116| 0: [AddExpr] ... + ...
# 116| 0: [ParameterAccess] access to parameter x
# 116| 1: [IntLiteral] 1
# 120| 4: [Setter] set_Item
# 113| 0: [Parameter] x
# 117| 4: [BlockStmt] {...}
# 117| 0: [ReturnStmt] return ...;
# 117| 0: [AddExpr] ... + ...
# 117| 0: [ParameterAccess] access to parameter x
# 117| 1: [IntLiteral] 1
# 121| 4: [Setter] set_Item
#-----| 0: (Attributes)
# 118| 1: [DefaultAttribute] [My3(...)]
# 118| -1: [TypeMention] My3Attribute
# 118| 0: [IntLiteral] 9
# 119| 1: [DefaultAttribute] [My3(...)]
# 119| -1: [TypeMention] My3Attribute
# 119| 0: [IntLiteral] 9
#-----| 2: (Parameters)
# 112| 0: [Parameter] x
# 120| 1: [Parameter] value
# 113| 0: [Parameter] x
# 121| 1: [Parameter] value
#-----| 0: (Attributes)
# 119| 1: [DefaultAttribute] [My3(...)]
# 119| -1: [TypeMention] My3Attribute
# 119| 0: [IntLiteral] 10
# 120| 4: [BlockStmt] {...}
# 120| 0: [ReturnStmt] return ...;
# 123| 7: [Field] p
# 123| -1: [TypeMention] int
# 125| 8: [Property] Prop1
# 125| -1: [TypeMention] int
# 120| 1: [DefaultAttribute] [My3(...)]
# 120| -1: [TypeMention] My3Attribute
# 120| 0: [IntLiteral] 10
# 121| 4: [BlockStmt] {...}
# 121| 0: [ReturnStmt] return ...;
# 124| 7: [Field] p
# 124| -1: [TypeMention] int
# 126| 8: [Property] Prop1
# 126| -1: [TypeMention] int
#-----| 0: (Attributes)
# 124| 1: [DefaultAttribute] [My3(...)]
# 124| -1: [TypeMention] My3Attribute
# 124| 0: [IntLiteral] 16
# 129| 3: [Getter] get_Prop1
# 125| 1: [DefaultAttribute] [My3(...)]
# 125| -1: [TypeMention] My3Attribute
# 125| 0: [IntLiteral] 16
# 130| 3: [Getter] get_Prop1
#-----| 0: (Attributes)
# 127| 1: [DefaultAttribute] [My3(...)]
# 127| -1: [TypeMention] My3Attribute
# 127| 0: [IntLiteral] 11
# 128| 2: [ReturnAttribute] [return: My3(...)]
# 128| 1: [DefaultAttribute] [My3(...)]
# 128| -1: [TypeMention] My3Attribute
# 128| 0: [IntLiteral] 12
# 129| 4: [BlockStmt] {...}
# 129| 0: [ReturnStmt] return ...;
# 129| 0: [FieldAccess] access to field p
# 133| 4: [Setter] set_Prop1
# 128| 0: [IntLiteral] 11
# 129| 2: [ReturnAttribute] [return: My3(...)]
# 129| -1: [TypeMention] My3Attribute
# 129| 0: [IntLiteral] 12
# 130| 4: [BlockStmt] {...}
# 130| 0: [ReturnStmt] return ...;
# 130| 0: [FieldAccess] access to field p
# 134| 4: [Setter] set_Prop1
#-----| 0: (Attributes)
# 131| 1: [DefaultAttribute] [My3(...)]
# 131| -1: [TypeMention] My3Attribute
# 131| 0: [IntLiteral] 13
# 132| 1: [DefaultAttribute] [My3(...)]
# 132| -1: [TypeMention] My3Attribute
# 132| 0: [IntLiteral] 13
#-----| 2: (Parameters)
# 133| 0: [Parameter] value
# 134| 0: [Parameter] value
#-----| 0: (Attributes)
# 132| 1: [DefaultAttribute] [My3(...)]
# 132| -1: [TypeMention] My3Attribute
# 132| 0: [IntLiteral] 14
# 133| 4: [BlockStmt] {...}
# 133| 0: [ExprStmt] ...;
# 133| 0: [AssignExpr] ... = ...
# 133| 0: [FieldAccess] access to field p
# 133| 1: [ParameterAccess] access to parameter value
# 137| [Class] Class1
# 139| 5: [Class] ParamsAttribute
# 133| 1: [DefaultAttribute] [My3(...)]
# 133| -1: [TypeMention] My3Attribute
# 133| 0: [IntLiteral] 14
# 134| 4: [BlockStmt] {...}
# 134| 0: [ExprStmt] ...;
# 134| 0: [AssignExpr] ... = ...
# 134| 0: [FieldAccess] access to field p
# 134| 1: [ParameterAccess] access to parameter value
# 138| [Class] Class1
# 140| 5: [Class] ParamsAttribute
#-----| 3: (Base types)
# 139| 0: [TypeMention] Attribute
# 141| 4: [InstanceConstructor] ParamsAttribute
# 140| 0: [TypeMention] Attribute
# 142| 4: [InstanceConstructor] ParamsAttribute
#-----| 2: (Parameters)
# 141| 0: [Parameter] s1
# 141| -1: [TypeMention] string
# 141| 1: [Parameter] s2
# 141| -1: [TypeMention] string
# 141| 2: [Parameter] args
# 141| -1: [TypeMention] Int32[]
# 141| 1: [TypeMention] int
# 141| 4: [BlockStmt] {...}
# 145| 6: [Method] M1
# 145| -1: [TypeMention] Void
# 142| 0: [Parameter] s1
# 142| -1: [TypeMention] string
# 142| 1: [Parameter] s2
# 142| -1: [TypeMention] string
# 142| 2: [Parameter] args
# 142| -1: [TypeMention] Int32[]
# 142| 1: [TypeMention] int
# 142| 4: [BlockStmt] {...}
# 146| 6: [Method] M1
# 146| -1: [TypeMention] Void
#-----| 0: (Attributes)
# 144| 1: [DefaultAttribute] [Params(...)]
# 144| -1: [TypeMention] ParamsAttribute
# 144| 0: [StringLiteralUtf16] "a"
# 144| 1: [StringLiteralUtf16] "b"
# 144| 2: [IntLiteral] 1
# 144| 3: [IntLiteral] 2
# 144| 4: [IntLiteral] 3
# 145| 4: [BlockStmt] {...}
# 148| 7: [Method] M2
# 148| -1: [TypeMention] Void
# 145| 1: [DefaultAttribute] [Params(...)]
# 145| -1: [TypeMention] ParamsAttribute
# 145| 0: [StringLiteralUtf16] "a"
# 145| 1: [StringLiteralUtf16] "b"
# 145| 2: [IntLiteral] 1
# 145| 3: [IntLiteral] 2
# 145| 4: [IntLiteral] 3
# 146| 4: [BlockStmt] {...}
# 149| 7: [Method] M2
# 149| -1: [TypeMention] Void
#-----| 0: (Attributes)
# 147| 1: [DefaultAttribute] [Params(...)]
# 147| -1: [TypeMention] ParamsAttribute
# 147| 0: [StringLiteralUtf16] "a"
# 147| 1: [StringLiteralUtf16] "b"
# 147| 2: [IntLiteral] 1
# 147| 3: [IntLiteral] 2
# 147| 4: [IntLiteral] 3
# 148| 4: [BlockStmt] {...}
# 151| 8: [Method] M3
# 151| -1: [TypeMention] Void
# 148| 1: [DefaultAttribute] [Params(...)]
# 148| -1: [TypeMention] ParamsAttribute
# 148| 0: [StringLiteralUtf16] "a"
# 148| 1: [StringLiteralUtf16] "b"
# 148| 2: [IntLiteral] 1
# 148| 3: [IntLiteral] 2
# 148| 4: [IntLiteral] 3
# 149| 4: [BlockStmt] {...}
# 152| 8: [Method] M3
# 152| -1: [TypeMention] Void
#-----| 0: (Attributes)
# 150| 1: [DefaultAttribute] [Params(...)]
# 150| -1: [TypeMention] ParamsAttribute
# 150| 0: [StringLiteralUtf16] "a"
# 150| 1: [StringLiteralUtf16] "b"
# 150| 2: [IntLiteral] 1
# 151| 4: [BlockStmt] {...}
# 154| 9: [Method] M4
# 154| -1: [TypeMention] Void
# 151| 1: [DefaultAttribute] [Params(...)]
# 151| -1: [TypeMention] ParamsAttribute
# 151| 0: [StringLiteralUtf16] "a"
# 151| 1: [StringLiteralUtf16] "b"
# 151| 2: [IntLiteral] 1
# 152| 4: [BlockStmt] {...}
# 155| 9: [Method] M4
# 155| -1: [TypeMention] Void
#-----| 0: (Attributes)
# 153| 1: [DefaultAttribute] [Params(...)]
# 153| -1: [TypeMention] ParamsAttribute
# 153| 0: [StringLiteralUtf16] "a"
# 153| 1: [StringLiteralUtf16] "b"
# 153| 2: [ArrayCreation] array creation of type Int32[]
# 153| -1: [ArrayInitializer] { ..., ... }
# 153| 0: [IntLiteral] 1
# 154| 4: [BlockStmt] {...}
# 158| [Class] MyExperimentalClass
# 154| 1: [DefaultAttribute] [Params(...)]
# 154| -1: [TypeMention] ParamsAttribute
# 154| 0: [StringLiteralUtf16] "a"
# 154| 1: [StringLiteralUtf16] "b"
# 154| 2: [ArrayCreation] array creation of type Int32[]
# 154| -1: [ArrayInitializer] { ..., ... }
# 154| 0: [IntLiteral] 1
# 155| 4: [BlockStmt] {...}
# 159| [Class] MyExperimentalClass
#-----| 0: (Attributes)
# 157| 1: [DefaultAttribute] [Experimental(...)]
# 157| -1: [TypeMention] ExperimentalAttribute
# 157| 0: [StringLiteralUtf16] "MyExperimentalClassId"
# 161| 5: [Method] MyExperimentalMethod
# 161| -1: [TypeMention] Void
# 158| 1: [DefaultAttribute] [Experimental(...)]
# 158| -1: [TypeMention] ExperimentalAttribute
# 158| 0: [StringLiteralUtf16] "MyExperimentalClassId"
# 162| 5: [Method] MyExperimentalMethod
# 162| -1: [TypeMention] Void
#-----| 0: (Attributes)
# 160| 1: [DefaultAttribute] [Experimental(...)]
# 160| -1: [TypeMention] ExperimentalAttribute
# 160| 0: [StringLiteralUtf16] "MyExperimentalMethodId"
# 161| 4: [BlockStmt] {...}
# 161| 1: [DefaultAttribute] [Experimental(...)]
# 161| -1: [TypeMention] ExperimentalAttribute
# 161| 0: [StringLiteralUtf16] "MyExperimentalMethodId"
# 162| 4: [BlockStmt] {...}
# 165| [Class] MyOverloadResolutionClass
# 168| 5: [Method] M
# 168| -1: [TypeMention] Void
#-----| 0: (Attributes)
# 167| 1: [DefaultAttribute] [OverloadResolutionPriority(...)]
# 167| -1: [TypeMention] OverloadResolutionPriorityAttribute
# 167| 0: [UnaryMinusExpr] -...
# 167| 0: [IntLiteral] 1
#-----| 2: (Parameters)
# 168| 0: [Parameter] arr
# 168| -1: [TypeMention] Int32[]
# 168| 1: [TypeMention] int
# 168| 4: [BlockStmt] {...}
# 171| 6: [Method] M
# 171| -1: [TypeMention] Void
#-----| 0: (Attributes)
# 170| 1: [DefaultAttribute] [OverloadResolutionPriority(...)]
# 170| -1: [TypeMention] OverloadResolutionPriorityAttribute
# 170| 0: [IntLiteral] 1
#-----| 2: (Parameters)
# 171| 0: [Parameter] e
# 171| -1: [TypeMention] IEnumerable<int>
# 171| 1: [TypeMention] int
# 171| 4: [BlockStmt] {...}
# 174| 7: [Method] M
# 174| -1: [TypeMention] Void
#-----| 0: (Attributes)
# 173| 1: [DefaultAttribute] [OverloadResolutionPriority(...)]
# 173| -1: [TypeMention] OverloadResolutionPriorityAttribute
# 173| 0: [IntLiteral] 2
#-----| 2: (Parameters)
# 174| 0: [Parameter] s
# 174| -1: [TypeMention] ReadOnlySpan<int>
# 174| 1: [TypeMention] int
# 174| 4: [BlockStmt] {...}

View File

@@ -1,4 +1,5 @@
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Diagnostics.CodeAnalysis;
using System.Reflection;
@@ -160,3 +161,15 @@ public class MyExperimentalClass
[Experimental("MyExperimentalMethodId")]
public void MyExperimentalMethod() { }
}
public class MyOverloadResolutionClass
{
[OverloadResolutionPriority(-1)]
public void M(int[] arr) { }
[OverloadResolutionPriority(1)]
public void M(IEnumerable<int> e) { }
[OverloadResolutionPriority(2)]
public void M(ReadOnlySpan<int> s) { }
}

View File

@@ -3,27 +3,29 @@ getADynamicTargetInCallContext
| TypeFlow.cs:33:9:33:18 | call to method Method | TypeFlow.cs:17:30:17:35 | Method | TypeFlow.cs:7:7:7:23 | call to method Run |
mayBenefitFromCallContext
| TypeFlow.cs:33:9:33:18 | call to method Method |
| ViableCallable.cs:12:9:12:28 | call to method M<Int32> |
| ViableCallable.cs:14:9:14:15 | access to property Prop |
| ViableCallable.cs:14:19:14:25 | access to property Prop |
| ViableCallable.cs:16:9:16:23 | access to indexer |
| ViableCallable.cs:16:27:16:41 | access to indexer |
| ViableCallable.cs:18:9:18:16 | access to event Event |
| ViableCallable.cs:13:9:13:28 | call to method M<Int32> |
| ViableCallable.cs:15:9:15:15 | access to property Prop |
| ViableCallable.cs:15:19:15:25 | access to property Prop |
| ViableCallable.cs:17:9:17:23 | access to indexer |
| ViableCallable.cs:17:27:17:41 | access to indexer |
| ViableCallable.cs:19:9:19:16 | access to event Event |
| ViableCallable.cs:22:9:22:30 | call to method M<Boolean> |
| ViableCallable.cs:24:9:24:15 | access to property Prop |
| ViableCallable.cs:24:19:24:25 | access to property Prop |
| ViableCallable.cs:26:9:26:23 | access to indexer |
| ViableCallable.cs:26:27:26:41 | access to indexer |
| ViableCallable.cs:28:9:28:16 | access to event Event |
| ViableCallable.cs:20:9:20:16 | access to event Event |
| ViableCallable.cs:23:9:23:30 | call to method M<Boolean> |
| ViableCallable.cs:25:9:25:15 | access to property Prop |
| ViableCallable.cs:25:19:25:25 | access to property Prop |
| ViableCallable.cs:27:9:27:23 | access to indexer |
| ViableCallable.cs:27:27:27:41 | access to indexer |
| ViableCallable.cs:29:9:29:16 | access to event Event |
| ViableCallable.cs:244:9:244:15 | call to method M<Int32> |
| ViableCallable.cs:293:9:293:15 | call to method M<Int32> |
| ViableCallable.cs:296:9:296:20 | call to method M<Int32> |
| ViableCallable.cs:424:9:424:18 | call to method M<Int32> |
| ViableCallable.cs:468:9:468:30 | call to method M2<T> |
| ViableCallable.cs:474:9:474:30 | call to method M2<T> |
| ViableCallable.cs:576:18:576:22 | call to operator / |
| ViableCallable.cs:579:26:579:30 | call to operator checked / |
| ViableCallable.cs:585:9:585:15 | call to method M12 |
| ViableCallable.cs:618:9:618:13 | call to method M |
| ViableCallable.cs:30:9:30:16 | access to event Event |
| ViableCallable.cs:245:9:245:15 | call to method M<Int32> |
| ViableCallable.cs:294:9:294:15 | call to method M<Int32> |
| ViableCallable.cs:297:9:297:20 | call to method M<Int32> |
| ViableCallable.cs:425:9:425:18 | call to method M<Int32> |
| ViableCallable.cs:469:9:469:30 | call to method M2<T> |
| ViableCallable.cs:475:9:475:30 | call to method M2<T> |
| ViableCallable.cs:577:18:577:22 | call to operator / |
| ViableCallable.cs:580:26:580:30 | call to operator checked / |
| ViableCallable.cs:586:9:586:15 | call to method M12 |
| ViableCallable.cs:619:9:619:13 | call to method M |
| ViableCallable.cs:683:9:683:16 | call to method M |
| ViableCallable.cs:687:9:687:16 | call to method M |

View File

@@ -28,237 +28,245 @@
| TypeFlow.cs:24:10:24:12 | Run | TypeFlow.cs:12:29:12:34 | Method |
| TypeFlow.cs:24:10:24:12 | Run | TypeFlow.cs:17:30:17:35 | Method |
| TypeFlow.cs:24:10:24:12 | Run | TypeFlow.cs:22:15:22:17 | get_Prop |
| ViableCallable.cs:9:17:9:31 | Run`3 | ExactCallable.cs:128:25:128:26 | M3 |
| ViableCallable.cs:9:17:9:31 | Run`3 | ExactCallable.cs:147:29:147:30 | M3 |
| ViableCallable.cs:9:17:9:31 | Run`3 | ViableCallable.cs:212:21:212:27 | Mock<C1<Int32[],Boolean>> |
| ViableCallable.cs:9:17:9:31 | Run`3 | ViableCallable.cs:212:21:212:27 | Mock<C1<String,Boolean>> |
| ViableCallable.cs:9:17:9:31 | Run`3 | ViableCallable.cs:212:21:212:27 | Mock<C1<String,Decimal>> |
| ViableCallable.cs:9:17:9:31 | Run`3 | ViableCallable.cs:212:21:212:27 | Mock<C1<String,Int32>> |
| ViableCallable.cs:9:17:9:31 | Run`3 | ViableCallable.cs:212:21:212:27 | Mock<C8> |
| ViableCallable.cs:9:17:9:31 | Run`3 | ViableCallable.cs:212:21:212:27 | Mock<IEnumerable<C4<Int32>>> |
| ViableCallable.cs:9:17:9:31 | Run`3 | ViableCallable.cs:212:21:212:27 | Mock<IEnumerable<C4<String>>> |
| ViableCallable.cs:9:17:9:31 | Run`3 | ViableCallable.cs:212:21:212:27 | Mock<IList<String>> |
| ViableCallable.cs:9:17:9:31 | Run`3 | ViableCallable.cs:250:23:250:27 | M`1 |
| ViableCallable.cs:9:17:9:31 | Run`3 | ViableCallable.cs:250:23:250:27 | M`1 |
| ViableCallable.cs:9:17:9:31 | Run`3 | ViableCallable.cs:250:23:250:27 | M`1 |
| ViableCallable.cs:9:17:9:31 | Run`3 | ViableCallable.cs:250:23:250:27 | M`1 |
| ViableCallable.cs:9:17:9:31 | Run`3 | ViableCallable.cs:251:35:251:37 | get_Prop |
| ViableCallable.cs:9:17:9:31 | Run`3 | ViableCallable.cs:251:35:251:37 | get_Prop |
| ViableCallable.cs:9:17:9:31 | Run`3 | ViableCallable.cs:251:35:251:37 | get_Prop |
| ViableCallable.cs:9:17:9:31 | Run`3 | ViableCallable.cs:251:35:251:37 | get_Prop |
| ViableCallable.cs:9:17:9:31 | Run`3 | ViableCallable.cs:251:40:251:42 | set_Prop |
| ViableCallable.cs:9:17:9:31 | Run`3 | ViableCallable.cs:251:40:251:42 | set_Prop |
| ViableCallable.cs:9:17:9:31 | Run`3 | ViableCallable.cs:251:40:251:42 | set_Prop |
| ViableCallable.cs:9:17:9:31 | Run`3 | ViableCallable.cs:251:40:251:42 | set_Prop |
| ViableCallable.cs:9:17:9:31 | Run`3 | ViableCallable.cs:252:40:252:42 | get_Item |
| ViableCallable.cs:9:17:9:31 | Run`3 | ViableCallable.cs:252:40:252:42 | get_Item |
| ViableCallable.cs:9:17:9:31 | Run`3 | ViableCallable.cs:252:40:252:42 | get_Item |
| ViableCallable.cs:9:17:9:31 | Run`3 | ViableCallable.cs:252:40:252:42 | get_Item |
| ViableCallable.cs:9:17:9:31 | Run`3 | ViableCallable.cs:252:71:252:73 | set_Item |
| ViableCallable.cs:9:17:9:31 | Run`3 | ViableCallable.cs:252:71:252:73 | set_Item |
| ViableCallable.cs:9:17:9:31 | Run`3 | ViableCallable.cs:252:71:252:73 | set_Item |
| ViableCallable.cs:9:17:9:31 | Run`3 | ViableCallable.cs:252:71:252:73 | set_Item |
| ViableCallable.cs:9:17:9:31 | Run`3 | ViableCallable.cs:253:56:253:58 | add_Event |
| ViableCallable.cs:9:17:9:31 | Run`3 | ViableCallable.cs:253:56:253:58 | add_Event |
| ViableCallable.cs:9:17:9:31 | Run`3 | ViableCallable.cs:253:56:253:58 | add_Event |
| ViableCallable.cs:9:17:9:31 | Run`3 | ViableCallable.cs:253:56:253:58 | add_Event |
| ViableCallable.cs:9:17:9:31 | Run`3 | ViableCallable.cs:253:64:253:69 | remove_Event |
| ViableCallable.cs:9:17:9:31 | Run`3 | ViableCallable.cs:253:64:253:69 | remove_Event |
| ViableCallable.cs:9:17:9:31 | Run`3 | ViableCallable.cs:253:64:253:69 | remove_Event |
| ViableCallable.cs:9:17:9:31 | Run`3 | ViableCallable.cs:253:64:253:69 | remove_Event |
| ViableCallable.cs:9:17:9:31 | Run`3 | ViableCallable.cs:258:29:258:33 | M`1 |
| ViableCallable.cs:9:17:9:31 | Run`3 | ViableCallable.cs:259:35:259:37 | get_Prop |
| ViableCallable.cs:9:17:9:31 | Run`3 | ViableCallable.cs:259:40:259:42 | set_Prop |
| ViableCallable.cs:9:17:9:31 | Run`3 | ViableCallable.cs:260:46:260:48 | get_Item |
| ViableCallable.cs:9:17:9:31 | Run`3 | ViableCallable.cs:260:77:260:79 | set_Item |
| ViableCallable.cs:9:17:9:31 | Run`3 | ViableCallable.cs:261:56:261:58 | add_Event |
| ViableCallable.cs:9:17:9:31 | Run`3 | ViableCallable.cs:261:64:261:69 | remove_Event |
| ViableCallable.cs:9:17:9:31 | Run`3 | ViableCallable.cs:266:26:266:30 | M`1 |
| ViableCallable.cs:9:17:9:31 | Run`3 | ViableCallable.cs:266:26:266:30 | M`1 |
| ViableCallable.cs:9:17:9:31 | Run`3 | ViableCallable.cs:267:32:267:34 | get_Prop |
| ViableCallable.cs:9:17:9:31 | Run`3 | ViableCallable.cs:267:32:267:34 | get_Prop |
| ViableCallable.cs:9:17:9:31 | Run`3 | ViableCallable.cs:267:37:267:39 | set_Prop |
| ViableCallable.cs:9:17:9:31 | Run`3 | ViableCallable.cs:267:37:267:39 | set_Prop |
| ViableCallable.cs:9:17:9:31 | Run`3 | ViableCallable.cs:268:40:268:42 | get_Item |
| ViableCallable.cs:9:17:9:31 | Run`3 | ViableCallable.cs:268:40:268:42 | get_Item |
| ViableCallable.cs:9:17:9:31 | Run`3 | ViableCallable.cs:268:71:268:73 | set_Item |
| ViableCallable.cs:9:17:9:31 | Run`3 | ViableCallable.cs:268:71:268:73 | set_Item |
| ViableCallable.cs:9:17:9:31 | Run`3 | ViableCallable.cs:269:53:269:55 | add_Event |
| ViableCallable.cs:9:17:9:31 | Run`3 | ViableCallable.cs:269:53:269:55 | add_Event |
| ViableCallable.cs:9:17:9:31 | Run`3 | ViableCallable.cs:269:61:269:66 | remove_Event |
| ViableCallable.cs:9:17:9:31 | Run`3 | ViableCallable.cs:269:61:269:66 | remove_Event |
| ViableCallable.cs:9:17:9:31 | Run`3 | ViableCallable.cs:274:26:274:30 | M`1 |
| ViableCallable.cs:9:17:9:31 | Run`3 | ViableCallable.cs:275:24:275:24 | M |
| ViableCallable.cs:9:17:9:31 | Run`3 | ViableCallable.cs:276:35:276:37 | get_Prop |
| ViableCallable.cs:9:17:9:31 | Run`3 | ViableCallable.cs:276:40:276:42 | set_Prop |
| ViableCallable.cs:9:17:9:31 | Run`3 | ViableCallable.cs:277:39:277:41 | set_Prop2 |
| ViableCallable.cs:9:17:9:31 | Run`3 | ViableCallable.cs:278:43:278:45 | get_Item |
| ViableCallable.cs:9:17:9:31 | Run`3 | ViableCallable.cs:278:74:278:76 | set_Item |
| ViableCallable.cs:9:17:9:31 | Run`3 | ViableCallable.cs:279:56:279:58 | add_Event |
| ViableCallable.cs:9:17:9:31 | Run`3 | ViableCallable.cs:279:64:279:69 | remove_Event |
| ViableCallable.cs:9:17:9:31 | Run`3 | ViableCallable.cs:280:55:280:57 | add_Event2 |
| ViableCallable.cs:9:17:9:31 | Run`3 | ViableCallable.cs:280:63:280:68 | remove_Event2 |
| ViableCallable.cs:9:17:9:31 | Run`3 | ViableCallable.cs:285:24:285:28 | M`1 |
| ViableCallable.cs:9:17:9:31 | Run`3 | ViableCallable.cs:285:24:285:28 | M`1 |
| ViableCallable.cs:9:17:9:31 | Run`3 | ViableCallable.cs:285:24:285:28 | M`1 |
| ViableCallable.cs:9:17:9:31 | Run`3 | ViableCallable.cs:285:24:285:28 | M`1 |
| ViableCallable.cs:9:17:9:31 | Run`3 | ViableCallable.cs:285:24:285:28 | M`1 |
| ViableCallable.cs:9:17:9:31 | Run`3 | ViableCallable.cs:285:24:285:28 | M`1 |
| ViableCallable.cs:9:17:9:31 | Run`3 | ViableCallable.cs:285:24:285:28 | M`1 |
| ViableCallable.cs:9:17:9:31 | Run`3 | ViableCallable.cs:285:24:285:28 | M`1 |
| ViableCallable.cs:9:17:9:31 | Run`3 | ViableCallable.cs:285:24:285:28 | M`1 |
| ViableCallable.cs:9:17:9:31 | Run`3 | ViableCallable.cs:286:31:286:33 | get_Prop |
| ViableCallable.cs:9:17:9:31 | Run`3 | ViableCallable.cs:286:31:286:33 | get_Prop |
| ViableCallable.cs:9:17:9:31 | Run`3 | ViableCallable.cs:286:31:286:33 | get_Prop |
| ViableCallable.cs:9:17:9:31 | Run`3 | ViableCallable.cs:286:31:286:33 | get_Prop |
| ViableCallable.cs:9:17:9:31 | Run`3 | ViableCallable.cs:286:31:286:33 | get_Prop |
| ViableCallable.cs:9:17:9:31 | Run`3 | ViableCallable.cs:286:31:286:33 | get_Prop |
| ViableCallable.cs:9:17:9:31 | Run`3 | ViableCallable.cs:286:31:286:33 | get_Prop |
| ViableCallable.cs:9:17:9:31 | Run`3 | ViableCallable.cs:286:31:286:33 | get_Prop |
| ViableCallable.cs:9:17:9:31 | Run`3 | ViableCallable.cs:286:31:286:33 | get_Prop |
| ViableCallable.cs:9:17:9:31 | Run`3 | ViableCallable.cs:286:36:286:38 | set_Prop |
| ViableCallable.cs:9:17:9:31 | Run`3 | ViableCallable.cs:286:36:286:38 | set_Prop |
| ViableCallable.cs:9:17:9:31 | Run`3 | ViableCallable.cs:286:36:286:38 | set_Prop |
| ViableCallable.cs:9:17:9:31 | Run`3 | ViableCallable.cs:286:36:286:38 | set_Prop |
| ViableCallable.cs:9:17:9:31 | Run`3 | ViableCallable.cs:286:36:286:38 | set_Prop |
| ViableCallable.cs:9:17:9:31 | Run`3 | ViableCallable.cs:286:36:286:38 | set_Prop |
| ViableCallable.cs:9:17:9:31 | Run`3 | ViableCallable.cs:286:36:286:38 | set_Prop |
| ViableCallable.cs:9:17:9:31 | Run`3 | ViableCallable.cs:286:36:286:38 | set_Prop |
| ViableCallable.cs:9:17:9:31 | Run`3 | ViableCallable.cs:286:36:286:38 | set_Prop |
| ViableCallable.cs:9:17:9:31 | Run`3 | ViableCallable.cs:287:37:287:39 | get_Item |
| ViableCallable.cs:9:17:9:31 | Run`3 | ViableCallable.cs:287:37:287:39 | get_Item |
| ViableCallable.cs:9:17:9:31 | Run`3 | ViableCallable.cs:287:37:287:39 | get_Item |
| ViableCallable.cs:9:17:9:31 | Run`3 | ViableCallable.cs:287:37:287:39 | get_Item |
| ViableCallable.cs:9:17:9:31 | Run`3 | ViableCallable.cs:287:37:287:39 | get_Item |
| ViableCallable.cs:9:17:9:31 | Run`3 | ViableCallable.cs:287:37:287:39 | get_Item |
| ViableCallable.cs:9:17:9:31 | Run`3 | ViableCallable.cs:287:37:287:39 | get_Item |
| ViableCallable.cs:9:17:9:31 | Run`3 | ViableCallable.cs:287:37:287:39 | get_Item |
| ViableCallable.cs:9:17:9:31 | Run`3 | ViableCallable.cs:287:37:287:39 | get_Item |
| ViableCallable.cs:9:17:9:31 | Run`3 | ViableCallable.cs:287:68:287:70 | set_Item |
| ViableCallable.cs:9:17:9:31 | Run`3 | ViableCallable.cs:287:68:287:70 | set_Item |
| ViableCallable.cs:9:17:9:31 | Run`3 | ViableCallable.cs:287:68:287:70 | set_Item |
| ViableCallable.cs:9:17:9:31 | Run`3 | ViableCallable.cs:287:68:287:70 | set_Item |
| ViableCallable.cs:9:17:9:31 | Run`3 | ViableCallable.cs:287:68:287:70 | set_Item |
| ViableCallable.cs:9:17:9:31 | Run`3 | ViableCallable.cs:287:68:287:70 | set_Item |
| ViableCallable.cs:9:17:9:31 | Run`3 | ViableCallable.cs:287:68:287:70 | set_Item |
| ViableCallable.cs:9:17:9:31 | Run`3 | ViableCallable.cs:287:68:287:70 | set_Item |
| ViableCallable.cs:9:17:9:31 | Run`3 | ViableCallable.cs:287:68:287:70 | set_Item |
| ViableCallable.cs:9:17:9:31 | Run`3 | ViableCallable.cs:288:52:288:54 | add_Event |
| ViableCallable.cs:9:17:9:31 | Run`3 | ViableCallable.cs:288:52:288:54 | add_Event |
| ViableCallable.cs:9:17:9:31 | Run`3 | ViableCallable.cs:288:52:288:54 | add_Event |
| ViableCallable.cs:9:17:9:31 | Run`3 | ViableCallable.cs:288:52:288:54 | add_Event |
| ViableCallable.cs:9:17:9:31 | Run`3 | ViableCallable.cs:288:52:288:54 | add_Event |
| ViableCallable.cs:9:17:9:31 | Run`3 | ViableCallable.cs:288:52:288:54 | add_Event |
| ViableCallable.cs:9:17:9:31 | Run`3 | ViableCallable.cs:288:52:288:54 | add_Event |
| ViableCallable.cs:9:17:9:31 | Run`3 | ViableCallable.cs:288:52:288:54 | add_Event |
| ViableCallable.cs:9:17:9:31 | Run`3 | ViableCallable.cs:288:52:288:54 | add_Event |
| ViableCallable.cs:9:17:9:31 | Run`3 | ViableCallable.cs:288:60:288:65 | remove_Event |
| ViableCallable.cs:9:17:9:31 | Run`3 | ViableCallable.cs:288:60:288:65 | remove_Event |
| ViableCallable.cs:9:17:9:31 | Run`3 | ViableCallable.cs:288:60:288:65 | remove_Event |
| ViableCallable.cs:9:17:9:31 | Run`3 | ViableCallable.cs:288:60:288:65 | remove_Event |
| ViableCallable.cs:9:17:9:31 | Run`3 | ViableCallable.cs:288:60:288:65 | remove_Event |
| ViableCallable.cs:9:17:9:31 | Run`3 | ViableCallable.cs:288:60:288:65 | remove_Event |
| ViableCallable.cs:9:17:9:31 | Run`3 | ViableCallable.cs:288:60:288:65 | remove_Event |
| ViableCallable.cs:9:17:9:31 | Run`3 | ViableCallable.cs:288:60:288:65 | remove_Event |
| ViableCallable.cs:9:17:9:31 | Run`3 | ViableCallable.cs:288:60:288:65 | remove_Event |
| ViableCallable.cs:9:17:9:31 | Run`3 | ViableCallable.cs:302:26:302:30 | M`1 |
| ViableCallable.cs:9:17:9:31 | Run`3 | ViableCallable.cs:302:26:302:30 | M`1 |
| ViableCallable.cs:9:17:9:31 | Run`3 | ViableCallable.cs:303:31:303:33 | get_Prop |
| ViableCallable.cs:9:17:9:31 | Run`3 | ViableCallable.cs:303:31:303:33 | get_Prop |
| ViableCallable.cs:9:17:9:31 | Run`3 | ViableCallable.cs:303:36:303:38 | set_Prop |
| ViableCallable.cs:9:17:9:31 | Run`3 | ViableCallable.cs:303:36:303:38 | set_Prop |
| ViableCallable.cs:9:17:9:31 | Run`3 | ViableCallable.cs:304:39:304:41 | get_Item |
| ViableCallable.cs:9:17:9:31 | Run`3 | ViableCallable.cs:304:39:304:41 | get_Item |
| ViableCallable.cs:9:17:9:31 | Run`3 | ViableCallable.cs:304:70:304:72 | set_Item |
| ViableCallable.cs:9:17:9:31 | Run`3 | ViableCallable.cs:304:70:304:72 | set_Item |
| ViableCallable.cs:9:17:9:31 | Run`3 | ViableCallable.cs:305:52:305:54 | add_Event |
| ViableCallable.cs:9:17:9:31 | Run`3 | ViableCallable.cs:305:52:305:54 | add_Event |
| ViableCallable.cs:9:17:9:31 | Run`3 | ViableCallable.cs:305:60:305:65 | remove_Event |
| ViableCallable.cs:9:17:9:31 | Run`3 | ViableCallable.cs:305:60:305:65 | remove_Event |
| ViableCallable.cs:9:17:9:31 | Run`3 | ViableCallable.cs:322:25:322:25 | M |
| ViableCallable.cs:9:17:9:31 | Run`3 | ViableCallable.cs:323:24:323:28 | M2<Decimal> |
| ViableCallable.cs:9:17:9:31 | Run`3 | ViableCallable.cs:323:24:323:28 | M2<String> |
| ViableCallable.cs:9:17:9:31 | Run`3 | ViableCallable.cs:324:17:324:18 | M3 |
| ViableCallable.cs:9:17:9:31 | Run`3 | ViableCallable.cs:325:17:325:18 | M4 |
| ViableCallable.cs:9:17:9:31 | Run`3 | ViableCallable.cs:326:17:326:18 | M5 |
| ViableCallable.cs:9:17:9:31 | Run`3 | ViableCallable.cs:336:26:336:26 | M |
| ViableCallable.cs:9:17:9:31 | Run`3 | ViableCallable.cs:337:17:337:18 | M3 |
| ViableCallable.cs:9:17:9:31 | Run`3 | ViableCallable.cs:338:17:338:18 | M5 |
| ViableCallable.cs:9:17:9:31 | Run`3 | ViableCallable.cs:347:17:347:18 | M3 |
| ViableCallable.cs:9:17:9:31 | Run`3 | ViableCallable.cs:348:17:348:18 | M5 |
| ViableCallable.cs:9:17:9:31 | Run`3 | ViableCallable.cs:349:32:349:32 | + |
| ViableCallable.cs:9:17:9:31 | Run`3 | ViableCallable.cs:351:34:351:36 | get_Prop3 |
| ViableCallable.cs:9:17:9:31 | Run`3 | ViableCallable.cs:351:39:351:41 | set_Prop3 |
| ViableCallable.cs:9:17:9:31 | Run`3 | ViableCallable.cs:352:31:352:33 | get_Item |
| ViableCallable.cs:9:17:9:31 | Run`3 | ViableCallable.cs:352:53:352:55 | set_Item |
| ViableCallable.cs:9:17:9:31 | Run`3 | ViableCallable.cs:353:45:353:47 | add_Event |
| ViableCallable.cs:9:17:9:31 | Run`3 | ViableCallable.cs:353:53:353:58 | remove_Event |
| ViableCallable.cs:241:17:241:19 | Run | ViableCallable.cs:250:23:250:27 | M`1 |
| ViableCallable.cs:241:17:241:19 | Run | ViableCallable.cs:250:23:250:27 | M`1 |
| ViableCallable.cs:241:17:241:19 | Run | ViableCallable.cs:250:23:250:27 | M`1 |
| ViableCallable.cs:241:17:241:19 | Run | ViableCallable.cs:250:23:250:27 | M`1 |
| ViableCallable.cs:241:17:241:19 | Run | ViableCallable.cs:258:29:258:33 | M`1 |
| ViableCallable.cs:241:17:241:19 | Run | ViableCallable.cs:266:26:266:30 | M`1 |
| ViableCallable.cs:241:17:241:19 | Run | ViableCallable.cs:266:26:266:30 | M`1 |
| ViableCallable.cs:241:17:241:19 | Run | ViableCallable.cs:274:26:274:30 | M`1 |
| ViableCallable.cs:241:17:241:19 | Run | ViableCallable.cs:285:24:285:28 | M`1 |
| ViableCallable.cs:241:17:241:19 | Run | ViableCallable.cs:285:24:285:28 | M`1 |
| ViableCallable.cs:241:17:241:19 | Run | ViableCallable.cs:285:24:285:28 | M`1 |
| ViableCallable.cs:241:17:241:19 | Run | ViableCallable.cs:285:24:285:28 | M`1 |
| ViableCallable.cs:241:17:241:19 | Run | ViableCallable.cs:285:24:285:28 | M`1 |
| ViableCallable.cs:241:17:241:19 | Run | ViableCallable.cs:285:24:285:28 | M`1 |
| ViableCallable.cs:241:17:241:19 | Run | ViableCallable.cs:285:24:285:28 | M`1 |
| ViableCallable.cs:241:17:241:19 | Run | ViableCallable.cs:285:24:285:28 | M`1 |
| ViableCallable.cs:241:17:241:19 | Run | ViableCallable.cs:285:24:285:28 | M`1 |
| ViableCallable.cs:241:17:241:19 | Run | ViableCallable.cs:302:26:302:30 | M`1 |
| ViableCallable.cs:241:17:241:19 | Run | ViableCallable.cs:302:26:302:30 | M`1 |
| ViableCallable.cs:290:17:290:19 | Run | ViableCallable.cs:285:24:285:28 | M`1 |
| ViableCallable.cs:290:17:290:19 | Run | ViableCallable.cs:302:26:302:30 | M`1 |
| ViableCallable.cs:290:17:290:19 | Run | ViableCallable.cs:302:26:302:30 | M`1 |
| ViableCallable.cs:307:17:307:19 | Run | ViableCallable.cs:285:24:285:28 | M`1 |
| ViableCallable.cs:307:17:307:19 | Run | ViableCallable.cs:302:26:302:30 | M`1 |
| ViableCallable.cs:360:17:360:19 | Run | ViableCallable.cs:358:10:358:10 | M |
| ViableCallable.cs:360:17:360:19 | Run | ViableCallable.cs:374:5:374:7 | C11 |
| ViableCallable.cs:388:10:388:16 | Run`1 | ViableCallable.cs:384:33:384:33 | M |
| ViableCallable.cs:394:10:394:17 | Run2`1 | ViableCallable.cs:388:10:388:16 | Run<T2> |
| ViableCallable.cs:399:10:399:13 | Run3 | ViableCallable.cs:394:10:394:17 | Run2<C13> |
| ViableCallable.cs:421:10:421:12 | Run | ViableCallable.cs:212:21:212:27 | Mock<A4> |
| ViableCallable.cs:421:10:421:12 | Run | ViableCallable.cs:409:36:409:40 | M`1 |
| ViableCallable.cs:421:10:421:12 | Run | ViableCallable.cs:415:53:415:57 | M`1 |
| ViableCallable.cs:421:10:421:12 | Run | ViableCallable.cs:417:42:417:46 | M`1 |
| ViableCallable.cs:443:22:443:26 | M2`1 | ViableCallable.cs:468:14:468:29 | (...) => ... |
| ViableCallable.cs:443:22:443:26 | M2`1 | ViableCallable.cs:474:14:474:29 | (...) => ... |
| ViableCallable.cs:448:10:448:11 | M1 | ViableCallable.cs:442:23:442:24 | M1 |
| ViableCallable.cs:448:10:448:11 | M1 | ViableCallable.cs:457:23:457:27 | M2`1 |
| ViableCallable.cs:457:23:457:27 | M2`1 | ViableCallable.cs:454:17:454:23 | (...) => ... |
| ViableCallable.cs:457:23:457:27 | M2`1 | ViableCallable.cs:462:14:462:20 | (...) => ... |
| ViableCallable.cs:457:23:457:27 | M2`1 | ViableCallable.cs:468:14:468:29 | (...) => ... |
| ViableCallable.cs:457:23:457:27 | M2`1 | ViableCallable.cs:474:14:474:29 | (...) => ... |
| ViableCallable.cs:459:10:459:14 | M3`1 | ViableCallable.cs:457:23:457:27 | M2`1 |
| ViableCallable.cs:465:10:465:14 | M4`1 | ViableCallable.cs:443:22:443:26 | M2`1 |
| ViableCallable.cs:465:10:465:14 | M4`1 | ViableCallable.cs:457:23:457:27 | M2`1 |
| ViableCallable.cs:471:10:471:14 | M5`1 | ViableCallable.cs:443:22:443:26 | M2`1 |
| ViableCallable.cs:471:10:471:14 | M5`1 | ViableCallable.cs:457:23:457:27 | M2`1 |
| ViableCallable.cs:488:10:488:12 | Run | ViableCallable.cs:481:10:481:11 | M2 |
| ViableCallable.cs:488:10:488:12 | Run | ViableCallable.cs:486:17:486:18 | M1 |
| ViableCallable.cs:505:10:505:12 | Run | ViableCallable.cs:500:32:500:32 | + |
| ViableCallable.cs:505:10:505:12 | Run | ViableCallable.cs:501:40:501:40 | checked + |
| ViableCallable.cs:505:10:505:12 | Run | ViableCallable.cs:502:28:502:35 | explicit conversion |
| ViableCallable.cs:505:10:505:12 | Run | ViableCallable.cs:503:28:503:35 | checked explicit conversion |
| ViableCallable.cs:555:10:555:15 | Run`1 | ViableCallable.cs:527:39:527:39 | checked - |
| ViableCallable.cs:555:10:555:15 | Run`1 | ViableCallable.cs:529:31:529:31 | * |
| ViableCallable.cs:555:10:555:15 | Run`1 | ViableCallable.cs:530:39:530:39 | checked * |
| ViableCallable.cs:555:10:555:15 | Run`1 | ViableCallable.cs:532:31:532:31 | / |
| ViableCallable.cs:555:10:555:15 | Run`1 | ViableCallable.cs:533:39:533:39 | checked / |
| ViableCallable.cs:555:10:555:15 | Run`1 | ViableCallable.cs:537:18:537:20 | M12 |
| ViableCallable.cs:555:10:555:15 | Run`1 | ViableCallable.cs:539:18:539:20 | M13 |
| ViableCallable.cs:555:10:555:15 | Run`1 | ViableCallable.cs:544:32:544:32 | + |
| ViableCallable.cs:555:10:555:15 | Run`1 | ViableCallable.cs:545:40:545:40 | checked + |
| ViableCallable.cs:555:10:555:15 | Run`1 | ViableCallable.cs:547:32:547:32 | - |
| ViableCallable.cs:555:10:555:15 | Run`1 | ViableCallable.cs:549:32:549:32 | / |
| ViableCallable.cs:555:10:555:15 | Run`1 | ViableCallable.cs:550:40:550:40 | checked / |
| ViableCallable.cs:555:10:555:15 | Run`1 | ViableCallable.cs:552:17:552:19 | M11 |
| ViableCallable.cs:555:10:555:15 | Run`1 | ViableCallable.cs:553:17:553:19 | M12 |
| ViableCallable.cs:609:17:609:23 | Run1`1 | ViableCallable.cs:601:21:601:21 | M |
| ViableCallable.cs:615:17:615:23 | Run2`1 | ViableCallable.cs:601:21:601:21 | M |
| ViableCallable.cs:615:17:615:23 | Run2`1 | ViableCallable.cs:606:21:606:21 | M |
| ViableCallable.cs:10:17:10:31 | Run`3 | ExactCallable.cs:128:25:128:26 | M3 |
| ViableCallable.cs:10:17:10:31 | Run`3 | ExactCallable.cs:147:29:147:30 | M3 |
| ViableCallable.cs:10:17:10:31 | Run`3 | ViableCallable.cs:213:21:213:27 | Mock<C1<Int32[],Boolean>> |
| ViableCallable.cs:10:17:10:31 | Run`3 | ViableCallable.cs:213:21:213:27 | Mock<C1<String,Boolean>> |
| ViableCallable.cs:10:17:10:31 | Run`3 | ViableCallable.cs:213:21:213:27 | Mock<C1<String,Decimal>> |
| ViableCallable.cs:10:17:10:31 | Run`3 | ViableCallable.cs:213:21:213:27 | Mock<C1<String,Int32>> |
| ViableCallable.cs:10:17:10:31 | Run`3 | ViableCallable.cs:213:21:213:27 | Mock<C8> |
| ViableCallable.cs:10:17:10:31 | Run`3 | ViableCallable.cs:213:21:213:27 | Mock<IEnumerable<C4<Int32>>> |
| ViableCallable.cs:10:17:10:31 | Run`3 | ViableCallable.cs:213:21:213:27 | Mock<IEnumerable<C4<String>>> |
| ViableCallable.cs:10:17:10:31 | Run`3 | ViableCallable.cs:213:21:213:27 | Mock<IList<String>> |
| ViableCallable.cs:10:17:10:31 | Run`3 | ViableCallable.cs:251:23:251:27 | M`1 |
| ViableCallable.cs:10:17:10:31 | Run`3 | ViableCallable.cs:251:23:251:27 | M`1 |
| ViableCallable.cs:10:17:10:31 | Run`3 | ViableCallable.cs:251:23:251:27 | M`1 |
| ViableCallable.cs:10:17:10:31 | Run`3 | ViableCallable.cs:251:23:251:27 | M`1 |
| ViableCallable.cs:10:17:10:31 | Run`3 | ViableCallable.cs:252:35:252:37 | get_Prop |
| ViableCallable.cs:10:17:10:31 | Run`3 | ViableCallable.cs:252:35:252:37 | get_Prop |
| ViableCallable.cs:10:17:10:31 | Run`3 | ViableCallable.cs:252:35:252:37 | get_Prop |
| ViableCallable.cs:10:17:10:31 | Run`3 | ViableCallable.cs:252:35:252:37 | get_Prop |
| ViableCallable.cs:10:17:10:31 | Run`3 | ViableCallable.cs:252:40:252:42 | set_Prop |
| ViableCallable.cs:10:17:10:31 | Run`3 | ViableCallable.cs:252:40:252:42 | set_Prop |
| ViableCallable.cs:10:17:10:31 | Run`3 | ViableCallable.cs:252:40:252:42 | set_Prop |
| ViableCallable.cs:10:17:10:31 | Run`3 | ViableCallable.cs:252:40:252:42 | set_Prop |
| ViableCallable.cs:10:17:10:31 | Run`3 | ViableCallable.cs:253:40:253:42 | get_Item |
| ViableCallable.cs:10:17:10:31 | Run`3 | ViableCallable.cs:253:40:253:42 | get_Item |
| ViableCallable.cs:10:17:10:31 | Run`3 | ViableCallable.cs:253:40:253:42 | get_Item |
| ViableCallable.cs:10:17:10:31 | Run`3 | ViableCallable.cs:253:40:253:42 | get_Item |
| ViableCallable.cs:10:17:10:31 | Run`3 | ViableCallable.cs:253:71:253:73 | set_Item |
| ViableCallable.cs:10:17:10:31 | Run`3 | ViableCallable.cs:253:71:253:73 | set_Item |
| ViableCallable.cs:10:17:10:31 | Run`3 | ViableCallable.cs:253:71:253:73 | set_Item |
| ViableCallable.cs:10:17:10:31 | Run`3 | ViableCallable.cs:253:71:253:73 | set_Item |
| ViableCallable.cs:10:17:10:31 | Run`3 | ViableCallable.cs:254:56:254:58 | add_Event |
| ViableCallable.cs:10:17:10:31 | Run`3 | ViableCallable.cs:254:56:254:58 | add_Event |
| ViableCallable.cs:10:17:10:31 | Run`3 | ViableCallable.cs:254:56:254:58 | add_Event |
| ViableCallable.cs:10:17:10:31 | Run`3 | ViableCallable.cs:254:56:254:58 | add_Event |
| ViableCallable.cs:10:17:10:31 | Run`3 | ViableCallable.cs:254:64:254:69 | remove_Event |
| ViableCallable.cs:10:17:10:31 | Run`3 | ViableCallable.cs:254:64:254:69 | remove_Event |
| ViableCallable.cs:10:17:10:31 | Run`3 | ViableCallable.cs:254:64:254:69 | remove_Event |
| ViableCallable.cs:10:17:10:31 | Run`3 | ViableCallable.cs:254:64:254:69 | remove_Event |
| ViableCallable.cs:10:17:10:31 | Run`3 | ViableCallable.cs:259:29:259:33 | M`1 |
| ViableCallable.cs:10:17:10:31 | Run`3 | ViableCallable.cs:260:35:260:37 | get_Prop |
| ViableCallable.cs:10:17:10:31 | Run`3 | ViableCallable.cs:260:40:260:42 | set_Prop |
| ViableCallable.cs:10:17:10:31 | Run`3 | ViableCallable.cs:261:46:261:48 | get_Item |
| ViableCallable.cs:10:17:10:31 | Run`3 | ViableCallable.cs:261:77:261:79 | set_Item |
| ViableCallable.cs:10:17:10:31 | Run`3 | ViableCallable.cs:262:56:262:58 | add_Event |
| ViableCallable.cs:10:17:10:31 | Run`3 | ViableCallable.cs:262:64:262:69 | remove_Event |
| ViableCallable.cs:10:17:10:31 | Run`3 | ViableCallable.cs:267:26:267:30 | M`1 |
| ViableCallable.cs:10:17:10:31 | Run`3 | ViableCallable.cs:267:26:267:30 | M`1 |
| ViableCallable.cs:10:17:10:31 | Run`3 | ViableCallable.cs:268:32:268:34 | get_Prop |
| ViableCallable.cs:10:17:10:31 | Run`3 | ViableCallable.cs:268:32:268:34 | get_Prop |
| ViableCallable.cs:10:17:10:31 | Run`3 | ViableCallable.cs:268:37:268:39 | set_Prop |
| ViableCallable.cs:10:17:10:31 | Run`3 | ViableCallable.cs:268:37:268:39 | set_Prop |
| ViableCallable.cs:10:17:10:31 | Run`3 | ViableCallable.cs:269:40:269:42 | get_Item |
| ViableCallable.cs:10:17:10:31 | Run`3 | ViableCallable.cs:269:40:269:42 | get_Item |
| ViableCallable.cs:10:17:10:31 | Run`3 | ViableCallable.cs:269:71:269:73 | set_Item |
| ViableCallable.cs:10:17:10:31 | Run`3 | ViableCallable.cs:269:71:269:73 | set_Item |
| ViableCallable.cs:10:17:10:31 | Run`3 | ViableCallable.cs:270:53:270:55 | add_Event |
| ViableCallable.cs:10:17:10:31 | Run`3 | ViableCallable.cs:270:53:270:55 | add_Event |
| ViableCallable.cs:10:17:10:31 | Run`3 | ViableCallable.cs:270:61:270:66 | remove_Event |
| ViableCallable.cs:10:17:10:31 | Run`3 | ViableCallable.cs:270:61:270:66 | remove_Event |
| ViableCallable.cs:10:17:10:31 | Run`3 | ViableCallable.cs:275:26:275:30 | M`1 |
| ViableCallable.cs:10:17:10:31 | Run`3 | ViableCallable.cs:276:24:276:24 | M |
| ViableCallable.cs:10:17:10:31 | Run`3 | ViableCallable.cs:277:35:277:37 | get_Prop |
| ViableCallable.cs:10:17:10:31 | Run`3 | ViableCallable.cs:277:40:277:42 | set_Prop |
| ViableCallable.cs:10:17:10:31 | Run`3 | ViableCallable.cs:278:39:278:41 | set_Prop2 |
| ViableCallable.cs:10:17:10:31 | Run`3 | ViableCallable.cs:279:43:279:45 | get_Item |
| ViableCallable.cs:10:17:10:31 | Run`3 | ViableCallable.cs:279:74:279:76 | set_Item |
| ViableCallable.cs:10:17:10:31 | Run`3 | ViableCallable.cs:280:56:280:58 | add_Event |
| ViableCallable.cs:10:17:10:31 | Run`3 | ViableCallable.cs:280:64:280:69 | remove_Event |
| ViableCallable.cs:10:17:10:31 | Run`3 | ViableCallable.cs:281:55:281:57 | add_Event2 |
| ViableCallable.cs:10:17:10:31 | Run`3 | ViableCallable.cs:281:63:281:68 | remove_Event2 |
| ViableCallable.cs:10:17:10:31 | Run`3 | ViableCallable.cs:286:24:286:28 | M`1 |
| ViableCallable.cs:10:17:10:31 | Run`3 | ViableCallable.cs:286:24:286:28 | M`1 |
| ViableCallable.cs:10:17:10:31 | Run`3 | ViableCallable.cs:286:24:286:28 | M`1 |
| ViableCallable.cs:10:17:10:31 | Run`3 | ViableCallable.cs:286:24:286:28 | M`1 |
| ViableCallable.cs:10:17:10:31 | Run`3 | ViableCallable.cs:286:24:286:28 | M`1 |
| ViableCallable.cs:10:17:10:31 | Run`3 | ViableCallable.cs:286:24:286:28 | M`1 |
| ViableCallable.cs:10:17:10:31 | Run`3 | ViableCallable.cs:286:24:286:28 | M`1 |
| ViableCallable.cs:10:17:10:31 | Run`3 | ViableCallable.cs:286:24:286:28 | M`1 |
| ViableCallable.cs:10:17:10:31 | Run`3 | ViableCallable.cs:286:24:286:28 | M`1 |
| ViableCallable.cs:10:17:10:31 | Run`3 | ViableCallable.cs:287:31:287:33 | get_Prop |
| ViableCallable.cs:10:17:10:31 | Run`3 | ViableCallable.cs:287:31:287:33 | get_Prop |
| ViableCallable.cs:10:17:10:31 | Run`3 | ViableCallable.cs:287:31:287:33 | get_Prop |
| ViableCallable.cs:10:17:10:31 | Run`3 | ViableCallable.cs:287:31:287:33 | get_Prop |
| ViableCallable.cs:10:17:10:31 | Run`3 | ViableCallable.cs:287:31:287:33 | get_Prop |
| ViableCallable.cs:10:17:10:31 | Run`3 | ViableCallable.cs:287:31:287:33 | get_Prop |
| ViableCallable.cs:10:17:10:31 | Run`3 | ViableCallable.cs:287:31:287:33 | get_Prop |
| ViableCallable.cs:10:17:10:31 | Run`3 | ViableCallable.cs:287:31:287:33 | get_Prop |
| ViableCallable.cs:10:17:10:31 | Run`3 | ViableCallable.cs:287:31:287:33 | get_Prop |
| ViableCallable.cs:10:17:10:31 | Run`3 | ViableCallable.cs:287:36:287:38 | set_Prop |
| ViableCallable.cs:10:17:10:31 | Run`3 | ViableCallable.cs:287:36:287:38 | set_Prop |
| ViableCallable.cs:10:17:10:31 | Run`3 | ViableCallable.cs:287:36:287:38 | set_Prop |
| ViableCallable.cs:10:17:10:31 | Run`3 | ViableCallable.cs:287:36:287:38 | set_Prop |
| ViableCallable.cs:10:17:10:31 | Run`3 | ViableCallable.cs:287:36:287:38 | set_Prop |
| ViableCallable.cs:10:17:10:31 | Run`3 | ViableCallable.cs:287:36:287:38 | set_Prop |
| ViableCallable.cs:10:17:10:31 | Run`3 | ViableCallable.cs:287:36:287:38 | set_Prop |
| ViableCallable.cs:10:17:10:31 | Run`3 | ViableCallable.cs:287:36:287:38 | set_Prop |
| ViableCallable.cs:10:17:10:31 | Run`3 | ViableCallable.cs:287:36:287:38 | set_Prop |
| ViableCallable.cs:10:17:10:31 | Run`3 | ViableCallable.cs:288:37:288:39 | get_Item |
| ViableCallable.cs:10:17:10:31 | Run`3 | ViableCallable.cs:288:37:288:39 | get_Item |
| ViableCallable.cs:10:17:10:31 | Run`3 | ViableCallable.cs:288:37:288:39 | get_Item |
| ViableCallable.cs:10:17:10:31 | Run`3 | ViableCallable.cs:288:37:288:39 | get_Item |
| ViableCallable.cs:10:17:10:31 | Run`3 | ViableCallable.cs:288:37:288:39 | get_Item |
| ViableCallable.cs:10:17:10:31 | Run`3 | ViableCallable.cs:288:37:288:39 | get_Item |
| ViableCallable.cs:10:17:10:31 | Run`3 | ViableCallable.cs:288:37:288:39 | get_Item |
| ViableCallable.cs:10:17:10:31 | Run`3 | ViableCallable.cs:288:37:288:39 | get_Item |
| ViableCallable.cs:10:17:10:31 | Run`3 | ViableCallable.cs:288:37:288:39 | get_Item |
| ViableCallable.cs:10:17:10:31 | Run`3 | ViableCallable.cs:288:68:288:70 | set_Item |
| ViableCallable.cs:10:17:10:31 | Run`3 | ViableCallable.cs:288:68:288:70 | set_Item |
| ViableCallable.cs:10:17:10:31 | Run`3 | ViableCallable.cs:288:68:288:70 | set_Item |
| ViableCallable.cs:10:17:10:31 | Run`3 | ViableCallable.cs:288:68:288:70 | set_Item |
| ViableCallable.cs:10:17:10:31 | Run`3 | ViableCallable.cs:288:68:288:70 | set_Item |
| ViableCallable.cs:10:17:10:31 | Run`3 | ViableCallable.cs:288:68:288:70 | set_Item |
| ViableCallable.cs:10:17:10:31 | Run`3 | ViableCallable.cs:288:68:288:70 | set_Item |
| ViableCallable.cs:10:17:10:31 | Run`3 | ViableCallable.cs:288:68:288:70 | set_Item |
| ViableCallable.cs:10:17:10:31 | Run`3 | ViableCallable.cs:288:68:288:70 | set_Item |
| ViableCallable.cs:10:17:10:31 | Run`3 | ViableCallable.cs:289:52:289:54 | add_Event |
| ViableCallable.cs:10:17:10:31 | Run`3 | ViableCallable.cs:289:52:289:54 | add_Event |
| ViableCallable.cs:10:17:10:31 | Run`3 | ViableCallable.cs:289:52:289:54 | add_Event |
| ViableCallable.cs:10:17:10:31 | Run`3 | ViableCallable.cs:289:52:289:54 | add_Event |
| ViableCallable.cs:10:17:10:31 | Run`3 | ViableCallable.cs:289:52:289:54 | add_Event |
| ViableCallable.cs:10:17:10:31 | Run`3 | ViableCallable.cs:289:52:289:54 | add_Event |
| ViableCallable.cs:10:17:10:31 | Run`3 | ViableCallable.cs:289:52:289:54 | add_Event |
| ViableCallable.cs:10:17:10:31 | Run`3 | ViableCallable.cs:289:52:289:54 | add_Event |
| ViableCallable.cs:10:17:10:31 | Run`3 | ViableCallable.cs:289:52:289:54 | add_Event |
| ViableCallable.cs:10:17:10:31 | Run`3 | ViableCallable.cs:289:60:289:65 | remove_Event |
| ViableCallable.cs:10:17:10:31 | Run`3 | ViableCallable.cs:289:60:289:65 | remove_Event |
| ViableCallable.cs:10:17:10:31 | Run`3 | ViableCallable.cs:289:60:289:65 | remove_Event |
| ViableCallable.cs:10:17:10:31 | Run`3 | ViableCallable.cs:289:60:289:65 | remove_Event |
| ViableCallable.cs:10:17:10:31 | Run`3 | ViableCallable.cs:289:60:289:65 | remove_Event |
| ViableCallable.cs:10:17:10:31 | Run`3 | ViableCallable.cs:289:60:289:65 | remove_Event |
| ViableCallable.cs:10:17:10:31 | Run`3 | ViableCallable.cs:289:60:289:65 | remove_Event |
| ViableCallable.cs:10:17:10:31 | Run`3 | ViableCallable.cs:289:60:289:65 | remove_Event |
| ViableCallable.cs:10:17:10:31 | Run`3 | ViableCallable.cs:289:60:289:65 | remove_Event |
| ViableCallable.cs:10:17:10:31 | Run`3 | ViableCallable.cs:303:26:303:30 | M`1 |
| ViableCallable.cs:10:17:10:31 | Run`3 | ViableCallable.cs:303:26:303:30 | M`1 |
| ViableCallable.cs:10:17:10:31 | Run`3 | ViableCallable.cs:304:31:304:33 | get_Prop |
| ViableCallable.cs:10:17:10:31 | Run`3 | ViableCallable.cs:304:31:304:33 | get_Prop |
| ViableCallable.cs:10:17:10:31 | Run`3 | ViableCallable.cs:304:36:304:38 | set_Prop |
| ViableCallable.cs:10:17:10:31 | Run`3 | ViableCallable.cs:304:36:304:38 | set_Prop |
| ViableCallable.cs:10:17:10:31 | Run`3 | ViableCallable.cs:305:39:305:41 | get_Item |
| ViableCallable.cs:10:17:10:31 | Run`3 | ViableCallable.cs:305:39:305:41 | get_Item |
| ViableCallable.cs:10:17:10:31 | Run`3 | ViableCallable.cs:305:70:305:72 | set_Item |
| ViableCallable.cs:10:17:10:31 | Run`3 | ViableCallable.cs:305:70:305:72 | set_Item |
| ViableCallable.cs:10:17:10:31 | Run`3 | ViableCallable.cs:306:52:306:54 | add_Event |
| ViableCallable.cs:10:17:10:31 | Run`3 | ViableCallable.cs:306:52:306:54 | add_Event |
| ViableCallable.cs:10:17:10:31 | Run`3 | ViableCallable.cs:306:60:306:65 | remove_Event |
| ViableCallable.cs:10:17:10:31 | Run`3 | ViableCallable.cs:306:60:306:65 | remove_Event |
| ViableCallable.cs:10:17:10:31 | Run`3 | ViableCallable.cs:323:25:323:25 | M |
| ViableCallable.cs:10:17:10:31 | Run`3 | ViableCallable.cs:324:24:324:28 | M2<Decimal> |
| ViableCallable.cs:10:17:10:31 | Run`3 | ViableCallable.cs:324:24:324:28 | M2<String> |
| ViableCallable.cs:10:17:10:31 | Run`3 | ViableCallable.cs:325:17:325:18 | M3 |
| ViableCallable.cs:10:17:10:31 | Run`3 | ViableCallable.cs:326:17:326:18 | M4 |
| ViableCallable.cs:10:17:10:31 | Run`3 | ViableCallable.cs:327:17:327:18 | M5 |
| ViableCallable.cs:10:17:10:31 | Run`3 | ViableCallable.cs:337:26:337:26 | M |
| ViableCallable.cs:10:17:10:31 | Run`3 | ViableCallable.cs:338:17:338:18 | M3 |
| ViableCallable.cs:10:17:10:31 | Run`3 | ViableCallable.cs:339:17:339:18 | M5 |
| ViableCallable.cs:10:17:10:31 | Run`3 | ViableCallable.cs:348:17:348:18 | M3 |
| ViableCallable.cs:10:17:10:31 | Run`3 | ViableCallable.cs:349:17:349:18 | M5 |
| ViableCallable.cs:10:17:10:31 | Run`3 | ViableCallable.cs:350:32:350:32 | + |
| ViableCallable.cs:10:17:10:31 | Run`3 | ViableCallable.cs:352:34:352:36 | get_Prop3 |
| ViableCallable.cs:10:17:10:31 | Run`3 | ViableCallable.cs:352:39:352:41 | set_Prop3 |
| ViableCallable.cs:10:17:10:31 | Run`3 | ViableCallable.cs:353:31:353:33 | get_Item |
| ViableCallable.cs:10:17:10:31 | Run`3 | ViableCallable.cs:353:53:353:55 | set_Item |
| ViableCallable.cs:10:17:10:31 | Run`3 | ViableCallable.cs:354:45:354:47 | add_Event |
| ViableCallable.cs:10:17:10:31 | Run`3 | ViableCallable.cs:354:53:354:58 | remove_Event |
| ViableCallable.cs:242:17:242:19 | Run | ViableCallable.cs:251:23:251:27 | M`1 |
| ViableCallable.cs:242:17:242:19 | Run | ViableCallable.cs:251:23:251:27 | M`1 |
| ViableCallable.cs:242:17:242:19 | Run | ViableCallable.cs:251:23:251:27 | M`1 |
| ViableCallable.cs:242:17:242:19 | Run | ViableCallable.cs:251:23:251:27 | M`1 |
| ViableCallable.cs:242:17:242:19 | Run | ViableCallable.cs:259:29:259:33 | M`1 |
| ViableCallable.cs:242:17:242:19 | Run | ViableCallable.cs:267:26:267:30 | M`1 |
| ViableCallable.cs:242:17:242:19 | Run | ViableCallable.cs:267:26:267:30 | M`1 |
| ViableCallable.cs:242:17:242:19 | Run | ViableCallable.cs:275:26:275:30 | M`1 |
| ViableCallable.cs:242:17:242:19 | Run | ViableCallable.cs:286:24:286:28 | M`1 |
| ViableCallable.cs:242:17:242:19 | Run | ViableCallable.cs:286:24:286:28 | M`1 |
| ViableCallable.cs:242:17:242:19 | Run | ViableCallable.cs:286:24:286:28 | M`1 |
| ViableCallable.cs:242:17:242:19 | Run | ViableCallable.cs:286:24:286:28 | M`1 |
| ViableCallable.cs:242:17:242:19 | Run | ViableCallable.cs:286:24:286:28 | M`1 |
| ViableCallable.cs:242:17:242:19 | Run | ViableCallable.cs:286:24:286:28 | M`1 |
| ViableCallable.cs:242:17:242:19 | Run | ViableCallable.cs:286:24:286:28 | M`1 |
| ViableCallable.cs:242:17:242:19 | Run | ViableCallable.cs:286:24:286:28 | M`1 |
| ViableCallable.cs:242:17:242:19 | Run | ViableCallable.cs:286:24:286:28 | M`1 |
| ViableCallable.cs:242:17:242:19 | Run | ViableCallable.cs:303:26:303:30 | M`1 |
| ViableCallable.cs:242:17:242:19 | Run | ViableCallable.cs:303:26:303:30 | M`1 |
| ViableCallable.cs:291:17:291:19 | Run | ViableCallable.cs:286:24:286:28 | M`1 |
| ViableCallable.cs:291:17:291:19 | Run | ViableCallable.cs:303:26:303:30 | M`1 |
| ViableCallable.cs:291:17:291:19 | Run | ViableCallable.cs:303:26:303:30 | M`1 |
| ViableCallable.cs:308:17:308:19 | Run | ViableCallable.cs:286:24:286:28 | M`1 |
| ViableCallable.cs:308:17:308:19 | Run | ViableCallable.cs:303:26:303:30 | M`1 |
| ViableCallable.cs:361:17:361:19 | Run | ViableCallable.cs:359:10:359:10 | M |
| ViableCallable.cs:361:17:361:19 | Run | ViableCallable.cs:375:5:375:7 | C11 |
| ViableCallable.cs:389:10:389:16 | Run`1 | ViableCallable.cs:385:33:385:33 | M |
| ViableCallable.cs:395:10:395:17 | Run2`1 | ViableCallable.cs:389:10:389:16 | Run<T2> |
| ViableCallable.cs:400:10:400:13 | Run3 | ViableCallable.cs:395:10:395:17 | Run2<C13> |
| ViableCallable.cs:422:10:422:12 | Run | ViableCallable.cs:213:21:213:27 | Mock<A4> |
| ViableCallable.cs:422:10:422:12 | Run | ViableCallable.cs:410:36:410:40 | M`1 |
| ViableCallable.cs:422:10:422:12 | Run | ViableCallable.cs:416:53:416:57 | M`1 |
| ViableCallable.cs:422:10:422:12 | Run | ViableCallable.cs:418:42:418:46 | M`1 |
| ViableCallable.cs:444:22:444:26 | M2`1 | ViableCallable.cs:469:14:469:29 | (...) => ... |
| ViableCallable.cs:444:22:444:26 | M2`1 | ViableCallable.cs:475:14:475:29 | (...) => ... |
| ViableCallable.cs:449:10:449:11 | M1 | ViableCallable.cs:443:23:443:24 | M1 |
| ViableCallable.cs:449:10:449:11 | M1 | ViableCallable.cs:458:23:458:27 | M2`1 |
| ViableCallable.cs:458:23:458:27 | M2`1 | ViableCallable.cs:455:17:455:23 | (...) => ... |
| ViableCallable.cs:458:23:458:27 | M2`1 | ViableCallable.cs:463:14:463:20 | (...) => ... |
| ViableCallable.cs:458:23:458:27 | M2`1 | ViableCallable.cs:469:14:469:29 | (...) => ... |
| ViableCallable.cs:458:23:458:27 | M2`1 | ViableCallable.cs:475:14:475:29 | (...) => ... |
| ViableCallable.cs:460:10:460:14 | M3`1 | ViableCallable.cs:458:23:458:27 | M2`1 |
| ViableCallable.cs:466:10:466:14 | M4`1 | ViableCallable.cs:444:22:444:26 | M2`1 |
| ViableCallable.cs:466:10:466:14 | M4`1 | ViableCallable.cs:458:23:458:27 | M2`1 |
| ViableCallable.cs:472:10:472:14 | M5`1 | ViableCallable.cs:444:22:444:26 | M2`1 |
| ViableCallable.cs:472:10:472:14 | M5`1 | ViableCallable.cs:458:23:458:27 | M2`1 |
| ViableCallable.cs:489:10:489:12 | Run | ViableCallable.cs:482:10:482:11 | M2 |
| ViableCallable.cs:489:10:489:12 | Run | ViableCallable.cs:487:17:487:18 | M1 |
| ViableCallable.cs:506:10:506:12 | Run | ViableCallable.cs:501:32:501:32 | + |
| ViableCallable.cs:506:10:506:12 | Run | ViableCallable.cs:502:40:502:40 | checked + |
| ViableCallable.cs:506:10:506:12 | Run | ViableCallable.cs:503:28:503:35 | explicit conversion |
| ViableCallable.cs:506:10:506:12 | Run | ViableCallable.cs:504:28:504:35 | checked explicit conversion |
| ViableCallable.cs:556:10:556:15 | Run`1 | ViableCallable.cs:528:39:528:39 | checked - |
| ViableCallable.cs:556:10:556:15 | Run`1 | ViableCallable.cs:530:31:530:31 | * |
| ViableCallable.cs:556:10:556:15 | Run`1 | ViableCallable.cs:531:39:531:39 | checked * |
| ViableCallable.cs:556:10:556:15 | Run`1 | ViableCallable.cs:533:31:533:31 | / |
| ViableCallable.cs:556:10:556:15 | Run`1 | ViableCallable.cs:534:39:534:39 | checked / |
| ViableCallable.cs:556:10:556:15 | Run`1 | ViableCallable.cs:538:18:538:20 | M12 |
| ViableCallable.cs:556:10:556:15 | Run`1 | ViableCallable.cs:540:18:540:20 | M13 |
| ViableCallable.cs:556:10:556:15 | Run`1 | ViableCallable.cs:545:32:545:32 | + |
| ViableCallable.cs:556:10:556:15 | Run`1 | ViableCallable.cs:546:40:546:40 | checked + |
| ViableCallable.cs:556:10:556:15 | Run`1 | ViableCallable.cs:548:32:548:32 | - |
| ViableCallable.cs:556:10:556:15 | Run`1 | ViableCallable.cs:550:32:550:32 | / |
| ViableCallable.cs:556:10:556:15 | Run`1 | ViableCallable.cs:551:40:551:40 | checked / |
| ViableCallable.cs:556:10:556:15 | Run`1 | ViableCallable.cs:553:17:553:19 | M11 |
| ViableCallable.cs:556:10:556:15 | Run`1 | ViableCallable.cs:554:17:554:19 | M12 |
| ViableCallable.cs:610:17:610:23 | Run1`1 | ViableCallable.cs:602:21:602:21 | M |
| ViableCallable.cs:616:17:616:23 | Run2`1 | ViableCallable.cs:602:21:602:21 | M |
| ViableCallable.cs:616:17:616:23 | Run2`1 | ViableCallable.cs:607:21:607:21 | M |
| ViableCallable.cs:657:17:657:20 | Run1 | ViableCallable.cs:635:21:635:21 | M |
| ViableCallable.cs:657:17:657:20 | Run1 | ViableCallable.cs:637:21:637:21 | M |
| ViableCallable.cs:668:17:668:20 | Run2 | ViableCallable.cs:651:21:651:21 | M |
| ViableCallable.cs:668:17:668:20 | Run2 | ViableCallable.cs:654:21:654:21 | M |
| ViableCallable.cs:679:17:679:20 | Run3 | ViableCallable.cs:635:21:635:21 | M |
| ViableCallable.cs:679:17:679:20 | Run3 | ViableCallable.cs:637:21:637:21 | M |
| ViableCallable.cs:679:17:679:20 | Run3 | ViableCallable.cs:646:21:646:21 | M |
| ViableCallable.cs:679:17:679:20 | Run3 | ViableCallable.cs:648:21:648:21 | M |

View File

@@ -66,445 +66,453 @@
| TypeFlow.cs:33:9:33:18 | call to method Method | TypeFlow+C2.Method() |
| TypeFlow.cs:37:11:37:26 | call to method Method | TypeFlow+C2.Method() |
| TypeFlow.cs:40:9:40:18 | call to method Method | TypeFlow+C2.Method() |
| ViableCallable.cs:12:9:12:28 | call to method M<Int32> | C2<System.Boolean>.M<T3>(string, T3) |
| ViableCallable.cs:12:9:12:28 | call to method M<Int32> | C2<System.Decimal>.M<T3>(string, T3) |
| ViableCallable.cs:12:9:12:28 | call to method M<Int32> | C2<System.Int32>.M<T3>(string, T3) |
| ViableCallable.cs:12:9:12:28 | call to method M<Int32> | C2`1.M<T3>(string, T3) |
| ViableCallable.cs:12:9:12:28 | call to method M<Int32> | C3.M<T3>(string, T3) |
| ViableCallable.cs:12:9:12:28 | call to method M<Int32> | C4<System.Int32>.M<T3>(Int32[], T3) |
| ViableCallable.cs:12:9:12:28 | call to method M<Int32> | C4`1.M<T3>(T[], T3) |
| ViableCallable.cs:12:9:12:28 | call to method M<Int32> | C5.M<T3>(string, T3) |
| ViableCallable.cs:12:9:12:28 | call to method M<Int32> | C6<System.Boolean,System.Byte>.M<T3>(bool, T3) |
| ViableCallable.cs:12:9:12:28 | call to method M<Int32> | C6<System.Int32[],System.Boolean>.M<T3>(Int32[], T3) |
| ViableCallable.cs:12:9:12:28 | call to method M<Int32> | C6<System.String,System.Boolean>.M<T3>(string, T3) |
| ViableCallable.cs:12:9:12:28 | call to method M<Int32> | C6<System.String,System.Decimal>.M<T3>(string, T3) |
| ViableCallable.cs:12:9:12:28 | call to method M<Int32> | C6<System.String,System.Int32>.M<T3>(string, T3) |
| ViableCallable.cs:12:9:12:28 | call to method M<Int32> | C6<T1,System.Boolean>.M<T3>(T1, T3) |
| ViableCallable.cs:12:9:12:28 | call to method M<Int32> | C6<T1,System.Byte>.M<T3>(T1, T3) |
| ViableCallable.cs:12:9:12:28 | call to method M<Int32> | C6`2.M<T3>(T1, T3) |
| ViableCallable.cs:12:9:12:28 | call to method M<Int32> | C7<System.Boolean>.M<T3>(bool, T3) |
| ViableCallable.cs:12:9:12:28 | call to method M<Int32> | C7`1.M<T3>(T1, T3) |
| ViableCallable.cs:14:9:14:15 | access to property Prop | C2<System.Boolean>.set_Prop(string) |
| ViableCallable.cs:14:9:14:15 | access to property Prop | C2<System.Decimal>.set_Prop(string) |
| ViableCallable.cs:14:9:14:15 | access to property Prop | C2<System.Int32>.set_Prop(string) |
| ViableCallable.cs:14:9:14:15 | access to property Prop | C2`1.set_Prop(string) |
| ViableCallable.cs:14:9:14:15 | access to property Prop | C3.set_Prop(string) |
| ViableCallable.cs:14:9:14:15 | access to property Prop | C4<System.Int32>.set_Prop(Int32[]) |
| ViableCallable.cs:14:9:14:15 | access to property Prop | C4`1.set_Prop(T[]) |
| ViableCallable.cs:14:9:14:15 | access to property Prop | C5.set_Prop(string) |
| ViableCallable.cs:14:9:14:15 | access to property Prop | C6<System.Boolean,System.Byte>.set_Prop(bool) |
| ViableCallable.cs:14:9:14:15 | access to property Prop | C6<System.Int32[],System.Boolean>.set_Prop(Int32[]) |
| ViableCallable.cs:14:9:14:15 | access to property Prop | C6<System.String,System.Boolean>.set_Prop(string) |
| ViableCallable.cs:14:9:14:15 | access to property Prop | C6<System.String,System.Decimal>.set_Prop(string) |
| ViableCallable.cs:14:9:14:15 | access to property Prop | C6<System.String,System.Int32>.set_Prop(string) |
| ViableCallable.cs:14:9:14:15 | access to property Prop | C6<T1,System.Boolean>.set_Prop(T1) |
| ViableCallable.cs:14:9:14:15 | access to property Prop | C6<T1,System.Byte>.set_Prop(T1) |
| ViableCallable.cs:14:9:14:15 | access to property Prop | C6`2.set_Prop(T1) |
| ViableCallable.cs:14:9:14:15 | access to property Prop | C7<System.Boolean>.set_Prop(bool) |
| ViableCallable.cs:14:9:14:15 | access to property Prop | C7`1.set_Prop(T1) |
| ViableCallable.cs:14:19:14:25 | access to property Prop | C2<System.Boolean>.get_Prop() |
| ViableCallable.cs:14:19:14:25 | access to property Prop | C2<System.Decimal>.get_Prop() |
| ViableCallable.cs:14:19:14:25 | access to property Prop | C2<System.Int32>.get_Prop() |
| ViableCallable.cs:14:19:14:25 | access to property Prop | C2`1.get_Prop() |
| ViableCallable.cs:14:19:14:25 | access to property Prop | C3.get_Prop() |
| ViableCallable.cs:14:19:14:25 | access to property Prop | C4<System.Int32>.get_Prop() |
| ViableCallable.cs:14:19:14:25 | access to property Prop | C4`1.get_Prop() |
| ViableCallable.cs:14:19:14:25 | access to property Prop | C5.get_Prop() |
| ViableCallable.cs:14:19:14:25 | access to property Prop | C6<System.Boolean,System.Byte>.get_Prop() |
| ViableCallable.cs:14:19:14:25 | access to property Prop | C6<System.Int32[],System.Boolean>.get_Prop() |
| ViableCallable.cs:14:19:14:25 | access to property Prop | C6<System.String,System.Boolean>.get_Prop() |
| ViableCallable.cs:14:19:14:25 | access to property Prop | C6<System.String,System.Decimal>.get_Prop() |
| ViableCallable.cs:14:19:14:25 | access to property Prop | C6<System.String,System.Int32>.get_Prop() |
| ViableCallable.cs:14:19:14:25 | access to property Prop | C6<T1,System.Boolean>.get_Prop() |
| ViableCallable.cs:14:19:14:25 | access to property Prop | C6<T1,System.Byte>.get_Prop() |
| ViableCallable.cs:14:19:14:25 | access to property Prop | C6`2.get_Prop() |
| ViableCallable.cs:14:19:14:25 | access to property Prop | C7<System.Boolean>.get_Prop() |
| ViableCallable.cs:14:19:14:25 | access to property Prop | C7`1.get_Prop() |
| ViableCallable.cs:16:9:16:23 | access to indexer | C2<System.Boolean>.set_Item(bool, string) |
| ViableCallable.cs:16:9:16:23 | access to indexer | C2<System.Decimal>.set_Item(decimal, string) |
| ViableCallable.cs:16:9:16:23 | access to indexer | C2<System.Int32>.set_Item(int, string) |
| ViableCallable.cs:16:9:16:23 | access to indexer | C2`1.set_Item(T, string) |
| ViableCallable.cs:16:9:16:23 | access to indexer | C3.set_Item(decimal, string) |
| ViableCallable.cs:16:9:16:23 | access to indexer | C4<System.Int32>.set_Item(bool, Int32[]) |
| ViableCallable.cs:16:9:16:23 | access to indexer | C4`1.set_Item(bool, T[]) |
| ViableCallable.cs:16:9:16:23 | access to indexer | C5.set_Item(bool, string) |
| ViableCallable.cs:16:9:16:23 | access to indexer | C6<System.Boolean,System.Byte>.set_Item(byte, bool) |
| ViableCallable.cs:16:9:16:23 | access to indexer | C6<System.Int32[],System.Boolean>.set_Item(bool, Int32[]) |
| ViableCallable.cs:16:9:16:23 | access to indexer | C6<System.String,System.Boolean>.set_Item(bool, string) |
| ViableCallable.cs:16:9:16:23 | access to indexer | C6<System.String,System.Decimal>.set_Item(decimal, string) |
| ViableCallable.cs:16:9:16:23 | access to indexer | C6<System.String,System.Int32>.set_Item(int, string) |
| ViableCallable.cs:16:9:16:23 | access to indexer | C6<T1,System.Boolean>.set_Item(bool, T1) |
| ViableCallable.cs:16:9:16:23 | access to indexer | C6<T1,System.Byte>.set_Item(byte, T1) |
| ViableCallable.cs:16:9:16:23 | access to indexer | C6`2.set_Item(T2, T1) |
| ViableCallable.cs:16:9:16:23 | access to indexer | C7<System.Boolean>.set_Item(byte, bool) |
| ViableCallable.cs:16:9:16:23 | access to indexer | C7`1.set_Item(byte, T1) |
| ViableCallable.cs:16:27:16:41 | access to indexer | C2<System.Boolean>.get_Item(bool) |
| ViableCallable.cs:16:27:16:41 | access to indexer | C2<System.Decimal>.get_Item(decimal) |
| ViableCallable.cs:16:27:16:41 | access to indexer | C2<System.Int32>.get_Item(int) |
| ViableCallable.cs:16:27:16:41 | access to indexer | C2`1.get_Item(T) |
| ViableCallable.cs:16:27:16:41 | access to indexer | C3.get_Item(decimal) |
| ViableCallable.cs:16:27:16:41 | access to indexer | C4<System.Int32>.get_Item(bool) |
| ViableCallable.cs:16:27:16:41 | access to indexer | C4`1.get_Item(bool) |
| ViableCallable.cs:16:27:16:41 | access to indexer | C5.get_Item(bool) |
| ViableCallable.cs:16:27:16:41 | access to indexer | C6<System.Boolean,System.Byte>.get_Item(byte) |
| ViableCallable.cs:16:27:16:41 | access to indexer | C6<System.Int32[],System.Boolean>.get_Item(bool) |
| ViableCallable.cs:16:27:16:41 | access to indexer | C6<System.String,System.Boolean>.get_Item(bool) |
| ViableCallable.cs:16:27:16:41 | access to indexer | C6<System.String,System.Decimal>.get_Item(decimal) |
| ViableCallable.cs:16:27:16:41 | access to indexer | C6<System.String,System.Int32>.get_Item(int) |
| ViableCallable.cs:16:27:16:41 | access to indexer | C6<T1,System.Boolean>.get_Item(bool) |
| ViableCallable.cs:16:27:16:41 | access to indexer | C6<T1,System.Byte>.get_Item(byte) |
| ViableCallable.cs:16:27:16:41 | access to indexer | C6`2.get_Item(T2) |
| ViableCallable.cs:16:27:16:41 | access to indexer | C7<System.Boolean>.get_Item(byte) |
| ViableCallable.cs:16:27:16:41 | access to indexer | C7`1.get_Item(byte) |
| ViableCallable.cs:18:9:18:16 | access to event Event | C2<System.Boolean>.add_Event(EventHandler<string>) |
| ViableCallable.cs:18:9:18:16 | access to event Event | C2<System.Decimal>.add_Event(EventHandler<string>) |
| ViableCallable.cs:18:9:18:16 | access to event Event | C2<System.Int32>.add_Event(EventHandler<string>) |
| ViableCallable.cs:18:9:18:16 | access to event Event | C2`1.add_Event(EventHandler<string>) |
| ViableCallable.cs:18:9:18:16 | access to event Event | C3.add_Event(EventHandler<string>) |
| ViableCallable.cs:18:9:18:16 | access to event Event | C4<System.Int32>.add_Event(EventHandler<Int32[]>) |
| ViableCallable.cs:18:9:18:16 | access to event Event | C4`1.add_Event(EventHandler<T[]>) |
| ViableCallable.cs:18:9:18:16 | access to event Event | C5.add_Event(EventHandler<string>) |
| ViableCallable.cs:18:9:18:16 | access to event Event | C6<System.Boolean,System.Byte>.add_Event(EventHandler<bool>) |
| ViableCallable.cs:18:9:18:16 | access to event Event | C6<System.Int32[],System.Boolean>.add_Event(EventHandler<Int32[]>) |
| ViableCallable.cs:18:9:18:16 | access to event Event | C6<System.String,System.Boolean>.add_Event(EventHandler<string>) |
| ViableCallable.cs:18:9:18:16 | access to event Event | C6<System.String,System.Decimal>.add_Event(EventHandler<string>) |
| ViableCallable.cs:18:9:18:16 | access to event Event | C6<System.String,System.Int32>.add_Event(EventHandler<string>) |
| ViableCallable.cs:18:9:18:16 | access to event Event | C6<T1,System.Boolean>.add_Event(EventHandler<T1>) |
| ViableCallable.cs:18:9:18:16 | access to event Event | C6<T1,System.Byte>.add_Event(EventHandler<T1>) |
| ViableCallable.cs:18:9:18:16 | access to event Event | C6`2.add_Event(EventHandler<T1>) |
| ViableCallable.cs:18:9:18:16 | access to event Event | C7<System.Boolean>.add_Event(EventHandler<bool>) |
| ViableCallable.cs:18:9:18:16 | access to event Event | C7`1.add_Event(EventHandler<T1>) |
| ViableCallable.cs:19:9:19:16 | access to event Event | C2<System.Boolean>.remove_Event(EventHandler<string>) |
| ViableCallable.cs:19:9:19:16 | access to event Event | C2<System.Decimal>.remove_Event(EventHandler<string>) |
| ViableCallable.cs:19:9:19:16 | access to event Event | C2<System.Int32>.remove_Event(EventHandler<string>) |
| ViableCallable.cs:19:9:19:16 | access to event Event | C2`1.remove_Event(EventHandler<string>) |
| ViableCallable.cs:19:9:19:16 | access to event Event | C3.remove_Event(EventHandler<string>) |
| ViableCallable.cs:19:9:19:16 | access to event Event | C4<System.Int32>.remove_Event(EventHandler<Int32[]>) |
| ViableCallable.cs:19:9:19:16 | access to event Event | C4`1.remove_Event(EventHandler<T[]>) |
| ViableCallable.cs:19:9:19:16 | access to event Event | C5.remove_Event(EventHandler<string>) |
| ViableCallable.cs:19:9:19:16 | access to event Event | C6<System.Boolean,System.Byte>.remove_Event(EventHandler<bool>) |
| ViableCallable.cs:19:9:19:16 | access to event Event | C6<System.Int32[],System.Boolean>.remove_Event(EventHandler<Int32[]>) |
| ViableCallable.cs:19:9:19:16 | access to event Event | C6<System.String,System.Boolean>.remove_Event(EventHandler<string>) |
| ViableCallable.cs:19:9:19:16 | access to event Event | C6<System.String,System.Decimal>.remove_Event(EventHandler<string>) |
| ViableCallable.cs:19:9:19:16 | access to event Event | C6<System.String,System.Int32>.remove_Event(EventHandler<string>) |
| ViableCallable.cs:19:9:19:16 | access to event Event | C6<T1,System.Boolean>.remove_Event(EventHandler<T1>) |
| ViableCallable.cs:19:9:19:16 | access to event Event | C6<T1,System.Byte>.remove_Event(EventHandler<T1>) |
| ViableCallable.cs:19:9:19:16 | access to event Event | C6`2.remove_Event(EventHandler<T1>) |
| ViableCallable.cs:19:9:19:16 | access to event Event | C7<System.Boolean>.remove_Event(EventHandler<bool>) |
| ViableCallable.cs:19:9:19:16 | access to event Event | C7`1.remove_Event(EventHandler<T1>) |
| ViableCallable.cs:22:9:22:30 | call to method M<Boolean> | C4<System.Int32>.M<T3>(Int32[], T3) |
| ViableCallable.cs:22:9:22:30 | call to method M<Boolean> | C4`1.M<T3>(T[], T3) |
| ViableCallable.cs:22:9:22:30 | call to method M<Boolean> | C6<System.Int32[],System.Boolean>.M<T3>(Int32[], T3) |
| ViableCallable.cs:24:9:24:15 | access to property Prop | C4<System.Int32>.set_Prop(Int32[]) |
| ViableCallable.cs:24:9:24:15 | access to property Prop | C4`1.set_Prop(T[]) |
| ViableCallable.cs:24:9:24:15 | access to property Prop | C6<System.Int32[],System.Boolean>.set_Prop(Int32[]) |
| ViableCallable.cs:24:19:24:25 | access to property Prop | C4<System.Int32>.get_Prop() |
| ViableCallable.cs:24:19:24:25 | access to property Prop | C4`1.get_Prop() |
| ViableCallable.cs:24:19:24:25 | access to property Prop | C6<System.Int32[],System.Boolean>.get_Prop() |
| ViableCallable.cs:26:9:26:23 | access to indexer | C4<System.Int32>.set_Item(bool, Int32[]) |
| ViableCallable.cs:26:9:26:23 | access to indexer | C4`1.set_Item(bool, T[]) |
| ViableCallable.cs:26:9:26:23 | access to indexer | C6<System.Int32[],System.Boolean>.set_Item(bool, Int32[]) |
| ViableCallable.cs:26:27:26:41 | access to indexer | C4<System.Int32>.get_Item(bool) |
| ViableCallable.cs:26:27:26:41 | access to indexer | C4`1.get_Item(bool) |
| ViableCallable.cs:26:27:26:41 | access to indexer | C6<System.Int32[],System.Boolean>.get_Item(bool) |
| ViableCallable.cs:28:9:28:16 | access to event Event | C4<System.Int32>.add_Event(EventHandler<Int32[]>) |
| ViableCallable.cs:28:9:28:16 | access to event Event | C4`1.add_Event(EventHandler<T[]>) |
| ViableCallable.cs:28:9:28:16 | access to event Event | C6<System.Int32[],System.Boolean>.add_Event(EventHandler<Int32[]>) |
| ViableCallable.cs:29:9:29:16 | access to event Event | C4<System.Int32>.remove_Event(EventHandler<Int32[]>) |
| ViableCallable.cs:29:9:29:16 | access to event Event | C4`1.remove_Event(EventHandler<T[]>) |
| ViableCallable.cs:29:9:29:16 | access to event Event | C6<System.Int32[],System.Boolean>.remove_Event(EventHandler<Int32[]>) |
| ViableCallable.cs:32:30:32:52 | call to method Mock<C1<String,Int32>> | ViableCallable.Mock<C1<string, int>>() |
| ViableCallable.cs:33:9:33:23 | call to method M<Int32> | C2<System.Int32>.M<T3>(string, T3) |
| ViableCallable.cs:33:9:33:23 | call to method M<Int32> | C6<System.String,System.Int32>.M<T3>(string, T3) |
| ViableCallable.cs:35:9:35:15 | access to property Prop | C2<System.Int32>.set_Prop(string) |
| ViableCallable.cs:35:9:35:15 | access to property Prop | C6<System.String,System.Int32>.set_Prop(string) |
| ViableCallable.cs:35:19:35:25 | access to property Prop | C2<System.Int32>.get_Prop() |
| ViableCallable.cs:35:19:35:25 | access to property Prop | C6<System.String,System.Int32>.get_Prop() |
| ViableCallable.cs:37:9:37:13 | access to indexer | C2<System.Int32>.set_Item(int, string) |
| ViableCallable.cs:37:9:37:13 | access to indexer | C6<System.String,System.Int32>.set_Item(int, string) |
| ViableCallable.cs:37:17:37:21 | access to indexer | C2<System.Int32>.get_Item(int) |
| ViableCallable.cs:37:17:37:21 | access to indexer | C6<System.String,System.Int32>.get_Item(int) |
| ViableCallable.cs:39:9:39:16 | access to event Event | C2<System.Int32>.add_Event(EventHandler<string>) |
| ViableCallable.cs:39:9:39:16 | access to event Event | C6<System.String,System.Int32>.add_Event(EventHandler<string>) |
| ViableCallable.cs:40:9:40:16 | access to event Event | C2<System.Int32>.remove_Event(EventHandler<string>) |
| ViableCallable.cs:40:9:40:16 | access to event Event | C6<System.String,System.Int32>.remove_Event(EventHandler<string>) |
| ViableCallable.cs:43:34:43:60 | call to method Mock<C1<String,Decimal>> | ViableCallable.Mock<C1<string, decimal>>() |
| ViableCallable.cs:44:9:44:24 | call to method M<Double> | C2<System.Decimal>.M<T3>(string, T3) |
| ViableCallable.cs:44:9:44:24 | call to method M<Double> | C3.M<T3>(string, T3) |
| ViableCallable.cs:44:9:44:24 | call to method M<Double> | C6<System.String,System.Decimal>.M<T3>(string, T3) |
| ViableCallable.cs:46:9:46:15 | access to property Prop | C2<System.Decimal>.set_Prop(string) |
| ViableCallable.cs:46:9:46:15 | access to property Prop | C3.set_Prop(string) |
| ViableCallable.cs:46:9:46:15 | access to property Prop | C6<System.String,System.Decimal>.set_Prop(string) |
| ViableCallable.cs:46:19:46:25 | access to property Prop | C2<System.Decimal>.get_Prop() |
| ViableCallable.cs:46:19:46:25 | access to property Prop | C3.get_Prop() |
| ViableCallable.cs:46:19:46:25 | access to property Prop | C6<System.String,System.Decimal>.get_Prop() |
| ViableCallable.cs:48:9:48:14 | access to indexer | C2<System.Decimal>.set_Item(decimal, string) |
| ViableCallable.cs:48:9:48:14 | access to indexer | C3.set_Item(decimal, string) |
| ViableCallable.cs:48:9:48:14 | access to indexer | C6<System.String,System.Decimal>.set_Item(decimal, string) |
| ViableCallable.cs:48:18:48:23 | access to indexer | C2<System.Decimal>.get_Item(decimal) |
| ViableCallable.cs:48:18:48:23 | access to indexer | C3.get_Item(decimal) |
| ViableCallable.cs:48:18:48:23 | access to indexer | C6<System.String,System.Decimal>.get_Item(decimal) |
| ViableCallable.cs:50:9:50:16 | access to event Event | C2<System.Decimal>.add_Event(EventHandler<string>) |
| ViableCallable.cs:50:9:50:16 | access to event Event | C3.add_Event(EventHandler<string>) |
| ViableCallable.cs:50:9:50:16 | access to event Event | C6<System.String,System.Decimal>.add_Event(EventHandler<string>) |
| ViableCallable.cs:51:9:51:16 | access to event Event | C2<System.Decimal>.remove_Event(EventHandler<string>) |
| ViableCallable.cs:51:9:51:16 | access to event Event | C3.remove_Event(EventHandler<string>) |
| ViableCallable.cs:51:9:51:16 | access to event Event | C6<System.String,System.Decimal>.remove_Event(EventHandler<string>) |
| ViableCallable.cs:54:30:54:52 | call to method Mock<C1<Int32[],Boolean>> | ViableCallable.Mock<C1<Int32[], bool>>() |
| ViableCallable.cs:55:9:55:44 | call to method M<Object> | C4<System.Int32>.M<T3>(Int32[], T3) |
| ViableCallable.cs:55:9:55:44 | call to method M<Object> | C6<System.Int32[],System.Boolean>.M<T3>(Int32[], T3) |
| ViableCallable.cs:57:9:57:15 | access to property Prop | C4<System.Int32>.set_Prop(Int32[]) |
| ViableCallable.cs:57:9:57:15 | access to property Prop | C6<System.Int32[],System.Boolean>.set_Prop(Int32[]) |
| ViableCallable.cs:57:19:57:25 | access to property Prop | C4<System.Int32>.get_Prop() |
| ViableCallable.cs:57:19:57:25 | access to property Prop | C6<System.Int32[],System.Boolean>.get_Prop() |
| ViableCallable.cs:59:9:59:17 | access to indexer | C4<System.Int32>.set_Item(bool, Int32[]) |
| ViableCallable.cs:59:9:59:17 | access to indexer | C6<System.Int32[],System.Boolean>.set_Item(bool, Int32[]) |
| ViableCallable.cs:59:21:59:29 | access to indexer | C4<System.Int32>.get_Item(bool) |
| ViableCallable.cs:59:21:59:29 | access to indexer | C6<System.Int32[],System.Boolean>.get_Item(bool) |
| ViableCallable.cs:61:9:61:16 | access to event Event | C4<System.Int32>.add_Event(EventHandler<Int32[]>) |
| ViableCallable.cs:61:9:61:16 | access to event Event | C6<System.Int32[],System.Boolean>.add_Event(EventHandler<Int32[]>) |
| ViableCallable.cs:62:9:62:16 | access to event Event | C4<System.Int32>.remove_Event(EventHandler<Int32[]>) |
| ViableCallable.cs:62:9:62:16 | access to event Event | C6<System.Int32[],System.Boolean>.remove_Event(EventHandler<Int32[]>) |
| ViableCallable.cs:65:31:65:54 | call to method Mock<C1<String,Boolean>> | ViableCallable.Mock<C1<string, bool>>() |
| ViableCallable.cs:66:9:66:30 | call to method M<Object> | C2<System.Boolean>.M<T3>(string, T3) |
| ViableCallable.cs:66:9:66:30 | call to method M<Object> | C5.M<T3>(string, T3) |
| ViableCallable.cs:66:9:66:30 | call to method M<Object> | C6<System.String,System.Boolean>.M<T3>(string, T3) |
| ViableCallable.cs:68:9:68:15 | access to property Prop | C2<System.Boolean>.set_Prop(string) |
| ViableCallable.cs:68:9:68:15 | access to property Prop | C5.set_Prop(string) |
| ViableCallable.cs:68:9:68:15 | access to property Prop | C6<System.String,System.Boolean>.set_Prop(string) |
| ViableCallable.cs:68:19:68:25 | access to property Prop | C2<System.Boolean>.get_Prop() |
| ViableCallable.cs:68:19:68:25 | access to property Prop | C5.get_Prop() |
| ViableCallable.cs:68:19:68:25 | access to property Prop | C6<System.String,System.Boolean>.get_Prop() |
| ViableCallable.cs:70:9:70:17 | access to indexer | C2<System.Boolean>.set_Item(bool, string) |
| ViableCallable.cs:70:9:70:17 | access to indexer | C5.set_Item(bool, string) |
| ViableCallable.cs:70:9:70:17 | access to indexer | C6<System.String,System.Boolean>.set_Item(bool, string) |
| ViableCallable.cs:70:21:70:29 | access to indexer | C2<System.Boolean>.get_Item(bool) |
| ViableCallable.cs:70:21:70:29 | access to indexer | C5.get_Item(bool) |
| ViableCallable.cs:70:21:70:29 | access to indexer | C6<System.String,System.Boolean>.get_Item(bool) |
| ViableCallable.cs:72:9:72:16 | access to event Event | C2<System.Boolean>.add_Event(EventHandler<string>) |
| ViableCallable.cs:72:9:72:16 | access to event Event | C5.add_Event(EventHandler<string>) |
| ViableCallable.cs:72:9:72:16 | access to event Event | C6<System.String,System.Boolean>.add_Event(EventHandler<string>) |
| ViableCallable.cs:73:9:73:16 | access to event Event | C2<System.Boolean>.remove_Event(EventHandler<string>) |
| ViableCallable.cs:73:9:73:16 | access to event Event | C5.remove_Event(EventHandler<string>) |
| ViableCallable.cs:73:9:73:16 | access to event Event | C6<System.String,System.Boolean>.remove_Event(EventHandler<string>) |
| ViableCallable.cs:77:9:77:29 | call to method M<String> | C6<T1,System.Boolean>.M<T3>(T1, T3) |
| ViableCallable.cs:79:9:79:15 | access to property Prop | C6<T1,System.Boolean>.set_Prop(T1) |
| ViableCallable.cs:79:19:79:25 | access to property Prop | C6<T1,System.Boolean>.get_Prop() |
| ViableCallable.cs:81:9:81:17 | access to indexer | C6<T1,System.Boolean>.set_Item(bool, T1) |
| ViableCallable.cs:81:21:81:29 | access to indexer | C6<T1,System.Boolean>.get_Item(bool) |
| ViableCallable.cs:83:9:83:16 | access to event Event | C6<T1,System.Boolean>.add_Event(EventHandler<T1>) |
| ViableCallable.cs:84:9:84:16 | access to event Event | C6<T1,System.Boolean>.remove_Event(EventHandler<T1>) |
| ViableCallable.cs:87:21:87:30 | call to method Mock<C8> | ViableCallable.Mock<C8>() |
| ViableCallable.cs:88:9:88:44 | dynamic call to method M | C8.M(IEnumerable<C1<String[], bool>>) |
| ViableCallable.cs:88:9:88:44 | dynamic call to method M | C9`1.M(IEnumerable<C1<String[], bool>>) |
| ViableCallable.cs:88:13:88:43 | call to method Mock<IEnumerable<C4<String>>> | ViableCallable.Mock<IEnumerable<C4<string>>>() |
| ViableCallable.cs:90:9:90:15 | dynamic access to member Prop1 | C8.set_Prop1(string) |
| ViableCallable.cs:90:9:90:15 | dynamic access to member Prop1 | C9`1.set_Prop1(string) |
| ViableCallable.cs:90:19:90:25 | dynamic access to member Prop1 | C8.get_Prop1() |
| ViableCallable.cs:90:19:90:25 | dynamic access to member Prop1 | C9`1.get_Prop1() |
| ViableCallable.cs:92:9:92:12 | dynamic access to element | C8.set_Item(int, string) |
| ViableCallable.cs:92:9:92:12 | dynamic access to element | C9`1.set_Item(int, string) |
| ViableCallable.cs:92:16:92:19 | dynamic access to element | C8.get_Item(int) |
| ViableCallable.cs:92:16:92:19 | dynamic access to element | C9`1.get_Item(int) |
| ViableCallable.cs:95:13:95:40 | call to method Mock<IEnumerable<C4<Int32>>> | ViableCallable.Mock<IEnumerable<C4<int>>>() |
| ViableCallable.cs:99:9:99:15 | dynamic call to method M | C5.M(int) |
| ViableCallable.cs:102:9:102:16 | access to property Prop2 | C5.set_Prop2(string) |
| ViableCallable.cs:105:9:105:17 | access to event Event2 | C5.add_Event2(EventHandler<string>) |
| ViableCallable.cs:106:9:106:17 | access to event Event2 | C5.remove_Event2(EventHandler<string>) |
| ViableCallable.cs:120:9:120:25 | dynamic call to method M2 | C8.M2<decimal>(Decimal[]) |
| ViableCallable.cs:124:9:124:24 | dynamic call to method M2 | C8.M2<string>(String[]) |
| ViableCallable.cs:132:9:132:28 | dynamic call to method M | C6<System.Boolean,System.Byte>.M<T3>(bool, T3) |
| ViableCallable.cs:132:9:132:28 | dynamic call to method M | C6<T1,System.Byte>.M<T3>(T1, T3) |
| ViableCallable.cs:134:9:134:14 | dynamic access to member Prop | C6<System.Boolean,System.Byte>.set_Prop(bool) |
| ViableCallable.cs:134:9:134:14 | dynamic access to member Prop | C6<T1,System.Byte>.set_Prop(T1) |
| ViableCallable.cs:134:18:134:23 | dynamic access to member Prop | C6<System.Boolean,System.Byte>.get_Prop() |
| ViableCallable.cs:134:18:134:23 | dynamic access to member Prop | C6<T1,System.Byte>.get_Prop() |
| ViableCallable.cs:136:9:136:18 | dynamic access to element | C6<System.Boolean,System.Byte>.set_Item(byte, bool) |
| ViableCallable.cs:136:9:136:18 | dynamic access to element | C6<T1,System.Byte>.set_Item(byte, T1) |
| ViableCallable.cs:136:22:136:31 | dynamic access to element | C6<System.Boolean,System.Byte>.get_Item(byte) |
| ViableCallable.cs:136:22:136:31 | dynamic access to element | C6<T1,System.Byte>.get_Item(byte) |
| ViableCallable.cs:138:9:138:52 | ... += ... | C6<T1,System.Byte>.add_Event(EventHandler<T1>) |
| ViableCallable.cs:139:9:139:52 | ... -= ... | C6<T1,System.Byte>.remove_Event(EventHandler<T1>) |
| ViableCallable.cs:142:13:142:22 | call to method Mock<C8> | ViableCallable.Mock<C8>() |
| ViableCallable.cs:143:9:143:14 | dynamic call to method M3 | C8.M3(params Double[]) |
| ViableCallable.cs:143:9:143:14 | dynamic call to method M3 | C9`1.M3(params T[]) |
| ViableCallable.cs:144:9:144:15 | dynamic call to method M3 | C8.M3(params Double[]) |
| ViableCallable.cs:144:9:144:15 | dynamic call to method M3 | C9`1.M3(params T[]) |
| ViableCallable.cs:145:9:145:20 | dynamic call to method M3 | C8.M3(params Double[]) |
| ViableCallable.cs:145:9:145:20 | dynamic call to method M3 | C9`1.M3(params T[]) |
| ViableCallable.cs:148:13:148:22 | call to method Mock<C8> | ViableCallable.Mock<C8>() |
| ViableCallable.cs:149:9:149:14 | dynamic call to method M5 | C8.M5(params IEnumerable<double>) |
| ViableCallable.cs:149:9:149:14 | dynamic call to method M5 | C9`1.M5(params IEnumerable<T>) |
| ViableCallable.cs:150:9:150:15 | dynamic call to method M5 | C8.M5(params IEnumerable<double>) |
| ViableCallable.cs:150:9:150:15 | dynamic call to method M5 | C9`1.M5(params IEnumerable<T>) |
| ViableCallable.cs:151:9:151:20 | dynamic call to method M5 | C8.M5(params IEnumerable<double>) |
| ViableCallable.cs:151:9:151:20 | dynamic call to method M5 | C9`1.M5(params IEnumerable<T>) |
| ViableCallable.cs:154:9:154:16 | dynamic call to method M3 | C8.M3(params Double[]) |
| ViableCallable.cs:154:9:154:16 | dynamic call to method M3 | C9`1.M3(params T[]) |
| ViableCallable.cs:154:9:154:16 | dynamic call to method M3 | C10.M3(params Double[]) |
| ViableCallable.cs:154:9:154:16 | dynamic call to method M3 | Test.MainClass+ImplAlpha.M3() |
| ViableCallable.cs:154:9:154:16 | dynamic call to method M3 | Test.MainClass+SecondLevelImpl.M3() |
| ViableCallable.cs:155:9:155:17 | dynamic call to method M3 | C8.M3(params Double[]) |
| ViableCallable.cs:155:9:155:17 | dynamic call to method M3 | C9`1.M3(params T[]) |
| ViableCallable.cs:155:9:155:17 | dynamic call to method M3 | C10.M3(params Double[]) |
| ViableCallable.cs:156:9:156:22 | dynamic call to method M3 | C8.M3(params Double[]) |
| ViableCallable.cs:156:9:156:22 | dynamic call to method M3 | C9`1.M3(params T[]) |
| ViableCallable.cs:156:9:156:22 | dynamic call to method M3 | C10.M3(params Double[]) |
| ViableCallable.cs:158:9:158:16 | dynamic call to method M5 | C8.M5(params IEnumerable<double>) |
| ViableCallable.cs:158:9:158:16 | dynamic call to method M5 | C9`1.M5(params IEnumerable<T>) |
| ViableCallable.cs:158:9:158:16 | dynamic call to method M5 | C10.M5(params IEnumerable<double>) |
| ViableCallable.cs:159:9:159:17 | dynamic call to method M5 | C8.M5(params IEnumerable<double>) |
| ViableCallable.cs:159:9:159:17 | dynamic call to method M5 | C9`1.M5(params IEnumerable<T>) |
| ViableCallable.cs:159:9:159:17 | dynamic call to method M5 | C10.M5(params IEnumerable<double>) |
| ViableCallable.cs:160:9:160:22 | dynamic call to method M5 | C8.M5(params IEnumerable<double>) |
| ViableCallable.cs:160:9:160:22 | dynamic call to method M5 | C9`1.M5(params IEnumerable<T>) |
| ViableCallable.cs:160:9:160:22 | dynamic call to method M5 | C10.M5(params IEnumerable<double>) |
| ViableCallable.cs:162:9:162:17 | dynamic access to member Prop1 | C8.set_Prop1(string) |
| ViableCallable.cs:162:9:162:17 | dynamic access to member Prop1 | C9`1.set_Prop1(string) |
| ViableCallable.cs:162:9:162:17 | dynamic access to member Prop1 | C10.set_Prop1(bool) |
| ViableCallable.cs:162:21:162:29 | dynamic access to member Prop1 | C8.get_Prop1() |
| ViableCallable.cs:162:21:162:29 | dynamic access to member Prop1 | C9`1.get_Prop1() |
| ViableCallable.cs:162:21:162:29 | dynamic access to member Prop1 | C10.get_Prop1() |
| ViableCallable.cs:164:9:164:14 | dynamic access to element | C2<System.Decimal>.set_Item(decimal, string) |
| ViableCallable.cs:164:9:164:14 | dynamic access to element | C2<System.Int32>.set_Item(int, string) |
| ViableCallable.cs:164:9:164:14 | dynamic access to element | C2`1.set_Item(T, string) |
| ViableCallable.cs:164:9:164:14 | dynamic access to element | C3.set_Item(decimal, string) |
| ViableCallable.cs:164:9:164:14 | dynamic access to element | C6<System.Boolean,System.Byte>.set_Item(byte, bool) |
| ViableCallable.cs:164:9:164:14 | dynamic access to element | C6<System.String,System.Decimal>.set_Item(decimal, string) |
| ViableCallable.cs:164:9:164:14 | dynamic access to element | C6<System.String,System.Int32>.set_Item(int, string) |
| ViableCallable.cs:164:9:164:14 | dynamic access to element | C6<T1,System.Byte>.set_Item(byte, T1) |
| ViableCallable.cs:164:9:164:14 | dynamic access to element | C6`2.set_Item(T2, T1) |
| ViableCallable.cs:164:9:164:14 | dynamic access to element | C7<System.Boolean>.set_Item(byte, bool) |
| ViableCallable.cs:164:9:164:14 | dynamic access to element | C7`1.set_Item(byte, T1) |
| ViableCallable.cs:164:9:164:14 | dynamic access to element | C8.set_Item(int, string) |
| ViableCallable.cs:164:9:164:14 | dynamic access to element | C9`1.set_Item(int, string) |
| ViableCallable.cs:164:9:164:14 | dynamic access to element | C10.set_Item(int, bool) |
| ViableCallable.cs:164:18:164:23 | dynamic access to element | C2<System.Decimal>.get_Item(decimal) |
| ViableCallable.cs:164:18:164:23 | dynamic access to element | C2<System.Int32>.get_Item(int) |
| ViableCallable.cs:164:18:164:23 | dynamic access to element | C2`1.get_Item(T) |
| ViableCallable.cs:164:18:164:23 | dynamic access to element | C3.get_Item(decimal) |
| ViableCallable.cs:164:18:164:23 | dynamic access to element | C6<System.Boolean,System.Byte>.get_Item(byte) |
| ViableCallable.cs:164:18:164:23 | dynamic access to element | C6<System.String,System.Decimal>.get_Item(decimal) |
| ViableCallable.cs:164:18:164:23 | dynamic access to element | C6<System.String,System.Int32>.get_Item(int) |
| ViableCallable.cs:164:18:164:23 | dynamic access to element | C6<T1,System.Byte>.get_Item(byte) |
| ViableCallable.cs:164:18:164:23 | dynamic access to element | C6`2.get_Item(T2) |
| ViableCallable.cs:164:18:164:23 | dynamic access to element | C7<System.Boolean>.get_Item(byte) |
| ViableCallable.cs:164:18:164:23 | dynamic access to element | C7`1.get_Item(byte) |
| ViableCallable.cs:164:18:164:23 | dynamic access to element | C8.get_Item(int) |
| ViableCallable.cs:164:18:164:23 | dynamic access to element | C9`1.get_Item(int) |
| ViableCallable.cs:164:18:164:23 | dynamic access to element | C10.get_Item(int) |
| ViableCallable.cs:166:9:166:54 | ... += ... | C2<System.Boolean>.add_Event(EventHandler<string>) |
| ViableCallable.cs:166:9:166:54 | ... += ... | C2<System.Decimal>.add_Event(EventHandler<string>) |
| ViableCallable.cs:166:9:166:54 | ... += ... | C2<System.Int32>.add_Event(EventHandler<string>) |
| ViableCallable.cs:166:9:166:54 | ... += ... | C2`1.add_Event(EventHandler<string>) |
| ViableCallable.cs:166:9:166:54 | ... += ... | C3.add_Event(EventHandler<string>) |
| ViableCallable.cs:166:9:166:54 | ... += ... | C5.add_Event(EventHandler<string>) |
| ViableCallable.cs:166:9:166:54 | ... += ... | C6<System.String,System.Boolean>.add_Event(EventHandler<string>) |
| ViableCallable.cs:166:9:166:54 | ... += ... | C6<System.String,System.Decimal>.add_Event(EventHandler<string>) |
| ViableCallable.cs:166:9:166:54 | ... += ... | C6<System.String,System.Int32>.add_Event(EventHandler<string>) |
| ViableCallable.cs:166:9:166:54 | ... += ... | C6<T1,System.Boolean>.add_Event(EventHandler<T1>) |
| ViableCallable.cs:166:9:166:54 | ... += ... | C6<T1,System.Byte>.add_Event(EventHandler<T1>) |
| ViableCallable.cs:166:9:166:54 | ... += ... | C6`2.add_Event(EventHandler<T1>) |
| ViableCallable.cs:166:9:166:54 | ... += ... | C7`1.add_Event(EventHandler<T1>) |
| ViableCallable.cs:166:9:166:54 | ... += ... | C8.add_Event(EventHandler<string>) |
| ViableCallable.cs:166:9:166:54 | ... += ... | C9`1.add_Event(EventHandler<string>) |
| ViableCallable.cs:167:9:167:54 | ... -= ... | C2<System.Boolean>.remove_Event(EventHandler<string>) |
| ViableCallable.cs:167:9:167:54 | ... -= ... | C2<System.Decimal>.remove_Event(EventHandler<string>) |
| ViableCallable.cs:167:9:167:54 | ... -= ... | C2<System.Int32>.remove_Event(EventHandler<string>) |
| ViableCallable.cs:167:9:167:54 | ... -= ... | C2`1.remove_Event(EventHandler<string>) |
| ViableCallable.cs:167:9:167:54 | ... -= ... | C3.remove_Event(EventHandler<string>) |
| ViableCallable.cs:167:9:167:54 | ... -= ... | C5.remove_Event(EventHandler<string>) |
| ViableCallable.cs:167:9:167:54 | ... -= ... | C6<System.String,System.Boolean>.remove_Event(EventHandler<string>) |
| ViableCallable.cs:167:9:167:54 | ... -= ... | C6<System.String,System.Decimal>.remove_Event(EventHandler<string>) |
| ViableCallable.cs:167:9:167:54 | ... -= ... | C6<System.String,System.Int32>.remove_Event(EventHandler<string>) |
| ViableCallable.cs:167:9:167:54 | ... -= ... | C6<T1,System.Boolean>.remove_Event(EventHandler<T1>) |
| ViableCallable.cs:167:9:167:54 | ... -= ... | C6<T1,System.Byte>.remove_Event(EventHandler<T1>) |
| ViableCallable.cs:167:9:167:54 | ... -= ... | C6`2.remove_Event(EventHandler<T1>) |
| ViableCallable.cs:167:9:167:54 | ... -= ... | C7`1.remove_Event(EventHandler<T1>) |
| ViableCallable.cs:167:9:167:54 | ... -= ... | C8.remove_Event(EventHandler<string>) |
| ViableCallable.cs:167:9:167:54 | ... -= ... | C9`1.remove_Event(EventHandler<string>) |
| ViableCallable.cs:170:9:170:40 | dynamic call to method M4 | C8.M4(byte, IEnumerable<string>) |
| ViableCallable.cs:170:19:170:39 | call to method Mock<IList<String>> | ViableCallable.Mock<IList<string>>() |
| ViableCallable.cs:171:9:171:38 | dynamic call to method M4 | C8.M4(byte, IEnumerable<string>) |
| ViableCallable.cs:174:9:174:17 | dynamic access to member Prop1 | C10.set_Prop1(bool) |
| ViableCallable.cs:184:9:184:15 | dynamic access to element | C2`1.set_Item(T, string) |
| ViableCallable.cs:184:9:184:15 | dynamic access to element | C6`2.set_Item(T2, T1) |
| ViableCallable.cs:184:19:184:25 | dynamic access to element | C2`1.get_Item(T) |
| ViableCallable.cs:184:19:184:25 | dynamic access to element | C6`2.get_Item(T2) |
| ViableCallable.cs:196:9:196:153 | call to method InvokeMember | C10.+(C10, C10) |
| ViableCallable.cs:199:9:199:143 | call to method InvokeMember | C10.get_Prop3() |
| ViableCallable.cs:200:9:200:149 | call to method InvokeMember | C10.set_Prop3(string) |
| ViableCallable.cs:203:9:203:146 | call to method InvokeMember | C10.get_Item(int) |
| ViableCallable.cs:204:9:204:152 | call to method InvokeMember | C10.set_Item(int, bool) |
| ViableCallable.cs:208:9:208:147 | call to method InvokeMember | C10.add_Event(EventHandler<bool>) |
| ViableCallable.cs:209:9:209:150 | call to method InvokeMember | C10.remove_Event(EventHandler<bool>) |
| ViableCallable.cs:244:9:244:15 | call to method M<Int32> | C2<System.Boolean>.M<T3>(string, T3) |
| ViableCallable.cs:244:9:244:15 | call to method M<Int32> | C2<System.Decimal>.M<T3>(string, T3) |
| ViableCallable.cs:244:9:244:15 | call to method M<Int32> | C2<System.Int32>.M<T3>(string, T3) |
| ViableCallable.cs:244:9:244:15 | call to method M<Int32> | C2`1.M<T3>(string, T3) |
| ViableCallable.cs:244:9:244:15 | call to method M<Int32> | C3.M<T3>(string, T3) |
| ViableCallable.cs:244:9:244:15 | call to method M<Int32> | C4<System.Int32>.M<T3>(Int32[], T3) |
| ViableCallable.cs:244:9:244:15 | call to method M<Int32> | C4`1.M<T3>(T[], T3) |
| ViableCallable.cs:244:9:244:15 | call to method M<Int32> | C5.M<T3>(string, T3) |
| ViableCallable.cs:244:9:244:15 | call to method M<Int32> | C6<System.Boolean,System.Byte>.M<T3>(bool, T3) |
| ViableCallable.cs:244:9:244:15 | call to method M<Int32> | C6<System.Int32[],System.Boolean>.M<T3>(Int32[], T3) |
| ViableCallable.cs:244:9:244:15 | call to method M<Int32> | C6<System.String,System.Boolean>.M<T3>(string, T3) |
| ViableCallable.cs:244:9:244:15 | call to method M<Int32> | C6<System.String,System.Decimal>.M<T3>(string, T3) |
| ViableCallable.cs:244:9:244:15 | call to method M<Int32> | C6<System.String,System.Int32>.M<T3>(string, T3) |
| ViableCallable.cs:244:9:244:15 | call to method M<Int32> | C6<T1,System.Boolean>.M<T3>(T1, T3) |
| ViableCallable.cs:244:9:244:15 | call to method M<Int32> | C6<T1,System.Byte>.M<T3>(T1, T3) |
| ViableCallable.cs:244:9:244:15 | call to method M<Int32> | C6`2.M<T3>(T1, T3) |
| ViableCallable.cs:244:9:244:15 | call to method M<Int32> | C7<System.Boolean>.M<T3>(bool, T3) |
| ViableCallable.cs:244:9:244:15 | call to method M<Int32> | C7`1.M<T3>(T1, T3) |
| ViableCallable.cs:293:9:293:15 | call to method M<Int32> | C6`2.M<T3>(T1, T3) |
| ViableCallable.cs:293:9:293:15 | call to method M<Int32> | C7<System.Boolean>.M<T3>(bool, T3) |
| ViableCallable.cs:293:9:293:15 | call to method M<Int32> | C7`1.M<T3>(T1, T3) |
| ViableCallable.cs:296:9:296:20 | call to method M<Int32> | C6`2.M<T3>(T1, T3) |
| ViableCallable.cs:296:9:296:20 | call to method M<Int32> | C7<System.Boolean>.M<T3>(bool, T3) |
| ViableCallable.cs:296:9:296:20 | call to method M<Int32> | C7`1.M<T3>(T1, T3) |
| ViableCallable.cs:310:9:310:15 | call to method M<Int32> | C7`1.M<T3>(T1, T3) |
| ViableCallable.cs:313:9:313:20 | call to method M<Int32> | C7`1.M<T3>(T1, T3) |
| ViableCallable.cs:316:9:316:20 | call to method M<Int32> | C6<T1,System.Byte>.M<T3>(T1, T3) |
| ViableCallable.cs:366:9:366:14 | dynamic call to method M | C11.M(dynamic) |
| ViableCallable.cs:368:9:368:18 | dynamic object creation of type C11 | C11.C11(C11) |
| ViableCallable.cs:391:9:391:13 | call to method M | C12+C13.M() |
| ViableCallable.cs:396:9:396:14 | call to method Run<T2> | C12.Run<T2>(T2) |
| ViableCallable.cs:401:9:401:23 | call to method Run2<C13> | C12.Run2<C13>(C13) |
| ViableCallable.cs:424:9:424:18 | call to method M<Int32> | C15+A1.M<T1>() |
| ViableCallable.cs:424:9:424:18 | call to method M<Int32> | C15+A4.M<T1>() |
| ViableCallable.cs:424:9:424:18 | call to method M<Int32> | C15+A5.M<T1>() |
| ViableCallable.cs:428:9:428:19 | call to method M<Boolean> | C15+A1.M<T1>() |
| ViableCallable.cs:432:9:432:21 | call to method M<String> | C15+A4.M<T1>() |
| ViableCallable.cs:434:13:434:37 | call to method Mock<A4> | ViableCallable.Mock<A4>() |
| ViableCallable.cs:436:9:436:21 | call to method M<String> | C15+A4.M<T1>() |
| ViableCallable.cs:436:9:436:21 | call to method M<String> | C15+A5.M<T1>() |
| ViableCallable.cs:451:9:451:19 | call to method M1 | C16<System.String,System.Int32>.M1(string) |
| ViableCallable.cs:454:9:454:24 | call to method M2<Int32> | C17.M2<T>(Func<T>) |
| ViableCallable.cs:462:9:462:21 | call to method M2<String> | C17.M2<T>(Func<T>) |
| ViableCallable.cs:468:9:468:30 | call to method M2<T> | C16<T,System.Int32>.M2<T>(Func<T>) |
| ViableCallable.cs:468:9:468:30 | call to method M2<T> | C17.M2<T>(Func<T>) |
| ViableCallable.cs:474:9:474:30 | call to method M2<T> | C16<T,System.Int32>.M2<T>(Func<T>) |
| ViableCallable.cs:474:9:474:30 | call to method M2<T> | C17.M2<T>(Func<T>) |
| ViableCallable.cs:491:9:491:14 | call to method M1 | C18.M1() |
| ViableCallable.cs:494:9:494:14 | call to method M2 | I2.M2() |
| ViableCallable.cs:508:18:508:22 | call to operator + | C19.+(C19, C19) |
| ViableCallable.cs:511:26:511:30 | call to operator checked + | C19.checked +(C19, C19) |
| ViableCallable.cs:514:18:514:23 | call to operator explicit conversion | C19.explicit conversion(C19) |
| ViableCallable.cs:517:26:517:31 | call to operator checked explicit conversion | C19.checked explicit conversion(C19) |
| ViableCallable.cs:558:18:558:22 | call to operator + | C20.+(C20, C20) |
| ViableCallable.cs:561:26:561:30 | call to operator checked + | C20.checked +(C20, C20) |
| ViableCallable.cs:564:18:564:22 | call to operator - | C20.-(C20, C20) |
| ViableCallable.cs:567:26:567:30 | call to operator checked - | I3<T>.checked -(T, T) |
| ViableCallable.cs:570:18:570:22 | call to operator * | I3<T>.*(T, T) |
| ViableCallable.cs:573:26:573:30 | call to operator checked * | I3<T>.checked *(T, T) |
| ViableCallable.cs:576:18:576:22 | call to operator / | C20./(C20, C20) |
| ViableCallable.cs:576:18:576:22 | call to operator / | I3<T>./(T, T) |
| ViableCallable.cs:579:26:579:30 | call to operator checked / | C20.checked /(C20, C20) |
| ViableCallable.cs:579:26:579:30 | call to operator checked / | I3<T>.checked /(T, T) |
| ViableCallable.cs:582:9:582:15 | call to method M11 | C20.M11() |
| ViableCallable.cs:585:9:585:15 | call to method M12 | C20.M12() |
| ViableCallable.cs:585:9:585:15 | call to method M12 | I3<T>.M12() |
| ViableCallable.cs:588:9:588:15 | call to method M13 | I3<T>.M13() |
| ViableCallable.cs:612:9:612:13 | call to method M | C21+A1.M() |
| ViableCallable.cs:618:9:618:13 | call to method M | C21+A1.M() |
| ViableCallable.cs:618:9:618:13 | call to method M | C21+A2.M() |
| ViableCallable.cs:13:9:13:28 | call to method M<Int32> | C2<System.Boolean>.M<T3>(string, T3) |
| ViableCallable.cs:13:9:13:28 | call to method M<Int32> | C2<System.Decimal>.M<T3>(string, T3) |
| ViableCallable.cs:13:9:13:28 | call to method M<Int32> | C2<System.Int32>.M<T3>(string, T3) |
| ViableCallable.cs:13:9:13:28 | call to method M<Int32> | C2`1.M<T3>(string, T3) |
| ViableCallable.cs:13:9:13:28 | call to method M<Int32> | C3.M<T3>(string, T3) |
| ViableCallable.cs:13:9:13:28 | call to method M<Int32> | C4<System.Int32>.M<T3>(Int32[], T3) |
| ViableCallable.cs:13:9:13:28 | call to method M<Int32> | C4`1.M<T3>(T[], T3) |
| ViableCallable.cs:13:9:13:28 | call to method M<Int32> | C5.M<T3>(string, T3) |
| ViableCallable.cs:13:9:13:28 | call to method M<Int32> | C6<System.Boolean,System.Byte>.M<T3>(bool, T3) |
| ViableCallable.cs:13:9:13:28 | call to method M<Int32> | C6<System.Int32[],System.Boolean>.M<T3>(Int32[], T3) |
| ViableCallable.cs:13:9:13:28 | call to method M<Int32> | C6<System.String,System.Boolean>.M<T3>(string, T3) |
| ViableCallable.cs:13:9:13:28 | call to method M<Int32> | C6<System.String,System.Decimal>.M<T3>(string, T3) |
| ViableCallable.cs:13:9:13:28 | call to method M<Int32> | C6<System.String,System.Int32>.M<T3>(string, T3) |
| ViableCallable.cs:13:9:13:28 | call to method M<Int32> | C6<T1,System.Boolean>.M<T3>(T1, T3) |
| ViableCallable.cs:13:9:13:28 | call to method M<Int32> | C6<T1,System.Byte>.M<T3>(T1, T3) |
| ViableCallable.cs:13:9:13:28 | call to method M<Int32> | C6`2.M<T3>(T1, T3) |
| ViableCallable.cs:13:9:13:28 | call to method M<Int32> | C7<System.Boolean>.M<T3>(bool, T3) |
| ViableCallable.cs:13:9:13:28 | call to method M<Int32> | C7`1.M<T3>(T1, T3) |
| ViableCallable.cs:15:9:15:15 | access to property Prop | C2<System.Boolean>.set_Prop(string) |
| ViableCallable.cs:15:9:15:15 | access to property Prop | C2<System.Decimal>.set_Prop(string) |
| ViableCallable.cs:15:9:15:15 | access to property Prop | C2<System.Int32>.set_Prop(string) |
| ViableCallable.cs:15:9:15:15 | access to property Prop | C2`1.set_Prop(string) |
| ViableCallable.cs:15:9:15:15 | access to property Prop | C3.set_Prop(string) |
| ViableCallable.cs:15:9:15:15 | access to property Prop | C4<System.Int32>.set_Prop(Int32[]) |
| ViableCallable.cs:15:9:15:15 | access to property Prop | C4`1.set_Prop(T[]) |
| ViableCallable.cs:15:9:15:15 | access to property Prop | C5.set_Prop(string) |
| ViableCallable.cs:15:9:15:15 | access to property Prop | C6<System.Boolean,System.Byte>.set_Prop(bool) |
| ViableCallable.cs:15:9:15:15 | access to property Prop | C6<System.Int32[],System.Boolean>.set_Prop(Int32[]) |
| ViableCallable.cs:15:9:15:15 | access to property Prop | C6<System.String,System.Boolean>.set_Prop(string) |
| ViableCallable.cs:15:9:15:15 | access to property Prop | C6<System.String,System.Decimal>.set_Prop(string) |
| ViableCallable.cs:15:9:15:15 | access to property Prop | C6<System.String,System.Int32>.set_Prop(string) |
| ViableCallable.cs:15:9:15:15 | access to property Prop | C6<T1,System.Boolean>.set_Prop(T1) |
| ViableCallable.cs:15:9:15:15 | access to property Prop | C6<T1,System.Byte>.set_Prop(T1) |
| ViableCallable.cs:15:9:15:15 | access to property Prop | C6`2.set_Prop(T1) |
| ViableCallable.cs:15:9:15:15 | access to property Prop | C7<System.Boolean>.set_Prop(bool) |
| ViableCallable.cs:15:9:15:15 | access to property Prop | C7`1.set_Prop(T1) |
| ViableCallable.cs:15:19:15:25 | access to property Prop | C2<System.Boolean>.get_Prop() |
| ViableCallable.cs:15:19:15:25 | access to property Prop | C2<System.Decimal>.get_Prop() |
| ViableCallable.cs:15:19:15:25 | access to property Prop | C2<System.Int32>.get_Prop() |
| ViableCallable.cs:15:19:15:25 | access to property Prop | C2`1.get_Prop() |
| ViableCallable.cs:15:19:15:25 | access to property Prop | C3.get_Prop() |
| ViableCallable.cs:15:19:15:25 | access to property Prop | C4<System.Int32>.get_Prop() |
| ViableCallable.cs:15:19:15:25 | access to property Prop | C4`1.get_Prop() |
| ViableCallable.cs:15:19:15:25 | access to property Prop | C5.get_Prop() |
| ViableCallable.cs:15:19:15:25 | access to property Prop | C6<System.Boolean,System.Byte>.get_Prop() |
| ViableCallable.cs:15:19:15:25 | access to property Prop | C6<System.Int32[],System.Boolean>.get_Prop() |
| ViableCallable.cs:15:19:15:25 | access to property Prop | C6<System.String,System.Boolean>.get_Prop() |
| ViableCallable.cs:15:19:15:25 | access to property Prop | C6<System.String,System.Decimal>.get_Prop() |
| ViableCallable.cs:15:19:15:25 | access to property Prop | C6<System.String,System.Int32>.get_Prop() |
| ViableCallable.cs:15:19:15:25 | access to property Prop | C6<T1,System.Boolean>.get_Prop() |
| ViableCallable.cs:15:19:15:25 | access to property Prop | C6<T1,System.Byte>.get_Prop() |
| ViableCallable.cs:15:19:15:25 | access to property Prop | C6`2.get_Prop() |
| ViableCallable.cs:15:19:15:25 | access to property Prop | C7<System.Boolean>.get_Prop() |
| ViableCallable.cs:15:19:15:25 | access to property Prop | C7`1.get_Prop() |
| ViableCallable.cs:17:9:17:23 | access to indexer | C2<System.Boolean>.set_Item(bool, string) |
| ViableCallable.cs:17:9:17:23 | access to indexer | C2<System.Decimal>.set_Item(decimal, string) |
| ViableCallable.cs:17:9:17:23 | access to indexer | C2<System.Int32>.set_Item(int, string) |
| ViableCallable.cs:17:9:17:23 | access to indexer | C2`1.set_Item(T, string) |
| ViableCallable.cs:17:9:17:23 | access to indexer | C3.set_Item(decimal, string) |
| ViableCallable.cs:17:9:17:23 | access to indexer | C4<System.Int32>.set_Item(bool, Int32[]) |
| ViableCallable.cs:17:9:17:23 | access to indexer | C4`1.set_Item(bool, T[]) |
| ViableCallable.cs:17:9:17:23 | access to indexer | C5.set_Item(bool, string) |
| ViableCallable.cs:17:9:17:23 | access to indexer | C6<System.Boolean,System.Byte>.set_Item(byte, bool) |
| ViableCallable.cs:17:9:17:23 | access to indexer | C6<System.Int32[],System.Boolean>.set_Item(bool, Int32[]) |
| ViableCallable.cs:17:9:17:23 | access to indexer | C6<System.String,System.Boolean>.set_Item(bool, string) |
| ViableCallable.cs:17:9:17:23 | access to indexer | C6<System.String,System.Decimal>.set_Item(decimal, string) |
| ViableCallable.cs:17:9:17:23 | access to indexer | C6<System.String,System.Int32>.set_Item(int, string) |
| ViableCallable.cs:17:9:17:23 | access to indexer | C6<T1,System.Boolean>.set_Item(bool, T1) |
| ViableCallable.cs:17:9:17:23 | access to indexer | C6<T1,System.Byte>.set_Item(byte, T1) |
| ViableCallable.cs:17:9:17:23 | access to indexer | C6`2.set_Item(T2, T1) |
| ViableCallable.cs:17:9:17:23 | access to indexer | C7<System.Boolean>.set_Item(byte, bool) |
| ViableCallable.cs:17:9:17:23 | access to indexer | C7`1.set_Item(byte, T1) |
| ViableCallable.cs:17:27:17:41 | access to indexer | C2<System.Boolean>.get_Item(bool) |
| ViableCallable.cs:17:27:17:41 | access to indexer | C2<System.Decimal>.get_Item(decimal) |
| ViableCallable.cs:17:27:17:41 | access to indexer | C2<System.Int32>.get_Item(int) |
| ViableCallable.cs:17:27:17:41 | access to indexer | C2`1.get_Item(T) |
| ViableCallable.cs:17:27:17:41 | access to indexer | C3.get_Item(decimal) |
| ViableCallable.cs:17:27:17:41 | access to indexer | C4<System.Int32>.get_Item(bool) |
| ViableCallable.cs:17:27:17:41 | access to indexer | C4`1.get_Item(bool) |
| ViableCallable.cs:17:27:17:41 | access to indexer | C5.get_Item(bool) |
| ViableCallable.cs:17:27:17:41 | access to indexer | C6<System.Boolean,System.Byte>.get_Item(byte) |
| ViableCallable.cs:17:27:17:41 | access to indexer | C6<System.Int32[],System.Boolean>.get_Item(bool) |
| ViableCallable.cs:17:27:17:41 | access to indexer | C6<System.String,System.Boolean>.get_Item(bool) |
| ViableCallable.cs:17:27:17:41 | access to indexer | C6<System.String,System.Decimal>.get_Item(decimal) |
| ViableCallable.cs:17:27:17:41 | access to indexer | C6<System.String,System.Int32>.get_Item(int) |
| ViableCallable.cs:17:27:17:41 | access to indexer | C6<T1,System.Boolean>.get_Item(bool) |
| ViableCallable.cs:17:27:17:41 | access to indexer | C6<T1,System.Byte>.get_Item(byte) |
| ViableCallable.cs:17:27:17:41 | access to indexer | C6`2.get_Item(T2) |
| ViableCallable.cs:17:27:17:41 | access to indexer | C7<System.Boolean>.get_Item(byte) |
| ViableCallable.cs:17:27:17:41 | access to indexer | C7`1.get_Item(byte) |
| ViableCallable.cs:19:9:19:16 | access to event Event | C2<System.Boolean>.add_Event(EventHandler<string>) |
| ViableCallable.cs:19:9:19:16 | access to event Event | C2<System.Decimal>.add_Event(EventHandler<string>) |
| ViableCallable.cs:19:9:19:16 | access to event Event | C2<System.Int32>.add_Event(EventHandler<string>) |
| ViableCallable.cs:19:9:19:16 | access to event Event | C2`1.add_Event(EventHandler<string>) |
| ViableCallable.cs:19:9:19:16 | access to event Event | C3.add_Event(EventHandler<string>) |
| ViableCallable.cs:19:9:19:16 | access to event Event | C4<System.Int32>.add_Event(EventHandler<Int32[]>) |
| ViableCallable.cs:19:9:19:16 | access to event Event | C4`1.add_Event(EventHandler<T[]>) |
| ViableCallable.cs:19:9:19:16 | access to event Event | C5.add_Event(EventHandler<string>) |
| ViableCallable.cs:19:9:19:16 | access to event Event | C6<System.Boolean,System.Byte>.add_Event(EventHandler<bool>) |
| ViableCallable.cs:19:9:19:16 | access to event Event | C6<System.Int32[],System.Boolean>.add_Event(EventHandler<Int32[]>) |
| ViableCallable.cs:19:9:19:16 | access to event Event | C6<System.String,System.Boolean>.add_Event(EventHandler<string>) |
| ViableCallable.cs:19:9:19:16 | access to event Event | C6<System.String,System.Decimal>.add_Event(EventHandler<string>) |
| ViableCallable.cs:19:9:19:16 | access to event Event | C6<System.String,System.Int32>.add_Event(EventHandler<string>) |
| ViableCallable.cs:19:9:19:16 | access to event Event | C6<T1,System.Boolean>.add_Event(EventHandler<T1>) |
| ViableCallable.cs:19:9:19:16 | access to event Event | C6<T1,System.Byte>.add_Event(EventHandler<T1>) |
| ViableCallable.cs:19:9:19:16 | access to event Event | C6`2.add_Event(EventHandler<T1>) |
| ViableCallable.cs:19:9:19:16 | access to event Event | C7<System.Boolean>.add_Event(EventHandler<bool>) |
| ViableCallable.cs:19:9:19:16 | access to event Event | C7`1.add_Event(EventHandler<T1>) |
| ViableCallable.cs:20:9:20:16 | access to event Event | C2<System.Boolean>.remove_Event(EventHandler<string>) |
| ViableCallable.cs:20:9:20:16 | access to event Event | C2<System.Decimal>.remove_Event(EventHandler<string>) |
| ViableCallable.cs:20:9:20:16 | access to event Event | C2<System.Int32>.remove_Event(EventHandler<string>) |
| ViableCallable.cs:20:9:20:16 | access to event Event | C2`1.remove_Event(EventHandler<string>) |
| ViableCallable.cs:20:9:20:16 | access to event Event | C3.remove_Event(EventHandler<string>) |
| ViableCallable.cs:20:9:20:16 | access to event Event | C4<System.Int32>.remove_Event(EventHandler<Int32[]>) |
| ViableCallable.cs:20:9:20:16 | access to event Event | C4`1.remove_Event(EventHandler<T[]>) |
| ViableCallable.cs:20:9:20:16 | access to event Event | C5.remove_Event(EventHandler<string>) |
| ViableCallable.cs:20:9:20:16 | access to event Event | C6<System.Boolean,System.Byte>.remove_Event(EventHandler<bool>) |
| ViableCallable.cs:20:9:20:16 | access to event Event | C6<System.Int32[],System.Boolean>.remove_Event(EventHandler<Int32[]>) |
| ViableCallable.cs:20:9:20:16 | access to event Event | C6<System.String,System.Boolean>.remove_Event(EventHandler<string>) |
| ViableCallable.cs:20:9:20:16 | access to event Event | C6<System.String,System.Decimal>.remove_Event(EventHandler<string>) |
| ViableCallable.cs:20:9:20:16 | access to event Event | C6<System.String,System.Int32>.remove_Event(EventHandler<string>) |
| ViableCallable.cs:20:9:20:16 | access to event Event | C6<T1,System.Boolean>.remove_Event(EventHandler<T1>) |
| ViableCallable.cs:20:9:20:16 | access to event Event | C6<T1,System.Byte>.remove_Event(EventHandler<T1>) |
| ViableCallable.cs:20:9:20:16 | access to event Event | C6`2.remove_Event(EventHandler<T1>) |
| ViableCallable.cs:20:9:20:16 | access to event Event | C7<System.Boolean>.remove_Event(EventHandler<bool>) |
| ViableCallable.cs:20:9:20:16 | access to event Event | C7`1.remove_Event(EventHandler<T1>) |
| ViableCallable.cs:23:9:23:30 | call to method M<Boolean> | C4<System.Int32>.M<T3>(Int32[], T3) |
| ViableCallable.cs:23:9:23:30 | call to method M<Boolean> | C4`1.M<T3>(T[], T3) |
| ViableCallable.cs:23:9:23:30 | call to method M<Boolean> | C6<System.Int32[],System.Boolean>.M<T3>(Int32[], T3) |
| ViableCallable.cs:25:9:25:15 | access to property Prop | C4<System.Int32>.set_Prop(Int32[]) |
| ViableCallable.cs:25:9:25:15 | access to property Prop | C4`1.set_Prop(T[]) |
| ViableCallable.cs:25:9:25:15 | access to property Prop | C6<System.Int32[],System.Boolean>.set_Prop(Int32[]) |
| ViableCallable.cs:25:19:25:25 | access to property Prop | C4<System.Int32>.get_Prop() |
| ViableCallable.cs:25:19:25:25 | access to property Prop | C4`1.get_Prop() |
| ViableCallable.cs:25:19:25:25 | access to property Prop | C6<System.Int32[],System.Boolean>.get_Prop() |
| ViableCallable.cs:27:9:27:23 | access to indexer | C4<System.Int32>.set_Item(bool, Int32[]) |
| ViableCallable.cs:27:9:27:23 | access to indexer | C4`1.set_Item(bool, T[]) |
| ViableCallable.cs:27:9:27:23 | access to indexer | C6<System.Int32[],System.Boolean>.set_Item(bool, Int32[]) |
| ViableCallable.cs:27:27:27:41 | access to indexer | C4<System.Int32>.get_Item(bool) |
| ViableCallable.cs:27:27:27:41 | access to indexer | C4`1.get_Item(bool) |
| ViableCallable.cs:27:27:27:41 | access to indexer | C6<System.Int32[],System.Boolean>.get_Item(bool) |
| ViableCallable.cs:29:9:29:16 | access to event Event | C4<System.Int32>.add_Event(EventHandler<Int32[]>) |
| ViableCallable.cs:29:9:29:16 | access to event Event | C4`1.add_Event(EventHandler<T[]>) |
| ViableCallable.cs:29:9:29:16 | access to event Event | C6<System.Int32[],System.Boolean>.add_Event(EventHandler<Int32[]>) |
| ViableCallable.cs:30:9:30:16 | access to event Event | C4<System.Int32>.remove_Event(EventHandler<Int32[]>) |
| ViableCallable.cs:30:9:30:16 | access to event Event | C4`1.remove_Event(EventHandler<T[]>) |
| ViableCallable.cs:30:9:30:16 | access to event Event | C6<System.Int32[],System.Boolean>.remove_Event(EventHandler<Int32[]>) |
| ViableCallable.cs:33:30:33:52 | call to method Mock<C1<String,Int32>> | ViableCallable.Mock<C1<string, int>>() |
| ViableCallable.cs:34:9:34:23 | call to method M<Int32> | C2<System.Int32>.M<T3>(string, T3) |
| ViableCallable.cs:34:9:34:23 | call to method M<Int32> | C6<System.String,System.Int32>.M<T3>(string, T3) |
| ViableCallable.cs:36:9:36:15 | access to property Prop | C2<System.Int32>.set_Prop(string) |
| ViableCallable.cs:36:9:36:15 | access to property Prop | C6<System.String,System.Int32>.set_Prop(string) |
| ViableCallable.cs:36:19:36:25 | access to property Prop | C2<System.Int32>.get_Prop() |
| ViableCallable.cs:36:19:36:25 | access to property Prop | C6<System.String,System.Int32>.get_Prop() |
| ViableCallable.cs:38:9:38:13 | access to indexer | C2<System.Int32>.set_Item(int, string) |
| ViableCallable.cs:38:9:38:13 | access to indexer | C6<System.String,System.Int32>.set_Item(int, string) |
| ViableCallable.cs:38:17:38:21 | access to indexer | C2<System.Int32>.get_Item(int) |
| ViableCallable.cs:38:17:38:21 | access to indexer | C6<System.String,System.Int32>.get_Item(int) |
| ViableCallable.cs:40:9:40:16 | access to event Event | C2<System.Int32>.add_Event(EventHandler<string>) |
| ViableCallable.cs:40:9:40:16 | access to event Event | C6<System.String,System.Int32>.add_Event(EventHandler<string>) |
| ViableCallable.cs:41:9:41:16 | access to event Event | C2<System.Int32>.remove_Event(EventHandler<string>) |
| ViableCallable.cs:41:9:41:16 | access to event Event | C6<System.String,System.Int32>.remove_Event(EventHandler<string>) |
| ViableCallable.cs:44:34:44:60 | call to method Mock<C1<String,Decimal>> | ViableCallable.Mock<C1<string, decimal>>() |
| ViableCallable.cs:45:9:45:24 | call to method M<Double> | C2<System.Decimal>.M<T3>(string, T3) |
| ViableCallable.cs:45:9:45:24 | call to method M<Double> | C3.M<T3>(string, T3) |
| ViableCallable.cs:45:9:45:24 | call to method M<Double> | C6<System.String,System.Decimal>.M<T3>(string, T3) |
| ViableCallable.cs:47:9:47:15 | access to property Prop | C2<System.Decimal>.set_Prop(string) |
| ViableCallable.cs:47:9:47:15 | access to property Prop | C3.set_Prop(string) |
| ViableCallable.cs:47:9:47:15 | access to property Prop | C6<System.String,System.Decimal>.set_Prop(string) |
| ViableCallable.cs:47:19:47:25 | access to property Prop | C2<System.Decimal>.get_Prop() |
| ViableCallable.cs:47:19:47:25 | access to property Prop | C3.get_Prop() |
| ViableCallable.cs:47:19:47:25 | access to property Prop | C6<System.String,System.Decimal>.get_Prop() |
| ViableCallable.cs:49:9:49:14 | access to indexer | C2<System.Decimal>.set_Item(decimal, string) |
| ViableCallable.cs:49:9:49:14 | access to indexer | C3.set_Item(decimal, string) |
| ViableCallable.cs:49:9:49:14 | access to indexer | C6<System.String,System.Decimal>.set_Item(decimal, string) |
| ViableCallable.cs:49:18:49:23 | access to indexer | C2<System.Decimal>.get_Item(decimal) |
| ViableCallable.cs:49:18:49:23 | access to indexer | C3.get_Item(decimal) |
| ViableCallable.cs:49:18:49:23 | access to indexer | C6<System.String,System.Decimal>.get_Item(decimal) |
| ViableCallable.cs:51:9:51:16 | access to event Event | C2<System.Decimal>.add_Event(EventHandler<string>) |
| ViableCallable.cs:51:9:51:16 | access to event Event | C3.add_Event(EventHandler<string>) |
| ViableCallable.cs:51:9:51:16 | access to event Event | C6<System.String,System.Decimal>.add_Event(EventHandler<string>) |
| ViableCallable.cs:52:9:52:16 | access to event Event | C2<System.Decimal>.remove_Event(EventHandler<string>) |
| ViableCallable.cs:52:9:52:16 | access to event Event | C3.remove_Event(EventHandler<string>) |
| ViableCallable.cs:52:9:52:16 | access to event Event | C6<System.String,System.Decimal>.remove_Event(EventHandler<string>) |
| ViableCallable.cs:55:30:55:52 | call to method Mock<C1<Int32[],Boolean>> | ViableCallable.Mock<C1<Int32[], bool>>() |
| ViableCallable.cs:56:9:56:44 | call to method M<Object> | C4<System.Int32>.M<T3>(Int32[], T3) |
| ViableCallable.cs:56:9:56:44 | call to method M<Object> | C6<System.Int32[],System.Boolean>.M<T3>(Int32[], T3) |
| ViableCallable.cs:58:9:58:15 | access to property Prop | C4<System.Int32>.set_Prop(Int32[]) |
| ViableCallable.cs:58:9:58:15 | access to property Prop | C6<System.Int32[],System.Boolean>.set_Prop(Int32[]) |
| ViableCallable.cs:58:19:58:25 | access to property Prop | C4<System.Int32>.get_Prop() |
| ViableCallable.cs:58:19:58:25 | access to property Prop | C6<System.Int32[],System.Boolean>.get_Prop() |
| ViableCallable.cs:60:9:60:17 | access to indexer | C4<System.Int32>.set_Item(bool, Int32[]) |
| ViableCallable.cs:60:9:60:17 | access to indexer | C6<System.Int32[],System.Boolean>.set_Item(bool, Int32[]) |
| ViableCallable.cs:60:21:60:29 | access to indexer | C4<System.Int32>.get_Item(bool) |
| ViableCallable.cs:60:21:60:29 | access to indexer | C6<System.Int32[],System.Boolean>.get_Item(bool) |
| ViableCallable.cs:62:9:62:16 | access to event Event | C4<System.Int32>.add_Event(EventHandler<Int32[]>) |
| ViableCallable.cs:62:9:62:16 | access to event Event | C6<System.Int32[],System.Boolean>.add_Event(EventHandler<Int32[]>) |
| ViableCallable.cs:63:9:63:16 | access to event Event | C4<System.Int32>.remove_Event(EventHandler<Int32[]>) |
| ViableCallable.cs:63:9:63:16 | access to event Event | C6<System.Int32[],System.Boolean>.remove_Event(EventHandler<Int32[]>) |
| ViableCallable.cs:66:31:66:54 | call to method Mock<C1<String,Boolean>> | ViableCallable.Mock<C1<string, bool>>() |
| ViableCallable.cs:67:9:67:30 | call to method M<Object> | C2<System.Boolean>.M<T3>(string, T3) |
| ViableCallable.cs:67:9:67:30 | call to method M<Object> | C5.M<T3>(string, T3) |
| ViableCallable.cs:67:9:67:30 | call to method M<Object> | C6<System.String,System.Boolean>.M<T3>(string, T3) |
| ViableCallable.cs:69:9:69:15 | access to property Prop | C2<System.Boolean>.set_Prop(string) |
| ViableCallable.cs:69:9:69:15 | access to property Prop | C5.set_Prop(string) |
| ViableCallable.cs:69:9:69:15 | access to property Prop | C6<System.String,System.Boolean>.set_Prop(string) |
| ViableCallable.cs:69:19:69:25 | access to property Prop | C2<System.Boolean>.get_Prop() |
| ViableCallable.cs:69:19:69:25 | access to property Prop | C5.get_Prop() |
| ViableCallable.cs:69:19:69:25 | access to property Prop | C6<System.String,System.Boolean>.get_Prop() |
| ViableCallable.cs:71:9:71:17 | access to indexer | C2<System.Boolean>.set_Item(bool, string) |
| ViableCallable.cs:71:9:71:17 | access to indexer | C5.set_Item(bool, string) |
| ViableCallable.cs:71:9:71:17 | access to indexer | C6<System.String,System.Boolean>.set_Item(bool, string) |
| ViableCallable.cs:71:21:71:29 | access to indexer | C2<System.Boolean>.get_Item(bool) |
| ViableCallable.cs:71:21:71:29 | access to indexer | C5.get_Item(bool) |
| ViableCallable.cs:71:21:71:29 | access to indexer | C6<System.String,System.Boolean>.get_Item(bool) |
| ViableCallable.cs:73:9:73:16 | access to event Event | C2<System.Boolean>.add_Event(EventHandler<string>) |
| ViableCallable.cs:73:9:73:16 | access to event Event | C5.add_Event(EventHandler<string>) |
| ViableCallable.cs:73:9:73:16 | access to event Event | C6<System.String,System.Boolean>.add_Event(EventHandler<string>) |
| ViableCallable.cs:74:9:74:16 | access to event Event | C2<System.Boolean>.remove_Event(EventHandler<string>) |
| ViableCallable.cs:74:9:74:16 | access to event Event | C5.remove_Event(EventHandler<string>) |
| ViableCallable.cs:74:9:74:16 | access to event Event | C6<System.String,System.Boolean>.remove_Event(EventHandler<string>) |
| ViableCallable.cs:78:9:78:29 | call to method M<String> | C6<T1,System.Boolean>.M<T3>(T1, T3) |
| ViableCallable.cs:80:9:80:15 | access to property Prop | C6<T1,System.Boolean>.set_Prop(T1) |
| ViableCallable.cs:80:19:80:25 | access to property Prop | C6<T1,System.Boolean>.get_Prop() |
| ViableCallable.cs:82:9:82:17 | access to indexer | C6<T1,System.Boolean>.set_Item(bool, T1) |
| ViableCallable.cs:82:21:82:29 | access to indexer | C6<T1,System.Boolean>.get_Item(bool) |
| ViableCallable.cs:84:9:84:16 | access to event Event | C6<T1,System.Boolean>.add_Event(EventHandler<T1>) |
| ViableCallable.cs:85:9:85:16 | access to event Event | C6<T1,System.Boolean>.remove_Event(EventHandler<T1>) |
| ViableCallable.cs:88:21:88:30 | call to method Mock<C8> | ViableCallable.Mock<C8>() |
| ViableCallable.cs:89:9:89:44 | dynamic call to method M | C8.M(IEnumerable<C1<String[], bool>>) |
| ViableCallable.cs:89:9:89:44 | dynamic call to method M | C9`1.M(IEnumerable<C1<String[], bool>>) |
| ViableCallable.cs:89:13:89:43 | call to method Mock<IEnumerable<C4<String>>> | ViableCallable.Mock<IEnumerable<C4<string>>>() |
| ViableCallable.cs:91:9:91:15 | dynamic access to member Prop1 | C8.set_Prop1(string) |
| ViableCallable.cs:91:9:91:15 | dynamic access to member Prop1 | C9`1.set_Prop1(string) |
| ViableCallable.cs:91:19:91:25 | dynamic access to member Prop1 | C8.get_Prop1() |
| ViableCallable.cs:91:19:91:25 | dynamic access to member Prop1 | C9`1.get_Prop1() |
| ViableCallable.cs:93:9:93:12 | dynamic access to element | C8.set_Item(int, string) |
| ViableCallable.cs:93:9:93:12 | dynamic access to element | C9`1.set_Item(int, string) |
| ViableCallable.cs:93:16:93:19 | dynamic access to element | C8.get_Item(int) |
| ViableCallable.cs:93:16:93:19 | dynamic access to element | C9`1.get_Item(int) |
| ViableCallable.cs:96:13:96:40 | call to method Mock<IEnumerable<C4<Int32>>> | ViableCallable.Mock<IEnumerable<C4<int>>>() |
| ViableCallable.cs:100:9:100:15 | dynamic call to method M | C5.M(int) |
| ViableCallable.cs:103:9:103:16 | access to property Prop2 | C5.set_Prop2(string) |
| ViableCallable.cs:106:9:106:17 | access to event Event2 | C5.add_Event2(EventHandler<string>) |
| ViableCallable.cs:107:9:107:17 | access to event Event2 | C5.remove_Event2(EventHandler<string>) |
| ViableCallable.cs:121:9:121:25 | dynamic call to method M2 | C8.M2<decimal>(Decimal[]) |
| ViableCallable.cs:125:9:125:24 | dynamic call to method M2 | C8.M2<string>(String[]) |
| ViableCallable.cs:133:9:133:28 | dynamic call to method M | C6<System.Boolean,System.Byte>.M<T3>(bool, T3) |
| ViableCallable.cs:133:9:133:28 | dynamic call to method M | C6<T1,System.Byte>.M<T3>(T1, T3) |
| ViableCallable.cs:135:9:135:14 | dynamic access to member Prop | C6<System.Boolean,System.Byte>.set_Prop(bool) |
| ViableCallable.cs:135:9:135:14 | dynamic access to member Prop | C6<T1,System.Byte>.set_Prop(T1) |
| ViableCallable.cs:135:18:135:23 | dynamic access to member Prop | C6<System.Boolean,System.Byte>.get_Prop() |
| ViableCallable.cs:135:18:135:23 | dynamic access to member Prop | C6<T1,System.Byte>.get_Prop() |
| ViableCallable.cs:137:9:137:18 | dynamic access to element | C6<System.Boolean,System.Byte>.set_Item(byte, bool) |
| ViableCallable.cs:137:9:137:18 | dynamic access to element | C6<T1,System.Byte>.set_Item(byte, T1) |
| ViableCallable.cs:137:22:137:31 | dynamic access to element | C6<System.Boolean,System.Byte>.get_Item(byte) |
| ViableCallable.cs:137:22:137:31 | dynamic access to element | C6<T1,System.Byte>.get_Item(byte) |
| ViableCallable.cs:139:9:139:52 | ... += ... | C6<T1,System.Byte>.add_Event(EventHandler<T1>) |
| ViableCallable.cs:140:9:140:52 | ... -= ... | C6<T1,System.Byte>.remove_Event(EventHandler<T1>) |
| ViableCallable.cs:143:13:143:22 | call to method Mock<C8> | ViableCallable.Mock<C8>() |
| ViableCallable.cs:144:9:144:14 | dynamic call to method M3 | C8.M3(params Double[]) |
| ViableCallable.cs:144:9:144:14 | dynamic call to method M3 | C9`1.M3(params T[]) |
| ViableCallable.cs:145:9:145:15 | dynamic call to method M3 | C8.M3(params Double[]) |
| ViableCallable.cs:145:9:145:15 | dynamic call to method M3 | C9`1.M3(params T[]) |
| ViableCallable.cs:146:9:146:20 | dynamic call to method M3 | C8.M3(params Double[]) |
| ViableCallable.cs:146:9:146:20 | dynamic call to method M3 | C9`1.M3(params T[]) |
| ViableCallable.cs:149:13:149:22 | call to method Mock<C8> | ViableCallable.Mock<C8>() |
| ViableCallable.cs:150:9:150:14 | dynamic call to method M5 | C8.M5(params IEnumerable<double>) |
| ViableCallable.cs:150:9:150:14 | dynamic call to method M5 | C9`1.M5(params IEnumerable<T>) |
| ViableCallable.cs:151:9:151:15 | dynamic call to method M5 | C8.M5(params IEnumerable<double>) |
| ViableCallable.cs:151:9:151:15 | dynamic call to method M5 | C9`1.M5(params IEnumerable<T>) |
| ViableCallable.cs:152:9:152:20 | dynamic call to method M5 | C8.M5(params IEnumerable<double>) |
| ViableCallable.cs:152:9:152:20 | dynamic call to method M5 | C9`1.M5(params IEnumerable<T>) |
| ViableCallable.cs:155:9:155:16 | dynamic call to method M3 | C8.M3(params Double[]) |
| ViableCallable.cs:155:9:155:16 | dynamic call to method M3 | C9`1.M3(params T[]) |
| ViableCallable.cs:155:9:155:16 | dynamic call to method M3 | C10.M3(params Double[]) |
| ViableCallable.cs:155:9:155:16 | dynamic call to method M3 | Test.MainClass+ImplAlpha.M3() |
| ViableCallable.cs:155:9:155:16 | dynamic call to method M3 | Test.MainClass+SecondLevelImpl.M3() |
| ViableCallable.cs:156:9:156:17 | dynamic call to method M3 | C8.M3(params Double[]) |
| ViableCallable.cs:156:9:156:17 | dynamic call to method M3 | C9`1.M3(params T[]) |
| ViableCallable.cs:156:9:156:17 | dynamic call to method M3 | C10.M3(params Double[]) |
| ViableCallable.cs:157:9:157:22 | dynamic call to method M3 | C8.M3(params Double[]) |
| ViableCallable.cs:157:9:157:22 | dynamic call to method M3 | C9`1.M3(params T[]) |
| ViableCallable.cs:157:9:157:22 | dynamic call to method M3 | C10.M3(params Double[]) |
| ViableCallable.cs:159:9:159:16 | dynamic call to method M5 | C8.M5(params IEnumerable<double>) |
| ViableCallable.cs:159:9:159:16 | dynamic call to method M5 | C9`1.M5(params IEnumerable<T>) |
| ViableCallable.cs:159:9:159:16 | dynamic call to method M5 | C10.M5(params IEnumerable<double>) |
| ViableCallable.cs:160:9:160:17 | dynamic call to method M5 | C8.M5(params IEnumerable<double>) |
| ViableCallable.cs:160:9:160:17 | dynamic call to method M5 | C9`1.M5(params IEnumerable<T>) |
| ViableCallable.cs:160:9:160:17 | dynamic call to method M5 | C10.M5(params IEnumerable<double>) |
| ViableCallable.cs:161:9:161:22 | dynamic call to method M5 | C8.M5(params IEnumerable<double>) |
| ViableCallable.cs:161:9:161:22 | dynamic call to method M5 | C9`1.M5(params IEnumerable<T>) |
| ViableCallable.cs:161:9:161:22 | dynamic call to method M5 | C10.M5(params IEnumerable<double>) |
| ViableCallable.cs:163:9:163:17 | dynamic access to member Prop1 | C8.set_Prop1(string) |
| ViableCallable.cs:163:9:163:17 | dynamic access to member Prop1 | C9`1.set_Prop1(string) |
| ViableCallable.cs:163:9:163:17 | dynamic access to member Prop1 | C10.set_Prop1(bool) |
| ViableCallable.cs:163:21:163:29 | dynamic access to member Prop1 | C8.get_Prop1() |
| ViableCallable.cs:163:21:163:29 | dynamic access to member Prop1 | C9`1.get_Prop1() |
| ViableCallable.cs:163:21:163:29 | dynamic access to member Prop1 | C10.get_Prop1() |
| ViableCallable.cs:165:9:165:14 | dynamic access to element | C2<System.Decimal>.set_Item(decimal, string) |
| ViableCallable.cs:165:9:165:14 | dynamic access to element | C2<System.Int32>.set_Item(int, string) |
| ViableCallable.cs:165:9:165:14 | dynamic access to element | C2`1.set_Item(T, string) |
| ViableCallable.cs:165:9:165:14 | dynamic access to element | C3.set_Item(decimal, string) |
| ViableCallable.cs:165:9:165:14 | dynamic access to element | C6<System.Boolean,System.Byte>.set_Item(byte, bool) |
| ViableCallable.cs:165:9:165:14 | dynamic access to element | C6<System.String,System.Decimal>.set_Item(decimal, string) |
| ViableCallable.cs:165:9:165:14 | dynamic access to element | C6<System.String,System.Int32>.set_Item(int, string) |
| ViableCallable.cs:165:9:165:14 | dynamic access to element | C6<T1,System.Byte>.set_Item(byte, T1) |
| ViableCallable.cs:165:9:165:14 | dynamic access to element | C6`2.set_Item(T2, T1) |
| ViableCallable.cs:165:9:165:14 | dynamic access to element | C7<System.Boolean>.set_Item(byte, bool) |
| ViableCallable.cs:165:9:165:14 | dynamic access to element | C7`1.set_Item(byte, T1) |
| ViableCallable.cs:165:9:165:14 | dynamic access to element | C8.set_Item(int, string) |
| ViableCallable.cs:165:9:165:14 | dynamic access to element | C9`1.set_Item(int, string) |
| ViableCallable.cs:165:9:165:14 | dynamic access to element | C10.set_Item(int, bool) |
| ViableCallable.cs:165:18:165:23 | dynamic access to element | C2<System.Decimal>.get_Item(decimal) |
| ViableCallable.cs:165:18:165:23 | dynamic access to element | C2<System.Int32>.get_Item(int) |
| ViableCallable.cs:165:18:165:23 | dynamic access to element | C2`1.get_Item(T) |
| ViableCallable.cs:165:18:165:23 | dynamic access to element | C3.get_Item(decimal) |
| ViableCallable.cs:165:18:165:23 | dynamic access to element | C6<System.Boolean,System.Byte>.get_Item(byte) |
| ViableCallable.cs:165:18:165:23 | dynamic access to element | C6<System.String,System.Decimal>.get_Item(decimal) |
| ViableCallable.cs:165:18:165:23 | dynamic access to element | C6<System.String,System.Int32>.get_Item(int) |
| ViableCallable.cs:165:18:165:23 | dynamic access to element | C6<T1,System.Byte>.get_Item(byte) |
| ViableCallable.cs:165:18:165:23 | dynamic access to element | C6`2.get_Item(T2) |
| ViableCallable.cs:165:18:165:23 | dynamic access to element | C7<System.Boolean>.get_Item(byte) |
| ViableCallable.cs:165:18:165:23 | dynamic access to element | C7`1.get_Item(byte) |
| ViableCallable.cs:165:18:165:23 | dynamic access to element | C8.get_Item(int) |
| ViableCallable.cs:165:18:165:23 | dynamic access to element | C9`1.get_Item(int) |
| ViableCallable.cs:165:18:165:23 | dynamic access to element | C10.get_Item(int) |
| ViableCallable.cs:167:9:167:54 | ... += ... | C2<System.Boolean>.add_Event(EventHandler<string>) |
| ViableCallable.cs:167:9:167:54 | ... += ... | C2<System.Decimal>.add_Event(EventHandler<string>) |
| ViableCallable.cs:167:9:167:54 | ... += ... | C2<System.Int32>.add_Event(EventHandler<string>) |
| ViableCallable.cs:167:9:167:54 | ... += ... | C2`1.add_Event(EventHandler<string>) |
| ViableCallable.cs:167:9:167:54 | ... += ... | C3.add_Event(EventHandler<string>) |
| ViableCallable.cs:167:9:167:54 | ... += ... | C5.add_Event(EventHandler<string>) |
| ViableCallable.cs:167:9:167:54 | ... += ... | C6<System.String,System.Boolean>.add_Event(EventHandler<string>) |
| ViableCallable.cs:167:9:167:54 | ... += ... | C6<System.String,System.Decimal>.add_Event(EventHandler<string>) |
| ViableCallable.cs:167:9:167:54 | ... += ... | C6<System.String,System.Int32>.add_Event(EventHandler<string>) |
| ViableCallable.cs:167:9:167:54 | ... += ... | C6<T1,System.Boolean>.add_Event(EventHandler<T1>) |
| ViableCallable.cs:167:9:167:54 | ... += ... | C6<T1,System.Byte>.add_Event(EventHandler<T1>) |
| ViableCallable.cs:167:9:167:54 | ... += ... | C6`2.add_Event(EventHandler<T1>) |
| ViableCallable.cs:167:9:167:54 | ... += ... | C7`1.add_Event(EventHandler<T1>) |
| ViableCallable.cs:167:9:167:54 | ... += ... | C8.add_Event(EventHandler<string>) |
| ViableCallable.cs:167:9:167:54 | ... += ... | C9`1.add_Event(EventHandler<string>) |
| ViableCallable.cs:168:9:168:54 | ... -= ... | C2<System.Boolean>.remove_Event(EventHandler<string>) |
| ViableCallable.cs:168:9:168:54 | ... -= ... | C2<System.Decimal>.remove_Event(EventHandler<string>) |
| ViableCallable.cs:168:9:168:54 | ... -= ... | C2<System.Int32>.remove_Event(EventHandler<string>) |
| ViableCallable.cs:168:9:168:54 | ... -= ... | C2`1.remove_Event(EventHandler<string>) |
| ViableCallable.cs:168:9:168:54 | ... -= ... | C3.remove_Event(EventHandler<string>) |
| ViableCallable.cs:168:9:168:54 | ... -= ... | C5.remove_Event(EventHandler<string>) |
| ViableCallable.cs:168:9:168:54 | ... -= ... | C6<System.String,System.Boolean>.remove_Event(EventHandler<string>) |
| ViableCallable.cs:168:9:168:54 | ... -= ... | C6<System.String,System.Decimal>.remove_Event(EventHandler<string>) |
| ViableCallable.cs:168:9:168:54 | ... -= ... | C6<System.String,System.Int32>.remove_Event(EventHandler<string>) |
| ViableCallable.cs:168:9:168:54 | ... -= ... | C6<T1,System.Boolean>.remove_Event(EventHandler<T1>) |
| ViableCallable.cs:168:9:168:54 | ... -= ... | C6<T1,System.Byte>.remove_Event(EventHandler<T1>) |
| ViableCallable.cs:168:9:168:54 | ... -= ... | C6`2.remove_Event(EventHandler<T1>) |
| ViableCallable.cs:168:9:168:54 | ... -= ... | C7`1.remove_Event(EventHandler<T1>) |
| ViableCallable.cs:168:9:168:54 | ... -= ... | C8.remove_Event(EventHandler<string>) |
| ViableCallable.cs:168:9:168:54 | ... -= ... | C9`1.remove_Event(EventHandler<string>) |
| ViableCallable.cs:171:9:171:40 | dynamic call to method M4 | C8.M4(byte, IEnumerable<string>) |
| ViableCallable.cs:171:19:171:39 | call to method Mock<IList<String>> | ViableCallable.Mock<IList<string>>() |
| ViableCallable.cs:172:9:172:38 | dynamic call to method M4 | C8.M4(byte, IEnumerable<string>) |
| ViableCallable.cs:175:9:175:17 | dynamic access to member Prop1 | C10.set_Prop1(bool) |
| ViableCallable.cs:185:9:185:15 | dynamic access to element | C2`1.set_Item(T, string) |
| ViableCallable.cs:185:9:185:15 | dynamic access to element | C6`2.set_Item(T2, T1) |
| ViableCallable.cs:185:19:185:25 | dynamic access to element | C2`1.get_Item(T) |
| ViableCallable.cs:185:19:185:25 | dynamic access to element | C6`2.get_Item(T2) |
| ViableCallable.cs:197:9:197:153 | call to method InvokeMember | C10.+(C10, C10) |
| ViableCallable.cs:200:9:200:143 | call to method InvokeMember | C10.get_Prop3() |
| ViableCallable.cs:201:9:201:149 | call to method InvokeMember | C10.set_Prop3(string) |
| ViableCallable.cs:204:9:204:146 | call to method InvokeMember | C10.get_Item(int) |
| ViableCallable.cs:205:9:205:152 | call to method InvokeMember | C10.set_Item(int, bool) |
| ViableCallable.cs:209:9:209:147 | call to method InvokeMember | C10.add_Event(EventHandler<bool>) |
| ViableCallable.cs:210:9:210:150 | call to method InvokeMember | C10.remove_Event(EventHandler<bool>) |
| ViableCallable.cs:245:9:245:15 | call to method M<Int32> | C2<System.Boolean>.M<T3>(string, T3) |
| ViableCallable.cs:245:9:245:15 | call to method M<Int32> | C2<System.Decimal>.M<T3>(string, T3) |
| ViableCallable.cs:245:9:245:15 | call to method M<Int32> | C2<System.Int32>.M<T3>(string, T3) |
| ViableCallable.cs:245:9:245:15 | call to method M<Int32> | C2`1.M<T3>(string, T3) |
| ViableCallable.cs:245:9:245:15 | call to method M<Int32> | C3.M<T3>(string, T3) |
| ViableCallable.cs:245:9:245:15 | call to method M<Int32> | C4<System.Int32>.M<T3>(Int32[], T3) |
| ViableCallable.cs:245:9:245:15 | call to method M<Int32> | C4`1.M<T3>(T[], T3) |
| ViableCallable.cs:245:9:245:15 | call to method M<Int32> | C5.M<T3>(string, T3) |
| ViableCallable.cs:245:9:245:15 | call to method M<Int32> | C6<System.Boolean,System.Byte>.M<T3>(bool, T3) |
| ViableCallable.cs:245:9:245:15 | call to method M<Int32> | C6<System.Int32[],System.Boolean>.M<T3>(Int32[], T3) |
| ViableCallable.cs:245:9:245:15 | call to method M<Int32> | C6<System.String,System.Boolean>.M<T3>(string, T3) |
| ViableCallable.cs:245:9:245:15 | call to method M<Int32> | C6<System.String,System.Decimal>.M<T3>(string, T3) |
| ViableCallable.cs:245:9:245:15 | call to method M<Int32> | C6<System.String,System.Int32>.M<T3>(string, T3) |
| ViableCallable.cs:245:9:245:15 | call to method M<Int32> | C6<T1,System.Boolean>.M<T3>(T1, T3) |
| ViableCallable.cs:245:9:245:15 | call to method M<Int32> | C6<T1,System.Byte>.M<T3>(T1, T3) |
| ViableCallable.cs:245:9:245:15 | call to method M<Int32> | C6`2.M<T3>(T1, T3) |
| ViableCallable.cs:245:9:245:15 | call to method M<Int32> | C7<System.Boolean>.M<T3>(bool, T3) |
| ViableCallable.cs:245:9:245:15 | call to method M<Int32> | C7`1.M<T3>(T1, T3) |
| ViableCallable.cs:294:9:294:15 | call to method M<Int32> | C6`2.M<T3>(T1, T3) |
| ViableCallable.cs:294:9:294:15 | call to method M<Int32> | C7<System.Boolean>.M<T3>(bool, T3) |
| ViableCallable.cs:294:9:294:15 | call to method M<Int32> | C7`1.M<T3>(T1, T3) |
| ViableCallable.cs:297:9:297:20 | call to method M<Int32> | C6`2.M<T3>(T1, T3) |
| ViableCallable.cs:297:9:297:20 | call to method M<Int32> | C7<System.Boolean>.M<T3>(bool, T3) |
| ViableCallable.cs:297:9:297:20 | call to method M<Int32> | C7`1.M<T3>(T1, T3) |
| ViableCallable.cs:311:9:311:15 | call to method M<Int32> | C7`1.M<T3>(T1, T3) |
| ViableCallable.cs:314:9:314:20 | call to method M<Int32> | C7`1.M<T3>(T1, T3) |
| ViableCallable.cs:317:9:317:20 | call to method M<Int32> | C6<T1,System.Byte>.M<T3>(T1, T3) |
| ViableCallable.cs:367:9:367:14 | dynamic call to method M | C11.M(dynamic) |
| ViableCallable.cs:369:9:369:18 | dynamic object creation of type C11 | C11.C11(C11) |
| ViableCallable.cs:392:9:392:13 | call to method M | C12+C13.M() |
| ViableCallable.cs:397:9:397:14 | call to method Run<T2> | C12.Run<T2>(T2) |
| ViableCallable.cs:402:9:402:23 | call to method Run2<C13> | C12.Run2<C13>(C13) |
| ViableCallable.cs:425:9:425:18 | call to method M<Int32> | C15+A1.M<T1>() |
| ViableCallable.cs:425:9:425:18 | call to method M<Int32> | C15+A4.M<T1>() |
| ViableCallable.cs:425:9:425:18 | call to method M<Int32> | C15+A5.M<T1>() |
| ViableCallable.cs:429:9:429:19 | call to method M<Boolean> | C15+A1.M<T1>() |
| ViableCallable.cs:433:9:433:21 | call to method M<String> | C15+A4.M<T1>() |
| ViableCallable.cs:435:13:435:37 | call to method Mock<A4> | ViableCallable.Mock<A4>() |
| ViableCallable.cs:437:9:437:21 | call to method M<String> | C15+A4.M<T1>() |
| ViableCallable.cs:437:9:437:21 | call to method M<String> | C15+A5.M<T1>() |
| ViableCallable.cs:452:9:452:19 | call to method M1 | C16<System.String,System.Int32>.M1(string) |
| ViableCallable.cs:455:9:455:24 | call to method M2<Int32> | C17.M2<T>(Func<T>) |
| ViableCallable.cs:463:9:463:21 | call to method M2<String> | C17.M2<T>(Func<T>) |
| ViableCallable.cs:469:9:469:30 | call to method M2<T> | C16<T,System.Int32>.M2<T>(Func<T>) |
| ViableCallable.cs:469:9:469:30 | call to method M2<T> | C17.M2<T>(Func<T>) |
| ViableCallable.cs:475:9:475:30 | call to method M2<T> | C16<T,System.Int32>.M2<T>(Func<T>) |
| ViableCallable.cs:475:9:475:30 | call to method M2<T> | C17.M2<T>(Func<T>) |
| ViableCallable.cs:492:9:492:14 | call to method M1 | C18.M1() |
| ViableCallable.cs:495:9:495:14 | call to method M2 | I2.M2() |
| ViableCallable.cs:509:18:509:22 | call to operator + | C19.+(C19, C19) |
| ViableCallable.cs:512:26:512:30 | call to operator checked + | C19.checked +(C19, C19) |
| ViableCallable.cs:515:18:515:23 | call to operator explicit conversion | C19.explicit conversion(C19) |
| ViableCallable.cs:518:26:518:31 | call to operator checked explicit conversion | C19.checked explicit conversion(C19) |
| ViableCallable.cs:559:18:559:22 | call to operator + | C20.+(C20, C20) |
| ViableCallable.cs:562:26:562:30 | call to operator checked + | C20.checked +(C20, C20) |
| ViableCallable.cs:565:18:565:22 | call to operator - | C20.-(C20, C20) |
| ViableCallable.cs:568:26:568:30 | call to operator checked - | I3<T>.checked -(T, T) |
| ViableCallable.cs:571:18:571:22 | call to operator * | I3<T>.*(T, T) |
| ViableCallable.cs:574:26:574:30 | call to operator checked * | I3<T>.checked *(T, T) |
| ViableCallable.cs:577:18:577:22 | call to operator / | C20./(C20, C20) |
| ViableCallable.cs:577:18:577:22 | call to operator / | I3<T>./(T, T) |
| ViableCallable.cs:580:26:580:30 | call to operator checked / | C20.checked /(C20, C20) |
| ViableCallable.cs:580:26:580:30 | call to operator checked / | I3<T>.checked /(T, T) |
| ViableCallable.cs:583:9:583:15 | call to method M11 | C20.M11() |
| ViableCallable.cs:586:9:586:15 | call to method M12 | C20.M12() |
| ViableCallable.cs:586:9:586:15 | call to method M12 | I3<T>.M12() |
| ViableCallable.cs:589:9:589:15 | call to method M13 | I3<T>.M13() |
| ViableCallable.cs:613:9:613:13 | call to method M | C21+A1.M() |
| ViableCallable.cs:619:9:619:13 | call to method M | C21+A1.M() |
| ViableCallable.cs:619:9:619:13 | call to method M | C21+A2.M() |
| ViableCallable.cs:661:9:661:16 | call to method M | C22+TestOverloadResolution1<System.Int32>.M(Int32[]) |
| ViableCallable.cs:665:9:665:16 | call to method M | C22+TestOverloadResolution1<System.Int32>.M(List<int>) |
| ViableCallable.cs:672:9:672:16 | call to method M | C22+TestOverloadResolution2<System.Int32>.M(ReadOnlySpan<int>) |
| ViableCallable.cs:676:9:676:16 | call to method M | C22+TestOverloadResolution2<System.Int32>.M(IEnumerable<int>) |
| ViableCallable.cs:683:9:683:16 | call to method M | C22+TestOverloadResolution1<System.Int32>.M(Int32[]) |
| ViableCallable.cs:683:9:683:16 | call to method M | C22+TestOverloadResolution2<System.Int32>.M(Int32[]) |
| ViableCallable.cs:687:9:687:16 | call to method M | C22+TestOverloadResolution1<System.Int32>.M(List<int>) |
| ViableCallable.cs:687:9:687:16 | call to method M | C22+TestOverloadResolution2<System.Int32>.M(List<int>) |

View File

@@ -1,6 +1,7 @@
using System;
using System.Collections.Generic;
using System.Reflection;
using System.Runtime.CompilerServices;
public delegate void EventHandler<T>();
@@ -618,3 +619,71 @@ public class C21
t.M();
}
}
public class C22
{
public interface I<T>
{
void M(List<T> l);
void M(T[] arr);
void M(IEnumerable<T> l);
void M(ReadOnlySpan<T> s);
}
public class TestOverloadResolution1<T> : I<T>
{
public void M(List<T> l) { }
public void M(T[] arr) { }
public void M(IEnumerable<T> l) { }
public void M(ReadOnlySpan<T> s) { }
}
public class TestOverloadResolution2<T> : I<T>
{
public void M(List<T> l) { }
public void M(T[] arr) { }
[OverloadResolutionPriority(1)]
public void M(IEnumerable<T> l) { }
[OverloadResolutionPriority(2)]
public void M(ReadOnlySpan<T> s) { }
}
public void Run1(TestOverloadResolution1<int> tor)
{
var a = new int[0];
// Viable callable: C22+TestOverloadResolution1<System.Int32>.M(Int32[])
tor.M(a);
// Viable callable: C22+TestOverloadResolution1<System.Int32>.M(List<int>)
var l = new List<int>();
tor.M(l);
}
public void Run2(TestOverloadResolution2<int> tor)
{
var a = new int[0];
// Viable callable: C22+TestOverloadResolution2<System.Int32>.M(ReadOnlySpan<int>)
tor.M(a);
var l = new List<int>();
// Viable callable: C22+TestOverloadResolution2<System.Int32>.M(IEnumerable<int>)
tor.M(l);
}
public void Run3(I<int> tor)
{
var a = new int[0];
// Viable callables: {C22+TestOverloadResolution1<System.Int32>, C22+TestOverloadResolution2<System.Int32>}.M(Int32[])
tor.M(a);
var l = new List<int>();
// Viable callables: {C22+TestOverloadResolution1<System.Int32>, C22+TestOverloadResolution2<System.Int32>}.M(List<int>)
tor.M(l);
}
}

View File

@@ -1,303 +1,303 @@
| ViableCallable.cs:12:9:12:28 | call to method M<Int32> | M`1 | C2`1 |
| ViableCallable.cs:12:9:12:28 | call to method M<Int32> | M`1 | C3 |
| ViableCallable.cs:12:9:12:28 | call to method M<Int32> | M`1 | C4`1 |
| ViableCallable.cs:12:9:12:28 | call to method M<Int32> | M`1 | C5 |
| ViableCallable.cs:12:9:12:28 | call to method M<Int32> | M`1 | C6`2 |
| ViableCallable.cs:12:9:12:28 | call to method M<Int32> | M`1 | C7`1 |
| ViableCallable.cs:14:9:14:15 | access to property Prop | set_Prop | C2`1 |
| ViableCallable.cs:14:9:14:15 | access to property Prop | set_Prop | C3 |
| ViableCallable.cs:14:9:14:15 | access to property Prop | set_Prop | C4`1 |
| ViableCallable.cs:14:9:14:15 | access to property Prop | set_Prop | C5 |
| ViableCallable.cs:14:9:14:15 | access to property Prop | set_Prop | C6`2 |
| ViableCallable.cs:14:9:14:15 | access to property Prop | set_Prop | C7`1 |
| ViableCallable.cs:14:19:14:25 | access to property Prop | get_Prop | C2`1 |
| ViableCallable.cs:14:19:14:25 | access to property Prop | get_Prop | C3 |
| ViableCallable.cs:14:19:14:25 | access to property Prop | get_Prop | C4`1 |
| ViableCallable.cs:14:19:14:25 | access to property Prop | get_Prop | C5 |
| ViableCallable.cs:14:19:14:25 | access to property Prop | get_Prop | C6`2 |
| ViableCallable.cs:14:19:14:25 | access to property Prop | get_Prop | C7`1 |
| ViableCallable.cs:16:9:16:23 | access to indexer | set_Item | C2`1 |
| ViableCallable.cs:16:9:16:23 | access to indexer | set_Item | C3 |
| ViableCallable.cs:16:9:16:23 | access to indexer | set_Item | C4`1 |
| ViableCallable.cs:16:9:16:23 | access to indexer | set_Item | C5 |
| ViableCallable.cs:16:9:16:23 | access to indexer | set_Item | C6`2 |
| ViableCallable.cs:16:9:16:23 | access to indexer | set_Item | C7`1 |
| ViableCallable.cs:16:27:16:41 | access to indexer | get_Item | C2`1 |
| ViableCallable.cs:16:27:16:41 | access to indexer | get_Item | C3 |
| ViableCallable.cs:16:27:16:41 | access to indexer | get_Item | C4`1 |
| ViableCallable.cs:16:27:16:41 | access to indexer | get_Item | C5 |
| ViableCallable.cs:16:27:16:41 | access to indexer | get_Item | C6`2 |
| ViableCallable.cs:16:27:16:41 | access to indexer | get_Item | C7`1 |
| ViableCallable.cs:18:9:18:16 | access to event Event | add_Event | C2`1 |
| ViableCallable.cs:18:9:18:16 | access to event Event | add_Event | C3 |
| ViableCallable.cs:18:9:18:16 | access to event Event | add_Event | C4`1 |
| ViableCallable.cs:18:9:18:16 | access to event Event | add_Event | C5 |
| ViableCallable.cs:18:9:18:16 | access to event Event | add_Event | C6`2 |
| ViableCallable.cs:18:9:18:16 | access to event Event | add_Event | C7`1 |
| ViableCallable.cs:19:9:19:16 | access to event Event | remove_Event | C2`1 |
| ViableCallable.cs:19:9:19:16 | access to event Event | remove_Event | C3 |
| ViableCallable.cs:19:9:19:16 | access to event Event | remove_Event | C4`1 |
| ViableCallable.cs:19:9:19:16 | access to event Event | remove_Event | C5 |
| ViableCallable.cs:19:9:19:16 | access to event Event | remove_Event | C6`2 |
| ViableCallable.cs:19:9:19:16 | access to event Event | remove_Event | C7`1 |
| ViableCallable.cs:22:9:22:30 | call to method M<Boolean> | M`1 | C4`1 |
| ViableCallable.cs:22:9:22:30 | call to method M<Boolean> | M`1 | C6`2 |
| ViableCallable.cs:24:9:24:15 | access to property Prop | set_Prop | C4`1 |
| ViableCallable.cs:24:9:24:15 | access to property Prop | set_Prop | C6`2 |
| ViableCallable.cs:24:19:24:25 | access to property Prop | get_Prop | C4`1 |
| ViableCallable.cs:24:19:24:25 | access to property Prop | get_Prop | C6`2 |
| ViableCallable.cs:26:9:26:23 | access to indexer | set_Item | C4`1 |
| ViableCallable.cs:26:9:26:23 | access to indexer | set_Item | C6`2 |
| ViableCallable.cs:26:27:26:41 | access to indexer | get_Item | C4`1 |
| ViableCallable.cs:26:27:26:41 | access to indexer | get_Item | C6`2 |
| ViableCallable.cs:28:9:28:16 | access to event Event | add_Event | C4`1 |
| ViableCallable.cs:28:9:28:16 | access to event Event | add_Event | C6`2 |
| ViableCallable.cs:29:9:29:16 | access to event Event | remove_Event | C4`1 |
| ViableCallable.cs:29:9:29:16 | access to event Event | remove_Event | C6`2 |
| ViableCallable.cs:33:9:33:23 | call to method M<Int32> | M`1 | C2`1 |
| ViableCallable.cs:33:9:33:23 | call to method M<Int32> | M`1 | C6`2 |
| ViableCallable.cs:35:9:35:15 | access to property Prop | set_Prop | C2`1 |
| ViableCallable.cs:35:9:35:15 | access to property Prop | set_Prop | C6`2 |
| ViableCallable.cs:35:19:35:25 | access to property Prop | get_Prop | C2`1 |
| ViableCallable.cs:35:19:35:25 | access to property Prop | get_Prop | C6`2 |
| ViableCallable.cs:37:9:37:13 | access to indexer | set_Item | C2`1 |
| ViableCallable.cs:37:9:37:13 | access to indexer | set_Item | C6`2 |
| ViableCallable.cs:37:17:37:21 | access to indexer | get_Item | C2`1 |
| ViableCallable.cs:37:17:37:21 | access to indexer | get_Item | C6`2 |
| ViableCallable.cs:39:9:39:16 | access to event Event | add_Event | C2`1 |
| ViableCallable.cs:39:9:39:16 | access to event Event | add_Event | C6`2 |
| ViableCallable.cs:40:9:40:16 | access to event Event | remove_Event | C2`1 |
| ViableCallable.cs:40:9:40:16 | access to event Event | remove_Event | C6`2 |
| ViableCallable.cs:44:9:44:24 | call to method M<Double> | M`1 | C2`1 |
| ViableCallable.cs:44:9:44:24 | call to method M<Double> | M`1 | C3 |
| ViableCallable.cs:44:9:44:24 | call to method M<Double> | M`1 | C6`2 |
| ViableCallable.cs:46:9:46:15 | access to property Prop | set_Prop | C2`1 |
| ViableCallable.cs:46:9:46:15 | access to property Prop | set_Prop | C3 |
| ViableCallable.cs:46:9:46:15 | access to property Prop | set_Prop | C6`2 |
| ViableCallable.cs:46:19:46:25 | access to property Prop | get_Prop | C2`1 |
| ViableCallable.cs:46:19:46:25 | access to property Prop | get_Prop | C3 |
| ViableCallable.cs:46:19:46:25 | access to property Prop | get_Prop | C6`2 |
| ViableCallable.cs:48:9:48:14 | access to indexer | set_Item | C2`1 |
| ViableCallable.cs:48:9:48:14 | access to indexer | set_Item | C3 |
| ViableCallable.cs:48:9:48:14 | access to indexer | set_Item | C6`2 |
| ViableCallable.cs:48:18:48:23 | access to indexer | get_Item | C2`1 |
| ViableCallable.cs:48:18:48:23 | access to indexer | get_Item | C3 |
| ViableCallable.cs:48:18:48:23 | access to indexer | get_Item | C6`2 |
| ViableCallable.cs:50:9:50:16 | access to event Event | add_Event | C2`1 |
| ViableCallable.cs:50:9:50:16 | access to event Event | add_Event | C3 |
| ViableCallable.cs:50:9:50:16 | access to event Event | add_Event | C6`2 |
| ViableCallable.cs:51:9:51:16 | access to event Event | remove_Event | C2`1 |
| ViableCallable.cs:51:9:51:16 | access to event Event | remove_Event | C3 |
| ViableCallable.cs:51:9:51:16 | access to event Event | remove_Event | C6`2 |
| ViableCallable.cs:55:9:55:44 | call to method M<Object> | M`1 | C4`1 |
| ViableCallable.cs:55:9:55:44 | call to method M<Object> | M`1 | C6`2 |
| ViableCallable.cs:57:9:57:15 | access to property Prop | set_Prop | C4`1 |
| ViableCallable.cs:57:9:57:15 | access to property Prop | set_Prop | C6`2 |
| ViableCallable.cs:57:19:57:25 | access to property Prop | get_Prop | C4`1 |
| ViableCallable.cs:57:19:57:25 | access to property Prop | get_Prop | C6`2 |
| ViableCallable.cs:59:9:59:17 | access to indexer | set_Item | C4`1 |
| ViableCallable.cs:59:9:59:17 | access to indexer | set_Item | C6`2 |
| ViableCallable.cs:59:21:59:29 | access to indexer | get_Item | C4`1 |
| ViableCallable.cs:59:21:59:29 | access to indexer | get_Item | C6`2 |
| ViableCallable.cs:61:9:61:16 | access to event Event | add_Event | C4`1 |
| ViableCallable.cs:61:9:61:16 | access to event Event | add_Event | C6`2 |
| ViableCallable.cs:62:9:62:16 | access to event Event | remove_Event | C4`1 |
| ViableCallable.cs:62:9:62:16 | access to event Event | remove_Event | C6`2 |
| ViableCallable.cs:66:9:66:30 | call to method M<Object> | M`1 | C2`1 |
| ViableCallable.cs:66:9:66:30 | call to method M<Object> | M`1 | C5 |
| ViableCallable.cs:66:9:66:30 | call to method M<Object> | M`1 | C6`2 |
| ViableCallable.cs:68:9:68:15 | access to property Prop | set_Prop | C2`1 |
| ViableCallable.cs:68:9:68:15 | access to property Prop | set_Prop | C5 |
| ViableCallable.cs:68:9:68:15 | access to property Prop | set_Prop | C6`2 |
| ViableCallable.cs:68:19:68:25 | access to property Prop | get_Prop | C2`1 |
| ViableCallable.cs:68:19:68:25 | access to property Prop | get_Prop | C5 |
| ViableCallable.cs:68:19:68:25 | access to property Prop | get_Prop | C6`2 |
| ViableCallable.cs:70:9:70:17 | access to indexer | set_Item | C2`1 |
| ViableCallable.cs:70:9:70:17 | access to indexer | set_Item | C5 |
| ViableCallable.cs:70:9:70:17 | access to indexer | set_Item | C6`2 |
| ViableCallable.cs:70:21:70:29 | access to indexer | get_Item | C2`1 |
| ViableCallable.cs:70:21:70:29 | access to indexer | get_Item | C5 |
| ViableCallable.cs:70:21:70:29 | access to indexer | get_Item | C6`2 |
| ViableCallable.cs:72:9:72:16 | access to event Event | add_Event | C2`1 |
| ViableCallable.cs:72:9:72:16 | access to event Event | add_Event | C5 |
| ViableCallable.cs:72:9:72:16 | access to event Event | add_Event | C6`2 |
| ViableCallable.cs:73:9:73:16 | access to event Event | remove_Event | C2`1 |
| ViableCallable.cs:73:9:73:16 | access to event Event | remove_Event | C5 |
| ViableCallable.cs:73:9:73:16 | access to event Event | remove_Event | C6`2 |
| ViableCallable.cs:76:27:76:44 | object creation of type C6<T1,Boolean> | C6 | C6`2 |
| ViableCallable.cs:77:9:77:29 | call to method M<String> | M`1 | C6`2 |
| ViableCallable.cs:79:9:79:15 | access to property Prop | set_Prop | C6`2 |
| ViableCallable.cs:79:19:79:25 | access to property Prop | get_Prop | C6`2 |
| ViableCallable.cs:81:9:81:17 | access to indexer | set_Item | C6`2 |
| ViableCallable.cs:81:21:81:29 | access to indexer | get_Item | C6`2 |
| ViableCallable.cs:83:9:83:16 | access to event Event | add_Event | C6`2 |
| ViableCallable.cs:84:9:84:16 | access to event Event | remove_Event | C6`2 |
| ViableCallable.cs:88:9:88:44 | dynamic call to method M | M | C8 |
| ViableCallable.cs:88:9:88:44 | dynamic call to method M | M | C9`1 |
| ViableCallable.cs:90:9:90:15 | dynamic access to member Prop1 | set_Prop1 | C8 |
| ViableCallable.cs:90:9:90:15 | dynamic access to member Prop1 | set_Prop1 | C9`1 |
| ViableCallable.cs:90:19:90:25 | dynamic access to member Prop1 | get_Prop1 | C8 |
| ViableCallable.cs:90:19:90:25 | dynamic access to member Prop1 | get_Prop1 | C9`1 |
| ViableCallable.cs:92:9:92:12 | dynamic access to element | set_Item | C8 |
| ViableCallable.cs:92:9:92:12 | dynamic access to element | set_Item | C9`1 |
| ViableCallable.cs:92:16:92:19 | dynamic access to element | get_Item | C8 |
| ViableCallable.cs:92:16:92:19 | dynamic access to element | get_Item | C9`1 |
| ViableCallable.cs:99:9:99:15 | dynamic call to method M | M | C5 |
| ViableCallable.cs:102:9:102:16 | access to property Prop2 | set_Prop2 | C5 |
| ViableCallable.cs:105:9:105:17 | access to event Event2 | add_Event2 | C5 |
| ViableCallable.cs:106:9:106:17 | access to event Event2 | remove_Event2 | C5 |
| ViableCallable.cs:120:9:120:25 | dynamic call to method M2 | M2`1 | C8 |
| ViableCallable.cs:124:9:124:24 | dynamic call to method M2 | M2`1 | C8 |
| ViableCallable.cs:131:13:131:30 | object creation of type C6<T1,Byte> | C6 | C6`2 |
| ViableCallable.cs:132:9:132:28 | dynamic call to method M | M`1 | C6`2 |
| ViableCallable.cs:134:9:134:14 | dynamic access to member Prop | set_Prop | C6`2 |
| ViableCallable.cs:134:18:134:23 | dynamic access to member Prop | get_Prop | C6`2 |
| ViableCallable.cs:136:9:136:18 | dynamic access to element | set_Item | C6`2 |
| ViableCallable.cs:136:22:136:31 | dynamic access to element | get_Item | C6`2 |
| ViableCallable.cs:138:9:138:52 | ... += ... | add_Event | C6`2 |
| ViableCallable.cs:139:9:139:52 | ... -= ... | remove_Event | C6`2 |
| ViableCallable.cs:143:9:143:14 | dynamic call to method M3 | M3 | C8 |
| ViableCallable.cs:143:9:143:14 | dynamic call to method M3 | M3 | C9`1 |
| ViableCallable.cs:144:9:144:15 | dynamic call to method M3 | M3 | C8 |
| ViableCallable.cs:144:9:144:15 | dynamic call to method M3 | M3 | C9`1 |
| ViableCallable.cs:145:9:145:20 | dynamic call to method M3 | M3 | C8 |
| ViableCallable.cs:145:9:145:20 | dynamic call to method M3 | M3 | C9`1 |
| ViableCallable.cs:149:9:149:14 | dynamic call to method M5 | M5 | C8 |
| ViableCallable.cs:149:9:149:14 | dynamic call to method M5 | M5 | C9`1 |
| ViableCallable.cs:150:9:150:15 | dynamic call to method M5 | M5 | C8 |
| ViableCallable.cs:150:9:150:15 | dynamic call to method M5 | M5 | C9`1 |
| ViableCallable.cs:151:9:151:20 | dynamic call to method M5 | M5 | C8 |
| ViableCallable.cs:151:9:151:20 | dynamic call to method M5 | M5 | C9`1 |
| ViableCallable.cs:154:9:154:16 | dynamic call to method M3 | M3 | C8 |
| ViableCallable.cs:154:9:154:16 | dynamic call to method M3 | M3 | C9`1 |
| ViableCallable.cs:154:9:154:16 | dynamic call to method M3 | M3 | C10 |
| ViableCallable.cs:155:9:155:17 | dynamic call to method M3 | M3 | C8 |
| ViableCallable.cs:155:9:155:17 | dynamic call to method M3 | M3 | C9`1 |
| ViableCallable.cs:155:9:155:17 | dynamic call to method M3 | M3 | C10 |
| ViableCallable.cs:156:9:156:22 | dynamic call to method M3 | M3 | C8 |
| ViableCallable.cs:156:9:156:22 | dynamic call to method M3 | M3 | C9`1 |
| ViableCallable.cs:156:9:156:22 | dynamic call to method M3 | M3 | C10 |
| ViableCallable.cs:158:9:158:16 | dynamic call to method M5 | M5 | C8 |
| ViableCallable.cs:158:9:158:16 | dynamic call to method M5 | M5 | C9`1 |
| ViableCallable.cs:158:9:158:16 | dynamic call to method M5 | M5 | C10 |
| ViableCallable.cs:159:9:159:17 | dynamic call to method M5 | M5 | C8 |
| ViableCallable.cs:159:9:159:17 | dynamic call to method M5 | M5 | C9`1 |
| ViableCallable.cs:159:9:159:17 | dynamic call to method M5 | M5 | C10 |
| ViableCallable.cs:160:9:160:22 | dynamic call to method M5 | M5 | C8 |
| ViableCallable.cs:160:9:160:22 | dynamic call to method M5 | M5 | C9`1 |
| ViableCallable.cs:160:9:160:22 | dynamic call to method M5 | M5 | C10 |
| ViableCallable.cs:162:9:162:17 | dynamic access to member Prop1 | set_Prop1 | C8 |
| ViableCallable.cs:162:9:162:17 | dynamic access to member Prop1 | set_Prop1 | C9`1 |
| ViableCallable.cs:162:9:162:17 | dynamic access to member Prop1 | set_Prop1 | C10 |
| ViableCallable.cs:162:21:162:29 | dynamic access to member Prop1 | get_Prop1 | C8 |
| ViableCallable.cs:162:21:162:29 | dynamic access to member Prop1 | get_Prop1 | C9`1 |
| ViableCallable.cs:162:21:162:29 | dynamic access to member Prop1 | get_Prop1 | C10 |
| ViableCallable.cs:164:9:164:14 | dynamic access to element | set_Item | C2`1 |
| ViableCallable.cs:164:9:164:14 | dynamic access to element | set_Item | C3 |
| ViableCallable.cs:164:9:164:14 | dynamic access to element | set_Item | C6`2 |
| ViableCallable.cs:164:9:164:14 | dynamic access to element | set_Item | C7`1 |
| ViableCallable.cs:164:9:164:14 | dynamic access to element | set_Item | C8 |
| ViableCallable.cs:164:9:164:14 | dynamic access to element | set_Item | C9`1 |
| ViableCallable.cs:164:9:164:14 | dynamic access to element | set_Item | C10 |
| ViableCallable.cs:164:18:164:23 | dynamic access to element | get_Item | C2`1 |
| ViableCallable.cs:164:18:164:23 | dynamic access to element | get_Item | C3 |
| ViableCallable.cs:164:18:164:23 | dynamic access to element | get_Item | C6`2 |
| ViableCallable.cs:164:18:164:23 | dynamic access to element | get_Item | C7`1 |
| ViableCallable.cs:164:18:164:23 | dynamic access to element | get_Item | C8 |
| ViableCallable.cs:164:18:164:23 | dynamic access to element | get_Item | C9`1 |
| ViableCallable.cs:164:18:164:23 | dynamic access to element | get_Item | C10 |
| ViableCallable.cs:166:9:166:54 | ... += ... | add_Event | C2`1 |
| ViableCallable.cs:166:9:166:54 | ... += ... | add_Event | C3 |
| ViableCallable.cs:166:9:166:54 | ... += ... | add_Event | C5 |
| ViableCallable.cs:166:9:166:54 | ... += ... | add_Event | C6`2 |
| ViableCallable.cs:166:9:166:54 | ... += ... | add_Event | C7`1 |
| ViableCallable.cs:166:9:166:54 | ... += ... | add_Event | C8 |
| ViableCallable.cs:166:9:166:54 | ... += ... | add_Event | C9`1 |
| ViableCallable.cs:167:9:167:54 | ... -= ... | remove_Event | C2`1 |
| ViableCallable.cs:167:9:167:54 | ... -= ... | remove_Event | C3 |
| ViableCallable.cs:167:9:167:54 | ... -= ... | remove_Event | C5 |
| ViableCallable.cs:167:9:167:54 | ... -= ... | remove_Event | C6`2 |
| ViableCallable.cs:167:9:167:54 | ... -= ... | remove_Event | C7`1 |
| ViableCallable.cs:167:9:167:54 | ... -= ... | remove_Event | C8 |
| ViableCallable.cs:167:9:167:54 | ... -= ... | remove_Event | C9`1 |
| ViableCallable.cs:170:9:170:40 | dynamic call to method M4 | M4 | C8 |
| ViableCallable.cs:171:9:171:38 | dynamic call to method M4 | M4 | C8 |
| ViableCallable.cs:174:9:174:17 | dynamic access to member Prop1 | set_Prop1 | C10 |
| ViableCallable.cs:184:9:184:15 | dynamic access to element | set_Item | C2`1 |
| ViableCallable.cs:184:9:184:15 | dynamic access to element | set_Item | C6`2 |
| ViableCallable.cs:184:19:184:25 | dynamic access to element | get_Item | C2`1 |
| ViableCallable.cs:184:19:184:25 | dynamic access to element | get_Item | C6`2 |
| ViableCallable.cs:188:13:188:17 | dynamic call to operator + | + | Decimal |
| ViableCallable.cs:188:13:188:17 | dynamic call to operator + | + | Double |
| ViableCallable.cs:188:13:188:17 | dynamic call to operator + | + | Int32 |
| ViableCallable.cs:188:13:188:17 | dynamic call to operator + | + | Int64 |
| ViableCallable.cs:188:13:188:17 | dynamic call to operator + | + | Int128 |
| ViableCallable.cs:188:13:188:17 | dynamic call to operator + | + | NFloat |
| ViableCallable.cs:188:13:188:17 | dynamic call to operator + | + | Single |
| ViableCallable.cs:190:13:190:17 | dynamic call to operator - | - | Decimal |
| ViableCallable.cs:190:13:190:17 | dynamic call to operator - | - | Double |
| ViableCallable.cs:190:13:190:17 | dynamic call to operator - | - | Int32 |
| ViableCallable.cs:190:13:190:17 | dynamic call to operator - | - | Int64 |
| ViableCallable.cs:190:13:190:17 | dynamic call to operator - | - | Int128 |
| ViableCallable.cs:190:13:190:17 | dynamic call to operator - | - | NFloat |
| ViableCallable.cs:190:13:190:17 | dynamic call to operator - | - | Single |
| ViableCallable.cs:192:13:192:18 | dynamic call to operator + | + | Decimal |
| ViableCallable.cs:192:13:192:18 | dynamic call to operator + | + | Double |
| ViableCallable.cs:192:13:192:18 | dynamic call to operator + | + | Int32 |
| ViableCallable.cs:192:13:192:18 | dynamic call to operator + | + | Int64 |
| ViableCallable.cs:192:13:192:18 | dynamic call to operator + | + | Int128 |
| ViableCallable.cs:192:13:192:18 | dynamic call to operator + | + | NFloat |
| ViableCallable.cs:192:13:192:18 | dynamic call to operator + | + | Single |
| ViableCallable.cs:195:17:195:25 | object creation of type C10 | C10 | C10 |
| ViableCallable.cs:196:9:196:153 | call to method InvokeMember | + | C10 |
| ViableCallable.cs:199:9:199:143 | call to method InvokeMember | get_Prop3 | C10 |
| ViableCallable.cs:200:9:200:149 | call to method InvokeMember | set_Prop3 | C10 |
| ViableCallable.cs:203:9:203:146 | call to method InvokeMember | get_Item | C10 |
| ViableCallable.cs:204:9:204:152 | call to method InvokeMember | set_Item | C10 |
| ViableCallable.cs:208:9:208:147 | call to method InvokeMember | add_Event | C10 |
| ViableCallable.cs:209:9:209:150 | call to method InvokeMember | remove_Event | C10 |
| ViableCallable.cs:244:9:244:15 | call to method M<Int32> | M`1 | C2`1 |
| ViableCallable.cs:244:9:244:15 | call to method M<Int32> | M`1 | C3 |
| ViableCallable.cs:244:9:244:15 | call to method M<Int32> | M`1 | C4`1 |
| ViableCallable.cs:244:9:244:15 | call to method M<Int32> | M`1 | C5 |
| ViableCallable.cs:244:9:244:15 | call to method M<Int32> | M`1 | C6`2 |
| ViableCallable.cs:244:9:244:15 | call to method M<Int32> | M`1 | C7`1 |
| ViableCallable.cs:293:9:293:15 | call to method M<Int32> | M`1 | C6`2 |
| ViableCallable.cs:293:9:293:15 | call to method M<Int32> | M`1 | C7`1 |
| ViableCallable.cs:296:9:296:20 | call to method M<Int32> | M`1 | C6`2 |
| ViableCallable.cs:296:9:296:20 | call to method M<Int32> | M`1 | C7`1 |
| ViableCallable.cs:310:9:310:15 | call to method M<Int32> | M`1 | C7`1 |
| ViableCallable.cs:313:9:313:20 | call to method M<Int32> | M`1 | C7`1 |
| ViableCallable.cs:316:9:316:20 | call to method M<Int32> | M`1 | C6`2 |
| ViableCallable.cs:366:9:366:14 | dynamic call to method M | M | C11 |
| ViableCallable.cs:368:9:368:18 | dynamic object creation of type C11 | C11 | C11 |
| ViableCallable.cs:391:9:391:13 | call to method M | M | C13 |
| ViableCallable.cs:424:9:424:18 | call to method M<Int32> | M`1 | A1 |
| ViableCallable.cs:424:9:424:18 | call to method M<Int32> | M`1 | A4 |
| ViableCallable.cs:424:9:424:18 | call to method M<Int32> | M`1 | A5 |
| ViableCallable.cs:426:13:426:20 | object creation of type A3 | A3 | A3 |
| ViableCallable.cs:428:9:428:19 | call to method M<Boolean> | M`1 | A1 |
| ViableCallable.cs:430:13:430:20 | object creation of type A4 | A4 | A4 |
| ViableCallable.cs:432:9:432:21 | call to method M<String> | M`1 | A4 |
| ViableCallable.cs:436:9:436:21 | call to method M<String> | M`1 | A4 |
| ViableCallable.cs:436:9:436:21 | call to method M<String> | M`1 | A5 |
| ViableCallable.cs:491:9:491:14 | call to method M1 | M1 | C18 |
| ViableCallable.cs:494:9:494:14 | call to method M2 | M2 | I2 |
| ViableCallable.cs:508:18:508:22 | call to operator + | + | C19 |
| ViableCallable.cs:511:26:511:30 | call to operator checked + | checked + | C19 |
| ViableCallable.cs:514:18:514:23 | call to operator explicit conversion | explicit conversion | C19 |
| ViableCallable.cs:517:26:517:31 | call to operator checked explicit conversion | checked explicit conversion | C19 |
| ViableCallable.cs:558:18:558:22 | call to operator + | + | C20 |
| ViableCallable.cs:561:26:561:30 | call to operator checked + | checked + | C20 |
| ViableCallable.cs:564:18:564:22 | call to operator - | - | C20 |
| ViableCallable.cs:567:26:567:30 | call to operator checked - | checked - | I3`1 |
| ViableCallable.cs:570:18:570:22 | call to operator * | * | I3`1 |
| ViableCallable.cs:573:26:573:30 | call to operator checked * | checked * | I3`1 |
| ViableCallable.cs:576:18:576:22 | call to operator / | / | C20 |
| ViableCallable.cs:576:18:576:22 | call to operator / | / | I3`1 |
| ViableCallable.cs:579:26:579:30 | call to operator checked / | checked / | C20 |
| ViableCallable.cs:579:26:579:30 | call to operator checked / | checked / | I3`1 |
| ViableCallable.cs:582:9:582:15 | call to method M11 | M11 | C20 |
| ViableCallable.cs:585:9:585:15 | call to method M12 | M12 | C20 |
| ViableCallable.cs:585:9:585:15 | call to method M12 | M12 | I3`1 |
| ViableCallable.cs:588:9:588:15 | call to method M13 | M13 | I3`1 |
| ViableCallable.cs:13:9:13:28 | call to method M<Int32> | M`1 | C2`1 |
| ViableCallable.cs:13:9:13:28 | call to method M<Int32> | M`1 | C3 |
| ViableCallable.cs:13:9:13:28 | call to method M<Int32> | M`1 | C4`1 |
| ViableCallable.cs:13:9:13:28 | call to method M<Int32> | M`1 | C5 |
| ViableCallable.cs:13:9:13:28 | call to method M<Int32> | M`1 | C6`2 |
| ViableCallable.cs:13:9:13:28 | call to method M<Int32> | M`1 | C7`1 |
| ViableCallable.cs:15:9:15:15 | access to property Prop | set_Prop | C2`1 |
| ViableCallable.cs:15:9:15:15 | access to property Prop | set_Prop | C3 |
| ViableCallable.cs:15:9:15:15 | access to property Prop | set_Prop | C4`1 |
| ViableCallable.cs:15:9:15:15 | access to property Prop | set_Prop | C5 |
| ViableCallable.cs:15:9:15:15 | access to property Prop | set_Prop | C6`2 |
| ViableCallable.cs:15:9:15:15 | access to property Prop | set_Prop | C7`1 |
| ViableCallable.cs:15:19:15:25 | access to property Prop | get_Prop | C2`1 |
| ViableCallable.cs:15:19:15:25 | access to property Prop | get_Prop | C3 |
| ViableCallable.cs:15:19:15:25 | access to property Prop | get_Prop | C4`1 |
| ViableCallable.cs:15:19:15:25 | access to property Prop | get_Prop | C5 |
| ViableCallable.cs:15:19:15:25 | access to property Prop | get_Prop | C6`2 |
| ViableCallable.cs:15:19:15:25 | access to property Prop | get_Prop | C7`1 |
| ViableCallable.cs:17:9:17:23 | access to indexer | set_Item | C2`1 |
| ViableCallable.cs:17:9:17:23 | access to indexer | set_Item | C3 |
| ViableCallable.cs:17:9:17:23 | access to indexer | set_Item | C4`1 |
| ViableCallable.cs:17:9:17:23 | access to indexer | set_Item | C5 |
| ViableCallable.cs:17:9:17:23 | access to indexer | set_Item | C6`2 |
| ViableCallable.cs:17:9:17:23 | access to indexer | set_Item | C7`1 |
| ViableCallable.cs:17:27:17:41 | access to indexer | get_Item | C2`1 |
| ViableCallable.cs:17:27:17:41 | access to indexer | get_Item | C3 |
| ViableCallable.cs:17:27:17:41 | access to indexer | get_Item | C4`1 |
| ViableCallable.cs:17:27:17:41 | access to indexer | get_Item | C5 |
| ViableCallable.cs:17:27:17:41 | access to indexer | get_Item | C6`2 |
| ViableCallable.cs:17:27:17:41 | access to indexer | get_Item | C7`1 |
| ViableCallable.cs:19:9:19:16 | access to event Event | add_Event | C2`1 |
| ViableCallable.cs:19:9:19:16 | access to event Event | add_Event | C3 |
| ViableCallable.cs:19:9:19:16 | access to event Event | add_Event | C4`1 |
| ViableCallable.cs:19:9:19:16 | access to event Event | add_Event | C5 |
| ViableCallable.cs:19:9:19:16 | access to event Event | add_Event | C6`2 |
| ViableCallable.cs:19:9:19:16 | access to event Event | add_Event | C7`1 |
| ViableCallable.cs:20:9:20:16 | access to event Event | remove_Event | C2`1 |
| ViableCallable.cs:20:9:20:16 | access to event Event | remove_Event | C3 |
| ViableCallable.cs:20:9:20:16 | access to event Event | remove_Event | C4`1 |
| ViableCallable.cs:20:9:20:16 | access to event Event | remove_Event | C5 |
| ViableCallable.cs:20:9:20:16 | access to event Event | remove_Event | C6`2 |
| ViableCallable.cs:20:9:20:16 | access to event Event | remove_Event | C7`1 |
| ViableCallable.cs:23:9:23:30 | call to method M<Boolean> | M`1 | C4`1 |
| ViableCallable.cs:23:9:23:30 | call to method M<Boolean> | M`1 | C6`2 |
| ViableCallable.cs:25:9:25:15 | access to property Prop | set_Prop | C4`1 |
| ViableCallable.cs:25:9:25:15 | access to property Prop | set_Prop | C6`2 |
| ViableCallable.cs:25:19:25:25 | access to property Prop | get_Prop | C4`1 |
| ViableCallable.cs:25:19:25:25 | access to property Prop | get_Prop | C6`2 |
| ViableCallable.cs:27:9:27:23 | access to indexer | set_Item | C4`1 |
| ViableCallable.cs:27:9:27:23 | access to indexer | set_Item | C6`2 |
| ViableCallable.cs:27:27:27:41 | access to indexer | get_Item | C4`1 |
| ViableCallable.cs:27:27:27:41 | access to indexer | get_Item | C6`2 |
| ViableCallable.cs:29:9:29:16 | access to event Event | add_Event | C4`1 |
| ViableCallable.cs:29:9:29:16 | access to event Event | add_Event | C6`2 |
| ViableCallable.cs:30:9:30:16 | access to event Event | remove_Event | C4`1 |
| ViableCallable.cs:30:9:30:16 | access to event Event | remove_Event | C6`2 |
| ViableCallable.cs:34:9:34:23 | call to method M<Int32> | M`1 | C2`1 |
| ViableCallable.cs:34:9:34:23 | call to method M<Int32> | M`1 | C6`2 |
| ViableCallable.cs:36:9:36:15 | access to property Prop | set_Prop | C2`1 |
| ViableCallable.cs:36:9:36:15 | access to property Prop | set_Prop | C6`2 |
| ViableCallable.cs:36:19:36:25 | access to property Prop | get_Prop | C2`1 |
| ViableCallable.cs:36:19:36:25 | access to property Prop | get_Prop | C6`2 |
| ViableCallable.cs:38:9:38:13 | access to indexer | set_Item | C2`1 |
| ViableCallable.cs:38:9:38:13 | access to indexer | set_Item | C6`2 |
| ViableCallable.cs:38:17:38:21 | access to indexer | get_Item | C2`1 |
| ViableCallable.cs:38:17:38:21 | access to indexer | get_Item | C6`2 |
| ViableCallable.cs:40:9:40:16 | access to event Event | add_Event | C2`1 |
| ViableCallable.cs:40:9:40:16 | access to event Event | add_Event | C6`2 |
| ViableCallable.cs:41:9:41:16 | access to event Event | remove_Event | C2`1 |
| ViableCallable.cs:41:9:41:16 | access to event Event | remove_Event | C6`2 |
| ViableCallable.cs:45:9:45:24 | call to method M<Double> | M`1 | C2`1 |
| ViableCallable.cs:45:9:45:24 | call to method M<Double> | M`1 | C3 |
| ViableCallable.cs:45:9:45:24 | call to method M<Double> | M`1 | C6`2 |
| ViableCallable.cs:47:9:47:15 | access to property Prop | set_Prop | C2`1 |
| ViableCallable.cs:47:9:47:15 | access to property Prop | set_Prop | C3 |
| ViableCallable.cs:47:9:47:15 | access to property Prop | set_Prop | C6`2 |
| ViableCallable.cs:47:19:47:25 | access to property Prop | get_Prop | C2`1 |
| ViableCallable.cs:47:19:47:25 | access to property Prop | get_Prop | C3 |
| ViableCallable.cs:47:19:47:25 | access to property Prop | get_Prop | C6`2 |
| ViableCallable.cs:49:9:49:14 | access to indexer | set_Item | C2`1 |
| ViableCallable.cs:49:9:49:14 | access to indexer | set_Item | C3 |
| ViableCallable.cs:49:9:49:14 | access to indexer | set_Item | C6`2 |
| ViableCallable.cs:49:18:49:23 | access to indexer | get_Item | C2`1 |
| ViableCallable.cs:49:18:49:23 | access to indexer | get_Item | C3 |
| ViableCallable.cs:49:18:49:23 | access to indexer | get_Item | C6`2 |
| ViableCallable.cs:51:9:51:16 | access to event Event | add_Event | C2`1 |
| ViableCallable.cs:51:9:51:16 | access to event Event | add_Event | C3 |
| ViableCallable.cs:51:9:51:16 | access to event Event | add_Event | C6`2 |
| ViableCallable.cs:52:9:52:16 | access to event Event | remove_Event | C2`1 |
| ViableCallable.cs:52:9:52:16 | access to event Event | remove_Event | C3 |
| ViableCallable.cs:52:9:52:16 | access to event Event | remove_Event | C6`2 |
| ViableCallable.cs:56:9:56:44 | call to method M<Object> | M`1 | C4`1 |
| ViableCallable.cs:56:9:56:44 | call to method M<Object> | M`1 | C6`2 |
| ViableCallable.cs:58:9:58:15 | access to property Prop | set_Prop | C4`1 |
| ViableCallable.cs:58:9:58:15 | access to property Prop | set_Prop | C6`2 |
| ViableCallable.cs:58:19:58:25 | access to property Prop | get_Prop | C4`1 |
| ViableCallable.cs:58:19:58:25 | access to property Prop | get_Prop | C6`2 |
| ViableCallable.cs:60:9:60:17 | access to indexer | set_Item | C4`1 |
| ViableCallable.cs:60:9:60:17 | access to indexer | set_Item | C6`2 |
| ViableCallable.cs:60:21:60:29 | access to indexer | get_Item | C4`1 |
| ViableCallable.cs:60:21:60:29 | access to indexer | get_Item | C6`2 |
| ViableCallable.cs:62:9:62:16 | access to event Event | add_Event | C4`1 |
| ViableCallable.cs:62:9:62:16 | access to event Event | add_Event | C6`2 |
| ViableCallable.cs:63:9:63:16 | access to event Event | remove_Event | C4`1 |
| ViableCallable.cs:63:9:63:16 | access to event Event | remove_Event | C6`2 |
| ViableCallable.cs:67:9:67:30 | call to method M<Object> | M`1 | C2`1 |
| ViableCallable.cs:67:9:67:30 | call to method M<Object> | M`1 | C5 |
| ViableCallable.cs:67:9:67:30 | call to method M<Object> | M`1 | C6`2 |
| ViableCallable.cs:69:9:69:15 | access to property Prop | set_Prop | C2`1 |
| ViableCallable.cs:69:9:69:15 | access to property Prop | set_Prop | C5 |
| ViableCallable.cs:69:9:69:15 | access to property Prop | set_Prop | C6`2 |
| ViableCallable.cs:69:19:69:25 | access to property Prop | get_Prop | C2`1 |
| ViableCallable.cs:69:19:69:25 | access to property Prop | get_Prop | C5 |
| ViableCallable.cs:69:19:69:25 | access to property Prop | get_Prop | C6`2 |
| ViableCallable.cs:71:9:71:17 | access to indexer | set_Item | C2`1 |
| ViableCallable.cs:71:9:71:17 | access to indexer | set_Item | C5 |
| ViableCallable.cs:71:9:71:17 | access to indexer | set_Item | C6`2 |
| ViableCallable.cs:71:21:71:29 | access to indexer | get_Item | C2`1 |
| ViableCallable.cs:71:21:71:29 | access to indexer | get_Item | C5 |
| ViableCallable.cs:71:21:71:29 | access to indexer | get_Item | C6`2 |
| ViableCallable.cs:73:9:73:16 | access to event Event | add_Event | C2`1 |
| ViableCallable.cs:73:9:73:16 | access to event Event | add_Event | C5 |
| ViableCallable.cs:73:9:73:16 | access to event Event | add_Event | C6`2 |
| ViableCallable.cs:74:9:74:16 | access to event Event | remove_Event | C2`1 |
| ViableCallable.cs:74:9:74:16 | access to event Event | remove_Event | C5 |
| ViableCallable.cs:74:9:74:16 | access to event Event | remove_Event | C6`2 |
| ViableCallable.cs:77:27:77:44 | object creation of type C6<T1,Boolean> | C6 | C6`2 |
| ViableCallable.cs:78:9:78:29 | call to method M<String> | M`1 | C6`2 |
| ViableCallable.cs:80:9:80:15 | access to property Prop | set_Prop | C6`2 |
| ViableCallable.cs:80:19:80:25 | access to property Prop | get_Prop | C6`2 |
| ViableCallable.cs:82:9:82:17 | access to indexer | set_Item | C6`2 |
| ViableCallable.cs:82:21:82:29 | access to indexer | get_Item | C6`2 |
| ViableCallable.cs:84:9:84:16 | access to event Event | add_Event | C6`2 |
| ViableCallable.cs:85:9:85:16 | access to event Event | remove_Event | C6`2 |
| ViableCallable.cs:89:9:89:44 | dynamic call to method M | M | C8 |
| ViableCallable.cs:89:9:89:44 | dynamic call to method M | M | C9`1 |
| ViableCallable.cs:91:9:91:15 | dynamic access to member Prop1 | set_Prop1 | C8 |
| ViableCallable.cs:91:9:91:15 | dynamic access to member Prop1 | set_Prop1 | C9`1 |
| ViableCallable.cs:91:19:91:25 | dynamic access to member Prop1 | get_Prop1 | C8 |
| ViableCallable.cs:91:19:91:25 | dynamic access to member Prop1 | get_Prop1 | C9`1 |
| ViableCallable.cs:93:9:93:12 | dynamic access to element | set_Item | C8 |
| ViableCallable.cs:93:9:93:12 | dynamic access to element | set_Item | C9`1 |
| ViableCallable.cs:93:16:93:19 | dynamic access to element | get_Item | C8 |
| ViableCallable.cs:93:16:93:19 | dynamic access to element | get_Item | C9`1 |
| ViableCallable.cs:100:9:100:15 | dynamic call to method M | M | C5 |
| ViableCallable.cs:103:9:103:16 | access to property Prop2 | set_Prop2 | C5 |
| ViableCallable.cs:106:9:106:17 | access to event Event2 | add_Event2 | C5 |
| ViableCallable.cs:107:9:107:17 | access to event Event2 | remove_Event2 | C5 |
| ViableCallable.cs:121:9:121:25 | dynamic call to method M2 | M2`1 | C8 |
| ViableCallable.cs:125:9:125:24 | dynamic call to method M2 | M2`1 | C8 |
| ViableCallable.cs:132:13:132:30 | object creation of type C6<T1,Byte> | C6 | C6`2 |
| ViableCallable.cs:133:9:133:28 | dynamic call to method M | M`1 | C6`2 |
| ViableCallable.cs:135:9:135:14 | dynamic access to member Prop | set_Prop | C6`2 |
| ViableCallable.cs:135:18:135:23 | dynamic access to member Prop | get_Prop | C6`2 |
| ViableCallable.cs:137:9:137:18 | dynamic access to element | set_Item | C6`2 |
| ViableCallable.cs:137:22:137:31 | dynamic access to element | get_Item | C6`2 |
| ViableCallable.cs:139:9:139:52 | ... += ... | add_Event | C6`2 |
| ViableCallable.cs:140:9:140:52 | ... -= ... | remove_Event | C6`2 |
| ViableCallable.cs:144:9:144:14 | dynamic call to method M3 | M3 | C8 |
| ViableCallable.cs:144:9:144:14 | dynamic call to method M3 | M3 | C9`1 |
| ViableCallable.cs:145:9:145:15 | dynamic call to method M3 | M3 | C8 |
| ViableCallable.cs:145:9:145:15 | dynamic call to method M3 | M3 | C9`1 |
| ViableCallable.cs:146:9:146:20 | dynamic call to method M3 | M3 | C8 |
| ViableCallable.cs:146:9:146:20 | dynamic call to method M3 | M3 | C9`1 |
| ViableCallable.cs:150:9:150:14 | dynamic call to method M5 | M5 | C8 |
| ViableCallable.cs:150:9:150:14 | dynamic call to method M5 | M5 | C9`1 |
| ViableCallable.cs:151:9:151:15 | dynamic call to method M5 | M5 | C8 |
| ViableCallable.cs:151:9:151:15 | dynamic call to method M5 | M5 | C9`1 |
| ViableCallable.cs:152:9:152:20 | dynamic call to method M5 | M5 | C8 |
| ViableCallable.cs:152:9:152:20 | dynamic call to method M5 | M5 | C9`1 |
| ViableCallable.cs:155:9:155:16 | dynamic call to method M3 | M3 | C8 |
| ViableCallable.cs:155:9:155:16 | dynamic call to method M3 | M3 | C9`1 |
| ViableCallable.cs:155:9:155:16 | dynamic call to method M3 | M3 | C10 |
| ViableCallable.cs:156:9:156:17 | dynamic call to method M3 | M3 | C8 |
| ViableCallable.cs:156:9:156:17 | dynamic call to method M3 | M3 | C9`1 |
| ViableCallable.cs:156:9:156:17 | dynamic call to method M3 | M3 | C10 |
| ViableCallable.cs:157:9:157:22 | dynamic call to method M3 | M3 | C8 |
| ViableCallable.cs:157:9:157:22 | dynamic call to method M3 | M3 | C9`1 |
| ViableCallable.cs:157:9:157:22 | dynamic call to method M3 | M3 | C10 |
| ViableCallable.cs:159:9:159:16 | dynamic call to method M5 | M5 | C8 |
| ViableCallable.cs:159:9:159:16 | dynamic call to method M5 | M5 | C9`1 |
| ViableCallable.cs:159:9:159:16 | dynamic call to method M5 | M5 | C10 |
| ViableCallable.cs:160:9:160:17 | dynamic call to method M5 | M5 | C8 |
| ViableCallable.cs:160:9:160:17 | dynamic call to method M5 | M5 | C9`1 |
| ViableCallable.cs:160:9:160:17 | dynamic call to method M5 | M5 | C10 |
| ViableCallable.cs:161:9:161:22 | dynamic call to method M5 | M5 | C8 |
| ViableCallable.cs:161:9:161:22 | dynamic call to method M5 | M5 | C9`1 |
| ViableCallable.cs:161:9:161:22 | dynamic call to method M5 | M5 | C10 |
| ViableCallable.cs:163:9:163:17 | dynamic access to member Prop1 | set_Prop1 | C8 |
| ViableCallable.cs:163:9:163:17 | dynamic access to member Prop1 | set_Prop1 | C9`1 |
| ViableCallable.cs:163:9:163:17 | dynamic access to member Prop1 | set_Prop1 | C10 |
| ViableCallable.cs:163:21:163:29 | dynamic access to member Prop1 | get_Prop1 | C8 |
| ViableCallable.cs:163:21:163:29 | dynamic access to member Prop1 | get_Prop1 | C9`1 |
| ViableCallable.cs:163:21:163:29 | dynamic access to member Prop1 | get_Prop1 | C10 |
| ViableCallable.cs:165:9:165:14 | dynamic access to element | set_Item | C2`1 |
| ViableCallable.cs:165:9:165:14 | dynamic access to element | set_Item | C3 |
| ViableCallable.cs:165:9:165:14 | dynamic access to element | set_Item | C6`2 |
| ViableCallable.cs:165:9:165:14 | dynamic access to element | set_Item | C7`1 |
| ViableCallable.cs:165:9:165:14 | dynamic access to element | set_Item | C8 |
| ViableCallable.cs:165:9:165:14 | dynamic access to element | set_Item | C9`1 |
| ViableCallable.cs:165:9:165:14 | dynamic access to element | set_Item | C10 |
| ViableCallable.cs:165:18:165:23 | dynamic access to element | get_Item | C2`1 |
| ViableCallable.cs:165:18:165:23 | dynamic access to element | get_Item | C3 |
| ViableCallable.cs:165:18:165:23 | dynamic access to element | get_Item | C6`2 |
| ViableCallable.cs:165:18:165:23 | dynamic access to element | get_Item | C7`1 |
| ViableCallable.cs:165:18:165:23 | dynamic access to element | get_Item | C8 |
| ViableCallable.cs:165:18:165:23 | dynamic access to element | get_Item | C9`1 |
| ViableCallable.cs:165:18:165:23 | dynamic access to element | get_Item | C10 |
| ViableCallable.cs:167:9:167:54 | ... += ... | add_Event | C2`1 |
| ViableCallable.cs:167:9:167:54 | ... += ... | add_Event | C3 |
| ViableCallable.cs:167:9:167:54 | ... += ... | add_Event | C5 |
| ViableCallable.cs:167:9:167:54 | ... += ... | add_Event | C6`2 |
| ViableCallable.cs:167:9:167:54 | ... += ... | add_Event | C7`1 |
| ViableCallable.cs:167:9:167:54 | ... += ... | add_Event | C8 |
| ViableCallable.cs:167:9:167:54 | ... += ... | add_Event | C9`1 |
| ViableCallable.cs:168:9:168:54 | ... -= ... | remove_Event | C2`1 |
| ViableCallable.cs:168:9:168:54 | ... -= ... | remove_Event | C3 |
| ViableCallable.cs:168:9:168:54 | ... -= ... | remove_Event | C5 |
| ViableCallable.cs:168:9:168:54 | ... -= ... | remove_Event | C6`2 |
| ViableCallable.cs:168:9:168:54 | ... -= ... | remove_Event | C7`1 |
| ViableCallable.cs:168:9:168:54 | ... -= ... | remove_Event | C8 |
| ViableCallable.cs:168:9:168:54 | ... -= ... | remove_Event | C9`1 |
| ViableCallable.cs:171:9:171:40 | dynamic call to method M4 | M4 | C8 |
| ViableCallable.cs:172:9:172:38 | dynamic call to method M4 | M4 | C8 |
| ViableCallable.cs:175:9:175:17 | dynamic access to member Prop1 | set_Prop1 | C10 |
| ViableCallable.cs:185:9:185:15 | dynamic access to element | set_Item | C2`1 |
| ViableCallable.cs:185:9:185:15 | dynamic access to element | set_Item | C6`2 |
| ViableCallable.cs:185:19:185:25 | dynamic access to element | get_Item | C2`1 |
| ViableCallable.cs:185:19:185:25 | dynamic access to element | get_Item | C6`2 |
| ViableCallable.cs:189:13:189:17 | dynamic call to operator + | + | Decimal |
| ViableCallable.cs:189:13:189:17 | dynamic call to operator + | + | Double |
| ViableCallable.cs:189:13:189:17 | dynamic call to operator + | + | Int32 |
| ViableCallable.cs:189:13:189:17 | dynamic call to operator + | + | Int64 |
| ViableCallable.cs:189:13:189:17 | dynamic call to operator + | + | Int128 |
| ViableCallable.cs:189:13:189:17 | dynamic call to operator + | + | NFloat |
| ViableCallable.cs:189:13:189:17 | dynamic call to operator + | + | Single |
| ViableCallable.cs:191:13:191:17 | dynamic call to operator - | - | Decimal |
| ViableCallable.cs:191:13:191:17 | dynamic call to operator - | - | Double |
| ViableCallable.cs:191:13:191:17 | dynamic call to operator - | - | Int32 |
| ViableCallable.cs:191:13:191:17 | dynamic call to operator - | - | Int64 |
| ViableCallable.cs:191:13:191:17 | dynamic call to operator - | - | Int128 |
| ViableCallable.cs:191:13:191:17 | dynamic call to operator - | - | NFloat |
| ViableCallable.cs:191:13:191:17 | dynamic call to operator - | - | Single |
| ViableCallable.cs:193:13:193:18 | dynamic call to operator + | + | Decimal |
| ViableCallable.cs:193:13:193:18 | dynamic call to operator + | + | Double |
| ViableCallable.cs:193:13:193:18 | dynamic call to operator + | + | Int32 |
| ViableCallable.cs:193:13:193:18 | dynamic call to operator + | + | Int64 |
| ViableCallable.cs:193:13:193:18 | dynamic call to operator + | + | Int128 |
| ViableCallable.cs:193:13:193:18 | dynamic call to operator + | + | NFloat |
| ViableCallable.cs:193:13:193:18 | dynamic call to operator + | + | Single |
| ViableCallable.cs:196:17:196:25 | object creation of type C10 | C10 | C10 |
| ViableCallable.cs:197:9:197:153 | call to method InvokeMember | + | C10 |
| ViableCallable.cs:200:9:200:143 | call to method InvokeMember | get_Prop3 | C10 |
| ViableCallable.cs:201:9:201:149 | call to method InvokeMember | set_Prop3 | C10 |
| ViableCallable.cs:204:9:204:146 | call to method InvokeMember | get_Item | C10 |
| ViableCallable.cs:205:9:205:152 | call to method InvokeMember | set_Item | C10 |
| ViableCallable.cs:209:9:209:147 | call to method InvokeMember | add_Event | C10 |
| ViableCallable.cs:210:9:210:150 | call to method InvokeMember | remove_Event | C10 |
| ViableCallable.cs:245:9:245:15 | call to method M<Int32> | M`1 | C2`1 |
| ViableCallable.cs:245:9:245:15 | call to method M<Int32> | M`1 | C3 |
| ViableCallable.cs:245:9:245:15 | call to method M<Int32> | M`1 | C4`1 |
| ViableCallable.cs:245:9:245:15 | call to method M<Int32> | M`1 | C5 |
| ViableCallable.cs:245:9:245:15 | call to method M<Int32> | M`1 | C6`2 |
| ViableCallable.cs:245:9:245:15 | call to method M<Int32> | M`1 | C7`1 |
| ViableCallable.cs:294:9:294:15 | call to method M<Int32> | M`1 | C6`2 |
| ViableCallable.cs:294:9:294:15 | call to method M<Int32> | M`1 | C7`1 |
| ViableCallable.cs:297:9:297:20 | call to method M<Int32> | M`1 | C6`2 |
| ViableCallable.cs:297:9:297:20 | call to method M<Int32> | M`1 | C7`1 |
| ViableCallable.cs:311:9:311:15 | call to method M<Int32> | M`1 | C7`1 |
| ViableCallable.cs:314:9:314:20 | call to method M<Int32> | M`1 | C7`1 |
| ViableCallable.cs:317:9:317:20 | call to method M<Int32> | M`1 | C6`2 |
| ViableCallable.cs:367:9:367:14 | dynamic call to method M | M | C11 |
| ViableCallable.cs:369:9:369:18 | dynamic object creation of type C11 | C11 | C11 |
| ViableCallable.cs:392:9:392:13 | call to method M | M | C13 |
| ViableCallable.cs:425:9:425:18 | call to method M<Int32> | M`1 | A1 |
| ViableCallable.cs:425:9:425:18 | call to method M<Int32> | M`1 | A4 |
| ViableCallable.cs:425:9:425:18 | call to method M<Int32> | M`1 | A5 |
| ViableCallable.cs:427:13:427:20 | object creation of type A3 | A3 | A3 |
| ViableCallable.cs:429:9:429:19 | call to method M<Boolean> | M`1 | A1 |
| ViableCallable.cs:431:13:431:20 | object creation of type A4 | A4 | A4 |
| ViableCallable.cs:433:9:433:21 | call to method M<String> | M`1 | A4 |
| ViableCallable.cs:437:9:437:21 | call to method M<String> | M`1 | A4 |
| ViableCallable.cs:437:9:437:21 | call to method M<String> | M`1 | A5 |
| ViableCallable.cs:492:9:492:14 | call to method M1 | M1 | C18 |
| ViableCallable.cs:495:9:495:14 | call to method M2 | M2 | I2 |
| ViableCallable.cs:509:18:509:22 | call to operator + | + | C19 |
| ViableCallable.cs:512:26:512:30 | call to operator checked + | checked + | C19 |
| ViableCallable.cs:515:18:515:23 | call to operator explicit conversion | explicit conversion | C19 |
| ViableCallable.cs:518:26:518:31 | call to operator checked explicit conversion | checked explicit conversion | C19 |
| ViableCallable.cs:559:18:559:22 | call to operator + | + | C20 |
| ViableCallable.cs:562:26:562:30 | call to operator checked + | checked + | C20 |
| ViableCallable.cs:565:18:565:22 | call to operator - | - | C20 |
| ViableCallable.cs:568:26:568:30 | call to operator checked - | checked - | I3`1 |
| ViableCallable.cs:571:18:571:22 | call to operator * | * | I3`1 |
| ViableCallable.cs:574:26:574:30 | call to operator checked * | checked * | I3`1 |
| ViableCallable.cs:577:18:577:22 | call to operator / | / | C20 |
| ViableCallable.cs:577:18:577:22 | call to operator / | / | I3`1 |
| ViableCallable.cs:580:26:580:30 | call to operator checked / | checked / | C20 |
| ViableCallable.cs:580:26:580:30 | call to operator checked / | checked / | I3`1 |
| ViableCallable.cs:583:9:583:15 | call to method M11 | M11 | C20 |
| ViableCallable.cs:586:9:586:15 | call to method M12 | M12 | C20 |
| ViableCallable.cs:586:9:586:15 | call to method M12 | M12 | I3`1 |
| ViableCallable.cs:589:9:589:15 | call to method M13 | M13 | I3`1 |

View File

@@ -15,5 +15,6 @@ The less commonly used categories are:
- ``database-access-result`` which represents a database access. Currently only used by JavaScript.
- ``file-write`` which represents opening a file in write mode. Currently only used in C#.
- ``reverse-dns`` which represents reverse DNS lookups. Currently only used in Java.
- ``view-component-input`` which represents inputs to a React, Vue, or Angular component (also known as "props"). Currently only used by JavaScript/TypeScript.
When running a CodeQL analysis, the ``remote`` threat model is included by default. You can optionally include other threat models as appropriate when using the CodeQL CLI and in GitHub code scanning. For more information, see `Analyzing your code with CodeQL queries <https://docs.github.com/code-security/codeql-cli/getting-started-with-the-codeql-cli/analyzing-your-code-with-codeql-queries#including-model-packs-to-add-potential-sources-of-tainted-data>`__ and `Customizing your advanced setup for code scanning <https://docs.github.com/code-security/code-scanning/creating-an-advanced-setup-for-code-scanning/customizing-your-advanced-setup-for-code-scanning#extending-codeql-coverage-with-threat-models>`__.

View File

@@ -26,6 +26,11 @@ class ThreatModelSource extends DataFlow::Node instanceof ThreatModelSource::Ran
/** Gets a string that describes the type of this threat-model source. */
string getSourceType() { result = super.getSourceType() }
/**
* Holds if this is a source of data that is specific to the web browser environment.
*/
predicate isClientSideSource() { super.isClientSideSource() }
}
/** Provides a class for modeling new sources for specific threat-models. */
@@ -48,6 +53,11 @@ module ThreatModelSource {
/** Gets a string that describes the type of this threat-model source. */
abstract string getSourceType();
/**
* Holds if this is a source of data that is specific to the web browser environment.
*/
predicate isClientSideSource() { this.getThreatModel() = "view-component-input" }
}
}

View File

@@ -0,0 +1,47 @@
/**
* Provides a classes and predicates for contributing to the `view-component-input` threat model.
*/
private import javascript
/**
* An input to a view component, such as React props.
*/
abstract class ViewComponentInput extends DataFlow::Node {
/** Gets a string that describes the type of this threat-model source. */
abstract string getSourceType();
}
private class ViewComponentInputAsThreatModelSource extends ThreatModelSource::Range instanceof ViewComponentInput
{
ViewComponentInputAsThreatModelSource() { not isSafeType(this.asExpr().getType()) }
final override string getThreatModel() { result = "view-component-input" }
final override string getSourceType() { result = ViewComponentInput.super.getSourceType() }
}
private predicate isSafeType(Type t) {
t instanceof NumberLikeType
or
t instanceof BooleanLikeType
or
t instanceof UndefinedType
or
t instanceof NullType
or
t instanceof VoidType
or
hasSafeTypes(t, t.(UnionType).getNumElementType())
or
isSafeType(t.(IntersectionType).getAnElementType())
}
/** Hold if the first `n` components of `t` are safe types. */
private predicate hasSafeTypes(UnionType t, int n) {
isSafeType(t.getElementType(0)) and
n = 1
or
isSafeType(t.getElementType(n - 1)) and
hasSafeTypes(t, n - 1)
}

View File

@@ -8,6 +8,7 @@ private import semmle.javascript.security.dataflow.CodeInjectionCustomizations
private import semmle.javascript.security.dataflow.ClientSideUrlRedirectCustomizations
private import semmle.javascript.DynamicPropertyAccess
private import semmle.javascript.dataflow.internal.PreCallGraphStep
private import semmle.javascript.ViewComponentInput
/**
* Provides classes for working with Angular (also known as Angular 2.x) applications.
@@ -610,4 +611,17 @@ module Angular2 {
)
}
}
private class InputFieldAsViewComponentInput extends ViewComponentInput {
InputFieldAsViewComponentInput() {
this =
API::moduleImport("@angular/core")
.getMember("Input")
.getReturn()
.getADecoratedMember()
.asSource()
}
override string getSourceType() { result = "Angular component input field" }
}
}

View File

@@ -5,6 +5,7 @@
import javascript
private import semmle.javascript.dataflow.internal.FlowSteps as FlowSteps
private import semmle.javascript.dataflow.internal.PreCallGraphStep
private import semmle.javascript.ViewComponentInput
/**
* Gets a reference to the 'React' object.
@@ -868,3 +869,9 @@ private class PropsFlowStep extends PreCallGraphStep {
)
}
}
private class ReactPropAsViewComponentInput extends ViewComponentInput {
ReactPropAsViewComponentInput() { this = any(ReactComponent c).getADirectPropsAccess() }
override string getSourceType() { result = "React props" }
}

View File

@@ -3,6 +3,7 @@
*/
import javascript
import semmle.javascript.ViewComponentInput
module Vue {
/** The global variable `Vue`, as an API graph entry point. */
@@ -85,17 +86,16 @@ module Vue {
* A class with a `@Component` decorator, making it usable as an "options" object in Vue.
*/
class ClassComponent extends DataFlow::ClassNode {
private ClassDefinition cls;
DataFlow::Node decorator;
ClassComponent() {
exists(ClassDefinition cls |
this = cls.flow() and
cls.getADecorator().getExpression() = decorator.asExpr() and
(
componentDecorator().flowsTo(decorator)
or
componentDecorator().getACall() = decorator
)
this = cls.flow() and
cls.getADecorator().getExpression() = decorator.asExpr() and
(
componentDecorator().flowsTo(decorator)
or
componentDecorator().getACall() = decorator
)
}
@@ -105,6 +105,9 @@ module Vue {
* These options correspond to the options one would pass to `new Vue({...})` or similar.
*/
API::Node getDecoratorOptions() { result = decorator.(API::CallNode).getParameter(0) }
/** Gets the AST node for the class definition. */
ClassDefinition getClassDefinition() { result = cls }
}
private string memberKindVerb(DataFlow::MemberKind kind) {
@@ -460,6 +463,12 @@ module Vue {
SingleFileComponent() { this = MkSingleFileComponent(file) }
/** Gets a call to `defineProps` in this component. */
DataFlow::CallNode getDefinePropsCall() {
result = DataFlow::globalVarRef("defineProps").getACall() and
result.getFile() = file
}
override Template::Element getTemplateElement() {
exists(HTML::Element e | result.(Template::HtmlElement).getElement() = e |
e.getFile() = file and
@@ -697,4 +706,68 @@ module Vue {
override ClientSideRemoteFlowKind getKind() { result = kind }
}
/**
* Holds if the given type annotation indicates a value that is not typically considered taintable.
*/
private predicate isSafeType(TypeAnnotation type) {
type.isBooleany() or
type.isNumbery() or
type.isRawFunction() or
type instanceof FunctionTypeExpr
}
/**
* Holds if the given field has a type that indicates that is can not contain a taintable value.
*/
private predicate isSafeField(FieldDeclaration field) { isSafeType(field.getTypeAnnotation()) }
private DataFlow::Node getPropSpec(Component component) {
result = component.getOption("props")
or
result = component.(SingleFileComponent).getDefinePropsCall().getArgument(0)
}
/**
* Holds if `component` has an input prop with the given name, that is of a taintable type.
*/
private predicate hasTaintableProp(Component component, string name) {
exists(DataFlow::SourceNode spec | spec = getPropSpec(component).getALocalSource() |
spec.(DataFlow::ArrayCreationNode).getAnElement().getStringValue() = name
or
exists(DataFlow::PropWrite write |
write = spec.getAPropertyWrite(name) and
not DataFlow::globalVarRef(["Number", "Boolean"]).flowsTo(write.getRhs())
)
)
or
exists(FieldDeclaration field |
field = component.getAsClassComponent().getClassDefinition().getField(name) and
DataFlow::moduleMember("vue-property-decorator", "Prop")
.getACall()
.flowsToExpr(field.getADecorator().getExpression()) and
not isSafeField(field)
)
or
// defineProps() can be called with only type arguments and then the Vue compiler will
// infer the prop types.
exists(CallExpr call, FieldDeclaration field |
call = component.(SingleFileComponent).getDefinePropsCall().asExpr() and
field = call.getTypeArgument(0).(InterfaceTypeExpr).getMember(name) and
not isSafeField(field)
)
}
private class PropAsViewComponentInput extends ViewComponentInput {
PropAsViewComponentInput() {
exists(Component component, string name | hasTaintableProp(component, name) |
this = component.getAnInstanceRef().getAPropertyRead(name)
or
// defineProps() returns the props
this = component.(SingleFileComponent).getDefinePropsCall().getAPropertyRead(name)
)
}
override string getSourceType() { result = "Vue prop" }
}
}

View File

@@ -27,6 +27,12 @@ module BrokenCryptoAlgorithmConfig implements DataFlow::ConfigSig {
predicate isBarrier(DataFlow::Node node) { node instanceof Sanitizer }
predicate observeDiffInformedIncrementalMode() { any() }
Location getASelectedSinkLocation(DataFlow::Node sink) {
result = sink.(Sink).getLocation()
or
result = sink.(Sink).getInitialization().getLocation()
}
}
/**

View File

@@ -33,6 +33,12 @@ module ClientSideRequestForgeryConfig implements DataFlow::ConfigSig {
}
predicate observeDiffInformedIncrementalMode() { any() }
Location getASelectedSinkLocation(DataFlow::Node sink) {
result = sink.(Sink).getLocation()
or
result = sink.(Sink).getARequest().getLocation()
}
}
/**

View File

@@ -34,7 +34,7 @@ module CommandInjection {
* An active threat-model source, considered as a flow source.
*/
private class ActiveThreatModelSourceAsSource extends Source instanceof ActiveThreatModelSource {
ActiveThreatModelSourceAsSource() { not this instanceof ClientSideRemoteFlowSource }
ActiveThreatModelSourceAsSource() { not this.isClientSideSource() }
override string getSourceType() { result = "a user-provided value" }
}

View File

@@ -32,6 +32,13 @@ module CommandInjectionConfig implements DataFlow::ConfigSig {
predicate isBarrier(DataFlow::Node node) { node instanceof Sanitizer }
predicate observeDiffInformedIncrementalMode() { any() }
Location getASelectedSinkLocation(DataFlow::Node sink) {
exists(DataFlow::Node node |
isSinkWithHighlight(sink, node) and
result = node.getLocation()
)
}
}
/**

View File

@@ -36,7 +36,7 @@ module CorsMisconfigurationForCredentials {
* An active threat-model source, considered as a flow source.
*/
private class ActiveThreatModelSourceAsSource extends Source instanceof ActiveThreatModelSource {
ActiveThreatModelSourceAsSource() { not this instanceof ClientSideRemoteFlowSource }
ActiveThreatModelSourceAsSource() { not this.isClientSideSource() }
}
/**

View File

@@ -25,6 +25,12 @@ module CorsMisconfigurationConfig implements DataFlow::ConfigSig {
}
predicate observeDiffInformedIncrementalMode() { any() }
Location getASelectedSinkLocation(DataFlow::Node sink) {
result = sink.(Sink).getLocation()
or
result = sink.(Sink).getCredentialsHeader().getLocation()
}
}
/**

View File

@@ -35,6 +35,15 @@ module DeepObjectResourceExhaustionConfig implements DataFlow::StateConfigSig {
}
predicate observeDiffInformedIncrementalMode() { any() }
Location getASelectedSinkLocation(DataFlow::Node sink) {
result = sink.(Sink).getLocation()
or
exists(DataFlow::Node link |
sink.(Sink).hasReason(link, _) and
result = link.getLocation()
)
}
}
/**

View File

@@ -28,6 +28,13 @@ module IndirectCommandInjectionConfig implements DataFlow::ConfigSig {
predicate isBarrier(DataFlow::Node node) { node instanceof Sanitizer }
predicate observeDiffInformedIncrementalMode() { any() }
Location getASelectedSinkLocation(DataFlow::Node sink) {
exists(DataFlow::Node node |
isSinkWithHighlight(sink, node) and
result = node.getLocation()
)
}
}
/**

View File

@@ -25,6 +25,12 @@ module InsecureDownloadConfig implements DataFlow::StateConfigSig {
predicate isBarrier(DataFlow::Node node) { node instanceof Sanitizer }
predicate observeDiffInformedIncrementalMode() { any() }
Location getASelectedSinkLocation(DataFlow::Node sink) {
result = sink.(Sink).getLocation()
or
result = sink.(Sink).getDownloadCall().getLocation()
}
}
/**

View File

@@ -54,7 +54,7 @@ deprecated class LogInjectionConfiguration extends TaintTracking::Configuration
* A source of remote user controlled input.
*/
class RemoteSource extends Source instanceof RemoteFlowSource {
RemoteSource() { not this instanceof ClientSideRemoteFlowSource }
RemoteSource() { not this.isClientSideSource() }
}
/**

View File

@@ -49,6 +49,15 @@ module PrototypePollutionConfig implements DataFlow::StateConfigSig {
}
predicate observeDiffInformedIncrementalMode() { any() }
Location getASelectedSinkLocation(DataFlow::Node sink) {
result = sink.(Sink).getLocation()
or
exists(Locatable loc |
sink.(Sink).dependencyInfo(_, loc) and
result = loc.getLocation()
)
}
}
/**

View File

@@ -34,7 +34,7 @@ module RegExpInjection {
* An active threat-model source, considered as a flow source.
*/
private class ActiveThreatModelSourceAsSource extends Source instanceof ActiveThreatModelSource {
ActiveThreatModelSourceAsSource() { not this instanceof ClientSideRemoteFlowSource }
ActiveThreatModelSourceAsSource() { not this.isClientSideSource() }
}
private import IndirectCommandInjectionCustomizations

View File

@@ -24,12 +24,18 @@ private module Cached {
/**
* A source of remote input in a web browser environment.
*
* Note that this does not include `view-component-input` sources even if that threat model has been enabled by the user.
* Consider using the predicate `ThreatModelSource#isClientSideSource()` to check for a broader class of client-side sources.
*/
cached
abstract class ClientSideRemoteFlowSource extends RemoteFlowSource {
/** Gets a string indicating what part of the browser environment this was derived from. */
cached
abstract ClientSideRemoteFlowKind getKind();
cached
final override predicate isClientSideSource() { any() }
}
}

View File

@@ -52,7 +52,7 @@ module RequestForgery {
not this.(ClientSideRemoteFlowSource).getKind().isPathOrUrl()
}
override predicate isServerSide() { not this instanceof ClientSideRemoteFlowSource }
override predicate isServerSide() { not super.isClientSideSource() }
}
/**

View File

@@ -28,6 +28,12 @@ module RequestForgeryConfig implements DataFlow::ConfigSig {
}
predicate observeDiffInformedIncrementalMode() { any() }
Location getASelectedSinkLocation(DataFlow::Node sink) {
result = sink.(Sink).getLocation()
or
result = sink.(Sink).getARequest().getLocation()
}
}
/**

View File

@@ -63,7 +63,7 @@ module ResourceExhaustion {
private class ActiveThreatModelSourceAsSource extends Source instanceof ActiveThreatModelSource {
ActiveThreatModelSourceAsSource() {
// exclude source that only happen client-side
not this instanceof ClientSideRemoteFlowSource and
not this.isClientSideSource() and
not this = DataFlow::parameterNode(any(PostMessageEventHandler pmeh).getEventParameter())
}
}

View File

@@ -29,6 +29,13 @@ module ShellCommandInjectionFromEnvironmentConfig implements DataFlow::ConfigSig
predicate isBarrier(DataFlow::Node node) { node instanceof Sanitizer }
predicate observeDiffInformedIncrementalMode() { any() }
Location getASelectedSinkLocation(DataFlow::Node sink) {
exists(DataFlow::Node node |
isSinkWithHighlight(sink, node) and
result = node.getLocation()
)
}
}
/**

View File

@@ -719,7 +719,7 @@ module TaintedPath {
* An active threat-model source, considered as a flow source.
*/
private class ActiveThreatModelSourceAsSource extends Source instanceof ActiveThreatModelSource {
ActiveThreatModelSourceAsSource() { not this instanceof ClientSideRemoteFlowSource }
ActiveThreatModelSourceAsSource() { not this.isClientSideSource() }
}
/**

View File

@@ -34,6 +34,12 @@ module UnsafeCodeConstruction {
DataFlow::FlowFeature getAFeature() { result instanceof DataFlow::FeatureHasSourceCallContext }
predicate observeDiffInformedIncrementalMode() { any() }
Location getASelectedSinkLocation(DataFlow::Node sink) {
result = sink.(Sink).getLocation()
or
result = sink.(Sink).getCodeSink().getLocation()
}
}
/**

View File

@@ -62,6 +62,12 @@ module UnsafeHtmlConstructionConfig implements DataFlow::StateConfigSig {
DataFlow::FlowFeature getAFeature() { result instanceof DataFlow::FeatureHasSourceCallContext }
predicate observeDiffInformedIncrementalMode() { any() }
Location getASelectedSinkLocation(DataFlow::Node sink) {
result = sink.(Sink).getLocation()
or
result = sink.(Sink).getSink().getLocation()
}
}
/**

View File

@@ -38,6 +38,12 @@ module UnsafeJQueryPluginConfig implements DataFlow::ConfigSig {
}
predicate observeDiffInformedIncrementalMode() { any() }
Location getASelectedSourceLocation(DataFlow::Node source) {
result = source.(Source).getLocation()
or
result = source.(Source).getPlugin().getLocation()
}
}
/**

View File

@@ -27,6 +27,14 @@ module UnsafeShellCommandConstructionConfig implements DataFlow::ConfigSig {
DataFlow::FlowFeature getAFeature() { result instanceof DataFlow::FeatureHasSourceCallContext }
predicate observeDiffInformedIncrementalMode() { any() }
Location getASelectedSinkLocation(DataFlow::Node sink) {
result = sink.(Sink).getLocation()
or
result = sink.(Sink).getAlertLocation().getLocation()
or
result = sink.(Sink).getCommandExecution().getLocation()
}
}
/**

View File

@@ -27,6 +27,14 @@ module PolynomialReDoSConfig implements DataFlow::ConfigSig {
int fieldFlowBranchLimit() { result = 1 } // library inputs are too expensive on some projects
predicate observeDiffInformedIncrementalMode() { any() }
Location getASelectedSinkLocation(DataFlow::Node sink) {
result = sink.(Sink).getLocation()
or
result = sink.(Sink).getHighlight().getLocation()
or
result = sink.(Sink).getRegExp().getLocation()
}
}
/** Taint-tracking for reasoning about polynomial regular expression denial-of-service attacks. */

View File

@@ -0,0 +1,7 @@
---
category: majorAnalysis
---
* Added a new threat model kind called `view-component-input`, which can enabled with [advanced setup](https://docs.github.com/en/code-security/code-scanning/creating-an-advanced-setup-for-code-scanning/customizing-your-advanced-setup-for-code-scanning#extending-codeql-coverage-with-threat-models).
When enabled, all React props, Vue props, and input fields in an Angular component are seen as taint sources, even if none of the corresponding instantiation sites appear to pass in a tainted value.
Some users may prefer this as a "defense in depth" option but note that it may result in false positives.
Regardless of whether the threat model is enabled, CodeQL will propagate taint from the instantiation sites of such components into the components themselves.

View File

@@ -33,8 +33,6 @@ module EnvValueAndKeyInjectionConfig implements DataFlow::ConfigSig {
)
)
}
predicate observeDiffInformedIncrementalMode() { any() }
}
module EnvValueAndKeyInjectionFlow = TaintTracking::Global<EnvValueAndKeyInjectionConfig>;

View File

@@ -27,8 +27,6 @@ module VerifiedDecodeConfig implements DataFlow::ConfigSig {
predicate isSource(DataFlow::Node source) { source instanceof ActiveThreatModelSource }
predicate isSink(DataFlow::Node sink) { sink = verifiedDecode() }
predicate observeDiffInformedIncrementalMode() { any() }
}
module VerifiedDecodeFlow = TaintTracking::Global<VerifiedDecodeConfig>;

View File

@@ -11,13 +11,6 @@
import javascript
import meta.internal.TaintMetrics
string getName(DataFlow::Node node) {
result = node.(RemoteFlowSource).getSourceType()
or
not node instanceof RemoteFlowSource and
result = "Taint source"
}
from DataFlow::Node node
where node = relevantTaintSource()
select node, getName(node)
from ThreatModelSource node
where node = relevantTaintSource() and node.getThreatModel() = "remote"
select node, getTaintSourceName(node)

View File

@@ -0,0 +1,19 @@
/**
* @name Threat model sources
* @description Sources of possibly untrusted input that can be configured via threat models.
* @kind problem
* @problem.severity recommendation
* @id js/meta/alerts/threat-model-sources
* @tags meta
* @precision very-low
*/
import javascript
import meta.internal.TaintMetrics
from ThreatModelSource node, string threatModel
where
node = relevantTaintSource() and
threatModel = node.getThreatModel() and
threatModel != "remote" // "remote" is reported by TaintSources.ql
select node, getTaintSourceName(node) + " (\"" + threatModel + "\" threat model)"

View File

@@ -75,9 +75,9 @@ DataFlow::Node relevantTaintSink(string kind) {
DataFlow::Node relevantTaintSink() { result = relevantTaintSink(_) }
/**
* Gets a relevant remote flow source.
* Gets a relevant threat model source.
*/
RemoteFlowSource relevantTaintSource() { not result.getFile() instanceof IgnoredFile }
ThreatModelSource relevantTaintSource() { not result.getFile() instanceof IgnoredFile }
/**
* Gets the output of a call that shows intent to sanitize a value
@@ -100,3 +100,10 @@ DataFlow::Node relevantSanitizerInput() {
result = any(HtmlSanitizerCall call).getInput() and
not result.getFile() instanceof IgnoredFile
}
string getTaintSourceName(DataFlow::Node node) {
result = node.(ThreatModelSource).getSourceType()
or
not node instanceof ThreatModelSource and
result = "Taint source"
}

View File

@@ -1,4 +1,4 @@
import { Component } from "@angular/core";
import { Component, Input } from "@angular/core";
import { DomSanitizer } from '@angular/platform-browser';
@Component({
@@ -6,17 +6,17 @@ import { DomSanitizer } from '@angular/platform-browser';
template: "not important"
})
export class SinkComponent {
sink1: string;
sink2: string;
sink3: string;
sink4: string;
sink5: string;
sink6: string;
sink7: string;
sink8: string;
sink9: string;
@Input() sink1: string;
@Input() sink2: string;
@Input() sink3: string;
@Input() sink4: string;
@Input() sink5: string;
@Input() sink6: string;
@Input() sink7: string;
@Input() sink8: string;
@Input() sink9: string;
constructor(private sanitizer: DomSanitizer) {}
constructor(private sanitizer: DomSanitizer) { }
foo() {
this.sanitizer.bypassSecurityTrustHtml(this.sink1);

View File

@@ -36,3 +36,13 @@ taintFlow
| source.component.ts:16:33:16:40 | source() | sink.component.ts:22:48:22:57 | this.sink1 |
testAttrSourceLocation
| inline.component.ts:8:43:8:60 | [testAttr]=taint | inline.component.ts:8:55:8:59 | <toplevel> |
threatModelSource
| sink.component.ts:22:48:22:57 | this.sink1 | view-component-input |
| sink.component.ts:23:48:23:57 | this.sink2 | view-component-input |
| sink.component.ts:24:48:24:57 | this.sink3 | view-component-input |
| sink.component.ts:25:48:25:57 | this.sink4 | view-component-input |
| sink.component.ts:26:48:26:57 | this.sink5 | view-component-input |
| sink.component.ts:27:48:27:57 | this.sink6 | view-component-input |
| sink.component.ts:28:48:28:57 | this.sink7 | view-component-input |
| sink.component.ts:29:48:29:57 | this.sink8 | view-component-input |
| sink.component.ts:30:48:30:57 | this.sink9 | view-component-input |

View File

@@ -42,3 +42,7 @@ deprecated class LegacyConfig extends TaintTracking::Configuration {
}
deprecated import utils.test.LegacyDataFlowDiff::DataFlowDiff<TestFlow, LegacyConfig>
query predicate threatModelSource(ThreatModelSource source, string kind) {
kind = source.getThreatModel()
}

View File

@@ -318,3 +318,28 @@ test_JsxName_this
| thisAccesses.js:61:19:61:41 | <this.t ... s.this> | thisAccesses.js:61:20:61:23 | this |
locationSource
| importedComponent.jsx:3:32:3:39 | location |
threatModelSource
| es5.js:4:24:4:33 | this.props | view-component-input |
| es5.js:20:24:20:33 | this.props | view-component-input |
| es6.js:1:37:1:36 | args | view-component-input |
| es6.js:3:24:3:33 | this.props | view-component-input |
| exportedComponent.jsx:1:29:1:33 | props | view-component-input |
| importedComponent.jsx:3:24:3:40 | {color, location} | view-component-input |
| importedComponent.jsx:3:32:3:39 | location | remote |
| namedImport.js:3:27:3:26 | args | view-component-input |
| namedImport.js:5:19:5:18 | args | view-component-input |
| plainfn.js:1:16:1:20 | props | view-component-input |
| plainfn.js:5:17:5:21 | props | view-component-input |
| plainfn.js:9:17:9:21 | props | view-component-input |
| plainfn.js:20:28:20:32 | props | view-component-input |
| preact.js:1:38:1:37 | args | view-component-input |
| preact.js:2:12:2:16 | props | view-component-input |
| preact.js:9:38:9:37 | args | view-component-input |
| probably-a-component.js:1:31:1:30 | args | view-component-input |
| probably-a-component.js:3:9:3:18 | this.props | view-component-input |
| props.js:2:37:2:36 | args | view-component-input |
| props.js:26:16:26:20 | props | view-component-input |
| rare-lifecycle-methods.js:1:33:1:32 | args | view-component-input |
| statePropertyWrites.js:38:24:38:33 | this.props | view-component-input |
| thisAccesses.js:31:12:31:16 | props | view-component-input |
| thisAccesses.js:48:18:48:18 | y | view-component-input |

View File

@@ -11,3 +11,7 @@ import ReactComponent_getAPropRead
import ReactName
query DataFlow::SourceNode locationSource() { result = DOM::locationSource() }
query predicate threatModelSource(ThreatModelSource source, string kind) {
kind = source.getThreatModel()
}

View File

@@ -3,7 +3,8 @@
</template>
<script>
export default {
data: function() { return { dataA: 42 } }
props: ['input'],
data: function() { return { dataA: 42 + this.input } }
}
</script>
<style>

View File

@@ -4,7 +4,8 @@
<script>
var x = require('x');
module.exports = { // not properly detected by the module system yet
data: function() { return { dataA: 42 } }
props: ['input'],
data: function() { return { dataA: 42 + this.input } }
}
</script>
<style>

View File

@@ -1,5 +1,6 @@
var x = require('x');
module.exports = {
data: function() { return { dataA: 42 } }
props: ['input'],
data: function() { return { dataA: 42 + this.input } }
}

View File

@@ -4,16 +4,22 @@
<script>
import Vue from 'vue'
import Component from 'vue-class-component'
import { Prop } from 'vue-property-decorator'
@Component({
render: (h) => { }
})
export default class MyComponent extends Vue {
message: string = 'Hello!'
@Prop() input: string;
get dataA() {
return 42;
}
get dataB() {
return this.input;
}
}
</script>
<style>

View File

@@ -4,14 +4,20 @@
<script>
import Vue from 'vue'
import Component from 'vue-class-component'
import { Prop } from 'vue-property-decorator'
@Component
export default class MyComponent extends Vue {
message: string = 'Hello!'
@Prop() input: string;
get dataA() {
return 42;
}
get dataB() {
return this.input;
}
}
</script>
<style>

View File

@@ -0,0 +1,8 @@
<template>
<p v-html="input"/>
</template>
<script setup>
const { input } = defineProps(['input']);
</script>
<style>
</style>

View File

@@ -0,0 +1,12 @@
<template>
<p v-html="input"/>
</template>
<script setup>
const { input, numericInput, booleanInput } = defineProps({
input: String,
numericInput: Number,
booleanInput: Boolean,
});
</script>
<style>
</style>

View File

@@ -0,0 +1,12 @@
<template>
<p v-html="input"/>
</template>
<script setup lang="ts">
const { input, numericInput, booleanInput } = defineProps<{
input: string,
numericInput: number,
booleanInput: boolean,
}>();
</script>
<style>
</style>

View File

@@ -1,12 +1,14 @@
component_getAPropertyValue
| compont-with-route.vue:0:0:0:0 | compont-with-route.vue | dataA | compont-with-route.vue:31:14:31:34 | this.$r ... ery.foo |
| compont-with-route.vue:0:0:0:0 | compont-with-route.vue | message | compont-with-route.vue:19:15:19:22 | 'Hello!' |
| single-component-file-1.vue:0:0:0:0 | single-component-file-1.vue | dataA | single-component-file-1.vue:6:40:6:41 | 42 |
| single-file-component-3.vue:0:0:0:0 | single-file-component-3.vue | dataA | single-file-component-3-script.js:4:37:4:38 | 42 |
| single-file-component-4.vue:0:0:0:0 | single-file-component-4.vue | dataA | single-file-component-4.vue:15:14:15:15 | 42 |
| single-file-component-4.vue:0:0:0:0 | single-file-component-4.vue | message | single-file-component-4.vue:12:23:12:30 | 'Hello!' |
| single-file-component-5.vue:0:0:0:0 | single-file-component-5.vue | dataA | single-file-component-5.vue:13:14:13:15 | 42 |
| single-file-component-5.vue:0:0:0:0 | single-file-component-5.vue | message | single-file-component-5.vue:10:23:10:30 | 'Hello!' |
| single-component-file-1.vue:0:0:0:0 | single-component-file-1.vue | dataA | single-component-file-1.vue:7:40:7:54 | 42 + this.input |
| single-file-component-3.vue:0:0:0:0 | single-file-component-3.vue | dataA | single-file-component-3-script.js:5:37:5:51 | 42 + this.input |
| single-file-component-4.vue:0:0:0:0 | single-file-component-4.vue | dataA | single-file-component-4.vue:17:14:17:15 | 42 |
| single-file-component-4.vue:0:0:0:0 | single-file-component-4.vue | dataB | single-file-component-4.vue:21:14:21:23 | this.input |
| single-file-component-4.vue:0:0:0:0 | single-file-component-4.vue | message | single-file-component-4.vue:13:23:13:30 | 'Hello!' |
| single-file-component-5.vue:0:0:0:0 | single-file-component-5.vue | dataA | single-file-component-5.vue:15:14:15:15 | 42 |
| single-file-component-5.vue:0:0:0:0 | single-file-component-5.vue | dataB | single-file-component-5.vue:19:14:19:23 | this.input |
| single-file-component-5.vue:0:0:0:0 | single-file-component-5.vue | message | single-file-component-5.vue:11:23:11:30 | 'Hello!' |
| tst.js:3:1:10:2 | new Vue ... 2\\n\\t}\\n}) | dataA | tst.js:8:10:8:11 | 42 |
| tst.js:12:1:16:2 | new Vue ... \\t}),\\n}) | dataA | tst.js:14:10:14:11 | 42 |
| tst.js:18:1:27:2 | Vue.com ... }\\n\\t}\\n}) | dataA | tst.js:20:10:20:11 | 42 |
@@ -35,9 +37,11 @@ component_getAPropertyValue
| tst.js:113:17:117:2 | base.ex ... 0\\n\\t}\\n}) | fromSubclass2 | tst.js:115:18:115:20 | 100 |
component_getOption
| compont-with-route.vue:0:0:0:0 | compont-with-route.vue | watch | compont-with-route.vue:10:12:16:5 | {\\n ... }\\n } |
| single-component-file-1.vue:0:0:0:0 | single-component-file-1.vue | data | single-component-file-1.vue:6:11:6:45 | functio ... 42 } } |
| single-file-component-3.vue:0:0:0:0 | single-file-component-3.vue | data | single-file-component-3-script.js:4:8:4:42 | functio ... 42 } } |
| single-file-component-4.vue:0:0:0:0 | single-file-component-4.vue | render | single-file-component-4.vue:9:13:9:22 | (h) => { } |
| single-component-file-1.vue:0:0:0:0 | single-component-file-1.vue | data | single-component-file-1.vue:7:11:7:58 | functio ... put } } |
| single-component-file-1.vue:0:0:0:0 | single-component-file-1.vue | props | single-component-file-1.vue:6:12:6:20 | ['input'] |
| single-file-component-3.vue:0:0:0:0 | single-file-component-3.vue | data | single-file-component-3-script.js:5:8:5:55 | functio ... put } } |
| single-file-component-3.vue:0:0:0:0 | single-file-component-3.vue | props | single-file-component-3-script.js:4:9:4:17 | ['input'] |
| single-file-component-4.vue:0:0:0:0 | single-file-component-4.vue | render | single-file-component-4.vue:10:13:10:22 | (h) => { } |
| tst.js:3:1:10:2 | new Vue ... 2\\n\\t}\\n}) | data | tst.js:7:8:9:2 | {\\n\\t\\tdataA: 42\\n\\t} |
| tst.js:3:1:10:2 | new Vue ... 2\\n\\t}\\n}) | render | tst.js:4:10:6:2 | functio ... c);\\n\\t} |
| tst.js:12:1:16:2 | new Vue ... \\t}),\\n}) | data | tst.js:13:8:15:3 | () => ( ... 42\\n\\t}) |
@@ -76,6 +80,9 @@ component
| single-file-component-3.vue:0:0:0:0 | single-file-component-3.vue |
| single-file-component-4.vue:0:0:0:0 | single-file-component-4.vue |
| single-file-component-5.vue:0:0:0:0 | single-file-component-5.vue |
| single-file-component-6.vue:0:0:0:0 | single-file-component-6.vue |
| single-file-component-7.vue:0:0:0:0 | single-file-component-7.vue |
| single-file-component-8.vue:0:0:0:0 | single-file-component-8.vue |
| special-syntax.vue:0:0:0:0 | special-syntax.vue |
| tst.js:3:1:10:2 | new Vue ... 2\\n\\t}\\n}) |
| tst.js:12:1:16:2 | new Vue ... \\t}),\\n}) |
@@ -97,10 +104,10 @@ component
| tst.js:113:17:117:2 | base.ex ... 0\\n\\t}\\n}) |
viewComponentStep
| compont-with-route.vue:31:14:31:34 | this.$r ... ery.foo | compont-with-route.vue:2:8:2:21 | v-html=dataA |
| single-component-file-1.vue:6:40:6:41 | 42 | single-component-file-1.vue:2:8:2:21 | v-html=dataA |
| single-file-component-3-script.js:4:37:4:38 | 42 | single-file-component-3.vue:2:8:2:21 | v-html=dataA |
| single-file-component-4.vue:15:14:15:15 | 42 | single-file-component-4.vue:2:8:2:21 | v-html=dataA |
| single-file-component-5.vue:13:14:13:15 | 42 | single-file-component-5.vue:2:8:2:21 | v-html=dataA |
| single-component-file-1.vue:7:40:7:54 | 42 + this.input | single-component-file-1.vue:2:8:2:21 | v-html=dataA |
| single-file-component-3-script.js:5:37:5:51 | 42 + this.input | single-file-component-3.vue:2:8:2:21 | v-html=dataA |
| single-file-component-4.vue:17:14:17:15 | 42 | single-file-component-4.vue:2:8:2:21 | v-html=dataA |
| single-file-component-5.vue:15:14:15:15 | 42 | single-file-component-5.vue:2:8:2:21 | v-html=dataA |
| tst.js:100:18:100:19 | 42 | tst.js:102:20:102:29 | this.dataA |
templateElement
| compont-with-route.vue:1:1:3:11 | <template>...</> |
@@ -108,25 +115,37 @@ templateElement
| compont-with-route.vue:4:1:49:9 | <script>...</> |
| compont-with-route.vue:50:1:51:8 | <style>...</> |
| single-component-file-1.vue:1:1:3:11 | <template>...</> |
| single-component-file-1.vue:2:5:10:8 | <p>...</> |
| single-component-file-1.vue:4:1:8:9 | <script>...</> |
| single-component-file-1.vue:9:1:10:8 | <style>...</> |
| single-component-file-1.vue:2:5:11:8 | <p>...</> |
| single-component-file-1.vue:4:1:9:9 | <script>...</> |
| single-component-file-1.vue:10:1:11:8 | <style>...</> |
| single-file-component-2.vue:1:1:3:11 | <template>...</> |
| single-file-component-2.vue:2:5:11:8 | <p>...</> |
| single-file-component-2.vue:4:1:9:9 | <script>...</> |
| single-file-component-2.vue:10:1:11:8 | <style>...</> |
| single-file-component-2.vue:2:5:12:8 | <p>...</> |
| single-file-component-2.vue:4:1:10:9 | <script>...</> |
| single-file-component-2.vue:11:1:12:8 | <style>...</> |
| single-file-component-3.vue:1:1:3:11 | <template>...</> |
| single-file-component-3.vue:2:5:7:8 | <p>...</> |
| single-file-component-3.vue:4:1:5:9 | <script>...</> |
| single-file-component-3.vue:6:1:7:8 | <style>...</> |
| single-file-component-4.vue:1:1:3:11 | <template>...</> |
| single-file-component-4.vue:2:5:20:9 | <p>...</> |
| single-file-component-4.vue:4:1:18:9 | <script>...</> |
| single-file-component-4.vue:19:1:20:8 | <style>...</> |
| single-file-component-4.vue:2:5:26:9 | <p>...</> |
| single-file-component-4.vue:4:1:24:9 | <script>...</> |
| single-file-component-4.vue:25:1:26:8 | <style>...</> |
| single-file-component-5.vue:1:1:3:11 | <template>...</> |
| single-file-component-5.vue:2:5:18:9 | <p>...</> |
| single-file-component-5.vue:4:1:16:9 | <script>...</> |
| single-file-component-5.vue:17:1:18:8 | <style>...</> |
| single-file-component-5.vue:2:5:24:9 | <p>...</> |
| single-file-component-5.vue:4:1:22:9 | <script>...</> |
| single-file-component-5.vue:23:1:24:8 | <style>...</> |
| single-file-component-6.vue:1:1:3:11 | <template>...</> |
| single-file-component-6.vue:2:5:8:9 | <p>...</> |
| single-file-component-6.vue:4:1:6:9 | <script>...</> |
| single-file-component-6.vue:7:1:8:8 | <style>...</> |
| single-file-component-7.vue:1:1:3:11 | <template>...</> |
| single-file-component-7.vue:2:5:12:9 | <p>...</> |
| single-file-component-7.vue:4:1:10:9 | <script>...</> |
| single-file-component-7.vue:11:1:12:8 | <style>...</> |
| single-file-component-8.vue:1:1:3:11 | <template>...</> |
| single-file-component-8.vue:2:5:12:9 | <p>...</> |
| single-file-component-8.vue:4:1:10:9 | <script>...</> |
| single-file-component-8.vue:11:1:12:8 | <style>...</> |
| special-syntax.vue:1:1:4:11 | <template>...</> |
| special-syntax.vue:2:3:2:37 | <blah>...</> |
| special-syntax.vue:3:3:3:32 | <blah>...</> |
@@ -138,6 +157,9 @@ xssSink
| single-file-component-3.vue:2:8:2:21 | v-html=dataA |
| single-file-component-4.vue:2:8:2:21 | v-html=dataA |
| single-file-component-5.vue:2:8:2:21 | v-html=dataA |
| single-file-component-6.vue:2:8:2:21 | v-html=input |
| single-file-component-7.vue:2:8:2:21 | v-html=input |
| single-file-component-8.vue:2:8:2:21 | v-html=input |
| tst.js:5:13:5:13 | a |
| tst.js:38:12:38:17 | danger |
remoteFlowSource
@@ -175,6 +197,46 @@ attribute
| single-file-component-3.vue:4:9:4:49 | src=./single-file-component-3-script.js | src |
| single-file-component-4.vue:2:8:2:21 | v-html=dataA | v-html |
| single-file-component-5.vue:2:8:2:21 | v-html=dataA | v-html |
| single-file-component-6.vue:2:8:2:21 | v-html=input | v-html |
| single-file-component-6.vue:4:9:4:13 | setup= | setup |
| single-file-component-7.vue:2:8:2:21 | v-html=input | v-html |
| single-file-component-7.vue:4:9:4:13 | setup= | setup |
| single-file-component-8.vue:2:8:2:21 | v-html=input | v-html |
| single-file-component-8.vue:4:9:4:13 | setup= | setup |
| single-file-component-8.vue:4:15:4:23 | lang=ts | lang |
| special-syntax.vue:2:9:2:22 | :colonProp=x | :colonProp |
| special-syntax.vue:2:24:2:34 | @atProp=x | @atProp |
| special-syntax.vue:3:9:3:29 | :colonField.field=x | :colonField.field |
threatModelSource
| compont-with-route.vue:13:17:13:21 | newId | remote |
| compont-with-route.vue:13:24:13:28 | oldId | remote |
| compont-with-route.vue:22:7:22:24 | this.$route.params | remote |
| compont-with-route.vue:23:7:23:23 | this.$route.query | remote |
| compont-with-route.vue:24:7:24:22 | this.$route.hash | remote |
| compont-with-route.vue:25:7:25:22 | this.$route.path | remote |
| compont-with-route.vue:26:7:26:26 | this.$route.fullPath | remote |
| compont-with-route.vue:27:7:27:31 | router. ... e.query | remote |
| compont-with-route.vue:31:14:31:30 | this.$route.query | remote |
| compont-with-route.vue:35:7:35:14 | to.query | remote |
| compont-with-route.vue:36:7:36:16 | from.query | remote |
| compont-with-route.vue:40:7:40:14 | to.query | remote |
| compont-with-route.vue:41:7:41:16 | from.query | remote |
| compont-with-route.vue:45:7:45:14 | to.query | remote |
| compont-with-route.vue:46:7:46:16 | from.query | remote |
| router.js:8:17:8:24 | to.query | remote |
| router.js:9:17:9:26 | from.query | remote |
| router.js:15:25:15:32 | to.query | remote |
| router.js:16:25:16:34 | from.query | remote |
| router.js:23:9:23:16 | to.query | remote |
| router.js:24:9:24:18 | from.query | remote |
| router.js:29:5:29:12 | to.query | remote |
| router.js:30:5:30:14 | from.query | remote |
| router.js:34:5:34:12 | to.query | remote |
| router.js:35:5:35:14 | from.query | remote |
| single-component-file-1.vue:7:45:7:54 | this.input | view-component-input |
| single-file-component-3-script.js:5:42:5:51 | this.input | view-component-input |
| single-file-component-4.vue:21:14:21:23 | this.input | view-component-input |
| single-file-component-5.vue:19:14:19:23 | this.input | view-component-input |
| single-file-component-6.vue:5:11:5:15 | input | view-component-input |
| single-file-component-7.vue:5:11:5:15 | input | view-component-input |
| single-file-component-8.vue:5:11:5:15 | input | view-component-input |

View File

@@ -24,3 +24,7 @@ query RemoteFlowSource remoteFlowSource() { any() }
query predicate parseErrors(JSParseError err) { exists(err) }
query predicate attribute(HTML::Attribute attrib, string name) { attrib.getName() = name }
query predicate threatModelSource(ThreatModelSource source, string kind) {
kind = source.getThreatModel()
}

View File

@@ -4,52 +4,49 @@ private import codeql.ruby.AST
private import codeql.ruby.ast.internal.AST
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
/**
* A basic block, that is, a maximal straight-line sequence of control flow nodes
* without branches or joins.
*/
class BasicBlock extends TBasicBlockStart {
/** Gets the scope of this basic block. */
final CfgScope getScope() { result = this.getFirstNode().getScope() }
final class BasicBlock extends BasicBlocksImpl::BasicBlock {
/** Gets an immediate successor of this basic block, if any. */
BasicBlock getASuccessor() { result = this.getASuccessor(_) }
BasicBlock getASuccessor() { result = super.getASuccessor() }
/** Gets an immediate successor of this basic block of a given type, if any. */
BasicBlock getASuccessor(SuccessorType t) {
result.getFirstNode() = this.getLastNode().getASuccessor(t)
}
BasicBlock getASuccessor(SuccessorType t) { result = super.getASuccessor(t) }
/** Gets an immediate predecessor of this basic block, if any. */
BasicBlock getAPredecessor() { result.getASuccessor() = this }
BasicBlock getAPredecessor() { result = super.getAPredecessor() }
/** Gets an immediate predecessor of this basic block of a given type, if any. */
BasicBlock getAPredecessor(SuccessorType t) { result.getASuccessor(t) = this }
BasicBlock getAPredecessor(SuccessorType t) { result = super.getAPredecessor(t) }
/** Gets the control flow node at a specific (zero-indexed) position in this basic block. */
CfgNode getNode(int pos) { bbIndex(this.getFirstNode(), result, pos) }
// The overrides below are to use `CfgNode` instead of `CfgImpl::Node`
CfgNode getNode(int pos) { result = super.getNode(pos) }
/** Gets a control flow node in this basic block. */
CfgNode getANode() { result = this.getNode(_) }
CfgNode getANode() { result = super.getANode() }
/** Gets the first control flow node in this basic block. */
CfgNode getFirstNode() { this = TBasicBlockStart(result) }
CfgNode getFirstNode() { result = super.getFirstNode() }
/** Gets the last control flow node in this basic block. */
CfgNode getLastNode() { result = this.getNode(this.length() - 1) }
/** Gets the length of this basic block. */
int length() { result = strictcount(this.getANode()) }
CfgNode getLastNode() { result = super.getLastNode() }
/**
* Holds if this basic block immediately dominates basic block `bb`.
*
* That is, all paths reaching basic block `bb` from some entry point
* basic block must go through this basic block (which is an immediate
* predecessor of `bb`).
* That is, this basic block is the unique basic block satisfying:
* 1. This basic block strictly dominates `bb`
* 2. There exists no other basic block that is strictly dominated by this
* basic block and which strictly dominates `bb`.
*
* All basic blocks, except entry basic blocks, have a unique immediate
* dominator.
*
* Example:
*
@@ -66,7 +63,7 @@ class BasicBlock extends TBasicBlockStart {
* basic block on line 5 (all paths from the entry point of `m`
* to `return 1` must go through the `if` block).
*/
predicate immediatelyDominates(BasicBlock bb) { bbIDominates(this, bb) }
predicate immediatelyDominates(BasicBlock bb) { super.immediatelyDominates(bb) }
/**
* Holds if this basic block strictly dominates basic block `bb`.
@@ -90,7 +87,7 @@ class BasicBlock extends TBasicBlockStart {
* basic block on line 5 (all paths from the entry point of `m`
* to `return 1` must go through the `if` block).
*/
predicate strictlyDominates(BasicBlock bb) { bbIDominates+(this, bb) }
predicate strictlyDominates(BasicBlock bb) { super.strictlyDominates(bb) }
/**
* Holds if this basic block dominates basic block `bb`.
@@ -113,10 +110,7 @@ class BasicBlock extends TBasicBlockStart {
* basic block on line 5 (all paths from the entry point of `m`
* to `return 1` must go through the `if` block).
*/
predicate dominates(BasicBlock bb) {
bb = this or
this.strictlyDominates(bb)
}
predicate dominates(BasicBlock bb) { super.dominates(bb) }
/**
* Holds if `df` is in the dominance frontier of this basic block.
@@ -143,22 +137,18 @@ class BasicBlock extends TBasicBlockStart {
* `puts x`. Also, the basic block starting on line 3 does not
* dominate the basic block on line 8.
*/
predicate inDominanceFrontier(BasicBlock df) {
this.dominatesPredecessor(df) and
not this.strictlyDominates(df)
}
/**
* Holds if this basic block dominates a predecessor of `df`.
*/
private predicate dominatesPredecessor(BasicBlock df) { this.dominates(df.getAPredecessor()) }
predicate inDominanceFrontier(BasicBlock df) { super.inDominanceFrontier(df) }
/**
* Gets the basic block that immediately dominates this basic block, if any.
*
* That is, all paths reaching this basic block from some entry point
* basic block must go through the result, which is an immediate basic block
* predecessor of this basic block.
* That is, the result is the unique basic block satisfying:
* 1. The result strictly dominates this basic block.
* 2. There exists no other basic block that is strictly dominated by the
* result and which strictly dominates this basic block.
*
* All basic blocks, except entry basic blocks, have a unique immediate
* dominator.
*
* Example:
*
@@ -176,7 +166,7 @@ class BasicBlock extends TBasicBlockStart {
* to `return 1` must go through the `if` block, and the `if` block
* is an immediate predecessor of `return 1`).
*/
BasicBlock getImmediateDominator() { bbIDominates(result, this) }
BasicBlock getImmediateDominator() { result = super.getImmediateDominator() }
/**
* Holds if this basic block strictly post-dominates basic block `bb`.
@@ -200,7 +190,7 @@ class BasicBlock extends TBasicBlockStart {
* line 3 (all paths to the exit point of `m` from `puts "b"` must go
* through `puts "m"`).
*/
predicate strictlyPostDominates(BasicBlock bb) { bbIPostDominates+(this, bb) }
predicate strictlyPostDominates(BasicBlock bb) { super.strictlyPostDominates(bb) }
/**
* Holds if this basic block post-dominates basic block `bb`.
@@ -223,205 +213,40 @@ class BasicBlock extends TBasicBlockStart {
* (all paths to the exit point of `m` from `puts "b"` must go through
* `puts "m"`).
*/
predicate postDominates(BasicBlock bb) {
this.strictlyPostDominates(bb) or
this = bb
}
/** Holds if this basic block is in a loop in the control flow graph. */
predicate inLoop() { this.getASuccessor+() = this }
/** Gets a textual representation of this basic block. */
string toString() { result = this.getFirstNode().toString() }
/** Gets the location of this basic block. */
Location getLocation() { result = this.getFirstNode().getLocation() }
predicate postDominates(BasicBlock bb) { super.postDominates(bb) }
}
cached
private module Cached {
/** Internal representation of basic blocks. */
cached
newtype TBasicBlock = TBasicBlockStart(CfgNode cfn) { startsBB(cfn) }
/** Holds if `cfn` starts a new basic block. */
private predicate startsBB(CfgNode cfn) {
not exists(cfn.getAPredecessor()) and exists(cfn.getASuccessor())
or
cfn.isJoin()
or
cfn.getAPredecessor().isBranch()
or
/*
* In cases such as
*
* ```rb
* if x or y
* foo
* else
* bar
* ```
*
* we have a CFG that looks like
*
* x --false--> [false] x or y --false--> bar
* \ |
* --true--> y --false--
* \
* --true--> [true] x or y --true--> foo
*
* and we want to ensure that both `foo` and `bar` start a new basic block,
* in order to get a `ConditionalBlock` out of the disjunction.
*/
exists(cfn.getAPredecessor(any(SuccessorTypes::ConditionalSuccessor s)))
}
/**
* Holds if `succ` is a control flow successor of `pred` within
* the same basic block.
*/
private predicate intraBBSucc(CfgNode pred, CfgNode succ) {
succ = pred.getASuccessor() and
not startsBB(succ)
}
/**
* Holds if `cfn` is the `i`th node in basic block `bb`.
*
* In other words, `i` is the shortest distance from a node `bb`
* that starts a basic block to `cfn` along the `intraBBSucc` relation.
*/
cached
predicate bbIndex(CfgNode bbStart, CfgNode cfn, int i) =
shortestDistances(startsBB/1, intraBBSucc/2)(bbStart, cfn, i)
/**
* Holds if the first node of basic block `succ` is a control flow
* successor of the last node of basic block `pred`.
*/
private predicate succBB(BasicBlock pred, BasicBlock succ) { succ = pred.getASuccessor() }
/** Holds if `dom` is an immediate dominator of `bb`. */
cached
predicate bbIDominates(BasicBlock dom, BasicBlock bb) =
idominance(entryBB/1, succBB/2)(_, dom, bb)
/** Holds if `pred` is a basic block predecessor of `succ`. */
private predicate predBB(BasicBlock succ, BasicBlock pred) { succBB(pred, succ) }
/** Holds if `bb` is an exit basic block that represents normal exit. */
private predicate normalExitBB(BasicBlock bb) { bb.getANode().(AnnotatedExitNode).isNormal() }
/** Holds if `dom` is an immediate post-dominator of `bb`. */
cached
predicate bbIPostDominates(BasicBlock dom, BasicBlock bb) =
idominance(normalExitBB/1, predBB/2)(_, dom, bb)
/**
* Gets the `i`th predecessor of join block `jb`, with respect to some
* arbitrary order.
*/
cached
JoinBlockPredecessor getJoinBlockPredecessor(JoinBlock jb, int i) {
result =
rank[i + 1](JoinBlockPredecessor jbp |
jbp = jb.getAPredecessor()
|
jbp order by JoinBlockPredecessors::getId(jbp), JoinBlockPredecessors::getSplitString(jbp)
)
}
cached
predicate immediatelyControls(ConditionBlock cb, BasicBlock succ, ConditionalSuccessor s) {
succ = cb.getASuccessor(s) and
forall(BasicBlock pred | pred = succ.getAPredecessor() and pred != cb | succ.dominates(pred))
}
cached
predicate controls(ConditionBlock cb, BasicBlock controlled, ConditionalSuccessor s) {
exists(BasicBlock succ | cb.immediatelyControls(succ, s) | succ.dominates(controlled))
}
}
private import Cached
/** Holds if `bb` is an entry basic block. */
private predicate entryBB(BasicBlock bb) { bb.getFirstNode() instanceof EntryNode }
/**
* An entry basic block, that is, a basic block whose first node is
* an entry node.
*/
class EntryBasicBlock extends BasicBlock {
EntryBasicBlock() { entryBB(this) }
}
final class EntryBasicBlock extends BasicBlock, BasicBlocksImpl::EntryBasicBlock { }
/**
* An annotated exit basic block, that is, a basic block whose last node is
* an annotated exit node.
* An annotated exit basic block, that is, a basic block that contains an
* annotated exit node.
*/
class AnnotatedExitBasicBlock extends BasicBlock {
private boolean normal;
AnnotatedExitBasicBlock() {
exists(AnnotatedExitNode n |
n = this.getANode() and
if n.isNormal() then normal = true else normal = false
)
}
/** Holds if this block represent a normal exit. */
final predicate isNormal() { normal = true }
}
final class AnnotatedExitBasicBlock extends BasicBlock, BasicBlocksImpl::AnnotatedExitBasicBlock { }
/**
* An exit basic block, that is, a basic block whose last node is
* an exit node.
*/
class ExitBasicBlock extends BasicBlock {
ExitBasicBlock() { this.getLastNode() instanceof ExitNode }
}
private module JoinBlockPredecessors {
private predicate id(Ruby::AstNode x, Ruby::AstNode y) { x = y }
private predicate idOf(Ruby::AstNode x, int y) = equivalenceRelation(id/2)(x, y)
int getId(JoinBlockPredecessor jbp) {
idOf(toGeneratedInclSynth(jbp.getFirstNode().(AstCfgNode).getAstNode()), result)
or
idOf(toGeneratedInclSynth(jbp.(EntryBasicBlock).getScope()), result)
}
string getSplitString(JoinBlockPredecessor jbp) {
result = jbp.getFirstNode().(AstCfgNode).getSplitsString()
or
not exists(jbp.getFirstNode().(AstCfgNode).getSplitsString()) and
result = ""
}
}
final class ExitBasicBlock extends BasicBlock, BasicBlocksImpl::ExitBasicBlock { }
/** A basic block with more than one predecessor. */
class JoinBlock extends BasicBlock {
JoinBlock() { this.getFirstNode().isJoin() }
/**
* Gets the `i`th predecessor of this join block, with respect to some
* arbitrary order.
*/
JoinBlockPredecessor getJoinBlockPredecessor(int i) { result = getJoinBlockPredecessor(this, i) }
final class JoinBlock extends BasicBlock, BasicBlocksImpl::JoinBasicBlock {
JoinBlockPredecessor getJoinBlockPredecessor(int i) { result = super.getJoinBlockPredecessor(i) }
}
/** A basic block that is an immediate predecessor of a join block. */
class JoinBlockPredecessor extends BasicBlock {
JoinBlockPredecessor() { this.getASuccessor() instanceof JoinBlock }
}
/** A basic block that terminates in a condition, splitting the subsequent control flow. */
class ConditionBlock extends BasicBlock {
ConditionBlock() { this.getLastNode().isCondition() }
final class JoinBlockPredecessor extends BasicBlock, BasicBlocksImpl::JoinPredecessorBasicBlock { }
/**
* A basic block that terminates in a condition, splitting the subsequent
* control flow.
*/
final class ConditionBlock extends BasicBlock, BasicBlocksImpl::ConditionBasicBlock {
/**
* Holds if basic block `succ` is immediately controlled by this basic
* block with conditional value `s`. That is, `succ` is an immediate
@@ -429,15 +254,15 @@ class ConditionBlock extends BasicBlock {
* the callable entry point by going via the `s` edge out of this basic block.
*/
predicate immediatelyControls(BasicBlock succ, ConditionalSuccessor s) {
immediatelyControls(this, succ, s)
super.immediatelyControls(succ, s)
}
/**
* Holds if basic block `controlled` is controlled by this basic block with
* conditional value `s`. That is, `controlled` can only be reached from
* the callable entry point by going via the `s` edge out of this basic block.
* conditional value `s`. That is, `controlled` can only be reached from the
* callable entry point by going via the `s` edge out of this basic block.
*/
predicate controls(BasicBlock controlled, ConditionalSuccessor s) {
controls(this, controlled, s)
super.controls(controlled, s)
}
}

View File

@@ -60,6 +60,14 @@ private module CfgInput implements CfgShared::InputSig<Location> {
t instanceof Cfg::SuccessorTypes::RaiseSuccessor or
t instanceof Cfg::SuccessorTypes::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)
int idOfAstNode(AstNode node) { idOf(AstInternal::toGeneratedInclSynth(node), result) }
int idOfCfgScope(CfgScope node) { result = idOfAstNode(node) }
}
private module CfgSplittingInput implements CfgShared::SplittingInputSig<Location, CfgInput> {

View File

@@ -19,6 +19,10 @@ private module Config implements DataFlow::ConfigSig {
predicate isBarrier(DataFlow::Node node) { node instanceof Sanitizer }
predicate observeDiffInformedIncrementalMode() { any() }
Location getASelectedSinkLocation(DataFlow::Node sink) {
result = sink.getLocation() or result = sink.(Sink).getAction().getLocation()
}
}
/**

View File

@@ -22,6 +22,12 @@ private module InsecureDownloadConfig implements DataFlow::StateConfigSig {
predicate isBarrier(DataFlow::Node node) { node instanceof Sanitizer }
predicate observeDiffInformedIncrementalMode() { any() }
Location getASelectedSinkLocation(DataFlow::Node sink) {
result = sink.(Sink).getLocation()
or
result = sink.(Sink).getDownloadCall().getLocation()
}
}
/**

View File

@@ -26,6 +26,12 @@ private module UnsafeCodeConstructionConfig implements DataFlow::ConfigSig {
DataFlow::FlowFeature getAFeature() { result instanceof DataFlow::FeatureHasSourceCallContext }
predicate observeDiffInformedIncrementalMode() { any() }
Location getASelectedSinkLocation(DataFlow::Node sink) {
result = sink.(Sink).getLocation()
or
result = sink.(Sink).getCodeSink().getLocation()
}
}
/**

View File

@@ -23,6 +23,12 @@ private module UnsafeHtmlConstructionConfig implements DataFlow::ConfigSig {
DataFlow::FlowFeature getAFeature() { result instanceof DataFlow::FeatureHasSourceCallContext }
predicate observeDiffInformedIncrementalMode() { any() }
Location getASelectedSinkLocation(DataFlow::Node sink) {
result = sink.(Sink).getLocation()
or
result = sink.(Sink).getXssSink().getLocation()
}
}
/**

View File

@@ -28,6 +28,14 @@ private module UnsafeShellCommandConstructionConfig implements DataFlow::ConfigS
DataFlow::FlowFeature getAFeature() { result instanceof DataFlow::FeatureHasSourceCallContext }
predicate observeDiffInformedIncrementalMode() { any() }
Location getASelectedSinkLocation(DataFlow::Node sink) {
result = sink.(Sink).getLocation()
or
result = sink.(Sink).getStringConstruction().getLocation()
or
result = sink.(Sink).getCommandExecution().getLocation()
}
}
/**

View File

@@ -19,6 +19,14 @@ private module MissingFullAnchorConfig implements DataFlow::ConfigSig {
predicate isBarrier(DataFlow::Node node) { node instanceof Sanitizer }
predicate observeDiffInformedIncrementalMode() { any() }
Location getASelectedSinkLocation(DataFlow::Node sink) {
result = sink.(Sink).getLocation()
or
result = sink.(Sink).getCallNode().getLocation()
or
result = sink.(Sink).getRegex().getLocation()
}
}
/**

View File

@@ -20,6 +20,14 @@ private module PolynomialReDoSConfig implements DataFlow::ConfigSig {
predicate isBarrier(DataFlow::Node node) { node instanceof Sanitizer }
predicate observeDiffInformedIncrementalMode() { any() }
Location getASelectedSinkLocation(DataFlow::Node sink) {
result = sink.(Sink).getLocation()
or
result = sink.(Sink).getHighlight().getLocation()
or
result = sink.(Sink).getRegExp().getLocation()
}
}
/**

View File

@@ -41,6 +41,12 @@ private module DecompressionApiConfig implements DataFlow::ConfigSig {
predicate isSink(DataFlow::Node sink) { sink instanceof DecompressionApiUse }
predicate observeDiffInformedIncrementalMode() { any() }
Location getASelectedSinkLocation(DataFlow::Node sink) {
result = sink.(DecompressionApiUse).getLocation()
or
result = sink.(DecompressionApiUse).getCall().getLocation()
}
}
private module DecompressionApiFlow = TaintTracking::Global<DecompressionApiConfig>;

View File

@@ -51,11 +51,20 @@ private module PermissivePermissionsConfig implements DataFlow::ConfigSig {
source.asExpr().getExpr() instanceof PermissivePermissionsExpr
}
predicate isSink(DataFlow::Node sink) {
exists(FileSystemPermissionModification mod | mod.getAPermissionNode() = sink)
additional predicate sinkDef(DataFlow::Node sink, FileSystemPermissionModification mod) {
mod.getAPermissionNode() = sink
}
predicate isSink(DataFlow::Node sink) { sinkDef(sink, _) }
predicate observeDiffInformedIncrementalMode() { any() }
Location getASelectedSinkLocation(DataFlow::Node sink) {
exists(FileSystemPermissionModification mod |
sinkDef(sink, mod) and
result = mod.getLocation()
)
}
}
private module PermissivePermissionsFlow = DataFlow::Global<PermissivePermissionsConfig>;
@@ -66,7 +75,8 @@ from
PermissivePermissionsFlow::PathNode source, PermissivePermissionsFlow::PathNode sink,
FileSystemPermissionModification mod
where
PermissivePermissionsFlow::flowPath(source, sink) and mod.getAPermissionNode() = sink.getNode()
PermissivePermissionsFlow::flowPath(source, sink) and
PermissivePermissionsConfig::sinkDef(sink.getNode(), mod)
select source.getNode(), source, sink,
"This overly permissive mask used in $@ allows read or write access to others.", mod,
mod.toString()

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,23 @@
import ruby
import codeql.ruby.controlflow.ControlFlowGraph
import codeql.ruby.controlflow.BasicBlocks
query predicate dominates(BasicBlock bb1, BasicBlock bb2) { bb1.dominates(bb2) }
query predicate postDominance(BasicBlock bb1, BasicBlock bb2) { bb1.postDominates(bb2) }
query predicate immediateDominator(BasicBlock bb1, BasicBlock bb2) {
bb1.getImmediateDominator() = bb2
}
query predicate controls(ConditionBlock bb1, BasicBlock bb2, SuccessorType t) {
bb1.controls(bb2, t)
}
query predicate successor(ConditionBlock bb1, BasicBlock bb2, SuccessorType t) {
bb1.getASuccessor(t) = bb2
}
query predicate joinBlockPredecessor(JoinBlock bb1, BasicBlock bb2, int i) {
bb1.getJoinBlockPredecessor(i) = bb2
}

View File

@@ -1,263 +1,16 @@
private import rust
private import ControlFlowGraph
private import internal.SuccessorType
private import internal.ControlFlowGraphImpl as Impl
private import codeql.rust.elements.internal.generated.Raw
private import codeql.rust.elements.internal.generated.Synth
private import internal.ControlFlowGraphImpl as CfgImpl
private import CfgImpl::BasicBlocks as BasicBlocksImpl
final class BasicBlock = BasicBlockImpl;
final class BasicBlock = BasicBlocksImpl::BasicBlock;
/**
* A basic block, that is, a maximal straight-line sequence of control flow nodes
* without branches or joins.
*/
private class BasicBlockImpl extends TBasicBlockStart {
/** Gets the CFG scope of this basic block. */
CfgScope getScope() { result = this.getAPredecessor().getScope() }
final class EntryBasicBlock = BasicBlocksImpl::EntryBasicBlock;
/** Gets an immediate successor of this basic block, if any. */
BasicBlock getASuccessor() { result = this.getASuccessor(_) }
final class ExitBasicBlock = BasicBlocksImpl::ExitBasicBlock;
/** Gets an immediate successor of this basic block of a given type, if any. */
BasicBlock getASuccessor(SuccessorType t) {
result.getFirstNode() = this.getLastNode().getASuccessor(t)
}
final class AnnotatedExitBasicBlock = BasicBlocksImpl::AnnotatedExitBasicBlock;
/** Gets an immediate predecessor of this basic block, if any. */
BasicBlock getAPredecessor() { result.getASuccessor() = this }
final class ConditionBasicBlock = BasicBlocksImpl::ConditionBasicBlock;
/** Gets an immediate predecessor of this basic block of a given type, if any. */
BasicBlock getAPredecessor(SuccessorType t) { result.getASuccessor(t) = this }
final class JoinBasicBlock = BasicBlocksImpl::JoinBasicBlock;
/** Gets the control flow node at a specific (zero-indexed) position in this basic block. */
CfgNode getNode(int pos) { bbIndex(this.getFirstNode(), result, pos) }
/** Gets a control flow node in this basic block. */
CfgNode getANode() { result = this.getNode(_) }
/** Gets the first control flow node in this basic block. */
CfgNode getFirstNode() { this = TBasicBlockStart(result) }
/** Gets the last control flow node in this basic block. */
CfgNode getLastNode() { result = this.getNode(this.length() - 1) }
/** Gets the length of this basic block. */
int length() { result = strictcount(this.getANode()) }
predicate immediatelyDominates(BasicBlock bb) { bbIDominates(this, bb) }
predicate strictlyDominates(BasicBlock bb) { bbIDominates+(this, bb) }
predicate dominates(BasicBlock bb) {
bb = this or
this.strictlyDominates(bb)
}
predicate inDominanceFrontier(BasicBlock df) {
this.dominatesPredecessor(df) and
not this.strictlyDominates(df)
}
/**
* Holds if this basic block dominates a predecessor of `df`.
*/
private predicate dominatesPredecessor(BasicBlock df) { this.dominates(df.getAPredecessor()) }
BasicBlock getImmediateDominator() { bbIDominates(result, this) }
predicate strictlyPostDominates(BasicBlock bb) { bbIPostDominates+(this, bb) }
predicate postDominates(BasicBlock bb) {
this.strictlyPostDominates(bb) or
this = bb
}
/** Holds if this basic block is in a loop in the control flow graph. */
predicate inLoop() { this.getASuccessor+() = this }
/** Gets a textual representation of this basic block. */
string toString() { result = this.getFirstNode().toString() }
/** Gets the location of this basic block. */
Location getLocation() { result = this.getFirstNode().getLocation() }
}
cached
private module Cached {
/** Internal representation of basic blocks. */
cached
newtype TBasicBlock = TBasicBlockStart(CfgNode cfn) { startsBB(cfn) }
/** Holds if `cfn` starts a new basic block. */
private predicate startsBB(CfgNode cfn) {
not exists(cfn.getAPredecessor()) and exists(cfn.getASuccessor())
or
cfn.isJoin()
or
cfn.getAPredecessor().isBranch()
}
/**
* Holds if `succ` is a control flow successor of `pred` within
* the same basic block.
*/
private predicate intraBBSucc(CfgNode pred, CfgNode succ) {
succ = pred.getASuccessor() and
not startsBB(succ)
}
/**
* Holds if `cfn` is the `i`th node in basic block `bb`.
*
* In other words, `i` is the shortest distance from a node `bb`
* that starts a basic block to `cfn` along the `intraBBSucc` relation.
*/
cached
predicate bbIndex(CfgNode bbStart, CfgNode cfn, int i) =
shortestDistances(startsBB/1, intraBBSucc/2)(bbStart, cfn, i)
/**
* Holds if the first node of basic block `succ` is a control flow
* successor of the last node of basic block `pred`.
*/
private predicate succBB(BasicBlock pred, BasicBlock succ) { succ = pred.getASuccessor() }
/** Holds if `dom` is an immediate dominator of `bb`. */
cached
predicate bbIDominates(BasicBlock dom, BasicBlock bb) =
idominance(entryBB/1, succBB/2)(_, dom, bb)
/** Holds if `pred` is a basic block predecessor of `succ`. */
private predicate predBB(BasicBlock succ, BasicBlock pred) { succBB(pred, succ) }
/** Holds if `bb` is an exit basic block that represents normal exit. */
private predicate normalExitBB(BasicBlock bb) {
bb.getANode().(Impl::AnnotatedExitNode).isNormal()
}
/** Holds if `dom` is an immediate post-dominator of `bb`. */
cached
predicate bbIPostDominates(BasicBlock dom, BasicBlock bb) =
idominance(normalExitBB/1, predBB/2)(_, dom, bb)
/**
* Gets the `i`th predecessor of join block `jb`, with respect to some
* arbitrary order.
*/
cached
JoinBlockPredecessor getJoinBlockPredecessor(JoinBlock jb, int i) {
result =
rank[i + 1](JoinBlockPredecessor jbp |
jbp = jb.getAPredecessor()
|
jbp order by JoinBlockPredecessors::getId(jbp), JoinBlockPredecessors::getSplitString(jbp)
)
}
}
private import Cached
/** Holds if `bb` is an entry basic block. */
private predicate entryBB(BasicBlock bb) { bb.getFirstNode() instanceof Impl::EntryNode }
/**
* An entry basic block, that is, a basic block whose first node is
* an entry node.
*/
class EntryBasicBlock extends BasicBlockImpl {
EntryBasicBlock() { entryBB(this) }
override CfgScope getScope() {
this.getFirstNode() = any(Impl::EntryNode node | node.getScope() = result)
}
}
/**
* An annotated exit basic block, that is, a basic block whose last node is
* an annotated exit node.
*/
class AnnotatedExitBasicBlock extends BasicBlockImpl {
private boolean normal;
AnnotatedExitBasicBlock() {
exists(Impl::AnnotatedExitNode n |
n = this.getANode() and
if n.isNormal() then normal = true else normal = false
)
}
/** Holds if this block represent a normal exit. */
final predicate isNormal() { normal = true }
}
/**
* An exit basic block, that is, a basic block whose last node is
* an exit node.
*/
class ExitBasicBlock extends BasicBlockImpl {
ExitBasicBlock() { this.getLastNode() instanceof Impl::ExitNode }
}
private module JoinBlockPredecessors {
private predicate id(Raw::AstNode x, Raw::AstNode y) { x = y }
private predicate idOfDbAstNode(Raw::AstNode x, int y) = equivalenceRelation(id/2)(x, y)
// TODO: does not work if fresh ipa entities (`ipa: on:`) turn out to be first of the block
private predicate idOf(AstNode x, int y) { idOfDbAstNode(Synth::convertAstNodeToRaw(x), y) }
int getId(JoinBlockPredecessor jbp) {
idOf(jbp.getFirstNode().(Impl::AstCfgNode).getAstNode(), result)
or
idOf(jbp.(EntryBasicBlock).getScope(), result)
}
string getSplitString(JoinBlockPredecessor jbp) {
result = jbp.getFirstNode().(Impl::AstCfgNode).getSplitsString()
or
not exists(jbp.getFirstNode().(Impl::AstCfgNode).getSplitsString()) and
result = ""
}
}
/** A basic block with more than one predecessor. */
class JoinBlock extends BasicBlockImpl {
JoinBlock() { this.getFirstNode().isJoin() }
/**
* Gets the `i`th predecessor of this join block, with respect to some
* arbitrary order.
*/
JoinBlockPredecessor getJoinBlockPredecessor(int i) { result = getJoinBlockPredecessor(this, i) }
}
/** A basic block that is an immediate predecessor of a join block. */
class JoinBlockPredecessor extends BasicBlockImpl {
JoinBlockPredecessor() { this.getASuccessor() instanceof JoinBlock }
}
/** A basic block that terminates in a condition, splitting the subsequent control flow. */
class ConditionBlock extends BasicBlockImpl {
ConditionBlock() { this.getLastNode().isCondition() }
/**
* Holds if basic block `succ` is immediately controlled by this basic
* block with conditional value `s`. That is, `succ` is an immediate
* successor of this block, and `succ` can only be reached from
* the callable entry point by going via the `s` edge out of this basic block.
*/
pragma[nomagic]
predicate immediatelyControls(BasicBlock succ, SuccessorType s) {
succ = this.getASuccessor(s) and
forall(BasicBlock pred | pred = succ.getAPredecessor() and pred != this | succ.dominates(pred))
}
/**
* Holds if basic block `controlled` is controlled by this basic block with
* conditional value `s`. That is, `controlled` can only be reached from
* the callable entry point by going via the `s` edge out of this basic block.
*/
predicate controls(BasicBlock controlled, BooleanSuccessor s) {
exists(BasicBlock succ | this.immediatelyControls(succ, s) | succ.dominates(controlled))
}
}
final class JoinPredecessorBasicBlock = BasicBlocksImpl::JoinPredecessorBasicBlock;

View File

@@ -1,11 +1,8 @@
/** Provides classes representing the control flow graph. */
private import rust
private import internal.ControlFlowGraphImpl
private import internal.Completion
private import internal.SuccessorType
private import internal.Scope as Scope
private import BasicBlocks
final class CfgScope = Scope::CfgScope;
@@ -25,30 +22,4 @@ final class ContinueSuccessor = ContinueSuccessorImpl;
final class ReturnSuccessor = ReturnSuccessorImpl;
/**
* A control flow node.
*
* A control flow node is a node in the control flow graph (CFG). There is a
* many-to-one relationship between CFG nodes and AST nodes.
*
* Only nodes that can be reached from an entry point are included in the CFG.
*/
final class CfgNode extends Node {
/** Gets the file of this control flow node. */
File getFile() { result = this.getLocation().getFile() }
/** Gets a successor node of a given type, if any. */
CfgNode getASuccessor(SuccessorType t) { result = super.getASuccessor(t) }
/** Gets an immediate successor, if any. */
CfgNode getASuccessor() { result = this.getASuccessor(_) }
/** Gets an immediate predecessor node of a given flow type, if any. */
CfgNode getAPredecessor(SuccessorType t) { result.getASuccessor(t) = this }
/** Gets an immediate predecessor, if any. */
CfgNode getAPredecessor() { result = this.getAPredecessor(_) }
/** Gets the basic block that this control flow node belongs to. */
BasicBlock getBasicBlock() { result.getANode() = this }
}
final class CfgNode = Node;

View File

@@ -3,6 +3,8 @@ import codeql.controlflow.Cfg
import Completion
private import Scope as Scope
private import codeql.rust.controlflow.ControlFlowGraph as Cfg
private import codeql.rust.elements.internal.generated.Raw
private import codeql.rust.elements.internal.generated.Synth
private module CfgInput implements InputSig<Location> {
private import codeql.rust.internal.CachedStages
@@ -48,6 +50,15 @@ private module CfgInput implements InputSig<Location> {
/** Holds if `scope` is exited when `last` finishes with completion `c`. */
predicate scopeLast(CfgScope scope, AstNode last, Completion c) { scope.scopeLast(last, c) }
private predicate id(Raw::AstNode x, Raw::AstNode y) { x = y }
private predicate idOfDbAstNode(Raw::AstNode x, int y) = equivalenceRelation(id/2)(x, y)
// TODO: does not work if fresh ipa entities (`ipa: on:`) turn out to be first of the block
int idOfAstNode(AstNode node) { idOfDbAstNode(Synth::convertAstNodeToRaw(node), result) }
int idOfCfgScope(CfgScope node) { result = idOfAstNode(node) }
}
private module CfgSplittingInput implements SplittingInputSig<Location, CfgInput> {

View File

@@ -759,12 +759,15 @@ final class ReferenceContent extends Content, TReferenceContent {
}
/**
* An element in an array.
* An element in a collection where we do not track the specific collection
* type nor the placement of the element in the collection. Therefore the
* collection should be one where the elements are reasonably homogeneous,
* i.e., if one is tainted all elements are considered tainted.
*
* Examples include the elements of a set, array, vector, or stack.
*/
final class ArrayElementContent extends Content, TArrayElement {
ArrayElementContent() { this = TArrayElement() }
override string toString() { result = "array[]" }
final class ElementContent extends Content, TElementContent {
override string toString() { result = "element" }
}
/**
@@ -1086,19 +1089,19 @@ module RustDataFlow implements InputSig<Location> {
)
or
exists(IndexExprCfgNode arr |
c instanceof ArrayElementContent and
c instanceof ElementContent and
node1.asExpr() = arr.getBase() and
node2.asExpr() = arr
)
or
exists(ForExprCfgNode for |
c instanceof ArrayElementContent and
c instanceof ElementContent and
node1.asExpr() = for.getIterable() and
node2.asPat() = for.getPat()
)
or
exists(SlicePatCfgNode pat |
c instanceof ArrayElementContent and
c instanceof ElementContent and
node1.asPat() = pat and
node2.asPat() = pat.getAPat()
)
@@ -1178,7 +1181,7 @@ module RustDataFlow implements InputSig<Location> {
node2.asExpr() = tuple
)
or
c instanceof ArrayElementContent and
c instanceof ElementContent and
node1.asExpr() =
[
node2.asExpr().(ArrayRepeatExprCfgNode).getRepeatOperand(),
@@ -1188,7 +1191,7 @@ module RustDataFlow implements InputSig<Location> {
tupleAssignment(node1, node2.(PostUpdateNode).getPreUpdateNode(), c)
or
exists(AssignmentExprCfgNode assignment, IndexExprCfgNode index |
c instanceof ArrayElementContent and
c instanceof ElementContent and
assignment.getLhs() = index and
node1.asExpr() = assignment.getRhs() and
node2.(PostUpdateNode).getPreUpdateNode().asExpr() = index.getBase()
@@ -1561,7 +1564,7 @@ private module Cached {
TVariantFieldContent(VariantCanonicalPath v, string field) {
field = v.getVariant().getFieldList().(RecordFieldList).getAField().getName().getText()
} or
TArrayElement() or
TElementContent() or
TTuplePositionContent(int pos) {
pos in [0 .. max([
any(TuplePat pat).getNumberOfFields(),

View File

@@ -79,8 +79,8 @@ module Input implements InputSig<Location, RustDataFlow> {
arg = s.getExtendedCanonicalPath() + "::" + field
)
or
result = "ArrayElement" and
c = TArrayElement() and
result = "Element" and
c = TElementContent() and
arg = ""
or
exists(int pos |

View File

@@ -28,7 +28,7 @@
* - `Parameter[n]`: the `n`-th parameter of a callback. May be a range of form `x..y` (inclusive)
* and/or a comma-separated list.
* - `ReturnValue`: the value returned by a function call.
* - `ArrayElement`: an element of an array.
* - `Element`: an element in a collection.
* - `Variant[v::f]`: field `f` of the variant with canonical path `v`, for example
* `Variant[crate::ihex::Record::Data::value]`.
* - `Variant[v(i)]`: position `i` inside the variant with canonical path `v`, for example

View File

@@ -488,7 +488,7 @@ private module DataFlowIntegrationInput implements Impl::DataFlowIntegrationInpu
/** Holds if the guard `guard` controls block `bb` upon evaluating to `branch`. */
predicate guardControlsBlock(Guard guard, SsaInput::BasicBlock bb, boolean branch) {
exists(ConditionBlock conditionBlock, ConditionalSuccessor s |
exists(ConditionBasicBlock conditionBlock, ConditionalSuccessor s |
guard = conditionBlock.getLastNode() and
s.getValue() = branch and
conditionBlock.controls(bb, s)

View File

@@ -44,7 +44,7 @@ module RustTaintTracking implements InputSig<Location, RustDataFlow> {
// source is a collection.
exists(SingletonContentSet cs |
RustDataFlow::readStep(pred, cs, succ) and
cs.getContent() instanceof ArrayElementContent
cs.getContent() instanceof ElementContent
)
or
exists(FormatArgsExprCfgNode format | succ.asExpr() = format |
@@ -64,7 +64,7 @@ module RustTaintTracking implements InputSig<Location, RustDataFlow> {
predicate defaultImplicitTaintRead(Node::Node node, ContentSet cs) {
exists(node) and
exists(Content c | c = cs.(SingletonContentSet).getContent() |
c instanceof ArrayElementContent or
c instanceof ElementContent or
c instanceof ReferenceContent
)
}

View File

@@ -397,20 +397,23 @@ module Impl {
)
}
private newtype TVariableOrAccessCand =
TVariableOrAccessCandVariable(Variable v) or
TVariableOrAccessCandVariableAccessCand(VariableAccessCand va)
private newtype TDefOrAccessCand =
TDefOrAccessCandNestedFunction(Function f, BlockExprScope scope) {
f = scope.getStmtList().getAStatement()
} or
TDefOrAccessCandVariable(Variable v) or
TDefOrAccessCandVariableAccessCand(VariableAccessCand va)
/**
* A variable declaration or variable access candidate.
* A nested function declaration, variable declaration, or variable (or function)
* access candidate.
*
* In order to determine whether a candidate is an actual variable access,
* we rank declarations and candidates by their position in source code.
* In order to determine whether a candidate is an actual variable/function access,
* we rank declarations and candidates by their position in the AST.
*
* The ranking must take variable names into account, but also variable scopes;
* below a comment `rank(scope, name, i)` means that the declaration/access on
* the given line has rank `i` amongst all declarations/accesses inside variable
* scope `scope`, for variable name `name`:
* The ranking must take names into account, but also variable scopes; below a comment
* `rank(scope, name, i)` means that the declaration/access on the given line has rank
* `i` amongst all declarations/accesses inside variable scope `scope`, for name `name`:
*
* ```rust
* fn f() { // scope0
@@ -430,8 +433,8 @@ module Impl {
* }
* ```
*
* Variable declarations are only ranked in the scope that they bind into, while
* accesses candidates propagate outwards through scopes, as they may access
* Function/variable declarations are only ranked in the scope that they bind into,
* while accesses candidates propagate outwards through scopes, as they may access
* declarations from outer scopes.
*
* For an access candidate with ranks `{ rank(scope_i, name, rnk_i) | i in I }` and
@@ -448,41 +451,80 @@ module Impl {
* i.e., its the nearest declaration before the access in the same (or outer) scope
* as the access.
*/
private class VariableOrAccessCand extends TVariableOrAccessCand {
Variable asVariable() { this = TVariableOrAccessCandVariable(result) }
abstract private class DefOrAccessCand extends TDefOrAccessCand {
abstract string toString();
VariableAccessCand asVariableAccessCand() {
this = TVariableOrAccessCandVariableAccessCand(result)
}
string toString() {
result = this.asVariable().toString() or result = this.asVariableAccessCand().toString()
}
Location getLocation() {
result = this.asVariable().getLocation() or result = this.asVariableAccessCand().getLocation()
}
abstract Location getLocation();
pragma[nomagic]
predicate rankBy(string name, VariableScope scope, int ord, int kind) {
variableDeclInScope(this.asVariable(), scope, name, ord) and
abstract predicate rankBy(string name, VariableScope scope, int ord, int kind);
}
abstract private class NestedFunctionOrVariable extends DefOrAccessCand { }
private class DefOrAccessCandNestedFunction extends NestedFunctionOrVariable,
TDefOrAccessCandNestedFunction
{
private Function f;
private BlockExprScope scope_;
DefOrAccessCandNestedFunction() { this = TDefOrAccessCandNestedFunction(f, scope_) }
override string toString() { result = f.toString() }
override Location getLocation() { result = f.getLocation() }
override predicate rankBy(string name, VariableScope scope, int ord, int kind) {
// nested functions behave as if they are defined at the beginning of the scope
name = f.getName().getText() and
scope = scope_ and
ord = 0 and
kind = 0
or
variableAccessCandInScope(this.asVariableAccessCand(), scope, name, _, ord) and
}
}
private class DefOrAccessCandVariable extends NestedFunctionOrVariable, TDefOrAccessCandVariable {
private Variable v;
DefOrAccessCandVariable() { this = TDefOrAccessCandVariable(v) }
override string toString() { result = v.toString() }
override Location getLocation() { result = v.getLocation() }
override predicate rankBy(string name, VariableScope scope, int ord, int kind) {
variableDeclInScope(v, scope, name, ord) and
kind = 1
}
}
private class DefOrAccessCandVariableAccessCand extends DefOrAccessCand,
TDefOrAccessCandVariableAccessCand
{
private VariableAccessCand va;
DefOrAccessCandVariableAccessCand() { this = TDefOrAccessCandVariableAccessCand(va) }
override string toString() { result = va.toString() }
override Location getLocation() { result = va.getLocation() }
override predicate rankBy(string name, VariableScope scope, int ord, int kind) {
variableAccessCandInScope(va, scope, name, _, ord) and
kind = 2
}
}
private module DenseRankInput implements DenseRankInputSig2 {
class C1 = VariableScope;
class C2 = string;
class Ranked = VariableOrAccessCand;
class Ranked = DefOrAccessCand;
int getRank(VariableScope scope, string name, VariableOrAccessCand v) {
int getRank(VariableScope scope, string name, DefOrAccessCand v) {
v =
rank[result](VariableOrAccessCand v0, int ord, int kind |
rank[result](DefOrAccessCand v0, int ord, int kind |
v0.rankBy(name, scope, ord, kind)
|
v0 order by ord, kind
@@ -494,7 +536,7 @@ module Impl {
* Gets the rank of `v` amongst all other declarations or access candidates
* to a variable named `name` in the variable scope `scope`.
*/
private int rankVariableOrAccess(VariableScope scope, string name, VariableOrAccessCand v) {
private int rankVariableOrAccess(VariableScope scope, string name, DefOrAccessCand v) {
v = DenseRank2<DenseRankInput>::denseRank(scope, name, result + 1)
}
@@ -512,25 +554,38 @@ module Impl {
* the declaration at rank 0 can only reach the access at rank 1, while the declaration
* at rank 2 can only reach the access at rank 3.
*/
private predicate variableReachesRank(VariableScope scope, string name, Variable v, int rnk) {
rnk = rankVariableOrAccess(scope, name, TVariableOrAccessCandVariable(v))
private predicate variableReachesRank(
VariableScope scope, string name, NestedFunctionOrVariable v, int rnk
) {
rnk = rankVariableOrAccess(scope, name, v)
or
variableReachesRank(scope, name, v, rnk - 1) and
rnk = rankVariableOrAccess(scope, name, TVariableOrAccessCandVariableAccessCand(_))
rnk = rankVariableOrAccess(scope, name, TDefOrAccessCandVariableAccessCand(_))
}
private predicate variableReachesCand(
VariableScope scope, string name, Variable v, VariableAccessCand cand, int nestLevel
VariableScope scope, string name, NestedFunctionOrVariable v, VariableAccessCand cand,
int nestLevel
) {
exists(int rnk |
variableReachesRank(scope, name, v, rnk) and
rnk = rankVariableOrAccess(scope, name, TVariableOrAccessCandVariableAccessCand(cand)) and
rnk = rankVariableOrAccess(scope, name, TDefOrAccessCandVariableAccessCand(cand)) and
variableAccessCandInScope(cand, scope, name, nestLevel, _)
)
}
pragma[nomagic]
predicate access(string name, NestedFunctionOrVariable v, VariableAccessCand cand) {
v =
min(NestedFunctionOrVariable v0, int nestLevel |
variableReachesCand(_, name, v0, cand, nestLevel)
|
v0 order by nestLevel
)
}
/** A variable access. */
class VariableAccess extends PathExprBaseImpl::PathExprBase instanceof VariableAccessCand {
class VariableAccess extends PathExprBaseImpl::PathExprBase {
private string name;
private Variable v;
@@ -574,6 +629,16 @@ module Impl {
}
}
/** A nested function access. */
class NestedFunctionAccess extends PathExprBaseImpl::PathExprBase {
private Function f;
NestedFunctionAccess() { nestedFunctionAccess(_, f, this) }
/** Gets the function being accessed. */
Function getFunction() { result = f }
}
cached
private module Cached {
cached
@@ -582,12 +647,12 @@ module Impl {
cached
predicate variableAccess(string name, Variable v, VariableAccessCand cand) {
v =
min(Variable v0, int nestLevel |
variableReachesCand(_, name, v0, cand, nestLevel)
|
v0 order by nestLevel
)
access(name, TDefOrAccessCandVariable(v), cand)
}
cached
predicate nestedFunctionAccess(string name, Function f, VariableAccessCand cand) {
access(name, TDefOrAccessCandNestedFunction(f, _), cand)
}
}

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,23 @@
import rust
import codeql.rust.controlflow.ControlFlowGraph
import codeql.rust.controlflow.BasicBlocks
query predicate dominates(BasicBlock bb1, BasicBlock bb2) { bb1.dominates(bb2) }
query predicate postDominance(BasicBlock bb1, BasicBlock bb2) { bb1.postDominates(bb2) }
query predicate immediateDominator(BasicBlock bb1, BasicBlock bb2) {
bb1.getImmediateDominator() = bb2
}
query predicate controls(ConditionBasicBlock bb1, BasicBlock bb2, SuccessorType t) {
bb1.controls(bb2, t)
}
query predicate successor(ConditionBasicBlock bb1, BasicBlock bb2, SuccessorType t) {
bb1.getASuccessor(t) = bb2
}
query predicate joinBlockPredecessor(JoinBasicBlock bb1, BasicBlock bb2, int i) {
bb1.getJoinBlockPredecessor(i) = bb2
}

View File

@@ -20,21 +20,28 @@ edges
| main.rs:41:26:44:5 | { ... } | main.rs:30:17:30:22 | ...: i64 | provenance | |
| main.rs:41:26:44:5 | { ... } | main.rs:41:13:44:6 | pass_through(...) | provenance | |
| main.rs:43:9:43:18 | source(...) | main.rs:41:26:44:5 | { ... } | provenance | |
| main.rs:56:23:56:28 | ...: i64 | main.rs:57:14:57:14 | n | provenance | |
| main.rs:59:31:65:5 | { ... } | main.rs:77:13:77:25 | mn.get_data(...) | provenance | |
| main.rs:63:13:63:21 | source(...) | main.rs:59:31:65:5 | { ... } | provenance | |
| main.rs:66:28:66:33 | ...: i64 | main.rs:66:43:72:5 | { ... } | provenance | |
| main.rs:77:9:77:9 | a | main.rs:78:10:78:10 | a | provenance | |
| main.rs:77:13:77:25 | mn.get_data(...) | main.rs:77:9:77:9 | a | provenance | |
| main.rs:83:9:83:9 | a | main.rs:84:16:84:16 | a | provenance | |
| main.rs:83:13:83:21 | source(...) | main.rs:83:9:83:9 | a | provenance | |
| main.rs:84:16:84:16 | a | main.rs:56:23:56:28 | ...: i64 | provenance | |
| main.rs:89:9:89:9 | a | main.rs:90:29:90:29 | a | provenance | |
| main.rs:89:13:89:21 | source(...) | main.rs:89:9:89:9 | a | provenance | |
| main.rs:90:9:90:9 | b | main.rs:91:10:91:10 | b | provenance | |
| main.rs:90:13:90:30 | mn.data_through(...) | main.rs:90:9:90:9 | b | provenance | |
| main.rs:90:29:90:29 | a | main.rs:66:28:66:33 | ...: i64 | provenance | |
| main.rs:90:29:90:29 | a | main.rs:90:13:90:30 | mn.data_through(...) | provenance | |
| main.rs:49:9:49:9 | a | main.rs:55:26:55:26 | a | provenance | |
| main.rs:49:13:49:22 | source(...) | main.rs:49:9:49:9 | a | provenance | |
| main.rs:51:21:51:26 | ...: i64 | main.rs:51:36:53:5 | { ... } | provenance | |
| main.rs:55:9:55:9 | b | main.rs:56:10:56:10 | b | provenance | |
| main.rs:55:13:55:27 | pass_through(...) | main.rs:55:9:55:9 | b | provenance | |
| main.rs:55:26:55:26 | a | main.rs:51:21:51:26 | ...: i64 | provenance | |
| main.rs:55:26:55:26 | a | main.rs:55:13:55:27 | pass_through(...) | provenance | |
| main.rs:67:23:67:28 | ...: i64 | main.rs:68:14:68:14 | n | provenance | |
| main.rs:70:31:76:5 | { ... } | main.rs:88:13:88:25 | mn.get_data(...) | provenance | |
| main.rs:74:13:74:21 | source(...) | main.rs:70:31:76:5 | { ... } | provenance | |
| main.rs:77:28:77:33 | ...: i64 | main.rs:77:43:83:5 | { ... } | provenance | |
| main.rs:88:9:88:9 | a | main.rs:89:10:89:10 | a | provenance | |
| main.rs:88:13:88:25 | mn.get_data(...) | main.rs:88:9:88:9 | a | provenance | |
| main.rs:94:9:94:9 | a | main.rs:95:16:95:16 | a | provenance | |
| main.rs:94:13:94:21 | source(...) | main.rs:94:9:94:9 | a | provenance | |
| main.rs:95:16:95:16 | a | main.rs:67:23:67:28 | ...: i64 | provenance | |
| main.rs:100:9:100:9 | a | main.rs:101:29:101:29 | a | provenance | |
| main.rs:100:13:100:21 | source(...) | main.rs:100:9:100:9 | a | provenance | |
| main.rs:101:9:101:9 | b | main.rs:102:10:102:10 | b | provenance | |
| main.rs:101:13:101:30 | mn.data_through(...) | main.rs:101:9:101:9 | b | provenance | |
| main.rs:101:29:101:29 | a | main.rs:77:28:77:33 | ...: i64 | provenance | |
| main.rs:101:29:101:29 | a | main.rs:101:13:101:30 | mn.data_through(...) | provenance | |
nodes
| main.rs:12:28:14:1 | { ... } | semmle.label | { ... } |
| main.rs:13:5:13:13 | source(...) | semmle.label | source(...) |
@@ -59,34 +66,44 @@ nodes
| main.rs:41:26:44:5 | { ... } | semmle.label | { ... } |
| main.rs:43:9:43:18 | source(...) | semmle.label | source(...) |
| main.rs:45:10:45:10 | a | semmle.label | a |
| main.rs:56:23:56:28 | ...: i64 | semmle.label | ...: i64 |
| main.rs:57:14:57:14 | n | semmle.label | n |
| main.rs:59:31:65:5 | { ... } | semmle.label | { ... } |
| main.rs:63:13:63:21 | source(...) | semmle.label | source(...) |
| main.rs:66:28:66:33 | ...: i64 | semmle.label | ...: i64 |
| main.rs:66:43:72:5 | { ... } | semmle.label | { ... } |
| main.rs:77:9:77:9 | a | semmle.label | a |
| main.rs:77:13:77:25 | mn.get_data(...) | semmle.label | mn.get_data(...) |
| main.rs:78:10:78:10 | a | semmle.label | a |
| main.rs:83:9:83:9 | a | semmle.label | a |
| main.rs:83:13:83:21 | source(...) | semmle.label | source(...) |
| main.rs:84:16:84:16 | a | semmle.label | a |
| main.rs:89:9:89:9 | a | semmle.label | a |
| main.rs:89:13:89:21 | source(...) | semmle.label | source(...) |
| main.rs:90:9:90:9 | b | semmle.label | b |
| main.rs:90:13:90:30 | mn.data_through(...) | semmle.label | mn.data_through(...) |
| main.rs:90:29:90:29 | a | semmle.label | a |
| main.rs:91:10:91:10 | b | semmle.label | b |
| main.rs:49:9:49:9 | a | semmle.label | a |
| main.rs:49:13:49:22 | source(...) | semmle.label | source(...) |
| main.rs:51:21:51:26 | ...: i64 | semmle.label | ...: i64 |
| main.rs:51:36:53:5 | { ... } | semmle.label | { ... } |
| main.rs:55:9:55:9 | b | semmle.label | b |
| main.rs:55:13:55:27 | pass_through(...) | semmle.label | pass_through(...) |
| main.rs:55:26:55:26 | a | semmle.label | a |
| main.rs:56:10:56:10 | b | semmle.label | b |
| main.rs:67:23:67:28 | ...: i64 | semmle.label | ...: i64 |
| main.rs:68:14:68:14 | n | semmle.label | n |
| main.rs:70:31:76:5 | { ... } | semmle.label | { ... } |
| main.rs:74:13:74:21 | source(...) | semmle.label | source(...) |
| main.rs:77:28:77:33 | ...: i64 | semmle.label | ...: i64 |
| main.rs:77:43:83:5 | { ... } | semmle.label | { ... } |
| main.rs:88:9:88:9 | a | semmle.label | a |
| main.rs:88:13:88:25 | mn.get_data(...) | semmle.label | mn.get_data(...) |
| main.rs:89:10:89:10 | a | semmle.label | a |
| main.rs:94:9:94:9 | a | semmle.label | a |
| main.rs:94:13:94:21 | source(...) | semmle.label | source(...) |
| main.rs:95:16:95:16 | a | semmle.label | a |
| main.rs:100:9:100:9 | a | semmle.label | a |
| main.rs:100:13:100:21 | source(...) | semmle.label | source(...) |
| main.rs:101:9:101:9 | b | semmle.label | b |
| main.rs:101:13:101:30 | mn.data_through(...) | semmle.label | mn.data_through(...) |
| main.rs:101:29:101:29 | a | semmle.label | a |
| main.rs:102:10:102:10 | b | semmle.label | b |
subpaths
| main.rs:36:26:36:26 | a | main.rs:30:17:30:22 | ...: i64 | main.rs:30:32:32:1 | { ... } | main.rs:36:13:36:27 | pass_through(...) |
| main.rs:41:26:44:5 | { ... } | main.rs:30:17:30:22 | ...: i64 | main.rs:30:32:32:1 | { ... } | main.rs:41:13:44:6 | pass_through(...) |
| main.rs:90:29:90:29 | a | main.rs:66:28:66:33 | ...: i64 | main.rs:66:43:72:5 | { ... } | main.rs:90:13:90:30 | mn.data_through(...) |
| main.rs:55:26:55:26 | a | main.rs:51:21:51:26 | ...: i64 | main.rs:51:36:53:5 | { ... } | main.rs:55:13:55:27 | pass_through(...) |
| main.rs:101:29:101:29 | a | main.rs:77:28:77:33 | ...: i64 | main.rs:77:43:83:5 | { ... } | main.rs:101:13:101:30 | mn.data_through(...) |
testFailures
#select
| main.rs:18:10:18:10 | a | main.rs:13:5:13:13 | source(...) | main.rs:18:10:18:10 | a | $@ | main.rs:13:5:13:13 | source(...) | source(...) |
| main.rs:22:10:22:10 | n | main.rs:26:13:26:21 | source(...) | main.rs:22:10:22:10 | n | $@ | main.rs:26:13:26:21 | source(...) | source(...) |
| main.rs:37:10:37:10 | b | main.rs:35:13:35:21 | source(...) | main.rs:37:10:37:10 | b | $@ | main.rs:35:13:35:21 | source(...) | source(...) |
| main.rs:45:10:45:10 | a | main.rs:43:9:43:18 | source(...) | main.rs:45:10:45:10 | a | $@ | main.rs:43:9:43:18 | source(...) | source(...) |
| main.rs:57:14:57:14 | n | main.rs:83:13:83:21 | source(...) | main.rs:57:14:57:14 | n | $@ | main.rs:83:13:83:21 | source(...) | source(...) |
| main.rs:78:10:78:10 | a | main.rs:63:13:63:21 | source(...) | main.rs:78:10:78:10 | a | $@ | main.rs:63:13:63:21 | source(...) | source(...) |
| main.rs:91:10:91:10 | b | main.rs:89:13:89:21 | source(...) | main.rs:91:10:91:10 | b | $@ | main.rs:89:13:89:21 | source(...) | source(...) |
| main.rs:56:10:56:10 | b | main.rs:49:13:49:22 | source(...) | main.rs:56:10:56:10 | b | $@ | main.rs:49:13:49:22 | source(...) | source(...) |
| main.rs:68:14:68:14 | n | main.rs:94:13:94:21 | source(...) | main.rs:68:14:68:14 | n | $@ | main.rs:94:13:94:21 | source(...) | source(...) |
| main.rs:89:10:89:10 | a | main.rs:74:13:74:21 | source(...) | main.rs:89:10:89:10 | a | $@ | main.rs:74:13:74:21 | source(...) | source(...) |
| main.rs:102:10:102:10 | b | main.rs:100:13:100:21 | source(...) | main.rs:102:10:102:10 | b | $@ | main.rs:100:13:100:21 | source(...) | source(...) |

View File

@@ -45,6 +45,17 @@ fn block_expression_as_argument() {
sink(a); // $ hasValueFlow=14
}
fn data_through_nested_function() {
let a = source(15);
fn pass_through(i: i64) -> i64 {
i
}
let b = pass_through(a);
sink(b); // $ hasValueFlow=15
}
// -----------------------------------------------------------------------------
// Data flow in, out, and through method.
@@ -127,6 +138,7 @@ fn main() {
data_out_of_call();
data_in_to_call();
data_through_call();
data_through_nested_function();
data_out_of_method();
data_in_to_method_call();

Some files were not shown because too many files have changed in this diff Show More