diff --git a/.codeqlmanifest.json b/.codeqlmanifest.json
index 81d370e793d..4efe12f6d2b 100644
--- a/.codeqlmanifest.json
+++ b/.codeqlmanifest.json
@@ -1,4 +1,5 @@
{ "provide": [ "*/ql/src/qlpack.yml",
+ "*/ql/lib/qlpack.yml",
"*/ql/test/qlpack.yml",
"cpp/ql/test/query-tests/Security/CWE/CWE-190/semmle/tainted/qlpack.yml",
"*/ql/examples/qlpack.yml",
diff --git a/.gitattributes b/.gitattributes
index 9a488b7bb5c..e705e8f40d9 100644
--- a/.gitattributes
+++ b/.gitattributes
@@ -48,3 +48,6 @@
*.gif -text
*.dll -text
*.pdb -text
+
+java/ql/test/stubs/**/*.java linguist-generated=true
+java/ql/test/experimental/stubs/**/*.java linguist-generated=true
\ No newline at end of file
diff --git a/config/identical-files.json b/config/identical-files.json
index 98b808e742c..74ef7b82323 100644
--- a/config/identical-files.json
+++ b/config/identical-files.json
@@ -1,333 +1,333 @@
{
"DataFlow Java/C++/C#/Python": [
- "java/ql/src/semmle/code/java/dataflow/internal/DataFlowImpl.qll",
- "java/ql/src/semmle/code/java/dataflow/internal/DataFlowImpl2.qll",
- "java/ql/src/semmle/code/java/dataflow/internal/DataFlowImpl3.qll",
- "java/ql/src/semmle/code/java/dataflow/internal/DataFlowImpl4.qll",
- "java/ql/src/semmle/code/java/dataflow/internal/DataFlowImpl5.qll",
- "java/ql/src/semmle/code/java/dataflow/internal/DataFlowImpl6.qll",
- "java/ql/src/semmle/code/java/dataflow/internal/DataFlowImplForSerializability.qll",
- "cpp/ql/src/semmle/code/cpp/dataflow/internal/DataFlowImpl.qll",
- "cpp/ql/src/semmle/code/cpp/dataflow/internal/DataFlowImpl2.qll",
- "cpp/ql/src/semmle/code/cpp/dataflow/internal/DataFlowImpl3.qll",
- "cpp/ql/src/semmle/code/cpp/dataflow/internal/DataFlowImpl4.qll",
- "cpp/ql/src/semmle/code/cpp/dataflow/internal/DataFlowImplLocal.qll",
- "cpp/ql/src/semmle/code/cpp/ir/dataflow/internal/DataFlowImpl.qll",
- "cpp/ql/src/semmle/code/cpp/ir/dataflow/internal/DataFlowImpl2.qll",
- "cpp/ql/src/semmle/code/cpp/ir/dataflow/internal/DataFlowImpl3.qll",
- "cpp/ql/src/semmle/code/cpp/ir/dataflow/internal/DataFlowImpl4.qll",
- "csharp/ql/src/semmle/code/csharp/dataflow/internal/DataFlowImpl.qll",
- "csharp/ql/src/semmle/code/csharp/dataflow/internal/DataFlowImpl2.qll",
- "csharp/ql/src/semmle/code/csharp/dataflow/internal/DataFlowImpl3.qll",
- "csharp/ql/src/semmle/code/csharp/dataflow/internal/DataFlowImpl4.qll",
- "csharp/ql/src/semmle/code/csharp/dataflow/internal/DataFlowImpl5.qll",
- "python/ql/src/semmle/python/dataflow/new/internal/DataFlowImpl.qll",
- "python/ql/src/semmle/python/dataflow/new/internal/DataFlowImpl2.qll",
- "python/ql/src/semmle/python/dataflow/new/internal/DataFlowImpl3.qll",
- "python/ql/src/semmle/python/dataflow/new/internal/DataFlowImpl4.qll"
+ "java/ql/lib/semmle/code/java/dataflow/internal/DataFlowImpl.qll",
+ "java/ql/lib/semmle/code/java/dataflow/internal/DataFlowImpl2.qll",
+ "java/ql/lib/semmle/code/java/dataflow/internal/DataFlowImpl3.qll",
+ "java/ql/lib/semmle/code/java/dataflow/internal/DataFlowImpl4.qll",
+ "java/ql/lib/semmle/code/java/dataflow/internal/DataFlowImpl5.qll",
+ "java/ql/lib/semmle/code/java/dataflow/internal/DataFlowImpl6.qll",
+ "java/ql/lib/semmle/code/java/dataflow/internal/DataFlowImplForSerializability.qll",
+ "cpp/ql/lib/semmle/code/cpp/dataflow/internal/DataFlowImpl.qll",
+ "cpp/ql/lib/semmle/code/cpp/dataflow/internal/DataFlowImpl2.qll",
+ "cpp/ql/lib/semmle/code/cpp/dataflow/internal/DataFlowImpl3.qll",
+ "cpp/ql/lib/semmle/code/cpp/dataflow/internal/DataFlowImpl4.qll",
+ "cpp/ql/lib/semmle/code/cpp/dataflow/internal/DataFlowImplLocal.qll",
+ "cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/DataFlowImpl.qll",
+ "cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/DataFlowImpl2.qll",
+ "cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/DataFlowImpl3.qll",
+ "cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/DataFlowImpl4.qll",
+ "csharp/ql/lib/semmle/code/csharp/dataflow/internal/DataFlowImpl.qll",
+ "csharp/ql/lib/semmle/code/csharp/dataflow/internal/DataFlowImpl2.qll",
+ "csharp/ql/lib/semmle/code/csharp/dataflow/internal/DataFlowImpl3.qll",
+ "csharp/ql/lib/semmle/code/csharp/dataflow/internal/DataFlowImpl4.qll",
+ "csharp/ql/lib/semmle/code/csharp/dataflow/internal/DataFlowImpl5.qll",
+ "python/ql/lib/semmle/python/dataflow/new/internal/DataFlowImpl.qll",
+ "python/ql/lib/semmle/python/dataflow/new/internal/DataFlowImpl2.qll",
+ "python/ql/lib/semmle/python/dataflow/new/internal/DataFlowImpl3.qll",
+ "python/ql/lib/semmle/python/dataflow/new/internal/DataFlowImpl4.qll"
],
"DataFlow Java/C++/C#/Python Common": [
- "java/ql/src/semmle/code/java/dataflow/internal/DataFlowImplCommon.qll",
- "cpp/ql/src/semmle/code/cpp/dataflow/internal/DataFlowImplCommon.qll",
- "cpp/ql/src/semmle/code/cpp/ir/dataflow/internal/DataFlowImplCommon.qll",
- "csharp/ql/src/semmle/code/csharp/dataflow/internal/DataFlowImplCommon.qll",
- "python/ql/src/semmle/python/dataflow/new/internal/DataFlowImplCommon.qll"
+ "java/ql/lib/semmle/code/java/dataflow/internal/DataFlowImplCommon.qll",
+ "cpp/ql/lib/semmle/code/cpp/dataflow/internal/DataFlowImplCommon.qll",
+ "cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/DataFlowImplCommon.qll",
+ "csharp/ql/lib/semmle/code/csharp/dataflow/internal/DataFlowImplCommon.qll",
+ "python/ql/lib/semmle/python/dataflow/new/internal/DataFlowImplCommon.qll"
],
"TaintTracking::Configuration Java/C++/C#/Python": [
- "cpp/ql/src/semmle/code/cpp/dataflow/internal/tainttracking1/TaintTrackingImpl.qll",
- "cpp/ql/src/semmle/code/cpp/dataflow/internal/tainttracking2/TaintTrackingImpl.qll",
- "cpp/ql/src/semmle/code/cpp/ir/dataflow/internal/tainttracking1/TaintTrackingImpl.qll",
- "cpp/ql/src/semmle/code/cpp/ir/dataflow/internal/tainttracking2/TaintTrackingImpl.qll",
- "cpp/ql/src/semmle/code/cpp/ir/dataflow/internal/tainttracking3/TaintTrackingImpl.qll",
- "csharp/ql/src/semmle/code/csharp/dataflow/internal/tainttracking1/TaintTrackingImpl.qll",
- "csharp/ql/src/semmle/code/csharp/dataflow/internal/tainttracking2/TaintTrackingImpl.qll",
- "csharp/ql/src/semmle/code/csharp/dataflow/internal/tainttracking3/TaintTrackingImpl.qll",
- "csharp/ql/src/semmle/code/csharp/dataflow/internal/tainttracking4/TaintTrackingImpl.qll",
- "csharp/ql/src/semmle/code/csharp/dataflow/internal/tainttracking5/TaintTrackingImpl.qll",
- "java/ql/src/semmle/code/java/dataflow/internal/tainttracking1/TaintTrackingImpl.qll",
- "java/ql/src/semmle/code/java/dataflow/internal/tainttracking2/TaintTrackingImpl.qll",
- "python/ql/src/semmle/python/dataflow/new/internal/tainttracking1/TaintTrackingImpl.qll",
- "python/ql/src/semmle/python/dataflow/new/internal/tainttracking2/TaintTrackingImpl.qll",
- "python/ql/src/semmle/python/dataflow/new/internal/tainttracking3/TaintTrackingImpl.qll",
- "python/ql/src/semmle/python/dataflow/new/internal/tainttracking4/TaintTrackingImpl.qll"
+ "cpp/ql/lib/semmle/code/cpp/dataflow/internal/tainttracking1/TaintTrackingImpl.qll",
+ "cpp/ql/lib/semmle/code/cpp/dataflow/internal/tainttracking2/TaintTrackingImpl.qll",
+ "cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/tainttracking1/TaintTrackingImpl.qll",
+ "cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/tainttracking2/TaintTrackingImpl.qll",
+ "cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/tainttracking3/TaintTrackingImpl.qll",
+ "csharp/ql/lib/semmle/code/csharp/dataflow/internal/tainttracking1/TaintTrackingImpl.qll",
+ "csharp/ql/lib/semmle/code/csharp/dataflow/internal/tainttracking2/TaintTrackingImpl.qll",
+ "csharp/ql/lib/semmle/code/csharp/dataflow/internal/tainttracking3/TaintTrackingImpl.qll",
+ "csharp/ql/lib/semmle/code/csharp/dataflow/internal/tainttracking4/TaintTrackingImpl.qll",
+ "csharp/ql/lib/semmle/code/csharp/dataflow/internal/tainttracking5/TaintTrackingImpl.qll",
+ "java/ql/lib/semmle/code/java/dataflow/internal/tainttracking1/TaintTrackingImpl.qll",
+ "java/ql/lib/semmle/code/java/dataflow/internal/tainttracking2/TaintTrackingImpl.qll",
+ "python/ql/lib/semmle/python/dataflow/new/internal/tainttracking1/TaintTrackingImpl.qll",
+ "python/ql/lib/semmle/python/dataflow/new/internal/tainttracking2/TaintTrackingImpl.qll",
+ "python/ql/lib/semmle/python/dataflow/new/internal/tainttracking3/TaintTrackingImpl.qll",
+ "python/ql/lib/semmle/python/dataflow/new/internal/tainttracking4/TaintTrackingImpl.qll"
],
"DataFlow Java/C++/C#/Python Consistency checks": [
- "java/ql/src/semmle/code/java/dataflow/internal/DataFlowImplConsistency.qll",
- "cpp/ql/src/semmle/code/cpp/dataflow/internal/DataFlowImplConsistency.qll",
- "cpp/ql/src/semmle/code/cpp/ir/dataflow/internal/DataFlowImplConsistency.qll",
- "csharp/ql/src/semmle/code/csharp/dataflow/internal/DataFlowImplConsistency.qll",
- "python/ql/src/semmle/python/dataflow/new/internal/DataFlowImplConsistency.qll"
+ "java/ql/lib/semmle/code/java/dataflow/internal/DataFlowImplConsistency.qll",
+ "cpp/ql/lib/semmle/code/cpp/dataflow/internal/DataFlowImplConsistency.qll",
+ "cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/DataFlowImplConsistency.qll",
+ "csharp/ql/lib/semmle/code/csharp/dataflow/internal/DataFlowImplConsistency.qll",
+ "python/ql/lib/semmle/python/dataflow/new/internal/DataFlowImplConsistency.qll"
],
"DataFlow Java/C# Flow Summaries": [
- "java/ql/src/semmle/code/java/dataflow/internal/FlowSummaryImpl.qll",
- "csharp/ql/src/semmle/code/csharp/dataflow/internal/FlowSummaryImpl.qll"
+ "java/ql/lib/semmle/code/java/dataflow/internal/FlowSummaryImpl.qll",
+ "csharp/ql/lib/semmle/code/csharp/dataflow/internal/FlowSummaryImpl.qll"
],
"SsaReadPosition Java/C#": [
- "java/ql/src/semmle/code/java/dataflow/internal/rangeanalysis/SsaReadPositionCommon.qll",
- "csharp/ql/src/semmle/code/csharp/dataflow/internal/rangeanalysis/SsaReadPositionCommon.qll"
+ "java/ql/lib/semmle/code/java/dataflow/internal/rangeanalysis/SsaReadPositionCommon.qll",
+ "csharp/ql/lib/semmle/code/csharp/dataflow/internal/rangeanalysis/SsaReadPositionCommon.qll"
],
"Sign Java/C#": [
- "java/ql/src/semmle/code/java/dataflow/internal/rangeanalysis/Sign.qll",
- "csharp/ql/src/semmle/code/csharp/dataflow/internal/rangeanalysis/Sign.qll"
+ "java/ql/lib/semmle/code/java/dataflow/internal/rangeanalysis/Sign.qll",
+ "csharp/ql/lib/semmle/code/csharp/dataflow/internal/rangeanalysis/Sign.qll"
],
"SignAnalysis Java/C#": [
- "java/ql/src/semmle/code/java/dataflow/internal/rangeanalysis/SignAnalysisCommon.qll",
- "csharp/ql/src/semmle/code/csharp/dataflow/internal/rangeanalysis/SignAnalysisCommon.qll"
+ "java/ql/lib/semmle/code/java/dataflow/internal/rangeanalysis/SignAnalysisCommon.qll",
+ "csharp/ql/lib/semmle/code/csharp/dataflow/internal/rangeanalysis/SignAnalysisCommon.qll"
],
"Bound Java/C#": [
- "java/ql/src/semmle/code/java/dataflow/Bound.qll",
- "csharp/ql/src/semmle/code/csharp/dataflow/Bound.qll"
+ "java/ql/lib/semmle/code/java/dataflow/Bound.qll",
+ "csharp/ql/lib/semmle/code/csharp/dataflow/Bound.qll"
],
"ModulusAnalysis Java/C#": [
- "java/ql/src/semmle/code/java/dataflow/ModulusAnalysis.qll",
- "csharp/ql/src/semmle/code/csharp/dataflow/ModulusAnalysis.qll"
+ "java/ql/lib/semmle/code/java/dataflow/ModulusAnalysis.qll",
+ "csharp/ql/lib/semmle/code/csharp/dataflow/ModulusAnalysis.qll"
],
"C++ SubBasicBlocks": [
- "cpp/ql/src/semmle/code/cpp/controlflow/SubBasicBlocks.qll",
- "cpp/ql/src/semmle/code/cpp/dataflow/internal/SubBasicBlocks.qll"
+ "cpp/ql/lib/semmle/code/cpp/controlflow/SubBasicBlocks.qll",
+ "cpp/ql/lib/semmle/code/cpp/dataflow/internal/SubBasicBlocks.qll"
],
"IR Instruction": [
- "cpp/ql/src/semmle/code/cpp/ir/implementation/raw/Instruction.qll",
- "cpp/ql/src/semmle/code/cpp/ir/implementation/unaliased_ssa/Instruction.qll",
- "cpp/ql/src/semmle/code/cpp/ir/implementation/aliased_ssa/Instruction.qll",
+ "cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/Instruction.qll",
+ "cpp/ql/lib/semmle/code/cpp/ir/implementation/unaliased_ssa/Instruction.qll",
+ "cpp/ql/lib/semmle/code/cpp/ir/implementation/aliased_ssa/Instruction.qll",
"csharp/ql/src/experimental/ir/implementation/raw/Instruction.qll",
"csharp/ql/src/experimental/ir/implementation/unaliased_ssa/Instruction.qll"
],
"IR IRBlock": [
- "cpp/ql/src/semmle/code/cpp/ir/implementation/raw/IRBlock.qll",
- "cpp/ql/src/semmle/code/cpp/ir/implementation/unaliased_ssa/IRBlock.qll",
- "cpp/ql/src/semmle/code/cpp/ir/implementation/aliased_ssa/IRBlock.qll",
+ "cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/IRBlock.qll",
+ "cpp/ql/lib/semmle/code/cpp/ir/implementation/unaliased_ssa/IRBlock.qll",
+ "cpp/ql/lib/semmle/code/cpp/ir/implementation/aliased_ssa/IRBlock.qll",
"csharp/ql/src/experimental/ir/implementation/raw/IRBlock.qll",
"csharp/ql/src/experimental/ir/implementation/unaliased_ssa/IRBlock.qll"
],
"IR IRVariable": [
- "cpp/ql/src/semmle/code/cpp/ir/implementation/raw/IRVariable.qll",
- "cpp/ql/src/semmle/code/cpp/ir/implementation/unaliased_ssa/IRVariable.qll",
- "cpp/ql/src/semmle/code/cpp/ir/implementation/aliased_ssa/IRVariable.qll",
+ "cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/IRVariable.qll",
+ "cpp/ql/lib/semmle/code/cpp/ir/implementation/unaliased_ssa/IRVariable.qll",
+ "cpp/ql/lib/semmle/code/cpp/ir/implementation/aliased_ssa/IRVariable.qll",
"csharp/ql/src/experimental/ir/implementation/raw/IRVariable.qll",
"csharp/ql/src/experimental/ir/implementation/unaliased_ssa/IRVariable.qll"
],
"IR IRFunction": [
- "cpp/ql/src/semmle/code/cpp/ir/implementation/raw/IRFunction.qll",
- "cpp/ql/src/semmle/code/cpp/ir/implementation/unaliased_ssa/IRFunction.qll",
- "cpp/ql/src/semmle/code/cpp/ir/implementation/aliased_ssa/IRFunction.qll",
+ "cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/IRFunction.qll",
+ "cpp/ql/lib/semmle/code/cpp/ir/implementation/unaliased_ssa/IRFunction.qll",
+ "cpp/ql/lib/semmle/code/cpp/ir/implementation/aliased_ssa/IRFunction.qll",
"csharp/ql/src/experimental/ir/implementation/raw/IRFunction.qll",
"csharp/ql/src/experimental/ir/implementation/unaliased_ssa/IRFunction.qll"
],
"IR Operand": [
- "cpp/ql/src/semmle/code/cpp/ir/implementation/raw/Operand.qll",
- "cpp/ql/src/semmle/code/cpp/ir/implementation/unaliased_ssa/Operand.qll",
- "cpp/ql/src/semmle/code/cpp/ir/implementation/aliased_ssa/Operand.qll",
+ "cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/Operand.qll",
+ "cpp/ql/lib/semmle/code/cpp/ir/implementation/unaliased_ssa/Operand.qll",
+ "cpp/ql/lib/semmle/code/cpp/ir/implementation/aliased_ssa/Operand.qll",
"csharp/ql/src/experimental/ir/implementation/raw/Operand.qll",
"csharp/ql/src/experimental/ir/implementation/unaliased_ssa/Operand.qll"
],
"IR IRType": [
- "cpp/ql/src/semmle/code/cpp/ir/implementation/IRType.qll",
+ "cpp/ql/lib/semmle/code/cpp/ir/implementation/IRType.qll",
"csharp/ql/src/experimental/ir/implementation/IRType.qll"
],
"IR IRConfiguration": [
- "cpp/ql/src/semmle/code/cpp/ir/implementation/IRConfiguration.qll",
+ "cpp/ql/lib/semmle/code/cpp/ir/implementation/IRConfiguration.qll",
"csharp/ql/src/experimental/ir/implementation/IRConfiguration.qll"
],
"IR UseSoundEscapeAnalysis": [
- "cpp/ql/src/semmle/code/cpp/ir/implementation/UseSoundEscapeAnalysis.qll",
+ "cpp/ql/lib/semmle/code/cpp/ir/implementation/UseSoundEscapeAnalysis.qll",
"csharp/ql/src/experimental/ir/implementation/UseSoundEscapeAnalysis.qll"
],
"IR IRFunctionBase": [
- "cpp/ql/src/semmle/code/cpp/ir/implementation/internal/IRFunctionBase.qll",
+ "cpp/ql/lib/semmle/code/cpp/ir/implementation/internal/IRFunctionBase.qll",
"csharp/ql/src/experimental/ir/implementation/internal/IRFunctionBase.qll"
],
"IR Operand Tag": [
- "cpp/ql/src/semmle/code/cpp/ir/implementation/internal/OperandTag.qll",
+ "cpp/ql/lib/semmle/code/cpp/ir/implementation/internal/OperandTag.qll",
"csharp/ql/src/experimental/ir/implementation/internal/OperandTag.qll"
],
"IR TInstruction": [
- "cpp/ql/src/semmle/code/cpp/ir/implementation/internal/TInstruction.qll",
+ "cpp/ql/lib/semmle/code/cpp/ir/implementation/internal/TInstruction.qll",
"csharp/ql/src/experimental/ir/implementation/internal/TInstruction.qll"
],
"IR TIRVariable": [
- "cpp/ql/src/semmle/code/cpp/ir/implementation/internal/TIRVariable.qll",
+ "cpp/ql/lib/semmle/code/cpp/ir/implementation/internal/TIRVariable.qll",
"csharp/ql/src/experimental/ir/implementation/internal/TIRVariable.qll"
],
"IR IR": [
- "cpp/ql/src/semmle/code/cpp/ir/implementation/raw/IR.qll",
- "cpp/ql/src/semmle/code/cpp/ir/implementation/unaliased_ssa/IR.qll",
- "cpp/ql/src/semmle/code/cpp/ir/implementation/aliased_ssa/IR.qll",
+ "cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/IR.qll",
+ "cpp/ql/lib/semmle/code/cpp/ir/implementation/unaliased_ssa/IR.qll",
+ "cpp/ql/lib/semmle/code/cpp/ir/implementation/aliased_ssa/IR.qll",
"csharp/ql/src/experimental/ir/implementation/raw/IR.qll",
"csharp/ql/src/experimental/ir/implementation/unaliased_ssa/IR.qll"
],
"IR IRConsistency": [
- "cpp/ql/src/semmle/code/cpp/ir/implementation/raw/IRConsistency.qll",
- "cpp/ql/src/semmle/code/cpp/ir/implementation/unaliased_ssa/IRConsistency.qll",
- "cpp/ql/src/semmle/code/cpp/ir/implementation/aliased_ssa/IRConsistency.qll",
+ "cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/IRConsistency.qll",
+ "cpp/ql/lib/semmle/code/cpp/ir/implementation/unaliased_ssa/IRConsistency.qll",
+ "cpp/ql/lib/semmle/code/cpp/ir/implementation/aliased_ssa/IRConsistency.qll",
"csharp/ql/src/experimental/ir/implementation/raw/IRConsistency.qll",
"csharp/ql/src/experimental/ir/implementation/unaliased_ssa/IRConsistency.qll"
],
"IR PrintIR": [
- "cpp/ql/src/semmle/code/cpp/ir/implementation/raw/PrintIR.qll",
- "cpp/ql/src/semmle/code/cpp/ir/implementation/unaliased_ssa/PrintIR.qll",
- "cpp/ql/src/semmle/code/cpp/ir/implementation/aliased_ssa/PrintIR.qll",
+ "cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/PrintIR.qll",
+ "cpp/ql/lib/semmle/code/cpp/ir/implementation/unaliased_ssa/PrintIR.qll",
+ "cpp/ql/lib/semmle/code/cpp/ir/implementation/aliased_ssa/PrintIR.qll",
"csharp/ql/src/experimental/ir/implementation/raw/PrintIR.qll",
"csharp/ql/src/experimental/ir/implementation/unaliased_ssa/PrintIR.qll"
],
"IR IntegerConstant": [
- "cpp/ql/src/semmle/code/cpp/ir/internal/IntegerConstant.qll",
+ "cpp/ql/lib/semmle/code/cpp/ir/internal/IntegerConstant.qll",
"csharp/ql/src/experimental/ir/internal/IntegerConstant.qll"
],
"IR IntegerInteval": [
- "cpp/ql/src/semmle/code/cpp/ir/internal/IntegerInterval.qll",
+ "cpp/ql/lib/semmle/code/cpp/ir/internal/IntegerInterval.qll",
"csharp/ql/src/experimental/ir/internal/IntegerInterval.qll"
],
"IR IntegerPartial": [
- "cpp/ql/src/semmle/code/cpp/ir/internal/IntegerPartial.qll",
+ "cpp/ql/lib/semmle/code/cpp/ir/internal/IntegerPartial.qll",
"csharp/ql/src/experimental/ir/internal/IntegerPartial.qll"
],
"IR Overlap": [
- "cpp/ql/src/semmle/code/cpp/ir/internal/Overlap.qll",
+ "cpp/ql/lib/semmle/code/cpp/ir/internal/Overlap.qll",
"csharp/ql/src/experimental/ir/internal/Overlap.qll"
],
"IR EdgeKind": [
- "cpp/ql/src/semmle/code/cpp/ir/implementation/EdgeKind.qll",
+ "cpp/ql/lib/semmle/code/cpp/ir/implementation/EdgeKind.qll",
"csharp/ql/src/experimental/ir/implementation/EdgeKind.qll"
],
"IR MemoryAccessKind": [
- "cpp/ql/src/semmle/code/cpp/ir/implementation/MemoryAccessKind.qll",
+ "cpp/ql/lib/semmle/code/cpp/ir/implementation/MemoryAccessKind.qll",
"csharp/ql/src/experimental/ir/implementation/MemoryAccessKind.qll"
],
"IR TempVariableTag": [
- "cpp/ql/src/semmle/code/cpp/ir/implementation/TempVariableTag.qll",
+ "cpp/ql/lib/semmle/code/cpp/ir/implementation/TempVariableTag.qll",
"csharp/ql/src/experimental/ir/implementation/TempVariableTag.qll"
],
"IR Opcode": [
- "cpp/ql/src/semmle/code/cpp/ir/implementation/Opcode.qll",
+ "cpp/ql/lib/semmle/code/cpp/ir/implementation/Opcode.qll",
"csharp/ql/src/experimental/ir/implementation/Opcode.qll"
],
"IR SSAConsistency": [
- "cpp/ql/src/semmle/code/cpp/ir/implementation/unaliased_ssa/internal/SSAConsistency.qll",
- "cpp/ql/src/semmle/code/cpp/ir/implementation/aliased_ssa/internal/SSAConsistency.qll",
+ "cpp/ql/lib/semmle/code/cpp/ir/implementation/unaliased_ssa/internal/SSAConsistency.qll",
+ "cpp/ql/lib/semmle/code/cpp/ir/implementation/aliased_ssa/internal/SSAConsistency.qll",
"csharp/ql/src/experimental/ir/implementation/unaliased_ssa/internal/SSAConsistency.qll"
],
"C++ IR InstructionImports": [
- "cpp/ql/src/semmle/code/cpp/ir/implementation/raw/internal/InstructionImports.qll",
- "cpp/ql/src/semmle/code/cpp/ir/implementation/unaliased_ssa/internal/InstructionImports.qll",
- "cpp/ql/src/semmle/code/cpp/ir/implementation/aliased_ssa/internal/InstructionImports.qll"
+ "cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/internal/InstructionImports.qll",
+ "cpp/ql/lib/semmle/code/cpp/ir/implementation/unaliased_ssa/internal/InstructionImports.qll",
+ "cpp/ql/lib/semmle/code/cpp/ir/implementation/aliased_ssa/internal/InstructionImports.qll"
],
"C++ IR IRImports": [
- "cpp/ql/src/semmle/code/cpp/ir/implementation/raw/internal/IRImports.qll",
- "cpp/ql/src/semmle/code/cpp/ir/implementation/unaliased_ssa/internal/IRImports.qll",
- "cpp/ql/src/semmle/code/cpp/ir/implementation/aliased_ssa/internal/IRImports.qll"
+ "cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/internal/IRImports.qll",
+ "cpp/ql/lib/semmle/code/cpp/ir/implementation/unaliased_ssa/internal/IRImports.qll",
+ "cpp/ql/lib/semmle/code/cpp/ir/implementation/aliased_ssa/internal/IRImports.qll"
],
"C++ IR IRBlockImports": [
- "cpp/ql/src/semmle/code/cpp/ir/implementation/raw/internal/IRBlockImports.qll",
- "cpp/ql/src/semmle/code/cpp/ir/implementation/unaliased_ssa/internal/IRBlockImports.qll",
- "cpp/ql/src/semmle/code/cpp/ir/implementation/aliased_ssa/internal/IRBlockImports.qll"
+ "cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/internal/IRBlockImports.qll",
+ "cpp/ql/lib/semmle/code/cpp/ir/implementation/unaliased_ssa/internal/IRBlockImports.qll",
+ "cpp/ql/lib/semmle/code/cpp/ir/implementation/aliased_ssa/internal/IRBlockImports.qll"
],
"C++ IR IRFunctionImports": [
- "cpp/ql/src/semmle/code/cpp/ir/implementation/raw/internal/IRFunctionImports.qll",
- "cpp/ql/src/semmle/code/cpp/ir/implementation/unaliased_ssa/internal/IRFunctionImports.qll",
- "cpp/ql/src/semmle/code/cpp/ir/implementation/aliased_ssa/internal/IRFunctionImports.qll"
+ "cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/internal/IRFunctionImports.qll",
+ "cpp/ql/lib/semmle/code/cpp/ir/implementation/unaliased_ssa/internal/IRFunctionImports.qll",
+ "cpp/ql/lib/semmle/code/cpp/ir/implementation/aliased_ssa/internal/IRFunctionImports.qll"
],
"C++ IR IRVariableImports": [
- "cpp/ql/src/semmle/code/cpp/ir/implementation/raw/internal/IRVariableImports.qll",
- "cpp/ql/src/semmle/code/cpp/ir/implementation/unaliased_ssa/internal/IRVariableImports.qll",
- "cpp/ql/src/semmle/code/cpp/ir/implementation/aliased_ssa/internal/IRVariableImports.qll"
+ "cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/internal/IRVariableImports.qll",
+ "cpp/ql/lib/semmle/code/cpp/ir/implementation/unaliased_ssa/internal/IRVariableImports.qll",
+ "cpp/ql/lib/semmle/code/cpp/ir/implementation/aliased_ssa/internal/IRVariableImports.qll"
],
"C++ IR OperandImports": [
- "cpp/ql/src/semmle/code/cpp/ir/implementation/raw/internal/OperandImports.qll",
- "cpp/ql/src/semmle/code/cpp/ir/implementation/unaliased_ssa/internal/OperandImports.qll",
- "cpp/ql/src/semmle/code/cpp/ir/implementation/aliased_ssa/internal/OperandImports.qll"
+ "cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/internal/OperandImports.qll",
+ "cpp/ql/lib/semmle/code/cpp/ir/implementation/unaliased_ssa/internal/OperandImports.qll",
+ "cpp/ql/lib/semmle/code/cpp/ir/implementation/aliased_ssa/internal/OperandImports.qll"
],
"C++ IR PrintIRImports": [
- "cpp/ql/src/semmle/code/cpp/ir/implementation/raw/internal/PrintIRImports.qll",
- "cpp/ql/src/semmle/code/cpp/ir/implementation/unaliased_ssa/internal/PrintIRImports.qll",
- "cpp/ql/src/semmle/code/cpp/ir/implementation/aliased_ssa/internal/PrintIRImports.qll"
+ "cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/internal/PrintIRImports.qll",
+ "cpp/ql/lib/semmle/code/cpp/ir/implementation/unaliased_ssa/internal/PrintIRImports.qll",
+ "cpp/ql/lib/semmle/code/cpp/ir/implementation/aliased_ssa/internal/PrintIRImports.qll"
],
"C++ SSA SSAConstructionImports": [
- "cpp/ql/src/semmle/code/cpp/ir/implementation/unaliased_ssa/internal/SSAConstructionImports.qll",
- "cpp/ql/src/semmle/code/cpp/ir/implementation/aliased_ssa/internal/SSAConstructionImports.qll"
+ "cpp/ql/lib/semmle/code/cpp/ir/implementation/unaliased_ssa/internal/SSAConstructionImports.qll",
+ "cpp/ql/lib/semmle/code/cpp/ir/implementation/aliased_ssa/internal/SSAConstructionImports.qll"
],
"SSA AliasAnalysis": [
- "cpp/ql/src/semmle/code/cpp/ir/implementation/unaliased_ssa/internal/AliasAnalysis.qll",
- "cpp/ql/src/semmle/code/cpp/ir/implementation/aliased_ssa/internal/AliasAnalysis.qll",
+ "cpp/ql/lib/semmle/code/cpp/ir/implementation/unaliased_ssa/internal/AliasAnalysis.qll",
+ "cpp/ql/lib/semmle/code/cpp/ir/implementation/aliased_ssa/internal/AliasAnalysis.qll",
"csharp/ql/src/experimental/ir/implementation/unaliased_ssa/internal/AliasAnalysis.qll"
],
"SSA PrintAliasAnalysis": [
- "cpp/ql/src/semmle/code/cpp/ir/implementation/unaliased_ssa/internal/PrintAliasAnalysis.qll",
- "cpp/ql/src/semmle/code/cpp/ir/implementation/aliased_ssa/internal/PrintAliasAnalysis.qll"
+ "cpp/ql/lib/semmle/code/cpp/ir/implementation/unaliased_ssa/internal/PrintAliasAnalysis.qll",
+ "cpp/ql/lib/semmle/code/cpp/ir/implementation/aliased_ssa/internal/PrintAliasAnalysis.qll"
],
"C++ SSA AliasAnalysisImports": [
- "cpp/ql/src/semmle/code/cpp/ir/implementation/unaliased_ssa/internal/AliasAnalysisImports.qll",
- "cpp/ql/src/semmle/code/cpp/ir/implementation/aliased_ssa/internal/AliasAnalysisImports.qll"
+ "cpp/ql/lib/semmle/code/cpp/ir/implementation/unaliased_ssa/internal/AliasAnalysisImports.qll",
+ "cpp/ql/lib/semmle/code/cpp/ir/implementation/aliased_ssa/internal/AliasAnalysisImports.qll"
],
"C++ IR ValueNumberingImports": [
- "cpp/ql/src/semmle/code/cpp/ir/implementation/raw/gvn/internal/ValueNumberingImports.qll",
- "cpp/ql/src/semmle/code/cpp/ir/implementation/unaliased_ssa/gvn/internal/ValueNumberingImports.qll",
- "cpp/ql/src/semmle/code/cpp/ir/implementation/aliased_ssa/gvn/internal/ValueNumberingImports.qll"
+ "cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/gvn/internal/ValueNumberingImports.qll",
+ "cpp/ql/lib/semmle/code/cpp/ir/implementation/unaliased_ssa/gvn/internal/ValueNumberingImports.qll",
+ "cpp/ql/lib/semmle/code/cpp/ir/implementation/aliased_ssa/gvn/internal/ValueNumberingImports.qll"
],
"IR SSA SimpleSSA": [
- "cpp/ql/src/semmle/code/cpp/ir/implementation/unaliased_ssa/internal/SimpleSSA.qll",
+ "cpp/ql/lib/semmle/code/cpp/ir/implementation/unaliased_ssa/internal/SimpleSSA.qll",
"csharp/ql/src/experimental/ir/implementation/unaliased_ssa/internal/SimpleSSA.qll"
],
"IR AliasConfiguration (unaliased_ssa)": [
- "cpp/ql/src/semmle/code/cpp/ir/implementation/unaliased_ssa/internal/AliasConfiguration.qll",
+ "cpp/ql/lib/semmle/code/cpp/ir/implementation/unaliased_ssa/internal/AliasConfiguration.qll",
"csharp/ql/src/experimental/ir/implementation/unaliased_ssa/internal/AliasConfiguration.qll"
],
"IR SSA SSAConstruction": [
- "cpp/ql/src/semmle/code/cpp/ir/implementation/unaliased_ssa/internal/SSAConstruction.qll",
- "cpp/ql/src/semmle/code/cpp/ir/implementation/aliased_ssa/internal/SSAConstruction.qll",
+ "cpp/ql/lib/semmle/code/cpp/ir/implementation/unaliased_ssa/internal/SSAConstruction.qll",
+ "cpp/ql/lib/semmle/code/cpp/ir/implementation/aliased_ssa/internal/SSAConstruction.qll",
"csharp/ql/src/experimental/ir/implementation/unaliased_ssa/internal/SSAConstruction.qll"
],
"IR SSA PrintSSA": [
- "cpp/ql/src/semmle/code/cpp/ir/implementation/unaliased_ssa/internal/PrintSSA.qll",
- "cpp/ql/src/semmle/code/cpp/ir/implementation/aliased_ssa/internal/PrintSSA.qll",
+ "cpp/ql/lib/semmle/code/cpp/ir/implementation/unaliased_ssa/internal/PrintSSA.qll",
+ "cpp/ql/lib/semmle/code/cpp/ir/implementation/aliased_ssa/internal/PrintSSA.qll",
"csharp/ql/src/experimental/ir/implementation/unaliased_ssa/internal/PrintSSA.qll"
],
"IR ValueNumberInternal": [
- "cpp/ql/src/semmle/code/cpp/ir/implementation/raw/gvn/internal/ValueNumberingInternal.qll",
- "cpp/ql/src/semmle/code/cpp/ir/implementation/unaliased_ssa/gvn/internal/ValueNumberingInternal.qll",
- "cpp/ql/src/semmle/code/cpp/ir/implementation/aliased_ssa/gvn/internal/ValueNumberingInternal.qll",
+ "cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/gvn/internal/ValueNumberingInternal.qll",
+ "cpp/ql/lib/semmle/code/cpp/ir/implementation/unaliased_ssa/gvn/internal/ValueNumberingInternal.qll",
+ "cpp/ql/lib/semmle/code/cpp/ir/implementation/aliased_ssa/gvn/internal/ValueNumberingInternal.qll",
"csharp/ql/src/experimental/ir/implementation/raw/gvn/internal/ValueNumberingInternal.qll",
"csharp/ql/src/experimental/ir/implementation/unaliased_ssa/gvn/internal/ValueNumberingInternal.qll"
],
"C++ IR ValueNumber": [
- "cpp/ql/src/semmle/code/cpp/ir/implementation/raw/gvn/ValueNumbering.qll",
- "cpp/ql/src/semmle/code/cpp/ir/implementation/unaliased_ssa/gvn/ValueNumbering.qll",
- "cpp/ql/src/semmle/code/cpp/ir/implementation/aliased_ssa/gvn/ValueNumbering.qll",
+ "cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/gvn/ValueNumbering.qll",
+ "cpp/ql/lib/semmle/code/cpp/ir/implementation/unaliased_ssa/gvn/ValueNumbering.qll",
+ "cpp/ql/lib/semmle/code/cpp/ir/implementation/aliased_ssa/gvn/ValueNumbering.qll",
"csharp/ql/src/experimental/ir/implementation/raw/gvn/ValueNumbering.qll",
"csharp/ql/src/experimental/ir/implementation/unaliased_ssa/gvn/ValueNumbering.qll"
],
"C++ IR PrintValueNumbering": [
- "cpp/ql/src/semmle/code/cpp/ir/implementation/raw/gvn/PrintValueNumbering.qll",
- "cpp/ql/src/semmle/code/cpp/ir/implementation/unaliased_ssa/gvn/PrintValueNumbering.qll",
- "cpp/ql/src/semmle/code/cpp/ir/implementation/aliased_ssa/gvn/PrintValueNumbering.qll",
+ "cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/gvn/PrintValueNumbering.qll",
+ "cpp/ql/lib/semmle/code/cpp/ir/implementation/unaliased_ssa/gvn/PrintValueNumbering.qll",
+ "cpp/ql/lib/semmle/code/cpp/ir/implementation/aliased_ssa/gvn/PrintValueNumbering.qll",
"csharp/ql/src/experimental/ir/implementation/raw/gvn/PrintValueNumbering.qll",
"csharp/ql/src/experimental/ir/implementation/unaliased_ssa/gvn/PrintValueNumbering.qll"
],
"C++ IR ConstantAnalysis": [
- "cpp/ql/src/semmle/code/cpp/ir/implementation/raw/constant/ConstantAnalysis.qll",
- "cpp/ql/src/semmle/code/cpp/ir/implementation/unaliased_ssa/constant/ConstantAnalysis.qll",
- "cpp/ql/src/semmle/code/cpp/ir/implementation/aliased_ssa/constant/ConstantAnalysis.qll"
+ "cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/constant/ConstantAnalysis.qll",
+ "cpp/ql/lib/semmle/code/cpp/ir/implementation/unaliased_ssa/constant/ConstantAnalysis.qll",
+ "cpp/ql/lib/semmle/code/cpp/ir/implementation/aliased_ssa/constant/ConstantAnalysis.qll"
],
"C++ IR PrintConstantAnalysis": [
- "cpp/ql/src/semmle/code/cpp/ir/implementation/raw/constant/PrintConstantAnalysis.qll",
- "cpp/ql/src/semmle/code/cpp/ir/implementation/unaliased_ssa/constant/PrintConstantAnalysis.qll",
- "cpp/ql/src/semmle/code/cpp/ir/implementation/aliased_ssa/constant/PrintConstantAnalysis.qll"
+ "cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/constant/PrintConstantAnalysis.qll",
+ "cpp/ql/lib/semmle/code/cpp/ir/implementation/unaliased_ssa/constant/PrintConstantAnalysis.qll",
+ "cpp/ql/lib/semmle/code/cpp/ir/implementation/aliased_ssa/constant/PrintConstantAnalysis.qll"
],
"C++ IR ReachableBlock": [
- "cpp/ql/src/semmle/code/cpp/ir/implementation/raw/internal/reachability/ReachableBlock.qll",
- "cpp/ql/src/semmle/code/cpp/ir/implementation/unaliased_ssa/internal/reachability/ReachableBlock.qll"
+ "cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/internal/reachability/ReachableBlock.qll",
+ "cpp/ql/lib/semmle/code/cpp/ir/implementation/unaliased_ssa/internal/reachability/ReachableBlock.qll"
],
"C++ IR PrintReachableBlock": [
- "cpp/ql/src/semmle/code/cpp/ir/implementation/raw/internal/reachability/PrintReachableBlock.qll",
- "cpp/ql/src/semmle/code/cpp/ir/implementation/unaliased_ssa/internal/reachability/PrintReachableBlock.qll"
+ "cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/internal/reachability/PrintReachableBlock.qll",
+ "cpp/ql/lib/semmle/code/cpp/ir/implementation/unaliased_ssa/internal/reachability/PrintReachableBlock.qll"
],
"C++ IR Dominance": [
- "cpp/ql/src/semmle/code/cpp/ir/implementation/raw/internal/reachability/Dominance.qll",
- "cpp/ql/src/semmle/code/cpp/ir/implementation/unaliased_ssa/internal/reachability/Dominance.qll"
+ "cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/internal/reachability/Dominance.qll",
+ "cpp/ql/lib/semmle/code/cpp/ir/implementation/unaliased_ssa/internal/reachability/Dominance.qll"
],
"C++ IR PrintDominance": [
- "cpp/ql/src/semmle/code/cpp/ir/implementation/raw/internal/reachability/PrintDominance.qll",
- "cpp/ql/src/semmle/code/cpp/ir/implementation/unaliased_ssa/internal/reachability/PrintDominance.qll"
+ "cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/internal/reachability/PrintDominance.qll",
+ "cpp/ql/lib/semmle/code/cpp/ir/implementation/unaliased_ssa/internal/reachability/PrintDominance.qll"
],
"C# IR InstructionImports": [
"csharp/ql/src/experimental/ir/implementation/raw/internal/InstructionImports.qll",
@@ -362,8 +362,8 @@
"csharp/ql/src/experimental/ir/implementation/unaliased_ssa/gvn/internal/ValueNumberingImports.qll"
],
"C# ControlFlowReachability": [
- "csharp/ql/src/semmle/code/csharp/dataflow/internal/ControlFlowReachability.qll",
- "csharp/ql/src/semmle/code/csharp/dataflow/internal/rangeanalysis/ControlFlowReachability.qll"
+ "csharp/ql/lib/semmle/code/csharp/dataflow/internal/ControlFlowReachability.qll",
+ "csharp/ql/lib/semmle/code/csharp/dataflow/internal/rangeanalysis/ControlFlowReachability.qll"
],
"Inline Test Expectations": [
"cpp/ql/test/TestUtilities/InlineExpectationsTest.qll",
@@ -379,11 +379,11 @@
"cpp/ql/src/Security/CWE/CWE-020/ir/SafeExternalAPIFunction.qll"
],
"XML": [
- "cpp/ql/src/semmle/code/cpp/XML.qll",
- "csharp/ql/src/semmle/code/csharp/XML.qll",
- "java/ql/src/semmle/code/xml/XML.qll",
- "javascript/ql/src/semmle/javascript/XML.qll",
- "python/ql/src/semmle/python/xml/XML.qll"
+ "cpp/ql/lib/semmle/code/cpp/XML.qll",
+ "csharp/ql/lib/semmle/code/csharp/XML.qll",
+ "java/ql/lib/semmle/code/xml/XML.qll",
+ "javascript/ql/lib/semmle/javascript/XML.qll",
+ "python/ql/lib/semmle/python/xml/XML.qll"
],
"DuplicationProblems.inc.qhelp": [
"cpp/ql/src/Metrics/Files/DuplicationProblems.inc.qhelp",
@@ -437,29 +437,29 @@
"python/ql/src/analysis/IDEContextual.qll"
],
"SSA C#": [
- "csharp/ql/src/semmle/code/csharp/dataflow/internal/SsaImplCommon.qll",
- "csharp/ql/src/semmle/code/csharp/controlflow/internal/pressa/SsaImplCommon.qll",
- "csharp/ql/src/semmle/code/csharp/dataflow/internal/basessa/SsaImplCommon.qll",
- "csharp/ql/src/semmle/code/cil/internal/SsaImplCommon.qll"
+ "csharp/ql/lib/semmle/code/csharp/dataflow/internal/SsaImplCommon.qll",
+ "csharp/ql/lib/semmle/code/csharp/controlflow/internal/pressa/SsaImplCommon.qll",
+ "csharp/ql/lib/semmle/code/csharp/dataflow/internal/basessa/SsaImplCommon.qll",
+ "csharp/ql/lib/semmle/code/cil/internal/SsaImplCommon.qll"
],
"CryptoAlgorithms Python/JS": [
- "javascript/ql/src/semmle/javascript/security/CryptoAlgorithms.qll",
- "python/ql/src/semmle/python/concepts/CryptoAlgorithms.qll"
+ "javascript/ql/lib/semmle/javascript/security/CryptoAlgorithms.qll",
+ "python/ql/lib/semmle/python/concepts/CryptoAlgorithms.qll"
],
"SensitiveDataHeuristics Python/JS": [
- "javascript/ql/src/semmle/javascript/security/internal/SensitiveDataHeuristics.qll",
- "python/ql/src/semmle/python/security/internal/SensitiveDataHeuristics.qll"
+ "javascript/ql/lib/semmle/javascript/security/internal/SensitiveDataHeuristics.qll",
+ "python/ql/lib/semmle/python/security/internal/SensitiveDataHeuristics.qll"
],
"ReDoS Util Python/JS": [
- "javascript/ql/src/semmle/javascript/security/performance/ReDoSUtil.qll",
- "python/ql/src/semmle/python/security/performance/ReDoSUtil.qll"
+ "javascript/ql/lib/semmle/javascript/security/performance/ReDoSUtil.qll",
+ "python/ql/lib/semmle/python/security/performance/ReDoSUtil.qll"
],
"ReDoS Exponential Python/JS": [
- "javascript/ql/src/semmle/javascript/security/performance/ExponentialBackTracking.qll",
- "python/ql/src/semmle/python/security/performance/ExponentialBackTracking.qll"
+ "javascript/ql/lib/semmle/javascript/security/performance/ExponentialBackTracking.qll",
+ "python/ql/lib/semmle/python/security/performance/ExponentialBackTracking.qll"
],
"ReDoS Polynomial Python/JS": [
- "javascript/ql/src/semmle/javascript/security/performance/SuperlinearBackTracking.qll",
- "python/ql/src/semmle/python/security/performance/SuperlinearBackTracking.qll"
+ "javascript/ql/lib/semmle/javascript/security/performance/SuperlinearBackTracking.qll",
+ "python/ql/lib/semmle/python/security/performance/SuperlinearBackTracking.qll"
]
-}
+}
\ No newline at end of file
diff --git a/cpp/change-notes/2021-08-17-has-c-linkage.md b/cpp/change-notes/2021-08-17-has-c-linkage.md
new file mode 100644
index 00000000000..d03211abf2c
--- /dev/null
+++ b/cpp/change-notes/2021-08-17-has-c-linkage.md
@@ -0,0 +1,2 @@
+lgtm,codescanning
+* Added `RoutineType.hasCLinkage` predicate to check whether a function type has "C" language linkage.
\ No newline at end of file
diff --git a/cpp/change-notes/2021-08-23-ctime-weaken-claims.md b/cpp/change-notes/2021-08-23-ctime-weaken-claims.md
new file mode 100644
index 00000000000..a26e074c8db
--- /dev/null
+++ b/cpp/change-notes/2021-08-23-ctime-weaken-claims.md
@@ -0,0 +1,2 @@
+lgtm,codescanning
+* Lowered the precision of `cpp/potentially-dangerous-function` so it is run but not displayed on LGTM by default and so it's only run and displayed on Code Scanning if a broader suite like `cpp-security-extended` is opted into.
diff --git a/cpp/change-notes/2021-08-23-getPrimaryQlClasses.md b/cpp/change-notes/2021-08-23-getPrimaryQlClasses.md
new file mode 100644
index 00000000000..6dbd956cafe
--- /dev/null
+++ b/cpp/change-notes/2021-08-23-getPrimaryQlClasses.md
@@ -0,0 +1,2 @@
+lgtm,codescanning
+* Added `Element.getPrimaryQlClasses()` predicate, which gets a comma-separated list of the names of the primary CodeQL classes to which this element belongs.
diff --git a/cpp/change-notes/2021-08-24-implicit-downcast-from-bitfield.md b/cpp/change-notes/2021-08-24-implicit-downcast-from-bitfield.md
new file mode 100644
index 00000000000..41d00cd8e98
--- /dev/null
+++ b/cpp/change-notes/2021-08-24-implicit-downcast-from-bitfield.md
@@ -0,0 +1,2 @@
+lgtm,codescanning
+* The query `cpp/implicit-bitfield-downcast` now accounts for C++ reference types, which leads to more true positive results.
diff --git a/cpp/ql/examples/qlpack.yml b/cpp/ql/examples/qlpack.yml
index 67289f8e360..98c48a70e22 100644
--- a/cpp/ql/examples/qlpack.yml
+++ b/cpp/ql/examples/qlpack.yml
@@ -1,3 +1,3 @@
name: codeql-cpp-examples
version: 0.0.0
-libraryPathDependencies: codeql-cpp
+libraryPathDependencies: codeql/cpp-all
diff --git a/cpp/ql/src/DefaultOptions.qll b/cpp/ql/lib/DefaultOptions.qll
similarity index 100%
rename from cpp/ql/src/DefaultOptions.qll
rename to cpp/ql/lib/DefaultOptions.qll
diff --git a/cpp/ql/src/Options.qll b/cpp/ql/lib/Options.qll
similarity index 100%
rename from cpp/ql/src/Options.qll
rename to cpp/ql/lib/Options.qll
diff --git a/cpp/ql/src/cpp.qll b/cpp/ql/lib/cpp.qll
similarity index 100%
rename from cpp/ql/src/cpp.qll
rename to cpp/ql/lib/cpp.qll
diff --git a/cpp/ql/src/experimental/semmle/code/cpp/models/interfaces/SimpleRangeAnalysisDefinition.qll b/cpp/ql/lib/experimental/semmle/code/cpp/models/interfaces/SimpleRangeAnalysisDefinition.qll
similarity index 100%
rename from cpp/ql/src/experimental/semmle/code/cpp/models/interfaces/SimpleRangeAnalysisDefinition.qll
rename to cpp/ql/lib/experimental/semmle/code/cpp/models/interfaces/SimpleRangeAnalysisDefinition.qll
diff --git a/cpp/ql/src/experimental/semmle/code/cpp/models/interfaces/SimpleRangeAnalysisExpr.qll b/cpp/ql/lib/experimental/semmle/code/cpp/models/interfaces/SimpleRangeAnalysisExpr.qll
similarity index 100%
rename from cpp/ql/src/experimental/semmle/code/cpp/models/interfaces/SimpleRangeAnalysisExpr.qll
rename to cpp/ql/lib/experimental/semmle/code/cpp/models/interfaces/SimpleRangeAnalysisExpr.qll
diff --git a/cpp/ql/src/experimental/semmle/code/cpp/rangeanalysis/ArrayLengthAnalysis.qll b/cpp/ql/lib/experimental/semmle/code/cpp/rangeanalysis/ArrayLengthAnalysis.qll
similarity index 100%
rename from cpp/ql/src/experimental/semmle/code/cpp/rangeanalysis/ArrayLengthAnalysis.qll
rename to cpp/ql/lib/experimental/semmle/code/cpp/rangeanalysis/ArrayLengthAnalysis.qll
diff --git a/cpp/ql/src/experimental/semmle/code/cpp/rangeanalysis/Bound.qll b/cpp/ql/lib/experimental/semmle/code/cpp/rangeanalysis/Bound.qll
similarity index 100%
rename from cpp/ql/src/experimental/semmle/code/cpp/rangeanalysis/Bound.qll
rename to cpp/ql/lib/experimental/semmle/code/cpp/rangeanalysis/Bound.qll
diff --git a/cpp/ql/src/experimental/semmle/code/cpp/rangeanalysis/ExtendedRangeAnalysis.qll b/cpp/ql/lib/experimental/semmle/code/cpp/rangeanalysis/ExtendedRangeAnalysis.qll
similarity index 100%
rename from cpp/ql/src/experimental/semmle/code/cpp/rangeanalysis/ExtendedRangeAnalysis.qll
rename to cpp/ql/lib/experimental/semmle/code/cpp/rangeanalysis/ExtendedRangeAnalysis.qll
diff --git a/cpp/ql/src/experimental/semmle/code/cpp/rangeanalysis/InBoundsPointerDeref.qll b/cpp/ql/lib/experimental/semmle/code/cpp/rangeanalysis/InBoundsPointerDeref.qll
similarity index 100%
rename from cpp/ql/src/experimental/semmle/code/cpp/rangeanalysis/InBoundsPointerDeref.qll
rename to cpp/ql/lib/experimental/semmle/code/cpp/rangeanalysis/InBoundsPointerDeref.qll
diff --git a/cpp/ql/src/experimental/semmle/code/cpp/rangeanalysis/RangeAnalysis.qll b/cpp/ql/lib/experimental/semmle/code/cpp/rangeanalysis/RangeAnalysis.qll
similarity index 100%
rename from cpp/ql/src/experimental/semmle/code/cpp/rangeanalysis/RangeAnalysis.qll
rename to cpp/ql/lib/experimental/semmle/code/cpp/rangeanalysis/RangeAnalysis.qll
diff --git a/cpp/ql/src/experimental/semmle/code/cpp/rangeanalysis/RangeUtils.qll b/cpp/ql/lib/experimental/semmle/code/cpp/rangeanalysis/RangeUtils.qll
similarity index 100%
rename from cpp/ql/src/experimental/semmle/code/cpp/rangeanalysis/RangeUtils.qll
rename to cpp/ql/lib/experimental/semmle/code/cpp/rangeanalysis/RangeUtils.qll
diff --git a/cpp/ql/src/experimental/semmle/code/cpp/rangeanalysis/SignAnalysis.qll b/cpp/ql/lib/experimental/semmle/code/cpp/rangeanalysis/SignAnalysis.qll
similarity index 100%
rename from cpp/ql/src/experimental/semmle/code/cpp/rangeanalysis/SignAnalysis.qll
rename to cpp/ql/lib/experimental/semmle/code/cpp/rangeanalysis/SignAnalysis.qll
diff --git a/cpp/ql/src/experimental/semmle/code/cpp/rangeanalysis/extensions/ConstantBitwiseAndExprRange.qll b/cpp/ql/lib/experimental/semmle/code/cpp/rangeanalysis/extensions/ConstantBitwiseAndExprRange.qll
similarity index 100%
rename from cpp/ql/src/experimental/semmle/code/cpp/rangeanalysis/extensions/ConstantBitwiseAndExprRange.qll
rename to cpp/ql/lib/experimental/semmle/code/cpp/rangeanalysis/extensions/ConstantBitwiseAndExprRange.qll
diff --git a/cpp/ql/src/experimental/semmle/code/cpp/rangeanalysis/extensions/SubtractSelf.qll b/cpp/ql/lib/experimental/semmle/code/cpp/rangeanalysis/extensions/SubtractSelf.qll
similarity index 100%
rename from cpp/ql/src/experimental/semmle/code/cpp/rangeanalysis/extensions/SubtractSelf.qll
rename to cpp/ql/lib/experimental/semmle/code/cpp/rangeanalysis/extensions/SubtractSelf.qll
diff --git a/cpp/ql/src/experimental/semmle/code/cpp/security/PrivateCleartextWrite.qll b/cpp/ql/lib/experimental/semmle/code/cpp/security/PrivateCleartextWrite.qll
similarity index 100%
rename from cpp/ql/src/experimental/semmle/code/cpp/security/PrivateCleartextWrite.qll
rename to cpp/ql/lib/experimental/semmle/code/cpp/security/PrivateCleartextWrite.qll
diff --git a/cpp/ql/src/experimental/semmle/code/cpp/security/PrivateData.qll b/cpp/ql/lib/experimental/semmle/code/cpp/security/PrivateData.qll
similarity index 100%
rename from cpp/ql/src/experimental/semmle/code/cpp/security/PrivateData.qll
rename to cpp/ql/lib/experimental/semmle/code/cpp/security/PrivateData.qll
diff --git a/cpp/ql/src/external/ExternalArtifact.qll b/cpp/ql/lib/external/ExternalArtifact.qll
similarity index 100%
rename from cpp/ql/src/external/ExternalArtifact.qll
rename to cpp/ql/lib/external/ExternalArtifact.qll
diff --git a/cpp/ql/lib/qlpack.lock.yml b/cpp/ql/lib/qlpack.lock.yml
new file mode 100644
index 00000000000..06dd07fc7dc
--- /dev/null
+++ b/cpp/ql/lib/qlpack.lock.yml
@@ -0,0 +1,4 @@
+---
+dependencies: {}
+compiled: false
+lockVersion: 1.0.0
diff --git a/cpp/ql/lib/qlpack.yml b/cpp/ql/lib/qlpack.yml
new file mode 100644
index 00000000000..5e2ccea683e
--- /dev/null
+++ b/cpp/ql/lib/qlpack.yml
@@ -0,0 +1,5 @@
+name: codeql/cpp-all
+version: 0.0.2
+dbscheme: semmlecode.cpp.dbscheme
+extractor: cpp
+library: true
diff --git a/cpp/ql/src/semmle/code/cpp/ASTConsistency.ql b/cpp/ql/lib/semmle/code/cpp/ASTConsistency.ql
similarity index 100%
rename from cpp/ql/src/semmle/code/cpp/ASTConsistency.ql
rename to cpp/ql/lib/semmle/code/cpp/ASTConsistency.ql
diff --git a/cpp/ql/src/semmle/code/cpp/AutogeneratedFile.qll b/cpp/ql/lib/semmle/code/cpp/AutogeneratedFile.qll
similarity index 100%
rename from cpp/ql/src/semmle/code/cpp/AutogeneratedFile.qll
rename to cpp/ql/lib/semmle/code/cpp/AutogeneratedFile.qll
diff --git a/cpp/ql/src/semmle/code/cpp/Class.qll b/cpp/ql/lib/semmle/code/cpp/Class.qll
similarity index 100%
rename from cpp/ql/src/semmle/code/cpp/Class.qll
rename to cpp/ql/lib/semmle/code/cpp/Class.qll
diff --git a/cpp/ql/src/semmle/code/cpp/Comments.qll b/cpp/ql/lib/semmle/code/cpp/Comments.qll
similarity index 100%
rename from cpp/ql/src/semmle/code/cpp/Comments.qll
rename to cpp/ql/lib/semmle/code/cpp/Comments.qll
diff --git a/cpp/ql/src/semmle/code/cpp/Compilation.qll b/cpp/ql/lib/semmle/code/cpp/Compilation.qll
similarity index 100%
rename from cpp/ql/src/semmle/code/cpp/Compilation.qll
rename to cpp/ql/lib/semmle/code/cpp/Compilation.qll
diff --git a/cpp/ql/src/semmle/code/cpp/Declaration.qll b/cpp/ql/lib/semmle/code/cpp/Declaration.qll
similarity index 100%
rename from cpp/ql/src/semmle/code/cpp/Declaration.qll
rename to cpp/ql/lib/semmle/code/cpp/Declaration.qll
diff --git a/cpp/ql/src/semmle/code/cpp/Diagnostics.qll b/cpp/ql/lib/semmle/code/cpp/Diagnostics.qll
similarity index 100%
rename from cpp/ql/src/semmle/code/cpp/Diagnostics.qll
rename to cpp/ql/lib/semmle/code/cpp/Diagnostics.qll
diff --git a/cpp/ql/src/semmle/code/cpp/Element.qll b/cpp/ql/lib/semmle/code/cpp/Element.qll
similarity index 98%
rename from cpp/ql/src/semmle/code/cpp/Element.qll
rename to cpp/ql/lib/semmle/code/cpp/Element.qll
index daa15e0f625..1f547adccaa 100644
--- a/cpp/ql/src/semmle/code/cpp/Element.qll
+++ b/cpp/ql/lib/semmle/code/cpp/Element.qll
@@ -58,6 +58,11 @@ class ElementBase extends @element {
/** DEPRECATED: use `getAPrimaryQlClass` instead. */
deprecated string getCanonicalQLClass() { result = this.getAPrimaryQlClass() }
+ /**
+ * Gets a comma-separated list of the names of the primary CodeQL classes to which this element belongs.
+ */
+ final string getPrimaryQlClasses() { result = concat(getAPrimaryQlClass(), ",") }
+
/**
* Gets the name of a primary CodeQL class to which this element belongs.
*
diff --git a/cpp/ql/src/semmle/code/cpp/Enclosing.qll b/cpp/ql/lib/semmle/code/cpp/Enclosing.qll
similarity index 100%
rename from cpp/ql/src/semmle/code/cpp/Enclosing.qll
rename to cpp/ql/lib/semmle/code/cpp/Enclosing.qll
diff --git a/cpp/ql/src/semmle/code/cpp/Enum.qll b/cpp/ql/lib/semmle/code/cpp/Enum.qll
similarity index 100%
rename from cpp/ql/src/semmle/code/cpp/Enum.qll
rename to cpp/ql/lib/semmle/code/cpp/Enum.qll
diff --git a/cpp/ql/src/semmle/code/cpp/Field.qll b/cpp/ql/lib/semmle/code/cpp/Field.qll
similarity index 100%
rename from cpp/ql/src/semmle/code/cpp/Field.qll
rename to cpp/ql/lib/semmle/code/cpp/Field.qll
diff --git a/cpp/ql/src/semmle/code/cpp/File.qll b/cpp/ql/lib/semmle/code/cpp/File.qll
similarity index 100%
rename from cpp/ql/src/semmle/code/cpp/File.qll
rename to cpp/ql/lib/semmle/code/cpp/File.qll
diff --git a/cpp/ql/src/semmle/code/cpp/FriendDecl.qll b/cpp/ql/lib/semmle/code/cpp/FriendDecl.qll
similarity index 100%
rename from cpp/ql/src/semmle/code/cpp/FriendDecl.qll
rename to cpp/ql/lib/semmle/code/cpp/FriendDecl.qll
diff --git a/cpp/ql/src/semmle/code/cpp/Function.qll b/cpp/ql/lib/semmle/code/cpp/Function.qll
similarity index 100%
rename from cpp/ql/src/semmle/code/cpp/Function.qll
rename to cpp/ql/lib/semmle/code/cpp/Function.qll
diff --git a/cpp/ql/src/semmle/code/cpp/Include.qll b/cpp/ql/lib/semmle/code/cpp/Include.qll
similarity index 100%
rename from cpp/ql/src/semmle/code/cpp/Include.qll
rename to cpp/ql/lib/semmle/code/cpp/Include.qll
diff --git a/cpp/ql/src/semmle/code/cpp/Initializer.qll b/cpp/ql/lib/semmle/code/cpp/Initializer.qll
similarity index 90%
rename from cpp/ql/src/semmle/code/cpp/Initializer.qll
rename to cpp/ql/lib/semmle/code/cpp/Initializer.qll
index 643a880ddf2..64607af3393 100644
--- a/cpp/ql/src/semmle/code/cpp/Initializer.qll
+++ b/cpp/ql/lib/semmle/code/cpp/Initializer.qll
@@ -18,6 +18,12 @@ import semmle.code.cpp.controlflow.ControlFlowGraph
* ...
* }
* ```
+ * But _not_ `4` in the following code:
+ * ```
+ * int myUninitializedVariable;
+ * myUninitializedVariable = 4;
+ * ```
+ * Instead, this is an `Assignment`.
*/
class Initializer extends ControlFlowNode, @initialiser {
override Location getLocation() { initialisers(underlyingElement(this), _, _, result) }
diff --git a/cpp/ql/src/semmle/code/cpp/Iteration.qll b/cpp/ql/lib/semmle/code/cpp/Iteration.qll
similarity index 100%
rename from cpp/ql/src/semmle/code/cpp/Iteration.qll
rename to cpp/ql/lib/semmle/code/cpp/Iteration.qll
diff --git a/cpp/ql/src/semmle/code/cpp/Linkage.qll b/cpp/ql/lib/semmle/code/cpp/Linkage.qll
similarity index 100%
rename from cpp/ql/src/semmle/code/cpp/Linkage.qll
rename to cpp/ql/lib/semmle/code/cpp/Linkage.qll
diff --git a/cpp/ql/src/semmle/code/cpp/Location.qll b/cpp/ql/lib/semmle/code/cpp/Location.qll
similarity index 100%
rename from cpp/ql/src/semmle/code/cpp/Location.qll
rename to cpp/ql/lib/semmle/code/cpp/Location.qll
diff --git a/cpp/ql/src/semmle/code/cpp/Macro.qll b/cpp/ql/lib/semmle/code/cpp/Macro.qll
similarity index 100%
rename from cpp/ql/src/semmle/code/cpp/Macro.qll
rename to cpp/ql/lib/semmle/code/cpp/Macro.qll
diff --git a/cpp/ql/src/semmle/code/cpp/Member.qll b/cpp/ql/lib/semmle/code/cpp/Member.qll
similarity index 100%
rename from cpp/ql/src/semmle/code/cpp/Member.qll
rename to cpp/ql/lib/semmle/code/cpp/Member.qll
diff --git a/cpp/ql/src/semmle/code/cpp/MemberFunction.qll b/cpp/ql/lib/semmle/code/cpp/MemberFunction.qll
similarity index 100%
rename from cpp/ql/src/semmle/code/cpp/MemberFunction.qll
rename to cpp/ql/lib/semmle/code/cpp/MemberFunction.qll
diff --git a/cpp/ql/src/semmle/code/cpp/NameQualifiers.qll b/cpp/ql/lib/semmle/code/cpp/NameQualifiers.qll
similarity index 100%
rename from cpp/ql/src/semmle/code/cpp/NameQualifiers.qll
rename to cpp/ql/lib/semmle/code/cpp/NameQualifiers.qll
diff --git a/cpp/ql/src/semmle/code/cpp/Namespace.qll b/cpp/ql/lib/semmle/code/cpp/Namespace.qll
similarity index 100%
rename from cpp/ql/src/semmle/code/cpp/Namespace.qll
rename to cpp/ql/lib/semmle/code/cpp/Namespace.qll
diff --git a/cpp/ql/src/semmle/code/cpp/NestedFields.qll b/cpp/ql/lib/semmle/code/cpp/NestedFields.qll
similarity index 100%
rename from cpp/ql/src/semmle/code/cpp/NestedFields.qll
rename to cpp/ql/lib/semmle/code/cpp/NestedFields.qll
diff --git a/cpp/ql/src/semmle/code/cpp/ObjectiveC.qll b/cpp/ql/lib/semmle/code/cpp/ObjectiveC.qll
similarity index 100%
rename from cpp/ql/src/semmle/code/cpp/ObjectiveC.qll
rename to cpp/ql/lib/semmle/code/cpp/ObjectiveC.qll
diff --git a/cpp/ql/src/semmle/code/cpp/PODType03.qll b/cpp/ql/lib/semmle/code/cpp/PODType03.qll
similarity index 100%
rename from cpp/ql/src/semmle/code/cpp/PODType03.qll
rename to cpp/ql/lib/semmle/code/cpp/PODType03.qll
diff --git a/cpp/ql/src/semmle/code/cpp/Parameter.qll b/cpp/ql/lib/semmle/code/cpp/Parameter.qll
similarity index 100%
rename from cpp/ql/src/semmle/code/cpp/Parameter.qll
rename to cpp/ql/lib/semmle/code/cpp/Parameter.qll
diff --git a/cpp/ql/src/semmle/code/cpp/Preprocessor.qll b/cpp/ql/lib/semmle/code/cpp/Preprocessor.qll
similarity index 100%
rename from cpp/ql/src/semmle/code/cpp/Preprocessor.qll
rename to cpp/ql/lib/semmle/code/cpp/Preprocessor.qll
diff --git a/cpp/ql/src/semmle/code/cpp/Print.qll b/cpp/ql/lib/semmle/code/cpp/Print.qll
similarity index 100%
rename from cpp/ql/src/semmle/code/cpp/Print.qll
rename to cpp/ql/lib/semmle/code/cpp/Print.qll
diff --git a/cpp/ql/src/semmle/code/cpp/PrintAST.ql b/cpp/ql/lib/semmle/code/cpp/PrintAST.ql
similarity index 100%
rename from cpp/ql/src/semmle/code/cpp/PrintAST.ql
rename to cpp/ql/lib/semmle/code/cpp/PrintAST.ql
diff --git a/cpp/ql/src/semmle/code/cpp/PrintAST.qll b/cpp/ql/lib/semmle/code/cpp/PrintAST.qll
similarity index 99%
rename from cpp/ql/src/semmle/code/cpp/PrintAST.qll
rename to cpp/ql/lib/semmle/code/cpp/PrintAST.qll
index c0aaa0e2c6b..86b39a285b0 100644
--- a/cpp/ql/src/semmle/code/cpp/PrintAST.qll
+++ b/cpp/ql/lib/semmle/code/cpp/PrintAST.qll
@@ -46,7 +46,7 @@ private string escapeString(string s) {
* string representation comes first in lexicographical order.
*/
private Location getRepresentativeLocation(Locatable ast) {
- result = rank[1](Location loc | loc = ast.getLocation() | loc order by loc.toString())
+ result = min(Location loc | loc = ast.getLocation() | loc order by loc.toString())
}
/**
diff --git a/cpp/ql/src/semmle/code/cpp/Specifier.qll b/cpp/ql/lib/semmle/code/cpp/Specifier.qll
similarity index 100%
rename from cpp/ql/src/semmle/code/cpp/Specifier.qll
rename to cpp/ql/lib/semmle/code/cpp/Specifier.qll
diff --git a/cpp/ql/src/semmle/code/cpp/Struct.qll b/cpp/ql/lib/semmle/code/cpp/Struct.qll
similarity index 100%
rename from cpp/ql/src/semmle/code/cpp/Struct.qll
rename to cpp/ql/lib/semmle/code/cpp/Struct.qll
diff --git a/cpp/ql/src/semmle/code/cpp/TestFile.qll b/cpp/ql/lib/semmle/code/cpp/TestFile.qll
similarity index 100%
rename from cpp/ql/src/semmle/code/cpp/TestFile.qll
rename to cpp/ql/lib/semmle/code/cpp/TestFile.qll
diff --git a/cpp/ql/src/semmle/code/cpp/Type.qll b/cpp/ql/lib/semmle/code/cpp/Type.qll
similarity index 99%
rename from cpp/ql/src/semmle/code/cpp/Type.qll
rename to cpp/ql/lib/semmle/code/cpp/Type.qll
index fd9ae4c8737..bf3defd4f40 100644
--- a/cpp/ql/src/semmle/code/cpp/Type.qll
+++ b/cpp/ql/lib/semmle/code/cpp/Type.qll
@@ -1621,6 +1621,19 @@ class RoutineType extends Type, @routinetype {
*/
Type getReturnType() { routinetypes(underlyingElement(this), unresolveElement(result)) }
+ /**
+ * Holds if this function type has "C" language linkage.
+ *
+ * This includes any function declared in a C source file, or explicitly marked as having "C" linkage:
+ * ```
+ * extern "C" void f();
+ * extern "C" {
+ * void g();
+ * }
+ * ```
+ */
+ predicate hasCLinkage() { this.hasSpecifier("c_linkage") }
+
override string explain() {
result =
"function returning {" + this.getReturnType().explain() + "} with arguments (" +
diff --git a/cpp/ql/src/semmle/code/cpp/TypedefType.qll b/cpp/ql/lib/semmle/code/cpp/TypedefType.qll
similarity index 100%
rename from cpp/ql/src/semmle/code/cpp/TypedefType.qll
rename to cpp/ql/lib/semmle/code/cpp/TypedefType.qll
diff --git a/cpp/ql/src/semmle/code/cpp/Union.qll b/cpp/ql/lib/semmle/code/cpp/Union.qll
similarity index 100%
rename from cpp/ql/src/semmle/code/cpp/Union.qll
rename to cpp/ql/lib/semmle/code/cpp/Union.qll
diff --git a/cpp/ql/src/semmle/code/cpp/UserType.qll b/cpp/ql/lib/semmle/code/cpp/UserType.qll
similarity index 100%
rename from cpp/ql/src/semmle/code/cpp/UserType.qll
rename to cpp/ql/lib/semmle/code/cpp/UserType.qll
diff --git a/cpp/ql/src/semmle/code/cpp/Variable.qll b/cpp/ql/lib/semmle/code/cpp/Variable.qll
similarity index 98%
rename from cpp/ql/src/semmle/code/cpp/Variable.qll
rename to cpp/ql/lib/semmle/code/cpp/Variable.qll
index 527d8879b96..12e25f33afe 100644
--- a/cpp/ql/src/semmle/code/cpp/Variable.qll
+++ b/cpp/ql/lib/semmle/code/cpp/Variable.qll
@@ -136,6 +136,12 @@ class Variable extends Declaration, @variable {
/**
* Gets an assignment expression that assigns to this variable.
* For example: `x=...` or `x+=...`.
+ *
+ * This does _not_ include the initialization of the variable. Use
+ * `Variable.getInitializer()` to get the variable's initializer,
+ * or use `Variable.getAnAssignedValue()` to get an expression that
+ * is the right-hand side of an assignment or an initialization of
+ * the varible.
*/
Assignment getAnAssignment() { result.getLValue() = this.getAnAccess() }
diff --git a/cpp/ql/src/semmle/code/cpp/XML.qll b/cpp/ql/lib/semmle/code/cpp/XML.qll
similarity index 100%
rename from cpp/ql/src/semmle/code/cpp/XML.qll
rename to cpp/ql/lib/semmle/code/cpp/XML.qll
diff --git a/cpp/ql/src/semmle/code/cpp/commons/Alloc.qll b/cpp/ql/lib/semmle/code/cpp/commons/Alloc.qll
similarity index 100%
rename from cpp/ql/src/semmle/code/cpp/commons/Alloc.qll
rename to cpp/ql/lib/semmle/code/cpp/commons/Alloc.qll
diff --git a/cpp/ql/src/semmle/code/cpp/commons/Assertions.qll b/cpp/ql/lib/semmle/code/cpp/commons/Assertions.qll
similarity index 100%
rename from cpp/ql/src/semmle/code/cpp/commons/Assertions.qll
rename to cpp/ql/lib/semmle/code/cpp/commons/Assertions.qll
diff --git a/cpp/ql/src/semmle/code/cpp/commons/Buffer.qll b/cpp/ql/lib/semmle/code/cpp/commons/Buffer.qll
similarity index 100%
rename from cpp/ql/src/semmle/code/cpp/commons/Buffer.qll
rename to cpp/ql/lib/semmle/code/cpp/commons/Buffer.qll
diff --git a/cpp/ql/src/semmle/code/cpp/commons/CommonType.qll b/cpp/ql/lib/semmle/code/cpp/commons/CommonType.qll
similarity index 100%
rename from cpp/ql/src/semmle/code/cpp/commons/CommonType.qll
rename to cpp/ql/lib/semmle/code/cpp/commons/CommonType.qll
diff --git a/cpp/ql/src/semmle/code/cpp/commons/DateTime.qll b/cpp/ql/lib/semmle/code/cpp/commons/DateTime.qll
similarity index 100%
rename from cpp/ql/src/semmle/code/cpp/commons/DateTime.qll
rename to cpp/ql/lib/semmle/code/cpp/commons/DateTime.qll
diff --git a/cpp/ql/src/semmle/code/cpp/commons/Dependency.qll b/cpp/ql/lib/semmle/code/cpp/commons/Dependency.qll
similarity index 100%
rename from cpp/ql/src/semmle/code/cpp/commons/Dependency.qll
rename to cpp/ql/lib/semmle/code/cpp/commons/Dependency.qll
diff --git a/cpp/ql/src/semmle/code/cpp/commons/Environment.qll b/cpp/ql/lib/semmle/code/cpp/commons/Environment.qll
similarity index 100%
rename from cpp/ql/src/semmle/code/cpp/commons/Environment.qll
rename to cpp/ql/lib/semmle/code/cpp/commons/Environment.qll
diff --git a/cpp/ql/src/semmle/code/cpp/commons/Exclusions.qll b/cpp/ql/lib/semmle/code/cpp/commons/Exclusions.qll
similarity index 100%
rename from cpp/ql/src/semmle/code/cpp/commons/Exclusions.qll
rename to cpp/ql/lib/semmle/code/cpp/commons/Exclusions.qll
diff --git a/cpp/ql/src/semmle/code/cpp/commons/File.qll b/cpp/ql/lib/semmle/code/cpp/commons/File.qll
similarity index 100%
rename from cpp/ql/src/semmle/code/cpp/commons/File.qll
rename to cpp/ql/lib/semmle/code/cpp/commons/File.qll
diff --git a/cpp/ql/src/semmle/code/cpp/commons/NULL.qll b/cpp/ql/lib/semmle/code/cpp/commons/NULL.qll
similarity index 100%
rename from cpp/ql/src/semmle/code/cpp/commons/NULL.qll
rename to cpp/ql/lib/semmle/code/cpp/commons/NULL.qll
diff --git a/cpp/ql/src/semmle/code/cpp/commons/NullTermination.qll b/cpp/ql/lib/semmle/code/cpp/commons/NullTermination.qll
similarity index 100%
rename from cpp/ql/src/semmle/code/cpp/commons/NullTermination.qll
rename to cpp/ql/lib/semmle/code/cpp/commons/NullTermination.qll
diff --git a/cpp/ql/src/semmle/code/cpp/commons/PolymorphicClass.qll b/cpp/ql/lib/semmle/code/cpp/commons/PolymorphicClass.qll
similarity index 100%
rename from cpp/ql/src/semmle/code/cpp/commons/PolymorphicClass.qll
rename to cpp/ql/lib/semmle/code/cpp/commons/PolymorphicClass.qll
diff --git a/cpp/ql/src/semmle/code/cpp/commons/Printf.qll b/cpp/ql/lib/semmle/code/cpp/commons/Printf.qll
similarity index 100%
rename from cpp/ql/src/semmle/code/cpp/commons/Printf.qll
rename to cpp/ql/lib/semmle/code/cpp/commons/Printf.qll
diff --git a/cpp/ql/src/semmle/code/cpp/commons/Scanf.qll b/cpp/ql/lib/semmle/code/cpp/commons/Scanf.qll
similarity index 100%
rename from cpp/ql/src/semmle/code/cpp/commons/Scanf.qll
rename to cpp/ql/lib/semmle/code/cpp/commons/Scanf.qll
diff --git a/cpp/ql/src/semmle/code/cpp/commons/Strcat.qll b/cpp/ql/lib/semmle/code/cpp/commons/Strcat.qll
similarity index 100%
rename from cpp/ql/src/semmle/code/cpp/commons/Strcat.qll
rename to cpp/ql/lib/semmle/code/cpp/commons/Strcat.qll
diff --git a/cpp/ql/src/semmle/code/cpp/commons/StringAnalysis.qll b/cpp/ql/lib/semmle/code/cpp/commons/StringAnalysis.qll
similarity index 100%
rename from cpp/ql/src/semmle/code/cpp/commons/StringAnalysis.qll
rename to cpp/ql/lib/semmle/code/cpp/commons/StringAnalysis.qll
diff --git a/cpp/ql/src/semmle/code/cpp/commons/StructLikeClass.qll b/cpp/ql/lib/semmle/code/cpp/commons/StructLikeClass.qll
similarity index 100%
rename from cpp/ql/src/semmle/code/cpp/commons/StructLikeClass.qll
rename to cpp/ql/lib/semmle/code/cpp/commons/StructLikeClass.qll
diff --git a/cpp/ql/src/semmle/code/cpp/commons/Synchronization.qll b/cpp/ql/lib/semmle/code/cpp/commons/Synchronization.qll
similarity index 100%
rename from cpp/ql/src/semmle/code/cpp/commons/Synchronization.qll
rename to cpp/ql/lib/semmle/code/cpp/commons/Synchronization.qll
diff --git a/cpp/ql/src/semmle/code/cpp/commons/VoidContext.qll b/cpp/ql/lib/semmle/code/cpp/commons/VoidContext.qll
similarity index 100%
rename from cpp/ql/src/semmle/code/cpp/commons/VoidContext.qll
rename to cpp/ql/lib/semmle/code/cpp/commons/VoidContext.qll
diff --git a/cpp/ql/src/semmle/code/cpp/commons/unix/Constants.qll b/cpp/ql/lib/semmle/code/cpp/commons/unix/Constants.qll
similarity index 100%
rename from cpp/ql/src/semmle/code/cpp/commons/unix/Constants.qll
rename to cpp/ql/lib/semmle/code/cpp/commons/unix/Constants.qll
diff --git a/cpp/ql/src/semmle/code/cpp/controlflow/BasicBlocks.qll b/cpp/ql/lib/semmle/code/cpp/controlflow/BasicBlocks.qll
similarity index 100%
rename from cpp/ql/src/semmle/code/cpp/controlflow/BasicBlocks.qll
rename to cpp/ql/lib/semmle/code/cpp/controlflow/BasicBlocks.qll
diff --git a/cpp/ql/src/semmle/code/cpp/controlflow/ControlFlowGraph.qll b/cpp/ql/lib/semmle/code/cpp/controlflow/ControlFlowGraph.qll
similarity index 100%
rename from cpp/ql/src/semmle/code/cpp/controlflow/ControlFlowGraph.qll
rename to cpp/ql/lib/semmle/code/cpp/controlflow/ControlFlowGraph.qll
diff --git a/cpp/ql/src/semmle/code/cpp/controlflow/Dataflow.qll b/cpp/ql/lib/semmle/code/cpp/controlflow/Dataflow.qll
similarity index 100%
rename from cpp/ql/src/semmle/code/cpp/controlflow/Dataflow.qll
rename to cpp/ql/lib/semmle/code/cpp/controlflow/Dataflow.qll
diff --git a/cpp/ql/src/semmle/code/cpp/controlflow/DefinitionsAndUses.qll b/cpp/ql/lib/semmle/code/cpp/controlflow/DefinitionsAndUses.qll
similarity index 100%
rename from cpp/ql/src/semmle/code/cpp/controlflow/DefinitionsAndUses.qll
rename to cpp/ql/lib/semmle/code/cpp/controlflow/DefinitionsAndUses.qll
diff --git a/cpp/ql/src/semmle/code/cpp/controlflow/Dereferenced.qll b/cpp/ql/lib/semmle/code/cpp/controlflow/Dereferenced.qll
similarity index 100%
rename from cpp/ql/src/semmle/code/cpp/controlflow/Dereferenced.qll
rename to cpp/ql/lib/semmle/code/cpp/controlflow/Dereferenced.qll
diff --git a/cpp/ql/src/semmle/code/cpp/controlflow/Dominance.qll b/cpp/ql/lib/semmle/code/cpp/controlflow/Dominance.qll
similarity index 100%
rename from cpp/ql/src/semmle/code/cpp/controlflow/Dominance.qll
rename to cpp/ql/lib/semmle/code/cpp/controlflow/Dominance.qll
diff --git a/cpp/ql/src/semmle/code/cpp/controlflow/Guards.qll b/cpp/ql/lib/semmle/code/cpp/controlflow/Guards.qll
similarity index 100%
rename from cpp/ql/src/semmle/code/cpp/controlflow/Guards.qll
rename to cpp/ql/lib/semmle/code/cpp/controlflow/Guards.qll
diff --git a/cpp/ql/src/semmle/code/cpp/controlflow/IRGuards.qll b/cpp/ql/lib/semmle/code/cpp/controlflow/IRGuards.qll
similarity index 100%
rename from cpp/ql/src/semmle/code/cpp/controlflow/IRGuards.qll
rename to cpp/ql/lib/semmle/code/cpp/controlflow/IRGuards.qll
diff --git a/cpp/ql/src/semmle/code/cpp/controlflow/LocalScopeVariableReachability.qll b/cpp/ql/lib/semmle/code/cpp/controlflow/LocalScopeVariableReachability.qll
similarity index 100%
rename from cpp/ql/src/semmle/code/cpp/controlflow/LocalScopeVariableReachability.qll
rename to cpp/ql/lib/semmle/code/cpp/controlflow/LocalScopeVariableReachability.qll
diff --git a/cpp/ql/src/semmle/code/cpp/controlflow/Nullness.qll b/cpp/ql/lib/semmle/code/cpp/controlflow/Nullness.qll
similarity index 100%
rename from cpp/ql/src/semmle/code/cpp/controlflow/Nullness.qll
rename to cpp/ql/lib/semmle/code/cpp/controlflow/Nullness.qll
diff --git a/cpp/ql/src/semmle/code/cpp/controlflow/SSA.qll b/cpp/ql/lib/semmle/code/cpp/controlflow/SSA.qll
similarity index 100%
rename from cpp/ql/src/semmle/code/cpp/controlflow/SSA.qll
rename to cpp/ql/lib/semmle/code/cpp/controlflow/SSA.qll
diff --git a/cpp/ql/src/semmle/code/cpp/controlflow/SSAUtils.qll b/cpp/ql/lib/semmle/code/cpp/controlflow/SSAUtils.qll
similarity index 100%
rename from cpp/ql/src/semmle/code/cpp/controlflow/SSAUtils.qll
rename to cpp/ql/lib/semmle/code/cpp/controlflow/SSAUtils.qll
diff --git a/cpp/ql/src/semmle/code/cpp/controlflow/StackVariableReachability.qll b/cpp/ql/lib/semmle/code/cpp/controlflow/StackVariableReachability.qll
similarity index 100%
rename from cpp/ql/src/semmle/code/cpp/controlflow/StackVariableReachability.qll
rename to cpp/ql/lib/semmle/code/cpp/controlflow/StackVariableReachability.qll
diff --git a/cpp/ql/src/semmle/code/cpp/controlflow/SubBasicBlocks.qll b/cpp/ql/lib/semmle/code/cpp/controlflow/SubBasicBlocks.qll
similarity index 100%
rename from cpp/ql/src/semmle/code/cpp/controlflow/SubBasicBlocks.qll
rename to cpp/ql/lib/semmle/code/cpp/controlflow/SubBasicBlocks.qll
diff --git a/cpp/ql/src/semmle/code/cpp/controlflow/internal/CFG.qll b/cpp/ql/lib/semmle/code/cpp/controlflow/internal/CFG.qll
similarity index 100%
rename from cpp/ql/src/semmle/code/cpp/controlflow/internal/CFG.qll
rename to cpp/ql/lib/semmle/code/cpp/controlflow/internal/CFG.qll
diff --git a/cpp/ql/src/semmle/code/cpp/controlflow/internal/ConstantExprs.qll b/cpp/ql/lib/semmle/code/cpp/controlflow/internal/ConstantExprs.qll
similarity index 100%
rename from cpp/ql/src/semmle/code/cpp/controlflow/internal/ConstantExprs.qll
rename to cpp/ql/lib/semmle/code/cpp/controlflow/internal/ConstantExprs.qll
diff --git a/cpp/ql/src/semmle/code/cpp/controlflow/internal/PrimitiveBasicBlocks.qll b/cpp/ql/lib/semmle/code/cpp/controlflow/internal/PrimitiveBasicBlocks.qll
similarity index 100%
rename from cpp/ql/src/semmle/code/cpp/controlflow/internal/PrimitiveBasicBlocks.qll
rename to cpp/ql/lib/semmle/code/cpp/controlflow/internal/PrimitiveBasicBlocks.qll
diff --git a/cpp/ql/src/semmle/code/cpp/dataflow/DataFlow.qll b/cpp/ql/lib/semmle/code/cpp/dataflow/DataFlow.qll
similarity index 100%
rename from cpp/ql/src/semmle/code/cpp/dataflow/DataFlow.qll
rename to cpp/ql/lib/semmle/code/cpp/dataflow/DataFlow.qll
diff --git a/cpp/ql/src/semmle/code/cpp/dataflow/DataFlow2.qll b/cpp/ql/lib/semmle/code/cpp/dataflow/DataFlow2.qll
similarity index 100%
rename from cpp/ql/src/semmle/code/cpp/dataflow/DataFlow2.qll
rename to cpp/ql/lib/semmle/code/cpp/dataflow/DataFlow2.qll
diff --git a/cpp/ql/src/semmle/code/cpp/dataflow/DataFlow3.qll b/cpp/ql/lib/semmle/code/cpp/dataflow/DataFlow3.qll
similarity index 100%
rename from cpp/ql/src/semmle/code/cpp/dataflow/DataFlow3.qll
rename to cpp/ql/lib/semmle/code/cpp/dataflow/DataFlow3.qll
diff --git a/cpp/ql/src/semmle/code/cpp/dataflow/DataFlow4.qll b/cpp/ql/lib/semmle/code/cpp/dataflow/DataFlow4.qll
similarity index 100%
rename from cpp/ql/src/semmle/code/cpp/dataflow/DataFlow4.qll
rename to cpp/ql/lib/semmle/code/cpp/dataflow/DataFlow4.qll
diff --git a/cpp/ql/src/semmle/code/cpp/dataflow/EscapesTree.qll b/cpp/ql/lib/semmle/code/cpp/dataflow/EscapesTree.qll
similarity index 100%
rename from cpp/ql/src/semmle/code/cpp/dataflow/EscapesTree.qll
rename to cpp/ql/lib/semmle/code/cpp/dataflow/EscapesTree.qll
diff --git a/cpp/ql/src/semmle/code/cpp/dataflow/RecursionPrevention.qll b/cpp/ql/lib/semmle/code/cpp/dataflow/RecursionPrevention.qll
similarity index 100%
rename from cpp/ql/src/semmle/code/cpp/dataflow/RecursionPrevention.qll
rename to cpp/ql/lib/semmle/code/cpp/dataflow/RecursionPrevention.qll
diff --git a/cpp/ql/src/semmle/code/cpp/dataflow/StackAddress.qll b/cpp/ql/lib/semmle/code/cpp/dataflow/StackAddress.qll
similarity index 100%
rename from cpp/ql/src/semmle/code/cpp/dataflow/StackAddress.qll
rename to cpp/ql/lib/semmle/code/cpp/dataflow/StackAddress.qll
diff --git a/cpp/ql/src/semmle/code/cpp/dataflow/TaintTracking.qll b/cpp/ql/lib/semmle/code/cpp/dataflow/TaintTracking.qll
similarity index 100%
rename from cpp/ql/src/semmle/code/cpp/dataflow/TaintTracking.qll
rename to cpp/ql/lib/semmle/code/cpp/dataflow/TaintTracking.qll
diff --git a/cpp/ql/src/semmle/code/cpp/dataflow/TaintTracking2.qll b/cpp/ql/lib/semmle/code/cpp/dataflow/TaintTracking2.qll
similarity index 100%
rename from cpp/ql/src/semmle/code/cpp/dataflow/TaintTracking2.qll
rename to cpp/ql/lib/semmle/code/cpp/dataflow/TaintTracking2.qll
diff --git a/cpp/ql/src/semmle/code/cpp/dataflow/internal/AddressFlow.qll b/cpp/ql/lib/semmle/code/cpp/dataflow/internal/AddressFlow.qll
similarity index 100%
rename from cpp/ql/src/semmle/code/cpp/dataflow/internal/AddressFlow.qll
rename to cpp/ql/lib/semmle/code/cpp/dataflow/internal/AddressFlow.qll
diff --git a/cpp/ql/src/semmle/code/cpp/dataflow/internal/DataFlowDispatch.qll b/cpp/ql/lib/semmle/code/cpp/dataflow/internal/DataFlowDispatch.qll
similarity index 100%
rename from cpp/ql/src/semmle/code/cpp/dataflow/internal/DataFlowDispatch.qll
rename to cpp/ql/lib/semmle/code/cpp/dataflow/internal/DataFlowDispatch.qll
diff --git a/cpp/ql/src/semmle/code/cpp/dataflow/internal/DataFlowImpl.qll b/cpp/ql/lib/semmle/code/cpp/dataflow/internal/DataFlowImpl.qll
similarity index 100%
rename from cpp/ql/src/semmle/code/cpp/dataflow/internal/DataFlowImpl.qll
rename to cpp/ql/lib/semmle/code/cpp/dataflow/internal/DataFlowImpl.qll
diff --git a/cpp/ql/src/semmle/code/cpp/dataflow/internal/DataFlowImpl2.qll b/cpp/ql/lib/semmle/code/cpp/dataflow/internal/DataFlowImpl2.qll
similarity index 100%
rename from cpp/ql/src/semmle/code/cpp/dataflow/internal/DataFlowImpl2.qll
rename to cpp/ql/lib/semmle/code/cpp/dataflow/internal/DataFlowImpl2.qll
diff --git a/cpp/ql/src/semmle/code/cpp/dataflow/internal/DataFlowImpl3.qll b/cpp/ql/lib/semmle/code/cpp/dataflow/internal/DataFlowImpl3.qll
similarity index 100%
rename from cpp/ql/src/semmle/code/cpp/dataflow/internal/DataFlowImpl3.qll
rename to cpp/ql/lib/semmle/code/cpp/dataflow/internal/DataFlowImpl3.qll
diff --git a/cpp/ql/src/semmle/code/cpp/dataflow/internal/DataFlowImpl4.qll b/cpp/ql/lib/semmle/code/cpp/dataflow/internal/DataFlowImpl4.qll
similarity index 100%
rename from cpp/ql/src/semmle/code/cpp/dataflow/internal/DataFlowImpl4.qll
rename to cpp/ql/lib/semmle/code/cpp/dataflow/internal/DataFlowImpl4.qll
diff --git a/cpp/ql/src/semmle/code/cpp/dataflow/internal/DataFlowImplCommon.qll b/cpp/ql/lib/semmle/code/cpp/dataflow/internal/DataFlowImplCommon.qll
similarity index 100%
rename from cpp/ql/src/semmle/code/cpp/dataflow/internal/DataFlowImplCommon.qll
rename to cpp/ql/lib/semmle/code/cpp/dataflow/internal/DataFlowImplCommon.qll
diff --git a/cpp/ql/src/semmle/code/cpp/dataflow/internal/DataFlowImplConsistency.qll b/cpp/ql/lib/semmle/code/cpp/dataflow/internal/DataFlowImplConsistency.qll
similarity index 100%
rename from cpp/ql/src/semmle/code/cpp/dataflow/internal/DataFlowImplConsistency.qll
rename to cpp/ql/lib/semmle/code/cpp/dataflow/internal/DataFlowImplConsistency.qll
diff --git a/cpp/ql/src/semmle/code/cpp/dataflow/internal/DataFlowImplLocal.qll b/cpp/ql/lib/semmle/code/cpp/dataflow/internal/DataFlowImplLocal.qll
similarity index 100%
rename from cpp/ql/src/semmle/code/cpp/dataflow/internal/DataFlowImplLocal.qll
rename to cpp/ql/lib/semmle/code/cpp/dataflow/internal/DataFlowImplLocal.qll
diff --git a/cpp/ql/src/semmle/code/cpp/dataflow/internal/DataFlowImplSpecific.qll b/cpp/ql/lib/semmle/code/cpp/dataflow/internal/DataFlowImplSpecific.qll
similarity index 100%
rename from cpp/ql/src/semmle/code/cpp/dataflow/internal/DataFlowImplSpecific.qll
rename to cpp/ql/lib/semmle/code/cpp/dataflow/internal/DataFlowImplSpecific.qll
diff --git a/cpp/ql/src/semmle/code/cpp/dataflow/internal/DataFlowPrivate.qll b/cpp/ql/lib/semmle/code/cpp/dataflow/internal/DataFlowPrivate.qll
similarity index 100%
rename from cpp/ql/src/semmle/code/cpp/dataflow/internal/DataFlowPrivate.qll
rename to cpp/ql/lib/semmle/code/cpp/dataflow/internal/DataFlowPrivate.qll
diff --git a/cpp/ql/src/semmle/code/cpp/dataflow/internal/DataFlowUtil.qll b/cpp/ql/lib/semmle/code/cpp/dataflow/internal/DataFlowUtil.qll
similarity index 100%
rename from cpp/ql/src/semmle/code/cpp/dataflow/internal/DataFlowUtil.qll
rename to cpp/ql/lib/semmle/code/cpp/dataflow/internal/DataFlowUtil.qll
diff --git a/cpp/ql/src/semmle/code/cpp/dataflow/internal/FlowVar.qll b/cpp/ql/lib/semmle/code/cpp/dataflow/internal/FlowVar.qll
similarity index 100%
rename from cpp/ql/src/semmle/code/cpp/dataflow/internal/FlowVar.qll
rename to cpp/ql/lib/semmle/code/cpp/dataflow/internal/FlowVar.qll
diff --git a/cpp/ql/src/semmle/code/cpp/dataflow/internal/SubBasicBlocks.qll b/cpp/ql/lib/semmle/code/cpp/dataflow/internal/SubBasicBlocks.qll
similarity index 100%
rename from cpp/ql/src/semmle/code/cpp/dataflow/internal/SubBasicBlocks.qll
rename to cpp/ql/lib/semmle/code/cpp/dataflow/internal/SubBasicBlocks.qll
diff --git a/cpp/ql/src/semmle/code/cpp/dataflow/internal/TaintTrackingUtil.qll b/cpp/ql/lib/semmle/code/cpp/dataflow/internal/TaintTrackingUtil.qll
similarity index 100%
rename from cpp/ql/src/semmle/code/cpp/dataflow/internal/TaintTrackingUtil.qll
rename to cpp/ql/lib/semmle/code/cpp/dataflow/internal/TaintTrackingUtil.qll
diff --git a/cpp/ql/src/semmle/code/cpp/dataflow/internal/tainttracking1/TaintTrackingImpl.qll b/cpp/ql/lib/semmle/code/cpp/dataflow/internal/tainttracking1/TaintTrackingImpl.qll
similarity index 100%
rename from cpp/ql/src/semmle/code/cpp/dataflow/internal/tainttracking1/TaintTrackingImpl.qll
rename to cpp/ql/lib/semmle/code/cpp/dataflow/internal/tainttracking1/TaintTrackingImpl.qll
diff --git a/cpp/ql/src/semmle/code/cpp/dataflow/internal/tainttracking1/TaintTrackingParameter.qll b/cpp/ql/lib/semmle/code/cpp/dataflow/internal/tainttracking1/TaintTrackingParameter.qll
similarity index 100%
rename from cpp/ql/src/semmle/code/cpp/dataflow/internal/tainttracking1/TaintTrackingParameter.qll
rename to cpp/ql/lib/semmle/code/cpp/dataflow/internal/tainttracking1/TaintTrackingParameter.qll
diff --git a/cpp/ql/src/semmle/code/cpp/dataflow/internal/tainttracking2/TaintTrackingImpl.qll b/cpp/ql/lib/semmle/code/cpp/dataflow/internal/tainttracking2/TaintTrackingImpl.qll
similarity index 100%
rename from cpp/ql/src/semmle/code/cpp/dataflow/internal/tainttracking2/TaintTrackingImpl.qll
rename to cpp/ql/lib/semmle/code/cpp/dataflow/internal/tainttracking2/TaintTrackingImpl.qll
diff --git a/cpp/ql/src/semmle/code/cpp/dataflow/internal/tainttracking2/TaintTrackingParameter.qll b/cpp/ql/lib/semmle/code/cpp/dataflow/internal/tainttracking2/TaintTrackingParameter.qll
similarity index 100%
rename from cpp/ql/src/semmle/code/cpp/dataflow/internal/tainttracking2/TaintTrackingParameter.qll
rename to cpp/ql/lib/semmle/code/cpp/dataflow/internal/tainttracking2/TaintTrackingParameter.qll
diff --git a/cpp/ql/src/semmle/code/cpp/dispatch/VirtualDispatchPrototype.qll b/cpp/ql/lib/semmle/code/cpp/dispatch/VirtualDispatchPrototype.qll
similarity index 100%
rename from cpp/ql/src/semmle/code/cpp/dispatch/VirtualDispatchPrototype.qll
rename to cpp/ql/lib/semmle/code/cpp/dispatch/VirtualDispatchPrototype.qll
diff --git a/cpp/ql/src/semmle/code/cpp/exprs/Access.qll b/cpp/ql/lib/semmle/code/cpp/exprs/Access.qll
similarity index 97%
rename from cpp/ql/src/semmle/code/cpp/exprs/Access.qll
rename to cpp/ql/lib/semmle/code/cpp/exprs/Access.qll
index 681fb41fa67..e18c0c78dc6 100644
--- a/cpp/ql/src/semmle/code/cpp/exprs/Access.qll
+++ b/cpp/ql/lib/semmle/code/cpp/exprs/Access.qll
@@ -9,7 +9,7 @@ import semmle.code.cpp.Enum
private import semmle.code.cpp.dataflow.EscapesTree
/**
- * A C/C++ access expression. This refers to a function, variable, or enum constant.
+ * A C/C++ access expression. This refers to a function (excluding function references in function call expressions), variable, or enum constant.
*/
class Access extends Expr, NameQualifiableElement, @access {
// As `@access` is a union type containing `@routineexpr` (which describes function accesses
@@ -350,6 +350,15 @@ class PointerToFieldLiteral extends ImplicitThisFieldAccess {
* int (*myFunctionPointer)(int) = &myFunctionTarget;
* }
* ```
+ * This excludes function accesses in function call expressions.
+ * For example the access `myFunctionTarget` in `myFunction` in the following code:
+ * ```
+ * int myFunctionTarget(int);
+ *
+ * void myFunction() {
+ * myFunctionTarget(1);
+ * }
+ * ```
*/
class FunctionAccess extends Access, @routineexpr {
FunctionAccess() { not iscall(underlyingElement(this), _) }
diff --git a/cpp/ql/src/semmle/code/cpp/exprs/ArithmeticOperation.qll b/cpp/ql/lib/semmle/code/cpp/exprs/ArithmeticOperation.qll
similarity index 100%
rename from cpp/ql/src/semmle/code/cpp/exprs/ArithmeticOperation.qll
rename to cpp/ql/lib/semmle/code/cpp/exprs/ArithmeticOperation.qll
diff --git a/cpp/ql/src/semmle/code/cpp/exprs/Assignment.qll b/cpp/ql/lib/semmle/code/cpp/exprs/Assignment.qll
similarity index 94%
rename from cpp/ql/src/semmle/code/cpp/exprs/Assignment.qll
rename to cpp/ql/lib/semmle/code/cpp/exprs/Assignment.qll
index 0c56d9a4d51..065fae8aa70 100644
--- a/cpp/ql/src/semmle/code/cpp/exprs/Assignment.qll
+++ b/cpp/ql/lib/semmle/code/cpp/exprs/Assignment.qll
@@ -5,7 +5,8 @@ import semmle.code.cpp.exprs.BitwiseOperation
/**
* A non-overloaded binary assignment operation, including `=`, `+=`, `&=`,
* etc. A C++ overloaded assignment operation looks syntactically identical but is instead
- * a `FunctionCall`.
+ * a `FunctionCall`. This class does _not_ include variable initializers. To get a variable
+ * initializer, use `Initializer` instead.
*
* This is a QL base class for all (non-overloaded) assignments.
*/
@@ -34,6 +35,8 @@ class Assignment extends Operation, @assign_expr {
* ```
* a = b;
* ```
+ * Note that `int a = b;` is _not_ an `AssignExpr`. It is a `Variable`,
+ * and `b` can be obtained using `Variable.getInitializer()`.
*/
class AssignExpr extends Assignment, @assignexpr {
override string getOperator() { result = "=" }
@@ -46,6 +49,9 @@ class AssignExpr extends Assignment, @assignexpr {
/**
* A non-overloaded binary assignment operation other than `=`.
+ *
+ * This class does _not_ include variable initializers. To get a variable
+ * initializer, use `Initializer` instead.
*/
class AssignOperation extends Assignment, @assign_op_expr {
override string toString() { result = "... " + this.getOperator() + " ..." }
diff --git a/cpp/ql/src/semmle/code/cpp/exprs/BitwiseOperation.qll b/cpp/ql/lib/semmle/code/cpp/exprs/BitwiseOperation.qll
similarity index 100%
rename from cpp/ql/src/semmle/code/cpp/exprs/BitwiseOperation.qll
rename to cpp/ql/lib/semmle/code/cpp/exprs/BitwiseOperation.qll
diff --git a/cpp/ql/src/semmle/code/cpp/exprs/BuiltInOperations.qll b/cpp/ql/lib/semmle/code/cpp/exprs/BuiltInOperations.qll
similarity index 100%
rename from cpp/ql/src/semmle/code/cpp/exprs/BuiltInOperations.qll
rename to cpp/ql/lib/semmle/code/cpp/exprs/BuiltInOperations.qll
diff --git a/cpp/ql/src/semmle/code/cpp/exprs/Call.qll b/cpp/ql/lib/semmle/code/cpp/exprs/Call.qll
similarity index 100%
rename from cpp/ql/src/semmle/code/cpp/exprs/Call.qll
rename to cpp/ql/lib/semmle/code/cpp/exprs/Call.qll
diff --git a/cpp/ql/src/semmle/code/cpp/exprs/Cast.qll b/cpp/ql/lib/semmle/code/cpp/exprs/Cast.qll
similarity index 100%
rename from cpp/ql/src/semmle/code/cpp/exprs/Cast.qll
rename to cpp/ql/lib/semmle/code/cpp/exprs/Cast.qll
diff --git a/cpp/ql/src/semmle/code/cpp/exprs/ComparisonOperation.qll b/cpp/ql/lib/semmle/code/cpp/exprs/ComparisonOperation.qll
similarity index 100%
rename from cpp/ql/src/semmle/code/cpp/exprs/ComparisonOperation.qll
rename to cpp/ql/lib/semmle/code/cpp/exprs/ComparisonOperation.qll
diff --git a/cpp/ql/src/semmle/code/cpp/exprs/Expr.qll b/cpp/ql/lib/semmle/code/cpp/exprs/Expr.qll
similarity index 100%
rename from cpp/ql/src/semmle/code/cpp/exprs/Expr.qll
rename to cpp/ql/lib/semmle/code/cpp/exprs/Expr.qll
diff --git a/cpp/ql/src/semmle/code/cpp/exprs/Lambda.qll b/cpp/ql/lib/semmle/code/cpp/exprs/Lambda.qll
similarity index 100%
rename from cpp/ql/src/semmle/code/cpp/exprs/Lambda.qll
rename to cpp/ql/lib/semmle/code/cpp/exprs/Lambda.qll
diff --git a/cpp/ql/src/semmle/code/cpp/exprs/Literal.qll b/cpp/ql/lib/semmle/code/cpp/exprs/Literal.qll
similarity index 100%
rename from cpp/ql/src/semmle/code/cpp/exprs/Literal.qll
rename to cpp/ql/lib/semmle/code/cpp/exprs/Literal.qll
diff --git a/cpp/ql/src/semmle/code/cpp/exprs/LogicalOperation.qll b/cpp/ql/lib/semmle/code/cpp/exprs/LogicalOperation.qll
similarity index 100%
rename from cpp/ql/src/semmle/code/cpp/exprs/LogicalOperation.qll
rename to cpp/ql/lib/semmle/code/cpp/exprs/LogicalOperation.qll
diff --git a/cpp/ql/src/semmle/code/cpp/exprs/ObjectiveC.qll b/cpp/ql/lib/semmle/code/cpp/exprs/ObjectiveC.qll
similarity index 100%
rename from cpp/ql/src/semmle/code/cpp/exprs/ObjectiveC.qll
rename to cpp/ql/lib/semmle/code/cpp/exprs/ObjectiveC.qll
diff --git a/cpp/ql/src/semmle/code/cpp/headers/MultipleInclusion.qll b/cpp/ql/lib/semmle/code/cpp/headers/MultipleInclusion.qll
similarity index 100%
rename from cpp/ql/src/semmle/code/cpp/headers/MultipleInclusion.qll
rename to cpp/ql/lib/semmle/code/cpp/headers/MultipleInclusion.qll
diff --git a/cpp/ql/src/semmle/code/cpp/internal/AddressConstantExpression.qll b/cpp/ql/lib/semmle/code/cpp/internal/AddressConstantExpression.qll
similarity index 100%
rename from cpp/ql/src/semmle/code/cpp/internal/AddressConstantExpression.qll
rename to cpp/ql/lib/semmle/code/cpp/internal/AddressConstantExpression.qll
diff --git a/cpp/ql/src/semmle/code/cpp/internal/QualifiedName.qll b/cpp/ql/lib/semmle/code/cpp/internal/QualifiedName.qll
similarity index 100%
rename from cpp/ql/src/semmle/code/cpp/internal/QualifiedName.qll
rename to cpp/ql/lib/semmle/code/cpp/internal/QualifiedName.qll
diff --git a/cpp/ql/src/semmle/code/cpp/internal/ResolveClass.qll b/cpp/ql/lib/semmle/code/cpp/internal/ResolveClass.qll
similarity index 100%
rename from cpp/ql/src/semmle/code/cpp/internal/ResolveClass.qll
rename to cpp/ql/lib/semmle/code/cpp/internal/ResolveClass.qll
diff --git a/cpp/ql/src/semmle/code/cpp/ir/IR.qll b/cpp/ql/lib/semmle/code/cpp/ir/IR.qll
similarity index 100%
rename from cpp/ql/src/semmle/code/cpp/ir/IR.qll
rename to cpp/ql/lib/semmle/code/cpp/ir/IR.qll
diff --git a/cpp/ql/src/semmle/code/cpp/ir/IRConfiguration.qll b/cpp/ql/lib/semmle/code/cpp/ir/IRConfiguration.qll
similarity index 100%
rename from cpp/ql/src/semmle/code/cpp/ir/IRConfiguration.qll
rename to cpp/ql/lib/semmle/code/cpp/ir/IRConfiguration.qll
diff --git a/cpp/ql/src/semmle/code/cpp/ir/IRConsistency.ql b/cpp/ql/lib/semmle/code/cpp/ir/IRConsistency.ql
similarity index 100%
rename from cpp/ql/src/semmle/code/cpp/ir/IRConsistency.ql
rename to cpp/ql/lib/semmle/code/cpp/ir/IRConsistency.ql
diff --git a/cpp/ql/src/semmle/code/cpp/ir/PrintIR.ql b/cpp/ql/lib/semmle/code/cpp/ir/PrintIR.ql
similarity index 100%
rename from cpp/ql/src/semmle/code/cpp/ir/PrintIR.ql
rename to cpp/ql/lib/semmle/code/cpp/ir/PrintIR.ql
diff --git a/cpp/ql/src/semmle/code/cpp/ir/PrintIR.qll b/cpp/ql/lib/semmle/code/cpp/ir/PrintIR.qll
similarity index 100%
rename from cpp/ql/src/semmle/code/cpp/ir/PrintIR.qll
rename to cpp/ql/lib/semmle/code/cpp/ir/PrintIR.qll
diff --git a/cpp/ql/src/semmle/code/cpp/ir/ValueNumbering.qll b/cpp/ql/lib/semmle/code/cpp/ir/ValueNumbering.qll
similarity index 100%
rename from cpp/ql/src/semmle/code/cpp/ir/ValueNumbering.qll
rename to cpp/ql/lib/semmle/code/cpp/ir/ValueNumbering.qll
diff --git a/cpp/ql/src/semmle/code/cpp/ir/dataflow/DataFlow.qll b/cpp/ql/lib/semmle/code/cpp/ir/dataflow/DataFlow.qll
similarity index 100%
rename from cpp/ql/src/semmle/code/cpp/ir/dataflow/DataFlow.qll
rename to cpp/ql/lib/semmle/code/cpp/ir/dataflow/DataFlow.qll
diff --git a/cpp/ql/src/semmle/code/cpp/ir/dataflow/DataFlow2.qll b/cpp/ql/lib/semmle/code/cpp/ir/dataflow/DataFlow2.qll
similarity index 100%
rename from cpp/ql/src/semmle/code/cpp/ir/dataflow/DataFlow2.qll
rename to cpp/ql/lib/semmle/code/cpp/ir/dataflow/DataFlow2.qll
diff --git a/cpp/ql/src/semmle/code/cpp/ir/dataflow/DataFlow3.qll b/cpp/ql/lib/semmle/code/cpp/ir/dataflow/DataFlow3.qll
similarity index 100%
rename from cpp/ql/src/semmle/code/cpp/ir/dataflow/DataFlow3.qll
rename to cpp/ql/lib/semmle/code/cpp/ir/dataflow/DataFlow3.qll
diff --git a/cpp/ql/src/semmle/code/cpp/ir/dataflow/DataFlow4.qll b/cpp/ql/lib/semmle/code/cpp/ir/dataflow/DataFlow4.qll
similarity index 100%
rename from cpp/ql/src/semmle/code/cpp/ir/dataflow/DataFlow4.qll
rename to cpp/ql/lib/semmle/code/cpp/ir/dataflow/DataFlow4.qll
diff --git a/cpp/ql/src/semmle/code/cpp/ir/dataflow/DefaultTaintTracking.qll b/cpp/ql/lib/semmle/code/cpp/ir/dataflow/DefaultTaintTracking.qll
similarity index 100%
rename from cpp/ql/src/semmle/code/cpp/ir/dataflow/DefaultTaintTracking.qll
rename to cpp/ql/lib/semmle/code/cpp/ir/dataflow/DefaultTaintTracking.qll
diff --git a/cpp/ql/src/semmle/code/cpp/ir/dataflow/TaintTracking.qll b/cpp/ql/lib/semmle/code/cpp/ir/dataflow/TaintTracking.qll
similarity index 100%
rename from cpp/ql/src/semmle/code/cpp/ir/dataflow/TaintTracking.qll
rename to cpp/ql/lib/semmle/code/cpp/ir/dataflow/TaintTracking.qll
diff --git a/cpp/ql/src/semmle/code/cpp/ir/dataflow/TaintTracking2.qll b/cpp/ql/lib/semmle/code/cpp/ir/dataflow/TaintTracking2.qll
similarity index 100%
rename from cpp/ql/src/semmle/code/cpp/ir/dataflow/TaintTracking2.qll
rename to cpp/ql/lib/semmle/code/cpp/ir/dataflow/TaintTracking2.qll
diff --git a/cpp/ql/src/semmle/code/cpp/ir/dataflow/TaintTracking3.qll b/cpp/ql/lib/semmle/code/cpp/ir/dataflow/TaintTracking3.qll
similarity index 100%
rename from cpp/ql/src/semmle/code/cpp/ir/dataflow/TaintTracking3.qll
rename to cpp/ql/lib/semmle/code/cpp/ir/dataflow/TaintTracking3.qll
diff --git a/cpp/ql/src/semmle/code/cpp/ir/dataflow/internal/DataFlowDispatch.qll b/cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/DataFlowDispatch.qll
similarity index 100%
rename from cpp/ql/src/semmle/code/cpp/ir/dataflow/internal/DataFlowDispatch.qll
rename to cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/DataFlowDispatch.qll
diff --git a/cpp/ql/src/semmle/code/cpp/ir/dataflow/internal/DataFlowImpl.qll b/cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/DataFlowImpl.qll
similarity index 100%
rename from cpp/ql/src/semmle/code/cpp/ir/dataflow/internal/DataFlowImpl.qll
rename to cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/DataFlowImpl.qll
diff --git a/cpp/ql/src/semmle/code/cpp/ir/dataflow/internal/DataFlowImpl2.qll b/cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/DataFlowImpl2.qll
similarity index 100%
rename from cpp/ql/src/semmle/code/cpp/ir/dataflow/internal/DataFlowImpl2.qll
rename to cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/DataFlowImpl2.qll
diff --git a/cpp/ql/src/semmle/code/cpp/ir/dataflow/internal/DataFlowImpl3.qll b/cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/DataFlowImpl3.qll
similarity index 100%
rename from cpp/ql/src/semmle/code/cpp/ir/dataflow/internal/DataFlowImpl3.qll
rename to cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/DataFlowImpl3.qll
diff --git a/cpp/ql/src/semmle/code/cpp/ir/dataflow/internal/DataFlowImpl4.qll b/cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/DataFlowImpl4.qll
similarity index 100%
rename from cpp/ql/src/semmle/code/cpp/ir/dataflow/internal/DataFlowImpl4.qll
rename to cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/DataFlowImpl4.qll
diff --git a/cpp/ql/src/semmle/code/cpp/ir/dataflow/internal/DataFlowImplCommon.qll b/cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/DataFlowImplCommon.qll
similarity index 100%
rename from cpp/ql/src/semmle/code/cpp/ir/dataflow/internal/DataFlowImplCommon.qll
rename to cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/DataFlowImplCommon.qll
diff --git a/cpp/ql/src/semmle/code/cpp/ir/dataflow/internal/DataFlowImplConsistency.qll b/cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/DataFlowImplConsistency.qll
similarity index 100%
rename from cpp/ql/src/semmle/code/cpp/ir/dataflow/internal/DataFlowImplConsistency.qll
rename to cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/DataFlowImplConsistency.qll
diff --git a/cpp/ql/src/semmle/code/cpp/ir/dataflow/internal/DataFlowImplSpecific.qll b/cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/DataFlowImplSpecific.qll
similarity index 100%
rename from cpp/ql/src/semmle/code/cpp/ir/dataflow/internal/DataFlowImplSpecific.qll
rename to cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/DataFlowImplSpecific.qll
diff --git a/cpp/ql/src/semmle/code/cpp/ir/dataflow/internal/DataFlowPrivate.qll b/cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/DataFlowPrivate.qll
similarity index 100%
rename from cpp/ql/src/semmle/code/cpp/ir/dataflow/internal/DataFlowPrivate.qll
rename to cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/DataFlowPrivate.qll
diff --git a/cpp/ql/src/semmle/code/cpp/ir/dataflow/internal/DataFlowUtil.qll b/cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/DataFlowUtil.qll
similarity index 100%
rename from cpp/ql/src/semmle/code/cpp/ir/dataflow/internal/DataFlowUtil.qll
rename to cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/DataFlowUtil.qll
diff --git a/cpp/ql/src/semmle/code/cpp/ir/dataflow/internal/ModelUtil.qll b/cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/ModelUtil.qll
similarity index 100%
rename from cpp/ql/src/semmle/code/cpp/ir/dataflow/internal/ModelUtil.qll
rename to cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/ModelUtil.qll
diff --git a/cpp/ql/src/semmle/code/cpp/ir/dataflow/internal/PrintIRLocalFlow.qll b/cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/PrintIRLocalFlow.qll
similarity index 100%
rename from cpp/ql/src/semmle/code/cpp/ir/dataflow/internal/PrintIRLocalFlow.qll
rename to cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/PrintIRLocalFlow.qll
diff --git a/cpp/ql/src/semmle/code/cpp/ir/dataflow/internal/PrintIRStoreSteps.qll b/cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/PrintIRStoreSteps.qll
similarity index 100%
rename from cpp/ql/src/semmle/code/cpp/ir/dataflow/internal/PrintIRStoreSteps.qll
rename to cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/PrintIRStoreSteps.qll
diff --git a/cpp/ql/src/semmle/code/cpp/ir/dataflow/internal/PrintIRUtilities.qll b/cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/PrintIRUtilities.qll
similarity index 100%
rename from cpp/ql/src/semmle/code/cpp/ir/dataflow/internal/PrintIRUtilities.qll
rename to cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/PrintIRUtilities.qll
diff --git a/cpp/ql/src/semmle/code/cpp/ir/dataflow/internal/TaintTrackingUtil.qll b/cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/TaintTrackingUtil.qll
similarity index 100%
rename from cpp/ql/src/semmle/code/cpp/ir/dataflow/internal/TaintTrackingUtil.qll
rename to cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/TaintTrackingUtil.qll
diff --git a/cpp/ql/src/semmle/code/cpp/ir/dataflow/internal/tainttracking1/TaintTrackingImpl.qll b/cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/tainttracking1/TaintTrackingImpl.qll
similarity index 100%
rename from cpp/ql/src/semmle/code/cpp/ir/dataflow/internal/tainttracking1/TaintTrackingImpl.qll
rename to cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/tainttracking1/TaintTrackingImpl.qll
diff --git a/cpp/ql/src/semmle/code/cpp/ir/dataflow/internal/tainttracking1/TaintTrackingParameter.qll b/cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/tainttracking1/TaintTrackingParameter.qll
similarity index 100%
rename from cpp/ql/src/semmle/code/cpp/ir/dataflow/internal/tainttracking1/TaintTrackingParameter.qll
rename to cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/tainttracking1/TaintTrackingParameter.qll
diff --git a/cpp/ql/src/semmle/code/cpp/ir/dataflow/internal/tainttracking2/TaintTrackingImpl.qll b/cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/tainttracking2/TaintTrackingImpl.qll
similarity index 100%
rename from cpp/ql/src/semmle/code/cpp/ir/dataflow/internal/tainttracking2/TaintTrackingImpl.qll
rename to cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/tainttracking2/TaintTrackingImpl.qll
diff --git a/cpp/ql/src/semmle/code/cpp/ir/dataflow/internal/tainttracking2/TaintTrackingParameter.qll b/cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/tainttracking2/TaintTrackingParameter.qll
similarity index 100%
rename from cpp/ql/src/semmle/code/cpp/ir/dataflow/internal/tainttracking2/TaintTrackingParameter.qll
rename to cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/tainttracking2/TaintTrackingParameter.qll
diff --git a/cpp/ql/src/semmle/code/cpp/ir/dataflow/internal/tainttracking3/TaintTrackingImpl.qll b/cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/tainttracking3/TaintTrackingImpl.qll
similarity index 100%
rename from cpp/ql/src/semmle/code/cpp/ir/dataflow/internal/tainttracking3/TaintTrackingImpl.qll
rename to cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/tainttracking3/TaintTrackingImpl.qll
diff --git a/cpp/ql/src/semmle/code/cpp/ir/dataflow/internal/tainttracking3/TaintTrackingParameter.qll b/cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/tainttracking3/TaintTrackingParameter.qll
similarity index 100%
rename from cpp/ql/src/semmle/code/cpp/ir/dataflow/internal/tainttracking3/TaintTrackingParameter.qll
rename to cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/tainttracking3/TaintTrackingParameter.qll
diff --git a/cpp/ql/src/semmle/code/cpp/ir/implementation/EdgeKind.qll b/cpp/ql/lib/semmle/code/cpp/ir/implementation/EdgeKind.qll
similarity index 100%
rename from cpp/ql/src/semmle/code/cpp/ir/implementation/EdgeKind.qll
rename to cpp/ql/lib/semmle/code/cpp/ir/implementation/EdgeKind.qll
diff --git a/cpp/ql/src/semmle/code/cpp/ir/implementation/IRConfiguration.qll b/cpp/ql/lib/semmle/code/cpp/ir/implementation/IRConfiguration.qll
similarity index 100%
rename from cpp/ql/src/semmle/code/cpp/ir/implementation/IRConfiguration.qll
rename to cpp/ql/lib/semmle/code/cpp/ir/implementation/IRConfiguration.qll
diff --git a/cpp/ql/src/semmle/code/cpp/ir/implementation/IRType.qll b/cpp/ql/lib/semmle/code/cpp/ir/implementation/IRType.qll
similarity index 100%
rename from cpp/ql/src/semmle/code/cpp/ir/implementation/IRType.qll
rename to cpp/ql/lib/semmle/code/cpp/ir/implementation/IRType.qll
diff --git a/cpp/ql/src/semmle/code/cpp/ir/implementation/MemoryAccessKind.qll b/cpp/ql/lib/semmle/code/cpp/ir/implementation/MemoryAccessKind.qll
similarity index 100%
rename from cpp/ql/src/semmle/code/cpp/ir/implementation/MemoryAccessKind.qll
rename to cpp/ql/lib/semmle/code/cpp/ir/implementation/MemoryAccessKind.qll
diff --git a/cpp/ql/src/semmle/code/cpp/ir/implementation/Opcode.qll b/cpp/ql/lib/semmle/code/cpp/ir/implementation/Opcode.qll
similarity index 100%
rename from cpp/ql/src/semmle/code/cpp/ir/implementation/Opcode.qll
rename to cpp/ql/lib/semmle/code/cpp/ir/implementation/Opcode.qll
diff --git a/cpp/ql/src/semmle/code/cpp/ir/implementation/SSA.md b/cpp/ql/lib/semmle/code/cpp/ir/implementation/SSA.md
similarity index 100%
rename from cpp/ql/src/semmle/code/cpp/ir/implementation/SSA.md
rename to cpp/ql/lib/semmle/code/cpp/ir/implementation/SSA.md
diff --git a/cpp/ql/src/semmle/code/cpp/ir/implementation/TempVariableTag.qll b/cpp/ql/lib/semmle/code/cpp/ir/implementation/TempVariableTag.qll
similarity index 100%
rename from cpp/ql/src/semmle/code/cpp/ir/implementation/TempVariableTag.qll
rename to cpp/ql/lib/semmle/code/cpp/ir/implementation/TempVariableTag.qll
diff --git a/cpp/ql/src/semmle/code/cpp/ir/implementation/UseSoundEscapeAnalysis.qll b/cpp/ql/lib/semmle/code/cpp/ir/implementation/UseSoundEscapeAnalysis.qll
similarity index 100%
rename from cpp/ql/src/semmle/code/cpp/ir/implementation/UseSoundEscapeAnalysis.qll
rename to cpp/ql/lib/semmle/code/cpp/ir/implementation/UseSoundEscapeAnalysis.qll
diff --git a/cpp/ql/src/semmle/code/cpp/ir/implementation/aliased_ssa/IR.qll b/cpp/ql/lib/semmle/code/cpp/ir/implementation/aliased_ssa/IR.qll
similarity index 100%
rename from cpp/ql/src/semmle/code/cpp/ir/implementation/aliased_ssa/IR.qll
rename to cpp/ql/lib/semmle/code/cpp/ir/implementation/aliased_ssa/IR.qll
diff --git a/cpp/ql/src/semmle/code/cpp/ir/implementation/aliased_ssa/IRBlock.qll b/cpp/ql/lib/semmle/code/cpp/ir/implementation/aliased_ssa/IRBlock.qll
similarity index 100%
rename from cpp/ql/src/semmle/code/cpp/ir/implementation/aliased_ssa/IRBlock.qll
rename to cpp/ql/lib/semmle/code/cpp/ir/implementation/aliased_ssa/IRBlock.qll
diff --git a/cpp/ql/src/semmle/code/cpp/ir/implementation/aliased_ssa/IRConsistency.ql b/cpp/ql/lib/semmle/code/cpp/ir/implementation/aliased_ssa/IRConsistency.ql
similarity index 100%
rename from cpp/ql/src/semmle/code/cpp/ir/implementation/aliased_ssa/IRConsistency.ql
rename to cpp/ql/lib/semmle/code/cpp/ir/implementation/aliased_ssa/IRConsistency.ql
diff --git a/cpp/ql/src/semmle/code/cpp/ir/implementation/unaliased_ssa/IRConsistency.qll b/cpp/ql/lib/semmle/code/cpp/ir/implementation/aliased_ssa/IRConsistency.qll
similarity index 99%
rename from cpp/ql/src/semmle/code/cpp/ir/implementation/unaliased_ssa/IRConsistency.qll
rename to cpp/ql/lib/semmle/code/cpp/ir/implementation/aliased_ssa/IRConsistency.qll
index f331f4c87bf..31983d34247 100644
--- a/cpp/ql/src/semmle/code/cpp/ir/implementation/unaliased_ssa/IRConsistency.qll
+++ b/cpp/ql/lib/semmle/code/cpp/ir/implementation/aliased_ssa/IRConsistency.qll
@@ -35,7 +35,7 @@ module InstructionConsistency {
// To avoid an overwhelming number of results when the extractor merges functions with the
// same name, just pick a single location.
result =
- rank[1](Language::Location loc | loc = irFunc.getLocation() | loc order by loc.toString())
+ min(Language::Location loc | loc = irFunc.getLocation() | loc order by loc.toString())
}
}
diff --git a/cpp/ql/src/semmle/code/cpp/ir/implementation/aliased_ssa/IRFunction.qll b/cpp/ql/lib/semmle/code/cpp/ir/implementation/aliased_ssa/IRFunction.qll
similarity index 100%
rename from cpp/ql/src/semmle/code/cpp/ir/implementation/aliased_ssa/IRFunction.qll
rename to cpp/ql/lib/semmle/code/cpp/ir/implementation/aliased_ssa/IRFunction.qll
diff --git a/cpp/ql/src/semmle/code/cpp/ir/implementation/aliased_ssa/IRVariable.qll b/cpp/ql/lib/semmle/code/cpp/ir/implementation/aliased_ssa/IRVariable.qll
similarity index 100%
rename from cpp/ql/src/semmle/code/cpp/ir/implementation/aliased_ssa/IRVariable.qll
rename to cpp/ql/lib/semmle/code/cpp/ir/implementation/aliased_ssa/IRVariable.qll
diff --git a/cpp/ql/src/semmle/code/cpp/ir/implementation/aliased_ssa/Instruction.qll b/cpp/ql/lib/semmle/code/cpp/ir/implementation/aliased_ssa/Instruction.qll
similarity index 100%
rename from cpp/ql/src/semmle/code/cpp/ir/implementation/aliased_ssa/Instruction.qll
rename to cpp/ql/lib/semmle/code/cpp/ir/implementation/aliased_ssa/Instruction.qll
diff --git a/cpp/ql/src/semmle/code/cpp/ir/implementation/aliased_ssa/Operand.qll b/cpp/ql/lib/semmle/code/cpp/ir/implementation/aliased_ssa/Operand.qll
similarity index 100%
rename from cpp/ql/src/semmle/code/cpp/ir/implementation/aliased_ssa/Operand.qll
rename to cpp/ql/lib/semmle/code/cpp/ir/implementation/aliased_ssa/Operand.qll
diff --git a/cpp/ql/src/semmle/code/cpp/ir/implementation/aliased_ssa/PrintIR.ql b/cpp/ql/lib/semmle/code/cpp/ir/implementation/aliased_ssa/PrintIR.ql
similarity index 100%
rename from cpp/ql/src/semmle/code/cpp/ir/implementation/aliased_ssa/PrintIR.ql
rename to cpp/ql/lib/semmle/code/cpp/ir/implementation/aliased_ssa/PrintIR.ql
diff --git a/cpp/ql/src/semmle/code/cpp/ir/implementation/aliased_ssa/PrintIR.qll b/cpp/ql/lib/semmle/code/cpp/ir/implementation/aliased_ssa/PrintIR.qll
similarity index 100%
rename from cpp/ql/src/semmle/code/cpp/ir/implementation/aliased_ssa/PrintIR.qll
rename to cpp/ql/lib/semmle/code/cpp/ir/implementation/aliased_ssa/PrintIR.qll
diff --git a/cpp/ql/src/semmle/code/cpp/ir/implementation/aliased_ssa/constant/ConstantAnalysis.qll b/cpp/ql/lib/semmle/code/cpp/ir/implementation/aliased_ssa/constant/ConstantAnalysis.qll
similarity index 100%
rename from cpp/ql/src/semmle/code/cpp/ir/implementation/aliased_ssa/constant/ConstantAnalysis.qll
rename to cpp/ql/lib/semmle/code/cpp/ir/implementation/aliased_ssa/constant/ConstantAnalysis.qll
diff --git a/cpp/ql/src/semmle/code/cpp/ir/implementation/aliased_ssa/constant/PrintConstantAnalysis.qll b/cpp/ql/lib/semmle/code/cpp/ir/implementation/aliased_ssa/constant/PrintConstantAnalysis.qll
similarity index 100%
rename from cpp/ql/src/semmle/code/cpp/ir/implementation/aliased_ssa/constant/PrintConstantAnalysis.qll
rename to cpp/ql/lib/semmle/code/cpp/ir/implementation/aliased_ssa/constant/PrintConstantAnalysis.qll
diff --git a/cpp/ql/src/semmle/code/cpp/ir/implementation/aliased_ssa/constant/internal/ConstantAnalysisInternal.qll b/cpp/ql/lib/semmle/code/cpp/ir/implementation/aliased_ssa/constant/internal/ConstantAnalysisInternal.qll
similarity index 100%
rename from cpp/ql/src/semmle/code/cpp/ir/implementation/aliased_ssa/constant/internal/ConstantAnalysisInternal.qll
rename to cpp/ql/lib/semmle/code/cpp/ir/implementation/aliased_ssa/constant/internal/ConstantAnalysisInternal.qll
diff --git a/cpp/ql/src/semmle/code/cpp/ir/implementation/aliased_ssa/gvn/PrintValueNumbering.qll b/cpp/ql/lib/semmle/code/cpp/ir/implementation/aliased_ssa/gvn/PrintValueNumbering.qll
similarity index 100%
rename from cpp/ql/src/semmle/code/cpp/ir/implementation/aliased_ssa/gvn/PrintValueNumbering.qll
rename to cpp/ql/lib/semmle/code/cpp/ir/implementation/aliased_ssa/gvn/PrintValueNumbering.qll
diff --git a/cpp/ql/src/semmle/code/cpp/ir/implementation/aliased_ssa/gvn/ValueNumbering.qll b/cpp/ql/lib/semmle/code/cpp/ir/implementation/aliased_ssa/gvn/ValueNumbering.qll
similarity index 100%
rename from cpp/ql/src/semmle/code/cpp/ir/implementation/aliased_ssa/gvn/ValueNumbering.qll
rename to cpp/ql/lib/semmle/code/cpp/ir/implementation/aliased_ssa/gvn/ValueNumbering.qll
diff --git a/cpp/ql/src/semmle/code/cpp/ir/implementation/aliased_ssa/gvn/internal/ValueNumberingImports.qll b/cpp/ql/lib/semmle/code/cpp/ir/implementation/aliased_ssa/gvn/internal/ValueNumberingImports.qll
similarity index 100%
rename from cpp/ql/src/semmle/code/cpp/ir/implementation/aliased_ssa/gvn/internal/ValueNumberingImports.qll
rename to cpp/ql/lib/semmle/code/cpp/ir/implementation/aliased_ssa/gvn/internal/ValueNumberingImports.qll
diff --git a/cpp/ql/src/semmle/code/cpp/ir/implementation/aliased_ssa/gvn/internal/ValueNumberingInternal.qll b/cpp/ql/lib/semmle/code/cpp/ir/implementation/aliased_ssa/gvn/internal/ValueNumberingInternal.qll
similarity index 100%
rename from cpp/ql/src/semmle/code/cpp/ir/implementation/aliased_ssa/gvn/internal/ValueNumberingInternal.qll
rename to cpp/ql/lib/semmle/code/cpp/ir/implementation/aliased_ssa/gvn/internal/ValueNumberingInternal.qll
diff --git a/cpp/ql/src/semmle/code/cpp/ir/implementation/aliased_ssa/internal/AliasAnalysis.qll b/cpp/ql/lib/semmle/code/cpp/ir/implementation/aliased_ssa/internal/AliasAnalysis.qll
similarity index 100%
rename from cpp/ql/src/semmle/code/cpp/ir/implementation/aliased_ssa/internal/AliasAnalysis.qll
rename to cpp/ql/lib/semmle/code/cpp/ir/implementation/aliased_ssa/internal/AliasAnalysis.qll
diff --git a/cpp/ql/src/semmle/code/cpp/ir/implementation/aliased_ssa/internal/AliasAnalysisImports.qll b/cpp/ql/lib/semmle/code/cpp/ir/implementation/aliased_ssa/internal/AliasAnalysisImports.qll
similarity index 100%
rename from cpp/ql/src/semmle/code/cpp/ir/implementation/aliased_ssa/internal/AliasAnalysisImports.qll
rename to cpp/ql/lib/semmle/code/cpp/ir/implementation/aliased_ssa/internal/AliasAnalysisImports.qll
diff --git a/cpp/ql/src/semmle/code/cpp/ir/implementation/aliased_ssa/internal/AliasAnalysisInternal.qll b/cpp/ql/lib/semmle/code/cpp/ir/implementation/aliased_ssa/internal/AliasAnalysisInternal.qll
similarity index 100%
rename from cpp/ql/src/semmle/code/cpp/ir/implementation/aliased_ssa/internal/AliasAnalysisInternal.qll
rename to cpp/ql/lib/semmle/code/cpp/ir/implementation/aliased_ssa/internal/AliasAnalysisInternal.qll
diff --git a/cpp/ql/src/semmle/code/cpp/ir/implementation/aliased_ssa/internal/AliasConfiguration.qll b/cpp/ql/lib/semmle/code/cpp/ir/implementation/aliased_ssa/internal/AliasConfiguration.qll
similarity index 100%
rename from cpp/ql/src/semmle/code/cpp/ir/implementation/aliased_ssa/internal/AliasConfiguration.qll
rename to cpp/ql/lib/semmle/code/cpp/ir/implementation/aliased_ssa/internal/AliasConfiguration.qll
diff --git a/cpp/ql/src/semmle/code/cpp/ir/implementation/aliased_ssa/internal/AliasConfigurationInternal.qll b/cpp/ql/lib/semmle/code/cpp/ir/implementation/aliased_ssa/internal/AliasConfigurationInternal.qll
similarity index 100%
rename from cpp/ql/src/semmle/code/cpp/ir/implementation/aliased_ssa/internal/AliasConfigurationInternal.qll
rename to cpp/ql/lib/semmle/code/cpp/ir/implementation/aliased_ssa/internal/AliasConfigurationInternal.qll
diff --git a/cpp/ql/src/semmle/code/cpp/ir/implementation/aliased_ssa/internal/AliasedSSA.qll b/cpp/ql/lib/semmle/code/cpp/ir/implementation/aliased_ssa/internal/AliasedSSA.qll
similarity index 100%
rename from cpp/ql/src/semmle/code/cpp/ir/implementation/aliased_ssa/internal/AliasedSSA.qll
rename to cpp/ql/lib/semmle/code/cpp/ir/implementation/aliased_ssa/internal/AliasedSSA.qll
diff --git a/cpp/ql/src/semmle/code/cpp/ir/implementation/aliased_ssa/internal/IRBlockImports.qll b/cpp/ql/lib/semmle/code/cpp/ir/implementation/aliased_ssa/internal/IRBlockImports.qll
similarity index 100%
rename from cpp/ql/src/semmle/code/cpp/ir/implementation/aliased_ssa/internal/IRBlockImports.qll
rename to cpp/ql/lib/semmle/code/cpp/ir/implementation/aliased_ssa/internal/IRBlockImports.qll
diff --git a/cpp/ql/src/semmle/code/cpp/ir/implementation/aliased_ssa/internal/IRFunctionImports.qll b/cpp/ql/lib/semmle/code/cpp/ir/implementation/aliased_ssa/internal/IRFunctionImports.qll
similarity index 100%
rename from cpp/ql/src/semmle/code/cpp/ir/implementation/aliased_ssa/internal/IRFunctionImports.qll
rename to cpp/ql/lib/semmle/code/cpp/ir/implementation/aliased_ssa/internal/IRFunctionImports.qll
diff --git a/cpp/ql/src/semmle/code/cpp/ir/implementation/aliased_ssa/internal/IRImports.qll b/cpp/ql/lib/semmle/code/cpp/ir/implementation/aliased_ssa/internal/IRImports.qll
similarity index 100%
rename from cpp/ql/src/semmle/code/cpp/ir/implementation/aliased_ssa/internal/IRImports.qll
rename to cpp/ql/lib/semmle/code/cpp/ir/implementation/aliased_ssa/internal/IRImports.qll
diff --git a/cpp/ql/src/semmle/code/cpp/ir/implementation/aliased_ssa/internal/IRInternal.qll b/cpp/ql/lib/semmle/code/cpp/ir/implementation/aliased_ssa/internal/IRInternal.qll
similarity index 100%
rename from cpp/ql/src/semmle/code/cpp/ir/implementation/aliased_ssa/internal/IRInternal.qll
rename to cpp/ql/lib/semmle/code/cpp/ir/implementation/aliased_ssa/internal/IRInternal.qll
diff --git a/cpp/ql/src/semmle/code/cpp/ir/implementation/aliased_ssa/internal/IRVariableImports.qll b/cpp/ql/lib/semmle/code/cpp/ir/implementation/aliased_ssa/internal/IRVariableImports.qll
similarity index 100%
rename from cpp/ql/src/semmle/code/cpp/ir/implementation/aliased_ssa/internal/IRVariableImports.qll
rename to cpp/ql/lib/semmle/code/cpp/ir/implementation/aliased_ssa/internal/IRVariableImports.qll
diff --git a/cpp/ql/src/semmle/code/cpp/ir/implementation/aliased_ssa/internal/InstructionImports.qll b/cpp/ql/lib/semmle/code/cpp/ir/implementation/aliased_ssa/internal/InstructionImports.qll
similarity index 100%
rename from cpp/ql/src/semmle/code/cpp/ir/implementation/aliased_ssa/internal/InstructionImports.qll
rename to cpp/ql/lib/semmle/code/cpp/ir/implementation/aliased_ssa/internal/InstructionImports.qll
diff --git a/cpp/ql/src/semmle/code/cpp/ir/implementation/aliased_ssa/internal/OperandImports.qll b/cpp/ql/lib/semmle/code/cpp/ir/implementation/aliased_ssa/internal/OperandImports.qll
similarity index 100%
rename from cpp/ql/src/semmle/code/cpp/ir/implementation/aliased_ssa/internal/OperandImports.qll
rename to cpp/ql/lib/semmle/code/cpp/ir/implementation/aliased_ssa/internal/OperandImports.qll
diff --git a/cpp/ql/src/semmle/code/cpp/ir/implementation/aliased_ssa/internal/OperandInternal.qll b/cpp/ql/lib/semmle/code/cpp/ir/implementation/aliased_ssa/internal/OperandInternal.qll
similarity index 100%
rename from cpp/ql/src/semmle/code/cpp/ir/implementation/aliased_ssa/internal/OperandInternal.qll
rename to cpp/ql/lib/semmle/code/cpp/ir/implementation/aliased_ssa/internal/OperandInternal.qll
diff --git a/cpp/ql/src/semmle/code/cpp/ir/implementation/aliased_ssa/internal/PrintAliasAnalysis.qll b/cpp/ql/lib/semmle/code/cpp/ir/implementation/aliased_ssa/internal/PrintAliasAnalysis.qll
similarity index 100%
rename from cpp/ql/src/semmle/code/cpp/ir/implementation/aliased_ssa/internal/PrintAliasAnalysis.qll
rename to cpp/ql/lib/semmle/code/cpp/ir/implementation/aliased_ssa/internal/PrintAliasAnalysis.qll
diff --git a/cpp/ql/src/semmle/code/cpp/ir/implementation/aliased_ssa/internal/PrintIRImports.qll b/cpp/ql/lib/semmle/code/cpp/ir/implementation/aliased_ssa/internal/PrintIRImports.qll
similarity index 100%
rename from cpp/ql/src/semmle/code/cpp/ir/implementation/aliased_ssa/internal/PrintIRImports.qll
rename to cpp/ql/lib/semmle/code/cpp/ir/implementation/aliased_ssa/internal/PrintIRImports.qll
diff --git a/cpp/ql/src/semmle/code/cpp/ir/implementation/aliased_ssa/internal/PrintSSA.qll b/cpp/ql/lib/semmle/code/cpp/ir/implementation/aliased_ssa/internal/PrintSSA.qll
similarity index 100%
rename from cpp/ql/src/semmle/code/cpp/ir/implementation/aliased_ssa/internal/PrintSSA.qll
rename to cpp/ql/lib/semmle/code/cpp/ir/implementation/aliased_ssa/internal/PrintSSA.qll
diff --git a/cpp/ql/src/semmle/code/cpp/ir/implementation/aliased_ssa/internal/SSAConsistency.ql b/cpp/ql/lib/semmle/code/cpp/ir/implementation/aliased_ssa/internal/SSAConsistency.ql
similarity index 100%
rename from cpp/ql/src/semmle/code/cpp/ir/implementation/aliased_ssa/internal/SSAConsistency.ql
rename to cpp/ql/lib/semmle/code/cpp/ir/implementation/aliased_ssa/internal/SSAConsistency.ql
diff --git a/cpp/ql/src/semmle/code/cpp/ir/implementation/aliased_ssa/internal/SSAConsistency.qll b/cpp/ql/lib/semmle/code/cpp/ir/implementation/aliased_ssa/internal/SSAConsistency.qll
similarity index 100%
rename from cpp/ql/src/semmle/code/cpp/ir/implementation/aliased_ssa/internal/SSAConsistency.qll
rename to cpp/ql/lib/semmle/code/cpp/ir/implementation/aliased_ssa/internal/SSAConsistency.qll
diff --git a/cpp/ql/src/semmle/code/cpp/ir/implementation/aliased_ssa/internal/SSAConstruction.qll b/cpp/ql/lib/semmle/code/cpp/ir/implementation/aliased_ssa/internal/SSAConstruction.qll
similarity index 100%
rename from cpp/ql/src/semmle/code/cpp/ir/implementation/aliased_ssa/internal/SSAConstruction.qll
rename to cpp/ql/lib/semmle/code/cpp/ir/implementation/aliased_ssa/internal/SSAConstruction.qll
diff --git a/cpp/ql/src/semmle/code/cpp/ir/implementation/aliased_ssa/internal/SSAConstructionImports.qll b/cpp/ql/lib/semmle/code/cpp/ir/implementation/aliased_ssa/internal/SSAConstructionImports.qll
similarity index 100%
rename from cpp/ql/src/semmle/code/cpp/ir/implementation/aliased_ssa/internal/SSAConstructionImports.qll
rename to cpp/ql/lib/semmle/code/cpp/ir/implementation/aliased_ssa/internal/SSAConstructionImports.qll
diff --git a/cpp/ql/src/semmle/code/cpp/ir/implementation/aliased_ssa/internal/SSAConstructionInternal.qll b/cpp/ql/lib/semmle/code/cpp/ir/implementation/aliased_ssa/internal/SSAConstructionInternal.qll
similarity index 100%
rename from cpp/ql/src/semmle/code/cpp/ir/implementation/aliased_ssa/internal/SSAConstructionInternal.qll
rename to cpp/ql/lib/semmle/code/cpp/ir/implementation/aliased_ssa/internal/SSAConstructionInternal.qll
diff --git a/cpp/ql/src/semmle/code/cpp/ir/implementation/internal/EdgeKindInternal.qll b/cpp/ql/lib/semmle/code/cpp/ir/implementation/internal/EdgeKindInternal.qll
similarity index 100%
rename from cpp/ql/src/semmle/code/cpp/ir/implementation/internal/EdgeKindInternal.qll
rename to cpp/ql/lib/semmle/code/cpp/ir/implementation/internal/EdgeKindInternal.qll
diff --git a/cpp/ql/src/semmle/code/cpp/ir/implementation/internal/IRConfigurationInternal.qll b/cpp/ql/lib/semmle/code/cpp/ir/implementation/internal/IRConfigurationInternal.qll
similarity index 100%
rename from cpp/ql/src/semmle/code/cpp/ir/implementation/internal/IRConfigurationInternal.qll
rename to cpp/ql/lib/semmle/code/cpp/ir/implementation/internal/IRConfigurationInternal.qll
diff --git a/cpp/ql/src/semmle/code/cpp/ir/implementation/internal/IRFunctionBase.qll b/cpp/ql/lib/semmle/code/cpp/ir/implementation/internal/IRFunctionBase.qll
similarity index 100%
rename from cpp/ql/src/semmle/code/cpp/ir/implementation/internal/IRFunctionBase.qll
rename to cpp/ql/lib/semmle/code/cpp/ir/implementation/internal/IRFunctionBase.qll
diff --git a/cpp/ql/src/semmle/code/cpp/ir/implementation/internal/IRFunctionBaseInternal.qll b/cpp/ql/lib/semmle/code/cpp/ir/implementation/internal/IRFunctionBaseInternal.qll
similarity index 100%
rename from cpp/ql/src/semmle/code/cpp/ir/implementation/internal/IRFunctionBaseInternal.qll
rename to cpp/ql/lib/semmle/code/cpp/ir/implementation/internal/IRFunctionBaseInternal.qll
diff --git a/cpp/ql/src/semmle/code/cpp/ir/implementation/internal/IRTypeInternal.qll b/cpp/ql/lib/semmle/code/cpp/ir/implementation/internal/IRTypeInternal.qll
similarity index 100%
rename from cpp/ql/src/semmle/code/cpp/ir/implementation/internal/IRTypeInternal.qll
rename to cpp/ql/lib/semmle/code/cpp/ir/implementation/internal/IRTypeInternal.qll
diff --git a/cpp/ql/src/semmle/code/cpp/ir/implementation/internal/OpcodeImports.qll b/cpp/ql/lib/semmle/code/cpp/ir/implementation/internal/OpcodeImports.qll
similarity index 100%
rename from cpp/ql/src/semmle/code/cpp/ir/implementation/internal/OpcodeImports.qll
rename to cpp/ql/lib/semmle/code/cpp/ir/implementation/internal/OpcodeImports.qll
diff --git a/cpp/ql/src/semmle/code/cpp/ir/implementation/internal/OperandTag.qll b/cpp/ql/lib/semmle/code/cpp/ir/implementation/internal/OperandTag.qll
similarity index 100%
rename from cpp/ql/src/semmle/code/cpp/ir/implementation/internal/OperandTag.qll
rename to cpp/ql/lib/semmle/code/cpp/ir/implementation/internal/OperandTag.qll
diff --git a/cpp/ql/src/semmle/code/cpp/ir/implementation/internal/OperandTagInternal.qll b/cpp/ql/lib/semmle/code/cpp/ir/implementation/internal/OperandTagInternal.qll
similarity index 100%
rename from cpp/ql/src/semmle/code/cpp/ir/implementation/internal/OperandTagInternal.qll
rename to cpp/ql/lib/semmle/code/cpp/ir/implementation/internal/OperandTagInternal.qll
diff --git a/cpp/ql/src/semmle/code/cpp/ir/implementation/internal/TIRVariable.qll b/cpp/ql/lib/semmle/code/cpp/ir/implementation/internal/TIRVariable.qll
similarity index 100%
rename from cpp/ql/src/semmle/code/cpp/ir/implementation/internal/TIRVariable.qll
rename to cpp/ql/lib/semmle/code/cpp/ir/implementation/internal/TIRVariable.qll
diff --git a/cpp/ql/src/semmle/code/cpp/ir/implementation/internal/TIRVariableInternal.qll b/cpp/ql/lib/semmle/code/cpp/ir/implementation/internal/TIRVariableInternal.qll
similarity index 100%
rename from cpp/ql/src/semmle/code/cpp/ir/implementation/internal/TIRVariableInternal.qll
rename to cpp/ql/lib/semmle/code/cpp/ir/implementation/internal/TIRVariableInternal.qll
diff --git a/cpp/ql/src/semmle/code/cpp/ir/implementation/internal/TInstruction.qll b/cpp/ql/lib/semmle/code/cpp/ir/implementation/internal/TInstruction.qll
similarity index 100%
rename from cpp/ql/src/semmle/code/cpp/ir/implementation/internal/TInstruction.qll
rename to cpp/ql/lib/semmle/code/cpp/ir/implementation/internal/TInstruction.qll
diff --git a/cpp/ql/src/semmle/code/cpp/ir/implementation/internal/TInstructionImports.qll b/cpp/ql/lib/semmle/code/cpp/ir/implementation/internal/TInstructionImports.qll
similarity index 100%
rename from cpp/ql/src/semmle/code/cpp/ir/implementation/internal/TInstructionImports.qll
rename to cpp/ql/lib/semmle/code/cpp/ir/implementation/internal/TInstructionImports.qll
diff --git a/cpp/ql/src/semmle/code/cpp/ir/implementation/internal/TInstructionInternal.qll b/cpp/ql/lib/semmle/code/cpp/ir/implementation/internal/TInstructionInternal.qll
similarity index 100%
rename from cpp/ql/src/semmle/code/cpp/ir/implementation/internal/TInstructionInternal.qll
rename to cpp/ql/lib/semmle/code/cpp/ir/implementation/internal/TInstructionInternal.qll
diff --git a/cpp/ql/src/semmle/code/cpp/ir/implementation/internal/TOperand.qll b/cpp/ql/lib/semmle/code/cpp/ir/implementation/internal/TOperand.qll
similarity index 100%
rename from cpp/ql/src/semmle/code/cpp/ir/implementation/internal/TOperand.qll
rename to cpp/ql/lib/semmle/code/cpp/ir/implementation/internal/TOperand.qll
diff --git a/cpp/ql/src/semmle/code/cpp/ir/implementation/internal/TempVariableTagInternal.qll b/cpp/ql/lib/semmle/code/cpp/ir/implementation/internal/TempVariableTagInternal.qll
similarity index 100%
rename from cpp/ql/src/semmle/code/cpp/ir/implementation/internal/TempVariableTagInternal.qll
rename to cpp/ql/lib/semmle/code/cpp/ir/implementation/internal/TempVariableTagInternal.qll
diff --git a/cpp/ql/src/semmle/code/cpp/ir/implementation/raw/IR.qll b/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/IR.qll
similarity index 100%
rename from cpp/ql/src/semmle/code/cpp/ir/implementation/raw/IR.qll
rename to cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/IR.qll
diff --git a/cpp/ql/src/semmle/code/cpp/ir/implementation/raw/IRBlock.qll b/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/IRBlock.qll
similarity index 100%
rename from cpp/ql/src/semmle/code/cpp/ir/implementation/raw/IRBlock.qll
rename to cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/IRBlock.qll
diff --git a/cpp/ql/src/semmle/code/cpp/ir/implementation/raw/IRBlockImports.qll b/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/IRBlockImports.qll
similarity index 100%
rename from cpp/ql/src/semmle/code/cpp/ir/implementation/raw/IRBlockImports.qll
rename to cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/IRBlockImports.qll
diff --git a/cpp/ql/src/semmle/code/cpp/ir/implementation/raw/IRConsistency.ql b/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/IRConsistency.ql
similarity index 100%
rename from cpp/ql/src/semmle/code/cpp/ir/implementation/raw/IRConsistency.ql
rename to cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/IRConsistency.ql
diff --git a/cpp/ql/src/semmle/code/cpp/ir/implementation/aliased_ssa/IRConsistency.qll b/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/IRConsistency.qll
similarity index 99%
rename from cpp/ql/src/semmle/code/cpp/ir/implementation/aliased_ssa/IRConsistency.qll
rename to cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/IRConsistency.qll
index f331f4c87bf..31983d34247 100644
--- a/cpp/ql/src/semmle/code/cpp/ir/implementation/aliased_ssa/IRConsistency.qll
+++ b/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/IRConsistency.qll
@@ -35,7 +35,7 @@ module InstructionConsistency {
// To avoid an overwhelming number of results when the extractor merges functions with the
// same name, just pick a single location.
result =
- rank[1](Language::Location loc | loc = irFunc.getLocation() | loc order by loc.toString())
+ min(Language::Location loc | loc = irFunc.getLocation() | loc order by loc.toString())
}
}
diff --git a/cpp/ql/src/semmle/code/cpp/ir/implementation/raw/IRFunction.qll b/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/IRFunction.qll
similarity index 100%
rename from cpp/ql/src/semmle/code/cpp/ir/implementation/raw/IRFunction.qll
rename to cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/IRFunction.qll
diff --git a/cpp/ql/src/semmle/code/cpp/ir/implementation/raw/IRVariable.qll b/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/IRVariable.qll
similarity index 100%
rename from cpp/ql/src/semmle/code/cpp/ir/implementation/raw/IRVariable.qll
rename to cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/IRVariable.qll
diff --git a/cpp/ql/src/semmle/code/cpp/ir/implementation/raw/Instruction.qll b/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/Instruction.qll
similarity index 100%
rename from cpp/ql/src/semmle/code/cpp/ir/implementation/raw/Instruction.qll
rename to cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/Instruction.qll
diff --git a/cpp/ql/src/semmle/code/cpp/ir/implementation/raw/Operand.qll b/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/Operand.qll
similarity index 100%
rename from cpp/ql/src/semmle/code/cpp/ir/implementation/raw/Operand.qll
rename to cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/Operand.qll
diff --git a/cpp/ql/src/semmle/code/cpp/ir/implementation/raw/PrintIR.ql b/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/PrintIR.ql
similarity index 100%
rename from cpp/ql/src/semmle/code/cpp/ir/implementation/raw/PrintIR.ql
rename to cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/PrintIR.ql
diff --git a/cpp/ql/src/semmle/code/cpp/ir/implementation/raw/PrintIR.qll b/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/PrintIR.qll
similarity index 100%
rename from cpp/ql/src/semmle/code/cpp/ir/implementation/raw/PrintIR.qll
rename to cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/PrintIR.qll
diff --git a/cpp/ql/src/semmle/code/cpp/ir/implementation/raw/constant/ConstantAnalysis.qll b/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/constant/ConstantAnalysis.qll
similarity index 100%
rename from cpp/ql/src/semmle/code/cpp/ir/implementation/raw/constant/ConstantAnalysis.qll
rename to cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/constant/ConstantAnalysis.qll
diff --git a/cpp/ql/src/semmle/code/cpp/ir/implementation/raw/constant/PrintConstantAnalysis.qll b/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/constant/PrintConstantAnalysis.qll
similarity index 100%
rename from cpp/ql/src/semmle/code/cpp/ir/implementation/raw/constant/PrintConstantAnalysis.qll
rename to cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/constant/PrintConstantAnalysis.qll
diff --git a/cpp/ql/src/semmle/code/cpp/ir/implementation/raw/constant/internal/ConstantAnalysisInternal.qll b/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/constant/internal/ConstantAnalysisInternal.qll
similarity index 100%
rename from cpp/ql/src/semmle/code/cpp/ir/implementation/raw/constant/internal/ConstantAnalysisInternal.qll
rename to cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/constant/internal/ConstantAnalysisInternal.qll
diff --git a/cpp/ql/src/semmle/code/cpp/ir/implementation/raw/gvn/PrintValueNumbering.qll b/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/gvn/PrintValueNumbering.qll
similarity index 100%
rename from cpp/ql/src/semmle/code/cpp/ir/implementation/raw/gvn/PrintValueNumbering.qll
rename to cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/gvn/PrintValueNumbering.qll
diff --git a/cpp/ql/src/semmle/code/cpp/ir/implementation/raw/gvn/ValueNumbering.qll b/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/gvn/ValueNumbering.qll
similarity index 100%
rename from cpp/ql/src/semmle/code/cpp/ir/implementation/raw/gvn/ValueNumbering.qll
rename to cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/gvn/ValueNumbering.qll
diff --git a/cpp/ql/src/semmle/code/cpp/ir/implementation/raw/gvn/internal/ValueNumberingImports.qll b/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/gvn/internal/ValueNumberingImports.qll
similarity index 100%
rename from cpp/ql/src/semmle/code/cpp/ir/implementation/raw/gvn/internal/ValueNumberingImports.qll
rename to cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/gvn/internal/ValueNumberingImports.qll
diff --git a/cpp/ql/src/semmle/code/cpp/ir/implementation/raw/gvn/internal/ValueNumberingInternal.qll b/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/gvn/internal/ValueNumberingInternal.qll
similarity index 100%
rename from cpp/ql/src/semmle/code/cpp/ir/implementation/raw/gvn/internal/ValueNumberingInternal.qll
rename to cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/gvn/internal/ValueNumberingInternal.qll
diff --git a/cpp/ql/src/semmle/code/cpp/ir/implementation/raw/internal/IRBlockImports.qll b/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/internal/IRBlockImports.qll
similarity index 100%
rename from cpp/ql/src/semmle/code/cpp/ir/implementation/raw/internal/IRBlockImports.qll
rename to cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/internal/IRBlockImports.qll
diff --git a/cpp/ql/src/semmle/code/cpp/ir/implementation/raw/internal/IRConstruction.qll b/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/internal/IRConstruction.qll
similarity index 100%
rename from cpp/ql/src/semmle/code/cpp/ir/implementation/raw/internal/IRConstruction.qll
rename to cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/internal/IRConstruction.qll
diff --git a/cpp/ql/src/semmle/code/cpp/ir/implementation/raw/internal/IRFunctionImports.qll b/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/internal/IRFunctionImports.qll
similarity index 100%
rename from cpp/ql/src/semmle/code/cpp/ir/implementation/raw/internal/IRFunctionImports.qll
rename to cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/internal/IRFunctionImports.qll
diff --git a/cpp/ql/src/semmle/code/cpp/ir/implementation/raw/internal/IRImports.qll b/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/internal/IRImports.qll
similarity index 100%
rename from cpp/ql/src/semmle/code/cpp/ir/implementation/raw/internal/IRImports.qll
rename to cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/internal/IRImports.qll
diff --git a/cpp/ql/src/semmle/code/cpp/ir/implementation/raw/internal/IRInternal.qll b/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/internal/IRInternal.qll
similarity index 100%
rename from cpp/ql/src/semmle/code/cpp/ir/implementation/raw/internal/IRInternal.qll
rename to cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/internal/IRInternal.qll
diff --git a/cpp/ql/src/semmle/code/cpp/ir/implementation/raw/internal/IRVariableImports.qll b/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/internal/IRVariableImports.qll
similarity index 100%
rename from cpp/ql/src/semmle/code/cpp/ir/implementation/raw/internal/IRVariableImports.qll
rename to cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/internal/IRVariableImports.qll
diff --git a/cpp/ql/src/semmle/code/cpp/ir/implementation/raw/internal/InstructionImports.qll b/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/internal/InstructionImports.qll
similarity index 100%
rename from cpp/ql/src/semmle/code/cpp/ir/implementation/raw/internal/InstructionImports.qll
rename to cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/internal/InstructionImports.qll
diff --git a/cpp/ql/src/semmle/code/cpp/ir/implementation/raw/internal/InstructionTag.qll b/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/internal/InstructionTag.qll
similarity index 100%
rename from cpp/ql/src/semmle/code/cpp/ir/implementation/raw/internal/InstructionTag.qll
rename to cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/internal/InstructionTag.qll
diff --git a/cpp/ql/src/semmle/code/cpp/ir/implementation/raw/internal/OperandImports.qll b/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/internal/OperandImports.qll
similarity index 100%
rename from cpp/ql/src/semmle/code/cpp/ir/implementation/raw/internal/OperandImports.qll
rename to cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/internal/OperandImports.qll
diff --git a/cpp/ql/src/semmle/code/cpp/ir/implementation/raw/internal/OperandInternal.qll b/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/internal/OperandInternal.qll
similarity index 100%
rename from cpp/ql/src/semmle/code/cpp/ir/implementation/raw/internal/OperandInternal.qll
rename to cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/internal/OperandInternal.qll
diff --git a/cpp/ql/src/semmle/code/cpp/ir/implementation/raw/internal/PrintIRImports.qll b/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/internal/PrintIRImports.qll
similarity index 100%
rename from cpp/ql/src/semmle/code/cpp/ir/implementation/raw/internal/PrintIRImports.qll
rename to cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/internal/PrintIRImports.qll
diff --git a/cpp/ql/src/semmle/code/cpp/ir/implementation/raw/internal/SideEffects.qll b/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/internal/SideEffects.qll
similarity index 100%
rename from cpp/ql/src/semmle/code/cpp/ir/implementation/raw/internal/SideEffects.qll
rename to cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/internal/SideEffects.qll
diff --git a/cpp/ql/src/semmle/code/cpp/ir/implementation/raw/internal/TranslatedCall.qll b/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/internal/TranslatedCall.qll
similarity index 100%
rename from cpp/ql/src/semmle/code/cpp/ir/implementation/raw/internal/TranslatedCall.qll
rename to cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/internal/TranslatedCall.qll
diff --git a/cpp/ql/src/semmle/code/cpp/ir/implementation/raw/internal/TranslatedCondition.qll b/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/internal/TranslatedCondition.qll
similarity index 100%
rename from cpp/ql/src/semmle/code/cpp/ir/implementation/raw/internal/TranslatedCondition.qll
rename to cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/internal/TranslatedCondition.qll
diff --git a/cpp/ql/src/semmle/code/cpp/ir/implementation/raw/internal/TranslatedDeclarationEntry.qll b/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/internal/TranslatedDeclarationEntry.qll
similarity index 100%
rename from cpp/ql/src/semmle/code/cpp/ir/implementation/raw/internal/TranslatedDeclarationEntry.qll
rename to cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/internal/TranslatedDeclarationEntry.qll
diff --git a/cpp/ql/src/semmle/code/cpp/ir/implementation/raw/internal/TranslatedElement.qll b/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/internal/TranslatedElement.qll
similarity index 100%
rename from cpp/ql/src/semmle/code/cpp/ir/implementation/raw/internal/TranslatedElement.qll
rename to cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/internal/TranslatedElement.qll
diff --git a/cpp/ql/src/semmle/code/cpp/ir/implementation/raw/internal/TranslatedExpr.qll b/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/internal/TranslatedExpr.qll
similarity index 100%
rename from cpp/ql/src/semmle/code/cpp/ir/implementation/raw/internal/TranslatedExpr.qll
rename to cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/internal/TranslatedExpr.qll
diff --git a/cpp/ql/src/semmle/code/cpp/ir/implementation/raw/internal/TranslatedFunction.qll b/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/internal/TranslatedFunction.qll
similarity index 100%
rename from cpp/ql/src/semmle/code/cpp/ir/implementation/raw/internal/TranslatedFunction.qll
rename to cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/internal/TranslatedFunction.qll
diff --git a/cpp/ql/src/semmle/code/cpp/ir/implementation/raw/internal/TranslatedInitialization.qll b/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/internal/TranslatedInitialization.qll
similarity index 100%
rename from cpp/ql/src/semmle/code/cpp/ir/implementation/raw/internal/TranslatedInitialization.qll
rename to cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/internal/TranslatedInitialization.qll
diff --git a/cpp/ql/src/semmle/code/cpp/ir/implementation/raw/internal/TranslatedStmt.qll b/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/internal/TranslatedStmt.qll
similarity index 100%
rename from cpp/ql/src/semmle/code/cpp/ir/implementation/raw/internal/TranslatedStmt.qll
rename to cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/internal/TranslatedStmt.qll
diff --git a/cpp/ql/src/semmle/code/cpp/ir/implementation/raw/internal/VarArgs.qll b/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/internal/VarArgs.qll
similarity index 100%
rename from cpp/ql/src/semmle/code/cpp/ir/implementation/raw/internal/VarArgs.qll
rename to cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/internal/VarArgs.qll
diff --git a/cpp/ql/src/semmle/code/cpp/ir/implementation/raw/internal/reachability/Dominance.qll b/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/internal/reachability/Dominance.qll
similarity index 100%
rename from cpp/ql/src/semmle/code/cpp/ir/implementation/raw/internal/reachability/Dominance.qll
rename to cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/internal/reachability/Dominance.qll
diff --git a/cpp/ql/src/semmle/code/cpp/ir/implementation/raw/internal/reachability/DominanceInternal.qll b/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/internal/reachability/DominanceInternal.qll
similarity index 100%
rename from cpp/ql/src/semmle/code/cpp/ir/implementation/raw/internal/reachability/DominanceInternal.qll
rename to cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/internal/reachability/DominanceInternal.qll
diff --git a/cpp/ql/src/semmle/code/cpp/ir/implementation/raw/internal/reachability/PrintDominance.qll b/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/internal/reachability/PrintDominance.qll
similarity index 100%
rename from cpp/ql/src/semmle/code/cpp/ir/implementation/raw/internal/reachability/PrintDominance.qll
rename to cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/internal/reachability/PrintDominance.qll
diff --git a/cpp/ql/src/semmle/code/cpp/ir/implementation/raw/internal/reachability/PrintReachableBlock.qll b/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/internal/reachability/PrintReachableBlock.qll
similarity index 100%
rename from cpp/ql/src/semmle/code/cpp/ir/implementation/raw/internal/reachability/PrintReachableBlock.qll
rename to cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/internal/reachability/PrintReachableBlock.qll
diff --git a/cpp/ql/src/semmle/code/cpp/ir/implementation/raw/internal/reachability/ReachableBlock.qll b/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/internal/reachability/ReachableBlock.qll
similarity index 100%
rename from cpp/ql/src/semmle/code/cpp/ir/implementation/raw/internal/reachability/ReachableBlock.qll
rename to cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/internal/reachability/ReachableBlock.qll
diff --git a/cpp/ql/src/semmle/code/cpp/ir/implementation/raw/internal/reachability/ReachableBlockInternal.qll b/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/internal/reachability/ReachableBlockInternal.qll
similarity index 100%
rename from cpp/ql/src/semmle/code/cpp/ir/implementation/raw/internal/reachability/ReachableBlockInternal.qll
rename to cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/internal/reachability/ReachableBlockInternal.qll
diff --git a/cpp/ql/src/semmle/code/cpp/ir/implementation/unaliased_ssa/IR.qll b/cpp/ql/lib/semmle/code/cpp/ir/implementation/unaliased_ssa/IR.qll
similarity index 100%
rename from cpp/ql/src/semmle/code/cpp/ir/implementation/unaliased_ssa/IR.qll
rename to cpp/ql/lib/semmle/code/cpp/ir/implementation/unaliased_ssa/IR.qll
diff --git a/cpp/ql/src/semmle/code/cpp/ir/implementation/unaliased_ssa/IRBlock.qll b/cpp/ql/lib/semmle/code/cpp/ir/implementation/unaliased_ssa/IRBlock.qll
similarity index 100%
rename from cpp/ql/src/semmle/code/cpp/ir/implementation/unaliased_ssa/IRBlock.qll
rename to cpp/ql/lib/semmle/code/cpp/ir/implementation/unaliased_ssa/IRBlock.qll
diff --git a/cpp/ql/src/semmle/code/cpp/ir/implementation/unaliased_ssa/IRConsistency.ql b/cpp/ql/lib/semmle/code/cpp/ir/implementation/unaliased_ssa/IRConsistency.ql
similarity index 100%
rename from cpp/ql/src/semmle/code/cpp/ir/implementation/unaliased_ssa/IRConsistency.ql
rename to cpp/ql/lib/semmle/code/cpp/ir/implementation/unaliased_ssa/IRConsistency.ql
diff --git a/cpp/ql/src/semmle/code/cpp/ir/implementation/raw/IRConsistency.qll b/cpp/ql/lib/semmle/code/cpp/ir/implementation/unaliased_ssa/IRConsistency.qll
similarity index 99%
rename from cpp/ql/src/semmle/code/cpp/ir/implementation/raw/IRConsistency.qll
rename to cpp/ql/lib/semmle/code/cpp/ir/implementation/unaliased_ssa/IRConsistency.qll
index f331f4c87bf..31983d34247 100644
--- a/cpp/ql/src/semmle/code/cpp/ir/implementation/raw/IRConsistency.qll
+++ b/cpp/ql/lib/semmle/code/cpp/ir/implementation/unaliased_ssa/IRConsistency.qll
@@ -35,7 +35,7 @@ module InstructionConsistency {
// To avoid an overwhelming number of results when the extractor merges functions with the
// same name, just pick a single location.
result =
- rank[1](Language::Location loc | loc = irFunc.getLocation() | loc order by loc.toString())
+ min(Language::Location loc | loc = irFunc.getLocation() | loc order by loc.toString())
}
}
diff --git a/cpp/ql/src/semmle/code/cpp/ir/implementation/unaliased_ssa/IRFunction.qll b/cpp/ql/lib/semmle/code/cpp/ir/implementation/unaliased_ssa/IRFunction.qll
similarity index 100%
rename from cpp/ql/src/semmle/code/cpp/ir/implementation/unaliased_ssa/IRFunction.qll
rename to cpp/ql/lib/semmle/code/cpp/ir/implementation/unaliased_ssa/IRFunction.qll
diff --git a/cpp/ql/src/semmle/code/cpp/ir/implementation/unaliased_ssa/IRVariable.qll b/cpp/ql/lib/semmle/code/cpp/ir/implementation/unaliased_ssa/IRVariable.qll
similarity index 100%
rename from cpp/ql/src/semmle/code/cpp/ir/implementation/unaliased_ssa/IRVariable.qll
rename to cpp/ql/lib/semmle/code/cpp/ir/implementation/unaliased_ssa/IRVariable.qll
diff --git a/cpp/ql/src/semmle/code/cpp/ir/implementation/unaliased_ssa/Instruction.qll b/cpp/ql/lib/semmle/code/cpp/ir/implementation/unaliased_ssa/Instruction.qll
similarity index 100%
rename from cpp/ql/src/semmle/code/cpp/ir/implementation/unaliased_ssa/Instruction.qll
rename to cpp/ql/lib/semmle/code/cpp/ir/implementation/unaliased_ssa/Instruction.qll
diff --git a/cpp/ql/src/semmle/code/cpp/ir/implementation/unaliased_ssa/Operand.qll b/cpp/ql/lib/semmle/code/cpp/ir/implementation/unaliased_ssa/Operand.qll
similarity index 100%
rename from cpp/ql/src/semmle/code/cpp/ir/implementation/unaliased_ssa/Operand.qll
rename to cpp/ql/lib/semmle/code/cpp/ir/implementation/unaliased_ssa/Operand.qll
diff --git a/cpp/ql/src/semmle/code/cpp/ir/implementation/unaliased_ssa/PrintIR.ql b/cpp/ql/lib/semmle/code/cpp/ir/implementation/unaliased_ssa/PrintIR.ql
similarity index 100%
rename from cpp/ql/src/semmle/code/cpp/ir/implementation/unaliased_ssa/PrintIR.ql
rename to cpp/ql/lib/semmle/code/cpp/ir/implementation/unaliased_ssa/PrintIR.ql
diff --git a/cpp/ql/src/semmle/code/cpp/ir/implementation/unaliased_ssa/PrintIR.qll b/cpp/ql/lib/semmle/code/cpp/ir/implementation/unaliased_ssa/PrintIR.qll
similarity index 100%
rename from cpp/ql/src/semmle/code/cpp/ir/implementation/unaliased_ssa/PrintIR.qll
rename to cpp/ql/lib/semmle/code/cpp/ir/implementation/unaliased_ssa/PrintIR.qll
diff --git a/cpp/ql/src/semmle/code/cpp/ir/implementation/unaliased_ssa/constant/ConstantAnalysis.qll b/cpp/ql/lib/semmle/code/cpp/ir/implementation/unaliased_ssa/constant/ConstantAnalysis.qll
similarity index 100%
rename from cpp/ql/src/semmle/code/cpp/ir/implementation/unaliased_ssa/constant/ConstantAnalysis.qll
rename to cpp/ql/lib/semmle/code/cpp/ir/implementation/unaliased_ssa/constant/ConstantAnalysis.qll
diff --git a/cpp/ql/src/semmle/code/cpp/ir/implementation/unaliased_ssa/constant/PrintConstantAnalysis.qll b/cpp/ql/lib/semmle/code/cpp/ir/implementation/unaliased_ssa/constant/PrintConstantAnalysis.qll
similarity index 100%
rename from cpp/ql/src/semmle/code/cpp/ir/implementation/unaliased_ssa/constant/PrintConstantAnalysis.qll
rename to cpp/ql/lib/semmle/code/cpp/ir/implementation/unaliased_ssa/constant/PrintConstantAnalysis.qll
diff --git a/cpp/ql/src/semmle/code/cpp/ir/implementation/unaliased_ssa/constant/internal/ConstantAnalysisInternal.qll b/cpp/ql/lib/semmle/code/cpp/ir/implementation/unaliased_ssa/constant/internal/ConstantAnalysisInternal.qll
similarity index 100%
rename from cpp/ql/src/semmle/code/cpp/ir/implementation/unaliased_ssa/constant/internal/ConstantAnalysisInternal.qll
rename to cpp/ql/lib/semmle/code/cpp/ir/implementation/unaliased_ssa/constant/internal/ConstantAnalysisInternal.qll
diff --git a/cpp/ql/src/semmle/code/cpp/ir/implementation/unaliased_ssa/gvn/PrintValueNumbering.qll b/cpp/ql/lib/semmle/code/cpp/ir/implementation/unaliased_ssa/gvn/PrintValueNumbering.qll
similarity index 100%
rename from cpp/ql/src/semmle/code/cpp/ir/implementation/unaliased_ssa/gvn/PrintValueNumbering.qll
rename to cpp/ql/lib/semmle/code/cpp/ir/implementation/unaliased_ssa/gvn/PrintValueNumbering.qll
diff --git a/cpp/ql/src/semmle/code/cpp/ir/implementation/unaliased_ssa/gvn/ValueNumbering.qll b/cpp/ql/lib/semmle/code/cpp/ir/implementation/unaliased_ssa/gvn/ValueNumbering.qll
similarity index 100%
rename from cpp/ql/src/semmle/code/cpp/ir/implementation/unaliased_ssa/gvn/ValueNumbering.qll
rename to cpp/ql/lib/semmle/code/cpp/ir/implementation/unaliased_ssa/gvn/ValueNumbering.qll
diff --git a/cpp/ql/src/semmle/code/cpp/ir/implementation/unaliased_ssa/gvn/internal/ValueNumberingImports.qll b/cpp/ql/lib/semmle/code/cpp/ir/implementation/unaliased_ssa/gvn/internal/ValueNumberingImports.qll
similarity index 100%
rename from cpp/ql/src/semmle/code/cpp/ir/implementation/unaliased_ssa/gvn/internal/ValueNumberingImports.qll
rename to cpp/ql/lib/semmle/code/cpp/ir/implementation/unaliased_ssa/gvn/internal/ValueNumberingImports.qll
diff --git a/cpp/ql/src/semmle/code/cpp/ir/implementation/unaliased_ssa/gvn/internal/ValueNumberingInternal.qll b/cpp/ql/lib/semmle/code/cpp/ir/implementation/unaliased_ssa/gvn/internal/ValueNumberingInternal.qll
similarity index 100%
rename from cpp/ql/src/semmle/code/cpp/ir/implementation/unaliased_ssa/gvn/internal/ValueNumberingInternal.qll
rename to cpp/ql/lib/semmle/code/cpp/ir/implementation/unaliased_ssa/gvn/internal/ValueNumberingInternal.qll
diff --git a/cpp/ql/src/semmle/code/cpp/ir/implementation/unaliased_ssa/internal/AliasAnalysis.qll b/cpp/ql/lib/semmle/code/cpp/ir/implementation/unaliased_ssa/internal/AliasAnalysis.qll
similarity index 100%
rename from cpp/ql/src/semmle/code/cpp/ir/implementation/unaliased_ssa/internal/AliasAnalysis.qll
rename to cpp/ql/lib/semmle/code/cpp/ir/implementation/unaliased_ssa/internal/AliasAnalysis.qll
diff --git a/cpp/ql/src/semmle/code/cpp/ir/implementation/unaliased_ssa/internal/AliasAnalysisImports.qll b/cpp/ql/lib/semmle/code/cpp/ir/implementation/unaliased_ssa/internal/AliasAnalysisImports.qll
similarity index 100%
rename from cpp/ql/src/semmle/code/cpp/ir/implementation/unaliased_ssa/internal/AliasAnalysisImports.qll
rename to cpp/ql/lib/semmle/code/cpp/ir/implementation/unaliased_ssa/internal/AliasAnalysisImports.qll
diff --git a/cpp/ql/src/semmle/code/cpp/ir/implementation/unaliased_ssa/internal/AliasAnalysisInternal.qll b/cpp/ql/lib/semmle/code/cpp/ir/implementation/unaliased_ssa/internal/AliasAnalysisInternal.qll
similarity index 100%
rename from cpp/ql/src/semmle/code/cpp/ir/implementation/unaliased_ssa/internal/AliasAnalysisInternal.qll
rename to cpp/ql/lib/semmle/code/cpp/ir/implementation/unaliased_ssa/internal/AliasAnalysisInternal.qll
diff --git a/cpp/ql/src/semmle/code/cpp/ir/implementation/unaliased_ssa/internal/AliasConfiguration.qll b/cpp/ql/lib/semmle/code/cpp/ir/implementation/unaliased_ssa/internal/AliasConfiguration.qll
similarity index 100%
rename from cpp/ql/src/semmle/code/cpp/ir/implementation/unaliased_ssa/internal/AliasConfiguration.qll
rename to cpp/ql/lib/semmle/code/cpp/ir/implementation/unaliased_ssa/internal/AliasConfiguration.qll
diff --git a/cpp/ql/src/semmle/code/cpp/ir/implementation/unaliased_ssa/internal/AliasConfigurationImports.qll b/cpp/ql/lib/semmle/code/cpp/ir/implementation/unaliased_ssa/internal/AliasConfigurationImports.qll
similarity index 100%
rename from cpp/ql/src/semmle/code/cpp/ir/implementation/unaliased_ssa/internal/AliasConfigurationImports.qll
rename to cpp/ql/lib/semmle/code/cpp/ir/implementation/unaliased_ssa/internal/AliasConfigurationImports.qll
diff --git a/cpp/ql/src/semmle/code/cpp/ir/implementation/unaliased_ssa/internal/IRBlockImports.qll b/cpp/ql/lib/semmle/code/cpp/ir/implementation/unaliased_ssa/internal/IRBlockImports.qll
similarity index 100%
rename from cpp/ql/src/semmle/code/cpp/ir/implementation/unaliased_ssa/internal/IRBlockImports.qll
rename to cpp/ql/lib/semmle/code/cpp/ir/implementation/unaliased_ssa/internal/IRBlockImports.qll
diff --git a/cpp/ql/src/semmle/code/cpp/ir/implementation/unaliased_ssa/internal/IRFunctionImports.qll b/cpp/ql/lib/semmle/code/cpp/ir/implementation/unaliased_ssa/internal/IRFunctionImports.qll
similarity index 100%
rename from cpp/ql/src/semmle/code/cpp/ir/implementation/unaliased_ssa/internal/IRFunctionImports.qll
rename to cpp/ql/lib/semmle/code/cpp/ir/implementation/unaliased_ssa/internal/IRFunctionImports.qll
diff --git a/cpp/ql/src/semmle/code/cpp/ir/implementation/unaliased_ssa/internal/IRImports.qll b/cpp/ql/lib/semmle/code/cpp/ir/implementation/unaliased_ssa/internal/IRImports.qll
similarity index 100%
rename from cpp/ql/src/semmle/code/cpp/ir/implementation/unaliased_ssa/internal/IRImports.qll
rename to cpp/ql/lib/semmle/code/cpp/ir/implementation/unaliased_ssa/internal/IRImports.qll
diff --git a/cpp/ql/src/semmle/code/cpp/ir/implementation/unaliased_ssa/internal/IRInternal.qll b/cpp/ql/lib/semmle/code/cpp/ir/implementation/unaliased_ssa/internal/IRInternal.qll
similarity index 100%
rename from cpp/ql/src/semmle/code/cpp/ir/implementation/unaliased_ssa/internal/IRInternal.qll
rename to cpp/ql/lib/semmle/code/cpp/ir/implementation/unaliased_ssa/internal/IRInternal.qll
diff --git a/cpp/ql/src/semmle/code/cpp/ir/implementation/unaliased_ssa/internal/IRVariableImports.qll b/cpp/ql/lib/semmle/code/cpp/ir/implementation/unaliased_ssa/internal/IRVariableImports.qll
similarity index 100%
rename from cpp/ql/src/semmle/code/cpp/ir/implementation/unaliased_ssa/internal/IRVariableImports.qll
rename to cpp/ql/lib/semmle/code/cpp/ir/implementation/unaliased_ssa/internal/IRVariableImports.qll
diff --git a/cpp/ql/src/semmle/code/cpp/ir/implementation/unaliased_ssa/internal/InstructionImports.qll b/cpp/ql/lib/semmle/code/cpp/ir/implementation/unaliased_ssa/internal/InstructionImports.qll
similarity index 100%
rename from cpp/ql/src/semmle/code/cpp/ir/implementation/unaliased_ssa/internal/InstructionImports.qll
rename to cpp/ql/lib/semmle/code/cpp/ir/implementation/unaliased_ssa/internal/InstructionImports.qll
diff --git a/cpp/ql/src/semmle/code/cpp/ir/implementation/unaliased_ssa/internal/OperandImports.qll b/cpp/ql/lib/semmle/code/cpp/ir/implementation/unaliased_ssa/internal/OperandImports.qll
similarity index 100%
rename from cpp/ql/src/semmle/code/cpp/ir/implementation/unaliased_ssa/internal/OperandImports.qll
rename to cpp/ql/lib/semmle/code/cpp/ir/implementation/unaliased_ssa/internal/OperandImports.qll
diff --git a/cpp/ql/src/semmle/code/cpp/ir/implementation/unaliased_ssa/internal/OperandInternal.qll b/cpp/ql/lib/semmle/code/cpp/ir/implementation/unaliased_ssa/internal/OperandInternal.qll
similarity index 100%
rename from cpp/ql/src/semmle/code/cpp/ir/implementation/unaliased_ssa/internal/OperandInternal.qll
rename to cpp/ql/lib/semmle/code/cpp/ir/implementation/unaliased_ssa/internal/OperandInternal.qll
diff --git a/cpp/ql/src/semmle/code/cpp/ir/implementation/unaliased_ssa/internal/PrintAliasAnalysis.qll b/cpp/ql/lib/semmle/code/cpp/ir/implementation/unaliased_ssa/internal/PrintAliasAnalysis.qll
similarity index 100%
rename from cpp/ql/src/semmle/code/cpp/ir/implementation/unaliased_ssa/internal/PrintAliasAnalysis.qll
rename to cpp/ql/lib/semmle/code/cpp/ir/implementation/unaliased_ssa/internal/PrintAliasAnalysis.qll
diff --git a/cpp/ql/src/semmle/code/cpp/ir/implementation/unaliased_ssa/internal/PrintIRImports.qll b/cpp/ql/lib/semmle/code/cpp/ir/implementation/unaliased_ssa/internal/PrintIRImports.qll
similarity index 100%
rename from cpp/ql/src/semmle/code/cpp/ir/implementation/unaliased_ssa/internal/PrintIRImports.qll
rename to cpp/ql/lib/semmle/code/cpp/ir/implementation/unaliased_ssa/internal/PrintIRImports.qll
diff --git a/cpp/ql/src/semmle/code/cpp/ir/implementation/unaliased_ssa/internal/PrintSSA.qll b/cpp/ql/lib/semmle/code/cpp/ir/implementation/unaliased_ssa/internal/PrintSSA.qll
similarity index 100%
rename from cpp/ql/src/semmle/code/cpp/ir/implementation/unaliased_ssa/internal/PrintSSA.qll
rename to cpp/ql/lib/semmle/code/cpp/ir/implementation/unaliased_ssa/internal/PrintSSA.qll
diff --git a/cpp/ql/src/semmle/code/cpp/ir/implementation/unaliased_ssa/internal/SSAConsistency.ql b/cpp/ql/lib/semmle/code/cpp/ir/implementation/unaliased_ssa/internal/SSAConsistency.ql
similarity index 100%
rename from cpp/ql/src/semmle/code/cpp/ir/implementation/unaliased_ssa/internal/SSAConsistency.ql
rename to cpp/ql/lib/semmle/code/cpp/ir/implementation/unaliased_ssa/internal/SSAConsistency.ql
diff --git a/cpp/ql/src/semmle/code/cpp/ir/implementation/unaliased_ssa/internal/SSAConsistency.qll b/cpp/ql/lib/semmle/code/cpp/ir/implementation/unaliased_ssa/internal/SSAConsistency.qll
similarity index 100%
rename from cpp/ql/src/semmle/code/cpp/ir/implementation/unaliased_ssa/internal/SSAConsistency.qll
rename to cpp/ql/lib/semmle/code/cpp/ir/implementation/unaliased_ssa/internal/SSAConsistency.qll
diff --git a/cpp/ql/src/semmle/code/cpp/ir/implementation/unaliased_ssa/internal/SSAConstruction.qll b/cpp/ql/lib/semmle/code/cpp/ir/implementation/unaliased_ssa/internal/SSAConstruction.qll
similarity index 100%
rename from cpp/ql/src/semmle/code/cpp/ir/implementation/unaliased_ssa/internal/SSAConstruction.qll
rename to cpp/ql/lib/semmle/code/cpp/ir/implementation/unaliased_ssa/internal/SSAConstruction.qll
diff --git a/cpp/ql/src/semmle/code/cpp/ir/implementation/unaliased_ssa/internal/SSAConstructionImports.qll b/cpp/ql/lib/semmle/code/cpp/ir/implementation/unaliased_ssa/internal/SSAConstructionImports.qll
similarity index 100%
rename from cpp/ql/src/semmle/code/cpp/ir/implementation/unaliased_ssa/internal/SSAConstructionImports.qll
rename to cpp/ql/lib/semmle/code/cpp/ir/implementation/unaliased_ssa/internal/SSAConstructionImports.qll
diff --git a/cpp/ql/src/semmle/code/cpp/ir/implementation/unaliased_ssa/internal/SSAConstructionInternal.qll b/cpp/ql/lib/semmle/code/cpp/ir/implementation/unaliased_ssa/internal/SSAConstructionInternal.qll
similarity index 100%
rename from cpp/ql/src/semmle/code/cpp/ir/implementation/unaliased_ssa/internal/SSAConstructionInternal.qll
rename to cpp/ql/lib/semmle/code/cpp/ir/implementation/unaliased_ssa/internal/SSAConstructionInternal.qll
diff --git a/cpp/ql/src/semmle/code/cpp/ir/implementation/unaliased_ssa/internal/SimpleSSA.qll b/cpp/ql/lib/semmle/code/cpp/ir/implementation/unaliased_ssa/internal/SimpleSSA.qll
similarity index 100%
rename from cpp/ql/src/semmle/code/cpp/ir/implementation/unaliased_ssa/internal/SimpleSSA.qll
rename to cpp/ql/lib/semmle/code/cpp/ir/implementation/unaliased_ssa/internal/SimpleSSA.qll
diff --git a/cpp/ql/src/semmle/code/cpp/ir/implementation/unaliased_ssa/internal/SimpleSSAImports.qll b/cpp/ql/lib/semmle/code/cpp/ir/implementation/unaliased_ssa/internal/SimpleSSAImports.qll
similarity index 100%
rename from cpp/ql/src/semmle/code/cpp/ir/implementation/unaliased_ssa/internal/SimpleSSAImports.qll
rename to cpp/ql/lib/semmle/code/cpp/ir/implementation/unaliased_ssa/internal/SimpleSSAImports.qll
diff --git a/cpp/ql/src/semmle/code/cpp/ir/implementation/unaliased_ssa/internal/SimpleSSAPublicImports.qll b/cpp/ql/lib/semmle/code/cpp/ir/implementation/unaliased_ssa/internal/SimpleSSAPublicImports.qll
similarity index 100%
rename from cpp/ql/src/semmle/code/cpp/ir/implementation/unaliased_ssa/internal/SimpleSSAPublicImports.qll
rename to cpp/ql/lib/semmle/code/cpp/ir/implementation/unaliased_ssa/internal/SimpleSSAPublicImports.qll
diff --git a/cpp/ql/src/semmle/code/cpp/ir/implementation/unaliased_ssa/internal/reachability/Dominance.qll b/cpp/ql/lib/semmle/code/cpp/ir/implementation/unaliased_ssa/internal/reachability/Dominance.qll
similarity index 100%
rename from cpp/ql/src/semmle/code/cpp/ir/implementation/unaliased_ssa/internal/reachability/Dominance.qll
rename to cpp/ql/lib/semmle/code/cpp/ir/implementation/unaliased_ssa/internal/reachability/Dominance.qll
diff --git a/cpp/ql/src/semmle/code/cpp/ir/implementation/unaliased_ssa/internal/reachability/DominanceInternal.qll b/cpp/ql/lib/semmle/code/cpp/ir/implementation/unaliased_ssa/internal/reachability/DominanceInternal.qll
similarity index 100%
rename from cpp/ql/src/semmle/code/cpp/ir/implementation/unaliased_ssa/internal/reachability/DominanceInternal.qll
rename to cpp/ql/lib/semmle/code/cpp/ir/implementation/unaliased_ssa/internal/reachability/DominanceInternal.qll
diff --git a/cpp/ql/src/semmle/code/cpp/ir/implementation/unaliased_ssa/internal/reachability/PrintDominance.qll b/cpp/ql/lib/semmle/code/cpp/ir/implementation/unaliased_ssa/internal/reachability/PrintDominance.qll
similarity index 100%
rename from cpp/ql/src/semmle/code/cpp/ir/implementation/unaliased_ssa/internal/reachability/PrintDominance.qll
rename to cpp/ql/lib/semmle/code/cpp/ir/implementation/unaliased_ssa/internal/reachability/PrintDominance.qll
diff --git a/cpp/ql/src/semmle/code/cpp/ir/implementation/unaliased_ssa/internal/reachability/PrintReachableBlock.qll b/cpp/ql/lib/semmle/code/cpp/ir/implementation/unaliased_ssa/internal/reachability/PrintReachableBlock.qll
similarity index 100%
rename from cpp/ql/src/semmle/code/cpp/ir/implementation/unaliased_ssa/internal/reachability/PrintReachableBlock.qll
rename to cpp/ql/lib/semmle/code/cpp/ir/implementation/unaliased_ssa/internal/reachability/PrintReachableBlock.qll
diff --git a/cpp/ql/src/semmle/code/cpp/ir/implementation/unaliased_ssa/internal/reachability/ReachableBlock.qll b/cpp/ql/lib/semmle/code/cpp/ir/implementation/unaliased_ssa/internal/reachability/ReachableBlock.qll
similarity index 100%
rename from cpp/ql/src/semmle/code/cpp/ir/implementation/unaliased_ssa/internal/reachability/ReachableBlock.qll
rename to cpp/ql/lib/semmle/code/cpp/ir/implementation/unaliased_ssa/internal/reachability/ReachableBlock.qll
diff --git a/cpp/ql/src/semmle/code/cpp/ir/implementation/unaliased_ssa/internal/reachability/ReachableBlockInternal.qll b/cpp/ql/lib/semmle/code/cpp/ir/implementation/unaliased_ssa/internal/reachability/ReachableBlockInternal.qll
similarity index 100%
rename from cpp/ql/src/semmle/code/cpp/ir/implementation/unaliased_ssa/internal/reachability/ReachableBlockInternal.qll
rename to cpp/ql/lib/semmle/code/cpp/ir/implementation/unaliased_ssa/internal/reachability/ReachableBlockInternal.qll
diff --git a/cpp/ql/src/semmle/code/cpp/ir/internal/ASTValueNumbering.qll b/cpp/ql/lib/semmle/code/cpp/ir/internal/ASTValueNumbering.qll
similarity index 100%
rename from cpp/ql/src/semmle/code/cpp/ir/internal/ASTValueNumbering.qll
rename to cpp/ql/lib/semmle/code/cpp/ir/internal/ASTValueNumbering.qll
diff --git a/cpp/ql/src/semmle/code/cpp/ir/internal/CppType.qll b/cpp/ql/lib/semmle/code/cpp/ir/internal/CppType.qll
similarity index 100%
rename from cpp/ql/src/semmle/code/cpp/ir/internal/CppType.qll
rename to cpp/ql/lib/semmle/code/cpp/ir/internal/CppType.qll
diff --git a/cpp/ql/src/semmle/code/cpp/ir/internal/IRCppLanguage.qll b/cpp/ql/lib/semmle/code/cpp/ir/internal/IRCppLanguage.qll
similarity index 100%
rename from cpp/ql/src/semmle/code/cpp/ir/internal/IRCppLanguage.qll
rename to cpp/ql/lib/semmle/code/cpp/ir/internal/IRCppLanguage.qll
diff --git a/cpp/ql/src/semmle/code/cpp/ir/internal/IRUtilities.qll b/cpp/ql/lib/semmle/code/cpp/ir/internal/IRUtilities.qll
similarity index 100%
rename from cpp/ql/src/semmle/code/cpp/ir/internal/IRUtilities.qll
rename to cpp/ql/lib/semmle/code/cpp/ir/internal/IRUtilities.qll
diff --git a/cpp/ql/src/semmle/code/cpp/ir/internal/IntegerConstant.qll b/cpp/ql/lib/semmle/code/cpp/ir/internal/IntegerConstant.qll
similarity index 100%
rename from cpp/ql/src/semmle/code/cpp/ir/internal/IntegerConstant.qll
rename to cpp/ql/lib/semmle/code/cpp/ir/internal/IntegerConstant.qll
diff --git a/cpp/ql/src/semmle/code/cpp/ir/internal/IntegerInterval.qll b/cpp/ql/lib/semmle/code/cpp/ir/internal/IntegerInterval.qll
similarity index 100%
rename from cpp/ql/src/semmle/code/cpp/ir/internal/IntegerInterval.qll
rename to cpp/ql/lib/semmle/code/cpp/ir/internal/IntegerInterval.qll
diff --git a/cpp/ql/src/semmle/code/cpp/ir/internal/IntegerPartial.qll b/cpp/ql/lib/semmle/code/cpp/ir/internal/IntegerPartial.qll
similarity index 100%
rename from cpp/ql/src/semmle/code/cpp/ir/internal/IntegerPartial.qll
rename to cpp/ql/lib/semmle/code/cpp/ir/internal/IntegerPartial.qll
diff --git a/cpp/ql/src/semmle/code/cpp/ir/internal/Overlap.qll b/cpp/ql/lib/semmle/code/cpp/ir/internal/Overlap.qll
similarity index 100%
rename from cpp/ql/src/semmle/code/cpp/ir/internal/Overlap.qll
rename to cpp/ql/lib/semmle/code/cpp/ir/internal/Overlap.qll
diff --git a/cpp/ql/src/semmle/code/cpp/ir/internal/TempVariableTag.qll b/cpp/ql/lib/semmle/code/cpp/ir/internal/TempVariableTag.qll
similarity index 100%
rename from cpp/ql/src/semmle/code/cpp/ir/internal/TempVariableTag.qll
rename to cpp/ql/lib/semmle/code/cpp/ir/internal/TempVariableTag.qll
diff --git a/cpp/ql/src/semmle/code/cpp/metrics/MetricClass.qll b/cpp/ql/lib/semmle/code/cpp/metrics/MetricClass.qll
similarity index 100%
rename from cpp/ql/src/semmle/code/cpp/metrics/MetricClass.qll
rename to cpp/ql/lib/semmle/code/cpp/metrics/MetricClass.qll
diff --git a/cpp/ql/src/semmle/code/cpp/metrics/MetricFile.qll b/cpp/ql/lib/semmle/code/cpp/metrics/MetricFile.qll
similarity index 100%
rename from cpp/ql/src/semmle/code/cpp/metrics/MetricFile.qll
rename to cpp/ql/lib/semmle/code/cpp/metrics/MetricFile.qll
diff --git a/cpp/ql/src/semmle/code/cpp/metrics/MetricFunction.qll b/cpp/ql/lib/semmle/code/cpp/metrics/MetricFunction.qll
similarity index 100%
rename from cpp/ql/src/semmle/code/cpp/metrics/MetricFunction.qll
rename to cpp/ql/lib/semmle/code/cpp/metrics/MetricFunction.qll
diff --git a/cpp/ql/src/semmle/code/cpp/metrics/MetricNamespace.qll b/cpp/ql/lib/semmle/code/cpp/metrics/MetricNamespace.qll
similarity index 100%
rename from cpp/ql/src/semmle/code/cpp/metrics/MetricNamespace.qll
rename to cpp/ql/lib/semmle/code/cpp/metrics/MetricNamespace.qll
diff --git a/cpp/ql/src/semmle/code/cpp/models/Models.qll b/cpp/ql/lib/semmle/code/cpp/models/Models.qll
similarity index 100%
rename from cpp/ql/src/semmle/code/cpp/models/Models.qll
rename to cpp/ql/lib/semmle/code/cpp/models/Models.qll
diff --git a/cpp/ql/src/semmle/code/cpp/models/implementations/Accept.qll b/cpp/ql/lib/semmle/code/cpp/models/implementations/Accept.qll
similarity index 100%
rename from cpp/ql/src/semmle/code/cpp/models/implementations/Accept.qll
rename to cpp/ql/lib/semmle/code/cpp/models/implementations/Accept.qll
diff --git a/cpp/ql/src/semmle/code/cpp/models/implementations/Allocation.qll b/cpp/ql/lib/semmle/code/cpp/models/implementations/Allocation.qll
similarity index 100%
rename from cpp/ql/src/semmle/code/cpp/models/implementations/Allocation.qll
rename to cpp/ql/lib/semmle/code/cpp/models/implementations/Allocation.qll
diff --git a/cpp/ql/src/semmle/code/cpp/models/implementations/Deallocation.qll b/cpp/ql/lib/semmle/code/cpp/models/implementations/Deallocation.qll
similarity index 100%
rename from cpp/ql/src/semmle/code/cpp/models/implementations/Deallocation.qll
rename to cpp/ql/lib/semmle/code/cpp/models/implementations/Deallocation.qll
diff --git a/cpp/ql/src/semmle/code/cpp/models/implementations/Fread.qll b/cpp/ql/lib/semmle/code/cpp/models/implementations/Fread.qll
similarity index 100%
rename from cpp/ql/src/semmle/code/cpp/models/implementations/Fread.qll
rename to cpp/ql/lib/semmle/code/cpp/models/implementations/Fread.qll
diff --git a/cpp/ql/src/semmle/code/cpp/models/implementations/GetDelim.qll b/cpp/ql/lib/semmle/code/cpp/models/implementations/GetDelim.qll
similarity index 100%
rename from cpp/ql/src/semmle/code/cpp/models/implementations/GetDelim.qll
rename to cpp/ql/lib/semmle/code/cpp/models/implementations/GetDelim.qll
diff --git a/cpp/ql/src/semmle/code/cpp/models/implementations/Getenv.qll b/cpp/ql/lib/semmle/code/cpp/models/implementations/Getenv.qll
similarity index 100%
rename from cpp/ql/src/semmle/code/cpp/models/implementations/Getenv.qll
rename to cpp/ql/lib/semmle/code/cpp/models/implementations/Getenv.qll
diff --git a/cpp/ql/src/semmle/code/cpp/models/implementations/Gets.qll b/cpp/ql/lib/semmle/code/cpp/models/implementations/Gets.qll
similarity index 100%
rename from cpp/ql/src/semmle/code/cpp/models/implementations/Gets.qll
rename to cpp/ql/lib/semmle/code/cpp/models/implementations/Gets.qll
diff --git a/cpp/ql/src/semmle/code/cpp/models/implementations/IdentityFunction.qll b/cpp/ql/lib/semmle/code/cpp/models/implementations/IdentityFunction.qll
similarity index 100%
rename from cpp/ql/src/semmle/code/cpp/models/implementations/IdentityFunction.qll
rename to cpp/ql/lib/semmle/code/cpp/models/implementations/IdentityFunction.qll
diff --git a/cpp/ql/src/semmle/code/cpp/models/implementations/Inet.qll b/cpp/ql/lib/semmle/code/cpp/models/implementations/Inet.qll
similarity index 100%
rename from cpp/ql/src/semmle/code/cpp/models/implementations/Inet.qll
rename to cpp/ql/lib/semmle/code/cpp/models/implementations/Inet.qll
diff --git a/cpp/ql/src/semmle/code/cpp/models/implementations/Iterator.qll b/cpp/ql/lib/semmle/code/cpp/models/implementations/Iterator.qll
similarity index 100%
rename from cpp/ql/src/semmle/code/cpp/models/implementations/Iterator.qll
rename to cpp/ql/lib/semmle/code/cpp/models/implementations/Iterator.qll
diff --git a/cpp/ql/src/semmle/code/cpp/models/implementations/MemberFunction.qll b/cpp/ql/lib/semmle/code/cpp/models/implementations/MemberFunction.qll
similarity index 100%
rename from cpp/ql/src/semmle/code/cpp/models/implementations/MemberFunction.qll
rename to cpp/ql/lib/semmle/code/cpp/models/implementations/MemberFunction.qll
diff --git a/cpp/ql/src/semmle/code/cpp/models/implementations/Memcpy.qll b/cpp/ql/lib/semmle/code/cpp/models/implementations/Memcpy.qll
similarity index 100%
rename from cpp/ql/src/semmle/code/cpp/models/implementations/Memcpy.qll
rename to cpp/ql/lib/semmle/code/cpp/models/implementations/Memcpy.qll
diff --git a/cpp/ql/src/semmle/code/cpp/models/implementations/Memset.qll b/cpp/ql/lib/semmle/code/cpp/models/implementations/Memset.qll
similarity index 100%
rename from cpp/ql/src/semmle/code/cpp/models/implementations/Memset.qll
rename to cpp/ql/lib/semmle/code/cpp/models/implementations/Memset.qll
diff --git a/cpp/ql/src/semmle/code/cpp/models/implementations/Poll.qll b/cpp/ql/lib/semmle/code/cpp/models/implementations/Poll.qll
similarity index 100%
rename from cpp/ql/src/semmle/code/cpp/models/implementations/Poll.qll
rename to cpp/ql/lib/semmle/code/cpp/models/implementations/Poll.qll
diff --git a/cpp/ql/src/semmle/code/cpp/models/implementations/Printf.qll b/cpp/ql/lib/semmle/code/cpp/models/implementations/Printf.qll
similarity index 100%
rename from cpp/ql/src/semmle/code/cpp/models/implementations/Printf.qll
rename to cpp/ql/lib/semmle/code/cpp/models/implementations/Printf.qll
diff --git a/cpp/ql/src/semmle/code/cpp/models/implementations/Pure.qll b/cpp/ql/lib/semmle/code/cpp/models/implementations/Pure.qll
similarity index 100%
rename from cpp/ql/src/semmle/code/cpp/models/implementations/Pure.qll
rename to cpp/ql/lib/semmle/code/cpp/models/implementations/Pure.qll
diff --git a/cpp/ql/src/semmle/code/cpp/models/implementations/Recv.qll b/cpp/ql/lib/semmle/code/cpp/models/implementations/Recv.qll
similarity index 100%
rename from cpp/ql/src/semmle/code/cpp/models/implementations/Recv.qll
rename to cpp/ql/lib/semmle/code/cpp/models/implementations/Recv.qll
diff --git a/cpp/ql/src/semmle/code/cpp/models/implementations/Select.qll b/cpp/ql/lib/semmle/code/cpp/models/implementations/Select.qll
similarity index 100%
rename from cpp/ql/src/semmle/code/cpp/models/implementations/Select.qll
rename to cpp/ql/lib/semmle/code/cpp/models/implementations/Select.qll
diff --git a/cpp/ql/src/semmle/code/cpp/models/implementations/Send.qll b/cpp/ql/lib/semmle/code/cpp/models/implementations/Send.qll
similarity index 100%
rename from cpp/ql/src/semmle/code/cpp/models/implementations/Send.qll
rename to cpp/ql/lib/semmle/code/cpp/models/implementations/Send.qll
diff --git a/cpp/ql/src/semmle/code/cpp/models/implementations/SmartPointer.qll b/cpp/ql/lib/semmle/code/cpp/models/implementations/SmartPointer.qll
similarity index 100%
rename from cpp/ql/src/semmle/code/cpp/models/implementations/SmartPointer.qll
rename to cpp/ql/lib/semmle/code/cpp/models/implementations/SmartPointer.qll
diff --git a/cpp/ql/src/semmle/code/cpp/models/implementations/Sscanf.qll b/cpp/ql/lib/semmle/code/cpp/models/implementations/Sscanf.qll
similarity index 100%
rename from cpp/ql/src/semmle/code/cpp/models/implementations/Sscanf.qll
rename to cpp/ql/lib/semmle/code/cpp/models/implementations/Sscanf.qll
diff --git a/cpp/ql/src/semmle/code/cpp/models/implementations/StdContainer.qll b/cpp/ql/lib/semmle/code/cpp/models/implementations/StdContainer.qll
similarity index 100%
rename from cpp/ql/src/semmle/code/cpp/models/implementations/StdContainer.qll
rename to cpp/ql/lib/semmle/code/cpp/models/implementations/StdContainer.qll
diff --git a/cpp/ql/src/semmle/code/cpp/models/implementations/StdMap.qll b/cpp/ql/lib/semmle/code/cpp/models/implementations/StdMap.qll
similarity index 100%
rename from cpp/ql/src/semmle/code/cpp/models/implementations/StdMap.qll
rename to cpp/ql/lib/semmle/code/cpp/models/implementations/StdMap.qll
diff --git a/cpp/ql/src/semmle/code/cpp/models/implementations/StdPair.qll b/cpp/ql/lib/semmle/code/cpp/models/implementations/StdPair.qll
similarity index 100%
rename from cpp/ql/src/semmle/code/cpp/models/implementations/StdPair.qll
rename to cpp/ql/lib/semmle/code/cpp/models/implementations/StdPair.qll
diff --git a/cpp/ql/src/semmle/code/cpp/models/implementations/StdSet.qll b/cpp/ql/lib/semmle/code/cpp/models/implementations/StdSet.qll
similarity index 100%
rename from cpp/ql/src/semmle/code/cpp/models/implementations/StdSet.qll
rename to cpp/ql/lib/semmle/code/cpp/models/implementations/StdSet.qll
diff --git a/cpp/ql/src/semmle/code/cpp/models/implementations/StdString.qll b/cpp/ql/lib/semmle/code/cpp/models/implementations/StdString.qll
similarity index 100%
rename from cpp/ql/src/semmle/code/cpp/models/implementations/StdString.qll
rename to cpp/ql/lib/semmle/code/cpp/models/implementations/StdString.qll
diff --git a/cpp/ql/src/semmle/code/cpp/models/implementations/Strcat.qll b/cpp/ql/lib/semmle/code/cpp/models/implementations/Strcat.qll
similarity index 100%
rename from cpp/ql/src/semmle/code/cpp/models/implementations/Strcat.qll
rename to cpp/ql/lib/semmle/code/cpp/models/implementations/Strcat.qll
diff --git a/cpp/ql/src/semmle/code/cpp/models/implementations/Strcpy.qll b/cpp/ql/lib/semmle/code/cpp/models/implementations/Strcpy.qll
similarity index 100%
rename from cpp/ql/src/semmle/code/cpp/models/implementations/Strcpy.qll
rename to cpp/ql/lib/semmle/code/cpp/models/implementations/Strcpy.qll
diff --git a/cpp/ql/src/semmle/code/cpp/models/implementations/Strcrement.qll b/cpp/ql/lib/semmle/code/cpp/models/implementations/Strcrement.qll
similarity index 100%
rename from cpp/ql/src/semmle/code/cpp/models/implementations/Strcrement.qll
rename to cpp/ql/lib/semmle/code/cpp/models/implementations/Strcrement.qll
diff --git a/cpp/ql/src/semmle/code/cpp/models/implementations/Strdup.qll b/cpp/ql/lib/semmle/code/cpp/models/implementations/Strdup.qll
similarity index 79%
rename from cpp/ql/src/semmle/code/cpp/models/implementations/Strdup.qll
rename to cpp/ql/lib/semmle/code/cpp/models/implementations/Strdup.qll
index e2443b8151c..51d496fc69e 100644
--- a/cpp/ql/src/semmle/code/cpp/models/implementations/Strdup.qll
+++ b/cpp/ql/lib/semmle/code/cpp/models/implementations/Strdup.qll
@@ -16,6 +16,7 @@ private class StrdupFunction extends AllocationFunction, ArrayFunction, DataFlow
hasGlobalName([
// --- C library allocation
"strdup", // strdup(str)
+ "strdupa", // strdupa(str) - returns stack allocated buffer
"wcsdup", // wcsdup(str)
"_strdup", // _strdup(str)
"_wcsdup", // _wcsdup(str)
@@ -31,6 +32,8 @@ private class StrdupFunction extends AllocationFunction, ArrayFunction, DataFlow
input.isParameterDeref(0) and
output.isReturnValueDeref()
}
+
+ override predicate requiresDealloc() { not hasGlobalName("strdupa") }
}
/**
@@ -38,11 +41,11 @@ private class StrdupFunction extends AllocationFunction, ArrayFunction, DataFlow
*/
private class StrndupFunction extends AllocationFunction, ArrayFunction, DataFlowFunction {
StrndupFunction() {
- exists(string name |
- hasGlobalName(name) and
- // --- C library allocation
- name = "strndup" // strndup(str, maxlen)
- )
+ hasGlobalName([
+ // -- C library allocation
+ "strndup", // strndup(str, maxlen)
+ "strndupa" // strndupa(str, maxlen) -- returns stack allocated buffer
+ ])
}
override predicate hasArrayInput(int bufParam) { bufParam = 0 }
@@ -56,4 +59,6 @@ private class StrndupFunction extends AllocationFunction, ArrayFunction, DataFlo
) and
output.isReturnValueDeref()
}
+
+ override predicate requiresDealloc() { not hasGlobalName("strndupa") }
}
diff --git a/cpp/ql/src/semmle/code/cpp/models/implementations/Strftime.qll b/cpp/ql/lib/semmle/code/cpp/models/implementations/Strftime.qll
similarity index 100%
rename from cpp/ql/src/semmle/code/cpp/models/implementations/Strftime.qll
rename to cpp/ql/lib/semmle/code/cpp/models/implementations/Strftime.qll
diff --git a/cpp/ql/src/semmle/code/cpp/models/implementations/Strnextc.qll b/cpp/ql/lib/semmle/code/cpp/models/implementations/Strnextc.qll
similarity index 100%
rename from cpp/ql/src/semmle/code/cpp/models/implementations/Strnextc.qll
rename to cpp/ql/lib/semmle/code/cpp/models/implementations/Strnextc.qll
diff --git a/cpp/ql/src/semmle/code/cpp/models/implementations/Strset.qll b/cpp/ql/lib/semmle/code/cpp/models/implementations/Strset.qll
similarity index 100%
rename from cpp/ql/src/semmle/code/cpp/models/implementations/Strset.qll
rename to cpp/ql/lib/semmle/code/cpp/models/implementations/Strset.qll
diff --git a/cpp/ql/src/semmle/code/cpp/models/implementations/Strtok.qll b/cpp/ql/lib/semmle/code/cpp/models/implementations/Strtok.qll
similarity index 100%
rename from cpp/ql/src/semmle/code/cpp/models/implementations/Strtok.qll
rename to cpp/ql/lib/semmle/code/cpp/models/implementations/Strtok.qll
diff --git a/cpp/ql/src/semmle/code/cpp/models/implementations/Swap.qll b/cpp/ql/lib/semmle/code/cpp/models/implementations/Swap.qll
similarity index 100%
rename from cpp/ql/src/semmle/code/cpp/models/implementations/Swap.qll
rename to cpp/ql/lib/semmle/code/cpp/models/implementations/Swap.qll
diff --git a/cpp/ql/src/semmle/code/cpp/models/interfaces/Alias.qll b/cpp/ql/lib/semmle/code/cpp/models/interfaces/Alias.qll
similarity index 100%
rename from cpp/ql/src/semmle/code/cpp/models/interfaces/Alias.qll
rename to cpp/ql/lib/semmle/code/cpp/models/interfaces/Alias.qll
diff --git a/cpp/ql/src/semmle/code/cpp/models/interfaces/Allocation.qll b/cpp/ql/lib/semmle/code/cpp/models/interfaces/Allocation.qll
similarity index 100%
rename from cpp/ql/src/semmle/code/cpp/models/interfaces/Allocation.qll
rename to cpp/ql/lib/semmle/code/cpp/models/interfaces/Allocation.qll
diff --git a/cpp/ql/src/semmle/code/cpp/models/interfaces/ArrayFunction.qll b/cpp/ql/lib/semmle/code/cpp/models/interfaces/ArrayFunction.qll
similarity index 100%
rename from cpp/ql/src/semmle/code/cpp/models/interfaces/ArrayFunction.qll
rename to cpp/ql/lib/semmle/code/cpp/models/interfaces/ArrayFunction.qll
diff --git a/cpp/ql/src/semmle/code/cpp/models/interfaces/DataFlow.qll b/cpp/ql/lib/semmle/code/cpp/models/interfaces/DataFlow.qll
similarity index 100%
rename from cpp/ql/src/semmle/code/cpp/models/interfaces/DataFlow.qll
rename to cpp/ql/lib/semmle/code/cpp/models/interfaces/DataFlow.qll
diff --git a/cpp/ql/src/semmle/code/cpp/models/interfaces/Deallocation.qll b/cpp/ql/lib/semmle/code/cpp/models/interfaces/Deallocation.qll
similarity index 100%
rename from cpp/ql/src/semmle/code/cpp/models/interfaces/Deallocation.qll
rename to cpp/ql/lib/semmle/code/cpp/models/interfaces/Deallocation.qll
diff --git a/cpp/ql/src/semmle/code/cpp/models/interfaces/FlowSource.qll b/cpp/ql/lib/semmle/code/cpp/models/interfaces/FlowSource.qll
similarity index 100%
rename from cpp/ql/src/semmle/code/cpp/models/interfaces/FlowSource.qll
rename to cpp/ql/lib/semmle/code/cpp/models/interfaces/FlowSource.qll
diff --git a/cpp/ql/src/semmle/code/cpp/models/interfaces/FormattingFunction.qll b/cpp/ql/lib/semmle/code/cpp/models/interfaces/FormattingFunction.qll
similarity index 100%
rename from cpp/ql/src/semmle/code/cpp/models/interfaces/FormattingFunction.qll
rename to cpp/ql/lib/semmle/code/cpp/models/interfaces/FormattingFunction.qll
diff --git a/cpp/ql/src/semmle/code/cpp/models/interfaces/FunctionInputsAndOutputs.qll b/cpp/ql/lib/semmle/code/cpp/models/interfaces/FunctionInputsAndOutputs.qll
similarity index 100%
rename from cpp/ql/src/semmle/code/cpp/models/interfaces/FunctionInputsAndOutputs.qll
rename to cpp/ql/lib/semmle/code/cpp/models/interfaces/FunctionInputsAndOutputs.qll
diff --git a/cpp/ql/src/semmle/code/cpp/models/interfaces/Iterator.qll b/cpp/ql/lib/semmle/code/cpp/models/interfaces/Iterator.qll
similarity index 100%
rename from cpp/ql/src/semmle/code/cpp/models/interfaces/Iterator.qll
rename to cpp/ql/lib/semmle/code/cpp/models/interfaces/Iterator.qll
diff --git a/cpp/ql/src/semmle/code/cpp/models/interfaces/PointerWrapper.qll b/cpp/ql/lib/semmle/code/cpp/models/interfaces/PointerWrapper.qll
similarity index 100%
rename from cpp/ql/src/semmle/code/cpp/models/interfaces/PointerWrapper.qll
rename to cpp/ql/lib/semmle/code/cpp/models/interfaces/PointerWrapper.qll
diff --git a/cpp/ql/src/semmle/code/cpp/models/interfaces/SideEffect.qll b/cpp/ql/lib/semmle/code/cpp/models/interfaces/SideEffect.qll
similarity index 100%
rename from cpp/ql/src/semmle/code/cpp/models/interfaces/SideEffect.qll
rename to cpp/ql/lib/semmle/code/cpp/models/interfaces/SideEffect.qll
diff --git a/cpp/ql/src/semmle/code/cpp/models/interfaces/Taint.qll b/cpp/ql/lib/semmle/code/cpp/models/interfaces/Taint.qll
similarity index 100%
rename from cpp/ql/src/semmle/code/cpp/models/interfaces/Taint.qll
rename to cpp/ql/lib/semmle/code/cpp/models/interfaces/Taint.qll
diff --git a/cpp/ql/src/semmle/code/cpp/padding/ConsistencyCheck.ql b/cpp/ql/lib/semmle/code/cpp/padding/ConsistencyCheck.ql
similarity index 100%
rename from cpp/ql/src/semmle/code/cpp/padding/ConsistencyCheck.ql
rename to cpp/ql/lib/semmle/code/cpp/padding/ConsistencyCheck.ql
diff --git a/cpp/ql/src/semmle/code/cpp/padding/Padding.qll b/cpp/ql/lib/semmle/code/cpp/padding/Padding.qll
similarity index 100%
rename from cpp/ql/src/semmle/code/cpp/padding/Padding.qll
rename to cpp/ql/lib/semmle/code/cpp/padding/Padding.qll
diff --git a/cpp/ql/src/semmle/code/cpp/pointsto/CallGraph.qll b/cpp/ql/lib/semmle/code/cpp/pointsto/CallGraph.qll
similarity index 100%
rename from cpp/ql/src/semmle/code/cpp/pointsto/CallGraph.qll
rename to cpp/ql/lib/semmle/code/cpp/pointsto/CallGraph.qll
diff --git a/cpp/ql/src/semmle/code/cpp/pointsto/PointsTo.qll b/cpp/ql/lib/semmle/code/cpp/pointsto/PointsTo.qll
similarity index 100%
rename from cpp/ql/src/semmle/code/cpp/pointsto/PointsTo.qll
rename to cpp/ql/lib/semmle/code/cpp/pointsto/PointsTo.qll
diff --git a/cpp/ql/src/semmle/code/cpp/rangeanalysis/NanAnalysis.qll b/cpp/ql/lib/semmle/code/cpp/rangeanalysis/NanAnalysis.qll
similarity index 100%
rename from cpp/ql/src/semmle/code/cpp/rangeanalysis/NanAnalysis.qll
rename to cpp/ql/lib/semmle/code/cpp/rangeanalysis/NanAnalysis.qll
diff --git a/cpp/ql/src/semmle/code/cpp/rangeanalysis/PointlessComparison.qll b/cpp/ql/lib/semmle/code/cpp/rangeanalysis/PointlessComparison.qll
similarity index 100%
rename from cpp/ql/src/semmle/code/cpp/rangeanalysis/PointlessComparison.qll
rename to cpp/ql/lib/semmle/code/cpp/rangeanalysis/PointlessComparison.qll
diff --git a/cpp/ql/src/semmle/code/cpp/rangeanalysis/RangeAnalysisUtils.qll b/cpp/ql/lib/semmle/code/cpp/rangeanalysis/RangeAnalysisUtils.qll
similarity index 100%
rename from cpp/ql/src/semmle/code/cpp/rangeanalysis/RangeAnalysisUtils.qll
rename to cpp/ql/lib/semmle/code/cpp/rangeanalysis/RangeAnalysisUtils.qll
diff --git a/cpp/ql/src/semmle/code/cpp/rangeanalysis/RangeSSA.qll b/cpp/ql/lib/semmle/code/cpp/rangeanalysis/RangeSSA.qll
similarity index 100%
rename from cpp/ql/src/semmle/code/cpp/rangeanalysis/RangeSSA.qll
rename to cpp/ql/lib/semmle/code/cpp/rangeanalysis/RangeSSA.qll
diff --git a/cpp/ql/src/semmle/code/cpp/rangeanalysis/SimpleRangeAnalysis.qll b/cpp/ql/lib/semmle/code/cpp/rangeanalysis/SimpleRangeAnalysis.qll
similarity index 100%
rename from cpp/ql/src/semmle/code/cpp/rangeanalysis/SimpleRangeAnalysis.qll
rename to cpp/ql/lib/semmle/code/cpp/rangeanalysis/SimpleRangeAnalysis.qll
diff --git a/cpp/ql/src/semmle/code/cpp/security/BufferAccess.qll b/cpp/ql/lib/semmle/code/cpp/security/BufferAccess.qll
similarity index 100%
rename from cpp/ql/src/semmle/code/cpp/security/BufferAccess.qll
rename to cpp/ql/lib/semmle/code/cpp/security/BufferAccess.qll
diff --git a/cpp/ql/src/semmle/code/cpp/security/BufferWrite.qll b/cpp/ql/lib/semmle/code/cpp/security/BufferWrite.qll
similarity index 100%
rename from cpp/ql/src/semmle/code/cpp/security/BufferWrite.qll
rename to cpp/ql/lib/semmle/code/cpp/security/BufferWrite.qll
diff --git a/cpp/ql/src/semmle/code/cpp/security/CommandExecution.qll b/cpp/ql/lib/semmle/code/cpp/security/CommandExecution.qll
similarity index 100%
rename from cpp/ql/src/semmle/code/cpp/security/CommandExecution.qll
rename to cpp/ql/lib/semmle/code/cpp/security/CommandExecution.qll
diff --git a/cpp/ql/src/semmle/code/cpp/security/Encryption.qll b/cpp/ql/lib/semmle/code/cpp/security/Encryption.qll
similarity index 100%
rename from cpp/ql/src/semmle/code/cpp/security/Encryption.qll
rename to cpp/ql/lib/semmle/code/cpp/security/Encryption.qll
diff --git a/cpp/ql/src/semmle/code/cpp/security/FileWrite.qll b/cpp/ql/lib/semmle/code/cpp/security/FileWrite.qll
similarity index 100%
rename from cpp/ql/src/semmle/code/cpp/security/FileWrite.qll
rename to cpp/ql/lib/semmle/code/cpp/security/FileWrite.qll
diff --git a/cpp/ql/src/semmle/code/cpp/security/FlowSources.qll b/cpp/ql/lib/semmle/code/cpp/security/FlowSources.qll
similarity index 100%
rename from cpp/ql/src/semmle/code/cpp/security/FlowSources.qll
rename to cpp/ql/lib/semmle/code/cpp/security/FlowSources.qll
diff --git a/cpp/ql/src/semmle/code/cpp/security/FunctionWithWrappers.qll b/cpp/ql/lib/semmle/code/cpp/security/FunctionWithWrappers.qll
similarity index 100%
rename from cpp/ql/src/semmle/code/cpp/security/FunctionWithWrappers.qll
rename to cpp/ql/lib/semmle/code/cpp/security/FunctionWithWrappers.qll
diff --git a/cpp/ql/src/semmle/code/cpp/security/OutputWrite.qll b/cpp/ql/lib/semmle/code/cpp/security/OutputWrite.qll
similarity index 100%
rename from cpp/ql/src/semmle/code/cpp/security/OutputWrite.qll
rename to cpp/ql/lib/semmle/code/cpp/security/OutputWrite.qll
diff --git a/cpp/ql/src/semmle/code/cpp/security/Overflow.qll b/cpp/ql/lib/semmle/code/cpp/security/Overflow.qll
similarity index 100%
rename from cpp/ql/src/semmle/code/cpp/security/Overflow.qll
rename to cpp/ql/lib/semmle/code/cpp/security/Overflow.qll
diff --git a/cpp/ql/src/semmle/code/cpp/security/PrintfLike.qll b/cpp/ql/lib/semmle/code/cpp/security/PrintfLike.qll
similarity index 100%
rename from cpp/ql/src/semmle/code/cpp/security/PrintfLike.qll
rename to cpp/ql/lib/semmle/code/cpp/security/PrintfLike.qll
diff --git a/cpp/ql/src/semmle/code/cpp/security/Security.qll b/cpp/ql/lib/semmle/code/cpp/security/Security.qll
similarity index 100%
rename from cpp/ql/src/semmle/code/cpp/security/Security.qll
rename to cpp/ql/lib/semmle/code/cpp/security/Security.qll
diff --git a/cpp/ql/src/semmle/code/cpp/security/SecurityOptions.qll b/cpp/ql/lib/semmle/code/cpp/security/SecurityOptions.qll
similarity index 100%
rename from cpp/ql/src/semmle/code/cpp/security/SecurityOptions.qll
rename to cpp/ql/lib/semmle/code/cpp/security/SecurityOptions.qll
diff --git a/cpp/ql/src/semmle/code/cpp/security/SensitiveExprs.qll b/cpp/ql/lib/semmle/code/cpp/security/SensitiveExprs.qll
similarity index 100%
rename from cpp/ql/src/semmle/code/cpp/security/SensitiveExprs.qll
rename to cpp/ql/lib/semmle/code/cpp/security/SensitiveExprs.qll
diff --git a/cpp/ql/src/semmle/code/cpp/security/TaintTracking.qll b/cpp/ql/lib/semmle/code/cpp/security/TaintTracking.qll
similarity index 100%
rename from cpp/ql/src/semmle/code/cpp/security/TaintTracking.qll
rename to cpp/ql/lib/semmle/code/cpp/security/TaintTracking.qll
diff --git a/cpp/ql/src/semmle/code/cpp/security/TaintTrackingImpl.qll b/cpp/ql/lib/semmle/code/cpp/security/TaintTrackingImpl.qll
similarity index 100%
rename from cpp/ql/src/semmle/code/cpp/security/TaintTrackingImpl.qll
rename to cpp/ql/lib/semmle/code/cpp/security/TaintTrackingImpl.qll
diff --git a/cpp/ql/src/semmle/code/cpp/security/boostorg/asio/protocols.qll b/cpp/ql/lib/semmle/code/cpp/security/boostorg/asio/protocols.qll
similarity index 100%
rename from cpp/ql/src/semmle/code/cpp/security/boostorg/asio/protocols.qll
rename to cpp/ql/lib/semmle/code/cpp/security/boostorg/asio/protocols.qll
diff --git a/cpp/ql/src/semmle/code/cpp/stmts/Block.qll b/cpp/ql/lib/semmle/code/cpp/stmts/Block.qll
similarity index 100%
rename from cpp/ql/src/semmle/code/cpp/stmts/Block.qll
rename to cpp/ql/lib/semmle/code/cpp/stmts/Block.qll
diff --git a/cpp/ql/src/semmle/code/cpp/stmts/Stmt.qll b/cpp/ql/lib/semmle/code/cpp/stmts/Stmt.qll
similarity index 100%
rename from cpp/ql/src/semmle/code/cpp/stmts/Stmt.qll
rename to cpp/ql/lib/semmle/code/cpp/stmts/Stmt.qll
diff --git a/cpp/ql/src/semmle/code/cpp/valuenumbering/GlobalValueNumbering.qll b/cpp/ql/lib/semmle/code/cpp/valuenumbering/GlobalValueNumbering.qll
similarity index 100%
rename from cpp/ql/src/semmle/code/cpp/valuenumbering/GlobalValueNumbering.qll
rename to cpp/ql/lib/semmle/code/cpp/valuenumbering/GlobalValueNumbering.qll
diff --git a/cpp/ql/src/semmle/code/cpp/valuenumbering/GlobalValueNumberingImpl.qll b/cpp/ql/lib/semmle/code/cpp/valuenumbering/GlobalValueNumberingImpl.qll
similarity index 100%
rename from cpp/ql/src/semmle/code/cpp/valuenumbering/GlobalValueNumberingImpl.qll
rename to cpp/ql/lib/semmle/code/cpp/valuenumbering/GlobalValueNumberingImpl.qll
diff --git a/cpp/ql/src/semmle/code/cpp/valuenumbering/HashCons.qll b/cpp/ql/lib/semmle/code/cpp/valuenumbering/HashCons.qll
similarity index 100%
rename from cpp/ql/src/semmle/code/cpp/valuenumbering/HashCons.qll
rename to cpp/ql/lib/semmle/code/cpp/valuenumbering/HashCons.qll
diff --git a/cpp/ql/src/semmle/files/FileSystem.qll b/cpp/ql/lib/semmle/files/FileSystem.qll
similarity index 100%
rename from cpp/ql/src/semmle/files/FileSystem.qll
rename to cpp/ql/lib/semmle/files/FileSystem.qll
diff --git a/cpp/ql/src/semmlecode.cpp.dbscheme b/cpp/ql/lib/semmlecode.cpp.dbscheme
similarity index 100%
rename from cpp/ql/src/semmlecode.cpp.dbscheme
rename to cpp/ql/lib/semmlecode.cpp.dbscheme
diff --git a/cpp/ql/src/semmlecode.cpp.dbscheme.stats b/cpp/ql/lib/semmlecode.cpp.dbscheme.stats
similarity index 100%
rename from cpp/ql/src/semmlecode.cpp.dbscheme.stats
rename to cpp/ql/lib/semmlecode.cpp.dbscheme.stats
diff --git a/cpp/ql/src/Likely Bugs/Conversion/ImplicitDowncastFromBitfield.ql b/cpp/ql/src/Likely Bugs/Conversion/ImplicitDowncastFromBitfield.ql
index 8ad98ed8d88..c2e7e4a6b90 100644
--- a/cpp/ql/src/Likely Bugs/Conversion/ImplicitDowncastFromBitfield.ql
+++ b/cpp/ql/src/Likely Bugs/Conversion/ImplicitDowncastFromBitfield.ql
@@ -13,10 +13,15 @@
import cpp
-from BitField fi, VariableAccess va
+from BitField fi, VariableAccess va, Type fct
where
- fi.getNumBits() > va.getFullyConverted().getType().getSize() * 8 and
- va.getExplicitlyConverted().getType().getSize() > va.getFullyConverted().getType().getSize() and
+ (
+ if va.getFullyConverted().getType() instanceof ReferenceType
+ then fct = va.getFullyConverted().getType().(ReferenceType).getBaseType()
+ else fct = va.getFullyConverted().getType()
+ ) and
+ fi.getNumBits() > fct.getSize() * 8 and
+ va.getExplicitlyConverted().getType().getSize() > fct.getSize() and
va.getTarget() = fi and
- not va.getActualType() instanceof BoolType
+ not fct.getUnspecifiedType() instanceof BoolType
select va, "Implicit downcast of bitfield $@", fi, fi.toString()
diff --git a/cpp/ql/src/Security/CWE/CWE-676/PotentiallyDangerousFunction.qhelp b/cpp/ql/src/Security/CWE/CWE-676/PotentiallyDangerousFunction.qhelp
index d3dd40df132..55fc7dcb722 100644
--- a/cpp/ql/src/Security/CWE/CWE-676/PotentiallyDangerousFunction.qhelp
+++ b/cpp/ql/src/Security/CWE/CWE-676/PotentiallyDangerousFunction.qhelp
@@ -26,7 +26,7 @@ can use their own storage.
Similarly replace calls to localtime with
localtime_r, calls to ctime with
ctime_r and calls to asctime with
-asctime_r.
+asctime_r (if those functions exist on your platform).
diff --git a/cpp/ql/src/Security/CWE/CWE-676/PotentiallyDangerousFunction.ql b/cpp/ql/src/Security/CWE/CWE-676/PotentiallyDangerousFunction.ql
index 4e281b238bc..a77c3ce7a1e 100644
--- a/cpp/ql/src/Security/CWE/CWE-676/PotentiallyDangerousFunction.ql
+++ b/cpp/ql/src/Security/CWE/CWE-676/PotentiallyDangerousFunction.ql
@@ -4,7 +4,7 @@
* @kind problem
* @problem.severity warning
* @security-severity 10.0
- * @precision high
+ * @precision medium
* @id cpp/potentially-dangerous-function
* @tags reliability
* security
diff --git a/cpp/ql/src/codeql-suites/cpp-code-scanning.qls b/cpp/ql/src/codeql-suites/cpp-code-scanning.qls
index f811010a26a..219ee5d9534 100644
--- a/cpp/ql/src/codeql-suites/cpp-code-scanning.qls
+++ b/cpp/ql/src/codeql-suites/cpp-code-scanning.qls
@@ -1,6 +1,6 @@
- description: Standard Code Scanning queries for C and C++
-- qlpack: codeql-cpp
+- queries: .
- apply: code-scanning-selectors.yml
- from: codeql-suite-helpers
+ from: codeql/suite-helpers
- apply: codeql-suites/exclude-slow-queries.yml
from: codeql-cpp
diff --git a/cpp/ql/src/codeql-suites/cpp-lgtm-full.qls b/cpp/ql/src/codeql-suites/cpp-lgtm-full.qls
index b6775597c30..53207e8e5e5 100644
--- a/cpp/ql/src/codeql-suites/cpp-lgtm-full.qls
+++ b/cpp/ql/src/codeql-suites/cpp-lgtm-full.qls
@@ -1,9 +1,9 @@
- description: Standard LGTM queries for C/C++, including ones not displayed by default
-- qlpack: codeql-cpp
+- queries: .
- apply: lgtm-selectors.yml
- from: codeql-suite-helpers
+ from: codeql/suite-helpers
- apply: codeql-suites/exclude-slow-queries.yml
- from: codeql-cpp
+ from: codeql-cpp
# These are only for IDE use.
- exclude:
tags contain:
diff --git a/cpp/ql/src/codeql-suites/cpp-lgtm.qls b/cpp/ql/src/codeql-suites/cpp-lgtm.qls
index fe06e19b7fa..fe88b035276 100644
--- a/cpp/ql/src/codeql-suites/cpp-lgtm.qls
+++ b/cpp/ql/src/codeql-suites/cpp-lgtm.qls
@@ -1,4 +1,4 @@
- description: Standard LGTM queries for C/C++
- apply: codeql-suites/cpp-lgtm-full.qls
- apply: lgtm-displayed-only.yml
- from: codeql-suite-helpers
+ from: codeql/suite-helpers
diff --git a/cpp/ql/src/codeql-suites/cpp-security-and-quality.qls b/cpp/ql/src/codeql-suites/cpp-security-and-quality.qls
index 297f46bc752..351cee3c772 100644
--- a/cpp/ql/src/codeql-suites/cpp-security-and-quality.qls
+++ b/cpp/ql/src/codeql-suites/cpp-security-and-quality.qls
@@ -1,6 +1,6 @@
- description: Security-and-quality queries for C and C++
-- qlpack: codeql-cpp
+- queries: .
- apply: security-and-quality-selectors.yml
- from: codeql-suite-helpers
+ from: codeql/suite-helpers
- apply: codeql-suites/exclude-slow-queries.yml
from: codeql-cpp
diff --git a/cpp/ql/src/codeql-suites/cpp-security-extended.qls b/cpp/ql/src/codeql-suites/cpp-security-extended.qls
index fa69559add0..63e23300d26 100644
--- a/cpp/ql/src/codeql-suites/cpp-security-extended.qls
+++ b/cpp/ql/src/codeql-suites/cpp-security-extended.qls
@@ -1,6 +1,6 @@
- description: Security-extended queries for C and C++
-- qlpack: codeql-cpp
+- queries: .
- apply: security-extended-selectors.yml
- from: codeql-suite-helpers
+ from: codeql/suite-helpers
- apply: codeql-suites/exclude-slow-queries.yml
from: codeql-cpp
diff --git a/cpp/ql/src/experimental/Security/CWE/CWE-758/UndefinedOrImplementationDefinedBehavior.ql b/cpp/ql/src/experimental/Security/CWE/CWE-758/UndefinedOrImplementationDefinedBehavior.ql
index a1dce27f81c..bafe3d13b84 100644
--- a/cpp/ql/src/experimental/Security/CWE/CWE-758/UndefinedOrImplementationDefinedBehavior.ql
+++ b/cpp/ql/src/experimental/Security/CWE/CWE-758/UndefinedOrImplementationDefinedBehavior.ql
@@ -163,4 +163,5 @@ where
or
eots.dangerousCrementChanges()
)
-select eots, "This expression may have undefined behavior."
+select eots,
+ "This expression may have undefined behavior, because the order of evaluation is not specified."
diff --git a/cpp/ql/src/qlpack.lock.yml b/cpp/ql/src/qlpack.lock.yml
new file mode 100644
index 00000000000..06dd07fc7dc
--- /dev/null
+++ b/cpp/ql/src/qlpack.lock.yml
@@ -0,0 +1,4 @@
+---
+dependencies: {}
+compiled: false
+lockVersion: 1.0.0
diff --git a/cpp/ql/src/qlpack.yml b/cpp/ql/src/qlpack.yml
index 45ae614f88e..02df2db69a6 100644
--- a/cpp/ql/src/qlpack.yml
+++ b/cpp/ql/src/qlpack.yml
@@ -1,5 +1,8 @@
-name: codeql-cpp
-version: 0.0.0
-dbscheme: semmlecode.cpp.dbscheme
+name: codeql/cpp-queries
+version: 0.0.2
+dependencies:
+ codeql/cpp-all: ^0.0.2
+ codeql/suite-helpers: ^0.0.2
suites: codeql-suites
extractor: cpp
+defaultSuiteFile: codeql-suites/cpp-code-scanning.qls
diff --git a/cpp/ql/test/experimental/query-tests/Security/CWE/CWE-758/semmle/tests/UndefinedOrImplementationDefinedBehavior.expected b/cpp/ql/test/experimental/query-tests/Security/CWE/CWE-758/semmle/tests/UndefinedOrImplementationDefinedBehavior.expected
index 43ac03030dd..28585cefb0d 100644
--- a/cpp/ql/test/experimental/query-tests/Security/CWE/CWE-758/semmle/tests/UndefinedOrImplementationDefinedBehavior.expected
+++ b/cpp/ql/test/experimental/query-tests/Security/CWE/CWE-758/semmle/tests/UndefinedOrImplementationDefinedBehavior.expected
@@ -1,3 +1,3 @@
-| test.c:13:10:13:21 | call to tmpFunction1 | This expression may have undefined behavior. |
-| test.c:13:30:13:41 | call to tmpFunction2 | This expression may have undefined behavior. |
-| test.c:16:15:16:20 | ... ++ | This expression may have undefined behavior. |
+| test.c:13:10:13:21 | call to tmpFunction1 | This expression may have undefined behavior, because the order of evaluation is not specified. |
+| test.c:13:30:13:41 | call to tmpFunction2 | This expression may have undefined behavior, because the order of evaluation is not specified. |
+| test.c:16:15:16:20 | ... ++ | This expression may have undefined behavior, because the order of evaluation is not specified. |
diff --git a/cpp/ql/test/library-tests/clang_ms/element.expected b/cpp/ql/test/library-tests/clang_ms/element.expected
deleted file mode 100644
index f3272a9b3d5..00000000000
--- a/cpp/ql/test/library-tests/clang_ms/element.expected
+++ /dev/null
@@ -1,156 +0,0 @@
-| clang_ms.cpp:0:0:0:0 | clang_ms.cpp |
-| clang_ms.cpp:1:12:1:16 | align |
-| clang_ms.cpp:1:18:1:19 | 32 |
-| clang_ms.cpp:1:30:1:30 | declaration of operator= |
-| clang_ms.cpp:1:30:1:30 | declaration of operator= |
-| clang_ms.cpp:1:30:1:30 | operator= |
-| clang_ms.cpp:1:30:1:30 | operator= |
-| clang_ms.cpp:1:30:1:37 | definition of mystruct |
-| clang_ms.cpp:1:30:1:37 | mystruct |
-| clang_ms.cpp:1:47:1:53 | definition of myshort |
-| clang_ms.cpp:1:47:1:53 | myshort |
-| clang_ms.cpp:3:5:3:8 | definition of main |
-| clang_ms.cpp:3:5:3:8 | main |
-| clang_ms.cpp:3:16:5:1 | { ... } |
-| clang_ms.cpp:4:5:4:17 | return ... |
-| clang_ms.cpp:4:12:4:16 | 0 |
-| clang_ms.cpp:4:12:4:16 | (int)... |
-| clang_ms.cpp:7:6:7:11 | declaration of ms_asm |
-| clang_ms.cpp:7:6:7:11 | ms_asm |
-| clang_ms.cpp:10:6:10:12 | definition of gnu_asm |
-| clang_ms.cpp:10:6:10:12 | gnu_asm |
-| clang_ms.cpp:10:16:12:1 | { ... } |
-| clang_ms.cpp:11:5:11:13 | asm statement |
-| clang_ms.cpp:12:1:12:1 | return ... |
-| clang_ms.cpp:16:1:16:19 | // Test for CPP-184 |
-| clang_ms.cpp:17:1:17:32 | #pragma |
-| clang_ms.cpp:18:1:18:31 | #pragma |
-| file://:0:0:0:0 | |
-| file://:0:0:0:0 | & |
-| file://:0:0:0:0 | && |
-| file://:0:0:0:0 | (global namespace) |
-| file://:0:0:0:0 | (unnamed parameter 0) |
-| file://:0:0:0:0 | (unnamed parameter 0) |
-| file://:0:0:0:0 | (unnamed parameter 0) |
-| file://:0:0:0:0 | (unnamed parameter 0) |
-| file://:0:0:0:0 | _Complex __float128 |
-| file://:0:0:0:0 | _Complex double |
-| file://:0:0:0:0 | _Complex float |
-| file://:0:0:0:0 | _Complex long double |
-| file://:0:0:0:0 | _Decimal32 |
-| file://:0:0:0:0 | _Decimal64 |
-| file://:0:0:0:0 | _Decimal128 |
-| file://:0:0:0:0 | _Float32 |
-| file://:0:0:0:0 | _Float32x |
-| file://:0:0:0:0 | _Float64 |
-| file://:0:0:0:0 | _Float64x |
-| file://:0:0:0:0 | _Float128 |
-| file://:0:0:0:0 | _Float128x |
-| file://:0:0:0:0 | _Imaginary double |
-| file://:0:0:0:0 | _Imaginary float |
-| file://:0:0:0:0 | _Imaginary long double |
-| file://:0:0:0:0 | __block |
-| file://:0:0:0:0 | __float128 |
-| file://:0:0:0:0 | __int128 |
-| file://:0:0:0:0 | __interface |
-| file://:0:0:0:0 | __ptr32 |
-| file://:0:0:0:0 | __ptr64 |
-| file://:0:0:0:0 | __sptr |
-| file://:0:0:0:0 | __super |
-| file://:0:0:0:0 | __uptr |
-| file://:0:0:0:0 | __va_list_tag |
-| file://:0:0:0:0 | __va_list_tag & |
-| file://:0:0:0:0 | __va_list_tag && |
-| file://:0:0:0:0 | abstract |
-| file://:0:0:0:0 | atomic |
-| file://:0:0:0:0 | auto |
-| file://:0:0:0:0 | auto |
-| file://:0:0:0:0 | bool |
-| file://:0:0:0:0 | char |
-| file://:0:0:0:0 | char8_t |
-| file://:0:0:0:0 | char16_t |
-| file://:0:0:0:0 | char32_t |
-| file://:0:0:0:0 | const |
-| file://:0:0:0:0 | const __va_list_tag |
-| file://:0:0:0:0 | const __va_list_tag & |
-| file://:0:0:0:0 | const mystruct |
-| file://:0:0:0:0 | const mystruct & |
-| file://:0:0:0:0 | declaration of 1st parameter |
-| file://:0:0:0:0 | declaration of 1st parameter |
-| file://:0:0:0:0 | declared_constexpr |
-| file://:0:0:0:0 | declared_constinit |
-| file://:0:0:0:0 | declared_virtual |
-| file://:0:0:0:0 | decltype(nullptr) |
-| file://:0:0:0:0 | definition of fp_offset |
-| file://:0:0:0:0 | definition of gp_offset |
-| file://:0:0:0:0 | definition of overflow_arg_area |
-| file://:0:0:0:0 | definition of reg_save_area |
-| file://:0:0:0:0 | dllexport |
-| file://:0:0:0:0 | dllimport |
-| file://:0:0:0:0 | double |
-| file://:0:0:0:0 | error |
-| file://:0:0:0:0 | explicit |
-| file://:0:0:0:0 | extern |
-| file://:0:0:0:0 | far |
-| file://:0:0:0:0 | final |
-| file://:0:0:0:0 | float |
-| file://:0:0:0:0 | forceinline |
-| file://:0:0:0:0 | fp_offset |
-| file://:0:0:0:0 | gp_offset |
-| file://:0:0:0:0 | has_trailing_return_type |
-| file://:0:0:0:0 | implicit_int |
-| file://:0:0:0:0 | inline |
-| file://:0:0:0:0 | int |
-| file://:0:0:0:0 | is_consteval |
-| file://:0:0:0:0 | is_constexpr |
-| file://:0:0:0:0 | is_thread_local |
-| file://:0:0:0:0 | long |
-| file://:0:0:0:0 | long double |
-| file://:0:0:0:0 | long long |
-| file://:0:0:0:0 | microsoft_inline |
-| file://:0:0:0:0 | mystruct & |
-| file://:0:0:0:0 | mystruct && |
-| file://:0:0:0:0 | naked |
-| file://:0:0:0:0 | near |
-| file://:0:0:0:0 | noalias |
-| file://:0:0:0:0 | noinline |
-| file://:0:0:0:0 | noreturn |
-| file://:0:0:0:0 | nothrow |
-| file://:0:0:0:0 | novtable |
-| file://:0:0:0:0 | operator= |
-| file://:0:0:0:0 | operator= |
-| file://:0:0:0:0 | optional |
-| file://:0:0:0:0 | overflow_arg_area |
-| file://:0:0:0:0 | override |
-| file://:0:0:0:0 | private |
-| file://:0:0:0:0 | protected |
-| file://:0:0:0:0 | public |
-| file://:0:0:0:0 | pure |
-| file://:0:0:0:0 | reg_save_area |
-| file://:0:0:0:0 | register |
-| file://:0:0:0:0 | restrict |
-| file://:0:0:0:0 | sealed |
-| file://:0:0:0:0 | selectany |
-| file://:0:0:0:0 | short |
-| file://:0:0:0:0 | signed __int128 |
-| file://:0:0:0:0 | signed char |
-| file://:0:0:0:0 | signed int |
-| file://:0:0:0:0 | signed long |
-| file://:0:0:0:0 | signed long long |
-| file://:0:0:0:0 | signed short |
-| file://:0:0:0:0 | static |
-| file://:0:0:0:0 | thread |
-| file://:0:0:0:0 | unaligned |
-| file://:0:0:0:0 | unknown |
-| file://:0:0:0:0 | unsigned __int128 |
-| file://:0:0:0:0 | unsigned char |
-| file://:0:0:0:0 | unsigned int |
-| file://:0:0:0:0 | unsigned long |
-| file://:0:0:0:0 | unsigned long long |
-| file://:0:0:0:0 | unsigned short |
-| file://:0:0:0:0 | varargs |
-| file://:0:0:0:0 | virtual |
-| file://:0:0:0:0 | void |
-| file://:0:0:0:0 | void * |
-| file://:0:0:0:0 | volatile |
-| file://:0:0:0:0 | wchar_t |
diff --git a/cpp/ql/test/library-tests/clang_ms/element.ql b/cpp/ql/test/library-tests/clang_ms/element.ql
deleted file mode 100644
index 8d2ce8f5e94..00000000000
--- a/cpp/ql/test/library-tests/clang_ms/element.ql
+++ /dev/null
@@ -1,5 +0,0 @@
-import cpp
-
-from Element e
-where not e instanceof Folder
-select e
diff --git a/cpp/ql/test/library-tests/conditions/elements.expected b/cpp/ql/test/library-tests/conditions/elements.expected
deleted file mode 100644
index 3516aea66d5..00000000000
--- a/cpp/ql/test/library-tests/conditions/elements.expected
+++ /dev/null
@@ -1,139 +0,0 @@
-| file://:0:0:0:0 | |
-| file://:0:0:0:0 | & |
-| file://:0:0:0:0 | && |
-| file://:0:0:0:0 | (global namespace) |
-| file://:0:0:0:0 | (unnamed parameter 0) |
-| file://:0:0:0:0 | (unnamed parameter 0) |
-| file://:0:0:0:0 | |
-| file://:0:0:0:0 | |
-| file://:0:0:0:0 | There was an error during this compilation |
-| file://:0:0:0:0 | _Complex __float128 |
-| file://:0:0:0:0 | _Complex double |
-| file://:0:0:0:0 | _Complex float |
-| file://:0:0:0:0 | _Complex long double |
-| file://:0:0:0:0 | _Decimal32 |
-| file://:0:0:0:0 | _Decimal64 |
-| file://:0:0:0:0 | _Decimal128 |
-| file://:0:0:0:0 | _Float32 |
-| file://:0:0:0:0 | _Float32x |
-| file://:0:0:0:0 | _Float64 |
-| file://:0:0:0:0 | _Float64x |
-| file://:0:0:0:0 | _Float128 |
-| file://:0:0:0:0 | _Float128x |
-| file://:0:0:0:0 | _Imaginary double |
-| file://:0:0:0:0 | _Imaginary float |
-| file://:0:0:0:0 | _Imaginary long double |
-| file://:0:0:0:0 | __block |
-| file://:0:0:0:0 | __float128 |
-| file://:0:0:0:0 | __int128 |
-| file://:0:0:0:0 | __interface |
-| file://:0:0:0:0 | __ptr32 |
-| file://:0:0:0:0 | __ptr64 |
-| file://:0:0:0:0 | __sptr |
-| file://:0:0:0:0 | __super |
-| file://:0:0:0:0 | __uptr |
-| file://:0:0:0:0 | __va_list_tag |
-| file://:0:0:0:0 | __va_list_tag & |
-| file://:0:0:0:0 | __va_list_tag && |
-| file://:0:0:0:0 | abstract |
-| file://:0:0:0:0 | atomic |
-| file://:0:0:0:0 | auto |
-| file://:0:0:0:0 | auto |
-| file://:0:0:0:0 | bool |
-| file://:0:0:0:0 | char |
-| file://:0:0:0:0 | char8_t |
-| file://:0:0:0:0 | char16_t |
-| file://:0:0:0:0 | char32_t |
-| file://:0:0:0:0 | const |
-| file://:0:0:0:0 | const __va_list_tag |
-| file://:0:0:0:0 | const __va_list_tag & |
-| file://:0:0:0:0 | declared_constexpr |
-| file://:0:0:0:0 | declared_constinit |
-| file://:0:0:0:0 | declared_virtual |
-| file://:0:0:0:0 | decltype(nullptr) |
-| file://:0:0:0:0 | definition of |
-| file://:0:0:0:0 | definition of fp_offset |
-| file://:0:0:0:0 | definition of gp_offset |
-| file://:0:0:0:0 | definition of overflow_arg_area |
-| file://:0:0:0:0 | definition of reg_save_area |
-| file://:0:0:0:0 | dllexport |
-| file://:0:0:0:0 | dllimport |
-| file://:0:0:0:0 | double |
-| file://:0:0:0:0 | error |
-| file://:0:0:0:0 | explicit |
-| file://:0:0:0:0 | extern |
-| file://:0:0:0:0 | far |
-| file://:0:0:0:0 | final |
-| file://:0:0:0:0 | float |
-| file://:0:0:0:0 | forceinline |
-| file://:0:0:0:0 | fp_offset |
-| file://:0:0:0:0 | gp_offset |
-| file://:0:0:0:0 | has_trailing_return_type |
-| file://:0:0:0:0 | implicit_int |
-| file://:0:0:0:0 | initializer for |
-| file://:0:0:0:0 | inline |
-| file://:0:0:0:0 | int |
-| file://:0:0:0:0 | is_consteval |
-| file://:0:0:0:0 | is_constexpr |
-| file://:0:0:0:0 | is_thread_local |
-| file://:0:0:0:0 | long |
-| file://:0:0:0:0 | long double |
-| file://:0:0:0:0 | long long |
-| file://:0:0:0:0 | microsoft_inline |
-| file://:0:0:0:0 | naked |
-| file://:0:0:0:0 | near |
-| file://:0:0:0:0 | noalias |
-| file://:0:0:0:0 | noinline |
-| file://:0:0:0:0 | noreturn |
-| file://:0:0:0:0 | nothrow |
-| file://:0:0:0:0 | novtable |
-| file://:0:0:0:0 | operator= |
-| file://:0:0:0:0 | operator= |
-| file://:0:0:0:0 | optional |
-| file://:0:0:0:0 | overflow_arg_area |
-| file://:0:0:0:0 | override |
-| file://:0:0:0:0 | private |
-| file://:0:0:0:0 | protected |
-| file://:0:0:0:0 | public |
-| file://:0:0:0:0 | pure |
-| file://:0:0:0:0 | reg_save_area |
-| file://:0:0:0:0 | register |
-| file://:0:0:0:0 | restrict |
-| file://:0:0:0:0 | sealed |
-| file://:0:0:0:0 | selectany |
-| file://:0:0:0:0 | short |
-| file://:0:0:0:0 | signed __int128 |
-| file://:0:0:0:0 | signed char |
-| file://:0:0:0:0 | signed int |
-| file://:0:0:0:0 | signed long |
-| file://:0:0:0:0 | signed long long |
-| file://:0:0:0:0 | signed short |
-| file://:0:0:0:0 | static |
-| file://:0:0:0:0 | thread |
-| file://:0:0:0:0 | unaligned |
-| file://:0:0:0:0 | unknown |
-| file://:0:0:0:0 | unsigned __int128 |
-| file://:0:0:0:0 | unsigned char |
-| file://:0:0:0:0 | unsigned int |
-| file://:0:0:0:0 | unsigned long |
-| file://:0:0:0:0 | unsigned long long |
-| file://:0:0:0:0 | unsigned short |
-| file://:0:0:0:0 | varargs |
-| file://:0:0:0:0 | virtual |
-| file://:0:0:0:0 | void |
-| file://:0:0:0:0 | void * |
-| file://:0:0:0:0 | volatile |
-| file://:0:0:0:0 | wchar_t |
-| test.cpp:0:0:0:0 | test.cpp |
-| test.cpp:2:6:2:6 | definition of f |
-| test.cpp:2:6:2:6 | f |
-| test.cpp:2:10:4:1 | { ... } |
-| test.cpp:3:5:3:15 | if (...) ... |
-| test.cpp:3:9:3:12 | (condition decl) |
-| test.cpp:3:9:3:12 | |
-| test.cpp:3:12:3:12 | |
-| test.cpp:3:12:3:12 | a condition declaration must include an initializer |
-| test.cpp:3:12:3:12 | declaration of |
-| test.cpp:3:12:3:12 | expected an identifier |
-| test.cpp:3:14:3:15 | { ... } |
-| test.cpp:4:1:4:1 | return ... |
diff --git a/cpp/ql/test/library-tests/conditions/elements.ql b/cpp/ql/test/library-tests/conditions/elements.ql
deleted file mode 100644
index 8d2ce8f5e94..00000000000
--- a/cpp/ql/test/library-tests/conditions/elements.ql
+++ /dev/null
@@ -1,5 +0,0 @@
-import cpp
-
-from Element e
-where not e instanceof Folder
-select e
diff --git a/cpp/ql/test/library-tests/dataflow/fields/dataflow-consistency.expected b/cpp/ql/test/library-tests/dataflow/fields/dataflow-consistency.expected
index 8cc13f226a9..8333b9d5776 100644
--- a/cpp/ql/test/library-tests/dataflow/fields/dataflow-consistency.expected
+++ b/cpp/ql/test/library-tests/dataflow/fields/dataflow-consistency.expected
@@ -1,4 +1,8 @@
uniqueEnclosingCallable
+| C.cpp:9:14:9:23 | 0 | Node should have one enclosing callable but has 0. |
+| C.cpp:9:14:9:23 | new | Node should have one enclosing callable but has 0. |
+| C.cpp:10:20:10:29 | 0 | Node should have one enclosing callable but has 0. |
+| C.cpp:10:20:10:29 | new | Node should have one enclosing callable but has 0. |
| C.cpp:37:24:37:33 | 0 | Node should have one enclosing callable but has 0. |
| C.cpp:37:24:37:33 | new | Node should have one enclosing callable but has 0. |
uniqueType
diff --git a/cpp/ql/test/library-tests/dataflow/taint-tests/localTaint.expected b/cpp/ql/test/library-tests/dataflow/taint-tests/localTaint.expected
index 27cfbb6430a..56a049f9ab2 100644
--- a/cpp/ql/test/library-tests/dataflow/taint-tests/localTaint.expected
+++ b/cpp/ql/test/library-tests/dataflow/taint-tests/localTaint.expected
@@ -6122,327 +6122,344 @@
| taint.cpp:347:13:347:13 | d | taint.cpp:347:12:347:13 | & ... | |
| taint.cpp:348:14:348:14 | ref arg e | taint.cpp:355:7:355:7 | e | |
| taint.cpp:348:17:348:17 | ref arg t | taint.cpp:350:7:350:7 | t | |
-| taint.cpp:365:24:365:29 | source | taint.cpp:369:13:369:18 | source | |
-| taint.cpp:365:24:365:29 | source | taint.cpp:371:14:371:19 | source | |
-| taint.cpp:369:6:369:11 | call to strdup | taint.cpp:369:2:369:19 | ... = ... | |
-| taint.cpp:369:6:369:11 | call to strdup | taint.cpp:372:7:372:7 | a | |
-| taint.cpp:369:13:369:18 | source | taint.cpp:369:6:369:11 | call to strdup | TAINT |
-| taint.cpp:370:6:370:11 | call to strdup | taint.cpp:370:2:370:27 | ... = ... | |
-| taint.cpp:370:6:370:11 | call to strdup | taint.cpp:373:7:373:7 | b | |
-| taint.cpp:370:13:370:26 | hello, world | taint.cpp:370:6:370:11 | call to strdup | TAINT |
-| taint.cpp:371:6:371:12 | call to strndup | taint.cpp:371:2:371:25 | ... = ... | |
-| taint.cpp:371:6:371:12 | call to strndup | taint.cpp:374:7:374:7 | c | |
-| taint.cpp:371:14:371:19 | source | taint.cpp:371:6:371:12 | call to strndup | TAINT |
-| taint.cpp:371:22:371:24 | 100 | taint.cpp:371:6:371:12 | call to strndup | TAINT |
-| taint.cpp:377:23:377:28 | source | taint.cpp:381:30:381:35 | source | |
-| taint.cpp:381:6:381:12 | call to strndup | taint.cpp:381:2:381:36 | ... = ... | |
-| taint.cpp:381:6:381:12 | call to strndup | taint.cpp:382:7:382:7 | a | |
-| taint.cpp:381:14:381:27 | hello, world | taint.cpp:381:6:381:12 | call to strndup | TAINT |
-| taint.cpp:381:30:381:35 | source | taint.cpp:381:6:381:12 | call to strndup | TAINT |
-| taint.cpp:385:27:385:32 | source | taint.cpp:389:13:389:18 | source | |
-| taint.cpp:389:6:389:11 | call to wcsdup | taint.cpp:389:2:389:19 | ... = ... | |
-| taint.cpp:389:6:389:11 | call to wcsdup | taint.cpp:391:7:391:7 | a | |
-| taint.cpp:389:13:389:18 | source | taint.cpp:389:6:389:11 | call to wcsdup | TAINT |
-| taint.cpp:390:6:390:11 | call to wcsdup | taint.cpp:390:2:390:28 | ... = ... | |
-| taint.cpp:390:6:390:11 | call to wcsdup | taint.cpp:392:7:392:7 | b | |
-| taint.cpp:390:13:390:27 | hello, world | taint.cpp:390:6:390:11 | call to wcsdup | TAINT |
-| taint.cpp:417:13:417:13 | 0 | taint.cpp:417:13:417:14 | call to MyClass2 | TAINT |
-| taint.cpp:417:13:417:14 | call to MyClass2 | taint.cpp:420:7:420:7 | a | |
-| taint.cpp:417:13:417:14 | call to MyClass2 | taint.cpp:421:7:421:7 | a | |
-| taint.cpp:417:13:417:14 | call to MyClass2 | taint.cpp:422:2:422:2 | a | |
-| taint.cpp:417:13:417:14 | call to MyClass2 | taint.cpp:423:7:423:7 | a | |
-| taint.cpp:417:13:417:14 | call to MyClass2 | taint.cpp:424:7:424:7 | a | |
-| taint.cpp:417:19:417:19 | 0 | taint.cpp:417:19:417:20 | call to MyClass2 | TAINT |
-| taint.cpp:417:19:417:20 | call to MyClass2 | taint.cpp:426:7:426:7 | b | |
-| taint.cpp:417:19:417:20 | call to MyClass2 | taint.cpp:427:7:427:7 | b | |
-| taint.cpp:417:19:417:20 | call to MyClass2 | taint.cpp:428:2:428:2 | b | |
-| taint.cpp:417:19:417:20 | call to MyClass2 | taint.cpp:429:7:429:7 | b | |
-| taint.cpp:417:19:417:20 | call to MyClass2 | taint.cpp:430:7:430:7 | b | |
-| taint.cpp:417:19:417:20 | call to MyClass2 | taint.cpp:431:7:431:7 | b | |
-| taint.cpp:418:13:418:14 | | taint.cpp:418:13:418:15 | call to MyClass3 | TAINT |
-| taint.cpp:418:13:418:15 | call to MyClass3 | taint.cpp:443:7:443:7 | d | |
-| taint.cpp:418:13:418:15 | call to MyClass3 | taint.cpp:444:7:444:7 | d | |
-| taint.cpp:418:13:418:15 | call to MyClass3 | taint.cpp:445:2:445:2 | d | |
-| taint.cpp:418:13:418:15 | call to MyClass3 | taint.cpp:446:7:446:7 | d | |
-| taint.cpp:418:13:418:15 | call to MyClass3 | taint.cpp:447:7:447:7 | d | |
-| taint.cpp:421:7:421:7 | ref arg a | taint.cpp:422:2:422:2 | a | |
-| taint.cpp:421:7:421:7 | ref arg a | taint.cpp:423:7:423:7 | a | |
-| taint.cpp:421:7:421:7 | ref arg a | taint.cpp:424:7:424:7 | a | |
-| taint.cpp:422:2:422:2 | ref arg a | taint.cpp:423:7:423:7 | a | |
-| taint.cpp:422:2:422:2 | ref arg a | taint.cpp:424:7:424:7 | a | |
-| taint.cpp:427:7:427:7 | ref arg b | taint.cpp:428:2:428:2 | b | |
-| taint.cpp:427:7:427:7 | ref arg b | taint.cpp:429:7:429:7 | b | |
-| taint.cpp:427:7:427:7 | ref arg b | taint.cpp:430:7:430:7 | b | |
-| taint.cpp:427:7:427:7 | ref arg b | taint.cpp:431:7:431:7 | b | |
-| taint.cpp:428:2:428:2 | b [post update] | taint.cpp:429:7:429:7 | b | |
-| taint.cpp:428:2:428:2 | b [post update] | taint.cpp:430:7:430:7 | b | |
-| taint.cpp:428:2:428:2 | b [post update] | taint.cpp:431:7:431:7 | b | |
-| taint.cpp:428:2:428:20 | ... = ... | taint.cpp:428:4:428:9 | member [post update] | |
-| taint.cpp:428:2:428:20 | ... = ... | taint.cpp:430:9:430:14 | member | |
-| taint.cpp:428:13:428:18 | call to source | taint.cpp:428:2:428:20 | ... = ... | |
-| taint.cpp:433:6:433:20 | call to MyClass2 | taint.cpp:433:6:433:20 | new | |
-| taint.cpp:433:6:433:20 | new | taint.cpp:433:2:433:20 | ... = ... | |
-| taint.cpp:433:6:433:20 | new | taint.cpp:435:7:435:7 | c | |
-| taint.cpp:433:6:433:20 | new | taint.cpp:436:7:436:7 | c | |
-| taint.cpp:433:6:433:20 | new | taint.cpp:437:2:437:2 | c | |
-| taint.cpp:433:6:433:20 | new | taint.cpp:438:7:438:7 | c | |
-| taint.cpp:433:6:433:20 | new | taint.cpp:439:7:439:7 | c | |
-| taint.cpp:433:6:433:20 | new | taint.cpp:441:9:441:9 | c | |
-| taint.cpp:433:19:433:19 | 0 | taint.cpp:433:6:433:20 | call to MyClass2 | TAINT |
-| taint.cpp:435:7:435:7 | ref arg c | taint.cpp:436:7:436:7 | c | |
-| taint.cpp:435:7:435:7 | ref arg c | taint.cpp:437:2:437:2 | c | |
-| taint.cpp:435:7:435:7 | ref arg c | taint.cpp:438:7:438:7 | c | |
-| taint.cpp:435:7:435:7 | ref arg c | taint.cpp:439:7:439:7 | c | |
-| taint.cpp:435:7:435:7 | ref arg c | taint.cpp:441:9:441:9 | c | |
-| taint.cpp:436:7:436:7 | ref arg c | taint.cpp:437:2:437:2 | c | |
-| taint.cpp:436:7:436:7 | ref arg c | taint.cpp:438:7:438:7 | c | |
-| taint.cpp:436:7:436:7 | ref arg c | taint.cpp:439:7:439:7 | c | |
-| taint.cpp:436:7:436:7 | ref arg c | taint.cpp:441:9:441:9 | c | |
-| taint.cpp:437:2:437:2 | ref arg c | taint.cpp:438:7:438:7 | c | |
-| taint.cpp:437:2:437:2 | ref arg c | taint.cpp:439:7:439:7 | c | |
-| taint.cpp:437:2:437:2 | ref arg c | taint.cpp:441:9:441:9 | c | |
-| taint.cpp:438:7:438:7 | ref arg c | taint.cpp:439:7:439:7 | c | |
-| taint.cpp:438:7:438:7 | ref arg c | taint.cpp:441:9:441:9 | c | |
-| taint.cpp:439:7:439:7 | ref arg c | taint.cpp:441:9:441:9 | c | |
-| taint.cpp:441:9:441:9 | c | taint.cpp:441:2:441:9 | delete | TAINT |
-| taint.cpp:444:7:444:7 | ref arg d | taint.cpp:445:2:445:2 | d | |
-| taint.cpp:444:7:444:7 | ref arg d | taint.cpp:446:7:446:7 | d | |
-| taint.cpp:444:7:444:7 | ref arg d | taint.cpp:447:7:447:7 | d | |
-| taint.cpp:445:2:445:2 | ref arg d | taint.cpp:446:7:446:7 | d | |
-| taint.cpp:445:2:445:2 | ref arg d | taint.cpp:447:7:447:7 | d | |
-| taint.cpp:452:16:452:16 | a | taint.cpp:454:10:454:10 | a | |
-| taint.cpp:452:24:452:24 | b | taint.cpp:455:6:455:6 | b | |
-| taint.cpp:454:10:454:10 | a | taint.cpp:456:6:456:6 | c | |
-| taint.cpp:455:2:455:2 | a [post update] | taint.cpp:452:16:452:16 | a | |
-| taint.cpp:455:2:455:6 | ... = ... | taint.cpp:455:2:455:2 | a [post update] | |
-| taint.cpp:455:6:455:6 | b | taint.cpp:452:16:452:16 | a | |
-| taint.cpp:455:6:455:6 | b | taint.cpp:455:2:455:6 | ... = ... | |
-| taint.cpp:456:2:456:2 | b [post update] | taint.cpp:452:24:452:24 | b | |
-| taint.cpp:456:2:456:6 | ... = ... | taint.cpp:456:2:456:2 | b [post update] | |
-| taint.cpp:456:6:456:6 | c | taint.cpp:452:24:452:24 | b | |
-| taint.cpp:456:6:456:6 | c | taint.cpp:456:2:456:6 | ... = ... | |
-| taint.cpp:462:6:462:11 | call to source | taint.cpp:462:2:462:13 | ... = ... | |
-| taint.cpp:462:6:462:11 | call to source | taint.cpp:465:7:465:7 | x | |
-| taint.cpp:462:6:462:11 | call to source | taint.cpp:468:7:468:7 | x | |
-| taint.cpp:462:6:462:11 | call to source | taint.cpp:470:7:470:7 | x | |
-| taint.cpp:463:6:463:6 | 0 | taint.cpp:463:2:463:6 | ... = ... | |
-| taint.cpp:463:6:463:6 | 0 | taint.cpp:466:7:466:7 | y | |
-| taint.cpp:463:6:463:6 | 0 | taint.cpp:468:10:468:10 | y | |
-| taint.cpp:463:6:463:6 | 0 | taint.cpp:471:7:471:7 | y | |
-| taint.cpp:468:7:468:7 | ref arg x | taint.cpp:470:7:470:7 | x | |
-| taint.cpp:468:10:468:10 | ref arg y | taint.cpp:471:7:471:7 | y | |
-| taint.cpp:480:26:480:32 | source1 | taint.cpp:483:28:483:34 | source1 | |
-| taint.cpp:481:15:481:21 | 0 | taint.cpp:483:12:483:15 | line | |
-| taint.cpp:481:15:481:21 | 0 | taint.cpp:485:7:485:10 | line | |
-| taint.cpp:482:9:482:9 | n | taint.cpp:483:19:483:19 | n | |
-| taint.cpp:483:11:483:15 | ref arg & ... | taint.cpp:483:12:483:15 | line [inner post update] | |
-| taint.cpp:483:11:483:15 | ref arg & ... | taint.cpp:485:7:485:10 | line | |
-| taint.cpp:483:12:483:15 | line | taint.cpp:483:11:483:15 | & ... | |
-| taint.cpp:483:18:483:19 | ref arg & ... | taint.cpp:483:19:483:19 | n [inner post update] | |
-| taint.cpp:483:19:483:19 | n | taint.cpp:483:18:483:19 | & ... | |
-| taint.cpp:483:28:483:34 | source1 | taint.cpp:483:11:483:15 | ref arg & ... | TAINT |
-| taint.cpp:492:24:492:29 | source | taint.cpp:494:27:494:32 | source | |
-| taint.cpp:493:22:493:29 | ,.-;:_ | taint.cpp:494:35:494:39 | delim | |
-| taint.cpp:493:22:493:29 | ,.-;:_ | taint.cpp:496:7:496:11 | delim | |
-| taint.cpp:494:20:494:25 | call to strtok | taint.cpp:495:7:495:15 | tokenized | |
-| taint.cpp:494:27:494:32 | source | taint.cpp:494:20:494:25 | call to strtok | TAINT |
-| taint.cpp:503:26:503:28 | ptr | taint.cpp:504:10:504:12 | ptr | |
-| taint.cpp:503:26:503:28 | ptr | taint.cpp:505:7:505:9 | ptr | |
-| taint.cpp:503:26:503:28 | ptr | taint.cpp:506:8:506:10 | ptr | |
-| taint.cpp:503:36:503:41 | source | taint.cpp:504:15:504:20 | source | |
-| taint.cpp:504:10:504:12 | ptr | taint.cpp:504:2:504:8 | call to _strset | |
-| taint.cpp:504:10:504:12 | ref arg ptr | taint.cpp:505:7:505:9 | ptr | |
-| taint.cpp:504:10:504:12 | ref arg ptr | taint.cpp:506:8:506:10 | ptr | |
-| taint.cpp:504:15:504:20 | source | taint.cpp:504:2:504:8 | call to _strset | TAINT |
-| taint.cpp:504:15:504:20 | source | taint.cpp:504:10:504:12 | ref arg ptr | |
-| taint.cpp:505:7:505:9 | ref arg ptr | taint.cpp:506:8:506:10 | ptr | |
-| taint.cpp:506:8:506:10 | ptr | taint.cpp:506:7:506:10 | * ... | TAINT |
-| taint.cpp:509:26:509:31 | source | taint.cpp:510:10:510:15 | source | |
-| taint.cpp:509:26:509:31 | source | taint.cpp:511:7:511:12 | source | |
-| taint.cpp:510:10:510:15 | ref arg source | taint.cpp:511:7:511:12 | source | |
-| taint.cpp:510:10:510:15 | source | taint.cpp:510:2:510:8 | call to _strset | |
-| taint.cpp:510:18:510:18 | 0 | taint.cpp:510:2:510:8 | call to _strset | TAINT |
-| taint.cpp:510:18:510:18 | 0 | taint.cpp:510:10:510:15 | ref arg source | |
-| taint.cpp:518:24:518:29 | source | taint.cpp:520:14:520:19 | source | |
-| taint.cpp:519:6:519:6 | x | taint.cpp:520:11:520:11 | x | |
-| taint.cpp:519:6:519:6 | x | taint.cpp:521:7:521:7 | x | |
-| taint.cpp:520:10:520:11 | & ... | taint.cpp:520:2:520:8 | call to mempcpy | |
-| taint.cpp:520:10:520:11 | ref arg & ... | taint.cpp:520:11:520:11 | x [inner post update] | |
-| taint.cpp:520:10:520:11 | ref arg & ... | taint.cpp:521:7:521:7 | x | |
-| taint.cpp:520:11:520:11 | x | taint.cpp:520:10:520:11 | & ... | |
-| taint.cpp:520:14:520:19 | source | taint.cpp:520:2:520:8 | call to mempcpy | TAINT |
-| taint.cpp:520:14:520:19 | source | taint.cpp:520:10:520:11 | ref arg & ... | TAINT |
-| taint.cpp:528:24:528:29 | source | taint.cpp:530:16:530:21 | source | |
-| taint.cpp:529:6:529:9 | dest | taint.cpp:530:10:530:13 | dest | |
-| taint.cpp:529:6:529:9 | dest | taint.cpp:530:35:530:38 | dest | |
-| taint.cpp:529:6:529:9 | dest | taint.cpp:531:7:531:10 | dest | |
-| taint.cpp:530:10:530:13 | dest | taint.cpp:530:2:530:8 | call to memccpy | |
-| taint.cpp:530:10:530:13 | ref arg dest | taint.cpp:531:7:531:10 | dest | |
-| taint.cpp:530:16:530:21 | source | taint.cpp:530:2:530:8 | call to memccpy | TAINT |
-| taint.cpp:530:16:530:21 | source | taint.cpp:530:10:530:13 | ref arg dest | TAINT |
-| taint.cpp:538:24:538:28 | dest1 | taint.cpp:539:9:539:13 | dest1 | |
-| taint.cpp:538:24:538:28 | dest1 | taint.cpp:540:7:540:11 | dest1 | |
-| taint.cpp:538:37:538:41 | dest2 | taint.cpp:542:9:542:13 | dest2 | |
-| taint.cpp:538:37:538:41 | dest2 | taint.cpp:543:7:543:11 | dest2 | |
-| taint.cpp:538:50:538:54 | clean | taint.cpp:542:16:542:20 | clean | |
-| taint.cpp:538:63:538:68 | source | taint.cpp:539:16:539:21 | source | |
-| taint.cpp:539:9:539:13 | dest1 | taint.cpp:539:2:539:7 | call to strcat | |
-| taint.cpp:539:9:539:13 | dest1 | taint.cpp:539:9:539:13 | ref arg dest1 | TAINT |
-| taint.cpp:539:9:539:13 | ref arg dest1 | taint.cpp:540:7:540:11 | dest1 | |
-| taint.cpp:539:16:539:21 | source | taint.cpp:539:9:539:13 | ref arg dest1 | TAINT |
-| taint.cpp:542:9:542:13 | dest2 | taint.cpp:542:2:542:7 | call to strcat | |
-| taint.cpp:542:9:542:13 | dest2 | taint.cpp:542:9:542:13 | ref arg dest2 | TAINT |
-| taint.cpp:542:9:542:13 | ref arg dest2 | taint.cpp:543:7:543:11 | dest2 | |
-| taint.cpp:542:16:542:20 | clean | taint.cpp:542:9:542:13 | ref arg dest2 | TAINT |
-| taint.cpp:550:37:550:41 | dest1 | taint.cpp:552:36:552:40 | dest1 | |
-| taint.cpp:550:37:550:41 | dest1 | taint.cpp:553:7:553:11 | dest1 | |
-| taint.cpp:550:37:550:41 | dest1 | taint.cpp:554:8:554:12 | dest1 | |
-| taint.cpp:550:65:550:67 | ptr | taint.cpp:552:43:552:45 | ptr | |
-| taint.cpp:550:65:550:67 | ptr | taint.cpp:558:43:558:45 | ptr | |
-| taint.cpp:550:85:550:89 | dest3 | taint.cpp:558:36:558:40 | dest3 | |
-| taint.cpp:550:85:550:89 | dest3 | taint.cpp:559:7:559:11 | dest3 | |
-| taint.cpp:550:85:550:89 | dest3 | taint.cpp:560:8:560:12 | dest3 | |
-| taint.cpp:551:32:551:36 | clean | taint.cpp:558:51:558:55 | clean | |
-| taint.cpp:551:49:551:54 | source | taint.cpp:552:51:552:56 | source | |
-| taint.cpp:551:61:551:61 | n | taint.cpp:552:48:552:48 | n | |
-| taint.cpp:551:61:551:61 | n | taint.cpp:558:48:558:48 | n | |
-| taint.cpp:552:25:552:34 | call to _mbsncat_l | taint.cpp:555:7:555:11 | dest2 | |
-| taint.cpp:552:25:552:34 | call to _mbsncat_l | taint.cpp:556:8:556:12 | dest2 | |
-| taint.cpp:552:36:552:40 | dest1 | taint.cpp:552:25:552:34 | call to _mbsncat_l | |
-| taint.cpp:552:36:552:40 | dest1 | taint.cpp:552:36:552:40 | ref arg dest1 | TAINT |
-| taint.cpp:552:36:552:40 | ref arg dest1 | taint.cpp:553:7:553:11 | dest1 | |
-| taint.cpp:552:36:552:40 | ref arg dest1 | taint.cpp:554:8:554:12 | dest1 | |
-| taint.cpp:552:43:552:45 | ptr | taint.cpp:552:36:552:40 | ref arg dest1 | TAINT |
-| taint.cpp:552:48:552:48 | n | taint.cpp:552:36:552:40 | ref arg dest1 | TAINT |
-| taint.cpp:552:51:552:56 | source | taint.cpp:552:36:552:40 | ref arg dest1 | TAINT |
-| taint.cpp:553:7:553:11 | ref arg dest1 | taint.cpp:554:8:554:12 | dest1 | |
-| taint.cpp:554:8:554:12 | dest1 | taint.cpp:554:7:554:12 | * ... | TAINT |
-| taint.cpp:555:7:555:11 | ref arg dest2 | taint.cpp:556:8:556:12 | dest2 | |
-| taint.cpp:556:8:556:12 | dest2 | taint.cpp:556:7:556:12 | * ... | TAINT |
-| taint.cpp:558:25:558:34 | call to _mbsncat_l | taint.cpp:561:7:561:11 | dest4 | |
-| taint.cpp:558:25:558:34 | call to _mbsncat_l | taint.cpp:562:8:562:12 | dest4 | |
-| taint.cpp:558:36:558:40 | dest3 | taint.cpp:558:25:558:34 | call to _mbsncat_l | |
-| taint.cpp:558:36:558:40 | dest3 | taint.cpp:558:36:558:40 | ref arg dest3 | TAINT |
-| taint.cpp:558:36:558:40 | ref arg dest3 | taint.cpp:559:7:559:11 | dest3 | |
-| taint.cpp:558:36:558:40 | ref arg dest3 | taint.cpp:560:8:560:12 | dest3 | |
-| taint.cpp:558:43:558:45 | ptr | taint.cpp:558:36:558:40 | ref arg dest3 | TAINT |
-| taint.cpp:558:48:558:48 | n | taint.cpp:558:36:558:40 | ref arg dest3 | TAINT |
-| taint.cpp:558:51:558:55 | clean | taint.cpp:558:36:558:40 | ref arg dest3 | TAINT |
-| taint.cpp:559:7:559:11 | ref arg dest3 | taint.cpp:560:8:560:12 | dest3 | |
-| taint.cpp:560:8:560:12 | dest3 | taint.cpp:560:7:560:12 | * ... | TAINT |
-| taint.cpp:561:7:561:11 | ref arg dest4 | taint.cpp:562:8:562:12 | dest4 | |
-| taint.cpp:562:8:562:12 | dest4 | taint.cpp:562:7:562:12 | * ... | TAINT |
-| taint.cpp:569:24:569:29 | source | taint.cpp:572:29:572:34 | source | |
-| taint.cpp:570:23:570:30 | ,.-;:_ | taint.cpp:572:37:572:41 | delim | |
-| taint.cpp:572:9:572:17 | tokenized | taint.cpp:572:9:572:42 | ... = ... | |
-| taint.cpp:572:21:572:26 | call to strsep | taint.cpp:572:9:572:42 | ... = ... | |
-| taint.cpp:572:21:572:26 | call to strsep | taint.cpp:573:10:573:18 | tokenized | |
-| taint.cpp:572:21:572:26 | call to strsep | taint.cpp:574:11:574:19 | tokenized | |
-| taint.cpp:572:28:572:34 | & ... | taint.cpp:572:21:572:26 | call to strsep | TAINT |
-| taint.cpp:572:28:572:34 | ref arg & ... | taint.cpp:572:29:572:34 | source | |
-| taint.cpp:572:28:572:34 | ref arg & ... | taint.cpp:572:29:572:34 | source [inner post update] | |
-| taint.cpp:572:29:572:34 | source | taint.cpp:572:21:572:26 | call to strsep | TAINT |
-| taint.cpp:572:29:572:34 | source | taint.cpp:572:28:572:34 | & ... | |
-| taint.cpp:572:37:572:41 | delim | taint.cpp:572:21:572:26 | call to strsep | TAINT |
-| taint.cpp:573:10:573:18 | ref arg tokenized | taint.cpp:574:11:574:19 | tokenized | |
-| taint.cpp:574:11:574:19 | tokenized | taint.cpp:574:10:574:19 | * ... | TAINT |
-| taint.cpp:584:25:584:30 | source | taint.cpp:585:18:585:23 | source | |
-| taint.cpp:584:39:584:43 | clean | taint.cpp:589:18:589:22 | clean | |
-| taint.cpp:584:82:584:87 | locale | taint.cpp:585:26:585:31 | locale | |
-| taint.cpp:584:82:584:87 | locale | taint.cpp:589:25:589:30 | locale | |
-| taint.cpp:585:10:585:16 | call to _strinc | taint.cpp:585:2:585:32 | ... = ... | |
-| taint.cpp:585:10:585:16 | call to _strinc | taint.cpp:586:7:586:11 | dest1 | |
-| taint.cpp:585:10:585:16 | call to _strinc | taint.cpp:587:8:587:12 | dest1 | |
-| taint.cpp:585:18:585:23 | source | taint.cpp:585:10:585:16 | call to _strinc | TAINT |
-| taint.cpp:585:26:585:31 | locale | taint.cpp:585:10:585:16 | call to _strinc | TAINT |
-| taint.cpp:585:26:585:31 | ref arg locale | taint.cpp:589:25:589:30 | locale | |
-| taint.cpp:586:7:586:11 | ref arg dest1 | taint.cpp:587:8:587:12 | dest1 | |
-| taint.cpp:587:8:587:12 | dest1 | taint.cpp:587:7:587:12 | * ... | TAINT |
-| taint.cpp:589:10:589:16 | call to _strinc | taint.cpp:589:2:589:31 | ... = ... | |
-| taint.cpp:589:10:589:16 | call to _strinc | taint.cpp:590:7:590:11 | dest2 | |
-| taint.cpp:589:10:589:16 | call to _strinc | taint.cpp:591:8:591:12 | dest2 | |
-| taint.cpp:589:18:589:22 | clean | taint.cpp:589:10:589:16 | call to _strinc | TAINT |
-| taint.cpp:589:25:589:30 | locale | taint.cpp:589:10:589:16 | call to _strinc | TAINT |
-| taint.cpp:590:7:590:11 | ref arg dest2 | taint.cpp:591:8:591:12 | dest2 | |
-| taint.cpp:591:8:591:12 | dest2 | taint.cpp:591:7:591:12 | * ... | TAINT |
-| taint.cpp:594:34:594:48 | source_unsigned | taint.cpp:595:26:595:40 | source_unsigned | |
-| taint.cpp:594:57:594:62 | source | taint.cpp:599:40:599:45 | source | |
-| taint.cpp:595:18:595:24 | call to _mbsinc | taint.cpp:595:2:595:41 | ... = ... | |
-| taint.cpp:595:18:595:24 | call to _mbsinc | taint.cpp:596:7:596:19 | dest_unsigned | |
-| taint.cpp:595:18:595:24 | call to _mbsinc | taint.cpp:597:8:597:20 | dest_unsigned | |
-| taint.cpp:595:26:595:40 | source_unsigned | taint.cpp:595:18:595:24 | call to _mbsinc | TAINT |
-| taint.cpp:596:7:596:19 | ref arg dest_unsigned | taint.cpp:597:8:597:20 | dest_unsigned | |
-| taint.cpp:597:8:597:20 | dest_unsigned | taint.cpp:597:7:597:20 | * ... | TAINT |
-| taint.cpp:599:16:599:22 | call to _mbsinc | taint.cpp:599:2:599:46 | ... = ... | |
-| taint.cpp:599:16:599:22 | call to _mbsinc | taint.cpp:600:7:600:10 | dest | |
-| taint.cpp:599:16:599:22 | call to _mbsinc | taint.cpp:601:8:601:11 | dest | |
-| taint.cpp:599:40:599:45 | source | taint.cpp:599:16:599:22 | call to _mbsinc | TAINT |
-| taint.cpp:600:7:600:10 | ref arg dest | taint.cpp:601:8:601:11 | dest | |
-| taint.cpp:601:8:601:11 | dest | taint.cpp:601:7:601:11 | * ... | TAINT |
-| taint.cpp:604:40:604:45 | source | taint.cpp:605:18:605:23 | source | |
-| taint.cpp:604:40:604:45 | source | taint.cpp:605:31:605:36 | source | |
-| taint.cpp:604:40:604:45 | source | taint.cpp:611:25:611:30 | source | |
-| taint.cpp:604:40:604:45 | source | taint.cpp:616:18:616:23 | source | |
-| taint.cpp:604:63:604:67 | clean | taint.cpp:611:18:611:22 | clean | |
-| taint.cpp:604:63:604:67 | clean | taint.cpp:616:26:616:30 | clean | |
-| taint.cpp:605:10:605:16 | call to _strdec | taint.cpp:605:2:605:37 | ... = ... | |
-| taint.cpp:605:10:605:16 | call to _strdec | taint.cpp:606:7:606:11 | dest1 | |
-| taint.cpp:605:10:605:16 | call to _strdec | taint.cpp:607:8:607:12 | dest1 | |
-| taint.cpp:605:18:605:23 | source | taint.cpp:605:18:605:28 | ... + ... | TAINT |
-| taint.cpp:605:18:605:28 | ... + ... | taint.cpp:605:10:605:16 | call to _strdec | TAINT |
-| taint.cpp:605:27:605:28 | 12 | taint.cpp:605:18:605:28 | ... + ... | TAINT |
-| taint.cpp:605:31:605:36 | source | taint.cpp:605:10:605:16 | call to _strdec | TAINT |
-| taint.cpp:606:7:606:11 | ref arg dest1 | taint.cpp:607:8:607:12 | dest1 | |
-| taint.cpp:607:8:607:12 | dest1 | taint.cpp:607:7:607:12 | * ... | TAINT |
-| taint.cpp:611:10:611:16 | call to _strdec | taint.cpp:611:2:611:31 | ... = ... | |
-| taint.cpp:611:10:611:16 | call to _strdec | taint.cpp:612:7:612:11 | dest2 | |
-| taint.cpp:611:10:611:16 | call to _strdec | taint.cpp:613:8:613:12 | dest2 | |
-| taint.cpp:611:18:611:22 | clean | taint.cpp:611:10:611:16 | call to _strdec | TAINT |
-| taint.cpp:611:25:611:30 | source | taint.cpp:611:10:611:16 | call to _strdec | TAINT |
+| taint.cpp:367:24:367:29 | source | taint.cpp:371:13:371:18 | source | |
+| taint.cpp:367:24:367:29 | source | taint.cpp:373:14:373:19 | source | |
+| taint.cpp:371:6:371:11 | call to strdup | taint.cpp:371:2:371:19 | ... = ... | |
+| taint.cpp:371:6:371:11 | call to strdup | taint.cpp:374:7:374:7 | a | |
+| taint.cpp:371:13:371:18 | source | taint.cpp:371:6:371:11 | call to strdup | TAINT |
+| taint.cpp:372:6:372:11 | call to strdup | taint.cpp:372:2:372:27 | ... = ... | |
+| taint.cpp:372:6:372:11 | call to strdup | taint.cpp:375:7:375:7 | b | |
+| taint.cpp:372:13:372:26 | hello, world | taint.cpp:372:6:372:11 | call to strdup | TAINT |
+| taint.cpp:373:6:373:12 | call to strndup | taint.cpp:373:2:373:25 | ... = ... | |
+| taint.cpp:373:6:373:12 | call to strndup | taint.cpp:376:7:376:7 | c | |
+| taint.cpp:373:14:373:19 | source | taint.cpp:373:6:373:12 | call to strndup | TAINT |
+| taint.cpp:373:22:373:24 | 100 | taint.cpp:373:6:373:12 | call to strndup | TAINT |
+| taint.cpp:379:23:379:28 | source | taint.cpp:383:30:383:35 | source | |
+| taint.cpp:383:6:383:12 | call to strndup | taint.cpp:383:2:383:36 | ... = ... | |
+| taint.cpp:383:6:383:12 | call to strndup | taint.cpp:384:7:384:7 | a | |
+| taint.cpp:383:14:383:27 | hello, world | taint.cpp:383:6:383:12 | call to strndup | TAINT |
+| taint.cpp:383:30:383:35 | source | taint.cpp:383:6:383:12 | call to strndup | TAINT |
+| taint.cpp:387:27:387:32 | source | taint.cpp:391:13:391:18 | source | |
+| taint.cpp:391:6:391:11 | call to wcsdup | taint.cpp:391:2:391:19 | ... = ... | |
+| taint.cpp:391:6:391:11 | call to wcsdup | taint.cpp:393:7:393:7 | a | |
+| taint.cpp:391:13:391:18 | source | taint.cpp:391:6:391:11 | call to wcsdup | TAINT |
+| taint.cpp:392:6:392:11 | call to wcsdup | taint.cpp:392:2:392:28 | ... = ... | |
+| taint.cpp:392:6:392:11 | call to wcsdup | taint.cpp:394:7:394:7 | b | |
+| taint.cpp:392:13:392:27 | hello, world | taint.cpp:392:6:392:11 | call to wcsdup | TAINT |
+| taint.cpp:397:25:397:30 | source | taint.cpp:401:14:401:19 | source | |
+| taint.cpp:397:25:397:30 | source | taint.cpp:403:15:403:20 | source | |
+| taint.cpp:401:6:401:12 | call to strdupa | taint.cpp:401:2:401:20 | ... = ... | |
+| taint.cpp:401:6:401:12 | call to strdupa | taint.cpp:404:7:404:7 | a | |
+| taint.cpp:401:14:401:19 | source | taint.cpp:401:6:401:12 | call to strdupa | TAINT |
+| taint.cpp:402:6:402:12 | call to strdupa | taint.cpp:402:2:402:28 | ... = ... | |
+| taint.cpp:402:6:402:12 | call to strdupa | taint.cpp:405:7:405:7 | b | |
+| taint.cpp:402:14:402:27 | hello, world | taint.cpp:402:6:402:12 | call to strdupa | TAINT |
+| taint.cpp:403:6:403:13 | call to strndupa | taint.cpp:403:2:403:26 | ... = ... | |
+| taint.cpp:403:6:403:13 | call to strndupa | taint.cpp:406:7:406:7 | c | |
+| taint.cpp:403:15:403:20 | source | taint.cpp:403:6:403:13 | call to strndupa | TAINT |
+| taint.cpp:403:23:403:25 | 100 | taint.cpp:403:6:403:13 | call to strndupa | TAINT |
+| taint.cpp:409:24:409:29 | source | taint.cpp:413:31:413:36 | source | |
+| taint.cpp:413:6:413:13 | call to strndupa | taint.cpp:413:2:413:37 | ... = ... | |
+| taint.cpp:413:6:413:13 | call to strndupa | taint.cpp:414:7:414:7 | a | |
+| taint.cpp:413:15:413:28 | hello, world | taint.cpp:413:6:413:13 | call to strndupa | TAINT |
+| taint.cpp:413:31:413:36 | source | taint.cpp:413:6:413:13 | call to strndupa | TAINT |
+| taint.cpp:439:13:439:13 | 0 | taint.cpp:439:13:439:14 | call to MyClass2 | TAINT |
+| taint.cpp:439:13:439:14 | call to MyClass2 | taint.cpp:442:7:442:7 | a | |
+| taint.cpp:439:13:439:14 | call to MyClass2 | taint.cpp:443:7:443:7 | a | |
+| taint.cpp:439:13:439:14 | call to MyClass2 | taint.cpp:444:2:444:2 | a | |
+| taint.cpp:439:13:439:14 | call to MyClass2 | taint.cpp:445:7:445:7 | a | |
+| taint.cpp:439:13:439:14 | call to MyClass2 | taint.cpp:446:7:446:7 | a | |
+| taint.cpp:439:19:439:19 | 0 | taint.cpp:439:19:439:20 | call to MyClass2 | TAINT |
+| taint.cpp:439:19:439:20 | call to MyClass2 | taint.cpp:448:7:448:7 | b | |
+| taint.cpp:439:19:439:20 | call to MyClass2 | taint.cpp:449:7:449:7 | b | |
+| taint.cpp:439:19:439:20 | call to MyClass2 | taint.cpp:450:2:450:2 | b | |
+| taint.cpp:439:19:439:20 | call to MyClass2 | taint.cpp:451:7:451:7 | b | |
+| taint.cpp:439:19:439:20 | call to MyClass2 | taint.cpp:452:7:452:7 | b | |
+| taint.cpp:439:19:439:20 | call to MyClass2 | taint.cpp:453:7:453:7 | b | |
+| taint.cpp:440:13:440:14 | | taint.cpp:440:13:440:15 | call to MyClass3 | TAINT |
+| taint.cpp:440:13:440:15 | call to MyClass3 | taint.cpp:465:7:465:7 | d | |
+| taint.cpp:440:13:440:15 | call to MyClass3 | taint.cpp:466:7:466:7 | d | |
+| taint.cpp:440:13:440:15 | call to MyClass3 | taint.cpp:467:2:467:2 | d | |
+| taint.cpp:440:13:440:15 | call to MyClass3 | taint.cpp:468:7:468:7 | d | |
+| taint.cpp:440:13:440:15 | call to MyClass3 | taint.cpp:469:7:469:7 | d | |
+| taint.cpp:443:7:443:7 | ref arg a | taint.cpp:444:2:444:2 | a | |
+| taint.cpp:443:7:443:7 | ref arg a | taint.cpp:445:7:445:7 | a | |
+| taint.cpp:443:7:443:7 | ref arg a | taint.cpp:446:7:446:7 | a | |
+| taint.cpp:444:2:444:2 | ref arg a | taint.cpp:445:7:445:7 | a | |
+| taint.cpp:444:2:444:2 | ref arg a | taint.cpp:446:7:446:7 | a | |
+| taint.cpp:449:7:449:7 | ref arg b | taint.cpp:450:2:450:2 | b | |
+| taint.cpp:449:7:449:7 | ref arg b | taint.cpp:451:7:451:7 | b | |
+| taint.cpp:449:7:449:7 | ref arg b | taint.cpp:452:7:452:7 | b | |
+| taint.cpp:449:7:449:7 | ref arg b | taint.cpp:453:7:453:7 | b | |
+| taint.cpp:450:2:450:2 | b [post update] | taint.cpp:451:7:451:7 | b | |
+| taint.cpp:450:2:450:2 | b [post update] | taint.cpp:452:7:452:7 | b | |
+| taint.cpp:450:2:450:2 | b [post update] | taint.cpp:453:7:453:7 | b | |
+| taint.cpp:450:2:450:20 | ... = ... | taint.cpp:450:4:450:9 | member [post update] | |
+| taint.cpp:450:2:450:20 | ... = ... | taint.cpp:452:9:452:14 | member | |
+| taint.cpp:450:13:450:18 | call to source | taint.cpp:450:2:450:20 | ... = ... | |
+| taint.cpp:455:6:455:20 | call to MyClass2 | taint.cpp:455:6:455:20 | new | |
+| taint.cpp:455:6:455:20 | new | taint.cpp:455:2:455:20 | ... = ... | |
+| taint.cpp:455:6:455:20 | new | taint.cpp:457:7:457:7 | c | |
+| taint.cpp:455:6:455:20 | new | taint.cpp:458:7:458:7 | c | |
+| taint.cpp:455:6:455:20 | new | taint.cpp:459:2:459:2 | c | |
+| taint.cpp:455:6:455:20 | new | taint.cpp:460:7:460:7 | c | |
+| taint.cpp:455:6:455:20 | new | taint.cpp:461:7:461:7 | c | |
+| taint.cpp:455:6:455:20 | new | taint.cpp:463:9:463:9 | c | |
+| taint.cpp:455:19:455:19 | 0 | taint.cpp:455:6:455:20 | call to MyClass2 | TAINT |
+| taint.cpp:457:7:457:7 | ref arg c | taint.cpp:458:7:458:7 | c | |
+| taint.cpp:457:7:457:7 | ref arg c | taint.cpp:459:2:459:2 | c | |
+| taint.cpp:457:7:457:7 | ref arg c | taint.cpp:460:7:460:7 | c | |
+| taint.cpp:457:7:457:7 | ref arg c | taint.cpp:461:7:461:7 | c | |
+| taint.cpp:457:7:457:7 | ref arg c | taint.cpp:463:9:463:9 | c | |
+| taint.cpp:458:7:458:7 | ref arg c | taint.cpp:459:2:459:2 | c | |
+| taint.cpp:458:7:458:7 | ref arg c | taint.cpp:460:7:460:7 | c | |
+| taint.cpp:458:7:458:7 | ref arg c | taint.cpp:461:7:461:7 | c | |
+| taint.cpp:458:7:458:7 | ref arg c | taint.cpp:463:9:463:9 | c | |
+| taint.cpp:459:2:459:2 | ref arg c | taint.cpp:460:7:460:7 | c | |
+| taint.cpp:459:2:459:2 | ref arg c | taint.cpp:461:7:461:7 | c | |
+| taint.cpp:459:2:459:2 | ref arg c | taint.cpp:463:9:463:9 | c | |
+| taint.cpp:460:7:460:7 | ref arg c | taint.cpp:461:7:461:7 | c | |
+| taint.cpp:460:7:460:7 | ref arg c | taint.cpp:463:9:463:9 | c | |
+| taint.cpp:461:7:461:7 | ref arg c | taint.cpp:463:9:463:9 | c | |
+| taint.cpp:463:9:463:9 | c | taint.cpp:463:2:463:9 | delete | TAINT |
+| taint.cpp:466:7:466:7 | ref arg d | taint.cpp:467:2:467:2 | d | |
+| taint.cpp:466:7:466:7 | ref arg d | taint.cpp:468:7:468:7 | d | |
+| taint.cpp:466:7:466:7 | ref arg d | taint.cpp:469:7:469:7 | d | |
+| taint.cpp:467:2:467:2 | ref arg d | taint.cpp:468:7:468:7 | d | |
+| taint.cpp:467:2:467:2 | ref arg d | taint.cpp:469:7:469:7 | d | |
+| taint.cpp:474:16:474:16 | a | taint.cpp:476:10:476:10 | a | |
+| taint.cpp:474:24:474:24 | b | taint.cpp:477:6:477:6 | b | |
+| taint.cpp:476:10:476:10 | a | taint.cpp:478:6:478:6 | c | |
+| taint.cpp:477:2:477:2 | a [post update] | taint.cpp:474:16:474:16 | a | |
+| taint.cpp:477:2:477:6 | ... = ... | taint.cpp:477:2:477:2 | a [post update] | |
+| taint.cpp:477:6:477:6 | b | taint.cpp:474:16:474:16 | a | |
+| taint.cpp:477:6:477:6 | b | taint.cpp:477:2:477:6 | ... = ... | |
+| taint.cpp:478:2:478:2 | b [post update] | taint.cpp:474:24:474:24 | b | |
+| taint.cpp:478:2:478:6 | ... = ... | taint.cpp:478:2:478:2 | b [post update] | |
+| taint.cpp:478:6:478:6 | c | taint.cpp:474:24:474:24 | b | |
+| taint.cpp:478:6:478:6 | c | taint.cpp:478:2:478:6 | ... = ... | |
+| taint.cpp:484:6:484:11 | call to source | taint.cpp:484:2:484:13 | ... = ... | |
+| taint.cpp:484:6:484:11 | call to source | taint.cpp:487:7:487:7 | x | |
+| taint.cpp:484:6:484:11 | call to source | taint.cpp:490:7:490:7 | x | |
+| taint.cpp:484:6:484:11 | call to source | taint.cpp:492:7:492:7 | x | |
+| taint.cpp:485:6:485:6 | 0 | taint.cpp:485:2:485:6 | ... = ... | |
+| taint.cpp:485:6:485:6 | 0 | taint.cpp:488:7:488:7 | y | |
+| taint.cpp:485:6:485:6 | 0 | taint.cpp:490:10:490:10 | y | |
+| taint.cpp:485:6:485:6 | 0 | taint.cpp:493:7:493:7 | y | |
+| taint.cpp:490:7:490:7 | ref arg x | taint.cpp:492:7:492:7 | x | |
+| taint.cpp:490:10:490:10 | ref arg y | taint.cpp:493:7:493:7 | y | |
+| taint.cpp:502:26:502:32 | source1 | taint.cpp:505:28:505:34 | source1 | |
+| taint.cpp:503:15:503:21 | 0 | taint.cpp:505:12:505:15 | line | |
+| taint.cpp:503:15:503:21 | 0 | taint.cpp:507:7:507:10 | line | |
+| taint.cpp:504:9:504:9 | n | taint.cpp:505:19:505:19 | n | |
+| taint.cpp:505:11:505:15 | ref arg & ... | taint.cpp:505:12:505:15 | line [inner post update] | |
+| taint.cpp:505:11:505:15 | ref arg & ... | taint.cpp:507:7:507:10 | line | |
+| taint.cpp:505:12:505:15 | line | taint.cpp:505:11:505:15 | & ... | |
+| taint.cpp:505:18:505:19 | ref arg & ... | taint.cpp:505:19:505:19 | n [inner post update] | |
+| taint.cpp:505:19:505:19 | n | taint.cpp:505:18:505:19 | & ... | |
+| taint.cpp:505:28:505:34 | source1 | taint.cpp:505:11:505:15 | ref arg & ... | TAINT |
+| taint.cpp:514:24:514:29 | source | taint.cpp:516:27:516:32 | source | |
+| taint.cpp:515:22:515:29 | ,.-;:_ | taint.cpp:516:35:516:39 | delim | |
+| taint.cpp:515:22:515:29 | ,.-;:_ | taint.cpp:518:7:518:11 | delim | |
+| taint.cpp:516:20:516:25 | call to strtok | taint.cpp:517:7:517:15 | tokenized | |
+| taint.cpp:516:27:516:32 | source | taint.cpp:516:20:516:25 | call to strtok | TAINT |
+| taint.cpp:525:26:525:28 | ptr | taint.cpp:526:10:526:12 | ptr | |
+| taint.cpp:525:26:525:28 | ptr | taint.cpp:527:7:527:9 | ptr | |
+| taint.cpp:525:26:525:28 | ptr | taint.cpp:528:8:528:10 | ptr | |
+| taint.cpp:525:36:525:41 | source | taint.cpp:526:15:526:20 | source | |
+| taint.cpp:526:10:526:12 | ptr | taint.cpp:526:2:526:8 | call to _strset | |
+| taint.cpp:526:10:526:12 | ref arg ptr | taint.cpp:527:7:527:9 | ptr | |
+| taint.cpp:526:10:526:12 | ref arg ptr | taint.cpp:528:8:528:10 | ptr | |
+| taint.cpp:526:15:526:20 | source | taint.cpp:526:2:526:8 | call to _strset | TAINT |
+| taint.cpp:526:15:526:20 | source | taint.cpp:526:10:526:12 | ref arg ptr | |
+| taint.cpp:527:7:527:9 | ref arg ptr | taint.cpp:528:8:528:10 | ptr | |
+| taint.cpp:528:8:528:10 | ptr | taint.cpp:528:7:528:10 | * ... | TAINT |
+| taint.cpp:531:26:531:31 | source | taint.cpp:532:10:532:15 | source | |
+| taint.cpp:531:26:531:31 | source | taint.cpp:533:7:533:12 | source | |
+| taint.cpp:532:10:532:15 | ref arg source | taint.cpp:533:7:533:12 | source | |
+| taint.cpp:532:10:532:15 | source | taint.cpp:532:2:532:8 | call to _strset | |
+| taint.cpp:532:18:532:18 | 0 | taint.cpp:532:2:532:8 | call to _strset | TAINT |
+| taint.cpp:532:18:532:18 | 0 | taint.cpp:532:10:532:15 | ref arg source | |
+| taint.cpp:540:24:540:29 | source | taint.cpp:542:14:542:19 | source | |
+| taint.cpp:541:6:541:6 | x | taint.cpp:542:11:542:11 | x | |
+| taint.cpp:541:6:541:6 | x | taint.cpp:543:7:543:7 | x | |
+| taint.cpp:542:10:542:11 | & ... | taint.cpp:542:2:542:8 | call to mempcpy | |
+| taint.cpp:542:10:542:11 | ref arg & ... | taint.cpp:542:11:542:11 | x [inner post update] | |
+| taint.cpp:542:10:542:11 | ref arg & ... | taint.cpp:543:7:543:7 | x | |
+| taint.cpp:542:11:542:11 | x | taint.cpp:542:10:542:11 | & ... | |
+| taint.cpp:542:14:542:19 | source | taint.cpp:542:2:542:8 | call to mempcpy | TAINT |
+| taint.cpp:542:14:542:19 | source | taint.cpp:542:10:542:11 | ref arg & ... | TAINT |
+| taint.cpp:550:24:550:29 | source | taint.cpp:552:16:552:21 | source | |
+| taint.cpp:551:6:551:9 | dest | taint.cpp:552:10:552:13 | dest | |
+| taint.cpp:551:6:551:9 | dest | taint.cpp:552:35:552:38 | dest | |
+| taint.cpp:551:6:551:9 | dest | taint.cpp:553:7:553:10 | dest | |
+| taint.cpp:552:10:552:13 | dest | taint.cpp:552:2:552:8 | call to memccpy | |
+| taint.cpp:552:10:552:13 | ref arg dest | taint.cpp:553:7:553:10 | dest | |
+| taint.cpp:552:16:552:21 | source | taint.cpp:552:2:552:8 | call to memccpy | TAINT |
+| taint.cpp:552:16:552:21 | source | taint.cpp:552:10:552:13 | ref arg dest | TAINT |
+| taint.cpp:560:24:560:28 | dest1 | taint.cpp:561:9:561:13 | dest1 | |
+| taint.cpp:560:24:560:28 | dest1 | taint.cpp:562:7:562:11 | dest1 | |
+| taint.cpp:560:37:560:41 | dest2 | taint.cpp:564:9:564:13 | dest2 | |
+| taint.cpp:560:37:560:41 | dest2 | taint.cpp:565:7:565:11 | dest2 | |
+| taint.cpp:560:50:560:54 | clean | taint.cpp:564:16:564:20 | clean | |
+| taint.cpp:560:63:560:68 | source | taint.cpp:561:16:561:21 | source | |
+| taint.cpp:561:9:561:13 | dest1 | taint.cpp:561:2:561:7 | call to strcat | |
+| taint.cpp:561:9:561:13 | dest1 | taint.cpp:561:9:561:13 | ref arg dest1 | TAINT |
+| taint.cpp:561:9:561:13 | ref arg dest1 | taint.cpp:562:7:562:11 | dest1 | |
+| taint.cpp:561:16:561:21 | source | taint.cpp:561:9:561:13 | ref arg dest1 | TAINT |
+| taint.cpp:564:9:564:13 | dest2 | taint.cpp:564:2:564:7 | call to strcat | |
+| taint.cpp:564:9:564:13 | dest2 | taint.cpp:564:9:564:13 | ref arg dest2 | TAINT |
+| taint.cpp:564:9:564:13 | ref arg dest2 | taint.cpp:565:7:565:11 | dest2 | |
+| taint.cpp:564:16:564:20 | clean | taint.cpp:564:9:564:13 | ref arg dest2 | TAINT |
+| taint.cpp:572:37:572:41 | dest1 | taint.cpp:574:36:574:40 | dest1 | |
+| taint.cpp:572:37:572:41 | dest1 | taint.cpp:575:7:575:11 | dest1 | |
+| taint.cpp:572:37:572:41 | dest1 | taint.cpp:576:8:576:12 | dest1 | |
+| taint.cpp:572:65:572:67 | ptr | taint.cpp:574:43:574:45 | ptr | |
+| taint.cpp:572:65:572:67 | ptr | taint.cpp:580:43:580:45 | ptr | |
+| taint.cpp:572:85:572:89 | dest3 | taint.cpp:580:36:580:40 | dest3 | |
+| taint.cpp:572:85:572:89 | dest3 | taint.cpp:581:7:581:11 | dest3 | |
+| taint.cpp:572:85:572:89 | dest3 | taint.cpp:582:8:582:12 | dest3 | |
+| taint.cpp:573:32:573:36 | clean | taint.cpp:580:51:580:55 | clean | |
+| taint.cpp:573:49:573:54 | source | taint.cpp:574:51:574:56 | source | |
+| taint.cpp:573:61:573:61 | n | taint.cpp:574:48:574:48 | n | |
+| taint.cpp:573:61:573:61 | n | taint.cpp:580:48:580:48 | n | |
+| taint.cpp:574:25:574:34 | call to _mbsncat_l | taint.cpp:577:7:577:11 | dest2 | |
+| taint.cpp:574:25:574:34 | call to _mbsncat_l | taint.cpp:578:8:578:12 | dest2 | |
+| taint.cpp:574:36:574:40 | dest1 | taint.cpp:574:25:574:34 | call to _mbsncat_l | |
+| taint.cpp:574:36:574:40 | dest1 | taint.cpp:574:36:574:40 | ref arg dest1 | TAINT |
+| taint.cpp:574:36:574:40 | ref arg dest1 | taint.cpp:575:7:575:11 | dest1 | |
+| taint.cpp:574:36:574:40 | ref arg dest1 | taint.cpp:576:8:576:12 | dest1 | |
+| taint.cpp:574:43:574:45 | ptr | taint.cpp:574:36:574:40 | ref arg dest1 | TAINT |
+| taint.cpp:574:48:574:48 | n | taint.cpp:574:36:574:40 | ref arg dest1 | TAINT |
+| taint.cpp:574:51:574:56 | source | taint.cpp:574:36:574:40 | ref arg dest1 | TAINT |
+| taint.cpp:575:7:575:11 | ref arg dest1 | taint.cpp:576:8:576:12 | dest1 | |
+| taint.cpp:576:8:576:12 | dest1 | taint.cpp:576:7:576:12 | * ... | TAINT |
+| taint.cpp:577:7:577:11 | ref arg dest2 | taint.cpp:578:8:578:12 | dest2 | |
+| taint.cpp:578:8:578:12 | dest2 | taint.cpp:578:7:578:12 | * ... | TAINT |
+| taint.cpp:580:25:580:34 | call to _mbsncat_l | taint.cpp:583:7:583:11 | dest4 | |
+| taint.cpp:580:25:580:34 | call to _mbsncat_l | taint.cpp:584:8:584:12 | dest4 | |
+| taint.cpp:580:36:580:40 | dest3 | taint.cpp:580:25:580:34 | call to _mbsncat_l | |
+| taint.cpp:580:36:580:40 | dest3 | taint.cpp:580:36:580:40 | ref arg dest3 | TAINT |
+| taint.cpp:580:36:580:40 | ref arg dest3 | taint.cpp:581:7:581:11 | dest3 | |
+| taint.cpp:580:36:580:40 | ref arg dest3 | taint.cpp:582:8:582:12 | dest3 | |
+| taint.cpp:580:43:580:45 | ptr | taint.cpp:580:36:580:40 | ref arg dest3 | TAINT |
+| taint.cpp:580:48:580:48 | n | taint.cpp:580:36:580:40 | ref arg dest3 | TAINT |
+| taint.cpp:580:51:580:55 | clean | taint.cpp:580:36:580:40 | ref arg dest3 | TAINT |
+| taint.cpp:581:7:581:11 | ref arg dest3 | taint.cpp:582:8:582:12 | dest3 | |
+| taint.cpp:582:8:582:12 | dest3 | taint.cpp:582:7:582:12 | * ... | TAINT |
+| taint.cpp:583:7:583:11 | ref arg dest4 | taint.cpp:584:8:584:12 | dest4 | |
+| taint.cpp:584:8:584:12 | dest4 | taint.cpp:584:7:584:12 | * ... | TAINT |
+| taint.cpp:591:24:591:29 | source | taint.cpp:594:29:594:34 | source | |
+| taint.cpp:592:23:592:30 | ,.-;:_ | taint.cpp:594:37:594:41 | delim | |
+| taint.cpp:594:9:594:17 | tokenized | taint.cpp:594:9:594:42 | ... = ... | |
+| taint.cpp:594:21:594:26 | call to strsep | taint.cpp:594:9:594:42 | ... = ... | |
+| taint.cpp:594:21:594:26 | call to strsep | taint.cpp:595:10:595:18 | tokenized | |
+| taint.cpp:594:21:594:26 | call to strsep | taint.cpp:596:11:596:19 | tokenized | |
+| taint.cpp:594:28:594:34 | & ... | taint.cpp:594:21:594:26 | call to strsep | TAINT |
+| taint.cpp:594:28:594:34 | ref arg & ... | taint.cpp:594:29:594:34 | source | |
+| taint.cpp:594:28:594:34 | ref arg & ... | taint.cpp:594:29:594:34 | source [inner post update] | |
+| taint.cpp:594:29:594:34 | source | taint.cpp:594:21:594:26 | call to strsep | TAINT |
+| taint.cpp:594:29:594:34 | source | taint.cpp:594:28:594:34 | & ... | |
+| taint.cpp:594:37:594:41 | delim | taint.cpp:594:21:594:26 | call to strsep | TAINT |
+| taint.cpp:595:10:595:18 | ref arg tokenized | taint.cpp:596:11:596:19 | tokenized | |
+| taint.cpp:596:11:596:19 | tokenized | taint.cpp:596:10:596:19 | * ... | TAINT |
+| taint.cpp:606:25:606:30 | source | taint.cpp:607:18:607:23 | source | |
+| taint.cpp:606:39:606:43 | clean | taint.cpp:611:18:611:22 | clean | |
+| taint.cpp:606:82:606:87 | locale | taint.cpp:607:26:607:31 | locale | |
+| taint.cpp:606:82:606:87 | locale | taint.cpp:611:25:611:30 | locale | |
+| taint.cpp:607:10:607:16 | call to _strinc | taint.cpp:607:2:607:32 | ... = ... | |
+| taint.cpp:607:10:607:16 | call to _strinc | taint.cpp:608:7:608:11 | dest1 | |
+| taint.cpp:607:10:607:16 | call to _strinc | taint.cpp:609:8:609:12 | dest1 | |
+| taint.cpp:607:18:607:23 | source | taint.cpp:607:10:607:16 | call to _strinc | TAINT |
+| taint.cpp:607:26:607:31 | locale | taint.cpp:607:10:607:16 | call to _strinc | TAINT |
+| taint.cpp:607:26:607:31 | ref arg locale | taint.cpp:611:25:611:30 | locale | |
+| taint.cpp:608:7:608:11 | ref arg dest1 | taint.cpp:609:8:609:12 | dest1 | |
+| taint.cpp:609:8:609:12 | dest1 | taint.cpp:609:7:609:12 | * ... | TAINT |
+| taint.cpp:611:10:611:16 | call to _strinc | taint.cpp:611:2:611:31 | ... = ... | |
+| taint.cpp:611:10:611:16 | call to _strinc | taint.cpp:612:7:612:11 | dest2 | |
+| taint.cpp:611:10:611:16 | call to _strinc | taint.cpp:613:8:613:12 | dest2 | |
+| taint.cpp:611:18:611:22 | clean | taint.cpp:611:10:611:16 | call to _strinc | TAINT |
+| taint.cpp:611:25:611:30 | locale | taint.cpp:611:10:611:16 | call to _strinc | TAINT |
| taint.cpp:612:7:612:11 | ref arg dest2 | taint.cpp:613:8:613:12 | dest2 | |
| taint.cpp:613:8:613:12 | dest2 | taint.cpp:613:7:613:12 | * ... | TAINT |
-| taint.cpp:616:10:616:16 | call to _strdec | taint.cpp:616:2:616:31 | ... = ... | |
-| taint.cpp:616:10:616:16 | call to _strdec | taint.cpp:617:7:617:11 | dest3 | |
-| taint.cpp:616:10:616:16 | call to _strdec | taint.cpp:618:8:618:12 | dest3 | |
-| taint.cpp:616:18:616:23 | source | taint.cpp:616:10:616:16 | call to _strdec | TAINT |
-| taint.cpp:616:26:616:30 | clean | taint.cpp:616:10:616:16 | call to _strdec | TAINT |
-| taint.cpp:617:7:617:11 | ref arg dest3 | taint.cpp:618:8:618:12 | dest3 | |
-| taint.cpp:618:8:618:12 | dest3 | taint.cpp:618:7:618:12 | * ... | TAINT |
-| taint.cpp:625:33:625:38 | source | taint.cpp:628:17:628:22 | source | |
-| taint.cpp:628:7:628:15 | call to _strnextc | taint.cpp:628:3:628:25 | ... = ... | |
-| taint.cpp:628:7:628:15 | call to _strnextc | taint.cpp:629:8:629:8 | c | |
-| taint.cpp:628:7:628:15 | call to _strnextc | taint.cpp:630:10:630:10 | c | |
-| taint.cpp:628:17:628:22 | source | taint.cpp:628:17:628:24 | ... ++ | |
-| taint.cpp:628:17:628:24 | ... ++ | taint.cpp:628:7:628:15 | call to _strnextc | TAINT |
-| taint.cpp:628:17:628:24 | ... ++ | taint.cpp:628:17:628:22 | source | TAINT |
-| taint.cpp:631:6:631:14 | call to _strnextc | taint.cpp:631:2:631:18 | ... = ... | |
-| taint.cpp:631:6:631:14 | call to _strnextc | taint.cpp:632:7:632:7 | c | |
-| taint.cpp:631:16:631:17 | | taint.cpp:631:6:631:14 | call to _strnextc | TAINT |
-| taint.cpp:640:9:640:12 | this | taint.cpp:640:25:640:29 | this | |
-| taint.cpp:643:33:643:38 | source | taint.cpp:645:20:645:25 | source | |
-| taint.cpp:644:30:644:30 | c | taint.cpp:645:10:645:10 | c | |
-| taint.cpp:644:30:644:30 | c | taint.cpp:646:8:646:8 | c | |
-| taint.cpp:645:10:645:10 | ref arg c | taint.cpp:646:8:646:8 | c | |
-| taint.cpp:645:12:645:15 | call to data | taint.cpp:645:3:645:8 | call to memcpy | |
-| taint.cpp:645:20:645:25 | source | taint.cpp:645:3:645:8 | call to memcpy | TAINT |
-| taint.cpp:645:20:645:25 | source | taint.cpp:645:12:645:15 | ref arg call to data | TAINT |
-| taint.cpp:652:9:652:12 | this | taint.cpp:652:31:652:35 | this | |
-| taint.cpp:655:35:655:40 | source | taint.cpp:657:20:657:25 | source | |
-| taint.cpp:656:27:656:27 | c | taint.cpp:657:10:657:10 | c | |
-| taint.cpp:656:27:656:27 | c | taint.cpp:658:8:658:8 | c | |
-| taint.cpp:657:10:657:10 | ref arg c | taint.cpp:658:8:658:8 | c | |
-| taint.cpp:657:12:657:15 | call to data | taint.cpp:657:3:657:8 | call to memcpy | |
-| taint.cpp:657:20:657:25 | source | taint.cpp:657:3:657:8 | call to memcpy | TAINT |
-| taint.cpp:657:20:657:25 | source | taint.cpp:657:12:657:15 | ref arg call to data | TAINT |
-| taint.cpp:668:14:668:14 | s | taint.cpp:669:18:669:18 | s | |
-| taint.cpp:668:14:668:14 | s | taint.cpp:671:7:671:7 | s | |
-| taint.cpp:668:14:668:14 | s | taint.cpp:672:7:672:7 | s | |
-| taint.cpp:668:14:668:14 | s | taint.cpp:673:7:673:7 | s | |
-| taint.cpp:669:18:669:18 | s [post update] | taint.cpp:671:7:671:7 | s | |
-| taint.cpp:669:18:669:18 | s [post update] | taint.cpp:672:7:672:7 | s | |
-| taint.cpp:669:18:669:18 | s [post update] | taint.cpp:673:7:673:7 | s | |
-| taint.cpp:669:20:669:20 | ref arg x | taint.cpp:672:9:672:9 | x | |
-| taint.cpp:672:7:672:7 | s [post update] | taint.cpp:673:7:673:7 | s | |
+| taint.cpp:616:34:616:48 | source_unsigned | taint.cpp:617:26:617:40 | source_unsigned | |
+| taint.cpp:616:57:616:62 | source | taint.cpp:621:40:621:45 | source | |
+| taint.cpp:617:18:617:24 | call to _mbsinc | taint.cpp:617:2:617:41 | ... = ... | |
+| taint.cpp:617:18:617:24 | call to _mbsinc | taint.cpp:618:7:618:19 | dest_unsigned | |
+| taint.cpp:617:18:617:24 | call to _mbsinc | taint.cpp:619:8:619:20 | dest_unsigned | |
+| taint.cpp:617:26:617:40 | source_unsigned | taint.cpp:617:18:617:24 | call to _mbsinc | TAINT |
+| taint.cpp:618:7:618:19 | ref arg dest_unsigned | taint.cpp:619:8:619:20 | dest_unsigned | |
+| taint.cpp:619:8:619:20 | dest_unsigned | taint.cpp:619:7:619:20 | * ... | TAINT |
+| taint.cpp:621:16:621:22 | call to _mbsinc | taint.cpp:621:2:621:46 | ... = ... | |
+| taint.cpp:621:16:621:22 | call to _mbsinc | taint.cpp:622:7:622:10 | dest | |
+| taint.cpp:621:16:621:22 | call to _mbsinc | taint.cpp:623:8:623:11 | dest | |
+| taint.cpp:621:40:621:45 | source | taint.cpp:621:16:621:22 | call to _mbsinc | TAINT |
+| taint.cpp:622:7:622:10 | ref arg dest | taint.cpp:623:8:623:11 | dest | |
+| taint.cpp:623:8:623:11 | dest | taint.cpp:623:7:623:11 | * ... | TAINT |
+| taint.cpp:626:40:626:45 | source | taint.cpp:627:18:627:23 | source | |
+| taint.cpp:626:40:626:45 | source | taint.cpp:627:31:627:36 | source | |
+| taint.cpp:626:40:626:45 | source | taint.cpp:633:25:633:30 | source | |
+| taint.cpp:626:40:626:45 | source | taint.cpp:638:18:638:23 | source | |
+| taint.cpp:626:63:626:67 | clean | taint.cpp:633:18:633:22 | clean | |
+| taint.cpp:626:63:626:67 | clean | taint.cpp:638:26:638:30 | clean | |
+| taint.cpp:627:10:627:16 | call to _strdec | taint.cpp:627:2:627:37 | ... = ... | |
+| taint.cpp:627:10:627:16 | call to _strdec | taint.cpp:628:7:628:11 | dest1 | |
+| taint.cpp:627:10:627:16 | call to _strdec | taint.cpp:629:8:629:12 | dest1 | |
+| taint.cpp:627:18:627:23 | source | taint.cpp:627:18:627:28 | ... + ... | TAINT |
+| taint.cpp:627:18:627:28 | ... + ... | taint.cpp:627:10:627:16 | call to _strdec | TAINT |
+| taint.cpp:627:27:627:28 | 12 | taint.cpp:627:18:627:28 | ... + ... | TAINT |
+| taint.cpp:627:31:627:36 | source | taint.cpp:627:10:627:16 | call to _strdec | TAINT |
+| taint.cpp:628:7:628:11 | ref arg dest1 | taint.cpp:629:8:629:12 | dest1 | |
+| taint.cpp:629:8:629:12 | dest1 | taint.cpp:629:7:629:12 | * ... | TAINT |
+| taint.cpp:633:10:633:16 | call to _strdec | taint.cpp:633:2:633:31 | ... = ... | |
+| taint.cpp:633:10:633:16 | call to _strdec | taint.cpp:634:7:634:11 | dest2 | |
+| taint.cpp:633:10:633:16 | call to _strdec | taint.cpp:635:8:635:12 | dest2 | |
+| taint.cpp:633:18:633:22 | clean | taint.cpp:633:10:633:16 | call to _strdec | TAINT |
+| taint.cpp:633:25:633:30 | source | taint.cpp:633:10:633:16 | call to _strdec | TAINT |
+| taint.cpp:634:7:634:11 | ref arg dest2 | taint.cpp:635:8:635:12 | dest2 | |
+| taint.cpp:635:8:635:12 | dest2 | taint.cpp:635:7:635:12 | * ... | TAINT |
+| taint.cpp:638:10:638:16 | call to _strdec | taint.cpp:638:2:638:31 | ... = ... | |
+| taint.cpp:638:10:638:16 | call to _strdec | taint.cpp:639:7:639:11 | dest3 | |
+| taint.cpp:638:10:638:16 | call to _strdec | taint.cpp:640:8:640:12 | dest3 | |
+| taint.cpp:638:18:638:23 | source | taint.cpp:638:10:638:16 | call to _strdec | TAINT |
+| taint.cpp:638:26:638:30 | clean | taint.cpp:638:10:638:16 | call to _strdec | TAINT |
+| taint.cpp:639:7:639:11 | ref arg dest3 | taint.cpp:640:8:640:12 | dest3 | |
+| taint.cpp:640:8:640:12 | dest3 | taint.cpp:640:7:640:12 | * ... | TAINT |
+| taint.cpp:647:33:647:38 | source | taint.cpp:650:17:650:22 | source | |
+| taint.cpp:650:7:650:15 | call to _strnextc | taint.cpp:650:3:650:25 | ... = ... | |
+| taint.cpp:650:7:650:15 | call to _strnextc | taint.cpp:651:8:651:8 | c | |
+| taint.cpp:650:7:650:15 | call to _strnextc | taint.cpp:652:10:652:10 | c | |
+| taint.cpp:650:17:650:22 | source | taint.cpp:650:17:650:24 | ... ++ | |
+| taint.cpp:650:17:650:24 | ... ++ | taint.cpp:650:7:650:15 | call to _strnextc | TAINT |
+| taint.cpp:650:17:650:24 | ... ++ | taint.cpp:650:17:650:22 | source | TAINT |
+| taint.cpp:653:6:653:14 | call to _strnextc | taint.cpp:653:2:653:18 | ... = ... | |
+| taint.cpp:653:6:653:14 | call to _strnextc | taint.cpp:654:7:654:7 | c | |
+| taint.cpp:653:16:653:17 | | taint.cpp:653:6:653:14 | call to _strnextc | TAINT |
+| taint.cpp:662:9:662:12 | this | taint.cpp:662:25:662:29 | this | |
+| taint.cpp:665:33:665:38 | source | taint.cpp:667:20:667:25 | source | |
+| taint.cpp:666:30:666:30 | c | taint.cpp:667:10:667:10 | c | |
+| taint.cpp:666:30:666:30 | c | taint.cpp:668:8:668:8 | c | |
+| taint.cpp:667:10:667:10 | ref arg c | taint.cpp:668:8:668:8 | c | |
+| taint.cpp:667:12:667:15 | call to data | taint.cpp:667:3:667:8 | call to memcpy | |
+| taint.cpp:667:20:667:25 | source | taint.cpp:667:3:667:8 | call to memcpy | TAINT |
+| taint.cpp:667:20:667:25 | source | taint.cpp:667:12:667:15 | ref arg call to data | TAINT |
+| taint.cpp:674:9:674:12 | this | taint.cpp:674:31:674:35 | this | |
+| taint.cpp:677:35:677:40 | source | taint.cpp:679:20:679:25 | source | |
+| taint.cpp:678:27:678:27 | c | taint.cpp:679:10:679:10 | c | |
+| taint.cpp:678:27:678:27 | c | taint.cpp:680:8:680:8 | c | |
+| taint.cpp:679:10:679:10 | ref arg c | taint.cpp:680:8:680:8 | c | |
+| taint.cpp:679:12:679:15 | call to data | taint.cpp:679:3:679:8 | call to memcpy | |
+| taint.cpp:679:20:679:25 | source | taint.cpp:679:3:679:8 | call to memcpy | TAINT |
+| taint.cpp:679:20:679:25 | source | taint.cpp:679:12:679:15 | ref arg call to data | TAINT |
+| taint.cpp:690:14:690:14 | s | taint.cpp:691:18:691:18 | s | |
+| taint.cpp:690:14:690:14 | s | taint.cpp:693:7:693:7 | s | |
+| taint.cpp:690:14:690:14 | s | taint.cpp:694:7:694:7 | s | |
+| taint.cpp:690:14:690:14 | s | taint.cpp:695:7:695:7 | s | |
+| taint.cpp:691:18:691:18 | s [post update] | taint.cpp:693:7:693:7 | s | |
+| taint.cpp:691:18:691:18 | s [post update] | taint.cpp:694:7:694:7 | s | |
+| taint.cpp:691:18:691:18 | s [post update] | taint.cpp:695:7:695:7 | s | |
+| taint.cpp:691:20:691:20 | ref arg x | taint.cpp:694:9:694:9 | x | |
+| taint.cpp:694:7:694:7 | s [post update] | taint.cpp:695:7:695:7 | s | |
| vector.cpp:16:43:16:49 | source1 | vector.cpp:17:26:17:32 | source1 | |
| vector.cpp:16:43:16:49 | source1 | vector.cpp:31:38:31:44 | source1 | |
| vector.cpp:17:21:17:33 | call to vector | vector.cpp:19:14:19:14 | v | |
diff --git a/cpp/ql/test/library-tests/dataflow/taint-tests/taint.cpp b/cpp/ql/test/library-tests/dataflow/taint-tests/taint.cpp
index 0365d8c2c77..9434dbe52ae 100644
--- a/cpp/ql/test/library-tests/dataflow/taint-tests/taint.cpp
+++ b/cpp/ql/test/library-tests/dataflow/taint-tests/taint.cpp
@@ -361,6 +361,8 @@ typedef unsigned long size_t;
char *strdup(const char *s1);
char *strndup(const char *s1, size_t n);
wchar_t* wcsdup(const wchar_t* s1);
+char *strdupa(const char *s1);
+char *strndupa(const char *s1, size_t n);
void test_strdup(char *source)
{
@@ -392,6 +394,26 @@ void test_wcsdup(wchar_t *source)
sink(b);
}
+void test_strdupa(char *source)
+{
+ char *a, *b, *c;
+
+ a = strdupa(source);
+ b = strdupa("hello, world");
+ c = strndupa(source, 100);
+ sink(a); // $ ast,ir
+ sink(b);
+ sink(c); // $ ast,ir
+}
+
+void test_strndupa(int source)
+{
+ char *a;
+
+ a = strndupa("hello, world", source);
+ sink(a); // $ ast,ir
+}
+
// --- qualifiers ---
class MyClass2 {
@@ -518,7 +540,7 @@ void *mempcpy(void *dest, const void *src, size_t n);
void test_mempcpy(int *source) {
int x;
mempcpy(&x, source, sizeof(int));
- sink(x); // $ ast=518:24 ir SPURIOUS: ast=519:6
+ sink(x); // $ ast=540:24 ir SPURIOUS: ast=541:6
}
// --- memccpy ---
@@ -528,7 +550,7 @@ void *memccpy(void *dest, const void *src, int c, size_t n);
void test_memccpy(int *source) {
int dest[16];
memccpy(dest, source, 42, sizeof(dest));
- sink(dest); // $ ast=528:24 ir SPURIOUS: ast=529:6
+ sink(dest); // $ ast=550:24 ir SPURIOUS: ast=551:6
}
// --- strcat and related functions ---
diff --git a/cpp/ql/test/library-tests/specifiers2/specifiers2.expected b/cpp/ql/test/library-tests/specifiers2/specifiers2.expected
index d718451459a..8950906cb63 100644
--- a/cpp/ql/test/library-tests/specifiers2/specifiers2.expected
+++ b/cpp/ql/test/library-tests/specifiers2/specifiers2.expected
@@ -17,12 +17,19 @@
| Function | cpp20.cpp:7:19:7:40 | member_const_constexpr | member_const_constexpr | inline |
| Function | cpp20.cpp:7:19:7:40 | member_const_constexpr | member_const_constexpr | is_constexpr |
| Function | cpp20.cpp:7:19:7:40 | member_const_constexpr | member_const_constexpr | private |
+| Function | specifiers2.c:11:6:11:6 | f | f | c_linkage |
| Function | specifiers2.c:11:6:11:6 | f | f | extern |
+| Function | specifiers2.c:12:13:12:13 | f | f | c_linkage |
| Function | specifiers2.c:12:13:12:13 | f | f | extern |
+| Function | specifiers2.c:13:13:13:13 | f | f | c_linkage |
| Function | specifiers2.c:13:13:13:13 | f | f | extern |
+| Function | specifiers2.c:15:13:15:13 | g | g | c_linkage |
| Function | specifiers2.c:15:13:15:13 | g | g | extern |
+| Function | specifiers2.c:16:13:16:13 | g | g | c_linkage |
| Function | specifiers2.c:16:13:16:13 | g | g | extern |
+| Function | specifiers2.c:21:6:21:12 | somefun | somefun | c_linkage |
| Function | specifiers2.c:21:6:21:12 | somefun | somefun | extern |
+| Function | specifiers2.c:25:12:25:14 | add | add | c_linkage |
| Function | specifiers2.c:25:12:25:14 | add | add | inline |
| Function | specifiers2pp.cpp:8:7:8:7 | MyClass | MyClass | extern |
| Function | specifiers2pp.cpp:8:7:8:7 | MyClass | MyClass | extern |
@@ -96,8 +103,11 @@
| Function | specifiers2pp.cpp:35:7:35:7 | operator= | operator= | public |
| Function | specifiers2pp.cpp:35:7:35:7 | operator= | operator= | public |
| Function | specifiers2pp.cpp:40:12:40:18 | someFun | someFun | extern |
+| Function | specifiers2pp.cpp:41:16:41:23 | someFun2 | someFun2 | c_linkage |
| Function | specifiers2pp.cpp:41:16:41:23 | someFun2 | someFun2 | extern |
+| Function | specifiers2pp.cpp:43:9:43:16 | someFun3 | someFun3 | c_linkage |
| Function | specifiers2pp.cpp:43:9:43:16 | someFun3 | someFun3 | extern |
+| Function | specifiers2pp.cpp:44:16:44:23 | someFun4 | someFun4 | c_linkage |
| Function | specifiers2pp.cpp:44:16:44:23 | someFun4 | someFun4 | static |
| Function | specifiers2pp.cpp:62:7:62:7 | operator= | operator= | extern |
| Function | specifiers2pp.cpp:62:7:62:7 | operator= | operator= | extern |
diff --git a/cpp/ql/test/library-tests/templates/instantiations_functions/elements.expected b/cpp/ql/test/library-tests/templates/instantiations_functions/elements.expected
deleted file mode 100644
index 376272917d4..00000000000
--- a/cpp/ql/test/library-tests/templates/instantiations_functions/elements.expected
+++ /dev/null
@@ -1,388 +0,0 @@
-| file://:0:0:0:0 | |
-| file://:0:0:0:0 | & |
-| file://:0:0:0:0 | && |
-| file://:0:0:0:0 | (composite *)... |
-| file://:0:0:0:0 | (composite *)... |
-| file://:0:0:0:0 | (global namespace) |
-| file://:0:0:0:0 | (unnamed parameter 0) |
-| file://:0:0:0:0 | (unnamed parameter 0) |
-| file://:0:0:0:0 | (unnamed parameter 0) |
-| file://:0:0:0:0 | (unnamed parameter 0) |
-| file://:0:0:0:0 | (unnamed parameter 0) |
-| file://:0:0:0:0 | (unnamed parameter 0) |
-| file://:0:0:0:0 | (unnamed parameter 0) |
-| file://:0:0:0:0 | (unnamed parameter 0) |
-| file://:0:0:0:0 | (unnamed parameter 0) |
-| file://:0:0:0:0 | (unnamed parameter 0) |
-| file://:0:0:0:0 | (unnamed parameter 0) |
-| file://:0:0:0:0 | (unnamed parameter 0) |
-| file://:0:0:0:0 | (unnamed parameter 0) |
-| file://:0:0:0:0 | (unnamed parameter 0) |
-| file://:0:0:0:0 | (unnamed parameter 0) |
-| file://:0:0:0:0 | (unnamed parameter 0) |
-| file://:0:0:0:0 | (unnamed parameter 0) |
-| file://:0:0:0:0 | (unnamed parameter 0) |
-| file://:0:0:0:0 | ..()(..) |
-| file://:0:0:0:0 | ..()(..) |
-| file://:0:0:0:0 | ..()(..) |
-| file://:0:0:0:0 | ..(*)(..) |
-| file://:0:0:0:0 | ..(*)(..) |
-| file://:0:0:0:0 | ..(*)(..) |
-| file://:0:0:0:0 | A & |
-| file://:0:0:0:0 | _Complex __float128 |
-| file://:0:0:0:0 | _Complex double |
-| file://:0:0:0:0 | _Complex float |
-| file://:0:0:0:0 | _Complex long double |
-| file://:0:0:0:0 | _Decimal32 |
-| file://:0:0:0:0 | _Decimal64 |
-| file://:0:0:0:0 | _Decimal128 |
-| file://:0:0:0:0 | _Float32 |
-| file://:0:0:0:0 | _Float32x |
-| file://:0:0:0:0 | _Float64 |
-| file://:0:0:0:0 | _Float64x |
-| file://:0:0:0:0 | _Float128 |
-| file://:0:0:0:0 | _Float128x |
-| file://:0:0:0:0 | _Imaginary double |
-| file://:0:0:0:0 | _Imaginary float |
-| file://:0:0:0:0 | _Imaginary long double |
-| file://:0:0:0:0 | __block |
-| file://:0:0:0:0 | __float128 |
-| file://:0:0:0:0 | __int128 |
-| file://:0:0:0:0 | __interface |
-| file://:0:0:0:0 | __ptr32 |
-| file://:0:0:0:0 | __ptr64 |
-| file://:0:0:0:0 | __sptr |
-| file://:0:0:0:0 | __super |
-| file://:0:0:0:0 | __uptr |
-| file://:0:0:0:0 | __va_list_tag |
-| file://:0:0:0:0 | __va_list_tag & |
-| file://:0:0:0:0 | __va_list_tag && |
-| file://:0:0:0:0 | abstract |
-| file://:0:0:0:0 | action * |
-| file://:0:0:0:0 | action>> & |
-| file://:0:0:0:0 | action>> && |
-| file://:0:0:0:0 | action>> * |
-| file://:0:0:0:0 | actor1 * |
-| file://:0:0:0:0 | actor1> & |
-| file://:0:0:0:0 | actor1> && |
-| file://:0:0:0:0 | actor1> * |
-| file://:0:0:0:0 | atomic |
-| file://:0:0:0:0 | auto |
-| file://:0:0:0:0 | auto |
-| file://:0:0:0:0 | bool |
-| file://:0:0:0:0 | char |
-| file://:0:0:0:0 | char8_t |
-| file://:0:0:0:0 | char16_t |
-| file://:0:0:0:0 | char32_t |
-| file://:0:0:0:0 | composite * |
-| file://:0:0:0:0 | composite & |
-| file://:0:0:0:0 | composite && |
-| file://:0:0:0:0 | composite * |
-| file://:0:0:0:0 | const |
-| file://:0:0:0:0 | const __va_list_tag |
-| file://:0:0:0:0 | const __va_list_tag & |
-| file://:0:0:0:0 | const action>> |
-| file://:0:0:0:0 | const action>> & |
-| file://:0:0:0:0 | const actor1> |
-| file://:0:0:0:0 | const actor1> & |
-| file://:0:0:0:0 | const composite |
-| file://:0:0:0:0 | const composite & |
-| file://:0:0:0:0 | const grammar_helper_base |
-| file://:0:0:0:0 | const grammar_helper_base & |
-| file://:0:0:0:0 | const rule |
-| file://:0:0:0:0 | const rule & |
-| file://:0:0:0:0 | declaration of 1st parameter |
-| file://:0:0:0:0 | declaration of 1st parameter |
-| file://:0:0:0:0 | declaration of 1st parameter |
-| file://:0:0:0:0 | declaration of 1st parameter |
-| file://:0:0:0:0 | declaration of 1st parameter |
-| file://:0:0:0:0 | declaration of 1st parameter |
-| file://:0:0:0:0 | declaration of 1st parameter |
-| file://:0:0:0:0 | declaration of 1st parameter |
-| file://:0:0:0:0 | declaration of 1st parameter |
-| file://:0:0:0:0 | declaration of 1st parameter |
-| file://:0:0:0:0 | declaration of 1st parameter |
-| file://:0:0:0:0 | declaration of 1st parameter |
-| file://:0:0:0:0 | declaration of 1st parameter |
-| file://:0:0:0:0 | declaration of 1st parameter |
-| file://:0:0:0:0 | declaration of 1st parameter |
-| file://:0:0:0:0 | declaration of 1st parameter |
-| file://:0:0:0:0 | declared_constexpr |
-| file://:0:0:0:0 | declared_constinit |
-| file://:0:0:0:0 | declared_virtual |
-| file://:0:0:0:0 | decltype(nullptr) |
-| file://:0:0:0:0 | definition of fp_offset |
-| file://:0:0:0:0 | definition of gp_offset |
-| file://:0:0:0:0 | definition of overflow_arg_area |
-| file://:0:0:0:0 | definition of reg_save_area |
-| file://:0:0:0:0 | dllexport |
-| file://:0:0:0:0 | dllimport |
-| file://:0:0:0:0 | double |
-| file://:0:0:0:0 | error |
-| file://:0:0:0:0 | explicit |
-| file://:0:0:0:0 | extern |
-| file://:0:0:0:0 | far |
-| file://:0:0:0:0 | final |
-| file://:0:0:0:0 | float |
-| file://:0:0:0:0 | forceinline |
-| file://:0:0:0:0 | fp_offset |
-| file://:0:0:0:0 | gp_offset |
-| file://:0:0:0:0 | grammar_helper_base & |
-| file://:0:0:0:0 | grammar_helper_base && |
-| file://:0:0:0:0 | has_trailing_return_type |
-| file://:0:0:0:0 | implicit_int |
-| file://:0:0:0:0 | inline |
-| file://:0:0:0:0 | int |
-| file://:0:0:0:0 | int & |
-| file://:0:0:0:0 | int * |
-| file://:0:0:0:0 | is_consteval |
-| file://:0:0:0:0 | is_constexpr |
-| file://:0:0:0:0 | is_thread_local |
-| file://:0:0:0:0 | long |
-| file://:0:0:0:0 | long double |
-| file://:0:0:0:0 | long long |
-| file://:0:0:0:0 | microsoft_inline |
-| file://:0:0:0:0 | naked |
-| file://:0:0:0:0 | near |
-| file://:0:0:0:0 | noalias |
-| file://:0:0:0:0 | noinline |
-| file://:0:0:0:0 | noreturn |
-| file://:0:0:0:0 | nothrow |
-| file://:0:0:0:0 | novtable |
-| file://:0:0:0:0 | operator= |
-| file://:0:0:0:0 | operator= |
-| file://:0:0:0:0 | optional |
-| file://:0:0:0:0 | overflow_arg_area |
-| file://:0:0:0:0 | override |
-| file://:0:0:0:0 | private |
-| file://:0:0:0:0 | protected |
-| file://:0:0:0:0 | public |
-| file://:0:0:0:0 | pure |
-| file://:0:0:0:0 | reg_save_area |
-| file://:0:0:0:0 | register |
-| file://:0:0:0:0 | restrict |
-| file://:0:0:0:0 | rule & |
-| file://:0:0:0:0 | rule && |
-| file://:0:0:0:0 | rule * |
-| file://:0:0:0:0 | sealed |
-| file://:0:0:0:0 | selectany |
-| file://:0:0:0:0 | short |
-| file://:0:0:0:0 | signed __int128 |
-| file://:0:0:0:0 | signed char |
-| file://:0:0:0:0 | signed int |
-| file://:0:0:0:0 | signed long |
-| file://:0:0:0:0 | signed long long |
-| file://:0:0:0:0 | signed short |
-| file://:0:0:0:0 | static |
-| file://:0:0:0:0 | thread |
-| file://:0:0:0:0 | unaligned |
-| file://:0:0:0:0 | unknown |
-| file://:0:0:0:0 | unsigned __int128 |
-| file://:0:0:0:0 | unsigned char |
-| file://:0:0:0:0 | unsigned int |
-| file://:0:0:0:0 | unsigned long |
-| file://:0:0:0:0 | unsigned long long |
-| file://:0:0:0:0 | unsigned short |
-| file://:0:0:0:0 | varargs |
-| file://:0:0:0:0 | virtual |
-| file://:0:0:0:0 | void |
-| file://:0:0:0:0 | void * |
-| file://:0:0:0:0 | volatile |
-| file://:0:0:0:0 | wchar_t |
-| header.h:0:0:0:0 | header.h |
-| header.h:2:20:2:24 | BaseT |
-| header.h:2:20:2:24 | definition of BaseT |
-| header.h:3:8:3:8 | actor1 |
-| header.h:3:8:3:8 | actor1 |
-| header.h:3:8:3:8 | declaration of actor1 |
-| header.h:3:8:3:8 | declaration of actor1 |
-| header.h:3:8:3:8 | declaration of operator= |
-| header.h:3:8:3:8 | declaration of operator= |
-| header.h:3:8:3:8 | operator= |
-| header.h:3:8:3:8 | operator= |
-| header.h:3:8:3:13 | actor1 |
-| header.h:3:8:3:13 | actor1> |
-| header.h:3:8:3:13 | definition of actor1 |
-| header.h:3:17:3:37 | derivation |
-| header.h:3:17:3:37 | derivation |
-| header.h:4:5:4:10 | actor1 |
-| header.h:4:5:4:10 | actor1 |
-| header.h:4:5:4:10 | declaration of actor1 |
-| header.h:6:24:6:24 | A |
-| header.h:6:24:6:24 | definition of A |
-| header.h:8:5:8:5 | definition of funx |
-| header.h:8:5:8:5 | funx |
-| header.h:8:5:8:8 | declaration of funx |
-| header.h:8:5:8:8 | definition of funx |
-| header.h:8:5:8:8 | funx |
-| header.h:8:5:8:8 | funx |
-| header.h:8:13:8:14 | a_ |
-| header.h:8:13:8:14 | a_ |
-| header.h:8:13:8:14 | a_ |
-| header.h:8:13:8:14 | declaration of a_ |
-| header.h:8:13:8:14 | definition of a_ |
-| header.h:8:13:8:14 | definition of a_ |
-| header.h:8:17:11:5 | { ... } |
-| header.h:8:17:11:5 | { ... } |
-| header.h:9:9:9:14 | declaration |
-| header.h:9:9:9:14 | declaration |
-| header.h:9:13:9:13 | definition of i |
-| header.h:9:13:9:13 | definition of i |
-| header.h:9:13:9:13 | i |
-| header.h:9:13:9:13 | i |
-| header.h:10:9:10:24 | composite:: |
-| header.h:10:9:10:24 | composite:: |
-| header.h:10:9:10:28 | call to eval |
-| header.h:10:9:10:28 | call to eval |
-| header.h:10:9:10:28 | this |
-| header.h:10:9:10:28 | this |
-| header.h:10:9:10:32 | ExprStmt |
-| header.h:10:9:10:32 | ExprStmt |
-| header.h:10:30:10:30 | i |
-| header.h:10:30:10:30 | i |
-| header.h:11:5:11:5 | return ... |
-| header.h:11:5:11:5 | return ... |
-| test.cpp:0:0:0:0 | test.cpp |
-| test.cpp:2:8:2:8 | declaration of operator= |
-| test.cpp:2:8:2:8 | declaration of operator= |
-| test.cpp:2:8:2:8 | operator= |
-| test.cpp:2:8:2:8 | operator= |
-| test.cpp:2:8:2:26 | definition of grammar_helper_base |
-| test.cpp:2:8:2:26 | grammar_helper_base |
-| test.cpp:3:9:3:16 | declaration of undefine |
-| test.cpp:3:9:3:16 | undefine |
-| test.cpp:3:18:3:20 | (unnamed parameter 0) |
-| test.cpp:3:18:3:20 | declaration of 1st parameter |
-| test.cpp:6:20:6:20 | B |
-| test.cpp:6:20:6:20 | definition of B |
-| test.cpp:7:8:7:8 | declaration of operator= |
-| test.cpp:7:8:7:8 | declaration of operator= |
-| test.cpp:7:8:7:8 | operator= |
-| test.cpp:7:8:7:8 | operator= |
-| test.cpp:7:8:7:16 | composite |
-| test.cpp:7:8:7:16 | composite |
-| test.cpp:7:8:7:16 | definition of composite |
-| test.cpp:8:24:8:29 | TupleT |
-| test.cpp:8:24:8:29 | definition of TupleT |
-| test.cpp:9:10:9:10 | definition of eval |
-| test.cpp:9:10:9:10 | eval |
-| test.cpp:9:10:9:13 | declaration of eval |
-| test.cpp:9:10:9:13 | definition of eval |
-| test.cpp:9:10:9:13 | eval |
-| test.cpp:9:10:9:13 | eval |
-| test.cpp:9:22:9:25 | args |
-| test.cpp:9:22:9:25 | args |
-| test.cpp:9:22:9:25 | args |
-| test.cpp:9:22:9:25 | declaration of args |
-| test.cpp:9:22:9:25 | definition of args |
-| test.cpp:9:22:9:25 | definition of args |
-| test.cpp:9:28:9:30 | { ... } |
-| test.cpp:9:28:9:30 | { ... } |
-| test.cpp:9:30:9:30 | return ... |
-| test.cpp:9:30:9:30 | return ... |
-| test.cpp:12:1:12:19 | #include "header.h" |
-| test.cpp:14:20:14:26 | ActionT |
-| test.cpp:14:20:14:26 | ActionT |
-| test.cpp:14:20:14:26 | definition of ActionT |
-| test.cpp:15:7:15:7 | Unknown literal |
-| test.cpp:15:7:15:7 | action |
-| test.cpp:15:7:15:7 | action |
-| test.cpp:15:7:15:7 | action |
-| test.cpp:15:7:15:7 | call to actor1 |
-| test.cpp:15:7:15:7 | constructor init of field actor |
-| test.cpp:15:7:15:7 | constructor init of field actor |
-| test.cpp:15:7:15:7 | declaration of action |
-| test.cpp:15:7:15:7 | declaration of operator= |
-| test.cpp:15:7:15:7 | declaration of operator= |
-| test.cpp:15:7:15:7 | definition of action |
-| test.cpp:15:7:15:7 | definition of action |
-| test.cpp:15:7:15:7 | operator= |
-| test.cpp:15:7:15:7 | operator= |
-| test.cpp:15:7:15:7 | return ... |
-| test.cpp:15:7:15:7 | return ... |
-| test.cpp:15:7:15:7 | { ... } |
-| test.cpp:15:7:15:7 | { ... } |
-| test.cpp:15:7:15:12 | action |
-| test.cpp:15:7:15:12 | action>> |
-| test.cpp:15:7:15:12 | definition of action |
-| test.cpp:17:10:17:10 | definition of eparse |
-| test.cpp:17:10:17:10 | eparse |
-| test.cpp:17:10:17:15 | definition of eparse |
-| test.cpp:17:10:17:15 | eparse |
-| test.cpp:17:19:20:5 | { ... } |
-| test.cpp:17:19:20:5 | { ... } |
-| test.cpp:18:9:18:17 | declaration |
-| test.cpp:18:9:18:17 | declaration |
-| test.cpp:18:13:18:16 | definition of valx |
-| test.cpp:18:13:18:16 | definition of valx |
-| test.cpp:18:13:18:16 | valx |
-| test.cpp:18:13:18:16 | valx |
-| test.cpp:19:9:19:13 | actor |
-| test.cpp:19:9:19:13 | actor |
-| test.cpp:19:9:19:13 | this |
-| test.cpp:19:9:19:13 | this |
-| test.cpp:19:9:19:24 | call to expression |
-| test.cpp:19:9:19:25 | ExprStmt |
-| test.cpp:19:9:19:25 | ExprStmt |
-| test.cpp:19:15:19:18 | call to funx |
-| test.cpp:19:15:19:18 | funx |
-| test.cpp:19:20:19:23 | (reference to) |
-| test.cpp:19:20:19:23 | valx |
-| test.cpp:19:20:19:23 | valx |
-| test.cpp:20:5:20:5 | return ... |
-| test.cpp:20:5:20:5 | return ... |
-| test.cpp:23:13:23:17 | actor |
-| test.cpp:23:13:23:17 | actor |
-| test.cpp:23:13:23:17 | definition of actor |
-| test.cpp:23:13:23:17 | definition of actor |
-| test.cpp:26:7:26:7 | declaration of operator= |
-| test.cpp:26:7:26:7 | declaration of operator= |
-| test.cpp:26:7:26:7 | declaration of rule |
-| test.cpp:26:7:26:7 | declaration of rule |
-| test.cpp:26:7:26:7 | operator= |
-| test.cpp:26:7:26:7 | operator= |
-| test.cpp:26:7:26:7 | rule |
-| test.cpp:26:7:26:7 | rule |
-| test.cpp:26:7:26:10 | definition of rule |
-| test.cpp:26:7:26:10 | rule |
-| test.cpp:28:28:28:34 | ParserT |
-| test.cpp:28:28:28:34 | ParserT |
-| test.cpp:28:28:28:34 | definition of ParserT |
-| test.cpp:29:9:29:9 | definition of rule |
-| test.cpp:29:9:29:9 | rule |
-| test.cpp:29:9:29:12 | definition of rule |
-| test.cpp:29:9:29:12 | rule |
-| test.cpp:29:22:29:22 | definition of p |
-| test.cpp:29:22:29:22 | definition of p |
-| test.cpp:29:22:29:22 | p |
-| test.cpp:29:22:29:22 | p |
-| test.cpp:29:25:31:9 | { ... } |
-| test.cpp:29:25:31:9 | { ... } |
-| test.cpp:30:13:30:13 | p |
-| test.cpp:30:13:30:13 | p |
-| test.cpp:30:13:30:22 | call to expression |
-| test.cpp:30:13:30:23 | ExprStmt |
-| test.cpp:30:13:30:23 | ExprStmt |
-| test.cpp:30:15:30:20 | call to eparse |
-| test.cpp:30:15:30:20 | eparse |
-| test.cpp:31:9:31:9 | return ... |
-| test.cpp:31:9:31:9 | return ... |
-| test.cpp:34:6:34:11 | define |
-| test.cpp:34:6:34:11 | definition of define |
-| test.cpp:34:15:37:1 | { ... } |
-| test.cpp:35:5:35:10 | type mention |
-| test.cpp:35:5:35:37 | declaration |
-| test.cpp:35:12:35:17 | type mention |
-| test.cpp:35:19:35:27 | type mention |
-| test.cpp:35:36:35:36 | call to action |
-| test.cpp:35:36:35:36 | definition of z |
-| test.cpp:35:36:35:36 | initializer for z |
-| test.cpp:35:36:35:36 | z |
-| test.cpp:36:5:36:8 | type mention |
-| test.cpp:36:5:36:27 | declaration |
-| test.cpp:36:10:36:22 | definition of pp_expression |
-| test.cpp:36:10:36:22 | pp_expression |
-| test.cpp:36:25:36:26 | call to rule |
-| test.cpp:36:25:36:26 | initializer for pp_expression |
-| test.cpp:36:26:36:26 | z |
-| test.cpp:37:1:37:1 | return ... |
diff --git a/cpp/ql/test/library-tests/templates/instantiations_functions/elements.ql b/cpp/ql/test/library-tests/templates/instantiations_functions/elements.ql
deleted file mode 100644
index 8d2ce8f5e94..00000000000
--- a/cpp/ql/test/library-tests/templates/instantiations_functions/elements.ql
+++ /dev/null
@@ -1,5 +0,0 @@
-import cpp
-
-from Element e
-where not e instanceof Folder
-select e
diff --git a/cpp/ql/test/library-tests/templates/instantiations_functions/header.h b/cpp/ql/test/library-tests/templates/instantiations_functions/header.h
deleted file mode 100644
index 9bf726e784c..00000000000
--- a/cpp/ql/test/library-tests/templates/instantiations_functions/header.h
+++ /dev/null
@@ -1,13 +0,0 @@
-
-template
-struct actor1 : public composite {
- actor1();
-
- template
- inline void
- funx(A& a_) {
- int i;
- composite::eval(i);
- }
-};
-
diff --git a/cpp/ql/test/library-tests/templates/instantiations_functions/test.cpp b/cpp/ql/test/library-tests/templates/instantiations_functions/test.cpp
deleted file mode 100644
index 09ca255b4e1..00000000000
--- a/cpp/ql/test/library-tests/templates/instantiations_functions/test.cpp
+++ /dev/null
@@ -1,38 +0,0 @@
-
-struct grammar_helper_base {
- int undefine(int *);
-};
-
-template
-struct composite {
- template
- void eval(TupleT args) { }
-};
-
-#include "header.h"
-
-template
-class action {
-public:
- void eparse() {
- int valx;
- actor.funx(valx);
- }
-
-private:
- ActionT actor;
-};
-
-class rule {
- public:
- template
- rule(ParserT p) {
- p.eparse();
- }
-};
-
-void define() {
- action>> z;
- rule pp_expression = z;
-}
-
diff --git a/cpp/ql/test/library-tests/unnamed/elements.expected b/cpp/ql/test/library-tests/unnamed/elements.expected
deleted file mode 100644
index 57d3cc52556..00000000000
--- a/cpp/ql/test/library-tests/unnamed/elements.expected
+++ /dev/null
@@ -1,124 +0,0 @@
-| file://:0:0:0:0 | | Other |
-| file://:0:0:0:0 | & | Other |
-| file://:0:0:0:0 | && | Other |
-| file://:0:0:0:0 | (global namespace) | Other |
-| file://:0:0:0:0 | (unnamed global/namespace variable) | Other |
-| file://:0:0:0:0 | _Complex __float128 | Other |
-| file://:0:0:0:0 | _Complex double | Other |
-| file://:0:0:0:0 | _Complex float | Other |
-| file://:0:0:0:0 | _Complex long double | Other |
-| file://:0:0:0:0 | _Decimal32 | Other |
-| file://:0:0:0:0 | _Decimal64 | Other |
-| file://:0:0:0:0 | _Decimal128 | Other |
-| file://:0:0:0:0 | _Float32 | Other |
-| file://:0:0:0:0 | _Float32x | Other |
-| file://:0:0:0:0 | _Float64 | Other |
-| file://:0:0:0:0 | _Float64x | Other |
-| file://:0:0:0:0 | _Float128 | Other |
-| file://:0:0:0:0 | _Float128x | Other |
-| file://:0:0:0:0 | _Imaginary double | Other |
-| file://:0:0:0:0 | _Imaginary float | Other |
-| file://:0:0:0:0 | _Imaginary long double | Other |
-| file://:0:0:0:0 | __block | Other |
-| file://:0:0:0:0 | __float128 | Other |
-| file://:0:0:0:0 | __int128 | Other |
-| file://:0:0:0:0 | __interface | Other |
-| file://:0:0:0:0 | __ptr32 | Other |
-| file://:0:0:0:0 | __ptr64 | Other |
-| file://:0:0:0:0 | __sptr | Other |
-| file://:0:0:0:0 | __super | Other |
-| file://:0:0:0:0 | __uptr | Other |
-| file://:0:0:0:0 | __va_list_tag | Other |
-| file://:0:0:0:0 | abstract | Other |
-| file://:0:0:0:0 | atomic | Other |
-| file://:0:0:0:0 | auto | Other |
-| file://:0:0:0:0 | auto | Other |
-| file://:0:0:0:0 | bool | Other |
-| file://:0:0:0:0 | char | Other |
-| file://:0:0:0:0 | char8_t | Other |
-| file://:0:0:0:0 | char16_t | Other |
-| file://:0:0:0:0 | char32_t | Other |
-| file://:0:0:0:0 | const | Other |
-| file://:0:0:0:0 | declared_constexpr | Other |
-| file://:0:0:0:0 | declared_constinit | Other |
-| file://:0:0:0:0 | declared_virtual | Other |
-| file://:0:0:0:0 | decltype(nullptr) | Other |
-| file://:0:0:0:0 | definition of fp_offset | Other |
-| file://:0:0:0:0 | definition of gp_offset | Other |
-| file://:0:0:0:0 | definition of overflow_arg_area | Other |
-| file://:0:0:0:0 | definition of reg_save_area | Other |
-| file://:0:0:0:0 | dllexport | Other |
-| file://:0:0:0:0 | dllimport | Other |
-| file://:0:0:0:0 | double | Other |
-| file://:0:0:0:0 | error | Other |
-| file://:0:0:0:0 | explicit | Other |
-| file://:0:0:0:0 | extern | Other |
-| file://:0:0:0:0 | far | Other |
-| file://:0:0:0:0 | final | Other |
-| file://:0:0:0:0 | float | Other |
-| file://:0:0:0:0 | forceinline | Other |
-| file://:0:0:0:0 | fp_offset | Other |
-| file://:0:0:0:0 | gp_offset | Other |
-| file://:0:0:0:0 | has_trailing_return_type | Other |
-| file://:0:0:0:0 | implicit_int | Other |
-| file://:0:0:0:0 | inline | Other |
-| file://:0:0:0:0 | int | Other |
-| file://:0:0:0:0 | int * | Other |
-| file://:0:0:0:0 | int[0] | Other |
-| file://:0:0:0:0 | is_consteval | Other |
-| file://:0:0:0:0 | is_constexpr | Other |
-| file://:0:0:0:0 | is_thread_local | Other |
-| file://:0:0:0:0 | long | Other |
-| file://:0:0:0:0 | long double | Other |
-| file://:0:0:0:0 | long long | Other |
-| file://:0:0:0:0 | microsoft_inline | Other |
-| file://:0:0:0:0 | naked | Other |
-| file://:0:0:0:0 | near | Other |
-| file://:0:0:0:0 | noalias | Other |
-| file://:0:0:0:0 | noinline | Other |
-| file://:0:0:0:0 | noreturn | Other |
-| file://:0:0:0:0 | nothrow | Other |
-| file://:0:0:0:0 | novtable | Other |
-| file://:0:0:0:0 | optional | Other |
-| file://:0:0:0:0 | overflow_arg_area | Other |
-| file://:0:0:0:0 | override | Other |
-| file://:0:0:0:0 | private | Other |
-| file://:0:0:0:0 | protected | Other |
-| file://:0:0:0:0 | public | Other |
-| file://:0:0:0:0 | pure | Other |
-| file://:0:0:0:0 | reg_save_area | Other |
-| file://:0:0:0:0 | register | Other |
-| file://:0:0:0:0 | restrict | Other |
-| file://:0:0:0:0 | sealed | Other |
-| file://:0:0:0:0 | selectany | Other |
-| file://:0:0:0:0 | short | Other |
-| file://:0:0:0:0 | signed __int128 | Other |
-| file://:0:0:0:0 | signed char | Other |
-| file://:0:0:0:0 | signed int | Other |
-| file://:0:0:0:0 | signed long | Other |
-| file://:0:0:0:0 | signed long long | Other |
-| file://:0:0:0:0 | signed short | Other |
-| file://:0:0:0:0 | static | Other |
-| file://:0:0:0:0 | thread | Other |
-| file://:0:0:0:0 | unaligned | Other |
-| file://:0:0:0:0 | unknown | Other |
-| file://:0:0:0:0 | unsigned __int128 | Other |
-| file://:0:0:0:0 | unsigned char | Other |
-| file://:0:0:0:0 | unsigned int | Other |
-| file://:0:0:0:0 | unsigned long | Other |
-| file://:0:0:0:0 | unsigned long long | Other |
-| file://:0:0:0:0 | unsigned short | Other |
-| file://:0:0:0:0 | varargs | Other |
-| file://:0:0:0:0 | virtual | Other |
-| file://:0:0:0:0 | void | Other |
-| file://:0:0:0:0 | void * | Other |
-| file://:0:0:0:0 | volatile | Other |
-| file://:0:0:0:0 | wchar_t | Other |
-| test.c:0:0:0:0 | test.c | Other |
-| test.c:2:6:2:6 | a | Other |
-| test.c:2:6:2:6 | definition of a | Other |
-| test.c:2:10:2:18 | (unnamed global/namespace variable) | Variable access |
-| test.c:2:10:2:18 | array to pointer conversion | Other |
-| test.c:2:10:2:18 | initializer for a | Other |
-| test.c:2:17:2:18 | initializer for (unnamed global/namespace variable) | Other |
-| test.c:2:17:2:18 | {...} | Other |
diff --git a/cpp/ql/test/library-tests/unnamed/elements.ql b/cpp/ql/test/library-tests/unnamed/elements.ql
deleted file mode 100644
index 16a025063b9..00000000000
--- a/cpp/ql/test/library-tests/unnamed/elements.ql
+++ /dev/null
@@ -1,8 +0,0 @@
-import cpp
-
-from Element e, string s
-where
- not e instanceof Folder and
- exists(e.toString()) and // Work around `VariableDeclarationEntry.toString()` not holding
- if e instanceof VariableAccess then s = "Variable access" else s = "Other"
-select e, s
diff --git a/cpp/ql/test/library-tests/unnamed/test.c b/cpp/ql/test/library-tests/unnamed/test.c
deleted file mode 100644
index 151cbf59360..00000000000
--- a/cpp/ql/test/library-tests/unnamed/test.c
+++ /dev/null
@@ -1,3 +0,0 @@
-
-int *a = (int[]){};
-
diff --git a/cpp/ql/test/qlpack.yml b/cpp/ql/test/qlpack.yml
index 89f684e9e3e..a2858d0c3fe 100644
--- a/cpp/ql/test/qlpack.yml
+++ b/cpp/ql/test/qlpack.yml
@@ -1,5 +1,7 @@
name: codeql-cpp-tests
version: 0.0.0
-libraryPathDependencies: codeql-cpp
+dependencies:
+ codeql/cpp-all: "*"
+ codeql/cpp-queries: "*"
extractor: cpp
tests: .
diff --git a/cpp/ql/test/query-tests/Critical/MemoryFreed/MemoryFreed.expected b/cpp/ql/test/query-tests/Critical/MemoryFreed/MemoryFreed.expected
index 02fbac299f9..0fcfcc8a438 100644
--- a/cpp/ql/test/query-tests/Critical/MemoryFreed/MemoryFreed.expected
+++ b/cpp/ql/test/query-tests/Critical/MemoryFreed/MemoryFreed.expected
@@ -24,6 +24,8 @@
| test.cpp:126:8:126:9 | i2 |
| test.cpp:127:8:127:9 | i3 |
| test.cpp:128:15:128:16 | v4 |
+| test.cpp:185:10:185:12 | cpy |
+| test.cpp:199:10:199:12 | cpy |
| virtual.cpp:18:10:18:10 | a |
| virtual.cpp:19:10:19:10 | c |
| virtual.cpp:38:10:38:10 | b |
diff --git a/cpp/ql/test/query-tests/Critical/MemoryFreed/MemoryNeverFreed.expected b/cpp/ql/test/query-tests/Critical/MemoryFreed/MemoryNeverFreed.expected
index d44735d4bee..e577bd9b372 100644
--- a/cpp/ql/test/query-tests/Critical/MemoryFreed/MemoryNeverFreed.expected
+++ b/cpp/ql/test/query-tests/Critical/MemoryFreed/MemoryNeverFreed.expected
@@ -10,4 +10,4 @@
| test.cpp:89:18:89:23 | call to malloc | This memory is never freed |
| test.cpp:156:3:156:26 | new | This memory is never freed |
| test.cpp:157:3:157:26 | new[] | This memory is never freed |
-| test.cpp:167:14:167:19 | call to strdup | This memory is never freed |
+| test.cpp:169:14:169:19 | call to strdup | This memory is never freed |
diff --git a/cpp/ql/test/query-tests/Critical/MemoryFreed/test.cpp b/cpp/ql/test/query-tests/Critical/MemoryFreed/test.cpp
index 651afe85006..4f05f9d4954 100644
--- a/cpp/ql/test/query-tests/Critical/MemoryFreed/test.cpp
+++ b/cpp/ql/test/query-tests/Critical/MemoryFreed/test.cpp
@@ -155,6 +155,8 @@ int overloadedNew() {
new(std::nothrow) int(3); // BAD
new(std::nothrow) int[2]; // BAD
+
+ return 0;
}
// --- strdup ---
@@ -168,3 +170,31 @@ void test_strdup() {
output_msg(cpy);
}
+
+// --- strdupa ---
+char *strdupa(const char *s1);
+
+void test_strdupa_no_dealloc() {
+ char msg[] = "OctoCat";
+ char *cpy = strdupa(msg); // GOOD
+}
+
+void test_strdupa_dealloc() {
+ char msg[] = "OctoCat";
+ char *cpy = strdupa(msg);
+ free(cpy); // BAD [NOT DETECTED]
+}
+
+// --- strndupa ---
+char *strndupa(const char *s1, size_t maxsize);
+
+void test_strndupa_no_dealloc() {
+ char msg[] = "OctoCat";
+ char *cpy = strndupa(msg, 4); // GOOD
+}
+
+void test_strndupa_dealloc() {
+ char msg[] = "OctoCat";
+ char *cpy = strndupa(msg, 4);
+ free(cpy); // BAD [NOT DETECTED]
+}
diff --git a/cpp/ql/test/query-tests/Likely Bugs/Conversion/ImplicitDowncastFromBitfield/ImplicitDowncastFromBitfield.expected b/cpp/ql/test/query-tests/Likely Bugs/Conversion/ImplicitDowncastFromBitfield/ImplicitDowncastFromBitfield.expected
index 194f8698cd2..1bb148c47bd 100644
--- a/cpp/ql/test/query-tests/Likely Bugs/Conversion/ImplicitDowncastFromBitfield/ImplicitDowncastFromBitfield.expected
+++ b/cpp/ql/test/query-tests/Likely Bugs/Conversion/ImplicitDowncastFromBitfield/ImplicitDowncastFromBitfield.expected
@@ -1 +1,2 @@
| test.cpp:10:11:10:11 | x | Implicit downcast of bitfield $@ | test.cpp:2:6:2:6 | x | x |
+| test.cpp:26:25:26:25 | x | Implicit downcast of bitfield $@ | test.cpp:2:6:2:6 | x | x |
diff --git a/cpp/ql/test/query-tests/Likely Bugs/Conversion/ImplicitDowncastFromBitfield/test.cpp b/cpp/ql/test/query-tests/Likely Bugs/Conversion/ImplicitDowncastFromBitfield/test.cpp
index 45922c13cb3..3bcb6afe4b4 100644
--- a/cpp/ql/test/query-tests/Likely Bugs/Conversion/ImplicitDowncastFromBitfield/test.cpp
+++ b/cpp/ql/test/query-tests/Likely Bugs/Conversion/ImplicitDowncastFromBitfield/test.cpp
@@ -3,21 +3,41 @@ typedef struct {
} my_struct;
int getX1(my_struct m) {
- return m.x;
+ return m.x; // GOOD
}
short getX2(my_struct m) {
- return m.x;
+ return m.x; // BAD
}
short getX3(my_struct m) {
- return (short) m.x;
+ return (short) m.x; // GOOD
}
bool getX4(my_struct m) {
- return m.x;
+ return m.x; // GOOD
}
short getX5(my_struct m) {
- return (char) m.x;
+ return (char) m.x; // GOOD
+}
+
+const char& getx6(my_struct& m) {
+ const char& result = m.x; // BAD
+ return result;
+}
+
+const short& getx7(my_struct& m) {
+ const short& result = (short) m.x; // GOOD
+ return result;
+}
+
+const int& getx8(my_struct& m) {
+ const int& result = m.x; // GOOD
+ return result;
+}
+
+const bool& getx9(my_struct& m) {
+ const bool& result = m.x; // GOOD
+ return result;
}
diff --git a/cpp/ql/test/query-tests/Security/CWE/CWE-119/semmle/tests/test_buffer_overrun.cpp b/cpp/ql/test/query-tests/Security/CWE/CWE-119/semmle/tests/test_buffer_overrun.cpp
new file mode 100644
index 00000000000..d05ed0c94a7
--- /dev/null
+++ b/cpp/ql/test/query-tests/Security/CWE/CWE-119/semmle/tests/test_buffer_overrun.cpp
@@ -0,0 +1,39 @@
+typedef unsigned char uint8_t;
+#define SIZE (32)
+
+void test_buffer_overrun_in_for_loop()
+{
+ uint8_t data[SIZE] = {0};
+ for (int x = 0; x < SIZE * 2; x++) {
+ data[x] = 0x41; // BAD [NOT DETECTED]
+ }
+}
+
+void test_buffer_overrun_in_while_loop_using_pointer_arithmetic()
+{
+ uint8_t data[SIZE] = {0};
+ int offset = 0;
+ while (offset < SIZE * 2) {
+ *(data + offset) = 0x41; // BAD [NOT DETECTED]
+ offset++;
+ }
+}
+
+void test_buffer_overrun_in_while_loop_using_array_indexing()
+{
+ uint8_t data[SIZE] = {0};
+ int offset = 0;
+ while (offset < SIZE * 2) {
+ data[offset] = 0x41; // BAD [NOT DETECTED]
+ offset++;
+ }
+}
+
+int main(int argc, char *argv[])
+{
+ test_buffer_overrun_in_for_loop();
+ test_buffer_overrun_in_while_loop_using_pointer_arithmetic();
+ test_buffer_overrun_in_while_loop_using_array_indexing();
+
+ return 0;
+}
diff --git a/cpp/ql/test/query-tests/Security/CWE/CWE-119/semmle/tests/tests.cpp b/cpp/ql/test/query-tests/Security/CWE/CWE-119/semmle/tests/tests.cpp
index 4f8bcc0fa59..668324e7963 100644
--- a/cpp/ql/test/query-tests/Security/CWE/CWE-119/semmle/tests/tests.cpp
+++ b/cpp/ql/test/query-tests/Security/CWE/CWE-119/semmle/tests/tests.cpp
@@ -114,7 +114,7 @@ void test6(bool cond)
c = 100;
buffer[c] = 'x'; // BAD: over-write [NOT DETECTED]
- ch = buffer[c]; // BAD: under-read [NOT DETECTED]
+ ch = buffer[c]; // BAD: over-read [NOT DETECTED]
d = 0;
d = 1000;
diff --git a/cpp/ql/test/query-tests/Security/CWE/CWE-190/semmle/tainted/qlpack.yml b/cpp/ql/test/query-tests/Security/CWE/CWE-190/semmle/tainted/qlpack.yml
index 6cae1aa77cb..6bbb2bc9062 100644
--- a/cpp/ql/test/query-tests/Security/CWE/CWE-190/semmle/tainted/qlpack.yml
+++ b/cpp/ql/test/query-tests/Security/CWE/CWE-190/semmle/tainted/qlpack.yml
@@ -1,6 +1,8 @@
# This directory has its own qlpack for reasons detailed in commit 2550788598010fa2117274607c9d58f64f997f34
name: codeql-cpp-tests-cwe-190-tainted
version: 0.0.0
-libraryPathDependencies: codeql-cpp
+dependencies:
+ codeql/cpp-all: "*"
+ codeql/cpp-queries: "*"
extractor: cpp
tests: .
diff --git a/csharp/change-notes/2021-08-05-insecure-randomness.md b/csharp/change-notes/2021-08-05-insecure-randomness.md
new file mode 100644
index 00000000000..2a873e963e1
--- /dev/null
+++ b/csharp/change-notes/2021-08-05-insecure-randomness.md
@@ -0,0 +1,2 @@
+lgtm,codescanning
+* Membership.GeneratePassword()` has been added as a bad source of random data.
\ No newline at end of file
diff --git a/csharp/change-notes/2021-08-23-getPrimaryQlClasses.md b/csharp/change-notes/2021-08-23-getPrimaryQlClasses.md
new file mode 100644
index 00000000000..6dbd956cafe
--- /dev/null
+++ b/csharp/change-notes/2021-08-23-getPrimaryQlClasses.md
@@ -0,0 +1,2 @@
+lgtm,codescanning
+* Added `Element.getPrimaryQlClasses()` predicate, which gets a comma-separated list of the names of the primary CodeQL classes to which this element belongs.
diff --git a/csharp/extractor/Semmle.Extraction.CIL/Entities/DefinitionMethod.cs b/csharp/extractor/Semmle.Extraction.CIL/Entities/DefinitionMethod.cs
index 5c48e5e52e1..073527a523b 100644
--- a/csharp/extractor/Semmle.Extraction.CIL/Entities/DefinitionMethod.cs
+++ b/csharp/extractor/Semmle.Extraction.CIL/Entities/DefinitionMethod.cs
@@ -114,25 +114,39 @@ namespace Semmle.Extraction.CIL.Entities
if (!body.LocalSignature.IsNil)
{
- var locals = Context.MdReader.GetStandaloneSignature(body.LocalSignature);
- var localVariableTypes = locals.DecodeLocalSignature(Context.TypeSignatureDecoder, this);
-
- this.locals = new LocalVariable[localVariableTypes.Length];
-
- for (var l = 0; l < this.locals.Length; ++l)
+ var localVariableTypes = System.Collections.Immutable.ImmutableArray.Empty;
+ var hasError = false;
+ try
{
- var t = localVariableTypes[l];
- if (t is ByRefType brt)
+ var locals = Context.MdReader.GetStandaloneSignature(body.LocalSignature);
+ localVariableTypes = locals.DecodeLocalSignature(Context.TypeSignatureDecoder, this);
+ }
+ catch (System.BadImageFormatException exc)
+ {
+ Context.Extractor.Logger.Log(Util.Logging.Severity.Info,
+ $"Could not decode locals in method {declaringType.GetQualifiedName()}.{name}. {exc}");
+ hasError = true;
+ }
+
+ if (!hasError)
+ {
+ this.locals = new LocalVariable[localVariableTypes.Length];
+
+ for (var l = 0; l < this.locals.Length; ++l)
{
- t = brt.ElementType;
- this.locals[l] = Context.Populate(new LocalVariable(Context, Implementation, l, t));
- yield return this.locals[l];
- yield return Tuples.cil_type_annotation(this.locals[l], TypeAnnotation.Ref);
- }
- else
- {
- this.locals[l] = Context.Populate(new LocalVariable(Context, Implementation, l, t));
- yield return this.locals[l];
+ var t = localVariableTypes[l];
+ if (t is ByRefType brt)
+ {
+ t = brt.ElementType;
+ this.locals[l] = Context.Populate(new LocalVariable(Context, Implementation, l, t));
+ yield return this.locals[l];
+ yield return Tuples.cil_type_annotation(this.locals[l], TypeAnnotation.Ref);
+ }
+ else
+ {
+ this.locals[l] = Context.Populate(new LocalVariable(Context, Implementation, l, t));
+ yield return this.locals[l];
+ }
}
}
}
diff --git a/csharp/extractor/Semmle.Extraction.CIL/Entities/NoMetadataHandleType.FullyQualifiedNameParser.cs b/csharp/extractor/Semmle.Extraction.CIL/Entities/NoMetadataHandleType.FullyQualifiedNameParser.cs
index 999259e9ad6..11420a8adcc 100644
--- a/csharp/extractor/Semmle.Extraction.CIL/Entities/NoMetadataHandleType.FullyQualifiedNameParser.cs
+++ b/csharp/extractor/Semmle.Extraction.CIL/Entities/NoMetadataHandleType.FullyQualifiedNameParser.cs
@@ -53,7 +53,7 @@ namespace Semmle.Extraction.CIL.Entities
// "T3,[T4, Assembly1, Version=...],T5,T6"
string typeArgs;
- (name, _, typeArgs, _) = name.Split(firstBracketIndex, firstBracketIndex + 1, lastBracketIndex - firstBracketIndex - 1);
+ (name, _, typeArgs, _) = name.Split(firstBracketIndex, firstBracketIndex + 1, lastBracketIndex);
var thisTypeArgCount = GenericsHelper.GetGenericTypeParameterCount(name);
if (thisTypeArgCount == 0)
diff --git a/csharp/extractor/Semmle.Extraction.CIL/Entities/PointerType.cs b/csharp/extractor/Semmle.Extraction.CIL/Entities/PointerType.cs
index 1a6bd474bd0..9ce05b4a054 100644
--- a/csharp/extractor/Semmle.Extraction.CIL/Entities/PointerType.cs
+++ b/csharp/extractor/Semmle.Extraction.CIL/Entities/PointerType.cs
@@ -11,6 +11,14 @@ namespace Semmle.Extraction.CIL.Entities
public PointerType(Context cx, Type pointee) : base(cx)
{
this.pointee = pointee;
+
+ if (pointee is ModifiedType mt)
+ {
+ cx.Extractor.Logger.Log(
+ Util.Logging.Severity.Info,
+ $"Pointer to modified type {pointee.GetQualifiedName()} is changed to {mt.Unmodified.GetQualifiedName()}");
+ this.pointee = mt.Unmodified;
+ }
}
public override bool Equals(object? obj)
diff --git a/csharp/extractor/Semmle.Extraction.CSharp/SymbolExtensions.cs b/csharp/extractor/Semmle.Extraction.CSharp/SymbolExtensions.cs
index c3bc02bf480..caf45880b83 100644
--- a/csharp/extractor/Semmle.Extraction.CSharp/SymbolExtensions.cs
+++ b/csharp/extractor/Semmle.Extraction.CSharp/SymbolExtensions.cs
@@ -482,22 +482,6 @@ namespace Semmle.Extraction.CSharp
{
trapFile.Write(TrapExtensions.EncodeString(namedType.Name));
}
-
- if (namedType.IsGenericType && namedType.TypeKind != TypeKind.Error && namedType.TypeArguments.Any())
- {
- trapFile.Write('<');
- trapFile.BuildList(
- ",",
- namedType.TypeArguments,
- p =>
- {
- if (IsReallyBound(namedType))
- {
- p.BuildDisplayName(cx, trapFile);
- }
- });
- trapFile.Write('>');
- }
}
public static bool IsReallyUnbound(this INamedTypeSymbol type) =>
diff --git a/csharp/extractor/Semmle.Util/StringExtensions.cs b/csharp/extractor/Semmle.Util/StringExtensions.cs
index d5d6c8cf27d..e56f106fe1f 100644
--- a/csharp/extractor/Semmle.Util/StringExtensions.cs
+++ b/csharp/extractor/Semmle.Util/StringExtensions.cs
@@ -20,7 +20,7 @@ namespace Semmle.Util
public static (string, string, string, string) Split(this string self, int index0, int index1, int index2)
{
var split = self.Split(new[] { index0, index1, index2 });
- return (split[0], split[1], split[2], split[4]);
+ return (split[0], split[1], split[2], split[3]);
}
private static List Split(this string self, params int[] indices)
diff --git a/csharp/ql/examples/qlpack.yml b/csharp/ql/examples/qlpack.yml
index f7b585db963..02fc9379389 100644
--- a/csharp/ql/examples/qlpack.yml
+++ b/csharp/ql/examples/qlpack.yml
@@ -1,3 +1,4 @@
name: codeql-csharp-examples
version: 0.0.0
-libraryPathDependencies: codeql-csharp
+dependencies:
+ codeql/csharp-all: ^0.0.1
diff --git a/csharp/ql/src/Customizations.qll b/csharp/ql/lib/Customizations.qll
similarity index 100%
rename from csharp/ql/src/Customizations.qll
rename to csharp/ql/lib/Customizations.qll
diff --git a/csharp/ql/src/cil.qll b/csharp/ql/lib/cil.qll
similarity index 100%
rename from csharp/ql/src/cil.qll
rename to csharp/ql/lib/cil.qll
diff --git a/csharp/ql/src/csharp.qll b/csharp/ql/lib/csharp.qll
similarity index 100%
rename from csharp/ql/src/csharp.qll
rename to csharp/ql/lib/csharp.qll
diff --git a/csharp/ql/src/default.qll b/csharp/ql/lib/default.qll
similarity index 100%
rename from csharp/ql/src/default.qll
rename to csharp/ql/lib/default.qll
diff --git a/csharp/ql/src/dotnet.qll b/csharp/ql/lib/dotnet.qll
similarity index 100%
rename from csharp/ql/src/dotnet.qll
rename to csharp/ql/lib/dotnet.qll
diff --git a/csharp/ql/lib/qlpack.yml b/csharp/ql/lib/qlpack.yml
new file mode 100644
index 00000000000..7240eba8833
--- /dev/null
+++ b/csharp/ql/lib/qlpack.yml
@@ -0,0 +1,6 @@
+name: codeql/csharp-all
+version: 0.0.2
+dbscheme: semmlecode.csharp.dbscheme
+suites: codeql-suites
+extractor: csharp
+library: true
diff --git a/csharp/ql/src/semmle/code/asp/AspNet.qll b/csharp/ql/lib/semmle/code/asp/AspNet.qll
similarity index 100%
rename from csharp/ql/src/semmle/code/asp/AspNet.qll
rename to csharp/ql/lib/semmle/code/asp/AspNet.qll
diff --git a/csharp/ql/src/semmle/code/asp/WebConfig.qll b/csharp/ql/lib/semmle/code/asp/WebConfig.qll
similarity index 100%
rename from csharp/ql/src/semmle/code/asp/WebConfig.qll
rename to csharp/ql/lib/semmle/code/asp/WebConfig.qll
diff --git a/csharp/ql/src/semmle/code/cil/Access.qll b/csharp/ql/lib/semmle/code/cil/Access.qll
similarity index 100%
rename from csharp/ql/src/semmle/code/cil/Access.qll
rename to csharp/ql/lib/semmle/code/cil/Access.qll
diff --git a/csharp/ql/src/semmle/code/cil/Attribute.qll b/csharp/ql/lib/semmle/code/cil/Attribute.qll
similarity index 100%
rename from csharp/ql/src/semmle/code/cil/Attribute.qll
rename to csharp/ql/lib/semmle/code/cil/Attribute.qll
diff --git a/csharp/ql/src/semmle/code/cil/BasicBlock.qll b/csharp/ql/lib/semmle/code/cil/BasicBlock.qll
similarity index 100%
rename from csharp/ql/src/semmle/code/cil/BasicBlock.qll
rename to csharp/ql/lib/semmle/code/cil/BasicBlock.qll
diff --git a/csharp/ql/src/semmle/code/cil/CIL.qll b/csharp/ql/lib/semmle/code/cil/CIL.qll
similarity index 100%
rename from csharp/ql/src/semmle/code/cil/CIL.qll
rename to csharp/ql/lib/semmle/code/cil/CIL.qll
diff --git a/csharp/ql/src/semmle/code/cil/CallableReturns.qll b/csharp/ql/lib/semmle/code/cil/CallableReturns.qll
similarity index 100%
rename from csharp/ql/src/semmle/code/cil/CallableReturns.qll
rename to csharp/ql/lib/semmle/code/cil/CallableReturns.qll
diff --git a/csharp/ql/src/semmle/code/cil/ConsistencyChecks.qll b/csharp/ql/lib/semmle/code/cil/ConsistencyChecks.qll
similarity index 99%
rename from csharp/ql/src/semmle/code/cil/ConsistencyChecks.qll
rename to csharp/ql/lib/semmle/code/cil/ConsistencyChecks.qll
index 51b74b2463d..02cfd149886 100644
--- a/csharp/ql/src/semmle/code/cil/ConsistencyChecks.qll
+++ b/csharp/ql/lib/semmle/code/cil/ConsistencyChecks.qll
@@ -670,7 +670,7 @@ class MissingCilDeclaration extends ConsistencyViolation, MissingCSharpCheck {
override string getMessage() {
result =
"Cannot locate CIL for " + getDeclaration().toStringWithTypes() + " of class " +
- getDeclaration().getAPrimaryQlClass()
+ getDeclaration().getPrimaryQlClasses()
}
override string toString() { result = getDeclaration().toStringWithTypes() }
diff --git a/csharp/ql/src/semmle/code/cil/ControlFlow.qll b/csharp/ql/lib/semmle/code/cil/ControlFlow.qll
similarity index 100%
rename from csharp/ql/src/semmle/code/cil/ControlFlow.qll
rename to csharp/ql/lib/semmle/code/cil/ControlFlow.qll
diff --git a/csharp/ql/src/semmle/code/cil/CustomModifierReceiver.qll b/csharp/ql/lib/semmle/code/cil/CustomModifierReceiver.qll
similarity index 100%
rename from csharp/ql/src/semmle/code/cil/CustomModifierReceiver.qll
rename to csharp/ql/lib/semmle/code/cil/CustomModifierReceiver.qll
diff --git a/csharp/ql/src/semmle/code/cil/DataFlow.qll b/csharp/ql/lib/semmle/code/cil/DataFlow.qll
similarity index 100%
rename from csharp/ql/src/semmle/code/cil/DataFlow.qll
rename to csharp/ql/lib/semmle/code/cil/DataFlow.qll
diff --git a/csharp/ql/src/semmle/code/cil/Declaration.qll b/csharp/ql/lib/semmle/code/cil/Declaration.qll
similarity index 100%
rename from csharp/ql/src/semmle/code/cil/Declaration.qll
rename to csharp/ql/lib/semmle/code/cil/Declaration.qll
diff --git a/csharp/ql/src/semmle/code/cil/Element.qll b/csharp/ql/lib/semmle/code/cil/Element.qll
similarity index 100%
rename from csharp/ql/src/semmle/code/cil/Element.qll
rename to csharp/ql/lib/semmle/code/cil/Element.qll
diff --git a/csharp/ql/src/semmle/code/cil/Generics.qll b/csharp/ql/lib/semmle/code/cil/Generics.qll
similarity index 100%
rename from csharp/ql/src/semmle/code/cil/Generics.qll
rename to csharp/ql/lib/semmle/code/cil/Generics.qll
diff --git a/csharp/ql/src/semmle/code/cil/Handler.qll b/csharp/ql/lib/semmle/code/cil/Handler.qll
similarity index 100%
rename from csharp/ql/src/semmle/code/cil/Handler.qll
rename to csharp/ql/lib/semmle/code/cil/Handler.qll
diff --git a/csharp/ql/src/semmle/code/cil/Instruction.qll b/csharp/ql/lib/semmle/code/cil/Instruction.qll
similarity index 100%
rename from csharp/ql/src/semmle/code/cil/Instruction.qll
rename to csharp/ql/lib/semmle/code/cil/Instruction.qll
diff --git a/csharp/ql/src/semmle/code/cil/InstructionGroups.qll b/csharp/ql/lib/semmle/code/cil/InstructionGroups.qll
similarity index 100%
rename from csharp/ql/src/semmle/code/cil/InstructionGroups.qll
rename to csharp/ql/lib/semmle/code/cil/InstructionGroups.qll
diff --git a/csharp/ql/src/semmle/code/cil/Instructions.qll b/csharp/ql/lib/semmle/code/cil/Instructions.qll
similarity index 100%
rename from csharp/ql/src/semmle/code/cil/Instructions.qll
rename to csharp/ql/lib/semmle/code/cil/Instructions.qll
diff --git a/csharp/ql/src/semmle/code/cil/Method.qll b/csharp/ql/lib/semmle/code/cil/Method.qll
similarity index 100%
rename from csharp/ql/src/semmle/code/cil/Method.qll
rename to csharp/ql/lib/semmle/code/cil/Method.qll
diff --git a/csharp/ql/src/semmle/code/cil/Parameterizable.qll b/csharp/ql/lib/semmle/code/cil/Parameterizable.qll
similarity index 100%
rename from csharp/ql/src/semmle/code/cil/Parameterizable.qll
rename to csharp/ql/lib/semmle/code/cil/Parameterizable.qll
diff --git a/csharp/ql/src/semmle/code/cil/Ssa.qll b/csharp/ql/lib/semmle/code/cil/Ssa.qll
similarity index 100%
rename from csharp/ql/src/semmle/code/cil/Ssa.qll
rename to csharp/ql/lib/semmle/code/cil/Ssa.qll
diff --git a/csharp/ql/src/semmle/code/cil/Stubs.qll b/csharp/ql/lib/semmle/code/cil/Stubs.qll
similarity index 100%
rename from csharp/ql/src/semmle/code/cil/Stubs.qll
rename to csharp/ql/lib/semmle/code/cil/Stubs.qll
diff --git a/csharp/ql/src/semmle/code/cil/Type.qll b/csharp/ql/lib/semmle/code/cil/Type.qll
similarity index 100%
rename from csharp/ql/src/semmle/code/cil/Type.qll
rename to csharp/ql/lib/semmle/code/cil/Type.qll
diff --git a/csharp/ql/src/semmle/code/cil/Types.qll b/csharp/ql/lib/semmle/code/cil/Types.qll
similarity index 100%
rename from csharp/ql/src/semmle/code/cil/Types.qll
rename to csharp/ql/lib/semmle/code/cil/Types.qll
diff --git a/csharp/ql/src/semmle/code/cil/Variable.qll b/csharp/ql/lib/semmle/code/cil/Variable.qll
similarity index 100%
rename from csharp/ql/src/semmle/code/cil/Variable.qll
rename to csharp/ql/lib/semmle/code/cil/Variable.qll
diff --git a/csharp/ql/src/semmle/code/cil/internal/SsaImpl.qll b/csharp/ql/lib/semmle/code/cil/internal/SsaImpl.qll
similarity index 100%
rename from csharp/ql/src/semmle/code/cil/internal/SsaImpl.qll
rename to csharp/ql/lib/semmle/code/cil/internal/SsaImpl.qll
diff --git a/csharp/ql/src/semmle/code/cil/internal/SsaImplCommon.qll b/csharp/ql/lib/semmle/code/cil/internal/SsaImplCommon.qll
similarity index 100%
rename from csharp/ql/src/semmle/code/cil/internal/SsaImplCommon.qll
rename to csharp/ql/lib/semmle/code/cil/internal/SsaImplCommon.qll
diff --git a/csharp/ql/src/semmle/code/cil/internal/SsaImplSpecific.qll b/csharp/ql/lib/semmle/code/cil/internal/SsaImplSpecific.qll
similarity index 100%
rename from csharp/ql/src/semmle/code/cil/internal/SsaImplSpecific.qll
rename to csharp/ql/lib/semmle/code/cil/internal/SsaImplSpecific.qll
diff --git a/csharp/ql/src/semmle/code/csharp/AnnotatedType.qll b/csharp/ql/lib/semmle/code/csharp/AnnotatedType.qll
similarity index 99%
rename from csharp/ql/src/semmle/code/csharp/AnnotatedType.qll
rename to csharp/ql/lib/semmle/code/csharp/AnnotatedType.qll
index 6a6274821d7..37aa2b23410 100644
--- a/csharp/ql/src/semmle/code/csharp/AnnotatedType.qll
+++ b/csharp/ql/lib/semmle/code/csharp/AnnotatedType.qll
@@ -407,7 +407,7 @@ class AnnotatedConstructedType extends AnnotatedType {
override string toString() {
result =
- annotations.getTypePrefix() + type.getUnboundGeneric().getNameWithoutBrackets() + "<" +
+ annotations.getTypePrefix() + type.getUnboundGeneric().getUndecoratedName() + "<" +
this.getTypeArgumentsString() + ">" + annotations.getTypeSuffix()
}
diff --git a/csharp/ql/src/semmle/code/csharp/Assignable.qll b/csharp/ql/lib/semmle/code/csharp/Assignable.qll
similarity index 100%
rename from csharp/ql/src/semmle/code/csharp/Assignable.qll
rename to csharp/ql/lib/semmle/code/csharp/Assignable.qll
diff --git a/csharp/ql/src/semmle/code/csharp/Attribute.qll b/csharp/ql/lib/semmle/code/csharp/Attribute.qll
similarity index 100%
rename from csharp/ql/src/semmle/code/csharp/Attribute.qll
rename to csharp/ql/lib/semmle/code/csharp/Attribute.qll
diff --git a/csharp/ql/src/semmle/code/csharp/Caching.qll b/csharp/ql/lib/semmle/code/csharp/Caching.qll
similarity index 98%
rename from csharp/ql/src/semmle/code/csharp/Caching.qll
rename to csharp/ql/lib/semmle/code/csharp/Caching.qll
index 92417e34586..6a58edef63f 100644
--- a/csharp/ql/src/semmle/code/csharp/Caching.qll
+++ b/csharp/ql/lib/semmle/code/csharp/Caching.qll
@@ -18,7 +18,7 @@ module Stages {
cached
private predicate forceCachingInSameStageRev() {
- exists(SplitImpl si)
+ exists(Split s)
or
exists(SuccessorType st)
or
diff --git a/csharp/ql/src/semmle/code/csharp/Callable.qll b/csharp/ql/lib/semmle/code/csharp/Callable.qll
similarity index 99%
rename from csharp/ql/src/semmle/code/csharp/Callable.qll
rename to csharp/ql/lib/semmle/code/csharp/Callable.qll
index 111702bac48..a321e9356d6 100644
--- a/csharp/ql/src/semmle/code/csharp/Callable.qll
+++ b/csharp/ql/lib/semmle/code/csharp/Callable.qll
@@ -313,6 +313,7 @@ class ExtensionMethod extends Method {
override predicate isStatic() { any() }
/** Gets the type being extended by this method. */
+ pragma[noinline]
Type getExtendedType() { result = getParameter(0).getType() }
override string getAPrimaryQlClass() { result = "ExtensionMethod" }
diff --git a/csharp/ql/src/semmle/code/csharp/Chaining.qll b/csharp/ql/lib/semmle/code/csharp/Chaining.qll
similarity index 100%
rename from csharp/ql/src/semmle/code/csharp/Chaining.qll
rename to csharp/ql/lib/semmle/code/csharp/Chaining.qll
diff --git a/csharp/ql/src/semmle/code/csharp/Comments.qll b/csharp/ql/lib/semmle/code/csharp/Comments.qll
similarity index 100%
rename from csharp/ql/src/semmle/code/csharp/Comments.qll
rename to csharp/ql/lib/semmle/code/csharp/Comments.qll
diff --git a/csharp/ql/src/semmle/code/csharp/Conversion.qll b/csharp/ql/lib/semmle/code/csharp/Conversion.qll
similarity index 100%
rename from csharp/ql/src/semmle/code/csharp/Conversion.qll
rename to csharp/ql/lib/semmle/code/csharp/Conversion.qll
diff --git a/csharp/ql/src/semmle/code/csharp/Element.qll b/csharp/ql/lib/semmle/code/csharp/Element.qll
similarity index 100%
rename from csharp/ql/src/semmle/code/csharp/Element.qll
rename to csharp/ql/lib/semmle/code/csharp/Element.qll
diff --git a/csharp/ql/src/semmle/code/csharp/Event.qll b/csharp/ql/lib/semmle/code/csharp/Event.qll
similarity index 100%
rename from csharp/ql/src/semmle/code/csharp/Event.qll
rename to csharp/ql/lib/semmle/code/csharp/Event.qll
diff --git a/csharp/ql/src/semmle/code/csharp/ExprOrStmtParent.qll b/csharp/ql/lib/semmle/code/csharp/ExprOrStmtParent.qll
similarity index 100%
rename from csharp/ql/src/semmle/code/csharp/ExprOrStmtParent.qll
rename to csharp/ql/lib/semmle/code/csharp/ExprOrStmtParent.qll
diff --git a/csharp/ql/src/semmle/code/csharp/File.qll b/csharp/ql/lib/semmle/code/csharp/File.qll
similarity index 100%
rename from csharp/ql/src/semmle/code/csharp/File.qll
rename to csharp/ql/lib/semmle/code/csharp/File.qll
diff --git a/csharp/ql/src/semmle/code/csharp/Generics.qll b/csharp/ql/lib/semmle/code/csharp/Generics.qll
similarity index 89%
rename from csharp/ql/src/semmle/code/csharp/Generics.qll
rename to csharp/ql/lib/semmle/code/csharp/Generics.qll
index 77f5249841f..251ae723c8a 100644
--- a/csharp/ql/src/semmle/code/csharp/Generics.qll
+++ b/csharp/ql/lib/semmle/code/csharp/Generics.qll
@@ -105,20 +105,36 @@ class UnboundGenericType extends ValueOrRefType, UnboundGeneric {
override Location getALocation() { type_location(this, result) }
- /** Gets the name of this generic type without the `<...>` brackets. */
- string getNameWithoutBrackets() {
- result = getName().prefix(getName().length() - getNumberOfTypeParameters() - 1)
- }
-
- override string toStringWithTypes() {
- result = getNameWithoutBrackets() + "<" + this.typeParametersToString() + ">"
- }
-
override UnboundGenericType getUnboundDeclaration() {
result = ValueOrRefType.super.getUnboundDeclaration()
}
final override Type getChild(int n) { result = getTypeParameter(n) }
+
+ private string getTypeParameterCommas() {
+ result = strictconcat(int i | exists(this.getTypeParameter(i)) | "", ",")
+ }
+
+ override string toStringWithTypes() {
+ result = this.getUndecoratedName() + "<" + this.typeParametersToString() + ">"
+ }
+
+ final override string getName() {
+ result = this.getUndecoratedName() + "<" + this.getTypeParameterCommas() + ">"
+ }
+
+ final override predicate hasQualifiedName(string qualifier, string name) {
+ exists(string name0 | name = name0 + "<" + this.getTypeParameterCommas() + ">" |
+ exists(string enclosing |
+ this.getDeclaringType().hasQualifiedName(qualifier, enclosing) and
+ name0 = enclosing + "+" + this.getUndecoratedName()
+ )
+ or
+ not exists(this.getDeclaringType()) and
+ qualifier = this.getNamespace().getQualifiedName() and
+ name0 = this.getUndecoratedName()
+ )
+ }
}
/**
@@ -332,8 +348,8 @@ class UnboundGenericDelegateType extends DelegateType, UnboundGenericType {
override string toStringWithTypes() {
result =
- getNameWithoutBrackets() + "<" + this.typeParametersToString() + ">(" +
- parameterTypesToString() + ")"
+ getUndecoratedName() + "<" + this.typeParametersToString() + ">(" + parameterTypesToString() +
+ ")"
}
}
@@ -360,22 +376,49 @@ class ConstructedType extends ValueOrRefType, ConstructedGeneric {
override UnboundGenericType getUnboundGeneric() { constructed_generic(this, getTypeRef(result)) }
- override string toStringWithTypes() {
- result =
- getUnboundGeneric().getNameWithoutBrackets() + "<" + this.getTypeArgumentsString() + ">"
- }
-
final override Type getChild(int n) { result = getTypeArgument(n) }
language[monotonicAggregates]
private string getTypeArgumentsString() {
result =
- concat(int i |
- exists(this.getTypeArgument(i))
+ strictconcat(Type t, int i | t = this.getTypeArgument(i) | t.toString(), ", " order by i)
+ }
+
+ language[monotonicAggregates]
+ private string getTypeArgumentsNames() {
+ result = strictconcat(Type t, int i | t = this.getTypeArgument(i) | t.getName(), "," order by i)
+ }
+
+ language[monotonicAggregates]
+ private string getTypeArgumentsQualifiedNames() {
+ result =
+ strictconcat(Type t, int i |
+ t = this.getTypeArgument(i)
|
- this.getTypeArgument(i).toString(), ", " order by i
+ t.getQualifiedName(), "," order by i
)
}
+
+ final override string toStringWithTypes() {
+ result = this.getUndecoratedName() + "<" + this.getTypeArgumentsString() + ">"
+ }
+
+ final override string getName() {
+ result = this.getUndecoratedName() + "<" + this.getTypeArgumentsNames() + ">"
+ }
+
+ final override predicate hasQualifiedName(string qualifier, string name) {
+ exists(string name0 | name = name0 + "<" + this.getTypeArgumentsQualifiedNames() + ">" |
+ exists(string enclosing |
+ this.getDeclaringType().hasQualifiedName(qualifier, enclosing) and
+ name0 = enclosing + "+" + this.getUndecoratedName()
+ )
+ or
+ not exists(this.getDeclaringType()) and
+ qualifier = this.getNamespace().getQualifiedName() and
+ name0 = this.getUndecoratedName()
+ )
+ }
}
/**
diff --git a/csharp/ql/src/semmle/code/csharp/Implements.qll b/csharp/ql/lib/semmle/code/csharp/Implements.qll
similarity index 100%
rename from csharp/ql/src/semmle/code/csharp/Implements.qll
rename to csharp/ql/lib/semmle/code/csharp/Implements.qll
diff --git a/csharp/ql/src/semmle/code/csharp/Location.qll b/csharp/ql/lib/semmle/code/csharp/Location.qll
similarity index 100%
rename from csharp/ql/src/semmle/code/csharp/Location.qll
rename to csharp/ql/lib/semmle/code/csharp/Location.qll
diff --git a/csharp/ql/src/semmle/code/csharp/Member.qll b/csharp/ql/lib/semmle/code/csharp/Member.qll
similarity index 100%
rename from csharp/ql/src/semmle/code/csharp/Member.qll
rename to csharp/ql/lib/semmle/code/csharp/Member.qll
diff --git a/csharp/ql/src/semmle/code/csharp/Modifier.qll b/csharp/ql/lib/semmle/code/csharp/Modifier.qll
similarity index 100%
rename from csharp/ql/src/semmle/code/csharp/Modifier.qll
rename to csharp/ql/lib/semmle/code/csharp/Modifier.qll
diff --git a/csharp/ql/src/semmle/code/csharp/Namespace.qll b/csharp/ql/lib/semmle/code/csharp/Namespace.qll
similarity index 100%
rename from csharp/ql/src/semmle/code/csharp/Namespace.qll
rename to csharp/ql/lib/semmle/code/csharp/Namespace.qll
diff --git a/csharp/ql/src/semmle/code/csharp/Preprocessor.qll b/csharp/ql/lib/semmle/code/csharp/Preprocessor.qll
similarity index 100%
rename from csharp/ql/src/semmle/code/csharp/Preprocessor.qll
rename to csharp/ql/lib/semmle/code/csharp/Preprocessor.qll
diff --git a/csharp/ql/src/semmle/code/csharp/PrintAst.ql b/csharp/ql/lib/semmle/code/csharp/PrintAst.ql
similarity index 100%
rename from csharp/ql/src/semmle/code/csharp/PrintAst.ql
rename to csharp/ql/lib/semmle/code/csharp/PrintAst.ql
diff --git a/csharp/ql/src/semmle/code/csharp/PrintAst.qll b/csharp/ql/lib/semmle/code/csharp/PrintAst.qll
similarity index 99%
rename from csharp/ql/src/semmle/code/csharp/PrintAst.qll
rename to csharp/ql/lib/semmle/code/csharp/PrintAst.qll
index 1cac4a5f238..a701c7bfbf3 100644
--- a/csharp/ql/src/semmle/code/csharp/PrintAst.qll
+++ b/csharp/ql/lib/semmle/code/csharp/PrintAst.qll
@@ -61,7 +61,7 @@ private predicate isNotNeeded(Element e) {
* Retrieves the canonical QL class(es) for entity `el`
*/
private string getQlClass(Element el) {
- result = "[" + concat(el.getAPrimaryQlClass(), ",") + "] "
+ result = "[" + el.getPrimaryQlClasses() + "] "
// Alternative implementation -- do not delete. It is useful for QL class discovery.
// result = "["+ concat(el.getAQlClass(), ",") + "] "
}
diff --git a/csharp/ql/src/semmle/code/csharp/Property.qll b/csharp/ql/lib/semmle/code/csharp/Property.qll
similarity index 100%
rename from csharp/ql/src/semmle/code/csharp/Property.qll
rename to csharp/ql/lib/semmle/code/csharp/Property.qll
diff --git a/csharp/ql/src/semmle/code/csharp/Stmt.qll b/csharp/ql/lib/semmle/code/csharp/Stmt.qll
similarity index 100%
rename from csharp/ql/src/semmle/code/csharp/Stmt.qll
rename to csharp/ql/lib/semmle/code/csharp/Stmt.qll
diff --git a/csharp/ql/src/semmle/code/csharp/Type.qll b/csharp/ql/lib/semmle/code/csharp/Type.qll
similarity index 93%
rename from csharp/ql/src/semmle/code/csharp/Type.qll
rename to csharp/ql/lib/semmle/code/csharp/Type.qll
index eea631ba377..4f464722f48 100644
--- a/csharp/ql/src/semmle/code/csharp/Type.qll
+++ b/csharp/ql/lib/semmle/code/csharp/Type.qll
@@ -55,27 +55,12 @@ private predicate isObjectClass(Class c) { c instanceof ObjectType }
* Either a value type (`ValueType`) or a reference type (`RefType`).
*/
class ValueOrRefType extends DotNet::ValueOrRefType, Type, Attributable, @value_or_ref_type {
- /** Gets the name of this type without `<...>` brackets, in case it is a constructed type. */
- private string getNameWithoutBrackets() {
- exists(UnboundGenericType unbound, string name |
- unbound = this.(ConstructedType).getUnboundDeclaration() and
- name = unbound.getName() and
- result = name.prefix(name.length() - unbound.getNumberOfTypeParameters() - 1)
- )
- or
- not this instanceof ConstructedType and
- result = this.getName()
- }
-
- language[monotonicAggregates]
- private string getQualifiedTypeArguments() {
- result =
- strictconcat(Type t, int i |
- t = this.(ConstructedType).getTypeArgument(i)
- |
- t.getQualifiedName(), "," order by i
- )
- }
+ /**
+ * DEPRECATED: use `getUndecoratedName()` instead.
+ *
+ * Gets the name of this type without `<...>` brackets, in case it is a generic type.
+ */
+ deprecated string getNameWithoutBrackets() { types(this, _, result) }
/**
* Holds if this type has the qualified name `qualifier`.`name`.
@@ -84,21 +69,14 @@ class ValueOrRefType extends DotNet::ValueOrRefType, Type, Attributable, @value_
* `qualifier`=`System.IO` and `name`=`IOException`.
*/
override predicate hasQualifiedName(string qualifier, string name) {
- exists(string name0 |
- not this instanceof ConstructedType and
- name = name0
- or
- name = name0 + "<" + this.getQualifiedTypeArguments() + ">"
- |
- exists(string enclosing |
- this.getDeclaringType().hasQualifiedName(qualifier, enclosing) and
- name0 = enclosing + "+" + this.getNameWithoutBrackets()
- )
- or
- not exists(this.getDeclaringType()) and
- qualifier = this.getNamespace().getQualifiedName() and
- name0 = this.getNameWithoutBrackets()
+ exists(string enclosing |
+ this.getDeclaringType().hasQualifiedName(qualifier, enclosing) and
+ name = enclosing + "+" + this.getUndecoratedName()
)
+ or
+ not exists(this.getDeclaringType()) and
+ qualifier = this.getNamespace().getQualifiedName() and
+ name = this.getUndecoratedName()
}
/** Gets the namespace containing this type. */
@@ -112,16 +90,7 @@ class ValueOrRefType extends DotNet::ValueOrRefType, Type, Attributable, @value_
override ValueOrRefType getDeclaringType() { none() }
- override string getUndecoratedName() {
- if this.getName().indexOf("<") > 0
- then
- exists(string name, int p |
- name = this.getName() and p = min(int p2 | p2 = name.indexOf("<") and p2 > 0)
- |
- result = name.substring(0, p)
- )
- else result = this.getName()
- }
+ override string getUndecoratedName() { types(this, _, result) }
/** Gets a nested child type, if any. */
NestedType getAChildType() { nested_types(result, this, _) }
@@ -201,6 +170,7 @@ class ValueOrRefType extends DotNet::ValueOrRefType, Type, Attributable, @value_
* }
* ```
*/
+ pragma[inline]
predicate hasMethod(Method m) { this.hasMember(m) }
/**
@@ -227,6 +197,7 @@ class ValueOrRefType extends DotNet::ValueOrRefType, Type, Attributable, @value_
* }
* ```
*/
+ pragma[inline]
predicate hasCallable(Callable c) {
hasMethod(c)
or
@@ -256,25 +227,15 @@ class ValueOrRefType extends DotNet::ValueOrRefType, Type, Attributable, @value_
* }
* ```
*/
+ pragma[inline]
predicate hasMember(Member m) {
- // For performance reasons, split up into "cheap" computation
- // (non-overridden members) and "expensive" computation
- // (overridden members). The latter is cached, and generally
- // much smaller than the full relation.
- hasNonOverriddenMember(m)
+ m = this.getAMember()
+ or
+ hasNonOverriddenMember(this.getBaseClass+(), m)
or
hasOverriddenMember(m)
}
- private predicate hasNonOverriddenMember(Member m) {
- isNonOverridden(m) and
- (
- m = getAMember()
- or
- getBaseClass+().getAMember() = m and not m.isPrivate()
- )
- }
-
cached
private predicate hasOverriddenMember(Virtualizable v) {
v.isOverridden() and
@@ -753,8 +714,12 @@ class RefType extends ValueOrRefType, @ref_type {
override predicate isRefType() { any() }
}
-// Helper predicate to avoid slow "negation_body"
-private predicate isNonOverridden(Member m) { not m.(Virtualizable).isOverridden() }
+pragma[noinline]
+private predicate hasNonOverriddenMember(Class c, Member m) {
+ m = c.getAMember() and
+ not m.(Virtualizable).isOverridden() and
+ not m.isPrivate()
+}
/**
* A `class`, for example
@@ -963,6 +928,15 @@ class NullableType extends ValueType, DotNet::ConstructedGeneric, @nullable_type
override Type getTypeArgument(int p) { p = 0 and result = getUnderlyingType() }
override string getAPrimaryQlClass() { result = "NullableType" }
+
+ final override string getName() {
+ result = "Nullable<" + this.getUnderlyingType().getName() + ">"
+ }
+
+ final override predicate hasQualifiedName(string qualifier, string name) {
+ qualifier = "System" and
+ name = "Nullable<" + this.getUnderlyingType().getQualifiedName() + ">"
+ }
}
/**
@@ -1046,7 +1020,7 @@ class PointerType extends DotNet::PointerType, Type, @pointer_type {
override Type getChild(int n) { result = getReferentType() and n = 0 }
- override string getName() { result = DotNet::PointerType.super.getName() }
+ override string getName() { types(this, _, result) }
override Location getALocation() { result = getReferentType().getALocation() }
@@ -1120,11 +1094,14 @@ class TupleType extends ValueType, @tuple_type {
override string toStringWithTypes() {
result =
"(" +
- concat(int i |
- exists(getElement(i))
- |
- getElement(i).getType().toStringWithTypes(), ", " order by i
- ) + ")"
+ concat(Type t, int i | t = getElement(i).getType() | t.toStringWithTypes(), ", " order by i)
+ + ")"
+ }
+
+ language[monotonicAggregates]
+ override string getName() {
+ result =
+ "(" + concat(Type t, int i | t = getElement(i).getType() | t.getName(), "," order by i) + ")"
}
override string getLabel() { result = getUnderlyingType().getLabel() }
diff --git a/csharp/ql/src/semmle/code/csharp/TypeRef.qll b/csharp/ql/lib/semmle/code/csharp/TypeRef.qll
similarity index 100%
rename from csharp/ql/src/semmle/code/csharp/TypeRef.qll
rename to csharp/ql/lib/semmle/code/csharp/TypeRef.qll
diff --git a/csharp/ql/src/semmle/code/csharp/Unification.qll b/csharp/ql/lib/semmle/code/csharp/Unification.qll
similarity index 100%
rename from csharp/ql/src/semmle/code/csharp/Unification.qll
rename to csharp/ql/lib/semmle/code/csharp/Unification.qll
diff --git a/csharp/ql/src/semmle/code/csharp/Using.qll b/csharp/ql/lib/semmle/code/csharp/Using.qll
similarity index 100%
rename from csharp/ql/src/semmle/code/csharp/Using.qll
rename to csharp/ql/lib/semmle/code/csharp/Using.qll
diff --git a/csharp/ql/src/semmle/code/csharp/Variable.qll b/csharp/ql/lib/semmle/code/csharp/Variable.qll
similarity index 100%
rename from csharp/ql/src/semmle/code/csharp/Variable.qll
rename to csharp/ql/lib/semmle/code/csharp/Variable.qll
diff --git a/csharp/ql/src/semmle/code/csharp/XML.qll b/csharp/ql/lib/semmle/code/csharp/XML.qll
similarity index 100%
rename from csharp/ql/src/semmle/code/csharp/XML.qll
rename to csharp/ql/lib/semmle/code/csharp/XML.qll
diff --git a/csharp/ql/src/semmle/code/csharp/commons/Assertions.qll b/csharp/ql/lib/semmle/code/csharp/commons/Assertions.qll
similarity index 100%
rename from csharp/ql/src/semmle/code/csharp/commons/Assertions.qll
rename to csharp/ql/lib/semmle/code/csharp/commons/Assertions.qll
diff --git a/csharp/ql/src/semmle/code/csharp/commons/Collections.qll b/csharp/ql/lib/semmle/code/csharp/commons/Collections.qll
similarity index 100%
rename from csharp/ql/src/semmle/code/csharp/commons/Collections.qll
rename to csharp/ql/lib/semmle/code/csharp/commons/Collections.qll
diff --git a/csharp/ql/src/semmle/code/csharp/commons/ComparisonTest.qll b/csharp/ql/lib/semmle/code/csharp/commons/ComparisonTest.qll
similarity index 100%
rename from csharp/ql/src/semmle/code/csharp/commons/ComparisonTest.qll
rename to csharp/ql/lib/semmle/code/csharp/commons/ComparisonTest.qll
diff --git a/csharp/ql/src/semmle/code/csharp/commons/Compilation.qll b/csharp/ql/lib/semmle/code/csharp/commons/Compilation.qll
similarity index 100%
rename from csharp/ql/src/semmle/code/csharp/commons/Compilation.qll
rename to csharp/ql/lib/semmle/code/csharp/commons/Compilation.qll
diff --git a/csharp/ql/src/semmle/code/csharp/commons/ConsistencyChecks.qll b/csharp/ql/lib/semmle/code/csharp/commons/ConsistencyChecks.qll
similarity index 100%
rename from csharp/ql/src/semmle/code/csharp/commons/ConsistencyChecks.qll
rename to csharp/ql/lib/semmle/code/csharp/commons/ConsistencyChecks.qll
diff --git a/csharp/ql/src/semmle/code/csharp/commons/Constants.qll b/csharp/ql/lib/semmle/code/csharp/commons/Constants.qll
similarity index 100%
rename from csharp/ql/src/semmle/code/csharp/commons/Constants.qll
rename to csharp/ql/lib/semmle/code/csharp/commons/Constants.qll
diff --git a/csharp/ql/src/semmle/code/csharp/commons/Diagnostics.qll b/csharp/ql/lib/semmle/code/csharp/commons/Diagnostics.qll
similarity index 100%
rename from csharp/ql/src/semmle/code/csharp/commons/Diagnostics.qll
rename to csharp/ql/lib/semmle/code/csharp/commons/Diagnostics.qll
diff --git a/csharp/ql/src/semmle/code/csharp/commons/Disposal.qll b/csharp/ql/lib/semmle/code/csharp/commons/Disposal.qll
similarity index 100%
rename from csharp/ql/src/semmle/code/csharp/commons/Disposal.qll
rename to csharp/ql/lib/semmle/code/csharp/commons/Disposal.qll
diff --git a/csharp/ql/src/semmle/code/csharp/commons/GeneratedCode.qll b/csharp/ql/lib/semmle/code/csharp/commons/GeneratedCode.qll
similarity index 100%
rename from csharp/ql/src/semmle/code/csharp/commons/GeneratedCode.qll
rename to csharp/ql/lib/semmle/code/csharp/commons/GeneratedCode.qll
diff --git a/csharp/ql/src/semmle/code/csharp/commons/Loggers.qll b/csharp/ql/lib/semmle/code/csharp/commons/Loggers.qll
similarity index 100%
rename from csharp/ql/src/semmle/code/csharp/commons/Loggers.qll
rename to csharp/ql/lib/semmle/code/csharp/commons/Loggers.qll
diff --git a/csharp/ql/src/semmle/code/csharp/commons/Strings.qll b/csharp/ql/lib/semmle/code/csharp/commons/Strings.qll
similarity index 100%
rename from csharp/ql/src/semmle/code/csharp/commons/Strings.qll
rename to csharp/ql/lib/semmle/code/csharp/commons/Strings.qll
diff --git a/csharp/ql/src/semmle/code/csharp/commons/StructuralComparison.qll b/csharp/ql/lib/semmle/code/csharp/commons/StructuralComparison.qll
similarity index 100%
rename from csharp/ql/src/semmle/code/csharp/commons/StructuralComparison.qll
rename to csharp/ql/lib/semmle/code/csharp/commons/StructuralComparison.qll
diff --git a/csharp/ql/src/semmle/code/csharp/commons/TargetFramework.qll b/csharp/ql/lib/semmle/code/csharp/commons/TargetFramework.qll
similarity index 100%
rename from csharp/ql/src/semmle/code/csharp/commons/TargetFramework.qll
rename to csharp/ql/lib/semmle/code/csharp/commons/TargetFramework.qll
diff --git a/csharp/ql/src/semmle/code/csharp/commons/Util.qll b/csharp/ql/lib/semmle/code/csharp/commons/Util.qll
similarity index 100%
rename from csharp/ql/src/semmle/code/csharp/commons/Util.qll
rename to csharp/ql/lib/semmle/code/csharp/commons/Util.qll
diff --git a/csharp/ql/src/semmle/code/csharp/controlflow/BasicBlocks.qll b/csharp/ql/lib/semmle/code/csharp/controlflow/BasicBlocks.qll
similarity index 100%
rename from csharp/ql/src/semmle/code/csharp/controlflow/BasicBlocks.qll
rename to csharp/ql/lib/semmle/code/csharp/controlflow/BasicBlocks.qll
diff --git a/csharp/ql/src/semmle/code/csharp/controlflow/ControlFlowElement.qll b/csharp/ql/lib/semmle/code/csharp/controlflow/ControlFlowElement.qll
similarity index 100%
rename from csharp/ql/src/semmle/code/csharp/controlflow/ControlFlowElement.qll
rename to csharp/ql/lib/semmle/code/csharp/controlflow/ControlFlowElement.qll
diff --git a/csharp/ql/src/semmle/code/csharp/controlflow/ControlFlowGraph.qll b/csharp/ql/lib/semmle/code/csharp/controlflow/ControlFlowGraph.qll
similarity index 96%
rename from csharp/ql/src/semmle/code/csharp/controlflow/ControlFlowGraph.qll
rename to csharp/ql/lib/semmle/code/csharp/controlflow/ControlFlowGraph.qll
index 061b7674810..96b73d8978d 100644
--- a/csharp/ql/src/semmle/code/csharp/controlflow/ControlFlowGraph.qll
+++ b/csharp/ql/lib/semmle/code/csharp/controlflow/ControlFlowGraph.qll
@@ -183,7 +183,7 @@ module ControlFlow {
}
/** Gets a successor node of a given type, if any. */
- Node getASuccessorByType(SuccessorType t) { result = getASuccessorByType(this, t) }
+ Node getASuccessorByType(SuccessorType t) { result = getASuccessor(this, t) }
/** Gets an immediate successor, if any. */
Node getASuccessor() { result = getASuccessorByType(_) }
@@ -255,9 +255,15 @@ module ControlFlow {
override Callable getEnclosingCallable() { result = this.getCallable() }
- override Location getLocation() { result = getCallable().getLocation() }
+ private Assignable getAssignable() { this = TEntryNode(result) }
- override string toString() { result = "enter " + getCallable().toString() }
+ override Location getLocation() {
+ result in [this.getCallable().getLocation(), this.getAssignable().getLocation()]
+ }
+
+ override string toString() {
+ result = "enter " + [this.getCallable().toString(), this.getAssignable().toString()]
+ }
}
/** A node for a callable exit point, annotated with the type of exit. */
@@ -314,7 +320,7 @@ module ControlFlow {
* different splits for the element.
*/
class ElementNode extends Node, TElementNode {
- private Splitting::Splits splits;
+ private Splits splits;
private ControlFlowElement cfe;
ElementNode() { this = TElementNode(cfe, splits) }
diff --git a/csharp/ql/src/semmle/code/csharp/controlflow/Guards.qll b/csharp/ql/lib/semmle/code/csharp/controlflow/Guards.qll
similarity index 100%
rename from csharp/ql/src/semmle/code/csharp/controlflow/Guards.qll
rename to csharp/ql/lib/semmle/code/csharp/controlflow/Guards.qll
diff --git a/csharp/ql/src/semmle/code/csharp/controlflow/internal/Completion.qll b/csharp/ql/lib/semmle/code/csharp/controlflow/internal/Completion.qll
similarity index 100%
rename from csharp/ql/src/semmle/code/csharp/controlflow/internal/Completion.qll
rename to csharp/ql/lib/semmle/code/csharp/controlflow/internal/Completion.qll
diff --git a/csharp/ql/src/semmle/code/csharp/controlflow/internal/ControlFlowGraphImpl.qll b/csharp/ql/lib/semmle/code/csharp/controlflow/internal/ControlFlowGraphImpl.qll
similarity index 88%
rename from csharp/ql/src/semmle/code/csharp/controlflow/internal/ControlFlowGraphImpl.qll
rename to csharp/ql/lib/semmle/code/csharp/controlflow/internal/ControlFlowGraphImpl.qll
index 63f6943a29c..8a02fb95dee 100644
--- a/csharp/ql/src/semmle/code/csharp/controlflow/internal/ControlFlowGraphImpl.qll
+++ b/csharp/ql/lib/semmle/code/csharp/controlflow/internal/ControlFlowGraphImpl.qll
@@ -43,13 +43,22 @@
*/
import csharp
-private import semmle.code.csharp.controlflow.ControlFlowGraph::ControlFlow
private import Completion
-private import SuccessorType
-private import SuccessorTypes
private import Splitting
private import semmle.code.csharp.ExprOrStmtParent
private import semmle.code.csharp.commons.Compilation
+import ControlFlowGraphImplShared
+
+/** An element that defines a new CFG scope. */
+class CfgScope extends Element, @top_level_exprorstmt_parent {
+ CfgScope() {
+ this instanceof Callable
+ or
+ // For now, static initializer values have their own scope. Eventually, they
+ // should be treated like instance initializers.
+ this.(Assignable).(Modifiable).isStatic()
+ }
+}
/**
* A compilation.
@@ -71,16 +80,11 @@ CompilationExt getCompilation(SourceFile f) {
result = TBuildless()
}
-/** An element that defines a new CFG scope. */
-class CfgScope extends Element, @top_level_exprorstmt_parent {
- CfgScope() { not this instanceof Attribute }
-}
-
module ControlFlowTree {
class Range_ = @callable or @control_flow_element;
class Range extends Element, Range_ {
- Range() { this = getAChild*(any(CfgScope scope)) }
+ Range() { this = getAChild*(any(@top_level_exprorstmt_parent p | not p instanceof Attribute)) }
}
Element getAChild(Element p) {
@@ -93,61 +97,6 @@ module ControlFlowTree {
predicate idOf(Range_ x, int y) = equivalenceRelation(id/2)(x, y)
}
-abstract private class ControlFlowTree extends ControlFlowTree::Range {
- /**
- * Holds if `first` is the first element executed within this control
- * flow element.
- */
- pragma[nomagic]
- abstract predicate first(ControlFlowElement first);
-
- /**
- * Holds if `last` with completion `c` is a potential last element executed
- * within this control flow element.
- */
- pragma[nomagic]
- abstract predicate last(ControlFlowElement last, Completion c);
-
- /** Holds if abnormal execution of `child` should propagate upwards. */
- abstract predicate propagatesAbnormal(ControlFlowElement child);
-
- /**
- * Holds if `succ` is a control flow successor for `pred`, given that `pred`
- * finishes with completion `c`.
- */
- pragma[nomagic]
- abstract predicate succ(ControlFlowElement pred, ControlFlowElement succ, Completion c);
-}
-
-/**
- * Holds if `first` is the first element executed within control flow
- * element `cft`.
- */
-predicate first(ControlFlowTree cft, ControlFlowElement first) { cft.first(first) }
-
-/**
- * Holds if `last` with completion `c` is a potential last element executed
- * within control flow element `cft`.
- */
-predicate last(ControlFlowTree cft, ControlFlowElement last, Completion c) {
- cft.last(last, c)
- or
- exists(ControlFlowElement cfe |
- cft.propagatesAbnormal(cfe) and
- last(cfe, last, c) and
- not c instanceof NormalCompletion
- )
-}
-
-/**
- * Holds if `succ` is a control flow successor for `pred`, given that `pred`
- * finishes with completion `c`.
- */
-pragma[nomagic]
-predicate succ(ControlFlowElement pred, ControlFlowElement succ, Completion c) {
- any(ControlFlowTree cft).succ(pred, succ, c)
-}
-
/** Holds if `first` is first executed when entering `scope`. */
predicate scopeFirst(CfgScope scope, ControlFlowElement first) {
scope =
@@ -161,8 +110,7 @@ predicate scopeFirst(CfgScope scope, ControlFlowElement first) {
)
or
expr_parent_top_level_adjusted(any(Expr e | first(e, first)), _, scope) and
- not scope instanceof Callable and
- not scope instanceof InitializerSplitting::InitializedInstanceMember
+ not scope instanceof Callable
}
/** Holds if `scope` is exited when `last` finishes with completion `c`. */
@@ -204,53 +152,6 @@ private class ConstructorTree extends ControlFlowTree, Constructor {
}
}
-/**
- * A control flow element where the children are evaluated following a
- * standard left-to-right evaluation. The actual evaluation order is
- * determined by the predicate `getChildElement()`.
- */
-abstract private class StandardElement extends ControlFlowTree {
- /** Gets the `i`th child element, in order of evaluation, starting from 0. */
- abstract ControlFlowElement getChildElement(int i);
-
- /** Gets the first child element of this element. */
- final ControlFlowElement getFirstChild() { result = this.getChildElement(0) }
-
- /** Holds if this element has no children. */
- final predicate isLeafElement() { not exists(this.getFirstChild()) }
-
- /** Gets the last child element of this element. */
- final ControlFlowTree getLastChild() {
- exists(int last |
- result = this.getChildElement(last) and
- not exists(this.getChildElement(last + 1))
- )
- }
-
- final override predicate propagatesAbnormal(ControlFlowElement child) {
- child = this.getChildElement(_)
- }
-
- override predicate succ(ControlFlowElement pred, ControlFlowElement succ, Completion c) {
- exists(int i |
- last(this.getChildElement(i), pred, c) and
- first(this.getChildElement(i + 1), succ) and
- c instanceof NormalCompletion
- )
- }
-}
-
-abstract private class PreOrderTree extends ControlFlowTree {
- final override predicate first(ControlFlowElement first) { first = this }
-}
-
-abstract private class PostOrderTree extends ControlFlowTree {
- override predicate last(ControlFlowElement last, Completion c) {
- last = this and
- c.isValidFor(last)
- }
-}
-
abstract private class SwitchTree extends ControlFlowTree, Switch {
override predicate propagatesAbnormal(ControlFlowElement child) { child = this.getExpr() }
@@ -368,7 +269,7 @@ module Expressions {
)
}
- private class StandardExpr extends StandardElement, PostOrderTree, Expr {
+ private class StandardExpr extends StandardPostOrderTree, Expr {
StandardExpr() {
// The following expressions need special treatment
not this instanceof LogicalNotExpr and
@@ -396,21 +297,6 @@ module Expressions {
}
final override ControlFlowElement getChildElement(int i) { result = getExprChild(this, i) }
-
- final override predicate first(ControlFlowElement first) {
- first(this.getFirstChild(), first)
- or
- not exists(this.getFirstChild()) and
- first = this
- }
-
- final override predicate succ(ControlFlowElement pred, ControlFlowElement succ, Completion c) {
- StandardElement.super.succ(pred, succ, c)
- or
- last(this.getLastChild(), pred, c) and
- succ = this and
- c instanceof NormalCompletion
- }
}
/**
@@ -1095,7 +981,7 @@ private class PropertyPatternExprExprTree extends PostOrderTree, PropertyPattern
}
module Statements {
- private class StandardStmt extends StandardElement, PreOrderTree, Stmt {
+ private class StandardStmt extends StandardPreOrderTree, Stmt {
StandardStmt() {
// The following statements need special treatment
not this instanceof IfStmt and
@@ -1140,22 +1026,6 @@ module Statements {
result =
rank[i + 1](ControlFlowElement cfe, int j | cfe = this.getChildElement0(j) | cfe order by j)
}
-
- final override predicate last(ControlFlowElement last, Completion c) {
- last(this.getLastChild(), last, c)
- or
- this.isLeafElement() and
- last = this and
- c.isValidFor(this)
- }
-
- final override predicate succ(ControlFlowElement pred, ControlFlowElement succ, Completion c) {
- StandardElement.super.succ(pred, succ, c)
- or
- pred = this and
- first(this.getFirstChild(), succ) and
- c instanceof SimpleCompletion
- }
}
private class IfStmtTree extends PreOrderTree, IfStmt {
@@ -1779,88 +1649,6 @@ module Statements {
}
}
-cached
-private module Cached {
- private import semmle.code.csharp.Caching
-
- private predicate isAbnormalExitType(SuccessorType t) {
- t instanceof ExceptionSuccessor or t instanceof ExitSuccessor
- }
-
- /**
- * Internal representation of control flow nodes in the control flow graph.
- * The control flow graph is pruned for unreachable nodes.
- */
- cached
- newtype TNode =
- TEntryNode(Callable c) {
- Stages::ControlFlowStage::forceCachingInSameStage() and
- succEntrySplits(c, _, _, _)
- } or
- TAnnotatedExitNode(Callable c, boolean normal) {
- exists(Reachability::SameSplitsBlock b, SuccessorType t | b.isReachable(_) |
- succExitSplits(b.getAnElement(), _, c, t) and
- if isAbnormalExitType(t) then normal = false else normal = true
- )
- } or
- TExitNode(Callable c) {
- exists(Reachability::SameSplitsBlock b | b.isReachable(_) |
- succExitSplits(b.getAnElement(), _, c, _)
- )
- } or
- TElementNode(ControlFlowElement cfe, Splits splits) {
- exists(Reachability::SameSplitsBlock b | b.isReachable(splits) | cfe = b.getAnElement())
- }
-
- /** Gets a successor node of a given flow type, if any. */
- cached
- Node getASuccessorByType(Node pred, SuccessorType t) {
- // Callable entry node -> callable body
- exists(ControlFlowElement succElement, Splits succSplits |
- result = TElementNode(succElement, succSplits)
- |
- succEntrySplits(pred.(Nodes::EntryNode).getCallable(), succElement, succSplits, t)
- )
- or
- exists(ControlFlowElement predElement, Splits predSplits |
- pred = TElementNode(predElement, predSplits)
- |
- // Element node -> callable exit (annotated)
- result =
- any(Nodes::AnnotatedExitNode exit |
- succExitSplits(predElement, predSplits, exit.getCallable(), t) and
- if isAbnormalExitType(t) then not exit.isNormal() else exit.isNormal()
- )
- or
- // Element node -> element node
- exists(ControlFlowElement succElement, Splits succSplits, Completion c |
- result = TElementNode(succElement, succSplits)
- |
- succSplits(predElement, predSplits, succElement, succSplits, c) and
- t = c.getAMatchingSuccessorType()
- )
- )
- or
- // Callable exit (annotated) -> callable exit
- pred.(Nodes::AnnotatedExitNode).getCallable() = result.(Nodes::ExitNode).getCallable() and
- t instanceof SuccessorTypes::NormalSuccessor
- }
-
- /**
- * Gets a first control flow element executed within `cfe`.
- */
- cached
- ControlFlowElement getAControlFlowEntryNode(ControlFlowElement cfe) { first(cfe, result) }
-
- /**
- * Gets a potential last control flow element executed within `cfe`.
- */
- cached
- ControlFlowElement getAControlFlowExitNode(ControlFlowElement cfe) { last(cfe, result, _) }
-}
-
-import Cached
-
/** A control flow element that is split into multiple control flow nodes. */
class SplitControlFlowElement extends ControlFlowElement {
SplitControlFlowElement() { strictcount(this.getAControlFlowNode()) > 1 }
diff --git a/csharp/ql/lib/semmle/code/csharp/controlflow/internal/ControlFlowGraphImplShared.qll b/csharp/ql/lib/semmle/code/csharp/controlflow/internal/ControlFlowGraphImplShared.qll
new file mode 100644
index 00000000000..050a9384729
--- /dev/null
+++ b/csharp/ql/lib/semmle/code/csharp/controlflow/internal/ControlFlowGraphImplShared.qll
@@ -0,0 +1,945 @@
+/** Provides language-independent definitions for AST-to-CFG construction. */
+
+private import ControlFlowGraphImplSpecific
+
+/** An element with associated control flow. */
+abstract class ControlFlowTree extends ControlFlowTreeBase {
+ /** Holds if `first` is the first element executed within this element. */
+ pragma[nomagic]
+ abstract predicate first(ControlFlowElement first);
+
+ /**
+ * Holds if `last` with completion `c` is a potential last element executed
+ * within this element.
+ */
+ pragma[nomagic]
+ abstract predicate last(ControlFlowElement last, Completion c);
+
+ /** Holds if abnormal execution of `child` should propagate upwards. */
+ abstract predicate propagatesAbnormal(ControlFlowElement child);
+
+ /**
+ * Holds if `succ` is a control flow successor for `pred`, given that `pred`
+ * finishes with completion `c`.
+ */
+ pragma[nomagic]
+ abstract predicate succ(ControlFlowElement pred, ControlFlowElement succ, Completion c);
+}
+
+/**
+ * Holds if `first` is the first element executed within control flow
+ * element `cft`.
+ */
+predicate first(ControlFlowTree cft, ControlFlowElement first) { cft.first(first) }
+
+/**
+ * Holds if `last` with completion `c` is a potential last element executed
+ * within control flow element `cft`.
+ */
+predicate last(ControlFlowTree cft, ControlFlowElement last, Completion c) {
+ cft.last(last, c)
+ or
+ exists(ControlFlowElement cfe |
+ cft.propagatesAbnormal(cfe) and
+ last(cfe, last, c) and
+ not completionIsNormal(c)
+ )
+}
+
+/**
+ * Holds if `succ` is a control flow successor for `pred`, given that `pred`
+ * finishes with completion `c`.
+ */
+pragma[nomagic]
+predicate succ(ControlFlowElement pred, ControlFlowElement succ, Completion c) {
+ any(ControlFlowTree cft).succ(pred, succ, c)
+}
+
+/** An element that is executed in pre-order. */
+abstract class PreOrderTree extends ControlFlowTree {
+ final override predicate first(ControlFlowElement first) { first = this }
+}
+
+/** An element that is executed in post-order. */
+abstract class PostOrderTree extends ControlFlowTree {
+ override predicate last(ControlFlowElement last, Completion c) {
+ last = this and
+ completionIsValidFor(c, last)
+ }
+}
+
+/**
+ * An element where the children are evaluated following a standard left-to-right
+ * evaluation. The actual evaluation order is determined by the predicate
+ * `getChildElement()`.
+ */
+abstract class StandardTree extends ControlFlowTree {
+ /** Gets the `i`th child element, in order of evaluation. */
+ abstract ControlFlowElement getChildElement(int i);
+
+ private ControlFlowElement getChildElementRanked(int i) {
+ result =
+ rank[i + 1](ControlFlowElement child, int j |
+ child = this.getChildElement(j)
+ |
+ child order by j
+ )
+ }
+
+ /** Gets the first child node of this element. */
+ final ControlFlowElement getFirstChildElement() { result = this.getChildElementRanked(0) }
+
+ /** Gets the last child node of this node. */
+ final ControlFlowElement getLastChildElement() {
+ exists(int last |
+ result = this.getChildElementRanked(last) and
+ not exists(this.getChildElementRanked(last + 1))
+ )
+ }
+
+ /** Holds if this element has no children. */
+ predicate isLeafElement() { not exists(this.getFirstChildElement()) }
+
+ override predicate propagatesAbnormal(ControlFlowElement child) {
+ child = this.getChildElement(_)
+ }
+
+ pragma[nomagic]
+ override predicate succ(ControlFlowElement pred, ControlFlowElement succ, Completion c) {
+ exists(int i |
+ last(this.getChildElementRanked(i), pred, c) and
+ completionIsNormal(c) and
+ first(this.getChildElementRanked(i + 1), succ)
+ )
+ }
+}
+
+/** A standard element that is executed in pre-order. */
+abstract class StandardPreOrderTree extends StandardTree, PreOrderTree {
+ override predicate last(ControlFlowElement last, Completion c) {
+ last(this.getLastChildElement(), last, c)
+ or
+ this.isLeafElement() and
+ completionIsValidFor(c, this) and
+ last = this
+ }
+
+ override predicate succ(ControlFlowElement pred, ControlFlowElement succ, Completion c) {
+ StandardTree.super.succ(pred, succ, c)
+ or
+ pred = this and
+ first(this.getFirstChildElement(), succ) and
+ completionIsSimple(c)
+ }
+}
+
+/** A standard element that is executed in post-order. */
+abstract class StandardPostOrderTree extends StandardTree, PostOrderTree {
+ override predicate first(ControlFlowElement first) {
+ first(this.getFirstChildElement(), first)
+ or
+ not exists(this.getFirstChildElement()) and
+ first = this
+ }
+
+ override predicate succ(ControlFlowElement pred, ControlFlowElement succ, Completion c) {
+ StandardTree.super.succ(pred, succ, c)
+ or
+ last(this.getLastChildElement(), pred, c) and
+ succ = this and
+ completionIsNormal(c)
+ }
+}
+
+/** An element that is a leaf in the control flow graph. */
+abstract class LeafTree extends PreOrderTree, PostOrderTree {
+ override predicate propagatesAbnormal(ControlFlowElement child) { none() }
+
+ override predicate succ(ControlFlowElement pred, ControlFlowElement succ, Completion c) { none() }
+}
+
+/**
+ * Holds if split kinds `sk1` and `sk2` may overlap. That is, they may apply
+ * to at least one common AST node inside `scope`.
+ */
+private predicate overlapping(CfgScope scope, SplitKind sk1, SplitKind sk2) {
+ exists(ControlFlowElement e |
+ sk1.appliesTo(e) and
+ sk2.appliesTo(e) and
+ scope = getCfgScope(e)
+ )
+}
+
+/**
+ * A split kind. Each control flow node can have at most one split of a
+ * given kind.
+ */
+abstract class SplitKind extends SplitKindBase {
+ /** Gets a split of this kind. */
+ SplitImpl getASplit() { result.getKind() = this }
+
+ /** Holds if some split of this kind applies to AST node `n`. */
+ predicate appliesTo(ControlFlowElement n) { this.getASplit().appliesTo(n) }
+
+ /**
+ * Gets a unique integer representing this split kind. The integer is used
+ * to represent sets of splits as ordered lists.
+ */
+ abstract int getListOrder();
+
+ /** Gets the rank of this split kind among all overlapping kinds for `c`. */
+ private int getRank(CfgScope scope) {
+ this = rank[result](SplitKind sk | overlapping(scope, this, sk) | sk order by sk.getListOrder())
+ }
+
+ /**
+ * Holds if this split kind is enabled for AST node `n`. For performance reasons,
+ * the number of splits is restricted by the `maxSplits()` predicate.
+ */
+ predicate isEnabled(ControlFlowElement n) {
+ this.appliesTo(n) and
+ this.getRank(getCfgScope(n)) <= maxSplits()
+ }
+
+ /**
+ * Gets the rank of this split kind among all the split kinds that apply to
+ * AST node `n`. The rank is based on the order defined by `getListOrder()`.
+ */
+ int getListRank(ControlFlowElement n) {
+ this.isEnabled(n) and
+ this = rank[result](SplitKind sk | sk.appliesTo(n) | sk order by sk.getListOrder())
+ }
+
+ /** Gets a textual representation of this split kind. */
+ abstract string toString();
+}
+
+/** Provides the interface for implementing an entity to split on. */
+abstract class SplitImpl extends Split {
+ /** Gets the kind of this split. */
+ abstract SplitKind getKind();
+
+ /**
+ * Holds if this split is entered when control passes from `pred` to `succ` with
+ * completion `c`.
+ *
+ * Invariant: `hasEntry(pred, succ, c) implies succ(pred, succ, c)`.
+ */
+ abstract predicate hasEntry(ControlFlowElement pred, ControlFlowElement succ, Completion c);
+
+ /**
+ * Holds if this split is entered when control passes from `scope` to the entry point
+ * `first`.
+ *
+ * Invariant: `hasEntryScope(scope, first) implies scopeFirst(scope, first)`.
+ */
+ abstract predicate hasEntryScope(CfgScope scope, ControlFlowElement first);
+
+ /**
+ * Holds if this split is left when control passes from `pred` to `succ` with
+ * completion `c`.
+ *
+ * Invariant: `hasExit(pred, succ, c) implies succ(pred, succ, c)`.
+ */
+ abstract predicate hasExit(ControlFlowElement pred, ControlFlowElement succ, Completion c);
+
+ /**
+ * Holds if this split is left when control passes from `last` out of the enclosing
+ * scope `scope` with completion `c`.
+ *
+ * Invariant: `hasExitScope(scope, last, c) implies scopeLast(scope, last, c)`
+ */
+ abstract predicate hasExitScope(CfgScope scope, ControlFlowElement last, Completion c);
+
+ /**
+ * Holds if this split is maintained when control passes from `pred` to `succ` with
+ * completion `c`.
+ *
+ * Invariant: `hasSuccessor(pred, succ, c) implies succ(pred, succ, c)`
+ */
+ abstract predicate hasSuccessor(ControlFlowElement pred, ControlFlowElement succ, Completion c);
+
+ /** Holds if this split applies to control flow element `cfe`. */
+ final predicate appliesTo(ControlFlowElement cfe) {
+ this.hasEntry(_, cfe, _)
+ or
+ this.hasEntryScope(_, cfe)
+ or
+ exists(ControlFlowElement pred | this.appliesTo(pred) | this.hasSuccessor(pred, cfe, _))
+ }
+
+ /** The `succ` relation restricted to predecessors `pred` that this split applies to. */
+ pragma[noinline]
+ final predicate appliesSucc(ControlFlowElement pred, ControlFlowElement succ, Completion c) {
+ this.appliesTo(pred) and
+ succ(pred, succ, c)
+ }
+}
+
+/**
+ * A set of control flow node splits. The set is represented by a list of splits,
+ * ordered by ascending rank.
+ */
+class Splits extends TSplits {
+ /** Gets a textual representation of this set of splits. */
+ string toString() { result = splitsToString(this) }
+
+ /** Gets a split belonging to this set of splits. */
+ SplitImpl getASplit() {
+ exists(SplitImpl head, Splits tail | this = TSplitsCons(head, tail) |
+ result = head
+ or
+ result = tail.getASplit()
+ )
+ }
+}
+
+private predicate succEntrySplitsFromRank(
+ CfgScope pred, ControlFlowElement succ, Splits splits, int rnk
+) {
+ splits = TSplitsNil() and
+ scopeFirst(pred, succ) and
+ rnk = 0
+ or
+ exists(SplitImpl head, Splits tail | succEntrySplitsCons(pred, succ, head, tail, rnk) |
+ splits = TSplitsCons(head, tail)
+ )
+}
+
+private predicate succEntrySplitsCons(
+ CfgScope pred, ControlFlowElement succ, SplitImpl head, Splits tail, int rnk
+) {
+ succEntrySplitsFromRank(pred, succ, tail, rnk - 1) and
+ head.hasEntryScope(pred, succ) and
+ rnk = head.getKind().getListRank(succ)
+}
+
+/**
+ * Holds if `succ` with splits `succSplits` is the first element that is executed
+ * when entering callable `pred`.
+ */
+pragma[noinline]
+private predicate succEntrySplits(
+ CfgScope pred, ControlFlowElement succ, Splits succSplits, SuccessorType t
+) {
+ exists(int rnk |
+ scopeFirst(pred, succ) and
+ successorTypeIsSimple(t) and
+ succEntrySplitsFromRank(pred, succ, succSplits, rnk)
+ |
+ rnk = 0 and
+ not any(SplitImpl split).hasEntryScope(pred, succ)
+ or
+ rnk = max(SplitImpl split | split.hasEntryScope(pred, succ) | split.getKind().getListRank(succ))
+ )
+}
+
+/**
+ * Holds if `pred` with splits `predSplits` can exit the enclosing callable
+ * `succ` with type `t`.
+ */
+private predicate succExitSplits(
+ ControlFlowElement pred, Splits predSplits, CfgScope succ, SuccessorType t
+) {
+ exists(Reachability::SameSplitsBlock b, Completion c | pred = b.getAnElement() |
+ b.isReachable(predSplits) and
+ t = getAMatchingSuccessorType(c) and
+ scopeLast(succ, pred, c) and
+ forall(SplitImpl predSplit | predSplit = predSplits.getASplit() |
+ predSplit.hasExitScope(succ, pred, c)
+ )
+ )
+}
+
+/**
+ * Provides a predicate for the successor relation with split information,
+ * as well as logic used to construct the type `TSplits` representing sets
+ * of splits. Only sets of splits that can be reached are constructed, hence
+ * the predicates are mutually recursive.
+ *
+ * For the successor relation
+ *
+ * ```ql
+ * succSplits(ControlFlowElement pred, Splits predSplits, ControlFlowElement succ, Splits succSplits, Completion c)
+ * ```
+ *
+ * the following invariants are maintained:
+ *
+ * 1. `pred` is reachable with split set `predSplits`.
+ * 2. For all `split` in `predSplits`:
+ * - If `split.hasSuccessor(pred, succ, c)` then `split` in `succSplits`.
+ * 3. For all `split` in `predSplits`:
+ * - If `split.hasExit(pred, succ, c)` and not `split.hasEntry(pred, succ, c)` then
+ * `split` not in `succSplits`.
+ * 4. For all `split` with kind not in `predSplits`:
+ * - If `split.hasEntry(pred, succ, c)` then `split` in `succSplits`.
+ * 5. For all `split` in `succSplits`:
+ * - `split.hasSuccessor(pred, succ, c)` and `split` in `predSplits`, or
+ * - `split.hasEntry(pred, succ, c)`.
+ *
+ * The algorithm divides into four cases:
+ *
+ * 1. The set of splits for the successor is the same as the set of splits
+ * for the predecessor:
+ * a) The successor is in the same `SameSplitsBlock` as the predecessor.
+ * b) The successor is *not* in the same `SameSplitsBlock` as the predecessor.
+ * 2. The set of splits for the successor is different from the set of splits
+ * for the predecessor:
+ * a) The set of splits for the successor is *maybe* non-empty.
+ * b) The set of splits for the successor is *always* empty.
+ *
+ * Only case 2a may introduce new sets of splits, so only predicates from
+ * this case are used in the definition of `TSplits`.
+ *
+ * The predicates in this module are named after the cases above.
+ */
+private module SuccSplits {
+ private predicate succInvariant1(
+ Reachability::SameSplitsBlock b, ControlFlowElement pred, Splits predSplits,
+ ControlFlowElement succ, Completion c
+ ) {
+ pred = b.getAnElement() and
+ b.isReachable(predSplits) and
+ succ(pred, succ, c)
+ }
+
+ private predicate case1b0(
+ ControlFlowElement pred, Splits predSplits, ControlFlowElement succ, Completion c
+ ) {
+ exists(Reachability::SameSplitsBlock b |
+ // Invariant 1
+ succInvariant1(b, pred, predSplits, succ, c)
+ |
+ (succ = b.getAnElement() implies succ = b) and
+ // Invariant 4
+ not exists(SplitImpl split | split.hasEntry(pred, succ, c))
+ )
+ }
+
+ /**
+ * Case 1b.
+ *
+ * Invariants 1 and 4 hold in the base case, and invariants 2, 3, and 5 are
+ * maintained for all splits in `predSplits` (= `succSplits`), except
+ * possibly for the splits in `except`.
+ *
+ * The predicate is written using explicit recursion, as opposed to a `forall`,
+ * to avoid negative recursion.
+ */
+ private predicate case1bForall(
+ ControlFlowElement pred, Splits predSplits, ControlFlowElement succ, Completion c, Splits except
+ ) {
+ case1b0(pred, predSplits, succ, c) and
+ except = predSplits
+ or
+ exists(SplitImpl split |
+ case1bForallCons(pred, predSplits, succ, c, split, except) and
+ split.hasSuccessor(pred, succ, c)
+ )
+ }
+
+ pragma[noinline]
+ private predicate case1bForallCons(
+ ControlFlowElement pred, Splits predSplits, ControlFlowElement succ, Completion c,
+ SplitImpl exceptHead, Splits exceptTail
+ ) {
+ case1bForall(pred, predSplits, succ, c, TSplitsCons(exceptHead, exceptTail))
+ }
+
+ private predicate case1(
+ ControlFlowElement pred, Splits predSplits, ControlFlowElement succ, Completion c
+ ) {
+ // Case 1a
+ exists(Reachability::SameSplitsBlock b | succInvariant1(b, pred, predSplits, succ, c) |
+ succ = b.getAnElement() and
+ not succ = b
+ )
+ or
+ // Case 1b
+ case1bForall(pred, predSplits, succ, c, TSplitsNil())
+ }
+
+ pragma[noinline]
+ private SplitImpl succInvariant1GetASplit(
+ Reachability::SameSplitsBlock b, ControlFlowElement pred, Splits predSplits,
+ ControlFlowElement succ, Completion c
+ ) {
+ succInvariant1(b, pred, predSplits, succ, c) and
+ result = predSplits.getASplit()
+ }
+
+ private predicate case2aux(
+ ControlFlowElement pred, Splits predSplits, ControlFlowElement succ, Completion c
+ ) {
+ exists(Reachability::SameSplitsBlock b |
+ succInvariant1(b, pred, predSplits, succ, c) and
+ (succ = b.getAnElement() implies succ = b)
+ |
+ succInvariant1GetASplit(b, pred, predSplits, succ, c).hasExit(pred, succ, c)
+ or
+ any(SplitImpl split).hasEntry(pred, succ, c)
+ )
+ }
+
+ /**
+ * Holds if `succSplits` should not inherit a split of kind `sk` from
+ * `predSplits`, except possibly because of a split in `except`.
+ *
+ * The predicate is written using explicit recursion, as opposed to a `forall`,
+ * to avoid negative recursion.
+ */
+ private predicate case2aNoneInheritedOfKindForall(
+ ControlFlowElement pred, Splits predSplits, ControlFlowElement succ, Completion c, SplitKind sk,
+ Splits except
+ ) {
+ case2aux(pred, predSplits, succ, c) and
+ sk.appliesTo(succ) and
+ except = predSplits
+ or
+ exists(Splits mid, SplitImpl split |
+ case2aNoneInheritedOfKindForall(pred, predSplits, succ, c, sk, mid) and
+ mid = TSplitsCons(split, except)
+ |
+ split.getKind() = any(SplitKind sk0 | sk0 != sk and sk0.appliesTo(succ))
+ or
+ split.hasExit(pred, succ, c)
+ )
+ }
+
+ pragma[nomagic]
+ private predicate entryOfKind(
+ ControlFlowElement pred, ControlFlowElement succ, Completion c, SplitImpl split, SplitKind sk
+ ) {
+ split.hasEntry(pred, succ, c) and
+ sk = split.getKind()
+ }
+
+ /** Holds if `succSplits` should not have a split of kind `sk`. */
+ pragma[nomagic]
+ private predicate case2aNoneOfKind(
+ ControlFlowElement pred, Splits predSplits, ControlFlowElement succ, Completion c, SplitKind sk
+ ) {
+ // None inherited from predecessor
+ case2aNoneInheritedOfKindForall(pred, predSplits, succ, c, sk, TSplitsNil()) and
+ // None newly entered into
+ not entryOfKind(pred, succ, c, _, sk)
+ }
+
+ /** Holds if `succSplits` should not have a split of kind `sk` at rank `rnk`. */
+ pragma[nomagic]
+ private predicate case2aNoneAtRank(
+ ControlFlowElement pred, Splits predSplits, ControlFlowElement succ, Completion c, int rnk
+ ) {
+ exists(SplitKind sk | case2aNoneOfKind(pred, predSplits, succ, c, sk) |
+ rnk = sk.getListRank(succ)
+ )
+ }
+
+ pragma[nomagic]
+ private SplitImpl case2auxGetAPredecessorSplit(
+ ControlFlowElement pred, Splits predSplits, ControlFlowElement succ, Completion c
+ ) {
+ case2aux(pred, predSplits, succ, c) and
+ result = predSplits.getASplit()
+ }
+
+ /** Gets a split that should be in `succSplits`. */
+ pragma[nomagic]
+ private SplitImpl case2aSome(
+ ControlFlowElement pred, Splits predSplits, ControlFlowElement succ, Completion c, SplitKind sk
+ ) {
+ (
+ // Inherited from predecessor
+ result = case2auxGetAPredecessorSplit(pred, predSplits, succ, c) and
+ result.hasSuccessor(pred, succ, c)
+ or
+ // Newly entered into
+ exists(SplitKind sk0 |
+ case2aNoneInheritedOfKindForall(pred, predSplits, succ, c, sk0, TSplitsNil())
+ |
+ entryOfKind(pred, succ, c, result, sk0)
+ )
+ ) and
+ sk = result.getKind()
+ }
+
+ /** Gets a split that should be in `succSplits` at rank `rnk`. */
+ pragma[nomagic]
+ SplitImpl case2aSomeAtRank(
+ ControlFlowElement pred, Splits predSplits, ControlFlowElement succ, Completion c, int rnk
+ ) {
+ exists(SplitKind sk | result = case2aSome(pred, predSplits, succ, c, sk) |
+ rnk = sk.getListRank(succ)
+ )
+ }
+
+ /**
+ * Case 2a.
+ *
+ * As opposed to the other cases, in this case we need to construct a new set
+ * of splits `succSplits`. Since this involves constructing the very IPA type,
+ * we cannot recurse directly over the structure of `succSplits`. Instead, we
+ * recurse over the ranks of all splits that *might* be in `succSplits`.
+ *
+ * - Invariant 1 holds in the base case,
+ * - invariant 2 holds for all splits with rank at least `rnk`,
+ * - invariant 3 holds for all splits in `predSplits`,
+ * - invariant 4 holds for all splits in `succSplits` with rank at least `rnk`,
+ * and
+ * - invariant 4 holds for all splits in `succSplits` with rank at least `rnk`.
+ */
+ predicate case2aFromRank(
+ ControlFlowElement pred, Splits predSplits, ControlFlowElement succ, Splits succSplits,
+ Completion c, int rnk
+ ) {
+ case2aux(pred, predSplits, succ, c) and
+ succSplits = TSplitsNil() and
+ rnk = max(any(SplitKind sk).getListRank(succ)) + 1
+ or
+ case2aFromRank(pred, predSplits, succ, succSplits, c, rnk + 1) and
+ case2aNoneAtRank(pred, predSplits, succ, c, rnk)
+ or
+ exists(Splits mid, SplitImpl split | split = case2aCons(pred, predSplits, succ, mid, c, rnk) |
+ succSplits = TSplitsCons(split, mid)
+ )
+ }
+
+ pragma[noinline]
+ private SplitImpl case2aCons(
+ ControlFlowElement pred, Splits predSplits, ControlFlowElement succ, Splits succSplits,
+ Completion c, int rnk
+ ) {
+ case2aFromRank(pred, predSplits, succ, succSplits, c, rnk + 1) and
+ result = case2aSomeAtRank(pred, predSplits, succ, c, rnk)
+ }
+
+ /**
+ * Case 2b.
+ *
+ * Invariants 1, 4, and 5 hold in the base case, and invariants 2 and 3 are
+ * maintained for all splits in `predSplits`, except possibly for the splits
+ * in `except`.
+ *
+ * The predicate is written using explicit recursion, as opposed to a `forall`,
+ * to avoid negative recursion.
+ */
+ private predicate case2bForall(
+ ControlFlowElement pred, Splits predSplits, ControlFlowElement succ, Completion c, Splits except
+ ) {
+ // Invariant 1
+ case2aux(pred, predSplits, succ, c) and
+ // Invariants 4 and 5
+ not any(SplitKind sk).appliesTo(succ) and
+ except = predSplits
+ or
+ exists(SplitImpl split | case2bForallCons(pred, predSplits, succ, c, split, except) |
+ // Invariants 2 and 3
+ split.hasExit(pred, succ, c)
+ )
+ }
+
+ pragma[noinline]
+ private predicate case2bForallCons(
+ ControlFlowElement pred, Splits predSplits, ControlFlowElement succ, Completion c,
+ SplitImpl exceptHead, Splits exceptTail
+ ) {
+ case2bForall(pred, predSplits, succ, c, TSplitsCons(exceptHead, exceptTail))
+ }
+
+ private predicate case2(
+ ControlFlowElement pred, Splits predSplits, ControlFlowElement succ, Splits succSplits,
+ Completion c
+ ) {
+ case2aFromRank(pred, predSplits, succ, succSplits, c, 1)
+ or
+ case2bForall(pred, predSplits, succ, c, TSplitsNil()) and
+ succSplits = TSplitsNil()
+ }
+
+ /**
+ * Holds if `succ` with splits `succSplits` is a successor of type `t` for `pred`
+ * with splits `predSplits`.
+ */
+ predicate succSplits(
+ ControlFlowElement pred, Splits predSplits, ControlFlowElement succ, Splits succSplits,
+ Completion c
+ ) {
+ case1(pred, predSplits, succ, c) and
+ succSplits = predSplits
+ or
+ case2(pred, predSplits, succ, succSplits, c)
+ }
+}
+
+import SuccSplits
+
+/** Provides logic for calculating reachable control flow nodes. */
+private module Reachability {
+ /**
+ * Holds if `cfe` is a control flow element where the set of possible splits may
+ * be different from the set of possible splits for one of `cfe`'s predecessors.
+ * That is, `cfe` starts a new block of elements with the same set of splits.
+ */
+ private predicate startsSplits(ControlFlowElement cfe) {
+ scopeFirst(_, cfe)
+ or
+ exists(SplitImpl s |
+ s.hasEntry(_, cfe, _)
+ or
+ s.hasExit(_, cfe, _)
+ )
+ or
+ exists(ControlFlowElement pred, SplitImpl split, Completion c | succ(pred, cfe, c) |
+ split.appliesTo(pred) and
+ not split.hasSuccessor(pred, cfe, c)
+ )
+ }
+
+ private predicate intraSplitsSucc(ControlFlowElement pred, ControlFlowElement succ) {
+ succ(pred, succ, _) and
+ not startsSplits(succ)
+ }
+
+ private predicate splitsBlockContains(ControlFlowElement start, ControlFlowElement cfe) =
+ fastTC(intraSplitsSucc/2)(start, cfe)
+
+ /**
+ * A block of control flow elements where the set of splits is guaranteed
+ * to remain unchanged, represented by the first element in the block.
+ */
+ class SameSplitsBlock extends ControlFlowElement {
+ SameSplitsBlock() { startsSplits(this) }
+
+ /** Gets a control flow element in this block. */
+ ControlFlowElement getAnElement() {
+ splitsBlockContains(this, result)
+ or
+ result = this
+ }
+
+ pragma[noinline]
+ private SameSplitsBlock getASuccessor(Splits predSplits, Splits succSplits) {
+ exists(ControlFlowElement pred | pred = this.getAnElement() |
+ succSplits(pred, predSplits, result, succSplits, _)
+ )
+ }
+
+ /**
+ * Holds if the elements of this block are reachable from a callable entry
+ * point, with the splits `splits`.
+ */
+ predicate isReachable(Splits splits) {
+ // Base case
+ succEntrySplits(_, this, splits, _)
+ or
+ // Recursive case
+ exists(SameSplitsBlock pred, Splits predSplits | pred.isReachable(predSplits) |
+ this = pred.getASuccessor(predSplits, splits)
+ )
+ }
+ }
+}
+
+cached
+private module Cached {
+ /**
+ * If needed, call this predicate from `ControlFlowGraphImplSpecific.qll` in order to
+ * force a stage-dependency on the `ControlFlowGraphImplShared.qll` stage and therby
+ * collapsing the two stages.
+ */
+ cached
+ predicate forceCachingInSameStage() { any() }
+
+ cached
+ newtype TSplits =
+ TSplitsNil() or
+ TSplitsCons(SplitImpl head, Splits tail) {
+ exists(
+ ControlFlowElement pred, Splits predSplits, ControlFlowElement succ, Completion c, int rnk
+ |
+ case2aFromRank(pred, predSplits, succ, tail, c, rnk + 1) and
+ head = case2aSomeAtRank(pred, predSplits, succ, c, rnk)
+ )
+ or
+ succEntrySplitsCons(_, _, head, tail, _)
+ }
+
+ cached
+ string splitsToString(Splits splits) {
+ splits = TSplitsNil() and
+ result = ""
+ or
+ exists(SplitImpl head, Splits tail, string headString, string tailString |
+ splits = TSplitsCons(head, tail)
+ |
+ headString = head.toString() and
+ tailString = tail.toString() and
+ if tailString = ""
+ then result = headString
+ else
+ if headString = ""
+ then result = tailString
+ else result = headString + ", " + tailString
+ )
+ }
+
+ /**
+ * Internal representation of control flow nodes in the control flow graph.
+ * The control flow graph is pruned for unreachable nodes.
+ */
+ cached
+ newtype TNode =
+ TEntryNode(CfgScope scope) { succEntrySplits(scope, _, _, _) } or
+ TAnnotatedExitNode(CfgScope scope, boolean normal) {
+ exists(Reachability::SameSplitsBlock b, SuccessorType t | b.isReachable(_) |
+ succExitSplits(b.getAnElement(), _, scope, t) and
+ if isAbnormalExitType(t) then normal = false else normal = true
+ )
+ } or
+ TExitNode(CfgScope scope) {
+ exists(Reachability::SameSplitsBlock b | b.isReachable(_) |
+ succExitSplits(b.getAnElement(), _, scope, _)
+ )
+ } or
+ TElementNode(ControlFlowElement cfe, Splits splits) {
+ exists(Reachability::SameSplitsBlock b | b.isReachable(splits) | cfe = b.getAnElement())
+ }
+
+ /** Gets a successor node of a given flow type, if any. */
+ cached
+ TNode getASuccessor(TNode pred, SuccessorType t) {
+ // Callable entry node -> callable body
+ exists(ControlFlowElement succElement, Splits succSplits, CfgScope scope |
+ result = TElementNode(succElement, succSplits) and
+ pred = TEntryNode(scope) and
+ succEntrySplits(scope, succElement, succSplits, t)
+ )
+ or
+ exists(ControlFlowElement predElement, Splits predSplits |
+ pred = TElementNode(predElement, predSplits)
+ |
+ // Element node -> callable exit (annotated)
+ exists(CfgScope scope, boolean normal |
+ result = TAnnotatedExitNode(scope, normal) and
+ succExitSplits(predElement, predSplits, scope, t) and
+ if isAbnormalExitType(t) then normal = false else normal = true
+ )
+ or
+ // Element node -> element node
+ exists(ControlFlowElement succElement, Splits succSplits, Completion c |
+ result = TElementNode(succElement, succSplits)
+ |
+ succSplits(predElement, predSplits, succElement, succSplits, c) and
+ t = getAMatchingSuccessorType(c)
+ )
+ )
+ or
+ // Callable exit (annotated) -> callable exit
+ exists(CfgScope scope |
+ pred = TAnnotatedExitNode(scope, _) and
+ result = TExitNode(scope) and
+ successorTypeIsSimple(t)
+ )
+ }
+
+ /**
+ * Gets a first control flow element executed within `cfe`.
+ */
+ cached
+ ControlFlowElement getAControlFlowEntryNode(ControlFlowElement cfe) { first(cfe, result) }
+
+ /**
+ * Gets a potential last control flow element executed within `cfe`.
+ */
+ cached
+ ControlFlowElement getAControlFlowExitNode(ControlFlowElement cfe) { last(cfe, result, _) }
+}
+
+import Cached
+
+/**
+ * Import this module into a `.ql` file of `@kind graph` to render a CFG. The
+ * graph is restricted to nodes from `RelevantNode`.
+ */
+module TestOutput {
+ abstract class RelevantNode extends Node { }
+
+ query predicate nodes(RelevantNode n, string attr, string val) {
+ attr = "semmle.order" and
+ val =
+ any(int i |
+ n =
+ rank[i](RelevantNode p, Location l |
+ l = p.getLocation()
+ |
+ p
+ order by
+ l.getFile().getBaseName(), l.getFile().getAbsolutePath(), l.getStartLine(),
+ l.getStartColumn()
+ )
+ ).toString()
+ }
+
+ query predicate edges(RelevantNode pred, RelevantNode succ, string attr, string val) {
+ exists(SuccessorType t | succ = getASuccessor(pred, t) |
+ attr = "semmle.label" and
+ if successorTypeIsSimple(t) then val = "" else val = t.toString()
+ )
+ }
+}
+
+/** Provides a set of splitting-related consistency queries. */
+module Consistency {
+ query predicate nonUniqueSetRepresentation(Splits s1, Splits s2) {
+ forex(Split s | s = s1.getASplit() | s = s2.getASplit()) and
+ forex(Split s | s = s2.getASplit() | s = s1.getASplit()) and
+ s1 != s2
+ }
+
+ query predicate breakInvariant2(
+ ControlFlowElement pred, Splits predSplits, ControlFlowElement succ, Splits succSplits,
+ SplitImpl split, Completion c
+ ) {
+ succSplits(pred, predSplits, succ, succSplits, c) and
+ split = predSplits.getASplit() and
+ split.hasSuccessor(pred, succ, c) and
+ not split = succSplits.getASplit()
+ }
+
+ query predicate breakInvariant3(
+ ControlFlowElement pred, Splits predSplits, ControlFlowElement succ, Splits succSplits,
+ SplitImpl split, Completion c
+ ) {
+ succSplits(pred, predSplits, succ, succSplits, c) and
+ split = predSplits.getASplit() and
+ split.hasExit(pred, succ, c) and
+ not split.hasEntry(pred, succ, c) and
+ split = succSplits.getASplit()
+ }
+
+ query predicate breakInvariant4(
+ ControlFlowElement pred, Splits predSplits, ControlFlowElement succ, Splits succSplits,
+ SplitImpl split, Completion c
+ ) {
+ succSplits(pred, predSplits, succ, succSplits, c) and
+ split.hasEntry(pred, succ, c) and
+ not split.getKind() = predSplits.getASplit().getKind() and
+ not split = succSplits.getASplit()
+ }
+
+ query predicate breakInvariant5(
+ ControlFlowElement pred, Splits predSplits, ControlFlowElement succ, Splits succSplits,
+ SplitImpl split, Completion c
+ ) {
+ succSplits(pred, predSplits, succ, succSplits, c) and
+ split = succSplits.getASplit() and
+ not (split.hasSuccessor(pred, succ, c) and split = predSplits.getASplit()) and
+ not split.hasEntry(pred, succ, c)
+ }
+
+ query predicate multipleSuccessors(Node node, SuccessorType t, Node successor) {
+ not node instanceof TEntryNode and
+ strictcount(getASuccessor(node, t)) > 1 and
+ successor = getASuccessor(node, t)
+ }
+}
diff --git a/csharp/ql/lib/semmle/code/csharp/controlflow/internal/ControlFlowGraphImplSpecific.qll b/csharp/ql/lib/semmle/code/csharp/controlflow/internal/ControlFlowGraphImplSpecific.qll
new file mode 100644
index 00000000000..9c3f5276dd9
--- /dev/null
+++ b/csharp/ql/lib/semmle/code/csharp/controlflow/internal/ControlFlowGraphImplSpecific.qll
@@ -0,0 +1,69 @@
+private import csharp as CS
+private import ControlFlowGraphImpl as Impl
+private import Completion as Comp
+private import Splitting as Splitting
+private import SuccessorType as ST
+private import semmle.code.csharp.Caching
+
+class ControlFlowTreeBase = Impl::ControlFlowTree::Range;
+
+class ControlFlowElement = CS::ControlFlowElement;
+
+class Completion = Comp::Completion;
+
+/**
+ * Hold if `c` represents normal evaluation of a statement or an
+ * expression.
+ */
+predicate completionIsNormal(Completion c) { c instanceof Comp::NormalCompletion }
+
+/**
+ * Hold if `c` represents simple (normal) evaluation of a statement or an
+ * expression.
+ */
+predicate completionIsSimple(Completion c) { c instanceof Comp::SimpleCompletion }
+
+/** Holds if `c` is a valid completion for `e`. */
+predicate completionIsValidFor(Completion c, ControlFlowElement e) { c.isValidFor(e) }
+
+class CfgScope = Impl::CfgScope;
+
+/** Gets the CFG scope for `e`. */
+CfgScope getCfgScope(ControlFlowElement e) {
+ Stages::ControlFlowStage::forceCachingInSameStage() and
+ result = e.getEnclosingCallable()
+}
+
+predicate scopeFirst = Impl::scopeFirst/2;
+
+predicate scopeLast = Impl::scopeLast/3;
+
+/** The maximum number of splits allowed for a given node. */
+int maxSplits() { result = 5 }
+
+class SplitKindBase = Splitting::TSplitKind;
+
+class Split = Splitting::Split;
+
+class SuccessorType = ST::SuccessorType;
+
+/** Gets a successor type that matches completion `c`. */
+SuccessorType getAMatchingSuccessorType(Completion c) { result = c.getAMatchingSuccessorType() }
+
+/**
+ * Hold if `c` represents simple (normal) evaluation of a statement or an
+ * expression.
+ */
+predicate successorTypeIsSimple(SuccessorType t) {
+ t instanceof ST::SuccessorTypes::NormalSuccessor
+}
+
+/** Holds if `t` is an abnormal exit type out of a callable. */
+predicate isAbnormalExitType(SuccessorType t) {
+ t instanceof ST::SuccessorTypes::ExceptionSuccessor or
+ t instanceof ST::SuccessorTypes::ExitSuccessor
+}
+
+class Location = CS::Location;
+
+class Node = CS::ControlFlow::Node;
diff --git a/csharp/ql/src/semmle/code/csharp/controlflow/internal/NonReturning.qll b/csharp/ql/lib/semmle/code/csharp/controlflow/internal/NonReturning.qll
similarity index 100%
rename from csharp/ql/src/semmle/code/csharp/controlflow/internal/NonReturning.qll
rename to csharp/ql/lib/semmle/code/csharp/controlflow/internal/NonReturning.qll
diff --git a/csharp/ql/src/semmle/code/csharp/controlflow/internal/PreBasicBlocks.qll b/csharp/ql/lib/semmle/code/csharp/controlflow/internal/PreBasicBlocks.qll
similarity index 100%
rename from csharp/ql/src/semmle/code/csharp/controlflow/internal/PreBasicBlocks.qll
rename to csharp/ql/lib/semmle/code/csharp/controlflow/internal/PreBasicBlocks.qll
diff --git a/csharp/ql/src/semmle/code/csharp/controlflow/internal/PreSsa.qll b/csharp/ql/lib/semmle/code/csharp/controlflow/internal/PreSsa.qll
similarity index 100%
rename from csharp/ql/src/semmle/code/csharp/controlflow/internal/PreSsa.qll
rename to csharp/ql/lib/semmle/code/csharp/controlflow/internal/PreSsa.qll
diff --git a/csharp/ql/src/semmle/code/csharp/controlflow/internal/Splitting.qll b/csharp/ql/lib/semmle/code/csharp/controlflow/internal/Splitting.qll
similarity index 67%
rename from csharp/ql/src/semmle/code/csharp/controlflow/internal/Splitting.qll
rename to csharp/ql/lib/semmle/code/csharp/controlflow/internal/Splitting.qll
index 8ca77a4775e..4d1d39de988 100644
--- a/csharp/ql/src/semmle/code/csharp/controlflow/internal/Splitting.qll
+++ b/csharp/ql/lib/semmle/code/csharp/controlflow/internal/Splitting.qll
@@ -11,9 +11,6 @@ private import SuccessorTypes
private import semmle.code.csharp.controlflow.ControlFlowGraph::ControlFlow
private import semmle.code.csharp.controlflow.internal.PreSsa
-/** The maximum number of splits allowed for a given node. */
-private int maxSplits() { result = 5 }
-
cached
private module Cached {
private import semmle.code.csharp.Caching
@@ -51,42 +48,9 @@ private module Cached {
branch in [false, true]
} or
TLoopSplit(LoopSplitting::AnalyzableLoopStmt loop)
-
- cached
- newtype TSplits =
- TSplitsNil() or
- TSplitsCons(SplitImpl head, Splits tail) {
- exists(
- ControlFlowElement pred, Splits predSplits, ControlFlowElement succ, Completion c, int rnk
- |
- case2aFromRank(pred, predSplits, succ, tail, c, rnk + 1) and
- head = case2aSomeAtRank(pred, predSplits, succ, c, rnk)
- )
- or
- succEntrySplitsCons(_, _, head, tail, _)
- }
-
- cached
- string splitsToString(Splits splits) {
- splits = TSplitsNil() and
- result = ""
- or
- exists(SplitImpl head, Splits tail, string headString, string tailString |
- splits = TSplitsCons(head, tail)
- |
- headString = head.toString() and
- tailString = tail.toString() and
- if tailString = ""
- then result = headString
- else
- if headString = ""
- then result = tailString
- else result = headString + ", " + tailString
- )
- }
}
-private import Cached
+import Cached
/**
* A split for a control flow element. For example, a tag that determines how to
@@ -97,127 +61,6 @@ class Split extends TSplit {
string toString() { none() }
}
-/**
- * Holds if split kinds `sk1` and `sk2` may overlap. That is, they may apply
- * to at least one common control flow element inside callable `c`.
- */
-private predicate overlapping(Callable c, SplitKind sk1, SplitKind sk2) {
- exists(ControlFlowElement cfe |
- sk1.appliesTo(cfe) and
- sk2.appliesTo(cfe) and
- c = cfe.getEnclosingCallable()
- )
-}
-
-/**
- * A split kind. Each control flow node can have at most one split of a
- * given kind.
- */
-abstract class SplitKind extends TSplitKind {
- /** Gets a split of this kind. */
- SplitImpl getASplit() { result.getKind() = this }
-
- /** Holds if some split of this kind applies to control flow element `cfe`. */
- predicate appliesTo(ControlFlowElement cfe) { this.getASplit().appliesTo(cfe) }
-
- /**
- * Gets a unique integer representing this split kind. The integer is used
- * to represent sets of splits as ordered lists.
- */
- abstract int getListOrder();
-
- /** Gets the rank of this split kind among all overlapping kinds for `c`. */
- private int getRank(Callable c) {
- this = rank[result](SplitKind sk | overlapping(c, this, sk) | sk order by sk.getListOrder())
- }
-
- /**
- * Holds if this split kind is enabled for control flow element `cfe`. For
- * performance reasons, the number of splits is restricted by the `maxSplits()`
- * predicate.
- */
- predicate isEnabled(ControlFlowElement cfe) {
- this.appliesTo(cfe) and
- this.getRank(cfe.getEnclosingCallable()) <= maxSplits()
- }
-
- /**
- * Gets the rank of this split kind among all the split kinds that apply to
- * control flow element `cfe`. The rank is based on the order defined by
- * `getListOrder()`.
- */
- int getListRank(ControlFlowElement cfe) {
- this.isEnabled(cfe) and
- this = rank[result](SplitKind sk | sk.appliesTo(cfe) | sk order by sk.getListOrder())
- }
-
- /** Gets a textual representation of this split kind. */
- abstract string toString();
-}
-
-// This class only exists to not pollute the externally visible `Split` class
-// with internal helper predicates
-abstract class SplitImpl extends Split {
- /** Gets the kind of this split. */
- abstract SplitKind getKind();
-
- /**
- * Holds if this split is entered when control passes from `pred` to `succ` with
- * completion `c`.
- *
- * Invariant: `hasEntry(pred, succ, c) implies succ(pred, succ, c)`.
- */
- abstract predicate hasEntry(ControlFlowElement pred, ControlFlowElement succ, Completion c);
-
- /**
- * Holds if this split is entered when control passes from `scope` to the entry point
- * `first`.
- *
- * Invariant: `hasEntryScope(scope, first) implies scopeFirst(scope, first)`.
- */
- abstract predicate hasEntryScope(CfgScope scope, ControlFlowElement first);
-
- /**
- * Holds if this split is left when control passes from `pred` to `succ` with
- * completion `c`.
- *
- * Invariant: `hasExit(pred, succ, c) implies succ(pred, succ, c)`.
- */
- abstract predicate hasExit(ControlFlowElement pred, ControlFlowElement succ, Completion c);
-
- /**
- * Holds if this split is left when control passes from `last` out of the enclosing
- * scope `scope` with completion `c`.
- *
- * Invariant: `hasExitScope(last, scope, c) implies scopeLast(scope, last, c)`
- */
- abstract predicate hasExitScope(ControlFlowElement last, CfgScope scope, Completion c);
-
- /**
- * Holds if this split is maintained when control passes from `pred` to `succ` with
- * completion `c`.
- *
- * Invariant: `hasSuccessor(pred, succ, c) implies succ(pred, succ, c)`
- */
- abstract predicate hasSuccessor(ControlFlowElement pred, ControlFlowElement succ, Completion c);
-
- /** Holds if this split applies to control flow element `cfe`. */
- final predicate appliesTo(ControlFlowElement cfe) {
- this.hasEntry(_, cfe, _)
- or
- this.hasEntryScope(_, cfe)
- or
- exists(ControlFlowElement pred | this.appliesTo(pred) | this.hasSuccessor(pred, cfe, _))
- }
-
- /** The `succ` relation restricted to predecessors `pred` that this split applies to. */
- pragma[noinline]
- final predicate appliesSucc(ControlFlowElement pred, ControlFlowElement succ, Completion c) {
- this.appliesTo(pred) and
- succ(pred, succ, c)
- }
-}
-
module InitializerSplitting {
private import semmle.code.csharp.ExprOrStmtParent
@@ -382,7 +225,7 @@ module InitializerSplitting {
succ.getEnclosingCallable() = this.getConstructor()
}
- override predicate hasExitScope(ControlFlowElement last, CfgScope scope, Completion c) {
+ override predicate hasExitScope(CfgScope scope, ControlFlowElement last, Completion c) {
this.appliesTo(last) and
scopeLast(scope, last, c) and
scope = this.getConstructor()
@@ -499,7 +342,7 @@ module ConditionalCompletionSplitting {
if c instanceof ConditionalCompletion then completion = c else any()
}
- override predicate hasExitScope(ControlFlowElement last, CfgScope scope, Completion c) {
+ override predicate hasExitScope(CfgScope scope, ControlFlowElement last, Completion c) {
this.appliesTo(last) and
scopeLast(scope, last, c) and
if c instanceof ConditionalCompletion then completion = c else any()
@@ -612,7 +455,7 @@ module AssertionSplitting {
)
}
- override predicate hasExitScope(ControlFlowElement last, CfgScope scope, Completion c) {
+ override predicate hasExitScope(CfgScope scope, ControlFlowElement last, Completion c) {
this.appliesTo(last) and
last = a and
scopeLast(scope, last, c) and
@@ -853,7 +696,7 @@ module FinallySplitting {
)
}
- override predicate hasExitScope(ControlFlowElement last, CfgScope scope, Completion c) {
+ override predicate hasExitScope(CfgScope scope, ControlFlowElement last, Completion c) {
scopeLast(scope, last, c) and
(
exit(last, c, _)
@@ -1033,7 +876,7 @@ module ExceptionHandlerSplitting {
)
}
- override predicate hasExitScope(ControlFlowElement last, CfgScope scope, Completion c) {
+ override predicate hasExitScope(CfgScope scope, ControlFlowElement last, Completion c) {
// Exit out from last `catch` clause (no catch clauses match)
this.hasLastExit(last, c) and
scopeLast(scope, last, c)
@@ -1292,7 +1135,7 @@ module BooleanSplitting {
)
}
- override predicate hasExitScope(ControlFlowElement last, CfgScope scope, Completion c) {
+ override predicate hasExitScope(CfgScope scope, ControlFlowElement last, Completion c) {
exists(PreBasicBlock bb | this.appliesToBlock(bb, c) |
last = bb.getLastElement() and
scopeLast(scope, last, c)
@@ -1486,7 +1329,7 @@ module LoopSplitting {
loop.stop(pred, succ, c)
}
- override predicate hasExitScope(ControlFlowElement last, CfgScope scope, Completion c) {
+ override predicate hasExitScope(CfgScope scope, ControlFlowElement last, Completion c) {
this.appliesToPredecessor(last, c) and
scopeLast(scope, last, c)
}
@@ -1498,463 +1341,3 @@ module LoopSplitting {
}
}
}
-
-/**
- * A set of control flow node splits. The set is represented by a list of splits,
- * ordered by ascending rank.
- */
-class Splits extends TSplits {
- /** Gets a textual representation of this set of splits. */
- string toString() { result = splitsToString(this) }
-
- /** Gets a split belonging to this set of splits. */
- SplitImpl getASplit() {
- exists(SplitImpl head, Splits tail | this = TSplitsCons(head, tail) |
- result = head
- or
- result = tail.getASplit()
- )
- }
-}
-
-private predicate succEntrySplitsFromRank(
- CfgScope pred, ControlFlowElement succ, Splits splits, int rnk
-) {
- splits = TSplitsNil() and
- scopeFirst(pred, succ) and
- rnk = 0
- or
- exists(SplitImpl head, Splits tail | succEntrySplitsCons(pred, succ, head, tail, rnk) |
- splits = TSplitsCons(head, tail)
- )
-}
-
-private predicate succEntrySplitsCons(
- Callable pred, ControlFlowElement succ, SplitImpl head, Splits tail, int rnk
-) {
- succEntrySplitsFromRank(pred, succ, tail, rnk - 1) and
- head.hasEntryScope(pred, succ) and
- rnk = head.getKind().getListRank(succ)
-}
-
-/**
- * Holds if `succ` with splits `succSplits` is the first element that is executed
- * when entering callable `pred`.
- */
-pragma[noinline]
-predicate succEntrySplits(CfgScope pred, ControlFlowElement succ, Splits succSplits, SuccessorType t) {
- exists(int rnk |
- scopeFirst(pred, succ) and
- t instanceof NormalSuccessor and
- succEntrySplitsFromRank(pred, succ, succSplits, rnk)
- |
- rnk = 0 and
- not any(SplitImpl split).hasEntryScope(pred, succ)
- or
- rnk = max(SplitImpl split | split.hasEntryScope(pred, succ) | split.getKind().getListRank(succ))
- )
-}
-
-/**
- * Holds if `pred` with splits `predSplits` can exit the enclosing callable
- * `succ` with type `t`.
- */
-predicate succExitSplits(ControlFlowElement pred, Splits predSplits, CfgScope succ, SuccessorType t) {
- exists(Reachability::SameSplitsBlock b, Completion c | pred = b.getAnElement() |
- b.isReachable(predSplits) and
- t = c.getAMatchingSuccessorType() and
- scopeLast(succ, pred, c) and
- forall(SplitImpl predSplit | predSplit = predSplits.getASplit() |
- predSplit.hasExitScope(pred, succ, c)
- )
- )
-}
-
-/**
- * Provides a predicate for the successor relation with split information,
- * as well as logic used to construct the type `TSplits` representing sets
- * of splits. Only sets of splits that can be reached are constructed, hence
- * the predicates are mutually recursive.
- *
- * For the successor relation
- *
- * ```ql
- * succSplits(ControlFlowElement pred, Splits predSplits, ControlFlowElement succ, Splits succSplits, Completion c)
- * ```
- *
- * the following invariants are maintained:
- *
- * 1. `pred` is reachable with split set `predSplits`.
- * 2. For all `split` in `predSplits`:
- * - If `split.hasSuccessor(pred, succ, c)` then `split` in `succSplits`.
- * 3. For all `split` in `predSplits`:
- * - If `split.hasExit(pred, succ, c)` and not `split.hasEntry(pred, succ, c)` then
- * `split` not in `succSplits`.
- * 4. For all `split` with kind not in `predSplits`:
- * - If `split.hasEntry(pred, succ, c)` then `split` in `succSplits`.
- * 5. For all `split` in `succSplits`:
- * - `split.hasSuccessor(pred, succ, c)` and `split` in `predSplits`, or
- * - `split.hasEntry(pred, succ, c)`.
- *
- * The algorithm divides into four cases:
- *
- * 1. The set of splits for the successor is the same as the set of splits
- * for the predecessor:
- * a) The successor is in the same `SameSplitsBlock` as the predecessor.
- * b) The successor is *not* in the same `SameSplitsBlock` as the predecessor.
- * 2. The set of splits for the successor is different from the set of splits
- * for the predecessor:
- * a) The set of splits for the successor is *maybe* non-empty.
- * b) The set of splits for the successor is *always* empty.
- *
- * Only case 2a may introduce new sets of splits, so only predicates from
- * this case are used in the definition of `TSplits`.
- *
- * The predicates in this module are named after the cases above.
- */
-private module SuccSplits {
- private predicate succInvariant1(
- Reachability::SameSplitsBlock b, ControlFlowElement pred, Splits predSplits,
- ControlFlowElement succ, Completion c
- ) {
- pred = b.getAnElement() and
- b.isReachable(predSplits) and
- succ(pred, succ, c)
- }
-
- private predicate case1b0(
- ControlFlowElement pred, Splits predSplits, ControlFlowElement succ, Completion c
- ) {
- exists(Reachability::SameSplitsBlock b |
- // Invariant 1
- succInvariant1(b, pred, predSplits, succ, c)
- |
- (succ = b.getAnElement() implies succ = b) and
- // Invariant 4
- not exists(SplitImpl split | split.hasEntry(pred, succ, c))
- )
- }
-
- /**
- * Case 1b.
- *
- * Invariants 1 and 4 hold in the base case, and invariants 2, 3, and 5 are
- * maintained for all splits in `predSplits` (= `succSplits`), except
- * possibly for the splits in `except`.
- *
- * The predicate is written using explicit recursion, as opposed to a `forall`,
- * to avoid negative recursion.
- */
- private predicate case1bForall(
- ControlFlowElement pred, Splits predSplits, ControlFlowElement succ, Completion c, Splits except
- ) {
- case1b0(pred, predSplits, succ, c) and
- except = predSplits
- or
- exists(SplitImpl split |
- case1bForallCons(pred, predSplits, succ, c, split, except) and
- split.hasSuccessor(pred, succ, c)
- )
- }
-
- pragma[noinline]
- private predicate case1bForallCons(
- ControlFlowElement pred, Splits predSplits, ControlFlowElement succ, Completion c,
- SplitImpl exceptHead, Splits exceptTail
- ) {
- case1bForall(pred, predSplits, succ, c, TSplitsCons(exceptHead, exceptTail))
- }
-
- private predicate case1(
- ControlFlowElement pred, Splits predSplits, ControlFlowElement succ, Completion c
- ) {
- // Case 1a
- exists(Reachability::SameSplitsBlock b | succInvariant1(b, pred, predSplits, succ, c) |
- succ = b.getAnElement() and
- not succ = b
- )
- or
- // Case 1b
- case1bForall(pred, predSplits, succ, c, TSplitsNil())
- }
-
- pragma[noinline]
- private SplitImpl succInvariant1GetASplit(
- Reachability::SameSplitsBlock b, ControlFlowElement pred, Splits predSplits,
- ControlFlowElement succ, Completion c
- ) {
- succInvariant1(b, pred, predSplits, succ, c) and
- result = predSplits.getASplit()
- }
-
- private predicate case2aux(
- ControlFlowElement pred, Splits predSplits, ControlFlowElement succ, Completion c
- ) {
- exists(Reachability::SameSplitsBlock b |
- succInvariant1(b, pred, predSplits, succ, c) and
- (succ = b.getAnElement() implies succ = b)
- |
- succInvariant1GetASplit(b, pred, predSplits, succ, c).hasExit(pred, succ, c)
- or
- any(SplitImpl split).hasEntry(pred, succ, c)
- )
- }
-
- /**
- * Holds if `succSplits` should not inherit a split of kind `sk` from
- * `predSplits`, except possibly because of a split in `except`.
- *
- * The predicate is written using explicit recursion, as opposed to a `forall`,
- * to avoid negative recursion.
- */
- private predicate case2aNoneInheritedOfKindForall(
- ControlFlowElement pred, Splits predSplits, ControlFlowElement succ, Completion c, SplitKind sk,
- Splits except
- ) {
- case2aux(pred, predSplits, succ, c) and
- sk.appliesTo(succ) and
- except = predSplits
- or
- exists(Splits mid, SplitImpl split |
- case2aNoneInheritedOfKindForall(pred, predSplits, succ, c, sk, mid) and
- mid = TSplitsCons(split, except)
- |
- split.getKind() = any(SplitKind sk0 | sk0 != sk and sk0.appliesTo(succ))
- or
- split.hasExit(pred, succ, c)
- )
- }
-
- pragma[nomagic]
- private predicate entryOfKind(
- ControlFlowElement pred, ControlFlowElement succ, Completion c, SplitImpl split, SplitKind sk
- ) {
- split.hasEntry(pred, succ, c) and
- sk = split.getKind()
- }
-
- /** Holds if `succSplits` should not have a split of kind `sk`. */
- pragma[nomagic]
- private predicate case2aNoneOfKind(
- ControlFlowElement pred, Splits predSplits, ControlFlowElement succ, Completion c, SplitKind sk
- ) {
- // None inherited from predecessor
- case2aNoneInheritedOfKindForall(pred, predSplits, succ, c, sk, TSplitsNil()) and
- // None newly entered into
- not entryOfKind(pred, succ, c, _, sk)
- }
-
- /** Holds if `succSplits` should not have a split of kind `sk` at rank `rnk`. */
- pragma[nomagic]
- private predicate case2aNoneAtRank(
- ControlFlowElement pred, Splits predSplits, ControlFlowElement succ, Completion c, int rnk
- ) {
- exists(SplitKind sk | case2aNoneOfKind(pred, predSplits, succ, c, sk) |
- rnk = sk.getListRank(succ)
- )
- }
-
- pragma[nomagic]
- private SplitImpl case2auxGetAPredecessorSplit(
- ControlFlowElement pred, Splits predSplits, ControlFlowElement succ, Completion c
- ) {
- case2aux(pred, predSplits, succ, c) and
- result = predSplits.getASplit()
- }
-
- /** Gets a split that should be in `succSplits`. */
- pragma[nomagic]
- private SplitImpl case2aSome(
- ControlFlowElement pred, Splits predSplits, ControlFlowElement succ, Completion c, SplitKind sk
- ) {
- (
- // Inherited from predecessor
- result = case2auxGetAPredecessorSplit(pred, predSplits, succ, c) and
- result.hasSuccessor(pred, succ, c)
- or
- // Newly entered into
- exists(SplitKind sk0 |
- case2aNoneInheritedOfKindForall(pred, predSplits, succ, c, sk0, TSplitsNil())
- |
- entryOfKind(pred, succ, c, result, sk0)
- )
- ) and
- sk = result.getKind()
- }
-
- /** Gets a split that should be in `succSplits` at rank `rnk`. */
- pragma[nomagic]
- SplitImpl case2aSomeAtRank(
- ControlFlowElement pred, Splits predSplits, ControlFlowElement succ, Completion c, int rnk
- ) {
- exists(SplitKind sk | result = case2aSome(pred, predSplits, succ, c, sk) |
- rnk = sk.getListRank(succ)
- )
- }
-
- /**
- * Case 2a.
- *
- * As opposed to the other cases, in this case we need to construct a new set
- * of splits `succSplits`. Since this involves constructing the very IPA type,
- * we cannot recurse directly over the structure of `succSplits`. Instead, we
- * recurse over the ranks of all splits that *might* be in `succSplits`.
- *
- * - Invariant 1 holds in the base case,
- * - invariant 2 holds for all splits with rank at least `rnk`,
- * - invariant 3 holds for all splits in `predSplits`,
- * - invariant 4 holds for all splits in `succSplits` with rank at least `rnk`,
- * and
- * - invariant 4 holds for all splits in `succSplits` with rank at least `rnk`.
- */
- predicate case2aFromRank(
- ControlFlowElement pred, Splits predSplits, ControlFlowElement succ, Splits succSplits,
- Completion c, int rnk
- ) {
- case2aux(pred, predSplits, succ, c) and
- succSplits = TSplitsNil() and
- rnk = max(any(SplitKind sk).getListRank(succ)) + 1
- or
- case2aFromRank(pred, predSplits, succ, succSplits, c, rnk + 1) and
- case2aNoneAtRank(pred, predSplits, succ, c, rnk)
- or
- exists(Splits mid, SplitImpl split | split = case2aCons(pred, predSplits, succ, mid, c, rnk) |
- succSplits = TSplitsCons(split, mid)
- )
- }
-
- pragma[noinline]
- private SplitImpl case2aCons(
- ControlFlowElement pred, Splits predSplits, ControlFlowElement succ, Splits succSplits,
- Completion c, int rnk
- ) {
- case2aFromRank(pred, predSplits, succ, succSplits, c, rnk + 1) and
- result = case2aSomeAtRank(pred, predSplits, succ, c, rnk)
- }
-
- /**
- * Case 2b.
- *
- * Invariants 1, 4, and 5 hold in the base case, and invariants 2 and 3 are
- * maintained for all splits in `predSplits`, except possibly for the splits
- * in `except`.
- *
- * The predicate is written using explicit recursion, as opposed to a `forall`,
- * to avoid negative recursion.
- */
- private predicate case2bForall(
- ControlFlowElement pred, Splits predSplits, ControlFlowElement succ, Completion c, Splits except
- ) {
- // Invariant 1
- case2aux(pred, predSplits, succ, c) and
- // Invariants 4 and 5
- not any(SplitKind sk).appliesTo(succ) and
- except = predSplits
- or
- exists(SplitImpl split | case2bForallCons(pred, predSplits, succ, c, split, except) |
- // Invariants 2 and 3
- split.hasExit(pred, succ, c)
- )
- }
-
- pragma[noinline]
- private predicate case2bForallCons(
- ControlFlowElement pred, Splits predSplits, ControlFlowElement succ, Completion c,
- SplitImpl exceptHead, Splits exceptTail
- ) {
- case2bForall(pred, predSplits, succ, c, TSplitsCons(exceptHead, exceptTail))
- }
-
- private predicate case2(
- ControlFlowElement pred, Splits predSplits, ControlFlowElement succ, Splits succSplits,
- Completion c
- ) {
- case2aFromRank(pred, predSplits, succ, succSplits, c, 1)
- or
- case2bForall(pred, predSplits, succ, c, TSplitsNil()) and
- succSplits = TSplitsNil()
- }
-
- /**
- * Holds if `succ` with splits `succSplits` is a successor of type `t` for `pred`
- * with splits `predSplits`.
- */
- predicate succSplits(
- ControlFlowElement pred, Splits predSplits, ControlFlowElement succ, Splits succSplits,
- Completion c
- ) {
- case1(pred, predSplits, succ, c) and
- succSplits = predSplits
- or
- case2(pred, predSplits, succ, succSplits, c)
- }
-}
-
-import SuccSplits
-
-/** Provides logic for calculating reachable control flow nodes. */
-module Reachability {
- /**
- * Holds if `cfe` is a control flow element where the set of possible splits may
- * be different from the set of possible splits for one of `cfe`'s predecessors.
- * That is, `cfe` starts a new block of elements with the same set of splits.
- */
- private predicate startsSplits(ControlFlowElement cfe) {
- scopeFirst(_, cfe)
- or
- exists(SplitImpl s |
- s.hasEntry(_, cfe, _)
- or
- s.hasExit(_, cfe, _)
- )
- or
- exists(ControlFlowElement pred, SplitImpl split, Completion c | succ(pred, cfe, c) |
- split.appliesTo(pred) and
- not split.hasSuccessor(pred, cfe, c)
- )
- }
-
- private predicate intraSplitsSucc(ControlFlowElement pred, ControlFlowElement succ) {
- succ(pred, succ, _) and
- not startsSplits(succ)
- }
-
- private predicate splitsBlockContains(ControlFlowElement start, ControlFlowElement cfe) =
- fastTC(intraSplitsSucc/2)(start, cfe)
-
- /**
- * A block of control flow elements where the set of splits is guaranteed
- * to remain unchanged, represented by the first element in the block.
- */
- class SameSplitsBlock extends ControlFlowElement {
- SameSplitsBlock() { startsSplits(this) }
-
- /** Gets a control flow element in this block. */
- ControlFlowElement getAnElement() {
- splitsBlockContains(this, result)
- or
- result = this
- }
-
- pragma[noinline]
- private SameSplitsBlock getASuccessor(Splits predSplits, Splits succSplits) {
- exists(ControlFlowElement pred | pred = this.getAnElement() |
- succSplits(pred, predSplits, result, succSplits, _)
- )
- }
-
- /**
- * Holds if the elements of this block are reachable from a callable entry
- * point, with the splits `splits`.
- */
- predicate isReachable(Splits splits) {
- // Base case
- succEntrySplits(_, this, splits, _)
- or
- // Recursive case
- exists(SameSplitsBlock pred, Splits predSplits | pred.isReachable(predSplits) |
- this = pred.getASuccessor(predSplits, splits)
- )
- }
- }
-}
diff --git a/csharp/ql/src/semmle/code/csharp/controlflow/internal/SuccessorType.qll b/csharp/ql/lib/semmle/code/csharp/controlflow/internal/SuccessorType.qll
similarity index 100%
rename from csharp/ql/src/semmle/code/csharp/controlflow/internal/SuccessorType.qll
rename to csharp/ql/lib/semmle/code/csharp/controlflow/internal/SuccessorType.qll
diff --git a/csharp/ql/src/semmle/code/csharp/controlflow/internal/pressa/SsaImplCommon.qll b/csharp/ql/lib/semmle/code/csharp/controlflow/internal/pressa/SsaImplCommon.qll
similarity index 100%
rename from csharp/ql/src/semmle/code/csharp/controlflow/internal/pressa/SsaImplCommon.qll
rename to csharp/ql/lib/semmle/code/csharp/controlflow/internal/pressa/SsaImplCommon.qll
diff --git a/csharp/ql/src/semmle/code/csharp/controlflow/internal/pressa/SsaImplSpecific.qll b/csharp/ql/lib/semmle/code/csharp/controlflow/internal/pressa/SsaImplSpecific.qll
similarity index 100%
rename from csharp/ql/src/semmle/code/csharp/controlflow/internal/pressa/SsaImplSpecific.qll
rename to csharp/ql/lib/semmle/code/csharp/controlflow/internal/pressa/SsaImplSpecific.qll
diff --git a/csharp/ql/src/semmle/code/csharp/dataflow/Bound.qll b/csharp/ql/lib/semmle/code/csharp/dataflow/Bound.qll
similarity index 100%
rename from csharp/ql/src/semmle/code/csharp/dataflow/Bound.qll
rename to csharp/ql/lib/semmle/code/csharp/dataflow/Bound.qll
diff --git a/csharp/ql/src/semmle/code/csharp/dataflow/CallContext.qll b/csharp/ql/lib/semmle/code/csharp/dataflow/CallContext.qll
similarity index 100%
rename from csharp/ql/src/semmle/code/csharp/dataflow/CallContext.qll
rename to csharp/ql/lib/semmle/code/csharp/dataflow/CallContext.qll
diff --git a/csharp/ql/src/semmle/code/csharp/dataflow/DataFlow.qll b/csharp/ql/lib/semmle/code/csharp/dataflow/DataFlow.qll
similarity index 100%
rename from csharp/ql/src/semmle/code/csharp/dataflow/DataFlow.qll
rename to csharp/ql/lib/semmle/code/csharp/dataflow/DataFlow.qll
diff --git a/csharp/ql/src/semmle/code/csharp/dataflow/DataFlow2.qll b/csharp/ql/lib/semmle/code/csharp/dataflow/DataFlow2.qll
similarity index 100%
rename from csharp/ql/src/semmle/code/csharp/dataflow/DataFlow2.qll
rename to csharp/ql/lib/semmle/code/csharp/dataflow/DataFlow2.qll
diff --git a/csharp/ql/src/semmle/code/csharp/dataflow/DataFlow3.qll b/csharp/ql/lib/semmle/code/csharp/dataflow/DataFlow3.qll
similarity index 100%
rename from csharp/ql/src/semmle/code/csharp/dataflow/DataFlow3.qll
rename to csharp/ql/lib/semmle/code/csharp/dataflow/DataFlow3.qll
diff --git a/csharp/ql/src/semmle/code/csharp/dataflow/DataFlow4.qll b/csharp/ql/lib/semmle/code/csharp/dataflow/DataFlow4.qll
similarity index 100%
rename from csharp/ql/src/semmle/code/csharp/dataflow/DataFlow4.qll
rename to csharp/ql/lib/semmle/code/csharp/dataflow/DataFlow4.qll
diff --git a/csharp/ql/src/semmle/code/csharp/dataflow/DataFlow5.qll b/csharp/ql/lib/semmle/code/csharp/dataflow/DataFlow5.qll
similarity index 100%
rename from csharp/ql/src/semmle/code/csharp/dataflow/DataFlow5.qll
rename to csharp/ql/lib/semmle/code/csharp/dataflow/DataFlow5.qll
diff --git a/csharp/ql/src/semmle/code/csharp/dataflow/ExternalFlow.qll b/csharp/ql/lib/semmle/code/csharp/dataflow/ExternalFlow.qll
similarity index 100%
rename from csharp/ql/src/semmle/code/csharp/dataflow/ExternalFlow.qll
rename to csharp/ql/lib/semmle/code/csharp/dataflow/ExternalFlow.qll
diff --git a/csharp/ql/src/semmle/code/csharp/dataflow/FlowSummary.qll b/csharp/ql/lib/semmle/code/csharp/dataflow/FlowSummary.qll
similarity index 100%
rename from csharp/ql/src/semmle/code/csharp/dataflow/FlowSummary.qll
rename to csharp/ql/lib/semmle/code/csharp/dataflow/FlowSummary.qll
diff --git a/csharp/ql/src/semmle/code/csharp/dataflow/LibraryTypeDataFlow.qll b/csharp/ql/lib/semmle/code/csharp/dataflow/LibraryTypeDataFlow.qll
similarity index 100%
rename from csharp/ql/src/semmle/code/csharp/dataflow/LibraryTypeDataFlow.qll
rename to csharp/ql/lib/semmle/code/csharp/dataflow/LibraryTypeDataFlow.qll
diff --git a/csharp/ql/src/semmle/code/csharp/dataflow/ModulusAnalysis.qll b/csharp/ql/lib/semmle/code/csharp/dataflow/ModulusAnalysis.qll
similarity index 100%
rename from csharp/ql/src/semmle/code/csharp/dataflow/ModulusAnalysis.qll
rename to csharp/ql/lib/semmle/code/csharp/dataflow/ModulusAnalysis.qll
diff --git a/csharp/ql/src/semmle/code/csharp/dataflow/Nullness.qll b/csharp/ql/lib/semmle/code/csharp/dataflow/Nullness.qll
similarity index 100%
rename from csharp/ql/src/semmle/code/csharp/dataflow/Nullness.qll
rename to csharp/ql/lib/semmle/code/csharp/dataflow/Nullness.qll
diff --git a/csharp/ql/src/semmle/code/csharp/dataflow/SSA.qll b/csharp/ql/lib/semmle/code/csharp/dataflow/SSA.qll
similarity index 100%
rename from csharp/ql/src/semmle/code/csharp/dataflow/SSA.qll
rename to csharp/ql/lib/semmle/code/csharp/dataflow/SSA.qll
diff --git a/csharp/ql/src/semmle/code/csharp/dataflow/SignAnalysis.qll b/csharp/ql/lib/semmle/code/csharp/dataflow/SignAnalysis.qll
similarity index 100%
rename from csharp/ql/src/semmle/code/csharp/dataflow/SignAnalysis.qll
rename to csharp/ql/lib/semmle/code/csharp/dataflow/SignAnalysis.qll
diff --git a/csharp/ql/src/semmle/code/csharp/dataflow/TaintTracking.qll b/csharp/ql/lib/semmle/code/csharp/dataflow/TaintTracking.qll
similarity index 100%
rename from csharp/ql/src/semmle/code/csharp/dataflow/TaintTracking.qll
rename to csharp/ql/lib/semmle/code/csharp/dataflow/TaintTracking.qll
diff --git a/csharp/ql/src/semmle/code/csharp/dataflow/TaintTracking2.qll b/csharp/ql/lib/semmle/code/csharp/dataflow/TaintTracking2.qll
similarity index 100%
rename from csharp/ql/src/semmle/code/csharp/dataflow/TaintTracking2.qll
rename to csharp/ql/lib/semmle/code/csharp/dataflow/TaintTracking2.qll
diff --git a/csharp/ql/src/semmle/code/csharp/dataflow/TaintTracking3.qll b/csharp/ql/lib/semmle/code/csharp/dataflow/TaintTracking3.qll
similarity index 100%
rename from csharp/ql/src/semmle/code/csharp/dataflow/TaintTracking3.qll
rename to csharp/ql/lib/semmle/code/csharp/dataflow/TaintTracking3.qll
diff --git a/csharp/ql/src/semmle/code/csharp/dataflow/TaintTracking4.qll b/csharp/ql/lib/semmle/code/csharp/dataflow/TaintTracking4.qll
similarity index 100%
rename from csharp/ql/src/semmle/code/csharp/dataflow/TaintTracking4.qll
rename to csharp/ql/lib/semmle/code/csharp/dataflow/TaintTracking4.qll
diff --git a/csharp/ql/src/semmle/code/csharp/dataflow/TaintTracking5.qll b/csharp/ql/lib/semmle/code/csharp/dataflow/TaintTracking5.qll
similarity index 100%
rename from csharp/ql/src/semmle/code/csharp/dataflow/TaintTracking5.qll
rename to csharp/ql/lib/semmle/code/csharp/dataflow/TaintTracking5.qll
diff --git a/csharp/ql/src/semmle/code/csharp/dataflow/flowsources/PublicCallableParameter.qll b/csharp/ql/lib/semmle/code/csharp/dataflow/flowsources/PublicCallableParameter.qll
similarity index 100%
rename from csharp/ql/src/semmle/code/csharp/dataflow/flowsources/PublicCallableParameter.qll
rename to csharp/ql/lib/semmle/code/csharp/dataflow/flowsources/PublicCallableParameter.qll
diff --git a/csharp/ql/src/semmle/code/csharp/dataflow/flowsources/Remote.qll b/csharp/ql/lib/semmle/code/csharp/dataflow/flowsources/Remote.qll
similarity index 100%
rename from csharp/ql/src/semmle/code/csharp/dataflow/flowsources/Remote.qll
rename to csharp/ql/lib/semmle/code/csharp/dataflow/flowsources/Remote.qll
diff --git a/csharp/ql/src/semmle/code/csharp/dataflow/internal/BaseSSA.qll b/csharp/ql/lib/semmle/code/csharp/dataflow/internal/BaseSSA.qll
similarity index 100%
rename from csharp/ql/src/semmle/code/csharp/dataflow/internal/BaseSSA.qll
rename to csharp/ql/lib/semmle/code/csharp/dataflow/internal/BaseSSA.qll
diff --git a/csharp/ql/src/semmle/code/csharp/dataflow/internal/CallableReturns.qll b/csharp/ql/lib/semmle/code/csharp/dataflow/internal/CallableReturns.qll
similarity index 100%
rename from csharp/ql/src/semmle/code/csharp/dataflow/internal/CallableReturns.qll
rename to csharp/ql/lib/semmle/code/csharp/dataflow/internal/CallableReturns.qll
diff --git a/csharp/ql/src/semmle/code/csharp/dataflow/internal/ControlFlowReachability.qll b/csharp/ql/lib/semmle/code/csharp/dataflow/internal/ControlFlowReachability.qll
similarity index 100%
rename from csharp/ql/src/semmle/code/csharp/dataflow/internal/ControlFlowReachability.qll
rename to csharp/ql/lib/semmle/code/csharp/dataflow/internal/ControlFlowReachability.qll
diff --git a/csharp/ql/src/semmle/code/csharp/dataflow/internal/DataFlowDispatch.qll b/csharp/ql/lib/semmle/code/csharp/dataflow/internal/DataFlowDispatch.qll
similarity index 100%
rename from csharp/ql/src/semmle/code/csharp/dataflow/internal/DataFlowDispatch.qll
rename to csharp/ql/lib/semmle/code/csharp/dataflow/internal/DataFlowDispatch.qll
diff --git a/csharp/ql/src/semmle/code/csharp/dataflow/internal/DataFlowImpl.qll b/csharp/ql/lib/semmle/code/csharp/dataflow/internal/DataFlowImpl.qll
similarity index 100%
rename from csharp/ql/src/semmle/code/csharp/dataflow/internal/DataFlowImpl.qll
rename to csharp/ql/lib/semmle/code/csharp/dataflow/internal/DataFlowImpl.qll
diff --git a/csharp/ql/src/semmle/code/csharp/dataflow/internal/DataFlowImpl2.qll b/csharp/ql/lib/semmle/code/csharp/dataflow/internal/DataFlowImpl2.qll
similarity index 100%
rename from csharp/ql/src/semmle/code/csharp/dataflow/internal/DataFlowImpl2.qll
rename to csharp/ql/lib/semmle/code/csharp/dataflow/internal/DataFlowImpl2.qll
diff --git a/csharp/ql/src/semmle/code/csharp/dataflow/internal/DataFlowImpl3.qll b/csharp/ql/lib/semmle/code/csharp/dataflow/internal/DataFlowImpl3.qll
similarity index 100%
rename from csharp/ql/src/semmle/code/csharp/dataflow/internal/DataFlowImpl3.qll
rename to csharp/ql/lib/semmle/code/csharp/dataflow/internal/DataFlowImpl3.qll
diff --git a/csharp/ql/src/semmle/code/csharp/dataflow/internal/DataFlowImpl4.qll b/csharp/ql/lib/semmle/code/csharp/dataflow/internal/DataFlowImpl4.qll
similarity index 100%
rename from csharp/ql/src/semmle/code/csharp/dataflow/internal/DataFlowImpl4.qll
rename to csharp/ql/lib/semmle/code/csharp/dataflow/internal/DataFlowImpl4.qll
diff --git a/csharp/ql/src/semmle/code/csharp/dataflow/internal/DataFlowImpl5.qll b/csharp/ql/lib/semmle/code/csharp/dataflow/internal/DataFlowImpl5.qll
similarity index 100%
rename from csharp/ql/src/semmle/code/csharp/dataflow/internal/DataFlowImpl5.qll
rename to csharp/ql/lib/semmle/code/csharp/dataflow/internal/DataFlowImpl5.qll
diff --git a/csharp/ql/src/semmle/code/csharp/dataflow/internal/DataFlowImplCommon.qll b/csharp/ql/lib/semmle/code/csharp/dataflow/internal/DataFlowImplCommon.qll
similarity index 100%
rename from csharp/ql/src/semmle/code/csharp/dataflow/internal/DataFlowImplCommon.qll
rename to csharp/ql/lib/semmle/code/csharp/dataflow/internal/DataFlowImplCommon.qll
diff --git a/csharp/ql/src/semmle/code/csharp/dataflow/internal/DataFlowImplConsistency.qll b/csharp/ql/lib/semmle/code/csharp/dataflow/internal/DataFlowImplConsistency.qll
similarity index 100%
rename from csharp/ql/src/semmle/code/csharp/dataflow/internal/DataFlowImplConsistency.qll
rename to csharp/ql/lib/semmle/code/csharp/dataflow/internal/DataFlowImplConsistency.qll
diff --git a/csharp/ql/src/semmle/code/csharp/dataflow/internal/DataFlowImplSpecific.qll b/csharp/ql/lib/semmle/code/csharp/dataflow/internal/DataFlowImplSpecific.qll
similarity index 100%
rename from csharp/ql/src/semmle/code/csharp/dataflow/internal/DataFlowImplSpecific.qll
rename to csharp/ql/lib/semmle/code/csharp/dataflow/internal/DataFlowImplSpecific.qll
diff --git a/csharp/ql/src/semmle/code/csharp/dataflow/internal/DataFlowPrivate.qll b/csharp/ql/lib/semmle/code/csharp/dataflow/internal/DataFlowPrivate.qll
similarity index 100%
rename from csharp/ql/src/semmle/code/csharp/dataflow/internal/DataFlowPrivate.qll
rename to csharp/ql/lib/semmle/code/csharp/dataflow/internal/DataFlowPrivate.qll
diff --git a/csharp/ql/src/semmle/code/csharp/dataflow/internal/DataFlowPublic.qll b/csharp/ql/lib/semmle/code/csharp/dataflow/internal/DataFlowPublic.qll
similarity index 100%
rename from csharp/ql/src/semmle/code/csharp/dataflow/internal/DataFlowPublic.qll
rename to csharp/ql/lib/semmle/code/csharp/dataflow/internal/DataFlowPublic.qll
diff --git a/csharp/ql/src/semmle/code/csharp/dataflow/internal/DelegateDataFlow.qll b/csharp/ql/lib/semmle/code/csharp/dataflow/internal/DelegateDataFlow.qll
similarity index 100%
rename from csharp/ql/src/semmle/code/csharp/dataflow/internal/DelegateDataFlow.qll
rename to csharp/ql/lib/semmle/code/csharp/dataflow/internal/DelegateDataFlow.qll
diff --git a/csharp/ql/src/semmle/code/csharp/dataflow/internal/FlowSummaryImpl.qll b/csharp/ql/lib/semmle/code/csharp/dataflow/internal/FlowSummaryImpl.qll
similarity index 100%
rename from csharp/ql/src/semmle/code/csharp/dataflow/internal/FlowSummaryImpl.qll
rename to csharp/ql/lib/semmle/code/csharp/dataflow/internal/FlowSummaryImpl.qll
diff --git a/csharp/ql/src/semmle/code/csharp/dataflow/internal/FlowSummaryImplSpecific.qll b/csharp/ql/lib/semmle/code/csharp/dataflow/internal/FlowSummaryImplSpecific.qll
similarity index 100%
rename from csharp/ql/src/semmle/code/csharp/dataflow/internal/FlowSummaryImplSpecific.qll
rename to csharp/ql/lib/semmle/code/csharp/dataflow/internal/FlowSummaryImplSpecific.qll
diff --git a/csharp/ql/src/semmle/code/csharp/dataflow/internal/SsaImpl.qll b/csharp/ql/lib/semmle/code/csharp/dataflow/internal/SsaImpl.qll
similarity index 100%
rename from csharp/ql/src/semmle/code/csharp/dataflow/internal/SsaImpl.qll
rename to csharp/ql/lib/semmle/code/csharp/dataflow/internal/SsaImpl.qll
diff --git a/csharp/ql/src/semmle/code/csharp/dataflow/internal/SsaImplCommon.qll b/csharp/ql/lib/semmle/code/csharp/dataflow/internal/SsaImplCommon.qll
similarity index 100%
rename from csharp/ql/src/semmle/code/csharp/dataflow/internal/SsaImplCommon.qll
rename to csharp/ql/lib/semmle/code/csharp/dataflow/internal/SsaImplCommon.qll
diff --git a/csharp/ql/src/semmle/code/csharp/dataflow/internal/SsaImplSpecific.qll b/csharp/ql/lib/semmle/code/csharp/dataflow/internal/SsaImplSpecific.qll
similarity index 100%
rename from csharp/ql/src/semmle/code/csharp/dataflow/internal/SsaImplSpecific.qll
rename to csharp/ql/lib/semmle/code/csharp/dataflow/internal/SsaImplSpecific.qll
diff --git a/csharp/ql/src/semmle/code/csharp/dataflow/internal/Steps.qll b/csharp/ql/lib/semmle/code/csharp/dataflow/internal/Steps.qll
similarity index 100%
rename from csharp/ql/src/semmle/code/csharp/dataflow/internal/Steps.qll
rename to csharp/ql/lib/semmle/code/csharp/dataflow/internal/Steps.qll
diff --git a/csharp/ql/src/semmle/code/csharp/dataflow/internal/TaintTrackingPrivate.qll b/csharp/ql/lib/semmle/code/csharp/dataflow/internal/TaintTrackingPrivate.qll
similarity index 100%
rename from csharp/ql/src/semmle/code/csharp/dataflow/internal/TaintTrackingPrivate.qll
rename to csharp/ql/lib/semmle/code/csharp/dataflow/internal/TaintTrackingPrivate.qll
diff --git a/csharp/ql/src/semmle/code/csharp/dataflow/internal/TaintTrackingPublic.qll b/csharp/ql/lib/semmle/code/csharp/dataflow/internal/TaintTrackingPublic.qll
similarity index 100%
rename from csharp/ql/src/semmle/code/csharp/dataflow/internal/TaintTrackingPublic.qll
rename to csharp/ql/lib/semmle/code/csharp/dataflow/internal/TaintTrackingPublic.qll
diff --git a/csharp/ql/src/semmle/code/csharp/dataflow/internal/basessa/SsaImplCommon.qll b/csharp/ql/lib/semmle/code/csharp/dataflow/internal/basessa/SsaImplCommon.qll
similarity index 100%
rename from csharp/ql/src/semmle/code/csharp/dataflow/internal/basessa/SsaImplCommon.qll
rename to csharp/ql/lib/semmle/code/csharp/dataflow/internal/basessa/SsaImplCommon.qll
diff --git a/csharp/ql/src/semmle/code/csharp/dataflow/internal/basessa/SsaImplSpecific.qll b/csharp/ql/lib/semmle/code/csharp/dataflow/internal/basessa/SsaImplSpecific.qll
similarity index 100%
rename from csharp/ql/src/semmle/code/csharp/dataflow/internal/basessa/SsaImplSpecific.qll
rename to csharp/ql/lib/semmle/code/csharp/dataflow/internal/basessa/SsaImplSpecific.qll
diff --git a/csharp/ql/src/semmle/code/csharp/dataflow/internal/rangeanalysis/BoundSpecific.qll b/csharp/ql/lib/semmle/code/csharp/dataflow/internal/rangeanalysis/BoundSpecific.qll
similarity index 100%
rename from csharp/ql/src/semmle/code/csharp/dataflow/internal/rangeanalysis/BoundSpecific.qll
rename to csharp/ql/lib/semmle/code/csharp/dataflow/internal/rangeanalysis/BoundSpecific.qll
diff --git a/csharp/ql/src/semmle/code/csharp/dataflow/internal/rangeanalysis/ConstantUtils.qll b/csharp/ql/lib/semmle/code/csharp/dataflow/internal/rangeanalysis/ConstantUtils.qll
similarity index 100%
rename from csharp/ql/src/semmle/code/csharp/dataflow/internal/rangeanalysis/ConstantUtils.qll
rename to csharp/ql/lib/semmle/code/csharp/dataflow/internal/rangeanalysis/ConstantUtils.qll
diff --git a/csharp/ql/src/semmle/code/csharp/dataflow/internal/rangeanalysis/ControlFlowReachability.qll b/csharp/ql/lib/semmle/code/csharp/dataflow/internal/rangeanalysis/ControlFlowReachability.qll
similarity index 100%
rename from csharp/ql/src/semmle/code/csharp/dataflow/internal/rangeanalysis/ControlFlowReachability.qll
rename to csharp/ql/lib/semmle/code/csharp/dataflow/internal/rangeanalysis/ControlFlowReachability.qll
diff --git a/csharp/ql/src/semmle/code/csharp/dataflow/internal/rangeanalysis/ModulusAnalysisSpecific.qll b/csharp/ql/lib/semmle/code/csharp/dataflow/internal/rangeanalysis/ModulusAnalysisSpecific.qll
similarity index 100%
rename from csharp/ql/src/semmle/code/csharp/dataflow/internal/rangeanalysis/ModulusAnalysisSpecific.qll
rename to csharp/ql/lib/semmle/code/csharp/dataflow/internal/rangeanalysis/ModulusAnalysisSpecific.qll
diff --git a/csharp/ql/src/semmle/code/csharp/dataflow/internal/rangeanalysis/RangeUtils.qll b/csharp/ql/lib/semmle/code/csharp/dataflow/internal/rangeanalysis/RangeUtils.qll
similarity index 100%
rename from csharp/ql/src/semmle/code/csharp/dataflow/internal/rangeanalysis/RangeUtils.qll
rename to csharp/ql/lib/semmle/code/csharp/dataflow/internal/rangeanalysis/RangeUtils.qll
diff --git a/csharp/ql/src/semmle/code/csharp/dataflow/internal/rangeanalysis/Sign.qll b/csharp/ql/lib/semmle/code/csharp/dataflow/internal/rangeanalysis/Sign.qll
similarity index 100%
rename from csharp/ql/src/semmle/code/csharp/dataflow/internal/rangeanalysis/Sign.qll
rename to csharp/ql/lib/semmle/code/csharp/dataflow/internal/rangeanalysis/Sign.qll
diff --git a/csharp/ql/src/semmle/code/csharp/dataflow/internal/rangeanalysis/SignAnalysisCommon.qll b/csharp/ql/lib/semmle/code/csharp/dataflow/internal/rangeanalysis/SignAnalysisCommon.qll
similarity index 100%
rename from csharp/ql/src/semmle/code/csharp/dataflow/internal/rangeanalysis/SignAnalysisCommon.qll
rename to csharp/ql/lib/semmle/code/csharp/dataflow/internal/rangeanalysis/SignAnalysisCommon.qll
diff --git a/csharp/ql/src/semmle/code/csharp/dataflow/internal/rangeanalysis/SignAnalysisSpecific.qll b/csharp/ql/lib/semmle/code/csharp/dataflow/internal/rangeanalysis/SignAnalysisSpecific.qll
similarity index 100%
rename from csharp/ql/src/semmle/code/csharp/dataflow/internal/rangeanalysis/SignAnalysisSpecific.qll
rename to csharp/ql/lib/semmle/code/csharp/dataflow/internal/rangeanalysis/SignAnalysisSpecific.qll
diff --git a/csharp/ql/src/semmle/code/csharp/dataflow/internal/rangeanalysis/SsaReadPositionCommon.qll b/csharp/ql/lib/semmle/code/csharp/dataflow/internal/rangeanalysis/SsaReadPositionCommon.qll
similarity index 100%
rename from csharp/ql/src/semmle/code/csharp/dataflow/internal/rangeanalysis/SsaReadPositionCommon.qll
rename to csharp/ql/lib/semmle/code/csharp/dataflow/internal/rangeanalysis/SsaReadPositionCommon.qll
diff --git a/csharp/ql/src/semmle/code/csharp/dataflow/internal/rangeanalysis/SsaReadPositionSpecific.qll b/csharp/ql/lib/semmle/code/csharp/dataflow/internal/rangeanalysis/SsaReadPositionSpecific.qll
similarity index 100%
rename from csharp/ql/src/semmle/code/csharp/dataflow/internal/rangeanalysis/SsaReadPositionSpecific.qll
rename to csharp/ql/lib/semmle/code/csharp/dataflow/internal/rangeanalysis/SsaReadPositionSpecific.qll
diff --git a/csharp/ql/src/semmle/code/csharp/dataflow/internal/rangeanalysis/SsaUtils.qll b/csharp/ql/lib/semmle/code/csharp/dataflow/internal/rangeanalysis/SsaUtils.qll
similarity index 100%
rename from csharp/ql/src/semmle/code/csharp/dataflow/internal/rangeanalysis/SsaUtils.qll
rename to csharp/ql/lib/semmle/code/csharp/dataflow/internal/rangeanalysis/SsaUtils.qll
diff --git a/csharp/ql/src/semmle/code/csharp/dataflow/internal/tainttracking1/TaintTrackingImpl.qll b/csharp/ql/lib/semmle/code/csharp/dataflow/internal/tainttracking1/TaintTrackingImpl.qll
similarity index 100%
rename from csharp/ql/src/semmle/code/csharp/dataflow/internal/tainttracking1/TaintTrackingImpl.qll
rename to csharp/ql/lib/semmle/code/csharp/dataflow/internal/tainttracking1/TaintTrackingImpl.qll
diff --git a/csharp/ql/src/semmle/code/csharp/dataflow/internal/tainttracking1/TaintTrackingParameter.qll b/csharp/ql/lib/semmle/code/csharp/dataflow/internal/tainttracking1/TaintTrackingParameter.qll
similarity index 100%
rename from csharp/ql/src/semmle/code/csharp/dataflow/internal/tainttracking1/TaintTrackingParameter.qll
rename to csharp/ql/lib/semmle/code/csharp/dataflow/internal/tainttracking1/TaintTrackingParameter.qll
diff --git a/csharp/ql/src/semmle/code/csharp/dataflow/internal/tainttracking2/TaintTrackingImpl.qll b/csharp/ql/lib/semmle/code/csharp/dataflow/internal/tainttracking2/TaintTrackingImpl.qll
similarity index 100%
rename from csharp/ql/src/semmle/code/csharp/dataflow/internal/tainttracking2/TaintTrackingImpl.qll
rename to csharp/ql/lib/semmle/code/csharp/dataflow/internal/tainttracking2/TaintTrackingImpl.qll
diff --git a/csharp/ql/src/semmle/code/csharp/dataflow/internal/tainttracking2/TaintTrackingParameter.qll b/csharp/ql/lib/semmle/code/csharp/dataflow/internal/tainttracking2/TaintTrackingParameter.qll
similarity index 100%
rename from csharp/ql/src/semmle/code/csharp/dataflow/internal/tainttracking2/TaintTrackingParameter.qll
rename to csharp/ql/lib/semmle/code/csharp/dataflow/internal/tainttracking2/TaintTrackingParameter.qll
diff --git a/csharp/ql/src/semmle/code/csharp/dataflow/internal/tainttracking3/TaintTrackingImpl.qll b/csharp/ql/lib/semmle/code/csharp/dataflow/internal/tainttracking3/TaintTrackingImpl.qll
similarity index 100%
rename from csharp/ql/src/semmle/code/csharp/dataflow/internal/tainttracking3/TaintTrackingImpl.qll
rename to csharp/ql/lib/semmle/code/csharp/dataflow/internal/tainttracking3/TaintTrackingImpl.qll
diff --git a/csharp/ql/src/semmle/code/csharp/dataflow/internal/tainttracking3/TaintTrackingParameter.qll b/csharp/ql/lib/semmle/code/csharp/dataflow/internal/tainttracking3/TaintTrackingParameter.qll
similarity index 100%
rename from csharp/ql/src/semmle/code/csharp/dataflow/internal/tainttracking3/TaintTrackingParameter.qll
rename to csharp/ql/lib/semmle/code/csharp/dataflow/internal/tainttracking3/TaintTrackingParameter.qll
diff --git a/csharp/ql/src/semmle/code/csharp/dataflow/internal/tainttracking4/TaintTrackingImpl.qll b/csharp/ql/lib/semmle/code/csharp/dataflow/internal/tainttracking4/TaintTrackingImpl.qll
similarity index 100%
rename from csharp/ql/src/semmle/code/csharp/dataflow/internal/tainttracking4/TaintTrackingImpl.qll
rename to csharp/ql/lib/semmle/code/csharp/dataflow/internal/tainttracking4/TaintTrackingImpl.qll
diff --git a/csharp/ql/src/semmle/code/csharp/dataflow/internal/tainttracking4/TaintTrackingParameter.qll b/csharp/ql/lib/semmle/code/csharp/dataflow/internal/tainttracking4/TaintTrackingParameter.qll
similarity index 100%
rename from csharp/ql/src/semmle/code/csharp/dataflow/internal/tainttracking4/TaintTrackingParameter.qll
rename to csharp/ql/lib/semmle/code/csharp/dataflow/internal/tainttracking4/TaintTrackingParameter.qll
diff --git a/csharp/ql/src/semmle/code/csharp/dataflow/internal/tainttracking5/TaintTrackingImpl.qll b/csharp/ql/lib/semmle/code/csharp/dataflow/internal/tainttracking5/TaintTrackingImpl.qll
similarity index 100%
rename from csharp/ql/src/semmle/code/csharp/dataflow/internal/tainttracking5/TaintTrackingImpl.qll
rename to csharp/ql/lib/semmle/code/csharp/dataflow/internal/tainttracking5/TaintTrackingImpl.qll
diff --git a/csharp/ql/src/semmle/code/csharp/dataflow/internal/tainttracking5/TaintTrackingParameter.qll b/csharp/ql/lib/semmle/code/csharp/dataflow/internal/tainttracking5/TaintTrackingParameter.qll
similarity index 100%
rename from csharp/ql/src/semmle/code/csharp/dataflow/internal/tainttracking5/TaintTrackingParameter.qll
rename to csharp/ql/lib/semmle/code/csharp/dataflow/internal/tainttracking5/TaintTrackingParameter.qll
diff --git a/csharp/ql/src/semmle/code/csharp/dispatch/Dispatch.qll b/csharp/ql/lib/semmle/code/csharp/dispatch/Dispatch.qll
similarity index 100%
rename from csharp/ql/src/semmle/code/csharp/dispatch/Dispatch.qll
rename to csharp/ql/lib/semmle/code/csharp/dispatch/Dispatch.qll
diff --git a/csharp/ql/src/semmle/code/csharp/dispatch/OverridableCallable.qll b/csharp/ql/lib/semmle/code/csharp/dispatch/OverridableCallable.qll
similarity index 100%
rename from csharp/ql/src/semmle/code/csharp/dispatch/OverridableCallable.qll
rename to csharp/ql/lib/semmle/code/csharp/dispatch/OverridableCallable.qll
diff --git a/csharp/ql/src/semmle/code/csharp/dispatch/RuntimeCallable.qll b/csharp/ql/lib/semmle/code/csharp/dispatch/RuntimeCallable.qll
similarity index 100%
rename from csharp/ql/src/semmle/code/csharp/dispatch/RuntimeCallable.qll
rename to csharp/ql/lib/semmle/code/csharp/dispatch/RuntimeCallable.qll
diff --git a/csharp/ql/src/semmle/code/csharp/exprs/Access.qll b/csharp/ql/lib/semmle/code/csharp/exprs/Access.qll
similarity index 100%
rename from csharp/ql/src/semmle/code/csharp/exprs/Access.qll
rename to csharp/ql/lib/semmle/code/csharp/exprs/Access.qll
diff --git a/csharp/ql/src/semmle/code/csharp/exprs/ArithmeticOperation.qll b/csharp/ql/lib/semmle/code/csharp/exprs/ArithmeticOperation.qll
similarity index 100%
rename from csharp/ql/src/semmle/code/csharp/exprs/ArithmeticOperation.qll
rename to csharp/ql/lib/semmle/code/csharp/exprs/ArithmeticOperation.qll
diff --git a/csharp/ql/src/semmle/code/csharp/exprs/Assignment.qll b/csharp/ql/lib/semmle/code/csharp/exprs/Assignment.qll
similarity index 100%
rename from csharp/ql/src/semmle/code/csharp/exprs/Assignment.qll
rename to csharp/ql/lib/semmle/code/csharp/exprs/Assignment.qll
diff --git a/csharp/ql/src/semmle/code/csharp/exprs/BitwiseOperation.qll b/csharp/ql/lib/semmle/code/csharp/exprs/BitwiseOperation.qll
similarity index 100%
rename from csharp/ql/src/semmle/code/csharp/exprs/BitwiseOperation.qll
rename to csharp/ql/lib/semmle/code/csharp/exprs/BitwiseOperation.qll
diff --git a/csharp/ql/src/semmle/code/csharp/exprs/Call.qll b/csharp/ql/lib/semmle/code/csharp/exprs/Call.qll
similarity index 100%
rename from csharp/ql/src/semmle/code/csharp/exprs/Call.qll
rename to csharp/ql/lib/semmle/code/csharp/exprs/Call.qll
diff --git a/csharp/ql/src/semmle/code/csharp/exprs/ComparisonOperation.qll b/csharp/ql/lib/semmle/code/csharp/exprs/ComparisonOperation.qll
similarity index 100%
rename from csharp/ql/src/semmle/code/csharp/exprs/ComparisonOperation.qll
rename to csharp/ql/lib/semmle/code/csharp/exprs/ComparisonOperation.qll
diff --git a/csharp/ql/src/semmle/code/csharp/exprs/Creation.qll b/csharp/ql/lib/semmle/code/csharp/exprs/Creation.qll
similarity index 100%
rename from csharp/ql/src/semmle/code/csharp/exprs/Creation.qll
rename to csharp/ql/lib/semmle/code/csharp/exprs/Creation.qll
diff --git a/csharp/ql/src/semmle/code/csharp/exprs/Dynamic.qll b/csharp/ql/lib/semmle/code/csharp/exprs/Dynamic.qll
similarity index 100%
rename from csharp/ql/src/semmle/code/csharp/exprs/Dynamic.qll
rename to csharp/ql/lib/semmle/code/csharp/exprs/Dynamic.qll
diff --git a/csharp/ql/src/semmle/code/csharp/exprs/Expr.qll b/csharp/ql/lib/semmle/code/csharp/exprs/Expr.qll
similarity index 100%
rename from csharp/ql/src/semmle/code/csharp/exprs/Expr.qll
rename to csharp/ql/lib/semmle/code/csharp/exprs/Expr.qll
diff --git a/csharp/ql/src/semmle/code/csharp/exprs/Literal.qll b/csharp/ql/lib/semmle/code/csharp/exprs/Literal.qll
similarity index 100%
rename from csharp/ql/src/semmle/code/csharp/exprs/Literal.qll
rename to csharp/ql/lib/semmle/code/csharp/exprs/Literal.qll
diff --git a/csharp/ql/src/semmle/code/csharp/exprs/LogicalOperation.qll b/csharp/ql/lib/semmle/code/csharp/exprs/LogicalOperation.qll
similarity index 100%
rename from csharp/ql/src/semmle/code/csharp/exprs/LogicalOperation.qll
rename to csharp/ql/lib/semmle/code/csharp/exprs/LogicalOperation.qll
diff --git a/csharp/ql/src/semmle/code/csharp/frameworks/Dapper.qll b/csharp/ql/lib/semmle/code/csharp/frameworks/Dapper.qll
similarity index 100%
rename from csharp/ql/src/semmle/code/csharp/frameworks/Dapper.qll
rename to csharp/ql/lib/semmle/code/csharp/frameworks/Dapper.qll
diff --git a/csharp/ql/src/semmle/code/csharp/frameworks/EntityFramework.qll b/csharp/ql/lib/semmle/code/csharp/frameworks/EntityFramework.qll
similarity index 100%
rename from csharp/ql/src/semmle/code/csharp/frameworks/EntityFramework.qll
rename to csharp/ql/lib/semmle/code/csharp/frameworks/EntityFramework.qll
diff --git a/csharp/ql/src/semmle/code/csharp/frameworks/Format.qll b/csharp/ql/lib/semmle/code/csharp/frameworks/Format.qll
similarity index 100%
rename from csharp/ql/src/semmle/code/csharp/frameworks/Format.qll
rename to csharp/ql/lib/semmle/code/csharp/frameworks/Format.qll
diff --git a/csharp/ql/src/semmle/code/csharp/frameworks/JsonNET.qll b/csharp/ql/lib/semmle/code/csharp/frameworks/JsonNET.qll
similarity index 95%
rename from csharp/ql/src/semmle/code/csharp/frameworks/JsonNET.qll
rename to csharp/ql/lib/semmle/code/csharp/frameworks/JsonNET.qll
index 54019d13216..abd820bdfe4 100644
--- a/csharp/ql/src/semmle/code/csharp/frameworks/JsonNET.qll
+++ b/csharp/ql/lib/semmle/code/csharp/frameworks/JsonNET.qll
@@ -17,6 +17,19 @@ module JsonNET {
JsonClass() { this.getParent() instanceof JsonNETNamespace }
}
+ /** Newtonsoft.Json.TypeNameHandling enum */
+ class TypeNameHandlingEnum extends Enum {
+ TypeNameHandlingEnum() {
+ this.getParent() instanceof JsonNETNamespace and
+ this.hasName("TypeNameHandling")
+ }
+ }
+
+ /** Newtonsoft.Json.JsonSerializerSettings class */
+ class JsonSerializerSettingsClass extends JsonClass {
+ JsonSerializerSettingsClass() { this.hasName("JsonSerializerSettings") }
+ }
+
/** The class `Newtonsoft.Json.JsonConvert`. */
class JsonConvertClass extends JsonClass, LibraryTypeDataFlow {
JsonConvertClass() { this.hasName("JsonConvert") }
diff --git a/csharp/ql/src/semmle/code/csharp/frameworks/Microsoft.qll b/csharp/ql/lib/semmle/code/csharp/frameworks/Microsoft.qll
similarity index 100%
rename from csharp/ql/src/semmle/code/csharp/frameworks/Microsoft.qll
rename to csharp/ql/lib/semmle/code/csharp/frameworks/Microsoft.qll
diff --git a/csharp/ql/src/semmle/code/csharp/frameworks/Moq.qll b/csharp/ql/lib/semmle/code/csharp/frameworks/Moq.qll
similarity index 100%
rename from csharp/ql/src/semmle/code/csharp/frameworks/Moq.qll
rename to csharp/ql/lib/semmle/code/csharp/frameworks/Moq.qll
diff --git a/csharp/ql/src/semmle/code/csharp/frameworks/NHibernate.qll b/csharp/ql/lib/semmle/code/csharp/frameworks/NHibernate.qll
similarity index 100%
rename from csharp/ql/src/semmle/code/csharp/frameworks/NHibernate.qll
rename to csharp/ql/lib/semmle/code/csharp/frameworks/NHibernate.qll
diff --git a/csharp/ql/src/semmle/code/csharp/frameworks/Sql.qll b/csharp/ql/lib/semmle/code/csharp/frameworks/Sql.qll
similarity index 100%
rename from csharp/ql/src/semmle/code/csharp/frameworks/Sql.qll
rename to csharp/ql/lib/semmle/code/csharp/frameworks/Sql.qll
diff --git a/csharp/ql/src/semmle/code/csharp/frameworks/System.qll b/csharp/ql/lib/semmle/code/csharp/frameworks/System.qll
similarity index 100%
rename from csharp/ql/src/semmle/code/csharp/frameworks/System.qll
rename to csharp/ql/lib/semmle/code/csharp/frameworks/System.qll
diff --git a/csharp/ql/src/semmle/code/csharp/frameworks/Test.qll b/csharp/ql/lib/semmle/code/csharp/frameworks/Test.qll
similarity index 100%
rename from csharp/ql/src/semmle/code/csharp/frameworks/Test.qll
rename to csharp/ql/lib/semmle/code/csharp/frameworks/Test.qll
diff --git a/csharp/ql/src/semmle/code/csharp/frameworks/WCF.qll b/csharp/ql/lib/semmle/code/csharp/frameworks/WCF.qll
similarity index 100%
rename from csharp/ql/src/semmle/code/csharp/frameworks/WCF.qll
rename to csharp/ql/lib/semmle/code/csharp/frameworks/WCF.qll
diff --git a/csharp/ql/src/semmle/code/csharp/frameworks/microsoft/AspNetCore.qll b/csharp/ql/lib/semmle/code/csharp/frameworks/microsoft/AspNetCore.qll
similarity index 100%
rename from csharp/ql/src/semmle/code/csharp/frameworks/microsoft/AspNetCore.qll
rename to csharp/ql/lib/semmle/code/csharp/frameworks/microsoft/AspNetCore.qll
diff --git a/csharp/ql/src/semmle/code/csharp/frameworks/microsoft/Owin.qll b/csharp/ql/lib/semmle/code/csharp/frameworks/microsoft/Owin.qll
similarity index 100%
rename from csharp/ql/src/semmle/code/csharp/frameworks/microsoft/Owin.qll
rename to csharp/ql/lib/semmle/code/csharp/frameworks/microsoft/Owin.qll
diff --git a/csharp/ql/src/semmle/code/csharp/frameworks/system/CodeDom.qll b/csharp/ql/lib/semmle/code/csharp/frameworks/system/CodeDom.qll
similarity index 100%
rename from csharp/ql/src/semmle/code/csharp/frameworks/system/CodeDom.qll
rename to csharp/ql/lib/semmle/code/csharp/frameworks/system/CodeDom.qll
diff --git a/csharp/ql/src/semmle/code/csharp/frameworks/system/Collections.qll b/csharp/ql/lib/semmle/code/csharp/frameworks/system/Collections.qll
similarity index 100%
rename from csharp/ql/src/semmle/code/csharp/frameworks/system/Collections.qll
rename to csharp/ql/lib/semmle/code/csharp/frameworks/system/Collections.qll
diff --git a/csharp/ql/src/semmle/code/csharp/frameworks/system/Data.qll b/csharp/ql/lib/semmle/code/csharp/frameworks/system/Data.qll
similarity index 100%
rename from csharp/ql/src/semmle/code/csharp/frameworks/system/Data.qll
rename to csharp/ql/lib/semmle/code/csharp/frameworks/system/Data.qll
diff --git a/csharp/ql/src/semmle/code/csharp/frameworks/system/Diagnostics.qll b/csharp/ql/lib/semmle/code/csharp/frameworks/system/Diagnostics.qll
similarity index 100%
rename from csharp/ql/src/semmle/code/csharp/frameworks/system/Diagnostics.qll
rename to csharp/ql/lib/semmle/code/csharp/frameworks/system/Diagnostics.qll
diff --git a/csharp/ql/src/semmle/code/csharp/frameworks/system/DirectoryServices.qll b/csharp/ql/lib/semmle/code/csharp/frameworks/system/DirectoryServices.qll
similarity index 100%
rename from csharp/ql/src/semmle/code/csharp/frameworks/system/DirectoryServices.qll
rename to csharp/ql/lib/semmle/code/csharp/frameworks/system/DirectoryServices.qll
diff --git a/csharp/ql/src/semmle/code/csharp/frameworks/system/IO.qll b/csharp/ql/lib/semmle/code/csharp/frameworks/system/IO.qll
similarity index 100%
rename from csharp/ql/src/semmle/code/csharp/frameworks/system/IO.qll
rename to csharp/ql/lib/semmle/code/csharp/frameworks/system/IO.qll
diff --git a/csharp/ql/src/semmle/code/csharp/frameworks/system/Linq.qll b/csharp/ql/lib/semmle/code/csharp/frameworks/system/Linq.qll
similarity index 100%
rename from csharp/ql/src/semmle/code/csharp/frameworks/system/Linq.qll
rename to csharp/ql/lib/semmle/code/csharp/frameworks/system/Linq.qll
diff --git a/csharp/ql/src/semmle/code/csharp/frameworks/system/Net.qll b/csharp/ql/lib/semmle/code/csharp/frameworks/system/Net.qll
similarity index 100%
rename from csharp/ql/src/semmle/code/csharp/frameworks/system/Net.qll
rename to csharp/ql/lib/semmle/code/csharp/frameworks/system/Net.qll
diff --git a/csharp/ql/src/semmle/code/csharp/frameworks/system/Reflection.qll b/csharp/ql/lib/semmle/code/csharp/frameworks/system/Reflection.qll
similarity index 100%
rename from csharp/ql/src/semmle/code/csharp/frameworks/system/Reflection.qll
rename to csharp/ql/lib/semmle/code/csharp/frameworks/system/Reflection.qll
diff --git a/csharp/ql/src/semmle/code/csharp/frameworks/system/Runtime.qll b/csharp/ql/lib/semmle/code/csharp/frameworks/system/Runtime.qll
similarity index 100%
rename from csharp/ql/src/semmle/code/csharp/frameworks/system/Runtime.qll
rename to csharp/ql/lib/semmle/code/csharp/frameworks/system/Runtime.qll
diff --git a/csharp/ql/src/semmle/code/csharp/frameworks/system/Security.qll b/csharp/ql/lib/semmle/code/csharp/frameworks/system/Security.qll
similarity index 100%
rename from csharp/ql/src/semmle/code/csharp/frameworks/system/Security.qll
rename to csharp/ql/lib/semmle/code/csharp/frameworks/system/Security.qll
diff --git a/csharp/ql/src/semmle/code/csharp/frameworks/system/Text.qll b/csharp/ql/lib/semmle/code/csharp/frameworks/system/Text.qll
similarity index 100%
rename from csharp/ql/src/semmle/code/csharp/frameworks/system/Text.qll
rename to csharp/ql/lib/semmle/code/csharp/frameworks/system/Text.qll
diff --git a/csharp/ql/src/semmle/code/csharp/frameworks/system/Threading.qll b/csharp/ql/lib/semmle/code/csharp/frameworks/system/Threading.qll
similarity index 100%
rename from csharp/ql/src/semmle/code/csharp/frameworks/system/Threading.qll
rename to csharp/ql/lib/semmle/code/csharp/frameworks/system/Threading.qll
diff --git a/csharp/ql/src/semmle/code/csharp/frameworks/system/Web.qll b/csharp/ql/lib/semmle/code/csharp/frameworks/system/Web.qll
similarity index 100%
rename from csharp/ql/src/semmle/code/csharp/frameworks/system/Web.qll
rename to csharp/ql/lib/semmle/code/csharp/frameworks/system/Web.qll
diff --git a/csharp/ql/src/semmle/code/csharp/frameworks/system/Windows.qll b/csharp/ql/lib/semmle/code/csharp/frameworks/system/Windows.qll
similarity index 100%
rename from csharp/ql/src/semmle/code/csharp/frameworks/system/Windows.qll
rename to csharp/ql/lib/semmle/code/csharp/frameworks/system/Windows.qll
diff --git a/csharp/ql/src/semmle/code/csharp/frameworks/system/Xml.qll b/csharp/ql/lib/semmle/code/csharp/frameworks/system/Xml.qll
similarity index 100%
rename from csharp/ql/src/semmle/code/csharp/frameworks/system/Xml.qll
rename to csharp/ql/lib/semmle/code/csharp/frameworks/system/Xml.qll
diff --git a/csharp/ql/src/semmle/code/csharp/frameworks/system/codedom/Compiler.qll b/csharp/ql/lib/semmle/code/csharp/frameworks/system/codedom/Compiler.qll
similarity index 100%
rename from csharp/ql/src/semmle/code/csharp/frameworks/system/codedom/Compiler.qll
rename to csharp/ql/lib/semmle/code/csharp/frameworks/system/codedom/Compiler.qll
diff --git a/csharp/ql/src/semmle/code/csharp/frameworks/system/collections/Generic.qll b/csharp/ql/lib/semmle/code/csharp/frameworks/system/collections/Generic.qll
similarity index 100%
rename from csharp/ql/src/semmle/code/csharp/frameworks/system/collections/Generic.qll
rename to csharp/ql/lib/semmle/code/csharp/frameworks/system/collections/Generic.qll
diff --git a/csharp/ql/src/semmle/code/csharp/frameworks/system/collections/Specialized.qll b/csharp/ql/lib/semmle/code/csharp/frameworks/system/collections/Specialized.qll
similarity index 100%
rename from csharp/ql/src/semmle/code/csharp/frameworks/system/collections/Specialized.qll
rename to csharp/ql/lib/semmle/code/csharp/frameworks/system/collections/Specialized.qll
diff --git a/csharp/ql/src/semmle/code/csharp/frameworks/system/data/Common.qll b/csharp/ql/lib/semmle/code/csharp/frameworks/system/data/Common.qll
similarity index 100%
rename from csharp/ql/src/semmle/code/csharp/frameworks/system/data/Common.qll
rename to csharp/ql/lib/semmle/code/csharp/frameworks/system/data/Common.qll
diff --git a/csharp/ql/src/semmle/code/csharp/frameworks/system/data/Entity.qll b/csharp/ql/lib/semmle/code/csharp/frameworks/system/data/Entity.qll
similarity index 97%
rename from csharp/ql/src/semmle/code/csharp/frameworks/system/data/Entity.qll
rename to csharp/ql/lib/semmle/code/csharp/frameworks/system/data/Entity.qll
index e60e73f5113..5109db04af6 100644
--- a/csharp/ql/src/semmle/code/csharp/frameworks/system/data/Entity.qll
+++ b/csharp/ql/lib/semmle/code/csharp/frameworks/system/data/Entity.qll
@@ -39,7 +39,7 @@ module SystemDataEntity {
/** The `System.Data.Entity.DbSet` class. */
class DbSet extends Class {
DbSet() {
- this.getUnboundDeclaration().(csharp::UnboundGenericClass).getNameWithoutBrackets() = "DbSet"
+ this.getUnboundDeclaration().(csharp::UnboundGenericClass).getUndecoratedName() = "DbSet"
}
/** Gets the `SqlQuery` method. */
@@ -100,7 +100,7 @@ module SystemDataEntityInfrastructure {
this.getABaseType*()
.getUnboundDeclaration()
.(csharp::UnboundGenericClass)
- .getNameWithoutBrackets() = "DbRawSqlQuery"
+ .getUndecoratedName() = "DbRawSqlQuery"
}
}
}
diff --git a/csharp/ql/src/semmle/code/csharp/frameworks/system/data/SqlClient.qll b/csharp/ql/lib/semmle/code/csharp/frameworks/system/data/SqlClient.qll
similarity index 100%
rename from csharp/ql/src/semmle/code/csharp/frameworks/system/data/SqlClient.qll
rename to csharp/ql/lib/semmle/code/csharp/frameworks/system/data/SqlClient.qll
diff --git a/csharp/ql/src/semmle/code/csharp/frameworks/system/data/SqlServerCe.qll b/csharp/ql/lib/semmle/code/csharp/frameworks/system/data/SqlServerCe.qll
similarity index 100%
rename from csharp/ql/src/semmle/code/csharp/frameworks/system/data/SqlServerCe.qll
rename to csharp/ql/lib/semmle/code/csharp/frameworks/system/data/SqlServerCe.qll
diff --git a/csharp/ql/src/semmle/code/csharp/frameworks/system/diagnostics/Contracts.qll b/csharp/ql/lib/semmle/code/csharp/frameworks/system/diagnostics/Contracts.qll
similarity index 100%
rename from csharp/ql/src/semmle/code/csharp/frameworks/system/diagnostics/Contracts.qll
rename to csharp/ql/lib/semmle/code/csharp/frameworks/system/diagnostics/Contracts.qll
diff --git a/csharp/ql/src/semmle/code/csharp/frameworks/system/directoryservices/Protocols.qll b/csharp/ql/lib/semmle/code/csharp/frameworks/system/directoryservices/Protocols.qll
similarity index 100%
rename from csharp/ql/src/semmle/code/csharp/frameworks/system/directoryservices/Protocols.qll
rename to csharp/ql/lib/semmle/code/csharp/frameworks/system/directoryservices/Protocols.qll
diff --git a/csharp/ql/src/semmle/code/csharp/frameworks/system/io/Compression.qll b/csharp/ql/lib/semmle/code/csharp/frameworks/system/io/Compression.qll
similarity index 100%
rename from csharp/ql/src/semmle/code/csharp/frameworks/system/io/Compression.qll
rename to csharp/ql/lib/semmle/code/csharp/frameworks/system/io/Compression.qll
diff --git a/csharp/ql/src/semmle/code/csharp/frameworks/system/linq/Expressions.qll b/csharp/ql/lib/semmle/code/csharp/frameworks/system/linq/Expressions.qll
similarity index 100%
rename from csharp/ql/src/semmle/code/csharp/frameworks/system/linq/Expressions.qll
rename to csharp/ql/lib/semmle/code/csharp/frameworks/system/linq/Expressions.qll
diff --git a/csharp/ql/src/semmle/code/csharp/frameworks/system/net/Mail.qll b/csharp/ql/lib/semmle/code/csharp/frameworks/system/net/Mail.qll
similarity index 100%
rename from csharp/ql/src/semmle/code/csharp/frameworks/system/net/Mail.qll
rename to csharp/ql/lib/semmle/code/csharp/frameworks/system/net/Mail.qll
diff --git a/csharp/ql/src/semmle/code/csharp/frameworks/system/runtime/CompilerServices.qll b/csharp/ql/lib/semmle/code/csharp/frameworks/system/runtime/CompilerServices.qll
similarity index 100%
rename from csharp/ql/src/semmle/code/csharp/frameworks/system/runtime/CompilerServices.qll
rename to csharp/ql/lib/semmle/code/csharp/frameworks/system/runtime/CompilerServices.qll
diff --git a/csharp/ql/src/semmle/code/csharp/frameworks/system/runtime/InteropServices.qll b/csharp/ql/lib/semmle/code/csharp/frameworks/system/runtime/InteropServices.qll
similarity index 100%
rename from csharp/ql/src/semmle/code/csharp/frameworks/system/runtime/InteropServices.qll
rename to csharp/ql/lib/semmle/code/csharp/frameworks/system/runtime/InteropServices.qll
diff --git a/csharp/ql/src/semmle/code/csharp/frameworks/system/security/Cryptography.qll b/csharp/ql/lib/semmle/code/csharp/frameworks/system/security/Cryptography.qll
similarity index 100%
rename from csharp/ql/src/semmle/code/csharp/frameworks/system/security/Cryptography.qll
rename to csharp/ql/lib/semmle/code/csharp/frameworks/system/security/Cryptography.qll
diff --git a/csharp/ql/src/semmle/code/csharp/frameworks/system/security/cryptography/SymmetricAlgorithm.qll b/csharp/ql/lib/semmle/code/csharp/frameworks/system/security/cryptography/SymmetricAlgorithm.qll
similarity index 100%
rename from csharp/ql/src/semmle/code/csharp/frameworks/system/security/cryptography/SymmetricAlgorithm.qll
rename to csharp/ql/lib/semmle/code/csharp/frameworks/system/security/cryptography/SymmetricAlgorithm.qll
diff --git a/csharp/ql/src/semmle/code/csharp/frameworks/system/security/cryptography/X509Certificates.qll b/csharp/ql/lib/semmle/code/csharp/frameworks/system/security/cryptography/X509Certificates.qll
similarity index 100%
rename from csharp/ql/src/semmle/code/csharp/frameworks/system/security/cryptography/X509Certificates.qll
rename to csharp/ql/lib/semmle/code/csharp/frameworks/system/security/cryptography/X509Certificates.qll
diff --git a/csharp/ql/src/semmle/code/csharp/frameworks/system/text/RegularExpressions.qll b/csharp/ql/lib/semmle/code/csharp/frameworks/system/text/RegularExpressions.qll
similarity index 100%
rename from csharp/ql/src/semmle/code/csharp/frameworks/system/text/RegularExpressions.qll
rename to csharp/ql/lib/semmle/code/csharp/frameworks/system/text/RegularExpressions.qll
diff --git a/csharp/ql/src/semmle/code/csharp/frameworks/system/threading/Tasks.qll b/csharp/ql/lib/semmle/code/csharp/frameworks/system/threading/Tasks.qll
similarity index 100%
rename from csharp/ql/src/semmle/code/csharp/frameworks/system/threading/Tasks.qll
rename to csharp/ql/lib/semmle/code/csharp/frameworks/system/threading/Tasks.qll
diff --git a/csharp/ql/src/semmle/code/csharp/frameworks/system/web/Helpers.qll b/csharp/ql/lib/semmle/code/csharp/frameworks/system/web/Helpers.qll
similarity index 100%
rename from csharp/ql/src/semmle/code/csharp/frameworks/system/web/Helpers.qll
rename to csharp/ql/lib/semmle/code/csharp/frameworks/system/web/Helpers.qll
diff --git a/csharp/ql/src/semmle/code/csharp/frameworks/system/web/Http.qll b/csharp/ql/lib/semmle/code/csharp/frameworks/system/web/Http.qll
similarity index 100%
rename from csharp/ql/src/semmle/code/csharp/frameworks/system/web/Http.qll
rename to csharp/ql/lib/semmle/code/csharp/frameworks/system/web/Http.qll
diff --git a/csharp/ql/src/semmle/code/csharp/frameworks/system/web/Mvc.qll b/csharp/ql/lib/semmle/code/csharp/frameworks/system/web/Mvc.qll
similarity index 100%
rename from csharp/ql/src/semmle/code/csharp/frameworks/system/web/Mvc.qll
rename to csharp/ql/lib/semmle/code/csharp/frameworks/system/web/Mvc.qll
diff --git a/csharp/ql/src/semmle/code/csharp/frameworks/system/web/Security.qll b/csharp/ql/lib/semmle/code/csharp/frameworks/system/web/Security.qll
similarity index 100%
rename from csharp/ql/src/semmle/code/csharp/frameworks/system/web/Security.qll
rename to csharp/ql/lib/semmle/code/csharp/frameworks/system/web/Security.qll
diff --git a/csharp/ql/src/semmle/code/csharp/frameworks/system/web/Services.qll b/csharp/ql/lib/semmle/code/csharp/frameworks/system/web/Services.qll
similarity index 100%
rename from csharp/ql/src/semmle/code/csharp/frameworks/system/web/Services.qll
rename to csharp/ql/lib/semmle/code/csharp/frameworks/system/web/Services.qll
diff --git a/csharp/ql/src/semmle/code/csharp/frameworks/system/web/UI.qll b/csharp/ql/lib/semmle/code/csharp/frameworks/system/web/UI.qll
similarity index 100%
rename from csharp/ql/src/semmle/code/csharp/frameworks/system/web/UI.qll
rename to csharp/ql/lib/semmle/code/csharp/frameworks/system/web/UI.qll
diff --git a/csharp/ql/src/semmle/code/csharp/frameworks/system/web/WebPages.qll b/csharp/ql/lib/semmle/code/csharp/frameworks/system/web/WebPages.qll
similarity index 100%
rename from csharp/ql/src/semmle/code/csharp/frameworks/system/web/WebPages.qll
rename to csharp/ql/lib/semmle/code/csharp/frameworks/system/web/WebPages.qll
diff --git a/csharp/ql/src/semmle/code/csharp/frameworks/system/web/ui/WebControls.qll b/csharp/ql/lib/semmle/code/csharp/frameworks/system/web/ui/WebControls.qll
similarity index 100%
rename from csharp/ql/src/semmle/code/csharp/frameworks/system/web/ui/WebControls.qll
rename to csharp/ql/lib/semmle/code/csharp/frameworks/system/web/ui/WebControls.qll
diff --git a/csharp/ql/src/semmle/code/csharp/frameworks/system/windows/Forms.qll b/csharp/ql/lib/semmle/code/csharp/frameworks/system/windows/Forms.qll
similarity index 100%
rename from csharp/ql/src/semmle/code/csharp/frameworks/system/windows/Forms.qll
rename to csharp/ql/lib/semmle/code/csharp/frameworks/system/windows/Forms.qll
diff --git a/csharp/ql/src/semmle/code/csharp/frameworks/system/xml/XPath.qll b/csharp/ql/lib/semmle/code/csharp/frameworks/system/xml/XPath.qll
similarity index 100%
rename from csharp/ql/src/semmle/code/csharp/frameworks/system/xml/XPath.qll
rename to csharp/ql/lib/semmle/code/csharp/frameworks/system/xml/XPath.qll
diff --git a/csharp/ql/src/semmle/code/csharp/frameworks/test/NUnit.qll b/csharp/ql/lib/semmle/code/csharp/frameworks/test/NUnit.qll
similarity index 100%
rename from csharp/ql/src/semmle/code/csharp/frameworks/test/NUnit.qll
rename to csharp/ql/lib/semmle/code/csharp/frameworks/test/NUnit.qll
diff --git a/csharp/ql/src/semmle/code/csharp/frameworks/test/VisualStudio.qll b/csharp/ql/lib/semmle/code/csharp/frameworks/test/VisualStudio.qll
similarity index 100%
rename from csharp/ql/src/semmle/code/csharp/frameworks/test/VisualStudio.qll
rename to csharp/ql/lib/semmle/code/csharp/frameworks/test/VisualStudio.qll
diff --git a/csharp/ql/src/semmle/code/csharp/frameworks/test/XUnit.qll b/csharp/ql/lib/semmle/code/csharp/frameworks/test/XUnit.qll
similarity index 100%
rename from csharp/ql/src/semmle/code/csharp/frameworks/test/XUnit.qll
rename to csharp/ql/lib/semmle/code/csharp/frameworks/test/XUnit.qll
diff --git a/csharp/ql/src/semmle/code/csharp/metrics/Complexity.qll b/csharp/ql/lib/semmle/code/csharp/metrics/Complexity.qll
similarity index 100%
rename from csharp/ql/src/semmle/code/csharp/metrics/Complexity.qll
rename to csharp/ql/lib/semmle/code/csharp/metrics/Complexity.qll
diff --git a/csharp/ql/src/semmle/code/csharp/metrics/Coupling.qll b/csharp/ql/lib/semmle/code/csharp/metrics/Coupling.qll
similarity index 100%
rename from csharp/ql/src/semmle/code/csharp/metrics/Coupling.qll
rename to csharp/ql/lib/semmle/code/csharp/metrics/Coupling.qll
diff --git a/csharp/ql/src/semmle/code/csharp/metrics/ExternalDependencies.qll b/csharp/ql/lib/semmle/code/csharp/metrics/ExternalDependencies.qll
similarity index 100%
rename from csharp/ql/src/semmle/code/csharp/metrics/ExternalDependencies.qll
rename to csharp/ql/lib/semmle/code/csharp/metrics/ExternalDependencies.qll
diff --git a/csharp/ql/src/semmle/code/csharp/security/PrivateData.qll b/csharp/ql/lib/semmle/code/csharp/security/PrivateData.qll
similarity index 100%
rename from csharp/ql/src/semmle/code/csharp/security/PrivateData.qll
rename to csharp/ql/lib/semmle/code/csharp/security/PrivateData.qll
diff --git a/csharp/ql/src/semmle/code/csharp/security/Sanitizers.qll b/csharp/ql/lib/semmle/code/csharp/security/Sanitizers.qll
similarity index 100%
rename from csharp/ql/src/semmle/code/csharp/security/Sanitizers.qll
rename to csharp/ql/lib/semmle/code/csharp/security/Sanitizers.qll
diff --git a/csharp/ql/src/semmle/code/csharp/security/SensitiveActions.qll b/csharp/ql/lib/semmle/code/csharp/security/SensitiveActions.qll
similarity index 100%
rename from csharp/ql/src/semmle/code/csharp/security/SensitiveActions.qll
rename to csharp/ql/lib/semmle/code/csharp/security/SensitiveActions.qll
diff --git a/csharp/ql/src/semmle/code/csharp/security/cryptography/EncryptionKeyDataFlowQuery.qll b/csharp/ql/lib/semmle/code/csharp/security/cryptography/EncryptionKeyDataFlowQuery.qll
similarity index 100%
rename from csharp/ql/src/semmle/code/csharp/security/cryptography/EncryptionKeyDataFlowQuery.qll
rename to csharp/ql/lib/semmle/code/csharp/security/cryptography/EncryptionKeyDataFlowQuery.qll
diff --git a/csharp/ql/src/semmle/code/csharp/security/cryptography/HardcodedSymmetricEncryptionKey.qll b/csharp/ql/lib/semmle/code/csharp/security/cryptography/HardcodedSymmetricEncryptionKey.qll
similarity index 100%
rename from csharp/ql/src/semmle/code/csharp/security/cryptography/HardcodedSymmetricEncryptionKey.qll
rename to csharp/ql/lib/semmle/code/csharp/security/cryptography/HardcodedSymmetricEncryptionKey.qll
diff --git a/csharp/ql/src/semmle/code/csharp/security/dataflow/CleartextStorageQuery.qll b/csharp/ql/lib/semmle/code/csharp/security/dataflow/CleartextStorageQuery.qll
similarity index 100%
rename from csharp/ql/src/semmle/code/csharp/security/dataflow/CleartextStorageQuery.qll
rename to csharp/ql/lib/semmle/code/csharp/security/dataflow/CleartextStorageQuery.qll
diff --git a/csharp/ql/src/semmle/code/csharp/security/dataflow/CodeInjectionQuery.qll b/csharp/ql/lib/semmle/code/csharp/security/dataflow/CodeInjectionQuery.qll
similarity index 100%
rename from csharp/ql/src/semmle/code/csharp/security/dataflow/CodeInjectionQuery.qll
rename to csharp/ql/lib/semmle/code/csharp/security/dataflow/CodeInjectionQuery.qll
diff --git a/csharp/ql/src/semmle/code/csharp/security/dataflow/CommandInjectionQuery.qll b/csharp/ql/lib/semmle/code/csharp/security/dataflow/CommandInjectionQuery.qll
similarity index 100%
rename from csharp/ql/src/semmle/code/csharp/security/dataflow/CommandInjectionQuery.qll
rename to csharp/ql/lib/semmle/code/csharp/security/dataflow/CommandInjectionQuery.qll
diff --git a/csharp/ql/src/semmle/code/csharp/security/dataflow/ConditionalBypassQuery.qll b/csharp/ql/lib/semmle/code/csharp/security/dataflow/ConditionalBypassQuery.qll
similarity index 100%
rename from csharp/ql/src/semmle/code/csharp/security/dataflow/ConditionalBypassQuery.qll
rename to csharp/ql/lib/semmle/code/csharp/security/dataflow/ConditionalBypassQuery.qll
diff --git a/csharp/ql/src/semmle/code/csharp/security/dataflow/ExposureOfPrivateInformationQuery.qll b/csharp/ql/lib/semmle/code/csharp/security/dataflow/ExposureOfPrivateInformationQuery.qll
similarity index 100%
rename from csharp/ql/src/semmle/code/csharp/security/dataflow/ExposureOfPrivateInformationQuery.qll
rename to csharp/ql/lib/semmle/code/csharp/security/dataflow/ExposureOfPrivateInformationQuery.qll
diff --git a/csharp/ql/src/semmle/code/csharp/security/dataflow/ExternalAPIsQuery.qll b/csharp/ql/lib/semmle/code/csharp/security/dataflow/ExternalAPIsQuery.qll
similarity index 100%
rename from csharp/ql/src/semmle/code/csharp/security/dataflow/ExternalAPIsQuery.qll
rename to csharp/ql/lib/semmle/code/csharp/security/dataflow/ExternalAPIsQuery.qll
diff --git a/csharp/ql/src/semmle/code/csharp/security/dataflow/HardcodedCredentialsQuery.qll b/csharp/ql/lib/semmle/code/csharp/security/dataflow/HardcodedCredentialsQuery.qll
similarity index 100%
rename from csharp/ql/src/semmle/code/csharp/security/dataflow/HardcodedCredentialsQuery.qll
rename to csharp/ql/lib/semmle/code/csharp/security/dataflow/HardcodedCredentialsQuery.qll
diff --git a/csharp/ql/src/semmle/code/csharp/security/dataflow/LDAPInjectionQuery.qll b/csharp/ql/lib/semmle/code/csharp/security/dataflow/LDAPInjectionQuery.qll
similarity index 100%
rename from csharp/ql/src/semmle/code/csharp/security/dataflow/LDAPInjectionQuery.qll
rename to csharp/ql/lib/semmle/code/csharp/security/dataflow/LDAPInjectionQuery.qll
diff --git a/csharp/ql/src/semmle/code/csharp/security/dataflow/LogForgingQuery.qll b/csharp/ql/lib/semmle/code/csharp/security/dataflow/LogForgingQuery.qll
similarity index 100%
rename from csharp/ql/src/semmle/code/csharp/security/dataflow/LogForgingQuery.qll
rename to csharp/ql/lib/semmle/code/csharp/security/dataflow/LogForgingQuery.qll
diff --git a/csharp/ql/src/semmle/code/csharp/security/dataflow/MissingXMLValidationQuery.qll b/csharp/ql/lib/semmle/code/csharp/security/dataflow/MissingXMLValidationQuery.qll
similarity index 100%
rename from csharp/ql/src/semmle/code/csharp/security/dataflow/MissingXMLValidationQuery.qll
rename to csharp/ql/lib/semmle/code/csharp/security/dataflow/MissingXMLValidationQuery.qll
diff --git a/csharp/ql/src/semmle/code/csharp/security/dataflow/ReDoSQuery.qll b/csharp/ql/lib/semmle/code/csharp/security/dataflow/ReDoSQuery.qll
similarity index 100%
rename from csharp/ql/src/semmle/code/csharp/security/dataflow/ReDoSQuery.qll
rename to csharp/ql/lib/semmle/code/csharp/security/dataflow/ReDoSQuery.qll
diff --git a/csharp/ql/src/semmle/code/csharp/security/dataflow/RegexInjectionQuery.qll b/csharp/ql/lib/semmle/code/csharp/security/dataflow/RegexInjectionQuery.qll
similarity index 100%
rename from csharp/ql/src/semmle/code/csharp/security/dataflow/RegexInjectionQuery.qll
rename to csharp/ql/lib/semmle/code/csharp/security/dataflow/RegexInjectionQuery.qll
diff --git a/csharp/ql/src/semmle/code/csharp/security/dataflow/ResourceInjectionQuery.qll b/csharp/ql/lib/semmle/code/csharp/security/dataflow/ResourceInjectionQuery.qll
similarity index 100%
rename from csharp/ql/src/semmle/code/csharp/security/dataflow/ResourceInjectionQuery.qll
rename to csharp/ql/lib/semmle/code/csharp/security/dataflow/ResourceInjectionQuery.qll
diff --git a/csharp/ql/src/semmle/code/csharp/security/dataflow/SqlInjectionQuery.qll b/csharp/ql/lib/semmle/code/csharp/security/dataflow/SqlInjectionQuery.qll
similarity index 100%
rename from csharp/ql/src/semmle/code/csharp/security/dataflow/SqlInjectionQuery.qll
rename to csharp/ql/lib/semmle/code/csharp/security/dataflow/SqlInjectionQuery.qll
diff --git a/csharp/ql/src/semmle/code/csharp/security/dataflow/TaintedPathQuery.qll b/csharp/ql/lib/semmle/code/csharp/security/dataflow/TaintedPathQuery.qll
similarity index 100%
rename from csharp/ql/src/semmle/code/csharp/security/dataflow/TaintedPathQuery.qll
rename to csharp/ql/lib/semmle/code/csharp/security/dataflow/TaintedPathQuery.qll
diff --git a/csharp/ql/lib/semmle/code/csharp/security/dataflow/UnsafeDeserializationQuery.qll b/csharp/ql/lib/semmle/code/csharp/security/dataflow/UnsafeDeserializationQuery.qll
new file mode 100644
index 00000000000..f7bab643985
--- /dev/null
+++ b/csharp/ql/lib/semmle/code/csharp/security/dataflow/UnsafeDeserializationQuery.qll
@@ -0,0 +1,903 @@
+/**
+ * Provides a taint-tracking configuration for reasoning about uncontrolled data
+ * in calls to unsafe deserializers (XML, JSON, XAML).
+ */
+
+import csharp
+private import semmle.code.csharp.serialization.Deserializers
+private import semmle.code.csharp.dataflow.TaintTracking2
+private import semmle.code.csharp.security.dataflow.flowsources.Remote
+
+/**
+ * A data flow source for unsafe deserialization vulnerabilities.
+ */
+abstract class Source extends DataFlow::Node { }
+
+/**
+ * A data flow sink for unsafe deserialization vulnerabilities.
+ */
+abstract class Sink extends DataFlow::Node { }
+
+/**
+ * A data flow sink for unsafe deserialization vulnerabilities to an instance method.
+ */
+abstract private class InstanceMethodSink extends Sink {
+ InstanceMethodSink() {
+ not exists(
+ SafeConstructorTrackingConfig safeConstructorTracking, DataFlow::Node safeTypeUsage,
+ MethodCall mc
+ |
+ safeConstructorTracking.hasFlow(_, safeTypeUsage) and
+ mc.getQualifier() = safeTypeUsage.asExpr() and
+ mc.getAnArgument() = this.asExpr()
+ )
+ }
+}
+
+/**
+ * A data flow sink for unsafe deserialization vulnerabilities to a static method or constructor call.
+ */
+abstract private class ConstructorOrStaticMethodSink extends Sink { }
+
+/**
+ * A sanitizer for unsafe deserialization vulnerabilities.
+ */
+abstract class Sanitizer extends DataFlow::Node { }
+
+private class RemoteSource extends Source {
+ RemoteSource() { this instanceof RemoteFlowSource }
+}
+
+/**
+ * User input to object method call deserialization flow tracking.
+ */
+class TaintToObjectMethodTrackingConfig extends TaintTracking::Configuration {
+ TaintToObjectMethodTrackingConfig() { this = "TaintToObjectMethodTrackingConfig" }
+
+ override predicate isSource(DataFlow::Node source) { source instanceof Source }
+
+ override predicate isSink(DataFlow::Node sink) { sink instanceof InstanceMethodSink }
+
+ override predicate isSanitizer(DataFlow::Node node) { node instanceof Sanitizer }
+}
+
+/**
+ * User input to `JsonConvert` call deserialization flow tracking.
+ */
+class JsonConvertTrackingConfig extends TaintTracking::Configuration {
+ JsonConvertTrackingConfig() { this = "JsonConvertTrackingConfig" }
+
+ override predicate isSource(DataFlow::Node source) { source instanceof Source }
+
+ override predicate isSink(DataFlow::Node sink) {
+ sink instanceof NewtonsoftJsonConvertDeserializeObjectMethodSink
+ }
+
+ override predicate isSanitizer(DataFlow::Node node) { node instanceof Sanitizer }
+}
+
+/**
+ * Tracks unsafe `TypeNameHandling` setting to `JsonConvert` call
+ */
+class TypeNameTrackingConfig extends DataFlow::Configuration {
+ TypeNameTrackingConfig() { this = "TypeNameTrackingConfig" }
+
+ override predicate isSource(DataFlow::Node source) {
+ (
+ source.asExpr() instanceof MemberConstantAccess and
+ source.getType() instanceof TypeNameHandlingEnum
+ or
+ source.asExpr() instanceof IntegerLiteral
+ ) and
+ source.asExpr().hasValue() and
+ not source.asExpr().getValue() = "0"
+ }
+
+ override predicate isSink(DataFlow::Node sink) {
+ exists(MethodCall mc, Method m, Expr expr |
+ m = mc.getTarget() and
+ (
+ not mc.getArgument(0).hasValue() and
+ m instanceof NewtonsoftJsonConvertClassDeserializeObjectMethod
+ ) and
+ expr = mc.getAnArgument() and
+ sink.asExpr() = expr and
+ expr.getType() instanceof JsonSerializerSettingsClass
+ )
+ }
+
+ override predicate isAdditionalFlowStep(DataFlow::Node node1, DataFlow::Node node2) {
+ node1.asExpr() instanceof IntegerLiteral and
+ node2.asExpr().(CastExpr).getExpr() = node1.asExpr()
+ or
+ node1.getType() instanceof TypeNameHandlingEnum and
+ exists(PropertyWrite pw, Property p, Assignment a |
+ a.getLValue() = pw and
+ pw.getProperty() = p and
+ p.getDeclaringType() instanceof JsonSerializerSettingsClass and
+ p.hasName("TypeNameHandling") and
+ (
+ node1.asExpr() = a.getRValue() and
+ node2.asExpr() = pw.getQualifier()
+ or
+ exists(ObjectInitializer oi |
+ node1.asExpr() = oi.getAMemberInitializer().getRValue() and
+ node2.asExpr() = oi
+ )
+ )
+ )
+ }
+}
+
+/**
+ * User input to static method or constructor call deserialization flow tracking.
+ */
+class TaintToConstructorOrStaticMethodTrackingConfig extends TaintTracking::Configuration {
+ TaintToConstructorOrStaticMethodTrackingConfig() {
+ this = "TaintToConstructorOrStaticMethodTrackingConfig"
+ }
+
+ override predicate isSource(DataFlow::Node source) { source instanceof Source }
+
+ override predicate isSink(DataFlow::Node sink) { sink instanceof ConstructorOrStaticMethodSink }
+
+ override predicate isSanitizer(DataFlow::Node node) { node instanceof Sanitizer }
+}
+
+/**
+ * User input to instance type flow tracking.
+ */
+class TaintToObjectTypeTrackingConfig extends TaintTracking2::Configuration {
+ TaintToObjectTypeTrackingConfig() { this = "TaintToObjectTypeTrackingConfig" }
+
+ override predicate isSource(DataFlow::Node source) { source instanceof Source }
+
+ override predicate isSink(DataFlow::Node sink) {
+ exists(MethodCall mc |
+ mc.getTarget() instanceof UnsafeDeserializer and
+ sink.asExpr() = mc.getQualifier()
+ )
+ }
+
+ override predicate isAdditionalTaintStep(DataFlow::Node n1, DataFlow::Node n2) {
+ exists(MethodCall mc, Method m |
+ m = mc.getTarget() and
+ m.getDeclaringType().hasQualifiedName("System.Type") and
+ m.hasName("GetType") and
+ m.isStatic() and
+ n1.asExpr() = mc.getArgument(0) and
+ n2.asExpr() = mc
+ )
+ or
+ exists(ObjectCreation oc |
+ n1.asExpr() = oc.getAnArgument() and
+ n2.asExpr() = oc and
+ oc.getObjectType() instanceof StrongTypeDeserializer
+ )
+ }
+}
+
+/**
+ * Unsafe deserializer creation to usage tracking config.
+ */
+class WeakTypeCreationToUsageTrackingConfig extends TaintTracking2::Configuration {
+ WeakTypeCreationToUsageTrackingConfig() { this = "DeserializerCreationToUsageTrackingConfig" }
+
+ override predicate isSource(DataFlow::Node source) {
+ exists(ObjectCreation oc |
+ oc.getObjectType() instanceof WeakTypeDeserializer and
+ source.asExpr() = oc
+ )
+ }
+
+ override predicate isSink(DataFlow::Node sink) {
+ exists(MethodCall mc |
+ mc.getTarget() instanceof UnsafeDeserializer and
+ sink.asExpr() = mc.getQualifier()
+ )
+ }
+}
+
+/**
+ * Safe deserializer creation to usage tracking config.
+ */
+abstract class SafeConstructorTrackingConfig extends TaintTracking2::Configuration {
+ bindingset[this]
+ SafeConstructorTrackingConfig() { any() }
+}
+
+/** BinaryFormatter */
+private predicate isBinaryFormatterCall(MethodCall mc, Method m) {
+ m = mc.getTarget() and
+ (
+ not mc.getArgument(0).hasValue() and
+ (
+ m instanceof BinaryFormatterDeserializeMethod
+ or
+ m instanceof BinaryFormatterUnsafeDeserializeMethod
+ or
+ m instanceof BinaryFormatterUnsafeDeserializeMethodResponseMethod
+ )
+ )
+}
+
+abstract private class BinaryFormatterSink extends InstanceMethodSink { }
+
+private class BinaryFormatterDeserializeMethodSink extends BinaryFormatterSink {
+ BinaryFormatterDeserializeMethodSink() {
+ exists(MethodCall mc, Method m |
+ isBinaryFormatterCall(mc, m) and
+ this.asExpr() = mc.getArgument(0)
+ )
+ }
+}
+
+/** SoapFormatter */
+private predicate isSoapFormatterCall(MethodCall mc, Method m) {
+ m = mc.getTarget() and
+ m instanceof SoapFormatterDeserializeMethod and
+ not mc.getArgument(0).hasValue()
+}
+
+abstract private class SoapFormatterSink extends InstanceMethodSink { }
+
+private class SoapFormatterDeserializeMethodSink extends SoapFormatterSink {
+ SoapFormatterDeserializeMethodSink() {
+ exists(MethodCall mc, Method m |
+ isSoapFormatterCall(mc, m) and
+ this.asExpr() = mc.getArgument(0)
+ )
+ }
+}
+
+/** ObjectStateFormatter */
+private predicate isObjectStateFormatterCall(MethodCall mc, Method m) {
+ m = mc.getTarget() and
+ m instanceof ObjectStateFormatterDeserializeMethod and
+ not mc.getArgument(0).hasValue()
+}
+
+abstract private class ObjectStateFormatterSink extends InstanceMethodSink { }
+
+private class ObjectStateFormatterDeserializeMethodSink extends ObjectStateFormatterSink {
+ ObjectStateFormatterDeserializeMethodSink() {
+ exists(MethodCall mc, Method m |
+ isObjectStateFormatterCall(mc, m) and
+ this.asExpr() = mc.getArgument(0)
+ )
+ }
+}
+
+/** NetDataContractSerializer */
+private predicate isNetDataContractSerializerCall(MethodCall mc, Method m) {
+ m = mc.getTarget() and
+ (
+ (
+ m instanceof NetDataContractSerializerDeserializeMethod
+ or
+ m instanceof NetDataContractSerializerReadObjectMethod
+ ) and
+ not mc.getArgument(0).hasValue()
+ )
+}
+
+abstract private class NetDataContractSerializerSink extends InstanceMethodSink { }
+
+private class NetDataContractSerializerDeserializeMethodSink extends NetDataContractSerializerSink {
+ NetDataContractSerializerDeserializeMethodSink() {
+ exists(MethodCall mc, Method m |
+ isNetDataContractSerializerCall(mc, m) and
+ this.asExpr() = mc.getArgument(0)
+ )
+ }
+}
+
+/** DataContractJsonSerializer */
+private predicate isDataContractJsonSerializerCall(MethodCall mc, Method m) {
+ m = mc.getTarget() and
+ m instanceof DataContractJsonSerializerReadObjectMethod and
+ not mc.getArgument(0).hasValue()
+}
+
+abstract private class DataContractJsonSerializerSink extends InstanceMethodSink { }
+
+private class DataContractJsonSerializerDeserializeMethodSink extends DataContractJsonSerializerSink {
+ DataContractJsonSerializerDeserializeMethodSink() {
+ exists(MethodCall mc, Method m |
+ isDataContractJsonSerializerCall(mc, m) and
+ this.asExpr() = mc.getArgument(0)
+ )
+ }
+}
+
+private class DataContractJsonSafeConstructorTrackingConfiguration extends SafeConstructorTrackingConfig {
+ DataContractJsonSafeConstructorTrackingConfiguration() {
+ this = "DataContractJsonSafeConstructorTrackingConfiguration"
+ }
+
+ override predicate isSource(DataFlow::Node source) {
+ exists(ObjectCreation oc |
+ oc = source.asExpr() and
+ exists(Constructor c |
+ c = oc.getTarget() and
+ c.getDeclaringType() instanceof DataContractJsonSerializerClass and
+ c.getNumberOfParameters() > 0 and
+ oc.getArgument(0) instanceof TypeofExpr
+ )
+ )
+ }
+
+ override predicate isSink(DataFlow::Node sink) {
+ exists(MethodCall mc, Method m |
+ isDataContractJsonSerializerCall(mc, m) and
+ mc.getQualifier() = sink.asExpr()
+ )
+ }
+}
+
+/** JavaScriptSerializer */
+private predicate isJavaScriptSerializerCall(MethodCall mc, Method m) {
+ m = mc.getTarget() and
+ (
+ (
+ m instanceof JavaScriptSerializerClassDeserializeMethod
+ or
+ m instanceof JavaScriptSerializerClassDeserializeObjectMethod
+ ) and
+ not mc.getArgument(0).hasValue()
+ )
+}
+
+abstract private class JavaScriptSerializerSink extends InstanceMethodSink { }
+
+private class JavaScriptSerializerDeserializeMethodSink extends JavaScriptSerializerSink {
+ JavaScriptSerializerDeserializeMethodSink() {
+ exists(MethodCall mc, Method m |
+ isJavaScriptSerializerCall(mc, m) and
+ this.asExpr() = mc.getArgument(0)
+ )
+ }
+}
+
+private class JavaScriptSerializerSafeConstructorTrackingConfiguration extends SafeConstructorTrackingConfig {
+ JavaScriptSerializerSafeConstructorTrackingConfiguration() {
+ this = "JavaScriptSerializerSafeConstructorTrackingConfiguration"
+ }
+
+ override predicate isSource(DataFlow::Node source) {
+ exists(ObjectCreation oc |
+ oc = source.asExpr() and
+ exists(Constructor c |
+ c = oc.getTarget() and
+ c.getDeclaringType() instanceof JavaScriptSerializerClass and
+ c.getNumberOfParameters() = 0
+ )
+ )
+ }
+
+ override predicate isSink(DataFlow::Node sink) {
+ exists(MethodCall mc, Method m |
+ isJavaScriptSerializerCall(mc, m) and
+ mc.getQualifier() = sink.asExpr()
+ )
+ }
+}
+
+/** XmlObjectSerializer */
+private predicate isXmlObjectSerializerCall(MethodCall mc, Method m) {
+ m = mc.getTarget() and
+ m instanceof XmlObjectSerializerReadObjectMethod and
+ not mc.getArgument(0).hasValue() and
+ not mc.targetIsLocalInstance()
+}
+
+abstract private class XmlObjectSerializerSink extends InstanceMethodSink { }
+
+private class XmlObjectSerializerDeserializeMethodSink extends XmlObjectSerializerSink {
+ XmlObjectSerializerDeserializeMethodSink() {
+ exists(MethodCall mc, Method m |
+ isXmlObjectSerializerCall(mc, m) and
+ this.asExpr() = mc.getArgument(0)
+ )
+ }
+}
+
+private class XmlObjectSerializerDerivedConstructorTrackingConfiguration extends SafeConstructorTrackingConfig {
+ XmlObjectSerializerDerivedConstructorTrackingConfiguration() {
+ this = "XmlObjectSerializerDerivedConstructorTrackingConfiguration"
+ }
+
+ override predicate isSource(DataFlow::Node source) {
+ exists(ObjectCreation oc |
+ oc = source.asExpr() and
+ exists(ValueOrRefType declaringType |
+ declaringType = oc.getTarget().getDeclaringType() and
+ declaringType.getABaseType+() instanceof XmlObjectSerializerClass and
+ not (
+ declaringType instanceof DataContractSerializerClass or
+ declaringType instanceof NetDataContractSerializerClass
+ )
+ )
+ )
+ }
+
+ override predicate isSink(DataFlow::Node sink) {
+ exists(MethodCall mc, Method m |
+ isXmlObjectSerializerCall(mc, m) and
+ mc.getQualifier() = sink.asExpr()
+ )
+ }
+}
+
+/** XmlSerializer */
+private predicate isXmlSerializerCall(MethodCall mc, Method m) {
+ m = mc.getTarget() and
+ m instanceof XmlSerializerDeserializeMethod and
+ not mc.getArgument(0).hasValue()
+}
+
+abstract private class XmlSerializerSink extends InstanceMethodSink { }
+
+private class XmlSerializerDeserializeMethodSink extends XmlSerializerSink {
+ XmlSerializerDeserializeMethodSink() {
+ exists(MethodCall mc, Method m |
+ isXmlSerializerCall(mc, m) and
+ this.asExpr() = mc.getArgument(0)
+ )
+ }
+}
+
+private class XmlSerializerSafeConstructorTrackingConfiguration extends SafeConstructorTrackingConfig {
+ XmlSerializerSafeConstructorTrackingConfiguration() {
+ this = "XmlSerializerSafeConstructorTrackingConfiguration"
+ }
+
+ override predicate isSource(DataFlow::Node source) {
+ exists(ObjectCreation oc |
+ oc = source.asExpr() and
+ exists(Constructor c |
+ c = oc.getTarget() and
+ c.getDeclaringType() instanceof XmlSerializerClass and
+ c.getNumberOfParameters() > 0 and
+ oc.getArgument(0) instanceof TypeofExpr
+ )
+ )
+ }
+
+ override predicate isSink(DataFlow::Node sink) {
+ exists(MethodCall mc, Method m |
+ isXmlSerializerCall(mc, m) and
+ mc.getQualifier() = sink.asExpr()
+ )
+ }
+}
+
+/** DataContractSerializer */
+private predicate isDataContractSerializerCall(MethodCall mc, Method m) {
+ m = mc.getTarget() and
+ (
+ m instanceof DataContractSerializerReadObjectMethod
+ or
+ m instanceof XmlObjectSerializerReadObjectMethod
+ ) and
+ not mc.getArgument(0).hasValue()
+}
+
+abstract private class DataContractSerializerSink extends InstanceMethodSink { }
+
+private class DataContractSerializerDeserializeMethodSink extends DataContractSerializerSink {
+ DataContractSerializerDeserializeMethodSink() {
+ exists(MethodCall mc, Method m |
+ isDataContractSerializerCall(mc, m) and
+ this.asExpr() = mc.getArgument(0)
+ )
+ }
+}
+
+private class DataContractSerializerSafeConstructorTrackingConfiguration extends SafeConstructorTrackingConfig {
+ DataContractSerializerSafeConstructorTrackingConfiguration() {
+ this = "DataContractSerializerSafeConstructorTrackingConfiguration"
+ }
+
+ override predicate isSource(DataFlow::Node source) {
+ exists(ObjectCreation oc |
+ oc = source.asExpr() and
+ exists(Constructor c |
+ c = oc.getTarget() and
+ c.getDeclaringType() instanceof DataContractSerializerClass and
+ c.getNumberOfParameters() > 0 and
+ oc.getArgument(0) instanceof TypeofExpr
+ )
+ )
+ }
+
+ override predicate isSink(DataFlow::Node sink) {
+ exists(MethodCall mc, Method m |
+ isDataContractSerializerCall(mc, m) and
+ mc.getQualifier() = sink.asExpr()
+ )
+ }
+}
+
+/** XmlMessageFormatter */
+private predicate isXmlMessageFormatterCall(MethodCall mc, Method m) {
+ m = mc.getTarget() and
+ m instanceof XmlMessageFormatterReadMethod and
+ not mc.getArgument(0).hasValue()
+}
+
+abstract private class XmlMessageFormatterSink extends InstanceMethodSink { }
+
+private class XmlMessageFormatterDeserializeMethodSink extends XmlMessageFormatterSink {
+ XmlMessageFormatterDeserializeMethodSink() {
+ exists(MethodCall mc, Method m |
+ isXmlMessageFormatterCall(mc, m) and
+ this.asExpr() = mc.getArgument(0)
+ )
+ }
+}
+
+private class XmlMessageFormatterSafeConstructorTrackingConfiguration extends SafeConstructorTrackingConfig {
+ XmlMessageFormatterSafeConstructorTrackingConfiguration() {
+ this = "XmlMessageFormatterSafeConstructorTrackingConfiguration"
+ }
+
+ override predicate isSource(DataFlow::Node source) {
+ exists(ObjectCreation oc |
+ oc = source.asExpr() and
+ exists(Constructor c |
+ c = oc.getTarget() and
+ c.getDeclaringType() instanceof XmlMessageFormatterClass and
+ c.getNumberOfParameters() > 0 and
+ oc.getArgument(0) instanceof TypeofExpr
+ )
+ )
+ }
+
+ override predicate isSink(DataFlow::Node sink) {
+ exists(MethodCall mc, Method m |
+ isXmlMessageFormatterCall(mc, m) and
+ mc.getQualifier() = sink.asExpr()
+ )
+ }
+}
+
+/** LosFormatter */
+private predicate isLosFormatterCall(MethodCall mc, Method m) {
+ m = mc.getTarget() and
+ m instanceof LosFormatterDeserializeMethod and
+ not mc.getArgument(0).hasValue()
+}
+
+abstract private class LosFormatterSink extends InstanceMethodSink { }
+
+private class LosFormatterDeserializeMethodSink extends LosFormatterSink {
+ LosFormatterDeserializeMethodSink() {
+ exists(MethodCall mc, Method m |
+ isLosFormatterCall(mc, m) and
+ this.asExpr() = mc.getArgument(0)
+ )
+ }
+}
+
+/** fastJSON */
+private predicate isFastJsonCall(MethodCall mc, Method m) {
+ m = mc.getTarget() and
+ m instanceof FastJsonClassToObjectMethod and
+ not mc.getArgument(0).hasValue()
+}
+
+abstract private class FastJsonSink extends ConstructorOrStaticMethodSink { }
+
+private class FastJsonDeserializeMethodSink extends FastJsonSink {
+ FastJsonDeserializeMethodSink() {
+ exists(MethodCall mc, Method m |
+ isFastJsonCall(mc, m) and
+ this.asExpr() = mc.getArgument(0)
+ )
+ }
+}
+
+/** Activity */
+private predicate isActivityCall(MethodCall mc, Method m) {
+ m = mc.getTarget() and
+ m instanceof ActivityLoadMethod and
+ not mc.getArgument(0).hasValue()
+}
+
+abstract private class ActivitySink extends InstanceMethodSink { }
+
+private class ActivityDeserializeMethodSink extends ActivitySink {
+ ActivityDeserializeMethodSink() {
+ exists(MethodCall mc, Method m |
+ isActivityCall(mc, m) and
+ this.asExpr() = mc.getArgument(0)
+ )
+ }
+}
+
+/** ResourceReader */
+private predicate isResourceReaderCall(Call mc, Constructor m) {
+ m = mc.getTarget() and
+ m instanceof ResourceReaderConstructor and
+ not mc.getArgument(0).hasValue()
+}
+
+abstract private class ResourceReaderSink extends ConstructorOrStaticMethodSink { }
+
+private class ResourceReaderDeserializeMethodSink extends ResourceReaderSink {
+ ResourceReaderDeserializeMethodSink() {
+ exists(Call mc, Constructor m |
+ isResourceReaderCall(mc, m) and
+ this.asExpr() = mc.getArgument(0)
+ )
+ }
+}
+
+/** BinaryMessageFormatter */
+private predicate isBinaryMessageFormatterCall(MethodCall mc, Method m) {
+ m = mc.getTarget() and
+ m instanceof BinaryMessageFormatterReadMethod and
+ not mc.getArgument(0).hasValue()
+}
+
+abstract private class BinaryMessageFormatterSink extends InstanceMethodSink { }
+
+private class BinaryMessageFormatterDeserializeMethodSink extends BinaryMessageFormatterSink {
+ BinaryMessageFormatterDeserializeMethodSink() {
+ exists(MethodCall mc, Method m |
+ isBinaryMessageFormatterCall(mc, m) and
+ this.asExpr() = mc.getArgument(0)
+ )
+ }
+}
+
+/** XamlReader */
+private predicate isXamlReaderCall(MethodCall mc, Method m) {
+ m = mc.getTarget() and
+ (
+ m instanceof XamlReaderParseMethod
+ or
+ m instanceof XamlReaderLoadMethod
+ or
+ m instanceof XamlReaderLoadAsyncMethod
+ ) and
+ not mc.getArgument(0).hasValue()
+}
+
+abstract private class XamlReaderSink extends ConstructorOrStaticMethodSink { }
+
+private class XamlReaderDeserializeMethodSink extends XamlReaderSink {
+ XamlReaderDeserializeMethodSink() {
+ exists(MethodCall mc, Method m |
+ isXamlReaderCall(mc, m) and
+ this.asExpr() = mc.getArgument(0)
+ )
+ }
+}
+
+/** ProxyObject */
+private predicate isProxyObjectCall(MethodCall mc, Method m) {
+ m = mc.getTarget() and
+ (
+ m instanceof ProxyObjectDecodeValueMethod
+ or
+ m instanceof ProxyObjectDecodeSerializedObjectMethod
+ ) and
+ not mc.getArgument(0).hasValue()
+}
+
+abstract private class ProxyObjectSink extends InstanceMethodSink { }
+
+private class ProxyObjectDeserializeMethodSink extends ProxyObjectSink {
+ ProxyObjectDeserializeMethodSink() {
+ exists(MethodCall mc, Method m |
+ isProxyObjectCall(mc, m) and
+ this.asExpr() = mc.getArgument(0)
+ )
+ }
+}
+
+/** SweetJayson */
+private predicate isSweetJaysonCall(MethodCall mc, Method m) {
+ m = mc.getTarget() and
+ m instanceof JaysonConverterToObjectMethod and
+ not mc.getArgument(0).hasValue()
+}
+
+abstract private class SweetJaysonSink extends ConstructorOrStaticMethodSink { }
+
+private class SweetJaysonDeserializeMethodSink extends SweetJaysonSink {
+ SweetJaysonDeserializeMethodSink() {
+ exists(MethodCall mc, Method m |
+ isSweetJaysonCall(mc, m) and
+ this.asExpr() = mc.getArgument(0)
+ )
+ }
+}
+
+/** ServiceStack.Text.JsonSerializer */
+abstract private class ServiceStackTextJsonSerializerSink extends ConstructorOrStaticMethodSink { }
+
+private class ServiceStackTextJsonSerializerDeserializeMethodSink extends ServiceStackTextJsonSerializerSink {
+ ServiceStackTextJsonSerializerDeserializeMethodSink() {
+ exists(MethodCall mc, Method m |
+ m = mc.getTarget() and
+ (
+ m instanceof ServiceStackTextJsonSerializerDeserializeFromStringMethod
+ or
+ m instanceof ServiceStackTextJsonSerializerDeserializeFromReaderMethod
+ or
+ m instanceof ServiceStackTextJsonSerializerDeserializeFromStreamMethod
+ ) and
+ exists(Expr arg |
+ arg = mc.getAnArgument() and
+ not arg.hasValue() and
+ not arg instanceof TypeofExpr and
+ this.asExpr() = arg
+ )
+ )
+ }
+}
+
+/** ServiceStack.Text.TypeSerializer */
+abstract private class ServiceStackTextTypeSerializerSink extends ConstructorOrStaticMethodSink { }
+
+private class ServiceStackTextTypeSerializerDeserializeMethodSink extends ServiceStackTextTypeSerializerSink {
+ ServiceStackTextTypeSerializerDeserializeMethodSink() {
+ exists(MethodCall mc, Method m |
+ m = mc.getTarget() and
+ (
+ m instanceof ServiceStackTextTypeSerializerDeserializeFromStringMethod
+ or
+ m instanceof ServiceStackTextTypeSerializerDeserializeFromReaderMethod
+ or
+ m instanceof ServiceStackTextTypeSerializerDeserializeFromStreamMethod
+ ) and
+ exists(Expr arg |
+ arg = mc.getAnArgument() and
+ not arg.hasValue() and
+ not arg instanceof TypeofExpr and
+ this.asExpr() = arg
+ )
+ )
+ }
+}
+
+/** ServiceStack.Text.CsvSerializer */
+abstract private class ServiceStackTextCsvSerializerSink extends ConstructorOrStaticMethodSink { }
+
+private class ServiceStackTextCsvSerializerDeserializeMethodSink extends ServiceStackTextCsvSerializerSink {
+ ServiceStackTextCsvSerializerDeserializeMethodSink() {
+ exists(MethodCall mc, Method m |
+ m = mc.getTarget() and
+ (
+ m instanceof ServiceStackTextCsvSerializerDeserializeFromStringMethod
+ or
+ m instanceof ServiceStackTextCsvSerializerDeserializeFromReaderMethod
+ or
+ m instanceof ServiceStackTextCsvSerializerDeserializeFromStreamMethod
+ ) and
+ exists(Expr arg |
+ arg = mc.getAnArgument() and
+ not arg.hasValue() and
+ not arg instanceof TypeofExpr and
+ this.asExpr() = arg
+ )
+ )
+ }
+}
+
+/** ServiceStack.Text.XmlSerializer */
+abstract private class ServiceStackTextXmlSerializerSink extends ConstructorOrStaticMethodSink { }
+
+private class ServiceStackTextXmlSerializerDeserializeMethodSink extends ServiceStackTextXmlSerializerSink {
+ ServiceStackTextXmlSerializerDeserializeMethodSink() {
+ exists(MethodCall mc, Method m |
+ m = mc.getTarget() and
+ (
+ m instanceof ServiceStackTextXmlSerializerDeserializeFromStringMethod
+ or
+ m instanceof ServiceStackTextXmlSerializerDeserializeFromReaderMethod
+ or
+ m instanceof ServiceStackTextXmlSerializerDeserializeFromStreamMethod
+ ) and
+ exists(Expr arg |
+ arg = mc.getAnArgument() and
+ not arg.hasValue() and
+ not arg instanceof TypeofExpr and
+ this.asExpr() = arg
+ )
+ )
+ }
+}
+
+/** FsPickler */
+private predicate isWeakTypeFsPicklerCall(MethodCall mc, Method m) {
+ m = mc.getTarget() and
+ (
+ m instanceof FsPicklerSerializerClassUnPickleUntypedMethod or
+ m instanceof FsPicklerSerializerClassDeserializeUntypedMethod or
+ m instanceof FsPicklerSerializerClassDeserializeSequenceUntypedMethod
+ ) and
+ not mc.getArgument(0).hasValue()
+}
+
+abstract private class FsPicklerWeakTypeSink extends ConstructorOrStaticMethodSink { }
+
+private class FsPicklerDeserializeWeakTypeMethodSink extends FsPicklerWeakTypeSink {
+ FsPicklerDeserializeWeakTypeMethodSink() {
+ exists(MethodCall mc, Method m |
+ isWeakTypeFsPicklerCall(mc, m) and
+ this.asExpr() = mc.getArgument(0)
+ )
+ }
+}
+
+private predicate isStrongTypeFsPicklerCall(MethodCall mc, Method m) {
+ m = mc.getTarget() and
+ (
+ m instanceof FsPicklerSerializerClassDeserializeMethod or
+ m instanceof FsPicklerSerializerClassDeserializeSequenceMethod or
+ m instanceof FsPicklerSerializerClasDeserializeSiftedMethod or
+ m instanceof FsPicklerSerializerClassUnPickleMethod or
+ m instanceof FsPicklerSerializerClassUnPickleSiftedMethod or
+ m instanceof CsPicklerSerializerClassDeserializeMethod or
+ m instanceof CsPicklerSerializerClassUnPickleMethod or
+ m instanceof CsPicklerSerializerClassUnPickleOfStringMethod
+ ) and
+ not mc.getArgument(0).hasValue()
+}
+
+abstract private class FsPicklerStrongTypeSink extends InstanceMethodSink { }
+
+private class FsPicklerDeserializeStrongTypeMethodSink extends FsPicklerStrongTypeSink {
+ FsPicklerDeserializeStrongTypeMethodSink() {
+ exists(MethodCall mc, Method m |
+ isStrongTypeFsPicklerCall(mc, m) and
+ this.asExpr() = mc.getArgument(0)
+ )
+ }
+}
+
+/** SharpSerializer */
+private class SharpSerializerDeserializeMethodSink extends InstanceMethodSink {
+ SharpSerializerDeserializeMethodSink() {
+ exists(MethodCall mc, Method m |
+ m = mc.getTarget() and
+ (
+ not mc.getArgument(0).hasValue() and
+ m instanceof SharpSerializerClassDeserializeMethod
+ ) and
+ this.asExpr() = mc.getArgument(0)
+ )
+ }
+}
+
+/** YamlDotNet */
+private class YamlDotNetDeserializerDeserializeMethodSink extends ConstructorOrStaticMethodSink {
+ YamlDotNetDeserializerDeserializeMethodSink() {
+ exists(MethodCall mc, Method m |
+ m = mc.getTarget() and
+ (
+ not mc.getArgument(0).hasValue() and
+ m instanceof YamlDotNetDeserializerClasseserializeMethod
+ ) and
+ this.asExpr() = mc.getArgument(0)
+ )
+ }
+}
+
+/** Newtonsoft.Json.JsonConvert */
+private class NewtonsoftJsonConvertDeserializeObjectMethodSink extends ConstructorOrStaticMethodSink {
+ NewtonsoftJsonConvertDeserializeObjectMethodSink() {
+ exists(MethodCall mc, Method m |
+ m = mc.getTarget() and
+ (
+ not mc.getArgument(0).hasValue() and
+ m instanceof NewtonsoftJsonConvertClassDeserializeObjectMethod
+ ) and
+ this.asExpr() = mc.getArgument(0)
+ )
+ }
+}
diff --git a/csharp/ql/src/semmle/code/csharp/security/dataflow/UrlRedirectQuery.qll b/csharp/ql/lib/semmle/code/csharp/security/dataflow/UrlRedirectQuery.qll
similarity index 100%
rename from csharp/ql/src/semmle/code/csharp/security/dataflow/UrlRedirectQuery.qll
rename to csharp/ql/lib/semmle/code/csharp/security/dataflow/UrlRedirectQuery.qll
diff --git a/csharp/ql/src/semmle/code/csharp/security/dataflow/XMLEntityInjectionQuery.qll b/csharp/ql/lib/semmle/code/csharp/security/dataflow/XMLEntityInjectionQuery.qll
similarity index 100%
rename from csharp/ql/src/semmle/code/csharp/security/dataflow/XMLEntityInjectionQuery.qll
rename to csharp/ql/lib/semmle/code/csharp/security/dataflow/XMLEntityInjectionQuery.qll
diff --git a/csharp/ql/src/semmle/code/csharp/security/dataflow/XPathInjectionQuery.qll b/csharp/ql/lib/semmle/code/csharp/security/dataflow/XPathInjectionQuery.qll
similarity index 100%
rename from csharp/ql/src/semmle/code/csharp/security/dataflow/XPathInjectionQuery.qll
rename to csharp/ql/lib/semmle/code/csharp/security/dataflow/XPathInjectionQuery.qll
diff --git a/csharp/ql/src/semmle/code/csharp/security/dataflow/XSSQuery.qll b/csharp/ql/lib/semmle/code/csharp/security/dataflow/XSSQuery.qll
similarity index 100%
rename from csharp/ql/src/semmle/code/csharp/security/dataflow/XSSQuery.qll
rename to csharp/ql/lib/semmle/code/csharp/security/dataflow/XSSQuery.qll
diff --git a/csharp/ql/src/semmle/code/csharp/security/dataflow/XSSSinks.qll b/csharp/ql/lib/semmle/code/csharp/security/dataflow/XSSSinks.qll
similarity index 100%
rename from csharp/ql/src/semmle/code/csharp/security/dataflow/XSSSinks.qll
rename to csharp/ql/lib/semmle/code/csharp/security/dataflow/XSSSinks.qll
diff --git a/csharp/ql/src/semmle/code/csharp/security/dataflow/ZipSlipQuery.qll b/csharp/ql/lib/semmle/code/csharp/security/dataflow/ZipSlipQuery.qll
similarity index 100%
rename from csharp/ql/src/semmle/code/csharp/security/dataflow/ZipSlipQuery.qll
rename to csharp/ql/lib/semmle/code/csharp/security/dataflow/ZipSlipQuery.qll
diff --git a/csharp/ql/src/semmle/code/csharp/security/dataflow/flowsinks/Email.qll b/csharp/ql/lib/semmle/code/csharp/security/dataflow/flowsinks/Email.qll
similarity index 100%
rename from csharp/ql/src/semmle/code/csharp/security/dataflow/flowsinks/Email.qll
rename to csharp/ql/lib/semmle/code/csharp/security/dataflow/flowsinks/Email.qll
diff --git a/csharp/ql/src/semmle/code/csharp/security/dataflow/flowsinks/ExternalLocationSink.qll b/csharp/ql/lib/semmle/code/csharp/security/dataflow/flowsinks/ExternalLocationSink.qll
similarity index 100%
rename from csharp/ql/src/semmle/code/csharp/security/dataflow/flowsinks/ExternalLocationSink.qll
rename to csharp/ql/lib/semmle/code/csharp/security/dataflow/flowsinks/ExternalLocationSink.qll
diff --git a/csharp/ql/src/semmle/code/csharp/security/dataflow/flowsinks/Html.qll b/csharp/ql/lib/semmle/code/csharp/security/dataflow/flowsinks/Html.qll
similarity index 100%
rename from csharp/ql/src/semmle/code/csharp/security/dataflow/flowsinks/Html.qll
rename to csharp/ql/lib/semmle/code/csharp/security/dataflow/flowsinks/Html.qll
diff --git a/csharp/ql/src/semmle/code/csharp/security/dataflow/flowsinks/Remote.qll b/csharp/ql/lib/semmle/code/csharp/security/dataflow/flowsinks/Remote.qll
similarity index 100%
rename from csharp/ql/src/semmle/code/csharp/security/dataflow/flowsinks/Remote.qll
rename to csharp/ql/lib/semmle/code/csharp/security/dataflow/flowsinks/Remote.qll
diff --git a/csharp/ql/src/semmle/code/csharp/security/dataflow/flowsources/Local.qll b/csharp/ql/lib/semmle/code/csharp/security/dataflow/flowsources/Local.qll
similarity index 100%
rename from csharp/ql/src/semmle/code/csharp/security/dataflow/flowsources/Local.qll
rename to csharp/ql/lib/semmle/code/csharp/security/dataflow/flowsources/Local.qll
diff --git a/csharp/ql/src/semmle/code/csharp/security/dataflow/flowsources/Remote.qll b/csharp/ql/lib/semmle/code/csharp/security/dataflow/flowsources/Remote.qll
similarity index 100%
rename from csharp/ql/src/semmle/code/csharp/security/dataflow/flowsources/Remote.qll
rename to csharp/ql/lib/semmle/code/csharp/security/dataflow/flowsources/Remote.qll
diff --git a/csharp/ql/src/semmle/code/csharp/security/dataflow/flowsources/Stored.qll b/csharp/ql/lib/semmle/code/csharp/security/dataflow/flowsources/Stored.qll
similarity index 100%
rename from csharp/ql/src/semmle/code/csharp/security/dataflow/flowsources/Stored.qll
rename to csharp/ql/lib/semmle/code/csharp/security/dataflow/flowsources/Stored.qll
diff --git a/csharp/ql/src/semmle/code/csharp/security/xml/InsecureXMLQuery.qll b/csharp/ql/lib/semmle/code/csharp/security/xml/InsecureXMLQuery.qll
similarity index 100%
rename from csharp/ql/src/semmle/code/csharp/security/xml/InsecureXMLQuery.qll
rename to csharp/ql/lib/semmle/code/csharp/security/xml/InsecureXMLQuery.qll
diff --git a/csharp/ql/lib/semmle/code/csharp/serialization/Deserializers.qll b/csharp/ql/lib/semmle/code/csharp/serialization/Deserializers.qll
new file mode 100644
index 00000000000..c395840c032
--- /dev/null
+++ b/csharp/ql/lib/semmle/code/csharp/serialization/Deserializers.qll
@@ -0,0 +1,671 @@
+/**
+ * Provides a library of known unsafe deserializers.
+ * See https://www.blackhat.com/docs/us-17/thursday/us-17-Munoz-Friday-The-13th-Json-Attacks.pdf.
+ */
+
+import csharp
+import semmle.code.csharp.frameworks.JsonNET::JsonNET
+
+/** An unsafe deserializer. */
+abstract class UnsafeDeserializer extends Callable { }
+
+/** A deserializer exploitable only if user controls the expected object type. */
+class StrongTypeDeserializer extends Class {
+ StrongTypeDeserializer() {
+ this instanceof XmlSerializerClass
+ or
+ this instanceof DataContractJsonSerializerClass
+ or
+ this instanceof DataContractSerializerClass
+ or
+ this instanceof XmlMessageFormatterClass
+ or
+ this instanceof FsPicklerSerializerClass
+ or
+ this instanceof CsPicklerSerializerClass
+ or
+ this instanceof CsPicklerTextSerializerClass
+ }
+}
+
+/** A deserializer that doesn't make strong expected type check. */
+class WeakTypeDeserializer extends Class {
+ WeakTypeDeserializer() {
+ this instanceof BinaryFormatterClass
+ or
+ this instanceof SoapFormatterClass
+ or
+ this instanceof ObjectStateFormatterClass
+ or
+ this instanceof NetDataContractSerializerClass
+ or
+ this instanceof JavaScriptSerializerClass
+ or
+ this instanceof LosFormatterClass
+ or
+ this instanceof BinaryMessageFormatterClass
+ or
+ this instanceof FastJsonClass
+ or
+ this instanceof ActivityClass
+ or
+ this instanceof XamlReaderClass
+ or
+ this instanceof ProxyObjectClass
+ or
+ this instanceof ResourceReaderClass
+ or
+ this instanceof JaysonConverterClass
+ or
+ this instanceof ServiceStackTextJsonSerializerClass
+ or
+ this instanceof ServiceStackTextTypeSerializerClass
+ or
+ this instanceof ServiceStackTextCsvSerializerClass
+ or
+ this instanceof ServiceStackTextXmlSerializerClass
+ or
+ this instanceof SharpSerializerClass
+ or
+ this instanceof YamlDotNetDeserializerClass
+ or
+ this instanceof JsonConvertClass
+ }
+}
+
+/**
+ * An unsafe deserializer method that calls any unsafe deserializer on any of
+ * the parameters.
+ */
+private class WrapperDeserializer extends UnsafeDeserializer {
+ WrapperDeserializer() {
+ exists(Call call |
+ call.getEnclosingCallable() = this and
+ call.getAnArgument() instanceof ParameterAccess and
+ call.getTarget() instanceof UnsafeDeserializer
+ )
+ }
+}
+
+/** BinaryFormatter */
+private class BinaryFormatterClass extends Class {
+ BinaryFormatterClass() {
+ this.hasQualifiedName("System.Runtime.Serialization.Formatters.Binary.BinaryFormatter")
+ }
+}
+
+/** `System.Runtime.Serialization.Formatters.Binary.BinaryFormatter.Deserialize` method */
+class BinaryFormatterDeserializeMethod extends Method, UnsafeDeserializer {
+ BinaryFormatterDeserializeMethod() {
+ this.getDeclaringType() instanceof BinaryFormatterClass and
+ this.hasName("Deserialize")
+ }
+}
+
+/** `System.Runtime.Serialization.Formatters.Binary.BinaryFormatter.UnsafeDeserialize` method */
+class BinaryFormatterUnsafeDeserializeMethod extends Method, UnsafeDeserializer {
+ BinaryFormatterUnsafeDeserializeMethod() {
+ this.getDeclaringType() instanceof BinaryFormatterClass and
+ this.hasName("UnsafeDeserialize")
+ }
+}
+
+/** `System.Runtime.Serialization.Formatters.Binary.BinaryFormatter.UnsafeDeserializeMethodResponse` method */
+class BinaryFormatterUnsafeDeserializeMethodResponseMethod extends Method, UnsafeDeserializer {
+ BinaryFormatterUnsafeDeserializeMethodResponseMethod() {
+ this.getDeclaringType() instanceof BinaryFormatterClass and
+ this.hasName("UnsafeDeserializeMethodResponse")
+ }
+}
+
+/** SoapFormatter */
+private class SoapFormatterClass extends Class {
+ SoapFormatterClass() {
+ this.hasQualifiedName("System.Runtime.Serialization.Formatters.Soap.SoapFormatter")
+ }
+}
+
+/** `System.Runtime.Serialization.Formatters.Soap.SoapFormatter.Deserialize` method */
+class SoapFormatterDeserializeMethod extends Method, UnsafeDeserializer {
+ SoapFormatterDeserializeMethod() {
+ this.getDeclaringType() instanceof SoapFormatterClass and
+ this.hasName("Deserialize")
+ }
+}
+
+/** ObjectStateFormatter */
+private class ObjectStateFormatterClass extends Class {
+ ObjectStateFormatterClass() { this.hasQualifiedName("System.Web.UI.ObjectStateFormatter") }
+}
+
+/** `System.Web.UI.ObjectStateFormatter.Deserialize` method */
+class ObjectStateFormatterDeserializeMethod extends Method, UnsafeDeserializer {
+ ObjectStateFormatterDeserializeMethod() {
+ this.getDeclaringType() instanceof ObjectStateFormatterClass and
+ this.hasName("Deserialize")
+ }
+}
+
+/** NetDataContractSerializer */
+class NetDataContractSerializerClass extends Class {
+ NetDataContractSerializerClass() {
+ this.hasQualifiedName("System.Runtime.Serialization.NetDataContractSerializer")
+ }
+}
+
+/** `System.Runtime.Serialization.NetDataContractSerializer.Deserialize` method */
+class NetDataContractSerializerDeserializeMethod extends Method, UnsafeDeserializer {
+ NetDataContractSerializerDeserializeMethod() {
+ this.getDeclaringType() instanceof NetDataContractSerializerClass and
+ this.hasName("Deserialize")
+ }
+}
+
+/** `System.Runtime.Serialization.NetDataContractSerializer.ReadObject` method */
+class NetDataContractSerializerReadObjectMethod extends Method, UnsafeDeserializer {
+ NetDataContractSerializerReadObjectMethod() {
+ this.getDeclaringType() instanceof NetDataContractSerializerClass and
+ this.hasName("ReadObject")
+ }
+}
+
+/** DataContractJsonSerializer */
+class DataContractJsonSerializerClass extends Class {
+ DataContractJsonSerializerClass() {
+ this.hasQualifiedName("System.Runtime.Serialization.Json.DataContractJsonSerializer")
+ }
+}
+
+/** `System.Runtime.Serialization.Json.DataContractJsonSerializer.ReadObject` method */
+class DataContractJsonSerializerReadObjectMethod extends Method, UnsafeDeserializer {
+ DataContractJsonSerializerReadObjectMethod() {
+ this.getDeclaringType() instanceof DataContractJsonSerializerClass and
+ this.hasName("ReadObject")
+ }
+}
+
+/** JavaScriptSerializer */
+class JavaScriptSerializerClass extends Class {
+ JavaScriptSerializerClass() {
+ this.hasQualifiedName("System.Web.Script.Serialization.JavaScriptSerializer")
+ }
+}
+
+/** `System.Web.Script.Serialization.JavaScriptSerializer.Deserialize` method */
+class JavaScriptSerializerClassDeserializeMethod extends Method, UnsafeDeserializer {
+ JavaScriptSerializerClassDeserializeMethod() {
+ this.getDeclaringType() instanceof JavaScriptSerializerClass and
+ this.hasName("Deserialize")
+ }
+}
+
+/** `System.Web.Script.Serialization.JavaScriptSerializer.DeserializeObject` method */
+class JavaScriptSerializerClassDeserializeObjectMethod extends Method, UnsafeDeserializer {
+ JavaScriptSerializerClassDeserializeObjectMethod() {
+ this.getDeclaringType() instanceof JavaScriptSerializerClass and
+ this.hasName("DeserializeObject")
+ }
+}
+
+/** XmlObjectSerializer */
+class XmlObjectSerializerClass extends Class {
+ XmlObjectSerializerClass() {
+ this.hasQualifiedName("System.Runtime.Serialization.XmlObjectSerializer")
+ }
+}
+
+/** `System.Runtime.Serialization.XmlObjectSerializer.ReadObject` method */
+class XmlObjectSerializerReadObjectMethod extends Method, UnsafeDeserializer {
+ XmlObjectSerializerReadObjectMethod() {
+ this.getDeclaringType() instanceof XmlObjectSerializerClass and
+ this.hasName("ReadObject")
+ }
+}
+
+/** XmlSerializer */
+class XmlSerializerClass extends Class {
+ XmlSerializerClass() { this.hasQualifiedName("System.Xml.Serialization.XmlSerializer") }
+}
+
+/** `System.Xml.Serialization.XmlSerializer.Deserialize` method */
+class XmlSerializerDeserializeMethod extends Method, UnsafeDeserializer {
+ XmlSerializerDeserializeMethod() {
+ this.getDeclaringType() instanceof XmlSerializerClass and
+ this.hasName("Deserialize")
+ }
+}
+
+/** DataContractSerializer */
+class DataContractSerializerClass extends Class {
+ DataContractSerializerClass() {
+ this.hasQualifiedName("System.Runtime.Serialization.DataContractSerializer")
+ }
+}
+
+/** `System.Runtime.Serialization.DataContractSerializer.ReadObject` method */
+class DataContractSerializerReadObjectMethod extends Method, UnsafeDeserializer {
+ DataContractSerializerReadObjectMethod() {
+ this.getDeclaringType() instanceof DataContractSerializerClass and
+ this.hasName("ReadObject")
+ }
+}
+
+/** XmlMessageFormatter */
+class XmlMessageFormatterClass extends Class {
+ XmlMessageFormatterClass() { this.hasQualifiedName("System.Messaging.XmlMessageFormatter") }
+}
+
+/** `System.Messaging.XmlMessageFormatter.Read` method */
+class XmlMessageFormatterReadMethod extends Method, UnsafeDeserializer {
+ XmlMessageFormatterReadMethod() {
+ this.getDeclaringType() instanceof XmlMessageFormatterClass and
+ this.hasName("Read")
+ }
+}
+
+/** LosFormatter */
+private class LosFormatterClass extends Class {
+ LosFormatterClass() { this.hasQualifiedName("System.Web.UI.LosFormatter") }
+}
+
+/** `System.Web.UI.LosFormatter.Deserialize` method */
+class LosFormatterDeserializeMethod extends Method, UnsafeDeserializer {
+ LosFormatterDeserializeMethod() {
+ this.getDeclaringType() instanceof LosFormatterClass and
+ this.hasName("Deserialize")
+ }
+}
+
+/** fastJSON */
+private class FastJsonClass extends Class {
+ FastJsonClass() { this.hasQualifiedName("fastJSON.JSON") }
+}
+
+/** `fastJSON.JSON.ToObject` method */
+class FastJsonClassToObjectMethod extends Method, UnsafeDeserializer {
+ FastJsonClassToObjectMethod() {
+ this.getDeclaringType() instanceof FastJsonClass and
+ this.hasName("ToObject") and
+ this.isStatic()
+ }
+}
+
+/** Activity */
+private class ActivityClass extends Class {
+ ActivityClass() { this.hasQualifiedName("System.Workflow.ComponentModel.Activity") }
+}
+
+/** `System.Workflow.ComponentModel.Activity.Load` method */
+class ActivityLoadMethod extends Method, UnsafeDeserializer {
+ ActivityLoadMethod() {
+ this.getDeclaringType() instanceof ActivityClass and
+ this.hasName("Load")
+ }
+}
+
+/** ResourceReader */
+private class ResourceReaderClass extends Class {
+ ResourceReaderClass() { this.hasQualifiedName("System.Resources.ResourceReader") }
+}
+
+/** `System.Resources.ResourceReader` constructor */
+class ResourceReaderConstructor extends Constructor, UnsafeDeserializer {
+ ResourceReaderConstructor() {
+ this.getDeclaringType() instanceof ResourceReaderClass and
+ this.hasName("ResourceReader")
+ }
+}
+
+/** BinaryMessageFormatter */
+private class BinaryMessageFormatterClass extends Class {
+ BinaryMessageFormatterClass() { this.hasQualifiedName("System.Messaging.BinaryMessageFormatter") }
+}
+
+/** `System.Messaging.BinaryMessageFormatter.Read` method */
+class BinaryMessageFormatterReadMethod extends Method, UnsafeDeserializer {
+ BinaryMessageFormatterReadMethod() {
+ this.getDeclaringType() instanceof BinaryMessageFormatterClass and
+ this.hasName("Read")
+ }
+}
+
+/** XamlReader */
+private class XamlReaderClass extends Class {
+ XamlReaderClass() { this.hasQualifiedName("System.Windows.Markup.XamlReader") }
+}
+
+/** `System.Windows.Markup.XamlReader.Parse` method */
+class XamlReaderParseMethod extends Method, UnsafeDeserializer {
+ XamlReaderParseMethod() {
+ this.getDeclaringType() instanceof XamlReaderClass and
+ this.hasName("Parse") and
+ this.isStatic()
+ }
+}
+
+/** `System.Windows.Markup.XamlReader.Load` method */
+class XamlReaderLoadMethod extends Method, UnsafeDeserializer {
+ XamlReaderLoadMethod() {
+ this.getDeclaringType() instanceof XamlReaderClass and
+ this.hasName("Load") and
+ this.isStatic()
+ }
+}
+
+/** `System.Windows.Markup.XamlReader.LoadAsync` method */
+class XamlReaderLoadAsyncMethod extends Method, UnsafeDeserializer {
+ XamlReaderLoadAsyncMethod() {
+ this.getDeclaringType() instanceof XamlReaderClass and
+ this.hasName("LoadAsync")
+ }
+}
+
+/** ProxyObject */
+private class ProxyObjectClass extends Class {
+ ProxyObjectClass() { this.hasQualifiedName("Microsoft.Web.Design.Remote.ProxyObject") }
+}
+
+/** `Microsoft.Web.Design.Remote.ProxyObject.DecodeValue` method */
+class ProxyObjectDecodeValueMethod extends Method, UnsafeDeserializer {
+ ProxyObjectDecodeValueMethod() {
+ this.getDeclaringType() instanceof ProxyObjectClass and
+ this.hasName("DecodeValue")
+ }
+}
+
+/** `Microsoft.Web.Design.Remote.ProxyObject.DecodeSerializedObject` method */
+class ProxyObjectDecodeSerializedObjectMethod extends Method, UnsafeDeserializer {
+ ProxyObjectDecodeSerializedObjectMethod() {
+ this.getDeclaringType() instanceof ProxyObjectClass and
+ this.hasName("DecodeSerializedObject")
+ }
+}
+
+/** SweetJayson */
+private class JaysonConverterClass extends Class {
+ JaysonConverterClass() { this.hasQualifiedName("Sweet.Jayson.JaysonConverter") }
+}
+
+/** `Sweet.Jayson.JaysonConverter.ToObject` method */
+class JaysonConverterToObjectMethod extends Method, UnsafeDeserializer {
+ JaysonConverterToObjectMethod() {
+ this.getDeclaringType() instanceof JaysonConverterClass and
+ this.hasName("ToObject") and
+ this.isStatic()
+ }
+}
+
+/** ServiceStack.Text.JsonSerializer */
+private class ServiceStackTextJsonSerializerClass extends Class {
+ ServiceStackTextJsonSerializerClass() {
+ this.hasQualifiedName("ServiceStack.Text.JsonSerializer")
+ }
+}
+
+/** `ServiceStack.Text.JsonSerializer.DeserializeFromString` method */
+class ServiceStackTextJsonSerializerDeserializeFromStringMethod extends Method, UnsafeDeserializer {
+ ServiceStackTextJsonSerializerDeserializeFromStringMethod() {
+ this.getDeclaringType() instanceof ServiceStackTextJsonSerializerClass and
+ this.hasName("DeserializeFromString") and
+ this.isStatic()
+ }
+}
+
+/** `ServiceStack.Text.JsonSerializer.DeserializeFromReader` method */
+class ServiceStackTextJsonSerializerDeserializeFromReaderMethod extends Method, UnsafeDeserializer {
+ ServiceStackTextJsonSerializerDeserializeFromReaderMethod() {
+ this.getDeclaringType() instanceof ServiceStackTextJsonSerializerClass and
+ this.hasName("DeserializeFromReader") and
+ this.isStatic()
+ }
+}
+
+/** `ServiceStack.Text.JsonSerializer.DeserializeFromStream` method */
+class ServiceStackTextJsonSerializerDeserializeFromStreamMethod extends Method, UnsafeDeserializer {
+ ServiceStackTextJsonSerializerDeserializeFromStreamMethod() {
+ this.getDeclaringType() instanceof ServiceStackTextJsonSerializerClass and
+ this.hasName("DeserializeFromStream") and
+ this.isStatic()
+ }
+}
+
+/** ServiceStack.Text.TypeSerializer */
+private class ServiceStackTextTypeSerializerClass extends Class {
+ ServiceStackTextTypeSerializerClass() {
+ this.hasQualifiedName("ServiceStack.Text.TypeSerializer")
+ }
+}
+
+/** `ServiceStack.Text.TypeSerializer.DeserializeFromString` method */
+class ServiceStackTextTypeSerializerDeserializeFromStringMethod extends Method, UnsafeDeserializer {
+ ServiceStackTextTypeSerializerDeserializeFromStringMethod() {
+ this.getDeclaringType() instanceof ServiceStackTextTypeSerializerClass and
+ this.hasName("DeserializeFromString") and
+ this.isStatic()
+ }
+}
+
+/** `ServiceStack.Text.TypeSerializer.DeserializeFromReader` method */
+class ServiceStackTextTypeSerializerDeserializeFromReaderMethod extends Method, UnsafeDeserializer {
+ ServiceStackTextTypeSerializerDeserializeFromReaderMethod() {
+ this.getDeclaringType() instanceof ServiceStackTextTypeSerializerClass and
+ this.hasName("DeserializeFromReader") and
+ this.isStatic()
+ }
+}
+
+/** `ServiceStack.Text.TypeSerializer.DeserializeFromStream` method */
+class ServiceStackTextTypeSerializerDeserializeFromStreamMethod extends Method, UnsafeDeserializer {
+ ServiceStackTextTypeSerializerDeserializeFromStreamMethod() {
+ this.getDeclaringType() instanceof ServiceStackTextTypeSerializerClass and
+ this.hasName("DeserializeFromStream") and
+ this.isStatic()
+ }
+}
+
+/** ServiceStack.Text.CsvSerializer */
+private class ServiceStackTextCsvSerializerClass extends Class {
+ ServiceStackTextCsvSerializerClass() { this.hasQualifiedName("ServiceStack.Text.CsvSerializer") }
+}
+
+/** `ServiceStack.Text.CsvSerializer.DeserializeFromString` method */
+class ServiceStackTextCsvSerializerDeserializeFromStringMethod extends Method, UnsafeDeserializer {
+ ServiceStackTextCsvSerializerDeserializeFromStringMethod() {
+ this.getDeclaringType() instanceof ServiceStackTextCsvSerializerClass and
+ this.hasName("DeserializeFromString") and
+ this.isStatic()
+ }
+}
+
+/** `ServiceStack.Text.TypeSeriCsvSerializeralizer.DeserializeFromReader` method */
+class ServiceStackTextCsvSerializerDeserializeFromReaderMethod extends Method, UnsafeDeserializer {
+ ServiceStackTextCsvSerializerDeserializeFromReaderMethod() {
+ this.getDeclaringType() instanceof ServiceStackTextCsvSerializerClass and
+ this.hasName("DeserializeFromReader") and
+ this.isStatic()
+ }
+}
+
+/** `ServiceStack.Text.CsvSerializer.DeserializeFromStream` method */
+class ServiceStackTextCsvSerializerDeserializeFromStreamMethod extends Method, UnsafeDeserializer {
+ ServiceStackTextCsvSerializerDeserializeFromStreamMethod() {
+ this.getDeclaringType() instanceof ServiceStackTextCsvSerializerClass and
+ this.hasName("DeserializeFromStream") and
+ this.isStatic()
+ }
+}
+
+/** ServiceStack.Text.XmlSerializer */
+private class ServiceStackTextXmlSerializerClass extends Class {
+ ServiceStackTextXmlSerializerClass() { this.hasQualifiedName("ServiceStack.Text.XmlSerializer") }
+}
+
+/** `ServiceStack.Text.XmlSerializer.DeserializeFromString` method */
+class ServiceStackTextXmlSerializerDeserializeFromStringMethod extends Method, UnsafeDeserializer {
+ ServiceStackTextXmlSerializerDeserializeFromStringMethod() {
+ this.getDeclaringType() instanceof ServiceStackTextXmlSerializerClass and
+ this.hasName("DeserializeFromString") and
+ this.isStatic()
+ }
+}
+
+/** `ServiceStack.Text.XmlSerializer.DeserializeFromReader` method */
+class ServiceStackTextXmlSerializerDeserializeFromReaderMethod extends Method, UnsafeDeserializer {
+ ServiceStackTextXmlSerializerDeserializeFromReaderMethod() {
+ this.getDeclaringType() instanceof ServiceStackTextXmlSerializerClass and
+ this.hasName("DeserializeFromReader") and
+ this.isStatic()
+ }
+}
+
+/** `ServiceStack.Text.XmlSerializer.DeserializeFromStream` method */
+class ServiceStackTextXmlSerializerDeserializeFromStreamMethod extends Method, UnsafeDeserializer {
+ ServiceStackTextXmlSerializerDeserializeFromStreamMethod() {
+ this.getDeclaringType() instanceof ServiceStackTextXmlSerializerClass and
+ this.hasName("DeserializeFromStream") and
+ this.isStatic()
+ }
+}
+
+/** MBrace.FsPickler.FsPicklerSerializer */
+private class FsPicklerSerializerClass extends Class {
+ FsPicklerSerializerClass() { this.hasQualifiedName("MBrace.FsPickler.FsPicklerSerializer") }
+}
+
+/** `MBrace.FsPickler.FsPicklerSerializer.Deserialize` method */
+class FsPicklerSerializerClassDeserializeMethod extends Method, UnsafeDeserializer {
+ FsPicklerSerializerClassDeserializeMethod() {
+ this.getDeclaringType().getBaseClass*() instanceof FsPicklerSerializerClass and
+ this.hasName("Deserialize")
+ }
+}
+
+/** `MBrace.FsPickler.FsPicklerSerializer.DeserializeSequence` method */
+class FsPicklerSerializerClassDeserializeSequenceMethod extends Method, UnsafeDeserializer {
+ FsPicklerSerializerClassDeserializeSequenceMethod() {
+ this.getDeclaringType().getBaseClass*() instanceof FsPicklerSerializerClass and
+ this.hasName("DeserializeSequence")
+ }
+}
+
+/** `MBrace.FsPickler.FsPicklerSerializer.DeserializeSifted` method */
+class FsPicklerSerializerClasDeserializeSiftedMethod extends Method, UnsafeDeserializer {
+ FsPicklerSerializerClasDeserializeSiftedMethod() {
+ this.getDeclaringType().getBaseClass*() instanceof FsPicklerSerializerClass and
+ this.hasName("DeserializeSifted")
+ }
+}
+
+/** `MBrace.FsPickler.FsPicklerSerializer.UnPickle` method */
+class FsPicklerSerializerClassUnPickleMethod extends Method, UnsafeDeserializer {
+ FsPicklerSerializerClassUnPickleMethod() {
+ this.getDeclaringType().getBaseClass*() instanceof FsPicklerSerializerClass and
+ this.hasName("UnPickle")
+ }
+}
+
+/** `MBrace.FsPickler.FsPicklerSerializer.UnPickleSifted` method */
+class FsPicklerSerializerClassUnPickleSiftedMethod extends Method, UnsafeDeserializer {
+ FsPicklerSerializerClassUnPickleSiftedMethod() {
+ this.getDeclaringType().getBaseClass*() instanceof FsPicklerSerializerClass and
+ this.hasName("UnPickleSifted")
+ }
+}
+
+/** `MBrace.FsPickler.FsPicklerSerializer.DeserializeUntyped` method */
+class FsPicklerSerializerClassDeserializeUntypedMethod extends Method, UnsafeDeserializer {
+ FsPicklerSerializerClassDeserializeUntypedMethod() {
+ this.getDeclaringType().getBaseClass*() instanceof FsPicklerSerializerClass and
+ this.hasName("DeserializeUntyped")
+ }
+}
+
+/** `MBrace.FsPickler.FsPicklerSerializer.DeserializeSequenceUntyped` method */
+class FsPicklerSerializerClassDeserializeSequenceUntypedMethod extends Method, UnsafeDeserializer {
+ FsPicklerSerializerClassDeserializeSequenceUntypedMethod() {
+ this.getDeclaringType().getBaseClass*() instanceof FsPicklerSerializerClass and
+ this.hasName("DeserializeSequenceUntyped")
+ }
+}
+
+/** `MBrace.FsPickler.FsPicklerSerializer.UnPickleUntyped` method */
+class FsPicklerSerializerClassUnPickleUntypedMethod extends Method, UnsafeDeserializer {
+ FsPicklerSerializerClassUnPickleUntypedMethod() {
+ this.getDeclaringType().getBaseClass*() instanceof FsPicklerSerializerClass and
+ this.hasName("UnPickleUntyped")
+ }
+}
+
+/** MBrace.CsPickler.CsPicklerSerializer */
+private class CsPicklerSerializerClass extends Class {
+ CsPicklerSerializerClass() { this.hasQualifiedName("MBrace.CsPickler.CsPicklerSerializer") }
+}
+
+/** `MBrace.FsPickler.CsPicklerSerializer.Deserialize` method */
+class CsPicklerSerializerClassDeserializeMethod extends Method, UnsafeDeserializer {
+ CsPicklerSerializerClassDeserializeMethod() {
+ this.getDeclaringType().getBaseClass*() instanceof CsPicklerSerializerClass and
+ this.hasName("Deserialize")
+ }
+}
+
+/** `MBrace.FsPickler.CsPicklerSerializer.UnPickle` method */
+class CsPicklerSerializerClassUnPickleMethod extends Method, UnsafeDeserializer {
+ CsPicklerSerializerClassUnPickleMethod() {
+ this.getDeclaringType().getBaseClass*() instanceof CsPicklerSerializerClass and
+ this.hasName("UnPickle")
+ }
+}
+
+/** MBrace.CsPickler.CsPicklerTextSerializer */
+private class CsPicklerTextSerializerClass extends Class {
+ CsPicklerTextSerializerClass() {
+ this.hasQualifiedName("MBrace.CsPickler.CsPicklerTextSerializer")
+ }
+}
+
+/** `MBrace.FsPickler.CsPicklerTextSerializer.UnPickleOfString` method */
+class CsPicklerSerializerClassUnPickleOfStringMethod extends Method, UnsafeDeserializer {
+ CsPicklerSerializerClassUnPickleOfStringMethod() {
+ this.getDeclaringType().getBaseClass*() instanceof CsPicklerTextSerializerClass and
+ this.hasName("UnPickleOfString")
+ }
+}
+
+/** Polenter.Serialization.SharpSerializer */
+private class SharpSerializerClass extends Class {
+ SharpSerializerClass() { this.hasQualifiedName("Polenter.Serialization.SharpSerializer") }
+}
+
+/** `Polenter.Serialization.SharpSerializer.Deserialize` method */
+class SharpSerializerClassDeserializeMethod extends Method, UnsafeDeserializer {
+ SharpSerializerClassDeserializeMethod() {
+ this.getDeclaringType().getBaseClass*() instanceof SharpSerializerClass and
+ this.hasName("Deserialize")
+ }
+}
+
+/** YamlDotNet.Serialization.Deserializer */
+private class YamlDotNetDeserializerClass extends Class {
+ YamlDotNetDeserializerClass() { this.hasQualifiedName("YamlDotNet.Serialization.Deserializer") }
+}
+
+/** `YamlDotNet.Serialization.Deserializer.Deserialize` method */
+class YamlDotNetDeserializerClasseserializeMethod extends Method, UnsafeDeserializer {
+ YamlDotNetDeserializerClasseserializeMethod() {
+ exists(YamlDotNetDeserializerClass c |
+ this.getDeclaringType().getBaseClass*() = c and
+ this.hasName("Deserialize") and
+ c.getALocation().(Assembly).getVersion().getMajor() < 5
+ )
+ }
+}
+
+/** `Newtonsoft.Json.JsonConvert.DeserializeObject` method */
+class NewtonsoftJsonConvertClassDeserializeObjectMethod extends Method, UnsafeDeserializer {
+ NewtonsoftJsonConvertClassDeserializeObjectMethod() {
+ this.getDeclaringType() instanceof JsonConvertClass and
+ this.hasName("DeserializeObject") and
+ this.isStatic()
+ }
+}
diff --git a/csharp/ql/src/semmle/code/csharp/serialization/Serialization.qll b/csharp/ql/lib/semmle/code/csharp/serialization/Serialization.qll
similarity index 100%
rename from csharp/ql/src/semmle/code/csharp/serialization/Serialization.qll
rename to csharp/ql/lib/semmle/code/csharp/serialization/Serialization.qll
diff --git a/csharp/ql/src/semmle/code/dotnet/Callable.qll b/csharp/ql/lib/semmle/code/dotnet/Callable.qll
similarity index 100%
rename from csharp/ql/src/semmle/code/dotnet/Callable.qll
rename to csharp/ql/lib/semmle/code/dotnet/Callable.qll
diff --git a/csharp/ql/src/semmle/code/dotnet/Declaration.qll b/csharp/ql/lib/semmle/code/dotnet/Declaration.qll
similarity index 100%
rename from csharp/ql/src/semmle/code/dotnet/Declaration.qll
rename to csharp/ql/lib/semmle/code/dotnet/Declaration.qll
diff --git a/csharp/ql/src/semmle/code/dotnet/DotNet.qll b/csharp/ql/lib/semmle/code/dotnet/DotNet.qll
similarity index 100%
rename from csharp/ql/src/semmle/code/dotnet/DotNet.qll
rename to csharp/ql/lib/semmle/code/dotnet/DotNet.qll
diff --git a/csharp/ql/src/semmle/code/dotnet/Element.qll b/csharp/ql/lib/semmle/code/dotnet/Element.qll
similarity index 94%
rename from csharp/ql/src/semmle/code/dotnet/Element.qll
rename to csharp/ql/lib/semmle/code/dotnet/Element.qll
index 1f23c43215d..3b1955887f9 100644
--- a/csharp/ql/src/semmle/code/dotnet/Element.qll
+++ b/csharp/ql/lib/semmle/code/dotnet/Element.qll
@@ -40,6 +40,11 @@ class Element extends @dotnet_element {
/** Gets the full textual representation of this element, including type information. */
string toStringWithTypes() { result = this.toString() }
+ /**
+ * Gets a comma-separated list of the names of the primary CodeQL classes to which this element belongs.
+ */
+ final string getPrimaryQlClasses() { result = concat(getAPrimaryQlClass(), ",") }
+
/**
* Gets the name of a primary CodeQL class to which this element belongs.
*
@@ -57,6 +62,7 @@ class Element extends @dotnet_element {
/** An element that has a name. */
class NamedElement extends Element, @dotnet_named_element {
/** Gets the name of this element. */
+ cached
string getName() { none() }
/** Holds if this element has name 'name'. */
diff --git a/csharp/ql/src/semmle/code/dotnet/Expr.qll b/csharp/ql/lib/semmle/code/dotnet/Expr.qll
similarity index 100%
rename from csharp/ql/src/semmle/code/dotnet/Expr.qll
rename to csharp/ql/lib/semmle/code/dotnet/Expr.qll
diff --git a/csharp/ql/src/semmle/code/dotnet/Generics.qll b/csharp/ql/lib/semmle/code/dotnet/Generics.qll
similarity index 100%
rename from csharp/ql/src/semmle/code/dotnet/Generics.qll
rename to csharp/ql/lib/semmle/code/dotnet/Generics.qll
diff --git a/csharp/ql/src/semmle/code/dotnet/Namespace.qll b/csharp/ql/lib/semmle/code/dotnet/Namespace.qll
similarity index 100%
rename from csharp/ql/src/semmle/code/dotnet/Namespace.qll
rename to csharp/ql/lib/semmle/code/dotnet/Namespace.qll
diff --git a/csharp/ql/src/semmle/code/dotnet/Parameterizable.qll b/csharp/ql/lib/semmle/code/dotnet/Parameterizable.qll
similarity index 100%
rename from csharp/ql/src/semmle/code/dotnet/Parameterizable.qll
rename to csharp/ql/lib/semmle/code/dotnet/Parameterizable.qll
diff --git a/csharp/ql/src/semmle/code/dotnet/Type.qll b/csharp/ql/lib/semmle/code/dotnet/Type.qll
similarity index 100%
rename from csharp/ql/src/semmle/code/dotnet/Type.qll
rename to csharp/ql/lib/semmle/code/dotnet/Type.qll
diff --git a/csharp/ql/src/semmle/code/dotnet/Utils.qll b/csharp/ql/lib/semmle/code/dotnet/Utils.qll
similarity index 100%
rename from csharp/ql/src/semmle/code/dotnet/Utils.qll
rename to csharp/ql/lib/semmle/code/dotnet/Utils.qll
diff --git a/csharp/ql/src/semmle/code/dotnet/Variable.qll b/csharp/ql/lib/semmle/code/dotnet/Variable.qll
similarity index 100%
rename from csharp/ql/src/semmle/code/dotnet/Variable.qll
rename to csharp/ql/lib/semmle/code/dotnet/Variable.qll
diff --git a/csharp/ql/src/semmle/files/FileSystem.qll b/csharp/ql/lib/semmle/files/FileSystem.qll
similarity index 100%
rename from csharp/ql/src/semmle/files/FileSystem.qll
rename to csharp/ql/lib/semmle/files/FileSystem.qll
diff --git a/csharp/ql/lib/semmlecode.csharp.dbscheme b/csharp/ql/lib/semmlecode.csharp.dbscheme
new file mode 100644
index 00000000000..0f562410898
--- /dev/null
+++ b/csharp/ql/lib/semmlecode.csharp.dbscheme
@@ -0,0 +1,2093 @@
+/* This is a dummy line to alter the dbscheme, so we can make a database upgrade
+ * without actually changing any of the dbscheme predicates. It contains a date
+ * to allow for such updates in the future as well.
+ *
+ * 2021-07-14
+ *
+ * DO NOT remove this comment carelessly, since it can revert the dbscheme back to a
+ * previously seen state (matching a previously seen SHA), which would make the upgrade
+ * mechanism not work properly.
+ */
+
+/**
+ * An invocation of the compiler. Note that more than one file may be
+ * compiled per invocation. For example, this command compiles three
+ * source files:
+ *
+ * csc f1.cs f2.cs f3.cs
+ *
+ * The `id` simply identifies the invocation, while `cwd` is the working
+ * directory from which the compiler was invoked.
+ */
+compilations(
+ unique int id : @compilation,
+ string cwd : string ref
+);
+
+/**
+ * The arguments that were passed to the extractor for a compiler
+ * invocation. If `id` is for the compiler invocation
+ *
+ * csc f1.cs f2.cs f3.cs
+ *
+ * then typically there will be rows for
+ *
+ * num | arg
+ * --- | ---
+ * 0 | --compiler
+ * 1 | *path to compiler*
+ * 2 | --cil
+ * 3 | f1.cs
+ * 4 | f2.cs
+ * 5 | f3.cs
+ */
+#keyset[id, num]
+compilation_args(
+ int id : @compilation ref,
+ int num : int ref,
+ string arg : string ref
+);
+
+/**
+ * The source files that are compiled by a compiler invocation.
+ * If `id` is for the compiler invocation
+ *
+ * csc f1.cs f2.cs f3.cs
+ *
+ * then there will be rows for
+ *
+ * num | arg
+ * --- | ---
+ * 0 | f1.cs
+ * 1 | f2.cs
+ * 2 | f3.cs
+ */
+#keyset[id, num]
+compilation_compiling_files(
+ int id : @compilation ref,
+ int num : int ref,
+ int file : @file ref
+);
+
+/**
+ * The references used by a compiler invocation.
+ * If `id` is for the compiler invocation
+ *
+ * csc f1.cs f2.cs f3.cs /r:ref1.dll /r:ref2.dll /r:ref3.dll
+ *
+ * then there will be rows for
+ *
+ * num | arg
+ * --- | ---
+ * 0 | ref1.dll
+ * 1 | ref2.dll
+ * 2 | ref3.dll
+ */
+#keyset[id, num]
+compilation_referencing_files(
+ int id : @compilation ref,
+ int num : int ref,
+ int file : @file ref
+);
+
+/**
+ * The time taken by the extractor for a compiler invocation.
+ *
+ * For each file `num`, there will be rows for
+ *
+ * kind | seconds
+ * ---- | ---
+ * 1 | CPU seconds used by the extractor frontend
+ * 2 | Elapsed seconds during the extractor frontend
+ * 3 | CPU seconds used by the extractor backend
+ * 4 | Elapsed seconds during the extractor backend
+ */
+#keyset[id, num, kind]
+compilation_time(
+ int id : @compilation ref,
+ int num : int ref,
+ /* kind:
+ 1 = frontend_cpu_seconds
+ 2 = frontend_elapsed_seconds
+ 3 = extractor_cpu_seconds
+ 4 = extractor_elapsed_seconds
+ */
+ int kind : int ref,
+ float seconds : float ref
+);
+
+/**
+ * An error or warning generated by the extractor.
+ * The diagnostic message `diagnostic` was generated during compiler
+ * invocation `compilation`, and is the `file_number_diagnostic_number`th
+ * message generated while extracting the `file_number`th file of that
+ * invocation.
+ */
+#keyset[compilation, file_number, file_number_diagnostic_number]
+diagnostic_for(
+ unique int diagnostic : @diagnostic ref,
+ int compilation : @compilation ref,
+ int file_number : int ref,
+ int file_number_diagnostic_number : int ref
+);
+
+diagnostics(
+ unique int id: @diagnostic,
+ int severity: int ref,
+ string error_tag: string ref,
+ string error_message: string ref,
+ string full_error_message: string ref,
+ int location: @location_default ref
+);
+
+extractor_messages(
+ unique int id: @extractor_message,
+ int severity: int ref,
+ string origin : string ref,
+ string text : string ref,
+ string entity : string ref,
+ int location: @location_default ref,
+ string stack_trace : string ref
+);
+
+/**
+ * If extraction was successful, then `cpu_seconds` and
+ * `elapsed_seconds` are the CPU time and elapsed time (respectively)
+ * that extraction took for compiler invocation `id`.
+ */
+compilation_finished(
+ unique int id : @compilation ref,
+ float cpu_seconds : float ref,
+ float elapsed_seconds : float ref
+);
+
+compilation_assembly(
+ unique int id : @compilation ref,
+ int assembly: @assembly ref
+)
+
+/*
+ * External artifacts
+ */
+
+externalDefects(
+ unique int id: @externalDefect,
+ string queryPath: string ref,
+ int location: @location ref,
+ string message: string ref,
+ float severity: float ref);
+
+externalMetrics(
+ unique int id: @externalMetric,
+ string queryPath: string ref,
+ int location: @location ref,
+ float value: float ref);
+
+externalData(
+ int id: @externalDataElement,
+ string path: string ref,
+ int column: int ref,
+ string value: string ref);
+
+snapshotDate(
+ unique date snapshotDate: date ref);
+
+sourceLocationPrefix(
+ string prefix: string ref);
+
+/*
+ * Duplicate code
+ */
+
+duplicateCode(
+ unique int id: @duplication,
+ string relativePath: string ref,
+ int equivClass: int ref);
+
+similarCode(
+ unique int id: @similarity,
+ string relativePath: string ref,
+ int equivClass: int ref);
+
+@duplication_or_similarity = @duplication | @similarity
+
+tokens(
+ int id: @duplication_or_similarity ref,
+ int offset: int ref,
+ int beginLine: int ref,
+ int beginColumn: int ref,
+ int endLine: int ref,
+ int endColumn: int ref);
+
+/*
+ * C# dbscheme
+ */
+
+/** ELEMENTS **/
+
+@element = @declaration | @stmt | @expr | @modifier | @attribute | @namespace_declaration
+ | @using_directive | @type_parameter_constraints | @external_element
+ | @xmllocatable | @asp_element | @namespace | @preprocessor_directive;
+
+@declaration = @callable | @generic | @assignable | @namespace;
+
+@named_element = @namespace | @declaration;
+
+@declaration_with_accessors = @property | @indexer | @event;
+
+@assignable = @variable | @assignable_with_accessors | @event;
+
+@assignable_with_accessors = @property | @indexer;
+
+@external_element = @externalMetric | @externalDefect | @externalDataElement;
+
+@attributable = @assembly | @field | @parameter | @operator | @method | @constructor
+ | @destructor | @callable_accessor | @value_or_ref_type | @declaration_with_accessors
+ | @local_function;
+
+/** LOCATIONS, ASEMMBLIES, MODULES, FILES and FOLDERS **/
+
+@location = @location_default | @assembly;
+
+locations_default(
+ unique int id: @location_default,
+ int file: @file ref,
+ int beginLine: int ref,
+ int beginColumn: int ref,
+ int endLine: int ref,
+ int endColumn: int ref);
+
+locations_mapped(
+ unique int id: @location_default ref,
+ int mapped_to: @location_default ref);
+
+@sourceline = @file | @callable | @xmllocatable;
+
+numlines(
+ int element_id: @sourceline ref,
+ int num_lines: int ref,
+ int num_code: int ref,
+ int num_comment: int ref);
+
+assemblies(
+ unique int id: @assembly,
+ int file: @file ref,
+ string fullname: string ref,
+ string name: string ref,
+ string version: string ref);
+
+/*
+ fromSource(0) = unknown,
+ fromSource(1) = from source,
+ fromSource(2) = from library
+*/
+files(
+ unique int id: @file,
+ string name: string ref,
+ string simple: string ref,
+ string ext: string ref,
+ int fromSource: int ref);
+
+folders(
+ unique int id: @folder,
+ string name: string ref,
+ string simple: string ref);
+
+@container = @folder | @file ;
+
+containerparent(
+ int parent: @container ref,
+ unique int child: @container ref);
+
+file_extraction_mode(
+ unique int file: @file ref,
+ int mode: int ref
+ /* 0 = normal, 1 = standalone extractor */
+ );
+
+/** NAMESPACES **/
+
+@type_container = @namespace | @type;
+
+namespaces(
+ unique int id: @namespace,
+ string name: string ref);
+
+namespace_declarations(
+ unique int id: @namespace_declaration,
+ int namespace_id: @namespace ref);
+
+namespace_declaration_location(
+ unique int id: @namespace_declaration ref,
+ int loc: @location ref);
+
+parent_namespace(
+ unique int child_id: @type_container ref,
+ int namespace_id: @namespace ref);
+
+@declaration_or_directive = @namespace_declaration | @type | @using_directive;
+
+parent_namespace_declaration(
+ int child_id: @declaration_or_directive ref, // cannot be unique because of partial classes
+ int namespace_id: @namespace_declaration ref);
+
+@using_directive = @using_namespace_directive | @using_static_directive;
+
+using_namespace_directives(
+ unique int id: @using_namespace_directive,
+ int namespace_id: @namespace ref);
+
+using_static_directives(
+ unique int id: @using_static_directive,
+ int type_id: @type_or_ref ref);
+
+using_directive_location(
+ unique int id: @using_directive ref,
+ int loc: @location ref);
+
+@preprocessor_directive = @pragma_warning | @pragma_checksum | @directive_define | @directive_undefine | @directive_warning
+ | @directive_error | @directive_nullable | @directive_line | @directive_region | @directive_endregion | @directive_if
+ | @directive_elif | @directive_else | @directive_endif;
+
+@conditional_directive = @directive_if | @directive_elif;
+@branch_directive = @directive_if | @directive_elif | @directive_else;
+
+directive_ifs(
+ unique int id: @directive_if,
+ int branchTaken: int ref, /* 0: false, 1: true */
+ int conditionValue: int ref); /* 0: false, 1: true */
+
+directive_elifs(
+ unique int id: @directive_elif,
+ int branchTaken: int ref, /* 0: false, 1: true */
+ int conditionValue: int ref, /* 0: false, 1: true */
+ int parent: @directive_if ref,
+ int index: int ref);
+
+directive_elses(
+ unique int id: @directive_else,
+ int branchTaken: int ref, /* 0: false, 1: true */
+ int parent: @directive_if ref,
+ int index: int ref);
+
+#keyset[id, start]
+directive_endifs(
+ unique int id: @directive_endif,
+ unique int start: @directive_if ref);
+
+directive_define_symbols(
+ unique int id: @define_symbol_expr ref,
+ string name: string ref);
+
+directive_regions(
+ unique int id: @directive_region,
+ string name: string ref);
+
+#keyset[id, start]
+directive_endregions(
+ unique int id: @directive_endregion,
+ unique int start: @directive_region ref);
+
+directive_lines(
+ unique int id: @directive_line,
+ int kind: int ref); /* 0: default, 1: hidden, 2: numeric */
+
+directive_line_value(
+ unique int id: @directive_line ref,
+ int line: int ref);
+
+directive_line_file(
+ unique int id: @directive_line ref,
+ int file: @file ref
+)
+
+directive_nullables(
+ unique int id: @directive_nullable,
+ int setting: int ref, /* 0: disable, 1: enable, 2: restore */
+ int target: int ref); /* 0: none, 1: annotations, 2: warnings */
+
+directive_warnings(
+ unique int id: @directive_warning,
+ string message: string ref);
+
+directive_errors(
+ unique int id: @directive_error,
+ string message: string ref);
+
+directive_undefines(
+ unique int id: @directive_undefine,
+ string name: string ref);
+
+directive_defines(
+ unique int id: @directive_define,
+ string name: string ref);
+
+pragma_checksums(
+ unique int id: @pragma_checksum,
+ int file: @file ref,
+ string guid: string ref,
+ string bytes: string ref);
+
+pragma_warnings(
+ unique int id: @pragma_warning,
+ int kind: int ref /* 0 = disable, 1 = restore */);
+
+#keyset[id, index]
+pragma_warning_error_codes(
+ int id: @pragma_warning ref,
+ string errorCode: string ref,
+ int index: int ref);
+
+preprocessor_directive_location(
+ unique int id: @preprocessor_directive ref,
+ int loc: @location ref);
+
+preprocessor_directive_compilation(
+ unique int id: @preprocessor_directive ref,
+ int compilation: @compilation ref);
+
+preprocessor_directive_active(
+ unique int id: @preprocessor_directive ref,
+ int active: int ref); /* 0: false, 1: true */
+
+/** TYPES **/
+
+types(
+ unique int id: @type,
+ int kind: int ref,
+ string name: string ref);
+
+case @type.kind of
+ 1 = @bool_type
+| 2 = @char_type
+| 3 = @decimal_type
+| 4 = @sbyte_type
+| 5 = @short_type
+| 6 = @int_type
+| 7 = @long_type
+| 8 = @byte_type
+| 9 = @ushort_type
+| 10 = @uint_type
+| 11 = @ulong_type
+| 12 = @float_type
+| 13 = @double_type
+| 14 = @enum_type
+| 15 = @struct_type
+| 17 = @class_type
+| 19 = @interface_type
+| 20 = @delegate_type
+| 21 = @null_type
+| 22 = @type_parameter
+| 23 = @pointer_type
+| 24 = @nullable_type
+| 25 = @array_type
+| 26 = @void_type
+| 27 = @int_ptr_type
+| 28 = @uint_ptr_type
+| 29 = @dynamic_type
+| 30 = @arglist_type
+| 31 = @unknown_type
+| 32 = @tuple_type
+| 33 = @function_pointer_type
+ ;
+
+@simple_type = @bool_type | @char_type | @integral_type | @floating_point_type | @decimal_type;
+@integral_type = @signed_integral_type | @unsigned_integral_type;
+@signed_integral_type = @sbyte_type | @short_type | @int_type | @long_type;
+@unsigned_integral_type = @byte_type | @ushort_type | @uint_type | @ulong_type;
+@floating_point_type = @float_type | @double_type;
+@value_type = @simple_type | @enum_type | @struct_type | @nullable_type | @int_ptr_type
+ | @uint_ptr_type | @tuple_type;
+@ref_type = @class_type | @interface_type | @array_type | @delegate_type | @null_type
+ | @dynamic_type;
+@value_or_ref_type = @value_type | @ref_type;
+
+typerefs(
+ unique int id: @typeref,
+ string name: string ref);
+
+typeref_type(
+ int id: @typeref ref,
+ unique int typeId: @type ref);
+
+@type_or_ref = @type | @typeref;
+
+array_element_type(
+ unique int array: @array_type ref,
+ int dimension: int ref,
+ int rank: int ref,
+ int element: @type_or_ref ref);
+
+nullable_underlying_type(
+ unique int nullable: @nullable_type ref,
+ int underlying: @type_or_ref ref);
+
+pointer_referent_type(
+ unique int pointer: @pointer_type ref,
+ int referent: @type_or_ref ref);
+
+enum_underlying_type(
+ unique int enum_id: @enum_type ref,
+ int underlying_type_id: @type_or_ref ref);
+
+delegate_return_type(
+ unique int delegate_id: @delegate_type ref,
+ int return_type_id: @type_or_ref ref);
+
+function_pointer_return_type(
+ unique int function_pointer_id: @function_pointer_type ref,
+ int return_type_id: @type_or_ref ref);
+
+extend(
+ int sub: @type ref,
+ int super: @type_or_ref ref);
+
+anonymous_types(
+ unique int id: @type ref);
+
+@interface_or_ref = @interface_type | @typeref;
+
+implement(
+ int sub: @type ref,
+ int super: @type_or_ref ref);
+
+type_location(
+ int id: @type ref,
+ int loc: @location ref);
+
+tuple_underlying_type(
+ unique int tuple: @tuple_type ref,
+ int struct: @type_or_ref ref);
+
+#keyset[tuple, index]
+tuple_element(
+ int tuple: @tuple_type ref,
+ int index: int ref,
+ unique int field: @field ref);
+
+attributes(
+ unique int id: @attribute,
+ int type_id: @type_or_ref ref,
+ int target: @attributable ref);
+
+attribute_location(
+ int id: @attribute ref,
+ int loc: @location ref);
+
+@type_mention_parent = @element | @type_mention;
+
+type_mention(
+ unique int id: @type_mention,
+ int type_id: @type_or_ref ref,
+ int parent: @type_mention_parent ref);
+
+type_mention_location(
+ unique int id: @type_mention ref,
+ int loc: @location ref);
+
+@has_type_annotation = @assignable | @type_parameter | @callable | @expr | @delegate_type | @generic | @function_pointer_type;
+
+/**
+ * A direct annotation on an entity, for example `string? x;`.
+ *
+ * Annotations:
+ * 2 = reftype is not annotated "!"
+ * 3 = reftype is annotated "?"
+ * 4 = readonly ref type / in parameter
+ * 5 = ref type parameter, return or local variable
+ * 6 = out parameter
+ *
+ * Note that the annotation depends on the element it annotates.
+ * @assignable: The annotation is on the type of the assignable, for example the variable type.
+ * @type_parameter: The annotation is on the reftype constraint
+ * @callable: The annotation is on the return type
+ * @array_type: The annotation is on the element type
+ */
+type_annotation(int id: @has_type_annotation ref, int annotation: int ref);
+
+nullability(unique int nullability: @nullability, int kind: int ref);
+
+case @nullability.kind of
+ 0 = @oblivious
+| 1 = @not_annotated
+| 2 = @annotated
+;
+
+#keyset[parent, index]
+nullability_parent(int nullability: @nullability ref, int index: int ref, int parent: @nullability ref)
+
+type_nullability(int id: @has_type_annotation ref, int nullability: @nullability ref);
+
+/**
+ * The nullable flow state of an expression, as determined by Roslyn.
+ * 0 = none (default, not populated)
+ * 1 = not null
+ * 2 = maybe null
+ */
+expr_flowstate(unique int id: @expr ref, int state: int ref);
+
+/** GENERICS **/
+
+@generic = @type | @method | @local_function;
+
+type_parameters(
+ unique int id: @type_parameter ref,
+ int index: int ref,
+ int generic_id: @generic ref,
+ int variance: int ref /* none = 0, out = 1, in = 2 */);
+
+#keyset[constructed_id, index]
+type_arguments(
+ int id: @type_or_ref ref,
+ int index: int ref,
+ int constructed_id: @generic_or_ref ref);
+
+@generic_or_ref = @generic | @typeref;
+
+constructed_generic(
+ unique int constructed: @generic ref,
+ int generic: @generic_or_ref ref);
+
+type_parameter_constraints(
+ unique int id: @type_parameter_constraints,
+ int param_id: @type_parameter ref);
+
+type_parameter_constraints_location(
+ int id: @type_parameter_constraints ref,
+ int loc: @location ref);
+
+general_type_parameter_constraints(
+ int id: @type_parameter_constraints ref,
+ int kind: int ref /* class = 1, struct = 2, new = 3 */);
+
+specific_type_parameter_constraints(
+ int id: @type_parameter_constraints ref,
+ int base_id: @type_or_ref ref);
+
+specific_type_parameter_nullability(
+ int id: @type_parameter_constraints ref,
+ int base_id: @type_or_ref ref,
+ int nullability: @nullability ref);
+
+/** FUNCTION POINTERS */
+
+function_pointer_calling_conventions(
+ int id: @function_pointer_type ref,
+ int kind: int ref);
+
+#keyset[id, index]
+has_unmanaged_calling_conventions(
+ int id: @function_pointer_type ref,
+ int index: int ref,
+ int conv_id: @type_or_ref ref);
+
+/** MODIFIERS */
+
+@modifiable = @modifiable_direct | @event_accessor;
+
+@modifiable_direct = @member | @accessor | @local_function | @anonymous_function_expr;
+
+modifiers(
+ unique int id: @modifier,
+ string name: string ref);
+
+has_modifiers(
+ int id: @modifiable_direct ref,
+ int mod_id: @modifier ref);
+
+compiler_generated(unique int id: @modifiable_direct ref);
+
+/** MEMBERS **/
+
+@member = @method | @constructor | @destructor | @field | @property | @event | @operator | @indexer | @type;
+
+@named_exprorstmt = @goto_stmt | @labeled_stmt | @expr;
+
+@virtualizable = @method | @property | @indexer | @event;
+
+exprorstmt_name(
+ unique int parent_id: @named_exprorstmt ref,
+ string name: string ref);
+
+nested_types(
+ unique int id: @type ref,
+ int declaring_type_id: @type ref,
+ int unbound_id: @type ref);
+
+properties(
+ unique int id: @property,
+ string name: string ref,
+ int declaring_type_id: @type ref,
+ int type_id: @type_or_ref ref,
+ int unbound_id: @property ref);
+
+property_location(
+ int id: @property ref,
+ int loc: @location ref);
+
+indexers(
+ unique int id: @indexer,
+ string name: string ref,
+ int declaring_type_id: @type ref,
+ int type_id: @type_or_ref ref,
+ int unbound_id: @indexer ref);
+
+indexer_location(
+ int id: @indexer ref,
+ int loc: @location ref);
+
+accessors(
+ unique int id: @accessor,
+ int kind: int ref,
+ string name: string ref,
+ int declaring_member_id: @member ref,
+ int unbound_id: @accessor ref);
+
+case @accessor.kind of
+ 1 = @getter
+| 2 = @setter
+ ;
+
+init_only_accessors(
+ unique int id: @accessor ref);
+
+accessor_location(
+ int id: @accessor ref,
+ int loc: @location ref);
+
+events(
+ unique int id: @event,
+ string name: string ref,
+ int declaring_type_id: @type ref,
+ int type_id: @type_or_ref ref,
+ int unbound_id: @event ref);
+
+event_location(
+ int id: @event ref,
+ int loc: @location ref);
+
+event_accessors(
+ unique int id: @event_accessor,
+ int kind: int ref,
+ string name: string ref,
+ int declaring_event_id: @event ref,
+ int unbound_id: @event_accessor ref);
+
+case @event_accessor.kind of
+ 1 = @add_event_accessor
+| 2 = @remove_event_accessor
+ ;
+
+event_accessor_location(
+ int id: @event_accessor ref,
+ int loc: @location ref);
+
+operators(
+ unique int id: @operator,
+ string name: string ref,
+ string symbol: string ref,
+ int declaring_type_id: @type ref,
+ int type_id: @type_or_ref ref,
+ int unbound_id: @operator ref);
+
+operator_location(
+ int id: @operator ref,
+ int loc: @location ref);
+
+constant_value(
+ int id: @variable ref,
+ string value: string ref);
+
+/** CALLABLES **/
+
+@callable = @method | @constructor | @destructor | @operator | @callable_accessor | @anonymous_function_expr | @local_function;
+
+@callable_accessor = @accessor | @event_accessor;
+
+methods(
+ unique int id: @method,
+ string name: string ref,
+ int declaring_type_id: @type ref,
+ int type_id: @type_or_ref ref,
+ int unbound_id: @method ref);
+
+method_location(
+ int id: @method ref,
+ int loc: @location ref);
+
+constructors(
+ unique int id: @constructor,
+ string name: string ref,
+ int declaring_type_id: @type ref,
+ int unbound_id: @constructor ref);
+
+constructor_location(
+ int id: @constructor ref,
+ int loc: @location ref);
+
+destructors(
+ unique int id: @destructor,
+ string name: string ref,
+ int declaring_type_id: @type ref,
+ int unbound_id: @destructor ref);
+
+destructor_location(
+ int id: @destructor ref,
+ int loc: @location ref);
+
+overrides(
+ int id: @callable ref,
+ int base_id: @callable ref);
+
+explicitly_implements(
+ int id: @member ref,
+ int interface_id: @interface_or_ref ref);
+
+local_functions(
+ unique int id: @local_function,
+ string name: string ref,
+ int return_type: @type ref,
+ int unbound_id: @local_function ref);
+
+local_function_stmts(
+ unique int fn: @local_function_stmt ref,
+ int stmt: @local_function ref);
+
+/** VARIABLES **/
+
+@variable = @local_scope_variable | @field;
+
+@local_scope_variable = @local_variable | @parameter;
+
+fields(
+ unique int id: @field,
+ int kind: int ref,
+ string name: string ref,
+ int declaring_type_id: @type ref,
+ int type_id: @type_or_ref ref,
+ int unbound_id: @field ref);
+
+case @field.kind of
+ 1 = @addressable_field
+| 2 = @constant
+ ;
+
+field_location(
+ int id: @field ref,
+ int loc: @location ref);
+
+localvars(
+ unique int id: @local_variable,
+ int kind: int ref,
+ string name: string ref,
+ int implicitly_typed: int ref /* 0 = no, 1 = yes */,
+ int type_id: @type_or_ref ref,
+ int parent_id: @local_var_decl_expr ref);
+
+case @local_variable.kind of
+ 1 = @addressable_local_variable
+| 2 = @local_constant
+| 3 = @local_variable_ref
+ ;
+
+localvar_location(
+ unique int id: @local_variable ref,
+ int loc: @location ref);
+
+@parameterizable = @callable | @delegate_type | @indexer | @function_pointer_type;
+
+#keyset[name, parent_id]
+#keyset[index, parent_id]
+params(
+ unique int id: @parameter,
+ string name: string ref,
+ int type_id: @type_or_ref ref,
+ int index: int ref,
+ int mode: int ref, /* value = 0, ref = 1, out = 2, array = 3, this = 4 */
+ int parent_id: @parameterizable ref,
+ int unbound_id: @parameter ref);
+
+param_location(
+ int id: @parameter ref,
+ int loc: @location ref);
+
+/** STATEMENTS **/
+
+@exprorstmt_parent = @control_flow_element | @top_level_exprorstmt_parent;
+
+statements(
+ unique int id: @stmt,
+ int kind: int ref);
+
+#keyset[index, parent]
+stmt_parent(
+ unique int stmt: @stmt ref,
+ int index: int ref,
+ int parent: @control_flow_element ref);
+
+@top_level_stmt_parent = @callable;
+
+// [index, parent] is not a keyset because the same parent may be compiled multiple times
+stmt_parent_top_level(
+ unique int stmt: @stmt ref,
+ int index: int ref,
+ int parent: @top_level_stmt_parent ref);
+
+case @stmt.kind of
+ 1 = @block_stmt
+| 2 = @expr_stmt
+| 3 = @if_stmt
+| 4 = @switch_stmt
+| 5 = @while_stmt
+| 6 = @do_stmt
+| 7 = @for_stmt
+| 8 = @foreach_stmt
+| 9 = @break_stmt
+| 10 = @continue_stmt
+| 11 = @goto_stmt
+| 12 = @goto_case_stmt
+| 13 = @goto_default_stmt
+| 14 = @throw_stmt
+| 15 = @return_stmt
+| 16 = @yield_stmt
+| 17 = @try_stmt
+| 18 = @checked_stmt
+| 19 = @unchecked_stmt
+| 20 = @lock_stmt
+| 21 = @using_block_stmt
+| 22 = @var_decl_stmt
+| 23 = @const_decl_stmt
+| 24 = @empty_stmt
+| 25 = @unsafe_stmt
+| 26 = @fixed_stmt
+| 27 = @label_stmt
+| 28 = @catch
+| 29 = @case_stmt
+| 30 = @local_function_stmt
+| 31 = @using_decl_stmt
+ ;
+
+@using_stmt = @using_block_stmt | @using_decl_stmt;
+
+@labeled_stmt = @label_stmt | @case;
+
+@decl_stmt = @var_decl_stmt | @const_decl_stmt | @using_decl_stmt;
+
+@cond_stmt = @if_stmt | @switch_stmt;
+
+@loop_stmt = @while_stmt | @do_stmt | @for_stmt | @foreach_stmt;
+
+@jump_stmt = @break_stmt | @goto_any_stmt | @continue_stmt | @throw_stmt | @return_stmt
+ | @yield_stmt;
+
+@goto_any_stmt = @goto_default_stmt | @goto_case_stmt | @goto_stmt;
+
+
+stmt_location(
+ unique int id: @stmt ref,
+ int loc: @location ref);
+
+catch_type(
+ unique int catch_id: @catch ref,
+ int type_id: @type_or_ref ref,
+ int kind: int ref /* explicit = 1, implicit = 2 */);
+
+foreach_stmt_info(
+ unique int id: @foreach_stmt ref,
+ int kind: int ref /* non-async = 1, async = 2 */);
+
+@foreach_symbol = @method | @property | @type_or_ref;
+
+#keyset[id, kind]
+foreach_stmt_desugar(
+ int id: @foreach_stmt ref,
+ int symbol: @foreach_symbol ref,
+ int kind: int ref /* GetEnumeratorMethod = 1, CurrentProperty = 2, MoveNextMethod = 3, DisposeMethod = 4, ElementType = 5 */);
+
+/** EXPRESSIONS **/
+
+expressions(
+ unique int id: @expr,
+ int kind: int ref,
+ int type_id: @type_or_ref ref);
+
+#keyset[index, parent]
+expr_parent(
+ unique int expr: @expr ref,
+ int index: int ref,
+ int parent: @control_flow_element ref);
+
+@top_level_expr_parent = @attribute | @field | @property | @indexer | @parameter | @directive_if | @directive_elif;
+
+@top_level_exprorstmt_parent = @top_level_expr_parent | @top_level_stmt_parent;
+
+// [index, parent] is not a keyset because the same parent may be compiled multiple times
+expr_parent_top_level(
+ unique int expr: @expr ref,
+ int index: int ref,
+ int parent: @top_level_exprorstmt_parent ref);
+
+case @expr.kind of
+/* literal */
+ 1 = @bool_literal_expr
+| 2 = @char_literal_expr
+| 3 = @decimal_literal_expr
+| 4 = @int_literal_expr
+| 5 = @long_literal_expr
+| 6 = @uint_literal_expr
+| 7 = @ulong_literal_expr
+| 8 = @float_literal_expr
+| 9 = @double_literal_expr
+| 10 = @string_literal_expr
+| 11 = @null_literal_expr
+/* primary & unary */
+| 12 = @this_access_expr
+| 13 = @base_access_expr
+| 14 = @local_variable_access_expr
+| 15 = @parameter_access_expr
+| 16 = @field_access_expr
+| 17 = @property_access_expr
+| 18 = @method_access_expr
+| 19 = @event_access_expr
+| 20 = @indexer_access_expr
+| 21 = @array_access_expr
+| 22 = @type_access_expr
+| 23 = @typeof_expr
+| 24 = @method_invocation_expr
+| 25 = @delegate_invocation_expr
+| 26 = @operator_invocation_expr
+| 27 = @cast_expr
+| 28 = @object_creation_expr
+| 29 = @explicit_delegate_creation_expr
+| 30 = @implicit_delegate_creation_expr
+| 31 = @array_creation_expr
+| 32 = @default_expr
+| 33 = @plus_expr
+| 34 = @minus_expr
+| 35 = @bit_not_expr
+| 36 = @log_not_expr
+| 37 = @post_incr_expr
+| 38 = @post_decr_expr
+| 39 = @pre_incr_expr
+| 40 = @pre_decr_expr
+/* multiplicative */
+| 41 = @mul_expr
+| 42 = @div_expr
+| 43 = @rem_expr
+/* additive */
+| 44 = @add_expr
+| 45 = @sub_expr
+/* shift */
+| 46 = @lshift_expr
+| 47 = @rshift_expr
+/* relational */
+| 48 = @lt_expr
+| 49 = @gt_expr
+| 50 = @le_expr
+| 51 = @ge_expr
+/* equality */
+| 52 = @eq_expr
+| 53 = @ne_expr
+/* logical */
+| 54 = @bit_and_expr
+| 55 = @bit_xor_expr
+| 56 = @bit_or_expr
+| 57 = @log_and_expr
+| 58 = @log_or_expr
+/* type testing */
+| 59 = @is_expr
+| 60 = @as_expr
+/* null coalescing */
+| 61 = @null_coalescing_expr
+/* conditional */
+| 62 = @conditional_expr
+/* assignment */
+| 63 = @simple_assign_expr
+| 64 = @assign_add_expr
+| 65 = @assign_sub_expr
+| 66 = @assign_mul_expr
+| 67 = @assign_div_expr
+| 68 = @assign_rem_expr
+| 69 = @assign_and_expr
+| 70 = @assign_xor_expr
+| 71 = @assign_or_expr
+| 72 = @assign_lshift_expr
+| 73 = @assign_rshift_expr
+/* more */
+| 74 = @object_init_expr
+| 75 = @collection_init_expr
+| 76 = @array_init_expr
+| 77 = @checked_expr
+| 78 = @unchecked_expr
+| 79 = @constructor_init_expr
+| 80 = @add_event_expr
+| 81 = @remove_event_expr
+| 82 = @par_expr
+| 83 = @local_var_decl_expr
+| 84 = @lambda_expr
+| 85 = @anonymous_method_expr
+| 86 = @namespace_expr
+/* dynamic */
+| 92 = @dynamic_element_access_expr
+| 93 = @dynamic_member_access_expr
+/* unsafe */
+| 100 = @pointer_indirection_expr
+| 101 = @address_of_expr
+| 102 = @sizeof_expr
+/* async */
+| 103 = @await_expr
+/* C# 6.0 */
+| 104 = @nameof_expr
+| 105 = @interpolated_string_expr
+| 106 = @unknown_expr
+/* C# 7.0 */
+| 107 = @throw_expr
+| 108 = @tuple_expr
+| 109 = @local_function_invocation_expr
+| 110 = @ref_expr
+| 111 = @discard_expr
+/* C# 8.0 */
+| 112 = @range_expr
+| 113 = @index_expr
+| 114 = @switch_expr
+| 115 = @recursive_pattern_expr
+| 116 = @property_pattern_expr
+| 117 = @positional_pattern_expr
+| 118 = @switch_case_expr
+| 119 = @assign_coalesce_expr
+| 120 = @suppress_nullable_warning_expr
+| 121 = @namespace_access_expr
+/* C# 9.0 */
+| 122 = @lt_pattern_expr
+| 123 = @gt_pattern_expr
+| 124 = @le_pattern_expr
+| 125 = @ge_pattern_expr
+| 126 = @not_pattern_expr
+| 127 = @and_pattern_expr
+| 128 = @or_pattern_expr
+| 129 = @function_pointer_invocation_expr
+| 130 = @with_expr
+/* Preprocessor */
+| 999 = @define_symbol_expr
+;
+
+@switch = @switch_stmt | @switch_expr;
+@case = @case_stmt | @switch_case_expr;
+@pattern_match = @case | @is_expr;
+@unary_pattern_expr = @not_pattern_expr;
+@relational_pattern_expr = @gt_pattern_expr | @lt_pattern_expr | @ge_pattern_expr | @le_pattern_expr;
+@binary_pattern_expr = @and_pattern_expr | @or_pattern_expr;
+
+@integer_literal_expr = @int_literal_expr | @long_literal_expr | @uint_literal_expr | @ulong_literal_expr;
+@real_literal_expr = @float_literal_expr | @double_literal_expr | @decimal_literal_expr;
+@literal_expr = @bool_literal_expr | @char_literal_expr | @integer_literal_expr | @real_literal_expr
+ | @string_literal_expr | @null_literal_expr;
+
+@assign_expr = @simple_assign_expr | @assign_op_expr | @local_var_decl_expr;
+@assign_op_expr = @assign_arith_expr | @assign_bitwise_expr | @assign_event_expr | @assign_coalesce_expr;
+@assign_event_expr = @add_event_expr | @remove_event_expr;
+
+@assign_arith_expr = @assign_add_expr | @assign_sub_expr | @assign_mul_expr | @assign_div_expr
+ | @assign_rem_expr
+@assign_bitwise_expr = @assign_and_expr | @assign_or_expr | @assign_xor_expr
+ | @assign_lshift_expr | @assign_rshift_expr;
+
+@member_access_expr = @field_access_expr | @property_access_expr | @indexer_access_expr | @event_access_expr
+ | @method_access_expr | @type_access_expr | @dynamic_member_access_expr;
+@access_expr = @member_access_expr | @this_access_expr | @base_access_expr | @assignable_access_expr | @namespace_access_expr;
+@element_access_expr = @indexer_access_expr | @array_access_expr | @dynamic_element_access_expr;
+
+@local_variable_access = @local_variable_access_expr | @local_var_decl_expr;
+@local_scope_variable_access_expr = @parameter_access_expr | @local_variable_access;
+@variable_access_expr = @local_scope_variable_access_expr | @field_access_expr;
+
+@assignable_access_expr = @variable_access_expr | @property_access_expr | @element_access_expr
+ | @event_access_expr | @dynamic_member_access_expr;
+
+@objectorcollection_init_expr = @object_init_expr | @collection_init_expr;
+
+@delegate_creation_expr = @explicit_delegate_creation_expr | @implicit_delegate_creation_expr;
+
+@bin_arith_op_expr = @mul_expr | @div_expr | @rem_expr | @add_expr | @sub_expr;
+@incr_op_expr = @pre_incr_expr | @post_incr_expr;
+@decr_op_expr = @pre_decr_expr | @post_decr_expr;
+@mut_op_expr = @incr_op_expr | @decr_op_expr;
+@un_arith_op_expr = @plus_expr | @minus_expr | @mut_op_expr;
+@arith_op_expr = @bin_arith_op_expr | @un_arith_op_expr;
+
+@ternary_log_op_expr = @conditional_expr;
+@bin_log_op_expr = @log_and_expr | @log_or_expr | @null_coalescing_expr;
+@un_log_op_expr = @log_not_expr;
+@log_expr = @un_log_op_expr | @bin_log_op_expr | @ternary_log_op_expr;
+
+@bin_bit_op_expr = @bit_and_expr | @bit_or_expr | @bit_xor_expr | @lshift_expr
+ | @rshift_expr;
+@un_bit_op_expr = @bit_not_expr;
+@bit_expr = @un_bit_op_expr | @bin_bit_op_expr;
+
+@equality_op_expr = @eq_expr | @ne_expr;
+@rel_op_expr = @gt_expr | @lt_expr| @ge_expr | @le_expr;
+@comp_expr = @equality_op_expr | @rel_op_expr;
+
+@op_expr = @assign_expr | @un_op | @bin_op | @ternary_op;
+
+@ternary_op = @ternary_log_op_expr;
+@bin_op = @bin_arith_op_expr | @bin_log_op_expr | @bin_bit_op_expr | @comp_expr;
+@un_op = @un_arith_op_expr | @un_log_op_expr | @un_bit_op_expr | @sizeof_expr
+ | @pointer_indirection_expr | @address_of_expr;
+
+@anonymous_function_expr = @lambda_expr | @anonymous_method_expr;
+
+@call = @method_invocation_expr | @constructor_init_expr | @operator_invocation_expr
+ | @delegate_invocation_expr | @object_creation_expr | @call_access_expr
+ | @local_function_invocation_expr | @function_pointer_invocation_expr;
+
+@call_access_expr = @property_access_expr | @event_access_expr | @indexer_access_expr;
+
+@late_bindable_expr = @dynamic_element_access_expr | @dynamic_member_access_expr
+ | @object_creation_expr | @method_invocation_expr | @operator_invocation_expr;
+
+@throw_element = @throw_expr | @throw_stmt;
+
+@implicitly_typeable_object_creation_expr = @object_creation_expr | @explicit_delegate_creation_expr;
+
+implicitly_typed_array_creation(
+ unique int id: @array_creation_expr ref);
+
+explicitly_sized_array_creation(
+ unique int id: @array_creation_expr ref);
+
+stackalloc_array_creation(
+ unique int id: @array_creation_expr ref);
+
+implicitly_typed_object_creation(
+ unique int id: @implicitly_typeable_object_creation_expr ref);
+
+mutator_invocation_mode(
+ unique int id: @operator_invocation_expr ref,
+ int mode: int ref /* prefix = 1, postfix = 2*/);
+
+expr_compiler_generated(
+ unique int id: @expr ref);
+
+expr_value(
+ unique int id: @expr ref,
+ string value: string ref);
+
+expr_call(
+ unique int caller_id: @expr ref,
+ int target_id: @callable ref);
+
+expr_access(
+ unique int accesser_id: @access_expr ref,
+ int target_id: @accessible ref);
+
+@accessible = @method | @assignable | @local_function | @namespace;
+
+expr_location(
+ unique int id: @expr ref,
+ int loc: @location ref);
+
+dynamic_member_name(
+ unique int id: @late_bindable_expr ref,
+ string name: string ref);
+
+@qualifiable_expr = @member_access_expr
+ | @method_invocation_expr
+ | @element_access_expr;
+
+conditional_access(
+ unique int id: @qualifiable_expr ref);
+
+expr_argument(
+ unique int id: @expr ref,
+ int mode: int ref);
+ /* mode is the same as params: value = 0, ref = 1, out = 2 */
+
+expr_argument_name(
+ unique int id: @expr ref,
+ string name: string ref);
+
+/** CONTROL/DATA FLOW **/
+
+@control_flow_element = @stmt | @expr;
+
+/* XML Files */
+
+xmlEncoding (
+ unique int id: @file ref,
+ string encoding: string ref);
+
+xmlDTDs(
+ unique int id: @xmldtd,
+ string root: string ref,
+ string publicId: string ref,
+ string systemId: string ref,
+ int fileid: @file ref);
+
+xmlElements(
+ unique int id: @xmlelement,
+ string name: string ref,
+ int parentid: @xmlparent ref,
+ int idx: int ref,
+ int fileid: @file ref);
+
+xmlAttrs(
+ unique int id: @xmlattribute,
+ int elementid: @xmlelement ref,
+ string name: string ref,
+ string value: string ref,
+ int idx: int ref,
+ int fileid: @file ref);
+
+xmlNs(
+ int id: @xmlnamespace,
+ string prefixName: string ref,
+ string URI: string ref,
+ int fileid: @file ref);
+
+xmlHasNs(
+ int elementId: @xmlnamespaceable ref,
+ int nsId: @xmlnamespace ref,
+ int fileid: @file ref);
+
+xmlComments(
+ unique int id: @xmlcomment,
+ string text: string ref,
+ int parentid: @xmlparent ref,
+ int fileid: @file ref);
+
+xmlChars(
+ unique int id: @xmlcharacters,
+ string text: string ref,
+ int parentid: @xmlparent ref,
+ int idx: int ref,
+ int isCDATA: int ref,
+ int fileid: @file ref);
+
+@xmlparent = @file | @xmlelement;
+@xmlnamespaceable = @xmlelement | @xmlattribute;
+
+xmllocations(
+ int xmlElement: @xmllocatable ref,
+ int location: @location_default ref);
+
+@xmllocatable = @xmlcharacters | @xmlelement | @xmlcomment | @xmlattribute | @xmldtd | @file | @xmlnamespace;
+
+/* Comments */
+
+commentline(
+ unique int id: @commentline,
+ int kind: int ref,
+ string text: string ref,
+ string rawtext: string ref);
+
+case @commentline.kind of
+ 0 = @singlelinecomment
+| 1 = @xmldoccomment
+| 2 = @multilinecomment;
+
+commentline_location(
+ unique int id: @commentline ref,
+ int loc: @location ref);
+
+commentblock(
+ unique int id : @commentblock);
+
+commentblock_location(
+ unique int id: @commentblock ref,
+ int loc: @location ref);
+
+commentblock_binding(
+ int id: @commentblock ref,
+ int entity: @element ref,
+ int bindtype: int ref); /* 0: Parent, 1: Best, 2: Before, 3: After */
+
+commentblock_child(
+ int id: @commentblock ref,
+ int commentline: @commentline ref,
+ int index: int ref);
+
+/* ASP.NET */
+
+case @asp_element.kind of
+ 0=@asp_close_tag
+| 1=@asp_code
+| 2=@asp_comment
+| 3=@asp_data_binding
+| 4=@asp_directive
+| 5=@asp_open_tag
+| 6=@asp_quoted_string
+| 7=@asp_text
+| 8=@asp_xml_directive;
+
+@asp_attribute = @asp_code | @asp_data_binding | @asp_quoted_string;
+
+asp_elements(
+ unique int id: @asp_element,
+ int kind: int ref,
+ int loc: @location ref);
+
+asp_comment_server(unique int comment: @asp_comment ref);
+asp_code_inline(unique int code: @asp_code ref);
+asp_directive_attribute(
+ int directive: @asp_directive ref,
+ int index: int ref,
+ string name: string ref,
+ int value: @asp_quoted_string ref);
+asp_directive_name(
+ unique int directive: @asp_directive ref,
+ string name: string ref);
+asp_element_body(
+ unique int element: @asp_element ref,
+ string body: string ref);
+asp_tag_attribute(
+ int tag: @asp_open_tag ref,
+ int index: int ref,
+ string name: string ref,
+ int attribute: @asp_attribute ref);
+asp_tag_name(
+ unique int tag: @asp_open_tag ref,
+ string name: string ref);
+asp_tag_isempty(int tag: @asp_open_tag ref);
+
+/* Common Intermediate Language - CIL */
+
+case @cil_instruction.opcode of
+ 0 = @cil_nop
+| 1 = @cil_break
+| 2 = @cil_ldarg_0
+| 3 = @cil_ldarg_1
+| 4 = @cil_ldarg_2
+| 5 = @cil_ldarg_3
+| 6 = @cil_ldloc_0
+| 7 = @cil_ldloc_1
+| 8 = @cil_ldloc_2
+| 9 = @cil_ldloc_3
+| 10 = @cil_stloc_0
+| 11 = @cil_stloc_1
+| 12 = @cil_stloc_2
+| 13 = @cil_stloc_3
+| 14 = @cil_ldarg_s
+| 15 = @cil_ldarga_s
+| 16 = @cil_starg_s
+| 17 = @cil_ldloc_s
+| 18 = @cil_ldloca_s
+| 19 = @cil_stloc_s
+| 20 = @cil_ldnull
+| 21 = @cil_ldc_i4_m1
+| 22 = @cil_ldc_i4_0
+| 23 = @cil_ldc_i4_1
+| 24 = @cil_ldc_i4_2
+| 25 = @cil_ldc_i4_3
+| 26 = @cil_ldc_i4_4
+| 27 = @cil_ldc_i4_5
+| 28 = @cil_ldc_i4_6
+| 29 = @cil_ldc_i4_7
+| 30 = @cil_ldc_i4_8
+| 31 = @cil_ldc_i4_s
+| 32 = @cil_ldc_i4
+| 33 = @cil_ldc_i8
+| 34 = @cil_ldc_r4
+| 35 = @cil_ldc_r8
+| 37 = @cil_dup
+| 38 = @cil_pop
+| 39 = @cil_jmp
+| 40 = @cil_call
+| 41 = @cil_calli
+| 42 = @cil_ret
+| 43 = @cil_br_s
+| 44 = @cil_brfalse_s
+| 45 = @cil_brtrue_s
+| 46 = @cil_beq_s
+| 47 = @cil_bge_s
+| 48 = @cil_bgt_s
+| 49 = @cil_ble_s
+| 50 = @cil_blt_s
+| 51 = @cil_bne_un_s
+| 52 = @cil_bge_un_s
+| 53 = @cil_bgt_un_s
+| 54 = @cil_ble_un_s
+| 55 = @cil_blt_un_s
+| 56 = @cil_br
+| 57 = @cil_brfalse
+| 58 = @cil_brtrue
+| 59 = @cil_beq
+| 60 = @cil_bge
+| 61 = @cil_bgt
+| 62 = @cil_ble
+| 63 = @cil_blt
+| 64 = @cil_bne_un
+| 65 = @cil_bge_un
+| 66 = @cil_bgt_un
+| 67 = @cil_ble_un
+| 68 = @cil_blt_un
+| 69 = @cil_switch
+| 70 = @cil_ldind_i1
+| 71 = @cil_ldind_u1
+| 72 = @cil_ldind_i2
+| 73 = @cil_ldind_u2
+| 74 = @cil_ldind_i4
+| 75 = @cil_ldind_u4
+| 76 = @cil_ldind_i8
+| 77 = @cil_ldind_i
+| 78 = @cil_ldind_r4
+| 79 = @cil_ldind_r8
+| 80 = @cil_ldind_ref
+| 81 = @cil_stind_ref
+| 82 = @cil_stind_i1
+| 83 = @cil_stind_i2
+| 84 = @cil_stind_i4
+| 85 = @cil_stind_i8
+| 86 = @cil_stind_r4
+| 87 = @cil_stind_r8
+| 88 = @cil_add
+| 89 = @cil_sub
+| 90 = @cil_mul
+| 91 = @cil_div
+| 92 = @cil_div_un
+| 93 = @cil_rem
+| 94 = @cil_rem_un
+| 95 = @cil_and
+| 96 = @cil_or
+| 97 = @cil_xor
+| 98 = @cil_shl
+| 99 = @cil_shr
+| 100 = @cil_shr_un
+| 101 = @cil_neg
+| 102 = @cil_not
+| 103 = @cil_conv_i1
+| 104 = @cil_conv_i2
+| 105 = @cil_conv_i4
+| 106 = @cil_conv_i8
+| 107 = @cil_conv_r4
+| 108 = @cil_conv_r8
+| 109 = @cil_conv_u4
+| 110 = @cil_conv_u8
+| 111 = @cil_callvirt
+| 112 = @cil_cpobj
+| 113 = @cil_ldobj
+| 114 = @cil_ldstr
+| 115 = @cil_newobj
+| 116 = @cil_castclass
+| 117 = @cil_isinst
+| 118 = @cil_conv_r_un
+| 121 = @cil_unbox
+| 122 = @cil_throw
+| 123 = @cil_ldfld
+| 124 = @cil_ldflda
+| 125 = @cil_stfld
+| 126 = @cil_ldsfld
+| 127 = @cil_ldsflda
+| 128 = @cil_stsfld
+| 129 = @cil_stobj
+| 130 = @cil_conv_ovf_i1_un
+| 131 = @cil_conv_ovf_i2_un
+| 132 = @cil_conv_ovf_i4_un
+| 133 = @cil_conv_ovf_i8_un
+| 134 = @cil_conv_ovf_u1_un
+| 135 = @cil_conv_ovf_u2_un
+| 136 = @cil_conv_ovf_u4_un
+| 137 = @cil_conv_ovf_u8_un
+| 138 = @cil_conv_ovf_i_un
+| 139 = @cil_conv_ovf_u_un
+| 140 = @cil_box
+| 141 = @cil_newarr
+| 142 = @cil_ldlen
+| 143 = @cil_ldelema
+| 144 = @cil_ldelem_i1
+| 145 = @cil_ldelem_u1
+| 146 = @cil_ldelem_i2
+| 147 = @cil_ldelem_u2
+| 148 = @cil_ldelem_i4
+| 149 = @cil_ldelem_u4
+| 150 = @cil_ldelem_i8
+| 151 = @cil_ldelem_i
+| 152 = @cil_ldelem_r4
+| 153 = @cil_ldelem_r8
+| 154 = @cil_ldelem_ref
+| 155 = @cil_stelem_i
+| 156 = @cil_stelem_i1
+| 157 = @cil_stelem_i2
+| 158 = @cil_stelem_i4
+| 159 = @cil_stelem_i8
+| 160 = @cil_stelem_r4
+| 161 = @cil_stelem_r8
+| 162 = @cil_stelem_ref
+| 163 = @cil_ldelem
+| 164 = @cil_stelem
+| 165 = @cil_unbox_any
+| 179 = @cil_conv_ovf_i1
+| 180 = @cil_conv_ovf_u1
+| 181 = @cil_conv_ovf_i2
+| 182 = @cil_conv_ovf_u2
+| 183 = @cil_conv_ovf_i4
+| 184 = @cil_conv_ovf_u4
+| 185 = @cil_conv_ovf_i8
+| 186 = @cil_conv_ovf_u8
+| 194 = @cil_refanyval
+| 195 = @cil_ckinfinite
+| 198 = @cil_mkrefany
+| 208 = @cil_ldtoken
+| 209 = @cil_conv_u2
+| 210 = @cil_conv_u1
+| 211 = @cil_conv_i
+| 212 = @cil_conv_ovf_i
+| 213 = @cil_conv_ovf_u
+| 214 = @cil_add_ovf
+| 215 = @cil_add_ovf_un
+| 216 = @cil_mul_ovf
+| 217 = @cil_mul_ovf_un
+| 218 = @cil_sub_ovf
+| 219 = @cil_sub_ovf_un
+| 220 = @cil_endfinally
+| 221 = @cil_leave
+| 222 = @cil_leave_s
+| 223 = @cil_stind_i
+| 224 = @cil_conv_u
+| 65024 = @cil_arglist
+| 65025 = @cil_ceq
+| 65026 = @cil_cgt
+| 65027 = @cil_cgt_un
+| 65028 = @cil_clt
+| 65029 = @cil_clt_un
+| 65030 = @cil_ldftn
+| 65031 = @cil_ldvirtftn
+| 65033 = @cil_ldarg
+| 65034 = @cil_ldarga
+| 65035 = @cil_starg
+| 65036 = @cil_ldloc
+| 65037 = @cil_ldloca
+| 65038 = @cil_stloc
+| 65039 = @cil_localloc
+| 65041 = @cil_endfilter
+| 65042 = @cil_unaligned
+| 65043 = @cil_volatile
+| 65044 = @cil_tail
+| 65045 = @cil_initobj
+| 65046 = @cil_constrained
+| 65047 = @cil_cpblk
+| 65048 = @cil_initblk
+| 65050 = @cil_rethrow
+| 65052 = @cil_sizeof
+| 65053 = @cil_refanytype
+| 65054 = @cil_readonly
+;
+
+// CIL ignored instructions
+
+@cil_ignore = @cil_nop | @cil_break | @cil_volatile | @cil_unaligned;
+
+// CIL local/parameter/field access
+
+@cil_ldarg_any = @cil_ldarg_0 | @cil_ldarg_1 | @cil_ldarg_2 | @cil_ldarg_3 | @cil_ldarg_s | @cil_ldarga_s | @cil_ldarg | @cil_ldarga;
+@cil_starg_any = @cil_starg | @cil_starg_s;
+
+@cil_ldloc_any = @cil_ldloc_0 | @cil_ldloc_1 | @cil_ldloc_2 | @cil_ldloc_3 | @cil_ldloc_s | @cil_ldloca_s | @cil_ldloc | @cil_ldloca;
+@cil_stloc_any = @cil_stloc_0 | @cil_stloc_1 | @cil_stloc_2 | @cil_stloc_3 | @cil_stloc_s | @cil_stloc;
+
+@cil_ldfld_any = @cil_ldfld | @cil_ldsfld | @cil_ldsflda | @cil_ldflda;
+@cil_stfld_any = @cil_stfld | @cil_stsfld;
+
+@cil_local_access = @cil_stloc_any | @cil_ldloc_any;
+@cil_arg_access = @cil_starg_any | @cil_ldarg_any;
+@cil_read_access = @cil_ldloc_any | @cil_ldarg_any | @cil_ldfld_any;
+@cil_write_access = @cil_stloc_any | @cil_starg_any | @cil_stfld_any;
+
+@cil_stack_access = @cil_local_access | @cil_arg_access;
+@cil_field_access = @cil_ldfld_any | @cil_stfld_any;
+
+@cil_access = @cil_read_access | @cil_write_access;
+
+// CIL constant/literal instructions
+
+@cil_ldc_i = @cil_ldc_i4_any | @cil_ldc_i8;
+
+@cil_ldc_i4_any = @cil_ldc_i4_m1 | @cil_ldc_i4_0 | @cil_ldc_i4_1 | @cil_ldc_i4_2 | @cil_ldc_i4_3 |
+ @cil_ldc_i4_4 | @cil_ldc_i4_5 | @cil_ldc_i4_6 | @cil_ldc_i4_7 | @cil_ldc_i4_8 | @cil_ldc_i4_s | @cil_ldc_i4;
+
+@cil_ldc_r = @cil_ldc_r4 | @cil_ldc_r8;
+
+@cil_literal = @cil_ldnull | @cil_ldc_i | @cil_ldc_r | @cil_ldstr;
+
+// Control flow
+
+@cil_conditional_jump = @cil_binary_jump | @cil_unary_jump;
+@cil_binary_jump = @cil_beq_s | @cil_bge_s | @cil_bgt_s | @cil_ble_s | @cil_blt_s |
+ @cil_bne_un_s | @cil_bge_un_s | @cil_bgt_un_s | @cil_ble_un_s | @cil_blt_un_s |
+ @cil_beq | @cil_bge | @cil_bgt | @cil_ble | @cil_blt |
+ @cil_bne_un | @cil_bge_un | @cil_bgt_un | @cil_ble_un | @cil_blt_un;
+@cil_unary_jump = @cil_brfalse_s | @cil_brtrue_s | @cil_brfalse | @cil_brtrue | @cil_switch;
+@cil_unconditional_jump = @cil_br | @cil_br_s | @cil_leave_any;
+@cil_leave_any = @cil_leave | @cil_leave_s;
+@cil_jump = @cil_unconditional_jump | @cil_conditional_jump;
+
+// CIL call instructions
+
+@cil_call_any = @cil_jmp | @cil_call | @cil_calli | @cil_tail | @cil_callvirt | @cil_newobj;
+
+// CIL expression instructions
+
+@cil_expr = @cil_literal | @cil_binary_expr | @cil_unary_expr | @cil_call_any | @cil_read_access |
+ @cil_newarr | @cil_ldtoken | @cil_sizeof |
+ @cil_ldftn | @cil_ldvirtftn | @cil_localloc | @cil_mkrefany | @cil_refanytype | @cil_arglist | @cil_dup;
+
+@cil_unary_expr =
+ @cil_conversion_operation | @cil_unary_arithmetic_operation | @cil_unary_bitwise_operation|
+ @cil_ldlen | @cil_isinst | @cil_box | @cil_ldobj | @cil_castclass | @cil_unbox_any |
+ @cil_ldind | @cil_unbox;
+
+@cil_conversion_operation =
+ @cil_conv_i1 | @cil_conv_i2 | @cil_conv_i4 | @cil_conv_i8 |
+ @cil_conv_u1 | @cil_conv_u2 | @cil_conv_u4 | @cil_conv_u8 |
+ @cil_conv_ovf_i | @cil_conv_ovf_i_un | @cil_conv_ovf_i1 | @cil_conv_ovf_i1_un |
+ @cil_conv_ovf_i2 | @cil_conv_ovf_i2_un | @cil_conv_ovf_i4 | @cil_conv_ovf_i4_un |
+ @cil_conv_ovf_i8 | @cil_conv_ovf_i8_un | @cil_conv_ovf_u | @cil_conv_ovf_u_un |
+ @cil_conv_ovf_u1 | @cil_conv_ovf_u1_un | @cil_conv_ovf_u2 | @cil_conv_ovf_u2_un |
+ @cil_conv_ovf_u4 | @cil_conv_ovf_u4_un | @cil_conv_ovf_u8 | @cil_conv_ovf_u8_un |
+ @cil_conv_r4 | @cil_conv_r8 | @cil_conv_ovf_u2 | @cil_conv_ovf_u2_un |
+ @cil_conv_i | @cil_conv_u | @cil_conv_r_un;
+
+@cil_ldind = @cil_ldind_i | @cil_ldind_i1 | @cil_ldind_i2 | @cil_ldind_i4 | @cil_ldind_i8 |
+ @cil_ldind_r4 | @cil_ldind_r8 | @cil_ldind_ref | @cil_ldind_u1 | @cil_ldind_u2 | @cil_ldind_u4;
+
+@cil_stind = @cil_stind_i | @cil_stind_i1 | @cil_stind_i2 | @cil_stind_i4 | @cil_stind_i8 |
+ @cil_stind_r4 | @cil_stind_r8 | @cil_stind_ref;
+
+@cil_bitwise_operation = @cil_binary_bitwise_operation | @cil_unary_bitwise_operation;
+
+@cil_binary_bitwise_operation = @cil_and | @cil_or | @cil_xor | @cil_shr | @cil_shr | @cil_shr_un | @cil_shl;
+
+@cil_binary_arithmetic_operation = @cil_add | @cil_sub | @cil_mul | @cil_div | @cil_div_un |
+ @cil_rem | @cil_rem_un | @cil_add_ovf | @cil_add_ovf_un | @cil_mul_ovf | @cil_mul_ovf_un |
+ @cil_sub_ovf | @cil_sub_ovf_un;
+
+@cil_unary_bitwise_operation = @cil_not;
+
+@cil_binary_expr = @cil_binary_arithmetic_operation | @cil_binary_bitwise_operation | @cil_read_array | @cil_comparison_operation;
+
+@cil_unary_arithmetic_operation = @cil_neg;
+
+@cil_comparison_operation = @cil_cgt_un | @cil_ceq | @cil_cgt | @cil_clt | @cil_clt_un;
+
+// Elements that retrieve an address of something
+@cil_read_ref = @cil_ldloca_s | @cil_ldarga_s | @cil_ldflda | @cil_ldsflda | @cil_ldelema;
+
+// CIL array instructions
+
+@cil_read_array =
+ @cil_ldelem | @cil_ldelema | @cil_ldelem_i1 | @cil_ldelem_ref | @cil_ldelem_i |
+ @cil_ldelem_i1 | @cil_ldelem_i2 | @cil_ldelem_i4 | @cil_ldelem_i8 | @cil_ldelem_r4 |
+ @cil_ldelem_r8 | @cil_ldelem_u1 | @cil_ldelem_u2 | @cil_ldelem_u4;
+
+@cil_write_array = @cil_stelem | @cil_stelem_ref |
+ @cil_stelem_i | @cil_stelem_i1 | @cil_stelem_i2 | @cil_stelem_i4 | @cil_stelem_i8 |
+ @cil_stelem_r4 | @cil_stelem_r8;
+
+@cil_throw_any = @cil_throw | @cil_rethrow;
+
+#keyset[impl, index]
+cil_instruction(
+ unique int id: @cil_instruction,
+ int opcode: int ref,
+ int index: int ref,
+ int impl: @cil_method_implementation ref);
+
+cil_jump(
+ unique int instruction: @cil_jump ref,
+ int target: @cil_instruction ref);
+
+cil_access(
+ unique int instruction: @cil_instruction ref,
+ int target: @cil_accessible ref);
+
+cil_value(
+ unique int instruction: @cil_literal ref,
+ string value: string ref);
+
+#keyset[instruction, index]
+cil_switch(
+ int instruction: @cil_switch ref,
+ int index: int ref,
+ int target: @cil_instruction ref);
+
+cil_instruction_location(
+ unique int id: @cil_instruction ref,
+ int loc: @location ref);
+
+cil_type_location(
+ int id: @cil_type ref,
+ int loc: @location ref);
+
+cil_method_location(
+ int id: @cil_method ref,
+ int loc: @location ref);
+
+@cil_namespace = @namespace;
+
+@cil_type_container = @cil_type | @cil_namespace | @cil_method;
+
+case @cil_type.kind of
+ 0 = @cil_valueorreftype
+| 1 = @cil_typeparameter
+| 2 = @cil_array_type
+| 3 = @cil_pointer_type
+| 4 = @cil_function_pointer_type
+;
+
+cil_type(
+ unique int id: @cil_type,
+ string name: string ref,
+ int kind: int ref,
+ int parent: @cil_type_container ref,
+ int sourceDecl: @cil_type ref);
+
+cil_pointer_type(
+ unique int id: @cil_pointer_type ref,
+ int pointee: @cil_type ref);
+
+cil_array_type(
+ unique int id: @cil_array_type ref,
+ int element_type: @cil_type ref,
+ int rank: int ref);
+
+cil_function_pointer_return_type(
+ unique int id: @cil_function_pointer_type ref,
+ int return_type: @cil_type ref);
+
+cil_method(
+ unique int id: @cil_method,
+ string name: string ref,
+ int parent: @cil_type ref,
+ int return_type: @cil_type ref);
+
+cil_method_source_declaration(
+ unique int method: @cil_method ref,
+ int source: @cil_method ref);
+
+cil_method_implementation(
+ unique int id: @cil_method_implementation,
+ int method: @cil_method ref,
+ int location: @assembly ref);
+
+cil_implements(
+ int id: @cil_method ref,
+ int decl: @cil_method ref);
+
+#keyset[parent, name]
+cil_field(
+ unique int id: @cil_field,
+ int parent: @cil_type ref,
+ string name: string ref,
+ int field_type: @cil_type ref);
+
+@cil_element = @cil_instruction | @cil_declaration | @cil_handler | @cil_attribute | @cil_namespace;
+@cil_named_element = @cil_declaration | @cil_namespace;
+@cil_declaration = @cil_variable | @cil_method | @cil_type | @cil_member;
+@cil_accessible = @cil_declaration;
+@cil_variable = @cil_field | @cil_stack_variable;
+@cil_stack_variable = @cil_local_variable | @cil_parameter;
+@cil_member = @cil_method | @cil_type | @cil_field | @cil_property | @cil_event;
+@cil_custom_modifier_receiver = @cil_method | @cil_property | @cil_parameter | @cil_field | @cil_function_pointer_type;
+@cil_parameterizable = @cil_method | @cil_function_pointer_type;
+@cil_has_type_annotation = @cil_stack_variable | @cil_property | @cil_method | @cil_function_pointer_type;
+
+#keyset[parameterizable, index]
+cil_parameter(
+ unique int id: @cil_parameter,
+ int parameterizable: @cil_parameterizable ref,
+ int index: int ref,
+ int param_type: @cil_type ref);
+
+cil_parameter_in(unique int id: @cil_parameter ref);
+cil_parameter_out(unique int id: @cil_parameter ref);
+
+cil_setter(unique int prop: @cil_property ref,
+ int method: @cil_method ref);
+
+#keyset[id, modifier]
+cil_custom_modifiers(
+ int id: @cil_custom_modifier_receiver ref,
+ int modifier: @cil_type ref,
+ int kind: int ref); // modreq: 1, modopt: 0
+
+cil_type_annotation(
+ int id: @cil_has_type_annotation ref,
+ int annotation: int ref);
+
+cil_getter(unique int prop: @cil_property ref,
+ int method: @cil_method ref);
+
+cil_adder(unique int event: @cil_event ref,
+ int method: @cil_method ref);
+
+cil_remover(unique int event: @cil_event ref, int method: @cil_method ref);
+
+cil_raiser(unique int event: @cil_event ref, int method: @cil_method ref);
+
+cil_property(
+ unique int id: @cil_property,
+ int parent: @cil_type ref,
+ string name: string ref,
+ int property_type: @cil_type ref);
+
+#keyset[parent, name]
+cil_event(unique int id: @cil_event,
+ int parent: @cil_type ref,
+ string name: string ref,
+ int event_type: @cil_type ref);
+
+#keyset[impl, index]
+cil_local_variable(
+ unique int id: @cil_local_variable,
+ int impl: @cil_method_implementation ref,
+ int index: int ref,
+ int var_type: @cil_type ref);
+
+cil_function_pointer_calling_conventions(
+ int id: @cil_function_pointer_type ref,
+ int kind: int ref);
+
+// CIL handlers (exception handlers etc).
+
+case @cil_handler.kind of
+ 0 = @cil_catch_handler
+| 1 = @cil_filter_handler
+| 2 = @cil_finally_handler
+| 4 = @cil_fault_handler
+;
+
+#keyset[impl, index]
+cil_handler(
+ unique int id: @cil_handler,
+ int impl: @cil_method_implementation ref,
+ int index: int ref,
+ int kind: int ref,
+ int try_start: @cil_instruction ref,
+ int try_end: @cil_instruction ref,
+ int handler_start: @cil_instruction ref);
+
+cil_handler_filter(
+ unique int id: @cil_handler ref,
+ int filter_start: @cil_instruction ref);
+
+cil_handler_type(
+ unique int id: @cil_handler ref,
+ int catch_type: @cil_type ref);
+
+@cil_controlflow_node = @cil_entry_point | @cil_instruction;
+
+@cil_entry_point = @cil_method_implementation | @cil_handler;
+
+@cil_dataflow_node = @cil_instruction | @cil_variable | @cil_method;
+
+cil_method_stack_size(
+ unique int method: @cil_method_implementation ref,
+ int size: int ref);
+
+// CIL modifiers
+
+cil_public(int id: @cil_member ref);
+cil_private(int id: @cil_member ref);
+cil_protected(int id: @cil_member ref);
+cil_internal(int id: @cil_member ref);
+cil_static(int id: @cil_member ref);
+cil_sealed(int id: @cil_member ref);
+cil_virtual(int id: @cil_method ref);
+cil_abstract(int id: @cil_member ref);
+cil_class(int id: @cil_type ref);
+cil_interface(int id: @cil_type ref);
+cil_security(int id: @cil_member ref);
+cil_requiresecobject(int id: @cil_method ref);
+cil_specialname(int id: @cil_method ref);
+cil_newslot(int id: @cil_method ref);
+
+cil_base_class(unique int id: @cil_type ref, int base: @cil_type ref);
+cil_base_interface(int id: @cil_type ref, int base: @cil_type ref);
+cil_enum_underlying_type(unique int id: @cil_type ref, int underlying: @cil_type ref);
+
+#keyset[unbound, index]
+cil_type_parameter(
+ int unbound: @cil_member ref,
+ int index: int ref,
+ int param: @cil_typeparameter ref);
+
+#keyset[bound, index]
+cil_type_argument(
+ int bound: @cil_member ref,
+ int index: int ref,
+ int t: @cil_type ref);
+
+// CIL type parameter constraints
+
+cil_typeparam_covariant(int tp: @cil_typeparameter ref);
+cil_typeparam_contravariant(int tp: @cil_typeparameter ref);
+cil_typeparam_class(int tp: @cil_typeparameter ref);
+cil_typeparam_struct(int tp: @cil_typeparameter ref);
+cil_typeparam_new(int tp: @cil_typeparameter ref);
+cil_typeparam_constraint(int tp: @cil_typeparameter ref, int supertype: @cil_type ref);
+
+// CIL attributes
+
+cil_attribute(
+ unique int attributeid: @cil_attribute,
+ int element: @cil_declaration ref,
+ int constructor: @cil_method ref);
+
+#keyset[attribute_id, param]
+cil_attribute_named_argument(
+ int attribute_id: @cil_attribute ref,
+ string param: string ref,
+ string value: string ref);
+
+#keyset[attribute_id, index]
+cil_attribute_positional_argument(
+ int attribute_id: @cil_attribute ref,
+ int index: int ref,
+ string value: string ref);
+
+
+// Common .Net data model covering both C# and CIL
+
+// Common elements
+@dotnet_element = @element | @cil_element;
+@dotnet_named_element = @named_element | @cil_named_element;
+@dotnet_callable = @callable | @cil_method;
+@dotnet_variable = @variable | @cil_variable;
+@dotnet_field = @field | @cil_field;
+@dotnet_parameter = @parameter | @cil_parameter;
+@dotnet_declaration = @declaration | @cil_declaration;
+@dotnet_member = @member | @cil_member;
+@dotnet_event = @event | @cil_event;
+@dotnet_property = @property | @cil_property | @indexer;
+@dotnet_parameterizable = @parameterizable | @cil_parameterizable;
+
+// Common types
+@dotnet_type = @type | @cil_type;
+@dotnet_call = @call | @cil_call_any;
+@dotnet_throw = @throw_element | @cil_throw_any;
+@dotnet_valueorreftype = @cil_valueorreftype | @value_or_ref_type | @cil_array_type | @void_type;
+@dotnet_typeparameter = @type_parameter | @cil_typeparameter;
+@dotnet_array_type = @array_type | @cil_array_type;
+@dotnet_pointer_type = @pointer_type | @cil_pointer_type;
+@dotnet_type_parameter = @type_parameter | @cil_typeparameter;
+@dotnet_generic = @dotnet_valueorreftype | @dotnet_callable;
+
+// Attributes
+@dotnet_attribute = @attribute | @cil_attribute;
+
+// Expressions
+@dotnet_expr = @expr | @cil_expr;
+
+// Literals
+@dotnet_literal = @literal_expr | @cil_literal;
+@dotnet_string_literal = @string_literal_expr | @cil_ldstr;
+@dotnet_int_literal = @integer_literal_expr | @cil_ldc_i;
+@dotnet_float_literal = @float_literal_expr | @cil_ldc_r;
+@dotnet_null_literal = @null_literal_expr | @cil_ldnull;
+
+@metadata_entity = @cil_method | @cil_type | @cil_field | @cil_property | @field | @property |
+ @callable | @value_or_ref_type | @void_type;
+
+#keyset[entity, location]
+metadata_handle(int entity : @metadata_entity ref, int location: @assembly ref, int handle: int ref)
diff --git a/csharp/ql/src/semmlecode.csharp.dbscheme.stats b/csharp/ql/lib/semmlecode.csharp.dbscheme.stats
similarity index 100%
rename from csharp/ql/src/semmlecode.csharp.dbscheme.stats
rename to csharp/ql/lib/semmlecode.csharp.dbscheme.stats
diff --git a/csharp/ql/src/Security Features/CWE-327/InsecureSQLConnection.ql b/csharp/ql/src/Security Features/CWE-327/InsecureSQLConnection.ql
index fd4a37f7ee3..25c8ea6ef89 100644
--- a/csharp/ql/src/Security Features/CWE-327/InsecureSQLConnection.ql
+++ b/csharp/ql/src/Security Features/CWE-327/InsecureSQLConnection.ql
@@ -14,9 +14,9 @@ import csharp
import DataFlow::PathGraph
/**
- * A `DataFlow::Configuration` for tracking `Strings passed to SqlConnectionStringBuilder` instances.
+ * A data flow configuration for tracking strings passed to `SqlConnection[StringBuilder]` instances.
*/
-class TaintTrackingConfiguration extends TaintTracking::Configuration {
+class TaintTrackingConfiguration extends DataFlow::Configuration {
TaintTrackingConfiguration() { this = "TaintTrackingConfiguration" }
override predicate isSource(DataFlow::Node source) {
diff --git a/csharp/ql/src/Security Features/CWE-502/UnsafeDeserializationUntrustedInput.qhelp b/csharp/ql/src/Security Features/CWE-502/UnsafeDeserializationUntrustedInput.qhelp
index 3ba934ba391..7c8781b15a1 100644
--- a/csharp/ql/src/Security Features/CWE-502/UnsafeDeserializationUntrustedInput.qhelp
+++ b/csharp/ql/src/Security Features/CWE-502/UnsafeDeserializationUntrustedInput.qhelp
@@ -27,6 +27,17 @@ it may be necessary to use a different deserialization framework.
+
In the following example potentially untrusted stream and type is deserialized using a
+DataContractJsonSerializer which is known to be vulnerable with user supplied types.
+
+
+
+
To fix this specific vulnerability, we are using hardcoded
+Plain Old CLR Object (POCO) type. In other cases,
+it may be necessary to use a different deserialization framework.
+
+
+
diff --git a/csharp/ql/src/Security Features/CWE-502/UnsafeDeserializationUntrustedInput.ql b/csharp/ql/src/Security Features/CWE-502/UnsafeDeserializationUntrustedInput.ql
index 1b8c6dae91e..1464da87ba6 100644
--- a/csharp/ql/src/Security Features/CWE-502/UnsafeDeserializationUntrustedInput.ql
+++ b/csharp/ql/src/Security Features/CWE-502/UnsafeDeserializationUntrustedInput.ql
@@ -15,7 +15,46 @@ import csharp
import semmle.code.csharp.security.dataflow.UnsafeDeserializationQuery
import DataFlow::PathGraph
-from TaintTrackingConfig config, DataFlow::PathNode source, DataFlow::PathNode sink
-where config.hasFlowPath(source, sink)
-select sink.getNode(), source, sink, "$@ flows to unsafe deserializer.", source.getNode(),
- "User-provided data"
+from DataFlow::PathNode userInput, DataFlow::PathNode deserializeCallArg
+where
+ exists(TaintToObjectMethodTrackingConfig taintTracking |
+ // all flows from user input to deserialization with weak and strong type serializers
+ taintTracking.hasFlowPath(userInput, deserializeCallArg)
+ ) and
+ // intersect with strong types, but user controlled or weak types deserialization usages
+ (
+ exists(
+ DataFlow::Node weakTypeCreation, DataFlow::Node weakTypeUsage,
+ WeakTypeCreationToUsageTrackingConfig weakTypeDeserializerTracking, MethodCall mc
+ |
+ weakTypeDeserializerTracking.hasFlow(weakTypeCreation, weakTypeUsage) and
+ mc.getQualifier() = weakTypeUsage.asExpr() and
+ mc.getAnArgument() = deserializeCallArg.getNode().asExpr()
+ )
+ or
+ exists(
+ TaintToObjectTypeTrackingConfig userControlledTypeTracking, DataFlow::Node taintedTypeUsage,
+ DataFlow::Node userInput2, MethodCall mc
+ |
+ userControlledTypeTracking.hasFlow(userInput2, taintedTypeUsage) and
+ mc.getQualifier() = taintedTypeUsage.asExpr() and
+ mc.getAnArgument() = deserializeCallArg.getNode().asExpr()
+ )
+ )
+ or
+ // no type check needed - straightforward taint -> sink
+ exists(TaintToConstructorOrStaticMethodTrackingConfig taintTracking2 |
+ taintTracking2.hasFlowPath(userInput, deserializeCallArg)
+ )
+ or
+ // JsonConvert static method call, but with additional unsafe typename tracking
+ exists(
+ JsonConvertTrackingConfig taintTrackingJsonConvert, TypeNameTrackingConfig typenameTracking,
+ DataFlow::Node settingsCallArg
+ |
+ taintTrackingJsonConvert.hasFlowPath(userInput, deserializeCallArg) and
+ typenameTracking.hasFlow(_, settingsCallArg) and
+ deserializeCallArg.getNode().asExpr().getParent() = settingsCallArg.asExpr().getParent()
+ )
+select deserializeCallArg, userInput, deserializeCallArg, "$@ flows to unsafe deserializer.",
+ userInput, "User-provided data"
diff --git a/csharp/ql/src/Security Features/CWE-502/UnsafeDeserializationUntrustedInputGood.cs b/csharp/ql/src/Security Features/CWE-502/UnsafeDeserializationUntrustedInputGood.cs
index d1e2935b218..d6b5b09841b 100644
--- a/csharp/ql/src/Security Features/CWE-502/UnsafeDeserializationUntrustedInputGood.cs
+++ b/csharp/ql/src/Security Features/CWE-502/UnsafeDeserializationUntrustedInputGood.cs
@@ -6,7 +6,7 @@ class Good
public static object Deserialize(TextBox textBox)
{
JavaScriptSerializer sr = new JavaScriptSerializer();
- // GOOD
+ // GOOD: no unsafe type resolver
return sr.DeserializeObject(textBox.Text);
}
}
diff --git a/csharp/ql/src/Security Features/CWE-502/UnsafeDeserializationUntrustedInputTypeBad.cs b/csharp/ql/src/Security Features/CWE-502/UnsafeDeserializationUntrustedInputTypeBad.cs
new file mode 100644
index 00000000000..4e439cab8c7
--- /dev/null
+++ b/csharp/ql/src/Security Features/CWE-502/UnsafeDeserializationUntrustedInputTypeBad.cs
@@ -0,0 +1,13 @@
+using System.Runtime.Serialization.Json;
+using System.IO;
+using System;
+
+class BadDataContractJsonSerializer
+{
+ public static object Deserialize(string type, Stream s)
+ {
+ // BAD: stream and type are potentially untrusted
+ var ds = new DataContractJsonSerializer(Type.GetType(type));
+ return ds.ReadObject(s);
+ }
+}
diff --git a/csharp/ql/src/Security Features/CWE-502/UnsafeDeserializationUntrustedInputTypeGood.cs b/csharp/ql/src/Security Features/CWE-502/UnsafeDeserializationUntrustedInputTypeGood.cs
new file mode 100644
index 00000000000..1a97f009120
--- /dev/null
+++ b/csharp/ql/src/Security Features/CWE-502/UnsafeDeserializationUntrustedInputTypeGood.cs
@@ -0,0 +1,20 @@
+using System.Runtime.Serialization.Json;
+using System.IO;
+using System;
+
+class Poco
+{
+ public int Count;
+
+ public string Comment;
+}
+
+class GoodDataContractJsonSerializer
+{
+ public static Poco Deserialize(Stream s)
+ {
+ // GOOD: while stream is potentially untrusted, the instantiated type is hardcoded
+ var ds = new DataContractJsonSerializer(typeof(Poco));
+ return (Poco)ds.ReadObject(s);
+ }
+}
diff --git a/csharp/ql/src/Security Features/InsecureRandomness.cs b/csharp/ql/src/Security Features/InsecureRandomness.cs
index e8dd58dc6ea..eb4649d54f1 100644
--- a/csharp/ql/src/Security Features/InsecureRandomness.cs
+++ b/csharp/ql/src/Security Features/InsecureRandomness.cs
@@ -15,7 +15,7 @@ string GeneratePassword()
password = "mypassword" + BitConverter.ToInt32(randomBytes);
}
- // GOOD: Password is generated using a cryptographically secure RNG
+ // BAD: Membership.GeneratePassword generates a password with a bias
password = Membership.GeneratePassword(12, 3);
return password;
diff --git a/csharp/ql/src/Security Features/InsecureRandomness.ql b/csharp/ql/src/Security Features/InsecureRandomness.ql
index b618bff07a5..08b46a41439 100644
--- a/csharp/ql/src/Security Features/InsecureRandomness.ql
+++ b/csharp/ql/src/Security Features/InsecureRandomness.ql
@@ -59,6 +59,13 @@ module Random {
this.getExpr() =
any(MethodCall mc |
mc.getQualifier().getType().(RefType).hasQualifiedName("System", "Random")
+ or
+ // by using `% 87` on a `byte`, `System.Web.Security.Membership.GeneratePassword` has a bias
+ mc.getQualifier()
+ .getType()
+ .(RefType)
+ .hasQualifiedName("System.Web.Security", "Membership") and
+ mc.getTarget().hasName("GeneratePassword")
)
}
}
diff --git a/csharp/ql/src/Stubs/Stubs.qll b/csharp/ql/src/Stubs/Stubs.qll
index 4a178980a52..55fedec2c74 100644
--- a/csharp/ql/src/Stubs/Stubs.qll
+++ b/csharp/ql/src/Stubs/Stubs.qll
@@ -169,7 +169,7 @@ abstract private class GeneratedType extends Type, GeneratedElement {
t = this.getAnInterestingBaseType() and
(if t instanceof Class then i = 0 else i = 1)
|
- stubClassName(t), ", " order by i
+ stubClassName(t), ", " order by i, t.getQualifiedName()
)
else result = ""
}
@@ -180,7 +180,7 @@ abstract private class GeneratedType extends Type, GeneratedElement {
concat(GeneratedMember m |
m = this.getAGeneratedMember(assembly)
|
- stubMember(m, assembly) order by m.getName()
+ stubMember(m, assembly) order by m.getQualifiedNameWithTypes()
)
}
diff --git a/csharp/ql/src/codeql-suites/csharp-code-scanning.qls b/csharp/ql/src/codeql-suites/csharp-code-scanning.qls
index 3646204da7d..56e07ccd10d 100644
--- a/csharp/ql/src/codeql-suites/csharp-code-scanning.qls
+++ b/csharp/ql/src/codeql-suites/csharp-code-scanning.qls
@@ -1,4 +1,4 @@
- description: Standard Code Scanning queries for C#
-- qlpack: codeql-csharp
+- queries: .
- apply: code-scanning-selectors.yml
- from: codeql-suite-helpers
+ from: codeql/suite-helpers
diff --git a/csharp/ql/src/codeql-suites/csharp-lgtm-full.qls b/csharp/ql/src/codeql-suites/csharp-lgtm-full.qls
index 8ba077663d0..e1dbf6b48d9 100644
--- a/csharp/ql/src/codeql-suites/csharp-lgtm-full.qls
+++ b/csharp/ql/src/codeql-suites/csharp-lgtm-full.qls
@@ -1,7 +1,7 @@
- description: Standard LGTM queries for C#, including ones not displayed by default
-- qlpack: codeql-csharp
+- queries: .
- apply: lgtm-selectors.yml
- from: codeql-suite-helpers
+ from: codeql/suite-helpers
# These are only for IDE use.
- exclude:
tags contain:
diff --git a/csharp/ql/src/codeql-suites/csharp-lgtm.qls b/csharp/ql/src/codeql-suites/csharp-lgtm.qls
index 1e8a9a2fb7c..d6f9a355b69 100644
--- a/csharp/ql/src/codeql-suites/csharp-lgtm.qls
+++ b/csharp/ql/src/codeql-suites/csharp-lgtm.qls
@@ -1,4 +1,4 @@
- description: Standard LGTM queries for C#
- apply: codeql-suites/csharp-lgtm-full.qls
- apply: lgtm-displayed-only.yml
- from: codeql-suite-helpers
+ from: codeql/suite-helpers
diff --git a/csharp/ql/src/codeql-suites/csharp-security-and-quality.qls b/csharp/ql/src/codeql-suites/csharp-security-and-quality.qls
index 20ead656db0..5bb3a54f6ee 100644
--- a/csharp/ql/src/codeql-suites/csharp-security-and-quality.qls
+++ b/csharp/ql/src/codeql-suites/csharp-security-and-quality.qls
@@ -1,4 +1,4 @@
- description: Security-and-quality queries for C#
-- qlpack: codeql-csharp
+- queries: .
- apply: security-and-quality-selectors.yml
- from: codeql-suite-helpers
+ from: codeql/suite-helpers
diff --git a/csharp/ql/src/codeql-suites/csharp-security-extended.qls b/csharp/ql/src/codeql-suites/csharp-security-extended.qls
index b74ffa9c2e0..fc9f7c89390 100644
--- a/csharp/ql/src/codeql-suites/csharp-security-extended.qls
+++ b/csharp/ql/src/codeql-suites/csharp-security-extended.qls
@@ -1,4 +1,4 @@
- description: Security-extended queries for C#
-- qlpack: codeql-csharp
+- queries: .
- apply: security-extended-selectors.yml
- from: codeql-suite-helpers
+ from: codeql/suite-helpers
diff --git a/csharp/ql/src/codeql-suites/solorigate.qls b/csharp/ql/src/codeql-suites/solorigate.qls
index f6e575bb700..d1c1cd82e1f 100644
--- a/csharp/ql/src/codeql-suites/solorigate.qls
+++ b/csharp/ql/src/codeql-suites/solorigate.qls
@@ -1,4 +1,4 @@
- description: Queries related to Solorigate
-- qlpack: codeql-csharp
+- queries: .
- include:
tags contain: solorigate
diff --git a/csharp/ql/src/definitions.qll b/csharp/ql/src/definitions.qll
index c1b456f4dbf..ade40435e18 100644
--- a/csharp/ql/src/definitions.qll
+++ b/csharp/ql/src/definitions.qll
@@ -158,11 +158,10 @@ private class TypeMentionUse extends Use, TypeMention {
Use.super.hasLocationInfo(filepath, startline, startcolumn, endline, _) and
endcolumn =
startcolumn +
- this.getType().(ConstructedType).getUnboundGeneric().getNameWithoutBrackets().length() - 1
+ this.getType().(ConstructedType).getUnboundGeneric().getUndecoratedName().length() - 1
or
Use.super.hasLocationInfo(filepath, startline, startcolumn, endline, _) and
- endcolumn =
- startcolumn + this.getType().(UnboundGenericType).getNameWithoutBrackets().length() - 1
+ endcolumn = startcolumn + this.getType().(UnboundGenericType).getUndecoratedName().length() - 1
or
not this.getType() instanceof ConstructedType and
not this.getType() instanceof UnboundGenericType and
diff --git a/csharp/ql/src/experimental/ir/implementation/raw/IRConsistency.qll b/csharp/ql/src/experimental/ir/implementation/raw/IRConsistency.qll
index f331f4c87bf..31983d34247 100644
--- a/csharp/ql/src/experimental/ir/implementation/raw/IRConsistency.qll
+++ b/csharp/ql/src/experimental/ir/implementation/raw/IRConsistency.qll
@@ -35,7 +35,7 @@ module InstructionConsistency {
// To avoid an overwhelming number of results when the extractor merges functions with the
// same name, just pick a single location.
result =
- rank[1](Language::Location loc | loc = irFunc.getLocation() | loc order by loc.toString())
+ min(Language::Location loc | loc = irFunc.getLocation() | loc order by loc.toString())
}
}
diff --git a/csharp/ql/src/experimental/ir/implementation/unaliased_ssa/IRConsistency.qll b/csharp/ql/src/experimental/ir/implementation/unaliased_ssa/IRConsistency.qll
index f331f4c87bf..31983d34247 100644
--- a/csharp/ql/src/experimental/ir/implementation/unaliased_ssa/IRConsistency.qll
+++ b/csharp/ql/src/experimental/ir/implementation/unaliased_ssa/IRConsistency.qll
@@ -35,7 +35,7 @@ module InstructionConsistency {
// To avoid an overwhelming number of results when the extractor merges functions with the
// same name, just pick a single location.
result =
- rank[1](Language::Location loc | loc = irFunc.getLocation() | loc order by loc.toString())
+ min(Language::Location loc | loc = irFunc.getLocation() | loc order by loc.toString())
}
}
diff --git a/csharp/ql/src/qlpack.yml b/csharp/ql/src/qlpack.yml
index 6bb4774c070..8dac78c9b45 100644
--- a/csharp/ql/src/qlpack.yml
+++ b/csharp/ql/src/qlpack.yml
@@ -1,5 +1,7 @@
-name: codeql-csharp
-version: 0.0.0
-dbscheme: semmlecode.csharp.dbscheme
+name: codeql/csharp-queries
+version: 0.0.2
suites: codeql-suites
extractor: csharp
+dependencies:
+ codeql/csharp-all: ^0.0.2
+ codeql/suite-helpers: ^0.0.2
diff --git a/csharp/ql/src/semmle/code/csharp/security/dataflow/UnsafeDeserializationQuery.qll b/csharp/ql/src/semmle/code/csharp/security/dataflow/UnsafeDeserializationQuery.qll
deleted file mode 100644
index 7d710575ce2..00000000000
--- a/csharp/ql/src/semmle/code/csharp/security/dataflow/UnsafeDeserializationQuery.qll
+++ /dev/null
@@ -1,79 +0,0 @@
-/**
- * Provides a taint-tracking configuration for reasoning about uncontrolled data
- * in calls to unsafe deserializers (XML, JSON, XAML).
- */
-
-import csharp
-private import semmle.code.csharp.security.dataflow.flowsources.Remote
-private import semmle.code.csharp.serialization.Deserializers
-
-/**
- * A data flow source for unsafe deserialization vulnerabilities.
- */
-abstract class Source extends DataFlow::Node { }
-
-/**
- * A data flow sink for unsafe deserialization vulnerabilities.
- */
-abstract class Sink extends DataFlow::Node { }
-
-/**
- * A sanitizer for unsafe deserialization vulnerabilities.
- */
-abstract class Sanitizer extends DataFlow::Node { }
-
-/**
- * A taint-tracking configuration for reasoning about unsafe deserialization.
- */
-class TaintTrackingConfig extends TaintTracking::Configuration {
- TaintTrackingConfig() { this = "UnsafeDeserialization" }
-
- override predicate isSource(DataFlow::Node source) { source instanceof Source }
-
- override predicate isSink(DataFlow::Node sink) { sink instanceof Sink }
-
- override predicate isSanitizer(DataFlow::Node node) { node instanceof Sanitizer }
-}
-
-private class RemoteSource extends Source {
- RemoteSource() { this instanceof RemoteFlowSource }
-}
-
-/** A call to an unsafe deserializer. */
-private class UnsafeDeserializerSink extends Sink {
- UnsafeDeserializerSink() {
- exists(Call c |
- this.asExpr() = c.getAnArgument() and
- c.getTarget() instanceof UnsafeDeserializer
- )
- }
-}
-
-private class JavaScriptSerializerClass extends Class {
- JavaScriptSerializerClass() {
- this.hasQualifiedName("System.Web.Script.Serialization.JavaScriptSerializer")
- }
-}
-
-/**
- * An unsafe use of a JavaScript deserializer. That is, a use with a custom type-resolver
- * (constructor parameter).
- */
-private class JavaScriptSerializerSink extends Sink {
- JavaScriptSerializerSink() {
- exists(ObjectCreation oc |
- oc.getTarget().getDeclaringType() instanceof JavaScriptSerializerClass and
- oc.getTarget().getNumberOfParameters() > 0 and
- exists(MethodCall mc, Method m |
- m = mc.getTarget() and
- m.getDeclaringType() instanceof JavaScriptSerializerClass and
- (
- m.hasName("Deserialize") or
- m.hasName("DeserializeObject")
- ) and
- this.asExpr() = mc.getAnArgument() and
- DataFlow::localFlow(DataFlow::exprNode(oc), DataFlow::exprNode(mc.getQualifier()))
- )
- )
- }
-}
diff --git a/csharp/ql/src/semmle/code/csharp/serialization/Deserializers.qll b/csharp/ql/src/semmle/code/csharp/serialization/Deserializers.qll
deleted file mode 100644
index 8bb6e8d2b24..00000000000
--- a/csharp/ql/src/semmle/code/csharp/serialization/Deserializers.qll
+++ /dev/null
@@ -1,67 +0,0 @@
-/**
- * Provides a library of known unsafe deserializers.
- * See https://www.blackhat.com/docs/us-17/thursday/us-17-Munoz-Friday-The-13th-Json-Attacks.pdf.
- */
-
-import csharp
-
-/** An unsafe deserializer. */
-abstract class UnsafeDeserializer extends Callable { }
-
-/** An unsafe deserializer method in the `System.*` namespace. */
-class SystemDeserializer extends UnsafeDeserializer {
- SystemDeserializer() {
- this.hasQualifiedName("System.Runtime.Serialization.Formatters.Binary.BinaryFormatter",
- "Deserialize")
- or
- this.hasQualifiedName("System.Runtime.Serialization.Formatters.Binary.BinaryFormatter",
- "UnsafeDeserialize")
- or
- this.hasQualifiedName("System.Runtime.Serialization.Formatters.Binary.BinaryFormatter",
- "UnsafeDeserializeMethodResponse")
- or
- this.hasQualifiedName("System.Runtime.Deserialization.Formatters.Soap.SoapFormatter",
- "Deserialize")
- or
- this.hasQualifiedName("System.Web.UI.ObjectStateFormatter", "Deserialize")
- or
- this.hasQualifiedName("System.Runtime.Serialization.NetDataContractSerializer", "Deserialize")
- or
- this.hasQualifiedName("System.Runtime.Serialization.NetDataContractSerializer", "ReadObject")
- or
- this.hasQualifiedName("System.Web.UI.LosFormatter", "Deserialize")
- or
- this.hasQualifiedName("System.Workflow.ComponentModel.Activity", "Load")
- or
- this.hasQualifiedName("System.Resources.ResourceReader", "ResourceReader")
- or
- this.hasQualifiedName("System.Messaging", "BinaryMessageFormatter")
- or
- this.hasQualifiedName("System.Windows.Markup.XamlReader", "Parse")
- or
- this.hasQualifiedName("System.Windows.Markup.XamlReader", "Load")
- or
- this.hasQualifiedName("System.Windows.Markup.XamlReader", "LoadAsync")
- }
-}
-
-/** An unsafe deserializer method in the `Microsoft.*` namespace. */
-class MicrosoftDeserializer extends UnsafeDeserializer {
- MicrosoftDeserializer() {
- this.hasQualifiedName("Microsoft.Web.Design.Remote.ProxyObject", "DecodeValue")
- }
-}
-
-/**
- * An unsafe deserializer method that calls any unsafe deserializer on any of
- * the parameters.
- */
-class WrapperDeserializer extends UnsafeDeserializer {
- WrapperDeserializer() {
- exists(Call call |
- call.getEnclosingCallable() = this and
- call.getAnArgument() instanceof ParameterAccess and
- call.getTarget() instanceof UnsafeDeserializer
- )
- }
-}
diff --git a/csharp/ql/test/library-tests/controlflow/graph/BasicBlock.expected b/csharp/ql/test/library-tests/controlflow/graph/BasicBlock.expected
index 45b1b481612..1c1029ed035 100644
--- a/csharp/ql/test/library-tests/controlflow/graph/BasicBlock.expected
+++ b/csharp/ql/test/library-tests/controlflow/graph/BasicBlock.expected
@@ -677,7 +677,7 @@
| Initializers.cs:8:5:8:16 | enter Initializers | Initializers.cs:8:5:8:16 | exit Initializers | 16 |
| Initializers.cs:10:5:10:16 | enter Initializers | Initializers.cs:10:5:10:16 | exit Initializers | 16 |
| Initializers.cs:12:10:12:10 | enter M | Initializers.cs:12:10:12:10 | exit M | 22 |
-| Initializers.cs:18:20:18:20 | 1 | Initializers.cs:18:16:18:20 | ... = ... | 2 |
+| Initializers.cs:18:16:18:16 | enter H | Initializers.cs:18:16:18:20 | ... = ... | 3 |
| Initializers.cs:20:11:20:23 | enter NoConstructor | Initializers.cs:20:11:20:23 | exit NoConstructor | 9 |
| Initializers.cs:31:9:31:11 | enter Sub | Initializers.cs:31:9:31:11 | exit Sub | 12 |
| Initializers.cs:33:9:33:11 | enter Sub | Initializers.cs:33:9:33:11 | exit Sub | 9 |
diff --git a/csharp/ql/test/library-tests/controlflow/graph/Consistency.expected b/csharp/ql/test/library-tests/controlflow/graph/Consistency.expected
index bccab8e85a4..c025facf5ff 100644
--- a/csharp/ql/test/library-tests/controlflow/graph/Consistency.expected
+++ b/csharp/ql/test/library-tests/controlflow/graph/Consistency.expected
@@ -1,7 +1,7 @@
-preBasicBlockConsistency
nonUniqueSetRepresentation
breakInvariant2
breakInvariant3
breakInvariant4
breakInvariant5
multipleSuccessors
+preBasicBlockConsistency
diff --git a/csharp/ql/test/library-tests/controlflow/graph/Consistency.ql b/csharp/ql/test/library-tests/controlflow/graph/Consistency.ql
index 71529e8a1f2..a6e1bf5b6f6 100644
--- a/csharp/ql/test/library-tests/controlflow/graph/Consistency.ql
+++ b/csharp/ql/test/library-tests/controlflow/graph/Consistency.ql
@@ -4,6 +4,7 @@ import semmle.code.csharp.controlflow.internal.PreBasicBlocks
import ControlFlow
import semmle.code.csharp.controlflow.internal.ControlFlowGraphImpl
import semmle.code.csharp.controlflow.internal.Splitting
+import Consistency
predicate bbStartInconsistency(ControlFlowElement cfe) {
exists(ControlFlow::BasicBlock bb | bb.getFirstNode() = cfe.getAControlFlowNode()) and
@@ -49,58 +50,3 @@ query predicate preBasicBlockConsistency(ControlFlowElement cfe1, ControlFlowEle
bbIntraSuccInconsistency(cfe1, cfe2) and
s = "intra succ inconsistency"
}
-
-query predicate nonUniqueSetRepresentation(Splits s1, Splits s2) {
- forex(Nodes::Split s | s = s1.getASplit() | s = s2.getASplit()) and
- forex(Nodes::Split s | s = s2.getASplit() | s = s1.getASplit()) and
- s1 != s2
-}
-
-query predicate breakInvariant2(
- ControlFlowElement pred, Splits predSplits, ControlFlowElement succ, Splits succSplits,
- SplitImpl split, Completion c
-) {
- succSplits(pred, predSplits, succ, succSplits, c) and
- split = predSplits.getASplit() and
- split.hasSuccessor(pred, succ, c) and
- not split = succSplits.getASplit()
-}
-
-query predicate breakInvariant3(
- ControlFlowElement pred, Splits predSplits, ControlFlowElement succ, Splits succSplits,
- SplitImpl split, Completion c
-) {
- succSplits(pred, predSplits, succ, succSplits, c) and
- split = predSplits.getASplit() and
- split.hasExit(pred, succ, c) and
- not split.hasEntry(pred, succ, c) and
- split = succSplits.getASplit()
-}
-
-query predicate breakInvariant4(
- ControlFlowElement pred, Splits predSplits, ControlFlowElement succ, Splits succSplits,
- SplitImpl split, Completion c
-) {
- succSplits(pred, predSplits, succ, succSplits, c) and
- split.hasEntry(pred, succ, c) and
- not split.getKind() = predSplits.getASplit().getKind() and
- not split = succSplits.getASplit()
-}
-
-query predicate breakInvariant5(
- ControlFlowElement pred, Splits predSplits, ControlFlowElement succ, Splits succSplits,
- SplitImpl split, Completion c
-) {
- succSplits(pred, predSplits, succ, succSplits, c) and
- split = succSplits.getASplit() and
- not (split.hasSuccessor(pred, succ, c) and split = predSplits.getASplit()) and
- not split.hasEntry(pred, succ, c)
-}
-
-query predicate multipleSuccessors(
- ControlFlow::Node node, SuccessorType t, ControlFlow::Node successor
-) {
- not node instanceof ControlFlow::Nodes::EntryNode and
- strictcount(node.getASuccessorByType(t)) > 1 and
- successor = node.getASuccessorByType(t)
-}
diff --git a/csharp/ql/test/library-tests/controlflow/graph/Dominance.expected b/csharp/ql/test/library-tests/controlflow/graph/Dominance.expected
index de10c0acf6f..3c690be1ec3 100644
--- a/csharp/ql/test/library-tests/controlflow/graph/Dominance.expected
+++ b/csharp/ql/test/library-tests/controlflow/graph/Dominance.expected
@@ -2504,6 +2504,7 @@ dominance
| Initializers.cs:15:39:15:39 | access to local variable i | Initializers.cs:15:59:15:60 | "" |
| Initializers.cs:15:42:15:61 | object creation of type Initializers | Initializers.cs:15:37:15:63 | { ..., ... } |
| Initializers.cs:15:59:15:60 | "" | Initializers.cs:15:42:15:61 | object creation of type Initializers |
+| Initializers.cs:18:16:18:16 | enter H | Initializers.cs:18:20:18:20 | 1 |
| Initializers.cs:18:20:18:20 | 1 | Initializers.cs:18:16:18:20 | ... = ... |
| Initializers.cs:20:11:20:23 | enter NoConstructor | Initializers.cs:22:23:22:23 | this access |
| Initializers.cs:20:11:20:23 | exit NoConstructor (normal) | Initializers.cs:20:11:20:23 | exit NoConstructor |
@@ -6631,6 +6632,7 @@ postDominance
| Initializers.cs:15:42:15:61 | object creation of type Initializers | Initializers.cs:15:59:15:60 | "" |
| Initializers.cs:15:59:15:60 | "" | Initializers.cs:15:39:15:39 | access to local variable i |
| Initializers.cs:18:16:18:20 | ... = ... | Initializers.cs:18:20:18:20 | 1 |
+| Initializers.cs:18:20:18:20 | 1 | Initializers.cs:18:16:18:16 | enter H |
| Initializers.cs:20:11:20:23 | exit NoConstructor | Initializers.cs:20:11:20:23 | exit NoConstructor (normal) |
| Initializers.cs:20:11:20:23 | exit NoConstructor (normal) | Initializers.cs:23:23:23:27 | ... = ... |
| Initializers.cs:22:23:22:23 | this access | Initializers.cs:20:11:20:23 | enter NoConstructor |
@@ -11274,7 +11276,7 @@ blockDominance
| Initializers.cs:8:5:8:16 | enter Initializers | Initializers.cs:8:5:8:16 | enter Initializers |
| Initializers.cs:10:5:10:16 | enter Initializers | Initializers.cs:10:5:10:16 | enter Initializers |
| Initializers.cs:12:10:12:10 | enter M | Initializers.cs:12:10:12:10 | enter M |
-| Initializers.cs:18:20:18:20 | 1 | Initializers.cs:18:20:18:20 | 1 |
+| Initializers.cs:18:16:18:16 | enter H | Initializers.cs:18:16:18:16 | enter H |
| Initializers.cs:20:11:20:23 | enter NoConstructor | Initializers.cs:20:11:20:23 | enter NoConstructor |
| Initializers.cs:31:9:31:11 | enter Sub | Initializers.cs:31:9:31:11 | enter Sub |
| Initializers.cs:33:9:33:11 | enter Sub | Initializers.cs:33:9:33:11 | enter Sub |
@@ -14866,7 +14868,7 @@ postBlockDominance
| Initializers.cs:8:5:8:16 | enter Initializers | Initializers.cs:8:5:8:16 | enter Initializers |
| Initializers.cs:10:5:10:16 | enter Initializers | Initializers.cs:10:5:10:16 | enter Initializers |
| Initializers.cs:12:10:12:10 | enter M | Initializers.cs:12:10:12:10 | enter M |
-| Initializers.cs:18:20:18:20 | 1 | Initializers.cs:18:20:18:20 | 1 |
+| Initializers.cs:18:16:18:16 | enter H | Initializers.cs:18:16:18:16 | enter H |
| Initializers.cs:20:11:20:23 | enter NoConstructor | Initializers.cs:20:11:20:23 | enter NoConstructor |
| Initializers.cs:31:9:31:11 | enter Sub | Initializers.cs:31:9:31:11 | enter Sub |
| Initializers.cs:33:9:33:11 | enter Sub | Initializers.cs:33:9:33:11 | enter Sub |
diff --git a/csharp/ql/test/library-tests/controlflow/graph/NodeGraph.expected b/csharp/ql/test/library-tests/controlflow/graph/NodeGraph.expected
index 2441e36f62d..e70bb61bacc 100644
--- a/csharp/ql/test/library-tests/controlflow/graph/NodeGraph.expected
+++ b/csharp/ql/test/library-tests/controlflow/graph/NodeGraph.expected
@@ -1,4925 +1,14451 @@
-| AccessorCalls.cs:5:23:5:25 | enter get_Item | AccessorCalls.cs:5:30:5:30 | access to parameter i | semmle.label | successor |
-| AccessorCalls.cs:5:23:5:25 | exit get_Item (normal) | AccessorCalls.cs:5:23:5:25 | exit get_Item | semmle.label | successor |
-| AccessorCalls.cs:5:30:5:30 | access to parameter i | AccessorCalls.cs:5:23:5:25 | exit get_Item (normal) | semmle.label | successor |
-| AccessorCalls.cs:5:33:5:35 | enter set_Item | AccessorCalls.cs:5:37:5:39 | {...} | semmle.label | successor |
-| AccessorCalls.cs:5:33:5:35 | exit set_Item (normal) | AccessorCalls.cs:5:33:5:35 | exit set_Item | semmle.label | successor |
-| AccessorCalls.cs:5:37:5:39 | {...} | AccessorCalls.cs:5:33:5:35 | exit set_Item (normal) | semmle.label | successor |
-| AccessorCalls.cs:7:32:7:34 | enter add_Event | AccessorCalls.cs:7:36:7:38 | {...} | semmle.label | successor |
-| AccessorCalls.cs:7:32:7:34 | exit add_Event (normal) | AccessorCalls.cs:7:32:7:34 | exit add_Event | semmle.label | successor |
-| AccessorCalls.cs:7:36:7:38 | {...} | AccessorCalls.cs:7:32:7:34 | exit add_Event (normal) | semmle.label | successor |
-| AccessorCalls.cs:7:40:7:45 | enter remove_Event | AccessorCalls.cs:7:47:7:49 | {...} | semmle.label | successor |
-| AccessorCalls.cs:7:40:7:45 | exit remove_Event (normal) | AccessorCalls.cs:7:40:7:45 | exit remove_Event | semmle.label | successor |
-| AccessorCalls.cs:7:47:7:49 | {...} | AccessorCalls.cs:7:40:7:45 | exit remove_Event (normal) | semmle.label | successor |
-| AccessorCalls.cs:10:10:10:11 | enter M1 | AccessorCalls.cs:11:5:17:5 | {...} | semmle.label | successor |
-| AccessorCalls.cs:10:10:10:11 | exit M1 (normal) | AccessorCalls.cs:10:10:10:11 | exit M1 | semmle.label | successor |
-| AccessorCalls.cs:11:5:17:5 | {...} | AccessorCalls.cs:12:9:12:32 | ...; | semmle.label | successor |
-| AccessorCalls.cs:12:9:12:12 | this access | AccessorCalls.cs:12:22:12:25 | this access | semmle.label | successor |
-| AccessorCalls.cs:12:9:12:31 | ... = ... | AccessorCalls.cs:13:9:13:30 | ...; | semmle.label | successor |
-| AccessorCalls.cs:12:9:12:32 | ...; | AccessorCalls.cs:12:9:12:12 | this access | semmle.label | successor |
-| AccessorCalls.cs:12:22:12:25 | this access | AccessorCalls.cs:12:22:12:31 | access to field Field | semmle.label | successor |
-| AccessorCalls.cs:12:22:12:31 | access to field Field | AccessorCalls.cs:12:9:12:31 | ... = ... | semmle.label | successor |
-| AccessorCalls.cs:13:9:13:12 | this access | AccessorCalls.cs:13:21:13:24 | this access | semmle.label | successor |
-| AccessorCalls.cs:13:9:13:17 | access to property Prop | AccessorCalls.cs:13:9:13:29 | ... = ... | semmle.label | successor |
-| AccessorCalls.cs:13:9:13:29 | ... = ... | AccessorCalls.cs:14:9:14:26 | ...; | semmle.label | successor |
-| AccessorCalls.cs:13:9:13:30 | ...; | AccessorCalls.cs:13:9:13:12 | this access | semmle.label | successor |
-| AccessorCalls.cs:13:21:13:24 | this access | AccessorCalls.cs:13:21:13:29 | access to property Prop | semmle.label | successor |
-| AccessorCalls.cs:13:21:13:29 | access to property Prop | AccessorCalls.cs:13:9:13:17 | access to property Prop | semmle.label | successor |
-| AccessorCalls.cs:14:9:14:12 | this access | AccessorCalls.cs:14:14:14:14 | 0 | semmle.label | successor |
-| AccessorCalls.cs:14:9:14:15 | access to indexer | AccessorCalls.cs:14:9:14:25 | ... = ... | semmle.label | successor |
-| AccessorCalls.cs:14:9:14:25 | ... = ... | AccessorCalls.cs:15:9:15:24 | ...; | semmle.label | successor |
-| AccessorCalls.cs:14:9:14:26 | ...; | AccessorCalls.cs:14:9:14:12 | this access | semmle.label | successor |
-| AccessorCalls.cs:14:14:14:14 | 0 | AccessorCalls.cs:14:19:14:22 | this access | semmle.label | successor |
-| AccessorCalls.cs:14:19:14:22 | this access | AccessorCalls.cs:14:24:14:24 | 1 | semmle.label | successor |
-| AccessorCalls.cs:14:19:14:25 | access to indexer | AccessorCalls.cs:14:9:14:15 | access to indexer | semmle.label | successor |
-| AccessorCalls.cs:14:24:14:24 | 1 | AccessorCalls.cs:14:19:14:25 | access to indexer | semmle.label | successor |
-| AccessorCalls.cs:15:9:15:12 | this access | AccessorCalls.cs:15:23:15:23 | access to parameter e | semmle.label | successor |
-| AccessorCalls.cs:15:9:15:18 | access to event Event | AccessorCalls.cs:15:9:15:23 | ... += ... | semmle.label | successor |
-| AccessorCalls.cs:15:9:15:23 | ... += ... | AccessorCalls.cs:16:9:16:24 | ...; | semmle.label | successor |
-| AccessorCalls.cs:15:9:15:24 | ...; | AccessorCalls.cs:15:9:15:12 | this access | semmle.label | successor |
-| AccessorCalls.cs:15:23:15:23 | access to parameter e | AccessorCalls.cs:15:9:15:18 | access to event Event | semmle.label | successor |
-| AccessorCalls.cs:16:9:16:12 | this access | AccessorCalls.cs:16:23:16:23 | access to parameter e | semmle.label | successor |
-| AccessorCalls.cs:16:9:16:18 | access to event Event | AccessorCalls.cs:16:9:16:23 | ... -= ... | semmle.label | successor |
-| AccessorCalls.cs:16:9:16:23 | ... -= ... | AccessorCalls.cs:10:10:10:11 | exit M1 (normal) | semmle.label | successor |
-| AccessorCalls.cs:16:9:16:24 | ...; | AccessorCalls.cs:16:9:16:12 | this access | semmle.label | successor |
-| AccessorCalls.cs:16:23:16:23 | access to parameter e | AccessorCalls.cs:16:9:16:18 | access to event Event | semmle.label | successor |
-| AccessorCalls.cs:19:10:19:11 | enter M2 | AccessorCalls.cs:20:5:26:5 | {...} | semmle.label | successor |
-| AccessorCalls.cs:19:10:19:11 | exit M2 (normal) | AccessorCalls.cs:19:10:19:11 | exit M2 | semmle.label | successor |
-| AccessorCalls.cs:20:5:26:5 | {...} | AccessorCalls.cs:21:9:21:36 | ...; | semmle.label | successor |
-| AccessorCalls.cs:21:9:21:12 | this access | AccessorCalls.cs:21:9:21:14 | access to field x | semmle.label | successor |
-| AccessorCalls.cs:21:9:21:14 | access to field x | AccessorCalls.cs:21:24:21:27 | this access | semmle.label | successor |
-| AccessorCalls.cs:21:9:21:35 | ... = ... | AccessorCalls.cs:22:9:22:34 | ...; | semmle.label | successor |
-| AccessorCalls.cs:21:9:21:36 | ...; | AccessorCalls.cs:21:9:21:12 | this access | semmle.label | successor |
-| AccessorCalls.cs:21:24:21:27 | this access | AccessorCalls.cs:21:24:21:29 | access to field x | semmle.label | successor |
-| AccessorCalls.cs:21:24:21:29 | access to field x | AccessorCalls.cs:21:24:21:35 | access to field Field | semmle.label | successor |
-| AccessorCalls.cs:21:24:21:35 | access to field Field | AccessorCalls.cs:21:9:21:35 | ... = ... | semmle.label | successor |
-| AccessorCalls.cs:22:9:22:12 | this access | AccessorCalls.cs:22:9:22:14 | access to field x | semmle.label | successor |
-| AccessorCalls.cs:22:9:22:14 | access to field x | AccessorCalls.cs:22:23:22:26 | this access | semmle.label | successor |
-| AccessorCalls.cs:22:9:22:19 | access to property Prop | AccessorCalls.cs:22:9:22:33 | ... = ... | semmle.label | successor |
-| AccessorCalls.cs:22:9:22:33 | ... = ... | AccessorCalls.cs:23:9:23:30 | ...; | semmle.label | successor |
-| AccessorCalls.cs:22:9:22:34 | ...; | AccessorCalls.cs:22:9:22:12 | this access | semmle.label | successor |
-| AccessorCalls.cs:22:23:22:26 | this access | AccessorCalls.cs:22:23:22:28 | access to field x | semmle.label | successor |
-| AccessorCalls.cs:22:23:22:28 | access to field x | AccessorCalls.cs:22:23:22:33 | access to property Prop | semmle.label | successor |
-| AccessorCalls.cs:22:23:22:33 | access to property Prop | AccessorCalls.cs:22:9:22:19 | access to property Prop | semmle.label | successor |
-| AccessorCalls.cs:23:9:23:12 | this access | AccessorCalls.cs:23:9:23:14 | access to field x | semmle.label | successor |
-| AccessorCalls.cs:23:9:23:14 | access to field x | AccessorCalls.cs:23:16:23:16 | 0 | semmle.label | successor |
-| AccessorCalls.cs:23:9:23:17 | access to indexer | AccessorCalls.cs:23:9:23:29 | ... = ... | semmle.label | successor |
-| AccessorCalls.cs:23:9:23:29 | ... = ... | AccessorCalls.cs:24:9:24:26 | ...; | semmle.label | successor |
-| AccessorCalls.cs:23:9:23:30 | ...; | AccessorCalls.cs:23:9:23:12 | this access | semmle.label | successor |
-| AccessorCalls.cs:23:16:23:16 | 0 | AccessorCalls.cs:23:21:23:24 | this access | semmle.label | successor |
-| AccessorCalls.cs:23:21:23:24 | this access | AccessorCalls.cs:23:21:23:26 | access to field x | semmle.label | successor |
-| AccessorCalls.cs:23:21:23:26 | access to field x | AccessorCalls.cs:23:28:23:28 | 1 | semmle.label | successor |
-| AccessorCalls.cs:23:21:23:29 | access to indexer | AccessorCalls.cs:23:9:23:17 | access to indexer | semmle.label | successor |
-| AccessorCalls.cs:23:28:23:28 | 1 | AccessorCalls.cs:23:21:23:29 | access to indexer | semmle.label | successor |
-| AccessorCalls.cs:24:9:24:12 | this access | AccessorCalls.cs:24:9:24:14 | access to field x | semmle.label | successor |
-| AccessorCalls.cs:24:9:24:14 | access to field x | AccessorCalls.cs:24:25:24:25 | access to parameter e | semmle.label | successor |
-| AccessorCalls.cs:24:9:24:20 | access to event Event | AccessorCalls.cs:24:9:24:25 | ... += ... | semmle.label | successor |
-| AccessorCalls.cs:24:9:24:25 | ... += ... | AccessorCalls.cs:25:9:25:26 | ...; | semmle.label | successor |
-| AccessorCalls.cs:24:9:24:26 | ...; | AccessorCalls.cs:24:9:24:12 | this access | semmle.label | successor |
-| AccessorCalls.cs:24:25:24:25 | access to parameter e | AccessorCalls.cs:24:9:24:20 | access to event Event | semmle.label | successor |
-| AccessorCalls.cs:25:9:25:12 | this access | AccessorCalls.cs:25:9:25:14 | access to field x | semmle.label | successor |
-| AccessorCalls.cs:25:9:25:14 | access to field x | AccessorCalls.cs:25:25:25:25 | access to parameter e | semmle.label | successor |
-| AccessorCalls.cs:25:9:25:20 | access to event Event | AccessorCalls.cs:25:9:25:25 | ... -= ... | semmle.label | successor |
-| AccessorCalls.cs:25:9:25:25 | ... -= ... | AccessorCalls.cs:19:10:19:11 | exit M2 (normal) | semmle.label | successor |
-| AccessorCalls.cs:25:9:25:26 | ...; | AccessorCalls.cs:25:9:25:12 | this access | semmle.label | successor |
-| AccessorCalls.cs:25:25:25:25 | access to parameter e | AccessorCalls.cs:25:9:25:20 | access to event Event | semmle.label | successor |
-| AccessorCalls.cs:28:10:28:11 | enter M3 | AccessorCalls.cs:29:5:33:5 | {...} | semmle.label | successor |
-| AccessorCalls.cs:28:10:28:11 | exit M3 (normal) | AccessorCalls.cs:28:10:28:11 | exit M3 | semmle.label | successor |
-| AccessorCalls.cs:29:5:33:5 | {...} | AccessorCalls.cs:30:9:30:21 | ...; | semmle.label | successor |
-| AccessorCalls.cs:30:9:30:12 | this access | AccessorCalls.cs:30:9:30:18 | access to field Field | semmle.label | successor |
-| AccessorCalls.cs:30:9:30:18 | access to field Field | AccessorCalls.cs:30:9:30:20 | ...++ | semmle.label | successor |
-| AccessorCalls.cs:30:9:30:20 | ...++ | AccessorCalls.cs:31:9:31:20 | ...; | semmle.label | successor |
-| AccessorCalls.cs:30:9:30:21 | ...; | AccessorCalls.cs:30:9:30:12 | this access | semmle.label | successor |
-| AccessorCalls.cs:31:9:31:12 | this access | AccessorCalls.cs:31:9:31:17 | access to property Prop | semmle.label | successor |
-| AccessorCalls.cs:31:9:31:17 | access to property Prop | AccessorCalls.cs:31:9:31:19 | ...++ | semmle.label | successor |
-| AccessorCalls.cs:31:9:31:19 | ...++ | AccessorCalls.cs:32:9:32:18 | ...; | semmle.label | successor |
-| AccessorCalls.cs:31:9:31:20 | ...; | AccessorCalls.cs:31:9:31:12 | this access | semmle.label | successor |
-| AccessorCalls.cs:32:9:32:12 | this access | AccessorCalls.cs:32:14:32:14 | 0 | semmle.label | successor |
-| AccessorCalls.cs:32:9:32:15 | access to indexer | AccessorCalls.cs:32:9:32:17 | ...++ | semmle.label | successor |
-| AccessorCalls.cs:32:9:32:17 | ...++ | AccessorCalls.cs:28:10:28:11 | exit M3 (normal) | semmle.label | successor |
-| AccessorCalls.cs:32:9:32:18 | ...; | AccessorCalls.cs:32:9:32:12 | this access | semmle.label | successor |
-| AccessorCalls.cs:32:14:32:14 | 0 | AccessorCalls.cs:32:9:32:15 | access to indexer | semmle.label | successor |
-| AccessorCalls.cs:35:10:35:11 | enter M4 | AccessorCalls.cs:36:5:40:5 | {...} | semmle.label | successor |
-| AccessorCalls.cs:35:10:35:11 | exit M4 (normal) | AccessorCalls.cs:35:10:35:11 | exit M4 | semmle.label | successor |
-| AccessorCalls.cs:36:5:40:5 | {...} | AccessorCalls.cs:37:9:37:23 | ...; | semmle.label | successor |
-| AccessorCalls.cs:37:9:37:12 | this access | AccessorCalls.cs:37:9:37:14 | access to field x | semmle.label | successor |
-| AccessorCalls.cs:37:9:37:14 | access to field x | AccessorCalls.cs:37:9:37:20 | access to field Field | semmle.label | successor |
-| AccessorCalls.cs:37:9:37:20 | access to field Field | AccessorCalls.cs:37:9:37:22 | ...++ | semmle.label | successor |
-| AccessorCalls.cs:37:9:37:22 | ...++ | AccessorCalls.cs:38:9:38:22 | ...; | semmle.label | successor |
-| AccessorCalls.cs:37:9:37:23 | ...; | AccessorCalls.cs:37:9:37:12 | this access | semmle.label | successor |
-| AccessorCalls.cs:38:9:38:12 | this access | AccessorCalls.cs:38:9:38:14 | access to field x | semmle.label | successor |
-| AccessorCalls.cs:38:9:38:14 | access to field x | AccessorCalls.cs:38:9:38:19 | access to property Prop | semmle.label | successor |
-| AccessorCalls.cs:38:9:38:19 | access to property Prop | AccessorCalls.cs:38:9:38:21 | ...++ | semmle.label | successor |
-| AccessorCalls.cs:38:9:38:21 | ...++ | AccessorCalls.cs:39:9:39:20 | ...; | semmle.label | successor |
-| AccessorCalls.cs:38:9:38:22 | ...; | AccessorCalls.cs:38:9:38:12 | this access | semmle.label | successor |
-| AccessorCalls.cs:39:9:39:12 | this access | AccessorCalls.cs:39:9:39:14 | access to field x | semmle.label | successor |
-| AccessorCalls.cs:39:9:39:14 | access to field x | AccessorCalls.cs:39:16:39:16 | 0 | semmle.label | successor |
-| AccessorCalls.cs:39:9:39:17 | access to indexer | AccessorCalls.cs:39:9:39:19 | ...++ | semmle.label | successor |
-| AccessorCalls.cs:39:9:39:19 | ...++ | AccessorCalls.cs:35:10:35:11 | exit M4 (normal) | semmle.label | successor |
-| AccessorCalls.cs:39:9:39:20 | ...; | AccessorCalls.cs:39:9:39:12 | this access | semmle.label | successor |
-| AccessorCalls.cs:39:16:39:16 | 0 | AccessorCalls.cs:39:9:39:17 | access to indexer | semmle.label | successor |
-| AccessorCalls.cs:42:10:42:11 | enter M5 | AccessorCalls.cs:43:5:47:5 | {...} | semmle.label | successor |
-| AccessorCalls.cs:42:10:42:11 | exit M5 (normal) | AccessorCalls.cs:42:10:42:11 | exit M5 | semmle.label | successor |
-| AccessorCalls.cs:43:5:47:5 | {...} | AccessorCalls.cs:44:9:44:33 | ...; | semmle.label | successor |
-| AccessorCalls.cs:44:9:44:12 | this access | AccessorCalls.cs:44:9:44:12 | this access | semmle.label | successor |
-| AccessorCalls.cs:44:9:44:12 | this access | AccessorCalls.cs:44:9:44:18 | access to field Field | semmle.label | successor |
-| AccessorCalls.cs:44:9:44:18 | access to field Field | AccessorCalls.cs:44:23:44:26 | this access | semmle.label | successor |
-| AccessorCalls.cs:44:9:44:32 | ... + ... | AccessorCalls.cs:44:9:44:32 | ... = ... | semmle.label | successor |
-| AccessorCalls.cs:44:9:44:32 | ... = ... | AccessorCalls.cs:45:9:45:31 | ...; | semmle.label | successor |
-| AccessorCalls.cs:44:9:44:33 | ...; | AccessorCalls.cs:44:9:44:12 | this access | semmle.label | successor |
-| AccessorCalls.cs:44:23:44:26 | this access | AccessorCalls.cs:44:23:44:32 | access to field Field | semmle.label | successor |
-| AccessorCalls.cs:44:23:44:32 | access to field Field | AccessorCalls.cs:44:9:44:32 | ... + ... | semmle.label | successor |
-| AccessorCalls.cs:45:9:45:12 | this access | AccessorCalls.cs:45:9:45:12 | this access | semmle.label | successor |
-| AccessorCalls.cs:45:9:45:12 | this access | AccessorCalls.cs:45:9:45:17 | access to property Prop | semmle.label | successor |
-| AccessorCalls.cs:45:9:45:17 | access to property Prop | AccessorCalls.cs:45:9:45:30 | ... = ... | semmle.label | successor |
-| AccessorCalls.cs:45:9:45:17 | access to property Prop | AccessorCalls.cs:45:22:45:25 | this access | semmle.label | successor |
-| AccessorCalls.cs:45:9:45:30 | ... + ... | AccessorCalls.cs:45:9:45:17 | access to property Prop | semmle.label | successor |
-| AccessorCalls.cs:45:9:45:30 | ... = ... | AccessorCalls.cs:46:9:46:27 | ...; | semmle.label | successor |
-| AccessorCalls.cs:45:9:45:31 | ...; | AccessorCalls.cs:45:9:45:12 | this access | semmle.label | successor |
-| AccessorCalls.cs:45:22:45:25 | this access | AccessorCalls.cs:45:22:45:30 | access to property Prop | semmle.label | successor |
-| AccessorCalls.cs:45:22:45:30 | access to property Prop | AccessorCalls.cs:45:9:45:30 | ... + ... | semmle.label | successor |
-| AccessorCalls.cs:46:9:46:12 | this access | AccessorCalls.cs:46:14:46:14 | 0 | semmle.label | successor |
-| AccessorCalls.cs:46:9:46:12 | this access | AccessorCalls.cs:46:14:46:14 | 0 | semmle.label | successor |
-| AccessorCalls.cs:46:9:46:15 | access to indexer | AccessorCalls.cs:46:9:46:26 | ... = ... | semmle.label | successor |
-| AccessorCalls.cs:46:9:46:15 | access to indexer | AccessorCalls.cs:46:20:46:23 | this access | semmle.label | successor |
-| AccessorCalls.cs:46:9:46:26 | ... + ... | AccessorCalls.cs:46:9:46:15 | access to indexer | semmle.label | successor |
-| AccessorCalls.cs:46:9:46:26 | ... = ... | AccessorCalls.cs:42:10:42:11 | exit M5 (normal) | semmle.label | successor |
-| AccessorCalls.cs:46:9:46:27 | ...; | AccessorCalls.cs:46:9:46:12 | this access | semmle.label | successor |
-| AccessorCalls.cs:46:14:46:14 | 0 | AccessorCalls.cs:46:9:46:12 | this access | semmle.label | successor |
-| AccessorCalls.cs:46:14:46:14 | 0 | AccessorCalls.cs:46:9:46:15 | access to indexer | semmle.label | successor |
-| AccessorCalls.cs:46:20:46:23 | this access | AccessorCalls.cs:46:25:46:25 | 0 | semmle.label | successor |
-| AccessorCalls.cs:46:20:46:26 | access to indexer | AccessorCalls.cs:46:9:46:26 | ... + ... | semmle.label | successor |
-| AccessorCalls.cs:46:25:46:25 | 0 | AccessorCalls.cs:46:20:46:26 | access to indexer | semmle.label | successor |
-| AccessorCalls.cs:49:10:49:11 | enter M6 | AccessorCalls.cs:50:5:54:5 | {...} | semmle.label | successor |
-| AccessorCalls.cs:49:10:49:11 | exit M6 (normal) | AccessorCalls.cs:49:10:49:11 | exit M6 | semmle.label | successor |
-| AccessorCalls.cs:50:5:54:5 | {...} | AccessorCalls.cs:51:9:51:37 | ...; | semmle.label | successor |
-| AccessorCalls.cs:51:9:51:12 | this access | AccessorCalls.cs:51:9:51:14 | access to field x | semmle.label | successor |
-| AccessorCalls.cs:51:9:51:12 | this access | AccessorCalls.cs:51:9:51:14 | access to field x | semmle.label | successor |
-| AccessorCalls.cs:51:9:51:14 | access to field x | AccessorCalls.cs:51:9:51:12 | this access | semmle.label | successor |
-| AccessorCalls.cs:51:9:51:14 | access to field x | AccessorCalls.cs:51:9:51:20 | access to field Field | semmle.label | successor |
-| AccessorCalls.cs:51:9:51:20 | access to field Field | AccessorCalls.cs:51:25:51:28 | this access | semmle.label | successor |
-| AccessorCalls.cs:51:9:51:36 | ... + ... | AccessorCalls.cs:51:9:51:36 | ... = ... | semmle.label | successor |
-| AccessorCalls.cs:51:9:51:36 | ... = ... | AccessorCalls.cs:52:9:52:35 | ...; | semmle.label | successor |
-| AccessorCalls.cs:51:9:51:37 | ...; | AccessorCalls.cs:51:9:51:12 | this access | semmle.label | successor |
-| AccessorCalls.cs:51:25:51:28 | this access | AccessorCalls.cs:51:25:51:30 | access to field x | semmle.label | successor |
-| AccessorCalls.cs:51:25:51:30 | access to field x | AccessorCalls.cs:51:25:51:36 | access to field Field | semmle.label | successor |
-| AccessorCalls.cs:51:25:51:36 | access to field Field | AccessorCalls.cs:51:9:51:36 | ... + ... | semmle.label | successor |
-| AccessorCalls.cs:52:9:52:12 | this access | AccessorCalls.cs:52:9:52:14 | access to field x | semmle.label | successor |
-| AccessorCalls.cs:52:9:52:12 | this access | AccessorCalls.cs:52:9:52:14 | access to field x | semmle.label | successor |
-| AccessorCalls.cs:52:9:52:14 | access to field x | AccessorCalls.cs:52:9:52:12 | this access | semmle.label | successor |
-| AccessorCalls.cs:52:9:52:14 | access to field x | AccessorCalls.cs:52:9:52:19 | access to property Prop | semmle.label | successor |
-| AccessorCalls.cs:52:9:52:19 | access to property Prop | AccessorCalls.cs:52:9:52:34 | ... = ... | semmle.label | successor |
-| AccessorCalls.cs:52:9:52:19 | access to property Prop | AccessorCalls.cs:52:24:52:27 | this access | semmle.label | successor |
-| AccessorCalls.cs:52:9:52:34 | ... + ... | AccessorCalls.cs:52:9:52:19 | access to property Prop | semmle.label | successor |
-| AccessorCalls.cs:52:9:52:34 | ... = ... | AccessorCalls.cs:53:9:53:31 | ...; | semmle.label | successor |
-| AccessorCalls.cs:52:9:52:35 | ...; | AccessorCalls.cs:52:9:52:12 | this access | semmle.label | successor |
-| AccessorCalls.cs:52:24:52:27 | this access | AccessorCalls.cs:52:24:52:29 | access to field x | semmle.label | successor |
-| AccessorCalls.cs:52:24:52:29 | access to field x | AccessorCalls.cs:52:24:52:34 | access to property Prop | semmle.label | successor |
-| AccessorCalls.cs:52:24:52:34 | access to property Prop | AccessorCalls.cs:52:9:52:34 | ... + ... | semmle.label | successor |
-| AccessorCalls.cs:53:9:53:12 | this access | AccessorCalls.cs:53:9:53:14 | access to field x | semmle.label | successor |
-| AccessorCalls.cs:53:9:53:12 | this access | AccessorCalls.cs:53:9:53:14 | access to field x | semmle.label | successor |
-| AccessorCalls.cs:53:9:53:14 | access to field x | AccessorCalls.cs:53:16:53:16 | 0 | semmle.label | successor |
-| AccessorCalls.cs:53:9:53:14 | access to field x | AccessorCalls.cs:53:16:53:16 | 0 | semmle.label | successor |
-| AccessorCalls.cs:53:9:53:17 | access to indexer | AccessorCalls.cs:53:9:53:30 | ... = ... | semmle.label | successor |
-| AccessorCalls.cs:53:9:53:17 | access to indexer | AccessorCalls.cs:53:22:53:25 | this access | semmle.label | successor |
-| AccessorCalls.cs:53:9:53:30 | ... + ... | AccessorCalls.cs:53:9:53:17 | access to indexer | semmle.label | successor |
-| AccessorCalls.cs:53:9:53:30 | ... = ... | AccessorCalls.cs:49:10:49:11 | exit M6 (normal) | semmle.label | successor |
-| AccessorCalls.cs:53:9:53:31 | ...; | AccessorCalls.cs:53:9:53:12 | this access | semmle.label | successor |
-| AccessorCalls.cs:53:16:53:16 | 0 | AccessorCalls.cs:53:9:53:12 | this access | semmle.label | successor |
-| AccessorCalls.cs:53:16:53:16 | 0 | AccessorCalls.cs:53:9:53:17 | access to indexer | semmle.label | successor |
-| AccessorCalls.cs:53:22:53:25 | this access | AccessorCalls.cs:53:22:53:27 | access to field x | semmle.label | successor |
-| AccessorCalls.cs:53:22:53:27 | access to field x | AccessorCalls.cs:53:29:53:29 | 0 | semmle.label | successor |
-| AccessorCalls.cs:53:22:53:30 | access to indexer | AccessorCalls.cs:53:9:53:30 | ... + ... | semmle.label | successor |
-| AccessorCalls.cs:53:29:53:29 | 0 | AccessorCalls.cs:53:22:53:30 | access to indexer | semmle.label | successor |
-| AccessorCalls.cs:56:10:56:11 | enter M7 | AccessorCalls.cs:57:5:59:5 | {...} | semmle.label | successor |
-| AccessorCalls.cs:56:10:56:11 | exit M7 (normal) | AccessorCalls.cs:56:10:56:11 | exit M7 | semmle.label | successor |
-| AccessorCalls.cs:57:5:59:5 | {...} | AccessorCalls.cs:58:9:58:86 | ...; | semmle.label | successor |
-| AccessorCalls.cs:58:9:58:45 | (..., ...) | AccessorCalls.cs:58:50:58:53 | this access | semmle.label | successor |
-| AccessorCalls.cs:58:9:58:85 | ... = ... | AccessorCalls.cs:56:10:56:11 | exit M7 (normal) | semmle.label | successor |
-| AccessorCalls.cs:58:9:58:86 | ...; | AccessorCalls.cs:58:10:58:13 | this access | semmle.label | successor |
-| AccessorCalls.cs:58:10:58:13 | this access | AccessorCalls.cs:58:22:58:25 | this access | semmle.label | successor |
-| AccessorCalls.cs:58:22:58:25 | this access | AccessorCalls.cs:58:37:58:40 | this access | semmle.label | successor |
-| AccessorCalls.cs:58:22:58:30 | access to property Prop | AccessorCalls.cs:58:37:58:43 | access to indexer | semmle.label | successor |
-| AccessorCalls.cs:58:33:58:44 | (..., ...) | AccessorCalls.cs:58:9:58:45 | (..., ...) | semmle.label | successor |
-| AccessorCalls.cs:58:37:58:40 | this access | AccessorCalls.cs:58:42:58:42 | 0 | semmle.label | successor |
-| AccessorCalls.cs:58:37:58:43 | access to indexer | AccessorCalls.cs:58:9:58:85 | ... = ... | semmle.label | successor |
-| AccessorCalls.cs:58:42:58:42 | 0 | AccessorCalls.cs:58:33:58:44 | (..., ...) | semmle.label | successor |
-| AccessorCalls.cs:58:49:58:85 | (..., ...) | AccessorCalls.cs:58:22:58:30 | access to property Prop | semmle.label | successor |
-| AccessorCalls.cs:58:50:58:53 | this access | AccessorCalls.cs:58:50:58:59 | access to field Field | semmle.label | successor |
-| AccessorCalls.cs:58:50:58:59 | access to field Field | AccessorCalls.cs:58:62:58:65 | this access | semmle.label | successor |
-| AccessorCalls.cs:58:62:58:65 | this access | AccessorCalls.cs:58:62:58:70 | access to property Prop | semmle.label | successor |
-| AccessorCalls.cs:58:62:58:70 | access to property Prop | AccessorCalls.cs:58:74:58:74 | 0 | semmle.label | successor |
-| AccessorCalls.cs:58:73:58:84 | (..., ...) | AccessorCalls.cs:58:49:58:85 | (..., ...) | semmle.label | successor |
-| AccessorCalls.cs:58:74:58:74 | 0 | AccessorCalls.cs:58:77:58:80 | this access | semmle.label | successor |
-| AccessorCalls.cs:58:77:58:80 | this access | AccessorCalls.cs:58:82:58:82 | 1 | semmle.label | successor |
-| AccessorCalls.cs:58:77:58:83 | access to indexer | AccessorCalls.cs:58:73:58:84 | (..., ...) | semmle.label | successor |
-| AccessorCalls.cs:58:82:58:82 | 1 | AccessorCalls.cs:58:77:58:83 | access to indexer | semmle.label | successor |
-| AccessorCalls.cs:61:10:61:11 | enter M8 | AccessorCalls.cs:62:5:64:5 | {...} | semmle.label | successor |
-| AccessorCalls.cs:61:10:61:11 | exit M8 (normal) | AccessorCalls.cs:61:10:61:11 | exit M8 | semmle.label | successor |
-| AccessorCalls.cs:62:5:64:5 | {...} | AccessorCalls.cs:63:9:63:98 | ...; | semmle.label | successor |
-| AccessorCalls.cs:63:9:63:51 | (..., ...) | AccessorCalls.cs:63:56:63:59 | this access | semmle.label | successor |
-| AccessorCalls.cs:63:9:63:97 | ... = ... | AccessorCalls.cs:61:10:61:11 | exit M8 (normal) | semmle.label | successor |
-| AccessorCalls.cs:63:9:63:98 | ...; | AccessorCalls.cs:63:10:63:13 | this access | semmle.label | successor |
-| AccessorCalls.cs:63:10:63:13 | this access | AccessorCalls.cs:63:10:63:15 | access to field x | semmle.label | successor |
-| AccessorCalls.cs:63:10:63:15 | access to field x | AccessorCalls.cs:63:24:63:27 | this access | semmle.label | successor |
-| AccessorCalls.cs:63:24:63:27 | this access | AccessorCalls.cs:63:24:63:29 | access to field x | semmle.label | successor |
-| AccessorCalls.cs:63:24:63:29 | access to field x | AccessorCalls.cs:63:41:63:44 | this access | semmle.label | successor |
-| AccessorCalls.cs:63:24:63:34 | access to property Prop | AccessorCalls.cs:63:41:63:49 | access to indexer | semmle.label | successor |
-| AccessorCalls.cs:63:37:63:50 | (..., ...) | AccessorCalls.cs:63:9:63:51 | (..., ...) | semmle.label | successor |
-| AccessorCalls.cs:63:41:63:44 | this access | AccessorCalls.cs:63:41:63:46 | access to field x | semmle.label | successor |
-| AccessorCalls.cs:63:41:63:46 | access to field x | AccessorCalls.cs:63:48:63:48 | 0 | semmle.label | successor |
-| AccessorCalls.cs:63:41:63:49 | access to indexer | AccessorCalls.cs:63:9:63:97 | ... = ... | semmle.label | successor |
-| AccessorCalls.cs:63:48:63:48 | 0 | AccessorCalls.cs:63:37:63:50 | (..., ...) | semmle.label | successor |
-| AccessorCalls.cs:63:55:63:97 | (..., ...) | AccessorCalls.cs:63:24:63:34 | access to property Prop | semmle.label | successor |
-| AccessorCalls.cs:63:56:63:59 | this access | AccessorCalls.cs:63:56:63:61 | access to field x | semmle.label | successor |
-| AccessorCalls.cs:63:56:63:61 | access to field x | AccessorCalls.cs:63:56:63:67 | access to field Field | semmle.label | successor |
-| AccessorCalls.cs:63:56:63:67 | access to field Field | AccessorCalls.cs:63:70:63:73 | this access | semmle.label | successor |
-| AccessorCalls.cs:63:70:63:73 | this access | AccessorCalls.cs:63:70:63:75 | access to field x | semmle.label | successor |
-| AccessorCalls.cs:63:70:63:75 | access to field x | AccessorCalls.cs:63:70:63:80 | access to property Prop | semmle.label | successor |
-| AccessorCalls.cs:63:70:63:80 | access to property Prop | AccessorCalls.cs:63:84:63:84 | 0 | semmle.label | successor |
-| AccessorCalls.cs:63:83:63:96 | (..., ...) | AccessorCalls.cs:63:55:63:97 | (..., ...) | semmle.label | successor |
-| AccessorCalls.cs:63:84:63:84 | 0 | AccessorCalls.cs:63:87:63:90 | this access | semmle.label | successor |
-| AccessorCalls.cs:63:87:63:90 | this access | AccessorCalls.cs:63:87:63:92 | access to field x | semmle.label | successor |
-| AccessorCalls.cs:63:87:63:92 | access to field x | AccessorCalls.cs:63:94:63:94 | 1 | semmle.label | successor |
-| AccessorCalls.cs:63:87:63:95 | access to indexer | AccessorCalls.cs:63:83:63:96 | (..., ...) | semmle.label | successor |
-| AccessorCalls.cs:63:94:63:94 | 1 | AccessorCalls.cs:63:87:63:95 | access to indexer | semmle.label | successor |
-| AccessorCalls.cs:66:10:66:11 | enter M9 | AccessorCalls.cs:67:5:74:5 | {...} | semmle.label | successor |
-| AccessorCalls.cs:66:10:66:11 | exit M9 (normal) | AccessorCalls.cs:66:10:66:11 | exit M9 | semmle.label | successor |
-| AccessorCalls.cs:67:5:74:5 | {...} | AccessorCalls.cs:68:9:68:22 | ... ...; | semmle.label | successor |
-| AccessorCalls.cs:68:9:68:22 | ... ...; | AccessorCalls.cs:68:21:68:21 | access to parameter o | semmle.label | successor |
-| AccessorCalls.cs:68:17:68:21 | dynamic d = ... | AccessorCalls.cs:69:9:69:36 | ...; | semmle.label | successor |
-| AccessorCalls.cs:68:21:68:21 | access to parameter o | AccessorCalls.cs:68:17:68:21 | dynamic d = ... | semmle.label | successor |
-| AccessorCalls.cs:69:9:69:9 | access to local variable d | AccessorCalls.cs:69:24:69:24 | access to local variable d | semmle.label | successor |
-| AccessorCalls.cs:69:9:69:20 | dynamic access to member MaybeProp1 | AccessorCalls.cs:69:9:69:35 | ... = ... | semmle.label | successor |
-| AccessorCalls.cs:69:9:69:35 | ... = ... | AccessorCalls.cs:70:9:70:22 | ...; | semmle.label | successor |
-| AccessorCalls.cs:69:9:69:36 | ...; | AccessorCalls.cs:69:9:69:9 | access to local variable d | semmle.label | successor |
-| AccessorCalls.cs:69:24:69:24 | access to local variable d | AccessorCalls.cs:69:24:69:35 | dynamic access to member MaybeProp2 | semmle.label | successor |
-| AccessorCalls.cs:69:24:69:35 | dynamic access to member MaybeProp2 | AccessorCalls.cs:69:9:69:20 | dynamic access to member MaybeProp1 | semmle.label | successor |
-| AccessorCalls.cs:70:9:70:9 | access to local variable d | AccessorCalls.cs:70:9:70:19 | dynamic access to member MaybeProp | semmle.label | successor |
-| AccessorCalls.cs:70:9:70:19 | dynamic access to member MaybeProp | AccessorCalls.cs:70:9:70:21 | dynamic call to operator ++ | semmle.label | successor |
-| AccessorCalls.cs:70:9:70:21 | dynamic call to operator ++ | AccessorCalls.cs:71:9:71:26 | ...; | semmle.label | successor |
-| AccessorCalls.cs:70:9:70:22 | ...; | AccessorCalls.cs:70:9:70:9 | access to local variable d | semmle.label | successor |
-| AccessorCalls.cs:71:9:71:9 | access to local variable d | AccessorCalls.cs:71:9:71:9 | access to local variable d | semmle.label | successor |
-| AccessorCalls.cs:71:9:71:9 | access to local variable d | AccessorCalls.cs:71:9:71:20 | dynamic access to member MaybeEvent | semmle.label | successor |
-| AccessorCalls.cs:71:9:71:20 | dynamic access to member MaybeEvent | AccessorCalls.cs:71:9:71:25 | ... = ... | semmle.label | successor |
-| AccessorCalls.cs:71:9:71:20 | dynamic access to member MaybeEvent | AccessorCalls.cs:71:25:71:25 | access to parameter e | semmle.label | successor |
-| AccessorCalls.cs:71:9:71:25 | ... = ... | AccessorCalls.cs:72:9:72:21 | ...; | semmle.label | successor |
-| AccessorCalls.cs:71:9:71:25 | dynamic call to operator + | AccessorCalls.cs:71:9:71:20 | dynamic access to member MaybeEvent | semmle.label | successor |
-| AccessorCalls.cs:71:9:71:26 | ...; | AccessorCalls.cs:71:9:71:9 | access to local variable d | semmle.label | successor |
-| AccessorCalls.cs:71:25:71:25 | access to parameter e | AccessorCalls.cs:71:9:71:25 | dynamic call to operator + | semmle.label | successor |
-| AccessorCalls.cs:72:9:72:9 | access to local variable d | AccessorCalls.cs:72:11:72:11 | 0 | semmle.label | successor |
-| AccessorCalls.cs:72:9:72:9 | access to local variable d | AccessorCalls.cs:72:11:72:11 | 0 | semmle.label | successor |
-| AccessorCalls.cs:72:9:72:12 | dynamic access to element | AccessorCalls.cs:72:9:72:20 | ... = ... | semmle.label | successor |
-| AccessorCalls.cs:72:9:72:12 | dynamic access to element | AccessorCalls.cs:72:17:72:17 | access to local variable d | semmle.label | successor |
-| AccessorCalls.cs:72:9:72:20 | ... = ... | AccessorCalls.cs:73:9:73:84 | ...; | semmle.label | successor |
-| AccessorCalls.cs:72:9:72:20 | dynamic call to operator + | AccessorCalls.cs:72:9:72:12 | dynamic access to element | semmle.label | successor |
-| AccessorCalls.cs:72:9:72:21 | ...; | AccessorCalls.cs:72:9:72:9 | access to local variable d | semmle.label | successor |
-| AccessorCalls.cs:72:11:72:11 | 0 | AccessorCalls.cs:72:9:72:9 | access to local variable d | semmle.label | successor |
-| AccessorCalls.cs:72:11:72:11 | 0 | AccessorCalls.cs:72:9:72:12 | dynamic access to element | semmle.label | successor |
-| AccessorCalls.cs:72:17:72:17 | access to local variable d | AccessorCalls.cs:72:19:72:19 | 1 | semmle.label | successor |
-| AccessorCalls.cs:72:17:72:20 | dynamic access to element | AccessorCalls.cs:72:9:72:20 | dynamic call to operator + | semmle.label | successor |
-| AccessorCalls.cs:72:19:72:19 | 1 | AccessorCalls.cs:72:17:72:20 | dynamic access to element | semmle.label | successor |
-| AccessorCalls.cs:73:9:73:44 | (..., ...) | AccessorCalls.cs:73:49:73:49 | access to local variable d | semmle.label | successor |
-| AccessorCalls.cs:73:9:73:83 | ... = ... | AccessorCalls.cs:66:10:66:11 | exit M9 (normal) | semmle.label | successor |
-| AccessorCalls.cs:73:9:73:84 | ...; | AccessorCalls.cs:73:10:73:10 | access to local variable d | semmle.label | successor |
-| AccessorCalls.cs:73:10:73:10 | access to local variable d | AccessorCalls.cs:73:24:73:27 | this access | semmle.label | successor |
-| AccessorCalls.cs:73:10:73:21 | dynamic access to member MaybeProp1 | AccessorCalls.cs:73:24:73:32 | access to property Prop | semmle.label | successor |
-| AccessorCalls.cs:73:24:73:27 | this access | AccessorCalls.cs:73:39:73:39 | access to local variable d | semmle.label | successor |
-| AccessorCalls.cs:73:24:73:32 | access to property Prop | AccessorCalls.cs:73:39:73:42 | dynamic access to element | semmle.label | successor |
-| AccessorCalls.cs:73:35:73:43 | (..., ...) | AccessorCalls.cs:73:9:73:44 | (..., ...) | semmle.label | successor |
-| AccessorCalls.cs:73:39:73:39 | access to local variable d | AccessorCalls.cs:73:41:73:41 | 0 | semmle.label | successor |
-| AccessorCalls.cs:73:39:73:42 | dynamic access to element | AccessorCalls.cs:73:9:73:83 | ... = ... | semmle.label | successor |
-| AccessorCalls.cs:73:41:73:41 | 0 | AccessorCalls.cs:73:35:73:43 | (..., ...) | semmle.label | successor |
-| AccessorCalls.cs:73:48:73:83 | (..., ...) | AccessorCalls.cs:73:10:73:21 | dynamic access to member MaybeProp1 | semmle.label | successor |
-| AccessorCalls.cs:73:49:73:49 | access to local variable d | AccessorCalls.cs:73:49:73:60 | dynamic access to member MaybeProp1 | semmle.label | successor |
-| AccessorCalls.cs:73:49:73:60 | dynamic access to member MaybeProp1 | AccessorCalls.cs:73:63:73:66 | this access | semmle.label | successor |
-| AccessorCalls.cs:73:63:73:66 | this access | AccessorCalls.cs:73:63:73:71 | access to property Prop | semmle.label | successor |
-| AccessorCalls.cs:73:63:73:71 | access to property Prop | AccessorCalls.cs:73:75:73:75 | 0 | semmle.label | successor |
-| AccessorCalls.cs:73:74:73:82 | (..., ...) | AccessorCalls.cs:73:48:73:83 | (..., ...) | semmle.label | successor |
-| AccessorCalls.cs:73:75:73:75 | 0 | AccessorCalls.cs:73:78:73:78 | access to local variable d | semmle.label | successor |
-| AccessorCalls.cs:73:78:73:78 | access to local variable d | AccessorCalls.cs:73:80:73:80 | 1 | semmle.label | successor |
-| AccessorCalls.cs:73:78:73:81 | dynamic access to element | AccessorCalls.cs:73:74:73:82 | (..., ...) | semmle.label | successor |
-| AccessorCalls.cs:73:80:73:80 | 1 | AccessorCalls.cs:73:78:73:81 | dynamic access to element | semmle.label | successor |
-| ArrayCreation.cs:3:11:3:12 | enter M1 | ArrayCreation.cs:3:27:3:27 | 0 | semmle.label | successor |
-| ArrayCreation.cs:3:11:3:12 | exit M1 (normal) | ArrayCreation.cs:3:11:3:12 | exit M1 | semmle.label | successor |
-| ArrayCreation.cs:3:19:3:28 | array creation of type Int32[] | ArrayCreation.cs:3:11:3:12 | exit M1 (normal) | semmle.label | successor |
-| ArrayCreation.cs:3:27:3:27 | 0 | ArrayCreation.cs:3:19:3:28 | array creation of type Int32[] | semmle.label | successor |
-| ArrayCreation.cs:5:12:5:13 | enter M2 | ArrayCreation.cs:5:28:5:28 | 0 | semmle.label | successor |
-| ArrayCreation.cs:5:12:5:13 | exit M2 (normal) | ArrayCreation.cs:5:12:5:13 | exit M2 | semmle.label | successor |
-| ArrayCreation.cs:5:20:5:32 | array creation of type Int32[,] | ArrayCreation.cs:5:12:5:13 | exit M2 (normal) | semmle.label | successor |
-| ArrayCreation.cs:5:28:5:28 | 0 | ArrayCreation.cs:5:31:5:31 | 1 | semmle.label | successor |
-| ArrayCreation.cs:5:31:5:31 | 1 | ArrayCreation.cs:5:20:5:32 | array creation of type Int32[,] | semmle.label | successor |
-| ArrayCreation.cs:7:11:7:12 | enter M3 | ArrayCreation.cs:7:19:7:36 | 2 | semmle.label | successor |
-| ArrayCreation.cs:7:11:7:12 | exit M3 (normal) | ArrayCreation.cs:7:11:7:12 | exit M3 | semmle.label | successor |
-| ArrayCreation.cs:7:19:7:36 | 2 | ArrayCreation.cs:7:19:7:36 | array creation of type Int32[] | semmle.label | successor |
-| ArrayCreation.cs:7:19:7:36 | array creation of type Int32[] | ArrayCreation.cs:7:31:7:31 | 0 | semmle.label | successor |
-| ArrayCreation.cs:7:29:7:36 | { ..., ... } | ArrayCreation.cs:7:11:7:12 | exit M3 (normal) | semmle.label | successor |
-| ArrayCreation.cs:7:31:7:31 | 0 | ArrayCreation.cs:7:34:7:34 | 1 | semmle.label | successor |
-| ArrayCreation.cs:7:34:7:34 | 1 | ArrayCreation.cs:7:29:7:36 | { ..., ... } | semmle.label | successor |
-| ArrayCreation.cs:9:12:9:13 | enter M4 | ArrayCreation.cs:9:20:9:52 | 2 | semmle.label | successor |
-| ArrayCreation.cs:9:12:9:13 | exit M4 (normal) | ArrayCreation.cs:9:12:9:13 | exit M4 | semmle.label | successor |
-| ArrayCreation.cs:9:20:9:52 | 2 | ArrayCreation.cs:9:20:9:52 | 2 | semmle.label | successor |
-| ArrayCreation.cs:9:20:9:52 | 2 | ArrayCreation.cs:9:20:9:52 | array creation of type Int32[,] | semmle.label | successor |
-| ArrayCreation.cs:9:20:9:52 | array creation of type Int32[,] | ArrayCreation.cs:9:35:9:35 | 0 | semmle.label | successor |
-| ArrayCreation.cs:9:31:9:52 | { ..., ... } | ArrayCreation.cs:9:12:9:13 | exit M4 (normal) | semmle.label | successor |
-| ArrayCreation.cs:9:33:9:40 | { ..., ... } | ArrayCreation.cs:9:45:9:45 | 2 | semmle.label | successor |
-| ArrayCreation.cs:9:35:9:35 | 0 | ArrayCreation.cs:9:38:9:38 | 1 | semmle.label | successor |
-| ArrayCreation.cs:9:38:9:38 | 1 | ArrayCreation.cs:9:33:9:40 | { ..., ... } | semmle.label | successor |
-| ArrayCreation.cs:9:43:9:50 | { ..., ... } | ArrayCreation.cs:9:31:9:52 | { ..., ... } | semmle.label | successor |
-| ArrayCreation.cs:9:45:9:45 | 2 | ArrayCreation.cs:9:48:9:48 | 3 | semmle.label | successor |
-| ArrayCreation.cs:9:48:9:48 | 3 | ArrayCreation.cs:9:43:9:50 | { ..., ... } | semmle.label | successor |
-| Assert.cs:7:10:7:11 | enter M1 | Assert.cs:8:5:12:5 | {...} | semmle.label | successor |
-| Assert.cs:7:10:7:11 | exit M1 (abnormal) | Assert.cs:7:10:7:11 | exit M1 | semmle.label | successor |
-| Assert.cs:7:10:7:11 | exit M1 (normal) | Assert.cs:7:10:7:11 | exit M1 | semmle.label | successor |
-| Assert.cs:8:5:12:5 | {...} | Assert.cs:9:9:9:33 | ... ...; | semmle.label | successor |
-| Assert.cs:9:9:9:33 | ... ...; | Assert.cs:9:20:9:20 | access to parameter b | semmle.label | successor |
-| Assert.cs:9:16:9:32 | String s = ... | Assert.cs:10:9:10:32 | ...; | semmle.label | successor |
-| Assert.cs:9:20:9:20 | access to parameter b | Assert.cs:9:24:9:27 | null | semmle.label | true |
-| Assert.cs:9:20:9:20 | access to parameter b | Assert.cs:9:31:9:32 | "" | semmle.label | false |
-| Assert.cs:9:20:9:32 | ... ? ... : ... | Assert.cs:9:16:9:32 | String s = ... | semmle.label | successor |
-| Assert.cs:9:24:9:27 | null | Assert.cs:9:20:9:32 | ... ? ... : ... | semmle.label | successor |
-| Assert.cs:9:31:9:32 | "" | Assert.cs:9:20:9:32 | ... ? ... : ... | semmle.label | successor |
-| Assert.cs:10:9:10:31 | [assertion failure] call to method Assert | Assert.cs:7:10:7:11 | exit M1 (abnormal) | semmle.label | exit |
-| Assert.cs:10:9:10:31 | [assertion success] call to method Assert | Assert.cs:11:9:11:36 | ...; | semmle.label | successor |
-| Assert.cs:10:9:10:32 | ...; | Assert.cs:10:22:10:22 | access to local variable s | semmle.label | successor |
-| Assert.cs:10:22:10:22 | access to local variable s | Assert.cs:10:27:10:30 | null | semmle.label | successor |
-| Assert.cs:10:22:10:30 | ... != ... | Assert.cs:10:9:10:31 | [assertion failure] call to method Assert | semmle.label | false |
-| Assert.cs:10:22:10:30 | ... != ... | Assert.cs:10:9:10:31 | [assertion success] call to method Assert | semmle.label | true |
-| Assert.cs:10:27:10:30 | null | Assert.cs:10:22:10:30 | ... != ... | semmle.label | successor |
-| Assert.cs:11:9:11:35 | call to method WriteLine | Assert.cs:7:10:7:11 | exit M1 (normal) | semmle.label | successor |
-| Assert.cs:11:9:11:36 | ...; | Assert.cs:11:27:11:27 | access to local variable s | semmle.label | successor |
-| Assert.cs:11:27:11:27 | access to local variable s | Assert.cs:11:27:11:34 | access to property Length | semmle.label | successor |
-| Assert.cs:11:27:11:34 | access to property Length | Assert.cs:11:9:11:35 | call to method WriteLine | semmle.label | successor |
-| Assert.cs:14:10:14:11 | enter M2 | Assert.cs:15:5:19:5 | {...} | semmle.label | successor |
-| Assert.cs:14:10:14:11 | exit M2 (abnormal) | Assert.cs:14:10:14:11 | exit M2 | semmle.label | successor |
-| Assert.cs:14:10:14:11 | exit M2 (normal) | Assert.cs:14:10:14:11 | exit M2 | semmle.label | successor |
-| Assert.cs:15:5:19:5 | {...} | Assert.cs:16:9:16:33 | ... ...; | semmle.label | successor |
-| Assert.cs:16:9:16:33 | ... ...; | Assert.cs:16:20:16:20 | access to parameter b | semmle.label | successor |
-| Assert.cs:16:16:16:32 | String s = ... | Assert.cs:17:9:17:25 | ...; | semmle.label | successor |
-| Assert.cs:16:20:16:20 | access to parameter b | Assert.cs:16:24:16:27 | null | semmle.label | true |
-| Assert.cs:16:20:16:20 | access to parameter b | Assert.cs:16:31:16:32 | "" | semmle.label | false |
-| Assert.cs:16:20:16:32 | ... ? ... : ... | Assert.cs:16:16:16:32 | String s = ... | semmle.label | successor |
-| Assert.cs:16:24:16:27 | null | Assert.cs:16:20:16:32 | ... ? ... : ... | semmle.label | successor |
-| Assert.cs:16:31:16:32 | "" | Assert.cs:16:20:16:32 | ... ? ... : ... | semmle.label | successor |
-| Assert.cs:17:9:17:24 | [assertion failure] call to method IsNull | Assert.cs:14:10:14:11 | exit M2 (abnormal) | semmle.label | exception(AssertFailedException) |
-| Assert.cs:17:9:17:24 | [assertion success] call to method IsNull | Assert.cs:18:9:18:36 | ...; | semmle.label | successor |
-| Assert.cs:17:9:17:25 | ...; | Assert.cs:17:23:17:23 | access to local variable s | semmle.label | successor |
-| Assert.cs:17:23:17:23 | access to local variable s | Assert.cs:17:9:17:24 | [assertion failure] call to method IsNull | semmle.label | non-null |
-| Assert.cs:17:23:17:23 | access to local variable s | Assert.cs:17:9:17:24 | [assertion success] call to method IsNull | semmle.label | null |
-| Assert.cs:18:9:18:35 | call to method WriteLine | Assert.cs:14:10:14:11 | exit M2 (normal) | semmle.label | successor |
-| Assert.cs:18:9:18:36 | ...; | Assert.cs:18:27:18:27 | access to local variable s | semmle.label | successor |
-| Assert.cs:18:27:18:27 | access to local variable s | Assert.cs:18:27:18:34 | access to property Length | semmle.label | successor |
-| Assert.cs:18:27:18:34 | access to property Length | Assert.cs:18:9:18:35 | call to method WriteLine | semmle.label | successor |
-| Assert.cs:21:10:21:11 | enter M3 | Assert.cs:22:5:26:5 | {...} | semmle.label | successor |
-| Assert.cs:21:10:21:11 | exit M3 (abnormal) | Assert.cs:21:10:21:11 | exit M3 | semmle.label | successor |
-| Assert.cs:21:10:21:11 | exit M3 (normal) | Assert.cs:21:10:21:11 | exit M3 | semmle.label | successor |
-| Assert.cs:22:5:26:5 | {...} | Assert.cs:23:9:23:33 | ... ...; | semmle.label | successor |
-| Assert.cs:23:9:23:33 | ... ...; | Assert.cs:23:20:23:20 | access to parameter b | semmle.label | successor |
-| Assert.cs:23:16:23:32 | String s = ... | Assert.cs:24:9:24:28 | ...; | semmle.label | successor |
-| Assert.cs:23:20:23:20 | access to parameter b | Assert.cs:23:24:23:27 | null | semmle.label | true |
-| Assert.cs:23:20:23:20 | access to parameter b | Assert.cs:23:31:23:32 | "" | semmle.label | false |
-| Assert.cs:23:20:23:32 | ... ? ... : ... | Assert.cs:23:16:23:32 | String s = ... | semmle.label | successor |
-| Assert.cs:23:24:23:27 | null | Assert.cs:23:20:23:32 | ... ? ... : ... | semmle.label | successor |
-| Assert.cs:23:31:23:32 | "" | Assert.cs:23:20:23:32 | ... ? ... : ... | semmle.label | successor |
-| Assert.cs:24:9:24:27 | [assertion failure] call to method IsNotNull | Assert.cs:21:10:21:11 | exit M3 (abnormal) | semmle.label | exception(AssertFailedException) |
-| Assert.cs:24:9:24:27 | [assertion success] call to method IsNotNull | Assert.cs:25:9:25:36 | ...; | semmle.label | successor |
-| Assert.cs:24:9:24:28 | ...; | Assert.cs:24:26:24:26 | access to local variable s | semmle.label | successor |
-| Assert.cs:24:26:24:26 | access to local variable s | Assert.cs:24:9:24:27 | [assertion failure] call to method IsNotNull | semmle.label | null |
-| Assert.cs:24:26:24:26 | access to local variable s | Assert.cs:24:9:24:27 | [assertion success] call to method IsNotNull | semmle.label | non-null |
-| Assert.cs:25:9:25:35 | call to method WriteLine | Assert.cs:21:10:21:11 | exit M3 (normal) | semmle.label | successor |
-| Assert.cs:25:9:25:36 | ...; | Assert.cs:25:27:25:27 | access to local variable s | semmle.label | successor |
-| Assert.cs:25:27:25:27 | access to local variable s | Assert.cs:25:27:25:34 | access to property Length | semmle.label | successor |
-| Assert.cs:25:27:25:34 | access to property Length | Assert.cs:25:9:25:35 | call to method WriteLine | semmle.label | successor |
-| Assert.cs:28:10:28:11 | enter M4 | Assert.cs:29:5:33:5 | {...} | semmle.label | successor |
-| Assert.cs:28:10:28:11 | exit M4 (abnormal) | Assert.cs:28:10:28:11 | exit M4 | semmle.label | successor |
-| Assert.cs:28:10:28:11 | exit M4 (normal) | Assert.cs:28:10:28:11 | exit M4 | semmle.label | successor |
-| Assert.cs:29:5:33:5 | {...} | Assert.cs:30:9:30:33 | ... ...; | semmle.label | successor |
-| Assert.cs:30:9:30:33 | ... ...; | Assert.cs:30:20:30:20 | access to parameter b | semmle.label | successor |
-| Assert.cs:30:16:30:32 | String s = ... | Assert.cs:31:9:31:33 | ...; | semmle.label | successor |
-| Assert.cs:30:20:30:20 | access to parameter b | Assert.cs:30:24:30:27 | null | semmle.label | true |
-| Assert.cs:30:20:30:20 | access to parameter b | Assert.cs:30:31:30:32 | "" | semmle.label | false |
-| Assert.cs:30:20:30:32 | ... ? ... : ... | Assert.cs:30:16:30:32 | String s = ... | semmle.label | successor |
-| Assert.cs:30:24:30:27 | null | Assert.cs:30:20:30:32 | ... ? ... : ... | semmle.label | successor |
-| Assert.cs:30:31:30:32 | "" | Assert.cs:30:20:30:32 | ... ? ... : ... | semmle.label | successor |
-| Assert.cs:31:9:31:32 | [assertion failure] call to method IsTrue | Assert.cs:28:10:28:11 | exit M4 (abnormal) | semmle.label | exception(AssertFailedException) |
-| Assert.cs:31:9:31:32 | [assertion success] call to method IsTrue | Assert.cs:32:9:32:36 | ...; | semmle.label | successor |
-| Assert.cs:31:9:31:33 | ...; | Assert.cs:31:23:31:23 | access to local variable s | semmle.label | successor |
-| Assert.cs:31:23:31:23 | access to local variable s | Assert.cs:31:28:31:31 | null | semmle.label | successor |
-| Assert.cs:31:23:31:31 | ... == ... | Assert.cs:31:9:31:32 | [assertion failure] call to method IsTrue | semmle.label | false |
-| Assert.cs:31:23:31:31 | ... == ... | Assert.cs:31:9:31:32 | [assertion success] call to method IsTrue | semmle.label | true |
-| Assert.cs:31:28:31:31 | null | Assert.cs:31:23:31:31 | ... == ... | semmle.label | successor |
-| Assert.cs:32:9:32:35 | call to method WriteLine | Assert.cs:28:10:28:11 | exit M4 (normal) | semmle.label | successor |
-| Assert.cs:32:9:32:36 | ...; | Assert.cs:32:27:32:27 | access to local variable s | semmle.label | successor |
-| Assert.cs:32:27:32:27 | access to local variable s | Assert.cs:32:27:32:34 | access to property Length | semmle.label | successor |
-| Assert.cs:32:27:32:34 | access to property Length | Assert.cs:32:9:32:35 | call to method WriteLine | semmle.label | successor |
-| Assert.cs:35:10:35:11 | enter M5 | Assert.cs:36:5:40:5 | {...} | semmle.label | successor |
-| Assert.cs:35:10:35:11 | exit M5 (abnormal) | Assert.cs:35:10:35:11 | exit M5 | semmle.label | successor |
-| Assert.cs:35:10:35:11 | exit M5 (normal) | Assert.cs:35:10:35:11 | exit M5 | semmle.label | successor |
-| Assert.cs:36:5:40:5 | {...} | Assert.cs:37:9:37:33 | ... ...; | semmle.label | successor |
-| Assert.cs:37:9:37:33 | ... ...; | Assert.cs:37:20:37:20 | access to parameter b | semmle.label | successor |
-| Assert.cs:37:16:37:32 | String s = ... | Assert.cs:38:9:38:33 | ...; | semmle.label | successor |
-| Assert.cs:37:20:37:20 | access to parameter b | Assert.cs:37:24:37:27 | null | semmle.label | true |
-| Assert.cs:37:20:37:20 | access to parameter b | Assert.cs:37:31:37:32 | "" | semmle.label | false |
-| Assert.cs:37:20:37:32 | ... ? ... : ... | Assert.cs:37:16:37:32 | String s = ... | semmle.label | successor |
-| Assert.cs:37:24:37:27 | null | Assert.cs:37:20:37:32 | ... ? ... : ... | semmle.label | successor |
-| Assert.cs:37:31:37:32 | "" | Assert.cs:37:20:37:32 | ... ? ... : ... | semmle.label | successor |
-| Assert.cs:38:9:38:32 | [assertion failure] call to method IsTrue | Assert.cs:35:10:35:11 | exit M5 (abnormal) | semmle.label | exception(AssertFailedException) |
-| Assert.cs:38:9:38:32 | [assertion success] call to method IsTrue | Assert.cs:39:9:39:36 | ...; | semmle.label | successor |
-| Assert.cs:38:9:38:33 | ...; | Assert.cs:38:23:38:23 | access to local variable s | semmle.label | successor |
-| Assert.cs:38:23:38:23 | access to local variable s | Assert.cs:38:28:38:31 | null | semmle.label | successor |
-| Assert.cs:38:23:38:31 | ... != ... | Assert.cs:38:9:38:32 | [assertion failure] call to method IsTrue | semmle.label | false |
-| Assert.cs:38:23:38:31 | ... != ... | Assert.cs:38:9:38:32 | [assertion success] call to method IsTrue | semmle.label | true |
-| Assert.cs:38:28:38:31 | null | Assert.cs:38:23:38:31 | ... != ... | semmle.label | successor |
-| Assert.cs:39:9:39:35 | call to method WriteLine | Assert.cs:35:10:35:11 | exit M5 (normal) | semmle.label | successor |
-| Assert.cs:39:9:39:36 | ...; | Assert.cs:39:27:39:27 | access to local variable s | semmle.label | successor |
-| Assert.cs:39:27:39:27 | access to local variable s | Assert.cs:39:27:39:34 | access to property Length | semmle.label | successor |
-| Assert.cs:39:27:39:34 | access to property Length | Assert.cs:39:9:39:35 | call to method WriteLine | semmle.label | successor |
-| Assert.cs:42:10:42:11 | enter M6 | Assert.cs:43:5:47:5 | {...} | semmle.label | successor |
-| Assert.cs:42:10:42:11 | exit M6 (abnormal) | Assert.cs:42:10:42:11 | exit M6 | semmle.label | successor |
-| Assert.cs:42:10:42:11 | exit M6 (normal) | Assert.cs:42:10:42:11 | exit M6 | semmle.label | successor |
-| Assert.cs:43:5:47:5 | {...} | Assert.cs:44:9:44:33 | ... ...; | semmle.label | successor |
-| Assert.cs:44:9:44:33 | ... ...; | Assert.cs:44:20:44:20 | access to parameter b | semmle.label | successor |
-| Assert.cs:44:16:44:32 | String s = ... | Assert.cs:45:9:45:34 | ...; | semmle.label | successor |
-| Assert.cs:44:20:44:20 | access to parameter b | Assert.cs:44:24:44:27 | null | semmle.label | true |
-| Assert.cs:44:20:44:20 | access to parameter b | Assert.cs:44:31:44:32 | "" | semmle.label | false |
-| Assert.cs:44:20:44:32 | ... ? ... : ... | Assert.cs:44:16:44:32 | String s = ... | semmle.label | successor |
-| Assert.cs:44:24:44:27 | null | Assert.cs:44:20:44:32 | ... ? ... : ... | semmle.label | successor |
-| Assert.cs:44:31:44:32 | "" | Assert.cs:44:20:44:32 | ... ? ... : ... | semmle.label | successor |
-| Assert.cs:45:9:45:33 | [assertion failure] call to method IsFalse | Assert.cs:42:10:42:11 | exit M6 (abnormal) | semmle.label | exception(AssertFailedException) |
-| Assert.cs:45:9:45:33 | [assertion success] call to method IsFalse | Assert.cs:46:9:46:36 | ...; | semmle.label | successor |
-| Assert.cs:45:9:45:34 | ...; | Assert.cs:45:24:45:24 | access to local variable s | semmle.label | successor |
-| Assert.cs:45:24:45:24 | access to local variable s | Assert.cs:45:29:45:32 | null | semmle.label | successor |
-| Assert.cs:45:24:45:32 | ... != ... | Assert.cs:45:9:45:33 | [assertion failure] call to method IsFalse | semmle.label | true |
-| Assert.cs:45:24:45:32 | ... != ... | Assert.cs:45:9:45:33 | [assertion success] call to method IsFalse | semmle.label | false |
-| Assert.cs:45:29:45:32 | null | Assert.cs:45:24:45:32 | ... != ... | semmle.label | successor |
-| Assert.cs:46:9:46:35 | call to method WriteLine | Assert.cs:42:10:42:11 | exit M6 (normal) | semmle.label | successor |
-| Assert.cs:46:9:46:36 | ...; | Assert.cs:46:27:46:27 | access to local variable s | semmle.label | successor |
-| Assert.cs:46:27:46:27 | access to local variable s | Assert.cs:46:27:46:34 | access to property Length | semmle.label | successor |
-| Assert.cs:46:27:46:34 | access to property Length | Assert.cs:46:9:46:35 | call to method WriteLine | semmle.label | successor |
-| Assert.cs:49:10:49:11 | enter M7 | Assert.cs:50:5:54:5 | {...} | semmle.label | successor |
-| Assert.cs:49:10:49:11 | exit M7 (abnormal) | Assert.cs:49:10:49:11 | exit M7 | semmle.label | successor |
-| Assert.cs:49:10:49:11 | exit M7 (normal) | Assert.cs:49:10:49:11 | exit M7 | semmle.label | successor |
-| Assert.cs:50:5:54:5 | {...} | Assert.cs:51:9:51:33 | ... ...; | semmle.label | successor |
-| Assert.cs:51:9:51:33 | ... ...; | Assert.cs:51:20:51:20 | access to parameter b | semmle.label | successor |
-| Assert.cs:51:16:51:32 | String s = ... | Assert.cs:52:9:52:34 | ...; | semmle.label | successor |
-| Assert.cs:51:20:51:20 | access to parameter b | Assert.cs:51:24:51:27 | null | semmle.label | true |
-| Assert.cs:51:20:51:20 | access to parameter b | Assert.cs:51:31:51:32 | "" | semmle.label | false |
-| Assert.cs:51:20:51:32 | ... ? ... : ... | Assert.cs:51:16:51:32 | String s = ... | semmle.label | successor |
-| Assert.cs:51:24:51:27 | null | Assert.cs:51:20:51:32 | ... ? ... : ... | semmle.label | successor |
-| Assert.cs:51:31:51:32 | "" | Assert.cs:51:20:51:32 | ... ? ... : ... | semmle.label | successor |
-| Assert.cs:52:9:52:33 | [assertion failure] call to method IsFalse | Assert.cs:49:10:49:11 | exit M7 (abnormal) | semmle.label | exception(AssertFailedException) |
-| Assert.cs:52:9:52:33 | [assertion success] call to method IsFalse | Assert.cs:53:9:53:36 | ...; | semmle.label | successor |
-| Assert.cs:52:9:52:34 | ...; | Assert.cs:52:24:52:24 | access to local variable s | semmle.label | successor |
-| Assert.cs:52:24:52:24 | access to local variable s | Assert.cs:52:29:52:32 | null | semmle.label | successor |
-| Assert.cs:52:24:52:32 | ... == ... | Assert.cs:52:9:52:33 | [assertion failure] call to method IsFalse | semmle.label | true |
-| Assert.cs:52:24:52:32 | ... == ... | Assert.cs:52:9:52:33 | [assertion success] call to method IsFalse | semmle.label | false |
-| Assert.cs:52:29:52:32 | null | Assert.cs:52:24:52:32 | ... == ... | semmle.label | successor |
-| Assert.cs:53:9:53:35 | call to method WriteLine | Assert.cs:49:10:49:11 | exit M7 (normal) | semmle.label | successor |
-| Assert.cs:53:9:53:36 | ...; | Assert.cs:53:27:53:27 | access to local variable s | semmle.label | successor |
-| Assert.cs:53:27:53:27 | access to local variable s | Assert.cs:53:27:53:34 | access to property Length | semmle.label | successor |
-| Assert.cs:53:27:53:34 | access to property Length | Assert.cs:53:9:53:35 | call to method WriteLine | semmle.label | successor |
-| Assert.cs:56:10:56:11 | enter M8 | Assert.cs:57:5:61:5 | {...} | semmle.label | successor |
-| Assert.cs:56:10:56:11 | exit M8 (abnormal) | Assert.cs:56:10:56:11 | exit M8 | semmle.label | successor |
-| Assert.cs:56:10:56:11 | exit M8 (normal) | Assert.cs:56:10:56:11 | exit M8 | semmle.label | successor |
-| Assert.cs:57:5:61:5 | {...} | Assert.cs:58:9:58:33 | ... ...; | semmle.label | successor |
-| Assert.cs:58:9:58:33 | ... ...; | Assert.cs:58:20:58:20 | access to parameter b | semmle.label | successor |
-| Assert.cs:58:16:58:32 | [b (line 56): false] String s = ... | Assert.cs:59:9:59:38 | [b (line 56): false] ...; | semmle.label | successor |
-| Assert.cs:58:16:58:32 | [b (line 56): true] String s = ... | Assert.cs:59:9:59:38 | [b (line 56): true] ...; | semmle.label | successor |
-| Assert.cs:58:20:58:20 | access to parameter b | Assert.cs:58:24:58:27 | [b (line 56): true] null | semmle.label | true |
-| Assert.cs:58:20:58:20 | access to parameter b | Assert.cs:58:31:58:32 | [b (line 56): false] "" | semmle.label | false |
-| Assert.cs:58:20:58:32 | [b (line 56): false] ... ? ... : ... | Assert.cs:58:16:58:32 | [b (line 56): false] String s = ... | semmle.label | successor |
-| Assert.cs:58:20:58:32 | [b (line 56): true] ... ? ... : ... | Assert.cs:58:16:58:32 | [b (line 56): true] String s = ... | semmle.label | successor |
-| Assert.cs:58:24:58:27 | [b (line 56): true] null | Assert.cs:58:20:58:32 | [b (line 56): true] ... ? ... : ... | semmle.label | successor |
-| Assert.cs:58:31:58:32 | [b (line 56): false] "" | Assert.cs:58:20:58:32 | [b (line 56): false] ... ? ... : ... | semmle.label | successor |
-| Assert.cs:59:9:59:37 | [assertion failure] call to method IsTrue | Assert.cs:56:10:56:11 | exit M8 (abnormal) | semmle.label | exception(AssertFailedException) |
-| Assert.cs:59:9:59:37 | [assertion success] call to method IsTrue | Assert.cs:60:9:60:36 | ...; | semmle.label | successor |
-| Assert.cs:59:9:59:38 | [b (line 56): false] ...; | Assert.cs:59:23:59:23 | [b (line 56): false] access to local variable s | semmle.label | successor |
-| Assert.cs:59:9:59:38 | [b (line 56): true] ...; | Assert.cs:59:23:59:23 | [b (line 56): true] access to local variable s | semmle.label | successor |
-| Assert.cs:59:23:59:23 | [b (line 56): false] access to local variable s | Assert.cs:59:28:59:31 | [b (line 56): false] null | semmle.label | successor |
-| Assert.cs:59:23:59:23 | [b (line 56): true] access to local variable s | Assert.cs:59:28:59:31 | [b (line 56): true] null | semmle.label | successor |
-| Assert.cs:59:23:59:31 | [b (line 56): false] ... != ... | Assert.cs:59:23:59:36 | [false] ... && ... | semmle.label | false |
-| Assert.cs:59:23:59:31 | [b (line 56): false] ... != ... | Assert.cs:59:36:59:36 | [b (line 56): false] access to parameter b | semmle.label | true |
-| Assert.cs:59:23:59:31 | [b (line 56): true] ... != ... | Assert.cs:59:23:59:36 | [false] ... && ... | semmle.label | false |
-| Assert.cs:59:23:59:31 | [b (line 56): true] ... != ... | Assert.cs:59:36:59:36 | [b (line 56): true] access to parameter b | semmle.label | true |
-| Assert.cs:59:23:59:36 | [false] ... && ... | Assert.cs:59:9:59:37 | [assertion failure] call to method IsTrue | semmle.label | false |
-| Assert.cs:59:23:59:36 | [true] ... && ... | Assert.cs:59:9:59:37 | [assertion success] call to method IsTrue | semmle.label | true |
-| Assert.cs:59:28:59:31 | [b (line 56): false] null | Assert.cs:59:23:59:31 | [b (line 56): false] ... != ... | semmle.label | successor |
-| Assert.cs:59:28:59:31 | [b (line 56): true] null | Assert.cs:59:23:59:31 | [b (line 56): true] ... != ... | semmle.label | successor |
-| Assert.cs:59:36:59:36 | [b (line 56): false] access to parameter b | Assert.cs:59:23:59:36 | [false] ... && ... | semmle.label | false |
-| Assert.cs:59:36:59:36 | [b (line 56): true] access to parameter b | Assert.cs:59:23:59:36 | [true] ... && ... | semmle.label | true |
-| Assert.cs:60:9:60:35 | call to method WriteLine | Assert.cs:56:10:56:11 | exit M8 (normal) | semmle.label | successor |
-| Assert.cs:60:9:60:36 | ...; | Assert.cs:60:27:60:27 | access to local variable s | semmle.label | successor |
-| Assert.cs:60:27:60:27 | access to local variable s | Assert.cs:60:27:60:34 | access to property Length | semmle.label | successor |
-| Assert.cs:60:27:60:34 | access to property Length | Assert.cs:60:9:60:35 | call to method WriteLine | semmle.label | successor |
-| Assert.cs:63:10:63:11 | enter M9 | Assert.cs:64:5:68:5 | {...} | semmle.label | successor |
-| Assert.cs:63:10:63:11 | exit M9 (abnormal) | Assert.cs:63:10:63:11 | exit M9 | semmle.label | successor |
-| Assert.cs:63:10:63:11 | exit M9 (normal) | Assert.cs:63:10:63:11 | exit M9 | semmle.label | successor |
-| Assert.cs:64:5:68:5 | {...} | Assert.cs:65:9:65:33 | ... ...; | semmle.label | successor |
-| Assert.cs:65:9:65:33 | ... ...; | Assert.cs:65:20:65:20 | access to parameter b | semmle.label | successor |
-| Assert.cs:65:16:65:32 | [b (line 63): false] String s = ... | Assert.cs:66:9:66:39 | [b (line 63): false] ...; | semmle.label | successor |
-| Assert.cs:65:16:65:32 | [b (line 63): true] String s = ... | Assert.cs:66:9:66:39 | [b (line 63): true] ...; | semmle.label | successor |
-| Assert.cs:65:20:65:20 | access to parameter b | Assert.cs:65:24:65:27 | [b (line 63): true] null | semmle.label | true |
-| Assert.cs:65:20:65:20 | access to parameter b | Assert.cs:65:31:65:32 | [b (line 63): false] "" | semmle.label | false |
-| Assert.cs:65:20:65:32 | [b (line 63): false] ... ? ... : ... | Assert.cs:65:16:65:32 | [b (line 63): false] String s = ... | semmle.label | successor |
-| Assert.cs:65:20:65:32 | [b (line 63): true] ... ? ... : ... | Assert.cs:65:16:65:32 | [b (line 63): true] String s = ... | semmle.label | successor |
-| Assert.cs:65:24:65:27 | [b (line 63): true] null | Assert.cs:65:20:65:32 | [b (line 63): true] ... ? ... : ... | semmle.label | successor |
-| Assert.cs:65:31:65:32 | [b (line 63): false] "" | Assert.cs:65:20:65:32 | [b (line 63): false] ... ? ... : ... | semmle.label | successor |
-| Assert.cs:66:9:66:38 | [assertion failure] call to method IsFalse | Assert.cs:63:10:63:11 | exit M9 (abnormal) | semmle.label | exception(AssertFailedException) |
-| Assert.cs:66:9:66:38 | [assertion success] call to method IsFalse | Assert.cs:67:9:67:36 | ...; | semmle.label | successor |
-| Assert.cs:66:9:66:39 | [b (line 63): false] ...; | Assert.cs:66:24:66:24 | [b (line 63): false] access to local variable s | semmle.label | successor |
-| Assert.cs:66:9:66:39 | [b (line 63): true] ...; | Assert.cs:66:24:66:24 | [b (line 63): true] access to local variable s | semmle.label | successor |
-| Assert.cs:66:24:66:24 | [b (line 63): false] access to local variable s | Assert.cs:66:29:66:32 | [b (line 63): false] null | semmle.label | successor |
-| Assert.cs:66:24:66:24 | [b (line 63): true] access to local variable s | Assert.cs:66:29:66:32 | [b (line 63): true] null | semmle.label | successor |
-| Assert.cs:66:24:66:32 | [b (line 63): false] ... == ... | Assert.cs:66:24:66:37 | [true] ... \|\| ... | semmle.label | true |
-| Assert.cs:66:24:66:32 | [b (line 63): false] ... == ... | Assert.cs:66:37:66:37 | [b (line 63): false] access to parameter b | semmle.label | false |
-| Assert.cs:66:24:66:32 | [b (line 63): true] ... == ... | Assert.cs:66:24:66:37 | [true] ... \|\| ... | semmle.label | true |
-| Assert.cs:66:24:66:32 | [b (line 63): true] ... == ... | Assert.cs:66:37:66:37 | [b (line 63): true] access to parameter b | semmle.label | false |
-| Assert.cs:66:24:66:37 | [false] ... \|\| ... | Assert.cs:66:9:66:38 | [assertion success] call to method IsFalse | semmle.label | false |
-| Assert.cs:66:24:66:37 | [true] ... \|\| ... | Assert.cs:66:9:66:38 | [assertion failure] call to method IsFalse | semmle.label | true |
-| Assert.cs:66:29:66:32 | [b (line 63): false] null | Assert.cs:66:24:66:32 | [b (line 63): false] ... == ... | semmle.label | successor |
-| Assert.cs:66:29:66:32 | [b (line 63): true] null | Assert.cs:66:24:66:32 | [b (line 63): true] ... == ... | semmle.label | successor |
-| Assert.cs:66:37:66:37 | [b (line 63): false] access to parameter b | Assert.cs:66:24:66:37 | [false] ... \|\| ... | semmle.label | false |
-| Assert.cs:66:37:66:37 | [b (line 63): true] access to parameter b | Assert.cs:66:24:66:37 | [true] ... \|\| ... | semmle.label | true |
-| Assert.cs:67:9:67:35 | call to method WriteLine | Assert.cs:63:10:63:11 | exit M9 (normal) | semmle.label | successor |
-| Assert.cs:67:9:67:36 | ...; | Assert.cs:67:27:67:27 | access to local variable s | semmle.label | successor |
-| Assert.cs:67:27:67:27 | access to local variable s | Assert.cs:67:27:67:34 | access to property Length | semmle.label | successor |
-| Assert.cs:67:27:67:34 | access to property Length | Assert.cs:67:9:67:35 | call to method WriteLine | semmle.label | successor |
-| Assert.cs:70:10:70:12 | enter M10 | Assert.cs:71:5:75:5 | {...} | semmle.label | successor |
-| Assert.cs:70:10:70:12 | exit M10 (abnormal) | Assert.cs:70:10:70:12 | exit M10 | semmle.label | successor |
-| Assert.cs:70:10:70:12 | exit M10 (normal) | Assert.cs:70:10:70:12 | exit M10 | semmle.label | successor |
-| Assert.cs:71:5:75:5 | {...} | Assert.cs:72:9:72:33 | ... ...; | semmle.label | successor |
-| Assert.cs:72:9:72:33 | ... ...; | Assert.cs:72:20:72:20 | access to parameter b | semmle.label | successor |
-| Assert.cs:72:16:72:32 | [b (line 70): false] String s = ... | Assert.cs:73:9:73:38 | [b (line 70): false] ...; | semmle.label | successor |
-| Assert.cs:72:16:72:32 | [b (line 70): true] String s = ... | Assert.cs:73:9:73:38 | [b (line 70): true] ...; | semmle.label | successor |
-| Assert.cs:72:20:72:20 | access to parameter b | Assert.cs:72:24:72:27 | [b (line 70): true] null | semmle.label | true |
-| Assert.cs:72:20:72:20 | access to parameter b | Assert.cs:72:31:72:32 | [b (line 70): false] "" | semmle.label | false |
-| Assert.cs:72:20:72:32 | [b (line 70): false] ... ? ... : ... | Assert.cs:72:16:72:32 | [b (line 70): false] String s = ... | semmle.label | successor |
-| Assert.cs:72:20:72:32 | [b (line 70): true] ... ? ... : ... | Assert.cs:72:16:72:32 | [b (line 70): true] String s = ... | semmle.label | successor |
-| Assert.cs:72:24:72:27 | [b (line 70): true] null | Assert.cs:72:20:72:32 | [b (line 70): true] ... ? ... : ... | semmle.label | successor |
-| Assert.cs:72:31:72:32 | [b (line 70): false] "" | Assert.cs:72:20:72:32 | [b (line 70): false] ... ? ... : ... | semmle.label | successor |
-| Assert.cs:73:9:73:37 | [assertion failure] call to method IsTrue | Assert.cs:70:10:70:12 | exit M10 (abnormal) | semmle.label | exception(AssertFailedException) |
-| Assert.cs:73:9:73:37 | [assertion success] call to method IsTrue | Assert.cs:74:9:74:36 | ...; | semmle.label | successor |
-| Assert.cs:73:9:73:38 | [b (line 70): false] ...; | Assert.cs:73:23:73:23 | [b (line 70): false] access to local variable s | semmle.label | successor |
-| Assert.cs:73:9:73:38 | [b (line 70): true] ...; | Assert.cs:73:23:73:23 | [b (line 70): true] access to local variable s | semmle.label | successor |
-| Assert.cs:73:23:73:23 | [b (line 70): false] access to local variable s | Assert.cs:73:28:73:31 | [b (line 70): false] null | semmle.label | successor |
-| Assert.cs:73:23:73:23 | [b (line 70): true] access to local variable s | Assert.cs:73:28:73:31 | [b (line 70): true] null | semmle.label | successor |
-| Assert.cs:73:23:73:31 | [b (line 70): false] ... == ... | Assert.cs:73:23:73:36 | [false] ... && ... | semmle.label | false |
-| Assert.cs:73:23:73:31 | [b (line 70): false] ... == ... | Assert.cs:73:36:73:36 | [b (line 70): false] access to parameter b | semmle.label | true |
-| Assert.cs:73:23:73:31 | [b (line 70): true] ... == ... | Assert.cs:73:23:73:36 | [false] ... && ... | semmle.label | false |
-| Assert.cs:73:23:73:31 | [b (line 70): true] ... == ... | Assert.cs:73:36:73:36 | [b (line 70): true] access to parameter b | semmle.label | true |
-| Assert.cs:73:23:73:36 | [false] ... && ... | Assert.cs:73:9:73:37 | [assertion failure] call to method IsTrue | semmle.label | false |
-| Assert.cs:73:23:73:36 | [true] ... && ... | Assert.cs:73:9:73:37 | [assertion success] call to method IsTrue | semmle.label | true |
-| Assert.cs:73:28:73:31 | [b (line 70): false] null | Assert.cs:73:23:73:31 | [b (line 70): false] ... == ... | semmle.label | successor |
-| Assert.cs:73:28:73:31 | [b (line 70): true] null | Assert.cs:73:23:73:31 | [b (line 70): true] ... == ... | semmle.label | successor |
-| Assert.cs:73:36:73:36 | [b (line 70): false] access to parameter b | Assert.cs:73:23:73:36 | [false] ... && ... | semmle.label | false |
-| Assert.cs:73:36:73:36 | [b (line 70): true] access to parameter b | Assert.cs:73:23:73:36 | [true] ... && ... | semmle.label | true |
-| Assert.cs:74:9:74:35 | call to method WriteLine | Assert.cs:70:10:70:12 | exit M10 (normal) | semmle.label | successor |
-| Assert.cs:74:9:74:36 | ...; | Assert.cs:74:27:74:27 | access to local variable s | semmle.label | successor |
-| Assert.cs:74:27:74:27 | access to local variable s | Assert.cs:74:27:74:34 | access to property Length | semmle.label | successor |
-| Assert.cs:74:27:74:34 | access to property Length | Assert.cs:74:9:74:35 | call to method WriteLine | semmle.label | successor |
-| Assert.cs:77:10:77:12 | enter M11 | Assert.cs:78:5:82:5 | {...} | semmle.label | successor |
-| Assert.cs:77:10:77:12 | exit M11 (abnormal) | Assert.cs:77:10:77:12 | exit M11 | semmle.label | successor |
-| Assert.cs:77:10:77:12 | exit M11 (normal) | Assert.cs:77:10:77:12 | exit M11 | semmle.label | successor |
-| Assert.cs:78:5:82:5 | {...} | Assert.cs:79:9:79:33 | ... ...; | semmle.label | successor |
-| Assert.cs:79:9:79:33 | ... ...; | Assert.cs:79:20:79:20 | access to parameter b | semmle.label | successor |
-| Assert.cs:79:16:79:32 | [b (line 77): false] String s = ... | Assert.cs:80:9:80:39 | [b (line 77): false] ...; | semmle.label | successor |
-| Assert.cs:79:16:79:32 | [b (line 77): true] String s = ... | Assert.cs:80:9:80:39 | [b (line 77): true] ...; | semmle.label | successor |
-| Assert.cs:79:20:79:20 | access to parameter b | Assert.cs:79:24:79:27 | [b (line 77): true] null | semmle.label | true |
-| Assert.cs:79:20:79:20 | access to parameter b | Assert.cs:79:31:79:32 | [b (line 77): false] "" | semmle.label | false |
-| Assert.cs:79:20:79:32 | [b (line 77): false] ... ? ... : ... | Assert.cs:79:16:79:32 | [b (line 77): false] String s = ... | semmle.label | successor |
-| Assert.cs:79:20:79:32 | [b (line 77): true] ... ? ... : ... | Assert.cs:79:16:79:32 | [b (line 77): true] String s = ... | semmle.label | successor |
-| Assert.cs:79:24:79:27 | [b (line 77): true] null | Assert.cs:79:20:79:32 | [b (line 77): true] ... ? ... : ... | semmle.label | successor |
-| Assert.cs:79:31:79:32 | [b (line 77): false] "" | Assert.cs:79:20:79:32 | [b (line 77): false] ... ? ... : ... | semmle.label | successor |
-| Assert.cs:80:9:80:38 | [assertion failure] call to method IsFalse | Assert.cs:77:10:77:12 | exit M11 (abnormal) | semmle.label | exception(AssertFailedException) |
-| Assert.cs:80:9:80:38 | [assertion success] call to method IsFalse | Assert.cs:81:9:81:36 | ...; | semmle.label | successor |
-| Assert.cs:80:9:80:39 | [b (line 77): false] ...; | Assert.cs:80:24:80:24 | [b (line 77): false] access to local variable s | semmle.label | successor |
-| Assert.cs:80:9:80:39 | [b (line 77): true] ...; | Assert.cs:80:24:80:24 | [b (line 77): true] access to local variable s | semmle.label | successor |
-| Assert.cs:80:24:80:24 | [b (line 77): false] access to local variable s | Assert.cs:80:29:80:32 | [b (line 77): false] null | semmle.label | successor |
-| Assert.cs:80:24:80:24 | [b (line 77): true] access to local variable s | Assert.cs:80:29:80:32 | [b (line 77): true] null | semmle.label | successor |
-| Assert.cs:80:24:80:32 | [b (line 77): false] ... != ... | Assert.cs:80:24:80:37 | [true] ... \|\| ... | semmle.label | true |
-| Assert.cs:80:24:80:32 | [b (line 77): false] ... != ... | Assert.cs:80:37:80:37 | [b (line 77): false] access to parameter b | semmle.label | false |
-| Assert.cs:80:24:80:32 | [b (line 77): true] ... != ... | Assert.cs:80:24:80:37 | [true] ... \|\| ... | semmle.label | true |
-| Assert.cs:80:24:80:32 | [b (line 77): true] ... != ... | Assert.cs:80:37:80:37 | [b (line 77): true] access to parameter b | semmle.label | false |
-| Assert.cs:80:24:80:37 | [false] ... \|\| ... | Assert.cs:80:9:80:38 | [assertion success] call to method IsFalse | semmle.label | false |
-| Assert.cs:80:24:80:37 | [true] ... \|\| ... | Assert.cs:80:9:80:38 | [assertion failure] call to method IsFalse | semmle.label | true |
-| Assert.cs:80:29:80:32 | [b (line 77): false] null | Assert.cs:80:24:80:32 | [b (line 77): false] ... != ... | semmle.label | successor |
-| Assert.cs:80:29:80:32 | [b (line 77): true] null | Assert.cs:80:24:80:32 | [b (line 77): true] ... != ... | semmle.label | successor |
-| Assert.cs:80:37:80:37 | [b (line 77): false] access to parameter b | Assert.cs:80:24:80:37 | [false] ... \|\| ... | semmle.label | false |
-| Assert.cs:80:37:80:37 | [b (line 77): true] access to parameter b | Assert.cs:80:24:80:37 | [true] ... \|\| ... | semmle.label | true |
-| Assert.cs:81:9:81:35 | call to method WriteLine | Assert.cs:77:10:77:12 | exit M11 (normal) | semmle.label | successor |
-| Assert.cs:81:9:81:36 | ...; | Assert.cs:81:27:81:27 | access to local variable s | semmle.label | successor |
-| Assert.cs:81:27:81:27 | access to local variable s | Assert.cs:81:27:81:34 | access to property Length | semmle.label | successor |
-| Assert.cs:81:27:81:34 | access to property Length | Assert.cs:81:9:81:35 | call to method WriteLine | semmle.label | successor |
-| Assert.cs:84:10:84:12 | enter M12 | Assert.cs:85:5:129:5 | {...} | semmle.label | successor |
-| Assert.cs:84:10:84:12 | exit M12 (abnormal) | Assert.cs:84:10:84:12 | exit M12 | semmle.label | successor |
-| Assert.cs:84:10:84:12 | exit M12 (normal) | Assert.cs:84:10:84:12 | exit M12 | semmle.label | successor |
-| Assert.cs:85:5:129:5 | {...} | Assert.cs:86:9:86:33 | ... ...; | semmle.label | successor |
-| Assert.cs:86:9:86:33 | ... ...; | Assert.cs:86:20:86:20 | access to parameter b | semmle.label | successor |
-| Assert.cs:86:16:86:32 | [b (line 84): false] String s = ... | Assert.cs:87:9:87:32 | [b (line 84): false] ...; | semmle.label | successor |
-| Assert.cs:86:16:86:32 | [b (line 84): true] String s = ... | Assert.cs:87:9:87:32 | [b (line 84): true] ...; | semmle.label | successor |
-| Assert.cs:86:20:86:20 | access to parameter b | Assert.cs:86:24:86:27 | [b (line 84): true] null | semmle.label | true |
-| Assert.cs:86:20:86:20 | access to parameter b | Assert.cs:86:31:86:32 | [b (line 84): false] "" | semmle.label | false |
-| Assert.cs:86:20:86:32 | [b (line 84): false] ... ? ... : ... | Assert.cs:86:16:86:32 | [b (line 84): false] String s = ... | semmle.label | successor |
-| Assert.cs:86:20:86:32 | [b (line 84): true] ... ? ... : ... | Assert.cs:86:16:86:32 | [b (line 84): true] String s = ... | semmle.label | successor |
-| Assert.cs:86:24:86:27 | [b (line 84): true] null | Assert.cs:86:20:86:32 | [b (line 84): true] ... ? ... : ... | semmle.label | successor |
-| Assert.cs:86:31:86:32 | [b (line 84): false] "" | Assert.cs:86:20:86:32 | [b (line 84): false] ... ? ... : ... | semmle.label | successor |
-| Assert.cs:87:9:87:31 | [assertion failure, b (line 84): false] call to method Assert | Assert.cs:84:10:84:12 | exit M12 (abnormal) | semmle.label | exit |
-| Assert.cs:87:9:87:31 | [assertion failure, b (line 84): true] call to method Assert | Assert.cs:84:10:84:12 | exit M12 (abnormal) | semmle.label | exit |
-| Assert.cs:87:9:87:31 | [assertion success, b (line 84): false] call to method Assert | Assert.cs:88:9:88:36 | [b (line 84): false] ...; | semmle.label | successor |
-| Assert.cs:87:9:87:31 | [assertion success, b (line 84): true] call to method Assert | Assert.cs:88:9:88:36 | [b (line 84): true] ...; | semmle.label | successor |
-| Assert.cs:87:9:87:32 | [b (line 84): false] ...; | Assert.cs:87:22:87:22 | [b (line 84): false] access to local variable s | semmle.label | successor |
-| Assert.cs:87:9:87:32 | [b (line 84): true] ...; | Assert.cs:87:22:87:22 | [b (line 84): true] access to local variable s | semmle.label | successor |
-| Assert.cs:87:22:87:22 | [b (line 84): false] access to local variable s | Assert.cs:87:27:87:30 | [b (line 84): false] null | semmle.label | successor |
-| Assert.cs:87:22:87:22 | [b (line 84): true] access to local variable s | Assert.cs:87:27:87:30 | [b (line 84): true] null | semmle.label | successor |
-| Assert.cs:87:22:87:30 | [b (line 84): false] ... != ... | Assert.cs:87:9:87:31 | [assertion failure, b (line 84): false] call to method Assert | semmle.label | false |
-| Assert.cs:87:22:87:30 | [b (line 84): false] ... != ... | Assert.cs:87:9:87:31 | [assertion success, b (line 84): false] call to method Assert | semmle.label | true |
-| Assert.cs:87:22:87:30 | [b (line 84): true] ... != ... | Assert.cs:87:9:87:31 | [assertion failure, b (line 84): true] call to method Assert | semmle.label | false |
-| Assert.cs:87:22:87:30 | [b (line 84): true] ... != ... | Assert.cs:87:9:87:31 | [assertion success, b (line 84): true] call to method Assert | semmle.label | true |
-| Assert.cs:87:27:87:30 | [b (line 84): false] null | Assert.cs:87:22:87:30 | [b (line 84): false] ... != ... | semmle.label | successor |
-| Assert.cs:87:27:87:30 | [b (line 84): true] null | Assert.cs:87:22:87:30 | [b (line 84): true] ... != ... | semmle.label | successor |
-| Assert.cs:88:9:88:35 | [b (line 84): false] call to method WriteLine | Assert.cs:90:9:90:26 | [b (line 84): false] ...; | semmle.label | successor |
-| Assert.cs:88:9:88:35 | [b (line 84): true] call to method WriteLine | Assert.cs:90:9:90:26 | [b (line 84): true] ...; | semmle.label | successor |
-| Assert.cs:88:9:88:36 | [b (line 84): false] ...; | Assert.cs:88:27:88:27 | [b (line 84): false] access to local variable s | semmle.label | successor |
-| Assert.cs:88:9:88:36 | [b (line 84): true] ...; | Assert.cs:88:27:88:27 | [b (line 84): true] access to local variable s | semmle.label | successor |
-| Assert.cs:88:27:88:27 | [b (line 84): false] access to local variable s | Assert.cs:88:27:88:34 | [b (line 84): false] access to property Length | semmle.label | successor |
-| Assert.cs:88:27:88:27 | [b (line 84): true] access to local variable s | Assert.cs:88:27:88:34 | [b (line 84): true] access to property Length | semmle.label | successor |
-| Assert.cs:88:27:88:34 | [b (line 84): false] access to property Length | Assert.cs:88:9:88:35 | [b (line 84): false] call to method WriteLine | semmle.label | successor |
-| Assert.cs:88:27:88:34 | [b (line 84): true] access to property Length | Assert.cs:88:9:88:35 | [b (line 84): true] call to method WriteLine | semmle.label | successor |
-| Assert.cs:90:9:90:25 | [b (line 84): false] ... = ... | Assert.cs:91:9:91:25 | [b (line 84): false] ...; | semmle.label | successor |
-| Assert.cs:90:9:90:25 | [b (line 84): true] ... = ... | Assert.cs:91:9:91:25 | [b (line 84): true] ...; | semmle.label | successor |
-| Assert.cs:90:9:90:26 | [b (line 84): false] ...; | Assert.cs:90:13:90:13 | [b (line 84): false] access to parameter b | semmle.label | successor |
-| Assert.cs:90:9:90:26 | [b (line 84): true] ...; | Assert.cs:90:13:90:13 | [b (line 84): true] access to parameter b | semmle.label | successor |
-| Assert.cs:90:13:90:13 | [b (line 84): false] access to parameter b | Assert.cs:90:24:90:25 | [b (line 84): false] "" | semmle.label | false |
-| Assert.cs:90:13:90:13 | [b (line 84): true] access to parameter b | Assert.cs:90:17:90:20 | [b (line 84): true] null | semmle.label | true |
-| Assert.cs:90:13:90:25 | [b (line 84): false] ... ? ... : ... | Assert.cs:90:9:90:25 | [b (line 84): false] ... = ... | semmle.label | successor |
-| Assert.cs:90:13:90:25 | [b (line 84): true] ... ? ... : ... | Assert.cs:90:9:90:25 | [b (line 84): true] ... = ... | semmle.label | successor |
-| Assert.cs:90:17:90:20 | [b (line 84): true] null | Assert.cs:90:13:90:25 | [b (line 84): true] ... ? ... : ... | semmle.label | successor |
-| Assert.cs:90:24:90:25 | [b (line 84): false] "" | Assert.cs:90:13:90:25 | [b (line 84): false] ... ? ... : ... | semmle.label | successor |
-| Assert.cs:91:9:91:24 | [assertion failure, b (line 84): false] call to method IsNull | Assert.cs:84:10:84:12 | exit M12 (abnormal) | semmle.label | exception(AssertFailedException) |
-| Assert.cs:91:9:91:24 | [assertion failure, b (line 84): true] call to method IsNull | Assert.cs:84:10:84:12 | exit M12 (abnormal) | semmle.label | exception(AssertFailedException) |
-| Assert.cs:91:9:91:24 | [assertion success, b (line 84): false] call to method IsNull | Assert.cs:92:9:92:36 | [b (line 84): false] ...; | semmle.label | successor |
-| Assert.cs:91:9:91:24 | [assertion success, b (line 84): true] call to method IsNull | Assert.cs:92:9:92:36 | [b (line 84): true] ...; | semmle.label | successor |
-| Assert.cs:91:9:91:25 | [b (line 84): false] ...; | Assert.cs:91:23:91:23 | [b (line 84): false] access to local variable s | semmle.label | successor |
-| Assert.cs:91:9:91:25 | [b (line 84): true] ...; | Assert.cs:91:23:91:23 | [b (line 84): true] access to local variable s | semmle.label | successor |
-| Assert.cs:91:23:91:23 | [b (line 84): false] access to local variable s | Assert.cs:91:9:91:24 | [assertion failure, b (line 84): false] call to method IsNull | semmle.label | non-null |
-| Assert.cs:91:23:91:23 | [b (line 84): false] access to local variable s | Assert.cs:91:9:91:24 | [assertion success, b (line 84): false] call to method IsNull | semmle.label | null |
-| Assert.cs:91:23:91:23 | [b (line 84): true] access to local variable s | Assert.cs:91:9:91:24 | [assertion failure, b (line 84): true] call to method IsNull | semmle.label | non-null |
-| Assert.cs:91:23:91:23 | [b (line 84): true] access to local variable s | Assert.cs:91:9:91:24 | [assertion success, b (line 84): true] call to method IsNull | semmle.label | null |
-| Assert.cs:92:9:92:35 | [b (line 84): false] call to method WriteLine | Assert.cs:94:9:94:26 | [b (line 84): false] ...; | semmle.label | successor |
-| Assert.cs:92:9:92:35 | [b (line 84): true] call to method WriteLine | Assert.cs:94:9:94:26 | [b (line 84): true] ...; | semmle.label | successor |
-| Assert.cs:92:9:92:36 | [b (line 84): false] ...; | Assert.cs:92:27:92:27 | [b (line 84): false] access to local variable s | semmle.label | successor |
-| Assert.cs:92:9:92:36 | [b (line 84): true] ...; | Assert.cs:92:27:92:27 | [b (line 84): true] access to local variable s | semmle.label | successor |
-| Assert.cs:92:27:92:27 | [b (line 84): false] access to local variable s | Assert.cs:92:27:92:34 | [b (line 84): false] access to property Length | semmle.label | successor |
-| Assert.cs:92:27:92:27 | [b (line 84): true] access to local variable s | Assert.cs:92:27:92:34 | [b (line 84): true] access to property Length | semmle.label | successor |
-| Assert.cs:92:27:92:34 | [b (line 84): false] access to property Length | Assert.cs:92:9:92:35 | [b (line 84): false] call to method WriteLine | semmle.label | successor |
-| Assert.cs:92:27:92:34 | [b (line 84): true] access to property Length | Assert.cs:92:9:92:35 | [b (line 84): true] call to method WriteLine | semmle.label | successor |
-| Assert.cs:94:9:94:25 | [b (line 84): false] ... = ... | Assert.cs:95:9:95:28 | [b (line 84): false] ...; | semmle.label | successor |
-| Assert.cs:94:9:94:25 | [b (line 84): true] ... = ... | Assert.cs:95:9:95:28 | [b (line 84): true] ...; | semmle.label | successor |
-| Assert.cs:94:9:94:26 | [b (line 84): false] ...; | Assert.cs:94:13:94:13 | [b (line 84): false] access to parameter b | semmle.label | successor |
-| Assert.cs:94:9:94:26 | [b (line 84): true] ...; | Assert.cs:94:13:94:13 | [b (line 84): true] access to parameter b | semmle.label | successor |
-| Assert.cs:94:13:94:13 | [b (line 84): false] access to parameter b | Assert.cs:94:24:94:25 | [b (line 84): false] "" | semmle.label | false |
-| Assert.cs:94:13:94:13 | [b (line 84): true] access to parameter b | Assert.cs:94:17:94:20 | [b (line 84): true] null | semmle.label | true |
-| Assert.cs:94:13:94:25 | [b (line 84): false] ... ? ... : ... | Assert.cs:94:9:94:25 | [b (line 84): false] ... = ... | semmle.label | successor |
-| Assert.cs:94:13:94:25 | [b (line 84): true] ... ? ... : ... | Assert.cs:94:9:94:25 | [b (line 84): true] ... = ... | semmle.label | successor |
-| Assert.cs:94:17:94:20 | [b (line 84): true] null | Assert.cs:94:13:94:25 | [b (line 84): true] ... ? ... : ... | semmle.label | successor |
-| Assert.cs:94:24:94:25 | [b (line 84): false] "" | Assert.cs:94:13:94:25 | [b (line 84): false] ... ? ... : ... | semmle.label | successor |
-| Assert.cs:95:9:95:27 | [assertion failure, b (line 84): false] call to method IsNotNull | Assert.cs:84:10:84:12 | exit M12 (abnormal) | semmle.label | exception(AssertFailedException) |
-| Assert.cs:95:9:95:27 | [assertion failure, b (line 84): true] call to method IsNotNull | Assert.cs:84:10:84:12 | exit M12 (abnormal) | semmle.label | exception(AssertFailedException) |
-| Assert.cs:95:9:95:27 | [assertion success, b (line 84): false] call to method IsNotNull | Assert.cs:96:9:96:36 | [b (line 84): false] ...; | semmle.label | successor |
-| Assert.cs:95:9:95:27 | [assertion success, b (line 84): true] call to method IsNotNull | Assert.cs:96:9:96:36 | [b (line 84): true] ...; | semmle.label | successor |
-| Assert.cs:95:9:95:28 | [b (line 84): false] ...; | Assert.cs:95:26:95:26 | [b (line 84): false] access to local variable s | semmle.label | successor |
-| Assert.cs:95:9:95:28 | [b (line 84): true] ...; | Assert.cs:95:26:95:26 | [b (line 84): true] access to local variable s | semmle.label | successor |
-| Assert.cs:95:26:95:26 | [b (line 84): false] access to local variable s | Assert.cs:95:9:95:27 | [assertion failure, b (line 84): false] call to method IsNotNull | semmle.label | null |
-| Assert.cs:95:26:95:26 | [b (line 84): false] access to local variable s | Assert.cs:95:9:95:27 | [assertion success, b (line 84): false] call to method IsNotNull | semmle.label | non-null |
-| Assert.cs:95:26:95:26 | [b (line 84): true] access to local variable s | Assert.cs:95:9:95:27 | [assertion failure, b (line 84): true] call to method IsNotNull | semmle.label | null |
-| Assert.cs:95:26:95:26 | [b (line 84): true] access to local variable s | Assert.cs:95:9:95:27 | [assertion success, b (line 84): true] call to method IsNotNull | semmle.label | non-null |
-| Assert.cs:96:9:96:35 | [b (line 84): false] call to method WriteLine | Assert.cs:98:9:98:26 | [b (line 84): false] ...; | semmle.label | successor |
-| Assert.cs:96:9:96:35 | [b (line 84): true] call to method WriteLine | Assert.cs:98:9:98:26 | [b (line 84): true] ...; | semmle.label | successor |
-| Assert.cs:96:9:96:36 | [b (line 84): false] ...; | Assert.cs:96:27:96:27 | [b (line 84): false] access to local variable s | semmle.label | successor |
-| Assert.cs:96:9:96:36 | [b (line 84): true] ...; | Assert.cs:96:27:96:27 | [b (line 84): true] access to local variable s | semmle.label | successor |
-| Assert.cs:96:27:96:27 | [b (line 84): false] access to local variable s | Assert.cs:96:27:96:34 | [b (line 84): false] access to property Length | semmle.label | successor |
-| Assert.cs:96:27:96:27 | [b (line 84): true] access to local variable s | Assert.cs:96:27:96:34 | [b (line 84): true] access to property Length | semmle.label | successor |
-| Assert.cs:96:27:96:34 | [b (line 84): false] access to property Length | Assert.cs:96:9:96:35 | [b (line 84): false] call to method WriteLine | semmle.label | successor |
-| Assert.cs:96:27:96:34 | [b (line 84): true] access to property Length | Assert.cs:96:9:96:35 | [b (line 84): true] call to method WriteLine | semmle.label | successor |
-| Assert.cs:98:9:98:25 | [b (line 84): false] ... = ... | Assert.cs:99:9:99:33 | [b (line 84): false] ...; | semmle.label | successor |
-| Assert.cs:98:9:98:25 | [b (line 84): true] ... = ... | Assert.cs:99:9:99:33 | [b (line 84): true] ...; | semmle.label | successor |
-| Assert.cs:98:9:98:26 | [b (line 84): false] ...; | Assert.cs:98:13:98:13 | [b (line 84): false] access to parameter b | semmle.label | successor |
-| Assert.cs:98:9:98:26 | [b (line 84): true] ...; | Assert.cs:98:13:98:13 | [b (line 84): true] access to parameter b | semmle.label | successor |
-| Assert.cs:98:13:98:13 | [b (line 84): false] access to parameter b | Assert.cs:98:24:98:25 | [b (line 84): false] "" | semmle.label | false |
-| Assert.cs:98:13:98:13 | [b (line 84): true] access to parameter b | Assert.cs:98:17:98:20 | [b (line 84): true] null | semmle.label | true |
-| Assert.cs:98:13:98:25 | [b (line 84): false] ... ? ... : ... | Assert.cs:98:9:98:25 | [b (line 84): false] ... = ... | semmle.label | successor |
-| Assert.cs:98:13:98:25 | [b (line 84): true] ... ? ... : ... | Assert.cs:98:9:98:25 | [b (line 84): true] ... = ... | semmle.label | successor |
-| Assert.cs:98:17:98:20 | [b (line 84): true] null | Assert.cs:98:13:98:25 | [b (line 84): true] ... ? ... : ... | semmle.label | successor |
-| Assert.cs:98:24:98:25 | [b (line 84): false] "" | Assert.cs:98:13:98:25 | [b (line 84): false] ... ? ... : ... | semmle.label | successor |
-| Assert.cs:99:9:99:32 | [assertion failure, b (line 84): false] call to method IsTrue | Assert.cs:84:10:84:12 | exit M12 (abnormal) | semmle.label | exception(AssertFailedException) |
-| Assert.cs:99:9:99:32 | [assertion failure, b (line 84): true] call to method IsTrue | Assert.cs:84:10:84:12 | exit M12 (abnormal) | semmle.label | exception(AssertFailedException) |
-| Assert.cs:99:9:99:32 | [assertion success, b (line 84): false] call to method IsTrue | Assert.cs:100:9:100:36 | [b (line 84): false] ...; | semmle.label | successor |
-| Assert.cs:99:9:99:32 | [assertion success, b (line 84): true] call to method IsTrue | Assert.cs:100:9:100:36 | [b (line 84): true] ...; | semmle.label | successor |
-| Assert.cs:99:9:99:33 | [b (line 84): false] ...; | Assert.cs:99:23:99:23 | [b (line 84): false] access to local variable s | semmle.label | successor |
-| Assert.cs:99:9:99:33 | [b (line 84): true] ...; | Assert.cs:99:23:99:23 | [b (line 84): true] access to local variable s | semmle.label | successor |
-| Assert.cs:99:23:99:23 | [b (line 84): false] access to local variable s | Assert.cs:99:28:99:31 | [b (line 84): false] null | semmle.label | successor |
-| Assert.cs:99:23:99:23 | [b (line 84): true] access to local variable s | Assert.cs:99:28:99:31 | [b (line 84): true] null | semmle.label | successor |
-| Assert.cs:99:23:99:31 | [b (line 84): false] ... == ... | Assert.cs:99:9:99:32 | [assertion failure, b (line 84): false] call to method IsTrue | semmle.label | false |
-| Assert.cs:99:23:99:31 | [b (line 84): false] ... == ... | Assert.cs:99:9:99:32 | [assertion success, b (line 84): false] call to method IsTrue | semmle.label | true |
-| Assert.cs:99:23:99:31 | [b (line 84): true] ... == ... | Assert.cs:99:9:99:32 | [assertion failure, b (line 84): true] call to method IsTrue | semmle.label | false |
-| Assert.cs:99:23:99:31 | [b (line 84): true] ... == ... | Assert.cs:99:9:99:32 | [assertion success, b (line 84): true] call to method IsTrue | semmle.label | true |
-| Assert.cs:99:28:99:31 | [b (line 84): false] null | Assert.cs:99:23:99:31 | [b (line 84): false] ... == ... | semmle.label | successor |
-| Assert.cs:99:28:99:31 | [b (line 84): true] null | Assert.cs:99:23:99:31 | [b (line 84): true] ... == ... | semmle.label | successor |
-| Assert.cs:100:9:100:35 | [b (line 84): false] call to method WriteLine | Assert.cs:102:9:102:26 | [b (line 84): false] ...; | semmle.label | successor |
-| Assert.cs:100:9:100:35 | [b (line 84): true] call to method WriteLine | Assert.cs:102:9:102:26 | [b (line 84): true] ...; | semmle.label | successor |
-| Assert.cs:100:9:100:36 | [b (line 84): false] ...; | Assert.cs:100:27:100:27 | [b (line 84): false] access to local variable s | semmle.label | successor |
-| Assert.cs:100:9:100:36 | [b (line 84): true] ...; | Assert.cs:100:27:100:27 | [b (line 84): true] access to local variable s | semmle.label | successor |
-| Assert.cs:100:27:100:27 | [b (line 84): false] access to local variable s | Assert.cs:100:27:100:34 | [b (line 84): false] access to property Length | semmle.label | successor |
-| Assert.cs:100:27:100:27 | [b (line 84): true] access to local variable s | Assert.cs:100:27:100:34 | [b (line 84): true] access to property Length | semmle.label | successor |
-| Assert.cs:100:27:100:34 | [b (line 84): false] access to property Length | Assert.cs:100:9:100:35 | [b (line 84): false] call to method WriteLine | semmle.label | successor |
-| Assert.cs:100:27:100:34 | [b (line 84): true] access to property Length | Assert.cs:100:9:100:35 | [b (line 84): true] call to method WriteLine | semmle.label | successor |
-| Assert.cs:102:9:102:25 | [b (line 84): false] ... = ... | Assert.cs:103:9:103:33 | [b (line 84): false] ...; | semmle.label | successor |
-| Assert.cs:102:9:102:25 | [b (line 84): true] ... = ... | Assert.cs:103:9:103:33 | [b (line 84): true] ...; | semmle.label | successor |
-| Assert.cs:102:9:102:26 | [b (line 84): false] ...; | Assert.cs:102:13:102:13 | [b (line 84): false] access to parameter b | semmle.label | successor |
-| Assert.cs:102:9:102:26 | [b (line 84): true] ...; | Assert.cs:102:13:102:13 | [b (line 84): true] access to parameter b | semmle.label | successor |
-| Assert.cs:102:13:102:13 | [b (line 84): false] access to parameter b | Assert.cs:102:24:102:25 | [b (line 84): false] "" | semmle.label | false |
-| Assert.cs:102:13:102:13 | [b (line 84): true] access to parameter b | Assert.cs:102:17:102:20 | [b (line 84): true] null | semmle.label | true |
-| Assert.cs:102:13:102:25 | [b (line 84): false] ... ? ... : ... | Assert.cs:102:9:102:25 | [b (line 84): false] ... = ... | semmle.label | successor |
-| Assert.cs:102:13:102:25 | [b (line 84): true] ... ? ... : ... | Assert.cs:102:9:102:25 | [b (line 84): true] ... = ... | semmle.label | successor |
-| Assert.cs:102:17:102:20 | [b (line 84): true] null | Assert.cs:102:13:102:25 | [b (line 84): true] ... ? ... : ... | semmle.label | successor |
-| Assert.cs:102:24:102:25 | [b (line 84): false] "" | Assert.cs:102:13:102:25 | [b (line 84): false] ... ? ... : ... | semmle.label | successor |
-| Assert.cs:103:9:103:32 | [assertion failure, b (line 84): false] call to method IsTrue | Assert.cs:84:10:84:12 | exit M12 (abnormal) | semmle.label | exception(AssertFailedException) |
-| Assert.cs:103:9:103:32 | [assertion failure, b (line 84): true] call to method IsTrue | Assert.cs:84:10:84:12 | exit M12 (abnormal) | semmle.label | exception(AssertFailedException) |
-| Assert.cs:103:9:103:32 | [assertion success, b (line 84): false] call to method IsTrue | Assert.cs:104:9:104:36 | [b (line 84): false] ...; | semmle.label | successor |
-| Assert.cs:103:9:103:32 | [assertion success, b (line 84): true] call to method IsTrue | Assert.cs:104:9:104:36 | [b (line 84): true] ...; | semmle.label | successor |
-| Assert.cs:103:9:103:33 | [b (line 84): false] ...; | Assert.cs:103:23:103:23 | [b (line 84): false] access to local variable s | semmle.label | successor |
-| Assert.cs:103:9:103:33 | [b (line 84): true] ...; | Assert.cs:103:23:103:23 | [b (line 84): true] access to local variable s | semmle.label | successor |
-| Assert.cs:103:23:103:23 | [b (line 84): false] access to local variable s | Assert.cs:103:28:103:31 | [b (line 84): false] null | semmle.label | successor |
-| Assert.cs:103:23:103:23 | [b (line 84): true] access to local variable s | Assert.cs:103:28:103:31 | [b (line 84): true] null | semmle.label | successor |
-| Assert.cs:103:23:103:31 | [b (line 84): false] ... != ... | Assert.cs:103:9:103:32 | [assertion failure, b (line 84): false] call to method IsTrue | semmle.label | false |
-| Assert.cs:103:23:103:31 | [b (line 84): false] ... != ... | Assert.cs:103:9:103:32 | [assertion success, b (line 84): false] call to method IsTrue | semmle.label | true |
-| Assert.cs:103:23:103:31 | [b (line 84): true] ... != ... | Assert.cs:103:9:103:32 | [assertion failure, b (line 84): true] call to method IsTrue | semmle.label | false |
-| Assert.cs:103:23:103:31 | [b (line 84): true] ... != ... | Assert.cs:103:9:103:32 | [assertion success, b (line 84): true] call to method IsTrue | semmle.label | true |
-| Assert.cs:103:28:103:31 | [b (line 84): false] null | Assert.cs:103:23:103:31 | [b (line 84): false] ... != ... | semmle.label | successor |
-| Assert.cs:103:28:103:31 | [b (line 84): true] null | Assert.cs:103:23:103:31 | [b (line 84): true] ... != ... | semmle.label | successor |
-| Assert.cs:104:9:104:35 | [b (line 84): false] call to method WriteLine | Assert.cs:106:9:106:26 | [b (line 84): false] ...; | semmle.label | successor |
-| Assert.cs:104:9:104:35 | [b (line 84): true] call to method WriteLine | Assert.cs:106:9:106:26 | [b (line 84): true] ...; | semmle.label | successor |
-| Assert.cs:104:9:104:36 | [b (line 84): false] ...; | Assert.cs:104:27:104:27 | [b (line 84): false] access to local variable s | semmle.label | successor |
-| Assert.cs:104:9:104:36 | [b (line 84): true] ...; | Assert.cs:104:27:104:27 | [b (line 84): true] access to local variable s | semmle.label | successor |
-| Assert.cs:104:27:104:27 | [b (line 84): false] access to local variable s | Assert.cs:104:27:104:34 | [b (line 84): false] access to property Length | semmle.label | successor |
-| Assert.cs:104:27:104:27 | [b (line 84): true] access to local variable s | Assert.cs:104:27:104:34 | [b (line 84): true] access to property Length | semmle.label | successor |
-| Assert.cs:104:27:104:34 | [b (line 84): false] access to property Length | Assert.cs:104:9:104:35 | [b (line 84): false] call to method WriteLine | semmle.label | successor |
-| Assert.cs:104:27:104:34 | [b (line 84): true] access to property Length | Assert.cs:104:9:104:35 | [b (line 84): true] call to method WriteLine | semmle.label | successor |
-| Assert.cs:106:9:106:25 | [b (line 84): false] ... = ... | Assert.cs:107:9:107:34 | [b (line 84): false] ...; | semmle.label | successor |
-| Assert.cs:106:9:106:25 | [b (line 84): true] ... = ... | Assert.cs:107:9:107:34 | [b (line 84): true] ...; | semmle.label | successor |
-| Assert.cs:106:9:106:26 | [b (line 84): false] ...; | Assert.cs:106:13:106:13 | [b (line 84): false] access to parameter b | semmle.label | successor |
-| Assert.cs:106:9:106:26 | [b (line 84): true] ...; | Assert.cs:106:13:106:13 | [b (line 84): true] access to parameter b | semmle.label | successor |
-| Assert.cs:106:13:106:13 | [b (line 84): false] access to parameter b | Assert.cs:106:24:106:25 | [b (line 84): false] "" | semmle.label | false |
-| Assert.cs:106:13:106:13 | [b (line 84): true] access to parameter b | Assert.cs:106:17:106:20 | [b (line 84): true] null | semmle.label | true |
-| Assert.cs:106:13:106:25 | [b (line 84): false] ... ? ... : ... | Assert.cs:106:9:106:25 | [b (line 84): false] ... = ... | semmle.label | successor |
-| Assert.cs:106:13:106:25 | [b (line 84): true] ... ? ... : ... | Assert.cs:106:9:106:25 | [b (line 84): true] ... = ... | semmle.label | successor |
-| Assert.cs:106:17:106:20 | [b (line 84): true] null | Assert.cs:106:13:106:25 | [b (line 84): true] ... ? ... : ... | semmle.label | successor |
-| Assert.cs:106:24:106:25 | [b (line 84): false] "" | Assert.cs:106:13:106:25 | [b (line 84): false] ... ? ... : ... | semmle.label | successor |
-| Assert.cs:107:9:107:33 | [assertion failure, b (line 84): false] call to method IsFalse | Assert.cs:84:10:84:12 | exit M12 (abnormal) | semmle.label | exception(AssertFailedException) |
-| Assert.cs:107:9:107:33 | [assertion failure, b (line 84): true] call to method IsFalse | Assert.cs:84:10:84:12 | exit M12 (abnormal) | semmle.label | exception(AssertFailedException) |
-| Assert.cs:107:9:107:33 | [assertion success, b (line 84): false] call to method IsFalse | Assert.cs:108:9:108:36 | [b (line 84): false] ...; | semmle.label | successor |
-| Assert.cs:107:9:107:33 | [assertion success, b (line 84): true] call to method IsFalse | Assert.cs:108:9:108:36 | [b (line 84): true] ...; | semmle.label | successor |
-| Assert.cs:107:9:107:34 | [b (line 84): false] ...; | Assert.cs:107:24:107:24 | [b (line 84): false] access to local variable s | semmle.label | successor |
-| Assert.cs:107:9:107:34 | [b (line 84): true] ...; | Assert.cs:107:24:107:24 | [b (line 84): true] access to local variable s | semmle.label | successor |
-| Assert.cs:107:24:107:24 | [b (line 84): false] access to local variable s | Assert.cs:107:29:107:32 | [b (line 84): false] null | semmle.label | successor |
-| Assert.cs:107:24:107:24 | [b (line 84): true] access to local variable s | Assert.cs:107:29:107:32 | [b (line 84): true] null | semmle.label | successor |
-| Assert.cs:107:24:107:32 | [b (line 84): false] ... != ... | Assert.cs:107:9:107:33 | [assertion failure, b (line 84): false] call to method IsFalse | semmle.label | true |
-| Assert.cs:107:24:107:32 | [b (line 84): false] ... != ... | Assert.cs:107:9:107:33 | [assertion success, b (line 84): false] call to method IsFalse | semmle.label | false |
-| Assert.cs:107:24:107:32 | [b (line 84): true] ... != ... | Assert.cs:107:9:107:33 | [assertion failure, b (line 84): true] call to method IsFalse | semmle.label | true |
-| Assert.cs:107:24:107:32 | [b (line 84): true] ... != ... | Assert.cs:107:9:107:33 | [assertion success, b (line 84): true] call to method IsFalse | semmle.label | false |
-| Assert.cs:107:29:107:32 | [b (line 84): false] null | Assert.cs:107:24:107:32 | [b (line 84): false] ... != ... | semmle.label | successor |
-| Assert.cs:107:29:107:32 | [b (line 84): true] null | Assert.cs:107:24:107:32 | [b (line 84): true] ... != ... | semmle.label | successor |
-| Assert.cs:108:9:108:35 | [b (line 84): false] call to method WriteLine | Assert.cs:110:9:110:26 | [b (line 84): false] ...; | semmle.label | successor |
-| Assert.cs:108:9:108:35 | [b (line 84): true] call to method WriteLine | Assert.cs:110:9:110:26 | [b (line 84): true] ...; | semmle.label | successor |
-| Assert.cs:108:9:108:36 | [b (line 84): false] ...; | Assert.cs:108:27:108:27 | [b (line 84): false] access to local variable s | semmle.label | successor |
-| Assert.cs:108:9:108:36 | [b (line 84): true] ...; | Assert.cs:108:27:108:27 | [b (line 84): true] access to local variable s | semmle.label | successor |
-| Assert.cs:108:27:108:27 | [b (line 84): false] access to local variable s | Assert.cs:108:27:108:34 | [b (line 84): false] access to property Length | semmle.label | successor |
-| Assert.cs:108:27:108:27 | [b (line 84): true] access to local variable s | Assert.cs:108:27:108:34 | [b (line 84): true] access to property Length | semmle.label | successor |
-| Assert.cs:108:27:108:34 | [b (line 84): false] access to property Length | Assert.cs:108:9:108:35 | [b (line 84): false] call to method WriteLine | semmle.label | successor |
-| Assert.cs:108:27:108:34 | [b (line 84): true] access to property Length | Assert.cs:108:9:108:35 | [b (line 84): true] call to method WriteLine | semmle.label | successor |
-| Assert.cs:110:9:110:25 | [b (line 84): false] ... = ... | Assert.cs:111:9:111:34 | [b (line 84): false] ...; | semmle.label | successor |
-| Assert.cs:110:9:110:25 | [b (line 84): true] ... = ... | Assert.cs:111:9:111:34 | [b (line 84): true] ...; | semmle.label | successor |
-| Assert.cs:110:9:110:26 | [b (line 84): false] ...; | Assert.cs:110:13:110:13 | [b (line 84): false] access to parameter b | semmle.label | successor |
-| Assert.cs:110:9:110:26 | [b (line 84): true] ...; | Assert.cs:110:13:110:13 | [b (line 84): true] access to parameter b | semmle.label | successor |
-| Assert.cs:110:13:110:13 | [b (line 84): false] access to parameter b | Assert.cs:110:24:110:25 | [b (line 84): false] "" | semmle.label | false |
-| Assert.cs:110:13:110:13 | [b (line 84): true] access to parameter b | Assert.cs:110:17:110:20 | [b (line 84): true] null | semmle.label | true |
-| Assert.cs:110:13:110:25 | [b (line 84): false] ... ? ... : ... | Assert.cs:110:9:110:25 | [b (line 84): false] ... = ... | semmle.label | successor |
-| Assert.cs:110:13:110:25 | [b (line 84): true] ... ? ... : ... | Assert.cs:110:9:110:25 | [b (line 84): true] ... = ... | semmle.label | successor |
-| Assert.cs:110:17:110:20 | [b (line 84): true] null | Assert.cs:110:13:110:25 | [b (line 84): true] ... ? ... : ... | semmle.label | successor |
-| Assert.cs:110:24:110:25 | [b (line 84): false] "" | Assert.cs:110:13:110:25 | [b (line 84): false] ... ? ... : ... | semmle.label | successor |
-| Assert.cs:111:9:111:33 | [assertion failure, b (line 84): false] call to method IsFalse | Assert.cs:84:10:84:12 | exit M12 (abnormal) | semmle.label | exception(AssertFailedException) |
-| Assert.cs:111:9:111:33 | [assertion failure, b (line 84): true] call to method IsFalse | Assert.cs:84:10:84:12 | exit M12 (abnormal) | semmle.label | exception(AssertFailedException) |
-| Assert.cs:111:9:111:33 | [assertion success, b (line 84): false] call to method IsFalse | Assert.cs:112:9:112:36 | [b (line 84): false] ...; | semmle.label | successor |
-| Assert.cs:111:9:111:33 | [assertion success, b (line 84): true] call to method IsFalse | Assert.cs:112:9:112:36 | [b (line 84): true] ...; | semmle.label | successor |
-| Assert.cs:111:9:111:34 | [b (line 84): false] ...; | Assert.cs:111:24:111:24 | [b (line 84): false] access to local variable s | semmle.label | successor |
-| Assert.cs:111:9:111:34 | [b (line 84): true] ...; | Assert.cs:111:24:111:24 | [b (line 84): true] access to local variable s | semmle.label | successor |
-| Assert.cs:111:24:111:24 | [b (line 84): false] access to local variable s | Assert.cs:111:29:111:32 | [b (line 84): false] null | semmle.label | successor |
-| Assert.cs:111:24:111:24 | [b (line 84): true] access to local variable s | Assert.cs:111:29:111:32 | [b (line 84): true] null | semmle.label | successor |
-| Assert.cs:111:24:111:32 | [b (line 84): false] ... == ... | Assert.cs:111:9:111:33 | [assertion failure, b (line 84): false] call to method IsFalse | semmle.label | true |
-| Assert.cs:111:24:111:32 | [b (line 84): false] ... == ... | Assert.cs:111:9:111:33 | [assertion success, b (line 84): false] call to method IsFalse | semmle.label | false |
-| Assert.cs:111:24:111:32 | [b (line 84): true] ... == ... | Assert.cs:111:9:111:33 | [assertion failure, b (line 84): true] call to method IsFalse | semmle.label | true |
-| Assert.cs:111:24:111:32 | [b (line 84): true] ... == ... | Assert.cs:111:9:111:33 | [assertion success, b (line 84): true] call to method IsFalse | semmle.label | false |
-| Assert.cs:111:29:111:32 | [b (line 84): false] null | Assert.cs:111:24:111:32 | [b (line 84): false] ... == ... | semmle.label | successor |
-| Assert.cs:111:29:111:32 | [b (line 84): true] null | Assert.cs:111:24:111:32 | [b (line 84): true] ... == ... | semmle.label | successor |
-| Assert.cs:112:9:112:35 | [b (line 84): false] call to method WriteLine | Assert.cs:114:9:114:26 | [b (line 84): false] ...; | semmle.label | successor |
-| Assert.cs:112:9:112:35 | [b (line 84): true] call to method WriteLine | Assert.cs:114:9:114:26 | [b (line 84): true] ...; | semmle.label | successor |
-| Assert.cs:112:9:112:36 | [b (line 84): false] ...; | Assert.cs:112:27:112:27 | [b (line 84): false] access to local variable s | semmle.label | successor |
-| Assert.cs:112:9:112:36 | [b (line 84): true] ...; | Assert.cs:112:27:112:27 | [b (line 84): true] access to local variable s | semmle.label | successor |
-| Assert.cs:112:27:112:27 | [b (line 84): false] access to local variable s | Assert.cs:112:27:112:34 | [b (line 84): false] access to property Length | semmle.label | successor |
-| Assert.cs:112:27:112:27 | [b (line 84): true] access to local variable s | Assert.cs:112:27:112:34 | [b (line 84): true] access to property Length | semmle.label | successor |
-| Assert.cs:112:27:112:34 | [b (line 84): false] access to property Length | Assert.cs:112:9:112:35 | [b (line 84): false] call to method WriteLine | semmle.label | successor |
-| Assert.cs:112:27:112:34 | [b (line 84): true] access to property Length | Assert.cs:112:9:112:35 | [b (line 84): true] call to method WriteLine | semmle.label | successor |
-| Assert.cs:114:9:114:25 | [b (line 84): false] ... = ... | Assert.cs:115:9:115:38 | [b (line 84): false] ...; | semmle.label | successor |
-| Assert.cs:114:9:114:25 | [b (line 84): true] ... = ... | Assert.cs:115:9:115:38 | [b (line 84): true] ...; | semmle.label | successor |
-| Assert.cs:114:9:114:26 | [b (line 84): false] ...; | Assert.cs:114:13:114:13 | [b (line 84): false] access to parameter b | semmle.label | successor |
-| Assert.cs:114:9:114:26 | [b (line 84): true] ...; | Assert.cs:114:13:114:13 | [b (line 84): true] access to parameter b | semmle.label | successor |
-| Assert.cs:114:13:114:13 | [b (line 84): false] access to parameter b | Assert.cs:114:24:114:25 | [b (line 84): false] "" | semmle.label | false |
-| Assert.cs:114:13:114:13 | [b (line 84): true] access to parameter b | Assert.cs:114:17:114:20 | [b (line 84): true] null | semmle.label | true |
-| Assert.cs:114:13:114:25 | [b (line 84): false] ... ? ... : ... | Assert.cs:114:9:114:25 | [b (line 84): false] ... = ... | semmle.label | successor |
-| Assert.cs:114:13:114:25 | [b (line 84): true] ... ? ... : ... | Assert.cs:114:9:114:25 | [b (line 84): true] ... = ... | semmle.label | successor |
-| Assert.cs:114:17:114:20 | [b (line 84): true] null | Assert.cs:114:13:114:25 | [b (line 84): true] ... ? ... : ... | semmle.label | successor |
-| Assert.cs:114:24:114:25 | [b (line 84): false] "" | Assert.cs:114:13:114:25 | [b (line 84): false] ... ? ... : ... | semmle.label | successor |
-| Assert.cs:115:9:115:37 | [assertion failure, b (line 84): false] call to method IsTrue | Assert.cs:84:10:84:12 | exit M12 (abnormal) | semmle.label | exception(AssertFailedException) |
-| Assert.cs:115:9:115:37 | [assertion failure, b (line 84): true] call to method IsTrue | Assert.cs:84:10:84:12 | exit M12 (abnormal) | semmle.label | exception(AssertFailedException) |
-| Assert.cs:115:9:115:37 | [assertion success, b (line 84): true] call to method IsTrue | Assert.cs:116:9:116:36 | [b (line 84): true] ...; | semmle.label | successor |
-| Assert.cs:115:9:115:38 | [b (line 84): false] ...; | Assert.cs:115:23:115:23 | [b (line 84): false] access to local variable s | semmle.label | successor |
-| Assert.cs:115:9:115:38 | [b (line 84): true] ...; | Assert.cs:115:23:115:23 | [b (line 84): true] access to local variable s | semmle.label | successor |
-| Assert.cs:115:23:115:23 | [b (line 84): false] access to local variable s | Assert.cs:115:28:115:31 | [b (line 84): false] null | semmle.label | successor |
-| Assert.cs:115:23:115:23 | [b (line 84): true] access to local variable s | Assert.cs:115:28:115:31 | [b (line 84): true] null | semmle.label | successor |
-| Assert.cs:115:23:115:31 | [b (line 84): false] ... != ... | Assert.cs:115:23:115:36 | [false, b (line 84): false] ... && ... | semmle.label | false |
-| Assert.cs:115:23:115:31 | [b (line 84): false] ... != ... | Assert.cs:115:36:115:36 | [b (line 84): false] access to parameter b | semmle.label | true |
-| Assert.cs:115:23:115:31 | [b (line 84): true] ... != ... | Assert.cs:115:23:115:36 | [false, b (line 84): true] ... && ... | semmle.label | false |
-| Assert.cs:115:23:115:31 | [b (line 84): true] ... != ... | Assert.cs:115:36:115:36 | [b (line 84): true] access to parameter b | semmle.label | true |
-| Assert.cs:115:23:115:36 | [false, b (line 84): false] ... && ... | Assert.cs:115:9:115:37 | [assertion failure, b (line 84): false] call to method IsTrue | semmle.label | false |
-| Assert.cs:115:23:115:36 | [false, b (line 84): true] ... && ... | Assert.cs:115:9:115:37 | [assertion failure, b (line 84): true] call to method IsTrue | semmle.label | false |
-| Assert.cs:115:23:115:36 | [true, b (line 84): true] ... && ... | Assert.cs:115:9:115:37 | [assertion success, b (line 84): true] call to method IsTrue | semmle.label | true |
-| Assert.cs:115:28:115:31 | [b (line 84): false] null | Assert.cs:115:23:115:31 | [b (line 84): false] ... != ... | semmle.label | successor |
-| Assert.cs:115:28:115:31 | [b (line 84): true] null | Assert.cs:115:23:115:31 | [b (line 84): true] ... != ... | semmle.label | successor |
-| Assert.cs:115:36:115:36 | [b (line 84): false] access to parameter b | Assert.cs:115:23:115:36 | [false, b (line 84): false] ... && ... | semmle.label | false |
-| Assert.cs:115:36:115:36 | [b (line 84): true] access to parameter b | Assert.cs:115:23:115:36 | [true, b (line 84): true] ... && ... | semmle.label | true |
-| Assert.cs:116:9:116:35 | [b (line 84): true] call to method WriteLine | Assert.cs:118:9:118:26 | [b (line 84): true] ...; | semmle.label | successor |
-| Assert.cs:116:9:116:36 | [b (line 84): true] ...; | Assert.cs:116:27:116:27 | [b (line 84): true] access to local variable s | semmle.label | successor |
-| Assert.cs:116:27:116:27 | [b (line 84): true] access to local variable s | Assert.cs:116:27:116:34 | [b (line 84): true] access to property Length | semmle.label | successor |
-| Assert.cs:116:27:116:34 | [b (line 84): true] access to property Length | Assert.cs:116:9:116:35 | [b (line 84): true] call to method WriteLine | semmle.label | successor |
-| Assert.cs:118:9:118:25 | [b (line 84): true] ... = ... | Assert.cs:119:9:119:40 | [b (line 84): true] ...; | semmle.label | successor |
-| Assert.cs:118:9:118:26 | [b (line 84): true] ...; | Assert.cs:118:13:118:13 | [b (line 84): true] access to parameter b | semmle.label | successor |
-| Assert.cs:118:13:118:13 | [b (line 84): true] access to parameter b | Assert.cs:118:17:118:20 | [b (line 84): true] null | semmle.label | true |
-| Assert.cs:118:13:118:25 | [b (line 84): true] ... ? ... : ... | Assert.cs:118:9:118:25 | [b (line 84): true] ... = ... | semmle.label | successor |
-| Assert.cs:118:17:118:20 | [b (line 84): true] null | Assert.cs:118:13:118:25 | [b (line 84): true] ... ? ... : ... | semmle.label | successor |
-| Assert.cs:119:9:119:39 | [assertion failure, b (line 84): true] call to method IsFalse | Assert.cs:84:10:84:12 | exit M12 (abnormal) | semmle.label | exception(AssertFailedException) |
-| Assert.cs:119:9:119:39 | [assertion success, b (line 84): true] call to method IsFalse | Assert.cs:120:9:120:36 | [b (line 84): true] ...; | semmle.label | successor |
-| Assert.cs:119:9:119:40 | [b (line 84): true] ...; | Assert.cs:119:24:119:24 | [b (line 84): true] access to local variable s | semmle.label | successor |
-| Assert.cs:119:24:119:24 | [b (line 84): true] access to local variable s | Assert.cs:119:29:119:32 | [b (line 84): true] null | semmle.label | successor |
-| Assert.cs:119:24:119:32 | [b (line 84): true] ... == ... | Assert.cs:119:24:119:38 | [true, b (line 84): true] ... \|\| ... | semmle.label | true |
-| Assert.cs:119:24:119:32 | [b (line 84): true] ... == ... | Assert.cs:119:38:119:38 | [b (line 84): true] access to parameter b | semmle.label | false |
-| Assert.cs:119:24:119:38 | [false, b (line 84): true] ... \|\| ... | Assert.cs:119:9:119:39 | [assertion success, b (line 84): true] call to method IsFalse | semmle.label | false |
-| Assert.cs:119:24:119:38 | [true, b (line 84): true] ... \|\| ... | Assert.cs:119:9:119:39 | [assertion failure, b (line 84): true] call to method IsFalse | semmle.label | true |
-| Assert.cs:119:29:119:32 | [b (line 84): true] null | Assert.cs:119:24:119:32 | [b (line 84): true] ... == ... | semmle.label | successor |
-| Assert.cs:119:37:119:38 | [false, b (line 84): true] !... | Assert.cs:119:24:119:38 | [false, b (line 84): true] ... \|\| ... | semmle.label | false |
-| Assert.cs:119:38:119:38 | [b (line 84): true] access to parameter b | Assert.cs:119:37:119:38 | [false, b (line 84): true] !... | semmle.label | true |
-| Assert.cs:120:9:120:35 | [b (line 84): true] call to method WriteLine | Assert.cs:122:9:122:26 | [b (line 84): true] ...; | semmle.label | successor |
-| Assert.cs:120:9:120:36 | [b (line 84): true] ...; | Assert.cs:120:27:120:27 | [b (line 84): true] access to local variable s | semmle.label | successor |
-| Assert.cs:120:27:120:27 | [b (line 84): true] access to local variable s | Assert.cs:120:27:120:34 | [b (line 84): true] access to property Length | semmle.label | successor |
-| Assert.cs:120:27:120:34 | [b (line 84): true] access to property Length | Assert.cs:120:9:120:35 | [b (line 84): true] call to method WriteLine | semmle.label | successor |
-| Assert.cs:122:9:122:25 | [b (line 84): true] ... = ... | Assert.cs:123:9:123:38 | [b (line 84): true] ...; | semmle.label | successor |
-| Assert.cs:122:9:122:26 | [b (line 84): true] ...; | Assert.cs:122:13:122:13 | [b (line 84): true] access to parameter b | semmle.label | successor |
-| Assert.cs:122:13:122:13 | [b (line 84): true] access to parameter b | Assert.cs:122:17:122:20 | [b (line 84): true] null | semmle.label | true |
-| Assert.cs:122:13:122:25 | [b (line 84): true] ... ? ... : ... | Assert.cs:122:9:122:25 | [b (line 84): true] ... = ... | semmle.label | successor |
-| Assert.cs:122:17:122:20 | [b (line 84): true] null | Assert.cs:122:13:122:25 | [b (line 84): true] ... ? ... : ... | semmle.label | successor |
-| Assert.cs:123:9:123:37 | [assertion failure, b (line 84): true] call to method IsTrue | Assert.cs:84:10:84:12 | exit M12 (abnormal) | semmle.label | exception(AssertFailedException) |
-| Assert.cs:123:9:123:37 | [assertion success, b (line 84): true] call to method IsTrue | Assert.cs:124:9:124:36 | [b (line 84): true] ...; | semmle.label | successor |
-| Assert.cs:123:9:123:38 | [b (line 84): true] ...; | Assert.cs:123:23:123:23 | [b (line 84): true] access to local variable s | semmle.label | successor |
-| Assert.cs:123:23:123:23 | [b (line 84): true] access to local variable s | Assert.cs:123:28:123:31 | [b (line 84): true] null | semmle.label | successor |
-| Assert.cs:123:23:123:31 | [b (line 84): true] ... == ... | Assert.cs:123:23:123:36 | [false, b (line 84): true] ... && ... | semmle.label | false |
-| Assert.cs:123:23:123:31 | [b (line 84): true] ... == ... | Assert.cs:123:36:123:36 | [b (line 84): true] access to parameter b | semmle.label | true |
-| Assert.cs:123:23:123:36 | [false, b (line 84): true] ... && ... | Assert.cs:123:9:123:37 | [assertion failure, b (line 84): true] call to method IsTrue | semmle.label | false |
-| Assert.cs:123:23:123:36 | [true, b (line 84): true] ... && ... | Assert.cs:123:9:123:37 | [assertion success, b (line 84): true] call to method IsTrue | semmle.label | true |
-| Assert.cs:123:28:123:31 | [b (line 84): true] null | Assert.cs:123:23:123:31 | [b (line 84): true] ... == ... | semmle.label | successor |
-| Assert.cs:123:36:123:36 | [b (line 84): true] access to parameter b | Assert.cs:123:23:123:36 | [true, b (line 84): true] ... && ... | semmle.label | true |
-| Assert.cs:124:9:124:35 | [b (line 84): true] call to method WriteLine | Assert.cs:126:9:126:26 | [b (line 84): true] ...; | semmle.label | successor |
-| Assert.cs:124:9:124:36 | [b (line 84): true] ...; | Assert.cs:124:27:124:27 | [b (line 84): true] access to local variable s | semmle.label | successor |
-| Assert.cs:124:27:124:27 | [b (line 84): true] access to local variable s | Assert.cs:124:27:124:34 | [b (line 84): true] access to property Length | semmle.label | successor |
-| Assert.cs:124:27:124:34 | [b (line 84): true] access to property Length | Assert.cs:124:9:124:35 | [b (line 84): true] call to method WriteLine | semmle.label | successor |
-| Assert.cs:126:9:126:25 | [b (line 84): true] ... = ... | Assert.cs:127:9:127:40 | [b (line 84): true] ...; | semmle.label | successor |
-| Assert.cs:126:9:126:26 | [b (line 84): true] ...; | Assert.cs:126:13:126:13 | [b (line 84): true] access to parameter b | semmle.label | successor |
-| Assert.cs:126:13:126:13 | [b (line 84): true] access to parameter b | Assert.cs:126:17:126:20 | [b (line 84): true] null | semmle.label | true |
-| Assert.cs:126:13:126:25 | [b (line 84): true] ... ? ... : ... | Assert.cs:126:9:126:25 | [b (line 84): true] ... = ... | semmle.label | successor |
-| Assert.cs:126:17:126:20 | [b (line 84): true] null | Assert.cs:126:13:126:25 | [b (line 84): true] ... ? ... : ... | semmle.label | successor |
-| Assert.cs:127:9:127:39 | [assertion failure] call to method IsFalse | Assert.cs:84:10:84:12 | exit M12 (abnormal) | semmle.label | exception(AssertFailedException) |
-| Assert.cs:127:9:127:39 | [assertion success] call to method IsFalse | Assert.cs:128:9:128:36 | ...; | semmle.label | successor |
-| Assert.cs:127:9:127:40 | [b (line 84): true] ...; | Assert.cs:127:24:127:24 | [b (line 84): true] access to local variable s | semmle.label | successor |
-| Assert.cs:127:24:127:24 | [b (line 84): true] access to local variable s | Assert.cs:127:29:127:32 | [b (line 84): true] null | semmle.label | successor |
-| Assert.cs:127:24:127:32 | [b (line 84): true] ... != ... | Assert.cs:127:24:127:38 | [true] ... \|\| ... | semmle.label | true |
-| Assert.cs:127:24:127:32 | [b (line 84): true] ... != ... | Assert.cs:127:38:127:38 | [b (line 84): true] access to parameter b | semmle.label | false |
-| Assert.cs:127:24:127:38 | [false] ... \|\| ... | Assert.cs:127:9:127:39 | [assertion success] call to method IsFalse | semmle.label | false |
-| Assert.cs:127:24:127:38 | [true] ... \|\| ... | Assert.cs:127:9:127:39 | [assertion failure] call to method IsFalse | semmle.label | true |
-| Assert.cs:127:29:127:32 | [b (line 84): true] null | Assert.cs:127:24:127:32 | [b (line 84): true] ... != ... | semmle.label | successor |
-| Assert.cs:127:37:127:38 | [false] !... | Assert.cs:127:24:127:38 | [false] ... \|\| ... | semmle.label | false |
-| Assert.cs:127:38:127:38 | [b (line 84): true] access to parameter b | Assert.cs:127:37:127:38 | [false] !... | semmle.label | true |
-| Assert.cs:128:9:128:35 | call to method WriteLine | Assert.cs:84:10:84:12 | exit M12 (normal) | semmle.label | successor |
-| Assert.cs:128:9:128:36 | ...; | Assert.cs:128:27:128:27 | access to local variable s | semmle.label | successor |
-| Assert.cs:128:27:128:27 | access to local variable s | Assert.cs:128:27:128:34 | access to property Length | semmle.label | successor |
-| Assert.cs:128:27:128:34 | access to property Length | Assert.cs:128:9:128:35 | call to method WriteLine | semmle.label | successor |
-| Assert.cs:131:18:131:32 | enter AssertTrueFalse | Assert.cs:135:5:136:5 | {...} | semmle.label | successor |
-| Assert.cs:131:18:131:32 | exit AssertTrueFalse (normal) | Assert.cs:131:18:131:32 | exit AssertTrueFalse | semmle.label | successor |
-| Assert.cs:135:5:136:5 | {...} | Assert.cs:131:18:131:32 | exit AssertTrueFalse (normal) | semmle.label | successor |
-| Assert.cs:138:10:138:12 | enter M13 | Assert.cs:139:5:142:5 | {...} | semmle.label | successor |
-| Assert.cs:138:10:138:12 | exit M13 (abnormal) | Assert.cs:138:10:138:12 | exit M13 | semmle.label | successor |
-| Assert.cs:138:10:138:12 | exit M13 (normal) | Assert.cs:138:10:138:12 | exit M13 | semmle.label | successor |
-| Assert.cs:139:5:142:5 | {...} | Assert.cs:140:9:140:36 | ...; | semmle.label | successor |
-| Assert.cs:140:9:140:35 | [assertion failure] call to method AssertTrueFalse | Assert.cs:138:10:138:12 | exit M13 (abnormal) | semmle.label | exception(Exception) |
-| Assert.cs:140:9:140:35 | [assertion failure] call to method AssertTrueFalse | Assert.cs:138:10:138:12 | exit M13 (abnormal) | semmle.label | exception(Exception) |
-| Assert.cs:140:9:140:35 | [assertion success] call to method AssertTrueFalse | Assert.cs:141:9:141:15 | return ...; | semmle.label | successor |
-| Assert.cs:140:9:140:35 | this access | Assert.cs:140:25:140:26 | access to parameter b1 | semmle.label | successor |
-| Assert.cs:140:9:140:36 | ...; | Assert.cs:140:9:140:35 | this access | semmle.label | successor |
-| Assert.cs:140:25:140:26 | access to parameter b1 | Assert.cs:140:29:140:30 | [assertion failure] access to parameter b2 | semmle.label | false |
-| Assert.cs:140:25:140:26 | access to parameter b1 | Assert.cs:140:29:140:30 | access to parameter b2 | semmle.label | true |
-| Assert.cs:140:29:140:30 | [assertion failure] access to parameter b2 | Assert.cs:140:33:140:34 | [assertion failure] access to parameter b3 | semmle.label | false |
-| Assert.cs:140:29:140:30 | [assertion failure] access to parameter b2 | Assert.cs:140:33:140:34 | [assertion failure] access to parameter b3 | semmle.label | true |
-| Assert.cs:140:29:140:30 | access to parameter b2 | Assert.cs:140:33:140:34 | [assertion failure] access to parameter b3 | semmle.label | true |
-| Assert.cs:140:29:140:30 | access to parameter b2 | Assert.cs:140:33:140:34 | [assertion success] access to parameter b3 | semmle.label | false |
-| Assert.cs:140:33:140:34 | [assertion failure] access to parameter b3 | Assert.cs:140:9:140:35 | [assertion failure] call to method AssertTrueFalse | semmle.label | successor |
-| Assert.cs:140:33:140:34 | [assertion failure] access to parameter b3 | Assert.cs:140:9:140:35 | [assertion failure] call to method AssertTrueFalse | semmle.label | successor |
-| Assert.cs:140:33:140:34 | [assertion success] access to parameter b3 | Assert.cs:140:9:140:35 | [assertion success] call to method AssertTrueFalse | semmle.label | successor |
-| Assert.cs:141:9:141:15 | return ...; | Assert.cs:138:10:138:12 | exit M13 (normal) | semmle.label | return |
-| Assignments.cs:3:10:3:10 | enter M | Assignments.cs:4:5:15:5 | {...} | semmle.label | successor |
-| Assignments.cs:3:10:3:10 | exit M (normal) | Assignments.cs:3:10:3:10 | exit M | semmle.label | successor |
-| Assignments.cs:4:5:15:5 | {...} | Assignments.cs:5:9:5:18 | ... ...; | semmle.label | successor |
-| Assignments.cs:5:9:5:18 | ... ...; | Assignments.cs:5:17:5:17 | 0 | semmle.label | successor |
-| Assignments.cs:5:13:5:17 | Int32 x = ... | Assignments.cs:6:9:6:15 | ...; | semmle.label | successor |
-| Assignments.cs:5:17:5:17 | 0 | Assignments.cs:5:13:5:17 | Int32 x = ... | semmle.label | successor |
-| Assignments.cs:6:9:6:9 | access to local variable x | Assignments.cs:6:14:6:14 | 1 | semmle.label | successor |
-| Assignments.cs:6:9:6:14 | ... + ... | Assignments.cs:6:9:6:14 | ... = ... | semmle.label | successor |
-| Assignments.cs:6:9:6:14 | ... = ... | Assignments.cs:8:9:8:22 | ... ...; | semmle.label | successor |
-| Assignments.cs:6:9:6:15 | ...; | Assignments.cs:6:9:6:9 | access to local variable x | semmle.label | successor |
-| Assignments.cs:6:14:6:14 | 1 | Assignments.cs:6:9:6:14 | ... + ... | semmle.label | successor |
-| Assignments.cs:8:9:8:22 | ... ...; | Assignments.cs:8:21:8:21 | 0 | semmle.label | successor |
-| Assignments.cs:8:17:8:21 | dynamic d = ... | Assignments.cs:9:9:9:15 | ...; | semmle.label | successor |
-| Assignments.cs:8:21:8:21 | 0 | Assignments.cs:8:21:8:21 | (...) ... | semmle.label | successor |
-| Assignments.cs:8:21:8:21 | (...) ... | Assignments.cs:8:17:8:21 | dynamic d = ... | semmle.label | successor |
-| Assignments.cs:9:9:9:9 | access to local variable d | Assignments.cs:9:14:9:14 | 2 | semmle.label | successor |
-| Assignments.cs:9:9:9:14 | ... = ... | Assignments.cs:11:9:11:34 | ... ...; | semmle.label | successor |
-| Assignments.cs:9:9:9:14 | dynamic call to operator - | Assignments.cs:9:9:9:14 | ... = ... | semmle.label | successor |
-| Assignments.cs:9:9:9:15 | ...; | Assignments.cs:9:9:9:9 | access to local variable d | semmle.label | successor |
-| Assignments.cs:9:14:9:14 | 2 | Assignments.cs:9:9:9:14 | dynamic call to operator - | semmle.label | successor |
-| Assignments.cs:11:9:11:34 | ... ...; | Assignments.cs:11:17:11:33 | object creation of type Assignments | semmle.label | successor |
-| Assignments.cs:11:13:11:33 | Assignments a = ... | Assignments.cs:12:9:12:18 | ...; | semmle.label | successor |
-| Assignments.cs:11:17:11:33 | object creation of type Assignments | Assignments.cs:11:13:11:33 | Assignments a = ... | semmle.label | successor |
-| Assignments.cs:12:9:12:9 | access to local variable a | Assignments.cs:12:14:12:17 | this access | semmle.label | successor |
-| Assignments.cs:12:9:12:17 | ... = ... | Assignments.cs:14:9:14:36 | ...; | semmle.label | successor |
-| Assignments.cs:12:9:12:17 | call to operator + | Assignments.cs:12:9:12:17 | ... = ... | semmle.label | successor |
-| Assignments.cs:12:9:12:18 | ...; | Assignments.cs:12:9:12:9 | access to local variable a | semmle.label | successor |
-| Assignments.cs:12:14:12:17 | this access | Assignments.cs:12:9:12:17 | call to operator + | semmle.label | successor |
-| Assignments.cs:14:9:14:13 | access to event Event | Assignments.cs:14:9:14:35 | ... += ... | semmle.label | successor |
-| Assignments.cs:14:9:14:13 | this access | Assignments.cs:14:18:14:35 | (...) => ... | semmle.label | successor |
-| Assignments.cs:14:9:14:35 | ... += ... | Assignments.cs:3:10:3:10 | exit M (normal) | semmle.label | successor |
-| Assignments.cs:14:9:14:36 | ...; | Assignments.cs:14:9:14:13 | this access | semmle.label | successor |
-| Assignments.cs:14:18:14:35 | (...) => ... | Assignments.cs:14:9:14:13 | access to event Event | semmle.label | successor |
-| Assignments.cs:14:18:14:35 | enter (...) => ... | Assignments.cs:14:33:14:35 | {...} | semmle.label | successor |
-| Assignments.cs:14:18:14:35 | exit (...) => ... (normal) | Assignments.cs:14:18:14:35 | exit (...) => ... | semmle.label | successor |
-| Assignments.cs:14:33:14:35 | {...} | Assignments.cs:14:18:14:35 | exit (...) => ... (normal) | semmle.label | successor |
-| Assignments.cs:17:40:17:40 | enter + | Assignments.cs:18:5:20:5 | {...} | semmle.label | successor |
-| Assignments.cs:17:40:17:40 | exit + (normal) | Assignments.cs:17:40:17:40 | exit + | semmle.label | successor |
-| Assignments.cs:18:5:20:5 | {...} | Assignments.cs:19:16:19:16 | access to parameter x | semmle.label | successor |
-| Assignments.cs:19:9:19:17 | return ...; | Assignments.cs:17:40:17:40 | exit + (normal) | semmle.label | return |
-| Assignments.cs:19:16:19:16 | access to parameter x | Assignments.cs:19:9:19:17 | return ...; | semmle.label | successor |
-| BreakInTry.cs:3:10:3:11 | enter M1 | BreakInTry.cs:4:5:18:5 | {...} | semmle.label | successor |
-| BreakInTry.cs:3:10:3:11 | exit M1 (normal) | BreakInTry.cs:3:10:3:11 | exit M1 | semmle.label | successor |
-| BreakInTry.cs:4:5:18:5 | {...} | BreakInTry.cs:5:9:17:9 | try {...} ... | semmle.label | successor |
-| BreakInTry.cs:5:9:17:9 | try {...} ... | BreakInTry.cs:6:9:12:9 | {...} | semmle.label | successor |
-| BreakInTry.cs:6:9:12:9 | {...} | BreakInTry.cs:7:33:7:36 | access to parameter args | semmle.label | successor |
-| BreakInTry.cs:7:13:11:13 | foreach (... ... in ...) ... | BreakInTry.cs:7:26:7:28 | String arg | semmle.label | non-empty |
-| BreakInTry.cs:7:13:11:13 | foreach (... ... in ...) ... | BreakInTry.cs:14:9:17:9 | {...} | semmle.label | empty |
-| BreakInTry.cs:7:26:7:28 | String arg | BreakInTry.cs:8:13:11:13 | {...} | semmle.label | successor |
-| BreakInTry.cs:7:33:7:36 | access to parameter args | BreakInTry.cs:7:13:11:13 | foreach (... ... in ...) ... | semmle.label | successor |
-| BreakInTry.cs:8:13:11:13 | {...} | BreakInTry.cs:9:17:10:26 | if (...) ... | semmle.label | successor |
-| BreakInTry.cs:9:17:10:26 | if (...) ... | BreakInTry.cs:9:21:9:23 | access to local variable arg | semmle.label | successor |
-| BreakInTry.cs:9:21:9:23 | access to local variable arg | BreakInTry.cs:9:28:9:31 | null | semmle.label | successor |
-| BreakInTry.cs:9:21:9:31 | ... == ... | BreakInTry.cs:7:13:11:13 | foreach (... ... in ...) ... | semmle.label | false |
-| BreakInTry.cs:9:21:9:31 | ... == ... | BreakInTry.cs:10:21:10:26 | break; | semmle.label | true |
-| BreakInTry.cs:9:28:9:31 | null | BreakInTry.cs:9:21:9:31 | ... == ... | semmle.label | successor |
-| BreakInTry.cs:10:21:10:26 | break; | BreakInTry.cs:14:9:17:9 | {...} | semmle.label | break |
-| BreakInTry.cs:14:9:17:9 | {...} | BreakInTry.cs:15:13:16:17 | if (...) ... | semmle.label | successor |
-| BreakInTry.cs:15:13:16:17 | if (...) ... | BreakInTry.cs:15:17:15:20 | access to parameter args | semmle.label | successor |
-| BreakInTry.cs:15:17:15:20 | access to parameter args | BreakInTry.cs:15:25:15:28 | null | semmle.label | successor |
-| BreakInTry.cs:15:17:15:28 | ... == ... | BreakInTry.cs:3:10:3:11 | exit M1 (normal) | semmle.label | false |
-| BreakInTry.cs:15:17:15:28 | ... == ... | BreakInTry.cs:16:17:16:17 | ; | semmle.label | true |
-| BreakInTry.cs:15:25:15:28 | null | BreakInTry.cs:15:17:15:28 | ... == ... | semmle.label | successor |
-| BreakInTry.cs:16:17:16:17 | ; | BreakInTry.cs:3:10:3:11 | exit M1 (normal) | semmle.label | successor |
-| BreakInTry.cs:20:10:20:11 | enter M2 | BreakInTry.cs:21:5:36:5 | {...} | semmle.label | successor |
-| BreakInTry.cs:20:10:20:11 | exit M2 (normal) | BreakInTry.cs:20:10:20:11 | exit M2 | semmle.label | successor |
-| BreakInTry.cs:21:5:36:5 | {...} | BreakInTry.cs:22:29:22:32 | access to parameter args | semmle.label | successor |
-| BreakInTry.cs:22:9:34:9 | foreach (... ... in ...) ... | BreakInTry.cs:22:22:22:24 | String arg | semmle.label | non-empty |
-| BreakInTry.cs:22:9:34:9 | foreach (... ... in ...) ... | BreakInTry.cs:35:7:35:7 | ; | semmle.label | empty |
-| BreakInTry.cs:22:22:22:24 | String arg | BreakInTry.cs:23:9:34:9 | {...} | semmle.label | successor |
-| BreakInTry.cs:22:29:22:32 | access to parameter args | BreakInTry.cs:22:9:34:9 | foreach (... ... in ...) ... | semmle.label | successor |
-| BreakInTry.cs:23:9:34:9 | {...} | BreakInTry.cs:24:13:33:13 | try {...} ... | semmle.label | successor |
-| BreakInTry.cs:24:13:33:13 | try {...} ... | BreakInTry.cs:25:13:28:13 | {...} | semmle.label | successor |
-| BreakInTry.cs:25:13:28:13 | {...} | BreakInTry.cs:26:17:27:26 | if (...) ... | semmle.label | successor |
-| BreakInTry.cs:26:17:27:26 | if (...) ... | BreakInTry.cs:26:21:26:23 | access to local variable arg | semmle.label | successor |
-| BreakInTry.cs:26:21:26:23 | access to local variable arg | BreakInTry.cs:26:28:26:31 | null | semmle.label | successor |
-| BreakInTry.cs:26:21:26:31 | ... == ... | BreakInTry.cs:27:21:27:26 | break; | semmle.label | true |
-| BreakInTry.cs:26:21:26:31 | ... == ... | BreakInTry.cs:30:13:33:13 | {...} | semmle.label | false |
-| BreakInTry.cs:26:28:26:31 | null | BreakInTry.cs:26:21:26:31 | ... == ... | semmle.label | successor |
-| BreakInTry.cs:27:21:27:26 | break; | BreakInTry.cs:30:13:33:13 | [finally: break] {...} | semmle.label | break |
-| BreakInTry.cs:30:13:33:13 | [finally: break] {...} | BreakInTry.cs:31:17:32:21 | [finally: break] if (...) ... | semmle.label | successor |
-| BreakInTry.cs:30:13:33:13 | {...} | BreakInTry.cs:31:17:32:21 | if (...) ... | semmle.label | successor |
-| BreakInTry.cs:31:17:32:21 | [finally: break] if (...) ... | BreakInTry.cs:31:21:31:24 | [finally: break] access to parameter args | semmle.label | successor |
-| BreakInTry.cs:31:17:32:21 | if (...) ... | BreakInTry.cs:31:21:31:24 | access to parameter args | semmle.label | successor |
-| BreakInTry.cs:31:21:31:24 | [finally: break] access to parameter args | BreakInTry.cs:31:29:31:32 | [finally: break] null | semmle.label | successor |
-| BreakInTry.cs:31:21:31:24 | access to parameter args | BreakInTry.cs:31:29:31:32 | null | semmle.label | successor |
-| BreakInTry.cs:31:21:31:32 | ... == ... | BreakInTry.cs:22:9:34:9 | foreach (... ... in ...) ... | semmle.label | false |
-| BreakInTry.cs:31:21:31:32 | ... == ... | BreakInTry.cs:32:21:32:21 | ; | semmle.label | true |
-| BreakInTry.cs:31:21:31:32 | [finally: break] ... == ... | BreakInTry.cs:32:21:32:21 | [finally: break] ; | semmle.label | true |
-| BreakInTry.cs:31:21:31:32 | [finally: break] ... == ... | BreakInTry.cs:35:7:35:7 | ; | semmle.label | false |
-| BreakInTry.cs:31:29:31:32 | [finally: break] null | BreakInTry.cs:31:21:31:32 | [finally: break] ... == ... | semmle.label | successor |
-| BreakInTry.cs:31:29:31:32 | null | BreakInTry.cs:31:21:31:32 | ... == ... | semmle.label | successor |
-| BreakInTry.cs:32:21:32:21 | ; | BreakInTry.cs:22:9:34:9 | foreach (... ... in ...) ... | semmle.label | successor |
-| BreakInTry.cs:32:21:32:21 | [finally: break] ; | BreakInTry.cs:35:7:35:7 | ; | semmle.label | break |
-| BreakInTry.cs:35:7:35:7 | ; | BreakInTry.cs:20:10:20:11 | exit M2 (normal) | semmle.label | successor |
-| BreakInTry.cs:38:10:38:11 | enter M3 | BreakInTry.cs:39:5:54:5 | {...} | semmle.label | successor |
-| BreakInTry.cs:38:10:38:11 | exit M3 (normal) | BreakInTry.cs:38:10:38:11 | exit M3 | semmle.label | successor |
-| BreakInTry.cs:39:5:54:5 | {...} | BreakInTry.cs:40:9:52:9 | try {...} ... | semmle.label | successor |
-| BreakInTry.cs:40:9:52:9 | try {...} ... | BreakInTry.cs:41:9:44:9 | {...} | semmle.label | successor |
-| BreakInTry.cs:41:9:44:9 | {...} | BreakInTry.cs:42:13:43:23 | if (...) ... | semmle.label | successor |
-| BreakInTry.cs:42:13:43:23 | if (...) ... | BreakInTry.cs:42:17:42:20 | access to parameter args | semmle.label | successor |
-| BreakInTry.cs:42:17:42:20 | access to parameter args | BreakInTry.cs:42:25:42:28 | null | semmle.label | successor |
-| BreakInTry.cs:42:17:42:28 | ... == ... | BreakInTry.cs:43:17:43:23 | return ...; | semmle.label | true |
-| BreakInTry.cs:42:17:42:28 | ... == ... | BreakInTry.cs:46:9:52:9 | {...} | semmle.label | false |
-| BreakInTry.cs:42:25:42:28 | null | BreakInTry.cs:42:17:42:28 | ... == ... | semmle.label | successor |
-| BreakInTry.cs:43:17:43:23 | return ...; | BreakInTry.cs:46:9:52:9 | [finally: return] {...} | semmle.label | return |
-| BreakInTry.cs:46:9:52:9 | [finally: return] {...} | BreakInTry.cs:47:33:47:36 | [finally: return] access to parameter args | semmle.label | successor |
-| BreakInTry.cs:46:9:52:9 | {...} | BreakInTry.cs:47:33:47:36 | access to parameter args | semmle.label | successor |
-| BreakInTry.cs:47:13:51:13 | [finally: return] foreach (... ... in ...) ... | BreakInTry.cs:38:10:38:11 | exit M3 (normal) | semmle.label | return |
-| BreakInTry.cs:47:13:51:13 | [finally: return] foreach (... ... in ...) ... | BreakInTry.cs:47:26:47:28 | [finally: return] String arg | semmle.label | non-empty |
-| BreakInTry.cs:47:13:51:13 | foreach (... ... in ...) ... | BreakInTry.cs:47:26:47:28 | String arg | semmle.label | non-empty |
-| BreakInTry.cs:47:13:51:13 | foreach (... ... in ...) ... | BreakInTry.cs:53:7:53:7 | ; | semmle.label | empty |
-| BreakInTry.cs:47:26:47:28 | String arg | BreakInTry.cs:48:13:51:13 | {...} | semmle.label | successor |
-| BreakInTry.cs:47:26:47:28 | [finally: return] String arg | BreakInTry.cs:48:13:51:13 | [finally: return] {...} | semmle.label | successor |
-| BreakInTry.cs:47:33:47:36 | [finally: return] access to parameter args | BreakInTry.cs:47:13:51:13 | [finally: return] foreach (... ... in ...) ... | semmle.label | successor |
-| BreakInTry.cs:47:33:47:36 | access to parameter args | BreakInTry.cs:47:13:51:13 | foreach (... ... in ...) ... | semmle.label | successor |
-| BreakInTry.cs:48:13:51:13 | [finally: return] {...} | BreakInTry.cs:49:17:50:26 | [finally: return] if (...) ... | semmle.label | successor |
-| BreakInTry.cs:48:13:51:13 | {...} | BreakInTry.cs:49:17:50:26 | if (...) ... | semmle.label | successor |
-| BreakInTry.cs:49:17:50:26 | [finally: return] if (...) ... | BreakInTry.cs:49:21:49:23 | [finally: return] access to local variable arg | semmle.label | successor |
-| BreakInTry.cs:49:17:50:26 | if (...) ... | BreakInTry.cs:49:21:49:23 | access to local variable arg | semmle.label | successor |
-| BreakInTry.cs:49:21:49:23 | [finally: return] access to local variable arg | BreakInTry.cs:49:28:49:31 | [finally: return] null | semmle.label | successor |
-| BreakInTry.cs:49:21:49:23 | access to local variable arg | BreakInTry.cs:49:28:49:31 | null | semmle.label | successor |
-| BreakInTry.cs:49:21:49:31 | ... == ... | BreakInTry.cs:47:13:51:13 | foreach (... ... in ...) ... | semmle.label | false |
-| BreakInTry.cs:49:21:49:31 | ... == ... | BreakInTry.cs:50:21:50:26 | break; | semmle.label | true |
-| BreakInTry.cs:49:21:49:31 | [finally: return] ... == ... | BreakInTry.cs:47:13:51:13 | [finally: return] foreach (... ... in ...) ... | semmle.label | false |
-| BreakInTry.cs:49:21:49:31 | [finally: return] ... == ... | BreakInTry.cs:50:21:50:26 | [finally: return] break; | semmle.label | true |
-| BreakInTry.cs:49:28:49:31 | [finally: return] null | BreakInTry.cs:49:21:49:31 | [finally: return] ... == ... | semmle.label | successor |
-| BreakInTry.cs:49:28:49:31 | null | BreakInTry.cs:49:21:49:31 | ... == ... | semmle.label | successor |
-| BreakInTry.cs:50:21:50:26 | [finally: return] break; | BreakInTry.cs:38:10:38:11 | exit M3 (normal) | semmle.label | return |
-| BreakInTry.cs:50:21:50:26 | break; | BreakInTry.cs:53:7:53:7 | ; | semmle.label | break |
-| BreakInTry.cs:53:7:53:7 | ; | BreakInTry.cs:38:10:38:11 | exit M3 (normal) | semmle.label | successor |
-| BreakInTry.cs:56:10:56:11 | enter M4 | BreakInTry.cs:57:5:71:5 | {...} | semmle.label | successor |
-| BreakInTry.cs:56:10:56:11 | exit M4 (normal) | BreakInTry.cs:56:10:56:11 | exit M4 | semmle.label | successor |
-| BreakInTry.cs:57:5:71:5 | {...} | BreakInTry.cs:58:9:70:9 | try {...} ... | semmle.label | successor |
-| BreakInTry.cs:58:9:70:9 | try {...} ... | BreakInTry.cs:59:9:62:9 | {...} | semmle.label | successor |
-| BreakInTry.cs:59:9:62:9 | {...} | BreakInTry.cs:60:13:61:23 | if (...) ... | semmle.label | successor |
-| BreakInTry.cs:60:13:61:23 | if (...) ... | BreakInTry.cs:60:17:60:20 | access to parameter args | semmle.label | successor |
-| BreakInTry.cs:60:17:60:20 | access to parameter args | BreakInTry.cs:60:25:60:28 | null | semmle.label | successor |
-| BreakInTry.cs:60:17:60:28 | ... == ... | BreakInTry.cs:61:17:61:23 | return ...; | semmle.label | true |
-| BreakInTry.cs:60:17:60:28 | ... == ... | BreakInTry.cs:64:9:70:9 | {...} | semmle.label | false |
-| BreakInTry.cs:60:25:60:28 | null | BreakInTry.cs:60:17:60:28 | ... == ... | semmle.label | successor |
-| BreakInTry.cs:61:17:61:23 | return ...; | BreakInTry.cs:64:9:70:9 | [finally: return] {...} | semmle.label | return |
-| BreakInTry.cs:64:9:70:9 | [finally: return] {...} | BreakInTry.cs:65:33:65:36 | [finally: return] access to parameter args | semmle.label | successor |
-| BreakInTry.cs:64:9:70:9 | {...} | BreakInTry.cs:65:33:65:36 | access to parameter args | semmle.label | successor |
-| BreakInTry.cs:65:13:69:13 | [finally: return] foreach (... ... in ...) ... | BreakInTry.cs:56:10:56:11 | exit M4 (normal) | semmle.label | return |
-| BreakInTry.cs:65:13:69:13 | [finally: return] foreach (... ... in ...) ... | BreakInTry.cs:65:26:65:28 | [finally: return] String arg | semmle.label | non-empty |
-| BreakInTry.cs:65:13:69:13 | foreach (... ... in ...) ... | BreakInTry.cs:56:10:56:11 | exit M4 (normal) | semmle.label | empty |
-| BreakInTry.cs:65:13:69:13 | foreach (... ... in ...) ... | BreakInTry.cs:65:26:65:28 | String arg | semmle.label | non-empty |
-| BreakInTry.cs:65:26:65:28 | String arg | BreakInTry.cs:66:13:69:13 | {...} | semmle.label | successor |
-| BreakInTry.cs:65:26:65:28 | [finally: return] String arg | BreakInTry.cs:66:13:69:13 | [finally: return] {...} | semmle.label | successor |
-| BreakInTry.cs:65:33:65:36 | [finally: return] access to parameter args | BreakInTry.cs:65:13:69:13 | [finally: return] foreach (... ... in ...) ... | semmle.label | successor |
-| BreakInTry.cs:65:33:65:36 | access to parameter args | BreakInTry.cs:65:13:69:13 | foreach (... ... in ...) ... | semmle.label | successor |
-| BreakInTry.cs:66:13:69:13 | [finally: return] {...} | BreakInTry.cs:67:17:68:26 | [finally: return] if (...) ... | semmle.label | successor |
-| BreakInTry.cs:66:13:69:13 | {...} | BreakInTry.cs:67:17:68:26 | if (...) ... | semmle.label | successor |
-| BreakInTry.cs:67:17:68:26 | [finally: return] if (...) ... | BreakInTry.cs:67:21:67:23 | [finally: return] access to local variable arg | semmle.label | successor |
-| BreakInTry.cs:67:17:68:26 | if (...) ... | BreakInTry.cs:67:21:67:23 | access to local variable arg | semmle.label | successor |
-| BreakInTry.cs:67:21:67:23 | [finally: return] access to local variable arg | BreakInTry.cs:67:28:67:31 | [finally: return] null | semmle.label | successor |
-| BreakInTry.cs:67:21:67:23 | access to local variable arg | BreakInTry.cs:67:28:67:31 | null | semmle.label | successor |
-| BreakInTry.cs:67:21:67:31 | ... == ... | BreakInTry.cs:65:13:69:13 | foreach (... ... in ...) ... | semmle.label | false |
-| BreakInTry.cs:67:21:67:31 | ... == ... | BreakInTry.cs:68:21:68:26 | break; | semmle.label | true |
-| BreakInTry.cs:67:21:67:31 | [finally: return] ... == ... | BreakInTry.cs:65:13:69:13 | [finally: return] foreach (... ... in ...) ... | semmle.label | false |
-| BreakInTry.cs:67:21:67:31 | [finally: return] ... == ... | BreakInTry.cs:68:21:68:26 | [finally: return] break; | semmle.label | true |
-| BreakInTry.cs:67:28:67:31 | [finally: return] null | BreakInTry.cs:67:21:67:31 | [finally: return] ... == ... | semmle.label | successor |
-| BreakInTry.cs:67:28:67:31 | null | BreakInTry.cs:67:21:67:31 | ... == ... | semmle.label | successor |
-| BreakInTry.cs:68:21:68:26 | [finally: return] break; | BreakInTry.cs:56:10:56:11 | exit M4 (normal) | semmle.label | return |
-| BreakInTry.cs:68:21:68:26 | break; | BreakInTry.cs:56:10:56:11 | exit M4 (normal) | semmle.label | break |
-| CompileTimeOperators.cs:5:9:5:15 | enter Default | CompileTimeOperators.cs:6:5:8:5 | {...} | semmle.label | successor |
-| CompileTimeOperators.cs:5:9:5:15 | exit Default (normal) | CompileTimeOperators.cs:5:9:5:15 | exit Default | semmle.label | successor |
-| CompileTimeOperators.cs:6:5:8:5 | {...} | CompileTimeOperators.cs:7:16:7:27 | default(...) | semmle.label | successor |
-| CompileTimeOperators.cs:7:9:7:28 | return ...; | CompileTimeOperators.cs:5:9:5:15 | exit Default (normal) | semmle.label | return |
-| CompileTimeOperators.cs:7:16:7:27 | default(...) | CompileTimeOperators.cs:7:9:7:28 | return ...; | semmle.label | successor |
-| CompileTimeOperators.cs:10:9:10:14 | enter Sizeof | CompileTimeOperators.cs:11:5:13:5 | {...} | semmle.label | successor |
-| CompileTimeOperators.cs:10:9:10:14 | exit Sizeof (normal) | CompileTimeOperators.cs:10:9:10:14 | exit Sizeof | semmle.label | successor |
-| CompileTimeOperators.cs:11:5:13:5 | {...} | CompileTimeOperators.cs:12:16:12:26 | sizeof(..) | semmle.label | successor |
-| CompileTimeOperators.cs:12:9:12:27 | return ...; | CompileTimeOperators.cs:10:9:10:14 | exit Sizeof (normal) | semmle.label | return |
-| CompileTimeOperators.cs:12:16:12:26 | sizeof(..) | CompileTimeOperators.cs:12:9:12:27 | return ...; | semmle.label | successor |
-| CompileTimeOperators.cs:15:10:15:15 | enter Typeof | CompileTimeOperators.cs:16:5:18:5 | {...} | semmle.label | successor |
-| CompileTimeOperators.cs:15:10:15:15 | exit Typeof (normal) | CompileTimeOperators.cs:15:10:15:15 | exit Typeof | semmle.label | successor |
-| CompileTimeOperators.cs:16:5:18:5 | {...} | CompileTimeOperators.cs:17:16:17:26 | typeof(...) | semmle.label | successor |
-| CompileTimeOperators.cs:17:9:17:27 | return ...; | CompileTimeOperators.cs:15:10:15:15 | exit Typeof (normal) | semmle.label | return |
-| CompileTimeOperators.cs:17:16:17:26 | typeof(...) | CompileTimeOperators.cs:17:9:17:27 | return ...; | semmle.label | successor |
-| CompileTimeOperators.cs:20:12:20:17 | enter Nameof | CompileTimeOperators.cs:21:5:23:5 | {...} | semmle.label | successor |
-| CompileTimeOperators.cs:20:12:20:17 | exit Nameof (normal) | CompileTimeOperators.cs:20:12:20:17 | exit Nameof | semmle.label | successor |
-| CompileTimeOperators.cs:21:5:23:5 | {...} | CompileTimeOperators.cs:22:16:22:24 | nameof(...) | semmle.label | successor |
-| CompileTimeOperators.cs:22:9:22:25 | return ...; | CompileTimeOperators.cs:20:12:20:17 | exit Nameof (normal) | semmle.label | return |
-| CompileTimeOperators.cs:22:16:22:24 | nameof(...) | CompileTimeOperators.cs:22:9:22:25 | return ...; | semmle.label | successor |
-| CompileTimeOperators.cs:28:10:28:10 | enter M | CompileTimeOperators.cs:29:5:41:5 | {...} | semmle.label | successor |
-| CompileTimeOperators.cs:28:10:28:10 | exit M (normal) | CompileTimeOperators.cs:28:10:28:10 | exit M | semmle.label | successor |
-| CompileTimeOperators.cs:29:5:41:5 | {...} | CompileTimeOperators.cs:30:9:38:9 | try {...} ... | semmle.label | successor |
-| CompileTimeOperators.cs:30:9:38:9 | try {...} ... | CompileTimeOperators.cs:31:9:34:9 | {...} | semmle.label | successor |
-| CompileTimeOperators.cs:31:9:34:9 | {...} | CompileTimeOperators.cs:32:13:32:21 | goto ...; | semmle.label | successor |
-| CompileTimeOperators.cs:32:13:32:21 | goto ...; | CompileTimeOperators.cs:36:9:38:9 | [finally: goto(End)] {...} | semmle.label | goto(End) |
-| CompileTimeOperators.cs:36:9:38:9 | [finally: goto(End)] {...} | CompileTimeOperators.cs:37:13:37:41 | [finally: goto(End)] ...; | semmle.label | successor |
-| CompileTimeOperators.cs:37:13:37:40 | [finally: goto(End)] call to method WriteLine | CompileTimeOperators.cs:40:9:40:11 | End: | semmle.label | goto(End) |
-| CompileTimeOperators.cs:37:13:37:41 | [finally: goto(End)] ...; | CompileTimeOperators.cs:37:31:37:39 | [finally: goto(End)] "Finally" | semmle.label | successor |
-| CompileTimeOperators.cs:37:31:37:39 | [finally: goto(End)] "Finally" | CompileTimeOperators.cs:37:13:37:40 | [finally: goto(End)] call to method WriteLine | semmle.label | successor |
-| CompileTimeOperators.cs:40:9:40:11 | End: | CompileTimeOperators.cs:40:14:40:38 | ...; | semmle.label | successor |
-| CompileTimeOperators.cs:40:14:40:37 | call to method WriteLine | CompileTimeOperators.cs:28:10:28:10 | exit M (normal) | semmle.label | successor |
-| CompileTimeOperators.cs:40:14:40:38 | ...; | CompileTimeOperators.cs:40:32:40:36 | "End" | semmle.label | successor |
-| CompileTimeOperators.cs:40:32:40:36 | "End" | CompileTimeOperators.cs:40:14:40:37 | call to method WriteLine | semmle.label | successor |
-| ConditionalAccess.cs:3:12:3:13 | enter M1 | ConditionalAccess.cs:3:26:3:26 | access to parameter i | semmle.label | successor |
-| ConditionalAccess.cs:3:12:3:13 | exit M1 (normal) | ConditionalAccess.cs:3:12:3:13 | exit M1 | semmle.label | successor |
-| ConditionalAccess.cs:3:26:3:26 | access to parameter i | ConditionalAccess.cs:3:12:3:13 | exit M1 (normal) | semmle.label | null |
-| ConditionalAccess.cs:3:26:3:26 | access to parameter i | ConditionalAccess.cs:3:28:3:38 | call to method ToString | semmle.label | non-null |
-| ConditionalAccess.cs:3:28:3:38 | call to method ToString | ConditionalAccess.cs:3:12:3:13 | exit M1 (normal) | semmle.label | null |
-| ConditionalAccess.cs:3:28:3:38 | call to method ToString | ConditionalAccess.cs:3:40:3:49 | call to method ToLower | semmle.label | non-null |
-| ConditionalAccess.cs:3:40:3:49 | call to method ToLower | ConditionalAccess.cs:3:12:3:13 | exit M1 (normal) | semmle.label | successor |
-| ConditionalAccess.cs:5:10:5:11 | enter M2 | ConditionalAccess.cs:5:26:5:26 | access to parameter s | semmle.label | successor |
-| ConditionalAccess.cs:5:10:5:11 | exit M2 (normal) | ConditionalAccess.cs:5:10:5:11 | exit M2 | semmle.label | successor |
-| ConditionalAccess.cs:5:26:5:26 | access to parameter s | ConditionalAccess.cs:5:10:5:11 | exit M2 (normal) | semmle.label | null |
-| ConditionalAccess.cs:5:26:5:26 | access to parameter s | ConditionalAccess.cs:5:28:5:34 | access to property Length | semmle.label | non-null |
-| ConditionalAccess.cs:5:28:5:34 | access to property Length | ConditionalAccess.cs:5:10:5:11 | exit M2 (normal) | semmle.label | successor |
-| ConditionalAccess.cs:7:10:7:11 | enter M3 | ConditionalAccess.cs:7:39:7:40 | access to parameter s1 | semmle.label | successor |
-| ConditionalAccess.cs:7:10:7:11 | exit M3 (normal) | ConditionalAccess.cs:7:10:7:11 | exit M3 | semmle.label | successor |
-| ConditionalAccess.cs:7:39:7:40 | access to parameter s1 | ConditionalAccess.cs:7:39:7:46 | ... ?? ... | semmle.label | non-null |
-| ConditionalAccess.cs:7:39:7:40 | access to parameter s1 | ConditionalAccess.cs:7:45:7:46 | access to parameter s2 | semmle.label | null |
-| ConditionalAccess.cs:7:39:7:46 | ... ?? ... | ConditionalAccess.cs:7:10:7:11 | exit M3 (normal) | semmle.label | null |
-| ConditionalAccess.cs:7:39:7:46 | ... ?? ... | ConditionalAccess.cs:7:49:7:55 | access to property Length | semmle.label | non-null |
-| ConditionalAccess.cs:7:39:7:46 | [non-null] ... ?? ... | ConditionalAccess.cs:7:49:7:55 | access to property Length | semmle.label | non-null |
-| ConditionalAccess.cs:7:39:7:46 | [null] ... ?? ... | ConditionalAccess.cs:7:10:7:11 | exit M3 (normal) | semmle.label | null |
-| ConditionalAccess.cs:7:45:7:46 | access to parameter s2 | ConditionalAccess.cs:7:39:7:46 | [non-null] ... ?? ... | semmle.label | non-null |
-| ConditionalAccess.cs:7:45:7:46 | access to parameter s2 | ConditionalAccess.cs:7:39:7:46 | [null] ... ?? ... | semmle.label | null |
-| ConditionalAccess.cs:7:49:7:55 | access to property Length | ConditionalAccess.cs:7:10:7:11 | exit M3 (normal) | semmle.label | successor |
-| ConditionalAccess.cs:9:9:9:10 | enter M4 | ConditionalAccess.cs:9:25:9:25 | access to parameter s | semmle.label | successor |
-| ConditionalAccess.cs:9:9:9:10 | exit M4 (normal) | ConditionalAccess.cs:9:9:9:10 | exit M4 | semmle.label | successor |
-| ConditionalAccess.cs:9:25:9:25 | access to parameter s | ConditionalAccess.cs:9:27:9:33 | access to property Length | semmle.label | non-null |
-| ConditionalAccess.cs:9:25:9:25 | access to parameter s | ConditionalAccess.cs:9:38:9:38 | 0 | semmle.label | null |
-| ConditionalAccess.cs:9:25:9:38 | ... ?? ... | ConditionalAccess.cs:9:9:9:10 | exit M4 (normal) | semmle.label | successor |
-| ConditionalAccess.cs:9:27:9:33 | access to property Length | ConditionalAccess.cs:9:25:9:38 | ... ?? ... | semmle.label | non-null |
-| ConditionalAccess.cs:9:27:9:33 | access to property Length | ConditionalAccess.cs:9:38:9:38 | 0 | semmle.label | null |
-| ConditionalAccess.cs:9:38:9:38 | 0 | ConditionalAccess.cs:9:25:9:38 | ... ?? ... | semmle.label | successor |
-| ConditionalAccess.cs:11:9:11:10 | enter M5 | ConditionalAccess.cs:12:5:17:5 | {...} | semmle.label | successor |
-| ConditionalAccess.cs:11:9:11:10 | exit M5 (normal) | ConditionalAccess.cs:11:9:11:10 | exit M5 | semmle.label | successor |
-| ConditionalAccess.cs:12:5:17:5 | {...} | ConditionalAccess.cs:13:9:16:21 | if (...) ... | semmle.label | successor |
-| ConditionalAccess.cs:13:9:16:21 | if (...) ... | ConditionalAccess.cs:13:13:13:13 | access to parameter s | semmle.label | successor |
-| ConditionalAccess.cs:13:13:13:13 | access to parameter s | ConditionalAccess.cs:13:15:13:21 | access to property Length | semmle.label | non-null |
-| ConditionalAccess.cs:13:13:13:13 | access to parameter s | ConditionalAccess.cs:13:25:13:25 | 0 | semmle.label | null |
-| ConditionalAccess.cs:13:13:13:25 | ... > ... | ConditionalAccess.cs:14:20:14:20 | 0 | semmle.label | true |
-| ConditionalAccess.cs:13:13:13:25 | ... > ... | ConditionalAccess.cs:16:20:16:20 | 1 | semmle.label | false |
-| ConditionalAccess.cs:13:15:13:21 | access to property Length | ConditionalAccess.cs:13:25:13:25 | 0 | semmle.label | successor |
-| ConditionalAccess.cs:13:25:13:25 | 0 | ConditionalAccess.cs:13:25:13:25 | (...) ... | semmle.label | successor |
-| ConditionalAccess.cs:13:25:13:25 | (...) ... | ConditionalAccess.cs:13:13:13:25 | ... > ... | semmle.label | successor |
-| ConditionalAccess.cs:14:13:14:21 | return ...; | ConditionalAccess.cs:11:9:11:10 | exit M5 (normal) | semmle.label | return |
-| ConditionalAccess.cs:14:20:14:20 | 0 | ConditionalAccess.cs:14:13:14:21 | return ...; | semmle.label | successor |
-| ConditionalAccess.cs:16:13:16:21 | return ...; | ConditionalAccess.cs:11:9:11:10 | exit M5 (normal) | semmle.label | return |
-| ConditionalAccess.cs:16:20:16:20 | 1 | ConditionalAccess.cs:16:13:16:21 | return ...; | semmle.label | successor |
-| ConditionalAccess.cs:19:12:19:13 | enter M6 | ConditionalAccess.cs:19:40:19:41 | access to parameter s1 | semmle.label | successor |
-| ConditionalAccess.cs:19:12:19:13 | exit M6 (normal) | ConditionalAccess.cs:19:12:19:13 | exit M6 | semmle.label | successor |
-| ConditionalAccess.cs:19:40:19:41 | access to parameter s1 | ConditionalAccess.cs:19:12:19:13 | exit M6 (normal) | semmle.label | null |
-| ConditionalAccess.cs:19:40:19:41 | access to parameter s1 | ConditionalAccess.cs:19:58:19:59 | access to parameter s2 | semmle.label | non-null |
-| ConditionalAccess.cs:19:43:19:60 | call to method CommaJoinWith | ConditionalAccess.cs:19:12:19:13 | exit M6 (normal) | semmle.label | successor |
-| ConditionalAccess.cs:19:58:19:59 | access to parameter s2 | ConditionalAccess.cs:19:43:19:60 | call to method CommaJoinWith | semmle.label | successor |
-| ConditionalAccess.cs:21:10:21:11 | enter M7 | ConditionalAccess.cs:22:5:26:5 | {...} | semmle.label | successor |
-| ConditionalAccess.cs:21:10:21:11 | exit M7 (normal) | ConditionalAccess.cs:21:10:21:11 | exit M7 | semmle.label | successor |
-| ConditionalAccess.cs:22:5:26:5 | {...} | ConditionalAccess.cs:23:9:23:39 | ... ...; | semmle.label | successor |
-| ConditionalAccess.cs:23:9:23:39 | ... ...; | ConditionalAccess.cs:23:26:23:29 | null | semmle.label | successor |
-| ConditionalAccess.cs:23:13:23:38 | Nullable j = ... | ConditionalAccess.cs:24:9:24:38 | ... ...; | semmle.label | successor |
-| ConditionalAccess.cs:23:18:23:29 | (...) ... | ConditionalAccess.cs:23:13:23:38 | Nullable j = ... | semmle.label | null |
-| ConditionalAccess.cs:23:26:23:29 | null | ConditionalAccess.cs:23:18:23:29 | (...) ... | semmle.label | successor |
-| ConditionalAccess.cs:24:9:24:38 | ... ...; | ConditionalAccess.cs:24:24:24:24 | access to parameter i | semmle.label | successor |
-| ConditionalAccess.cs:24:13:24:37 | String s = ... | ConditionalAccess.cs:25:9:25:33 | ...; | semmle.label | successor |
-| ConditionalAccess.cs:24:18:24:24 | (...) ... | ConditionalAccess.cs:24:27:24:37 | call to method ToString | semmle.label | non-null |
-| ConditionalAccess.cs:24:24:24:24 | access to parameter i | ConditionalAccess.cs:24:18:24:24 | (...) ... | semmle.label | successor |
-| ConditionalAccess.cs:24:27:24:37 | call to method ToString | ConditionalAccess.cs:24:13:24:37 | String s = ... | semmle.label | successor |
-| ConditionalAccess.cs:25:9:25:32 | ... = ... | ConditionalAccess.cs:21:10:21:11 | exit M7 (normal) | semmle.label | successor |
-| ConditionalAccess.cs:25:9:25:33 | ...; | ConditionalAccess.cs:25:13:25:14 | "" | semmle.label | successor |
-| ConditionalAccess.cs:25:13:25:14 | "" | ConditionalAccess.cs:25:31:25:31 | access to local variable s | semmle.label | non-null |
-| ConditionalAccess.cs:25:16:25:32 | call to method CommaJoinWith | ConditionalAccess.cs:25:9:25:32 | ... = ... | semmle.label | successor |
-| ConditionalAccess.cs:25:31:25:31 | access to local variable s | ConditionalAccess.cs:25:16:25:32 | call to method CommaJoinWith | semmle.label | successor |
-| ConditionalAccess.cs:30:10:30:12 | enter Out | ConditionalAccess.cs:30:32:30:32 | 0 | semmle.label | successor |
-| ConditionalAccess.cs:30:10:30:12 | exit Out (normal) | ConditionalAccess.cs:30:10:30:12 | exit Out | semmle.label | successor |
-| ConditionalAccess.cs:30:28:30:32 | ... = ... | ConditionalAccess.cs:30:10:30:12 | exit Out (normal) | semmle.label | successor |
-| ConditionalAccess.cs:30:32:30:32 | 0 | ConditionalAccess.cs:30:28:30:32 | ... = ... | semmle.label | successor |
-| ConditionalAccess.cs:32:10:32:11 | enter M8 | ConditionalAccess.cs:33:5:36:5 | {...} | semmle.label | successor |
-| ConditionalAccess.cs:32:10:32:11 | exit M8 (normal) | ConditionalAccess.cs:32:10:32:11 | exit M8 | semmle.label | successor |
-| ConditionalAccess.cs:33:5:36:5 | {...} | ConditionalAccess.cs:34:9:34:14 | ...; | semmle.label | successor |
-| ConditionalAccess.cs:34:9:34:13 | ... = ... | ConditionalAccess.cs:35:9:35:25 | ...; | semmle.label | successor |
-| ConditionalAccess.cs:34:9:34:14 | ...; | ConditionalAccess.cs:34:13:34:13 | 0 | semmle.label | successor |
-| ConditionalAccess.cs:34:13:34:13 | 0 | ConditionalAccess.cs:34:9:34:13 | ... = ... | semmle.label | successor |
-| ConditionalAccess.cs:35:9:35:12 | access to property Prop | ConditionalAccess.cs:32:10:32:11 | exit M8 (normal) | semmle.label | null |
-| ConditionalAccess.cs:35:9:35:12 | access to property Prop | ConditionalAccess.cs:35:14:35:24 | call to method Out | semmle.label | non-null |
-| ConditionalAccess.cs:35:9:35:12 | this access | ConditionalAccess.cs:35:9:35:12 | access to property Prop | semmle.label | successor |
-| ConditionalAccess.cs:35:9:35:25 | ...; | ConditionalAccess.cs:35:9:35:12 | this access | semmle.label | successor |
-| ConditionalAccess.cs:35:14:35:24 | call to method Out | ConditionalAccess.cs:32:10:32:11 | exit M8 (normal) | semmle.label | successor |
-| ConditionalAccess.cs:41:26:41:38 | enter CommaJoinWith | ConditionalAccess.cs:41:70:41:71 | access to parameter s1 | semmle.label | successor |
-| ConditionalAccess.cs:41:26:41:38 | exit CommaJoinWith (normal) | ConditionalAccess.cs:41:26:41:38 | exit CommaJoinWith | semmle.label | successor |
-| ConditionalAccess.cs:41:70:41:71 | access to parameter s1 | ConditionalAccess.cs:41:75:41:78 | ", " | semmle.label | successor |
-| ConditionalAccess.cs:41:70:41:78 | ... + ... | ConditionalAccess.cs:41:82:41:83 | access to parameter s2 | semmle.label | successor |
-| ConditionalAccess.cs:41:70:41:83 | ... + ... | ConditionalAccess.cs:41:26:41:38 | exit CommaJoinWith (normal) | semmle.label | successor |
-| ConditionalAccess.cs:41:75:41:78 | ", " | ConditionalAccess.cs:41:70:41:78 | ... + ... | semmle.label | successor |
-| ConditionalAccess.cs:41:82:41:83 | access to parameter s2 | ConditionalAccess.cs:41:70:41:83 | ... + ... | semmle.label | successor |
-| Conditions.cs:3:10:3:19 | enter IncrOrDecr | Conditions.cs:4:5:9:5 | {...} | semmle.label | successor |
-| Conditions.cs:3:10:3:19 | exit IncrOrDecr (normal) | Conditions.cs:3:10:3:19 | exit IncrOrDecr | semmle.label | successor |
-| Conditions.cs:4:5:9:5 | {...} | Conditions.cs:5:9:6:16 | if (...) ... | semmle.label | successor |
-| Conditions.cs:5:9:6:16 | if (...) ... | Conditions.cs:5:13:5:15 | access to parameter inc | semmle.label | successor |
-| Conditions.cs:5:13:5:15 | access to parameter inc | Conditions.cs:6:13:6:16 | [inc (line 3): true] ...; | semmle.label | true |
-| Conditions.cs:5:13:5:15 | access to parameter inc | Conditions.cs:7:9:8:16 | [inc (line 3): false] if (...) ... | semmle.label | false |
-| Conditions.cs:6:13:6:13 | [inc (line 3): true] access to parameter x | Conditions.cs:6:13:6:15 | [inc (line 3): true] ...++ | semmle.label | successor |
-| Conditions.cs:6:13:6:15 | [inc (line 3): true] ...++ | Conditions.cs:7:9:8:16 | [inc (line 3): true] if (...) ... | semmle.label | successor |
-| Conditions.cs:6:13:6:16 | [inc (line 3): true] ...; | Conditions.cs:6:13:6:13 | [inc (line 3): true] access to parameter x | semmle.label | successor |
-| Conditions.cs:7:9:8:16 | [inc (line 3): false] if (...) ... | Conditions.cs:7:14:7:16 | [inc (line 3): false] access to parameter inc | semmle.label | successor |
-| Conditions.cs:7:9:8:16 | [inc (line 3): true] if (...) ... | Conditions.cs:7:14:7:16 | [inc (line 3): true] access to parameter inc | semmle.label | successor |
-| Conditions.cs:7:13:7:16 | [false] !... | Conditions.cs:3:10:3:19 | exit IncrOrDecr (normal) | semmle.label | false |
-| Conditions.cs:7:13:7:16 | [true] !... | Conditions.cs:8:13:8:16 | ...; | semmle.label | true |
-| Conditions.cs:7:14:7:16 | [inc (line 3): false] access to parameter inc | Conditions.cs:7:13:7:16 | [true] !... | semmle.label | false |
-| Conditions.cs:7:14:7:16 | [inc (line 3): true] access to parameter inc | Conditions.cs:7:13:7:16 | [false] !... | semmle.label | true |
-| Conditions.cs:8:13:8:13 | access to parameter x | Conditions.cs:8:13:8:15 | ...-- | semmle.label | successor |
-| Conditions.cs:8:13:8:15 | ...-- | Conditions.cs:3:10:3:19 | exit IncrOrDecr (normal) | semmle.label | successor |
-| Conditions.cs:8:13:8:16 | ...; | Conditions.cs:8:13:8:13 | access to parameter x | semmle.label | successor |
-| Conditions.cs:11:9:11:10 | enter M1 | Conditions.cs:12:5:20:5 | {...} | semmle.label | successor |
-| Conditions.cs:11:9:11:10 | exit M1 (normal) | Conditions.cs:11:9:11:10 | exit M1 | semmle.label | successor |
-| Conditions.cs:12:5:20:5 | {...} | Conditions.cs:13:9:13:18 | ... ...; | semmle.label | successor |
-| Conditions.cs:13:9:13:18 | ... ...; | Conditions.cs:13:17:13:17 | 0 | semmle.label | successor |
-| Conditions.cs:13:13:13:17 | Int32 x = ... | Conditions.cs:14:9:15:16 | if (...) ... | semmle.label | successor |
-| Conditions.cs:13:17:13:17 | 0 | Conditions.cs:13:13:13:17 | Int32 x = ... | semmle.label | successor |
-| Conditions.cs:14:9:15:16 | if (...) ... | Conditions.cs:14:13:14:13 | access to parameter b | semmle.label | successor |
-| Conditions.cs:14:13:14:13 | access to parameter b | Conditions.cs:15:13:15:16 | [b (line 11): true] ...; | semmle.label | true |
-| Conditions.cs:14:13:14:13 | access to parameter b | Conditions.cs:16:9:18:20 | [b (line 11): false] if (...) ... | semmle.label | false |
-| Conditions.cs:15:13:15:13 | [b (line 11): true] access to local variable x | Conditions.cs:15:13:15:15 | [b (line 11): true] ...++ | semmle.label | successor |
-| Conditions.cs:15:13:15:15 | [b (line 11): true] ...++ | Conditions.cs:16:9:18:20 | [b (line 11): true] if (...) ... | semmle.label | successor |
-| Conditions.cs:15:13:15:16 | [b (line 11): true] ...; | Conditions.cs:15:13:15:13 | [b (line 11): true] access to local variable x | semmle.label | successor |
-| Conditions.cs:16:9:18:20 | [b (line 11): false] if (...) ... | Conditions.cs:16:13:16:13 | [b (line 11): false] access to local variable x | semmle.label | successor |
-| Conditions.cs:16:9:18:20 | [b (line 11): true] if (...) ... | Conditions.cs:16:13:16:13 | [b (line 11): true] access to local variable x | semmle.label | successor |
-| Conditions.cs:16:13:16:13 | [b (line 11): false] access to local variable x | Conditions.cs:16:17:16:17 | [b (line 11): false] 0 | semmle.label | successor |
-| Conditions.cs:16:13:16:13 | [b (line 11): true] access to local variable x | Conditions.cs:16:17:16:17 | [b (line 11): true] 0 | semmle.label | successor |
-| Conditions.cs:16:13:16:17 | [b (line 11): false] ... > ... | Conditions.cs:17:13:18:20 | [b (line 11): false] if (...) ... | semmle.label | true |
-| Conditions.cs:16:13:16:17 | [b (line 11): false] ... > ... | Conditions.cs:19:16:19:16 | access to local variable x | semmle.label | false |
-| Conditions.cs:16:13:16:17 | [b (line 11): true] ... > ... | Conditions.cs:17:13:18:20 | [b (line 11): true] if (...) ... | semmle.label | true |
-| Conditions.cs:16:13:16:17 | [b (line 11): true] ... > ... | Conditions.cs:19:16:19:16 | access to local variable x | semmle.label | false |
-| Conditions.cs:16:17:16:17 | [b (line 11): false] 0 | Conditions.cs:16:13:16:17 | [b (line 11): false] ... > ... | semmle.label | successor |
-| Conditions.cs:16:17:16:17 | [b (line 11): true] 0 | Conditions.cs:16:13:16:17 | [b (line 11): true] ... > ... | semmle.label | successor |
-| Conditions.cs:17:13:18:20 | [b (line 11): false] if (...) ... | Conditions.cs:17:18:17:18 | [b (line 11): false] access to parameter b | semmle.label | successor |
-| Conditions.cs:17:13:18:20 | [b (line 11): true] if (...) ... | Conditions.cs:17:18:17:18 | [b (line 11): true] access to parameter b | semmle.label | successor |
-| Conditions.cs:17:17:17:18 | [false] !... | Conditions.cs:19:16:19:16 | access to local variable x | semmle.label | false |
-| Conditions.cs:17:17:17:18 | [true] !... | Conditions.cs:18:17:18:20 | ...; | semmle.label | true |
-| Conditions.cs:17:18:17:18 | [b (line 11): false] access to parameter b | Conditions.cs:17:17:17:18 | [true] !... | semmle.label | false |
-| Conditions.cs:17:18:17:18 | [b (line 11): true] access to parameter b | Conditions.cs:17:17:17:18 | [false] !... | semmle.label | true |
-| Conditions.cs:18:17:18:17 | access to local variable x | Conditions.cs:18:17:18:19 | ...-- | semmle.label | successor |
-| Conditions.cs:18:17:18:19 | ...-- | Conditions.cs:19:16:19:16 | access to local variable x | semmle.label | successor |
-| Conditions.cs:18:17:18:20 | ...; | Conditions.cs:18:17:18:17 | access to local variable x | semmle.label | successor |
-| Conditions.cs:19:9:19:17 | return ...; | Conditions.cs:11:9:11:10 | exit M1 (normal) | semmle.label | return |
-| Conditions.cs:19:16:19:16 | access to local variable x | Conditions.cs:19:9:19:17 | return ...; | semmle.label | successor |
-| Conditions.cs:22:9:22:10 | enter M2 | Conditions.cs:23:5:31:5 | {...} | semmle.label | successor |
-| Conditions.cs:22:9:22:10 | exit M2 (normal) | Conditions.cs:22:9:22:10 | exit M2 | semmle.label | successor |
-| Conditions.cs:23:5:31:5 | {...} | Conditions.cs:24:9:24:18 | ... ...; | semmle.label | successor |
-| Conditions.cs:24:9:24:18 | ... ...; | Conditions.cs:24:17:24:17 | 0 | semmle.label | successor |
-| Conditions.cs:24:13:24:17 | Int32 x = ... | Conditions.cs:25:9:27:20 | if (...) ... | semmle.label | successor |
-| Conditions.cs:24:17:24:17 | 0 | Conditions.cs:24:13:24:17 | Int32 x = ... | semmle.label | successor |
-| Conditions.cs:25:9:27:20 | if (...) ... | Conditions.cs:25:13:25:14 | access to parameter b1 | semmle.label | successor |
-| Conditions.cs:25:13:25:14 | access to parameter b1 | Conditions.cs:26:13:27:20 | if (...) ... | semmle.label | true |
-| Conditions.cs:25:13:25:14 | access to parameter b1 | Conditions.cs:28:9:29:16 | if (...) ... | semmle.label | false |
-| Conditions.cs:26:13:27:20 | if (...) ... | Conditions.cs:26:17:26:18 | access to parameter b2 | semmle.label | successor |
-| Conditions.cs:26:17:26:18 | access to parameter b2 | Conditions.cs:27:17:27:20 | [b2 (line 22): true] ...; | semmle.label | true |
-| Conditions.cs:26:17:26:18 | access to parameter b2 | Conditions.cs:28:9:29:16 | [b2 (line 22): false] if (...) ... | semmle.label | false |
-| Conditions.cs:27:17:27:17 | [b2 (line 22): true] access to local variable x | Conditions.cs:27:17:27:19 | [b2 (line 22): true] ...++ | semmle.label | successor |
-| Conditions.cs:27:17:27:19 | [b2 (line 22): true] ...++ | Conditions.cs:28:9:29:16 | [b2 (line 22): true] if (...) ... | semmle.label | successor |
-| Conditions.cs:27:17:27:20 | [b2 (line 22): true] ...; | Conditions.cs:27:17:27:17 | [b2 (line 22): true] access to local variable x | semmle.label | successor |
-| Conditions.cs:28:9:29:16 | [b2 (line 22): false] if (...) ... | Conditions.cs:28:13:28:14 | [b2 (line 22): false] access to parameter b2 | semmle.label | successor |
-| Conditions.cs:28:9:29:16 | [b2 (line 22): true] if (...) ... | Conditions.cs:28:13:28:14 | [b2 (line 22): true] access to parameter b2 | semmle.label | successor |
-| Conditions.cs:28:9:29:16 | if (...) ... | Conditions.cs:28:13:28:14 | access to parameter b2 | semmle.label | successor |
-| Conditions.cs:28:13:28:14 | [b2 (line 22): false] access to parameter b2 | Conditions.cs:30:16:30:16 | access to local variable x | semmle.label | false |
-| Conditions.cs:28:13:28:14 | [b2 (line 22): true] access to parameter b2 | Conditions.cs:29:13:29:16 | ...; | semmle.label | true |
-| Conditions.cs:28:13:28:14 | access to parameter b2 | Conditions.cs:29:13:29:16 | ...; | semmle.label | true |
-| Conditions.cs:28:13:28:14 | access to parameter b2 | Conditions.cs:30:16:30:16 | access to local variable x | semmle.label | false |
-| Conditions.cs:29:13:29:13 | access to local variable x | Conditions.cs:29:13:29:15 | ...++ | semmle.label | successor |
-| Conditions.cs:29:13:29:15 | ...++ | Conditions.cs:30:16:30:16 | access to local variable x | semmle.label | successor |
-| Conditions.cs:29:13:29:16 | ...; | Conditions.cs:29:13:29:13 | access to local variable x | semmle.label | successor |
-| Conditions.cs:30:9:30:17 | return ...; | Conditions.cs:22:9:22:10 | exit M2 (normal) | semmle.label | return |
-| Conditions.cs:30:16:30:16 | access to local variable x | Conditions.cs:30:9:30:17 | return ...; | semmle.label | successor |
-| Conditions.cs:33:9:33:10 | enter M3 | Conditions.cs:34:5:44:5 | {...} | semmle.label | successor |
-| Conditions.cs:33:9:33:10 | exit M3 (normal) | Conditions.cs:33:9:33:10 | exit M3 | semmle.label | successor |
-| Conditions.cs:34:5:44:5 | {...} | Conditions.cs:35:9:35:18 | ... ...; | semmle.label | successor |
-| Conditions.cs:35:9:35:18 | ... ...; | Conditions.cs:35:17:35:17 | 0 | semmle.label | successor |
-| Conditions.cs:35:13:35:17 | Int32 x = ... | Conditions.cs:36:9:36:23 | ... ...; | semmle.label | successor |
-| Conditions.cs:35:17:35:17 | 0 | Conditions.cs:35:13:35:17 | Int32 x = ... | semmle.label | successor |
-| Conditions.cs:36:9:36:23 | ... ...; | Conditions.cs:36:18:36:22 | false | semmle.label | successor |
-| Conditions.cs:36:13:36:22 | Boolean b2 = ... | Conditions.cs:37:9:38:20 | if (...) ... | semmle.label | successor |
-| Conditions.cs:36:18:36:22 | false | Conditions.cs:36:13:36:22 | Boolean b2 = ... | semmle.label | successor |
-| Conditions.cs:37:9:38:20 | if (...) ... | Conditions.cs:37:13:37:14 | access to parameter b1 | semmle.label | successor |
-| Conditions.cs:37:13:37:14 | access to parameter b1 | Conditions.cs:38:13:38:20 | ...; | semmle.label | true |
-| Conditions.cs:37:13:37:14 | access to parameter b1 | Conditions.cs:39:9:40:16 | if (...) ... | semmle.label | false |
-| Conditions.cs:38:13:38:19 | ... = ... | Conditions.cs:39:9:40:16 | if (...) ... | semmle.label | successor |
-| Conditions.cs:38:13:38:20 | ...; | Conditions.cs:38:18:38:19 | access to parameter b1 | semmle.label | successor |
-| Conditions.cs:38:18:38:19 | access to parameter b1 | Conditions.cs:38:13:38:19 | ... = ... | semmle.label | successor |
-| Conditions.cs:39:9:40:16 | if (...) ... | Conditions.cs:39:13:39:14 | access to local variable b2 | semmle.label | successor |
-| Conditions.cs:39:13:39:14 | access to local variable b2 | Conditions.cs:40:13:40:16 | [b2 (line 39): true] ...; | semmle.label | true |
-| Conditions.cs:39:13:39:14 | access to local variable b2 | Conditions.cs:41:9:42:16 | [b2 (line 39): false] if (...) ... | semmle.label | false |
-| Conditions.cs:40:13:40:13 | [b2 (line 39): true] access to local variable x | Conditions.cs:40:13:40:15 | [b2 (line 39): true] ...++ | semmle.label | successor |
-| Conditions.cs:40:13:40:15 | [b2 (line 39): true] ...++ | Conditions.cs:41:9:42:16 | [b2 (line 39): true] if (...) ... | semmle.label | successor |
-| Conditions.cs:40:13:40:16 | [b2 (line 39): true] ...; | Conditions.cs:40:13:40:13 | [b2 (line 39): true] access to local variable x | semmle.label | successor |
-| Conditions.cs:41:9:42:16 | [b2 (line 39): false] if (...) ... | Conditions.cs:41:13:41:14 | [b2 (line 39): false] access to local variable b2 | semmle.label | successor |
-| Conditions.cs:41:9:42:16 | [b2 (line 39): true] if (...) ... | Conditions.cs:41:13:41:14 | [b2 (line 39): true] access to local variable b2 | semmle.label | successor |
-| Conditions.cs:41:13:41:14 | [b2 (line 39): false] access to local variable b2 | Conditions.cs:43:16:43:16 | access to local variable x | semmle.label | false |
-| Conditions.cs:41:13:41:14 | [b2 (line 39): true] access to local variable b2 | Conditions.cs:42:13:42:16 | ...; | semmle.label | true |
-| Conditions.cs:42:13:42:13 | access to local variable x | Conditions.cs:42:13:42:15 | ...++ | semmle.label | successor |
-| Conditions.cs:42:13:42:15 | ...++ | Conditions.cs:43:16:43:16 | access to local variable x | semmle.label | successor |
-| Conditions.cs:42:13:42:16 | ...; | Conditions.cs:42:13:42:13 | access to local variable x | semmle.label | successor |
-| Conditions.cs:43:9:43:17 | return ...; | Conditions.cs:33:9:33:10 | exit M3 (normal) | semmle.label | return |
-| Conditions.cs:43:16:43:16 | access to local variable x | Conditions.cs:43:9:43:17 | return ...; | semmle.label | successor |
-| Conditions.cs:46:9:46:10 | enter M4 | Conditions.cs:47:5:55:5 | {...} | semmle.label | successor |
-| Conditions.cs:46:9:46:10 | exit M4 (normal) | Conditions.cs:46:9:46:10 | exit M4 | semmle.label | successor |
-| Conditions.cs:47:5:55:5 | {...} | Conditions.cs:48:9:48:18 | ... ...; | semmle.label | successor |
-| Conditions.cs:48:9:48:18 | ... ...; | Conditions.cs:48:17:48:17 | 0 | semmle.label | successor |
-| Conditions.cs:48:13:48:17 | Int32 y = ... | Conditions.cs:49:9:53:9 | while (...) ... | semmle.label | successor |
-| Conditions.cs:48:17:48:17 | 0 | Conditions.cs:48:13:48:17 | Int32 y = ... | semmle.label | successor |
-| Conditions.cs:49:9:53:9 | while (...) ... | Conditions.cs:49:16:49:16 | access to parameter x | semmle.label | successor |
-| Conditions.cs:49:16:49:16 | [b (line 46): false] access to parameter x | Conditions.cs:49:16:49:18 | [b (line 46): false] ...-- | semmle.label | successor |
-| Conditions.cs:49:16:49:16 | [b (line 46): true] access to parameter x | Conditions.cs:49:16:49:18 | [b (line 46): true] ...-- | semmle.label | successor |
-| Conditions.cs:49:16:49:16 | access to parameter x | Conditions.cs:49:16:49:18 | ...-- | semmle.label | successor |
-| Conditions.cs:49:16:49:18 | ...-- | Conditions.cs:49:22:49:22 | 0 | semmle.label | successor |
-| Conditions.cs:49:16:49:18 | [b (line 46): false] ...-- | Conditions.cs:49:22:49:22 | [b (line 46): false] 0 | semmle.label | successor |
-| Conditions.cs:49:16:49:18 | [b (line 46): true] ...-- | Conditions.cs:49:22:49:22 | [b (line 46): true] 0 | semmle.label | successor |
-| Conditions.cs:49:16:49:22 | ... > ... | Conditions.cs:50:9:53:9 | {...} | semmle.label | true |
-| Conditions.cs:49:16:49:22 | ... > ... | Conditions.cs:54:16:54:16 | access to local variable y | semmle.label | false |
-| Conditions.cs:49:16:49:22 | [b (line 46): false] ... > ... | Conditions.cs:50:9:53:9 | [b (line 46): false] {...} | semmle.label | true |
-| Conditions.cs:49:16:49:22 | [b (line 46): false] ... > ... | Conditions.cs:54:16:54:16 | access to local variable y | semmle.label | false |
-| Conditions.cs:49:16:49:22 | [b (line 46): true] ... > ... | Conditions.cs:50:9:53:9 | [b (line 46): true] {...} | semmle.label | true |
-| Conditions.cs:49:16:49:22 | [b (line 46): true] ... > ... | Conditions.cs:54:16:54:16 | access to local variable y | semmle.label | false |
-| Conditions.cs:49:22:49:22 | 0 | Conditions.cs:49:16:49:22 | ... > ... | semmle.label | successor |
-| Conditions.cs:49:22:49:22 | [b (line 46): false] 0 | Conditions.cs:49:16:49:22 | [b (line 46): false] ... > ... | semmle.label | successor |
-| Conditions.cs:49:22:49:22 | [b (line 46): true] 0 | Conditions.cs:49:16:49:22 | [b (line 46): true] ... > ... | semmle.label | successor |
-| Conditions.cs:50:9:53:9 | [b (line 46): false] {...} | Conditions.cs:51:13:52:20 | [b (line 46): false] if (...) ... | semmle.label | successor |
-| Conditions.cs:50:9:53:9 | [b (line 46): true] {...} | Conditions.cs:51:13:52:20 | [b (line 46): true] if (...) ... | semmle.label | successor |
-| Conditions.cs:50:9:53:9 | {...} | Conditions.cs:51:13:52:20 | if (...) ... | semmle.label | successor |
-| Conditions.cs:51:13:52:20 | [b (line 46): false] if (...) ... | Conditions.cs:51:17:51:17 | [b (line 46): false] access to parameter b | semmle.label | successor |
-| Conditions.cs:51:13:52:20 | [b (line 46): true] if (...) ... | Conditions.cs:51:17:51:17 | [b (line 46): true] access to parameter b | semmle.label | successor |
-| Conditions.cs:51:13:52:20 | if (...) ... | Conditions.cs:51:17:51:17 | access to parameter b | semmle.label | successor |
-| Conditions.cs:51:17:51:17 | [b (line 46): false] access to parameter b | Conditions.cs:49:16:49:16 | [b (line 46): false] access to parameter x | semmle.label | false |
-| Conditions.cs:51:17:51:17 | [b (line 46): true] access to parameter b | Conditions.cs:52:17:52:20 | [b (line 46): true] ...; | semmle.label | true |
-| Conditions.cs:51:17:51:17 | access to parameter b | Conditions.cs:49:16:49:16 | [b (line 46): false] access to parameter x | semmle.label | false |
-| Conditions.cs:51:17:51:17 | access to parameter b | Conditions.cs:52:17:52:20 | [b (line 46): true] ...; | semmle.label | true |
-| Conditions.cs:52:17:52:17 | [b (line 46): true] access to local variable y | Conditions.cs:52:17:52:19 | [b (line 46): true] ...++ | semmle.label | successor |
-| Conditions.cs:52:17:52:19 | [b (line 46): true] ...++ | Conditions.cs:49:16:49:16 | [b (line 46): true] access to parameter x | semmle.label | successor |
-| Conditions.cs:52:17:52:20 | [b (line 46): true] ...; | Conditions.cs:52:17:52:17 | [b (line 46): true] access to local variable y | semmle.label | successor |
-| Conditions.cs:54:9:54:17 | return ...; | Conditions.cs:46:9:46:10 | exit M4 (normal) | semmle.label | return |
-| Conditions.cs:54:16:54:16 | access to local variable y | Conditions.cs:54:9:54:17 | return ...; | semmle.label | successor |
-| Conditions.cs:57:9:57:10 | enter M5 | Conditions.cs:58:5:68:5 | {...} | semmle.label | successor |
-| Conditions.cs:57:9:57:10 | exit M5 (normal) | Conditions.cs:57:9:57:10 | exit M5 | semmle.label | successor |
-| Conditions.cs:58:5:68:5 | {...} | Conditions.cs:59:9:59:18 | ... ...; | semmle.label | successor |
-| Conditions.cs:59:9:59:18 | ... ...; | Conditions.cs:59:17:59:17 | 0 | semmle.label | successor |
-| Conditions.cs:59:13:59:17 | Int32 y = ... | Conditions.cs:60:9:64:9 | while (...) ... | semmle.label | successor |
-| Conditions.cs:59:17:59:17 | 0 | Conditions.cs:59:13:59:17 | Int32 y = ... | semmle.label | successor |
-| Conditions.cs:60:9:64:9 | while (...) ... | Conditions.cs:60:16:60:16 | access to parameter x | semmle.label | successor |
-| Conditions.cs:60:16:60:16 | [b (line 57): false] access to parameter x | Conditions.cs:60:16:60:18 | [b (line 57): false] ...-- | semmle.label | successor |
-| Conditions.cs:60:16:60:16 | [b (line 57): true] access to parameter x | Conditions.cs:60:16:60:18 | [b (line 57): true] ...-- | semmle.label | successor |
-| Conditions.cs:60:16:60:16 | access to parameter x | Conditions.cs:60:16:60:18 | ...-- | semmle.label | successor |
-| Conditions.cs:60:16:60:18 | ...-- | Conditions.cs:60:22:60:22 | 0 | semmle.label | successor |
-| Conditions.cs:60:16:60:18 | [b (line 57): false] ...-- | Conditions.cs:60:22:60:22 | [b (line 57): false] 0 | semmle.label | successor |
-| Conditions.cs:60:16:60:18 | [b (line 57): true] ...-- | Conditions.cs:60:22:60:22 | [b (line 57): true] 0 | semmle.label | successor |
-| Conditions.cs:60:16:60:22 | ... > ... | Conditions.cs:61:9:64:9 | {...} | semmle.label | true |
-| Conditions.cs:60:16:60:22 | ... > ... | Conditions.cs:65:9:66:16 | if (...) ... | semmle.label | false |
-| Conditions.cs:60:16:60:22 | [b (line 57): false] ... > ... | Conditions.cs:61:9:64:9 | [b (line 57): false] {...} | semmle.label | true |
-| Conditions.cs:60:16:60:22 | [b (line 57): false] ... > ... | Conditions.cs:65:9:66:16 | [b (line 57): false] if (...) ... | semmle.label | false |
-| Conditions.cs:60:16:60:22 | [b (line 57): true] ... > ... | Conditions.cs:61:9:64:9 | [b (line 57): true] {...} | semmle.label | true |
-| Conditions.cs:60:16:60:22 | [b (line 57): true] ... > ... | Conditions.cs:65:9:66:16 | [b (line 57): true] if (...) ... | semmle.label | false |
-| Conditions.cs:60:22:60:22 | 0 | Conditions.cs:60:16:60:22 | ... > ... | semmle.label | successor |
-| Conditions.cs:60:22:60:22 | [b (line 57): false] 0 | Conditions.cs:60:16:60:22 | [b (line 57): false] ... > ... | semmle.label | successor |
-| Conditions.cs:60:22:60:22 | [b (line 57): true] 0 | Conditions.cs:60:16:60:22 | [b (line 57): true] ... > ... | semmle.label | successor |
-| Conditions.cs:61:9:64:9 | [b (line 57): false] {...} | Conditions.cs:62:13:63:20 | [b (line 57): false] if (...) ... | semmle.label | successor |
-| Conditions.cs:61:9:64:9 | [b (line 57): true] {...} | Conditions.cs:62:13:63:20 | [b (line 57): true] if (...) ... | semmle.label | successor |
-| Conditions.cs:61:9:64:9 | {...} | Conditions.cs:62:13:63:20 | if (...) ... | semmle.label | successor |
-| Conditions.cs:62:13:63:20 | [b (line 57): false] if (...) ... | Conditions.cs:62:17:62:17 | [b (line 57): false] access to parameter b | semmle.label | successor |
-| Conditions.cs:62:13:63:20 | [b (line 57): true] if (...) ... | Conditions.cs:62:17:62:17 | [b (line 57): true] access to parameter b | semmle.label | successor |
-| Conditions.cs:62:13:63:20 | if (...) ... | Conditions.cs:62:17:62:17 | access to parameter b | semmle.label | successor |
-| Conditions.cs:62:17:62:17 | [b (line 57): false] access to parameter b | Conditions.cs:60:16:60:16 | [b (line 57): false] access to parameter x | semmle.label | false |
-| Conditions.cs:62:17:62:17 | [b (line 57): true] access to parameter b | Conditions.cs:63:17:63:20 | [b (line 57): true] ...; | semmle.label | true |
-| Conditions.cs:62:17:62:17 | access to parameter b | Conditions.cs:60:16:60:16 | [b (line 57): false] access to parameter x | semmle.label | false |
-| Conditions.cs:62:17:62:17 | access to parameter b | Conditions.cs:63:17:63:20 | [b (line 57): true] ...; | semmle.label | true |
-| Conditions.cs:63:17:63:17 | [b (line 57): true] access to local variable y | Conditions.cs:63:17:63:19 | [b (line 57): true] ...++ | semmle.label | successor |
-| Conditions.cs:63:17:63:19 | [b (line 57): true] ...++ | Conditions.cs:60:16:60:16 | [b (line 57): true] access to parameter x | semmle.label | successor |
-| Conditions.cs:63:17:63:20 | [b (line 57): true] ...; | Conditions.cs:63:17:63:17 | [b (line 57): true] access to local variable y | semmle.label | successor |
-| Conditions.cs:65:9:66:16 | [b (line 57): false] if (...) ... | Conditions.cs:65:13:65:13 | [b (line 57): false] access to parameter b | semmle.label | successor |
-| Conditions.cs:65:9:66:16 | [b (line 57): true] if (...) ... | Conditions.cs:65:13:65:13 | [b (line 57): true] access to parameter b | semmle.label | successor |
-| Conditions.cs:65:9:66:16 | if (...) ... | Conditions.cs:65:13:65:13 | access to parameter b | semmle.label | successor |
-| Conditions.cs:65:13:65:13 | [b (line 57): false] access to parameter b | Conditions.cs:67:16:67:16 | access to local variable y | semmle.label | false |
-| Conditions.cs:65:13:65:13 | [b (line 57): true] access to parameter b | Conditions.cs:66:13:66:16 | ...; | semmle.label | true |
-| Conditions.cs:65:13:65:13 | access to parameter b | Conditions.cs:66:13:66:16 | ...; | semmle.label | true |
-| Conditions.cs:65:13:65:13 | access to parameter b | Conditions.cs:67:16:67:16 | access to local variable y | semmle.label | false |
-| Conditions.cs:66:13:66:13 | access to local variable y | Conditions.cs:66:13:66:15 | ...++ | semmle.label | successor |
-| Conditions.cs:66:13:66:15 | ...++ | Conditions.cs:67:16:67:16 | access to local variable y | semmle.label | successor |
-| Conditions.cs:66:13:66:16 | ...; | Conditions.cs:66:13:66:13 | access to local variable y | semmle.label | successor |
-| Conditions.cs:67:9:67:17 | return ...; | Conditions.cs:57:9:57:10 | exit M5 (normal) | semmle.label | return |
-| Conditions.cs:67:16:67:16 | access to local variable y | Conditions.cs:67:9:67:17 | return ...; | semmle.label | successor |
-| Conditions.cs:70:9:70:10 | enter M6 | Conditions.cs:71:5:84:5 | {...} | semmle.label | successor |
-| Conditions.cs:70:9:70:10 | exit M6 (normal) | Conditions.cs:70:9:70:10 | exit M6 | semmle.label | successor |
-| Conditions.cs:71:5:84:5 | {...} | Conditions.cs:72:9:72:30 | ... ...; | semmle.label | successor |
-| Conditions.cs:72:9:72:30 | ... ...; | Conditions.cs:72:17:72:18 | access to parameter ss | semmle.label | successor |
-| Conditions.cs:72:13:72:29 | Boolean b = ... | Conditions.cs:73:9:73:18 | ... ...; | semmle.label | successor |
-| Conditions.cs:72:17:72:18 | access to parameter ss | Conditions.cs:72:17:72:25 | access to property Length | semmle.label | successor |
-| Conditions.cs:72:17:72:25 | access to property Length | Conditions.cs:72:29:72:29 | 0 | semmle.label | successor |
-| Conditions.cs:72:17:72:29 | ... > ... | Conditions.cs:72:13:72:29 | Boolean b = ... | semmle.label | successor |
-| Conditions.cs:72:29:72:29 | 0 | Conditions.cs:72:17:72:29 | ... > ... | semmle.label | successor |
-| Conditions.cs:73:9:73:18 | ... ...; | Conditions.cs:73:17:73:17 | 0 | semmle.label | successor |
-| Conditions.cs:73:13:73:17 | Int32 x = ... | Conditions.cs:74:27:74:28 | access to parameter ss | semmle.label | successor |
-| Conditions.cs:73:17:73:17 | 0 | Conditions.cs:73:13:73:17 | Int32 x = ... | semmle.label | successor |
-| Conditions.cs:74:9:80:9 | foreach (... ... in ...) ... | Conditions.cs:74:22:74:22 | String _ | semmle.label | non-empty |
-| Conditions.cs:74:9:80:9 | foreach (... ... in ...) ... | Conditions.cs:81:9:82:16 | if (...) ... | semmle.label | empty |
-| Conditions.cs:74:22:74:22 | String _ | Conditions.cs:75:9:80:9 | {...} | semmle.label | successor |
-| Conditions.cs:74:27:74:28 | access to parameter ss | Conditions.cs:74:9:80:9 | foreach (... ... in ...) ... | semmle.label | successor |
-| Conditions.cs:75:9:80:9 | {...} | Conditions.cs:76:13:77:20 | if (...) ... | semmle.label | successor |
-| Conditions.cs:76:13:77:20 | if (...) ... | Conditions.cs:76:17:76:17 | access to local variable b | semmle.label | successor |
-| Conditions.cs:76:17:76:17 | access to local variable b | Conditions.cs:77:17:77:20 | ...; | semmle.label | true |
-| Conditions.cs:76:17:76:17 | access to local variable b | Conditions.cs:78:13:79:26 | if (...) ... | semmle.label | false |
-| Conditions.cs:77:17:77:17 | access to local variable x | Conditions.cs:77:17:77:19 | ...++ | semmle.label | successor |
-| Conditions.cs:77:17:77:19 | ...++ | Conditions.cs:78:13:79:26 | if (...) ... | semmle.label | successor |
-| Conditions.cs:77:17:77:20 | ...; | Conditions.cs:77:17:77:17 | access to local variable x | semmle.label | successor |
-| Conditions.cs:78:13:79:26 | if (...) ... | Conditions.cs:78:17:78:17 | access to local variable x | semmle.label | successor |
-| Conditions.cs:78:17:78:17 | access to local variable x | Conditions.cs:78:21:78:21 | 0 | semmle.label | successor |
-| Conditions.cs:78:17:78:21 | ... > ... | Conditions.cs:74:9:80:9 | foreach (... ... in ...) ... | semmle.label | false |
-| Conditions.cs:78:17:78:21 | ... > ... | Conditions.cs:79:17:79:26 | ...; | semmle.label | true |
-| Conditions.cs:78:21:78:21 | 0 | Conditions.cs:78:17:78:21 | ... > ... | semmle.label | successor |
-| Conditions.cs:79:17:79:25 | ... = ... | Conditions.cs:74:9:80:9 | foreach (... ... in ...) ... | semmle.label | successor |
-| Conditions.cs:79:17:79:26 | ...; | Conditions.cs:79:21:79:25 | false | semmle.label | successor |
-| Conditions.cs:79:21:79:25 | false | Conditions.cs:79:17:79:25 | ... = ... | semmle.label | successor |
-| Conditions.cs:81:9:82:16 | if (...) ... | Conditions.cs:81:13:81:13 | access to local variable b | semmle.label | successor |
-| Conditions.cs:81:13:81:13 | access to local variable b | Conditions.cs:82:13:82:16 | ...; | semmle.label | true |
-| Conditions.cs:81:13:81:13 | access to local variable b | Conditions.cs:83:16:83:16 | access to local variable x | semmle.label | false |
-| Conditions.cs:82:13:82:13 | access to local variable x | Conditions.cs:82:13:82:15 | ...++ | semmle.label | successor |
-| Conditions.cs:82:13:82:15 | ...++ | Conditions.cs:83:16:83:16 | access to local variable x | semmle.label | successor |
-| Conditions.cs:82:13:82:16 | ...; | Conditions.cs:82:13:82:13 | access to local variable x | semmle.label | successor |
-| Conditions.cs:83:9:83:17 | return ...; | Conditions.cs:70:9:70:10 | exit M6 (normal) | semmle.label | return |
-| Conditions.cs:83:16:83:16 | access to local variable x | Conditions.cs:83:9:83:17 | return ...; | semmle.label | successor |
-| Conditions.cs:86:9:86:10 | enter M7 | Conditions.cs:87:5:100:5 | {...} | semmle.label | successor |
-| Conditions.cs:86:9:86:10 | exit M7 (normal) | Conditions.cs:86:9:86:10 | exit M7 | semmle.label | successor |
-| Conditions.cs:87:5:100:5 | {...} | Conditions.cs:88:9:88:30 | ... ...; | semmle.label | successor |
-| Conditions.cs:88:9:88:30 | ... ...; | Conditions.cs:88:17:88:18 | access to parameter ss | semmle.label | successor |
-| Conditions.cs:88:13:88:29 | Boolean b = ... | Conditions.cs:89:9:89:18 | ... ...; | semmle.label | successor |
-| Conditions.cs:88:17:88:18 | access to parameter ss | Conditions.cs:88:17:88:25 | access to property Length | semmle.label | successor |
-| Conditions.cs:88:17:88:25 | access to property Length | Conditions.cs:88:29:88:29 | 0 | semmle.label | successor |
-| Conditions.cs:88:17:88:29 | ... > ... | Conditions.cs:88:13:88:29 | Boolean b = ... | semmle.label | successor |
-| Conditions.cs:88:29:88:29 | 0 | Conditions.cs:88:17:88:29 | ... > ... | semmle.label | successor |
-| Conditions.cs:89:9:89:18 | ... ...; | Conditions.cs:89:17:89:17 | 0 | semmle.label | successor |
-| Conditions.cs:89:13:89:17 | Int32 x = ... | Conditions.cs:90:27:90:28 | access to parameter ss | semmle.label | successor |
-| Conditions.cs:89:17:89:17 | 0 | Conditions.cs:89:13:89:17 | Int32 x = ... | semmle.label | successor |
-| Conditions.cs:90:9:98:9 | foreach (... ... in ...) ... | Conditions.cs:90:22:90:22 | String _ | semmle.label | non-empty |
-| Conditions.cs:90:9:98:9 | foreach (... ... in ...) ... | Conditions.cs:99:16:99:16 | access to local variable x | semmle.label | empty |
-| Conditions.cs:90:22:90:22 | String _ | Conditions.cs:91:9:98:9 | {...} | semmle.label | successor |
-| Conditions.cs:90:27:90:28 | access to parameter ss | Conditions.cs:90:9:98:9 | foreach (... ... in ...) ... | semmle.label | successor |
-| Conditions.cs:91:9:98:9 | {...} | Conditions.cs:92:13:93:20 | if (...) ... | semmle.label | successor |
-| Conditions.cs:92:13:93:20 | if (...) ... | Conditions.cs:92:17:92:17 | access to local variable b | semmle.label | successor |
-| Conditions.cs:92:17:92:17 | access to local variable b | Conditions.cs:93:17:93:20 | ...; | semmle.label | true |
-| Conditions.cs:92:17:92:17 | access to local variable b | Conditions.cs:94:13:95:26 | if (...) ... | semmle.label | false |
-| Conditions.cs:93:17:93:17 | access to local variable x | Conditions.cs:93:17:93:19 | ...++ | semmle.label | successor |
-| Conditions.cs:93:17:93:19 | ...++ | Conditions.cs:94:13:95:26 | if (...) ... | semmle.label | successor |
-| Conditions.cs:93:17:93:20 | ...; | Conditions.cs:93:17:93:17 | access to local variable x | semmle.label | successor |
-| Conditions.cs:94:13:95:26 | if (...) ... | Conditions.cs:94:17:94:17 | access to local variable x | semmle.label | successor |
-| Conditions.cs:94:17:94:17 | access to local variable x | Conditions.cs:94:21:94:21 | 0 | semmle.label | successor |
-| Conditions.cs:94:17:94:21 | ... > ... | Conditions.cs:95:17:95:26 | ...; | semmle.label | true |
-| Conditions.cs:94:17:94:21 | ... > ... | Conditions.cs:96:13:97:20 | if (...) ... | semmle.label | false |
-| Conditions.cs:94:21:94:21 | 0 | Conditions.cs:94:17:94:21 | ... > ... | semmle.label | successor |
-| Conditions.cs:95:17:95:25 | ... = ... | Conditions.cs:96:13:97:20 | if (...) ... | semmle.label | successor |
-| Conditions.cs:95:17:95:26 | ...; | Conditions.cs:95:21:95:25 | false | semmle.label | successor |
-| Conditions.cs:95:21:95:25 | false | Conditions.cs:95:17:95:25 | ... = ... | semmle.label | successor |
-| Conditions.cs:96:13:97:20 | if (...) ... | Conditions.cs:96:17:96:17 | access to local variable b | semmle.label | successor |
-| Conditions.cs:96:17:96:17 | access to local variable b | Conditions.cs:90:9:98:9 | foreach (... ... in ...) ... | semmle.label | false |
-| Conditions.cs:96:17:96:17 | access to local variable b | Conditions.cs:97:17:97:20 | ...; | semmle.label | true |
-| Conditions.cs:97:17:97:17 | access to local variable x | Conditions.cs:97:17:97:19 | ...++ | semmle.label | successor |
-| Conditions.cs:97:17:97:19 | ...++ | Conditions.cs:90:9:98:9 | foreach (... ... in ...) ... | semmle.label | successor |
-| Conditions.cs:97:17:97:20 | ...; | Conditions.cs:97:17:97:17 | access to local variable x | semmle.label | successor |
-| Conditions.cs:99:9:99:17 | return ...; | Conditions.cs:86:9:86:10 | exit M7 (normal) | semmle.label | return |
-| Conditions.cs:99:16:99:16 | access to local variable x | Conditions.cs:99:9:99:17 | return ...; | semmle.label | successor |
-| Conditions.cs:102:12:102:13 | enter M8 | Conditions.cs:103:5:111:5 | {...} | semmle.label | successor |
-| Conditions.cs:102:12:102:13 | exit M8 (normal) | Conditions.cs:102:12:102:13 | exit M8 | semmle.label | successor |
-| Conditions.cs:103:5:111:5 | {...} | Conditions.cs:104:9:104:29 | ... ...; | semmle.label | successor |
-| Conditions.cs:104:9:104:29 | ... ...; | Conditions.cs:104:17:104:17 | access to parameter b | semmle.label | successor |
-| Conditions.cs:104:13:104:28 | String x = ... | Conditions.cs:105:9:106:20 | if (...) ... | semmle.label | successor |
-| Conditions.cs:104:17:104:17 | access to parameter b | Conditions.cs:104:17:104:28 | call to method ToString | semmle.label | successor |
-| Conditions.cs:104:17:104:28 | call to method ToString | Conditions.cs:104:13:104:28 | String x = ... | semmle.label | successor |
-| Conditions.cs:105:9:106:20 | if (...) ... | Conditions.cs:105:13:105:13 | access to parameter b | semmle.label | successor |
-| Conditions.cs:105:13:105:13 | access to parameter b | Conditions.cs:106:13:106:20 | [b (line 102): true] ...; | semmle.label | true |
-| Conditions.cs:105:13:105:13 | access to parameter b | Conditions.cs:107:9:109:24 | [b (line 102): false] if (...) ... | semmle.label | false |
-| Conditions.cs:106:13:106:13 | [b (line 102): true] access to local variable x | Conditions.cs:106:18:106:19 | [b (line 102): true] "" | semmle.label | successor |
-| Conditions.cs:106:13:106:19 | [b (line 102): true] ... + ... | Conditions.cs:106:13:106:19 | [b (line 102): true] ... = ... | semmle.label | successor |
-| Conditions.cs:106:13:106:19 | [b (line 102): true] ... = ... | Conditions.cs:107:9:109:24 | [b (line 102): true] if (...) ... | semmle.label | successor |
-| Conditions.cs:106:13:106:20 | [b (line 102): true] ...; | Conditions.cs:106:13:106:13 | [b (line 102): true] access to local variable x | semmle.label | successor |
-| Conditions.cs:106:18:106:19 | [b (line 102): true] "" | Conditions.cs:106:13:106:19 | [b (line 102): true] ... + ... | semmle.label | successor |
-| Conditions.cs:107:9:109:24 | [b (line 102): false] if (...) ... | Conditions.cs:107:13:107:13 | [b (line 102): false] access to local variable x | semmle.label | successor |
-| Conditions.cs:107:9:109:24 | [b (line 102): true] if (...) ... | Conditions.cs:107:13:107:13 | [b (line 102): true] access to local variable x | semmle.label | successor |
-| Conditions.cs:107:13:107:13 | [b (line 102): false] access to local variable x | Conditions.cs:107:13:107:20 | [b (line 102): false] access to property Length | semmle.label | successor |
-| Conditions.cs:107:13:107:13 | [b (line 102): true] access to local variable x | Conditions.cs:107:13:107:20 | [b (line 102): true] access to property Length | semmle.label | successor |
-| Conditions.cs:107:13:107:20 | [b (line 102): false] access to property Length | Conditions.cs:107:24:107:24 | [b (line 102): false] 0 | semmle.label | successor |
-| Conditions.cs:107:13:107:20 | [b (line 102): true] access to property Length | Conditions.cs:107:24:107:24 | [b (line 102): true] 0 | semmle.label | successor |
-| Conditions.cs:107:13:107:24 | [b (line 102): false] ... > ... | Conditions.cs:108:13:109:24 | [b (line 102): false] if (...) ... | semmle.label | true |
-| Conditions.cs:107:13:107:24 | [b (line 102): false] ... > ... | Conditions.cs:110:16:110:16 | access to local variable x | semmle.label | false |
-| Conditions.cs:107:13:107:24 | [b (line 102): true] ... > ... | Conditions.cs:108:13:109:24 | [b (line 102): true] if (...) ... | semmle.label | true |
-| Conditions.cs:107:13:107:24 | [b (line 102): true] ... > ... | Conditions.cs:110:16:110:16 | access to local variable x | semmle.label | false |
-| Conditions.cs:107:24:107:24 | [b (line 102): false] 0 | Conditions.cs:107:13:107:24 | [b (line 102): false] ... > ... | semmle.label | successor |
-| Conditions.cs:107:24:107:24 | [b (line 102): true] 0 | Conditions.cs:107:13:107:24 | [b (line 102): true] ... > ... | semmle.label | successor |
-| Conditions.cs:108:13:109:24 | [b (line 102): false] if (...) ... | Conditions.cs:108:18:108:18 | [b (line 102): false] access to parameter b | semmle.label | successor |
-| Conditions.cs:108:13:109:24 | [b (line 102): true] if (...) ... | Conditions.cs:108:18:108:18 | [b (line 102): true] access to parameter b | semmle.label | successor |
-| Conditions.cs:108:17:108:18 | [false] !... | Conditions.cs:110:16:110:16 | access to local variable x | semmle.label | false |
-| Conditions.cs:108:17:108:18 | [true] !... | Conditions.cs:109:17:109:24 | ...; | semmle.label | true |
-| Conditions.cs:108:18:108:18 | [b (line 102): false] access to parameter b | Conditions.cs:108:17:108:18 | [true] !... | semmle.label | false |
-| Conditions.cs:108:18:108:18 | [b (line 102): true] access to parameter b | Conditions.cs:108:17:108:18 | [false] !... | semmle.label | true |
-| Conditions.cs:109:17:109:17 | access to local variable x | Conditions.cs:109:22:109:23 | "" | semmle.label | successor |
-| Conditions.cs:109:17:109:23 | ... + ... | Conditions.cs:109:17:109:23 | ... = ... | semmle.label | successor |
-| Conditions.cs:109:17:109:23 | ... = ... | Conditions.cs:110:16:110:16 | access to local variable x | semmle.label | successor |
-| Conditions.cs:109:17:109:24 | ...; | Conditions.cs:109:17:109:17 | access to local variable x | semmle.label | successor |
-| Conditions.cs:109:22:109:23 | "" | Conditions.cs:109:17:109:23 | ... + ... | semmle.label | successor |
-| Conditions.cs:110:9:110:17 | return ...; | Conditions.cs:102:12:102:13 | exit M8 (normal) | semmle.label | return |
-| Conditions.cs:110:16:110:16 | access to local variable x | Conditions.cs:110:9:110:17 | return ...; | semmle.label | successor |
-| Conditions.cs:113:10:113:11 | enter M9 | Conditions.cs:114:5:124:5 | {...} | semmle.label | successor |
-| Conditions.cs:113:10:113:11 | exit M9 (normal) | Conditions.cs:113:10:113:11 | exit M9 | semmle.label | successor |
-| Conditions.cs:114:5:124:5 | {...} | Conditions.cs:115:9:115:24 | ... ...; | semmle.label | successor |
-| Conditions.cs:115:9:115:24 | ... ...; | Conditions.cs:115:20:115:23 | null | semmle.label | successor |
-| Conditions.cs:115:16:115:23 | String s = ... | Conditions.cs:116:9:123:9 | for (...;...;...) ... | semmle.label | successor |
-| Conditions.cs:115:20:115:23 | null | Conditions.cs:115:16:115:23 | String s = ... | semmle.label | successor |
-| Conditions.cs:116:9:123:9 | for (...;...;...) ... | Conditions.cs:116:22:116:22 | 0 | semmle.label | successor |
-| Conditions.cs:116:18:116:22 | Int32 i = ... | Conditions.cs:116:25:116:25 | access to local variable i | semmle.label | successor |
-| Conditions.cs:116:22:116:22 | 0 | Conditions.cs:116:18:116:22 | Int32 i = ... | semmle.label | successor |
-| Conditions.cs:116:25:116:25 | access to local variable i | Conditions.cs:116:29:116:32 | access to parameter args | semmle.label | successor |
-| Conditions.cs:116:25:116:39 | ... < ... | Conditions.cs:113:10:113:11 | exit M9 (normal) | semmle.label | false |
-| Conditions.cs:116:25:116:39 | ... < ... | Conditions.cs:117:9:123:9 | {...} | semmle.label | true |
-| Conditions.cs:116:29:116:32 | access to parameter args | Conditions.cs:116:29:116:39 | access to property Length | semmle.label | successor |
-| Conditions.cs:116:29:116:39 | access to property Length | Conditions.cs:116:25:116:39 | ... < ... | semmle.label | successor |
-| Conditions.cs:116:42:116:42 | access to local variable i | Conditions.cs:116:42:116:44 | ...++ | semmle.label | successor |
-| Conditions.cs:116:42:116:44 | ...++ | Conditions.cs:116:25:116:25 | access to local variable i | semmle.label | successor |
-| Conditions.cs:117:9:123:9 | {...} | Conditions.cs:118:13:118:44 | ... ...; | semmle.label | successor |
-| Conditions.cs:118:13:118:44 | ... ...; | Conditions.cs:118:24:118:24 | access to local variable i | semmle.label | successor |
-| Conditions.cs:118:17:118:43 | Boolean last = ... | Conditions.cs:119:13:120:23 | if (...) ... | semmle.label | successor |
-| Conditions.cs:118:24:118:24 | access to local variable i | Conditions.cs:118:29:118:32 | access to parameter args | semmle.label | successor |
-| Conditions.cs:118:24:118:43 | ... == ... | Conditions.cs:118:17:118:43 | Boolean last = ... | semmle.label | successor |
-| Conditions.cs:118:29:118:32 | access to parameter args | Conditions.cs:118:29:118:39 | access to property Length | semmle.label | successor |
-| Conditions.cs:118:29:118:39 | access to property Length | Conditions.cs:118:43:118:43 | 1 | semmle.label | successor |
-| Conditions.cs:118:29:118:43 | ... - ... | Conditions.cs:118:24:118:43 | ... == ... | semmle.label | successor |
-| Conditions.cs:118:43:118:43 | 1 | Conditions.cs:118:29:118:43 | ... - ... | semmle.label | successor |
-| Conditions.cs:119:13:120:23 | if (...) ... | Conditions.cs:119:18:119:21 | access to local variable last | semmle.label | successor |
-| Conditions.cs:119:17:119:21 | [false, last (line 118): true] !... | Conditions.cs:121:13:122:25 | [last (line 118): true] if (...) ... | semmle.label | false |
-| Conditions.cs:119:17:119:21 | [true, last (line 118): false] !... | Conditions.cs:120:17:120:23 | [last (line 118): false] ...; | semmle.label | true |
-| Conditions.cs:119:18:119:21 | access to local variable last | Conditions.cs:119:17:119:21 | [false, last (line 118): true] !... | semmle.label | true |
-| Conditions.cs:119:18:119:21 | access to local variable last | Conditions.cs:119:17:119:21 | [true, last (line 118): false] !... | semmle.label | false |
-| Conditions.cs:120:17:120:22 | [last (line 118): false] ... = ... | Conditions.cs:121:13:122:25 | [last (line 118): false] if (...) ... | semmle.label | successor |
-| Conditions.cs:120:17:120:23 | [last (line 118): false] ...; | Conditions.cs:120:21:120:22 | [last (line 118): false] "" | semmle.label | successor |
-| Conditions.cs:120:21:120:22 | [last (line 118): false] "" | Conditions.cs:120:17:120:22 | [last (line 118): false] ... = ... | semmle.label | successor |
-| Conditions.cs:121:13:122:25 | [last (line 118): false] if (...) ... | Conditions.cs:121:17:121:20 | [last (line 118): false] access to local variable last | semmle.label | successor |
-| Conditions.cs:121:13:122:25 | [last (line 118): true] if (...) ... | Conditions.cs:121:17:121:20 | [last (line 118): true] access to local variable last | semmle.label | successor |
-| Conditions.cs:121:17:121:20 | [last (line 118): false] access to local variable last | Conditions.cs:116:42:116:42 | access to local variable i | semmle.label | false |
-| Conditions.cs:121:17:121:20 | [last (line 118): true] access to local variable last | Conditions.cs:122:17:122:25 | ...; | semmle.label | true |
-| Conditions.cs:122:17:122:24 | ... = ... | Conditions.cs:116:42:116:42 | access to local variable i | semmle.label | successor |
-| Conditions.cs:122:17:122:25 | ...; | Conditions.cs:122:21:122:24 | null | semmle.label | successor |
-| Conditions.cs:122:21:122:24 | null | Conditions.cs:122:17:122:24 | ... = ... | semmle.label | successor |
-| Conditions.cs:129:10:129:12 | enter M10 | Conditions.cs:130:5:141:5 | {...} | semmle.label | successor |
-| Conditions.cs:130:5:141:5 | {...} | Conditions.cs:131:9:140:9 | while (...) ... | semmle.label | successor |
-| Conditions.cs:131:9:140:9 | while (...) ... | Conditions.cs:131:16:131:19 | true | semmle.label | successor |
-| Conditions.cs:131:16:131:19 | [Field1 (line 129): false] true | Conditions.cs:132:9:140:9 | [Field1 (line 129): false] {...} | semmle.label | true |
-| Conditions.cs:131:16:131:19 | [Field1 (line 129): true, Field2 (line 129): false] true | Conditions.cs:132:9:140:9 | [Field1 (line 129): true, Field2 (line 129): false] {...} | semmle.label | true |
-| Conditions.cs:131:16:131:19 | [Field1 (line 129): true, Field2 (line 129): true] true | Conditions.cs:132:9:140:9 | [Field1 (line 129): true, Field2 (line 129): true] {...} | semmle.label | true |
-| Conditions.cs:131:16:131:19 | true | Conditions.cs:132:9:140:9 | {...} | semmle.label | true |
-| Conditions.cs:132:9:140:9 | [Field1 (line 129): false] {...} | Conditions.cs:133:13:139:13 | [Field1 (line 129): false] if (...) ... | semmle.label | successor |
-| Conditions.cs:132:9:140:9 | [Field1 (line 129): true, Field2 (line 129): false] {...} | Conditions.cs:133:13:139:13 | [Field1 (line 129): true, Field2 (line 129): false] if (...) ... | semmle.label | successor |
-| Conditions.cs:132:9:140:9 | [Field1 (line 129): true, Field2 (line 129): true] {...} | Conditions.cs:133:13:139:13 | [Field1 (line 129): true, Field2 (line 129): true] if (...) ... | semmle.label | successor |
-| Conditions.cs:132:9:140:9 | {...} | Conditions.cs:133:13:139:13 | if (...) ... | semmle.label | successor |
-| Conditions.cs:133:13:139:13 | [Field1 (line 129): false] if (...) ... | Conditions.cs:133:17:133:22 | [Field1 (line 129): false] this access | semmle.label | successor |
-| Conditions.cs:133:13:139:13 | [Field1 (line 129): true, Field2 (line 129): false] if (...) ... | Conditions.cs:133:17:133:22 | [Field1 (line 129): true, Field2 (line 129): false] this access | semmle.label | successor |
-| Conditions.cs:133:13:139:13 | [Field1 (line 129): true, Field2 (line 129): true] if (...) ... | Conditions.cs:133:17:133:22 | [Field1 (line 129): true, Field2 (line 129): true] this access | semmle.label | successor |
-| Conditions.cs:133:13:139:13 | if (...) ... | Conditions.cs:133:17:133:22 | this access | semmle.label | successor |
-| Conditions.cs:133:17:133:22 | [Field1 (line 129): false] access to field Field1 | Conditions.cs:131:16:131:19 | [Field1 (line 129): false] true | semmle.label | false |
-| Conditions.cs:133:17:133:22 | [Field1 (line 129): false] this access | Conditions.cs:133:17:133:22 | [Field1 (line 129): false] access to field Field1 | semmle.label | successor |
-| Conditions.cs:133:17:133:22 | [Field1 (line 129): true, Field2 (line 129): false] access to field Field1 | Conditions.cs:134:13:139:13 | [Field1 (line 129): true, Field2 (line 129): false] {...} | semmle.label | true |
-| Conditions.cs:133:17:133:22 | [Field1 (line 129): true, Field2 (line 129): false] this access | Conditions.cs:133:17:133:22 | [Field1 (line 129): true, Field2 (line 129): false] access to field Field1 | semmle.label | successor |
-| Conditions.cs:133:17:133:22 | [Field1 (line 129): true, Field2 (line 129): true] access to field Field1 | Conditions.cs:134:13:139:13 | [Field1 (line 129): true, Field2 (line 129): true] {...} | semmle.label | true |
-| Conditions.cs:133:17:133:22 | [Field1 (line 129): true, Field2 (line 129): true] this access | Conditions.cs:133:17:133:22 | [Field1 (line 129): true, Field2 (line 129): true] access to field Field1 | semmle.label | successor |
-| Conditions.cs:133:17:133:22 | access to field Field1 | Conditions.cs:131:16:131:19 | [Field1 (line 129): false] true | semmle.label | false |
-| Conditions.cs:133:17:133:22 | access to field Field1 | Conditions.cs:134:13:139:13 | [Field1 (line 129): true] {...} | semmle.label | true |
-| Conditions.cs:133:17:133:22 | this access | Conditions.cs:133:17:133:22 | access to field Field1 | semmle.label | successor |
-| Conditions.cs:134:13:139:13 | [Field1 (line 129): true, Field2 (line 129): false] {...} | Conditions.cs:135:17:138:17 | [Field1 (line 129): true, Field2 (line 129): false] if (...) ... | semmle.label | successor |
-| Conditions.cs:134:13:139:13 | [Field1 (line 129): true, Field2 (line 129): true] {...} | Conditions.cs:135:17:138:17 | [Field1 (line 129): true, Field2 (line 129): true] if (...) ... | semmle.label | successor |
-| Conditions.cs:134:13:139:13 | [Field1 (line 129): true] {...} | Conditions.cs:135:17:138:17 | [Field1 (line 129): true] if (...) ... | semmle.label | successor |
-| Conditions.cs:135:17:138:17 | [Field1 (line 129): true, Field2 (line 129): false] if (...) ... | Conditions.cs:135:21:135:26 | [Field1 (line 129): true, Field2 (line 129): false] this access | semmle.label | successor |
-| Conditions.cs:135:17:138:17 | [Field1 (line 129): true, Field2 (line 129): true] if (...) ... | Conditions.cs:135:21:135:26 | [Field1 (line 129): true, Field2 (line 129): true] this access | semmle.label | successor |
-| Conditions.cs:135:17:138:17 | [Field1 (line 129): true] if (...) ... | Conditions.cs:135:21:135:26 | [Field1 (line 129): true] this access | semmle.label | successor |
-| Conditions.cs:135:21:135:26 | [Field1 (line 129): true, Field2 (line 129): false] access to field Field2 | Conditions.cs:131:16:131:19 | [Field1 (line 129): true, Field2 (line 129): false] true | semmle.label | false |
-| Conditions.cs:135:21:135:26 | [Field1 (line 129): true, Field2 (line 129): false] this access | Conditions.cs:135:21:135:26 | [Field1 (line 129): true, Field2 (line 129): false] access to field Field2 | semmle.label | successor |
-| Conditions.cs:135:21:135:26 | [Field1 (line 129): true, Field2 (line 129): true] access to field Field2 | Conditions.cs:136:17:138:17 | [Field1 (line 129): true, Field2 (line 129): true] {...} | semmle.label | true |
-| Conditions.cs:135:21:135:26 | [Field1 (line 129): true, Field2 (line 129): true] this access | Conditions.cs:135:21:135:26 | [Field1 (line 129): true, Field2 (line 129): true] access to field Field2 | semmle.label | successor |
-| Conditions.cs:135:21:135:26 | [Field1 (line 129): true] access to field Field2 | Conditions.cs:131:16:131:19 | [Field1 (line 129): true, Field2 (line 129): false] true | semmle.label | false |
-| Conditions.cs:135:21:135:26 | [Field1 (line 129): true] access to field Field2 | Conditions.cs:136:17:138:17 | [Field1 (line 129): true, Field2 (line 129): true] {...} | semmle.label | true |
-| Conditions.cs:135:21:135:26 | [Field1 (line 129): true] this access | Conditions.cs:135:21:135:26 | [Field1 (line 129): true] access to field Field2 | semmle.label | successor |
-| Conditions.cs:136:17:138:17 | [Field1 (line 129): true, Field2 (line 129): true] {...} | Conditions.cs:137:21:137:38 | [Field1 (line 129): true, Field2 (line 129): true] ...; | semmle.label | successor |
-| Conditions.cs:137:21:137:26 | [Field1 (line 129): true, Field2 (line 129): true] access to field Field1 | Conditions.cs:137:21:137:37 | [Field1 (line 129): true, Field2 (line 129): true] call to method ToString | semmle.label | successor |
-| Conditions.cs:137:21:137:26 | [Field1 (line 129): true, Field2 (line 129): true] this access | Conditions.cs:137:21:137:26 | [Field1 (line 129): true, Field2 (line 129): true] access to field Field1 | semmle.label | successor |
-| Conditions.cs:137:21:137:37 | [Field1 (line 129): true, Field2 (line 129): true] call to method ToString | Conditions.cs:131:16:131:19 | [Field1 (line 129): true, Field2 (line 129): true] true | semmle.label | successor |
-| Conditions.cs:137:21:137:38 | [Field1 (line 129): true, Field2 (line 129): true] ...; | Conditions.cs:137:21:137:26 | [Field1 (line 129): true, Field2 (line 129): true] this access | semmle.label | successor |
-| Conditions.cs:143:10:143:12 | enter M11 | Conditions.cs:144:5:150:5 | {...} | semmle.label | successor |
-| Conditions.cs:143:10:143:12 | exit M11 (normal) | Conditions.cs:143:10:143:12 | exit M11 | semmle.label | successor |
-| Conditions.cs:144:5:150:5 | {...} | Conditions.cs:145:9:145:30 | ... ...; | semmle.label | successor |
-| Conditions.cs:145:9:145:30 | ... ...; | Conditions.cs:145:17:145:17 | access to parameter b | semmle.label | successor |
-| Conditions.cs:145:13:145:29 | [b (line 143): false] String s = ... | Conditions.cs:146:9:149:49 | [b (line 143): false] if (...) ... | semmle.label | successor |
-| Conditions.cs:145:13:145:29 | [b (line 143): true] String s = ... | Conditions.cs:146:9:149:49 | [b (line 143): true] if (...) ... | semmle.label | successor |
-| Conditions.cs:145:17:145:17 | access to parameter b | Conditions.cs:145:21:145:23 | [b (line 143): true] "a" | semmle.label | true |
-| Conditions.cs:145:17:145:17 | access to parameter b | Conditions.cs:145:27:145:29 | [b (line 143): false] "b" | semmle.label | false |
-| Conditions.cs:145:17:145:29 | [b (line 143): false] ... ? ... : ... | Conditions.cs:145:13:145:29 | [b (line 143): false] String s = ... | semmle.label | successor |
-| Conditions.cs:145:17:145:29 | [b (line 143): true] ... ? ... : ... | Conditions.cs:145:13:145:29 | [b (line 143): true] String s = ... | semmle.label | successor |
-| Conditions.cs:145:21:145:23 | [b (line 143): true] "a" | Conditions.cs:145:17:145:29 | [b (line 143): true] ... ? ... : ... | semmle.label | successor |
-| Conditions.cs:145:27:145:29 | [b (line 143): false] "b" | Conditions.cs:145:17:145:29 | [b (line 143): false] ... ? ... : ... | semmle.label | successor |
-| Conditions.cs:146:9:149:49 | [b (line 143): false] if (...) ... | Conditions.cs:146:13:146:13 | [b (line 143): false] access to parameter b | semmle.label | successor |
-| Conditions.cs:146:9:149:49 | [b (line 143): true] if (...) ... | Conditions.cs:146:13:146:13 | [b (line 143): true] access to parameter b | semmle.label | successor |
-| Conditions.cs:146:13:146:13 | [b (line 143): false] access to parameter b | Conditions.cs:149:13:149:49 | ...; | semmle.label | false |
-| Conditions.cs:146:13:146:13 | [b (line 143): true] access to parameter b | Conditions.cs:147:13:147:49 | ...; | semmle.label | true |
-| Conditions.cs:147:13:147:48 | call to method WriteLine | Conditions.cs:143:10:143:12 | exit M11 (normal) | semmle.label | successor |
-| Conditions.cs:147:13:147:49 | ...; | Conditions.cs:147:40:147:43 | "a = " | semmle.label | successor |
-| Conditions.cs:147:38:147:47 | $"..." | Conditions.cs:147:13:147:48 | call to method WriteLine | semmle.label | successor |
-| Conditions.cs:147:40:147:43 | "a = " | Conditions.cs:147:45:147:45 | access to local variable s | semmle.label | successor |
-| Conditions.cs:147:45:147:45 | access to local variable s | Conditions.cs:147:38:147:47 | $"..." | semmle.label | successor |
-| Conditions.cs:149:13:149:48 | call to method WriteLine | Conditions.cs:143:10:143:12 | exit M11 (normal) | semmle.label | successor |
-| Conditions.cs:149:13:149:49 | ...; | Conditions.cs:149:40:149:43 | "b = " | semmle.label | successor |
-| Conditions.cs:149:38:149:47 | $"..." | Conditions.cs:149:13:149:48 | call to method WriteLine | semmle.label | successor |
-| Conditions.cs:149:40:149:43 | "b = " | Conditions.cs:149:45:149:45 | access to local variable s | semmle.label | successor |
-| Conditions.cs:149:45:149:45 | access to local variable s | Conditions.cs:149:38:149:47 | $"..." | semmle.label | successor |
-| ExitMethods.cs:8:10:8:11 | enter M1 | ExitMethods.cs:9:5:12:5 | {...} | semmle.label | successor |
-| ExitMethods.cs:8:10:8:11 | exit M1 (normal) | ExitMethods.cs:8:10:8:11 | exit M1 | semmle.label | successor |
-| ExitMethods.cs:9:5:12:5 | {...} | ExitMethods.cs:10:9:10:25 | ...; | semmle.label | successor |
-| ExitMethods.cs:10:9:10:24 | call to method ErrorMaybe | ExitMethods.cs:11:9:11:15 | return ...; | semmle.label | successor |
-| ExitMethods.cs:10:9:10:25 | ...; | ExitMethods.cs:10:20:10:23 | true | semmle.label | successor |
-| ExitMethods.cs:10:20:10:23 | true | ExitMethods.cs:10:9:10:24 | call to method ErrorMaybe | semmle.label | successor |
-| ExitMethods.cs:11:9:11:15 | return ...; | ExitMethods.cs:8:10:8:11 | exit M1 (normal) | semmle.label | return |
-| ExitMethods.cs:14:10:14:11 | enter M2 | ExitMethods.cs:15:5:18:5 | {...} | semmle.label | successor |
-| ExitMethods.cs:14:10:14:11 | exit M2 (normal) | ExitMethods.cs:14:10:14:11 | exit M2 | semmle.label | successor |
-| ExitMethods.cs:15:5:18:5 | {...} | ExitMethods.cs:16:9:16:26 | ...; | semmle.label | successor |
-| ExitMethods.cs:16:9:16:25 | call to method ErrorMaybe | ExitMethods.cs:17:9:17:15 | return ...; | semmle.label | successor |
-| ExitMethods.cs:16:9:16:26 | ...; | ExitMethods.cs:16:20:16:24 | false | semmle.label | successor |
-| ExitMethods.cs:16:20:16:24 | false | ExitMethods.cs:16:9:16:25 | call to method ErrorMaybe | semmle.label | successor |
-| ExitMethods.cs:17:9:17:15 | return ...; | ExitMethods.cs:14:10:14:11 | exit M2 (normal) | semmle.label | return |
-| ExitMethods.cs:20:10:20:11 | enter M3 | ExitMethods.cs:21:5:24:5 | {...} | semmle.label | successor |
-| ExitMethods.cs:20:10:20:11 | exit M3 (abnormal) | ExitMethods.cs:20:10:20:11 | exit M3 | semmle.label | successor |
-| ExitMethods.cs:21:5:24:5 | {...} | ExitMethods.cs:22:9:22:26 | ...; | semmle.label | successor |
-| ExitMethods.cs:22:9:22:25 | call to method ErrorAlways | ExitMethods.cs:20:10:20:11 | exit M3 (abnormal) | semmle.label | exception(ArgumentException) |
-| ExitMethods.cs:22:9:22:25 | call to method ErrorAlways | ExitMethods.cs:20:10:20:11 | exit M3 (abnormal) | semmle.label | exception(Exception) |
-| ExitMethods.cs:22:9:22:26 | ...; | ExitMethods.cs:22:21:22:24 | true | semmle.label | successor |
-| ExitMethods.cs:22:21:22:24 | true | ExitMethods.cs:22:9:22:25 | call to method ErrorAlways | semmle.label | successor |
-| ExitMethods.cs:26:10:26:11 | enter M4 | ExitMethods.cs:27:5:30:5 | {...} | semmle.label | successor |
-| ExitMethods.cs:26:10:26:11 | exit M4 (abnormal) | ExitMethods.cs:26:10:26:11 | exit M4 | semmle.label | successor |
-| ExitMethods.cs:27:5:30:5 | {...} | ExitMethods.cs:28:9:28:15 | ...; | semmle.label | successor |
-| ExitMethods.cs:28:9:28:14 | call to method Exit | ExitMethods.cs:26:10:26:11 | exit M4 (abnormal) | semmle.label | exit |
-| ExitMethods.cs:28:9:28:14 | this access | ExitMethods.cs:28:9:28:14 | call to method Exit | semmle.label | successor |
-| ExitMethods.cs:28:9:28:15 | ...; | ExitMethods.cs:28:9:28:14 | this access | semmle.label | successor |
-| ExitMethods.cs:32:10:32:11 | enter M5 | ExitMethods.cs:33:5:36:5 | {...} | semmle.label | successor |
-| ExitMethods.cs:32:10:32:11 | exit M5 (abnormal) | ExitMethods.cs:32:10:32:11 | exit M5 | semmle.label | successor |
-| ExitMethods.cs:33:5:36:5 | {...} | ExitMethods.cs:34:9:34:26 | ...; | semmle.label | successor |
-| ExitMethods.cs:34:9:34:25 | call to method ApplicationExit | ExitMethods.cs:32:10:32:11 | exit M5 (abnormal) | semmle.label | exit |
-| ExitMethods.cs:34:9:34:25 | this access | ExitMethods.cs:34:9:34:25 | call to method ApplicationExit | semmle.label | successor |
-| ExitMethods.cs:34:9:34:26 | ...; | ExitMethods.cs:34:9:34:25 | this access | semmle.label | successor |
-| ExitMethods.cs:38:10:38:11 | enter M6 | ExitMethods.cs:39:5:52:5 | {...} | semmle.label | successor |
-| ExitMethods.cs:38:10:38:11 | exit M6 (normal) | ExitMethods.cs:38:10:38:11 | exit M6 | semmle.label | successor |
-| ExitMethods.cs:39:5:52:5 | {...} | ExitMethods.cs:40:9:51:9 | try {...} ... | semmle.label | successor |
-| ExitMethods.cs:40:9:51:9 | try {...} ... | ExitMethods.cs:41:9:43:9 | {...} | semmle.label | successor |
-| ExitMethods.cs:41:9:43:9 | {...} | ExitMethods.cs:42:13:42:31 | ...; | semmle.label | successor |
-| ExitMethods.cs:42:13:42:30 | call to method ErrorAlways | ExitMethods.cs:44:9:47:9 | [exception: ArgumentException] catch (...) {...} | semmle.label | exception(ArgumentException) |
-| ExitMethods.cs:42:13:42:30 | call to method ErrorAlways | ExitMethods.cs:44:9:47:9 | [exception: Exception] catch (...) {...} | semmle.label | exception(Exception) |
-| ExitMethods.cs:42:13:42:31 | ...; | ExitMethods.cs:42:25:42:29 | false | semmle.label | successor |
-| ExitMethods.cs:42:25:42:29 | false | ExitMethods.cs:42:13:42:30 | call to method ErrorAlways | semmle.label | successor |
-| ExitMethods.cs:44:9:47:9 | [exception: ArgumentException] catch (...) {...} | ExitMethods.cs:45:9:47:9 | {...} | semmle.label | match |
-| ExitMethods.cs:44:9:47:9 | [exception: Exception] catch (...) {...} | ExitMethods.cs:45:9:47:9 | {...} | semmle.label | match |
-| ExitMethods.cs:44:9:47:9 | [exception: Exception] catch (...) {...} | ExitMethods.cs:48:9:51:9 | [exception: Exception] catch (...) {...} | semmle.label | no-match |
-| ExitMethods.cs:45:9:47:9 | {...} | ExitMethods.cs:46:13:46:19 | return ...; | semmle.label | successor |
-| ExitMethods.cs:46:13:46:19 | return ...; | ExitMethods.cs:38:10:38:11 | exit M6 (normal) | semmle.label | return |
-| ExitMethods.cs:48:9:51:9 | [exception: Exception] catch (...) {...} | ExitMethods.cs:49:9:51:9 | {...} | semmle.label | match |
-| ExitMethods.cs:49:9:51:9 | {...} | ExitMethods.cs:50:13:50:19 | return ...; | semmle.label | successor |
-| ExitMethods.cs:50:13:50:19 | return ...; | ExitMethods.cs:38:10:38:11 | exit M6 (normal) | semmle.label | return |
-| ExitMethods.cs:54:10:54:11 | enter M7 | ExitMethods.cs:55:5:58:5 | {...} | semmle.label | successor |
-| ExitMethods.cs:54:10:54:11 | exit M7 (abnormal) | ExitMethods.cs:54:10:54:11 | exit M7 | semmle.label | successor |
-| ExitMethods.cs:55:5:58:5 | {...} | ExitMethods.cs:56:9:56:23 | ...; | semmle.label | successor |
-| ExitMethods.cs:56:9:56:22 | call to method ErrorAlways2 | ExitMethods.cs:54:10:54:11 | exit M7 (abnormal) | semmle.label | exception(Exception) |
-| ExitMethods.cs:56:9:56:23 | ...; | ExitMethods.cs:56:9:56:22 | call to method ErrorAlways2 | semmle.label | successor |
-| ExitMethods.cs:60:10:60:11 | enter M8 | ExitMethods.cs:61:5:64:5 | {...} | semmle.label | successor |
-| ExitMethods.cs:60:10:60:11 | exit M8 (abnormal) | ExitMethods.cs:60:10:60:11 | exit M8 | semmle.label | successor |
-| ExitMethods.cs:61:5:64:5 | {...} | ExitMethods.cs:62:9:62:23 | ...; | semmle.label | successor |
-| ExitMethods.cs:62:9:62:22 | call to method ErrorAlways3 | ExitMethods.cs:60:10:60:11 | exit M8 (abnormal) | semmle.label | exception(Exception) |
-| ExitMethods.cs:62:9:62:23 | ...; | ExitMethods.cs:62:9:62:22 | call to method ErrorAlways3 | semmle.label | successor |
-| ExitMethods.cs:66:17:66:26 | enter ErrorMaybe | ExitMethods.cs:67:5:70:5 | {...} | semmle.label | successor |
-| ExitMethods.cs:66:17:66:26 | exit ErrorMaybe (abnormal) | ExitMethods.cs:66:17:66:26 | exit ErrorMaybe | semmle.label | successor |
-| ExitMethods.cs:66:17:66:26 | exit ErrorMaybe (normal) | ExitMethods.cs:66:17:66:26 | exit ErrorMaybe | semmle.label | successor |
-| ExitMethods.cs:67:5:70:5 | {...} | ExitMethods.cs:68:9:69:34 | if (...) ... | semmle.label | successor |
-| ExitMethods.cs:68:9:69:34 | if (...) ... | ExitMethods.cs:68:13:68:13 | access to parameter b | semmle.label | successor |
-| ExitMethods.cs:68:13:68:13 | access to parameter b | ExitMethods.cs:66:17:66:26 | exit ErrorMaybe (normal) | semmle.label | false |
-| ExitMethods.cs:68:13:68:13 | access to parameter b | ExitMethods.cs:69:19:69:33 | object creation of type Exception | semmle.label | true |
-| ExitMethods.cs:69:13:69:34 | throw ...; | ExitMethods.cs:66:17:66:26 | exit ErrorMaybe (abnormal) | semmle.label | exception(Exception) |
-| ExitMethods.cs:69:19:69:33 | object creation of type Exception | ExitMethods.cs:69:13:69:34 | throw ...; | semmle.label | successor |
-| ExitMethods.cs:72:17:72:27 | enter ErrorAlways | ExitMethods.cs:73:5:78:5 | {...} | semmle.label | successor |
-| ExitMethods.cs:72:17:72:27 | exit ErrorAlways (abnormal) | ExitMethods.cs:72:17:72:27 | exit ErrorAlways | semmle.label | successor |
-| ExitMethods.cs:73:5:78:5 | {...} | ExitMethods.cs:74:9:77:45 | if (...) ... | semmle.label | successor |
-| ExitMethods.cs:74:9:77:45 | if (...) ... | ExitMethods.cs:74:13:74:13 | access to parameter b | semmle.label | successor |
-| ExitMethods.cs:74:13:74:13 | access to parameter b | ExitMethods.cs:75:19:75:33 | object creation of type Exception | semmle.label | true |
-| ExitMethods.cs:74:13:74:13 | access to parameter b | ExitMethods.cs:77:41:77:43 | "b" | semmle.label | false |
-| ExitMethods.cs:75:13:75:34 | throw ...; | ExitMethods.cs:72:17:72:27 | exit ErrorAlways (abnormal) | semmle.label | exception(Exception) |
-| ExitMethods.cs:75:19:75:33 | object creation of type Exception | ExitMethods.cs:75:13:75:34 | throw ...; | semmle.label | successor |
-| ExitMethods.cs:77:13:77:45 | throw ...; | ExitMethods.cs:72:17:72:27 | exit ErrorAlways (abnormal) | semmle.label | exception(ArgumentException) |
-| ExitMethods.cs:77:19:77:44 | object creation of type ArgumentException | ExitMethods.cs:77:13:77:45 | throw ...; | semmle.label | successor |
-| ExitMethods.cs:77:41:77:43 | "b" | ExitMethods.cs:77:19:77:44 | object creation of type ArgumentException | semmle.label | successor |
-| ExitMethods.cs:80:17:80:28 | enter ErrorAlways2 | ExitMethods.cs:81:5:83:5 | {...} | semmle.label | successor |
-| ExitMethods.cs:80:17:80:28 | exit ErrorAlways2 (abnormal) | ExitMethods.cs:80:17:80:28 | exit ErrorAlways2 | semmle.label | successor |
-| ExitMethods.cs:81:5:83:5 | {...} | ExitMethods.cs:82:15:82:29 | object creation of type Exception | semmle.label | successor |
-| ExitMethods.cs:82:9:82:30 | throw ...; | ExitMethods.cs:80:17:80:28 | exit ErrorAlways2 (abnormal) | semmle.label | exception(Exception) |
-| ExitMethods.cs:82:15:82:29 | object creation of type Exception | ExitMethods.cs:82:9:82:30 | throw ...; | semmle.label | successor |
-| ExitMethods.cs:85:17:85:28 | enter ErrorAlways3 | ExitMethods.cs:85:41:85:55 | object creation of type Exception | semmle.label | successor |
-| ExitMethods.cs:85:17:85:28 | exit ErrorAlways3 (abnormal) | ExitMethods.cs:85:17:85:28 | exit ErrorAlways3 | semmle.label | successor |
-| ExitMethods.cs:85:35:85:55 | throw ... | ExitMethods.cs:85:17:85:28 | exit ErrorAlways3 (abnormal) | semmle.label | exception(Exception) |
-| ExitMethods.cs:85:41:85:55 | object creation of type Exception | ExitMethods.cs:85:35:85:55 | throw ... | semmle.label | successor |
-| ExitMethods.cs:87:10:87:13 | enter Exit | ExitMethods.cs:88:5:90:5 | {...} | semmle.label | successor |
-| ExitMethods.cs:87:10:87:13 | exit Exit (abnormal) | ExitMethods.cs:87:10:87:13 | exit Exit | semmle.label | successor |
-| ExitMethods.cs:88:5:90:5 | {...} | ExitMethods.cs:89:9:89:28 | ...; | semmle.label | successor |
-| ExitMethods.cs:89:9:89:27 | call to method Exit | ExitMethods.cs:87:10:87:13 | exit Exit (abnormal) | semmle.label | exit |
-| ExitMethods.cs:89:9:89:28 | ...; | ExitMethods.cs:89:26:89:26 | 0 | semmle.label | successor |
-| ExitMethods.cs:89:26:89:26 | 0 | ExitMethods.cs:89:9:89:27 | call to method Exit | semmle.label | successor |
-| ExitMethods.cs:92:10:92:18 | enter ExitInTry | ExitMethods.cs:93:5:103:5 | {...} | semmle.label | successor |
-| ExitMethods.cs:92:10:92:18 | exit ExitInTry (abnormal) | ExitMethods.cs:92:10:92:18 | exit ExitInTry | semmle.label | successor |
-| ExitMethods.cs:93:5:103:5 | {...} | ExitMethods.cs:94:9:102:9 | try {...} ... | semmle.label | successor |
-| ExitMethods.cs:94:9:102:9 | try {...} ... | ExitMethods.cs:95:9:97:9 | {...} | semmle.label | successor |
-| ExitMethods.cs:95:9:97:9 | {...} | ExitMethods.cs:96:13:96:19 | ...; | semmle.label | successor |
-| ExitMethods.cs:96:13:96:18 | call to method Exit | ExitMethods.cs:92:10:92:18 | exit ExitInTry (abnormal) | semmle.label | exit |
-| ExitMethods.cs:96:13:96:18 | this access | ExitMethods.cs:96:13:96:18 | call to method Exit | semmle.label | successor |
-| ExitMethods.cs:96:13:96:19 | ...; | ExitMethods.cs:96:13:96:18 | this access | semmle.label | successor |
-| ExitMethods.cs:105:10:105:24 | enter ApplicationExit | ExitMethods.cs:106:5:108:5 | {...} | semmle.label | successor |
-| ExitMethods.cs:105:10:105:24 | exit ApplicationExit (abnormal) | ExitMethods.cs:105:10:105:24 | exit ApplicationExit | semmle.label | successor |
-| ExitMethods.cs:106:5:108:5 | {...} | ExitMethods.cs:107:9:107:48 | ...; | semmle.label | successor |
-| ExitMethods.cs:107:9:107:47 | call to method Exit | ExitMethods.cs:105:10:105:24 | exit ApplicationExit (abnormal) | semmle.label | exit |
-| ExitMethods.cs:107:9:107:48 | ...; | ExitMethods.cs:107:9:107:47 | call to method Exit | semmle.label | successor |
-| ExitMethods.cs:110:13:110:21 | enter ThrowExpr | ExitMethods.cs:111:5:113:5 | {...} | semmle.label | successor |
-| ExitMethods.cs:110:13:110:21 | exit ThrowExpr (abnormal) | ExitMethods.cs:110:13:110:21 | exit ThrowExpr | semmle.label | successor |
-| ExitMethods.cs:110:13:110:21 | exit ThrowExpr (normal) | ExitMethods.cs:110:13:110:21 | exit ThrowExpr | semmle.label | successor |
-| ExitMethods.cs:111:5:113:5 | {...} | ExitMethods.cs:112:16:112:20 | access to parameter input | semmle.label | successor |
-| ExitMethods.cs:112:9:112:77 | return ...; | ExitMethods.cs:110:13:110:21 | exit ThrowExpr (normal) | semmle.label | return |
-| ExitMethods.cs:112:16:112:20 | access to parameter input | ExitMethods.cs:112:25:112:25 | 0 | semmle.label | successor |
-| ExitMethods.cs:112:16:112:25 | ... != ... | ExitMethods.cs:112:29:112:29 | 1 | semmle.label | true |
-| ExitMethods.cs:112:16:112:25 | ... != ... | ExitMethods.cs:112:69:112:75 | "input" | semmle.label | false |
-| ExitMethods.cs:112:16:112:76 | ... ? ... : ... | ExitMethods.cs:112:9:112:77 | return ...; | semmle.label | successor |
-| ExitMethods.cs:112:25:112:25 | 0 | ExitMethods.cs:112:25:112:25 | (...) ... | semmle.label | successor |
-| ExitMethods.cs:112:25:112:25 | (...) ... | ExitMethods.cs:112:16:112:25 | ... != ... | semmle.label | successor |
-| ExitMethods.cs:112:29:112:29 | 1 | ExitMethods.cs:112:29:112:29 | (...) ... | semmle.label | successor |
-| ExitMethods.cs:112:29:112:29 | (...) ... | ExitMethods.cs:112:33:112:37 | access to parameter input | semmle.label | successor |
-| ExitMethods.cs:112:29:112:37 | ... / ... | ExitMethods.cs:112:16:112:76 | ... ? ... : ... | semmle.label | successor |
-| ExitMethods.cs:112:33:112:37 | access to parameter input | ExitMethods.cs:112:29:112:37 | ... / ... | semmle.label | successor |
-| ExitMethods.cs:112:41:112:76 | throw ... | ExitMethods.cs:110:13:110:21 | exit ThrowExpr (abnormal) | semmle.label | exception(ArgumentException) |
-| ExitMethods.cs:112:47:112:76 | object creation of type ArgumentException | ExitMethods.cs:112:41:112:76 | throw ... | semmle.label | successor |
-| ExitMethods.cs:112:69:112:75 | "input" | ExitMethods.cs:112:47:112:76 | object creation of type ArgumentException | semmle.label | successor |
-| ExitMethods.cs:115:16:115:34 | enter ExtensionMethodCall | ExitMethods.cs:116:5:118:5 | {...} | semmle.label | successor |
-| ExitMethods.cs:115:16:115:34 | exit ExtensionMethodCall (normal) | ExitMethods.cs:115:16:115:34 | exit ExtensionMethodCall | semmle.label | successor |
-| ExitMethods.cs:116:5:118:5 | {...} | ExitMethods.cs:117:16:117:16 | access to parameter s | semmle.label | successor |
-| ExitMethods.cs:117:9:117:39 | return ...; | ExitMethods.cs:115:16:115:34 | exit ExtensionMethodCall (normal) | semmle.label | return |
-| ExitMethods.cs:117:16:117:16 | access to parameter s | ExitMethods.cs:117:27:117:29 | - | semmle.label | successor |
-| ExitMethods.cs:117:16:117:30 | call to method Contains | ExitMethods.cs:117:34:117:34 | 0 | semmle.label | true |
-| ExitMethods.cs:117:16:117:30 | call to method Contains | ExitMethods.cs:117:38:117:38 | 1 | semmle.label | false |
-| ExitMethods.cs:117:16:117:38 | ... ? ... : ... | ExitMethods.cs:117:9:117:39 | return ...; | semmle.label | successor |
-| ExitMethods.cs:117:27:117:29 | - | ExitMethods.cs:117:16:117:30 | call to method Contains | semmle.label | successor |
-| ExitMethods.cs:117:34:117:34 | 0 | ExitMethods.cs:117:16:117:38 | ... ? ... : ... | semmle.label | successor |
-| ExitMethods.cs:117:38:117:38 | 1 | ExitMethods.cs:117:16:117:38 | ... ? ... : ... | semmle.label | successor |
-| ExitMethods.cs:120:17:120:32 | enter FailingAssertion | ExitMethods.cs:121:5:124:5 | {...} | semmle.label | successor |
-| ExitMethods.cs:120:17:120:32 | exit FailingAssertion (abnormal) | ExitMethods.cs:120:17:120:32 | exit FailingAssertion | semmle.label | successor |
-| ExitMethods.cs:121:5:124:5 | {...} | ExitMethods.cs:122:9:122:29 | ...; | semmle.label | successor |
-| ExitMethods.cs:122:9:122:28 | [assertion failure] call to method IsTrue | ExitMethods.cs:120:17:120:32 | exit FailingAssertion (abnormal) | semmle.label | exception(AssertFailedException) |
-| ExitMethods.cs:122:9:122:29 | ...; | ExitMethods.cs:122:23:122:27 | false | semmle.label | successor |
-| ExitMethods.cs:122:23:122:27 | false | ExitMethods.cs:122:9:122:28 | [assertion failure] call to method IsTrue | semmle.label | false |
-| ExitMethods.cs:126:17:126:33 | enter FailingAssertion2 | ExitMethods.cs:127:5:130:5 | {...} | semmle.label | successor |
-| ExitMethods.cs:126:17:126:33 | exit FailingAssertion2 (abnormal) | ExitMethods.cs:126:17:126:33 | exit FailingAssertion2 | semmle.label | successor |
-| ExitMethods.cs:127:5:130:5 | {...} | ExitMethods.cs:128:9:128:27 | ...; | semmle.label | successor |
-| ExitMethods.cs:128:9:128:26 | call to method FailingAssertion | ExitMethods.cs:126:17:126:33 | exit FailingAssertion2 (abnormal) | semmle.label | exception(AssertFailedException) |
-| ExitMethods.cs:128:9:128:26 | this access | ExitMethods.cs:128:9:128:26 | call to method FailingAssertion | semmle.label | successor |
-| ExitMethods.cs:128:9:128:27 | ...; | ExitMethods.cs:128:9:128:26 | this access | semmle.label | successor |
-| ExitMethods.cs:132:10:132:20 | enter AssertFalse | ExitMethods.cs:132:48:132:48 | access to parameter b | semmle.label | successor |
-| ExitMethods.cs:132:10:132:20 | exit AssertFalse (abnormal) | ExitMethods.cs:132:10:132:20 | exit AssertFalse | semmle.label | successor |
-| ExitMethods.cs:132:10:132:20 | exit AssertFalse (normal) | ExitMethods.cs:132:10:132:20 | exit AssertFalse | semmle.label | successor |
-| ExitMethods.cs:132:33:132:49 | [assertion failure] call to method IsFalse | ExitMethods.cs:132:10:132:20 | exit AssertFalse (abnormal) | semmle.label | exception(AssertFailedException) |
-| ExitMethods.cs:132:33:132:49 | [assertion success] call to method IsFalse | ExitMethods.cs:132:10:132:20 | exit AssertFalse (normal) | semmle.label | successor |
-| ExitMethods.cs:132:48:132:48 | access to parameter b | ExitMethods.cs:132:33:132:49 | [assertion failure] call to method IsFalse | semmle.label | true |
-| ExitMethods.cs:132:48:132:48 | access to parameter b | ExitMethods.cs:132:33:132:49 | [assertion success] call to method IsFalse | semmle.label | false |
-| ExitMethods.cs:134:17:134:33 | enter FailingAssertion3 | ExitMethods.cs:135:5:138:5 | {...} | semmle.label | successor |
-| ExitMethods.cs:134:17:134:33 | exit FailingAssertion3 (abnormal) | ExitMethods.cs:134:17:134:33 | exit FailingAssertion3 | semmle.label | successor |
-| ExitMethods.cs:135:5:138:5 | {...} | ExitMethods.cs:136:9:136:26 | ...; | semmle.label | successor |
-| ExitMethods.cs:136:9:136:25 | [assertion failure] call to method AssertFalse | ExitMethods.cs:134:17:134:33 | exit FailingAssertion3 (abnormal) | semmle.label | exception(AssertFailedException) |
-| ExitMethods.cs:136:9:136:25 | this access | ExitMethods.cs:136:21:136:24 | true | semmle.label | successor |
-| ExitMethods.cs:136:9:136:26 | ...; | ExitMethods.cs:136:9:136:25 | this access | semmle.label | successor |
-| ExitMethods.cs:136:21:136:24 | true | ExitMethods.cs:136:9:136:25 | [assertion failure] call to method AssertFalse | semmle.label | true |
-| ExitMethods.cs:140:17:140:42 | enter ExceptionDispatchInfoThrow | ExitMethods.cs:141:5:147:5 | {...} | semmle.label | successor |
-| ExitMethods.cs:140:17:140:42 | exit ExceptionDispatchInfoThrow (abnormal) | ExitMethods.cs:140:17:140:42 | exit ExceptionDispatchInfoThrow | semmle.label | successor |
-| ExitMethods.cs:141:5:147:5 | {...} | ExitMethods.cs:142:9:145:53 | if (...) ... | semmle.label | successor |
-| ExitMethods.cs:142:9:145:53 | if (...) ... | ExitMethods.cs:142:13:142:13 | access to parameter b | semmle.label | successor |
-| ExitMethods.cs:142:13:142:13 | access to parameter b | ExitMethods.cs:143:13:143:43 | ...; | semmle.label | true |
-| ExitMethods.cs:142:13:142:13 | access to parameter b | ExitMethods.cs:145:13:145:53 | ...; | semmle.label | false |
-| ExitMethods.cs:143:13:143:42 | call to method Throw | ExitMethods.cs:140:17:140:42 | exit ExceptionDispatchInfoThrow (abnormal) | semmle.label | exception(ArgumentException) |
-| ExitMethods.cs:143:13:143:43 | ...; | ExitMethods.cs:143:41:143:41 | access to parameter e | semmle.label | successor |
-| ExitMethods.cs:143:41:143:41 | access to parameter e | ExitMethods.cs:143:13:143:42 | call to method Throw | semmle.label | successor |
-| ExitMethods.cs:145:13:145:44 | call to method Capture | ExitMethods.cs:145:13:145:52 | call to method Throw | semmle.label | successor |
-| ExitMethods.cs:145:13:145:52 | call to method Throw | ExitMethods.cs:140:17:140:42 | exit ExceptionDispatchInfoThrow (abnormal) | semmle.label | exception(Exception) |
-| ExitMethods.cs:145:13:145:53 | ...; | ExitMethods.cs:145:43:145:43 | access to parameter e | semmle.label | successor |
-| ExitMethods.cs:145:43:145:43 | access to parameter e | ExitMethods.cs:145:13:145:44 | call to method Capture | semmle.label | successor |
-| Extensions.cs:5:23:5:29 | enter ToInt32 | Extensions.cs:6:5:8:5 | {...} | semmle.label | successor |
-| Extensions.cs:5:23:5:29 | exit ToInt32 (normal) | Extensions.cs:5:23:5:29 | exit ToInt32 | semmle.label | successor |
-| Extensions.cs:6:5:8:5 | {...} | Extensions.cs:7:28:7:28 | access to parameter s | semmle.label | successor |
-| Extensions.cs:7:9:7:30 | return ...; | Extensions.cs:5:23:5:29 | exit ToInt32 (normal) | semmle.label | return |
-| Extensions.cs:7:16:7:29 | call to method Parse | Extensions.cs:7:9:7:30 | return ...; | semmle.label | successor |
-| Extensions.cs:7:28:7:28 | access to parameter s | Extensions.cs:7:16:7:29 | call to method Parse | semmle.label | successor |
-| Extensions.cs:10:24:10:29 | enter ToBool | Extensions.cs:11:5:13:5 | {...} | semmle.label | successor |
-| Extensions.cs:10:24:10:29 | exit ToBool (normal) | Extensions.cs:10:24:10:29 | exit ToBool | semmle.label | successor |
-| Extensions.cs:11:5:13:5 | {...} | Extensions.cs:12:16:12:16 | access to parameter f | semmle.label | successor |
-| Extensions.cs:12:9:12:20 | return ...; | Extensions.cs:10:24:10:29 | exit ToBool (normal) | semmle.label | return |
-| Extensions.cs:12:16:12:16 | access to parameter f | Extensions.cs:12:18:12:18 | access to parameter s | semmle.label | successor |
-| Extensions.cs:12:16:12:19 | delegate call | Extensions.cs:12:9:12:20 | return ...; | semmle.label | successor |
-| Extensions.cs:12:18:12:18 | access to parameter s | Extensions.cs:12:16:12:19 | delegate call | semmle.label | successor |
-| Extensions.cs:15:23:15:33 | enter CallToInt32 | Extensions.cs:15:48:15:50 | "0" | semmle.label | successor |
-| Extensions.cs:15:23:15:33 | exit CallToInt32 (normal) | Extensions.cs:15:23:15:33 | exit CallToInt32 | semmle.label | successor |
-| Extensions.cs:15:40:15:51 | call to method ToInt32 | Extensions.cs:15:23:15:33 | exit CallToInt32 (normal) | semmle.label | successor |
-| Extensions.cs:15:48:15:50 | "0" | Extensions.cs:15:40:15:51 | call to method ToInt32 | semmle.label | successor |
-| Extensions.cs:20:17:20:20 | enter Main | Extensions.cs:21:5:26:5 | {...} | semmle.label | successor |
-| Extensions.cs:20:17:20:20 | exit Main (normal) | Extensions.cs:20:17:20:20 | exit Main | semmle.label | successor |
-| Extensions.cs:21:5:26:5 | {...} | Extensions.cs:22:9:22:20 | ...; | semmle.label | successor |
-| Extensions.cs:22:9:22:9 | access to parameter s | Extensions.cs:22:9:22:19 | call to method ToInt32 | semmle.label | successor |
-| Extensions.cs:22:9:22:19 | call to method ToInt32 | Extensions.cs:23:9:23:31 | ...; | semmle.label | successor |
-| Extensions.cs:22:9:22:20 | ...; | Extensions.cs:22:9:22:9 | access to parameter s | semmle.label | successor |
-| Extensions.cs:23:9:23:30 | call to method ToInt32 | Extensions.cs:24:9:24:46 | ...; | semmle.label | successor |
-| Extensions.cs:23:9:23:31 | ...; | Extensions.cs:23:28:23:29 | "" | semmle.label | successor |
-| Extensions.cs:23:28:23:29 | "" | Extensions.cs:23:9:23:30 | call to method ToInt32 | semmle.label | successor |
-| Extensions.cs:24:9:24:45 | call to method ToBool | Extensions.cs:25:9:25:34 | ...; | semmle.label | successor |
-| Extensions.cs:24:9:24:46 | ...; | Extensions.cs:24:27:24:32 | "true" | semmle.label | successor |
-| Extensions.cs:24:27:24:32 | "true" | Extensions.cs:24:35:24:44 | access to method Parse | semmle.label | successor |
-| Extensions.cs:24:35:24:44 | access to method Parse | Extensions.cs:24:35:24:44 | delegate creation of type Func | semmle.label | successor |
-| Extensions.cs:24:35:24:44 | delegate creation of type Func | Extensions.cs:24:9:24:45 | call to method ToBool | semmle.label | successor |
-| Extensions.cs:25:9:25:14 | "true" | Extensions.cs:25:23:25:32 | access to method Parse | semmle.label | successor |
-| Extensions.cs:25:9:25:33 | call to method ToBool | Extensions.cs:20:17:20:20 | exit Main (normal) | semmle.label | successor |
-| Extensions.cs:25:9:25:34 | ...; | Extensions.cs:25:9:25:14 | "true" | semmle.label | successor |
-| Extensions.cs:25:23:25:32 | access to method Parse | Extensions.cs:25:23:25:32 | delegate creation of type Func | semmle.label | successor |
-| Extensions.cs:25:23:25:32 | delegate creation of type Func | Extensions.cs:25:9:25:33 | call to method ToBool | semmle.label | successor |
-| Finally.cs:7:10:7:11 | enter M1 | Finally.cs:8:5:17:5 | {...} | semmle.label | successor |
-| Finally.cs:7:10:7:11 | exit M1 (abnormal) | Finally.cs:7:10:7:11 | exit M1 | semmle.label | successor |
-| Finally.cs:7:10:7:11 | exit M1 (normal) | Finally.cs:7:10:7:11 | exit M1 | semmle.label | successor |
-| Finally.cs:8:5:17:5 | {...} | Finally.cs:9:9:16:9 | try {...} ... | semmle.label | successor |
-| Finally.cs:9:9:16:9 | try {...} ... | Finally.cs:10:9:12:9 | {...} | semmle.label | successor |
-| Finally.cs:10:9:12:9 | {...} | Finally.cs:11:13:11:38 | ...; | semmle.label | successor |
-| Finally.cs:11:13:11:37 | call to method WriteLine | Finally.cs:14:9:16:9 | [finally: exception(Exception)] {...} | semmle.label | exception(Exception) |
-| Finally.cs:11:13:11:37 | call to method WriteLine | Finally.cs:14:9:16:9 | {...} | semmle.label | successor |
-| Finally.cs:11:13:11:38 | ...; | Finally.cs:11:31:11:36 | "Try1" | semmle.label | successor |
-| Finally.cs:11:31:11:36 | "Try1" | Finally.cs:11:13:11:37 | call to method WriteLine | semmle.label | successor |
-| Finally.cs:14:9:16:9 | [finally: exception(Exception)] {...} | Finally.cs:15:13:15:41 | [finally: exception(Exception)] ...; | semmle.label | successor |
-| Finally.cs:14:9:16:9 | {...} | Finally.cs:15:13:15:41 | ...; | semmle.label | successor |
-| Finally.cs:15:13:15:40 | [finally: exception(Exception)] call to method WriteLine | Finally.cs:7:10:7:11 | exit M1 (abnormal) | semmle.label | exception(Exception) |
-| Finally.cs:15:13:15:40 | call to method WriteLine | Finally.cs:7:10:7:11 | exit M1 (normal) | semmle.label | successor |
-| Finally.cs:15:13:15:41 | ...; | Finally.cs:15:31:15:39 | "Finally" | semmle.label | successor |
-| Finally.cs:15:13:15:41 | [finally: exception(Exception)] ...; | Finally.cs:15:31:15:39 | [finally: exception(Exception)] "Finally" | semmle.label | successor |
-| Finally.cs:15:31:15:39 | "Finally" | Finally.cs:15:13:15:40 | call to method WriteLine | semmle.label | successor |
-| Finally.cs:15:31:15:39 | [finally: exception(Exception)] "Finally" | Finally.cs:15:13:15:40 | [finally: exception(Exception)] call to method WriteLine | semmle.label | successor |
-| Finally.cs:19:10:19:11 | enter M2 | Finally.cs:20:5:52:5 | {...} | semmle.label | successor |
-| Finally.cs:19:10:19:11 | exit M2 (abnormal) | Finally.cs:19:10:19:11 | exit M2 | semmle.label | successor |
-| Finally.cs:19:10:19:11 | exit M2 (normal) | Finally.cs:19:10:19:11 | exit M2 | semmle.label | successor |
-| Finally.cs:20:5:52:5 | {...} | Finally.cs:21:9:51:9 | try {...} ... | semmle.label | successor |
-| Finally.cs:21:9:51:9 | try {...} ... | Finally.cs:22:9:25:9 | {...} | semmle.label | successor |
-| Finally.cs:22:9:25:9 | {...} | Finally.cs:23:13:23:38 | ...; | semmle.label | successor |
-| Finally.cs:23:13:23:37 | call to method WriteLine | Finally.cs:24:13:24:19 | return ...; | semmle.label | successor |
-| Finally.cs:23:13:23:37 | call to method WriteLine | Finally.cs:26:9:29:9 | [exception: Exception] catch (...) {...} | semmle.label | exception(Exception) |
-| Finally.cs:23:13:23:38 | ...; | Finally.cs:23:31:23:36 | "Try2" | semmle.label | successor |
-| Finally.cs:23:31:23:36 | "Try2" | Finally.cs:23:13:23:37 | call to method WriteLine | semmle.label | successor |
-| Finally.cs:24:13:24:19 | return ...; | Finally.cs:49:9:51:9 | [finally: return] {...} | semmle.label | return |
-| Finally.cs:26:9:29:9 | [exception: Exception] catch (...) {...} | Finally.cs:26:38:26:39 | [exception: Exception] IOException ex | semmle.label | match |
-| Finally.cs:26:9:29:9 | [exception: Exception] catch (...) {...} | Finally.cs:30:9:40:9 | [exception: Exception] catch (...) {...} | semmle.label | no-match |
-| Finally.cs:26:38:26:39 | [exception: Exception] IOException ex | Finally.cs:26:48:26:51 | [exception: Exception] true | semmle.label | successor |
-| Finally.cs:26:48:26:51 | [exception: Exception] true | Finally.cs:27:9:29:9 | {...} | semmle.label | true |
-| Finally.cs:27:9:29:9 | {...} | Finally.cs:28:13:28:18 | throw ...; | semmle.label | successor |
-| Finally.cs:28:13:28:18 | throw ...; | Finally.cs:49:9:51:9 | [finally: exception(IOException)] {...} | semmle.label | exception(IOException) |
-| Finally.cs:30:9:40:9 | [exception: Exception] catch (...) {...} | Finally.cs:30:41:30:42 | [exception: Exception] ArgumentException ex | semmle.label | match |
-| Finally.cs:30:9:40:9 | [exception: Exception] catch (...) {...} | Finally.cs:41:9:43:9 | [exception: Exception] catch (...) {...} | semmle.label | no-match |
-| Finally.cs:30:41:30:42 | [exception: Exception] ArgumentException ex | Finally.cs:31:9:40:9 | {...} | semmle.label | successor |
-| Finally.cs:31:9:40:9 | {...} | Finally.cs:32:13:39:13 | try {...} ... | semmle.label | successor |
-| Finally.cs:32:13:39:13 | try {...} ... | Finally.cs:33:13:35:13 | {...} | semmle.label | successor |
-| Finally.cs:33:13:35:13 | {...} | Finally.cs:34:17:34:32 | if (...) ... | semmle.label | successor |
-| Finally.cs:34:17:34:32 | if (...) ... | Finally.cs:34:21:34:24 | true | semmle.label | successor |
-| Finally.cs:34:21:34:24 | true | Finally.cs:34:27:34:32 | throw ...; | semmle.label | true |
-| Finally.cs:34:27:34:32 | throw ...; | Finally.cs:37:13:39:13 | [finally: exception(ArgumentException)] {...} | semmle.label | exception(ArgumentException) |
-| Finally.cs:37:13:39:13 | [finally: exception(ArgumentException)] {...} | Finally.cs:38:37:38:42 | [finally: exception(ArgumentException)] "Boo!" | semmle.label | successor |
-| Finally.cs:38:17:38:44 | [finally: exception(ArgumentException)] throw ...; | Finally.cs:49:9:51:9 | [finally: exception(Exception)] {...} | semmle.label | exception(Exception) |
-| Finally.cs:38:23:38:43 | [finally: exception(ArgumentException)] object creation of type Exception | Finally.cs:38:17:38:44 | [finally: exception(ArgumentException)] throw ...; | semmle.label | successor |
-| Finally.cs:38:37:38:42 | [finally: exception(ArgumentException)] "Boo!" | Finally.cs:38:23:38:43 | [finally: exception(ArgumentException)] object creation of type Exception | semmle.label | successor |
-| Finally.cs:41:9:43:9 | [exception: Exception] catch (...) {...} | Finally.cs:42:9:43:9 | {...} | semmle.label | match |
-| Finally.cs:42:9:43:9 | {...} | Finally.cs:49:9:51:9 | {...} | semmle.label | successor |
-| Finally.cs:49:9:51:9 | [finally: exception(Exception)] {...} | Finally.cs:50:13:50:41 | [finally: exception(Exception)] ...; | semmle.label | successor |
-| Finally.cs:49:9:51:9 | [finally: exception(IOException)] {...} | Finally.cs:50:13:50:41 | [finally: exception(IOException)] ...; | semmle.label | successor |
-| Finally.cs:49:9:51:9 | [finally: return] {...} | Finally.cs:50:13:50:41 | [finally: return] ...; | semmle.label | successor |
-| Finally.cs:49:9:51:9 | {...} | Finally.cs:50:13:50:41 | ...; | semmle.label | successor |
-| Finally.cs:50:13:50:40 | [finally: exception(Exception)] call to method WriteLine | Finally.cs:19:10:19:11 | exit M2 (abnormal) | semmle.label | exception(Exception) |
-| Finally.cs:50:13:50:40 | [finally: exception(IOException)] call to method WriteLine | Finally.cs:19:10:19:11 | exit M2 (abnormal) | semmle.label | exception(IOException) |
-| Finally.cs:50:13:50:40 | [finally: return] call to method WriteLine | Finally.cs:19:10:19:11 | exit M2 (normal) | semmle.label | return |
-| Finally.cs:50:13:50:40 | call to method WriteLine | Finally.cs:19:10:19:11 | exit M2 (normal) | semmle.label | successor |
-| Finally.cs:50:13:50:41 | ...; | Finally.cs:50:31:50:39 | "Finally" | semmle.label | successor |
-| Finally.cs:50:13:50:41 | [finally: exception(Exception)] ...; | Finally.cs:50:31:50:39 | [finally: exception(Exception)] "Finally" | semmle.label | successor |
-| Finally.cs:50:13:50:41 | [finally: exception(IOException)] ...; | Finally.cs:50:31:50:39 | [finally: exception(IOException)] "Finally" | semmle.label | successor |
-| Finally.cs:50:13:50:41 | [finally: return] ...; | Finally.cs:50:31:50:39 | [finally: return] "Finally" | semmle.label | successor |
-| Finally.cs:50:31:50:39 | "Finally" | Finally.cs:50:13:50:40 | call to method WriteLine | semmle.label | successor |
-| Finally.cs:50:31:50:39 | [finally: exception(Exception)] "Finally" | Finally.cs:50:13:50:40 | [finally: exception(Exception)] call to method WriteLine | semmle.label | successor |
-| Finally.cs:50:31:50:39 | [finally: exception(IOException)] "Finally" | Finally.cs:50:13:50:40 | [finally: exception(IOException)] call to method WriteLine | semmle.label | successor |
-| Finally.cs:50:31:50:39 | [finally: return] "Finally" | Finally.cs:50:13:50:40 | [finally: return] call to method WriteLine | semmle.label | successor |
-| Finally.cs:54:10:54:11 | enter M3 | Finally.cs:55:5:72:5 | {...} | semmle.label | successor |
-| Finally.cs:54:10:54:11 | exit M3 (abnormal) | Finally.cs:54:10:54:11 | exit M3 | semmle.label | successor |
-| Finally.cs:54:10:54:11 | exit M3 (normal) | Finally.cs:54:10:54:11 | exit M3 | semmle.label | successor |
-| Finally.cs:55:5:72:5 | {...} | Finally.cs:56:9:71:9 | try {...} ... | semmle.label | successor |
-| Finally.cs:56:9:71:9 | try {...} ... | Finally.cs:57:9:60:9 | {...} | semmle.label | successor |
-| Finally.cs:57:9:60:9 | {...} | Finally.cs:58:13:58:38 | ...; | semmle.label | successor |
-| Finally.cs:58:13:58:37 | call to method WriteLine | Finally.cs:59:13:59:19 | return ...; | semmle.label | successor |
-| Finally.cs:58:13:58:37 | call to method WriteLine | Finally.cs:61:9:64:9 | [exception: Exception] catch (...) {...} | semmle.label | exception(Exception) |
-| Finally.cs:58:13:58:38 | ...; | Finally.cs:58:31:58:36 | "Try3" | semmle.label | successor |
-| Finally.cs:58:31:58:36 | "Try3" | Finally.cs:58:13:58:37 | call to method WriteLine | semmle.label | successor |
-| Finally.cs:59:13:59:19 | return ...; | Finally.cs:69:9:71:9 | [finally: return] {...} | semmle.label | return |
-| Finally.cs:61:9:64:9 | [exception: Exception] catch (...) {...} | Finally.cs:61:38:61:39 | [exception: Exception] IOException ex | semmle.label | match |
-| Finally.cs:61:9:64:9 | [exception: Exception] catch (...) {...} | Finally.cs:65:9:67:9 | [exception: Exception] catch (...) {...} | semmle.label | no-match |
-| Finally.cs:61:38:61:39 | [exception: Exception] IOException ex | Finally.cs:61:48:61:51 | [exception: Exception] true | semmle.label | successor |
-| Finally.cs:61:48:61:51 | [exception: Exception] true | Finally.cs:62:9:64:9 | {...} | semmle.label | true |
-| Finally.cs:62:9:64:9 | {...} | Finally.cs:63:13:63:18 | throw ...; | semmle.label | successor |
-| Finally.cs:63:13:63:18 | throw ...; | Finally.cs:69:9:71:9 | [finally: exception(IOException)] {...} | semmle.label | exception(IOException) |
-| Finally.cs:65:9:67:9 | [exception: Exception] catch (...) {...} | Finally.cs:65:26:65:26 | [exception: Exception] Exception e | semmle.label | match |
-| Finally.cs:65:26:65:26 | [exception: Exception] Exception e | Finally.cs:65:35:65:35 | [exception: Exception] access to local variable e | semmle.label | successor |
-| Finally.cs:65:35:65:35 | [exception: Exception] access to local variable e | Finally.cs:65:35:65:43 | [exception: Exception] access to property Message | semmle.label | successor |
-| Finally.cs:65:35:65:43 | [exception: Exception] access to property Message | Finally.cs:65:48:65:51 | [exception: Exception] null | semmle.label | successor |
-| Finally.cs:65:35:65:51 | [exception: Exception] ... != ... | Finally.cs:66:9:67:9 | {...} | semmle.label | true |
-| Finally.cs:65:35:65:51 | [exception: Exception] ... != ... | Finally.cs:69:9:71:9 | [finally: exception(Exception)] {...} | semmle.label | exception(Exception) |
-| Finally.cs:65:48:65:51 | [exception: Exception] null | Finally.cs:65:35:65:51 | [exception: Exception] ... != ... | semmle.label | successor |
-| Finally.cs:66:9:67:9 | {...} | Finally.cs:69:9:71:9 | {...} | semmle.label | successor |
-| Finally.cs:69:9:71:9 | [finally: exception(Exception)] {...} | Finally.cs:70:13:70:41 | [finally: exception(Exception)] ...; | semmle.label | successor |
-| Finally.cs:69:9:71:9 | [finally: exception(IOException)] {...} | Finally.cs:70:13:70:41 | [finally: exception(IOException)] ...; | semmle.label | successor |
-| Finally.cs:69:9:71:9 | [finally: return] {...} | Finally.cs:70:13:70:41 | [finally: return] ...; | semmle.label | successor |
-| Finally.cs:69:9:71:9 | {...} | Finally.cs:70:13:70:41 | ...; | semmle.label | successor |
-| Finally.cs:70:13:70:40 | [finally: exception(Exception)] call to method WriteLine | Finally.cs:54:10:54:11 | exit M3 (abnormal) | semmle.label | exception(Exception) |
-| Finally.cs:70:13:70:40 | [finally: exception(IOException)] call to method WriteLine | Finally.cs:54:10:54:11 | exit M3 (abnormal) | semmle.label | exception(IOException) |
-| Finally.cs:70:13:70:40 | [finally: return] call to method WriteLine | Finally.cs:54:10:54:11 | exit M3 (normal) | semmle.label | return |
-| Finally.cs:70:13:70:40 | call to method WriteLine | Finally.cs:54:10:54:11 | exit M3 (normal) | semmle.label | successor |
-| Finally.cs:70:13:70:41 | ...; | Finally.cs:70:31:70:39 | "Finally" | semmle.label | successor |
-| Finally.cs:70:13:70:41 | [finally: exception(Exception)] ...; | Finally.cs:70:31:70:39 | [finally: exception(Exception)] "Finally" | semmle.label | successor |
-| Finally.cs:70:13:70:41 | [finally: exception(IOException)] ...; | Finally.cs:70:31:70:39 | [finally: exception(IOException)] "Finally" | semmle.label | successor |
-| Finally.cs:70:13:70:41 | [finally: return] ...; | Finally.cs:70:31:70:39 | [finally: return] "Finally" | semmle.label | successor |
-| Finally.cs:70:31:70:39 | "Finally" | Finally.cs:70:13:70:40 | call to method WriteLine | semmle.label | successor |
-| Finally.cs:70:31:70:39 | [finally: exception(Exception)] "Finally" | Finally.cs:70:13:70:40 | [finally: exception(Exception)] call to method WriteLine | semmle.label | successor |
-| Finally.cs:70:31:70:39 | [finally: exception(IOException)] "Finally" | Finally.cs:70:13:70:40 | [finally: exception(IOException)] call to method WriteLine | semmle.label | successor |
-| Finally.cs:70:31:70:39 | [finally: return] "Finally" | Finally.cs:70:13:70:40 | [finally: return] call to method WriteLine | semmle.label | successor |
-| Finally.cs:74:10:74:11 | enter M4 | Finally.cs:75:5:101:5 | {...} | semmle.label | successor |
-| Finally.cs:74:10:74:11 | exit M4 (abnormal) | Finally.cs:74:10:74:11 | exit M4 | semmle.label | successor |
-| Finally.cs:74:10:74:11 | exit M4 (normal) | Finally.cs:74:10:74:11 | exit M4 | semmle.label | successor |
-| Finally.cs:75:5:101:5 | {...} | Finally.cs:76:9:76:19 | ... ...; | semmle.label | successor |
-| Finally.cs:76:9:76:19 | ... ...; | Finally.cs:76:17:76:18 | 10 | semmle.label | successor |
-| Finally.cs:76:13:76:18 | Int32 i = ... | Finally.cs:77:9:100:9 | while (...) ... | semmle.label | successor |
-| Finally.cs:76:17:76:18 | 10 | Finally.cs:76:13:76:18 | Int32 i = ... | semmle.label | successor |
-| Finally.cs:77:9:100:9 | while (...) ... | Finally.cs:77:16:77:16 | access to local variable i | semmle.label | successor |
-| Finally.cs:77:16:77:16 | access to local variable i | Finally.cs:77:20:77:20 | 0 | semmle.label | successor |
-| Finally.cs:77:16:77:20 | ... > ... | Finally.cs:74:10:74:11 | exit M4 (normal) | semmle.label | false |
-| Finally.cs:77:16:77:20 | ... > ... | Finally.cs:78:9:100:9 | {...} | semmle.label | true |
-| Finally.cs:77:20:77:20 | 0 | Finally.cs:77:16:77:20 | ... > ... | semmle.label | successor |
-| Finally.cs:78:9:100:9 | {...} | Finally.cs:79:13:99:13 | try {...} ... | semmle.label | successor |
-| Finally.cs:79:13:99:13 | try {...} ... | Finally.cs:80:13:87:13 | {...} | semmle.label | successor |
-| Finally.cs:80:13:87:13 | {...} | Finally.cs:81:17:82:27 | if (...) ... | semmle.label | successor |
-| Finally.cs:81:17:82:27 | if (...) ... | Finally.cs:81:21:81:21 | access to local variable i | semmle.label | successor |
-| Finally.cs:81:21:81:21 | access to local variable i | Finally.cs:81:26:81:26 | 0 | semmle.label | successor |
-| Finally.cs:81:21:81:26 | ... == ... | Finally.cs:82:21:82:27 | return ...; | semmle.label | true |
-| Finally.cs:81:21:81:26 | ... == ... | Finally.cs:83:17:84:29 | if (...) ... | semmle.label | false |
-| Finally.cs:81:26:81:26 | 0 | Finally.cs:81:21:81:26 | ... == ... | semmle.label | successor |
-| Finally.cs:82:21:82:27 | return ...; | Finally.cs:89:13:99:13 | [finally: return] {...} | semmle.label | return |
-| Finally.cs:83:17:84:29 | if (...) ... | Finally.cs:83:21:83:21 | access to local variable i | semmle.label | successor |
-| Finally.cs:83:21:83:21 | access to local variable i | Finally.cs:83:26:83:26 | 1 | semmle.label | successor |
-| Finally.cs:83:21:83:26 | ... == ... | Finally.cs:84:21:84:29 | continue; | semmle.label | true |
-| Finally.cs:83:21:83:26 | ... == ... | Finally.cs:85:17:86:26 | if (...) ... | semmle.label | false |
-| Finally.cs:83:26:83:26 | 1 | Finally.cs:83:21:83:26 | ... == ... | semmle.label | successor |
-| Finally.cs:84:21:84:29 | continue; | Finally.cs:89:13:99:13 | [finally: continue] {...} | semmle.label | continue |
-| Finally.cs:85:17:86:26 | if (...) ... | Finally.cs:85:21:85:21 | access to local variable i | semmle.label | successor |
-| Finally.cs:85:21:85:21 | access to local variable i | Finally.cs:85:26:85:26 | 2 | semmle.label | successor |
-| Finally.cs:85:21:85:26 | ... == ... | Finally.cs:86:21:86:26 | break; | semmle.label | true |
-| Finally.cs:85:21:85:26 | ... == ... | Finally.cs:89:13:99:13 | {...} | semmle.label | false |
-| Finally.cs:85:26:85:26 | 2 | Finally.cs:85:21:85:26 | ... == ... | semmle.label | successor |
-| Finally.cs:86:21:86:26 | break; | Finally.cs:89:13:99:13 | [finally: break] {...} | semmle.label | break |
-| Finally.cs:89:13:99:13 | [finally: break] {...} | Finally.cs:90:17:98:17 | [finally: break] try {...} ... | semmle.label | successor |
-| Finally.cs:89:13:99:13 | [finally: continue] {...} | Finally.cs:90:17:98:17 | [finally: continue] try {...} ... | semmle.label | successor |
-| Finally.cs:89:13:99:13 | [finally: return] {...} | Finally.cs:90:17:98:17 | [finally: return] try {...} ... | semmle.label | successor |
-| Finally.cs:89:13:99:13 | {...} | Finally.cs:90:17:98:17 | try {...} ... | semmle.label | successor |
-| Finally.cs:90:17:98:17 | [finally: break] try {...} ... | Finally.cs:91:17:94:17 | [finally: break] {...} | semmle.label | successor |
-| Finally.cs:90:17:98:17 | [finally: continue] try {...} ... | Finally.cs:91:17:94:17 | [finally: continue] {...} | semmle.label | successor |
-| Finally.cs:90:17:98:17 | [finally: return] try {...} ... | Finally.cs:91:17:94:17 | [finally: return] {...} | semmle.label | successor |
-| Finally.cs:90:17:98:17 | try {...} ... | Finally.cs:91:17:94:17 | {...} | semmle.label | successor |
-| Finally.cs:91:17:94:17 | [finally: break] {...} | Finally.cs:92:21:93:46 | [finally: break] if (...) ... | semmle.label | successor |
-| Finally.cs:91:17:94:17 | [finally: continue] {...} | Finally.cs:92:21:93:46 | [finally: continue] if (...) ... | semmle.label | successor |
-| Finally.cs:91:17:94:17 | [finally: return] {...} | Finally.cs:92:21:93:46 | [finally: return] if (...) ... | semmle.label | successor |
-| Finally.cs:91:17:94:17 | {...} | Finally.cs:92:21:93:46 | if (...) ... | semmle.label | successor |
-| Finally.cs:92:21:93:46 | [finally: break] if (...) ... | Finally.cs:92:25:92:25 | [finally: break] access to local variable i | semmle.label | successor |
-| Finally.cs:92:21:93:46 | [finally: continue] if (...) ... | Finally.cs:92:25:92:25 | [finally: continue] access to local variable i | semmle.label | successor |
-| Finally.cs:92:21:93:46 | [finally: return] if (...) ... | Finally.cs:92:25:92:25 | [finally: return] access to local variable i | semmle.label | successor |
-| Finally.cs:92:21:93:46 | if (...) ... | Finally.cs:92:25:92:25 | access to local variable i | semmle.label | successor |
-| Finally.cs:92:25:92:25 | [finally: break] access to local variable i | Finally.cs:92:30:92:30 | [finally: break] 3 | semmle.label | successor |
-| Finally.cs:92:25:92:25 | [finally: continue] access to local variable i | Finally.cs:92:30:92:30 | [finally: continue] 3 | semmle.label | successor |
-| Finally.cs:92:25:92:25 | [finally: return] access to local variable i | Finally.cs:92:30:92:30 | [finally: return] 3 | semmle.label | successor |
-| Finally.cs:92:25:92:25 | access to local variable i | Finally.cs:92:30:92:30 | 3 | semmle.label | successor |
-| Finally.cs:92:25:92:30 | ... == ... | Finally.cs:93:31:93:45 | object creation of type Exception | semmle.label | true |
-| Finally.cs:92:25:92:30 | ... == ... | Finally.cs:96:17:98:17 | {...} | semmle.label | false |
-| Finally.cs:92:25:92:30 | [finally: break] ... == ... | Finally.cs:93:31:93:45 | [finally: break] object creation of type Exception | semmle.label | true |
-| Finally.cs:92:25:92:30 | [finally: break] ... == ... | Finally.cs:96:17:98:17 | [finally: break] {...} | semmle.label | false |
-| Finally.cs:92:25:92:30 | [finally: continue] ... == ... | Finally.cs:93:31:93:45 | [finally: continue] object creation of type Exception | semmle.label | true |
-| Finally.cs:92:25:92:30 | [finally: continue] ... == ... | Finally.cs:96:17:98:17 | [finally: continue] {...} | semmle.label | false |
-| Finally.cs:92:25:92:30 | [finally: return] ... == ... | Finally.cs:93:31:93:45 | [finally: return] object creation of type Exception | semmle.label | true |
-| Finally.cs:92:25:92:30 | [finally: return] ... == ... | Finally.cs:96:17:98:17 | [finally: return] {...} | semmle.label | false |
-| Finally.cs:92:30:92:30 | 3 | Finally.cs:92:25:92:30 | ... == ... | semmle.label | successor |
-| Finally.cs:92:30:92:30 | [finally: break] 3 | Finally.cs:92:25:92:30 | [finally: break] ... == ... | semmle.label | successor |
-| Finally.cs:92:30:92:30 | [finally: continue] 3 | Finally.cs:92:25:92:30 | [finally: continue] ... == ... | semmle.label | successor |
-| Finally.cs:92:30:92:30 | [finally: return] 3 | Finally.cs:92:25:92:30 | [finally: return] ... == ... | semmle.label | successor |
-| Finally.cs:93:25:93:46 | [finally: break] throw ...; | Finally.cs:96:17:98:17 | [finally: break, finally(1): exception(Exception)] {...} | semmle.label | exception(Exception) |
-| Finally.cs:93:25:93:46 | [finally: continue] throw ...; | Finally.cs:96:17:98:17 | [finally: continue, finally(1): exception(Exception)] {...} | semmle.label | exception(Exception) |
-| Finally.cs:93:25:93:46 | [finally: return] throw ...; | Finally.cs:96:17:98:17 | [finally: return, finally(1): exception(Exception)] {...} | semmle.label | exception(Exception) |
-| Finally.cs:93:25:93:46 | throw ...; | Finally.cs:96:17:98:17 | [finally(1): exception(Exception)] {...} | semmle.label | exception(Exception) |
-| Finally.cs:93:31:93:45 | [finally: break] object creation of type Exception | Finally.cs:93:25:93:46 | [finally: break] throw ...; | semmle.label | successor |
-| Finally.cs:93:31:93:45 | [finally: break] object creation of type Exception | Finally.cs:96:17:98:17 | [finally: break, finally(1): exception(Exception)] {...} | semmle.label | exception(Exception) |
-| Finally.cs:93:31:93:45 | [finally: continue] object creation of type Exception | Finally.cs:93:25:93:46 | [finally: continue] throw ...; | semmle.label | successor |
-| Finally.cs:93:31:93:45 | [finally: continue] object creation of type Exception | Finally.cs:96:17:98:17 | [finally: continue, finally(1): exception(Exception)] {...} | semmle.label | exception(Exception) |
-| Finally.cs:93:31:93:45 | [finally: return] object creation of type Exception | Finally.cs:93:25:93:46 | [finally: return] throw ...; | semmle.label | successor |
-| Finally.cs:93:31:93:45 | [finally: return] object creation of type Exception | Finally.cs:96:17:98:17 | [finally: return, finally(1): exception(Exception)] {...} | semmle.label | exception(Exception) |
-| Finally.cs:93:31:93:45 | object creation of type Exception | Finally.cs:93:25:93:46 | throw ...; | semmle.label | successor |
-| Finally.cs:93:31:93:45 | object creation of type Exception | Finally.cs:96:17:98:17 | [finally(1): exception(Exception)] {...} | semmle.label | exception(Exception) |
-| Finally.cs:96:17:98:17 | [finally(1): exception(Exception)] {...} | Finally.cs:97:21:97:24 | [finally(1): exception(Exception)] ...; | semmle.label | successor |
-| Finally.cs:96:17:98:17 | [finally: break, finally(1): exception(Exception)] {...} | Finally.cs:97:21:97:24 | [finally: break, finally(1): exception(Exception)] ...; | semmle.label | successor |
-| Finally.cs:96:17:98:17 | [finally: break] {...} | Finally.cs:97:21:97:24 | [finally: break] ...; | semmle.label | successor |
-| Finally.cs:96:17:98:17 | [finally: continue, finally(1): exception(Exception)] {...} | Finally.cs:97:21:97:24 | [finally: continue, finally(1): exception(Exception)] ...; | semmle.label | successor |
-| Finally.cs:96:17:98:17 | [finally: continue] {...} | Finally.cs:97:21:97:24 | [finally: continue] ...; | semmle.label | successor |
-| Finally.cs:96:17:98:17 | [finally: return, finally(1): exception(Exception)] {...} | Finally.cs:97:21:97:24 | [finally: return, finally(1): exception(Exception)] ...; | semmle.label | successor |
-| Finally.cs:96:17:98:17 | [finally: return] {...} | Finally.cs:97:21:97:24 | [finally: return] ...; | semmle.label | successor |
-| Finally.cs:96:17:98:17 | {...} | Finally.cs:97:21:97:24 | ...; | semmle.label | successor |
-| Finally.cs:97:21:97:21 | [finally(1): exception(Exception)] access to local variable i | Finally.cs:97:21:97:23 | [finally(1): exception(Exception)] ...-- | semmle.label | successor |
-| Finally.cs:97:21:97:21 | [finally: break, finally(1): exception(Exception)] access to local variable i | Finally.cs:97:21:97:23 | [finally: break, finally(1): exception(Exception)] ...-- | semmle.label | successor |
-| Finally.cs:97:21:97:21 | [finally: break] access to local variable i | Finally.cs:97:21:97:23 | [finally: break] ...-- | semmle.label | successor |
-| Finally.cs:97:21:97:21 | [finally: continue, finally(1): exception(Exception)] access to local variable i | Finally.cs:97:21:97:23 | [finally: continue, finally(1): exception(Exception)] ...-- | semmle.label | successor |
-| Finally.cs:97:21:97:21 | [finally: continue] access to local variable i | Finally.cs:97:21:97:23 | [finally: continue] ...-- | semmle.label | successor |
-| Finally.cs:97:21:97:21 | [finally: return, finally(1): exception(Exception)] access to local variable i | Finally.cs:97:21:97:23 | [finally: return, finally(1): exception(Exception)] ...-- | semmle.label | successor |
-| Finally.cs:97:21:97:21 | [finally: return] access to local variable i | Finally.cs:97:21:97:23 | [finally: return] ...-- | semmle.label | successor |
-| Finally.cs:97:21:97:21 | access to local variable i | Finally.cs:97:21:97:23 | ...-- | semmle.label | successor |
-| Finally.cs:97:21:97:23 | ...-- | Finally.cs:77:16:77:16 | access to local variable i | semmle.label | successor |
-| Finally.cs:97:21:97:23 | [finally(1): exception(Exception)] ...-- | Finally.cs:74:10:74:11 | exit M4 (abnormal) | semmle.label | exception(Exception) |
-| Finally.cs:97:21:97:23 | [finally: break, finally(1): exception(Exception)] ...-- | Finally.cs:74:10:74:11 | exit M4 (abnormal) | semmle.label | exception(Exception) |
-| Finally.cs:97:21:97:23 | [finally: break] ...-- | Finally.cs:74:10:74:11 | exit M4 (normal) | semmle.label | break |
-| Finally.cs:97:21:97:23 | [finally: continue, finally(1): exception(Exception)] ...-- | Finally.cs:74:10:74:11 | exit M4 (abnormal) | semmle.label | exception(Exception) |
-| Finally.cs:97:21:97:23 | [finally: continue] ...-- | Finally.cs:77:16:77:16 | access to local variable i | semmle.label | continue |
-| Finally.cs:97:21:97:23 | [finally: return, finally(1): exception(Exception)] ...-- | Finally.cs:74:10:74:11 | exit M4 (abnormal) | semmle.label | exception(Exception) |
-| Finally.cs:97:21:97:23 | [finally: return] ...-- | Finally.cs:74:10:74:11 | exit M4 (normal) | semmle.label | return |
-| Finally.cs:97:21:97:24 | ...; | Finally.cs:97:21:97:21 | access to local variable i | semmle.label | successor |
-| Finally.cs:97:21:97:24 | [finally(1): exception(Exception)] ...; | Finally.cs:97:21:97:21 | [finally(1): exception(Exception)] access to local variable i | semmle.label | successor |
-| Finally.cs:97:21:97:24 | [finally: break, finally(1): exception(Exception)] ...; | Finally.cs:97:21:97:21 | [finally: break, finally(1): exception(Exception)] access to local variable i | semmle.label | successor |
-| Finally.cs:97:21:97:24 | [finally: break] ...; | Finally.cs:97:21:97:21 | [finally: break] access to local variable i | semmle.label | successor |
-| Finally.cs:97:21:97:24 | [finally: continue, finally(1): exception(Exception)] ...; | Finally.cs:97:21:97:21 | [finally: continue, finally(1): exception(Exception)] access to local variable i | semmle.label | successor |
-| Finally.cs:97:21:97:24 | [finally: continue] ...; | Finally.cs:97:21:97:21 | [finally: continue] access to local variable i | semmle.label | successor |
-| Finally.cs:97:21:97:24 | [finally: return, finally(1): exception(Exception)] ...; | Finally.cs:97:21:97:21 | [finally: return, finally(1): exception(Exception)] access to local variable i | semmle.label | successor |
-| Finally.cs:97:21:97:24 | [finally: return] ...; | Finally.cs:97:21:97:21 | [finally: return] access to local variable i | semmle.label | successor |
-| Finally.cs:103:10:103:11 | enter M5 | Finally.cs:104:5:119:5 | {...} | semmle.label | successor |
-| Finally.cs:103:10:103:11 | exit M5 (abnormal) | Finally.cs:103:10:103:11 | exit M5 | semmle.label | successor |
-| Finally.cs:103:10:103:11 | exit M5 (normal) | Finally.cs:103:10:103:11 | exit M5 | semmle.label | successor |
-| Finally.cs:104:5:119:5 | {...} | Finally.cs:105:9:118:9 | try {...} ... | semmle.label | successor |
-| Finally.cs:105:9:118:9 | try {...} ... | Finally.cs:106:9:111:9 | {...} | semmle.label | successor |
-| Finally.cs:106:9:111:9 | {...} | Finally.cs:107:13:108:23 | if (...) ... | semmle.label | successor |
-| Finally.cs:107:13:108:23 | if (...) ... | Finally.cs:107:17:107:21 | this access | semmle.label | successor |
-| Finally.cs:107:17:107:21 | access to field Field | Finally.cs:107:17:107:28 | access to property Length | semmle.label | successor |
-| Finally.cs:107:17:107:21 | access to field Field | Finally.cs:113:9:118:9 | [finally: exception(NullReferenceException)] {...} | semmle.label | exception(NullReferenceException) |
-| Finally.cs:107:17:107:21 | this access | Finally.cs:107:17:107:21 | access to field Field | semmle.label | successor |
-| Finally.cs:107:17:107:28 | access to property Length | Finally.cs:107:33:107:33 | 0 | semmle.label | successor |
-| Finally.cs:107:17:107:28 | access to property Length | Finally.cs:113:9:118:9 | [finally: exception(Exception)] {...} | semmle.label | exception(Exception) |
-| Finally.cs:107:17:107:28 | access to property Length | Finally.cs:113:9:118:9 | [finally: exception(NullReferenceException)] {...} | semmle.label | exception(NullReferenceException) |
-| Finally.cs:107:17:107:33 | ... == ... | Finally.cs:108:17:108:23 | return ...; | semmle.label | true |
-| Finally.cs:107:17:107:33 | ... == ... | Finally.cs:109:13:110:49 | if (...) ... | semmle.label | false |
-| Finally.cs:107:33:107:33 | 0 | Finally.cs:107:17:107:33 | ... == ... | semmle.label | successor |
-| Finally.cs:108:17:108:23 | return ...; | Finally.cs:113:9:118:9 | [finally: return] {...} | semmle.label | return |
-| Finally.cs:109:13:110:49 | if (...) ... | Finally.cs:109:17:109:21 | this access | semmle.label | successor |
-| Finally.cs:109:17:109:21 | access to field Field | Finally.cs:109:17:109:28 | access to property Length | semmle.label | successor |
-| Finally.cs:109:17:109:21 | access to field Field | Finally.cs:113:9:118:9 | [finally: exception(NullReferenceException)] {...} | semmle.label | exception(NullReferenceException) |
-| Finally.cs:109:17:109:21 | this access | Finally.cs:109:17:109:21 | access to field Field | semmle.label | successor |
-| Finally.cs:109:17:109:28 | access to property Length | Finally.cs:109:33:109:33 | 1 | semmle.label | successor |
-| Finally.cs:109:17:109:28 | access to property Length | Finally.cs:113:9:118:9 | [finally: exception(Exception)] {...} | semmle.label | exception(Exception) |
-| Finally.cs:109:17:109:28 | access to property Length | Finally.cs:113:9:118:9 | [finally: exception(NullReferenceException)] {...} | semmle.label | exception(NullReferenceException) |
-| Finally.cs:109:17:109:33 | ... == ... | Finally.cs:110:23:110:48 | object creation of type OutOfMemoryException | semmle.label | true |
-| Finally.cs:109:17:109:33 | ... == ... | Finally.cs:113:9:118:9 | {...} | semmle.label | false |
-| Finally.cs:109:33:109:33 | 1 | Finally.cs:109:17:109:33 | ... == ... | semmle.label | successor |
-| Finally.cs:110:17:110:49 | throw ...; | Finally.cs:113:9:118:9 | [finally: exception(OutOfMemoryException)] {...} | semmle.label | exception(OutOfMemoryException) |
-| Finally.cs:110:23:110:48 | object creation of type OutOfMemoryException | Finally.cs:110:17:110:49 | throw ...; | semmle.label | successor |
-| Finally.cs:110:23:110:48 | object creation of type OutOfMemoryException | Finally.cs:113:9:118:9 | [finally: exception(Exception)] {...} | semmle.label | exception(Exception) |
-| Finally.cs:113:9:118:9 | [finally: exception(Exception)] {...} | Finally.cs:114:13:115:41 | [finally: exception(Exception)] if (...) ... | semmle.label | successor |
-| Finally.cs:113:9:118:9 | [finally: exception(NullReferenceException)] {...} | Finally.cs:114:13:115:41 | [finally: exception(NullReferenceException)] if (...) ... | semmle.label | successor |
-| Finally.cs:113:9:118:9 | [finally: exception(OutOfMemoryException)] {...} | Finally.cs:114:13:115:41 | [finally: exception(OutOfMemoryException)] if (...) ... | semmle.label | successor |
-| Finally.cs:113:9:118:9 | [finally: return] {...} | Finally.cs:114:13:115:41 | [finally: return] if (...) ... | semmle.label | successor |
-| Finally.cs:113:9:118:9 | {...} | Finally.cs:114:13:115:41 | if (...) ... | semmle.label | successor |
-| Finally.cs:114:13:115:41 | [finally: exception(Exception)] if (...) ... | Finally.cs:114:19:114:23 | [finally: exception(Exception)] this access | semmle.label | successor |
-| Finally.cs:114:13:115:41 | [finally: exception(NullReferenceException)] if (...) ... | Finally.cs:114:19:114:23 | [finally: exception(NullReferenceException)] this access | semmle.label | successor |
-| Finally.cs:114:13:115:41 | [finally: exception(OutOfMemoryException)] if (...) ... | Finally.cs:114:19:114:23 | [finally: exception(OutOfMemoryException)] this access | semmle.label | successor |
-| Finally.cs:114:13:115:41 | [finally: return] if (...) ... | Finally.cs:114:19:114:23 | [finally: return] this access | semmle.label | successor |
-| Finally.cs:114:13:115:41 | if (...) ... | Finally.cs:114:19:114:23 | this access | semmle.label | successor |
-| Finally.cs:114:17:114:36 | [false, finally: exception(Exception)] !... | Finally.cs:116:13:117:37 | [finally: exception(Exception)] if (...) ... | semmle.label | false |
-| Finally.cs:114:17:114:36 | [false, finally: exception(NullReferenceException)] !... | Finally.cs:116:13:117:37 | [finally: exception(NullReferenceException)] if (...) ... | semmle.label | false |
-| Finally.cs:114:17:114:36 | [false, finally: exception(OutOfMemoryException)] !... | Finally.cs:116:13:117:37 | [finally: exception(OutOfMemoryException)] if (...) ... | semmle.label | false |
-| Finally.cs:114:17:114:36 | [false, finally: return] !... | Finally.cs:116:13:117:37 | [finally: return] if (...) ... | semmle.label | false |
-| Finally.cs:114:17:114:36 | [false] !... | Finally.cs:116:13:117:37 | if (...) ... | semmle.label | false |
-| Finally.cs:114:17:114:36 | [true, finally: exception(Exception)] !... | Finally.cs:115:17:115:41 | [finally: exception(Exception)] ...; | semmle.label | true |
-| Finally.cs:114:17:114:36 | [true, finally: exception(NullReferenceException)] !... | Finally.cs:115:17:115:41 | [finally: exception(NullReferenceException)] ...; | semmle.label | true |
-| Finally.cs:114:17:114:36 | [true, finally: exception(OutOfMemoryException)] !... | Finally.cs:115:17:115:41 | [finally: exception(OutOfMemoryException)] ...; | semmle.label | true |
-| Finally.cs:114:17:114:36 | [true, finally: return] !... | Finally.cs:115:17:115:41 | [finally: return] ...; | semmle.label | true |
-| Finally.cs:114:17:114:36 | [true] !... | Finally.cs:115:17:115:41 | ...; | semmle.label | true |
-| Finally.cs:114:19:114:23 | [finally: exception(Exception)] access to field Field | Finally.cs:114:19:114:30 | [finally: exception(Exception)] access to property Length | semmle.label | successor |
-| Finally.cs:114:19:114:23 | [finally: exception(Exception)] this access | Finally.cs:114:19:114:23 | [finally: exception(Exception)] access to field Field | semmle.label | successor |
-| Finally.cs:114:19:114:23 | [finally: exception(NullReferenceException)] access to field Field | Finally.cs:114:19:114:30 | [finally: exception(NullReferenceException)] access to property Length | semmle.label | successor |
-| Finally.cs:114:19:114:23 | [finally: exception(NullReferenceException)] this access | Finally.cs:114:19:114:23 | [finally: exception(NullReferenceException)] access to field Field | semmle.label | successor |
-| Finally.cs:114:19:114:23 | [finally: exception(OutOfMemoryException)] access to field Field | Finally.cs:114:19:114:30 | [finally: exception(OutOfMemoryException)] access to property Length | semmle.label | successor |
-| Finally.cs:114:19:114:23 | [finally: exception(OutOfMemoryException)] this access | Finally.cs:114:19:114:23 | [finally: exception(OutOfMemoryException)] access to field Field | semmle.label | successor |
-| Finally.cs:114:19:114:23 | [finally: return] access to field Field | Finally.cs:114:19:114:30 | [finally: return] access to property Length | semmle.label | successor |
-| Finally.cs:114:19:114:23 | [finally: return] this access | Finally.cs:114:19:114:23 | [finally: return] access to field Field | semmle.label | successor |
-| Finally.cs:114:19:114:23 | access to field Field | Finally.cs:114:19:114:30 | access to property Length | semmle.label | successor |
-| Finally.cs:114:19:114:23 | this access | Finally.cs:114:19:114:23 | access to field Field | semmle.label | successor |
-| Finally.cs:114:19:114:30 | [finally: exception(Exception)] access to property Length | Finally.cs:114:35:114:35 | [finally: exception(Exception)] 0 | semmle.label | successor |
-| Finally.cs:114:19:114:30 | [finally: exception(NullReferenceException)] access to property Length | Finally.cs:114:35:114:35 | [finally: exception(NullReferenceException)] 0 | semmle.label | successor |
-| Finally.cs:114:19:114:30 | [finally: exception(OutOfMemoryException)] access to property Length | Finally.cs:114:35:114:35 | [finally: exception(OutOfMemoryException)] 0 | semmle.label | successor |
-| Finally.cs:114:19:114:30 | [finally: return] access to property Length | Finally.cs:114:35:114:35 | [finally: return] 0 | semmle.label | successor |
-| Finally.cs:114:19:114:30 | access to property Length | Finally.cs:114:35:114:35 | 0 | semmle.label | successor |
-| Finally.cs:114:19:114:35 | ... == ... | Finally.cs:114:17:114:36 | [false] !... | semmle.label | true |
-| Finally.cs:114:19:114:35 | ... == ... | Finally.cs:114:17:114:36 | [true] !... | semmle.label | false |
-| Finally.cs:114:19:114:35 | [finally: exception(Exception)] ... == ... | Finally.cs:114:17:114:36 | [false, finally: exception(Exception)] !... | semmle.label | true |
-| Finally.cs:114:19:114:35 | [finally: exception(Exception)] ... == ... | Finally.cs:114:17:114:36 | [true, finally: exception(Exception)] !... | semmle.label | false |
-| Finally.cs:114:19:114:35 | [finally: exception(NullReferenceException)] ... == ... | Finally.cs:114:17:114:36 | [false, finally: exception(NullReferenceException)] !... | semmle.label | true |
-| Finally.cs:114:19:114:35 | [finally: exception(NullReferenceException)] ... == ... | Finally.cs:114:17:114:36 | [true, finally: exception(NullReferenceException)] !... | semmle.label | false |
-| Finally.cs:114:19:114:35 | [finally: exception(OutOfMemoryException)] ... == ... | Finally.cs:114:17:114:36 | [false, finally: exception(OutOfMemoryException)] !... | semmle.label | true |
-| Finally.cs:114:19:114:35 | [finally: exception(OutOfMemoryException)] ... == ... | Finally.cs:114:17:114:36 | [true, finally: exception(OutOfMemoryException)] !... | semmle.label | false |
-| Finally.cs:114:19:114:35 | [finally: return] ... == ... | Finally.cs:114:17:114:36 | [false, finally: return] !... | semmle.label | true |
-| Finally.cs:114:19:114:35 | [finally: return] ... == ... | Finally.cs:114:17:114:36 | [true, finally: return] !... | semmle.label | false |
-| Finally.cs:114:35:114:35 | 0 | Finally.cs:114:19:114:35 | ... == ... | semmle.label | successor |
-| Finally.cs:114:35:114:35 | [finally: exception(Exception)] 0 | Finally.cs:114:19:114:35 | [finally: exception(Exception)] ... == ... | semmle.label | successor |
-| Finally.cs:114:35:114:35 | [finally: exception(NullReferenceException)] 0 | Finally.cs:114:19:114:35 | [finally: exception(NullReferenceException)] ... == ... | semmle.label | successor |
-| Finally.cs:114:35:114:35 | [finally: exception(OutOfMemoryException)] 0 | Finally.cs:114:19:114:35 | [finally: exception(OutOfMemoryException)] ... == ... | semmle.label | successor |
-| Finally.cs:114:35:114:35 | [finally: return] 0 | Finally.cs:114:19:114:35 | [finally: return] ... == ... | semmle.label | successor |
-| Finally.cs:115:17:115:40 | [finally: exception(Exception)] call to method WriteLine | Finally.cs:116:13:117:37 | [finally: exception(Exception)] if (...) ... | semmle.label | successor |
-| Finally.cs:115:17:115:40 | [finally: exception(NullReferenceException)] call to method WriteLine | Finally.cs:116:13:117:37 | [finally: exception(NullReferenceException)] if (...) ... | semmle.label | successor |
-| Finally.cs:115:17:115:40 | [finally: exception(OutOfMemoryException)] call to method WriteLine | Finally.cs:116:13:117:37 | [finally: exception(OutOfMemoryException)] if (...) ... | semmle.label | successor |
-| Finally.cs:115:17:115:40 | [finally: return] call to method WriteLine | Finally.cs:116:13:117:37 | [finally: return] if (...) ... | semmle.label | successor |
-| Finally.cs:115:17:115:40 | call to method WriteLine | Finally.cs:116:13:117:37 | if (...) ... | semmle.label | successor |
-| Finally.cs:115:17:115:41 | ...; | Finally.cs:115:35:115:39 | this access | semmle.label | successor |
-| Finally.cs:115:17:115:41 | [finally: exception(Exception)] ...; | Finally.cs:115:35:115:39 | [finally: exception(Exception)] this access | semmle.label | successor |
-| Finally.cs:115:17:115:41 | [finally: exception(NullReferenceException)] ...; | Finally.cs:115:35:115:39 | [finally: exception(NullReferenceException)] this access | semmle.label | successor |
-| Finally.cs:115:17:115:41 | [finally: exception(OutOfMemoryException)] ...; | Finally.cs:115:35:115:39 | [finally: exception(OutOfMemoryException)] this access | semmle.label | successor |
-| Finally.cs:115:17:115:41 | [finally: return] ...; | Finally.cs:115:35:115:39 | [finally: return] this access | semmle.label | successor |
-| Finally.cs:115:35:115:39 | [finally: exception(Exception)] access to field Field | Finally.cs:115:17:115:40 | [finally: exception(Exception)] call to method WriteLine | semmle.label | successor |
-| Finally.cs:115:35:115:39 | [finally: exception(Exception)] this access | Finally.cs:115:35:115:39 | [finally: exception(Exception)] access to field Field | semmle.label | successor |
-| Finally.cs:115:35:115:39 | [finally: exception(NullReferenceException)] access to field Field | Finally.cs:115:17:115:40 | [finally: exception(NullReferenceException)] call to method WriteLine | semmle.label | successor |
-| Finally.cs:115:35:115:39 | [finally: exception(NullReferenceException)] this access | Finally.cs:115:35:115:39 | [finally: exception(NullReferenceException)] access to field Field | semmle.label | successor |
-| Finally.cs:115:35:115:39 | [finally: exception(OutOfMemoryException)] access to field Field | Finally.cs:115:17:115:40 | [finally: exception(OutOfMemoryException)] call to method WriteLine | semmle.label | successor |
-| Finally.cs:115:35:115:39 | [finally: exception(OutOfMemoryException)] this access | Finally.cs:115:35:115:39 | [finally: exception(OutOfMemoryException)] access to field Field | semmle.label | successor |
-| Finally.cs:115:35:115:39 | [finally: return] access to field Field | Finally.cs:115:17:115:40 | [finally: return] call to method WriteLine | semmle.label | successor |
-| Finally.cs:115:35:115:39 | [finally: return] this access | Finally.cs:115:35:115:39 | [finally: return] access to field Field | semmle.label | successor |
-| Finally.cs:115:35:115:39 | access to field Field | Finally.cs:115:17:115:40 | call to method WriteLine | semmle.label | successor |
-| Finally.cs:115:35:115:39 | this access | Finally.cs:115:35:115:39 | access to field Field | semmle.label | successor |
-| Finally.cs:116:13:117:37 | [finally: exception(Exception)] if (...) ... | Finally.cs:116:17:116:21 | [finally: exception(Exception)] this access | semmle.label | successor |
-| Finally.cs:116:13:117:37 | [finally: exception(NullReferenceException)] if (...) ... | Finally.cs:116:17:116:21 | [finally: exception(NullReferenceException)] this access | semmle.label | successor |
-| Finally.cs:116:13:117:37 | [finally: exception(OutOfMemoryException)] if (...) ... | Finally.cs:116:17:116:21 | [finally: exception(OutOfMemoryException)] this access | semmle.label | successor |
-| Finally.cs:116:13:117:37 | [finally: return] if (...) ... | Finally.cs:116:17:116:21 | [finally: return] this access | semmle.label | successor |
-| Finally.cs:116:13:117:37 | if (...) ... | Finally.cs:116:17:116:21 | this access | semmle.label | successor |
-| Finally.cs:116:17:116:21 | [finally: exception(Exception)] access to field Field | Finally.cs:116:17:116:28 | [finally: exception(Exception)] access to property Length | semmle.label | successor |
-| Finally.cs:116:17:116:21 | [finally: exception(Exception)] this access | Finally.cs:116:17:116:21 | [finally: exception(Exception)] access to field Field | semmle.label | successor |
-| Finally.cs:116:17:116:21 | [finally: exception(NullReferenceException)] access to field Field | Finally.cs:116:17:116:28 | [finally: exception(NullReferenceException)] access to property Length | semmle.label | successor |
-| Finally.cs:116:17:116:21 | [finally: exception(NullReferenceException)] this access | Finally.cs:116:17:116:21 | [finally: exception(NullReferenceException)] access to field Field | semmle.label | successor |
-| Finally.cs:116:17:116:21 | [finally: exception(OutOfMemoryException)] access to field Field | Finally.cs:116:17:116:28 | [finally: exception(OutOfMemoryException)] access to property Length | semmle.label | successor |
-| Finally.cs:116:17:116:21 | [finally: exception(OutOfMemoryException)] this access | Finally.cs:116:17:116:21 | [finally: exception(OutOfMemoryException)] access to field Field | semmle.label | successor |
-| Finally.cs:116:17:116:21 | [finally: return] access to field Field | Finally.cs:116:17:116:28 | [finally: return] access to property Length | semmle.label | successor |
-| Finally.cs:116:17:116:21 | [finally: return] this access | Finally.cs:116:17:116:21 | [finally: return] access to field Field | semmle.label | successor |
-| Finally.cs:116:17:116:21 | access to field Field | Finally.cs:116:17:116:28 | access to property Length | semmle.label | successor |
-| Finally.cs:116:17:116:21 | this access | Finally.cs:116:17:116:21 | access to field Field | semmle.label | successor |
-| Finally.cs:116:17:116:28 | [finally: exception(Exception)] access to property Length | Finally.cs:116:32:116:32 | [finally: exception(Exception)] 0 | semmle.label | successor |
-| Finally.cs:116:17:116:28 | [finally: exception(NullReferenceException)] access to property Length | Finally.cs:116:32:116:32 | [finally: exception(NullReferenceException)] 0 | semmle.label | successor |
-| Finally.cs:116:17:116:28 | [finally: exception(OutOfMemoryException)] access to property Length | Finally.cs:116:32:116:32 | [finally: exception(OutOfMemoryException)] 0 | semmle.label | successor |
-| Finally.cs:116:17:116:28 | [finally: return] access to property Length | Finally.cs:116:32:116:32 | [finally: return] 0 | semmle.label | successor |
-| Finally.cs:116:17:116:28 | access to property Length | Finally.cs:116:32:116:32 | 0 | semmle.label | successor |
-| Finally.cs:116:17:116:32 | ... > ... | Finally.cs:103:10:103:11 | exit M5 (normal) | semmle.label | false |
-| Finally.cs:116:17:116:32 | ... > ... | Finally.cs:117:17:117:37 | ...; | semmle.label | true |
-| Finally.cs:116:17:116:32 | [finally: exception(Exception)] ... > ... | Finally.cs:103:10:103:11 | exit M5 (abnormal) | semmle.label | exception(Exception) |
-| Finally.cs:116:17:116:32 | [finally: exception(Exception)] ... > ... | Finally.cs:117:17:117:37 | [finally: exception(Exception)] ...; | semmle.label | true |
-| Finally.cs:116:17:116:32 | [finally: exception(NullReferenceException)] ... > ... | Finally.cs:103:10:103:11 | exit M5 (abnormal) | semmle.label | exception(NullReferenceException) |
-| Finally.cs:116:17:116:32 | [finally: exception(NullReferenceException)] ... > ... | Finally.cs:117:17:117:37 | [finally: exception(NullReferenceException)] ...; | semmle.label | true |
-| Finally.cs:116:17:116:32 | [finally: exception(OutOfMemoryException)] ... > ... | Finally.cs:103:10:103:11 | exit M5 (abnormal) | semmle.label | exception(OutOfMemoryException) |
-| Finally.cs:116:17:116:32 | [finally: exception(OutOfMemoryException)] ... > ... | Finally.cs:117:17:117:37 | [finally: exception(OutOfMemoryException)] ...; | semmle.label | true |
-| Finally.cs:116:17:116:32 | [finally: return] ... > ... | Finally.cs:103:10:103:11 | exit M5 (normal) | semmle.label | return |
-| Finally.cs:116:17:116:32 | [finally: return] ... > ... | Finally.cs:117:17:117:37 | [finally: return] ...; | semmle.label | true |
-| Finally.cs:116:32:116:32 | 0 | Finally.cs:116:17:116:32 | ... > ... | semmle.label | successor |
-| Finally.cs:116:32:116:32 | [finally: exception(Exception)] 0 | Finally.cs:116:17:116:32 | [finally: exception(Exception)] ... > ... | semmle.label | successor |
-| Finally.cs:116:32:116:32 | [finally: exception(NullReferenceException)] 0 | Finally.cs:116:17:116:32 | [finally: exception(NullReferenceException)] ... > ... | semmle.label | successor |
-| Finally.cs:116:32:116:32 | [finally: exception(OutOfMemoryException)] 0 | Finally.cs:116:17:116:32 | [finally: exception(OutOfMemoryException)] ... > ... | semmle.label | successor |
-| Finally.cs:116:32:116:32 | [finally: return] 0 | Finally.cs:116:17:116:32 | [finally: return] ... > ... | semmle.label | successor |
-| Finally.cs:117:17:117:36 | [finally: exception(Exception)] call to method WriteLine | Finally.cs:103:10:103:11 | exit M5 (abnormal) | semmle.label | exception(Exception) |
-| Finally.cs:117:17:117:36 | [finally: exception(NullReferenceException)] call to method WriteLine | Finally.cs:103:10:103:11 | exit M5 (abnormal) | semmle.label | exception(NullReferenceException) |
-| Finally.cs:117:17:117:36 | [finally: exception(OutOfMemoryException)] call to method WriteLine | Finally.cs:103:10:103:11 | exit M5 (abnormal) | semmle.label | exception(OutOfMemoryException) |
-| Finally.cs:117:17:117:36 | [finally: return] call to method WriteLine | Finally.cs:103:10:103:11 | exit M5 (normal) | semmle.label | return |
-| Finally.cs:117:17:117:36 | call to method WriteLine | Finally.cs:103:10:103:11 | exit M5 (normal) | semmle.label | successor |
-| Finally.cs:117:17:117:37 | ...; | Finally.cs:117:35:117:35 | 1 | semmle.label | successor |
-| Finally.cs:117:17:117:37 | [finally: exception(Exception)] ...; | Finally.cs:117:35:117:35 | [finally: exception(Exception)] 1 | semmle.label | successor |
-| Finally.cs:117:17:117:37 | [finally: exception(NullReferenceException)] ...; | Finally.cs:117:35:117:35 | [finally: exception(NullReferenceException)] 1 | semmle.label | successor |
-| Finally.cs:117:17:117:37 | [finally: exception(OutOfMemoryException)] ...; | Finally.cs:117:35:117:35 | [finally: exception(OutOfMemoryException)] 1 | semmle.label | successor |
-| Finally.cs:117:17:117:37 | [finally: return] ...; | Finally.cs:117:35:117:35 | [finally: return] 1 | semmle.label | successor |
-| Finally.cs:117:35:117:35 | 1 | Finally.cs:117:17:117:36 | call to method WriteLine | semmle.label | successor |
-| Finally.cs:117:35:117:35 | [finally: exception(Exception)] 1 | Finally.cs:117:17:117:36 | [finally: exception(Exception)] call to method WriteLine | semmle.label | successor |
-| Finally.cs:117:35:117:35 | [finally: exception(NullReferenceException)] 1 | Finally.cs:117:17:117:36 | [finally: exception(NullReferenceException)] call to method WriteLine | semmle.label | successor |
-| Finally.cs:117:35:117:35 | [finally: exception(OutOfMemoryException)] 1 | Finally.cs:117:17:117:36 | [finally: exception(OutOfMemoryException)] call to method WriteLine | semmle.label | successor |
-| Finally.cs:117:35:117:35 | [finally: return] 1 | Finally.cs:117:17:117:36 | [finally: return] call to method WriteLine | semmle.label | successor |
-| Finally.cs:121:10:121:11 | enter M6 | Finally.cs:122:5:131:5 | {...} | semmle.label | successor |
-| Finally.cs:121:10:121:11 | exit M6 (normal) | Finally.cs:121:10:121:11 | exit M6 | semmle.label | successor |
-| Finally.cs:122:5:131:5 | {...} | Finally.cs:123:9:130:9 | try {...} ... | semmle.label | successor |
-| Finally.cs:123:9:130:9 | try {...} ... | Finally.cs:124:9:126:9 | {...} | semmle.label | successor |
-| Finally.cs:124:9:126:9 | {...} | Finally.cs:125:13:125:41 | ... ...; | semmle.label | successor |
-| Finally.cs:125:13:125:41 | ... ...; | Finally.cs:125:24:125:24 | 0 | semmle.label | successor |
-| Finally.cs:125:17:125:40 | Double temp = ... | Finally.cs:121:10:121:11 | exit M6 (normal) | semmle.label | successor |
-| Finally.cs:125:24:125:24 | 0 | Finally.cs:125:24:125:24 | (...) ... | semmle.label | successor |
-| Finally.cs:125:24:125:24 | (...) ... | Finally.cs:125:28:125:40 | access to constant E | semmle.label | successor |
-| Finally.cs:125:24:125:40 | ... / ... | Finally.cs:125:17:125:40 | Double temp = ... | semmle.label | successor |
-| Finally.cs:125:28:125:40 | access to constant E | Finally.cs:125:24:125:40 | ... / ... | semmle.label | successor |
-| Finally.cs:133:10:133:11 | enter M7 | Finally.cs:134:5:145:5 | {...} | semmle.label | successor |
-| Finally.cs:133:10:133:11 | exit M7 (abnormal) | Finally.cs:133:10:133:11 | exit M7 | semmle.label | successor |
-| Finally.cs:134:5:145:5 | {...} | Finally.cs:135:9:143:9 | try {...} ... | semmle.label | successor |
-| Finally.cs:135:9:143:9 | try {...} ... | Finally.cs:136:9:138:9 | {...} | semmle.label | successor |
-| Finally.cs:136:9:138:9 | {...} | Finally.cs:137:13:137:37 | ...; | semmle.label | successor |
-| Finally.cs:137:13:137:36 | call to method WriteLine | Finally.cs:140:9:143:9 | [finally: exception(Exception)] {...} | semmle.label | exception(Exception) |
-| Finally.cs:137:13:137:36 | call to method WriteLine | Finally.cs:140:9:143:9 | {...} | semmle.label | successor |
-| Finally.cs:137:13:137:37 | ...; | Finally.cs:137:31:137:35 | "Try" | semmle.label | successor |
-| Finally.cs:137:31:137:35 | "Try" | Finally.cs:137:13:137:36 | call to method WriteLine | semmle.label | successor |
-| Finally.cs:140:9:143:9 | [finally: exception(Exception)] {...} | Finally.cs:141:41:141:42 | [finally: exception(Exception)] "" | semmle.label | successor |
-| Finally.cs:140:9:143:9 | {...} | Finally.cs:141:41:141:42 | "" | semmle.label | successor |
-| Finally.cs:141:13:141:44 | [finally: exception(Exception)] throw ...; | Finally.cs:133:10:133:11 | exit M7 (abnormal) | semmle.label | exception(ArgumentException) |
-| Finally.cs:141:13:141:44 | throw ...; | Finally.cs:133:10:133:11 | exit M7 (abnormal) | semmle.label | exception(ArgumentException) |
-| Finally.cs:141:19:141:43 | [finally: exception(Exception)] object creation of type ArgumentException | Finally.cs:141:13:141:44 | [finally: exception(Exception)] throw ...; | semmle.label | successor |
-| Finally.cs:141:19:141:43 | object creation of type ArgumentException | Finally.cs:141:13:141:44 | throw ...; | semmle.label | successor |
-| Finally.cs:141:41:141:42 | "" | Finally.cs:141:19:141:43 | object creation of type ArgumentException | semmle.label | successor |
-| Finally.cs:141:41:141:42 | [finally: exception(Exception)] "" | Finally.cs:141:19:141:43 | [finally: exception(Exception)] object creation of type ArgumentException | semmle.label | successor |
-| Finally.cs:147:10:147:11 | enter M8 | Finally.cs:148:5:170:5 | {...} | semmle.label | successor |
-| Finally.cs:147:10:147:11 | exit M8 (abnormal) | Finally.cs:147:10:147:11 | exit M8 | semmle.label | successor |
-| Finally.cs:147:10:147:11 | exit M8 (normal) | Finally.cs:147:10:147:11 | exit M8 | semmle.label | successor |
-| Finally.cs:148:5:170:5 | {...} | Finally.cs:149:9:169:9 | try {...} ... | semmle.label | successor |
-| Finally.cs:149:9:169:9 | try {...} ... | Finally.cs:150:9:153:9 | {...} | semmle.label | successor |
-| Finally.cs:150:9:153:9 | {...} | Finally.cs:151:13:152:50 | if (...) ... | semmle.label | successor |
-| Finally.cs:151:13:152:50 | if (...) ... | Finally.cs:151:17:151:20 | access to parameter args | semmle.label | successor |
-| Finally.cs:151:17:151:20 | access to parameter args | Finally.cs:151:25:151:28 | null | semmle.label | successor |
-| Finally.cs:151:17:151:28 | ... == ... | Finally.cs:152:23:152:49 | object creation of type ArgumentNullException | semmle.label | true |
-| Finally.cs:151:17:151:28 | ... == ... | Finally.cs:155:9:169:9 | {...} | semmle.label | false |
-| Finally.cs:151:25:151:28 | null | Finally.cs:151:17:151:28 | ... == ... | semmle.label | successor |
-| Finally.cs:152:17:152:50 | throw ...; | Finally.cs:155:9:169:9 | [finally: exception(ArgumentNullException)] {...} | semmle.label | exception(ArgumentNullException) |
-| Finally.cs:152:23:152:49 | object creation of type ArgumentNullException | Finally.cs:152:17:152:50 | throw ...; | semmle.label | successor |
-| Finally.cs:152:23:152:49 | object creation of type ArgumentNullException | Finally.cs:155:9:169:9 | [finally: exception(Exception)] {...} | semmle.label | exception(Exception) |
-| Finally.cs:155:9:169:9 | [finally: exception(ArgumentNullException)] {...} | Finally.cs:156:13:168:13 | [finally: exception(ArgumentNullException)] try {...} ... | semmle.label | successor |
-| Finally.cs:155:9:169:9 | [finally: exception(Exception)] {...} | Finally.cs:156:13:168:13 | [finally: exception(Exception)] try {...} ... | semmle.label | successor |
-| Finally.cs:155:9:169:9 | {...} | Finally.cs:156:13:168:13 | try {...} ... | semmle.label | successor |
-| Finally.cs:156:13:168:13 | [finally: exception(ArgumentNullException)] try {...} ... | Finally.cs:157:13:160:13 | [finally: exception(ArgumentNullException)] {...} | semmle.label | successor |
-| Finally.cs:156:13:168:13 | [finally: exception(Exception)] try {...} ... | Finally.cs:157:13:160:13 | [finally: exception(Exception)] {...} | semmle.label | successor |
-| Finally.cs:156:13:168:13 | try {...} ... | Finally.cs:157:13:160:13 | {...} | semmle.label | successor |
-| Finally.cs:157:13:160:13 | [finally: exception(ArgumentNullException)] {...} | Finally.cs:158:17:159:45 | [finally: exception(ArgumentNullException)] if (...) ... | semmle.label | successor |
-| Finally.cs:157:13:160:13 | [finally: exception(Exception)] {...} | Finally.cs:158:17:159:45 | [finally: exception(Exception)] if (...) ... | semmle.label | successor |
-| Finally.cs:157:13:160:13 | {...} | Finally.cs:158:17:159:45 | if (...) ... | semmle.label | successor |
-| Finally.cs:158:17:159:45 | [finally: exception(ArgumentNullException)] if (...) ... | Finally.cs:158:21:158:24 | [finally: exception(ArgumentNullException)] access to parameter args | semmle.label | successor |
-| Finally.cs:158:17:159:45 | [finally: exception(Exception)] if (...) ... | Finally.cs:158:21:158:24 | [finally: exception(Exception)] access to parameter args | semmle.label | successor |
-| Finally.cs:158:17:159:45 | if (...) ... | Finally.cs:158:21:158:24 | access to parameter args | semmle.label | successor |
-| Finally.cs:158:21:158:24 | [finally: exception(ArgumentNullException)] access to parameter args | Finally.cs:158:21:158:31 | [finally: exception(ArgumentNullException)] access to property Length | semmle.label | successor |
-| Finally.cs:158:21:158:24 | [finally: exception(Exception)] access to parameter args | Finally.cs:158:21:158:31 | [finally: exception(Exception)] access to property Length | semmle.label | successor |
-| Finally.cs:158:21:158:24 | access to parameter args | Finally.cs:158:21:158:31 | access to property Length | semmle.label | successor |
-| Finally.cs:158:21:158:31 | [finally: exception(ArgumentNullException)] access to property Length | Finally.cs:158:36:158:36 | [finally: exception(ArgumentNullException)] 1 | semmle.label | successor |
-| Finally.cs:158:21:158:31 | [finally: exception(ArgumentNullException)] access to property Length | Finally.cs:161:13:164:13 | [finally: exception(ArgumentNullException), exception: Exception] catch (...) {...} | semmle.label | exception(Exception) |
-| Finally.cs:158:21:158:31 | [finally: exception(ArgumentNullException)] access to property Length | Finally.cs:161:13:164:13 | [finally: exception(ArgumentNullException), exception: NullReferenceException] catch (...) {...} | semmle.label | exception(NullReferenceException) |
-| Finally.cs:158:21:158:31 | [finally: exception(Exception)] access to property Length | Finally.cs:158:36:158:36 | [finally: exception(Exception)] 1 | semmle.label | successor |
-| Finally.cs:158:21:158:31 | [finally: exception(Exception)] access to property Length | Finally.cs:161:13:164:13 | [finally: exception(Exception), exception: Exception] catch (...) {...} | semmle.label | exception(Exception) |
-| Finally.cs:158:21:158:31 | [finally: exception(Exception)] access to property Length | Finally.cs:161:13:164:13 | [finally: exception(Exception), exception: NullReferenceException] catch (...) {...} | semmle.label | exception(NullReferenceException) |
-| Finally.cs:158:21:158:31 | access to property Length | Finally.cs:158:36:158:36 | 1 | semmle.label | successor |
-| Finally.cs:158:21:158:31 | access to property Length | Finally.cs:161:13:164:13 | [exception: Exception] catch (...) {...} | semmle.label | exception(Exception) |
-| Finally.cs:158:21:158:31 | access to property Length | Finally.cs:161:13:164:13 | [exception: NullReferenceException] catch (...) {...} | semmle.label | exception(NullReferenceException) |
-| Finally.cs:158:21:158:36 | ... == ... | Finally.cs:147:10:147:11 | exit M8 (normal) | semmle.label | false |
-| Finally.cs:158:21:158:36 | ... == ... | Finally.cs:159:41:159:43 | "1" | semmle.label | true |
-| Finally.cs:158:21:158:36 | [finally: exception(ArgumentNullException)] ... == ... | Finally.cs:147:10:147:11 | exit M8 (abnormal) | semmle.label | exception(ArgumentNullException) |
-| Finally.cs:158:21:158:36 | [finally: exception(ArgumentNullException)] ... == ... | Finally.cs:159:41:159:43 | [finally: exception(ArgumentNullException)] "1" | semmle.label | true |
-| Finally.cs:158:21:158:36 | [finally: exception(Exception)] ... == ... | Finally.cs:147:10:147:11 | exit M8 (abnormal) | semmle.label | exception(Exception) |
-| Finally.cs:158:21:158:36 | [finally: exception(Exception)] ... == ... | Finally.cs:159:41:159:43 | [finally: exception(Exception)] "1" | semmle.label | true |
-| Finally.cs:158:36:158:36 | 1 | Finally.cs:158:21:158:36 | ... == ... | semmle.label | successor |
-| Finally.cs:158:36:158:36 | [finally: exception(ArgumentNullException)] 1 | Finally.cs:158:21:158:36 | [finally: exception(ArgumentNullException)] ... == ... | semmle.label | successor |
-| Finally.cs:158:36:158:36 | [finally: exception(Exception)] 1 | Finally.cs:158:21:158:36 | [finally: exception(Exception)] ... == ... | semmle.label | successor |
-| Finally.cs:159:21:159:45 | [finally: exception(ArgumentNullException)] throw ...; | Finally.cs:161:13:164:13 | [finally: exception(ArgumentNullException), exception: Exception] catch (...) {...} | semmle.label | exception(Exception) |
-| Finally.cs:159:21:159:45 | [finally: exception(Exception)] throw ...; | Finally.cs:161:13:164:13 | [finally: exception(Exception), exception: Exception] catch (...) {...} | semmle.label | exception(Exception) |
-| Finally.cs:159:21:159:45 | throw ...; | Finally.cs:161:13:164:13 | [exception: Exception] catch (...) {...} | semmle.label | exception(Exception) |
-| Finally.cs:159:27:159:44 | [finally: exception(ArgumentNullException)] object creation of type Exception | Finally.cs:159:21:159:45 | [finally: exception(ArgumentNullException)] throw ...; | semmle.label | successor |
-| Finally.cs:159:27:159:44 | [finally: exception(ArgumentNullException)] object creation of type Exception | Finally.cs:161:13:164:13 | [finally: exception(ArgumentNullException), exception: Exception] catch (...) {...} | semmle.label | exception(Exception) |
-| Finally.cs:159:27:159:44 | [finally: exception(Exception)] object creation of type Exception | Finally.cs:159:21:159:45 | [finally: exception(Exception)] throw ...; | semmle.label | successor |
-| Finally.cs:159:27:159:44 | [finally: exception(Exception)] object creation of type Exception | Finally.cs:161:13:164:13 | [finally: exception(Exception), exception: Exception] catch (...) {...} | semmle.label | exception(Exception) |
-| Finally.cs:159:27:159:44 | object creation of type Exception | Finally.cs:159:21:159:45 | throw ...; | semmle.label | successor |
-| Finally.cs:159:27:159:44 | object creation of type Exception | Finally.cs:161:13:164:13 | [exception: Exception] catch (...) {...} | semmle.label | exception(Exception) |
-| Finally.cs:159:41:159:43 | "1" | Finally.cs:159:27:159:44 | object creation of type Exception | semmle.label | successor |
-| Finally.cs:159:41:159:43 | [finally: exception(ArgumentNullException)] "1" | Finally.cs:159:27:159:44 | [finally: exception(ArgumentNullException)] object creation of type Exception | semmle.label | successor |
-| Finally.cs:159:41:159:43 | [finally: exception(Exception)] "1" | Finally.cs:159:27:159:44 | [finally: exception(Exception)] object creation of type Exception | semmle.label | successor |
-| Finally.cs:161:13:164:13 | [exception: Exception] catch (...) {...} | Finally.cs:161:30:161:30 | [exception: Exception] Exception e | semmle.label | match |
-| Finally.cs:161:13:164:13 | [exception: NullReferenceException] catch (...) {...} | Finally.cs:161:30:161:30 | [exception: NullReferenceException] Exception e | semmle.label | match |
-| Finally.cs:161:13:164:13 | [finally: exception(ArgumentNullException), exception: Exception] catch (...) {...} | Finally.cs:161:30:161:30 | [finally: exception(ArgumentNullException), exception: Exception] Exception e | semmle.label | match |
-| Finally.cs:161:13:164:13 | [finally: exception(ArgumentNullException), exception: NullReferenceException] catch (...) {...} | Finally.cs:161:30:161:30 | [finally: exception(ArgumentNullException), exception: NullReferenceException] Exception e | semmle.label | match |
-| Finally.cs:161:13:164:13 | [finally: exception(Exception), exception: Exception] catch (...) {...} | Finally.cs:161:30:161:30 | [finally: exception(Exception), exception: Exception] Exception e | semmle.label | match |
-| Finally.cs:161:13:164:13 | [finally: exception(Exception), exception: NullReferenceException] catch (...) {...} | Finally.cs:161:30:161:30 | [finally: exception(Exception), exception: NullReferenceException] Exception e | semmle.label | match |
-| Finally.cs:161:30:161:30 | [exception: Exception] Exception e | Finally.cs:161:39:161:39 | [exception: Exception] access to local variable e | semmle.label | successor |
-| Finally.cs:161:30:161:30 | [exception: NullReferenceException] Exception e | Finally.cs:161:39:161:39 | [exception: NullReferenceException] access to local variable e | semmle.label | successor |
-| Finally.cs:161:30:161:30 | [finally: exception(ArgumentNullException), exception: Exception] Exception e | Finally.cs:161:39:161:39 | [finally: exception(ArgumentNullException), exception: Exception] access to local variable e | semmle.label | successor |
-| Finally.cs:161:30:161:30 | [finally: exception(ArgumentNullException), exception: NullReferenceException] Exception e | Finally.cs:161:39:161:39 | [finally: exception(ArgumentNullException), exception: NullReferenceException] access to local variable e | semmle.label | successor |
-| Finally.cs:161:30:161:30 | [finally: exception(Exception), exception: Exception] Exception e | Finally.cs:161:39:161:39 | [finally: exception(Exception), exception: Exception] access to local variable e | semmle.label | successor |
-| Finally.cs:161:30:161:30 | [finally: exception(Exception), exception: NullReferenceException] Exception e | Finally.cs:161:39:161:39 | [finally: exception(Exception), exception: NullReferenceException] access to local variable e | semmle.label | successor |
-| Finally.cs:161:39:161:39 | [exception: Exception] access to local variable e | Finally.cs:161:39:161:47 | [exception: Exception] access to property Message | semmle.label | successor |
-| Finally.cs:161:39:161:39 | [exception: NullReferenceException] access to local variable e | Finally.cs:161:39:161:47 | [exception: NullReferenceException] access to property Message | semmle.label | successor |
-| Finally.cs:161:39:161:39 | [finally: exception(ArgumentNullException), exception: Exception] access to local variable e | Finally.cs:161:39:161:47 | [finally: exception(ArgumentNullException), exception: Exception] access to property Message | semmle.label | successor |
-| Finally.cs:161:39:161:39 | [finally: exception(ArgumentNullException), exception: NullReferenceException] access to local variable e | Finally.cs:161:39:161:47 | [finally: exception(ArgumentNullException), exception: NullReferenceException] access to property Message | semmle.label | successor |
-| Finally.cs:161:39:161:39 | [finally: exception(Exception), exception: Exception] access to local variable e | Finally.cs:161:39:161:47 | [finally: exception(Exception), exception: Exception] access to property Message | semmle.label | successor |
-| Finally.cs:161:39:161:39 | [finally: exception(Exception), exception: NullReferenceException] access to local variable e | Finally.cs:161:39:161:47 | [finally: exception(Exception), exception: NullReferenceException] access to property Message | semmle.label | successor |
-| Finally.cs:161:39:161:47 | [exception: Exception] access to property Message | Finally.cs:161:52:161:54 | [exception: Exception] "1" | semmle.label | successor |
-| Finally.cs:161:39:161:47 | [exception: NullReferenceException] access to property Message | Finally.cs:161:52:161:54 | [exception: NullReferenceException] "1" | semmle.label | successor |
-| Finally.cs:161:39:161:47 | [finally: exception(ArgumentNullException), exception: Exception] access to property Message | Finally.cs:161:52:161:54 | [finally: exception(ArgumentNullException), exception: Exception] "1" | semmle.label | successor |
-| Finally.cs:161:39:161:47 | [finally: exception(ArgumentNullException), exception: NullReferenceException] access to property Message | Finally.cs:161:52:161:54 | [finally: exception(ArgumentNullException), exception: NullReferenceException] "1" | semmle.label | successor |
-| Finally.cs:161:39:161:47 | [finally: exception(Exception), exception: Exception] access to property Message | Finally.cs:161:52:161:54 | [finally: exception(Exception), exception: Exception] "1" | semmle.label | successor |
-| Finally.cs:161:39:161:47 | [finally: exception(Exception), exception: NullReferenceException] access to property Message | Finally.cs:161:52:161:54 | [finally: exception(Exception), exception: NullReferenceException] "1" | semmle.label | successor |
-| Finally.cs:161:39:161:54 | [exception: Exception] ... == ... | Finally.cs:162:13:164:13 | {...} | semmle.label | true |
-| Finally.cs:161:39:161:54 | [exception: Exception] ... == ... | Finally.cs:165:13:168:13 | catch {...} | semmle.label | false |
-| Finally.cs:161:39:161:54 | [exception: NullReferenceException] ... == ... | Finally.cs:162:13:164:13 | {...} | semmle.label | true |
-| Finally.cs:161:39:161:54 | [exception: NullReferenceException] ... == ... | Finally.cs:165:13:168:13 | catch {...} | semmle.label | false |
-| Finally.cs:161:39:161:54 | [finally: exception(ArgumentNullException), exception: Exception] ... == ... | Finally.cs:162:13:164:13 | [finally: exception(ArgumentNullException)] {...} | semmle.label | true |
-| Finally.cs:161:39:161:54 | [finally: exception(ArgumentNullException), exception: Exception] ... == ... | Finally.cs:165:13:168:13 | [finally: exception(ArgumentNullException)] catch {...} | semmle.label | false |
-| Finally.cs:161:39:161:54 | [finally: exception(ArgumentNullException), exception: NullReferenceException] ... == ... | Finally.cs:162:13:164:13 | [finally: exception(ArgumentNullException)] {...} | semmle.label | true |
-| Finally.cs:161:39:161:54 | [finally: exception(ArgumentNullException), exception: NullReferenceException] ... == ... | Finally.cs:165:13:168:13 | [finally: exception(ArgumentNullException)] catch {...} | semmle.label | false |
-| Finally.cs:161:39:161:54 | [finally: exception(Exception), exception: Exception] ... == ... | Finally.cs:162:13:164:13 | [finally: exception(Exception)] {...} | semmle.label | true |
-| Finally.cs:161:39:161:54 | [finally: exception(Exception), exception: Exception] ... == ... | Finally.cs:165:13:168:13 | [finally: exception(Exception)] catch {...} | semmle.label | false |
-| Finally.cs:161:39:161:54 | [finally: exception(Exception), exception: NullReferenceException] ... == ... | Finally.cs:162:13:164:13 | [finally: exception(Exception)] {...} | semmle.label | true |
-| Finally.cs:161:39:161:54 | [finally: exception(Exception), exception: NullReferenceException] ... == ... | Finally.cs:165:13:168:13 | [finally: exception(Exception)] catch {...} | semmle.label | false |
-| Finally.cs:161:52:161:54 | [exception: Exception] "1" | Finally.cs:161:39:161:54 | [exception: Exception] ... == ... | semmle.label | successor |
-| Finally.cs:161:52:161:54 | [exception: NullReferenceException] "1" | Finally.cs:161:39:161:54 | [exception: NullReferenceException] ... == ... | semmle.label | successor |
-| Finally.cs:161:52:161:54 | [finally: exception(ArgumentNullException), exception: Exception] "1" | Finally.cs:161:39:161:54 | [finally: exception(ArgumentNullException), exception: Exception] ... == ... | semmle.label | successor |
-| Finally.cs:161:52:161:54 | [finally: exception(ArgumentNullException), exception: NullReferenceException] "1" | Finally.cs:161:39:161:54 | [finally: exception(ArgumentNullException), exception: NullReferenceException] ... == ... | semmle.label | successor |
-| Finally.cs:161:52:161:54 | [finally: exception(Exception), exception: Exception] "1" | Finally.cs:161:39:161:54 | [finally: exception(Exception), exception: Exception] ... == ... | semmle.label | successor |
-| Finally.cs:161:52:161:54 | [finally: exception(Exception), exception: NullReferenceException] "1" | Finally.cs:161:39:161:54 | [finally: exception(Exception), exception: NullReferenceException] ... == ... | semmle.label | successor |
-| Finally.cs:162:13:164:13 | [finally: exception(ArgumentNullException)] {...} | Finally.cs:163:17:163:43 | [finally: exception(ArgumentNullException)] ...; | semmle.label | successor |
-| Finally.cs:162:13:164:13 | [finally: exception(Exception)] {...} | Finally.cs:163:17:163:43 | [finally: exception(Exception)] ...; | semmle.label | successor |
-| Finally.cs:162:13:164:13 | {...} | Finally.cs:163:17:163:43 | ...; | semmle.label | successor |
-| Finally.cs:163:17:163:42 | [finally: exception(ArgumentNullException)] call to method WriteLine | Finally.cs:147:10:147:11 | exit M8 (abnormal) | semmle.label | exception(ArgumentNullException) |
-| Finally.cs:163:17:163:42 | [finally: exception(Exception)] call to method WriteLine | Finally.cs:147:10:147:11 | exit M8 (abnormal) | semmle.label | exception(Exception) |
-| Finally.cs:163:17:163:42 | call to method WriteLine | Finally.cs:147:10:147:11 | exit M8 (normal) | semmle.label | successor |
-| Finally.cs:163:17:163:43 | ...; | Finally.cs:163:35:163:38 | access to parameter args | semmle.label | successor |
-| Finally.cs:163:17:163:43 | [finally: exception(ArgumentNullException)] ...; | Finally.cs:163:35:163:38 | [finally: exception(ArgumentNullException)] access to parameter args | semmle.label | successor |
-| Finally.cs:163:17:163:43 | [finally: exception(Exception)] ...; | Finally.cs:163:35:163:38 | [finally: exception(Exception)] access to parameter args | semmle.label | successor |
-| Finally.cs:163:35:163:38 | [finally: exception(ArgumentNullException)] access to parameter args | Finally.cs:163:40:163:40 | [finally: exception(ArgumentNullException)] 0 | semmle.label | successor |
-| Finally.cs:163:35:163:38 | [finally: exception(Exception)] access to parameter args | Finally.cs:163:40:163:40 | [finally: exception(Exception)] 0 | semmle.label | successor |
-| Finally.cs:163:35:163:38 | access to parameter args | Finally.cs:163:40:163:40 | 0 | semmle.label | successor |
-| Finally.cs:163:35:163:41 | [finally: exception(ArgumentNullException)] access to array element | Finally.cs:163:17:163:42 | [finally: exception(ArgumentNullException)] call to method WriteLine | semmle.label | successor |
-| Finally.cs:163:35:163:41 | [finally: exception(Exception)] access to array element | Finally.cs:163:17:163:42 | [finally: exception(Exception)] call to method WriteLine | semmle.label | successor |
-| Finally.cs:163:35:163:41 | access to array element | Finally.cs:163:17:163:42 | call to method WriteLine | semmle.label | successor |
-| Finally.cs:163:40:163:40 | 0 | Finally.cs:163:35:163:41 | access to array element | semmle.label | successor |
-| Finally.cs:163:40:163:40 | [finally: exception(ArgumentNullException)] 0 | Finally.cs:163:35:163:41 | [finally: exception(ArgumentNullException)] access to array element | semmle.label | successor |
-| Finally.cs:163:40:163:40 | [finally: exception(Exception)] 0 | Finally.cs:163:35:163:41 | [finally: exception(Exception)] access to array element | semmle.label | successor |
-| Finally.cs:165:13:168:13 | [finally: exception(ArgumentNullException)] catch {...} | Finally.cs:166:13:168:13 | [finally: exception(ArgumentNullException)] {...} | semmle.label | successor |
-| Finally.cs:165:13:168:13 | [finally: exception(Exception)] catch {...} | Finally.cs:166:13:168:13 | [finally: exception(Exception)] {...} | semmle.label | successor |
-| Finally.cs:165:13:168:13 | catch {...} | Finally.cs:166:13:168:13 | {...} | semmle.label | successor |
-| Finally.cs:166:13:168:13 | [finally: exception(ArgumentNullException)] {...} | Finally.cs:167:17:167:38 | [finally: exception(ArgumentNullException)] ...; | semmle.label | successor |
-| Finally.cs:166:13:168:13 | [finally: exception(Exception)] {...} | Finally.cs:167:17:167:38 | [finally: exception(Exception)] ...; | semmle.label | successor |
-| Finally.cs:166:13:168:13 | {...} | Finally.cs:167:17:167:38 | ...; | semmle.label | successor |
-| Finally.cs:167:17:167:37 | [finally: exception(ArgumentNullException)] call to method WriteLine | Finally.cs:147:10:147:11 | exit M8 (abnormal) | semmle.label | exception(ArgumentNullException) |
-| Finally.cs:167:17:167:37 | [finally: exception(Exception)] call to method WriteLine | Finally.cs:147:10:147:11 | exit M8 (abnormal) | semmle.label | exception(Exception) |
-| Finally.cs:167:17:167:37 | call to method WriteLine | Finally.cs:147:10:147:11 | exit M8 (normal) | semmle.label | successor |
-| Finally.cs:167:17:167:38 | ...; | Finally.cs:167:35:167:36 | "" | semmle.label | successor |
-| Finally.cs:167:17:167:38 | [finally: exception(ArgumentNullException)] ...; | Finally.cs:167:35:167:36 | [finally: exception(ArgumentNullException)] "" | semmle.label | successor |
-| Finally.cs:167:17:167:38 | [finally: exception(Exception)] ...; | Finally.cs:167:35:167:36 | [finally: exception(Exception)] "" | semmle.label | successor |
-| Finally.cs:167:35:167:36 | "" | Finally.cs:167:17:167:37 | call to method WriteLine | semmle.label | successor |
-| Finally.cs:167:35:167:36 | [finally: exception(ArgumentNullException)] "" | Finally.cs:167:17:167:37 | [finally: exception(ArgumentNullException)] call to method WriteLine | semmle.label | successor |
-| Finally.cs:167:35:167:36 | [finally: exception(Exception)] "" | Finally.cs:167:17:167:37 | [finally: exception(Exception)] call to method WriteLine | semmle.label | successor |
-| Finally.cs:176:10:176:11 | enter M9 | Finally.cs:177:5:193:5 | {...} | semmle.label | successor |
-| Finally.cs:176:10:176:11 | exit M9 (abnormal) | Finally.cs:176:10:176:11 | exit M9 | semmle.label | successor |
-| Finally.cs:176:10:176:11 | exit M9 (normal) | Finally.cs:176:10:176:11 | exit M9 | semmle.label | successor |
-| Finally.cs:177:5:193:5 | {...} | Finally.cs:178:9:192:9 | try {...} ... | semmle.label | successor |
-| Finally.cs:178:9:192:9 | try {...} ... | Finally.cs:179:9:181:9 | {...} | semmle.label | successor |
-| Finally.cs:179:9:181:9 | {...} | Finally.cs:180:13:180:43 | if (...) ... | semmle.label | successor |
-| Finally.cs:180:13:180:43 | if (...) ... | Finally.cs:180:17:180:18 | access to parameter b1 | semmle.label | successor |
-| Finally.cs:180:17:180:18 | access to parameter b1 | Finally.cs:180:27:180:42 | [b1 (line 176): true] object creation of type ExceptionA | semmle.label | true |
-| Finally.cs:180:17:180:18 | access to parameter b1 | Finally.cs:183:9:192:9 | [b1 (line 176): false] {...} | semmle.label | false |
-| Finally.cs:180:21:180:43 | [b1 (line 176): true] throw ...; | Finally.cs:183:9:192:9 | [finally: exception(ExceptionA), b1 (line 176): true] {...} | semmle.label | exception(ExceptionA) |
-| Finally.cs:180:27:180:42 | [b1 (line 176): true] object creation of type ExceptionA | Finally.cs:180:21:180:43 | [b1 (line 176): true] throw ...; | semmle.label | successor |
-| Finally.cs:180:27:180:42 | [b1 (line 176): true] object creation of type ExceptionA | Finally.cs:183:9:192:9 | [finally: exception(Exception), b1 (line 176): true] {...} | semmle.label | exception(Exception) |
-| Finally.cs:183:9:192:9 | [b1 (line 176): false] {...} | Finally.cs:184:13:191:13 | [b1 (line 176): false] try {...} ... | semmle.label | successor |
-| Finally.cs:183:9:192:9 | [finally: exception(Exception), b1 (line 176): true] {...} | Finally.cs:184:13:191:13 | [finally: exception(Exception), b1 (line 176): true] try {...} ... | semmle.label | successor |
-| Finally.cs:183:9:192:9 | [finally: exception(ExceptionA), b1 (line 176): true] {...} | Finally.cs:184:13:191:13 | [finally: exception(ExceptionA), b1 (line 176): true] try {...} ... | semmle.label | successor |
-| Finally.cs:184:13:191:13 | [b1 (line 176): false] try {...} ... | Finally.cs:185:13:187:13 | [b1 (line 176): false] {...} | semmle.label | successor |
-| Finally.cs:184:13:191:13 | [finally: exception(Exception), b1 (line 176): true] try {...} ... | Finally.cs:185:13:187:13 | [finally: exception(Exception), b1 (line 176): true] {...} | semmle.label | successor |
-| Finally.cs:184:13:191:13 | [finally: exception(ExceptionA), b1 (line 176): true] try {...} ... | Finally.cs:185:13:187:13 | [finally: exception(ExceptionA), b1 (line 176): true] {...} | semmle.label | successor |
-| Finally.cs:185:13:187:13 | [b1 (line 176): false] {...} | Finally.cs:186:17:186:47 | [b1 (line 176): false] if (...) ... | semmle.label | successor |
-| Finally.cs:185:13:187:13 | [finally: exception(Exception), b1 (line 176): true] {...} | Finally.cs:186:17:186:47 | [finally: exception(Exception), b1 (line 176): true] if (...) ... | semmle.label | successor |
-| Finally.cs:185:13:187:13 | [finally: exception(ExceptionA), b1 (line 176): true] {...} | Finally.cs:186:17:186:47 | [finally: exception(ExceptionA), b1 (line 176): true] if (...) ... | semmle.label | successor |
-| Finally.cs:186:17:186:47 | [b1 (line 176): false] if (...) ... | Finally.cs:186:21:186:22 | [b1 (line 176): false] access to parameter b2 | semmle.label | successor |
-| Finally.cs:186:17:186:47 | [finally: exception(Exception), b1 (line 176): true] if (...) ... | Finally.cs:186:21:186:22 | [finally: exception(Exception), b1 (line 176): true] access to parameter b2 | semmle.label | successor |
-| Finally.cs:186:17:186:47 | [finally: exception(ExceptionA), b1 (line 176): true] if (...) ... | Finally.cs:186:21:186:22 | [finally: exception(ExceptionA), b1 (line 176): true] access to parameter b2 | semmle.label | successor |
-| Finally.cs:186:21:186:22 | [b1 (line 176): false] access to parameter b2 | Finally.cs:176:10:176:11 | exit M9 (normal) | semmle.label | false |
-| Finally.cs:186:21:186:22 | [b1 (line 176): false] access to parameter b2 | Finally.cs:186:31:186:46 | [b1 (line 176): false, b2 (line 176): true] object creation of type ExceptionB | semmle.label | true |
-| Finally.cs:186:21:186:22 | [finally: exception(Exception), b1 (line 176): true] access to parameter b2 | Finally.cs:176:10:176:11 | exit M9 (abnormal) | semmle.label | exception(Exception) |
-| Finally.cs:186:21:186:22 | [finally: exception(Exception), b1 (line 176): true] access to parameter b2 | Finally.cs:186:31:186:46 | [finally: exception(Exception), b1 (line 176): true, b2 (line 176): true] object creation of type ExceptionB | semmle.label | true |
-| Finally.cs:186:21:186:22 | [finally: exception(ExceptionA), b1 (line 176): true] access to parameter b2 | Finally.cs:176:10:176:11 | exit M9 (abnormal) | semmle.label | exception(ExceptionA) |
-| Finally.cs:186:21:186:22 | [finally: exception(ExceptionA), b1 (line 176): true] access to parameter b2 | Finally.cs:186:31:186:46 | [finally: exception(ExceptionA), b1 (line 176): true, b2 (line 176): true] object creation of type ExceptionB | semmle.label | true |
-| Finally.cs:186:25:186:47 | [b1 (line 176): false, b2 (line 176): true] throw ...; | Finally.cs:188:13:191:13 | [exception: ExceptionB, b1 (line 176): false, b2 (line 176): true] catch (...) {...} | semmle.label | exception(ExceptionB) |
-| Finally.cs:186:25:186:47 | [finally: exception(Exception), b1 (line 176): true, b2 (line 176): true] throw ...; | Finally.cs:188:13:191:13 | [finally: exception(Exception), exception: ExceptionB, b1 (line 176): true, b2 (line 176): true] catch (...) {...} | semmle.label | exception(ExceptionB) |
-| Finally.cs:186:25:186:47 | [finally: exception(ExceptionA), b1 (line 176): true, b2 (line 176): true] throw ...; | Finally.cs:188:13:191:13 | [finally: exception(ExceptionA), exception: ExceptionB, b1 (line 176): true, b2 (line 176): true] catch (...) {...} | semmle.label | exception(ExceptionB) |
-| Finally.cs:186:31:186:46 | [b1 (line 176): false, b2 (line 176): true] object creation of type ExceptionB | Finally.cs:186:25:186:47 | [b1 (line 176): false, b2 (line 176): true] throw ...; | semmle.label | successor |
-| Finally.cs:186:31:186:46 | [b1 (line 176): false, b2 (line 176): true] object creation of type ExceptionB | Finally.cs:188:13:191:13 | [exception: Exception, b1 (line 176): false, b2 (line 176): true] catch (...) {...} | semmle.label | exception(Exception) |
-| Finally.cs:186:31:186:46 | [finally: exception(Exception), b1 (line 176): true, b2 (line 176): true] object creation of type ExceptionB | Finally.cs:186:25:186:47 | [finally: exception(Exception), b1 (line 176): true, b2 (line 176): true] throw ...; | semmle.label | successor |
-| Finally.cs:186:31:186:46 | [finally: exception(Exception), b1 (line 176): true, b2 (line 176): true] object creation of type ExceptionB | Finally.cs:188:13:191:13 | [finally: exception(Exception), exception: Exception, b1 (line 176): true, b2 (line 176): true] catch (...) {...} | semmle.label | exception(Exception) |
-| Finally.cs:186:31:186:46 | [finally: exception(ExceptionA), b1 (line 176): true, b2 (line 176): true] object creation of type ExceptionB | Finally.cs:186:25:186:47 | [finally: exception(ExceptionA), b1 (line 176): true, b2 (line 176): true] throw ...; | semmle.label | successor |
-| Finally.cs:186:31:186:46 | [finally: exception(ExceptionA), b1 (line 176): true, b2 (line 176): true] object creation of type ExceptionB | Finally.cs:188:13:191:13 | [finally: exception(ExceptionA), exception: Exception, b1 (line 176): true, b2 (line 176): true] catch (...) {...} | semmle.label | exception(Exception) |
-| Finally.cs:188:13:191:13 | [exception: Exception, b1 (line 176): false, b2 (line 176): true] catch (...) {...} | Finally.cs:176:10:176:11 | exit M9 (abnormal) | semmle.label | exception(Exception) |
-| Finally.cs:188:13:191:13 | [exception: Exception, b1 (line 176): false, b2 (line 176): true] catch (...) {...} | Finally.cs:188:38:188:39 | [exception: Exception, b1 (line 176): false, b2 (line 176): true] access to parameter b2 | semmle.label | match |
-| Finally.cs:188:13:191:13 | [exception: ExceptionB, b1 (line 176): false, b2 (line 176): true] catch (...) {...} | Finally.cs:188:38:188:39 | [exception: ExceptionB, b1 (line 176): false, b2 (line 176): true] access to parameter b2 | semmle.label | match |
-| Finally.cs:188:13:191:13 | [finally: exception(Exception), exception: Exception, b1 (line 176): true, b2 (line 176): true] catch (...) {...} | Finally.cs:176:10:176:11 | exit M9 (abnormal) | semmle.label | exception(Exception) |
-| Finally.cs:188:13:191:13 | [finally: exception(Exception), exception: Exception, b1 (line 176): true, b2 (line 176): true] catch (...) {...} | Finally.cs:188:38:188:39 | [finally: exception(Exception), exception: Exception, b1 (line 176): true, b2 (line 176): true] access to parameter b2 | semmle.label | match |
-| Finally.cs:188:13:191:13 | [finally: exception(Exception), exception: ExceptionB, b1 (line 176): true, b2 (line 176): true] catch (...) {...} | Finally.cs:188:38:188:39 | [finally: exception(Exception), exception: ExceptionB, b1 (line 176): true, b2 (line 176): true] access to parameter b2 | semmle.label | match |
-| Finally.cs:188:13:191:13 | [finally: exception(ExceptionA), exception: Exception, b1 (line 176): true, b2 (line 176): true] catch (...) {...} | Finally.cs:176:10:176:11 | exit M9 (abnormal) | semmle.label | exception(Exception) |
-| Finally.cs:188:13:191:13 | [finally: exception(ExceptionA), exception: Exception, b1 (line 176): true, b2 (line 176): true] catch (...) {...} | Finally.cs:188:38:188:39 | [finally: exception(ExceptionA), exception: Exception, b1 (line 176): true, b2 (line 176): true] access to parameter b2 | semmle.label | match |
-| Finally.cs:188:13:191:13 | [finally: exception(ExceptionA), exception: ExceptionB, b1 (line 176): true, b2 (line 176): true] catch (...) {...} | Finally.cs:188:38:188:39 | [finally: exception(ExceptionA), exception: ExceptionB, b1 (line 176): true, b2 (line 176): true] access to parameter b2 | semmle.label | match |
-| Finally.cs:188:38:188:39 | [exception: Exception, b1 (line 176): false, b2 (line 176): true] access to parameter b2 | Finally.cs:189:13:191:13 | [b1 (line 176): false] {...} | semmle.label | true |
-| Finally.cs:188:38:188:39 | [exception: ExceptionB, b1 (line 176): false, b2 (line 176): true] access to parameter b2 | Finally.cs:189:13:191:13 | [b1 (line 176): false] {...} | semmle.label | true |
-| Finally.cs:188:38:188:39 | [finally: exception(Exception), exception: Exception, b1 (line 176): true, b2 (line 176): true] access to parameter b2 | Finally.cs:189:13:191:13 | [finally: exception(Exception), b1 (line 176): true] {...} | semmle.label | true |
-| Finally.cs:188:38:188:39 | [finally: exception(Exception), exception: ExceptionB, b1 (line 176): true, b2 (line 176): true] access to parameter b2 | Finally.cs:189:13:191:13 | [finally: exception(Exception), b1 (line 176): true] {...} | semmle.label | true |
-| Finally.cs:188:38:188:39 | [finally: exception(ExceptionA), exception: Exception, b1 (line 176): true, b2 (line 176): true] access to parameter b2 | Finally.cs:189:13:191:13 | [finally: exception(ExceptionA), b1 (line 176): true] {...} | semmle.label | true |
-| Finally.cs:188:38:188:39 | [finally: exception(ExceptionA), exception: ExceptionB, b1 (line 176): true, b2 (line 176): true] access to parameter b2 | Finally.cs:189:13:191:13 | [finally: exception(ExceptionA), b1 (line 176): true] {...} | semmle.label | true |
-| Finally.cs:189:13:191:13 | [b1 (line 176): false] {...} | Finally.cs:190:17:190:47 | [b1 (line 176): false] if (...) ... | semmle.label | successor |
-| Finally.cs:189:13:191:13 | [finally: exception(Exception), b1 (line 176): true] {...} | Finally.cs:190:17:190:47 | [finally: exception(Exception), b1 (line 176): true] if (...) ... | semmle.label | successor |
-| Finally.cs:189:13:191:13 | [finally: exception(ExceptionA), b1 (line 176): true] {...} | Finally.cs:190:17:190:47 | [finally: exception(ExceptionA), b1 (line 176): true] if (...) ... | semmle.label | successor |
-| Finally.cs:190:17:190:47 | [b1 (line 176): false] if (...) ... | Finally.cs:190:21:190:22 | [b1 (line 176): false] access to parameter b1 | semmle.label | successor |
-| Finally.cs:190:17:190:47 | [finally: exception(Exception), b1 (line 176): true] if (...) ... | Finally.cs:190:21:190:22 | [finally: exception(Exception), b1 (line 176): true] access to parameter b1 | semmle.label | successor |
-| Finally.cs:190:17:190:47 | [finally: exception(ExceptionA), b1 (line 176): true] if (...) ... | Finally.cs:190:21:190:22 | [finally: exception(ExceptionA), b1 (line 176): true] access to parameter b1 | semmle.label | successor |
-| Finally.cs:190:21:190:22 | [b1 (line 176): false] access to parameter b1 | Finally.cs:176:10:176:11 | exit M9 (normal) | semmle.label | false |
-| Finally.cs:190:21:190:22 | [finally: exception(Exception), b1 (line 176): true] access to parameter b1 | Finally.cs:190:31:190:46 | [finally: exception(Exception)] object creation of type ExceptionC | semmle.label | true |
-| Finally.cs:190:21:190:22 | [finally: exception(ExceptionA), b1 (line 176): true] access to parameter b1 | Finally.cs:190:31:190:46 | [finally: exception(ExceptionA)] object creation of type ExceptionC | semmle.label | true |
-| Finally.cs:190:25:190:47 | [finally: exception(Exception)] throw ...; | Finally.cs:176:10:176:11 | exit M9 (abnormal) | semmle.label | exception(ExceptionC) |
-| Finally.cs:190:25:190:47 | [finally: exception(ExceptionA)] throw ...; | Finally.cs:176:10:176:11 | exit M9 (abnormal) | semmle.label | exception(ExceptionC) |
-| Finally.cs:190:31:190:46 | [finally: exception(Exception)] object creation of type ExceptionC | Finally.cs:190:25:190:47 | [finally: exception(Exception)] throw ...; | semmle.label | successor |
-| Finally.cs:190:31:190:46 | [finally: exception(ExceptionA)] object creation of type ExceptionC | Finally.cs:190:25:190:47 | [finally: exception(ExceptionA)] throw ...; | semmle.label | successor |
-| Finally.cs:195:10:195:12 | enter M10 | Finally.cs:196:5:214:5 | {...} | semmle.label | successor |
-| Finally.cs:195:10:195:12 | exit M10 (abnormal) | Finally.cs:195:10:195:12 | exit M10 | semmle.label | successor |
-| Finally.cs:195:10:195:12 | exit M10 (normal) | Finally.cs:195:10:195:12 | exit M10 | semmle.label | successor |
-| Finally.cs:196:5:214:5 | {...} | Finally.cs:197:9:212:9 | try {...} ... | semmle.label | successor |
-| Finally.cs:197:9:212:9 | try {...} ... | Finally.cs:198:9:200:9 | {...} | semmle.label | successor |
-| Finally.cs:198:9:200:9 | {...} | Finally.cs:199:13:199:43 | if (...) ... | semmle.label | successor |
-| Finally.cs:199:13:199:43 | if (...) ... | Finally.cs:199:17:199:18 | access to parameter b1 | semmle.label | successor |
-| Finally.cs:199:17:199:18 | access to parameter b1 | Finally.cs:199:27:199:42 | object creation of type ExceptionA | semmle.label | true |
-| Finally.cs:199:17:199:18 | access to parameter b1 | Finally.cs:202:9:212:9 | {...} | semmle.label | false |
-| Finally.cs:199:21:199:43 | throw ...; | Finally.cs:202:9:212:9 | [finally: exception(ExceptionA)] {...} | semmle.label | exception(ExceptionA) |
-| Finally.cs:199:27:199:42 | object creation of type ExceptionA | Finally.cs:199:21:199:43 | throw ...; | semmle.label | successor |
-| Finally.cs:199:27:199:42 | object creation of type ExceptionA | Finally.cs:202:9:212:9 | [finally: exception(Exception)] {...} | semmle.label | exception(Exception) |
-| Finally.cs:202:9:212:9 | [finally: exception(Exception)] {...} | Finally.cs:203:13:210:13 | [finally: exception(Exception)] try {...} ... | semmle.label | successor |
-| Finally.cs:202:9:212:9 | [finally: exception(ExceptionA)] {...} | Finally.cs:203:13:210:13 | [finally: exception(ExceptionA)] try {...} ... | semmle.label | successor |
-| Finally.cs:202:9:212:9 | {...} | Finally.cs:203:13:210:13 | try {...} ... | semmle.label | successor |
-| Finally.cs:203:13:210:13 | [finally: exception(Exception)] try {...} ... | Finally.cs:204:13:206:13 | [finally: exception(Exception)] {...} | semmle.label | successor |
-| Finally.cs:203:13:210:13 | [finally: exception(ExceptionA)] try {...} ... | Finally.cs:204:13:206:13 | [finally: exception(ExceptionA)] {...} | semmle.label | successor |
-| Finally.cs:203:13:210:13 | try {...} ... | Finally.cs:204:13:206:13 | {...} | semmle.label | successor |
-| Finally.cs:204:13:206:13 | [finally: exception(Exception)] {...} | Finally.cs:205:17:205:47 | [finally: exception(Exception)] if (...) ... | semmle.label | successor |
-| Finally.cs:204:13:206:13 | [finally: exception(ExceptionA)] {...} | Finally.cs:205:17:205:47 | [finally: exception(ExceptionA)] if (...) ... | semmle.label | successor |
-| Finally.cs:204:13:206:13 | {...} | Finally.cs:205:17:205:47 | if (...) ... | semmle.label | successor |
-| Finally.cs:205:17:205:47 | [finally: exception(Exception)] if (...) ... | Finally.cs:205:21:205:22 | [finally: exception(Exception)] access to parameter b2 | semmle.label | successor |
-| Finally.cs:205:17:205:47 | [finally: exception(ExceptionA)] if (...) ... | Finally.cs:205:21:205:22 | [finally: exception(ExceptionA)] access to parameter b2 | semmle.label | successor |
-| Finally.cs:205:17:205:47 | if (...) ... | Finally.cs:205:21:205:22 | access to parameter b2 | semmle.label | successor |
-| Finally.cs:205:21:205:22 | [finally: exception(Exception)] access to parameter b2 | Finally.cs:205:31:205:46 | [finally: exception(Exception)] object creation of type ExceptionB | semmle.label | true |
-| Finally.cs:205:21:205:22 | [finally: exception(Exception)] access to parameter b2 | Finally.cs:208:13:210:13 | [finally: exception(Exception)] {...} | semmle.label | false |
-| Finally.cs:205:21:205:22 | [finally: exception(ExceptionA)] access to parameter b2 | Finally.cs:205:31:205:46 | [finally: exception(ExceptionA)] object creation of type ExceptionB | semmle.label | true |
-| Finally.cs:205:21:205:22 | [finally: exception(ExceptionA)] access to parameter b2 | Finally.cs:208:13:210:13 | [finally: exception(ExceptionA)] {...} | semmle.label | false |
-| Finally.cs:205:21:205:22 | access to parameter b2 | Finally.cs:205:31:205:46 | object creation of type ExceptionB | semmle.label | true |
-| Finally.cs:205:21:205:22 | access to parameter b2 | Finally.cs:208:13:210:13 | {...} | semmle.label | false |
-| Finally.cs:205:25:205:47 | [finally: exception(Exception)] throw ...; | Finally.cs:208:13:210:13 | [finally: exception(Exception), finally(1): exception(ExceptionB)] {...} | semmle.label | exception(ExceptionB) |
-| Finally.cs:205:25:205:47 | [finally: exception(ExceptionA)] throw ...; | Finally.cs:208:13:210:13 | [finally: exception(ExceptionA), finally(1): exception(ExceptionB)] {...} | semmle.label | exception(ExceptionB) |
-| Finally.cs:205:25:205:47 | throw ...; | Finally.cs:208:13:210:13 | [finally(1): exception(ExceptionB)] {...} | semmle.label | exception(ExceptionB) |
-| Finally.cs:205:31:205:46 | [finally: exception(Exception)] object creation of type ExceptionB | Finally.cs:205:25:205:47 | [finally: exception(Exception)] throw ...; | semmle.label | successor |
-| Finally.cs:205:31:205:46 | [finally: exception(Exception)] object creation of type ExceptionB | Finally.cs:208:13:210:13 | [finally: exception(Exception), finally(1): exception(Exception)] {...} | semmle.label | exception(Exception) |
-| Finally.cs:205:31:205:46 | [finally: exception(ExceptionA)] object creation of type ExceptionB | Finally.cs:205:25:205:47 | [finally: exception(ExceptionA)] throw ...; | semmle.label | successor |
-| Finally.cs:205:31:205:46 | [finally: exception(ExceptionA)] object creation of type ExceptionB | Finally.cs:208:13:210:13 | [finally: exception(ExceptionA), finally(1): exception(Exception)] {...} | semmle.label | exception(Exception) |
-| Finally.cs:205:31:205:46 | object creation of type ExceptionB | Finally.cs:205:25:205:47 | throw ...; | semmle.label | successor |
-| Finally.cs:205:31:205:46 | object creation of type ExceptionB | Finally.cs:208:13:210:13 | [finally(1): exception(Exception)] {...} | semmle.label | exception(Exception) |
-| Finally.cs:208:13:210:13 | [finally(1): exception(Exception)] {...} | Finally.cs:209:17:209:47 | [finally(1): exception(Exception)] if (...) ... | semmle.label | successor |
-| Finally.cs:208:13:210:13 | [finally(1): exception(ExceptionB)] {...} | Finally.cs:209:17:209:47 | [finally(1): exception(ExceptionB)] if (...) ... | semmle.label | successor |
-| Finally.cs:208:13:210:13 | [finally: exception(Exception), finally(1): exception(Exception)] {...} | Finally.cs:209:17:209:47 | [finally: exception(Exception), finally(1): exception(Exception)] if (...) ... | semmle.label | successor |
-| Finally.cs:208:13:210:13 | [finally: exception(Exception), finally(1): exception(ExceptionB)] {...} | Finally.cs:209:17:209:47 | [finally: exception(Exception), finally(1): exception(ExceptionB)] if (...) ... | semmle.label | successor |
-| Finally.cs:208:13:210:13 | [finally: exception(Exception)] {...} | Finally.cs:209:17:209:47 | [finally: exception(Exception)] if (...) ... | semmle.label | successor |
-| Finally.cs:208:13:210:13 | [finally: exception(ExceptionA), finally(1): exception(Exception)] {...} | Finally.cs:209:17:209:47 | [finally: exception(ExceptionA), finally(1): exception(Exception)] if (...) ... | semmle.label | successor |
-| Finally.cs:208:13:210:13 | [finally: exception(ExceptionA), finally(1): exception(ExceptionB)] {...} | Finally.cs:209:17:209:47 | [finally: exception(ExceptionA), finally(1): exception(ExceptionB)] if (...) ... | semmle.label | successor |
-| Finally.cs:208:13:210:13 | [finally: exception(ExceptionA)] {...} | Finally.cs:209:17:209:47 | [finally: exception(ExceptionA)] if (...) ... | semmle.label | successor |
-| Finally.cs:208:13:210:13 | {...} | Finally.cs:209:17:209:47 | if (...) ... | semmle.label | successor |
-| Finally.cs:209:17:209:47 | [finally(1): exception(Exception)] if (...) ... | Finally.cs:209:21:209:22 | [finally(1): exception(Exception)] access to parameter b3 | semmle.label | successor |
-| Finally.cs:209:17:209:47 | [finally(1): exception(ExceptionB)] if (...) ... | Finally.cs:209:21:209:22 | [finally(1): exception(ExceptionB)] access to parameter b3 | semmle.label | successor |
-| Finally.cs:209:17:209:47 | [finally: exception(Exception), finally(1): exception(Exception)] if (...) ... | Finally.cs:209:21:209:22 | [finally: exception(Exception), finally(1): exception(Exception)] access to parameter b3 | semmle.label | successor |
-| Finally.cs:209:17:209:47 | [finally: exception(Exception), finally(1): exception(ExceptionB)] if (...) ... | Finally.cs:209:21:209:22 | [finally: exception(Exception), finally(1): exception(ExceptionB)] access to parameter b3 | semmle.label | successor |
-| Finally.cs:209:17:209:47 | [finally: exception(Exception)] if (...) ... | Finally.cs:209:21:209:22 | [finally: exception(Exception)] access to parameter b3 | semmle.label | successor |
-| Finally.cs:209:17:209:47 | [finally: exception(ExceptionA), finally(1): exception(Exception)] if (...) ... | Finally.cs:209:21:209:22 | [finally: exception(ExceptionA), finally(1): exception(Exception)] access to parameter b3 | semmle.label | successor |
-| Finally.cs:209:17:209:47 | [finally: exception(ExceptionA), finally(1): exception(ExceptionB)] if (...) ... | Finally.cs:209:21:209:22 | [finally: exception(ExceptionA), finally(1): exception(ExceptionB)] access to parameter b3 | semmle.label | successor |
-| Finally.cs:209:17:209:47 | [finally: exception(ExceptionA)] if (...) ... | Finally.cs:209:21:209:22 | [finally: exception(ExceptionA)] access to parameter b3 | semmle.label | successor |
-| Finally.cs:209:17:209:47 | if (...) ... | Finally.cs:209:21:209:22 | access to parameter b3 | semmle.label | successor |
-| Finally.cs:209:21:209:22 | [finally(1): exception(Exception)] access to parameter b3 | Finally.cs:195:10:195:12 | exit M10 (abnormal) | semmle.label | exception(Exception) |
-| Finally.cs:209:21:209:22 | [finally(1): exception(Exception)] access to parameter b3 | Finally.cs:209:31:209:46 | [finally(1): exception(Exception)] object creation of type ExceptionC | semmle.label | true |
-| Finally.cs:209:21:209:22 | [finally(1): exception(ExceptionB)] access to parameter b3 | Finally.cs:195:10:195:12 | exit M10 (abnormal) | semmle.label | exception(ExceptionB) |
-| Finally.cs:209:21:209:22 | [finally(1): exception(ExceptionB)] access to parameter b3 | Finally.cs:209:31:209:46 | [finally(1): exception(ExceptionB)] object creation of type ExceptionC | semmle.label | true |
-| Finally.cs:209:21:209:22 | [finally: exception(Exception), finally(1): exception(Exception)] access to parameter b3 | Finally.cs:195:10:195:12 | exit M10 (abnormal) | semmle.label | exception(Exception) |
-| Finally.cs:209:21:209:22 | [finally: exception(Exception), finally(1): exception(Exception)] access to parameter b3 | Finally.cs:209:31:209:46 | [finally: exception(Exception), finally(1): exception(Exception)] object creation of type ExceptionC | semmle.label | true |
-| Finally.cs:209:21:209:22 | [finally: exception(Exception), finally(1): exception(ExceptionB)] access to parameter b3 | Finally.cs:195:10:195:12 | exit M10 (abnormal) | semmle.label | exception(ExceptionB) |
-| Finally.cs:209:21:209:22 | [finally: exception(Exception), finally(1): exception(ExceptionB)] access to parameter b3 | Finally.cs:209:31:209:46 | [finally: exception(Exception), finally(1): exception(ExceptionB)] object creation of type ExceptionC | semmle.label | true |
-| Finally.cs:209:21:209:22 | [finally: exception(Exception)] access to parameter b3 | Finally.cs:209:31:209:46 | [finally: exception(Exception)] object creation of type ExceptionC | semmle.label | true |
-| Finally.cs:209:21:209:22 | [finally: exception(Exception)] access to parameter b3 | Finally.cs:211:13:211:29 | [finally: exception(Exception)] ...; | semmle.label | false |
-| Finally.cs:209:21:209:22 | [finally: exception(ExceptionA), finally(1): exception(Exception)] access to parameter b3 | Finally.cs:195:10:195:12 | exit M10 (abnormal) | semmle.label | exception(Exception) |
-| Finally.cs:209:21:209:22 | [finally: exception(ExceptionA), finally(1): exception(Exception)] access to parameter b3 | Finally.cs:209:31:209:46 | [finally: exception(ExceptionA), finally(1): exception(Exception)] object creation of type ExceptionC | semmle.label | true |
-| Finally.cs:209:21:209:22 | [finally: exception(ExceptionA), finally(1): exception(ExceptionB)] access to parameter b3 | Finally.cs:195:10:195:12 | exit M10 (abnormal) | semmle.label | exception(ExceptionB) |
-| Finally.cs:209:21:209:22 | [finally: exception(ExceptionA), finally(1): exception(ExceptionB)] access to parameter b3 | Finally.cs:209:31:209:46 | [finally: exception(ExceptionA), finally(1): exception(ExceptionB)] object creation of type ExceptionC | semmle.label | true |
-| Finally.cs:209:21:209:22 | [finally: exception(ExceptionA)] access to parameter b3 | Finally.cs:209:31:209:46 | [finally: exception(ExceptionA)] object creation of type ExceptionC | semmle.label | true |
-| Finally.cs:209:21:209:22 | [finally: exception(ExceptionA)] access to parameter b3 | Finally.cs:211:13:211:29 | [finally: exception(ExceptionA)] ...; | semmle.label | false |
-| Finally.cs:209:21:209:22 | access to parameter b3 | Finally.cs:209:31:209:46 | object creation of type ExceptionC | semmle.label | true |
-| Finally.cs:209:21:209:22 | access to parameter b3 | Finally.cs:211:13:211:29 | ...; | semmle.label | false |
-| Finally.cs:209:25:209:47 | [finally(1): exception(Exception)] throw ...; | Finally.cs:195:10:195:12 | exit M10 (abnormal) | semmle.label | exception(ExceptionC) |
-| Finally.cs:209:25:209:47 | [finally(1): exception(ExceptionB)] throw ...; | Finally.cs:195:10:195:12 | exit M10 (abnormal) | semmle.label | exception(ExceptionC) |
-| Finally.cs:209:25:209:47 | [finally: exception(Exception), finally(1): exception(Exception)] throw ...; | Finally.cs:195:10:195:12 | exit M10 (abnormal) | semmle.label | exception(ExceptionC) |
-| Finally.cs:209:25:209:47 | [finally: exception(Exception), finally(1): exception(ExceptionB)] throw ...; | Finally.cs:195:10:195:12 | exit M10 (abnormal) | semmle.label | exception(ExceptionC) |
-| Finally.cs:209:25:209:47 | [finally: exception(Exception)] throw ...; | Finally.cs:195:10:195:12 | exit M10 (abnormal) | semmle.label | exception(ExceptionC) |
-| Finally.cs:209:25:209:47 | [finally: exception(ExceptionA), finally(1): exception(Exception)] throw ...; | Finally.cs:195:10:195:12 | exit M10 (abnormal) | semmle.label | exception(ExceptionC) |
-| Finally.cs:209:25:209:47 | [finally: exception(ExceptionA), finally(1): exception(ExceptionB)] throw ...; | Finally.cs:195:10:195:12 | exit M10 (abnormal) | semmle.label | exception(ExceptionC) |
-| Finally.cs:209:25:209:47 | [finally: exception(ExceptionA)] throw ...; | Finally.cs:195:10:195:12 | exit M10 (abnormal) | semmle.label | exception(ExceptionC) |
-| Finally.cs:209:25:209:47 | throw ...; | Finally.cs:195:10:195:12 | exit M10 (abnormal) | semmle.label | exception(ExceptionC) |
-| Finally.cs:209:31:209:46 | [finally(1): exception(Exception)] object creation of type ExceptionC | Finally.cs:209:25:209:47 | [finally(1): exception(Exception)] throw ...; | semmle.label | successor |
-| Finally.cs:209:31:209:46 | [finally(1): exception(ExceptionB)] object creation of type ExceptionC | Finally.cs:209:25:209:47 | [finally(1): exception(ExceptionB)] throw ...; | semmle.label | successor |
-| Finally.cs:209:31:209:46 | [finally: exception(Exception), finally(1): exception(Exception)] object creation of type ExceptionC | Finally.cs:209:25:209:47 | [finally: exception(Exception), finally(1): exception(Exception)] throw ...; | semmle.label | successor |
-| Finally.cs:209:31:209:46 | [finally: exception(Exception), finally(1): exception(ExceptionB)] object creation of type ExceptionC | Finally.cs:209:25:209:47 | [finally: exception(Exception), finally(1): exception(ExceptionB)] throw ...; | semmle.label | successor |
-| Finally.cs:209:31:209:46 | [finally: exception(Exception)] object creation of type ExceptionC | Finally.cs:209:25:209:47 | [finally: exception(Exception)] throw ...; | semmle.label | successor |
-| Finally.cs:209:31:209:46 | [finally: exception(ExceptionA), finally(1): exception(Exception)] object creation of type ExceptionC | Finally.cs:209:25:209:47 | [finally: exception(ExceptionA), finally(1): exception(Exception)] throw ...; | semmle.label | successor |
-| Finally.cs:209:31:209:46 | [finally: exception(ExceptionA), finally(1): exception(ExceptionB)] object creation of type ExceptionC | Finally.cs:209:25:209:47 | [finally: exception(ExceptionA), finally(1): exception(ExceptionB)] throw ...; | semmle.label | successor |
-| Finally.cs:209:31:209:46 | [finally: exception(ExceptionA)] object creation of type ExceptionC | Finally.cs:209:25:209:47 | [finally: exception(ExceptionA)] throw ...; | semmle.label | successor |
-| Finally.cs:209:31:209:46 | object creation of type ExceptionC | Finally.cs:209:25:209:47 | throw ...; | semmle.label | successor |
-| Finally.cs:211:13:211:16 | [finally: exception(Exception)] this access | Finally.cs:211:26:211:28 | [finally: exception(Exception)] "0" | semmle.label | successor |
-| Finally.cs:211:13:211:16 | [finally: exception(ExceptionA)] this access | Finally.cs:211:26:211:28 | [finally: exception(ExceptionA)] "0" | semmle.label | successor |
-| Finally.cs:211:13:211:16 | this access | Finally.cs:211:26:211:28 | "0" | semmle.label | successor |
-| Finally.cs:211:13:211:28 | ... = ... | Finally.cs:213:9:213:25 | ...; | semmle.label | successor |
-| Finally.cs:211:13:211:28 | [finally: exception(Exception)] ... = ... | Finally.cs:195:10:195:12 | exit M10 (abnormal) | semmle.label | exception(Exception) |
-| Finally.cs:211:13:211:28 | [finally: exception(ExceptionA)] ... = ... | Finally.cs:195:10:195:12 | exit M10 (abnormal) | semmle.label | exception(ExceptionA) |
-| Finally.cs:211:13:211:29 | ...; | Finally.cs:211:13:211:16 | this access | semmle.label | successor |
-| Finally.cs:211:13:211:29 | [finally: exception(Exception)] ...; | Finally.cs:211:13:211:16 | [finally: exception(Exception)] this access | semmle.label | successor |
-| Finally.cs:211:13:211:29 | [finally: exception(ExceptionA)] ...; | Finally.cs:211:13:211:16 | [finally: exception(ExceptionA)] this access | semmle.label | successor |
-| Finally.cs:211:26:211:28 | "0" | Finally.cs:211:13:211:28 | ... = ... | semmle.label | successor |
-| Finally.cs:211:26:211:28 | [finally: exception(Exception)] "0" | Finally.cs:211:13:211:28 | [finally: exception(Exception)] ... = ... | semmle.label | successor |
-| Finally.cs:211:26:211:28 | [finally: exception(ExceptionA)] "0" | Finally.cs:211:13:211:28 | [finally: exception(ExceptionA)] ... = ... | semmle.label | successor |
-| Finally.cs:213:9:213:12 | this access | Finally.cs:213:22:213:24 | "1" | semmle.label | successor |
-| Finally.cs:213:9:213:24 | ... = ... | Finally.cs:195:10:195:12 | exit M10 (normal) | semmle.label | successor |
-| Finally.cs:213:9:213:25 | ...; | Finally.cs:213:9:213:12 | this access | semmle.label | successor |
-| Finally.cs:213:22:213:24 | "1" | Finally.cs:213:9:213:24 | ... = ... | semmle.label | successor |
-| Finally.cs:216:10:216:12 | enter M11 | Finally.cs:217:5:231:5 | {...} | semmle.label | successor |
-| Finally.cs:216:10:216:12 | exit M11 (normal) | Finally.cs:216:10:216:12 | exit M11 | semmle.label | successor |
-| Finally.cs:217:5:231:5 | {...} | Finally.cs:218:9:229:9 | try {...} ... | semmle.label | successor |
-| Finally.cs:218:9:229:9 | try {...} ... | Finally.cs:219:9:221:9 | {...} | semmle.label | successor |
-| Finally.cs:219:9:221:9 | {...} | Finally.cs:220:13:220:37 | ...; | semmle.label | successor |
-| Finally.cs:220:13:220:36 | call to method WriteLine | Finally.cs:222:9:225:9 | catch {...} | semmle.label | exception(Exception) |
-| Finally.cs:220:13:220:36 | call to method WriteLine | Finally.cs:227:9:229:9 | {...} | semmle.label | successor |
-| Finally.cs:220:13:220:37 | ...; | Finally.cs:220:31:220:35 | "Try" | semmle.label | successor |
-| Finally.cs:220:31:220:35 | "Try" | Finally.cs:220:13:220:36 | call to method WriteLine | semmle.label | successor |
-| Finally.cs:222:9:225:9 | catch {...} | Finally.cs:223:9:225:9 | {...} | semmle.label | successor |
-| Finally.cs:223:9:225:9 | {...} | Finally.cs:224:13:224:39 | ...; | semmle.label | successor |
-| Finally.cs:224:13:224:38 | call to method WriteLine | Finally.cs:227:9:229:9 | {...} | semmle.label | successor |
-| Finally.cs:224:13:224:39 | ...; | Finally.cs:224:31:224:37 | "Catch" | semmle.label | successor |
-| Finally.cs:224:31:224:37 | "Catch" | Finally.cs:224:13:224:38 | call to method WriteLine | semmle.label | successor |
-| Finally.cs:227:9:229:9 | {...} | Finally.cs:228:13:228:41 | ...; | semmle.label | successor |
-| Finally.cs:228:13:228:40 | call to method WriteLine | Finally.cs:230:9:230:34 | ...; | semmle.label | successor |
-| Finally.cs:228:13:228:41 | ...; | Finally.cs:228:31:228:39 | "Finally" | semmle.label | successor |
-| Finally.cs:228:31:228:39 | "Finally" | Finally.cs:228:13:228:40 | call to method WriteLine | semmle.label | successor |
-| Finally.cs:230:9:230:33 | call to method WriteLine | Finally.cs:216:10:216:12 | exit M11 (normal) | semmle.label | successor |
-| Finally.cs:230:9:230:34 | ...; | Finally.cs:230:27:230:32 | "Done" | semmle.label | successor |
-| Finally.cs:230:27:230:32 | "Done" | Finally.cs:230:9:230:33 | call to method WriteLine | semmle.label | successor |
-| Finally.cs:233:10:233:12 | enter M12 | Finally.cs:234:5:261:5 | {...} | semmle.label | successor |
-| Finally.cs:233:10:233:12 | exit M12 (abnormal) | Finally.cs:233:10:233:12 | exit M12 | semmle.label | successor |
-| Finally.cs:233:10:233:12 | exit M12 (normal) | Finally.cs:233:10:233:12 | exit M12 | semmle.label | successor |
-| Finally.cs:234:5:261:5 | {...} | Finally.cs:235:9:259:9 | try {...} ... | semmle.label | successor |
-| Finally.cs:235:9:259:9 | try {...} ... | Finally.cs:236:9:255:9 | {...} | semmle.label | successor |
-| Finally.cs:236:9:255:9 | {...} | Finally.cs:237:13:253:13 | try {...} ... | semmle.label | successor |
-| Finally.cs:237:13:253:13 | try {...} ... | Finally.cs:238:13:241:13 | {...} | semmle.label | successor |
-| Finally.cs:238:13:241:13 | {...} | Finally.cs:239:17:240:43 | if (...) ... | semmle.label | successor |
-| Finally.cs:239:17:240:43 | if (...) ... | Finally.cs:239:21:239:22 | access to parameter b1 | semmle.label | successor |
-| Finally.cs:239:21:239:22 | access to parameter b1 | Finally.cs:240:27:240:42 | object creation of type ExceptionA | semmle.label | true |
-| Finally.cs:239:21:239:22 | access to parameter b1 | Finally.cs:243:13:253:13 | {...} | semmle.label | false |
-| Finally.cs:240:21:240:43 | throw ...; | Finally.cs:243:13:253:13 | [finally: exception(ExceptionA)] {...} | semmle.label | exception(ExceptionA) |
-| Finally.cs:240:27:240:42 | object creation of type ExceptionA | Finally.cs:240:21:240:43 | throw ...; | semmle.label | successor |
-| Finally.cs:240:27:240:42 | object creation of type ExceptionA | Finally.cs:243:13:253:13 | [finally: exception(Exception)] {...} | semmle.label | exception(Exception) |
-| Finally.cs:243:13:253:13 | [finally: exception(Exception)] {...} | Finally.cs:244:17:252:17 | [finally: exception(Exception)] try {...} ... | semmle.label | successor |
-| Finally.cs:243:13:253:13 | [finally: exception(ExceptionA)] {...} | Finally.cs:244:17:252:17 | [finally: exception(ExceptionA)] try {...} ... | semmle.label | successor |
-| Finally.cs:243:13:253:13 | {...} | Finally.cs:244:17:252:17 | try {...} ... | semmle.label | successor |
-| Finally.cs:244:17:252:17 | [finally: exception(Exception)] try {...} ... | Finally.cs:245:17:248:17 | [finally: exception(Exception)] {...} | semmle.label | successor |
-| Finally.cs:244:17:252:17 | [finally: exception(ExceptionA)] try {...} ... | Finally.cs:245:17:248:17 | [finally: exception(ExceptionA)] {...} | semmle.label | successor |
-| Finally.cs:244:17:252:17 | try {...} ... | Finally.cs:245:17:248:17 | {...} | semmle.label | successor |
-| Finally.cs:245:17:248:17 | [finally: exception(Exception)] {...} | Finally.cs:246:21:247:47 | [finally: exception(Exception)] if (...) ... | semmle.label | successor |
-| Finally.cs:245:17:248:17 | [finally: exception(ExceptionA)] {...} | Finally.cs:246:21:247:47 | [finally: exception(ExceptionA)] if (...) ... | semmle.label | successor |
-| Finally.cs:245:17:248:17 | {...} | Finally.cs:246:21:247:47 | if (...) ... | semmle.label | successor |
-| Finally.cs:246:21:247:47 | [finally: exception(Exception)] if (...) ... | Finally.cs:246:25:246:26 | [finally: exception(Exception)] access to parameter b2 | semmle.label | successor |
-| Finally.cs:246:21:247:47 | [finally: exception(ExceptionA)] if (...) ... | Finally.cs:246:25:246:26 | [finally: exception(ExceptionA)] access to parameter b2 | semmle.label | successor |
-| Finally.cs:246:21:247:47 | if (...) ... | Finally.cs:246:25:246:26 | access to parameter b2 | semmle.label | successor |
-| Finally.cs:246:25:246:26 | [finally: exception(Exception)] access to parameter b2 | Finally.cs:247:31:247:46 | [finally: exception(Exception)] object creation of type ExceptionA | semmle.label | true |
-| Finally.cs:246:25:246:26 | [finally: exception(Exception)] access to parameter b2 | Finally.cs:250:17:252:17 | [finally: exception(Exception)] {...} | semmle.label | false |
-| Finally.cs:246:25:246:26 | [finally: exception(ExceptionA)] access to parameter b2 | Finally.cs:247:31:247:46 | [finally: exception(ExceptionA)] object creation of type ExceptionA | semmle.label | true |
-| Finally.cs:246:25:246:26 | [finally: exception(ExceptionA)] access to parameter b2 | Finally.cs:250:17:252:17 | [finally: exception(ExceptionA)] {...} | semmle.label | false |
-| Finally.cs:246:25:246:26 | access to parameter b2 | Finally.cs:247:31:247:46 | object creation of type ExceptionA | semmle.label | true |
-| Finally.cs:246:25:246:26 | access to parameter b2 | Finally.cs:250:17:252:17 | {...} | semmle.label | false |
-| Finally.cs:247:25:247:47 | [finally: exception(Exception)] throw ...; | Finally.cs:250:17:252:17 | [finally: exception(Exception), finally(1): exception(ExceptionA)] {...} | semmle.label | exception(ExceptionA) |
-| Finally.cs:247:25:247:47 | [finally: exception(ExceptionA)] throw ...; | Finally.cs:250:17:252:17 | [finally: exception(ExceptionA), finally(1): exception(ExceptionA)] {...} | semmle.label | exception(ExceptionA) |
-| Finally.cs:247:25:247:47 | throw ...; | Finally.cs:250:17:252:17 | [finally(1): exception(ExceptionA)] {...} | semmle.label | exception(ExceptionA) |
-| Finally.cs:247:31:247:46 | [finally: exception(Exception)] object creation of type ExceptionA | Finally.cs:247:25:247:47 | [finally: exception(Exception)] throw ...; | semmle.label | successor |
-| Finally.cs:247:31:247:46 | [finally: exception(Exception)] object creation of type ExceptionA | Finally.cs:250:17:252:17 | [finally: exception(Exception), finally(1): exception(Exception)] {...} | semmle.label | exception(Exception) |
-| Finally.cs:247:31:247:46 | [finally: exception(ExceptionA)] object creation of type ExceptionA | Finally.cs:247:25:247:47 | [finally: exception(ExceptionA)] throw ...; | semmle.label | successor |
-| Finally.cs:247:31:247:46 | [finally: exception(ExceptionA)] object creation of type ExceptionA | Finally.cs:250:17:252:17 | [finally: exception(ExceptionA), finally(1): exception(Exception)] {...} | semmle.label | exception(Exception) |
-| Finally.cs:247:31:247:46 | object creation of type ExceptionA | Finally.cs:247:25:247:47 | throw ...; | semmle.label | successor |
-| Finally.cs:247:31:247:46 | object creation of type ExceptionA | Finally.cs:250:17:252:17 | [finally(1): exception(Exception)] {...} | semmle.label | exception(Exception) |
-| Finally.cs:250:17:252:17 | [finally(1): exception(Exception)] {...} | Finally.cs:251:21:251:55 | [finally(1): exception(Exception)] ...; | semmle.label | successor |
-| Finally.cs:250:17:252:17 | [finally(1): exception(ExceptionA)] {...} | Finally.cs:251:21:251:55 | [finally(1): exception(ExceptionA)] ...; | semmle.label | successor |
-| Finally.cs:250:17:252:17 | [finally: exception(Exception), finally(1): exception(Exception)] {...} | Finally.cs:251:21:251:55 | [finally: exception(Exception), finally(1): exception(Exception)] ...; | semmle.label | successor |
-| Finally.cs:250:17:252:17 | [finally: exception(Exception), finally(1): exception(ExceptionA)] {...} | Finally.cs:251:21:251:55 | [finally: exception(Exception), finally(1): exception(ExceptionA)] ...; | semmle.label | successor |
-| Finally.cs:250:17:252:17 | [finally: exception(Exception)] {...} | Finally.cs:251:21:251:55 | [finally: exception(Exception)] ...; | semmle.label | successor |
-| Finally.cs:250:17:252:17 | [finally: exception(ExceptionA), finally(1): exception(Exception)] {...} | Finally.cs:251:21:251:55 | [finally: exception(ExceptionA), finally(1): exception(Exception)] ...; | semmle.label | successor |
-| Finally.cs:250:17:252:17 | [finally: exception(ExceptionA), finally(1): exception(ExceptionA)] {...} | Finally.cs:251:21:251:55 | [finally: exception(ExceptionA), finally(1): exception(ExceptionA)] ...; | semmle.label | successor |
-| Finally.cs:250:17:252:17 | [finally: exception(ExceptionA)] {...} | Finally.cs:251:21:251:55 | [finally: exception(ExceptionA)] ...; | semmle.label | successor |
-| Finally.cs:250:17:252:17 | {...} | Finally.cs:251:21:251:55 | ...; | semmle.label | successor |
-| Finally.cs:251:21:251:54 | [finally(1): exception(Exception)] call to method WriteLine | Finally.cs:257:9:259:9 | [finally: exception(Exception)] {...} | semmle.label | exception(Exception) |
-| Finally.cs:251:21:251:54 | [finally(1): exception(ExceptionA)] call to method WriteLine | Finally.cs:257:9:259:9 | [finally: exception(ExceptionA)] {...} | semmle.label | exception(ExceptionA) |
-| Finally.cs:251:21:251:54 | [finally: exception(Exception), finally(1): exception(Exception)] call to method WriteLine | Finally.cs:257:9:259:9 | [finally: exception(Exception)] {...} | semmle.label | exception(Exception) |
-| Finally.cs:251:21:251:54 | [finally: exception(Exception), finally(1): exception(ExceptionA)] call to method WriteLine | Finally.cs:257:9:259:9 | [finally: exception(ExceptionA)] {...} | semmle.label | exception(ExceptionA) |
-| Finally.cs:251:21:251:54 | [finally: exception(Exception)] call to method WriteLine | Finally.cs:257:9:259:9 | [finally: exception(Exception)] {...} | semmle.label | exception(Exception) |
-| Finally.cs:251:21:251:54 | [finally: exception(ExceptionA), finally(1): exception(Exception)] call to method WriteLine | Finally.cs:257:9:259:9 | [finally: exception(Exception)] {...} | semmle.label | exception(Exception) |
-| Finally.cs:251:21:251:54 | [finally: exception(ExceptionA), finally(1): exception(ExceptionA)] call to method WriteLine | Finally.cs:257:9:259:9 | [finally: exception(ExceptionA)] {...} | semmle.label | exception(ExceptionA) |
-| Finally.cs:251:21:251:54 | [finally: exception(ExceptionA)] call to method WriteLine | Finally.cs:257:9:259:9 | [finally: exception(ExceptionA)] {...} | semmle.label | exception(ExceptionA) |
-| Finally.cs:251:21:251:54 | call to method WriteLine | Finally.cs:254:13:254:45 | ...; | semmle.label | successor |
-| Finally.cs:251:21:251:55 | ...; | Finally.cs:251:39:251:53 | "Inner finally" | semmle.label | successor |
-| Finally.cs:251:21:251:55 | [finally(1): exception(Exception)] ...; | Finally.cs:251:39:251:53 | [finally(1): exception(Exception)] "Inner finally" | semmle.label | successor |
-| Finally.cs:251:21:251:55 | [finally(1): exception(ExceptionA)] ...; | Finally.cs:251:39:251:53 | [finally(1): exception(ExceptionA)] "Inner finally" | semmle.label | successor |
-| Finally.cs:251:21:251:55 | [finally: exception(Exception), finally(1): exception(Exception)] ...; | Finally.cs:251:39:251:53 | [finally: exception(Exception), finally(1): exception(Exception)] "Inner finally" | semmle.label | successor |
-| Finally.cs:251:21:251:55 | [finally: exception(Exception), finally(1): exception(ExceptionA)] ...; | Finally.cs:251:39:251:53 | [finally: exception(Exception), finally(1): exception(ExceptionA)] "Inner finally" | semmle.label | successor |
-| Finally.cs:251:21:251:55 | [finally: exception(Exception)] ...; | Finally.cs:251:39:251:53 | [finally: exception(Exception)] "Inner finally" | semmle.label | successor |
-| Finally.cs:251:21:251:55 | [finally: exception(ExceptionA), finally(1): exception(Exception)] ...; | Finally.cs:251:39:251:53 | [finally: exception(ExceptionA), finally(1): exception(Exception)] "Inner finally" | semmle.label | successor |
-| Finally.cs:251:21:251:55 | [finally: exception(ExceptionA), finally(1): exception(ExceptionA)] ...; | Finally.cs:251:39:251:53 | [finally: exception(ExceptionA), finally(1): exception(ExceptionA)] "Inner finally" | semmle.label | successor |
-| Finally.cs:251:21:251:55 | [finally: exception(ExceptionA)] ...; | Finally.cs:251:39:251:53 | [finally: exception(ExceptionA)] "Inner finally" | semmle.label | successor |
-| Finally.cs:251:39:251:53 | "Inner finally" | Finally.cs:251:21:251:54 | call to method WriteLine | semmle.label | successor |
-| Finally.cs:251:39:251:53 | [finally(1): exception(Exception)] "Inner finally" | Finally.cs:251:21:251:54 | [finally(1): exception(Exception)] call to method WriteLine | semmle.label | successor |
-| Finally.cs:251:39:251:53 | [finally(1): exception(ExceptionA)] "Inner finally" | Finally.cs:251:21:251:54 | [finally(1): exception(ExceptionA)] call to method WriteLine | semmle.label | successor |
-| Finally.cs:251:39:251:53 | [finally: exception(Exception), finally(1): exception(Exception)] "Inner finally" | Finally.cs:251:21:251:54 | [finally: exception(Exception), finally(1): exception(Exception)] call to method WriteLine | semmle.label | successor |
-| Finally.cs:251:39:251:53 | [finally: exception(Exception), finally(1): exception(ExceptionA)] "Inner finally" | Finally.cs:251:21:251:54 | [finally: exception(Exception), finally(1): exception(ExceptionA)] call to method WriteLine | semmle.label | successor |
-| Finally.cs:251:39:251:53 | [finally: exception(Exception)] "Inner finally" | Finally.cs:251:21:251:54 | [finally: exception(Exception)] call to method WriteLine | semmle.label | successor |
-| Finally.cs:251:39:251:53 | [finally: exception(ExceptionA), finally(1): exception(Exception)] "Inner finally" | Finally.cs:251:21:251:54 | [finally: exception(ExceptionA), finally(1): exception(Exception)] call to method WriteLine | semmle.label | successor |
-| Finally.cs:251:39:251:53 | [finally: exception(ExceptionA), finally(1): exception(ExceptionA)] "Inner finally" | Finally.cs:251:21:251:54 | [finally: exception(ExceptionA), finally(1): exception(ExceptionA)] call to method WriteLine | semmle.label | successor |
-| Finally.cs:251:39:251:53 | [finally: exception(ExceptionA)] "Inner finally" | Finally.cs:251:21:251:54 | [finally: exception(ExceptionA)] call to method WriteLine | semmle.label | successor |
-| Finally.cs:254:13:254:44 | call to method WriteLine | Finally.cs:257:9:259:9 | [finally: exception(Exception)] {...} | semmle.label | exception(Exception) |
-| Finally.cs:254:13:254:44 | call to method WriteLine | Finally.cs:257:9:259:9 | {...} | semmle.label | successor |
-| Finally.cs:254:13:254:45 | ...; | Finally.cs:254:31:254:43 | "Mid finally" | semmle.label | successor |
-| Finally.cs:254:31:254:43 | "Mid finally" | Finally.cs:254:13:254:44 | call to method WriteLine | semmle.label | successor |
-| Finally.cs:257:9:259:9 | [finally: exception(Exception)] {...} | Finally.cs:258:13:258:47 | [finally: exception(Exception)] ...; | semmle.label | successor |
-| Finally.cs:257:9:259:9 | [finally: exception(ExceptionA)] {...} | Finally.cs:258:13:258:47 | [finally: exception(ExceptionA)] ...; | semmle.label | successor |
-| Finally.cs:257:9:259:9 | {...} | Finally.cs:258:13:258:47 | ...; | semmle.label | successor |
-| Finally.cs:258:13:258:46 | [finally: exception(Exception)] call to method WriteLine | Finally.cs:233:10:233:12 | exit M12 (abnormal) | semmle.label | exception(Exception) |
-| Finally.cs:258:13:258:46 | [finally: exception(ExceptionA)] call to method WriteLine | Finally.cs:233:10:233:12 | exit M12 (abnormal) | semmle.label | exception(ExceptionA) |
-| Finally.cs:258:13:258:46 | call to method WriteLine | Finally.cs:260:9:260:34 | ...; | semmle.label | successor |
-| Finally.cs:258:13:258:47 | ...; | Finally.cs:258:31:258:45 | "Outer finally" | semmle.label | successor |
-| Finally.cs:258:13:258:47 | [finally: exception(Exception)] ...; | Finally.cs:258:31:258:45 | [finally: exception(Exception)] "Outer finally" | semmle.label | successor |
-| Finally.cs:258:13:258:47 | [finally: exception(ExceptionA)] ...; | Finally.cs:258:31:258:45 | [finally: exception(ExceptionA)] "Outer finally" | semmle.label | successor |
-| Finally.cs:258:31:258:45 | "Outer finally" | Finally.cs:258:13:258:46 | call to method WriteLine | semmle.label | successor |
-| Finally.cs:258:31:258:45 | [finally: exception(Exception)] "Outer finally" | Finally.cs:258:13:258:46 | [finally: exception(Exception)] call to method WriteLine | semmle.label | successor |
-| Finally.cs:258:31:258:45 | [finally: exception(ExceptionA)] "Outer finally" | Finally.cs:258:13:258:46 | [finally: exception(ExceptionA)] call to method WriteLine | semmle.label | successor |
-| Finally.cs:260:9:260:33 | call to method WriteLine | Finally.cs:233:10:233:12 | exit M12 (normal) | semmle.label | successor |
-| Finally.cs:260:9:260:34 | ...; | Finally.cs:260:27:260:32 | "Done" | semmle.label | successor |
-| Finally.cs:260:27:260:32 | "Done" | Finally.cs:260:9:260:33 | call to method WriteLine | semmle.label | successor |
-| Finally.cs:263:10:263:12 | enter M13 | Finally.cs:264:5:274:5 | {...} | semmle.label | successor |
-| Finally.cs:263:10:263:12 | exit M13 (abnormal) | Finally.cs:263:10:263:12 | exit M13 | semmle.label | successor |
-| Finally.cs:263:10:263:12 | exit M13 (normal) | Finally.cs:263:10:263:12 | exit M13 | semmle.label | successor |
-| Finally.cs:264:5:274:5 | {...} | Finally.cs:265:9:273:9 | try {...} ... | semmle.label | successor |
-| Finally.cs:265:9:273:9 | try {...} ... | Finally.cs:266:9:268:9 | {...} | semmle.label | successor |
-| Finally.cs:266:9:268:9 | {...} | Finally.cs:267:13:267:35 | ...; | semmle.label | successor |
-| Finally.cs:267:13:267:34 | call to method WriteLine | Finally.cs:270:9:273:9 | [finally: exception(Exception)] {...} | semmle.label | exception(Exception) |
-| Finally.cs:267:13:267:34 | call to method WriteLine | Finally.cs:270:9:273:9 | {...} | semmle.label | successor |
-| Finally.cs:267:13:267:35 | ...; | Finally.cs:267:31:267:33 | "1" | semmle.label | successor |
-| Finally.cs:267:31:267:33 | "1" | Finally.cs:267:13:267:34 | call to method WriteLine | semmle.label | successor |
-| Finally.cs:270:9:273:9 | [finally: exception(Exception)] {...} | Finally.cs:271:13:271:35 | [finally: exception(Exception)] ...; | semmle.label | successor |
-| Finally.cs:270:9:273:9 | {...} | Finally.cs:271:13:271:35 | ...; | semmle.label | successor |
-| Finally.cs:271:13:271:34 | [finally: exception(Exception)] call to method WriteLine | Finally.cs:272:13:272:19 | [finally: exception(Exception)] ...; | semmle.label | successor |
-| Finally.cs:271:13:271:34 | call to method WriteLine | Finally.cs:272:13:272:19 | ...; | semmle.label | successor |
-| Finally.cs:271:13:271:35 | ...; | Finally.cs:271:31:271:33 | "3" | semmle.label | successor |
-| Finally.cs:271:13:271:35 | [finally: exception(Exception)] ...; | Finally.cs:271:31:271:33 | [finally: exception(Exception)] "3" | semmle.label | successor |
-| Finally.cs:271:31:271:33 | "3" | Finally.cs:271:13:271:34 | call to method WriteLine | semmle.label | successor |
-| Finally.cs:271:31:271:33 | [finally: exception(Exception)] "3" | Finally.cs:271:13:271:34 | [finally: exception(Exception)] call to method WriteLine | semmle.label | successor |
-| Finally.cs:272:13:272:13 | [finally: exception(Exception)] access to parameter i | Finally.cs:272:18:272:18 | [finally: exception(Exception)] 3 | semmle.label | successor |
-| Finally.cs:272:13:272:13 | access to parameter i | Finally.cs:272:18:272:18 | 3 | semmle.label | successor |
-| Finally.cs:272:13:272:18 | ... + ... | Finally.cs:272:13:272:18 | ... = ... | semmle.label | successor |
-| Finally.cs:272:13:272:18 | ... = ... | Finally.cs:263:10:263:12 | exit M13 (normal) | semmle.label | successor |
-| Finally.cs:272:13:272:18 | [finally: exception(Exception)] ... + ... | Finally.cs:272:13:272:18 | [finally: exception(Exception)] ... = ... | semmle.label | successor |
-| Finally.cs:272:13:272:18 | [finally: exception(Exception)] ... = ... | Finally.cs:263:10:263:12 | exit M13 (abnormal) | semmle.label | exception(Exception) |
-| Finally.cs:272:13:272:19 | ...; | Finally.cs:272:13:272:13 | access to parameter i | semmle.label | successor |
-| Finally.cs:272:13:272:19 | [finally: exception(Exception)] ...; | Finally.cs:272:13:272:13 | [finally: exception(Exception)] access to parameter i | semmle.label | successor |
-| Finally.cs:272:18:272:18 | 3 | Finally.cs:272:13:272:18 | ... + ... | semmle.label | successor |
-| Finally.cs:272:18:272:18 | [finally: exception(Exception)] 3 | Finally.cs:272:13:272:18 | [finally: exception(Exception)] ... + ... | semmle.label | successor |
-| Foreach.cs:6:10:6:11 | enter M1 | Foreach.cs:7:5:10:5 | {...} | semmle.label | successor |
-| Foreach.cs:6:10:6:11 | exit M1 (normal) | Foreach.cs:6:10:6:11 | exit M1 | semmle.label | successor |
-| Foreach.cs:7:5:10:5 | {...} | Foreach.cs:8:29:8:32 | access to parameter args | semmle.label | successor |
-| Foreach.cs:8:9:9:13 | foreach (... ... in ...) ... | Foreach.cs:6:10:6:11 | exit M1 (normal) | semmle.label | empty |
-| Foreach.cs:8:9:9:13 | foreach (... ... in ...) ... | Foreach.cs:8:22:8:24 | String arg | semmle.label | non-empty |
-| Foreach.cs:8:22:8:24 | String arg | Foreach.cs:9:13:9:13 | ; | semmle.label | successor |
-| Foreach.cs:8:29:8:32 | access to parameter args | Foreach.cs:8:9:9:13 | foreach (... ... in ...) ... | semmle.label | successor |
-| Foreach.cs:9:13:9:13 | ; | Foreach.cs:8:9:9:13 | foreach (... ... in ...) ... | semmle.label | successor |
-| Foreach.cs:12:10:12:11 | enter M2 | Foreach.cs:13:5:16:5 | {...} | semmle.label | successor |
-| Foreach.cs:12:10:12:11 | exit M2 (normal) | Foreach.cs:12:10:12:11 | exit M2 | semmle.label | successor |
-| Foreach.cs:13:5:16:5 | {...} | Foreach.cs:14:27:14:30 | access to parameter args | semmle.label | successor |
-| Foreach.cs:14:9:15:13 | foreach (... ... in ...) ... | Foreach.cs:12:10:12:11 | exit M2 (normal) | semmle.label | empty |
-| Foreach.cs:14:9:15:13 | foreach (... ... in ...) ... | Foreach.cs:14:22:14:22 | String _ | semmle.label | non-empty |
-| Foreach.cs:14:22:14:22 | String _ | Foreach.cs:15:13:15:13 | ; | semmle.label | successor |
-| Foreach.cs:14:27:14:30 | access to parameter args | Foreach.cs:14:9:15:13 | foreach (... ... in ...) ... | semmle.label | successor |
-| Foreach.cs:15:13:15:13 | ; | Foreach.cs:14:9:15:13 | foreach (... ... in ...) ... | semmle.label | successor |
-| Foreach.cs:18:10:18:11 | enter M3 | Foreach.cs:19:5:22:5 | {...} | semmle.label | successor |
-| Foreach.cs:18:10:18:11 | exit M3 (normal) | Foreach.cs:18:10:18:11 | exit M3 | semmle.label | successor |
-| Foreach.cs:19:5:22:5 | {...} | Foreach.cs:20:27:20:27 | access to parameter e | semmle.label | successor |
-| Foreach.cs:20:9:21:11 | foreach (... ... in ...) ... | Foreach.cs:18:10:18:11 | exit M3 (normal) | semmle.label | empty |
-| Foreach.cs:20:9:21:11 | foreach (... ... in ...) ... | Foreach.cs:20:22:20:22 | String x | semmle.label | non-empty |
-| Foreach.cs:20:22:20:22 | String x | Foreach.cs:21:11:21:11 | ; | semmle.label | successor |
-| Foreach.cs:20:27:20:27 | access to parameter e | Foreach.cs:20:29:20:38 | call to method ToArray | semmle.label | non-null |
-| Foreach.cs:20:27:20:27 | access to parameter e | Foreach.cs:20:43:20:68 | call to method Empty | semmle.label | null |
-| Foreach.cs:20:27:20:68 | ... ?? ... | Foreach.cs:20:9:21:11 | foreach (... ... in ...) ... | semmle.label | successor |
-| Foreach.cs:20:29:20:38 | call to method ToArray | Foreach.cs:20:27:20:68 | ... ?? ... | semmle.label | non-null |
-| Foreach.cs:20:29:20:38 | call to method ToArray | Foreach.cs:20:43:20:68 | call to method Empty | semmle.label | null |
-| Foreach.cs:20:43:20:68 | call to method Empty | Foreach.cs:20:27:20:68 | ... ?? ... | semmle.label | successor |
-| Foreach.cs:21:11:21:11 | ; | Foreach.cs:20:9:21:11 | foreach (... ... in ...) ... | semmle.label | successor |
-| Foreach.cs:24:10:24:11 | enter M4 | Foreach.cs:25:5:28:5 | {...} | semmle.label | successor |
-| Foreach.cs:24:10:24:11 | exit M4 (normal) | Foreach.cs:24:10:24:11 | exit M4 | semmle.label | successor |
-| Foreach.cs:25:5:28:5 | {...} | Foreach.cs:26:36:26:39 | access to parameter args | semmle.label | successor |
-| Foreach.cs:26:9:27:11 | foreach (... ... in ...) ... | Foreach.cs:24:10:24:11 | exit M4 (normal) | semmle.label | empty |
-| Foreach.cs:26:9:27:11 | foreach (... ... in ...) ... | Foreach.cs:26:23:26:23 | String x | semmle.label | non-empty |
-| Foreach.cs:26:18:26:31 | (..., ...) | Foreach.cs:27:11:27:11 | ; | semmle.label | successor |
-| Foreach.cs:26:23:26:23 | String x | Foreach.cs:26:30:26:30 | Int32 y | semmle.label | successor |
-| Foreach.cs:26:30:26:30 | Int32 y | Foreach.cs:26:18:26:31 | (..., ...) | semmle.label | successor |
-| Foreach.cs:26:36:26:39 | access to parameter args | Foreach.cs:26:9:27:11 | foreach (... ... in ...) ... | semmle.label | successor |
-| Foreach.cs:27:11:27:11 | ; | Foreach.cs:26:9:27:11 | foreach (... ... in ...) ... | semmle.label | successor |
-| Foreach.cs:30:10:30:11 | enter M5 | Foreach.cs:31:5:34:5 | {...} | semmle.label | successor |
-| Foreach.cs:30:10:30:11 | exit M5 (normal) | Foreach.cs:30:10:30:11 | exit M5 | semmle.label | successor |
-| Foreach.cs:31:5:34:5 | {...} | Foreach.cs:32:32:32:35 | access to parameter args | semmle.label | successor |
-| Foreach.cs:32:9:33:11 | foreach (... ... in ...) ... | Foreach.cs:30:10:30:11 | exit M5 (normal) | semmle.label | empty |
-| Foreach.cs:32:9:33:11 | foreach (... ... in ...) ... | Foreach.cs:32:23:32:23 | String x | semmle.label | non-empty |
-| Foreach.cs:32:18:32:27 | (..., ...) | Foreach.cs:33:11:33:11 | ; | semmle.label | successor |
-| Foreach.cs:32:23:32:23 | String x | Foreach.cs:32:26:32:26 | Int32 y | semmle.label | successor |
-| Foreach.cs:32:26:32:26 | Int32 y | Foreach.cs:32:18:32:27 | (..., ...) | semmle.label | successor |
-| Foreach.cs:32:32:32:35 | access to parameter args | Foreach.cs:32:9:33:11 | foreach (... ... in ...) ... | semmle.label | successor |
-| Foreach.cs:33:11:33:11 | ; | Foreach.cs:32:9:33:11 | foreach (... ... in ...) ... | semmle.label | successor |
-| Foreach.cs:36:10:36:11 | enter M6 | Foreach.cs:37:5:40:5 | {...} | semmle.label | successor |
-| Foreach.cs:36:10:36:11 | exit M6 (normal) | Foreach.cs:36:10:36:11 | exit M6 | semmle.label | successor |
-| Foreach.cs:37:5:40:5 | {...} | Foreach.cs:38:39:38:42 | access to parameter args | semmle.label | successor |
-| Foreach.cs:38:9:39:11 | foreach (... ... in ...) ... | Foreach.cs:36:10:36:11 | exit M6 (normal) | semmle.label | empty |
-| Foreach.cs:38:9:39:11 | foreach (... ... in ...) ... | Foreach.cs:38:26:38:26 | String x | semmle.label | non-empty |
-| Foreach.cs:38:18:38:34 | (..., ...) | Foreach.cs:39:11:39:11 | ; | semmle.label | successor |
-| Foreach.cs:38:26:38:26 | String x | Foreach.cs:38:33:38:33 | Int32 y | semmle.label | successor |
-| Foreach.cs:38:33:38:33 | Int32 y | Foreach.cs:38:18:38:34 | (..., ...) | semmle.label | successor |
-| Foreach.cs:38:39:38:42 | access to parameter args | Foreach.cs:38:9:39:11 | foreach (... ... in ...) ... | semmle.label | successor |
-| Foreach.cs:39:11:39:11 | ; | Foreach.cs:38:9:39:11 | foreach (... ... in ...) ... | semmle.label | successor |
-| Initializers.cs:5:9:5:9 | this access | Initializers.cs:5:13:5:13 | access to field H | semmle.label | successor |
-| Initializers.cs:5:9:5:9 | this access | Initializers.cs:5:13:5:13 | access to field H | semmle.label | successor |
-| Initializers.cs:5:9:5:17 | ... = ... | Initializers.cs:6:9:6:9 | this access | semmle.label | successor |
-| Initializers.cs:5:9:5:17 | ... = ... | Initializers.cs:6:9:6:9 | this access | semmle.label | successor |
-| Initializers.cs:5:13:5:13 | access to field H | Initializers.cs:5:17:5:17 | 1 | semmle.label | successor |
-| Initializers.cs:5:13:5:13 | access to field H | Initializers.cs:5:17:5:17 | 1 | semmle.label | successor |
-| Initializers.cs:5:13:5:17 | ... + ... | Initializers.cs:5:9:5:17 | ... = ... | semmle.label | successor |
-| Initializers.cs:5:13:5:17 | ... + ... | Initializers.cs:5:9:5:17 | ... = ... | semmle.label | successor |
-| Initializers.cs:5:17:5:17 | 1 | Initializers.cs:5:13:5:17 | ... + ... | semmle.label | successor |
-| Initializers.cs:5:17:5:17 | 1 | Initializers.cs:5:13:5:17 | ... + ... | semmle.label | successor |
-| Initializers.cs:6:9:6:9 | access to property G | Initializers.cs:6:25:6:31 | ... = ... | semmle.label | successor |
-| Initializers.cs:6:9:6:9 | access to property G | Initializers.cs:6:25:6:31 | ... = ... | semmle.label | successor |
-| Initializers.cs:6:9:6:9 | this access | Initializers.cs:6:27:6:27 | access to field H | semmle.label | successor |
-| Initializers.cs:6:9:6:9 | this access | Initializers.cs:6:27:6:27 | access to field H | semmle.label | successor |
-| Initializers.cs:6:25:6:31 | ... = ... | Initializers.cs:8:20:8:22 | {...} | semmle.label | successor |
-| Initializers.cs:6:25:6:31 | ... = ... | Initializers.cs:10:28:10:30 | {...} | semmle.label | successor |
-| Initializers.cs:6:27:6:27 | access to field H | Initializers.cs:6:31:6:31 | 2 | semmle.label | successor |
-| Initializers.cs:6:27:6:27 | access to field H | Initializers.cs:6:31:6:31 | 2 | semmle.label | successor |
-| Initializers.cs:6:27:6:31 | ... + ... | Initializers.cs:6:9:6:9 | access to property G | semmle.label | successor |
-| Initializers.cs:6:27:6:31 | ... + ... | Initializers.cs:6:9:6:9 | access to property G | semmle.label | successor |
-| Initializers.cs:6:31:6:31 | 2 | Initializers.cs:6:27:6:31 | ... + ... | semmle.label | successor |
-| Initializers.cs:6:31:6:31 | 2 | Initializers.cs:6:27:6:31 | ... + ... | semmle.label | successor |
-| Initializers.cs:8:5:8:16 | call to constructor Object | Initializers.cs:5:9:5:9 | this access | semmle.label | successor |
-| Initializers.cs:8:5:8:16 | enter Initializers | Initializers.cs:8:5:8:16 | call to constructor Object | semmle.label | successor |
-| Initializers.cs:8:5:8:16 | exit Initializers (normal) | Initializers.cs:8:5:8:16 | exit Initializers | semmle.label | successor |
-| Initializers.cs:8:20:8:22 | {...} | Initializers.cs:8:5:8:16 | exit Initializers (normal) | semmle.label | successor |
-| Initializers.cs:10:5:10:16 | call to constructor Object | Initializers.cs:5:9:5:9 | this access | semmle.label | successor |
-| Initializers.cs:10:5:10:16 | enter Initializers | Initializers.cs:10:5:10:16 | call to constructor Object | semmle.label | successor |
-| Initializers.cs:10:5:10:16 | exit Initializers (normal) | Initializers.cs:10:5:10:16 | exit Initializers | semmle.label | successor |
-| Initializers.cs:10:28:10:30 | {...} | Initializers.cs:10:5:10:16 | exit Initializers (normal) | semmle.label | successor |
-| Initializers.cs:12:10:12:10 | enter M | Initializers.cs:13:5:16:5 | {...} | semmle.label | successor |
-| Initializers.cs:12:10:12:10 | exit M (normal) | Initializers.cs:12:10:12:10 | exit M | semmle.label | successor |
-| Initializers.cs:13:5:16:5 | {...} | Initializers.cs:14:9:14:54 | ... ...; | semmle.label | successor |
-| Initializers.cs:14:9:14:54 | ... ...; | Initializers.cs:14:34:14:35 | "" | semmle.label | successor |
-| Initializers.cs:14:13:14:53 | Initializers i = ... | Initializers.cs:15:9:15:64 | ... ...; | semmle.label | successor |
-| Initializers.cs:14:17:14:53 | object creation of type Initializers | Initializers.cs:14:44:14:44 | 0 | semmle.label | successor |
-| Initializers.cs:14:34:14:35 | "" | Initializers.cs:14:17:14:53 | object creation of type Initializers | semmle.label | successor |
-| Initializers.cs:14:38:14:53 | { ..., ... } | Initializers.cs:14:13:14:53 | Initializers i = ... | semmle.label | successor |
-| Initializers.cs:14:40:14:44 | ... = ... | Initializers.cs:14:51:14:51 | 1 | semmle.label | successor |
-| Initializers.cs:14:44:14:44 | 0 | Initializers.cs:14:40:14:44 | ... = ... | semmle.label | successor |
-| Initializers.cs:14:47:14:47 | access to property G | Initializers.cs:14:47:14:51 | ... = ... | semmle.label | successor |
-| Initializers.cs:14:47:14:51 | ... = ... | Initializers.cs:14:38:14:53 | { ..., ... } | semmle.label | successor |
-| Initializers.cs:14:51:14:51 | 1 | Initializers.cs:14:47:14:47 | access to property G | semmle.label | successor |
-| Initializers.cs:15:9:15:64 | ... ...; | Initializers.cs:15:18:15:63 | 2 | semmle.label | successor |
-| Initializers.cs:15:13:15:63 | Initializers[] iz = ... | Initializers.cs:12:10:12:10 | exit M (normal) | semmle.label | successor |
-| Initializers.cs:15:18:15:63 | 2 | Initializers.cs:15:18:15:63 | array creation of type Initializers[] | semmle.label | successor |
-| Initializers.cs:15:18:15:63 | array creation of type Initializers[] | Initializers.cs:15:39:15:39 | access to local variable i | semmle.label | successor |
-| Initializers.cs:15:37:15:63 | { ..., ... } | Initializers.cs:15:13:15:63 | Initializers[] iz = ... | semmle.label | successor |
-| Initializers.cs:15:39:15:39 | access to local variable i | Initializers.cs:15:59:15:60 | "" | semmle.label | successor |
-| Initializers.cs:15:42:15:61 | object creation of type Initializers | Initializers.cs:15:37:15:63 | { ..., ... } | semmle.label | successor |
-| Initializers.cs:15:59:15:60 | "" | Initializers.cs:15:42:15:61 | object creation of type Initializers | semmle.label | successor |
-| Initializers.cs:18:20:18:20 | 1 | Initializers.cs:18:16:18:20 | ... = ... | semmle.label | successor |
-| Initializers.cs:20:11:20:23 | enter NoConstructor | Initializers.cs:22:23:22:23 | this access | semmle.label | successor |
-| Initializers.cs:20:11:20:23 | exit NoConstructor (normal) | Initializers.cs:20:11:20:23 | exit NoConstructor | semmle.label | successor |
-| Initializers.cs:22:23:22:23 | this access | Initializers.cs:22:27:22:27 | 0 | semmle.label | successor |
-| Initializers.cs:22:23:22:27 | ... = ... | Initializers.cs:23:23:23:23 | this access | semmle.label | successor |
-| Initializers.cs:22:27:22:27 | 0 | Initializers.cs:22:23:22:27 | ... = ... | semmle.label | successor |
-| Initializers.cs:23:23:23:23 | this access | Initializers.cs:23:27:23:27 | 1 | semmle.label | successor |
-| Initializers.cs:23:23:23:27 | ... = ... | Initializers.cs:20:11:20:23 | exit NoConstructor (normal) | semmle.label | successor |
-| Initializers.cs:23:27:23:27 | 1 | Initializers.cs:23:23:23:27 | ... = ... | semmle.label | successor |
-| Initializers.cs:28:13:28:13 | this access | Initializers.cs:28:17:28:17 | 2 | semmle.label | successor |
-| Initializers.cs:28:13:28:13 | this access | Initializers.cs:28:17:28:17 | 2 | semmle.label | successor |
-| Initializers.cs:28:13:28:17 | ... = ... | Initializers.cs:31:24:31:33 | {...} | semmle.label | successor |
-| Initializers.cs:28:13:28:17 | ... = ... | Initializers.cs:35:27:35:40 | {...} | semmle.label | successor |
-| Initializers.cs:28:17:28:17 | 2 | Initializers.cs:28:13:28:17 | ... = ... | semmle.label | successor |
-| Initializers.cs:28:17:28:17 | 2 | Initializers.cs:28:13:28:17 | ... = ... | semmle.label | successor |
-| Initializers.cs:31:9:31:11 | enter Sub | Initializers.cs:31:17:31:20 | call to constructor NoConstructor | semmle.label | successor |
-| Initializers.cs:31:9:31:11 | exit Sub (normal) | Initializers.cs:31:9:31:11 | exit Sub | semmle.label | successor |
-| Initializers.cs:31:17:31:20 | call to constructor NoConstructor | Initializers.cs:28:13:28:13 | this access | semmle.label | successor |
-| Initializers.cs:31:24:31:33 | {...} | Initializers.cs:31:26:31:31 | ...; | semmle.label | successor |
-| Initializers.cs:31:26:31:26 | this access | Initializers.cs:31:30:31:30 | 3 | semmle.label | successor |
-| Initializers.cs:31:26:31:30 | ... = ... | Initializers.cs:31:9:31:11 | exit Sub (normal) | semmle.label | successor |
-| Initializers.cs:31:26:31:31 | ...; | Initializers.cs:31:26:31:26 | this access | semmle.label | successor |
-| Initializers.cs:31:30:31:30 | 3 | Initializers.cs:31:26:31:30 | ... = ... | semmle.label | successor |
-| Initializers.cs:33:9:33:11 | enter Sub | Initializers.cs:33:22:33:25 | call to constructor Sub | semmle.label | successor |
-| Initializers.cs:33:9:33:11 | exit Sub (normal) | Initializers.cs:33:9:33:11 | exit Sub | semmle.label | successor |
-| Initializers.cs:33:22:33:25 | call to constructor Sub | Initializers.cs:33:29:33:38 | {...} | semmle.label | successor |
-| Initializers.cs:33:29:33:38 | {...} | Initializers.cs:33:31:33:36 | ...; | semmle.label | successor |
-| Initializers.cs:33:31:33:31 | this access | Initializers.cs:33:35:33:35 | access to parameter i | semmle.label | successor |
-| Initializers.cs:33:31:33:35 | ... = ... | Initializers.cs:33:9:33:11 | exit Sub (normal) | semmle.label | successor |
-| Initializers.cs:33:31:33:36 | ...; | Initializers.cs:33:31:33:31 | this access | semmle.label | successor |
-| Initializers.cs:33:35:33:35 | access to parameter i | Initializers.cs:33:31:33:35 | ... = ... | semmle.label | successor |
-| Initializers.cs:35:9:35:11 | call to constructor NoConstructor | Initializers.cs:28:13:28:13 | this access | semmle.label | successor |
-| Initializers.cs:35:9:35:11 | enter Sub | Initializers.cs:35:9:35:11 | call to constructor NoConstructor | semmle.label | successor |
-| Initializers.cs:35:9:35:11 | exit Sub (normal) | Initializers.cs:35:9:35:11 | exit Sub | semmle.label | successor |
-| Initializers.cs:35:27:35:40 | {...} | Initializers.cs:35:29:35:38 | ...; | semmle.label | successor |
-| Initializers.cs:35:29:35:29 | this access | Initializers.cs:35:33:35:33 | access to parameter i | semmle.label | successor |
-| Initializers.cs:35:29:35:37 | ... = ... | Initializers.cs:35:9:35:11 | exit Sub (normal) | semmle.label | successor |
-| Initializers.cs:35:29:35:38 | ...; | Initializers.cs:35:29:35:29 | this access | semmle.label | successor |
-| Initializers.cs:35:33:35:33 | access to parameter i | Initializers.cs:35:37:35:37 | access to parameter j | semmle.label | successor |
-| Initializers.cs:35:33:35:37 | ... + ... | Initializers.cs:35:29:35:37 | ... = ... | semmle.label | successor |
-| Initializers.cs:35:37:35:37 | access to parameter j | Initializers.cs:35:33:35:37 | ... + ... | semmle.label | successor |
-| Initializers.cs:51:10:51:13 | enter Test | Initializers.cs:52:5:66:5 | {...} | semmle.label | successor |
-| Initializers.cs:51:10:51:13 | exit Test (normal) | Initializers.cs:51:10:51:13 | exit Test | semmle.label | successor |
-| Initializers.cs:52:5:66:5 | {...} | Initializers.cs:54:9:54:96 | ... ...; | semmle.label | successor |
-| Initializers.cs:54:9:54:96 | ... ...; | Initializers.cs:54:20:54:95 | object creation of type Dictionary | semmle.label | successor |
-| Initializers.cs:54:13:54:95 | Dictionary dict = ... | Initializers.cs:57:9:65:10 | ... ...; | semmle.label | successor |
-| Initializers.cs:54:20:54:95 | object creation of type Dictionary | Initializers.cs:54:53:54:53 | 0 | semmle.label | successor |
-| Initializers.cs:54:50:54:95 | { ..., ... } | Initializers.cs:54:13:54:95 | Dictionary dict = ... | semmle.label | successor |
-| Initializers.cs:54:52:54:54 | access to indexer | Initializers.cs:54:52:54:63 | ... = ... | semmle.label | successor |
-| Initializers.cs:54:52:54:63 | ... = ... | Initializers.cs:54:67:54:67 | 1 | semmle.label | successor |
-| Initializers.cs:54:53:54:53 | 0 | Initializers.cs:54:58:54:63 | "Zero" | semmle.label | successor |
-| Initializers.cs:54:58:54:63 | "Zero" | Initializers.cs:54:52:54:54 | access to indexer | semmle.label | successor |
-| Initializers.cs:54:66:54:68 | access to indexer | Initializers.cs:54:66:54:76 | ... = ... | semmle.label | successor |
-| Initializers.cs:54:66:54:76 | ... = ... | Initializers.cs:54:80:54:80 | access to parameter i | semmle.label | successor |
-| Initializers.cs:54:67:54:67 | 1 | Initializers.cs:54:72:54:76 | "One" | semmle.label | successor |
-| Initializers.cs:54:72:54:76 | "One" | Initializers.cs:54:66:54:68 | access to indexer | semmle.label | successor |
-| Initializers.cs:54:79:54:85 | access to indexer | Initializers.cs:54:79:54:93 | ... = ... | semmle.label | successor |
-| Initializers.cs:54:79:54:93 | ... = ... | Initializers.cs:54:50:54:95 | { ..., ... } | semmle.label | successor |
-| Initializers.cs:54:80:54:80 | access to parameter i | Initializers.cs:54:84:54:84 | 2 | semmle.label | successor |
-| Initializers.cs:54:80:54:84 | ... + ... | Initializers.cs:54:89:54:93 | "Two" | semmle.label | successor |
-| Initializers.cs:54:84:54:84 | 2 | Initializers.cs:54:80:54:84 | ... + ... | semmle.label | successor |
-| Initializers.cs:54:89:54:93 | "Two" | Initializers.cs:54:79:54:85 | access to indexer | semmle.label | successor |
-| Initializers.cs:57:9:65:10 | ... ...; | Initializers.cs:57:24:65:9 | object creation of type Compound | semmle.label | successor |
-| Initializers.cs:57:13:65:9 | Compound compound = ... | Initializers.cs:51:10:51:13 | exit Test (normal) | semmle.label | successor |
-| Initializers.cs:57:24:65:9 | object creation of type Compound | Initializers.cs:59:34:59:34 | 0 | semmle.label | successor |
-| Initializers.cs:58:9:65:9 | { ..., ... } | Initializers.cs:57:13:65:9 | Compound compound = ... | semmle.label | successor |
-| Initializers.cs:59:13:59:76 | ... = ... | Initializers.cs:60:37:60:37 | 3 | semmle.label | successor |
-| Initializers.cs:59:31:59:76 | { ..., ... } | Initializers.cs:59:13:59:76 | ... = ... | semmle.label | successor |
-| Initializers.cs:59:33:59:35 | access to indexer | Initializers.cs:59:33:59:44 | ... = ... | semmle.label | successor |
-| Initializers.cs:59:33:59:44 | ... = ... | Initializers.cs:59:48:59:48 | 1 | semmle.label | successor |
-| Initializers.cs:59:34:59:34 | 0 | Initializers.cs:59:39:59:44 | "Zero" | semmle.label | successor |
-| Initializers.cs:59:39:59:44 | "Zero" | Initializers.cs:59:33:59:35 | access to indexer | semmle.label | successor |
-| Initializers.cs:59:47:59:49 | access to indexer | Initializers.cs:59:47:59:57 | ... = ... | semmle.label | successor |
-| Initializers.cs:59:47:59:57 | ... = ... | Initializers.cs:59:61:59:61 | access to parameter i | semmle.label | successor |
-| Initializers.cs:59:48:59:48 | 1 | Initializers.cs:59:53:59:57 | "One" | semmle.label | successor |
-| Initializers.cs:59:53:59:57 | "One" | Initializers.cs:59:47:59:49 | access to indexer | semmle.label | successor |
-| Initializers.cs:59:60:59:66 | access to indexer | Initializers.cs:59:60:59:74 | ... = ... | semmle.label | successor |
-| Initializers.cs:59:60:59:74 | ... = ... | Initializers.cs:59:31:59:76 | { ..., ... } | semmle.label | successor |
-| Initializers.cs:59:61:59:61 | access to parameter i | Initializers.cs:59:65:59:65 | 2 | semmle.label | successor |
-| Initializers.cs:59:61:59:65 | ... + ... | Initializers.cs:59:70:59:74 | "Two" | semmle.label | successor |
-| Initializers.cs:59:65:59:65 | 2 | Initializers.cs:59:61:59:65 | ... + ... | semmle.label | successor |
-| Initializers.cs:59:70:59:74 | "Two" | Initializers.cs:59:60:59:66 | access to indexer | semmle.label | successor |
-| Initializers.cs:60:13:60:30 | access to property DictionaryProperty | Initializers.cs:60:13:60:80 | ... = ... | semmle.label | successor |
-| Initializers.cs:60:13:60:80 | ... = ... | Initializers.cs:61:29:61:29 | 0 | semmle.label | successor |
-| Initializers.cs:60:34:60:80 | { ..., ... } | Initializers.cs:60:13:60:30 | access to property DictionaryProperty | semmle.label | successor |
-| Initializers.cs:60:36:60:38 | access to indexer | Initializers.cs:60:36:60:48 | ... = ... | semmle.label | successor |
-| Initializers.cs:60:36:60:48 | ... = ... | Initializers.cs:60:52:60:52 | 2 | semmle.label | successor |
-| Initializers.cs:60:37:60:37 | 3 | Initializers.cs:60:42:60:48 | "Three" | semmle.label | successor |
-| Initializers.cs:60:42:60:48 | "Three" | Initializers.cs:60:36:60:38 | access to indexer | semmle.label | successor |
-| Initializers.cs:60:51:60:53 | access to indexer | Initializers.cs:60:51:60:61 | ... = ... | semmle.label | successor |
-| Initializers.cs:60:51:60:61 | ... = ... | Initializers.cs:60:65:60:65 | access to parameter i | semmle.label | successor |
-| Initializers.cs:60:52:60:52 | 2 | Initializers.cs:60:57:60:61 | "Two" | semmle.label | successor |
-| Initializers.cs:60:57:60:61 | "Two" | Initializers.cs:60:51:60:53 | access to indexer | semmle.label | successor |
-| Initializers.cs:60:64:60:70 | access to indexer | Initializers.cs:60:64:60:78 | ... = ... | semmle.label | successor |
-| Initializers.cs:60:64:60:78 | ... = ... | Initializers.cs:60:34:60:80 | { ..., ... } | semmle.label | successor |
-| Initializers.cs:60:65:60:65 | access to parameter i | Initializers.cs:60:69:60:69 | 1 | semmle.label | successor |
-| Initializers.cs:60:65:60:69 | ... + ... | Initializers.cs:60:74:60:78 | "One" | semmle.label | successor |
-| Initializers.cs:60:69:60:69 | 1 | Initializers.cs:60:65:60:69 | ... + ... | semmle.label | successor |
-| Initializers.cs:60:74:60:78 | "One" | Initializers.cs:60:64:60:70 | access to indexer | semmle.label | successor |
-| Initializers.cs:61:13:61:58 | ... = ... | Initializers.cs:62:30:62:30 | 0 | semmle.label | successor |
-| Initializers.cs:61:26:61:58 | { ..., ... } | Initializers.cs:61:13:61:58 | ... = ... | semmle.label | successor |
-| Initializers.cs:61:28:61:39 | ... = ... | Initializers.cs:61:43:61:43 | access to parameter i | semmle.label | successor |
-| Initializers.cs:61:29:61:29 | 0 | Initializers.cs:61:34:61:39 | "Zero" | semmle.label | successor |
-| Initializers.cs:61:34:61:39 | "Zero" | Initializers.cs:61:28:61:39 | ... = ... | semmle.label | successor |
-| Initializers.cs:61:42:61:56 | ... = ... | Initializers.cs:61:26:61:58 | { ..., ... } | semmle.label | successor |
-| Initializers.cs:61:43:61:43 | access to parameter i | Initializers.cs:61:47:61:47 | 1 | semmle.label | successor |
-| Initializers.cs:61:43:61:47 | ... + ... | Initializers.cs:61:52:61:56 | "One" | semmle.label | successor |
-| Initializers.cs:61:47:61:47 | 1 | Initializers.cs:61:43:61:47 | ... + ... | semmle.label | successor |
-| Initializers.cs:61:52:61:56 | "One" | Initializers.cs:61:42:61:56 | ... = ... | semmle.label | successor |
-| Initializers.cs:62:13:62:60 | ... = ... | Initializers.cs:63:32:63:32 | 1 | semmle.label | successor |
-| Initializers.cs:62:27:62:60 | { ..., ... } | Initializers.cs:62:13:62:60 | ... = ... | semmle.label | successor |
-| Initializers.cs:62:29:62:40 | ... = ... | Initializers.cs:62:44:62:44 | 1 | semmle.label | successor |
-| Initializers.cs:62:30:62:30 | 0 | Initializers.cs:62:33:62:33 | 1 | semmle.label | successor |
-| Initializers.cs:62:33:62:33 | 1 | Initializers.cs:62:38:62:40 | "i" | semmle.label | successor |
-| Initializers.cs:62:38:62:40 | "i" | Initializers.cs:62:29:62:40 | ... = ... | semmle.label | successor |
-| Initializers.cs:62:43:62:58 | ... = ... | Initializers.cs:62:27:62:60 | { ..., ... } | semmle.label | successor |
-| Initializers.cs:62:44:62:44 | 1 | Initializers.cs:62:47:62:47 | access to parameter i | semmle.label | successor |
-| Initializers.cs:62:47:62:47 | access to parameter i | Initializers.cs:62:51:62:51 | 0 | semmle.label | successor |
-| Initializers.cs:62:47:62:51 | ... + ... | Initializers.cs:62:56:62:58 | "1" | semmle.label | successor |
-| Initializers.cs:62:51:62:51 | 0 | Initializers.cs:62:47:62:51 | ... + ... | semmle.label | successor |
-| Initializers.cs:62:56:62:58 | "1" | Initializers.cs:62:43:62:58 | ... = ... | semmle.label | successor |
-| Initializers.cs:63:13:63:25 | access to property ArrayProperty | Initializers.cs:63:13:63:60 | ... = ... | semmle.label | successor |
-| Initializers.cs:63:13:63:60 | ... = ... | Initializers.cs:64:33:64:33 | 0 | semmle.label | successor |
-| Initializers.cs:63:29:63:60 | { ..., ... } | Initializers.cs:63:13:63:25 | access to property ArrayProperty | semmle.label | successor |
-| Initializers.cs:63:31:63:41 | ... = ... | Initializers.cs:63:45:63:45 | access to parameter i | semmle.label | successor |
-| Initializers.cs:63:32:63:32 | 1 | Initializers.cs:63:37:63:41 | "One" | semmle.label | successor |
-| Initializers.cs:63:37:63:41 | "One" | Initializers.cs:63:31:63:41 | ... = ... | semmle.label | successor |
-| Initializers.cs:63:44:63:58 | ... = ... | Initializers.cs:63:29:63:60 | { ..., ... } | semmle.label | successor |
-| Initializers.cs:63:45:63:45 | access to parameter i | Initializers.cs:63:49:63:49 | 2 | semmle.label | successor |
-| Initializers.cs:63:45:63:49 | ... + ... | Initializers.cs:63:54:63:58 | "Two" | semmle.label | successor |
-| Initializers.cs:63:49:63:49 | 2 | Initializers.cs:63:45:63:49 | ... + ... | semmle.label | successor |
-| Initializers.cs:63:54:63:58 | "Two" | Initializers.cs:63:44:63:58 | ... = ... | semmle.label | successor |
-| Initializers.cs:64:13:64:26 | access to property ArrayProperty2 | Initializers.cs:64:13:64:63 | ... = ... | semmle.label | successor |
-| Initializers.cs:64:13:64:63 | ... = ... | Initializers.cs:58:9:65:9 | { ..., ... } | semmle.label | successor |
-| Initializers.cs:64:30:64:63 | { ..., ... } | Initializers.cs:64:13:64:26 | access to property ArrayProperty2 | semmle.label | successor |
-| Initializers.cs:64:32:64:43 | ... = ... | Initializers.cs:64:47:64:47 | 1 | semmle.label | successor |
-| Initializers.cs:64:33:64:33 | 0 | Initializers.cs:64:36:64:36 | 1 | semmle.label | successor |
-| Initializers.cs:64:36:64:36 | 1 | Initializers.cs:64:41:64:43 | "i" | semmle.label | successor |
-| Initializers.cs:64:41:64:43 | "i" | Initializers.cs:64:32:64:43 | ... = ... | semmle.label | successor |
-| Initializers.cs:64:46:64:61 | ... = ... | Initializers.cs:64:30:64:63 | { ..., ... } | semmle.label | successor |
-| Initializers.cs:64:47:64:47 | 1 | Initializers.cs:64:50:64:50 | access to parameter i | semmle.label | successor |
-| Initializers.cs:64:50:64:50 | access to parameter i | Initializers.cs:64:54:64:54 | 0 | semmle.label | successor |
-| Initializers.cs:64:50:64:54 | ... + ... | Initializers.cs:64:59:64:61 | "1" | semmle.label | successor |
-| Initializers.cs:64:54:64:54 | 0 | Initializers.cs:64:50:64:54 | ... + ... | semmle.label | successor |
-| Initializers.cs:64:59:64:61 | "1" | Initializers.cs:64:46:64:61 | ... = ... | semmle.label | successor |
-| LoopUnrolling.cs:7:10:7:11 | enter M1 | LoopUnrolling.cs:8:5:13:5 | {...} | semmle.label | successor |
-| LoopUnrolling.cs:7:10:7:11 | exit M1 (normal) | LoopUnrolling.cs:7:10:7:11 | exit M1 | semmle.label | successor |
-| LoopUnrolling.cs:8:5:13:5 | {...} | LoopUnrolling.cs:9:9:10:19 | if (...) ... | semmle.label | successor |
-| LoopUnrolling.cs:9:9:10:19 | if (...) ... | LoopUnrolling.cs:9:13:9:16 | access to parameter args | semmle.label | successor |
-| LoopUnrolling.cs:9:13:9:16 | access to parameter args | LoopUnrolling.cs:9:13:9:23 | access to property Length | semmle.label | successor |
-| LoopUnrolling.cs:9:13:9:23 | access to property Length | LoopUnrolling.cs:9:28:9:28 | 0 | semmle.label | successor |
-| LoopUnrolling.cs:9:13:9:28 | ... == ... | LoopUnrolling.cs:10:13:10:19 | return ...; | semmle.label | true |
-| LoopUnrolling.cs:9:13:9:28 | ... == ... | LoopUnrolling.cs:11:29:11:32 | access to parameter args | semmle.label | false |
-| LoopUnrolling.cs:9:28:9:28 | 0 | LoopUnrolling.cs:9:13:9:28 | ... == ... | semmle.label | successor |
-| LoopUnrolling.cs:10:13:10:19 | return ...; | LoopUnrolling.cs:7:10:7:11 | exit M1 (normal) | semmle.label | return |
-| LoopUnrolling.cs:11:9:12:35 | [unroll (line 11)] foreach (... ... in ...) ... | LoopUnrolling.cs:11:22:11:24 | String arg | semmle.label | non-empty |
-| LoopUnrolling.cs:11:9:12:35 | foreach (... ... in ...) ... | LoopUnrolling.cs:7:10:7:11 | exit M1 (normal) | semmle.label | empty |
-| LoopUnrolling.cs:11:9:12:35 | foreach (... ... in ...) ... | LoopUnrolling.cs:11:22:11:24 | String arg | semmle.label | non-empty |
-| LoopUnrolling.cs:11:22:11:24 | String arg | LoopUnrolling.cs:12:13:12:35 | ...; | semmle.label | successor |
-| LoopUnrolling.cs:11:29:11:32 | access to parameter args | LoopUnrolling.cs:11:9:12:35 | [unroll (line 11)] foreach (... ... in ...) ... | semmle.label | successor |
-| LoopUnrolling.cs:12:13:12:34 | call to method WriteLine | LoopUnrolling.cs:11:9:12:35 | foreach (... ... in ...) ... | semmle.label | successor |
-| LoopUnrolling.cs:12:13:12:35 | ...; | LoopUnrolling.cs:12:31:12:33 | access to local variable arg | semmle.label | successor |
-| LoopUnrolling.cs:12:31:12:33 | access to local variable arg | LoopUnrolling.cs:12:13:12:34 | call to method WriteLine | semmle.label | successor |
-| LoopUnrolling.cs:15:10:15:11 | enter M2 | LoopUnrolling.cs:16:5:20:5 | {...} | semmle.label | successor |
-| LoopUnrolling.cs:15:10:15:11 | exit M2 (normal) | LoopUnrolling.cs:15:10:15:11 | exit M2 | semmle.label | successor |
-| LoopUnrolling.cs:16:5:20:5 | {...} | LoopUnrolling.cs:17:9:17:48 | ... ...; | semmle.label | successor |
-| LoopUnrolling.cs:17:9:17:48 | ... ...; | LoopUnrolling.cs:17:18:17:47 | 3 | semmle.label | successor |
-| LoopUnrolling.cs:17:13:17:47 | String[] xs = ... | LoopUnrolling.cs:18:27:18:28 | access to local variable xs | semmle.label | successor |
-| LoopUnrolling.cs:17:18:17:47 | 3 | LoopUnrolling.cs:17:18:17:47 | array creation of type String[] | semmle.label | successor |
-| LoopUnrolling.cs:17:18:17:47 | array creation of type String[] | LoopUnrolling.cs:17:33:17:35 | "a" | semmle.label | successor |
-| LoopUnrolling.cs:17:31:17:47 | { ..., ... } | LoopUnrolling.cs:17:13:17:47 | String[] xs = ... | semmle.label | successor |
-| LoopUnrolling.cs:17:33:17:35 | "a" | LoopUnrolling.cs:17:38:17:40 | "b" | semmle.label | successor |
-| LoopUnrolling.cs:17:38:17:40 | "b" | LoopUnrolling.cs:17:43:17:45 | "c" | semmle.label | successor |
-| LoopUnrolling.cs:17:43:17:45 | "c" | LoopUnrolling.cs:17:31:17:47 | { ..., ... } | semmle.label | successor |
-| LoopUnrolling.cs:18:9:19:33 | [unroll (line 18)] foreach (... ... in ...) ... | LoopUnrolling.cs:18:22:18:22 | String x | semmle.label | non-empty |
-| LoopUnrolling.cs:18:9:19:33 | foreach (... ... in ...) ... | LoopUnrolling.cs:15:10:15:11 | exit M2 (normal) | semmle.label | empty |
-| LoopUnrolling.cs:18:9:19:33 | foreach (... ... in ...) ... | LoopUnrolling.cs:18:22:18:22 | String x | semmle.label | non-empty |
-| LoopUnrolling.cs:18:22:18:22 | String x | LoopUnrolling.cs:19:13:19:33 | ...; | semmle.label | successor |
-| LoopUnrolling.cs:18:27:18:28 | access to local variable xs | LoopUnrolling.cs:18:9:19:33 | [unroll (line 18)] foreach (... ... in ...) ... | semmle.label | successor |
-| LoopUnrolling.cs:19:13:19:32 | call to method WriteLine | LoopUnrolling.cs:18:9:19:33 | foreach (... ... in ...) ... | semmle.label | successor |
-| LoopUnrolling.cs:19:13:19:33 | ...; | LoopUnrolling.cs:19:31:19:31 | access to local variable x | semmle.label | successor |
-| LoopUnrolling.cs:19:31:19:31 | access to local variable x | LoopUnrolling.cs:19:13:19:32 | call to method WriteLine | semmle.label | successor |
-| LoopUnrolling.cs:22:10:22:11 | enter M3 | LoopUnrolling.cs:23:5:27:5 | {...} | semmle.label | successor |
-| LoopUnrolling.cs:22:10:22:11 | exit M3 (normal) | LoopUnrolling.cs:22:10:22:11 | exit M3 | semmle.label | successor |
-| LoopUnrolling.cs:23:5:27:5 | {...} | LoopUnrolling.cs:24:29:24:32 | access to parameter args | semmle.label | successor |
-| LoopUnrolling.cs:24:9:26:40 | foreach (... ... in ...) ... | LoopUnrolling.cs:22:10:22:11 | exit M3 (normal) | semmle.label | empty |
-| LoopUnrolling.cs:24:9:26:40 | foreach (... ... in ...) ... | LoopUnrolling.cs:24:22:24:24 | Char arg | semmle.label | non-empty |
-| LoopUnrolling.cs:24:22:24:24 | Char arg | LoopUnrolling.cs:25:34:25:37 | access to parameter args | semmle.label | successor |
-| LoopUnrolling.cs:24:29:24:32 | access to parameter args | LoopUnrolling.cs:24:9:26:40 | foreach (... ... in ...) ... | semmle.label | successor |
-| LoopUnrolling.cs:25:13:26:40 | [unroll (line 25)] foreach (... ... in ...) ... | LoopUnrolling.cs:25:26:25:29 | Char arg0 | semmle.label | non-empty |
-| LoopUnrolling.cs:25:13:26:40 | foreach (... ... in ...) ... | LoopUnrolling.cs:24:9:26:40 | foreach (... ... in ...) ... | semmle.label | empty |
-| LoopUnrolling.cs:25:13:26:40 | foreach (... ... in ...) ... | LoopUnrolling.cs:25:26:25:29 | Char arg0 | semmle.label | non-empty |
-| LoopUnrolling.cs:25:26:25:29 | Char arg0 | LoopUnrolling.cs:26:17:26:40 | ...; | semmle.label | successor |
-| LoopUnrolling.cs:25:34:25:37 | access to parameter args | LoopUnrolling.cs:25:13:26:40 | [unroll (line 25)] foreach (... ... in ...) ... | semmle.label | successor |
-| LoopUnrolling.cs:26:17:26:39 | call to method WriteLine | LoopUnrolling.cs:25:13:26:40 | foreach (... ... in ...) ... | semmle.label | successor |
-| LoopUnrolling.cs:26:17:26:40 | ...; | LoopUnrolling.cs:26:35:26:38 | access to local variable arg0 | semmle.label | successor |
-| LoopUnrolling.cs:26:35:26:38 | access to local variable arg0 | LoopUnrolling.cs:26:17:26:39 | call to method WriteLine | semmle.label | successor |
-| LoopUnrolling.cs:29:10:29:11 | enter M4 | LoopUnrolling.cs:30:5:34:5 | {...} | semmle.label | successor |
-| LoopUnrolling.cs:29:10:29:11 | exit M4 (normal) | LoopUnrolling.cs:29:10:29:11 | exit M4 | semmle.label | successor |
-| LoopUnrolling.cs:30:5:34:5 | {...} | LoopUnrolling.cs:31:9:31:31 | ... ...; | semmle.label | successor |
-| LoopUnrolling.cs:31:9:31:31 | ... ...; | LoopUnrolling.cs:31:29:31:29 | 0 | semmle.label | successor |
-| LoopUnrolling.cs:31:13:31:30 | String[] xs = ... | LoopUnrolling.cs:32:27:32:28 | access to local variable xs | semmle.label | successor |
-| LoopUnrolling.cs:31:18:31:30 | array creation of type String[] | LoopUnrolling.cs:31:13:31:30 | String[] xs = ... | semmle.label | successor |
-| LoopUnrolling.cs:31:29:31:29 | 0 | LoopUnrolling.cs:31:18:31:30 | array creation of type String[] | semmle.label | successor |
-| LoopUnrolling.cs:32:9:33:33 | [skip (line 32)] foreach (... ... in ...) ... | LoopUnrolling.cs:29:10:29:11 | exit M4 (normal) | semmle.label | empty |
-| LoopUnrolling.cs:32:27:32:28 | access to local variable xs | LoopUnrolling.cs:32:9:33:33 | [skip (line 32)] foreach (... ... in ...) ... | semmle.label | successor |
-| LoopUnrolling.cs:36:10:36:11 | enter M5 | LoopUnrolling.cs:37:5:43:5 | {...} | semmle.label | successor |
-| LoopUnrolling.cs:36:10:36:11 | exit M5 (normal) | LoopUnrolling.cs:36:10:36:11 | exit M5 | semmle.label | successor |
-| LoopUnrolling.cs:37:5:43:5 | {...} | LoopUnrolling.cs:38:9:38:48 | ... ...; | semmle.label | successor |
-| LoopUnrolling.cs:38:9:38:48 | ... ...; | LoopUnrolling.cs:38:18:38:47 | 3 | semmle.label | successor |
-| LoopUnrolling.cs:38:13:38:47 | String[] xs = ... | LoopUnrolling.cs:39:9:39:48 | ... ...; | semmle.label | successor |
-| LoopUnrolling.cs:38:18:38:47 | 3 | LoopUnrolling.cs:38:18:38:47 | array creation of type String[] | semmle.label | successor |
-| LoopUnrolling.cs:38:18:38:47 | array creation of type String[] | LoopUnrolling.cs:38:33:38:35 | "a" | semmle.label | successor |
-| LoopUnrolling.cs:38:31:38:47 | { ..., ... } | LoopUnrolling.cs:38:13:38:47 | String[] xs = ... | semmle.label | successor |
-| LoopUnrolling.cs:38:33:38:35 | "a" | LoopUnrolling.cs:38:38:38:40 | "b" | semmle.label | successor |
-| LoopUnrolling.cs:38:38:38:40 | "b" | LoopUnrolling.cs:38:43:38:45 | "c" | semmle.label | successor |
-| LoopUnrolling.cs:38:43:38:45 | "c" | LoopUnrolling.cs:38:31:38:47 | { ..., ... } | semmle.label | successor |
-| LoopUnrolling.cs:39:9:39:48 | ... ...; | LoopUnrolling.cs:39:18:39:47 | 3 | semmle.label | successor |
-| LoopUnrolling.cs:39:13:39:47 | String[] ys = ... | LoopUnrolling.cs:40:27:40:28 | access to local variable xs | semmle.label | successor |
-| LoopUnrolling.cs:39:18:39:47 | 3 | LoopUnrolling.cs:39:18:39:47 | array creation of type String[] | semmle.label | successor |
-| LoopUnrolling.cs:39:18:39:47 | array creation of type String[] | LoopUnrolling.cs:39:33:39:35 | "0" | semmle.label | successor |
-| LoopUnrolling.cs:39:31:39:47 | { ..., ... } | LoopUnrolling.cs:39:13:39:47 | String[] ys = ... | semmle.label | successor |
-| LoopUnrolling.cs:39:33:39:35 | "0" | LoopUnrolling.cs:39:38:39:40 | "1" | semmle.label | successor |
-| LoopUnrolling.cs:39:38:39:40 | "1" | LoopUnrolling.cs:39:43:39:45 | "2" | semmle.label | successor |
-| LoopUnrolling.cs:39:43:39:45 | "2" | LoopUnrolling.cs:39:31:39:47 | { ..., ... } | semmle.label | successor |
-| LoopUnrolling.cs:40:9:42:41 | [unroll (line 40)] foreach (... ... in ...) ... | LoopUnrolling.cs:40:22:40:22 | String x | semmle.label | non-empty |
-| LoopUnrolling.cs:40:9:42:41 | foreach (... ... in ...) ... | LoopUnrolling.cs:36:10:36:11 | exit M5 (normal) | semmle.label | empty |
-| LoopUnrolling.cs:40:9:42:41 | foreach (... ... in ...) ... | LoopUnrolling.cs:40:22:40:22 | String x | semmle.label | non-empty |
-| LoopUnrolling.cs:40:22:40:22 | String x | LoopUnrolling.cs:41:31:41:32 | access to local variable ys | semmle.label | successor |
-| LoopUnrolling.cs:40:27:40:28 | access to local variable xs | LoopUnrolling.cs:40:9:42:41 | [unroll (line 40)] foreach (... ... in ...) ... | semmle.label | successor |
-| LoopUnrolling.cs:41:13:42:41 | [unroll (line 41)] foreach (... ... in ...) ... | LoopUnrolling.cs:41:26:41:26 | String y | semmle.label | non-empty |
-| LoopUnrolling.cs:41:13:42:41 | foreach (... ... in ...) ... | LoopUnrolling.cs:40:9:42:41 | foreach (... ... in ...) ... | semmle.label | empty |
-| LoopUnrolling.cs:41:13:42:41 | foreach (... ... in ...) ... | LoopUnrolling.cs:41:26:41:26 | String y | semmle.label | non-empty |
-| LoopUnrolling.cs:41:26:41:26 | String y | LoopUnrolling.cs:42:17:42:41 | ...; | semmle.label | successor |
-| LoopUnrolling.cs:41:31:41:32 | access to local variable ys | LoopUnrolling.cs:41:13:42:41 | [unroll (line 41)] foreach (... ... in ...) ... | semmle.label | successor |
-| LoopUnrolling.cs:42:17:42:40 | call to method WriteLine | LoopUnrolling.cs:41:13:42:41 | foreach (... ... in ...) ... | semmle.label | successor |
-| LoopUnrolling.cs:42:17:42:41 | ...; | LoopUnrolling.cs:42:35:42:35 | access to local variable x | semmle.label | successor |
-| LoopUnrolling.cs:42:35:42:35 | access to local variable x | LoopUnrolling.cs:42:39:42:39 | access to local variable y | semmle.label | successor |
-| LoopUnrolling.cs:42:35:42:39 | ... + ... | LoopUnrolling.cs:42:17:42:40 | call to method WriteLine | semmle.label | successor |
-| LoopUnrolling.cs:42:39:42:39 | access to local variable y | LoopUnrolling.cs:42:35:42:39 | ... + ... | semmle.label | successor |
-| LoopUnrolling.cs:45:10:45:11 | enter M6 | LoopUnrolling.cs:46:5:53:5 | {...} | semmle.label | successor |
-| LoopUnrolling.cs:46:5:53:5 | {...} | LoopUnrolling.cs:47:9:47:48 | ... ...; | semmle.label | successor |
-| LoopUnrolling.cs:47:9:47:48 | ... ...; | LoopUnrolling.cs:47:18:47:47 | 3 | semmle.label | successor |
-| LoopUnrolling.cs:47:13:47:47 | String[] xs = ... | LoopUnrolling.cs:48:27:48:28 | access to local variable xs | semmle.label | successor |
-| LoopUnrolling.cs:47:18:47:47 | 3 | LoopUnrolling.cs:47:18:47:47 | array creation of type String[] | semmle.label | successor |
-| LoopUnrolling.cs:47:18:47:47 | array creation of type String[] | LoopUnrolling.cs:47:33:47:35 | "a" | semmle.label | successor |
-| LoopUnrolling.cs:47:31:47:47 | { ..., ... } | LoopUnrolling.cs:47:13:47:47 | String[] xs = ... | semmle.label | successor |
-| LoopUnrolling.cs:47:33:47:35 | "a" | LoopUnrolling.cs:47:38:47:40 | "b" | semmle.label | successor |
-| LoopUnrolling.cs:47:38:47:40 | "b" | LoopUnrolling.cs:47:43:47:45 | "c" | semmle.label | successor |
-| LoopUnrolling.cs:47:43:47:45 | "c" | LoopUnrolling.cs:47:31:47:47 | { ..., ... } | semmle.label | successor |
-| LoopUnrolling.cs:48:9:52:9 | [unroll (line 48)] foreach (... ... in ...) ... | LoopUnrolling.cs:48:22:48:22 | String x | semmle.label | non-empty |
-| LoopUnrolling.cs:48:22:48:22 | String x | LoopUnrolling.cs:49:9:52:9 | {...} | semmle.label | successor |
-| LoopUnrolling.cs:48:27:48:28 | access to local variable xs | LoopUnrolling.cs:48:9:52:9 | [unroll (line 48)] foreach (... ... in ...) ... | semmle.label | successor |
-| LoopUnrolling.cs:49:9:52:9 | {...} | LoopUnrolling.cs:50:9:50:13 | Label: | semmle.label | successor |
-| LoopUnrolling.cs:50:9:50:13 | Label: | LoopUnrolling.cs:50:16:50:36 | ...; | semmle.label | successor |
-| LoopUnrolling.cs:50:16:50:35 | call to method WriteLine | LoopUnrolling.cs:51:13:51:23 | goto ...; | semmle.label | successor |
-| LoopUnrolling.cs:50:16:50:36 | ...; | LoopUnrolling.cs:50:34:50:34 | access to local variable x | semmle.label | successor |
-| LoopUnrolling.cs:50:34:50:34 | access to local variable x | LoopUnrolling.cs:50:16:50:35 | call to method WriteLine | semmle.label | successor |
-| LoopUnrolling.cs:51:13:51:23 | goto ...; | LoopUnrolling.cs:50:9:50:13 | Label: | semmle.label | goto(Label) |
-| LoopUnrolling.cs:55:10:55:11 | enter M7 | LoopUnrolling.cs:56:5:65:5 | {...} | semmle.label | successor |
-| LoopUnrolling.cs:55:10:55:11 | exit M7 (normal) | LoopUnrolling.cs:55:10:55:11 | exit M7 | semmle.label | successor |
-| LoopUnrolling.cs:56:5:65:5 | {...} | LoopUnrolling.cs:57:9:57:48 | ... ...; | semmle.label | successor |
-| LoopUnrolling.cs:57:9:57:48 | ... ...; | LoopUnrolling.cs:57:18:57:47 | 3 | semmle.label | successor |
-| LoopUnrolling.cs:57:13:57:47 | String[] xs = ... | LoopUnrolling.cs:58:27:58:28 | access to local variable xs | semmle.label | successor |
-| LoopUnrolling.cs:57:18:57:47 | 3 | LoopUnrolling.cs:57:18:57:47 | array creation of type String[] | semmle.label | successor |
-| LoopUnrolling.cs:57:18:57:47 | array creation of type String[] | LoopUnrolling.cs:57:33:57:35 | "a" | semmle.label | successor |
-| LoopUnrolling.cs:57:31:57:47 | { ..., ... } | LoopUnrolling.cs:57:13:57:47 | String[] xs = ... | semmle.label | successor |
-| LoopUnrolling.cs:57:33:57:35 | "a" | LoopUnrolling.cs:57:38:57:40 | "b" | semmle.label | successor |
-| LoopUnrolling.cs:57:38:57:40 | "b" | LoopUnrolling.cs:57:43:57:45 | "c" | semmle.label | successor |
-| LoopUnrolling.cs:57:43:57:45 | "c" | LoopUnrolling.cs:57:31:57:47 | { ..., ... } | semmle.label | successor |
-| LoopUnrolling.cs:58:9:64:9 | [b (line 55): false] foreach (... ... in ...) ... | LoopUnrolling.cs:55:10:55:11 | exit M7 (normal) | semmle.label | empty |
-| LoopUnrolling.cs:58:9:64:9 | [b (line 55): false] foreach (... ... in ...) ... | LoopUnrolling.cs:58:22:58:22 | [b (line 55): false] String x | semmle.label | non-empty |
-| LoopUnrolling.cs:58:9:64:9 | [b (line 55): true] foreach (... ... in ...) ... | LoopUnrolling.cs:55:10:55:11 | exit M7 (normal) | semmle.label | empty |
-| LoopUnrolling.cs:58:9:64:9 | [b (line 55): true] foreach (... ... in ...) ... | LoopUnrolling.cs:58:22:58:22 | [b (line 55): true] String x | semmle.label | non-empty |
-| LoopUnrolling.cs:58:9:64:9 | [unroll (line 58)] foreach (... ... in ...) ... | LoopUnrolling.cs:58:22:58:22 | String x | semmle.label | non-empty |
-| LoopUnrolling.cs:58:22:58:22 | String x | LoopUnrolling.cs:59:9:64:9 | {...} | semmle.label | successor |
-| LoopUnrolling.cs:58:22:58:22 | [b (line 55): false] String x | LoopUnrolling.cs:59:9:64:9 | [b (line 55): false] {...} | semmle.label | successor |
-| LoopUnrolling.cs:58:22:58:22 | [b (line 55): true] String x | LoopUnrolling.cs:59:9:64:9 | [b (line 55): true] {...} | semmle.label | successor |
-| LoopUnrolling.cs:58:27:58:28 | access to local variable xs | LoopUnrolling.cs:58:9:64:9 | [unroll (line 58)] foreach (... ... in ...) ... | semmle.label | successor |
-| LoopUnrolling.cs:59:9:64:9 | [b (line 55): false] {...} | LoopUnrolling.cs:60:13:61:37 | [b (line 55): false] if (...) ... | semmle.label | successor |
-| LoopUnrolling.cs:59:9:64:9 | [b (line 55): true] {...} | LoopUnrolling.cs:60:13:61:37 | [b (line 55): true] if (...) ... | semmle.label | successor |
-| LoopUnrolling.cs:59:9:64:9 | {...} | LoopUnrolling.cs:60:13:61:37 | if (...) ... | semmle.label | successor |
-| LoopUnrolling.cs:60:13:61:37 | [b (line 55): false] if (...) ... | LoopUnrolling.cs:60:17:60:17 | [b (line 55): false] access to parameter b | semmle.label | successor |
-| LoopUnrolling.cs:60:13:61:37 | [b (line 55): true] if (...) ... | LoopUnrolling.cs:60:17:60:17 | [b (line 55): true] access to parameter b | semmle.label | successor |
-| LoopUnrolling.cs:60:13:61:37 | if (...) ... | LoopUnrolling.cs:60:17:60:17 | access to parameter b | semmle.label | successor |
-| LoopUnrolling.cs:60:17:60:17 | [b (line 55): false] access to parameter b | LoopUnrolling.cs:62:13:63:37 | [b (line 55): false] if (...) ... | semmle.label | false |
-| LoopUnrolling.cs:60:17:60:17 | [b (line 55): true] access to parameter b | LoopUnrolling.cs:61:17:61:37 | [b (line 55): true] ...; | semmle.label | true |
-| LoopUnrolling.cs:60:17:60:17 | access to parameter b | LoopUnrolling.cs:61:17:61:37 | [b (line 55): true] ...; | semmle.label | true |
-| LoopUnrolling.cs:60:17:60:17 | access to parameter b | LoopUnrolling.cs:62:13:63:37 | [b (line 55): false] if (...) ... | semmle.label | false |
-| LoopUnrolling.cs:61:17:61:36 | [b (line 55): true] call to method WriteLine | LoopUnrolling.cs:62:13:63:37 | [b (line 55): true] if (...) ... | semmle.label | successor |
-| LoopUnrolling.cs:61:17:61:37 | [b (line 55): true] ...; | LoopUnrolling.cs:61:35:61:35 | [b (line 55): true] access to local variable x | semmle.label | successor |
-| LoopUnrolling.cs:61:35:61:35 | [b (line 55): true] access to local variable x | LoopUnrolling.cs:61:17:61:36 | [b (line 55): true] call to method WriteLine | semmle.label | successor |
-| LoopUnrolling.cs:62:13:63:37 | [b (line 55): false] if (...) ... | LoopUnrolling.cs:62:17:62:17 | [b (line 55): false] access to parameter b | semmle.label | successor |
-| LoopUnrolling.cs:62:13:63:37 | [b (line 55): true] if (...) ... | LoopUnrolling.cs:62:17:62:17 | [b (line 55): true] access to parameter b | semmle.label | successor |
-| LoopUnrolling.cs:62:17:62:17 | [b (line 55): false] access to parameter b | LoopUnrolling.cs:58:9:64:9 | [b (line 55): false] foreach (... ... in ...) ... | semmle.label | false |
-| LoopUnrolling.cs:62:17:62:17 | [b (line 55): true] access to parameter b | LoopUnrolling.cs:63:17:63:37 | [b (line 55): true] ...; | semmle.label | true |
-| LoopUnrolling.cs:63:17:63:36 | [b (line 55): true] call to method WriteLine | LoopUnrolling.cs:58:9:64:9 | [b (line 55): true] foreach (... ... in ...) ... | semmle.label | successor |
-| LoopUnrolling.cs:63:17:63:37 | [b (line 55): true] ...; | LoopUnrolling.cs:63:35:63:35 | [b (line 55): true] access to local variable x | semmle.label | successor |
-| LoopUnrolling.cs:63:35:63:35 | [b (line 55): true] access to local variable x | LoopUnrolling.cs:63:17:63:36 | [b (line 55): true] call to method WriteLine | semmle.label | successor |
-| LoopUnrolling.cs:67:10:67:11 | enter M8 | LoopUnrolling.cs:68:5:74:5 | {...} | semmle.label | successor |
-| LoopUnrolling.cs:67:10:67:11 | exit M8 (normal) | LoopUnrolling.cs:67:10:67:11 | exit M8 | semmle.label | successor |
-| LoopUnrolling.cs:68:5:74:5 | {...} | LoopUnrolling.cs:69:9:70:19 | if (...) ... | semmle.label | successor |
-| LoopUnrolling.cs:69:9:70:19 | if (...) ... | LoopUnrolling.cs:69:14:69:17 | access to parameter args | semmle.label | successor |
-| LoopUnrolling.cs:69:13:69:23 | [false] !... | LoopUnrolling.cs:71:9:71:21 | ...; | semmle.label | false |
-| LoopUnrolling.cs:69:13:69:23 | [true] !... | LoopUnrolling.cs:70:13:70:19 | return ...; | semmle.label | true |
-| LoopUnrolling.cs:69:14:69:17 | access to parameter args | LoopUnrolling.cs:69:14:69:23 | call to method Any | semmle.label | successor |
-| LoopUnrolling.cs:69:14:69:23 | call to method Any | LoopUnrolling.cs:69:13:69:23 | [false] !... | semmle.label | true |
-| LoopUnrolling.cs:69:14:69:23 | call to method Any | LoopUnrolling.cs:69:13:69:23 | [true] !... | semmle.label | false |
-| LoopUnrolling.cs:70:13:70:19 | return ...; | LoopUnrolling.cs:67:10:67:11 | exit M8 (normal) | semmle.label | return |
-| LoopUnrolling.cs:71:9:71:12 | access to parameter args | LoopUnrolling.cs:71:9:71:20 | call to method Clear | semmle.label | successor |
-| LoopUnrolling.cs:71:9:71:20 | call to method Clear | LoopUnrolling.cs:72:29:72:32 | access to parameter args | semmle.label | successor |
-| LoopUnrolling.cs:71:9:71:21 | ...; | LoopUnrolling.cs:71:9:71:12 | access to parameter args | semmle.label | successor |
-| LoopUnrolling.cs:72:9:73:35 | [skip (line 72)] foreach (... ... in ...) ... | LoopUnrolling.cs:67:10:67:11 | exit M8 (normal) | semmle.label | empty |
-| LoopUnrolling.cs:72:29:72:32 | access to parameter args | LoopUnrolling.cs:72:9:73:35 | [skip (line 72)] foreach (... ... in ...) ... | semmle.label | successor |
-| LoopUnrolling.cs:76:10:76:11 | enter M9 | LoopUnrolling.cs:77:5:83:5 | {...} | semmle.label | successor |
-| LoopUnrolling.cs:76:10:76:11 | exit M9 (normal) | LoopUnrolling.cs:76:10:76:11 | exit M9 | semmle.label | successor |
-| LoopUnrolling.cs:77:5:83:5 | {...} | LoopUnrolling.cs:78:9:78:34 | ... ...; | semmle.label | successor |
-| LoopUnrolling.cs:78:9:78:34 | ... ...; | LoopUnrolling.cs:78:29:78:29 | 2 | semmle.label | successor |
-| LoopUnrolling.cs:78:13:78:33 | String[,] xs = ... | LoopUnrolling.cs:79:27:79:28 | access to local variable xs | semmle.label | successor |
-| LoopUnrolling.cs:78:18:78:33 | array creation of type String[,] | LoopUnrolling.cs:78:13:78:33 | String[,] xs = ... | semmle.label | successor |
-| LoopUnrolling.cs:78:29:78:29 | 2 | LoopUnrolling.cs:78:32:78:32 | 0 | semmle.label | successor |
-| LoopUnrolling.cs:78:32:78:32 | 0 | LoopUnrolling.cs:78:18:78:33 | array creation of type String[,] | semmle.label | successor |
-| LoopUnrolling.cs:79:9:82:9 | [skip (line 79)] foreach (... ... in ...) ... | LoopUnrolling.cs:76:10:76:11 | exit M9 (normal) | semmle.label | empty |
-| LoopUnrolling.cs:79:27:79:28 | access to local variable xs | LoopUnrolling.cs:79:9:82:9 | [skip (line 79)] foreach (... ... in ...) ... | semmle.label | successor |
-| LoopUnrolling.cs:85:10:85:12 | enter M10 | LoopUnrolling.cs:86:5:92:5 | {...} | semmle.label | successor |
-| LoopUnrolling.cs:85:10:85:12 | exit M10 (normal) | LoopUnrolling.cs:85:10:85:12 | exit M10 | semmle.label | successor |
-| LoopUnrolling.cs:86:5:92:5 | {...} | LoopUnrolling.cs:87:9:87:34 | ... ...; | semmle.label | successor |
-| LoopUnrolling.cs:87:9:87:34 | ... ...; | LoopUnrolling.cs:87:29:87:29 | 0 | semmle.label | successor |
-| LoopUnrolling.cs:87:13:87:33 | String[,] xs = ... | LoopUnrolling.cs:88:27:88:28 | access to local variable xs | semmle.label | successor |
-| LoopUnrolling.cs:87:18:87:33 | array creation of type String[,] | LoopUnrolling.cs:87:13:87:33 | String[,] xs = ... | semmle.label | successor |
-| LoopUnrolling.cs:87:29:87:29 | 0 | LoopUnrolling.cs:87:32:87:32 | 2 | semmle.label | successor |
-| LoopUnrolling.cs:87:32:87:32 | 2 | LoopUnrolling.cs:87:18:87:33 | array creation of type String[,] | semmle.label | successor |
-| LoopUnrolling.cs:88:9:91:9 | [skip (line 88)] foreach (... ... in ...) ... | LoopUnrolling.cs:85:10:85:12 | exit M10 (normal) | semmle.label | empty |
-| LoopUnrolling.cs:88:27:88:28 | access to local variable xs | LoopUnrolling.cs:88:9:91:9 | [skip (line 88)] foreach (... ... in ...) ... | semmle.label | successor |
-| LoopUnrolling.cs:94:10:94:12 | enter M11 | LoopUnrolling.cs:95:5:101:5 | {...} | semmle.label | successor |
-| LoopUnrolling.cs:94:10:94:12 | exit M11 (normal) | LoopUnrolling.cs:94:10:94:12 | exit M11 | semmle.label | successor |
-| LoopUnrolling.cs:95:5:101:5 | {...} | LoopUnrolling.cs:96:9:96:34 | ... ...; | semmle.label | successor |
-| LoopUnrolling.cs:96:9:96:34 | ... ...; | LoopUnrolling.cs:96:29:96:29 | 2 | semmle.label | successor |
-| LoopUnrolling.cs:96:13:96:33 | String[,] xs = ... | LoopUnrolling.cs:97:27:97:28 | access to local variable xs | semmle.label | successor |
-| LoopUnrolling.cs:96:18:96:33 | array creation of type String[,] | LoopUnrolling.cs:96:13:96:33 | String[,] xs = ... | semmle.label | successor |
-| LoopUnrolling.cs:96:29:96:29 | 2 | LoopUnrolling.cs:96:32:96:32 | 2 | semmle.label | successor |
-| LoopUnrolling.cs:96:32:96:32 | 2 | LoopUnrolling.cs:96:18:96:33 | array creation of type String[,] | semmle.label | successor |
-| LoopUnrolling.cs:97:9:100:9 | [unroll (line 97)] foreach (... ... in ...) ... | LoopUnrolling.cs:97:22:97:22 | String x | semmle.label | non-empty |
-| LoopUnrolling.cs:97:9:100:9 | foreach (... ... in ...) ... | LoopUnrolling.cs:94:10:94:12 | exit M11 (normal) | semmle.label | empty |
-| LoopUnrolling.cs:97:9:100:9 | foreach (... ... in ...) ... | LoopUnrolling.cs:97:22:97:22 | String x | semmle.label | non-empty |
-| LoopUnrolling.cs:97:22:97:22 | String x | LoopUnrolling.cs:98:9:100:9 | {...} | semmle.label | successor |
-| LoopUnrolling.cs:97:27:97:28 | access to local variable xs | LoopUnrolling.cs:97:9:100:9 | [unroll (line 97)] foreach (... ... in ...) ... | semmle.label | successor |
-| LoopUnrolling.cs:98:9:100:9 | {...} | LoopUnrolling.cs:99:13:99:33 | ...; | semmle.label | successor |
-| LoopUnrolling.cs:99:13:99:32 | call to method WriteLine | LoopUnrolling.cs:97:9:100:9 | foreach (... ... in ...) ... | semmle.label | successor |
-| LoopUnrolling.cs:99:13:99:33 | ...; | LoopUnrolling.cs:99:31:99:31 | access to local variable x | semmle.label | successor |
-| LoopUnrolling.cs:99:31:99:31 | access to local variable x | LoopUnrolling.cs:99:13:99:32 | call to method WriteLine | semmle.label | successor |
-| MultiImplementationA.cs:6:22:6:31 | enter get_P1 | MultiImplementationA.cs:6:28:6:31 | null | semmle.label | successor |
-| MultiImplementationA.cs:6:22:6:31 | enter get_P1 | MultiImplementationB.cs:3:22:3:22 | 0 | semmle.label | successor |
-| MultiImplementationA.cs:6:22:6:31 | exit get_P1 (abnormal) | MultiImplementationA.cs:6:22:6:31 | exit get_P1 | semmle.label | successor |
-| MultiImplementationA.cs:6:22:6:31 | exit get_P1 (abnormal) | MultiImplementationB.cs:3:22:3:22 | exit get_P1 | semmle.label | successor |
-| MultiImplementationA.cs:6:22:6:31 | exit get_P1 (normal) | MultiImplementationA.cs:6:22:6:31 | exit get_P1 | semmle.label | successor |
-| MultiImplementationA.cs:6:22:6:31 | exit get_P1 (normal) | MultiImplementationB.cs:3:22:3:22 | exit get_P1 | semmle.label | successor |
-| MultiImplementationA.cs:6:22:6:31 | throw ... | MultiImplementationA.cs:6:22:6:31 | exit get_P1 (abnormal) | semmle.label | exception(NullReferenceException) |
-| MultiImplementationA.cs:6:22:6:31 | throw ... | MultiImplementationB.cs:3:22:3:22 | exit get_P1 (abnormal) | semmle.label | exception(NullReferenceException) |
-| MultiImplementationA.cs:6:28:6:31 | null | MultiImplementationA.cs:6:22:6:31 | throw ... | semmle.label | successor |
-| MultiImplementationA.cs:7:21:7:23 | enter get_P2 | MultiImplementationA.cs:7:25:7:39 | {...} | semmle.label | successor |
-| MultiImplementationA.cs:7:21:7:23 | enter get_P2 | MultiImplementationB.cs:4:25:4:37 | {...} | semmle.label | successor |
-| MultiImplementationA.cs:7:21:7:23 | exit get_P2 (abnormal) | MultiImplementationA.cs:7:21:7:23 | exit get_P2 | semmle.label | successor |
-| MultiImplementationA.cs:7:21:7:23 | exit get_P2 (abnormal) | MultiImplementationB.cs:4:21:4:23 | exit get_P2 | semmle.label | successor |
-| MultiImplementationA.cs:7:21:7:23 | exit get_P2 (normal) | MultiImplementationA.cs:7:21:7:23 | exit get_P2 | semmle.label | successor |
-| MultiImplementationA.cs:7:21:7:23 | exit get_P2 (normal) | MultiImplementationB.cs:4:21:4:23 | exit get_P2 | semmle.label | successor |
-| MultiImplementationA.cs:7:25:7:39 | {...} | MultiImplementationA.cs:7:33:7:36 | null | semmle.label | successor |
-| MultiImplementationA.cs:7:27:7:37 | throw ...; | MultiImplementationA.cs:7:21:7:23 | exit get_P2 (abnormal) | semmle.label | exception(NullReferenceException) |
-| MultiImplementationA.cs:7:27:7:37 | throw ...; | MultiImplementationB.cs:4:21:4:23 | exit get_P2 (abnormal) | semmle.label | exception(NullReferenceException) |
-| MultiImplementationA.cs:7:33:7:36 | null | MultiImplementationA.cs:7:27:7:37 | throw ...; | semmle.label | successor |
-| MultiImplementationA.cs:7:41:7:43 | enter set_P2 | MultiImplementationA.cs:7:45:7:59 | {...} | semmle.label | successor |
-| MultiImplementationA.cs:7:41:7:43 | enter set_P2 | MultiImplementationB.cs:4:43:4:45 | {...} | semmle.label | successor |
-| MultiImplementationA.cs:7:41:7:43 | exit set_P2 (abnormal) | MultiImplementationA.cs:7:41:7:43 | exit set_P2 | semmle.label | successor |
-| MultiImplementationA.cs:7:41:7:43 | exit set_P2 (abnormal) | MultiImplementationB.cs:4:39:4:41 | exit set_P2 | semmle.label | successor |
-| MultiImplementationA.cs:7:41:7:43 | exit set_P2 (normal) | MultiImplementationA.cs:7:41:7:43 | exit set_P2 | semmle.label | successor |
-| MultiImplementationA.cs:7:41:7:43 | exit set_P2 (normal) | MultiImplementationB.cs:4:39:4:41 | exit set_P2 | semmle.label | successor |
-| MultiImplementationA.cs:7:45:7:59 | {...} | MultiImplementationA.cs:7:53:7:56 | null | semmle.label | successor |
-| MultiImplementationA.cs:7:47:7:57 | throw ...; | MultiImplementationA.cs:7:41:7:43 | exit set_P2 (abnormal) | semmle.label | exception(NullReferenceException) |
-| MultiImplementationA.cs:7:47:7:57 | throw ...; | MultiImplementationB.cs:4:39:4:41 | exit set_P2 (abnormal) | semmle.label | exception(NullReferenceException) |
-| MultiImplementationA.cs:7:53:7:56 | null | MultiImplementationA.cs:7:47:7:57 | throw ...; | semmle.label | successor |
-| MultiImplementationA.cs:8:16:8:16 | enter M | MultiImplementationA.cs:8:29:8:32 | null | semmle.label | successor |
-| MultiImplementationA.cs:8:16:8:16 | enter M | MultiImplementationB.cs:5:23:5:23 | 2 | semmle.label | successor |
-| MultiImplementationA.cs:8:16:8:16 | exit M (abnormal) | MultiImplementationA.cs:8:16:8:16 | exit M | semmle.label | successor |
-| MultiImplementationA.cs:8:16:8:16 | exit M (abnormal) | MultiImplementationB.cs:5:16:5:16 | exit M | semmle.label | successor |
-| MultiImplementationA.cs:8:16:8:16 | exit M (normal) | MultiImplementationA.cs:8:16:8:16 | exit M | semmle.label | successor |
-| MultiImplementationA.cs:8:16:8:16 | exit M (normal) | MultiImplementationB.cs:5:16:5:16 | exit M | semmle.label | successor |
-| MultiImplementationA.cs:8:23:8:32 | throw ... | MultiImplementationA.cs:8:16:8:16 | exit M (abnormal) | semmle.label | exception(NullReferenceException) |
-| MultiImplementationA.cs:8:23:8:32 | throw ... | MultiImplementationB.cs:5:16:5:16 | exit M (abnormal) | semmle.label | exception(NullReferenceException) |
-| MultiImplementationA.cs:8:29:8:32 | null | MultiImplementationA.cs:8:23:8:32 | throw ... | semmle.label | successor |
-| MultiImplementationA.cs:13:16:13:16 | this access | MultiImplementationA.cs:13:20:13:20 | 0 | semmle.label | successor |
-| MultiImplementationA.cs:13:16:13:20 | ... = ... | MultiImplementationA.cs:24:16:24:16 | this access | semmle.label | successor |
-| MultiImplementationA.cs:13:20:13:20 | 0 | MultiImplementationA.cs:13:16:13:20 | ... = ... | semmle.label | successor |
-| MultiImplementationA.cs:14:31:14:31 | access to parameter i | MultiImplementationA.cs:14:31:14:31 | exit get_Item (normal) | semmle.label | successor |
-| MultiImplementationA.cs:14:31:14:31 | access to parameter i | MultiImplementationB.cs:12:31:12:40 | exit get_Item (normal) | semmle.label | successor |
-| MultiImplementationA.cs:14:31:14:31 | enter get_Item | MultiImplementationA.cs:14:31:14:31 | access to parameter i | semmle.label | successor |
-| MultiImplementationA.cs:14:31:14:31 | enter get_Item | MultiImplementationB.cs:12:37:12:40 | null | semmle.label | successor |
-| MultiImplementationA.cs:14:31:14:31 | exit get_Item (abnormal) | MultiImplementationA.cs:14:31:14:31 | exit get_Item | semmle.label | successor |
-| MultiImplementationA.cs:14:31:14:31 | exit get_Item (abnormal) | MultiImplementationB.cs:12:31:12:40 | exit get_Item | semmle.label | successor |
-| MultiImplementationA.cs:14:31:14:31 | exit get_Item (normal) | MultiImplementationA.cs:14:31:14:31 | exit get_Item | semmle.label | successor |
-| MultiImplementationA.cs:14:31:14:31 | exit get_Item (normal) | MultiImplementationB.cs:12:31:12:40 | exit get_Item | semmle.label | successor |
-| MultiImplementationA.cs:15:36:15:38 | enter get_Item | MultiImplementationA.cs:15:40:15:52 | {...} | semmle.label | successor |
-| MultiImplementationA.cs:15:36:15:38 | enter get_Item | MultiImplementationB.cs:13:40:13:54 | {...} | semmle.label | successor |
-| MultiImplementationA.cs:15:36:15:38 | exit get_Item (abnormal) | MultiImplementationA.cs:15:36:15:38 | exit get_Item | semmle.label | successor |
-| MultiImplementationA.cs:15:36:15:38 | exit get_Item (abnormal) | MultiImplementationB.cs:13:36:13:38 | exit get_Item | semmle.label | successor |
-| MultiImplementationA.cs:15:36:15:38 | exit get_Item (normal) | MultiImplementationA.cs:15:36:15:38 | exit get_Item | semmle.label | successor |
-| MultiImplementationA.cs:15:36:15:38 | exit get_Item (normal) | MultiImplementationB.cs:13:36:13:38 | exit get_Item | semmle.label | successor |
-| MultiImplementationA.cs:15:40:15:52 | {...} | MultiImplementationA.cs:15:49:15:49 | access to parameter s | semmle.label | successor |
-| MultiImplementationA.cs:15:42:15:50 | return ...; | MultiImplementationA.cs:15:36:15:38 | exit get_Item (normal) | semmle.label | return |
-| MultiImplementationA.cs:15:42:15:50 | return ...; | MultiImplementationB.cs:13:36:13:38 | exit get_Item (normal) | semmle.label | return |
-| MultiImplementationA.cs:15:49:15:49 | access to parameter s | MultiImplementationA.cs:15:42:15:50 | return ...; | semmle.label | successor |
-| MultiImplementationA.cs:15:54:15:56 | enter set_Item | MultiImplementationA.cs:15:58:15:60 | {...} | semmle.label | successor |
-| MultiImplementationA.cs:15:54:15:56 | enter set_Item | MultiImplementationB.cs:13:60:13:62 | {...} | semmle.label | successor |
-| MultiImplementationA.cs:15:54:15:56 | exit set_Item (normal) | MultiImplementationA.cs:15:54:15:56 | exit set_Item | semmle.label | successor |
-| MultiImplementationA.cs:15:54:15:56 | exit set_Item (normal) | MultiImplementationB.cs:13:56:13:58 | exit set_Item | semmle.label | successor |
-| MultiImplementationA.cs:15:58:15:60 | {...} | MultiImplementationA.cs:15:54:15:56 | exit set_Item (normal) | semmle.label | successor |
-| MultiImplementationA.cs:15:58:15:60 | {...} | MultiImplementationB.cs:13:56:13:58 | exit set_Item (normal) | semmle.label | successor |
-| MultiImplementationA.cs:16:17:16:18 | enter M1 | MultiImplementationA.cs:17:5:19:5 | {...} | semmle.label | successor |
-| MultiImplementationA.cs:16:17:16:18 | enter M1 | MultiImplementationB.cs:15:5:17:5 | {...} | semmle.label | successor |
-| MultiImplementationA.cs:16:17:16:18 | exit M1 (normal) | MultiImplementationA.cs:16:17:16:18 | exit M1 | semmle.label | successor |
-| MultiImplementationA.cs:16:17:16:18 | exit M1 (normal) | MultiImplementationB.cs:14:17:14:18 | exit M1 | semmle.label | successor |
-| MultiImplementationA.cs:17:5:19:5 | {...} | MultiImplementationA.cs:18:9:18:22 | M2(...) | semmle.label | successor |
-| MultiImplementationA.cs:18:9:18:22 | M2(...) | MultiImplementationA.cs:16:17:16:18 | exit M1 (normal) | semmle.label | successor |
-| MultiImplementationA.cs:18:9:18:22 | M2(...) | MultiImplementationB.cs:14:17:14:18 | exit M1 (normal) | semmle.label | successor |
-| MultiImplementationA.cs:18:9:18:22 | enter M2 | MultiImplementationA.cs:18:21:18:21 | 0 | semmle.label | successor |
-| MultiImplementationA.cs:18:9:18:22 | exit M2 (normal) | MultiImplementationA.cs:18:9:18:22 | exit M2 | semmle.label | successor |
-| MultiImplementationA.cs:18:21:18:21 | 0 | MultiImplementationA.cs:18:9:18:22 | exit M2 (normal) | semmle.label | successor |
-| MultiImplementationA.cs:20:12:20:13 | call to constructor Object | MultiImplementationA.cs:13:16:13:16 | this access | semmle.label | successor |
-| MultiImplementationA.cs:20:12:20:13 | enter C2 | MultiImplementationA.cs:20:12:20:13 | call to constructor Object | semmle.label | successor |
-| MultiImplementationA.cs:20:12:20:13 | enter C2 | MultiImplementationB.cs:18:12:18:13 | call to constructor Object | semmle.label | successor |
-| MultiImplementationA.cs:20:12:20:13 | exit C2 (abnormal) | MultiImplementationA.cs:20:12:20:13 | exit C2 | semmle.label | successor |
-| MultiImplementationA.cs:20:12:20:13 | exit C2 (abnormal) | MultiImplementationB.cs:18:12:18:13 | exit C2 | semmle.label | successor |
-| MultiImplementationA.cs:20:12:20:13 | exit C2 (normal) | MultiImplementationA.cs:20:12:20:13 | exit C2 | semmle.label | successor |
-| MultiImplementationA.cs:20:12:20:13 | exit C2 (normal) | MultiImplementationB.cs:18:12:18:13 | exit C2 | semmle.label | successor |
-| MultiImplementationA.cs:20:22:20:31 | {...} | MultiImplementationA.cs:20:24:20:29 | ...; | semmle.label | successor |
-| MultiImplementationA.cs:20:24:20:24 | this access | MultiImplementationA.cs:20:28:20:28 | access to parameter i | semmle.label | successor |
-| MultiImplementationA.cs:20:24:20:28 | ... = ... | MultiImplementationA.cs:20:12:20:13 | exit C2 (normal) | semmle.label | successor |
-| MultiImplementationA.cs:20:24:20:28 | ... = ... | MultiImplementationB.cs:18:12:18:13 | exit C2 (normal) | semmle.label | successor |
-| MultiImplementationA.cs:20:24:20:29 | ...; | MultiImplementationA.cs:20:24:20:24 | this access | semmle.label | successor |
-| MultiImplementationA.cs:20:28:20:28 | access to parameter i | MultiImplementationA.cs:20:24:20:28 | ... = ... | semmle.label | successor |
-| MultiImplementationA.cs:21:12:21:13 | enter C2 | MultiImplementationA.cs:21:24:21:24 | 0 | semmle.label | successor |
-| MultiImplementationA.cs:21:12:21:13 | enter C2 | MultiImplementationB.cs:19:24:19:24 | 1 | semmle.label | successor |
-| MultiImplementationA.cs:21:12:21:13 | exit C2 (normal) | MultiImplementationA.cs:21:12:21:13 | exit C2 | semmle.label | successor |
-| MultiImplementationA.cs:21:12:21:13 | exit C2 (normal) | MultiImplementationB.cs:19:12:19:13 | exit C2 | semmle.label | successor |
-| MultiImplementationA.cs:21:19:21:22 | call to constructor C2 | MultiImplementationA.cs:21:27:21:29 | {...} | semmle.label | successor |
-| MultiImplementationA.cs:21:24:21:24 | 0 | MultiImplementationA.cs:21:19:21:22 | call to constructor C2 | semmle.label | successor |
-| MultiImplementationA.cs:21:27:21:29 | {...} | MultiImplementationA.cs:21:12:21:13 | exit C2 (normal) | semmle.label | successor |
-| MultiImplementationA.cs:21:27:21:29 | {...} | MultiImplementationB.cs:19:12:19:13 | exit C2 (normal) | semmle.label | successor |
-| MultiImplementationA.cs:22:6:22:7 | enter ~C2 | MultiImplementationA.cs:22:11:22:13 | {...} | semmle.label | successor |
-| MultiImplementationA.cs:22:6:22:7 | enter ~C2 | MultiImplementationB.cs:20:11:20:25 | {...} | semmle.label | successor |
-| MultiImplementationA.cs:22:6:22:7 | exit ~C2 (abnormal) | MultiImplementationA.cs:22:6:22:7 | exit ~C2 | semmle.label | successor |
-| MultiImplementationA.cs:22:6:22:7 | exit ~C2 (abnormal) | MultiImplementationB.cs:20:6:20:7 | exit ~C2 | semmle.label | successor |
-| MultiImplementationA.cs:22:6:22:7 | exit ~C2 (normal) | MultiImplementationA.cs:22:6:22:7 | exit ~C2 | semmle.label | successor |
-| MultiImplementationA.cs:22:6:22:7 | exit ~C2 (normal) | MultiImplementationB.cs:20:6:20:7 | exit ~C2 | semmle.label | successor |
-| MultiImplementationA.cs:22:11:22:13 | {...} | MultiImplementationA.cs:22:6:22:7 | exit ~C2 (normal) | semmle.label | successor |
-| MultiImplementationA.cs:22:11:22:13 | {...} | MultiImplementationB.cs:20:6:20:7 | exit ~C2 (normal) | semmle.label | successor |
-| MultiImplementationA.cs:23:28:23:35 | enter implicit conversion | MultiImplementationA.cs:23:50:23:53 | null | semmle.label | successor |
-| MultiImplementationA.cs:23:28:23:35 | enter implicit conversion | MultiImplementationB.cs:21:56:21:59 | null | semmle.label | successor |
-| MultiImplementationA.cs:23:28:23:35 | exit implicit conversion (abnormal) | MultiImplementationA.cs:23:28:23:35 | exit implicit conversion | semmle.label | successor |
-| MultiImplementationA.cs:23:28:23:35 | exit implicit conversion (abnormal) | MultiImplementationB.cs:21:28:21:35 | exit implicit conversion | semmle.label | successor |
-| MultiImplementationA.cs:23:28:23:35 | exit implicit conversion (normal) | MultiImplementationA.cs:23:28:23:35 | exit implicit conversion | semmle.label | successor |
-| MultiImplementationA.cs:23:28:23:35 | exit implicit conversion (normal) | MultiImplementationB.cs:21:28:21:35 | exit implicit conversion | semmle.label | successor |
-| MultiImplementationA.cs:23:50:23:53 | null | MultiImplementationA.cs:23:28:23:35 | exit implicit conversion (normal) | semmle.label | successor |
-| MultiImplementationA.cs:23:50:23:53 | null | MultiImplementationB.cs:21:28:21:35 | exit implicit conversion (normal) | semmle.label | successor |
-| MultiImplementationA.cs:24:16:24:16 | access to property P | MultiImplementationA.cs:24:32:24:34 | ... = ... | semmle.label | successor |
-| MultiImplementationA.cs:24:16:24:16 | this access | MultiImplementationA.cs:24:34:24:34 | 0 | semmle.label | successor |
-| MultiImplementationA.cs:24:32:24:34 | ... = ... | MultiImplementationA.cs:20:22:20:31 | {...} | semmle.label | successor |
-| MultiImplementationA.cs:24:34:24:34 | 0 | MultiImplementationA.cs:24:16:24:16 | access to property P | semmle.label | successor |
-| MultiImplementationA.cs:30:21:30:23 | enter get_P3 | MultiImplementationA.cs:30:34:30:37 | null | semmle.label | successor |
-| MultiImplementationA.cs:30:21:30:23 | exit get_P3 (abnormal) | MultiImplementationA.cs:30:21:30:23 | exit get_P3 | semmle.label | successor |
-| MultiImplementationA.cs:30:21:30:23 | exit get_P3 (abnormal) | MultiImplementationB.cs:27:21:27:23 | exit get_P3 | semmle.label | successor |
-| MultiImplementationA.cs:30:28:30:37 | throw ... | MultiImplementationA.cs:30:21:30:23 | exit get_P3 (abnormal) | semmle.label | exception(NullReferenceException) |
-| MultiImplementationA.cs:30:28:30:37 | throw ... | MultiImplementationB.cs:27:21:27:23 | exit get_P3 (abnormal) | semmle.label | exception(NullReferenceException) |
-| MultiImplementationA.cs:30:34:30:37 | null | MultiImplementationA.cs:30:28:30:37 | throw ... | semmle.label | successor |
-| MultiImplementationA.cs:36:9:36:10 | enter M1 | MultiImplementationA.cs:36:14:36:28 | {...} | semmle.label | successor |
-| MultiImplementationA.cs:36:9:36:10 | enter M1 | MultiImplementationB.cs:32:17:32:17 | 0 | semmle.label | successor |
-| MultiImplementationA.cs:36:9:36:10 | exit M1 (abnormal) | MultiImplementationA.cs:36:9:36:10 | exit M1 | semmle.label | successor |
-| MultiImplementationA.cs:36:9:36:10 | exit M1 (abnormal) | MultiImplementationB.cs:32:9:32:10 | exit M1 | semmle.label | successor |
-| MultiImplementationA.cs:36:9:36:10 | exit M1 (normal) | MultiImplementationA.cs:36:9:36:10 | exit M1 | semmle.label | successor |
-| MultiImplementationA.cs:36:9:36:10 | exit M1 (normal) | MultiImplementationB.cs:32:9:32:10 | exit M1 | semmle.label | successor |
-| MultiImplementationA.cs:36:14:36:28 | {...} | MultiImplementationA.cs:36:22:36:25 | null | semmle.label | successor |
-| MultiImplementationA.cs:36:16:36:26 | throw ...; | MultiImplementationA.cs:36:9:36:10 | exit M1 (abnormal) | semmle.label | exception(NullReferenceException) |
-| MultiImplementationA.cs:36:16:36:26 | throw ...; | MultiImplementationB.cs:32:9:32:10 | exit M1 (abnormal) | semmle.label | exception(NullReferenceException) |
-| MultiImplementationA.cs:36:22:36:25 | null | MultiImplementationA.cs:36:16:36:26 | throw ...; | semmle.label | successor |
-| MultiImplementationA.cs:37:9:37:10 | enter M2 | MultiImplementationA.cs:37:14:37:28 | {...} | semmle.label | successor |
-| MultiImplementationA.cs:37:9:37:10 | exit M2 (abnormal) | MultiImplementationA.cs:37:9:37:10 | exit M2 | semmle.label | successor |
-| MultiImplementationA.cs:37:14:37:28 | {...} | MultiImplementationA.cs:37:22:37:25 | null | semmle.label | successor |
-| MultiImplementationA.cs:37:16:37:26 | throw ...; | MultiImplementationA.cs:37:9:37:10 | exit M2 (abnormal) | semmle.label | exception(NullReferenceException) |
-| MultiImplementationA.cs:37:22:37:25 | null | MultiImplementationA.cs:37:16:37:26 | throw ...; | semmle.label | successor |
-| MultiImplementationB.cs:3:22:3:22 | 0 | MultiImplementationA.cs:6:22:6:31 | exit get_P1 (normal) | semmle.label | successor |
-| MultiImplementationB.cs:3:22:3:22 | 0 | MultiImplementationB.cs:3:22:3:22 | exit get_P1 (normal) | semmle.label | successor |
-| MultiImplementationB.cs:3:22:3:22 | enter get_P1 | MultiImplementationA.cs:6:28:6:31 | null | semmle.label | successor |
-| MultiImplementationB.cs:3:22:3:22 | enter get_P1 | MultiImplementationB.cs:3:22:3:22 | 0 | semmle.label | successor |
-| MultiImplementationB.cs:3:22:3:22 | exit get_P1 (abnormal) | MultiImplementationA.cs:6:22:6:31 | exit get_P1 | semmle.label | successor |
-| MultiImplementationB.cs:3:22:3:22 | exit get_P1 (abnormal) | MultiImplementationB.cs:3:22:3:22 | exit get_P1 | semmle.label | successor |
-| MultiImplementationB.cs:3:22:3:22 | exit get_P1 (normal) | MultiImplementationA.cs:6:22:6:31 | exit get_P1 | semmle.label | successor |
-| MultiImplementationB.cs:3:22:3:22 | exit get_P1 (normal) | MultiImplementationB.cs:3:22:3:22 | exit get_P1 | semmle.label | successor |
-| MultiImplementationB.cs:4:21:4:23 | enter get_P2 | MultiImplementationA.cs:7:25:7:39 | {...} | semmle.label | successor |
-| MultiImplementationB.cs:4:21:4:23 | enter get_P2 | MultiImplementationB.cs:4:25:4:37 | {...} | semmle.label | successor |
-| MultiImplementationB.cs:4:21:4:23 | exit get_P2 (abnormal) | MultiImplementationA.cs:7:21:7:23 | exit get_P2 | semmle.label | successor |
-| MultiImplementationB.cs:4:21:4:23 | exit get_P2 (abnormal) | MultiImplementationB.cs:4:21:4:23 | exit get_P2 | semmle.label | successor |
-| MultiImplementationB.cs:4:21:4:23 | exit get_P2 (normal) | MultiImplementationA.cs:7:21:7:23 | exit get_P2 | semmle.label | successor |
-| MultiImplementationB.cs:4:21:4:23 | exit get_P2 (normal) | MultiImplementationB.cs:4:21:4:23 | exit get_P2 | semmle.label | successor |
-| MultiImplementationB.cs:4:25:4:37 | {...} | MultiImplementationB.cs:4:34:4:34 | 1 | semmle.label | successor |
-| MultiImplementationB.cs:4:27:4:35 | return ...; | MultiImplementationA.cs:7:21:7:23 | exit get_P2 (normal) | semmle.label | return |
-| MultiImplementationB.cs:4:27:4:35 | return ...; | MultiImplementationB.cs:4:21:4:23 | exit get_P2 (normal) | semmle.label | return |
-| MultiImplementationB.cs:4:34:4:34 | 1 | MultiImplementationB.cs:4:27:4:35 | return ...; | semmle.label | successor |
-| MultiImplementationB.cs:4:39:4:41 | enter set_P2 | MultiImplementationA.cs:7:45:7:59 | {...} | semmle.label | successor |
-| MultiImplementationB.cs:4:39:4:41 | enter set_P2 | MultiImplementationB.cs:4:43:4:45 | {...} | semmle.label | successor |
-| MultiImplementationB.cs:4:39:4:41 | exit set_P2 (abnormal) | MultiImplementationA.cs:7:41:7:43 | exit set_P2 | semmle.label | successor |
-| MultiImplementationB.cs:4:39:4:41 | exit set_P2 (abnormal) | MultiImplementationB.cs:4:39:4:41 | exit set_P2 | semmle.label | successor |
-| MultiImplementationB.cs:4:39:4:41 | exit set_P2 (normal) | MultiImplementationA.cs:7:41:7:43 | exit set_P2 | semmle.label | successor |
-| MultiImplementationB.cs:4:39:4:41 | exit set_P2 (normal) | MultiImplementationB.cs:4:39:4:41 | exit set_P2 | semmle.label | successor |
-| MultiImplementationB.cs:4:43:4:45 | {...} | MultiImplementationA.cs:7:41:7:43 | exit set_P2 (normal) | semmle.label | successor |
-| MultiImplementationB.cs:4:43:4:45 | {...} | MultiImplementationB.cs:4:39:4:41 | exit set_P2 (normal) | semmle.label | successor |
-| MultiImplementationB.cs:5:16:5:16 | enter M | MultiImplementationA.cs:8:29:8:32 | null | semmle.label | successor |
-| MultiImplementationB.cs:5:16:5:16 | enter M | MultiImplementationB.cs:5:23:5:23 | 2 | semmle.label | successor |
-| MultiImplementationB.cs:5:16:5:16 | exit M (abnormal) | MultiImplementationA.cs:8:16:8:16 | exit M | semmle.label | successor |
-| MultiImplementationB.cs:5:16:5:16 | exit M (abnormal) | MultiImplementationB.cs:5:16:5:16 | exit M | semmle.label | successor |
-| MultiImplementationB.cs:5:16:5:16 | exit M (normal) | MultiImplementationA.cs:8:16:8:16 | exit M | semmle.label | successor |
-| MultiImplementationB.cs:5:16:5:16 | exit M (normal) | MultiImplementationB.cs:5:16:5:16 | exit M | semmle.label | successor |
-| MultiImplementationB.cs:5:23:5:23 | 2 | MultiImplementationA.cs:8:16:8:16 | exit M (normal) | semmle.label | successor |
-| MultiImplementationB.cs:5:23:5:23 | 2 | MultiImplementationB.cs:5:16:5:16 | exit M (normal) | semmle.label | successor |
-| MultiImplementationB.cs:11:16:11:16 | this access | MultiImplementationB.cs:11:20:11:20 | 1 | semmle.label | successor |
-| MultiImplementationB.cs:11:16:11:20 | ... = ... | MultiImplementationB.cs:22:16:22:16 | this access | semmle.label | successor |
-| MultiImplementationB.cs:11:20:11:20 | 1 | MultiImplementationB.cs:11:16:11:20 | ... = ... | semmle.label | successor |
-| MultiImplementationB.cs:12:31:12:40 | enter get_Item | MultiImplementationA.cs:14:31:14:31 | access to parameter i | semmle.label | successor |
-| MultiImplementationB.cs:12:31:12:40 | enter get_Item | MultiImplementationB.cs:12:37:12:40 | null | semmle.label | successor |
-| MultiImplementationB.cs:12:31:12:40 | exit get_Item (abnormal) | MultiImplementationA.cs:14:31:14:31 | exit get_Item | semmle.label | successor |
-| MultiImplementationB.cs:12:31:12:40 | exit get_Item (abnormal) | MultiImplementationB.cs:12:31:12:40 | exit get_Item | semmle.label | successor |
-| MultiImplementationB.cs:12:31:12:40 | exit get_Item (normal) | MultiImplementationA.cs:14:31:14:31 | exit get_Item | semmle.label | successor |
-| MultiImplementationB.cs:12:31:12:40 | exit get_Item (normal) | MultiImplementationB.cs:12:31:12:40 | exit get_Item | semmle.label | successor |
-| MultiImplementationB.cs:12:31:12:40 | throw ... | MultiImplementationA.cs:14:31:14:31 | exit get_Item (abnormal) | semmle.label | exception(NullReferenceException) |
-| MultiImplementationB.cs:12:31:12:40 | throw ... | MultiImplementationB.cs:12:31:12:40 | exit get_Item (abnormal) | semmle.label | exception(NullReferenceException) |
-| MultiImplementationB.cs:12:37:12:40 | null | MultiImplementationB.cs:12:31:12:40 | throw ... | semmle.label | successor |
-| MultiImplementationB.cs:13:36:13:38 | enter get_Item | MultiImplementationA.cs:15:40:15:52 | {...} | semmle.label | successor |
-| MultiImplementationB.cs:13:36:13:38 | enter get_Item | MultiImplementationB.cs:13:40:13:54 | {...} | semmle.label | successor |
-| MultiImplementationB.cs:13:36:13:38 | exit get_Item (abnormal) | MultiImplementationA.cs:15:36:15:38 | exit get_Item | semmle.label | successor |
-| MultiImplementationB.cs:13:36:13:38 | exit get_Item (abnormal) | MultiImplementationB.cs:13:36:13:38 | exit get_Item | semmle.label | successor |
-| MultiImplementationB.cs:13:36:13:38 | exit get_Item (normal) | MultiImplementationA.cs:15:36:15:38 | exit get_Item | semmle.label | successor |
-| MultiImplementationB.cs:13:36:13:38 | exit get_Item (normal) | MultiImplementationB.cs:13:36:13:38 | exit get_Item | semmle.label | successor |
-| MultiImplementationB.cs:13:40:13:54 | {...} | MultiImplementationB.cs:13:48:13:51 | null | semmle.label | successor |
-| MultiImplementationB.cs:13:42:13:52 | throw ...; | MultiImplementationA.cs:15:36:15:38 | exit get_Item (abnormal) | semmle.label | exception(NullReferenceException) |
-| MultiImplementationB.cs:13:42:13:52 | throw ...; | MultiImplementationB.cs:13:36:13:38 | exit get_Item (abnormal) | semmle.label | exception(NullReferenceException) |
-| MultiImplementationB.cs:13:48:13:51 | null | MultiImplementationB.cs:13:42:13:52 | throw ...; | semmle.label | successor |
-| MultiImplementationB.cs:13:56:13:58 | enter set_Item | MultiImplementationA.cs:15:58:15:60 | {...} | semmle.label | successor |
-| MultiImplementationB.cs:13:56:13:58 | enter set_Item | MultiImplementationB.cs:13:60:13:62 | {...} | semmle.label | successor |
-| MultiImplementationB.cs:13:56:13:58 | exit set_Item (normal) | MultiImplementationA.cs:15:54:15:56 | exit set_Item | semmle.label | successor |
-| MultiImplementationB.cs:13:56:13:58 | exit set_Item (normal) | MultiImplementationB.cs:13:56:13:58 | exit set_Item | semmle.label | successor |
-| MultiImplementationB.cs:13:60:13:62 | {...} | MultiImplementationA.cs:15:54:15:56 | exit set_Item (normal) | semmle.label | successor |
-| MultiImplementationB.cs:13:60:13:62 | {...} | MultiImplementationB.cs:13:56:13:58 | exit set_Item (normal) | semmle.label | successor |
-| MultiImplementationB.cs:14:17:14:18 | enter M1 | MultiImplementationA.cs:17:5:19:5 | {...} | semmle.label | successor |
-| MultiImplementationB.cs:14:17:14:18 | enter M1 | MultiImplementationB.cs:15:5:17:5 | {...} | semmle.label | successor |
-| MultiImplementationB.cs:14:17:14:18 | exit M1 (normal) | MultiImplementationA.cs:16:17:16:18 | exit M1 | semmle.label | successor |
-| MultiImplementationB.cs:14:17:14:18 | exit M1 (normal) | MultiImplementationB.cs:14:17:14:18 | exit M1 | semmle.label | successor |
-| MultiImplementationB.cs:15:5:17:5 | {...} | MultiImplementationB.cs:16:9:16:31 | M2(...) | semmle.label | successor |
-| MultiImplementationB.cs:16:9:16:31 | M2(...) | MultiImplementationA.cs:16:17:16:18 | exit M1 (normal) | semmle.label | successor |
-| MultiImplementationB.cs:16:9:16:31 | M2(...) | MultiImplementationB.cs:14:17:14:18 | exit M1 (normal) | semmle.label | successor |
-| MultiImplementationB.cs:16:9:16:31 | enter M2 | MultiImplementationB.cs:16:27:16:30 | null | semmle.label | successor |
-| MultiImplementationB.cs:16:9:16:31 | exit M2 (abnormal) | MultiImplementationB.cs:16:9:16:31 | exit M2 | semmle.label | successor |
-| MultiImplementationB.cs:16:21:16:30 | throw ... | MultiImplementationB.cs:16:9:16:31 | exit M2 (abnormal) | semmle.label | exception(NullReferenceException) |
-| MultiImplementationB.cs:16:27:16:30 | null | MultiImplementationB.cs:16:21:16:30 | throw ... | semmle.label | successor |
-| MultiImplementationB.cs:18:12:18:13 | call to constructor Object | MultiImplementationB.cs:11:16:11:16 | this access | semmle.label | successor |
-| MultiImplementationB.cs:18:12:18:13 | enter C2 | MultiImplementationA.cs:20:12:20:13 | call to constructor Object | semmle.label | successor |
-| MultiImplementationB.cs:18:12:18:13 | enter C2 | MultiImplementationB.cs:18:12:18:13 | call to constructor Object | semmle.label | successor |
-| MultiImplementationB.cs:18:12:18:13 | exit C2 (abnormal) | MultiImplementationA.cs:20:12:20:13 | exit C2 | semmle.label | successor |
-| MultiImplementationB.cs:18:12:18:13 | exit C2 (abnormal) | MultiImplementationB.cs:18:12:18:13 | exit C2 | semmle.label | successor |
-| MultiImplementationB.cs:18:12:18:13 | exit C2 (normal) | MultiImplementationA.cs:20:12:20:13 | exit C2 | semmle.label | successor |
-| MultiImplementationB.cs:18:12:18:13 | exit C2 (normal) | MultiImplementationB.cs:18:12:18:13 | exit C2 | semmle.label | successor |
-| MultiImplementationB.cs:18:22:18:36 | {...} | MultiImplementationB.cs:18:30:18:33 | null | semmle.label | successor |
-| MultiImplementationB.cs:18:24:18:34 | throw ...; | MultiImplementationA.cs:20:12:20:13 | exit C2 (abnormal) | semmle.label | exception(NullReferenceException) |
-| MultiImplementationB.cs:18:24:18:34 | throw ...; | MultiImplementationB.cs:18:12:18:13 | exit C2 (abnormal) | semmle.label | exception(NullReferenceException) |
-| MultiImplementationB.cs:18:30:18:33 | null | MultiImplementationB.cs:18:24:18:34 | throw ...; | semmle.label | successor |
-| MultiImplementationB.cs:19:12:19:13 | enter C2 | MultiImplementationA.cs:21:24:21:24 | 0 | semmle.label | successor |
-| MultiImplementationB.cs:19:12:19:13 | enter C2 | MultiImplementationB.cs:19:24:19:24 | 1 | semmle.label | successor |
-| MultiImplementationB.cs:19:12:19:13 | exit C2 (normal) | MultiImplementationA.cs:21:12:21:13 | exit C2 | semmle.label | successor |
-| MultiImplementationB.cs:19:12:19:13 | exit C2 (normal) | MultiImplementationB.cs:19:12:19:13 | exit C2 | semmle.label | successor |
-| MultiImplementationB.cs:19:19:19:22 | call to constructor C2 | MultiImplementationB.cs:19:27:19:29 | {...} | semmle.label | successor |
-| MultiImplementationB.cs:19:24:19:24 | 1 | MultiImplementationB.cs:19:19:19:22 | call to constructor C2 | semmle.label | successor |
-| MultiImplementationB.cs:19:27:19:29 | {...} | MultiImplementationA.cs:21:12:21:13 | exit C2 (normal) | semmle.label | successor |
-| MultiImplementationB.cs:19:27:19:29 | {...} | MultiImplementationB.cs:19:12:19:13 | exit C2 (normal) | semmle.label | successor |
-| MultiImplementationB.cs:20:6:20:7 | enter ~C2 | MultiImplementationA.cs:22:11:22:13 | {...} | semmle.label | successor |
-| MultiImplementationB.cs:20:6:20:7 | enter ~C2 | MultiImplementationB.cs:20:11:20:25 | {...} | semmle.label | successor |
-| MultiImplementationB.cs:20:6:20:7 | exit ~C2 (abnormal) | MultiImplementationA.cs:22:6:22:7 | exit ~C2 | semmle.label | successor |
-| MultiImplementationB.cs:20:6:20:7 | exit ~C2 (abnormal) | MultiImplementationB.cs:20:6:20:7 | exit ~C2 | semmle.label | successor |
-| MultiImplementationB.cs:20:6:20:7 | exit ~C2 (normal) | MultiImplementationA.cs:22:6:22:7 | exit ~C2 | semmle.label | successor |
-| MultiImplementationB.cs:20:6:20:7 | exit ~C2 (normal) | MultiImplementationB.cs:20:6:20:7 | exit ~C2 | semmle.label | successor |
-| MultiImplementationB.cs:20:11:20:25 | {...} | MultiImplementationB.cs:20:19:20:22 | null | semmle.label | successor |
-| MultiImplementationB.cs:20:13:20:23 | throw ...; | MultiImplementationA.cs:22:6:22:7 | exit ~C2 (abnormal) | semmle.label | exception(NullReferenceException) |
-| MultiImplementationB.cs:20:13:20:23 | throw ...; | MultiImplementationB.cs:20:6:20:7 | exit ~C2 (abnormal) | semmle.label | exception(NullReferenceException) |
-| MultiImplementationB.cs:20:19:20:22 | null | MultiImplementationB.cs:20:13:20:23 | throw ...; | semmle.label | successor |
-| MultiImplementationB.cs:21:28:21:35 | enter implicit conversion | MultiImplementationA.cs:23:50:23:53 | null | semmle.label | successor |
-| MultiImplementationB.cs:21:28:21:35 | enter implicit conversion | MultiImplementationB.cs:21:56:21:59 | null | semmle.label | successor |
-| MultiImplementationB.cs:21:28:21:35 | exit implicit conversion (abnormal) | MultiImplementationA.cs:23:28:23:35 | exit implicit conversion | semmle.label | successor |
-| MultiImplementationB.cs:21:28:21:35 | exit implicit conversion (abnormal) | MultiImplementationB.cs:21:28:21:35 | exit implicit conversion | semmle.label | successor |
-| MultiImplementationB.cs:21:28:21:35 | exit implicit conversion (normal) | MultiImplementationA.cs:23:28:23:35 | exit implicit conversion | semmle.label | successor |
-| MultiImplementationB.cs:21:28:21:35 | exit implicit conversion (normal) | MultiImplementationB.cs:21:28:21:35 | exit implicit conversion | semmle.label | successor |
-| MultiImplementationB.cs:21:50:21:59 | throw ... | MultiImplementationA.cs:23:28:23:35 | exit implicit conversion (abnormal) | semmle.label | exception(NullReferenceException) |
-| MultiImplementationB.cs:21:50:21:59 | throw ... | MultiImplementationB.cs:21:28:21:35 | exit implicit conversion (abnormal) | semmle.label | exception(NullReferenceException) |
-| MultiImplementationB.cs:21:56:21:59 | null | MultiImplementationB.cs:21:50:21:59 | throw ... | semmle.label | successor |
-| MultiImplementationB.cs:22:16:22:16 | access to property P | MultiImplementationB.cs:22:32:22:34 | ... = ... | semmle.label | successor |
-| MultiImplementationB.cs:22:16:22:16 | this access | MultiImplementationB.cs:22:34:22:34 | 1 | semmle.label | successor |
-| MultiImplementationB.cs:22:32:22:34 | ... = ... | MultiImplementationB.cs:18:22:18:36 | {...} | semmle.label | successor |
-| MultiImplementationB.cs:22:34:22:34 | 1 | MultiImplementationB.cs:22:16:22:16 | access to property P | semmle.label | successor |
-| MultiImplementationB.cs:27:21:27:23 | enter get_P3 | MultiImplementationA.cs:30:34:30:37 | null | semmle.label | successor |
-| MultiImplementationB.cs:27:21:27:23 | exit get_P3 (abnormal) | MultiImplementationA.cs:30:21:30:23 | exit get_P3 | semmle.label | successor |
-| MultiImplementationB.cs:27:21:27:23 | exit get_P3 (abnormal) | MultiImplementationB.cs:27:21:27:23 | exit get_P3 | semmle.label | successor |
-| MultiImplementationB.cs:32:9:32:10 | enter M1 | MultiImplementationA.cs:36:14:36:28 | {...} | semmle.label | successor |
-| MultiImplementationB.cs:32:9:32:10 | enter M1 | MultiImplementationB.cs:32:17:32:17 | 0 | semmle.label | successor |
-| MultiImplementationB.cs:32:9:32:10 | exit M1 (abnormal) | MultiImplementationA.cs:36:9:36:10 | exit M1 | semmle.label | successor |
-| MultiImplementationB.cs:32:9:32:10 | exit M1 (abnormal) | MultiImplementationB.cs:32:9:32:10 | exit M1 | semmle.label | successor |
-| MultiImplementationB.cs:32:9:32:10 | exit M1 (normal) | MultiImplementationA.cs:36:9:36:10 | exit M1 | semmle.label | successor |
-| MultiImplementationB.cs:32:9:32:10 | exit M1 (normal) | MultiImplementationB.cs:32:9:32:10 | exit M1 | semmle.label | successor |
-| MultiImplementationB.cs:32:17:32:17 | 0 | MultiImplementationA.cs:36:9:36:10 | exit M1 (normal) | semmle.label | successor |
-| MultiImplementationB.cs:32:17:32:17 | 0 | MultiImplementationB.cs:32:9:32:10 | exit M1 (normal) | semmle.label | successor |
-| NullCoalescing.cs:3:9:3:10 | enter M1 | NullCoalescing.cs:3:23:3:23 | access to parameter i | semmle.label | successor |
-| NullCoalescing.cs:3:9:3:10 | exit M1 (normal) | NullCoalescing.cs:3:9:3:10 | exit M1 | semmle.label | successor |
-| NullCoalescing.cs:3:23:3:23 | access to parameter i | NullCoalescing.cs:3:23:3:28 | ... ?? ... | semmle.label | non-null |
-| NullCoalescing.cs:3:23:3:23 | access to parameter i | NullCoalescing.cs:3:28:3:28 | 0 | semmle.label | null |
-| NullCoalescing.cs:3:23:3:28 | ... ?? ... | NullCoalescing.cs:3:9:3:10 | exit M1 (normal) | semmle.label | successor |
-| NullCoalescing.cs:3:28:3:28 | 0 | NullCoalescing.cs:3:23:3:28 | ... ?? ... | semmle.label | successor |
-| NullCoalescing.cs:5:9:5:10 | enter M2 | NullCoalescing.cs:5:25:5:25 | access to parameter b | semmle.label | successor |
-| NullCoalescing.cs:5:9:5:10 | exit M2 (normal) | NullCoalescing.cs:5:9:5:10 | exit M2 | semmle.label | successor |
-| NullCoalescing.cs:5:24:5:43 | ... ? ... : ... | NullCoalescing.cs:5:9:5:10 | exit M2 (normal) | semmle.label | successor |
-| NullCoalescing.cs:5:25:5:25 | access to parameter b | NullCoalescing.cs:5:25:5:34 | [false] ... ?? ... | semmle.label | false |
-| NullCoalescing.cs:5:25:5:25 | access to parameter b | NullCoalescing.cs:5:25:5:34 | [true] ... ?? ... | semmle.label | true |
-| NullCoalescing.cs:5:25:5:25 | access to parameter b | NullCoalescing.cs:5:30:5:34 | false | semmle.label | null |
-| NullCoalescing.cs:5:25:5:34 | [false] ... ?? ... | NullCoalescing.cs:5:43:5:43 | 1 | semmle.label | false |
-| NullCoalescing.cs:5:25:5:34 | [true] ... ?? ... | NullCoalescing.cs:5:39:5:39 | 0 | semmle.label | true |
-| NullCoalescing.cs:5:30:5:34 | false | NullCoalescing.cs:5:25:5:34 | [false] ... ?? ... | semmle.label | false |
-| NullCoalescing.cs:5:39:5:39 | 0 | NullCoalescing.cs:5:24:5:43 | ... ? ... : ... | semmle.label | successor |
-| NullCoalescing.cs:5:43:5:43 | 1 | NullCoalescing.cs:5:24:5:43 | ... ? ... : ... | semmle.label | successor |
-| NullCoalescing.cs:7:12:7:13 | enter M3 | NullCoalescing.cs:7:40:7:41 | access to parameter s1 | semmle.label | successor |
-| NullCoalescing.cs:7:12:7:13 | exit M3 (normal) | NullCoalescing.cs:7:12:7:13 | exit M3 | semmle.label | successor |
-| NullCoalescing.cs:7:40:7:41 | access to parameter s1 | NullCoalescing.cs:7:40:7:53 | ... ?? ... | semmle.label | non-null |
-| NullCoalescing.cs:7:40:7:41 | access to parameter s1 | NullCoalescing.cs:7:46:7:47 | access to parameter s2 | semmle.label | null |
-| NullCoalescing.cs:7:40:7:53 | ... ?? ... | NullCoalescing.cs:7:12:7:13 | exit M3 (normal) | semmle.label | successor |
-| NullCoalescing.cs:7:46:7:47 | access to parameter s2 | NullCoalescing.cs:7:46:7:53 | ... ?? ... | semmle.label | non-null |
-| NullCoalescing.cs:7:46:7:47 | access to parameter s2 | NullCoalescing.cs:7:52:7:53 | "" | semmle.label | null |
-| NullCoalescing.cs:7:46:7:53 | ... ?? ... | NullCoalescing.cs:7:40:7:53 | ... ?? ... | semmle.label | successor |
-| NullCoalescing.cs:7:52:7:53 | "" | NullCoalescing.cs:7:46:7:53 | ... ?? ... | semmle.label | successor |
-| NullCoalescing.cs:9:12:9:13 | enter M4 | NullCoalescing.cs:9:37:9:37 | access to parameter b | semmle.label | successor |
-| NullCoalescing.cs:9:12:9:13 | exit M4 (normal) | NullCoalescing.cs:9:12:9:13 | exit M4 | semmle.label | successor |
-| NullCoalescing.cs:9:36:9:58 | ... ?? ... | NullCoalescing.cs:9:12:9:13 | exit M4 (normal) | semmle.label | successor |
-| NullCoalescing.cs:9:37:9:37 | access to parameter b | NullCoalescing.cs:9:41:9:41 | access to parameter s | semmle.label | true |
-| NullCoalescing.cs:9:37:9:37 | access to parameter b | NullCoalescing.cs:9:45:9:45 | access to parameter s | semmle.label | false |
-| NullCoalescing.cs:9:37:9:45 | [non-null] ... ? ... : ... | NullCoalescing.cs:9:36:9:58 | ... ?? ... | semmle.label | non-null |
-| NullCoalescing.cs:9:37:9:45 | [null] ... ? ... : ... | NullCoalescing.cs:9:51:9:52 | "" | semmle.label | null |
-| NullCoalescing.cs:9:41:9:41 | access to parameter s | NullCoalescing.cs:9:37:9:45 | [non-null] ... ? ... : ... | semmle.label | non-null |
-| NullCoalescing.cs:9:41:9:41 | access to parameter s | NullCoalescing.cs:9:37:9:45 | [null] ... ? ... : ... | semmle.label | null |
-| NullCoalescing.cs:9:45:9:45 | access to parameter s | NullCoalescing.cs:9:37:9:45 | [non-null] ... ? ... : ... | semmle.label | non-null |
-| NullCoalescing.cs:9:45:9:45 | access to parameter s | NullCoalescing.cs:9:37:9:45 | [null] ... ? ... : ... | semmle.label | null |
-| NullCoalescing.cs:9:51:9:52 | "" | NullCoalescing.cs:9:51:9:58 | ... ?? ... | semmle.label | non-null |
-| NullCoalescing.cs:9:51:9:58 | ... ?? ... | NullCoalescing.cs:9:36:9:58 | ... ?? ... | semmle.label | successor |
-| NullCoalescing.cs:11:9:11:10 | enter M5 | NullCoalescing.cs:11:44:11:45 | access to parameter b1 | semmle.label | successor |
-| NullCoalescing.cs:11:9:11:10 | exit M5 (normal) | NullCoalescing.cs:11:9:11:10 | exit M5 | semmle.label | successor |
-| NullCoalescing.cs:11:43:11:68 | ... ? ... : ... | NullCoalescing.cs:11:9:11:10 | exit M5 (normal) | semmle.label | successor |
-| NullCoalescing.cs:11:44:11:45 | access to parameter b1 | NullCoalescing.cs:11:44:11:59 | [false] ... ?? ... | semmle.label | false |
-| NullCoalescing.cs:11:44:11:45 | access to parameter b1 | NullCoalescing.cs:11:44:11:59 | [true] ... ?? ... | semmle.label | true |
-| NullCoalescing.cs:11:44:11:45 | access to parameter b1 | NullCoalescing.cs:11:51:11:52 | access to parameter b2 | semmle.label | null |
-| NullCoalescing.cs:11:44:11:59 | [false] ... ?? ... | NullCoalescing.cs:11:68:11:68 | 1 | semmle.label | false |
-| NullCoalescing.cs:11:44:11:59 | [true] ... ?? ... | NullCoalescing.cs:11:64:11:64 | 0 | semmle.label | true |
-| NullCoalescing.cs:11:51:11:52 | access to parameter b2 | NullCoalescing.cs:11:51:11:58 | [false] ... && ... | semmle.label | false |
-| NullCoalescing.cs:11:51:11:52 | access to parameter b2 | NullCoalescing.cs:11:57:11:58 | access to parameter b3 | semmle.label | true |
-| NullCoalescing.cs:11:51:11:58 | [false] ... && ... | NullCoalescing.cs:11:44:11:59 | [false] ... ?? ... | semmle.label | false |
-| NullCoalescing.cs:11:51:11:58 | [true] ... && ... | NullCoalescing.cs:11:44:11:59 | [true] ... ?? ... | semmle.label | true |
-| NullCoalescing.cs:11:57:11:58 | access to parameter b3 | NullCoalescing.cs:11:51:11:58 | [false] ... && ... | semmle.label | false |
-| NullCoalescing.cs:11:57:11:58 | access to parameter b3 | NullCoalescing.cs:11:51:11:58 | [true] ... && ... | semmle.label | true |
-| NullCoalescing.cs:11:64:11:64 | 0 | NullCoalescing.cs:11:43:11:68 | ... ? ... : ... | semmle.label | successor |
-| NullCoalescing.cs:11:68:11:68 | 1 | NullCoalescing.cs:11:43:11:68 | ... ? ... : ... | semmle.label | successor |
-| NullCoalescing.cs:13:10:13:11 | enter M6 | NullCoalescing.cs:14:5:18:5 | {...} | semmle.label | successor |
-| NullCoalescing.cs:13:10:13:11 | exit M6 (normal) | NullCoalescing.cs:13:10:13:11 | exit M6 | semmle.label | successor |
-| NullCoalescing.cs:14:5:18:5 | {...} | NullCoalescing.cs:15:9:15:32 | ... ...; | semmle.label | successor |
-| NullCoalescing.cs:15:9:15:32 | ... ...; | NullCoalescing.cs:15:23:15:26 | null | semmle.label | successor |
-| NullCoalescing.cs:15:13:15:31 | Int32 j = ... | NullCoalescing.cs:16:9:16:26 | ... ...; | semmle.label | successor |
-| NullCoalescing.cs:15:17:15:26 | (...) ... | NullCoalescing.cs:15:31:15:31 | 0 | semmle.label | null |
-| NullCoalescing.cs:15:17:15:31 | ... ?? ... | NullCoalescing.cs:15:13:15:31 | Int32 j = ... | semmle.label | successor |
-| NullCoalescing.cs:15:23:15:26 | null | NullCoalescing.cs:15:17:15:26 | (...) ... | semmle.label | successor |
-| NullCoalescing.cs:15:31:15:31 | 0 | NullCoalescing.cs:15:17:15:31 | ... ?? ... | semmle.label | successor |
-| NullCoalescing.cs:16:9:16:26 | ... ...; | NullCoalescing.cs:16:17:16:18 | "" | semmle.label | successor |
-| NullCoalescing.cs:16:13:16:25 | String s = ... | NullCoalescing.cs:17:9:17:25 | ...; | semmle.label | successor |
-| NullCoalescing.cs:16:17:16:18 | "" | NullCoalescing.cs:16:17:16:25 | ... ?? ... | semmle.label | non-null |
-| NullCoalescing.cs:16:17:16:25 | ... ?? ... | NullCoalescing.cs:16:13:16:25 | String s = ... | semmle.label | successor |
-| NullCoalescing.cs:17:9:17:24 | ... = ... | NullCoalescing.cs:13:10:13:11 | exit M6 (normal) | semmle.label | successor |
-| NullCoalescing.cs:17:9:17:25 | ...; | NullCoalescing.cs:17:19:17:19 | access to parameter i | semmle.label | successor |
-| NullCoalescing.cs:17:13:17:19 | (...) ... | NullCoalescing.cs:17:13:17:24 | ... ?? ... | semmle.label | non-null |
-| NullCoalescing.cs:17:13:17:24 | ... ?? ... | NullCoalescing.cs:17:9:17:24 | ... = ... | semmle.label | successor |
-| NullCoalescing.cs:17:19:17:19 | access to parameter i | NullCoalescing.cs:17:13:17:19 | (...) ... | semmle.label | successor |
-| PartialImplementationA.cs:3:12:3:18 | call to constructor Object | PartialImplementationB.cs:3:16:3:16 | this access | semmle.label | successor |
-| PartialImplementationA.cs:3:12:3:18 | enter Partial | PartialImplementationA.cs:3:12:3:18 | call to constructor Object | semmle.label | successor |
-| PartialImplementationA.cs:3:12:3:18 | exit Partial (normal) | PartialImplementationA.cs:3:12:3:18 | exit Partial | semmle.label | successor |
-| PartialImplementationA.cs:3:27:3:29 | {...} | PartialImplementationA.cs:3:12:3:18 | exit Partial (normal) | semmle.label | successor |
-| PartialImplementationB.cs:3:16:3:16 | this access | PartialImplementationB.cs:3:20:3:20 | 0 | semmle.label | successor |
-| PartialImplementationB.cs:3:16:3:16 | this access | PartialImplementationB.cs:3:20:3:20 | 0 | semmle.label | successor |
-| PartialImplementationB.cs:3:16:3:20 | ... = ... | PartialImplementationB.cs:5:16:5:16 | this access | semmle.label | successor |
-| PartialImplementationB.cs:3:16:3:20 | ... = ... | PartialImplementationB.cs:5:16:5:16 | this access | semmle.label | successor |
-| PartialImplementationB.cs:3:20:3:20 | 0 | PartialImplementationB.cs:3:16:3:20 | ... = ... | semmle.label | successor |
-| PartialImplementationB.cs:3:20:3:20 | 0 | PartialImplementationB.cs:3:16:3:20 | ... = ... | semmle.label | successor |
-| PartialImplementationB.cs:4:12:4:18 | call to constructor Object | PartialImplementationB.cs:3:16:3:16 | this access | semmle.label | successor |
-| PartialImplementationB.cs:4:12:4:18 | enter Partial | PartialImplementationB.cs:4:12:4:18 | call to constructor Object | semmle.label | successor |
-| PartialImplementationB.cs:4:12:4:18 | exit Partial (normal) | PartialImplementationB.cs:4:12:4:18 | exit Partial | semmle.label | successor |
-| PartialImplementationB.cs:4:22:4:24 | {...} | PartialImplementationB.cs:4:12:4:18 | exit Partial (normal) | semmle.label | successor |
-| PartialImplementationB.cs:5:16:5:16 | access to property P | PartialImplementationB.cs:5:32:5:34 | ... = ... | semmle.label | successor |
-| PartialImplementationB.cs:5:16:5:16 | access to property P | PartialImplementationB.cs:5:32:5:34 | ... = ... | semmle.label | successor |
-| PartialImplementationB.cs:5:16:5:16 | this access | PartialImplementationB.cs:5:34:5:34 | 0 | semmle.label | successor |
-| PartialImplementationB.cs:5:16:5:16 | this access | PartialImplementationB.cs:5:34:5:34 | 0 | semmle.label | successor |
-| PartialImplementationB.cs:5:32:5:34 | ... = ... | PartialImplementationA.cs:3:27:3:29 | {...} | semmle.label | successor |
-| PartialImplementationB.cs:5:32:5:34 | ... = ... | PartialImplementationB.cs:4:22:4:24 | {...} | semmle.label | successor |
-| PartialImplementationB.cs:5:34:5:34 | 0 | PartialImplementationB.cs:5:16:5:16 | access to property P | semmle.label | successor |
-| PartialImplementationB.cs:5:34:5:34 | 0 | PartialImplementationB.cs:5:16:5:16 | access to property P | semmle.label | successor |
-| Patterns.cs:5:10:5:11 | enter M1 | Patterns.cs:6:5:43:5 | {...} | semmle.label | successor |
-| Patterns.cs:5:10:5:11 | exit M1 (normal) | Patterns.cs:5:10:5:11 | exit M1 | semmle.label | successor |
-| Patterns.cs:6:5:43:5 | {...} | Patterns.cs:7:9:7:24 | ... ...; | semmle.label | successor |
-| Patterns.cs:7:9:7:24 | ... ...; | Patterns.cs:7:20:7:23 | null | semmle.label | successor |
-| Patterns.cs:7:16:7:23 | Object o = ... | Patterns.cs:8:9:18:9 | if (...) ... | semmle.label | successor |
-| Patterns.cs:7:20:7:23 | null | Patterns.cs:7:16:7:23 | Object o = ... | semmle.label | successor |
-| Patterns.cs:8:9:18:9 | if (...) ... | Patterns.cs:8:13:8:13 | access to local variable o | semmle.label | successor |
-| Patterns.cs:8:13:8:13 | access to local variable o | Patterns.cs:8:18:8:23 | Int32 i1 | semmle.label | successor |
-| Patterns.cs:8:13:8:23 | [false] ... is ... | Patterns.cs:12:14:18:9 | if (...) ... | semmle.label | false |
-| Patterns.cs:8:13:8:23 | [true] ... is ... | Patterns.cs:9:9:11:9 | {...} | semmle.label | true |
-| Patterns.cs:8:18:8:23 | Int32 i1 | Patterns.cs:8:13:8:23 | [false] ... is ... | semmle.label | no-match |
-| Patterns.cs:8:18:8:23 | Int32 i1 | Patterns.cs:8:13:8:23 | [true] ... is ... | semmle.label | match |
-| Patterns.cs:9:9:11:9 | {...} | Patterns.cs:10:13:10:43 | ...; | semmle.label | successor |
-| Patterns.cs:10:13:10:42 | call to method WriteLine | Patterns.cs:20:9:38:9 | switch (...) {...} | semmle.label | successor |
-| Patterns.cs:10:13:10:43 | ...; | Patterns.cs:10:33:10:36 | "int " | semmle.label | successor |
-| Patterns.cs:10:31:10:41 | $"..." | Patterns.cs:10:13:10:42 | call to method WriteLine | semmle.label | successor |
-| Patterns.cs:10:33:10:36 | "int " | Patterns.cs:10:38:10:39 | access to local variable i1 | semmle.label | successor |
-| Patterns.cs:10:38:10:39 | access to local variable i1 | Patterns.cs:10:31:10:41 | $"..." | semmle.label | successor |
-| Patterns.cs:12:14:18:9 | if (...) ... | Patterns.cs:12:18:12:18 | access to local variable o | semmle.label | successor |
-| Patterns.cs:12:18:12:18 | access to local variable o | Patterns.cs:12:23:12:31 | String s1 | semmle.label | successor |
-| Patterns.cs:12:18:12:31 | [false] ... is ... | Patterns.cs:16:14:18:9 | if (...) ... | semmle.label | false |
-| Patterns.cs:12:18:12:31 | [true] ... is ... | Patterns.cs:13:9:15:9 | {...} | semmle.label | true |
-| Patterns.cs:12:23:12:31 | String s1 | Patterns.cs:12:18:12:31 | [false] ... is ... | semmle.label | no-match |
-| Patterns.cs:12:23:12:31 | String s1 | Patterns.cs:12:18:12:31 | [true] ... is ... | semmle.label | match |
-| Patterns.cs:13:9:15:9 | {...} | Patterns.cs:14:13:14:46 | ...; | semmle.label | successor |
-| Patterns.cs:14:13:14:45 | call to method WriteLine | Patterns.cs:20:9:38:9 | switch (...) {...} | semmle.label | successor |
-| Patterns.cs:14:13:14:46 | ...; | Patterns.cs:14:33:14:39 | "string " | semmle.label | successor |
-| Patterns.cs:14:31:14:44 | $"..." | Patterns.cs:14:13:14:45 | call to method WriteLine | semmle.label | successor |
-| Patterns.cs:14:33:14:39 | "string " | Patterns.cs:14:41:14:42 | access to local variable s1 | semmle.label | successor |
-| Patterns.cs:14:41:14:42 | access to local variable s1 | Patterns.cs:14:31:14:44 | $"..." | semmle.label | successor |
-| Patterns.cs:16:14:18:9 | if (...) ... | Patterns.cs:16:18:16:18 | access to local variable o | semmle.label | successor |
-| Patterns.cs:16:18:16:18 | access to local variable o | Patterns.cs:16:23:16:28 | Object v1 | semmle.label | successor |
-| Patterns.cs:16:18:16:28 | [false] ... is ... | Patterns.cs:20:9:38:9 | switch (...) {...} | semmle.label | false |
-| Patterns.cs:16:18:16:28 | [true] ... is ... | Patterns.cs:17:9:18:9 | {...} | semmle.label | true |
-| Patterns.cs:16:23:16:28 | Object v1 | Patterns.cs:16:18:16:28 | [false] ... is ... | semmle.label | no-match |
-| Patterns.cs:16:23:16:28 | Object v1 | Patterns.cs:16:18:16:28 | [true] ... is ... | semmle.label | match |
-| Patterns.cs:17:9:18:9 | {...} | Patterns.cs:20:9:38:9 | switch (...) {...} | semmle.label | successor |
-| Patterns.cs:20:9:38:9 | switch (...) {...} | Patterns.cs:20:17:20:17 | access to local variable o | semmle.label | successor |
-| Patterns.cs:20:17:20:17 | access to local variable o | Patterns.cs:22:13:22:23 | case ...: | semmle.label | successor |
-| Patterns.cs:22:13:22:23 | case ...: | Patterns.cs:22:18:22:22 | "xyz" | semmle.label | successor |
-| Patterns.cs:22:18:22:22 | "xyz" | Patterns.cs:23:17:23:22 | break; | semmle.label | match |
-| Patterns.cs:22:18:22:22 | "xyz" | Patterns.cs:24:13:24:36 | case ...: | semmle.label | no-match |
-| Patterns.cs:23:17:23:22 | break; | Patterns.cs:40:9:42:9 | switch (...) {...} | semmle.label | break |
-| Patterns.cs:24:13:24:36 | case ...: | Patterns.cs:24:18:24:23 | Int32 i2 | semmle.label | successor |
-| Patterns.cs:24:18:24:23 | Int32 i2 | Patterns.cs:24:30:24:31 | access to local variable i2 | semmle.label | match |
-| Patterns.cs:24:18:24:23 | Int32 i2 | Patterns.cs:27:13:27:24 | case ...: | semmle.label | no-match |
-| Patterns.cs:24:30:24:31 | access to local variable i2 | Patterns.cs:24:35:24:35 | 0 | semmle.label | successor |
-| Patterns.cs:24:30:24:35 | ... > ... | Patterns.cs:25:17:25:52 | ...; | semmle.label | true |
-| Patterns.cs:24:30:24:35 | ... > ... | Patterns.cs:27:13:27:24 | case ...: | semmle.label | false |
-| Patterns.cs:24:35:24:35 | 0 | Patterns.cs:24:30:24:35 | ... > ... | semmle.label | successor |
-| Patterns.cs:25:17:25:51 | call to method WriteLine | Patterns.cs:26:17:26:22 | break; | semmle.label | successor |
-| Patterns.cs:25:17:25:52 | ...; | Patterns.cs:25:37:25:45 | "positive " | semmle.label | successor |
-| Patterns.cs:25:35:25:50 | $"..." | Patterns.cs:25:17:25:51 | call to method WriteLine | semmle.label | successor |
-| Patterns.cs:25:37:25:45 | "positive " | Patterns.cs:25:47:25:48 | access to local variable i2 | semmle.label | successor |
-| Patterns.cs:25:47:25:48 | access to local variable i2 | Patterns.cs:25:35:25:50 | $"..." | semmle.label | successor |
-| Patterns.cs:26:17:26:22 | break; | Patterns.cs:40:9:42:9 | switch (...) {...} | semmle.label | break |
-| Patterns.cs:27:13:27:24 | case ...: | Patterns.cs:27:18:27:23 | Int32 i3 | semmle.label | successor |
-| Patterns.cs:27:18:27:23 | Int32 i3 | Patterns.cs:28:17:28:47 | ...; | semmle.label | match |
-| Patterns.cs:27:18:27:23 | Int32 i3 | Patterns.cs:30:13:30:27 | case ...: | semmle.label | no-match |
-| Patterns.cs:28:17:28:46 | call to method WriteLine | Patterns.cs:29:17:29:22 | break; | semmle.label | successor |
-| Patterns.cs:28:17:28:47 | ...; | Patterns.cs:28:37:28:40 | "int " | semmle.label | successor |
-| Patterns.cs:28:35:28:45 | $"..." | Patterns.cs:28:17:28:46 | call to method WriteLine | semmle.label | successor |
-| Patterns.cs:28:37:28:40 | "int " | Patterns.cs:28:42:28:43 | access to local variable i3 | semmle.label | successor |
-| Patterns.cs:28:42:28:43 | access to local variable i3 | Patterns.cs:28:35:28:45 | $"..." | semmle.label | successor |
-| Patterns.cs:29:17:29:22 | break; | Patterns.cs:40:9:42:9 | switch (...) {...} | semmle.label | break |
-| Patterns.cs:30:13:30:27 | case ...: | Patterns.cs:30:18:30:26 | String s2 | semmle.label | successor |
-| Patterns.cs:30:18:30:26 | String s2 | Patterns.cs:31:17:31:50 | ...; | semmle.label | match |
-| Patterns.cs:30:18:30:26 | String s2 | Patterns.cs:33:13:33:24 | case ...: | semmle.label | no-match |
-| Patterns.cs:31:17:31:49 | call to method WriteLine | Patterns.cs:32:17:32:22 | break; | semmle.label | successor |
-| Patterns.cs:31:17:31:50 | ...; | Patterns.cs:31:37:31:43 | "string " | semmle.label | successor |
-| Patterns.cs:31:35:31:48 | $"..." | Patterns.cs:31:17:31:49 | call to method WriteLine | semmle.label | successor |
-| Patterns.cs:31:37:31:43 | "string " | Patterns.cs:31:45:31:46 | access to local variable s2 | semmle.label | successor |
-| Patterns.cs:31:45:31:46 | access to local variable s2 | Patterns.cs:31:35:31:48 | $"..." | semmle.label | successor |
-| Patterns.cs:32:17:32:22 | break; | Patterns.cs:40:9:42:9 | switch (...) {...} | semmle.label | break |
-| Patterns.cs:33:13:33:24 | case ...: | Patterns.cs:33:18:33:23 | Object v2 | semmle.label | successor |
-| Patterns.cs:33:18:33:23 | Object v2 | Patterns.cs:34:17:34:22 | break; | semmle.label | match |
-| Patterns.cs:33:18:33:23 | Object v2 | Patterns.cs:35:13:35:20 | default: | semmle.label | no-match |
-| Patterns.cs:34:17:34:22 | break; | Patterns.cs:40:9:42:9 | switch (...) {...} | semmle.label | break |
-| Patterns.cs:35:13:35:20 | default: | Patterns.cs:36:17:36:52 | ...; | semmle.label | successor |
-| Patterns.cs:36:17:36:51 | call to method WriteLine | Patterns.cs:37:17:37:22 | break; | semmle.label | successor |
-| Patterns.cs:36:17:36:52 | ...; | Patterns.cs:36:35:36:50 | "Something else" | semmle.label | successor |
-| Patterns.cs:36:35:36:50 | "Something else" | Patterns.cs:36:17:36:51 | call to method WriteLine | semmle.label | successor |
-| Patterns.cs:37:17:37:22 | break; | Patterns.cs:40:9:42:9 | switch (...) {...} | semmle.label | break |
-| Patterns.cs:40:9:42:9 | switch (...) {...} | Patterns.cs:40:17:40:17 | access to local variable o | semmle.label | successor |
-| Patterns.cs:40:17:40:17 | access to local variable o | Patterns.cs:5:10:5:11 | exit M1 (normal) | semmle.label | successor |
-| Patterns.cs:47:24:47:25 | enter M2 | Patterns.cs:48:9:48:9 | access to parameter c | semmle.label | successor |
-| Patterns.cs:47:24:47:25 | exit M2 (normal) | Patterns.cs:47:24:47:25 | exit M2 | semmle.label | successor |
-| Patterns.cs:48:9:48:9 | access to parameter c | Patterns.cs:48:18:48:20 | a | semmle.label | successor |
-| Patterns.cs:48:9:48:20 | ... is ... | Patterns.cs:47:24:47:25 | exit M2 (normal) | semmle.label | successor |
-| Patterns.cs:48:14:48:20 | not ... | Patterns.cs:48:9:48:20 | ... is ... | semmle.label | successor |
-| Patterns.cs:48:18:48:20 | a | Patterns.cs:48:14:48:20 | not ... | semmle.label | successor |
-| Patterns.cs:50:24:50:25 | enter M3 | Patterns.cs:51:9:51:9 | access to parameter c | semmle.label | successor |
-| Patterns.cs:50:24:50:25 | exit M3 (normal) | Patterns.cs:50:24:50:25 | exit M3 | semmle.label | successor |
-| Patterns.cs:51:9:51:9 | access to parameter c | Patterns.cs:51:18:51:21 | null | semmle.label | successor |
-| Patterns.cs:51:9:51:21 | [false] ... is ... | Patterns.cs:51:34:51:34 | access to parameter c | semmle.label | false |
-| Patterns.cs:51:9:51:21 | [true] ... is ... | Patterns.cs:51:25:51:25 | access to parameter c | semmle.label | true |
-| Patterns.cs:51:9:51:39 | ... ? ... : ... | Patterns.cs:50:24:50:25 | exit M3 (normal) | semmle.label | successor |
-| Patterns.cs:51:14:51:21 | [match] not ... | Patterns.cs:51:9:51:21 | [true] ... is ... | semmle.label | match |
-| Patterns.cs:51:14:51:21 | [no-match] not ... | Patterns.cs:51:9:51:21 | [false] ... is ... | semmle.label | no-match |
-| Patterns.cs:51:18:51:21 | null | Patterns.cs:51:14:51:21 | [match] not ... | semmle.label | no-match |
-| Patterns.cs:51:18:51:21 | null | Patterns.cs:51:14:51:21 | [no-match] not ... | semmle.label | match |
-| Patterns.cs:51:25:51:25 | access to parameter c | Patterns.cs:51:30:51:30 | 1 | semmle.label | successor |
-| Patterns.cs:51:25:51:30 | ... is ... | Patterns.cs:51:9:51:39 | ... ? ... : ... | semmle.label | successor |
-| Patterns.cs:51:30:51:30 | 1 | Patterns.cs:51:25:51:30 | ... is ... | semmle.label | successor |
-| Patterns.cs:51:34:51:34 | access to parameter c | Patterns.cs:51:39:51:39 | 2 | semmle.label | successor |
-| Patterns.cs:51:34:51:39 | ... is ... | Patterns.cs:51:9:51:39 | ... ? ... : ... | semmle.label | successor |
-| Patterns.cs:51:39:51:39 | 2 | Patterns.cs:51:34:51:39 | ... is ... | semmle.label | successor |
-| Patterns.cs:53:24:53:25 | enter M4 | Patterns.cs:54:9:54:9 | access to parameter c | semmle.label | successor |
-| Patterns.cs:53:24:53:25 | exit M4 (normal) | Patterns.cs:53:24:53:25 | exit M4 | semmle.label | successor |
-| Patterns.cs:54:9:54:9 | access to parameter c | Patterns.cs:54:18:54:37 | Patterns u | semmle.label | successor |
-| Patterns.cs:54:9:54:37 | ... is ... | Patterns.cs:53:24:53:25 | exit M4 (normal) | semmle.label | successor |
-| Patterns.cs:54:14:54:37 | not ... | Patterns.cs:54:9:54:37 | ... is ... | semmle.label | successor |
-| Patterns.cs:54:18:54:37 | Patterns u | Patterns.cs:54:18:54:37 | { ... } | semmle.label | no-match |
-| Patterns.cs:54:18:54:37 | Patterns u | Patterns.cs:54:33:54:33 | 1 | semmle.label | match |
-| Patterns.cs:54:18:54:37 | { ... } | Patterns.cs:54:14:54:37 | not ... | semmle.label | successor |
-| Patterns.cs:54:27:54:35 | [match] { ... } | Patterns.cs:54:18:54:37 | { ... } | semmle.label | match |
-| Patterns.cs:54:27:54:35 | [no-match] { ... } | Patterns.cs:54:18:54:37 | { ... } | semmle.label | no-match |
-| Patterns.cs:54:33:54:33 | 1 | Patterns.cs:54:27:54:35 | [match] { ... } | semmle.label | match |
-| Patterns.cs:54:33:54:33 | 1 | Patterns.cs:54:27:54:35 | [no-match] { ... } | semmle.label | no-match |
-| Patterns.cs:56:26:56:27 | enter M5 | Patterns.cs:57:5:63:5 | {...} | semmle.label | successor |
-| Patterns.cs:56:26:56:27 | exit M5 (normal) | Patterns.cs:56:26:56:27 | exit M5 | semmle.label | successor |
-| Patterns.cs:57:5:63:5 | {...} | Patterns.cs:58:16:58:16 | access to parameter i | semmle.label | successor |
-| Patterns.cs:58:9:62:10 | return ...; | Patterns.cs:56:26:56:27 | exit M5 (normal) | semmle.label | return |
-| Patterns.cs:58:16:58:16 | access to parameter i | Patterns.cs:60:17:60:17 | 1 | semmle.label | successor |
-| Patterns.cs:58:16:62:9 | ... switch { ... } | Patterns.cs:58:9:62:10 | return ...; | semmle.label | successor |
-| Patterns.cs:60:13:60:17 | [match] not ... | Patterns.cs:60:22:60:28 | "not 1" | semmle.label | match |
-| Patterns.cs:60:13:60:17 | [no-match] not ... | Patterns.cs:61:13:61:13 | _ | semmle.label | no-match |
-| Patterns.cs:60:13:60:28 | ... => ... | Patterns.cs:58:16:62:9 | ... switch { ... } | semmle.label | successor |
-| Patterns.cs:60:17:60:17 | 1 | Patterns.cs:60:13:60:17 | [match] not ... | semmle.label | no-match |
-| Patterns.cs:60:17:60:17 | 1 | Patterns.cs:60:13:60:17 | [no-match] not ... | semmle.label | match |
-| Patterns.cs:60:22:60:28 | "not 1" | Patterns.cs:60:13:60:28 | ... => ... | semmle.label | successor |
-| Patterns.cs:61:13:61:13 | _ | Patterns.cs:61:18:61:24 | "other" | semmle.label | match |
-| Patterns.cs:61:13:61:24 | ... => ... | Patterns.cs:58:16:62:9 | ... switch { ... } | semmle.label | successor |
-| Patterns.cs:61:18:61:24 | "other" | Patterns.cs:61:13:61:24 | ... => ... | semmle.label | successor |
-| Patterns.cs:65:26:65:27 | enter M6 | Patterns.cs:66:5:72:5 | {...} | semmle.label | successor |
-| Patterns.cs:65:26:65:27 | exit M6 (normal) | Patterns.cs:65:26:65:27 | exit M6 | semmle.label | successor |
-| Patterns.cs:66:5:72:5 | {...} | Patterns.cs:67:16:67:16 | 2 | semmle.label | successor |
-| Patterns.cs:67:9:71:10 | return ...; | Patterns.cs:65:26:65:27 | exit M6 (normal) | semmle.label | return |
-| Patterns.cs:67:16:67:16 | 2 | Patterns.cs:69:17:69:17 | 2 | semmle.label | successor |
-| Patterns.cs:67:16:71:9 | ... switch { ... } | Patterns.cs:67:9:71:10 | return ...; | semmle.label | successor |
-| Patterns.cs:69:13:69:17 | [no-match] not ... | Patterns.cs:70:13:70:13 | 2 | semmle.label | no-match |
-| Patterns.cs:69:17:69:17 | 2 | Patterns.cs:69:13:69:17 | [no-match] not ... | semmle.label | match |
-| Patterns.cs:70:13:70:13 | 2 | Patterns.cs:70:18:70:27 | "possible" | semmle.label | match |
-| Patterns.cs:70:13:70:27 | ... => ... | Patterns.cs:67:16:71:9 | ... switch { ... } | semmle.label | successor |
-| Patterns.cs:70:18:70:27 | "possible" | Patterns.cs:70:13:70:27 | ... => ... | semmle.label | successor |
-| Patterns.cs:74:26:74:27 | enter M7 | Patterns.cs:75:5:83:5 | {...} | semmle.label | successor |
-| Patterns.cs:74:26:74:27 | exit M7 (normal) | Patterns.cs:74:26:74:27 | exit M7 | semmle.label | successor |
-| Patterns.cs:75:5:83:5 | {...} | Patterns.cs:76:16:76:16 | access to parameter i | semmle.label | successor |
-| Patterns.cs:76:9:82:10 | return ...; | Patterns.cs:74:26:74:27 | exit M7 (normal) | semmle.label | return |
-| Patterns.cs:76:16:76:16 | access to parameter i | Patterns.cs:78:15:78:15 | 1 | semmle.label | successor |
-| Patterns.cs:76:16:82:9 | ... switch { ... } | Patterns.cs:76:9:82:10 | return ...; | semmle.label | successor |
-| Patterns.cs:78:13:78:15 | > ... | Patterns.cs:78:20:78:24 | "> 1" | semmle.label | match |
-| Patterns.cs:78:13:78:15 | > ... | Patterns.cs:79:15:79:15 | 0 | semmle.label | no-match |
-| Patterns.cs:78:13:78:24 | ... => ... | Patterns.cs:76:16:82:9 | ... switch { ... } | semmle.label | successor |
-| Patterns.cs:78:15:78:15 | 1 | Patterns.cs:78:13:78:15 | > ... | semmle.label | successor |
-| Patterns.cs:78:20:78:24 | "> 1" | Patterns.cs:78:13:78:24 | ... => ... | semmle.label | successor |
-| Patterns.cs:79:13:79:15 | < ... | Patterns.cs:79:20:79:24 | "< 0" | semmle.label | match |
-| Patterns.cs:79:13:79:15 | < ... | Patterns.cs:80:13:80:13 | 1 | semmle.label | no-match |
-| Patterns.cs:79:13:79:24 | ... => ... | Patterns.cs:76:16:82:9 | ... switch { ... } | semmle.label | successor |
-| Patterns.cs:79:15:79:15 | 0 | Patterns.cs:79:13:79:15 | < ... | semmle.label | successor |
-| Patterns.cs:79:20:79:24 | "< 0" | Patterns.cs:79:13:79:24 | ... => ... | semmle.label | successor |
-| Patterns.cs:80:13:80:13 | 1 | Patterns.cs:80:18:80:20 | "1" | semmle.label | match |
-| Patterns.cs:80:13:80:13 | 1 | Patterns.cs:81:13:81:13 | _ | semmle.label | no-match |
-| Patterns.cs:80:13:80:20 | ... => ... | Patterns.cs:76:16:82:9 | ... switch { ... } | semmle.label | successor |
-| Patterns.cs:80:18:80:20 | "1" | Patterns.cs:80:13:80:20 | ... => ... | semmle.label | successor |
-| Patterns.cs:81:13:81:13 | _ | Patterns.cs:81:18:81:20 | "0" | semmle.label | match |
-| Patterns.cs:81:13:81:20 | ... => ... | Patterns.cs:76:16:82:9 | ... switch { ... } | semmle.label | successor |
-| Patterns.cs:81:18:81:20 | "0" | Patterns.cs:81:13:81:20 | ... => ... | semmle.label | successor |
-| Patterns.cs:85:26:85:27 | enter M8 | Patterns.cs:85:39:85:39 | access to parameter i | semmle.label | successor |
-| Patterns.cs:85:26:85:27 | exit M8 (normal) | Patterns.cs:85:26:85:27 | exit M8 | semmle.label | successor |
-| Patterns.cs:85:39:85:39 | access to parameter i | Patterns.cs:85:44:85:44 | 1 | semmle.label | successor |
-| Patterns.cs:85:39:85:53 | [false] ... is ... | Patterns.cs:85:67:85:69 | "2" | semmle.label | false |
-| Patterns.cs:85:39:85:53 | [true] ... is ... | Patterns.cs:85:57:85:63 | "not 2" | semmle.label | true |
-| Patterns.cs:85:39:85:69 | ... ? ... : ... | Patterns.cs:85:26:85:27 | exit M8 (normal) | semmle.label | successor |
-| Patterns.cs:85:44:85:44 | 1 | Patterns.cs:85:44:85:53 | [match] ... or ... | semmle.label | match |
-| Patterns.cs:85:44:85:44 | 1 | Patterns.cs:85:53:85:53 | 2 | semmle.label | no-match |
-| Patterns.cs:85:44:85:53 | [match] ... or ... | Patterns.cs:85:39:85:53 | [true] ... is ... | semmle.label | match |
-| Patterns.cs:85:44:85:53 | [no-match] ... or ... | Patterns.cs:85:39:85:53 | [false] ... is ... | semmle.label | no-match |
-| Patterns.cs:85:49:85:53 | [match] not ... | Patterns.cs:85:44:85:53 | [match] ... or ... | semmle.label | match |
-| Patterns.cs:85:49:85:53 | [no-match] not ... | Patterns.cs:85:44:85:53 | [no-match] ... or ... | semmle.label | no-match |
-| Patterns.cs:85:53:85:53 | 2 | Patterns.cs:85:49:85:53 | [match] not ... | semmle.label | no-match |
-| Patterns.cs:85:53:85:53 | 2 | Patterns.cs:85:49:85:53 | [no-match] not ... | semmle.label | match |
-| Patterns.cs:85:57:85:63 | "not 2" | Patterns.cs:85:39:85:69 | ... ? ... : ... | semmle.label | successor |
-| Patterns.cs:85:67:85:69 | "2" | Patterns.cs:85:39:85:69 | ... ? ... : ... | semmle.label | successor |
-| Patterns.cs:87:26:87:27 | enter M9 | Patterns.cs:87:39:87:39 | access to parameter i | semmle.label | successor |
-| Patterns.cs:87:26:87:27 | exit M9 (normal) | Patterns.cs:87:26:87:27 | exit M9 | semmle.label | successor |
-| Patterns.cs:87:39:87:39 | access to parameter i | Patterns.cs:87:44:87:44 | 1 | semmle.label | successor |
-| Patterns.cs:87:39:87:54 | [false] ... is ... | Patterns.cs:87:64:87:70 | "not 1" | semmle.label | false |
-| Patterns.cs:87:39:87:54 | [true] ... is ... | Patterns.cs:87:58:87:60 | "1" | semmle.label | true |
-| Patterns.cs:87:39:87:70 | ... ? ... : ... | Patterns.cs:87:26:87:27 | exit M9 (normal) | semmle.label | successor |
-| Patterns.cs:87:44:87:44 | 1 | Patterns.cs:87:44:87:54 | [no-match] ... and ... | semmle.label | no-match |
-| Patterns.cs:87:44:87:44 | 1 | Patterns.cs:87:54:87:54 | 2 | semmle.label | match |
-| Patterns.cs:87:44:87:54 | [match] ... and ... | Patterns.cs:87:39:87:54 | [true] ... is ... | semmle.label | match |
-| Patterns.cs:87:44:87:54 | [no-match] ... and ... | Patterns.cs:87:39:87:54 | [false] ... is ... | semmle.label | no-match |
-| Patterns.cs:87:50:87:54 | [match] not ... | Patterns.cs:87:44:87:54 | [match] ... and ... | semmle.label | match |
-| Patterns.cs:87:50:87:54 | [no-match] not ... | Patterns.cs:87:44:87:54 | [no-match] ... and ... | semmle.label | no-match |
-| Patterns.cs:87:54:87:54 | 2 | Patterns.cs:87:50:87:54 | [match] not ... | semmle.label | no-match |
-| Patterns.cs:87:54:87:54 | 2 | Patterns.cs:87:50:87:54 | [no-match] not ... | semmle.label | match |
-| Patterns.cs:87:58:87:60 | "1" | Patterns.cs:87:39:87:70 | ... ? ... : ... | semmle.label | successor |
-| Patterns.cs:87:64:87:70 | "not 1" | Patterns.cs:87:39:87:70 | ... ? ... : ... | semmle.label | successor |
-| Patterns.cs:93:17:93:19 | enter M10 | Patterns.cs:94:5:99:5 | {...} | semmle.label | successor |
-| Patterns.cs:93:17:93:19 | exit M10 (normal) | Patterns.cs:93:17:93:19 | exit M10 | semmle.label | successor |
-| Patterns.cs:94:5:99:5 | {...} | Patterns.cs:95:9:98:9 | if (...) ... | semmle.label | successor |
-| Patterns.cs:95:9:98:9 | if (...) ... | Patterns.cs:95:13:95:16 | this access | semmle.label | successor |
-| Patterns.cs:95:13:95:16 | this access | Patterns.cs:95:29:95:31 | access to constant A | semmle.label | successor |
-| Patterns.cs:95:13:95:40 | [false] ... is ... | Patterns.cs:93:17:93:19 | exit M10 (normal) | semmle.label | false |
-| Patterns.cs:95:13:95:40 | [true] ... is ... | Patterns.cs:96:9:98:9 | {...} | semmle.label | true |
-| Patterns.cs:95:21:95:40 | [match] { ... } | Patterns.cs:95:13:95:40 | [true] ... is ... | semmle.label | match |
-| Patterns.cs:95:21:95:40 | [match] { ... } | Patterns.cs:95:21:95:40 | [match] { ... } | semmle.label | match |
-| Patterns.cs:95:21:95:40 | [no-match] { ... } | Patterns.cs:95:13:95:40 | [false] ... is ... | semmle.label | no-match |
-| Patterns.cs:95:21:95:40 | [no-match] { ... } | Patterns.cs:95:21:95:40 | [no-match] { ... } | semmle.label | no-match |
-| Patterns.cs:95:29:95:31 | access to constant A | Patterns.cs:95:29:95:38 | [match] ... or ... | semmle.label | match |
-| Patterns.cs:95:29:95:31 | access to constant A | Patterns.cs:95:36:95:38 | access to constant B | semmle.label | no-match |
-| Patterns.cs:95:29:95:38 | [match] ... or ... | Patterns.cs:95:21:95:40 | [match] { ... } | semmle.label | match |
-| Patterns.cs:95:29:95:38 | [no-match] ... or ... | Patterns.cs:95:21:95:40 | [no-match] { ... } | semmle.label | no-match |
-| Patterns.cs:95:36:95:38 | access to constant B | Patterns.cs:95:29:95:38 | [match] ... or ... | semmle.label | match |
-| Patterns.cs:95:36:95:38 | access to constant B | Patterns.cs:95:29:95:38 | [no-match] ... or ... | semmle.label | no-match |
-| Patterns.cs:96:9:98:9 | {...} | Patterns.cs:97:13:97:39 | ...; | semmle.label | successor |
-| Patterns.cs:97:13:97:38 | call to method WriteLine | Patterns.cs:93:17:93:19 | exit M10 (normal) | semmle.label | successor |
-| Patterns.cs:97:13:97:39 | ...; | Patterns.cs:97:31:97:37 | "not C" | semmle.label | successor |
-| Patterns.cs:97:31:97:37 | "not C" | Patterns.cs:97:13:97:38 | call to method WriteLine | semmle.label | successor |
-| PostDominance.cs:5:10:5:11 | enter M1 | PostDominance.cs:6:5:8:5 | {...} | semmle.label | successor |
-| PostDominance.cs:5:10:5:11 | exit M1 (normal) | PostDominance.cs:5:10:5:11 | exit M1 | semmle.label | successor |
-| PostDominance.cs:6:5:8:5 | {...} | PostDominance.cs:7:9:7:29 | ...; | semmle.label | successor |
-| PostDominance.cs:7:9:7:28 | call to method WriteLine | PostDominance.cs:5:10:5:11 | exit M1 (normal) | semmle.label | successor |
-| PostDominance.cs:7:9:7:29 | ...; | PostDominance.cs:7:27:7:27 | access to parameter s | semmle.label | successor |
-| PostDominance.cs:7:27:7:27 | access to parameter s | PostDominance.cs:7:9:7:28 | call to method WriteLine | semmle.label | successor |
-| PostDominance.cs:10:10:10:11 | enter M2 | PostDominance.cs:11:5:15:5 | {...} | semmle.label | successor |
-| PostDominance.cs:10:10:10:11 | exit M2 (normal) | PostDominance.cs:10:10:10:11 | exit M2 | semmle.label | successor |
-| PostDominance.cs:11:5:15:5 | {...} | PostDominance.cs:12:9:13:19 | if (...) ... | semmle.label | successor |
-| PostDominance.cs:12:9:13:19 | if (...) ... | PostDominance.cs:12:13:12:13 | access to parameter s | semmle.label | successor |
-| PostDominance.cs:12:13:12:13 | access to parameter s | PostDominance.cs:12:18:12:21 | null | semmle.label | successor |
-| PostDominance.cs:12:13:12:21 | [false] ... is ... | PostDominance.cs:14:9:14:29 | ...; | semmle.label | false |
-| PostDominance.cs:12:13:12:21 | [true] ... is ... | PostDominance.cs:13:13:13:19 | return ...; | semmle.label | true |
-| PostDominance.cs:12:18:12:21 | null | PostDominance.cs:12:13:12:21 | [false] ... is ... | semmle.label | no-match |
-| PostDominance.cs:12:18:12:21 | null | PostDominance.cs:12:13:12:21 | [true] ... is ... | semmle.label | match |
-| PostDominance.cs:13:13:13:19 | return ...; | PostDominance.cs:10:10:10:11 | exit M2 (normal) | semmle.label | return |
-| PostDominance.cs:14:9:14:28 | call to method WriteLine | PostDominance.cs:10:10:10:11 | exit M2 (normal) | semmle.label | successor |
-| PostDominance.cs:14:9:14:29 | ...; | PostDominance.cs:14:27:14:27 | access to parameter s | semmle.label | successor |
-| PostDominance.cs:14:27:14:27 | access to parameter s | PostDominance.cs:14:9:14:28 | call to method WriteLine | semmle.label | successor |
-| PostDominance.cs:17:10:17:11 | enter M3 | PostDominance.cs:18:5:22:5 | {...} | semmle.label | successor |
-| PostDominance.cs:17:10:17:11 | exit M3 (abnormal) | PostDominance.cs:17:10:17:11 | exit M3 | semmle.label | successor |
-| PostDominance.cs:17:10:17:11 | exit M3 (normal) | PostDominance.cs:17:10:17:11 | exit M3 | semmle.label | successor |
-| PostDominance.cs:18:5:22:5 | {...} | PostDominance.cs:19:9:20:55 | if (...) ... | semmle.label | successor |
-| PostDominance.cs:19:9:20:55 | if (...) ... | PostDominance.cs:19:13:19:13 | access to parameter s | semmle.label | successor |
-| PostDominance.cs:19:13:19:13 | access to parameter s | PostDominance.cs:19:18:19:21 | null | semmle.label | successor |
-| PostDominance.cs:19:13:19:21 | [false] ... is ... | PostDominance.cs:21:9:21:29 | ...; | semmle.label | false |
-| PostDominance.cs:19:13:19:21 | [true] ... is ... | PostDominance.cs:20:45:20:53 | nameof(...) | semmle.label | true |
-| PostDominance.cs:19:18:19:21 | null | PostDominance.cs:19:13:19:21 | [false] ... is ... | semmle.label | no-match |
-| PostDominance.cs:19:18:19:21 | null | PostDominance.cs:19:13:19:21 | [true] ... is ... | semmle.label | match |
-| PostDominance.cs:20:13:20:55 | throw ...; | PostDominance.cs:17:10:17:11 | exit M3 (abnormal) | semmle.label | exception(ArgumentNullException) |
-| PostDominance.cs:20:19:20:54 | object creation of type ArgumentNullException | PostDominance.cs:20:13:20:55 | throw ...; | semmle.label | successor |
-| PostDominance.cs:20:45:20:53 | nameof(...) | PostDominance.cs:20:19:20:54 | object creation of type ArgumentNullException | semmle.label | successor |
-| PostDominance.cs:21:9:21:28 | call to method WriteLine | PostDominance.cs:17:10:17:11 | exit M3 (normal) | semmle.label | successor |
-| PostDominance.cs:21:9:21:29 | ...; | PostDominance.cs:21:27:21:27 | access to parameter s | semmle.label | successor |
-| PostDominance.cs:21:27:21:27 | access to parameter s | PostDominance.cs:21:9:21:28 | call to method WriteLine | semmle.label | successor |
-| Qualifiers.cs:7:16:7:21 | enter Method | Qualifiers.cs:7:28:7:31 | null | semmle.label | successor |
-| Qualifiers.cs:7:16:7:21 | exit Method (normal) | Qualifiers.cs:7:16:7:21 | exit Method | semmle.label | successor |
-| Qualifiers.cs:7:28:7:31 | null | Qualifiers.cs:7:16:7:21 | exit Method (normal) | semmle.label | successor |
-| Qualifiers.cs:8:23:8:34 | enter StaticMethod | Qualifiers.cs:8:41:8:44 | null | semmle.label | successor |
-| Qualifiers.cs:8:23:8:34 | exit StaticMethod (normal) | Qualifiers.cs:8:23:8:34 | exit StaticMethod | semmle.label | successor |
-| Qualifiers.cs:8:41:8:44 | null | Qualifiers.cs:8:23:8:34 | exit StaticMethod (normal) | semmle.label | successor |
-| Qualifiers.cs:10:10:10:10 | enter M | Qualifiers.cs:11:5:31:5 | {...} | semmle.label | successor |
-| Qualifiers.cs:10:10:10:10 | exit M (normal) | Qualifiers.cs:10:10:10:10 | exit M | semmle.label | successor |
-| Qualifiers.cs:11:5:31:5 | {...} | Qualifiers.cs:12:9:12:22 | ... ...; | semmle.label | successor |
-| Qualifiers.cs:12:9:12:22 | ... ...; | Qualifiers.cs:12:17:12:21 | this access | semmle.label | successor |
-| Qualifiers.cs:12:13:12:21 | Qualifiers q = ... | Qualifiers.cs:13:9:13:21 | ...; | semmle.label | successor |
-| Qualifiers.cs:12:17:12:21 | access to field Field | Qualifiers.cs:12:13:12:21 | Qualifiers q = ... | semmle.label | successor |
-| Qualifiers.cs:12:17:12:21 | this access | Qualifiers.cs:12:17:12:21 | access to field Field | semmle.label | successor |
-| Qualifiers.cs:13:9:13:20 | ... = ... | Qualifiers.cs:14:9:14:21 | ...; | semmle.label | successor |
-| Qualifiers.cs:13:9:13:21 | ...; | Qualifiers.cs:13:13:13:20 | this access | semmle.label | successor |
-| Qualifiers.cs:13:13:13:20 | access to property Property | Qualifiers.cs:13:9:13:20 | ... = ... | semmle.label | successor |
-| Qualifiers.cs:13:13:13:20 | this access | Qualifiers.cs:13:13:13:20 | access to property Property | semmle.label | successor |
-| Qualifiers.cs:14:9:14:20 | ... = ... | Qualifiers.cs:16:9:16:23 | ...; | semmle.label | successor |
-| Qualifiers.cs:14:9:14:21 | ...; | Qualifiers.cs:14:13:14:20 | this access | semmle.label | successor |
-| Qualifiers.cs:14:13:14:20 | call to method Method | Qualifiers.cs:14:9:14:20 | ... = ... | semmle.label | successor |
-| Qualifiers.cs:14:13:14:20 | this access | Qualifiers.cs:14:13:14:20 | call to method Method | semmle.label | successor |
-| Qualifiers.cs:16:9:16:22 | ... = ... | Qualifiers.cs:17:9:17:26 | ...; | semmle.label | successor |
-| Qualifiers.cs:16:9:16:23 | ...; | Qualifiers.cs:16:13:16:16 | this access | semmle.label | successor |
-| Qualifiers.cs:16:13:16:16 | this access | Qualifiers.cs:16:13:16:22 | access to field Field | semmle.label | successor |
-| Qualifiers.cs:16:13:16:22 | access to field Field | Qualifiers.cs:16:9:16:22 | ... = ... | semmle.label | successor |
-| Qualifiers.cs:17:9:17:25 | ... = ... | Qualifiers.cs:18:9:18:26 | ...; | semmle.label | successor |
-| Qualifiers.cs:17:9:17:26 | ...; | Qualifiers.cs:17:13:17:16 | this access | semmle.label | successor |
-| Qualifiers.cs:17:13:17:16 | this access | Qualifiers.cs:17:13:17:25 | access to property Property | semmle.label | successor |
-| Qualifiers.cs:17:13:17:25 | access to property Property | Qualifiers.cs:17:9:17:25 | ... = ... | semmle.label | successor |
-| Qualifiers.cs:18:9:18:25 | ... = ... | Qualifiers.cs:20:9:20:24 | ...; | semmle.label | successor |
-| Qualifiers.cs:18:9:18:26 | ...; | Qualifiers.cs:18:13:18:16 | this access | semmle.label | successor |
-| Qualifiers.cs:18:13:18:16 | this access | Qualifiers.cs:18:13:18:25 | call to method Method | semmle.label | successor |
-| Qualifiers.cs:18:13:18:25 | call to method Method | Qualifiers.cs:18:9:18:25 | ... = ... | semmle.label | successor |
-| Qualifiers.cs:20:9:20:23 | ... = ... | Qualifiers.cs:21:9:21:27 | ...; | semmle.label | successor |
-| Qualifiers.cs:20:9:20:24 | ...; | Qualifiers.cs:20:13:20:23 | access to field StaticField | semmle.label | successor |
-| Qualifiers.cs:20:13:20:23 | access to field StaticField | Qualifiers.cs:20:9:20:23 | ... = ... | semmle.label | successor |
-| Qualifiers.cs:21:9:21:26 | ... = ... | Qualifiers.cs:22:9:22:27 | ...; | semmle.label | successor |
-| Qualifiers.cs:21:9:21:27 | ...; | Qualifiers.cs:21:13:21:26 | access to property StaticProperty | semmle.label | successor |
-| Qualifiers.cs:21:13:21:26 | access to property StaticProperty | Qualifiers.cs:21:9:21:26 | ... = ... | semmle.label | successor |
-| Qualifiers.cs:22:9:22:26 | ... = ... | Qualifiers.cs:24:9:24:35 | ...; | semmle.label | successor |
-| Qualifiers.cs:22:9:22:27 | ...; | Qualifiers.cs:22:13:22:26 | call to method StaticMethod | semmle.label | successor |
-| Qualifiers.cs:22:13:22:26 | call to method StaticMethod | Qualifiers.cs:22:9:22:26 | ... = ... | semmle.label | successor |
-| Qualifiers.cs:24:9:24:34 | ... = ... | Qualifiers.cs:25:9:25:38 | ...; | semmle.label | successor |
-| Qualifiers.cs:24:9:24:35 | ...; | Qualifiers.cs:24:13:24:34 | access to field StaticField | semmle.label | successor |
-| Qualifiers.cs:24:13:24:34 | access to field StaticField | Qualifiers.cs:24:9:24:34 | ... = ... | semmle.label | successor |
-| Qualifiers.cs:25:9:25:37 | ... = ... | Qualifiers.cs:26:9:26:38 | ...; | semmle.label | successor |
-| Qualifiers.cs:25:9:25:38 | ...; | Qualifiers.cs:25:13:25:37 | access to property StaticProperty | semmle.label | successor |
-| Qualifiers.cs:25:13:25:37 | access to property StaticProperty | Qualifiers.cs:25:9:25:37 | ... = ... | semmle.label | successor |
-| Qualifiers.cs:26:9:26:37 | ... = ... | Qualifiers.cs:28:9:28:41 | ...; | semmle.label | successor |
-| Qualifiers.cs:26:9:26:38 | ...; | Qualifiers.cs:26:13:26:37 | call to method StaticMethod | semmle.label | successor |
-| Qualifiers.cs:26:13:26:37 | call to method StaticMethod | Qualifiers.cs:26:9:26:37 | ... = ... | semmle.label | successor |
-| Qualifiers.cs:28:9:28:40 | ... = ... | Qualifiers.cs:29:9:29:47 | ...; | semmle.label | successor |
-| Qualifiers.cs:28:9:28:41 | ...; | Qualifiers.cs:28:13:28:34 | access to field StaticField | semmle.label | successor |
-| Qualifiers.cs:28:13:28:34 | access to field StaticField | Qualifiers.cs:28:13:28:40 | access to field Field | semmle.label | successor |
-| Qualifiers.cs:28:13:28:40 | access to field Field | Qualifiers.cs:28:9:28:40 | ... = ... | semmle.label | successor |
-| Qualifiers.cs:29:9:29:46 | ... = ... | Qualifiers.cs:30:9:30:47 | ...; | semmle.label | successor |
-| Qualifiers.cs:29:9:29:47 | ...; | Qualifiers.cs:29:13:29:37 | access to property StaticProperty | semmle.label | successor |
-| Qualifiers.cs:29:13:29:37 | access to property StaticProperty | Qualifiers.cs:29:13:29:46 | access to property Property | semmle.label | successor |
-| Qualifiers.cs:29:13:29:46 | access to property Property | Qualifiers.cs:29:9:29:46 | ... = ... | semmle.label | successor |
-| Qualifiers.cs:30:9:30:46 | ... = ... | Qualifiers.cs:10:10:10:10 | exit M (normal) | semmle.label | successor |
-| Qualifiers.cs:30:9:30:47 | ...; | Qualifiers.cs:30:13:30:37 | call to method StaticMethod | semmle.label | successor |
-| Qualifiers.cs:30:13:30:37 | call to method StaticMethod | Qualifiers.cs:30:13:30:46 | call to method Method | semmle.label | successor |
-| Qualifiers.cs:30:13:30:46 | call to method Method | Qualifiers.cs:30:9:30:46 | ... = ... | semmle.label | successor |
-| Switch.cs:5:10:5:11 | enter M1 | Switch.cs:6:5:8:5 | {...} | semmle.label | successor |
-| Switch.cs:5:10:5:11 | exit M1 (normal) | Switch.cs:5:10:5:11 | exit M1 | semmle.label | successor |
-| Switch.cs:6:5:8:5 | {...} | Switch.cs:7:9:7:22 | switch (...) {...} | semmle.label | successor |
-| Switch.cs:7:9:7:22 | switch (...) {...} | Switch.cs:7:17:7:17 | access to parameter o | semmle.label | successor |
-| Switch.cs:7:17:7:17 | access to parameter o | Switch.cs:5:10:5:11 | exit M1 (normal) | semmle.label | successor |
-| Switch.cs:10:10:10:11 | enter M2 | Switch.cs:11:5:33:5 | {...} | semmle.label | successor |
-| Switch.cs:10:10:10:11 | exit M2 (abnormal) | Switch.cs:10:10:10:11 | exit M2 | semmle.label | successor |
-| Switch.cs:10:10:10:11 | exit M2 (normal) | Switch.cs:10:10:10:11 | exit M2 | semmle.label | successor |
-| Switch.cs:11:5:33:5 | {...} | Switch.cs:12:9:32:9 | switch (...) {...} | semmle.label | successor |
-| Switch.cs:12:9:32:9 | switch (...) {...} | Switch.cs:12:17:12:17 | access to parameter o | semmle.label | successor |
-| Switch.cs:12:17:12:17 | access to parameter o | Switch.cs:14:13:14:21 | case ...: | semmle.label | successor |
-| Switch.cs:14:13:14:21 | case ...: | Switch.cs:14:18:14:20 | "a" | semmle.label | successor |
-| Switch.cs:14:18:14:20 | "a" | Switch.cs:15:17:15:23 | return ...; | semmle.label | match |
-| Switch.cs:14:18:14:20 | "a" | Switch.cs:16:13:16:19 | case ...: | semmle.label | no-match |
-| Switch.cs:15:17:15:23 | return ...; | Switch.cs:10:10:10:11 | exit M2 (normal) | semmle.label | return |
-| Switch.cs:16:13:16:19 | case ...: | Switch.cs:16:18:16:18 | 0 | semmle.label | successor |
-| Switch.cs:16:18:16:18 | 0 | Switch.cs:17:23:17:37 | object creation of type Exception | semmle.label | match |
-| Switch.cs:16:18:16:18 | 0 | Switch.cs:18:13:18:22 | case ...: | semmle.label | no-match |
-| Switch.cs:17:17:17:38 | throw ...; | Switch.cs:10:10:10:11 | exit M2 (abnormal) | semmle.label | exception(Exception) |
-| Switch.cs:17:23:17:37 | object creation of type Exception | Switch.cs:17:17:17:38 | throw ...; | semmle.label | successor |
-| Switch.cs:18:13:18:22 | case ...: | Switch.cs:18:18:18:21 | null | semmle.label | successor |
-| Switch.cs:18:18:18:21 | null | Switch.cs:19:17:19:29 | goto default; | semmle.label | match |
-| Switch.cs:18:18:18:21 | null | Switch.cs:20:13:20:23 | case ...: | semmle.label | no-match |
-| Switch.cs:19:17:19:29 | goto default; | Switch.cs:30:13:30:20 | default: | semmle.label | goto(default) |
-| Switch.cs:20:13:20:23 | case ...: | Switch.cs:20:18:20:22 | Int32 i | semmle.label | successor |
-| Switch.cs:20:18:20:22 | Int32 i | Switch.cs:21:17:22:27 | if (...) ... | semmle.label | match |
-| Switch.cs:20:18:20:22 | Int32 i | Switch.cs:24:13:24:56 | case ...: | semmle.label | no-match |
-| Switch.cs:21:17:22:27 | if (...) ... | Switch.cs:21:21:21:21 | access to parameter o | semmle.label | successor |
-| Switch.cs:21:21:21:21 | access to parameter o | Switch.cs:21:26:21:29 | null | semmle.label | successor |
-| Switch.cs:21:21:21:29 | ... == ... | Switch.cs:22:21:22:27 | return ...; | semmle.label | true |
-| Switch.cs:21:21:21:29 | ... == ... | Switch.cs:23:27:23:27 | 0 | semmle.label | false |
-| Switch.cs:21:26:21:29 | null | Switch.cs:21:21:21:29 | ... == ... | semmle.label | successor |
-| Switch.cs:22:21:22:27 | return ...; | Switch.cs:10:10:10:11 | exit M2 (normal) | semmle.label | return |
-| Switch.cs:23:17:23:28 | goto case ...; | Switch.cs:16:13:16:19 | case ...: | semmle.label | goto(0) |
-| Switch.cs:23:27:23:27 | 0 | Switch.cs:23:17:23:28 | goto case ...; | semmle.label | successor |
-| Switch.cs:24:13:24:56 | case ...: | Switch.cs:24:18:24:25 | String s | semmle.label | successor |
-| Switch.cs:24:18:24:25 | String s | Switch.cs:24:32:24:32 | access to local variable s | semmle.label | match |
-| Switch.cs:24:18:24:25 | String s | Switch.cs:27:13:27:39 | case ...: | semmle.label | no-match |
-| Switch.cs:24:32:24:32 | access to local variable s | Switch.cs:24:32:24:39 | access to property Length | semmle.label | successor |
-| Switch.cs:24:32:24:39 | access to property Length | Switch.cs:24:43:24:43 | 0 | semmle.label | successor |
-| Switch.cs:24:32:24:43 | ... > ... | Switch.cs:24:32:24:55 | [false] ... && ... | semmle.label | false |
-| Switch.cs:24:32:24:43 | ... > ... | Switch.cs:24:48:24:48 | access to local variable s | semmle.label | true |
-| Switch.cs:24:32:24:55 | [false] ... && ... | Switch.cs:27:13:27:39 | case ...: | semmle.label | false |
-| Switch.cs:24:32:24:55 | [true] ... && ... | Switch.cs:25:17:25:37 | ...; | semmle.label | true |
-| Switch.cs:24:43:24:43 | 0 | Switch.cs:24:32:24:43 | ... > ... | semmle.label | successor |
-| Switch.cs:24:48:24:48 | access to local variable s | Switch.cs:24:53:24:55 | "a" | semmle.label | successor |
-| Switch.cs:24:48:24:55 | ... != ... | Switch.cs:24:32:24:55 | [false] ... && ... | semmle.label | false |
-| Switch.cs:24:48:24:55 | ... != ... | Switch.cs:24:32:24:55 | [true] ... && ... | semmle.label | true |
-| Switch.cs:24:53:24:55 | "a" | Switch.cs:24:48:24:55 | ... != ... | semmle.label | successor |
-| Switch.cs:25:17:25:36 | call to method WriteLine | Switch.cs:26:17:26:23 | return ...; | semmle.label | successor |
-| Switch.cs:25:17:25:37 | ...; | Switch.cs:25:35:25:35 | access to local variable s | semmle.label | successor |
-| Switch.cs:25:35:25:35 | access to local variable s | Switch.cs:25:17:25:36 | call to method WriteLine | semmle.label | successor |
-| Switch.cs:26:17:26:23 | return ...; | Switch.cs:10:10:10:11 | exit M2 (normal) | semmle.label | return |
-| Switch.cs:27:13:27:39 | case ...: | Switch.cs:27:18:27:25 | Double d | semmle.label | successor |
-| Switch.cs:27:18:27:25 | Double d | Switch.cs:27:32:27:38 | call to method Throw | semmle.label | match |
-| Switch.cs:27:18:27:25 | Double d | Switch.cs:30:13:30:20 | default: | semmle.label | no-match |
-| Switch.cs:27:32:27:38 | call to method Throw | Switch.cs:10:10:10:11 | exit M2 (abnormal) | semmle.label | exception(Exception) |
-| Switch.cs:28:13:28:17 | Label: | Switch.cs:29:17:29:23 | return ...; | semmle.label | successor |
-| Switch.cs:29:17:29:23 | return ...; | Switch.cs:10:10:10:11 | exit M2 (normal) | semmle.label | return |
-| Switch.cs:30:13:30:20 | default: | Switch.cs:31:17:31:27 | goto ...; | semmle.label | successor |
-| Switch.cs:31:17:31:27 | goto ...; | Switch.cs:28:13:28:17 | Label: | semmle.label | goto(Label) |
-| Switch.cs:35:10:35:11 | enter M3 | Switch.cs:36:5:42:5 | {...} | semmle.label | successor |
-| Switch.cs:35:10:35:11 | exit M3 (abnormal) | Switch.cs:35:10:35:11 | exit M3 | semmle.label | successor |
-| Switch.cs:36:5:42:5 | {...} | Switch.cs:37:9:41:9 | switch (...) {...} | semmle.label | successor |
-| Switch.cs:37:9:41:9 | switch (...) {...} | Switch.cs:37:17:37:23 | call to method Throw | semmle.label | successor |
-| Switch.cs:37:17:37:23 | call to method Throw | Switch.cs:35:10:35:11 | exit M3 (abnormal) | semmle.label | exception(Exception) |
-| Switch.cs:44:10:44:11 | enter M4 | Switch.cs:45:5:53:5 | {...} | semmle.label | successor |
-| Switch.cs:44:10:44:11 | exit M4 (normal) | Switch.cs:44:10:44:11 | exit M4 | semmle.label | successor |
-| Switch.cs:45:5:53:5 | {...} | Switch.cs:46:9:52:9 | switch (...) {...} | semmle.label | successor |
-| Switch.cs:46:9:52:9 | switch (...) {...} | Switch.cs:46:17:46:17 | access to parameter o | semmle.label | successor |
-| Switch.cs:46:17:46:17 | access to parameter o | Switch.cs:48:13:48:23 | case ...: | semmle.label | successor |
-| Switch.cs:48:13:48:23 | case ...: | Switch.cs:48:18:48:20 | access to type Int32 | semmle.label | successor |
-| Switch.cs:48:18:48:20 | access to type Int32 | Switch.cs:49:17:49:22 | break; | semmle.label | match |
-| Switch.cs:48:18:48:20 | access to type Int32 | Switch.cs:50:13:50:39 | case ...: | semmle.label | no-match |
-| Switch.cs:49:17:49:22 | break; | Switch.cs:44:10:44:11 | exit M4 (normal) | semmle.label | break |
-| Switch.cs:50:13:50:39 | case ...: | Switch.cs:50:18:50:21 | access to type Boolean | semmle.label | successor |
-| Switch.cs:50:18:50:21 | access to type Boolean | Switch.cs:44:10:44:11 | exit M4 (normal) | semmle.label | no-match |
-| Switch.cs:50:18:50:21 | access to type Boolean | Switch.cs:50:30:50:30 | access to parameter o | semmle.label | match |
-| Switch.cs:50:30:50:30 | access to parameter o | Switch.cs:50:35:50:38 | null | semmle.label | successor |
-| Switch.cs:50:30:50:38 | ... != ... | Switch.cs:44:10:44:11 | exit M4 (normal) | semmle.label | false |
-| Switch.cs:50:30:50:38 | ... != ... | Switch.cs:51:17:51:22 | break; | semmle.label | true |
-| Switch.cs:50:35:50:38 | null | Switch.cs:50:30:50:38 | ... != ... | semmle.label | successor |
-| Switch.cs:51:17:51:22 | break; | Switch.cs:44:10:44:11 | exit M4 (normal) | semmle.label | break |
-| Switch.cs:55:10:55:11 | enter M5 | Switch.cs:56:5:64:5 | {...} | semmle.label | successor |
-| Switch.cs:55:10:55:11 | exit M5 (normal) | Switch.cs:55:10:55:11 | exit M5 | semmle.label | successor |
-| Switch.cs:56:5:64:5 | {...} | Switch.cs:57:9:63:9 | switch (...) {...} | semmle.label | successor |
-| Switch.cs:57:9:63:9 | switch (...) {...} | Switch.cs:57:17:57:17 | 1 | semmle.label | successor |
-| Switch.cs:57:17:57:17 | 1 | Switch.cs:57:21:57:21 | 2 | semmle.label | successor |
-| Switch.cs:57:17:57:21 | ... + ... | Switch.cs:59:13:59:19 | case ...: | semmle.label | successor |
-| Switch.cs:57:21:57:21 | 2 | Switch.cs:57:17:57:21 | ... + ... | semmle.label | successor |
-| Switch.cs:59:13:59:19 | case ...: | Switch.cs:59:18:59:18 | 2 | semmle.label | successor |
-| Switch.cs:59:18:59:18 | 2 | Switch.cs:61:13:61:19 | case ...: | semmle.label | no-match |
-| Switch.cs:61:13:61:19 | case ...: | Switch.cs:61:18:61:18 | 3 | semmle.label | successor |
-| Switch.cs:61:18:61:18 | 3 | Switch.cs:62:17:62:22 | break; | semmle.label | match |
-| Switch.cs:62:17:62:22 | break; | Switch.cs:55:10:55:11 | exit M5 (normal) | semmle.label | break |
-| Switch.cs:66:10:66:11 | enter M6 | Switch.cs:67:5:75:5 | {...} | semmle.label | successor |
-| Switch.cs:66:10:66:11 | exit M6 (normal) | Switch.cs:66:10:66:11 | exit M6 | semmle.label | successor |
-| Switch.cs:67:5:75:5 | {...} | Switch.cs:68:9:74:9 | switch (...) {...} | semmle.label | successor |
-| Switch.cs:68:9:74:9 | switch (...) {...} | Switch.cs:68:25:68:25 | access to parameter s | semmle.label | successor |
-| Switch.cs:68:17:68:25 | (...) ... | Switch.cs:70:13:70:23 | case ...: | semmle.label | successor |
-| Switch.cs:68:25:68:25 | access to parameter s | Switch.cs:68:17:68:25 | (...) ... | semmle.label | successor |
-| Switch.cs:70:13:70:23 | case ...: | Switch.cs:70:18:70:20 | access to type Int32 | semmle.label | successor |
-| Switch.cs:70:18:70:20 | access to type Int32 | Switch.cs:72:13:72:20 | case ...: | semmle.label | no-match |
-| Switch.cs:72:13:72:20 | case ...: | Switch.cs:72:18:72:19 | "" | semmle.label | successor |
-| Switch.cs:72:18:72:19 | "" | Switch.cs:66:10:66:11 | exit M6 (normal) | semmle.label | no-match |
-| Switch.cs:72:18:72:19 | "" | Switch.cs:73:17:73:22 | break; | semmle.label | match |
-| Switch.cs:73:17:73:22 | break; | Switch.cs:66:10:66:11 | exit M6 (normal) | semmle.label | break |
-| Switch.cs:77:10:77:11 | enter M7 | Switch.cs:78:5:89:5 | {...} | semmle.label | successor |
-| Switch.cs:77:10:77:11 | exit M7 (normal) | Switch.cs:77:10:77:11 | exit M7 | semmle.label | successor |
-| Switch.cs:78:5:89:5 | {...} | Switch.cs:79:9:87:9 | switch (...) {...} | semmle.label | successor |
-| Switch.cs:79:9:87:9 | switch (...) {...} | Switch.cs:79:17:79:17 | access to parameter i | semmle.label | successor |
-| Switch.cs:79:17:79:17 | access to parameter i | Switch.cs:81:13:81:19 | case ...: | semmle.label | successor |
-| Switch.cs:81:13:81:19 | case ...: | Switch.cs:81:18:81:18 | 1 | semmle.label | successor |
-| Switch.cs:81:18:81:18 | 1 | Switch.cs:82:24:82:27 | true | semmle.label | match |
-| Switch.cs:81:18:81:18 | 1 | Switch.cs:83:13:83:19 | case ...: | semmle.label | no-match |
-| Switch.cs:82:17:82:28 | return ...; | Switch.cs:77:10:77:11 | exit M7 (normal) | semmle.label | return |
-| Switch.cs:82:24:82:27 | true | Switch.cs:82:17:82:28 | return ...; | semmle.label | successor |
-| Switch.cs:83:13:83:19 | case ...: | Switch.cs:83:18:83:18 | 2 | semmle.label | successor |
-| Switch.cs:83:18:83:18 | 2 | Switch.cs:84:17:85:26 | if (...) ... | semmle.label | match |
-| Switch.cs:83:18:83:18 | 2 | Switch.cs:88:16:88:20 | false | semmle.label | no-match |
-| Switch.cs:84:17:85:26 | if (...) ... | Switch.cs:84:21:84:21 | access to parameter j | semmle.label | successor |
-| Switch.cs:84:21:84:21 | access to parameter j | Switch.cs:84:25:84:25 | 2 | semmle.label | successor |
-| Switch.cs:84:21:84:25 | ... > ... | Switch.cs:85:21:85:26 | break; | semmle.label | true |
-| Switch.cs:84:21:84:25 | ... > ... | Switch.cs:86:24:86:27 | true | semmle.label | false |
-| Switch.cs:84:25:84:25 | 2 | Switch.cs:84:21:84:25 | ... > ... | semmle.label | successor |
-| Switch.cs:85:21:85:26 | break; | Switch.cs:88:16:88:20 | false | semmle.label | break |
-| Switch.cs:86:17:86:28 | return ...; | Switch.cs:77:10:77:11 | exit M7 (normal) | semmle.label | return |
-| Switch.cs:86:24:86:27 | true | Switch.cs:86:17:86:28 | return ...; | semmle.label | successor |
-| Switch.cs:88:9:88:21 | return ...; | Switch.cs:77:10:77:11 | exit M7 (normal) | semmle.label | return |
-| Switch.cs:88:16:88:20 | false | Switch.cs:88:9:88:21 | return ...; | semmle.label | successor |
-| Switch.cs:91:10:91:11 | enter M8 | Switch.cs:92:5:99:5 | {...} | semmle.label | successor |
-| Switch.cs:91:10:91:11 | exit M8 (normal) | Switch.cs:91:10:91:11 | exit M8 | semmle.label | successor |
-| Switch.cs:92:5:99:5 | {...} | Switch.cs:93:9:97:9 | switch (...) {...} | semmle.label | successor |
-| Switch.cs:93:9:97:9 | switch (...) {...} | Switch.cs:93:17:93:17 | access to parameter o | semmle.label | successor |
-| Switch.cs:93:17:93:17 | access to parameter o | Switch.cs:95:13:95:23 | case ...: | semmle.label | successor |
-| Switch.cs:95:13:95:23 | case ...: | Switch.cs:95:18:95:20 | access to type Int32 | semmle.label | successor |
-| Switch.cs:95:18:95:20 | access to type Int32 | Switch.cs:96:24:96:27 | true | semmle.label | match |
-| Switch.cs:95:18:95:20 | access to type Int32 | Switch.cs:98:16:98:20 | false | semmle.label | no-match |
-| Switch.cs:96:17:96:28 | return ...; | Switch.cs:91:10:91:11 | exit M8 (normal) | semmle.label | return |
-| Switch.cs:96:24:96:27 | true | Switch.cs:96:17:96:28 | return ...; | semmle.label | successor |
-| Switch.cs:98:9:98:21 | return ...; | Switch.cs:91:10:91:11 | exit M8 (normal) | semmle.label | return |
-| Switch.cs:98:16:98:20 | false | Switch.cs:98:9:98:21 | return ...; | semmle.label | successor |
-| Switch.cs:101:9:101:10 | enter M9 | Switch.cs:102:5:109:5 | {...} | semmle.label | successor |
-| Switch.cs:101:9:101:10 | exit M9 (normal) | Switch.cs:101:9:101:10 | exit M9 | semmle.label | successor |
-| Switch.cs:102:5:109:5 | {...} | Switch.cs:103:9:107:9 | switch (...) {...} | semmle.label | successor |
-| Switch.cs:103:9:107:9 | switch (...) {...} | Switch.cs:103:17:103:17 | access to parameter s | semmle.label | successor |
-| Switch.cs:103:17:103:17 | access to parameter s | Switch.cs:103:19:103:25 | access to property Length | semmle.label | non-null |
-| Switch.cs:103:17:103:17 | access to parameter s | Switch.cs:105:13:105:19 | case ...: | semmle.label | null |
-| Switch.cs:103:19:103:25 | access to property Length | Switch.cs:105:13:105:19 | case ...: | semmle.label | successor |
-| Switch.cs:105:13:105:19 | case ...: | Switch.cs:105:18:105:18 | 0 | semmle.label | successor |
-| Switch.cs:105:18:105:18 | 0 | Switch.cs:105:28:105:28 | 0 | semmle.label | match |
-| Switch.cs:105:18:105:18 | 0 | Switch.cs:106:13:106:19 | case ...: | semmle.label | no-match |
-| Switch.cs:105:21:105:29 | return ...; | Switch.cs:101:9:101:10 | exit M9 (normal) | semmle.label | return |
-| Switch.cs:105:28:105:28 | 0 | Switch.cs:105:21:105:29 | return ...; | semmle.label | successor |
-| Switch.cs:106:13:106:19 | case ...: | Switch.cs:106:18:106:18 | 1 | semmle.label | successor |
-| Switch.cs:106:18:106:18 | 1 | Switch.cs:106:28:106:28 | 1 | semmle.label | match |
-| Switch.cs:106:18:106:18 | 1 | Switch.cs:108:17:108:17 | 1 | semmle.label | no-match |
-| Switch.cs:106:21:106:29 | return ...; | Switch.cs:101:9:101:10 | exit M9 (normal) | semmle.label | return |
-| Switch.cs:106:28:106:28 | 1 | Switch.cs:106:21:106:29 | return ...; | semmle.label | successor |
-| Switch.cs:108:9:108:18 | return ...; | Switch.cs:101:9:101:10 | exit M9 (normal) | semmle.label | return |
-| Switch.cs:108:16:108:17 | -... | Switch.cs:108:9:108:18 | return ...; | semmle.label | successor |
-| Switch.cs:108:17:108:17 | 1 | Switch.cs:108:16:108:17 | -... | semmle.label | successor |
-| Switch.cs:111:17:111:21 | enter Throw | Switch.cs:111:34:111:48 | object creation of type Exception | semmle.label | successor |
-| Switch.cs:111:17:111:21 | exit Throw (abnormal) | Switch.cs:111:17:111:21 | exit Throw | semmle.label | successor |
-| Switch.cs:111:28:111:48 | throw ... | Switch.cs:111:17:111:21 | exit Throw (abnormal) | semmle.label | exception(Exception) |
-| Switch.cs:111:34:111:48 | object creation of type Exception | Switch.cs:111:28:111:48 | throw ... | semmle.label | successor |
-| Switch.cs:113:9:113:11 | enter M10 | Switch.cs:114:5:121:5 | {...} | semmle.label | successor |
-| Switch.cs:113:9:113:11 | exit M10 (normal) | Switch.cs:113:9:113:11 | exit M10 | semmle.label | successor |
-| Switch.cs:114:5:121:5 | {...} | Switch.cs:115:9:119:9 | switch (...) {...} | semmle.label | successor |
-| Switch.cs:115:9:119:9 | switch (...) {...} | Switch.cs:115:17:115:17 | access to parameter s | semmle.label | successor |
-| Switch.cs:115:17:115:17 | access to parameter s | Switch.cs:115:17:115:24 | access to property Length | semmle.label | successor |
-| Switch.cs:115:17:115:24 | access to property Length | Switch.cs:117:13:117:35 | case ...: | semmle.label | successor |
-| Switch.cs:117:13:117:35 | case ...: | Switch.cs:117:18:117:18 | 3 | semmle.label | successor |
-| Switch.cs:117:18:117:18 | 3 | Switch.cs:117:25:117:25 | access to parameter s | semmle.label | match |
-| Switch.cs:117:18:117:18 | 3 | Switch.cs:118:13:118:34 | case ...: | semmle.label | no-match |
-| Switch.cs:117:25:117:25 | access to parameter s | Switch.cs:117:30:117:34 | "foo" | semmle.label | successor |
-| Switch.cs:117:25:117:34 | ... == ... | Switch.cs:117:44:117:44 | 1 | semmle.label | true |
-| Switch.cs:117:25:117:34 | ... == ... | Switch.cs:118:13:118:34 | case ...: | semmle.label | false |
-| Switch.cs:117:30:117:34 | "foo" | Switch.cs:117:25:117:34 | ... == ... | semmle.label | successor |
-| Switch.cs:117:37:117:45 | return ...; | Switch.cs:113:9:113:11 | exit M10 (normal) | semmle.label | return |
-| Switch.cs:117:44:117:44 | 1 | Switch.cs:117:37:117:45 | return ...; | semmle.label | successor |
-| Switch.cs:118:13:118:34 | case ...: | Switch.cs:118:18:118:18 | 2 | semmle.label | successor |
-| Switch.cs:118:18:118:18 | 2 | Switch.cs:118:25:118:25 | access to parameter s | semmle.label | match |
-| Switch.cs:118:18:118:18 | 2 | Switch.cs:120:17:120:17 | 1 | semmle.label | no-match |
-| Switch.cs:118:25:118:25 | access to parameter s | Switch.cs:118:30:118:33 | "fu" | semmle.label | successor |
-| Switch.cs:118:25:118:33 | ... == ... | Switch.cs:118:43:118:43 | 2 | semmle.label | true |
-| Switch.cs:118:25:118:33 | ... == ... | Switch.cs:120:17:120:17 | 1 | semmle.label | false |
-| Switch.cs:118:30:118:33 | "fu" | Switch.cs:118:25:118:33 | ... == ... | semmle.label | successor |
-| Switch.cs:118:36:118:44 | return ...; | Switch.cs:113:9:113:11 | exit M10 (normal) | semmle.label | return |
-| Switch.cs:118:43:118:43 | 2 | Switch.cs:118:36:118:44 | return ...; | semmle.label | successor |
-| Switch.cs:120:9:120:18 | return ...; | Switch.cs:113:9:113:11 | exit M10 (normal) | semmle.label | return |
-| Switch.cs:120:16:120:17 | -... | Switch.cs:120:9:120:18 | return ...; | semmle.label | successor |
-| Switch.cs:120:17:120:17 | 1 | Switch.cs:120:16:120:17 | -... | semmle.label | successor |
-| Switch.cs:123:10:123:12 | enter M11 | Switch.cs:124:5:127:5 | {...} | semmle.label | successor |
-| Switch.cs:123:10:123:12 | exit M11 (normal) | Switch.cs:123:10:123:12 | exit M11 | semmle.label | successor |
-| Switch.cs:124:5:127:5 | {...} | Switch.cs:125:9:126:19 | if (...) ... | semmle.label | successor |
-| Switch.cs:125:9:126:19 | if (...) ... | Switch.cs:125:13:125:13 | access to parameter o | semmle.label | successor |
-| Switch.cs:125:13:125:13 | access to parameter o | Switch.cs:125:24:125:29 | Boolean b | semmle.label | successor |
-| Switch.cs:125:13:125:48 | [false] ... switch { ... } | Switch.cs:123:10:123:12 | exit M11 (normal) | semmle.label | false |
-| Switch.cs:125:13:125:48 | [true] ... switch { ... } | Switch.cs:126:13:126:19 | return ...; | semmle.label | true |
-| Switch.cs:125:24:125:29 | Boolean b | Switch.cs:125:34:125:34 | access to local variable b | semmle.label | match |
-| Switch.cs:125:24:125:29 | Boolean b | Switch.cs:125:37:125:37 | _ | semmle.label | no-match |
-| Switch.cs:125:24:125:34 | [false] ... => ... | Switch.cs:125:13:125:48 | [false] ... switch { ... } | semmle.label | false |
-| Switch.cs:125:24:125:34 | [true] ... => ... | Switch.cs:125:13:125:48 | [true] ... switch { ... } | semmle.label | true |
-| Switch.cs:125:34:125:34 | access to local variable b | Switch.cs:125:24:125:34 | [false] ... => ... | semmle.label | false |
-| Switch.cs:125:34:125:34 | access to local variable b | Switch.cs:125:24:125:34 | [true] ... => ... | semmle.label | true |
-| Switch.cs:125:37:125:37 | _ | Switch.cs:125:42:125:46 | false | semmle.label | match |
-| Switch.cs:125:37:125:46 | [false] ... => ... | Switch.cs:125:13:125:48 | [false] ... switch { ... } | semmle.label | false |
-| Switch.cs:125:42:125:46 | false | Switch.cs:125:37:125:46 | [false] ... => ... | semmle.label | false |
-| Switch.cs:126:13:126:19 | return ...; | Switch.cs:123:10:123:12 | exit M11 (normal) | semmle.label | return |
-| Switch.cs:129:12:129:14 | enter M12 | Switch.cs:130:5:132:5 | {...} | semmle.label | successor |
-| Switch.cs:129:12:129:14 | exit M12 (normal) | Switch.cs:129:12:129:14 | exit M12 | semmle.label | successor |
-| Switch.cs:130:5:132:5 | {...} | Switch.cs:131:17:131:17 | access to parameter o | semmle.label | successor |
-| Switch.cs:131:9:131:67 | return ...; | Switch.cs:129:12:129:14 | exit M12 (normal) | semmle.label | return |
-| Switch.cs:131:17:131:17 | access to parameter o | Switch.cs:131:28:131:35 | String s | semmle.label | successor |
-| Switch.cs:131:17:131:53 | [non-null] ... switch { ... } | Switch.cs:131:56:131:66 | call to method ToString | semmle.label | non-null |
-| Switch.cs:131:17:131:53 | [null] ... switch { ... } | Switch.cs:131:9:131:67 | return ...; | semmle.label | null |
-| Switch.cs:131:28:131:35 | String s | Switch.cs:131:40:131:40 | access to local variable s | semmle.label | match |
-| Switch.cs:131:28:131:35 | String s | Switch.cs:131:43:131:43 | _ | semmle.label | no-match |
-| Switch.cs:131:28:131:40 | [non-null] ... => ... | Switch.cs:131:17:131:53 | [non-null] ... switch { ... } | semmle.label | non-null |
-| Switch.cs:131:28:131:40 | [null] ... => ... | Switch.cs:131:17:131:53 | [null] ... switch { ... } | semmle.label | null |
-| Switch.cs:131:40:131:40 | access to local variable s | Switch.cs:131:28:131:40 | [non-null] ... => ... | semmle.label | non-null |
-| Switch.cs:131:40:131:40 | access to local variable s | Switch.cs:131:28:131:40 | [null] ... => ... | semmle.label | null |
-| Switch.cs:131:43:131:43 | _ | Switch.cs:131:48:131:51 | null | semmle.label | match |
-| Switch.cs:131:43:131:51 | [null] ... => ... | Switch.cs:131:17:131:53 | [null] ... switch { ... } | semmle.label | null |
-| Switch.cs:131:48:131:51 | null | Switch.cs:131:43:131:51 | [null] ... => ... | semmle.label | null |
-| Switch.cs:131:56:131:66 | call to method ToString | Switch.cs:131:9:131:67 | return ...; | semmle.label | successor |
-| Switch.cs:134:9:134:11 | enter M13 | Switch.cs:135:5:142:5 | {...} | semmle.label | successor |
-| Switch.cs:134:9:134:11 | exit M13 (normal) | Switch.cs:134:9:134:11 | exit M13 | semmle.label | successor |
-| Switch.cs:135:5:142:5 | {...} | Switch.cs:136:9:141:9 | switch (...) {...} | semmle.label | successor |
-| Switch.cs:136:9:141:9 | switch (...) {...} | Switch.cs:136:17:136:17 | access to parameter i | semmle.label | successor |
-| Switch.cs:136:17:136:17 | access to parameter i | Switch.cs:139:13:139:19 | case ...: | semmle.label | successor |
-| Switch.cs:138:13:138:20 | default: | Switch.cs:138:30:138:30 | 1 | semmle.label | successor |
-| Switch.cs:138:22:138:31 | return ...; | Switch.cs:134:9:134:11 | exit M13 (normal) | semmle.label | return |
-| Switch.cs:138:29:138:30 | -... | Switch.cs:138:22:138:31 | return ...; | semmle.label | successor |
-| Switch.cs:138:30:138:30 | 1 | Switch.cs:138:29:138:30 | -... | semmle.label | successor |
-| Switch.cs:139:13:139:19 | case ...: | Switch.cs:139:18:139:18 | 1 | semmle.label | successor |
-| Switch.cs:139:18:139:18 | 1 | Switch.cs:139:28:139:28 | 1 | semmle.label | match |
-| Switch.cs:139:18:139:18 | 1 | Switch.cs:140:13:140:19 | case ...: | semmle.label | no-match |
-| Switch.cs:139:21:139:29 | return ...; | Switch.cs:134:9:134:11 | exit M13 (normal) | semmle.label | return |
-| Switch.cs:139:28:139:28 | 1 | Switch.cs:139:21:139:29 | return ...; | semmle.label | successor |
-| Switch.cs:140:13:140:19 | case ...: | Switch.cs:140:18:140:18 | 2 | semmle.label | successor |
-| Switch.cs:140:18:140:18 | 2 | Switch.cs:138:13:138:20 | default: | semmle.label | no-match |
-| Switch.cs:140:18:140:18 | 2 | Switch.cs:140:28:140:28 | 2 | semmle.label | match |
-| Switch.cs:140:21:140:29 | return ...; | Switch.cs:134:9:134:11 | exit M13 (normal) | semmle.label | return |
-| Switch.cs:140:28:140:28 | 2 | Switch.cs:140:21:140:29 | return ...; | semmle.label | successor |
-| Switch.cs:144:9:144:11 | enter M14 | Switch.cs:145:5:152:5 | {...} | semmle.label | successor |
-| Switch.cs:144:9:144:11 | exit M14 (normal) | Switch.cs:144:9:144:11 | exit M14 | semmle.label | successor |
-| Switch.cs:145:5:152:5 | {...} | Switch.cs:146:9:151:9 | switch (...) {...} | semmle.label | successor |
-| Switch.cs:146:9:151:9 | switch (...) {...} | Switch.cs:146:17:146:17 | access to parameter i | semmle.label | successor |
-| Switch.cs:146:17:146:17 | access to parameter i | Switch.cs:148:13:148:19 | case ...: | semmle.label | successor |
-| Switch.cs:148:13:148:19 | case ...: | Switch.cs:148:18:148:18 | 1 | semmle.label | successor |
-| Switch.cs:148:18:148:18 | 1 | Switch.cs:148:28:148:28 | 1 | semmle.label | match |
-| Switch.cs:148:18:148:18 | 1 | Switch.cs:150:13:150:19 | case ...: | semmle.label | no-match |
-| Switch.cs:148:21:148:29 | return ...; | Switch.cs:144:9:144:11 | exit M14 (normal) | semmle.label | return |
-| Switch.cs:148:28:148:28 | 1 | Switch.cs:148:21:148:29 | return ...; | semmle.label | successor |
-| Switch.cs:149:13:149:20 | default: | Switch.cs:149:30:149:30 | 1 | semmle.label | successor |
-| Switch.cs:149:22:149:31 | return ...; | Switch.cs:144:9:144:11 | exit M14 (normal) | semmle.label | return |
-| Switch.cs:149:29:149:30 | -... | Switch.cs:149:22:149:31 | return ...; | semmle.label | successor |
-| Switch.cs:149:30:149:30 | 1 | Switch.cs:149:29:149:30 | -... | semmle.label | successor |
-| Switch.cs:150:13:150:19 | case ...: | Switch.cs:150:18:150:18 | 2 | semmle.label | successor |
-| Switch.cs:150:18:150:18 | 2 | Switch.cs:149:13:149:20 | default: | semmle.label | no-match |
-| Switch.cs:150:18:150:18 | 2 | Switch.cs:150:28:150:28 | 2 | semmle.label | match |
-| Switch.cs:150:21:150:29 | return ...; | Switch.cs:144:9:144:11 | exit M14 (normal) | semmle.label | return |
-| Switch.cs:150:28:150:28 | 2 | Switch.cs:150:21:150:29 | return ...; | semmle.label | successor |
-| Switch.cs:154:10:154:12 | enter M15 | Switch.cs:155:5:161:5 | {...} | semmle.label | successor |
-| Switch.cs:154:10:154:12 | exit M15 (abnormal) | Switch.cs:154:10:154:12 | exit M15 | semmle.label | successor |
-| Switch.cs:154:10:154:12 | exit M15 (normal) | Switch.cs:154:10:154:12 | exit M15 | semmle.label | successor |
-| Switch.cs:155:5:161:5 | {...} | Switch.cs:156:9:156:55 | ... ...; | semmle.label | successor |
-| Switch.cs:156:9:156:55 | ... ...; | Switch.cs:156:17:156:17 | access to parameter b | semmle.label | successor |
-| Switch.cs:156:13:156:54 | String s = ... | Switch.cs:157:9:160:49 | if (...) ... | semmle.label | successor |
-| Switch.cs:156:17:156:17 | access to parameter b | Switch.cs:156:28:156:31 | true | semmle.label | successor |
-| Switch.cs:156:17:156:54 | ... switch { ... } | Switch.cs:156:13:156:54 | String s = ... | semmle.label | successor |
-| Switch.cs:156:28:156:31 | true | Switch.cs:156:36:156:38 | "a" | semmle.label | match |
-| Switch.cs:156:28:156:31 | true | Switch.cs:156:41:156:45 | false | semmle.label | no-match |
-| Switch.cs:156:28:156:38 | ... => ... | Switch.cs:156:17:156:54 | ... switch { ... } | semmle.label | successor |
-| Switch.cs:156:36:156:38 | "a" | Switch.cs:156:28:156:38 | ... => ... | semmle.label | successor |
-| Switch.cs:156:41:156:45 | false | Switch.cs:154:10:154:12 | exit M15 (abnormal) | semmle.label | exception(InvalidOperationException) |
-| Switch.cs:156:41:156:45 | false | Switch.cs:156:50:156:52 | "b" | semmle.label | match |
-| Switch.cs:156:41:156:52 | ... => ... | Switch.cs:156:17:156:54 | ... switch { ... } | semmle.label | successor |
-| Switch.cs:156:50:156:52 | "b" | Switch.cs:156:41:156:52 | ... => ... | semmle.label | successor |
-| Switch.cs:157:9:160:49 | if (...) ... | Switch.cs:157:13:157:13 | access to parameter b | semmle.label | successor |
-| Switch.cs:157:13:157:13 | access to parameter b | Switch.cs:158:13:158:49 | ...; | semmle.label | true |
-| Switch.cs:157:13:157:13 | access to parameter b | Switch.cs:160:13:160:49 | ...; | semmle.label | false |
-| Switch.cs:158:13:158:48 | call to method WriteLine | Switch.cs:154:10:154:12 | exit M15 (normal) | semmle.label | successor |
-| Switch.cs:158:13:158:49 | ...; | Switch.cs:158:40:158:43 | "a = " | semmle.label | successor |
-| Switch.cs:158:38:158:47 | $"..." | Switch.cs:158:13:158:48 | call to method WriteLine | semmle.label | successor |
-| Switch.cs:158:40:158:43 | "a = " | Switch.cs:158:45:158:45 | access to local variable s | semmle.label | successor |
-| Switch.cs:158:45:158:45 | access to local variable s | Switch.cs:158:38:158:47 | $"..." | semmle.label | successor |
-| Switch.cs:160:13:160:48 | call to method WriteLine | Switch.cs:154:10:154:12 | exit M15 (normal) | semmle.label | successor |
-| Switch.cs:160:13:160:49 | ...; | Switch.cs:160:40:160:43 | "b = " | semmle.label | successor |
-| Switch.cs:160:38:160:47 | $"..." | Switch.cs:160:13:160:48 | call to method WriteLine | semmle.label | successor |
-| Switch.cs:160:40:160:43 | "b = " | Switch.cs:160:45:160:45 | access to local variable s | semmle.label | successor |
-| Switch.cs:160:45:160:45 | access to local variable s | Switch.cs:160:38:160:47 | $"..." | semmle.label | successor |
-| TypeAccesses.cs:3:10:3:10 | enter M | TypeAccesses.cs:4:5:9:5 | {...} | semmle.label | successor |
-| TypeAccesses.cs:3:10:3:10 | exit M (normal) | TypeAccesses.cs:3:10:3:10 | exit M | semmle.label | successor |
-| TypeAccesses.cs:4:5:9:5 | {...} | TypeAccesses.cs:5:9:5:26 | ... ...; | semmle.label | successor |
-| TypeAccesses.cs:5:9:5:26 | ... ...; | TypeAccesses.cs:5:25:5:25 | access to parameter o | semmle.label | successor |
-| TypeAccesses.cs:5:13:5:25 | String s = ... | TypeAccesses.cs:6:9:6:24 | ...; | semmle.label | successor |
-| TypeAccesses.cs:5:17:5:25 | (...) ... | TypeAccesses.cs:5:13:5:25 | String s = ... | semmle.label | successor |
-| TypeAccesses.cs:5:25:5:25 | access to parameter o | TypeAccesses.cs:5:17:5:25 | (...) ... | semmle.label | successor |
-| TypeAccesses.cs:6:9:6:23 | ... = ... | TypeAccesses.cs:7:9:7:25 | if (...) ... | semmle.label | successor |
-| TypeAccesses.cs:6:9:6:24 | ...; | TypeAccesses.cs:6:13:6:13 | access to parameter o | semmle.label | successor |
-| TypeAccesses.cs:6:13:6:13 | access to parameter o | TypeAccesses.cs:6:13:6:23 | ... as ... | semmle.label | successor |
-| TypeAccesses.cs:6:13:6:23 | ... as ... | TypeAccesses.cs:6:9:6:23 | ... = ... | semmle.label | successor |
-| TypeAccesses.cs:7:9:7:25 | if (...) ... | TypeAccesses.cs:7:13:7:13 | access to parameter o | semmle.label | successor |
-| TypeAccesses.cs:7:13:7:13 | access to parameter o | TypeAccesses.cs:7:18:7:22 | Int32 j | semmle.label | successor |
-| TypeAccesses.cs:7:13:7:22 | [false] ... is ... | TypeAccesses.cs:8:9:8:28 | ... ...; | semmle.label | false |
-| TypeAccesses.cs:7:13:7:22 | [true] ... is ... | TypeAccesses.cs:7:25:7:25 | ; | semmle.label | true |
-| TypeAccesses.cs:7:18:7:22 | Int32 j | TypeAccesses.cs:7:13:7:22 | [false] ... is ... | semmle.label | no-match |
-| TypeAccesses.cs:7:18:7:22 | Int32 j | TypeAccesses.cs:7:13:7:22 | [true] ... is ... | semmle.label | match |
-| TypeAccesses.cs:7:25:7:25 | ; | TypeAccesses.cs:8:9:8:28 | ... ...; | semmle.label | successor |
-| TypeAccesses.cs:8:9:8:28 | ... ...; | TypeAccesses.cs:8:17:8:27 | typeof(...) | semmle.label | successor |
-| TypeAccesses.cs:8:13:8:27 | Type t = ... | TypeAccesses.cs:3:10:3:10 | exit M (normal) | semmle.label | successor |
-| TypeAccesses.cs:8:17:8:27 | typeof(...) | TypeAccesses.cs:8:13:8:27 | Type t = ... | semmle.label | successor |
-| VarDecls.cs:5:18:5:19 | enter M1 | VarDecls.cs:6:5:11:5 | {...} | semmle.label | successor |
-| VarDecls.cs:5:18:5:19 | exit M1 (normal) | VarDecls.cs:5:18:5:19 | exit M1 | semmle.label | successor |
-| VarDecls.cs:6:5:11:5 | {...} | VarDecls.cs:7:9:10:9 | fixed(...) { ... } | semmle.label | successor |
-| VarDecls.cs:7:9:10:9 | fixed(...) { ... } | VarDecls.cs:7:27:7:33 | access to parameter strings | semmle.label | successor |
-| VarDecls.cs:7:22:7:36 | Char* c1 = ... | VarDecls.cs:7:44:7:50 | access to parameter strings | semmle.label | successor |
-| VarDecls.cs:7:27:7:33 | access to parameter strings | VarDecls.cs:7:35:7:35 | 0 | semmle.label | successor |
-| VarDecls.cs:7:27:7:36 | (...) ... | VarDecls.cs:7:22:7:36 | Char* c1 = ... | semmle.label | successor |
-| VarDecls.cs:7:27:7:36 | access to array element | VarDecls.cs:7:27:7:36 | (...) ... | semmle.label | successor |
-| VarDecls.cs:7:35:7:35 | 0 | VarDecls.cs:7:27:7:36 | access to array element | semmle.label | successor |
-| VarDecls.cs:7:39:7:53 | Char* c2 = ... | VarDecls.cs:8:9:10:9 | {...} | semmle.label | successor |
-| VarDecls.cs:7:44:7:50 | access to parameter strings | VarDecls.cs:7:52:7:52 | 1 | semmle.label | successor |
-| VarDecls.cs:7:44:7:53 | (...) ... | VarDecls.cs:7:39:7:53 | Char* c2 = ... | semmle.label | successor |
-| VarDecls.cs:7:44:7:53 | access to array element | VarDecls.cs:7:44:7:53 | (...) ... | semmle.label | successor |
-| VarDecls.cs:7:52:7:52 | 1 | VarDecls.cs:7:44:7:53 | access to array element | semmle.label | successor |
-| VarDecls.cs:8:9:10:9 | {...} | VarDecls.cs:9:27:9:28 | access to local variable c1 | semmle.label | successor |
-| VarDecls.cs:9:13:9:29 | return ...; | VarDecls.cs:5:18:5:19 | exit M1 (normal) | semmle.label | return |
-| VarDecls.cs:9:20:9:28 | (...) ... | VarDecls.cs:9:13:9:29 | return ...; | semmle.label | successor |
-| VarDecls.cs:9:27:9:28 | access to local variable c1 | VarDecls.cs:9:20:9:28 | (...) ... | semmle.label | successor |
-| VarDecls.cs:13:12:13:13 | enter M2 | VarDecls.cs:14:5:17:5 | {...} | semmle.label | successor |
-| VarDecls.cs:13:12:13:13 | exit M2 (normal) | VarDecls.cs:13:12:13:13 | exit M2 | semmle.label | successor |
-| VarDecls.cs:14:5:17:5 | {...} | VarDecls.cs:15:9:15:30 | ... ...; | semmle.label | successor |
-| VarDecls.cs:15:9:15:30 | ... ...; | VarDecls.cs:15:21:15:21 | access to parameter s | semmle.label | successor |
-| VarDecls.cs:15:16:15:21 | String s1 = ... | VarDecls.cs:15:29:15:29 | access to parameter s | semmle.label | successor |
-| VarDecls.cs:15:21:15:21 | access to parameter s | VarDecls.cs:15:16:15:21 | String s1 = ... | semmle.label | successor |
-| VarDecls.cs:15:24:15:29 | String s2 = ... | VarDecls.cs:16:16:16:17 | access to local variable s1 | semmle.label | successor |
-| VarDecls.cs:15:29:15:29 | access to parameter s | VarDecls.cs:15:24:15:29 | String s2 = ... | semmle.label | successor |
-| VarDecls.cs:16:9:16:23 | return ...; | VarDecls.cs:13:12:13:13 | exit M2 (normal) | semmle.label | return |
-| VarDecls.cs:16:16:16:17 | access to local variable s1 | VarDecls.cs:16:21:16:22 | access to local variable s2 | semmle.label | successor |
-| VarDecls.cs:16:16:16:22 | ... + ... | VarDecls.cs:16:9:16:23 | return ...; | semmle.label | successor |
-| VarDecls.cs:16:21:16:22 | access to local variable s2 | VarDecls.cs:16:16:16:22 | ... + ... | semmle.label | successor |
-| VarDecls.cs:19:7:19:8 | enter M3 | VarDecls.cs:20:5:26:5 | {...} | semmle.label | successor |
-| VarDecls.cs:19:7:19:8 | exit M3 (normal) | VarDecls.cs:19:7:19:8 | exit M3 | semmle.label | successor |
-| VarDecls.cs:20:5:26:5 | {...} | VarDecls.cs:21:9:22:13 | using (...) {...} | semmle.label | successor |
-| VarDecls.cs:21:9:22:13 | using (...) {...} | VarDecls.cs:21:16:21:22 | object creation of type C | semmle.label | successor |
-| VarDecls.cs:21:16:21:22 | object creation of type C | VarDecls.cs:22:13:22:13 | ; | semmle.label | successor |
-| VarDecls.cs:22:13:22:13 | ; | VarDecls.cs:24:9:25:29 | using (...) {...} | semmle.label | successor |
-| VarDecls.cs:24:9:25:29 | using (...) {...} | VarDecls.cs:24:22:24:28 | object creation of type C | semmle.label | successor |
-| VarDecls.cs:24:18:24:28 | C x = ... | VarDecls.cs:24:35:24:41 | object creation of type C | semmle.label | successor |
-| VarDecls.cs:24:22:24:28 | object creation of type C | VarDecls.cs:24:18:24:28 | C x = ... | semmle.label | successor |
-| VarDecls.cs:24:31:24:41 | C y = ... | VarDecls.cs:25:20:25:20 | access to parameter b | semmle.label | successor |
-| VarDecls.cs:24:35:24:41 | object creation of type C | VarDecls.cs:24:31:24:41 | C y = ... | semmle.label | successor |
-| VarDecls.cs:25:13:25:29 | return ...; | VarDecls.cs:19:7:19:8 | exit M3 (normal) | semmle.label | return |
-| VarDecls.cs:25:20:25:20 | access to parameter b | VarDecls.cs:25:24:25:24 | access to local variable x | semmle.label | true |
-| VarDecls.cs:25:20:25:20 | access to parameter b | VarDecls.cs:25:28:25:28 | access to local variable y | semmle.label | false |
-| VarDecls.cs:25:20:25:28 | ... ? ... : ... | VarDecls.cs:25:13:25:29 | return ...; | semmle.label | successor |
-| VarDecls.cs:25:24:25:24 | access to local variable x | VarDecls.cs:25:20:25:28 | ... ? ... : ... | semmle.label | successor |
-| VarDecls.cs:25:28:25:28 | access to local variable y | VarDecls.cs:25:20:25:28 | ... ? ... : ... | semmle.label | successor |
-| VarDecls.cs:28:41:28:47 | enter Dispose | VarDecls.cs:28:51:28:53 | {...} | semmle.label | successor |
-| VarDecls.cs:28:41:28:47 | exit Dispose (normal) | VarDecls.cs:28:41:28:47 | exit Dispose | semmle.label | successor |
-| VarDecls.cs:28:51:28:53 | {...} | VarDecls.cs:28:41:28:47 | exit Dispose (normal) | semmle.label | successor |
-| cflow.cs:5:17:5:20 | enter Main | cflow.cs:6:5:35:5 | {...} | semmle.label | successor |
-| cflow.cs:5:17:5:20 | exit Main (normal) | cflow.cs:5:17:5:20 | exit Main | semmle.label | successor |
-| cflow.cs:6:5:35:5 | {...} | cflow.cs:7:9:7:28 | ... ...; | semmle.label | successor |
-| cflow.cs:7:9:7:28 | ... ...; | cflow.cs:7:17:7:20 | access to parameter args | semmle.label | successor |
-| cflow.cs:7:13:7:27 | Int32 a = ... | cflow.cs:9:9:9:40 | ...; | semmle.label | successor |
-| cflow.cs:7:17:7:20 | access to parameter args | cflow.cs:7:17:7:27 | access to property Length | semmle.label | successor |
-| cflow.cs:7:17:7:27 | access to property Length | cflow.cs:7:13:7:27 | Int32 a = ... | semmle.label | successor |
-| cflow.cs:9:9:9:39 | ... = ... | cflow.cs:11:9:12:49 | if (...) ... | semmle.label | successor |
-| cflow.cs:9:9:9:40 | ...; | cflow.cs:9:13:9:29 | object creation of type ControlFlow | semmle.label | successor |
-| cflow.cs:9:13:9:29 | object creation of type ControlFlow | cflow.cs:9:38:9:38 | access to local variable a | semmle.label | successor |
-| cflow.cs:9:13:9:39 | call to method Switch | cflow.cs:9:9:9:39 | ... = ... | semmle.label | successor |
-| cflow.cs:9:38:9:38 | access to local variable a | cflow.cs:9:13:9:39 | call to method Switch | semmle.label | successor |
-| cflow.cs:11:9:12:49 | if (...) ... | cflow.cs:11:13:11:13 | access to local variable a | semmle.label | successor |
-| cflow.cs:11:13:11:13 | access to local variable a | cflow.cs:11:17:11:17 | 3 | semmle.label | successor |
-| cflow.cs:11:13:11:17 | ... > ... | cflow.cs:12:13:12:49 | ...; | semmle.label | true |
-| cflow.cs:11:13:11:17 | ... > ... | cflow.cs:14:9:17:9 | while (...) ... | semmle.label | false |
-| cflow.cs:11:17:11:17 | 3 | cflow.cs:11:13:11:17 | ... > ... | semmle.label | successor |
-| cflow.cs:12:13:12:48 | call to method WriteLine | cflow.cs:14:9:17:9 | while (...) ... | semmle.label | successor |
-| cflow.cs:12:13:12:49 | ...; | cflow.cs:12:31:12:47 | "more than a few" | semmle.label | successor |
-| cflow.cs:12:31:12:47 | "more than a few" | cflow.cs:12:13:12:48 | call to method WriteLine | semmle.label | successor |
-| cflow.cs:14:9:17:9 | while (...) ... | cflow.cs:14:16:14:16 | access to local variable a | semmle.label | successor |
-| cflow.cs:14:16:14:16 | access to local variable a | cflow.cs:14:20:14:20 | 0 | semmle.label | successor |
-| cflow.cs:14:16:14:20 | ... > ... | cflow.cs:15:9:17:9 | {...} | semmle.label | true |
-| cflow.cs:14:16:14:20 | ... > ... | cflow.cs:19:9:22:25 | do ... while (...); | semmle.label | false |
-| cflow.cs:14:20:14:20 | 0 | cflow.cs:14:16:14:20 | ... > ... | semmle.label | successor |
-| cflow.cs:15:9:17:9 | {...} | cflow.cs:16:13:16:41 | ...; | semmle.label | successor |
-| cflow.cs:16:13:16:40 | call to method WriteLine | cflow.cs:14:16:14:16 | access to local variable a | semmle.label | successor |
-| cflow.cs:16:13:16:41 | ...; | cflow.cs:16:31:16:31 | access to local variable a | semmle.label | successor |
-| cflow.cs:16:31:16:31 | access to local variable a | cflow.cs:16:31:16:33 | ...-- | semmle.label | successor |
-| cflow.cs:16:31:16:33 | ...-- | cflow.cs:16:37:16:39 | 100 | semmle.label | successor |
-| cflow.cs:16:31:16:39 | ... * ... | cflow.cs:16:13:16:40 | call to method WriteLine | semmle.label | successor |
-| cflow.cs:16:37:16:39 | 100 | cflow.cs:16:31:16:39 | ... * ... | semmle.label | successor |
-| cflow.cs:19:9:22:25 | do ... while (...); | cflow.cs:20:9:22:9 | {...} | semmle.label | successor |
-| cflow.cs:20:9:22:9 | {...} | cflow.cs:21:13:21:36 | ...; | semmle.label | successor |
-| cflow.cs:21:13:21:35 | call to method WriteLine | cflow.cs:22:18:22:18 | access to local variable a | semmle.label | successor |
-| cflow.cs:21:13:21:36 | ...; | cflow.cs:21:32:21:32 | access to local variable a | semmle.label | successor |
-| cflow.cs:21:31:21:34 | -... | cflow.cs:21:13:21:35 | call to method WriteLine | semmle.label | successor |
-| cflow.cs:21:32:21:32 | access to local variable a | cflow.cs:21:32:21:34 | ...++ | semmle.label | successor |
-| cflow.cs:21:32:21:34 | ...++ | cflow.cs:21:31:21:34 | -... | semmle.label | successor |
-| cflow.cs:22:18:22:18 | access to local variable a | cflow.cs:22:22:22:23 | 10 | semmle.label | successor |
-| cflow.cs:22:18:22:23 | ... < ... | cflow.cs:20:9:22:9 | {...} | semmle.label | true |
-| cflow.cs:22:18:22:23 | ... < ... | cflow.cs:24:9:34:9 | for (...;...;...) ... | semmle.label | false |
-| cflow.cs:22:22:22:23 | 10 | cflow.cs:22:18:22:23 | ... < ... | semmle.label | successor |
-| cflow.cs:24:9:34:9 | for (...;...;...) ... | cflow.cs:24:22:24:22 | 1 | semmle.label | successor |
-| cflow.cs:24:18:24:22 | Int32 i = ... | cflow.cs:24:25:24:25 | access to local variable i | semmle.label | successor |
-| cflow.cs:24:22:24:22 | 1 | cflow.cs:24:18:24:22 | Int32 i = ... | semmle.label | successor |
-| cflow.cs:24:25:24:25 | access to local variable i | cflow.cs:24:30:24:31 | 20 | semmle.label | successor |
-| cflow.cs:24:25:24:31 | ... <= ... | cflow.cs:5:17:5:20 | exit Main (normal) | semmle.label | false |
-| cflow.cs:24:25:24:31 | ... <= ... | cflow.cs:25:9:34:9 | {...} | semmle.label | true |
-| cflow.cs:24:30:24:31 | 20 | cflow.cs:24:25:24:31 | ... <= ... | semmle.label | successor |
-| cflow.cs:24:34:24:34 | access to local variable i | cflow.cs:24:34:24:36 | ...++ | semmle.label | successor |
-| cflow.cs:24:34:24:36 | ...++ | cflow.cs:24:25:24:25 | access to local variable i | semmle.label | successor |
-| cflow.cs:25:9:34:9 | {...} | cflow.cs:26:13:33:37 | if (...) ... | semmle.label | successor |
-| cflow.cs:26:13:33:37 | if (...) ... | cflow.cs:26:17:26:17 | access to local variable i | semmle.label | successor |
-| cflow.cs:26:17:26:17 | access to local variable i | cflow.cs:26:21:26:21 | 3 | semmle.label | successor |
-| cflow.cs:26:17:26:21 | ... % ... | cflow.cs:26:26:26:26 | 0 | semmle.label | successor |
-| cflow.cs:26:17:26:26 | ... == ... | cflow.cs:26:17:26:40 | [false] ... && ... | semmle.label | false |
-| cflow.cs:26:17:26:26 | ... == ... | cflow.cs:26:31:26:31 | access to local variable i | semmle.label | true |
-| cflow.cs:26:17:26:40 | [false] ... && ... | cflow.cs:28:18:33:37 | if (...) ... | semmle.label | false |
-| cflow.cs:26:17:26:40 | [true] ... && ... | cflow.cs:27:17:27:46 | ...; | semmle.label | true |
-| cflow.cs:26:21:26:21 | 3 | cflow.cs:26:17:26:21 | ... % ... | semmle.label | successor |
-| cflow.cs:26:26:26:26 | 0 | cflow.cs:26:17:26:26 | ... == ... | semmle.label | successor |
-| cflow.cs:26:31:26:31 | access to local variable i | cflow.cs:26:35:26:35 | 5 | semmle.label | successor |
-| cflow.cs:26:31:26:35 | ... % ... | cflow.cs:26:40:26:40 | 0 | semmle.label | successor |
-| cflow.cs:26:31:26:40 | ... == ... | cflow.cs:26:17:26:40 | [false] ... && ... | semmle.label | false |
-| cflow.cs:26:31:26:40 | ... == ... | cflow.cs:26:17:26:40 | [true] ... && ... | semmle.label | true |
-| cflow.cs:26:35:26:35 | 5 | cflow.cs:26:31:26:35 | ... % ... | semmle.label | successor |
-| cflow.cs:26:40:26:40 | 0 | cflow.cs:26:31:26:40 | ... == ... | semmle.label | successor |
-| cflow.cs:27:17:27:45 | call to method WriteLine | cflow.cs:24:34:24:34 | access to local variable i | semmle.label | successor |
-| cflow.cs:27:17:27:46 | ...; | cflow.cs:27:35:27:44 | "FizzBuzz" | semmle.label | successor |
-| cflow.cs:27:35:27:44 | "FizzBuzz" | cflow.cs:27:17:27:45 | call to method WriteLine | semmle.label | successor |
-| cflow.cs:28:18:33:37 | if (...) ... | cflow.cs:28:22:28:22 | access to local variable i | semmle.label | successor |
-| cflow.cs:28:22:28:22 | access to local variable i | cflow.cs:28:26:28:26 | 3 | semmle.label | successor |
-| cflow.cs:28:22:28:26 | ... % ... | cflow.cs:28:31:28:31 | 0 | semmle.label | successor |
-| cflow.cs:28:22:28:31 | ... == ... | cflow.cs:29:17:29:42 | ...; | semmle.label | true |
-| cflow.cs:28:22:28:31 | ... == ... | cflow.cs:30:18:33:37 | if (...) ... | semmle.label | false |
-| cflow.cs:28:26:28:26 | 3 | cflow.cs:28:22:28:26 | ... % ... | semmle.label | successor |
-| cflow.cs:28:31:28:31 | 0 | cflow.cs:28:22:28:31 | ... == ... | semmle.label | successor |
-| cflow.cs:29:17:29:41 | call to method WriteLine | cflow.cs:24:34:24:34 | access to local variable i | semmle.label | successor |
-| cflow.cs:29:17:29:42 | ...; | cflow.cs:29:35:29:40 | "Fizz" | semmle.label | successor |
-| cflow.cs:29:35:29:40 | "Fizz" | cflow.cs:29:17:29:41 | call to method WriteLine | semmle.label | successor |
-| cflow.cs:30:18:33:37 | if (...) ... | cflow.cs:30:22:30:22 | access to local variable i | semmle.label | successor |
-| cflow.cs:30:22:30:22 | access to local variable i | cflow.cs:30:26:30:26 | 5 | semmle.label | successor |
-| cflow.cs:30:22:30:26 | ... % ... | cflow.cs:30:31:30:31 | 0 | semmle.label | successor |
-| cflow.cs:30:22:30:31 | ... == ... | cflow.cs:31:17:31:42 | ...; | semmle.label | true |
-| cflow.cs:30:22:30:31 | ... == ... | cflow.cs:33:17:33:37 | ...; | semmle.label | false |
-| cflow.cs:30:26:30:26 | 5 | cflow.cs:30:22:30:26 | ... % ... | semmle.label | successor |
-| cflow.cs:30:31:30:31 | 0 | cflow.cs:30:22:30:31 | ... == ... | semmle.label | successor |
-| cflow.cs:31:17:31:41 | call to method WriteLine | cflow.cs:24:34:24:34 | access to local variable i | semmle.label | successor |
-| cflow.cs:31:17:31:42 | ...; | cflow.cs:31:35:31:40 | "Buzz" | semmle.label | successor |
-| cflow.cs:31:35:31:40 | "Buzz" | cflow.cs:31:17:31:41 | call to method WriteLine | semmle.label | successor |
-| cflow.cs:33:17:33:36 | call to method WriteLine | cflow.cs:24:34:24:34 | access to local variable i | semmle.label | successor |
-| cflow.cs:33:17:33:37 | ...; | cflow.cs:33:35:33:35 | access to local variable i | semmle.label | successor |
-| cflow.cs:33:35:33:35 | access to local variable i | cflow.cs:33:17:33:36 | call to method WriteLine | semmle.label | successor |
-| cflow.cs:37:17:37:22 | enter Switch | cflow.cs:38:5:68:5 | {...} | semmle.label | successor |
-| cflow.cs:37:17:37:22 | exit Switch (abnormal) | cflow.cs:37:17:37:22 | exit Switch | semmle.label | successor |
-| cflow.cs:37:17:37:22 | exit Switch (normal) | cflow.cs:37:17:37:22 | exit Switch | semmle.label | successor |
-| cflow.cs:38:5:68:5 | {...} | cflow.cs:39:9:50:9 | switch (...) {...} | semmle.label | successor |
-| cflow.cs:39:9:50:9 | switch (...) {...} | cflow.cs:39:17:39:17 | access to parameter a | semmle.label | successor |
-| cflow.cs:39:17:39:17 | access to parameter a | cflow.cs:41:13:41:19 | case ...: | semmle.label | successor |
-| cflow.cs:41:13:41:19 | case ...: | cflow.cs:41:18:41:18 | 1 | semmle.label | successor |
-| cflow.cs:41:18:41:18 | 1 | cflow.cs:42:17:42:39 | ...; | semmle.label | match |
-| cflow.cs:41:18:41:18 | 1 | cflow.cs:44:13:44:19 | case ...: | semmle.label | no-match |
-| cflow.cs:42:17:42:38 | call to method WriteLine | cflow.cs:43:27:43:27 | 2 | semmle.label | successor |
-| cflow.cs:42:17:42:39 | ...; | cflow.cs:42:35:42:37 | "1" | semmle.label | successor |
-| cflow.cs:42:35:42:37 | "1" | cflow.cs:42:17:42:38 | call to method WriteLine | semmle.label | successor |
-| cflow.cs:43:17:43:28 | goto case ...; | cflow.cs:44:13:44:19 | case ...: | semmle.label | goto(2) |
-| cflow.cs:43:27:43:27 | 2 | cflow.cs:43:17:43:28 | goto case ...; | semmle.label | successor |
-| cflow.cs:44:13:44:19 | case ...: | cflow.cs:44:18:44:18 | 2 | semmle.label | successor |
-| cflow.cs:44:18:44:18 | 2 | cflow.cs:45:17:45:39 | ...; | semmle.label | match |
-| cflow.cs:44:18:44:18 | 2 | cflow.cs:47:13:47:19 | case ...: | semmle.label | no-match |
-| cflow.cs:45:17:45:38 | call to method WriteLine | cflow.cs:46:27:46:27 | 1 | semmle.label | successor |
-| cflow.cs:45:17:45:39 | ...; | cflow.cs:45:35:45:37 | "2" | semmle.label | successor |
-| cflow.cs:45:35:45:37 | "2" | cflow.cs:45:17:45:38 | call to method WriteLine | semmle.label | successor |
-| cflow.cs:46:17:46:28 | goto case ...; | cflow.cs:41:13:41:19 | case ...: | semmle.label | goto(1) |
-| cflow.cs:46:27:46:27 | 1 | cflow.cs:46:17:46:28 | goto case ...; | semmle.label | successor |
-| cflow.cs:47:13:47:19 | case ...: | cflow.cs:47:18:47:18 | 3 | semmle.label | successor |
-| cflow.cs:47:18:47:18 | 3 | cflow.cs:48:17:48:39 | ...; | semmle.label | match |
-| cflow.cs:47:18:47:18 | 3 | cflow.cs:51:9:59:9 | switch (...) {...} | semmle.label | no-match |
-| cflow.cs:48:17:48:38 | call to method WriteLine | cflow.cs:49:17:49:22 | break; | semmle.label | successor |
-| cflow.cs:48:17:48:39 | ...; | cflow.cs:48:35:48:37 | "3" | semmle.label | successor |
-| cflow.cs:48:35:48:37 | "3" | cflow.cs:48:17:48:38 | call to method WriteLine | semmle.label | successor |
-| cflow.cs:49:17:49:22 | break; | cflow.cs:51:9:59:9 | switch (...) {...} | semmle.label | break |
-| cflow.cs:51:9:59:9 | switch (...) {...} | cflow.cs:51:17:51:17 | access to parameter a | semmle.label | successor |
-| cflow.cs:51:17:51:17 | access to parameter a | cflow.cs:53:13:53:20 | case ...: | semmle.label | successor |
-| cflow.cs:53:13:53:20 | case ...: | cflow.cs:53:18:53:19 | 42 | semmle.label | successor |
-| cflow.cs:53:18:53:19 | 42 | cflow.cs:54:17:54:48 | ...; | semmle.label | match |
-| cflow.cs:53:18:53:19 | 42 | cflow.cs:56:13:56:20 | default: | semmle.label | no-match |
-| cflow.cs:54:17:54:47 | call to method WriteLine | cflow.cs:55:17:55:22 | break; | semmle.label | successor |
-| cflow.cs:54:17:54:48 | ...; | cflow.cs:54:35:54:46 | "The answer" | semmle.label | successor |
-| cflow.cs:54:35:54:46 | "The answer" | cflow.cs:54:17:54:47 | call to method WriteLine | semmle.label | successor |
-| cflow.cs:55:17:55:22 | break; | cflow.cs:60:9:66:9 | switch (...) {...} | semmle.label | break |
-| cflow.cs:56:13:56:20 | default: | cflow.cs:57:17:57:52 | ...; | semmle.label | successor |
-| cflow.cs:57:17:57:51 | call to method WriteLine | cflow.cs:58:17:58:22 | break; | semmle.label | successor |
-| cflow.cs:57:17:57:52 | ...; | cflow.cs:57:35:57:50 | "Not the answer" | semmle.label | successor |
-| cflow.cs:57:35:57:50 | "Not the answer" | cflow.cs:57:17:57:51 | call to method WriteLine | semmle.label | successor |
-| cflow.cs:58:17:58:22 | break; | cflow.cs:60:9:66:9 | switch (...) {...} | semmle.label | break |
-| cflow.cs:60:9:66:9 | switch (...) {...} | cflow.cs:60:27:60:31 | this access | semmle.label | successor |
-| cflow.cs:60:17:60:32 | call to method Parse | cflow.cs:62:13:62:19 | case ...: | semmle.label | successor |
-| cflow.cs:60:27:60:31 | access to field Field | cflow.cs:60:17:60:32 | call to method Parse | semmle.label | successor |
-| cflow.cs:60:27:60:31 | this access | cflow.cs:60:27:60:31 | access to field Field | semmle.label | successor |
-| cflow.cs:62:13:62:19 | case ...: | cflow.cs:62:18:62:18 | 0 | semmle.label | successor |
-| cflow.cs:62:18:62:18 | 0 | cflow.cs:63:17:64:55 | if (...) ... | semmle.label | match |
-| cflow.cs:62:18:62:18 | 0 | cflow.cs:67:16:67:16 | access to parameter a | semmle.label | no-match |
-| cflow.cs:63:17:64:55 | if (...) ... | cflow.cs:63:23:63:27 | this access | semmle.label | successor |
-| cflow.cs:63:21:63:34 | [false] !... | cflow.cs:65:17:65:22 | break; | semmle.label | false |
-| cflow.cs:63:21:63:34 | [true] !... | cflow.cs:64:27:64:54 | object creation of type NullReferenceException | semmle.label | true |
-| cflow.cs:63:23:63:27 | access to field Field | cflow.cs:63:32:63:33 | "" | semmle.label | successor |
-| cflow.cs:63:23:63:27 | this access | cflow.cs:63:23:63:27 | access to field Field | semmle.label | successor |
-| cflow.cs:63:23:63:33 | ... == ... | cflow.cs:63:21:63:34 | [false] !... | semmle.label | true |
-| cflow.cs:63:23:63:33 | ... == ... | cflow.cs:63:21:63:34 | [true] !... | semmle.label | false |
-| cflow.cs:63:32:63:33 | "" | cflow.cs:63:23:63:33 | ... == ... | semmle.label | successor |
-| cflow.cs:64:21:64:55 | throw ...; | cflow.cs:37:17:37:22 | exit Switch (abnormal) | semmle.label | exception(NullReferenceException) |
-| cflow.cs:64:27:64:54 | object creation of type NullReferenceException | cflow.cs:64:21:64:55 | throw ...; | semmle.label | successor |
-| cflow.cs:65:17:65:22 | break; | cflow.cs:67:16:67:16 | access to parameter a | semmle.label | break |
-| cflow.cs:67:9:67:17 | return ...; | cflow.cs:37:17:37:22 | exit Switch (normal) | semmle.label | return |
-| cflow.cs:67:16:67:16 | access to parameter a | cflow.cs:67:9:67:17 | return ...; | semmle.label | successor |
-| cflow.cs:70:18:70:18 | enter M | cflow.cs:71:5:82:5 | {...} | semmle.label | successor |
-| cflow.cs:70:18:70:18 | exit M (normal) | cflow.cs:70:18:70:18 | exit M | semmle.label | successor |
-| cflow.cs:71:5:82:5 | {...} | cflow.cs:72:9:73:19 | if (...) ... | semmle.label | successor |
-| cflow.cs:72:9:73:19 | if (...) ... | cflow.cs:72:13:72:13 | access to parameter s | semmle.label | successor |
-| cflow.cs:72:13:72:13 | access to parameter s | cflow.cs:72:18:72:21 | null | semmle.label | successor |
-| cflow.cs:72:13:72:21 | ... == ... | cflow.cs:73:13:73:19 | return ...; | semmle.label | true |
-| cflow.cs:72:13:72:21 | ... == ... | cflow.cs:74:9:81:9 | if (...) ... | semmle.label | false |
-| cflow.cs:72:18:72:21 | null | cflow.cs:72:13:72:21 | ... == ... | semmle.label | successor |
-| cflow.cs:73:13:73:19 | return ...; | cflow.cs:70:18:70:18 | exit M (normal) | semmle.label | return |
-| cflow.cs:74:9:81:9 | if (...) ... | cflow.cs:74:13:74:13 | access to parameter s | semmle.label | successor |
-| cflow.cs:74:13:74:13 | access to parameter s | cflow.cs:74:13:74:20 | access to property Length | semmle.label | successor |
-| cflow.cs:74:13:74:20 | access to property Length | cflow.cs:74:24:74:24 | 0 | semmle.label | successor |
-| cflow.cs:74:13:74:24 | ... > ... | cflow.cs:75:9:77:9 | {...} | semmle.label | true |
-| cflow.cs:74:13:74:24 | ... > ... | cflow.cs:79:9:81:9 | {...} | semmle.label | false |
-| cflow.cs:74:24:74:24 | 0 | cflow.cs:74:13:74:24 | ... > ... | semmle.label | successor |
-| cflow.cs:75:9:77:9 | {...} | cflow.cs:76:13:76:33 | ...; | semmle.label | successor |
-| cflow.cs:76:13:76:32 | call to method WriteLine | cflow.cs:70:18:70:18 | exit M (normal) | semmle.label | successor |
-| cflow.cs:76:13:76:33 | ...; | cflow.cs:76:31:76:31 | access to parameter s | semmle.label | successor |
-| cflow.cs:76:31:76:31 | access to parameter s | cflow.cs:76:13:76:32 | call to method WriteLine | semmle.label | successor |
-| cflow.cs:79:9:81:9 | {...} | cflow.cs:80:13:80:48 | ...; | semmle.label | successor |
-| cflow.cs:80:13:80:47 | call to method WriteLine | cflow.cs:70:18:70:18 | exit M (normal) | semmle.label | successor |
-| cflow.cs:80:13:80:48 | ...; | cflow.cs:80:31:80:46 | "" | semmle.label | successor |
-| cflow.cs:80:31:80:46 | "" | cflow.cs:80:13:80:47 | call to method WriteLine | semmle.label | successor |
-| cflow.cs:84:18:84:19 | enter M2 | cflow.cs:85:5:88:5 | {...} | semmle.label | successor |
-| cflow.cs:84:18:84:19 | exit M2 (normal) | cflow.cs:84:18:84:19 | exit M2 | semmle.label | successor |
-| cflow.cs:85:5:88:5 | {...} | cflow.cs:86:9:87:33 | if (...) ... | semmle.label | successor |
-| cflow.cs:86:9:87:33 | if (...) ... | cflow.cs:86:13:86:13 | access to parameter s | semmle.label | successor |
-| cflow.cs:86:13:86:13 | access to parameter s | cflow.cs:86:18:86:21 | null | semmle.label | successor |
-| cflow.cs:86:13:86:21 | ... != ... | cflow.cs:86:13:86:37 | [false] ... && ... | semmle.label | false |
-| cflow.cs:86:13:86:21 | ... != ... | cflow.cs:86:26:86:26 | access to parameter s | semmle.label | true |
-| cflow.cs:86:13:86:37 | [false] ... && ... | cflow.cs:84:18:84:19 | exit M2 (normal) | semmle.label | false |
-| cflow.cs:86:13:86:37 | [true] ... && ... | cflow.cs:87:13:87:33 | ...; | semmle.label | true |
-| cflow.cs:86:18:86:21 | null | cflow.cs:86:13:86:21 | ... != ... | semmle.label | successor |
-| cflow.cs:86:26:86:26 | access to parameter s | cflow.cs:86:26:86:33 | access to property Length | semmle.label | successor |
-| cflow.cs:86:26:86:33 | access to property Length | cflow.cs:86:37:86:37 | 0 | semmle.label | successor |
-| cflow.cs:86:26:86:37 | ... > ... | cflow.cs:86:13:86:37 | [false] ... && ... | semmle.label | false |
-| cflow.cs:86:26:86:37 | ... > ... | cflow.cs:86:13:86:37 | [true] ... && ... | semmle.label | true |
-| cflow.cs:86:37:86:37 | 0 | cflow.cs:86:26:86:37 | ... > ... | semmle.label | successor |
-| cflow.cs:87:13:87:32 | call to method WriteLine | cflow.cs:84:18:84:19 | exit M2 (normal) | semmle.label | successor |
-| cflow.cs:87:13:87:33 | ...; | cflow.cs:87:31:87:31 | access to parameter s | semmle.label | successor |
-| cflow.cs:87:31:87:31 | access to parameter s | cflow.cs:87:13:87:32 | call to method WriteLine | semmle.label | successor |
-| cflow.cs:90:18:90:19 | enter M3 | cflow.cs:91:5:104:5 | {...} | semmle.label | successor |
-| cflow.cs:90:18:90:19 | exit M3 (abnormal) | cflow.cs:90:18:90:19 | exit M3 | semmle.label | successor |
-| cflow.cs:90:18:90:19 | exit M3 (normal) | cflow.cs:90:18:90:19 | exit M3 | semmle.label | successor |
-| cflow.cs:91:5:104:5 | {...} | cflow.cs:92:9:93:49 | if (...) ... | semmle.label | successor |
-| cflow.cs:92:9:93:49 | if (...) ... | cflow.cs:92:20:92:20 | access to parameter s | semmle.label | successor |
-| cflow.cs:92:13:92:27 | call to method Equals | cflow.cs:93:45:93:47 | "s" | semmle.label | true |
-| cflow.cs:92:13:92:27 | call to method Equals | cflow.cs:94:9:94:29 | ...; | semmle.label | false |
-| cflow.cs:92:20:92:20 | access to parameter s | cflow.cs:92:23:92:26 | null | semmle.label | successor |
-| cflow.cs:92:23:92:26 | null | cflow.cs:92:13:92:27 | call to method Equals | semmle.label | successor |
-| cflow.cs:93:13:93:49 | throw ...; | cflow.cs:90:18:90:19 | exit M3 (abnormal) | semmle.label | exception(ArgumentNullException) |
-| cflow.cs:93:19:93:48 | object creation of type ArgumentNullException | cflow.cs:93:13:93:49 | throw ...; | semmle.label | successor |
-| cflow.cs:93:45:93:47 | "s" | cflow.cs:93:19:93:48 | object creation of type ArgumentNullException | semmle.label | successor |
-| cflow.cs:94:9:94:28 | call to method WriteLine | cflow.cs:96:9:97:55 | if (...) ... | semmle.label | successor |
-| cflow.cs:94:9:94:29 | ...; | cflow.cs:94:27:94:27 | access to parameter s | semmle.label | successor |
-| cflow.cs:94:27:94:27 | access to parameter s | cflow.cs:94:9:94:28 | call to method WriteLine | semmle.label | successor |
-| cflow.cs:96:9:97:55 | if (...) ... | cflow.cs:96:13:96:17 | this access | semmle.label | successor |
-| cflow.cs:96:13:96:17 | access to field Field | cflow.cs:96:22:96:25 | null | semmle.label | successor |
-| cflow.cs:96:13:96:17 | this access | cflow.cs:96:13:96:17 | access to field Field | semmle.label | successor |
-| cflow.cs:96:13:96:25 | ... != ... | cflow.cs:97:13:97:55 | ...; | semmle.label | true |
-| cflow.cs:96:13:96:25 | ... != ... | cflow.cs:99:9:100:42 | if (...) ... | semmle.label | false |
-| cflow.cs:96:22:96:25 | null | cflow.cs:96:13:96:25 | ... != ... | semmle.label | successor |
-| cflow.cs:97:13:97:54 | call to method WriteLine | cflow.cs:99:9:100:42 | if (...) ... | semmle.label | successor |
-| cflow.cs:97:13:97:55 | ...; | cflow.cs:97:31:97:47 | object creation of type ControlFlow | semmle.label | successor |
-| cflow.cs:97:31:97:47 | object creation of type ControlFlow | cflow.cs:97:31:97:53 | access to field Field | semmle.label | successor |
-| cflow.cs:97:31:97:53 | access to field Field | cflow.cs:97:13:97:54 | call to method WriteLine | semmle.label | successor |
-| cflow.cs:99:9:100:42 | if (...) ... | cflow.cs:99:13:99:17 | this access | semmle.label | successor |
-| cflow.cs:99:13:99:17 | access to field Field | cflow.cs:99:22:99:25 | null | semmle.label | successor |
-| cflow.cs:99:13:99:17 | this access | cflow.cs:99:13:99:17 | access to field Field | semmle.label | successor |
-| cflow.cs:99:13:99:25 | ... != ... | cflow.cs:100:13:100:42 | ...; | semmle.label | true |
-| cflow.cs:99:13:99:25 | ... != ... | cflow.cs:102:9:103:36 | if (...) ... | semmle.label | false |
-| cflow.cs:99:22:99:25 | null | cflow.cs:99:13:99:25 | ... != ... | semmle.label | successor |
-| cflow.cs:100:13:100:41 | call to method WriteLine | cflow.cs:102:9:103:36 | if (...) ... | semmle.label | successor |
-| cflow.cs:100:13:100:42 | ...; | cflow.cs:100:31:100:34 | this access | semmle.label | successor |
-| cflow.cs:100:31:100:34 | this access | cflow.cs:100:31:100:40 | access to field Field | semmle.label | successor |
-| cflow.cs:100:31:100:40 | access to field Field | cflow.cs:100:13:100:41 | call to method WriteLine | semmle.label | successor |
-| cflow.cs:102:9:103:36 | if (...) ... | cflow.cs:102:13:102:16 | this access | semmle.label | successor |
-| cflow.cs:102:13:102:16 | this access | cflow.cs:102:13:102:21 | access to property Prop | semmle.label | successor |
-| cflow.cs:102:13:102:21 | access to property Prop | cflow.cs:102:26:102:29 | null | semmle.label | successor |
-| cflow.cs:102:13:102:29 | ... != ... | cflow.cs:90:18:90:19 | exit M3 (normal) | semmle.label | false |
-| cflow.cs:102:13:102:29 | ... != ... | cflow.cs:103:13:103:36 | ...; | semmle.label | true |
-| cflow.cs:102:26:102:29 | null | cflow.cs:102:13:102:29 | ... != ... | semmle.label | successor |
-| cflow.cs:103:13:103:35 | call to method WriteLine | cflow.cs:90:18:90:19 | exit M3 (normal) | semmle.label | successor |
-| cflow.cs:103:13:103:36 | ...; | cflow.cs:103:31:103:34 | this access | semmle.label | successor |
-| cflow.cs:103:31:103:34 | access to property Prop | cflow.cs:103:13:103:35 | call to method WriteLine | semmle.label | successor |
-| cflow.cs:103:31:103:34 | this access | cflow.cs:103:31:103:34 | access to property Prop | semmle.label | successor |
-| cflow.cs:106:18:106:19 | enter M4 | cflow.cs:107:5:117:5 | {...} | semmle.label | successor |
-| cflow.cs:106:18:106:19 | exit M4 (normal) | cflow.cs:106:18:106:19 | exit M4 | semmle.label | successor |
-| cflow.cs:107:5:117:5 | {...} | cflow.cs:108:9:115:9 | if (...) ... | semmle.label | successor |
-| cflow.cs:108:9:115:9 | if (...) ... | cflow.cs:108:13:108:13 | access to parameter s | semmle.label | successor |
-| cflow.cs:108:13:108:13 | access to parameter s | cflow.cs:108:18:108:21 | null | semmle.label | successor |
-| cflow.cs:108:13:108:21 | ... != ... | cflow.cs:109:9:115:9 | {...} | semmle.label | true |
-| cflow.cs:108:13:108:21 | ... != ... | cflow.cs:116:9:116:29 | ...; | semmle.label | false |
-| cflow.cs:108:18:108:21 | null | cflow.cs:108:13:108:21 | ... != ... | semmle.label | successor |
-| cflow.cs:109:9:115:9 | {...} | cflow.cs:110:13:113:13 | while (...) ... | semmle.label | successor |
-| cflow.cs:110:13:113:13 | while (...) ... | cflow.cs:110:20:110:23 | true | semmle.label | successor |
-| cflow.cs:110:20:110:23 | true | cflow.cs:111:13:113:13 | {...} | semmle.label | true |
-| cflow.cs:111:13:113:13 | {...} | cflow.cs:112:17:112:37 | ...; | semmle.label | successor |
-| cflow.cs:112:17:112:36 | call to method WriteLine | cflow.cs:110:20:110:23 | true | semmle.label | successor |
-| cflow.cs:112:17:112:37 | ...; | cflow.cs:112:35:112:35 | access to parameter s | semmle.label | successor |
-| cflow.cs:112:35:112:35 | access to parameter s | cflow.cs:112:17:112:36 | call to method WriteLine | semmle.label | successor |
-| cflow.cs:116:9:116:28 | call to method WriteLine | cflow.cs:106:18:106:19 | exit M4 (normal) | semmle.label | successor |
-| cflow.cs:116:9:116:29 | ...; | cflow.cs:116:27:116:27 | access to parameter s | semmle.label | successor |
-| cflow.cs:116:27:116:27 | access to parameter s | cflow.cs:116:9:116:28 | call to method WriteLine | semmle.label | successor |
-| cflow.cs:119:20:119:21 | enter M5 | cflow.cs:120:5:124:5 | {...} | semmle.label | successor |
-| cflow.cs:119:20:119:21 | exit M5 (normal) | cflow.cs:119:20:119:21 | exit M5 | semmle.label | successor |
-| cflow.cs:120:5:124:5 | {...} | cflow.cs:121:9:121:18 | ... ...; | semmle.label | successor |
-| cflow.cs:121:9:121:18 | ... ...; | cflow.cs:121:17:121:17 | access to parameter s | semmle.label | successor |
-| cflow.cs:121:13:121:17 | String x = ... | cflow.cs:122:9:122:20 | ...; | semmle.label | successor |
-| cflow.cs:121:17:121:17 | access to parameter s | cflow.cs:121:13:121:17 | String x = ... | semmle.label | successor |
-| cflow.cs:122:9:122:19 | ... = ... | cflow.cs:123:16:123:16 | access to local variable x | semmle.label | successor |
-| cflow.cs:122:9:122:20 | ...; | cflow.cs:122:13:122:13 | access to local variable x | semmle.label | successor |
-| cflow.cs:122:13:122:13 | access to local variable x | cflow.cs:122:17:122:19 | " " | semmle.label | successor |
-| cflow.cs:122:13:122:19 | ... + ... | cflow.cs:122:9:122:19 | ... = ... | semmle.label | successor |
-| cflow.cs:122:17:122:19 | " " | cflow.cs:122:13:122:19 | ... + ... | semmle.label | successor |
-| cflow.cs:123:9:123:17 | return ...; | cflow.cs:119:20:119:21 | exit M5 (normal) | semmle.label | return |
-| cflow.cs:123:16:123:16 | access to local variable x | cflow.cs:123:9:123:17 | return ...; | semmle.label | successor |
-| cflow.cs:127:19:127:21 | enter get_Prop | cflow.cs:127:23:127:60 | {...} | semmle.label | successor |
-| cflow.cs:127:19:127:21 | exit get_Prop (normal) | cflow.cs:127:19:127:21 | exit get_Prop | semmle.label | successor |
-| cflow.cs:127:23:127:60 | {...} | cflow.cs:127:32:127:36 | this access | semmle.label | successor |
-| cflow.cs:127:25:127:58 | return ...; | cflow.cs:127:19:127:21 | exit get_Prop (normal) | semmle.label | return |
-| cflow.cs:127:32:127:36 | access to field Field | cflow.cs:127:41:127:44 | null | semmle.label | successor |
-| cflow.cs:127:32:127:36 | this access | cflow.cs:127:32:127:36 | access to field Field | semmle.label | successor |
-| cflow.cs:127:32:127:44 | ... == ... | cflow.cs:127:48:127:49 | "" | semmle.label | true |
-| cflow.cs:127:32:127:44 | ... == ... | cflow.cs:127:53:127:57 | this access | semmle.label | false |
-| cflow.cs:127:32:127:57 | ... ? ... : ... | cflow.cs:127:25:127:58 | return ...; | semmle.label | successor |
-| cflow.cs:127:41:127:44 | null | cflow.cs:127:32:127:44 | ... == ... | semmle.label | successor |
-| cflow.cs:127:48:127:49 | "" | cflow.cs:127:32:127:57 | ... ? ... : ... | semmle.label | successor |
-| cflow.cs:127:53:127:57 | access to field Field | cflow.cs:127:32:127:57 | ... ? ... : ... | semmle.label | successor |
-| cflow.cs:127:53:127:57 | this access | cflow.cs:127:53:127:57 | access to field Field | semmle.label | successor |
-| cflow.cs:127:62:127:64 | enter set_Prop | cflow.cs:127:66:127:83 | {...} | semmle.label | successor |
-| cflow.cs:127:62:127:64 | exit set_Prop (normal) | cflow.cs:127:62:127:64 | exit set_Prop | semmle.label | successor |
-| cflow.cs:127:66:127:83 | {...} | cflow.cs:127:68:127:81 | ...; | semmle.label | successor |
-| cflow.cs:127:68:127:72 | this access | cflow.cs:127:76:127:80 | access to parameter value | semmle.label | successor |
-| cflow.cs:127:68:127:80 | ... = ... | cflow.cs:127:62:127:64 | exit set_Prop (normal) | semmle.label | successor |
-| cflow.cs:127:68:127:81 | ...; | cflow.cs:127:68:127:72 | this access | semmle.label | successor |
-| cflow.cs:127:76:127:80 | access to parameter value | cflow.cs:127:68:127:80 | ... = ... | semmle.label | successor |
-| cflow.cs:129:5:129:15 | call to constructor Object | cflow.cs:130:5:132:5 | {...} | semmle.label | successor |
-| cflow.cs:129:5:129:15 | enter ControlFlow | cflow.cs:129:5:129:15 | call to constructor Object | semmle.label | successor |
-| cflow.cs:129:5:129:15 | exit ControlFlow (normal) | cflow.cs:129:5:129:15 | exit ControlFlow | semmle.label | successor |
-| cflow.cs:130:5:132:5 | {...} | cflow.cs:131:9:131:18 | ...; | semmle.label | successor |
-| cflow.cs:131:9:131:13 | this access | cflow.cs:131:17:131:17 | access to parameter s | semmle.label | successor |
-| cflow.cs:131:9:131:17 | ... = ... | cflow.cs:129:5:129:15 | exit ControlFlow (normal) | semmle.label | successor |
-| cflow.cs:131:9:131:18 | ...; | cflow.cs:131:9:131:13 | this access | semmle.label | successor |
-| cflow.cs:131:17:131:17 | access to parameter s | cflow.cs:131:9:131:17 | ... = ... | semmle.label | successor |
-| cflow.cs:134:5:134:15 | enter ControlFlow | cflow.cs:134:31:134:31 | access to parameter i | semmle.label | successor |
-| cflow.cs:134:5:134:15 | exit ControlFlow (normal) | cflow.cs:134:5:134:15 | exit ControlFlow | semmle.label | successor |
-| cflow.cs:134:26:134:29 | call to constructor ControlFlow | cflow.cs:134:39:134:41 | {...} | semmle.label | successor |
-| cflow.cs:134:31:134:31 | (...) ... | cflow.cs:134:35:134:36 | "" | semmle.label | successor |
-| cflow.cs:134:31:134:31 | access to parameter i | cflow.cs:134:31:134:31 | (...) ... | semmle.label | successor |
-| cflow.cs:134:31:134:36 | ... + ... | cflow.cs:134:26:134:29 | call to constructor ControlFlow | semmle.label | successor |
-| cflow.cs:134:35:134:36 | "" | cflow.cs:134:31:134:36 | ... + ... | semmle.label | successor |
-| cflow.cs:134:39:134:41 | {...} | cflow.cs:134:5:134:15 | exit ControlFlow (normal) | semmle.label | successor |
-| cflow.cs:136:12:136:22 | enter ControlFlow | cflow.cs:136:33:136:33 | 0 | semmle.label | successor |
-| cflow.cs:136:12:136:22 | exit ControlFlow (normal) | cflow.cs:136:12:136:22 | exit ControlFlow | semmle.label | successor |
-| cflow.cs:136:28:136:31 | call to constructor ControlFlow | cflow.cs:136:40:136:42 | {...} | semmle.label | successor |
-| cflow.cs:136:33:136:33 | 0 | cflow.cs:136:37:136:37 | 1 | semmle.label | successor |
-| cflow.cs:136:33:136:37 | ... + ... | cflow.cs:136:28:136:31 | call to constructor ControlFlow | semmle.label | successor |
-| cflow.cs:136:37:136:37 | 1 | cflow.cs:136:33:136:37 | ... + ... | semmle.label | successor |
-| cflow.cs:136:40:136:42 | {...} | cflow.cs:136:12:136:22 | exit ControlFlow (normal) | semmle.label | successor |
-| cflow.cs:138:40:138:40 | enter + | cflow.cs:139:5:142:5 | {...} | semmle.label | successor |
-| cflow.cs:138:40:138:40 | exit + (normal) | cflow.cs:138:40:138:40 | exit + | semmle.label | successor |
-| cflow.cs:139:5:142:5 | {...} | cflow.cs:140:9:140:29 | ...; | semmle.label | successor |
-| cflow.cs:140:9:140:28 | call to method WriteLine | cflow.cs:141:16:141:16 | access to parameter y | semmle.label | successor |
-| cflow.cs:140:9:140:29 | ...; | cflow.cs:140:27:140:27 | access to parameter x | semmle.label | successor |
-| cflow.cs:140:27:140:27 | access to parameter x | cflow.cs:140:9:140:28 | call to method WriteLine | semmle.label | successor |
-| cflow.cs:141:9:141:17 | return ...; | cflow.cs:138:40:138:40 | exit + (normal) | semmle.label | return |
-| cflow.cs:141:16:141:16 | access to parameter y | cflow.cs:141:9:141:17 | return ...; | semmle.label | successor |
-| cflow.cs:144:33:144:35 | enter get_Item | cflow.cs:144:37:144:54 | {...} | semmle.label | successor |
-| cflow.cs:144:33:144:35 | exit get_Item (normal) | cflow.cs:144:33:144:35 | exit get_Item | semmle.label | successor |
-| cflow.cs:144:37:144:54 | {...} | cflow.cs:144:46:144:46 | access to parameter i | semmle.label | successor |
-| cflow.cs:144:39:144:52 | return ...; | cflow.cs:144:33:144:35 | exit get_Item (normal) | semmle.label | return |
-| cflow.cs:144:46:144:46 | (...) ... | cflow.cs:144:50:144:51 | "" | semmle.label | successor |
-| cflow.cs:144:46:144:46 | access to parameter i | cflow.cs:144:46:144:46 | (...) ... | semmle.label | successor |
-| cflow.cs:144:46:144:51 | ... + ... | cflow.cs:144:39:144:52 | return ...; | semmle.label | successor |
-| cflow.cs:144:50:144:51 | "" | cflow.cs:144:46:144:51 | ... + ... | semmle.label | successor |
-| cflow.cs:144:56:144:58 | enter set_Item | cflow.cs:144:60:144:62 | {...} | semmle.label | successor |
-| cflow.cs:144:56:144:58 | exit set_Item (normal) | cflow.cs:144:56:144:58 | exit set_Item | semmle.label | successor |
-| cflow.cs:144:60:144:62 | {...} | cflow.cs:144:56:144:58 | exit set_Item (normal) | semmle.label | successor |
-| cflow.cs:146:10:146:12 | enter For | cflow.cs:147:5:177:5 | {...} | semmle.label | successor |
-| cflow.cs:146:10:146:12 | exit For (normal) | cflow.cs:146:10:146:12 | exit For | semmle.label | successor |
-| cflow.cs:147:5:177:5 | {...} | cflow.cs:148:9:148:18 | ... ...; | semmle.label | successor |
-| cflow.cs:148:9:148:18 | ... ...; | cflow.cs:148:17:148:17 | 0 | semmle.label | successor |
-| cflow.cs:148:13:148:17 | Int32 x = ... | cflow.cs:149:9:150:33 | for (...;...;...) ... | semmle.label | successor |
-| cflow.cs:148:17:148:17 | 0 | cflow.cs:148:13:148:17 | Int32 x = ... | semmle.label | successor |
-| cflow.cs:149:9:150:33 | for (...;...;...) ... | cflow.cs:149:16:149:16 | access to local variable x | semmle.label | successor |
-| cflow.cs:149:16:149:16 | access to local variable x | cflow.cs:149:20:149:21 | 10 | semmle.label | successor |
-| cflow.cs:149:16:149:21 | ... < ... | cflow.cs:150:13:150:33 | ...; | semmle.label | true |
-| cflow.cs:149:16:149:21 | ... < ... | cflow.cs:152:9:157:9 | for (...;...;...) ... | semmle.label | false |
-| cflow.cs:149:20:149:21 | 10 | cflow.cs:149:16:149:21 | ... < ... | semmle.label | successor |
-| cflow.cs:149:24:149:26 | ++... | cflow.cs:149:16:149:16 | access to local variable x | semmle.label | successor |
-| cflow.cs:149:26:149:26 | access to local variable x | cflow.cs:149:24:149:26 | ++... | semmle.label | successor |
-| cflow.cs:150:13:150:32 | call to method WriteLine | cflow.cs:149:26:149:26 | access to local variable x | semmle.label | successor |
-| cflow.cs:150:13:150:33 | ...; | cflow.cs:150:31:150:31 | access to local variable x | semmle.label | successor |
-| cflow.cs:150:31:150:31 | access to local variable x | cflow.cs:150:13:150:32 | call to method WriteLine | semmle.label | successor |
-| cflow.cs:152:9:157:9 | for (...;...;...) ... | cflow.cs:153:9:157:9 | {...} | semmle.label | successor |
-| cflow.cs:152:18:152:18 | access to local variable x | cflow.cs:152:18:152:20 | ...++ | semmle.label | successor |
-| cflow.cs:152:18:152:20 | ...++ | cflow.cs:153:9:157:9 | {...} | semmle.label | successor |
-| cflow.cs:153:9:157:9 | {...} | cflow.cs:154:13:154:33 | ...; | semmle.label | successor |
-| cflow.cs:154:13:154:32 | call to method WriteLine | cflow.cs:155:13:156:22 | if (...) ... | semmle.label | successor |
-| cflow.cs:154:13:154:33 | ...; | cflow.cs:154:31:154:31 | access to local variable x | semmle.label | successor |
-| cflow.cs:154:31:154:31 | access to local variable x | cflow.cs:154:13:154:32 | call to method WriteLine | semmle.label | successor |
-| cflow.cs:155:13:156:22 | if (...) ... | cflow.cs:155:17:155:17 | access to local variable x | semmle.label | successor |
-| cflow.cs:155:17:155:17 | access to local variable x | cflow.cs:155:21:155:22 | 20 | semmle.label | successor |
-| cflow.cs:155:17:155:22 | ... > ... | cflow.cs:152:18:152:18 | access to local variable x | semmle.label | false |
-| cflow.cs:155:17:155:22 | ... > ... | cflow.cs:156:17:156:22 | break; | semmle.label | true |
-| cflow.cs:155:21:155:22 | 20 | cflow.cs:155:17:155:22 | ... > ... | semmle.label | successor |
-| cflow.cs:156:17:156:22 | break; | cflow.cs:159:9:165:9 | for (...;...;...) ... | semmle.label | break |
-| cflow.cs:159:9:165:9 | for (...;...;...) ... | cflow.cs:160:9:165:9 | {...} | semmle.label | successor |
-| cflow.cs:160:9:165:9 | {...} | cflow.cs:161:13:161:33 | ...; | semmle.label | successor |
-| cflow.cs:161:13:161:32 | call to method WriteLine | cflow.cs:162:13:162:16 | ...; | semmle.label | successor |
-| cflow.cs:161:13:161:33 | ...; | cflow.cs:161:31:161:31 | access to local variable x | semmle.label | successor |
-| cflow.cs:161:31:161:31 | access to local variable x | cflow.cs:161:13:161:32 | call to method WriteLine | semmle.label | successor |
-| cflow.cs:162:13:162:13 | access to local variable x | cflow.cs:162:13:162:15 | ...++ | semmle.label | successor |
-| cflow.cs:162:13:162:15 | ...++ | cflow.cs:163:13:164:22 | if (...) ... | semmle.label | successor |
-| cflow.cs:162:13:162:16 | ...; | cflow.cs:162:13:162:13 | access to local variable x | semmle.label | successor |
-| cflow.cs:163:13:164:22 | if (...) ... | cflow.cs:163:17:163:17 | access to local variable x | semmle.label | successor |
-| cflow.cs:163:17:163:17 | access to local variable x | cflow.cs:163:21:163:22 | 30 | semmle.label | successor |
-| cflow.cs:163:17:163:22 | ... > ... | cflow.cs:160:9:165:9 | {...} | semmle.label | false |
-| cflow.cs:163:17:163:22 | ... > ... | cflow.cs:164:17:164:22 | break; | semmle.label | true |
-| cflow.cs:163:21:163:22 | 30 | cflow.cs:163:17:163:22 | ... > ... | semmle.label | successor |
-| cflow.cs:164:17:164:22 | break; | cflow.cs:167:9:171:9 | for (...;...;...) ... | semmle.label | break |
-| cflow.cs:167:9:171:9 | for (...;...;...) ... | cflow.cs:167:16:167:16 | access to local variable x | semmle.label | successor |
-| cflow.cs:167:16:167:16 | access to local variable x | cflow.cs:167:20:167:21 | 40 | semmle.label | successor |
-| cflow.cs:167:16:167:21 | ... < ... | cflow.cs:168:9:171:9 | {...} | semmle.label | true |
-| cflow.cs:167:16:167:21 | ... < ... | cflow.cs:173:9:176:9 | for (...;...;...) ... | semmle.label | false |
-| cflow.cs:167:20:167:21 | 40 | cflow.cs:167:16:167:21 | ... < ... | semmle.label | successor |
-| cflow.cs:168:9:171:9 | {...} | cflow.cs:169:13:169:33 | ...; | semmle.label | successor |
-| cflow.cs:169:13:169:32 | call to method WriteLine | cflow.cs:170:13:170:16 | ...; | semmle.label | successor |
-| cflow.cs:169:13:169:33 | ...; | cflow.cs:169:31:169:31 | access to local variable x | semmle.label | successor |
-| cflow.cs:169:31:169:31 | access to local variable x | cflow.cs:169:13:169:32 | call to method WriteLine | semmle.label | successor |
-| cflow.cs:170:13:170:13 | access to local variable x | cflow.cs:170:13:170:15 | ...++ | semmle.label | successor |
-| cflow.cs:170:13:170:15 | ...++ | cflow.cs:167:16:167:16 | access to local variable x | semmle.label | successor |
-| cflow.cs:170:13:170:16 | ...; | cflow.cs:170:13:170:13 | access to local variable x | semmle.label | successor |
-| cflow.cs:173:9:176:9 | for (...;...;...) ... | cflow.cs:173:22:173:22 | 0 | semmle.label | successor |
-| cflow.cs:173:18:173:22 | Int32 i = ... | cflow.cs:173:29:173:29 | 0 | semmle.label | successor |
-| cflow.cs:173:22:173:22 | 0 | cflow.cs:173:18:173:22 | Int32 i = ... | semmle.label | successor |
-| cflow.cs:173:25:173:29 | Int32 j = ... | cflow.cs:173:32:173:32 | access to local variable i | semmle.label | successor |
-| cflow.cs:173:29:173:29 | 0 | cflow.cs:173:25:173:29 | Int32 j = ... | semmle.label | successor |
-| cflow.cs:173:32:173:32 | access to local variable i | cflow.cs:173:36:173:36 | access to local variable j | semmle.label | successor |
-| cflow.cs:173:32:173:36 | ... + ... | cflow.cs:173:40:173:41 | 10 | semmle.label | successor |
-| cflow.cs:173:32:173:41 | ... < ... | cflow.cs:146:10:146:12 | exit For (normal) | semmle.label | false |
-| cflow.cs:173:32:173:41 | ... < ... | cflow.cs:174:9:176:9 | {...} | semmle.label | true |
-| cflow.cs:173:36:173:36 | access to local variable j | cflow.cs:173:32:173:36 | ... + ... | semmle.label | successor |
-| cflow.cs:173:40:173:41 | 10 | cflow.cs:173:32:173:41 | ... < ... | semmle.label | successor |
-| cflow.cs:173:44:173:44 | access to local variable i | cflow.cs:173:44:173:46 | ...++ | semmle.label | successor |
-| cflow.cs:173:44:173:46 | ...++ | cflow.cs:173:49:173:49 | access to local variable j | semmle.label | successor |
-| cflow.cs:173:49:173:49 | access to local variable j | cflow.cs:173:49:173:51 | ...++ | semmle.label | successor |
-| cflow.cs:173:49:173:51 | ...++ | cflow.cs:173:32:173:32 | access to local variable i | semmle.label | successor |
-| cflow.cs:174:9:176:9 | {...} | cflow.cs:175:13:175:37 | ...; | semmle.label | successor |
-| cflow.cs:175:13:175:36 | call to method WriteLine | cflow.cs:173:44:173:44 | access to local variable i | semmle.label | successor |
-| cflow.cs:175:13:175:37 | ...; | cflow.cs:175:31:175:31 | access to local variable i | semmle.label | successor |
-| cflow.cs:175:31:175:31 | access to local variable i | cflow.cs:175:35:175:35 | access to local variable j | semmle.label | successor |
-| cflow.cs:175:31:175:35 | ... + ... | cflow.cs:175:13:175:36 | call to method WriteLine | semmle.label | successor |
-| cflow.cs:175:35:175:35 | access to local variable j | cflow.cs:175:31:175:35 | ... + ... | semmle.label | successor |
-| cflow.cs:179:10:179:16 | enter Lambdas | cflow.cs:180:5:183:5 | {...} | semmle.label | successor |
-| cflow.cs:179:10:179:16 | exit Lambdas (normal) | cflow.cs:179:10:179:16 | exit Lambdas | semmle.label | successor |
-| cflow.cs:180:5:183:5 | {...} | cflow.cs:181:9:181:38 | ... ...; | semmle.label | successor |
-| cflow.cs:181:9:181:38 | ... ...; | cflow.cs:181:28:181:37 | (...) => ... | semmle.label | successor |
-| cflow.cs:181:24:181:37 | Func y = ... | cflow.cs:182:9:182:62 | ... ...; | semmle.label | successor |
-| cflow.cs:181:28:181:37 | (...) => ... | cflow.cs:181:24:181:37 | Func y = ... | semmle.label | successor |
-| cflow.cs:181:28:181:37 | enter (...) => ... | cflow.cs:181:33:181:33 | access to parameter x | semmle.label | successor |
-| cflow.cs:181:28:181:37 | exit (...) => ... (normal) | cflow.cs:181:28:181:37 | exit (...) => ... | semmle.label | successor |
-| cflow.cs:181:33:181:33 | access to parameter x | cflow.cs:181:37:181:37 | 1 | semmle.label | successor |
-| cflow.cs:181:33:181:37 | ... + ... | cflow.cs:181:28:181:37 | exit (...) => ... (normal) | semmle.label | successor |
-| cflow.cs:181:37:181:37 | 1 | cflow.cs:181:33:181:37 | ... + ... | semmle.label | successor |
-| cflow.cs:182:9:182:62 | ... ...; | cflow.cs:182:28:182:61 | delegate(...) { ... } | semmle.label | successor |
-| cflow.cs:182:24:182:61 | Func z = ... | cflow.cs:179:10:179:16 | exit Lambdas (normal) | semmle.label | successor |
-| cflow.cs:182:28:182:61 | delegate(...) { ... } | cflow.cs:182:24:182:61 | Func z = ... | semmle.label | successor |
-| cflow.cs:182:28:182:61 | enter delegate(...) { ... } | cflow.cs:182:45:182:61 | {...} | semmle.label | successor |
-| cflow.cs:182:28:182:61 | exit delegate(...) { ... } (normal) | cflow.cs:182:28:182:61 | exit delegate(...) { ... } | semmle.label | successor |
-| cflow.cs:182:45:182:61 | {...} | cflow.cs:182:54:182:54 | access to parameter x | semmle.label | successor |
-| cflow.cs:182:47:182:59 | return ...; | cflow.cs:182:28:182:61 | exit delegate(...) { ... } (normal) | semmle.label | return |
-| cflow.cs:182:54:182:54 | access to parameter x | cflow.cs:182:58:182:58 | 1 | semmle.label | successor |
-| cflow.cs:182:54:182:58 | ... + ... | cflow.cs:182:47:182:59 | return ...; | semmle.label | successor |
-| cflow.cs:182:58:182:58 | 1 | cflow.cs:182:54:182:58 | ... + ... | semmle.label | successor |
-| cflow.cs:185:10:185:18 | enter LogicalOr | cflow.cs:186:5:191:5 | {...} | semmle.label | successor |
-| cflow.cs:185:10:185:18 | exit LogicalOr (normal) | cflow.cs:185:10:185:18 | exit LogicalOr | semmle.label | successor |
-| cflow.cs:186:5:191:5 | {...} | cflow.cs:187:9:190:52 | if (...) ... | semmle.label | successor |
-| cflow.cs:187:9:190:52 | if (...) ... | cflow.cs:187:13:187:13 | 1 | semmle.label | successor |
-| cflow.cs:187:13:187:13 | 1 | cflow.cs:187:18:187:18 | 2 | semmle.label | successor |
-| cflow.cs:187:13:187:18 | ... == ... | cflow.cs:187:23:187:23 | 2 | semmle.label | false |
-| cflow.cs:187:13:187:28 | [false] ... \|\| ... | cflow.cs:187:34:187:34 | 1 | semmle.label | false |
-| cflow.cs:187:13:187:50 | [false] ... \|\| ... | cflow.cs:190:13:190:52 | ...; | semmle.label | false |
-| cflow.cs:187:18:187:18 | 2 | cflow.cs:187:13:187:18 | ... == ... | semmle.label | successor |
-| cflow.cs:187:23:187:23 | 2 | cflow.cs:187:28:187:28 | 3 | semmle.label | successor |
-| cflow.cs:187:23:187:28 | ... == ... | cflow.cs:187:13:187:28 | [false] ... \|\| ... | semmle.label | false |
-| cflow.cs:187:28:187:28 | 3 | cflow.cs:187:23:187:28 | ... == ... | semmle.label | successor |
-| cflow.cs:187:34:187:34 | 1 | cflow.cs:187:39:187:39 | 3 | semmle.label | successor |
-| cflow.cs:187:34:187:39 | ... == ... | cflow.cs:187:34:187:49 | [false] ... && ... | semmle.label | false |
-| cflow.cs:187:34:187:49 | [false] ... && ... | cflow.cs:187:13:187:50 | [false] ... \|\| ... | semmle.label | false |
-| cflow.cs:187:39:187:39 | 3 | cflow.cs:187:34:187:39 | ... == ... | semmle.label | successor |
-| cflow.cs:190:13:190:51 | call to method WriteLine | cflow.cs:185:10:185:18 | exit LogicalOr (normal) | semmle.label | successor |
-| cflow.cs:190:13:190:52 | ...; | cflow.cs:190:31:190:50 | "This should happen" | semmle.label | successor |
-| cflow.cs:190:31:190:50 | "This should happen" | cflow.cs:190:13:190:51 | call to method WriteLine | semmle.label | successor |
-| cflow.cs:193:10:193:17 | enter Booleans | cflow.cs:194:5:206:5 | {...} | semmle.label | successor |
-| cflow.cs:193:10:193:17 | exit Booleans (abnormal) | cflow.cs:193:10:193:17 | exit Booleans | semmle.label | successor |
-| cflow.cs:193:10:193:17 | exit Booleans (normal) | cflow.cs:193:10:193:17 | exit Booleans | semmle.label | successor |
-| cflow.cs:194:5:206:5 | {...} | cflow.cs:195:9:195:57 | ... ...; | semmle.label | successor |
-| cflow.cs:195:9:195:57 | ... ...; | cflow.cs:195:17:195:21 | this access | semmle.label | successor |
-| cflow.cs:195:13:195:56 | Boolean b = ... | cflow.cs:197:9:198:49 | if (...) ... | semmle.label | successor |
-| cflow.cs:195:17:195:21 | access to field Field | cflow.cs:195:17:195:28 | access to property Length | semmle.label | successor |
-| cflow.cs:195:17:195:21 | this access | cflow.cs:195:17:195:21 | access to field Field | semmle.label | successor |
-| cflow.cs:195:17:195:28 | access to property Length | cflow.cs:195:32:195:32 | 0 | semmle.label | successor |
-| cflow.cs:195:17:195:32 | ... > ... | cflow.cs:195:17:195:56 | ... && ... | semmle.label | false |
-| cflow.cs:195:17:195:32 | ... > ... | cflow.cs:195:39:195:43 | this access | semmle.label | true |
-| cflow.cs:195:17:195:56 | ... && ... | cflow.cs:195:13:195:56 | Boolean b = ... | semmle.label | successor |
-| cflow.cs:195:32:195:32 | 0 | cflow.cs:195:17:195:32 | ... > ... | semmle.label | successor |
-| cflow.cs:195:37:195:56 | !... | cflow.cs:195:17:195:56 | ... && ... | semmle.label | successor |
-| cflow.cs:195:39:195:43 | access to field Field | cflow.cs:195:39:195:50 | access to property Length | semmle.label | successor |
-| cflow.cs:195:39:195:43 | this access | cflow.cs:195:39:195:43 | access to field Field | semmle.label | successor |
-| cflow.cs:195:39:195:50 | access to property Length | cflow.cs:195:55:195:55 | 1 | semmle.label | successor |
-| cflow.cs:195:39:195:55 | ... == ... | cflow.cs:195:37:195:56 | !... | semmle.label | successor |
-| cflow.cs:195:55:195:55 | 1 | cflow.cs:195:39:195:55 | ... == ... | semmle.label | successor |
-| cflow.cs:197:9:198:49 | if (...) ... | cflow.cs:197:15:197:19 | this access | semmle.label | successor |
-| cflow.cs:197:13:197:47 | [false] !... | cflow.cs:200:9:205:9 | if (...) ... | semmle.label | false |
-| cflow.cs:197:13:197:47 | [true] !... | cflow.cs:198:13:198:49 | ...; | semmle.label | true |
-| cflow.cs:197:15:197:19 | access to field Field | cflow.cs:197:15:197:26 | access to property Length | semmle.label | successor |
-| cflow.cs:197:15:197:19 | this access | cflow.cs:197:15:197:19 | access to field Field | semmle.label | successor |
-| cflow.cs:197:15:197:26 | access to property Length | cflow.cs:197:31:197:31 | 0 | semmle.label | successor |
-| cflow.cs:197:15:197:31 | ... == ... | cflow.cs:197:35:197:39 | false | semmle.label | true |
-| cflow.cs:197:15:197:31 | ... == ... | cflow.cs:197:43:197:46 | true | semmle.label | false |
-| cflow.cs:197:15:197:46 | [false] ... ? ... : ... | cflow.cs:197:13:197:47 | [true] !... | semmle.label | false |
-| cflow.cs:197:15:197:46 | [true] ... ? ... : ... | cflow.cs:197:13:197:47 | [false] !... | semmle.label | true |
-| cflow.cs:197:31:197:31 | 0 | cflow.cs:197:15:197:31 | ... == ... | semmle.label | successor |
-| cflow.cs:197:35:197:39 | false | cflow.cs:197:15:197:46 | [false] ... ? ... : ... | semmle.label | false |
-| cflow.cs:197:43:197:46 | true | cflow.cs:197:15:197:46 | [true] ... ? ... : ... | semmle.label | true |
-| cflow.cs:198:13:198:48 | ... = ... | cflow.cs:200:9:205:9 | if (...) ... | semmle.label | successor |
-| cflow.cs:198:13:198:49 | ...; | cflow.cs:198:17:198:21 | this access | semmle.label | successor |
-| cflow.cs:198:17:198:21 | access to field Field | cflow.cs:198:17:198:28 | access to property Length | semmle.label | successor |
-| cflow.cs:198:17:198:21 | this access | cflow.cs:198:17:198:21 | access to field Field | semmle.label | successor |
-| cflow.cs:198:17:198:28 | access to property Length | cflow.cs:198:33:198:33 | 0 | semmle.label | successor |
-| cflow.cs:198:17:198:33 | ... == ... | cflow.cs:198:37:198:41 | false | semmle.label | true |
-| cflow.cs:198:17:198:33 | ... == ... | cflow.cs:198:45:198:48 | true | semmle.label | false |
-| cflow.cs:198:17:198:48 | ... ? ... : ... | cflow.cs:198:13:198:48 | ... = ... | semmle.label | successor |
-| cflow.cs:198:33:198:33 | 0 | cflow.cs:198:17:198:33 | ... == ... | semmle.label | successor |
-| cflow.cs:198:37:198:41 | false | cflow.cs:198:17:198:48 | ... ? ... : ... | semmle.label | successor |
-| cflow.cs:198:45:198:48 | true | cflow.cs:198:17:198:48 | ... ? ... : ... | semmle.label | successor |
-| cflow.cs:200:9:205:9 | if (...) ... | cflow.cs:200:15:200:19 | this access | semmle.label | successor |
-| cflow.cs:200:13:200:32 | [false] !... | cflow.cs:200:40:200:44 | this access | semmle.label | false |
-| cflow.cs:200:13:200:32 | [true] !... | cflow.cs:200:13:200:62 | [true] ... \|\| ... | semmle.label | true |
-| cflow.cs:200:13:200:62 | [false] ... \|\| ... | cflow.cs:193:10:193:17 | exit Booleans (normal) | semmle.label | false |
-| cflow.cs:200:13:200:62 | [true] ... \|\| ... | cflow.cs:201:9:205:9 | {...} | semmle.label | true |
-| cflow.cs:200:15:200:19 | access to field Field | cflow.cs:200:15:200:26 | access to property Length | semmle.label | successor |
-| cflow.cs:200:15:200:19 | this access | cflow.cs:200:15:200:19 | access to field Field | semmle.label | successor |
-| cflow.cs:200:15:200:26 | access to property Length | cflow.cs:200:31:200:31 | 0 | semmle.label | successor |
-| cflow.cs:200:15:200:31 | ... == ... | cflow.cs:200:13:200:32 | [false] !... | semmle.label | true |
-| cflow.cs:200:15:200:31 | ... == ... | cflow.cs:200:13:200:32 | [true] !... | semmle.label | false |
-| cflow.cs:200:31:200:31 | 0 | cflow.cs:200:15:200:31 | ... == ... | semmle.label | successor |
-| cflow.cs:200:37:200:62 | [false] !... | cflow.cs:200:13:200:62 | [false] ... \|\| ... | semmle.label | false |
-| cflow.cs:200:37:200:62 | [true] !... | cflow.cs:200:13:200:62 | [true] ... \|\| ... | semmle.label | true |
-| cflow.cs:200:38:200:62 | [false] !... | cflow.cs:200:37:200:62 | [true] !... | semmle.label | false |
-| cflow.cs:200:38:200:62 | [true] !... | cflow.cs:200:37:200:62 | [false] !... | semmle.label | true |
-| cflow.cs:200:40:200:44 | access to field Field | cflow.cs:200:40:200:51 | access to property Length | semmle.label | successor |
-| cflow.cs:200:40:200:44 | this access | cflow.cs:200:40:200:44 | access to field Field | semmle.label | successor |
-| cflow.cs:200:40:200:51 | access to property Length | cflow.cs:200:56:200:56 | 1 | semmle.label | successor |
-| cflow.cs:200:40:200:56 | ... == ... | cflow.cs:200:40:200:61 | [false] ... && ... | semmle.label | false |
-| cflow.cs:200:40:200:56 | ... == ... | cflow.cs:200:61:200:61 | access to local variable b | semmle.label | true |
-| cflow.cs:200:40:200:61 | [false] ... && ... | cflow.cs:200:38:200:62 | [true] !... | semmle.label | false |
-| cflow.cs:200:40:200:61 | [true] ... && ... | cflow.cs:200:38:200:62 | [false] !... | semmle.label | true |
-| cflow.cs:200:56:200:56 | 1 | cflow.cs:200:40:200:56 | ... == ... | semmle.label | successor |
-| cflow.cs:200:61:200:61 | access to local variable b | cflow.cs:200:40:200:61 | [false] ... && ... | semmle.label | false |
-| cflow.cs:200:61:200:61 | access to local variable b | cflow.cs:200:40:200:61 | [true] ... && ... | semmle.label | true |
-| cflow.cs:201:9:205:9 | {...} | cflow.cs:202:13:204:13 | {...} | semmle.label | successor |
-| cflow.cs:202:13:204:13 | {...} | cflow.cs:203:23:203:37 | object creation of type Exception | semmle.label | successor |
-| cflow.cs:203:17:203:38 | throw ...; | cflow.cs:193:10:193:17 | exit Booleans (abnormal) | semmle.label | exception(Exception) |
-| cflow.cs:203:23:203:37 | object creation of type Exception | cflow.cs:203:17:203:38 | throw ...; | semmle.label | successor |
-| cflow.cs:208:10:208:11 | enter Do | cflow.cs:209:5:222:5 | {...} | semmle.label | successor |
-| cflow.cs:208:10:208:11 | exit Do (normal) | cflow.cs:208:10:208:11 | exit Do | semmle.label | successor |
-| cflow.cs:209:5:222:5 | {...} | cflow.cs:210:9:221:36 | do ... while (...); | semmle.label | successor |
-| cflow.cs:210:9:221:36 | do ... while (...); | cflow.cs:211:9:221:9 | {...} | semmle.label | successor |
-| cflow.cs:211:9:221:9 | {...} | cflow.cs:212:13:212:25 | ...; | semmle.label | successor |
-| cflow.cs:212:13:212:17 | access to field Field | cflow.cs:212:22:212:24 | "a" | semmle.label | successor |
-| cflow.cs:212:13:212:17 | this access | cflow.cs:212:13:212:17 | access to field Field | semmle.label | successor |
-| cflow.cs:212:13:212:17 | this access | cflow.cs:212:13:212:17 | this access | semmle.label | successor |
-| cflow.cs:212:13:212:24 | ... + ... | cflow.cs:212:13:212:24 | ... = ... | semmle.label | successor |
-| cflow.cs:212:13:212:24 | ... = ... | cflow.cs:213:13:216:13 | if (...) ... | semmle.label | successor |
-| cflow.cs:212:13:212:25 | ...; | cflow.cs:212:13:212:17 | this access | semmle.label | successor |
-| cflow.cs:212:22:212:24 | "a" | cflow.cs:212:13:212:24 | ... + ... | semmle.label | successor |
-| cflow.cs:213:13:216:13 | if (...) ... | cflow.cs:213:17:213:21 | this access | semmle.label | successor |
-| cflow.cs:213:17:213:21 | access to field Field | cflow.cs:213:17:213:28 | access to property Length | semmle.label | successor |
-| cflow.cs:213:17:213:21 | this access | cflow.cs:213:17:213:21 | access to field Field | semmle.label | successor |
-| cflow.cs:213:17:213:28 | access to property Length | cflow.cs:213:32:213:32 | 0 | semmle.label | successor |
-| cflow.cs:213:17:213:32 | ... > ... | cflow.cs:214:13:216:13 | {...} | semmle.label | true |
-| cflow.cs:213:17:213:32 | ... > ... | cflow.cs:217:13:220:13 | if (...) ... | semmle.label | false |
-| cflow.cs:213:32:213:32 | 0 | cflow.cs:213:17:213:32 | ... > ... | semmle.label | successor |
-| cflow.cs:214:13:216:13 | {...} | cflow.cs:215:17:215:25 | continue; | semmle.label | successor |
-| cflow.cs:215:17:215:25 | continue; | cflow.cs:221:18:221:22 | this access | semmle.label | continue |
-| cflow.cs:217:13:220:13 | if (...) ... | cflow.cs:217:17:217:21 | this access | semmle.label | successor |
-| cflow.cs:217:17:217:21 | access to field Field | cflow.cs:217:17:217:28 | access to property Length | semmle.label | successor |
-| cflow.cs:217:17:217:21 | this access | cflow.cs:217:17:217:21 | access to field Field | semmle.label | successor |
-| cflow.cs:217:17:217:28 | access to property Length | cflow.cs:217:32:217:32 | 0 | semmle.label | successor |
-| cflow.cs:217:17:217:32 | ... < ... | cflow.cs:218:13:220:13 | {...} | semmle.label | true |
-| cflow.cs:217:17:217:32 | ... < ... | cflow.cs:221:18:221:22 | this access | semmle.label | false |
-| cflow.cs:217:32:217:32 | 0 | cflow.cs:217:17:217:32 | ... < ... | semmle.label | successor |
-| cflow.cs:218:13:220:13 | {...} | cflow.cs:219:17:219:22 | break; | semmle.label | successor |
-| cflow.cs:219:17:219:22 | break; | cflow.cs:208:10:208:11 | exit Do (normal) | semmle.label | break |
-| cflow.cs:221:18:221:22 | access to field Field | cflow.cs:221:18:221:29 | access to property Length | semmle.label | successor |
-| cflow.cs:221:18:221:22 | this access | cflow.cs:221:18:221:22 | access to field Field | semmle.label | successor |
-| cflow.cs:221:18:221:29 | access to property Length | cflow.cs:221:33:221:34 | 10 | semmle.label | successor |
-| cflow.cs:221:18:221:34 | ... < ... | cflow.cs:208:10:208:11 | exit Do (normal) | semmle.label | false |
-| cflow.cs:221:18:221:34 | ... < ... | cflow.cs:211:9:221:9 | {...} | semmle.label | true |
-| cflow.cs:221:33:221:34 | 10 | cflow.cs:221:18:221:34 | ... < ... | semmle.label | successor |
-| cflow.cs:224:10:224:16 | enter Foreach | cflow.cs:225:5:238:5 | {...} | semmle.label | successor |
-| cflow.cs:224:10:224:16 | exit Foreach (normal) | cflow.cs:224:10:224:16 | exit Foreach | semmle.label | successor |
-| cflow.cs:225:5:238:5 | {...} | cflow.cs:226:57:226:59 | "a" | semmle.label | successor |
-| cflow.cs:226:9:237:9 | foreach (... ... in ...) ... | cflow.cs:224:10:224:16 | exit Foreach (normal) | semmle.label | empty |
-| cflow.cs:226:9:237:9 | foreach (... ... in ...) ... | cflow.cs:226:22:226:22 | String x | semmle.label | non-empty |
-| cflow.cs:226:22:226:22 | String x | cflow.cs:227:9:237:9 | {...} | semmle.label | successor |
-| cflow.cs:226:27:226:64 | call to method Repeat | cflow.cs:226:9:237:9 | foreach (... ... in ...) ... | semmle.label | successor |
-| cflow.cs:226:57:226:59 | "a" | cflow.cs:226:62:226:63 | 10 | semmle.label | successor |
-| cflow.cs:226:62:226:63 | 10 | cflow.cs:226:27:226:64 | call to method Repeat | semmle.label | successor |
-| cflow.cs:227:9:237:9 | {...} | cflow.cs:228:13:228:23 | ...; | semmle.label | successor |
-| cflow.cs:228:13:228:17 | access to field Field | cflow.cs:228:22:228:22 | access to local variable x | semmle.label | successor |
-| cflow.cs:228:13:228:17 | this access | cflow.cs:228:13:228:17 | access to field Field | semmle.label | successor |
-| cflow.cs:228:13:228:17 | this access | cflow.cs:228:13:228:17 | this access | semmle.label | successor |
-| cflow.cs:228:13:228:22 | ... + ... | cflow.cs:228:13:228:22 | ... = ... | semmle.label | successor |
-| cflow.cs:228:13:228:22 | ... = ... | cflow.cs:229:13:232:13 | if (...) ... | semmle.label | successor |
-| cflow.cs:228:13:228:23 | ...; | cflow.cs:228:13:228:17 | this access | semmle.label | successor |
-| cflow.cs:228:22:228:22 | access to local variable x | cflow.cs:228:13:228:22 | ... + ... | semmle.label | successor |
-| cflow.cs:229:13:232:13 | if (...) ... | cflow.cs:229:17:229:21 | this access | semmle.label | successor |
-| cflow.cs:229:17:229:21 | access to field Field | cflow.cs:229:17:229:28 | access to property Length | semmle.label | successor |
-| cflow.cs:229:17:229:21 | this access | cflow.cs:229:17:229:21 | access to field Field | semmle.label | successor |
-| cflow.cs:229:17:229:28 | access to property Length | cflow.cs:229:32:229:32 | 0 | semmle.label | successor |
-| cflow.cs:229:17:229:32 | ... > ... | cflow.cs:230:13:232:13 | {...} | semmle.label | true |
-| cflow.cs:229:17:229:32 | ... > ... | cflow.cs:233:13:236:13 | if (...) ... | semmle.label | false |
-| cflow.cs:229:32:229:32 | 0 | cflow.cs:229:17:229:32 | ... > ... | semmle.label | successor |
-| cflow.cs:230:13:232:13 | {...} | cflow.cs:231:17:231:25 | continue; | semmle.label | successor |
-| cflow.cs:231:17:231:25 | continue; | cflow.cs:226:9:237:9 | foreach (... ... in ...) ... | semmle.label | continue |
-| cflow.cs:233:13:236:13 | if (...) ... | cflow.cs:233:17:233:21 | this access | semmle.label | successor |
-| cflow.cs:233:17:233:21 | access to field Field | cflow.cs:233:17:233:28 | access to property Length | semmle.label | successor |
-| cflow.cs:233:17:233:21 | this access | cflow.cs:233:17:233:21 | access to field Field | semmle.label | successor |
-| cflow.cs:233:17:233:28 | access to property Length | cflow.cs:233:32:233:32 | 0 | semmle.label | successor |
-| cflow.cs:233:17:233:32 | ... < ... | cflow.cs:226:9:237:9 | foreach (... ... in ...) ... | semmle.label | false |
-| cflow.cs:233:17:233:32 | ... < ... | cflow.cs:234:13:236:13 | {...} | semmle.label | true |
-| cflow.cs:233:32:233:32 | 0 | cflow.cs:233:17:233:32 | ... < ... | semmle.label | successor |
-| cflow.cs:234:13:236:13 | {...} | cflow.cs:235:17:235:22 | break; | semmle.label | successor |
-| cflow.cs:235:17:235:22 | break; | cflow.cs:224:10:224:16 | exit Foreach (normal) | semmle.label | break |
-| cflow.cs:240:10:240:13 | enter Goto | cflow.cs:241:5:259:5 | {...} | semmle.label | successor |
-| cflow.cs:240:10:240:13 | exit Goto (normal) | cflow.cs:240:10:240:13 | exit Goto | semmle.label | successor |
-| cflow.cs:241:5:259:5 | {...} | cflow.cs:242:9:242:13 | Label: | semmle.label | successor |
-| cflow.cs:242:9:242:13 | Label: | cflow.cs:242:16:242:45 | if (...) ... | semmle.label | successor |
-| cflow.cs:242:16:242:45 | if (...) ... | cflow.cs:242:23:242:27 | this access | semmle.label | successor |
-| cflow.cs:242:20:242:40 | [false] !... | cflow.cs:244:9:244:41 | if (...) ... | semmle.label | false |
-| cflow.cs:242:20:242:40 | [true] !... | cflow.cs:242:43:242:45 | {...} | semmle.label | true |
-| cflow.cs:242:21:242:40 | [false] !... | cflow.cs:242:20:242:40 | [true] !... | semmle.label | false |
-| cflow.cs:242:21:242:40 | [true] !... | cflow.cs:242:20:242:40 | [false] !... | semmle.label | true |
-| cflow.cs:242:23:242:27 | access to field Field | cflow.cs:242:23:242:34 | access to property Length | semmle.label | successor |
-| cflow.cs:242:23:242:27 | this access | cflow.cs:242:23:242:27 | access to field Field | semmle.label | successor |
-| cflow.cs:242:23:242:34 | access to property Length | cflow.cs:242:39:242:39 | 0 | semmle.label | successor |
-| cflow.cs:242:23:242:39 | ... == ... | cflow.cs:242:21:242:40 | [false] !... | semmle.label | true |
-| cflow.cs:242:23:242:39 | ... == ... | cflow.cs:242:21:242:40 | [true] !... | semmle.label | false |
-| cflow.cs:242:39:242:39 | 0 | cflow.cs:242:23:242:39 | ... == ... | semmle.label | successor |
-| cflow.cs:242:43:242:45 | {...} | cflow.cs:244:9:244:41 | if (...) ... | semmle.label | successor |
-| cflow.cs:244:9:244:41 | if (...) ... | cflow.cs:244:13:244:17 | this access | semmle.label | successor |
-| cflow.cs:244:13:244:17 | access to field Field | cflow.cs:244:13:244:24 | access to property Length | semmle.label | successor |
-| cflow.cs:244:13:244:17 | this access | cflow.cs:244:13:244:17 | access to field Field | semmle.label | successor |
-| cflow.cs:244:13:244:24 | access to property Length | cflow.cs:244:28:244:28 | 0 | semmle.label | successor |
-| cflow.cs:244:13:244:28 | ... > ... | cflow.cs:244:31:244:41 | goto ...; | semmle.label | true |
-| cflow.cs:244:13:244:28 | ... > ... | cflow.cs:246:9:258:9 | switch (...) {...} | semmle.label | false |
-| cflow.cs:244:28:244:28 | 0 | cflow.cs:244:13:244:28 | ... > ... | semmle.label | successor |
-| cflow.cs:244:31:244:41 | goto ...; | cflow.cs:242:9:242:13 | Label: | semmle.label | goto(Label) |
-| cflow.cs:246:9:258:9 | switch (...) {...} | cflow.cs:246:17:246:21 | this access | semmle.label | successor |
-| cflow.cs:246:17:246:21 | access to field Field | cflow.cs:246:17:246:28 | access to property Length | semmle.label | successor |
-| cflow.cs:246:17:246:21 | this access | cflow.cs:246:17:246:21 | access to field Field | semmle.label | successor |
-| cflow.cs:246:17:246:28 | access to property Length | cflow.cs:246:32:246:32 | 3 | semmle.label | successor |
-| cflow.cs:246:17:246:32 | ... + ... | cflow.cs:248:13:248:19 | case ...: | semmle.label | successor |
-| cflow.cs:246:32:246:32 | 3 | cflow.cs:246:17:246:32 | ... + ... | semmle.label | successor |
-| cflow.cs:248:13:248:19 | case ...: | cflow.cs:248:18:248:18 | 0 | semmle.label | successor |
-| cflow.cs:248:18:248:18 | 0 | cflow.cs:249:17:249:29 | goto default; | semmle.label | match |
-| cflow.cs:248:18:248:18 | 0 | cflow.cs:250:13:250:19 | case ...: | semmle.label | no-match |
-| cflow.cs:249:17:249:29 | goto default; | cflow.cs:255:13:255:20 | default: | semmle.label | goto(default) |
-| cflow.cs:250:13:250:19 | case ...: | cflow.cs:250:18:250:18 | 1 | semmle.label | successor |
-| cflow.cs:250:18:250:18 | 1 | cflow.cs:251:17:251:37 | ...; | semmle.label | match |
-| cflow.cs:250:18:250:18 | 1 | cflow.cs:253:13:253:19 | case ...: | semmle.label | no-match |
-| cflow.cs:251:17:251:36 | call to method WriteLine | cflow.cs:252:17:252:22 | break; | semmle.label | successor |
-| cflow.cs:251:17:251:37 | ...; | cflow.cs:251:35:251:35 | 1 | semmle.label | successor |
-| cflow.cs:251:35:251:35 | 1 | cflow.cs:251:17:251:36 | call to method WriteLine | semmle.label | successor |
-| cflow.cs:252:17:252:22 | break; | cflow.cs:240:10:240:13 | exit Goto (normal) | semmle.label | break |
-| cflow.cs:253:13:253:19 | case ...: | cflow.cs:253:18:253:18 | 2 | semmle.label | successor |
-| cflow.cs:253:18:253:18 | 2 | cflow.cs:254:17:254:27 | goto ...; | semmle.label | match |
-| cflow.cs:253:18:253:18 | 2 | cflow.cs:255:13:255:20 | default: | semmle.label | no-match |
-| cflow.cs:254:17:254:27 | goto ...; | cflow.cs:242:9:242:13 | Label: | semmle.label | goto(Label) |
-| cflow.cs:255:13:255:20 | default: | cflow.cs:256:17:256:37 | ...; | semmle.label | successor |
-| cflow.cs:256:17:256:36 | call to method WriteLine | cflow.cs:257:17:257:22 | break; | semmle.label | successor |
-| cflow.cs:256:17:256:37 | ...; | cflow.cs:256:35:256:35 | 0 | semmle.label | successor |
-| cflow.cs:256:35:256:35 | 0 | cflow.cs:256:17:256:36 | call to method WriteLine | semmle.label | successor |
-| cflow.cs:257:17:257:22 | break; | cflow.cs:240:10:240:13 | exit Goto (normal) | semmle.label | break |
-| cflow.cs:261:49:261:53 | enter Yield | cflow.cs:262:5:277:5 | {...} | semmle.label | successor |
-| cflow.cs:261:49:261:53 | exit Yield (normal) | cflow.cs:261:49:261:53 | exit Yield | semmle.label | successor |
-| cflow.cs:262:5:277:5 | {...} | cflow.cs:263:22:263:22 | 0 | semmle.label | successor |
-| cflow.cs:263:9:263:23 | yield return ...; | cflow.cs:264:9:267:9 | for (...;...;...) ... | semmle.label | successor |
-| cflow.cs:263:22:263:22 | 0 | cflow.cs:263:9:263:23 | yield return ...; | semmle.label | successor |
-| cflow.cs:264:9:267:9 | for (...;...;...) ... | cflow.cs:264:22:264:22 | 1 | semmle.label | successor |
-| cflow.cs:264:18:264:22 | Int32 i = ... | cflow.cs:264:25:264:25 | access to local variable i | semmle.label | successor |
-| cflow.cs:264:22:264:22 | 1 | cflow.cs:264:18:264:22 | Int32 i = ... | semmle.label | successor |
-| cflow.cs:264:25:264:25 | access to local variable i | cflow.cs:264:29:264:30 | 10 | semmle.label | successor |
-| cflow.cs:264:25:264:30 | ... < ... | cflow.cs:265:9:267:9 | {...} | semmle.label | true |
-| cflow.cs:264:25:264:30 | ... < ... | cflow.cs:268:9:276:9 | try {...} ... | semmle.label | false |
-| cflow.cs:264:29:264:30 | 10 | cflow.cs:264:25:264:30 | ... < ... | semmle.label | successor |
-| cflow.cs:264:33:264:33 | access to local variable i | cflow.cs:264:33:264:35 | ...++ | semmle.label | successor |
-| cflow.cs:264:33:264:35 | ...++ | cflow.cs:264:25:264:25 | access to local variable i | semmle.label | successor |
-| cflow.cs:265:9:267:9 | {...} | cflow.cs:266:26:266:26 | access to local variable i | semmle.label | successor |
-| cflow.cs:266:13:266:27 | yield return ...; | cflow.cs:264:33:264:33 | access to local variable i | semmle.label | successor |
-| cflow.cs:266:26:266:26 | access to local variable i | cflow.cs:266:13:266:27 | yield return ...; | semmle.label | successor |
-| cflow.cs:268:9:276:9 | try {...} ... | cflow.cs:269:9:272:9 | {...} | semmle.label | successor |
-| cflow.cs:269:9:272:9 | {...} | cflow.cs:270:13:270:24 | yield break; | semmle.label | successor |
-| cflow.cs:270:13:270:24 | yield break; | cflow.cs:274:9:276:9 | [finally: return] {...} | semmle.label | return |
-| cflow.cs:274:9:276:9 | [finally: return] {...} | cflow.cs:275:13:275:42 | [finally: return] ...; | semmle.label | successor |
-| cflow.cs:275:13:275:41 | [finally: return] call to method WriteLine | cflow.cs:261:49:261:53 | exit Yield (normal) | semmle.label | return |
-| cflow.cs:275:13:275:42 | [finally: return] ...; | cflow.cs:275:31:275:40 | [finally: return] "not dead" | semmle.label | successor |
-| cflow.cs:275:31:275:40 | [finally: return] "not dead" | cflow.cs:275:13:275:41 | [finally: return] call to method WriteLine | semmle.label | successor |
-| cflow.cs:282:5:282:18 | enter ControlFlowSub | cflow.cs:282:24:282:27 | call to constructor ControlFlow | semmle.label | successor |
-| cflow.cs:282:5:282:18 | exit ControlFlowSub (normal) | cflow.cs:282:5:282:18 | exit ControlFlowSub | semmle.label | successor |
-| cflow.cs:282:24:282:27 | call to constructor ControlFlow | cflow.cs:282:31:282:33 | {...} | semmle.label | successor |
-| cflow.cs:282:31:282:33 | {...} | cflow.cs:282:5:282:18 | exit ControlFlowSub (normal) | semmle.label | successor |
-| cflow.cs:284:5:284:18 | enter ControlFlowSub | cflow.cs:284:32:284:35 | call to constructor ControlFlowSub | semmle.label | successor |
-| cflow.cs:284:5:284:18 | exit ControlFlowSub (normal) | cflow.cs:284:5:284:18 | exit ControlFlowSub | semmle.label | successor |
-| cflow.cs:284:32:284:35 | call to constructor ControlFlowSub | cflow.cs:284:39:284:41 | {...} | semmle.label | successor |
-| cflow.cs:284:39:284:41 | {...} | cflow.cs:284:5:284:18 | exit ControlFlowSub (normal) | semmle.label | successor |
-| cflow.cs:286:5:286:18 | enter ControlFlowSub | cflow.cs:286:34:286:34 | access to parameter i | semmle.label | successor |
-| cflow.cs:286:5:286:18 | exit ControlFlowSub (normal) | cflow.cs:286:5:286:18 | exit ControlFlowSub | semmle.label | successor |
-| cflow.cs:286:29:286:32 | call to constructor ControlFlowSub | cflow.cs:286:48:286:50 | {...} | semmle.label | successor |
-| cflow.cs:286:34:286:34 | access to parameter i | cflow.cs:286:34:286:45 | call to method ToString | semmle.label | successor |
-| cflow.cs:286:34:286:45 | call to method ToString | cflow.cs:286:29:286:32 | call to constructor ControlFlowSub | semmle.label | successor |
-| cflow.cs:286:48:286:50 | {...} | cflow.cs:286:5:286:18 | exit ControlFlowSub (normal) | semmle.label | successor |
-| cflow.cs:291:12:291:12 | enter M | cflow.cs:291:38:291:38 | access to parameter f | semmle.label | successor |
-| cflow.cs:291:12:291:12 | exit M (normal) | cflow.cs:291:12:291:12 | exit M | semmle.label | successor |
-| cflow.cs:291:38:291:38 | access to parameter f | cflow.cs:291:40:291:40 | 0 | semmle.label | successor |
-| cflow.cs:291:38:291:41 | delegate call | cflow.cs:291:12:291:12 | exit M (normal) | semmle.label | successor |
-| cflow.cs:291:40:291:40 | 0 | cflow.cs:291:38:291:41 | delegate call | semmle.label | successor |
-| cflow.cs:296:5:296:25 | call to constructor Object | cflow.cs:296:52:296:54 | {...} | semmle.label | successor |
-| cflow.cs:296:5:296:25 | enter NegationInConstructor | cflow.cs:296:5:296:25 | call to constructor Object | semmle.label | successor |
-| cflow.cs:296:5:296:25 | exit NegationInConstructor (normal) | cflow.cs:296:5:296:25 | exit NegationInConstructor | semmle.label | successor |
-| cflow.cs:296:52:296:54 | {...} | cflow.cs:296:5:296:25 | exit NegationInConstructor (normal) | semmle.label | successor |
-| cflow.cs:298:10:298:10 | enter M | cflow.cs:299:5:301:5 | {...} | semmle.label | successor |
-| cflow.cs:298:10:298:10 | exit M (normal) | cflow.cs:298:10:298:10 | exit M | semmle.label | successor |
-| cflow.cs:299:5:301:5 | {...} | cflow.cs:300:9:300:73 | ...; | semmle.label | successor |
-| cflow.cs:300:9:300:72 | object creation of type NegationInConstructor | cflow.cs:298:10:298:10 | exit M (normal) | semmle.label | successor |
-| cflow.cs:300:9:300:73 | ...; | cflow.cs:300:38:300:38 | 0 | semmle.label | successor |
-| cflow.cs:300:38:300:38 | 0 | cflow.cs:300:46:300:46 | access to parameter i | semmle.label | successor |
-| cflow.cs:300:44:300:51 | [false] !... | cflow.cs:300:44:300:64 | ... && ... | semmle.label | false |
-| cflow.cs:300:44:300:51 | [true] !... | cflow.cs:300:56:300:56 | access to parameter s | semmle.label | true |
-| cflow.cs:300:44:300:64 | ... && ... | cflow.cs:300:70:300:71 | "" | semmle.label | successor |
-| cflow.cs:300:46:300:46 | access to parameter i | cflow.cs:300:50:300:50 | 0 | semmle.label | successor |
-| cflow.cs:300:46:300:50 | ... > ... | cflow.cs:300:44:300:51 | [false] !... | semmle.label | true |
-| cflow.cs:300:46:300:50 | ... > ... | cflow.cs:300:44:300:51 | [true] !... | semmle.label | false |
-| cflow.cs:300:50:300:50 | 0 | cflow.cs:300:46:300:50 | ... > ... | semmle.label | successor |
-| cflow.cs:300:56:300:56 | access to parameter s | cflow.cs:300:61:300:64 | null | semmle.label | successor |
-| cflow.cs:300:56:300:64 | ... != ... | cflow.cs:300:44:300:64 | ... && ... | semmle.label | successor |
-| cflow.cs:300:61:300:64 | null | cflow.cs:300:56:300:64 | ... != ... | semmle.label | successor |
-| cflow.cs:300:70:300:71 | "" | cflow.cs:300:9:300:72 | object creation of type NegationInConstructor | semmle.label | successor |
+AccessorCalls.cs:
+# 5| enter get_Item
+#-----| -> access to parameter i
+
+# 5| exit get_Item
+
+# 5| exit get_Item (normal)
+#-----| -> exit get_Item
+
+# 5| access to parameter i
+#-----| -> exit get_Item (normal)
+
+# 5| enter set_Item
+#-----| -> {...}
+
+# 5| exit set_Item
+
+# 5| exit set_Item (normal)
+#-----| -> exit set_Item
+
+# 5| {...}
+#-----| -> exit set_Item (normal)
+
+# 7| enter add_Event
+#-----| -> {...}
+
+# 7| exit add_Event
+
+# 7| exit add_Event (normal)
+#-----| -> exit add_Event
+
+# 7| {...}
+#-----| -> exit add_Event (normal)
+
+# 7| enter remove_Event
+#-----| -> {...}
+
+# 7| exit remove_Event
+
+# 7| exit remove_Event (normal)
+#-----| -> exit remove_Event
+
+# 7| {...}
+#-----| -> exit remove_Event (normal)
+
+# 10| enter M1
+#-----| -> {...}
+
+# 10| exit M1
+
+# 10| exit M1 (normal)
+#-----| -> exit M1
+
+# 11| {...}
+#-----| -> ...;
+
+# 12| ...;
+#-----| -> this access
+
+# 12| ... = ...
+#-----| -> ...;
+
+# 12| this access
+#-----| -> this access
+
+# 12| access to field Field
+#-----| -> ... = ...
+
+# 12| this access
+#-----| -> access to field Field
+
+# 13| ...;
+#-----| -> this access
+
+# 13| ... = ...
+#-----| -> ...;
+
+# 13| access to property Prop
+#-----| -> ... = ...
+
+# 13| this access
+#-----| -> this access
+
+# 13| access to property Prop
+#-----| -> access to property Prop
+
+# 13| this access
+#-----| -> access to property Prop
+
+# 14| ...;
+#-----| -> this access
+
+# 14| ... = ...
+#-----| -> ...;
+
+# 14| access to indexer
+#-----| -> ... = ...
+
+# 14| this access
+#-----| -> 0
+
+# 14| 0
+#-----| -> this access
+
+# 14| access to indexer
+#-----| -> access to indexer
+
+# 14| this access
+#-----| -> 1
+
+# 14| 1
+#-----| -> access to indexer
+
+# 15| ...;
+#-----| -> this access
+
+# 15| ... += ...
+#-----| -> ...;
+
+# 15| access to event Event
+#-----| -> ... += ...
+
+# 15| this access
+#-----| -> access to parameter e
+
+# 15| access to parameter e
+#-----| -> access to event Event
+
+# 16| ...;
+#-----| -> this access
+
+# 16| ... -= ...
+#-----| -> exit M1 (normal)
+
+# 16| access to event Event
+#-----| -> ... -= ...
+
+# 16| this access
+#-----| -> access to parameter e
+
+# 16| access to parameter e
+#-----| -> access to event Event
+
+# 19| enter M2
+#-----| -> {...}
+
+# 19| exit M2
+
+# 19| exit M2 (normal)
+#-----| -> exit M2
+
+# 20| {...}
+#-----| -> ...;
+
+# 21| ...;
+#-----| -> this access
+
+# 21| ... = ...
+#-----| -> ...;
+
+# 21| access to field x
+#-----| -> this access
+
+# 21| this access
+#-----| -> access to field x
+
+# 21| access to field Field
+#-----| -> ... = ...
+
+# 21| access to field x
+#-----| -> access to field Field
+
+# 21| this access
+#-----| -> access to field x
+
+# 22| ...;
+#-----| -> this access
+
+# 22| ... = ...
+#-----| -> ...;
+
+# 22| access to property Prop
+#-----| -> ... = ...
+
+# 22| access to field x
+#-----| -> this access
+
+# 22| this access
+#-----| -> access to field x
+
+# 22| access to property Prop
+#-----| -> access to property Prop
+
+# 22| access to field x
+#-----| -> access to property Prop
+
+# 22| this access
+#-----| -> access to field x
+
+# 23| ...;
+#-----| -> this access
+
+# 23| ... = ...
+#-----| -> ...;
+
+# 23| access to indexer
+#-----| -> ... = ...
+
+# 23| access to field x
+#-----| -> 0
+
+# 23| this access
+#-----| -> access to field x
+
+# 23| 0
+#-----| -> this access
+
+# 23| access to indexer
+#-----| -> access to indexer
+
+# 23| access to field x
+#-----| -> 1
+
+# 23| this access
+#-----| -> access to field x
+
+# 23| 1
+#-----| -> access to indexer
+
+# 24| ...;
+#-----| -> this access
+
+# 24| ... += ...
+#-----| -> ...;
+
+# 24| access to event Event
+#-----| -> ... += ...
+
+# 24| access to field x
+#-----| -> access to parameter e
+
+# 24| this access
+#-----| -> access to field x
+
+# 24| access to parameter e
+#-----| -> access to event Event
+
+# 25| ...;
+#-----| -> this access
+
+# 25| ... -= ...
+#-----| -> exit M2 (normal)
+
+# 25| access to event Event
+#-----| -> ... -= ...
+
+# 25| access to field x
+#-----| -> access to parameter e
+
+# 25| this access
+#-----| -> access to field x
+
+# 25| access to parameter e
+#-----| -> access to event Event
+
+# 28| enter M3
+#-----| -> {...}
+
+# 28| exit M3
+
+# 28| exit M3 (normal)
+#-----| -> exit M3
+
+# 29| {...}
+#-----| -> ...;
+
+# 30| ...;
+#-----| -> this access
+
+# 30| ...++
+#-----| -> ...;
+
+# 30| access to field Field
+#-----| -> ...++
+
+# 30| this access
+#-----| -> access to field Field
+
+# 31| ...;
+#-----| -> this access
+
+# 31| ...++
+#-----| -> ...;
+
+# 31| access to property Prop
+#-----| -> ...++
+
+# 31| this access
+#-----| -> access to property Prop
+
+# 32| ...;
+#-----| -> this access
+
+# 32| ...++
+#-----| -> exit M3 (normal)
+
+# 32| access to indexer
+#-----| -> ...++
+
+# 32| this access
+#-----| -> 0
+
+# 32| 0
+#-----| -> access to indexer
+
+# 35| enter M4
+#-----| -> {...}
+
+# 35| exit M4
+
+# 35| exit M4 (normal)
+#-----| -> exit M4
+
+# 36| {...}
+#-----| -> ...;
+
+# 37| ...;
+#-----| -> this access
+
+# 37| ...++
+#-----| -> ...;
+
+# 37| access to field Field
+#-----| -> ...++
+
+# 37| access to field x
+#-----| -> access to field Field
+
+# 37| this access
+#-----| -> access to field x
+
+# 38| ...;
+#-----| -> this access
+
+# 38| ...++
+#-----| -> ...;
+
+# 38| access to property Prop
+#-----| -> ...++
+
+# 38| access to field x
+#-----| -> access to property Prop
+
+# 38| this access
+#-----| -> access to field x
+
+# 39| ...;
+#-----| -> this access
+
+# 39| ...++
+#-----| -> exit M4 (normal)
+
+# 39| access to indexer
+#-----| -> ...++
+
+# 39| access to field x
+#-----| -> 0
+
+# 39| this access
+#-----| -> access to field x
+
+# 39| 0
+#-----| -> access to indexer
+
+# 42| enter M5
+#-----| -> {...}
+
+# 42| exit M5
+
+# 42| exit M5 (normal)
+#-----| -> exit M5
+
+# 43| {...}
+#-----| -> ...;
+
+# 44| ...;
+#-----| -> this access
+
+# 44| ... = ...
+#-----| -> ...;
+
+# 44| this access
+#-----| -> this access
+
+# 44| ... + ...
+#-----| -> ... = ...
+
+# 44| access to field Field
+#-----| -> this access
+
+# 44| this access
+#-----| -> access to field Field
+
+# 44| access to field Field
+#-----| -> ... + ...
+
+# 44| this access
+#-----| -> access to field Field
+
+# 45| ...;
+#-----| -> this access
+
+# 45| ... = ...
+#-----| -> ...;
+
+# 45| access to property Prop
+#-----| -> ... = ...
+
+# 45| this access
+#-----| -> this access
+
+# 45| ... + ...
+#-----| -> access to property Prop
+
+# 45| access to property Prop
+#-----| -> this access
+
+# 45| this access
+#-----| -> access to property Prop
+
+# 45| access to property Prop
+#-----| -> ... + ...
+
+# 45| this access
+#-----| -> access to property Prop
+
+# 46| ...;
+#-----| -> this access
+
+# 46| ... = ...
+#-----| -> exit M5 (normal)
+
+# 46| access to indexer
+#-----| -> ... = ...
+
+# 46| this access
+#-----| -> 0
+
+# 46| ... + ...
+#-----| -> access to indexer
+
+# 46| access to indexer
+#-----| -> this access
+
+# 46| this access
+#-----| -> 0
+
+# 46| 0
+#-----| -> this access
+
+# 46| 0
+#-----| -> access to indexer
+
+# 46| access to indexer
+#-----| -> ... + ...
+
+# 46| this access
+#-----| -> 0
+
+# 46| 0
+#-----| -> access to indexer
+
+# 49| enter M6
+#-----| -> {...}
+
+# 49| exit M6
+
+# 49| exit M6 (normal)
+#-----| -> exit M6
+
+# 50| {...}
+#-----| -> ...;
+
+# 51| ...;
+#-----| -> this access
+
+# 51| ... = ...
+#-----| -> ...;
+
+# 51| access to field x
+#-----| -> this access
+
+# 51| this access
+#-----| -> access to field x
+
+# 51| ... + ...
+#-----| -> ... = ...
+
+# 51| access to field Field
+#-----| -> this access
+
+# 51| access to field x
+#-----| -> access to field Field
+
+# 51| this access
+#-----| -> access to field x
+
+# 51| access to field Field
+#-----| -> ... + ...
+
+# 51| access to field x
+#-----| -> access to field Field
+
+# 51| this access
+#-----| -> access to field x
+
+# 52| ...;
+#-----| -> this access
+
+# 52| ... = ...
+#-----| -> ...;
+
+# 52| access to property Prop
+#-----| -> ... = ...
+
+# 52| access to field x
+#-----| -> this access
+
+# 52| this access
+#-----| -> access to field x
+
+# 52| ... + ...
+#-----| -> access to property Prop
+
+# 52| access to property Prop
+#-----| -> this access
+
+# 52| access to field x
+#-----| -> access to property Prop
+
+# 52| this access
+#-----| -> access to field x
+
+# 52| access to property Prop
+#-----| -> ... + ...
+
+# 52| access to field x
+#-----| -> access to property Prop
+
+# 52| this access
+#-----| -> access to field x
+
+# 53| ...;
+#-----| -> this access
+
+# 53| ... = ...
+#-----| -> exit M6 (normal)
+
+# 53| access to indexer
+#-----| -> ... = ...
+
+# 53| access to field x
+#-----| -> 0
+
+# 53| this access
+#-----| -> access to field x
+
+# 53| ... + ...
+#-----| -> access to indexer
+
+# 53| access to indexer
+#-----| -> this access
+
+# 53| access to field x
+#-----| -> 0
+
+# 53| this access
+#-----| -> access to field x
+
+# 53| 0
+#-----| -> this access
+
+# 53| 0
+#-----| -> access to indexer
+
+# 53| access to indexer
+#-----| -> ... + ...
+
+# 53| access to field x
+#-----| -> 0
+
+# 53| this access
+#-----| -> access to field x
+
+# 53| 0
+#-----| -> access to indexer
+
+# 56| enter M7
+#-----| -> {...}
+
+# 56| exit M7
+
+# 56| exit M7 (normal)
+#-----| -> exit M7
+
+# 57| {...}
+#-----| -> ...;
+
+# 58| ...;
+#-----| -> this access
+
+# 58| ... = ...
+#-----| -> exit M7 (normal)
+
+# 58| (..., ...)
+#-----| -> this access
+
+# 58| this access
+#-----| -> this access
+
+# 58| access to property Prop
+#-----| -> access to indexer
+
+# 58| this access
+#-----| -> this access
+
+# 58| (..., ...)
+#-----| -> (..., ...)
+
+# 58| access to indexer
+#-----| -> ... = ...
+
+# 58| this access
+#-----| -> 0
+
+# 58| 0
+#-----| -> (..., ...)
+
+# 58| (..., ...)
+#-----| -> access to property Prop
+
+# 58| access to field Field
+#-----| -> this access
+
+# 58| this access
+#-----| -> access to field Field
+
+# 58| access to property Prop
+#-----| -> 0
+
+# 58| this access
+#-----| -> access to property Prop
+
+# 58| (..., ...)
+#-----| -> (..., ...)
+
+# 58| 0
+#-----| -> this access
+
+# 58| access to indexer
+#-----| -> (..., ...)
+
+# 58| this access
+#-----| -> 1
+
+# 58| 1
+#-----| -> access to indexer
+
+# 61| enter M8
+#-----| -> {...}
+
+# 61| exit M8
+
+# 61| exit M8 (normal)
+#-----| -> exit M8
+
+# 62| {...}
+#-----| -> ...;
+
+# 63| ...;
+#-----| -> this access
+
+# 63| ... = ...
+#-----| -> exit M8 (normal)
+
+# 63| (..., ...)
+#-----| -> this access
+
+# 63| access to field x
+#-----| -> this access
+
+# 63| this access
+#-----| -> access to field x
+
+# 63| access to property Prop
+#-----| -> access to indexer
+
+# 63| access to field x
+#-----| -> this access
+
+# 63| this access
+#-----| -> access to field x
+
+# 63| (..., ...)
+#-----| -> (..., ...)
+
+# 63| access to indexer
+#-----| -> ... = ...
+
+# 63| access to field x
+#-----| -> 0
+
+# 63| this access
+#-----| -> access to field x
+
+# 63| 0
+#-----| -> (..., ...)
+
+# 63| (..., ...)
+#-----| -> access to property Prop
+
+# 63| access to field Field
+#-----| -> this access
+
+# 63| access to field x
+#-----| -> access to field Field
+
+# 63| this access
+#-----| -> access to field x
+
+# 63| access to property Prop
+#-----| -> 0
+
+# 63| access to field x
+#-----| -> access to property Prop
+
+# 63| this access
+#-----| -> access to field x
+
+# 63| (..., ...)
+#-----| -> (..., ...)
+
+# 63| 0
+#-----| -> this access
+
+# 63| access to indexer
+#-----| -> (..., ...)
+
+# 63| access to field x
+#-----| -> 1
+
+# 63| this access
+#-----| -> access to field x
+
+# 63| 1
+#-----| -> access to indexer
+
+# 66| enter M9
+#-----| -> {...}
+
+# 66| exit M9
+
+# 66| exit M9 (normal)
+#-----| -> exit M9
+
+# 67| {...}
+#-----| -> ... ...;
+
+# 68| ... ...;
+#-----| -> access to parameter o
+
+# 68| dynamic d = ...
+#-----| -> ...;
+
+# 68| access to parameter o
+#-----| -> dynamic d = ...
+
+# 69| ...;
+#-----| -> access to local variable d
+
+# 69| ... = ...
+#-----| -> ...;
+
+# 69| dynamic access to member MaybeProp1
+#-----| -> ... = ...
+
+# 69| access to local variable d
+#-----| -> access to local variable d
+
+# 69| dynamic access to member MaybeProp2
+#-----| -> dynamic access to member MaybeProp1
+
+# 69| access to local variable d
+#-----| -> dynamic access to member MaybeProp2
+
+# 70| ...;
+#-----| -> access to local variable d
+
+# 70| dynamic call to operator ++
+#-----| -> ...;
+
+# 70| dynamic access to member MaybeProp
+#-----| -> dynamic call to operator ++
+
+# 70| access to local variable d
+#-----| -> dynamic access to member MaybeProp
+
+# 71| ...;
+#-----| -> access to local variable d
+
+# 71| ... = ...
+#-----| -> ...;
+
+# 71| dynamic access to member MaybeEvent
+#-----| -> ... = ...
+
+# 71| access to local variable d
+#-----| -> access to local variable d
+
+# 71| dynamic call to operator +
+#-----| -> dynamic access to member MaybeEvent
+
+# 71| dynamic access to member MaybeEvent
+#-----| -> access to parameter e
+
+# 71| access to local variable d
+#-----| -> dynamic access to member MaybeEvent
+
+# 71| access to parameter e
+#-----| -> dynamic call to operator +
+
+# 72| ...;
+#-----| -> access to local variable d
+
+# 72| ... = ...
+#-----| -> ...;
+
+# 72| dynamic access to element
+#-----| -> ... = ...
+
+# 72| access to local variable d
+#-----| -> 0
+
+# 72| dynamic call to operator +
+#-----| -> dynamic access to element
+
+# 72| dynamic access to element
+#-----| -> access to local variable d
+
+# 72| access to local variable d
+#-----| -> 0
+
+# 72| 0
+#-----| -> access to local variable d
+
+# 72| 0
+#-----| -> dynamic access to element
+
+# 72| dynamic access to element
+#-----| -> dynamic call to operator +
+
+# 72| access to local variable d
+#-----| -> 1
+
+# 72| 1
+#-----| -> dynamic access to element
+
+# 73| ...;
+#-----| -> access to local variable d
+
+# 73| ... = ...
+#-----| -> exit M9 (normal)
+
+# 73| (..., ...)
+#-----| -> access to local variable d
+
+# 73| dynamic access to member MaybeProp1
+#-----| -> access to property Prop
+
+# 73| access to local variable d
+#-----| -> this access
+
+# 73| access to property Prop
+#-----| -> dynamic access to element
+
+# 73| this access
+#-----| -> access to local variable d
+
+# 73| (..., ...)
+#-----| -> (..., ...)
+
+# 73| dynamic access to element
+#-----| -> ... = ...
+
+# 73| access to local variable d
+#-----| -> 0
+
+# 73| 0
+#-----| -> (..., ...)
+
+# 73| (..., ...)
+#-----| -> dynamic access to member MaybeProp1
+
+# 73| dynamic access to member MaybeProp1
+#-----| -> this access
+
+# 73| access to local variable d
+#-----| -> dynamic access to member MaybeProp1
+
+# 73| access to property Prop
+#-----| -> 0
+
+# 73| this access
+#-----| -> access to property Prop
+
+# 73| (..., ...)
+#-----| -> (..., ...)
+
+# 73| 0
+#-----| -> access to local variable d
+
+# 73| dynamic access to element
+#-----| -> (..., ...)
+
+# 73| access to local variable d
+#-----| -> 1
+
+# 73| 1
+#-----| -> dynamic access to element
+
+ArrayCreation.cs:
+# 3| enter M1
+#-----| -> 0
+
+# 3| exit M1
+
+# 3| exit M1 (normal)
+#-----| -> exit M1
+
+# 3| array creation of type Int32[]
+#-----| -> exit M1 (normal)
+
+# 3| 0
+#-----| -> array creation of type Int32[]
+
+# 5| enter M2
+#-----| -> 0
+
+# 5| exit M2
+
+# 5| exit M2 (normal)
+#-----| -> exit M2
+
+# 5| array creation of type Int32[,]
+#-----| -> exit M2 (normal)
+
+# 5| 0
+#-----| -> 1
+
+# 5| 1
+#-----| -> array creation of type Int32[,]
+
+# 7| enter M3
+#-----| -> 2
+
+# 7| exit M3
+
+# 7| exit M3 (normal)
+#-----| -> exit M3
+
+# 7| array creation of type Int32[]
+#-----| -> 0
+
+# 7| 2
+#-----| -> array creation of type Int32[]
+
+# 7| { ..., ... }
+#-----| -> exit M3 (normal)
+
+# 7| 0
+#-----| -> 1
+
+# 7| 1
+#-----| -> { ..., ... }
+
+# 9| enter M4
+#-----| -> 2
+
+# 9| exit M4
+
+# 9| exit M4 (normal)
+#-----| -> exit M4
+
+# 9| array creation of type Int32[,]
+#-----| -> 0
+
+# 9| 2
+#-----| -> 2
+
+# 9| 2
+#-----| -> array creation of type Int32[,]
+
+# 9| { ..., ... }
+#-----| -> exit M4 (normal)
+
+# 9| { ..., ... }
+#-----| -> 2
+
+# 9| 0
+#-----| -> 1
+
+# 9| 1
+#-----| -> { ..., ... }
+
+# 9| { ..., ... }
+#-----| -> { ..., ... }
+
+# 9| 2
+#-----| -> 3
+
+# 9| 3
+#-----| -> { ..., ... }
+
+Assert.cs:
+# 7| enter M1
+#-----| -> {...}
+
+# 7| exit M1
+
+# 7| exit M1 (abnormal)
+#-----| -> exit M1
+
+# 7| exit M1 (normal)
+#-----| -> exit M1
+
+# 8| {...}
+#-----| -> ... ...;
+
+# 9| ... ...;
+#-----| -> access to parameter b
+
+# 9| String s = ...
+#-----| -> ...;
+
+# 9| ... ? ... : ...
+#-----| -> String s = ...
+
+# 9| access to parameter b
+#-----| true -> null
+#-----| false -> ""
+
+# 9| null
+#-----| -> ... ? ... : ...
+
+# 9| ""
+#-----| -> ... ? ... : ...
+
+# 10| ...;
+#-----| -> access to local variable s
+
+# 10| [assertion failure] call to method Assert
+#-----| exit -> exit M1 (abnormal)
+
+# 10| [assertion success] call to method Assert
+#-----| -> ...;
+
+# 10| ... != ...
+#-----| false -> [assertion failure] call to method Assert
+#-----| true -> [assertion success] call to method Assert
+
+# 10| access to local variable s
+#-----| -> null
+
+# 10| null
+#-----| -> ... != ...
+
+# 11| ...;
+#-----| -> access to local variable s
+
+# 11| call to method WriteLine
+#-----| -> exit M1 (normal)
+
+# 11| access to property Length
+#-----| -> call to method WriteLine
+
+# 11| access to local variable s
+#-----| -> access to property Length
+
+# 14| enter M2
+#-----| -> {...}
+
+# 14| exit M2
+
+# 14| exit M2 (abnormal)
+#-----| -> exit M2
+
+# 14| exit M2 (normal)
+#-----| -> exit M2
+
+# 15| {...}
+#-----| -> ... ...;
+
+# 16| ... ...;
+#-----| -> access to parameter b
+
+# 16| String s = ...
+#-----| -> ...;
+
+# 16| ... ? ... : ...
+#-----| -> String s = ...
+
+# 16| access to parameter b
+#-----| true -> null
+#-----| false -> ""
+
+# 16| null
+#-----| -> ... ? ... : ...
+
+# 16| ""
+#-----| -> ... ? ... : ...
+
+# 17| ...;
+#-----| -> access to local variable s
+
+# 17| [assertion failure] call to method IsNull
+#-----| exception(AssertFailedException) -> exit M2 (abnormal)
+
+# 17| [assertion success] call to method IsNull
+#-----| -> ...;
+
+# 17| access to local variable s
+#-----| non-null -> [assertion failure] call to method IsNull
+#-----| null -> [assertion success] call to method IsNull
+
+# 18| ...;
+#-----| -> access to local variable s
+
+# 18| call to method WriteLine
+#-----| -> exit M2 (normal)
+
+# 18| access to property Length
+#-----| -> call to method WriteLine
+
+# 18| access to local variable s
+#-----| -> access to property Length
+
+# 21| enter M3
+#-----| -> {...}
+
+# 21| exit M3
+
+# 21| exit M3 (abnormal)
+#-----| -> exit M3
+
+# 21| exit M3 (normal)
+#-----| -> exit M3
+
+# 22| {...}
+#-----| -> ... ...;
+
+# 23| ... ...;
+#-----| -> access to parameter b
+
+# 23| String s = ...
+#-----| -> ...;
+
+# 23| ... ? ... : ...
+#-----| -> String s = ...
+
+# 23| access to parameter b
+#-----| true -> null
+#-----| false -> ""
+
+# 23| null
+#-----| -> ... ? ... : ...
+
+# 23| ""
+#-----| -> ... ? ... : ...
+
+# 24| ...;
+#-----| -> access to local variable s
+
+# 24| [assertion failure] call to method IsNotNull
+#-----| exception(AssertFailedException) -> exit M3 (abnormal)
+
+# 24| [assertion success] call to method IsNotNull
+#-----| -> ...;
+
+# 24| access to local variable s
+#-----| null -> [assertion failure] call to method IsNotNull
+#-----| non-null -> [assertion success] call to method IsNotNull
+
+# 25| ...;
+#-----| -> access to local variable s
+
+# 25| call to method WriteLine
+#-----| -> exit M3 (normal)
+
+# 25| access to property Length
+#-----| -> call to method WriteLine
+
+# 25| access to local variable s
+#-----| -> access to property Length
+
+# 28| enter M4
+#-----| -> {...}
+
+# 28| exit M4
+
+# 28| exit M4 (abnormal)
+#-----| -> exit M4
+
+# 28| exit M4 (normal)
+#-----| -> exit M4
+
+# 29| {...}
+#-----| -> ... ...;
+
+# 30| ... ...;
+#-----| -> access to parameter b
+
+# 30| String s = ...
+#-----| -> ...;
+
+# 30| ... ? ... : ...
+#-----| -> String s = ...
+
+# 30| access to parameter b
+#-----| true -> null
+#-----| false -> ""
+
+# 30| null
+#-----| -> ... ? ... : ...
+
+# 30| ""
+#-----| -> ... ? ... : ...
+
+# 31| ...;
+#-----| -> access to local variable s
+
+# 31| [assertion failure] call to method IsTrue
+#-----| exception(AssertFailedException) -> exit M4 (abnormal)
+
+# 31| [assertion success] call to method IsTrue
+#-----| -> ...;
+
+# 31| ... == ...
+#-----| false -> [assertion failure] call to method IsTrue
+#-----| true -> [assertion success] call to method IsTrue
+
+# 31| access to local variable s
+#-----| -> null
+
+# 31| null
+#-----| -> ... == ...
+
+# 32| ...;
+#-----| -> access to local variable s
+
+# 32| call to method WriteLine
+#-----| -> exit M4 (normal)
+
+# 32| access to property Length
+#-----| -> call to method WriteLine
+
+# 32| access to local variable s
+#-----| -> access to property Length
+
+# 35| enter M5
+#-----| -> {...}
+
+# 35| exit M5
+
+# 35| exit M5 (abnormal)
+#-----| -> exit M5
+
+# 35| exit M5 (normal)
+#-----| -> exit M5
+
+# 36| {...}
+#-----| -> ... ...;
+
+# 37| ... ...;
+#-----| -> access to parameter b
+
+# 37| String s = ...
+#-----| -> ...;
+
+# 37| ... ? ... : ...
+#-----| -> String s = ...
+
+# 37| access to parameter b
+#-----| true -> null
+#-----| false -> ""
+
+# 37| null
+#-----| -> ... ? ... : ...
+
+# 37| ""
+#-----| -> ... ? ... : ...
+
+# 38| ...;
+#-----| -> access to local variable s
+
+# 38| [assertion failure] call to method IsTrue
+#-----| exception(AssertFailedException) -> exit M5 (abnormal)
+
+# 38| [assertion success] call to method IsTrue
+#-----| -> ...;
+
+# 38| ... != ...
+#-----| false -> [assertion failure] call to method IsTrue
+#-----| true -> [assertion success] call to method IsTrue
+
+# 38| access to local variable s
+#-----| -> null
+
+# 38| null
+#-----| -> ... != ...
+
+# 39| ...;
+#-----| -> access to local variable s
+
+# 39| call to method WriteLine
+#-----| -> exit M5 (normal)
+
+# 39| access to property Length
+#-----| -> call to method WriteLine
+
+# 39| access to local variable s
+#-----| -> access to property Length
+
+# 42| enter M6
+#-----| -> {...}
+
+# 42| exit M6
+
+# 42| exit M6 (abnormal)
+#-----| -> exit M6
+
+# 42| exit M6 (normal)
+#-----| -> exit M6
+
+# 43| {...}
+#-----| -> ... ...;
+
+# 44| ... ...;
+#-----| -> access to parameter b
+
+# 44| String s = ...
+#-----| -> ...;
+
+# 44| ... ? ... : ...
+#-----| -> String s = ...
+
+# 44| access to parameter b
+#-----| true -> null
+#-----| false -> ""
+
+# 44| null
+#-----| -> ... ? ... : ...
+
+# 44| ""
+#-----| -> ... ? ... : ...
+
+# 45| ...;
+#-----| -> access to local variable s
+
+# 45| [assertion failure] call to method IsFalse
+#-----| exception(AssertFailedException) -> exit M6 (abnormal)
+
+# 45| [assertion success] call to method IsFalse
+#-----| -> ...;
+
+# 45| ... != ...
+#-----| true -> [assertion failure] call to method IsFalse
+#-----| false -> [assertion success] call to method IsFalse
+
+# 45| access to local variable s
+#-----| -> null
+
+# 45| null
+#-----| -> ... != ...
+
+# 46| ...;
+#-----| -> access to local variable s
+
+# 46| call to method WriteLine
+#-----| -> exit M6 (normal)
+
+# 46| access to property Length
+#-----| -> call to method WriteLine
+
+# 46| access to local variable s
+#-----| -> access to property Length
+
+# 49| enter M7
+#-----| -> {...}
+
+# 49| exit M7
+
+# 49| exit M7 (abnormal)
+#-----| -> exit M7
+
+# 49| exit M7 (normal)
+#-----| -> exit M7
+
+# 50| {...}
+#-----| -> ... ...;
+
+# 51| ... ...;
+#-----| -> access to parameter b
+
+# 51| String s = ...
+#-----| -> ...;
+
+# 51| ... ? ... : ...
+#-----| -> String s = ...
+
+# 51| access to parameter b
+#-----| true -> null
+#-----| false -> ""
+
+# 51| null
+#-----| -> ... ? ... : ...
+
+# 51| ""
+#-----| -> ... ? ... : ...
+
+# 52| ...;
+#-----| -> access to local variable s
+
+# 52| [assertion failure] call to method IsFalse
+#-----| exception(AssertFailedException) -> exit M7 (abnormal)
+
+# 52| [assertion success] call to method IsFalse
+#-----| -> ...;
+
+# 52| ... == ...
+#-----| true -> [assertion failure] call to method IsFalse
+#-----| false -> [assertion success] call to method IsFalse
+
+# 52| access to local variable s
+#-----| -> null
+
+# 52| null
+#-----| -> ... == ...
+
+# 53| ...;
+#-----| -> access to local variable s
+
+# 53| call to method WriteLine
+#-----| -> exit M7 (normal)
+
+# 53| access to property Length
+#-----| -> call to method WriteLine
+
+# 53| access to local variable s
+#-----| -> access to property Length
+
+# 56| enter M8
+#-----| -> {...}
+
+# 56| exit M8
+
+# 56| exit M8 (abnormal)
+#-----| -> exit M8
+
+# 56| exit M8 (normal)
+#-----| -> exit M8
+
+# 57| {...}
+#-----| -> ... ...;
+
+# 58| ... ...;
+#-----| -> access to parameter b
+
+# 58| [b (line 56): false] String s = ...
+#-----| -> [b (line 56): false] ...;
+
+# 58| [b (line 56): true] String s = ...
+#-----| -> [b (line 56): true] ...;
+
+# 58| [b (line 56): false] ... ? ... : ...
+#-----| -> [b (line 56): false] String s = ...
+
+# 58| [b (line 56): true] ... ? ... : ...
+#-----| -> [b (line 56): true] String s = ...
+
+# 58| access to parameter b
+#-----| true -> [b (line 56): true] null
+#-----| false -> [b (line 56): false] ""
+
+# 58| [b (line 56): true] null
+#-----| -> [b (line 56): true] ... ? ... : ...
+
+# 58| [b (line 56): false] ""
+#-----| -> [b (line 56): false] ... ? ... : ...
+
+# 59| [b (line 56): false] ...;
+#-----| -> [b (line 56): false] access to local variable s
+
+# 59| [b (line 56): true] ...;
+#-----| -> [b (line 56): true] access to local variable s
+
+# 59| [assertion failure] call to method IsTrue
+#-----| exception(AssertFailedException) -> exit M8 (abnormal)
+
+# 59| [assertion success] call to method IsTrue
+#-----| -> ...;
+
+# 59| [false] ... && ...
+#-----| false -> [assertion failure] call to method IsTrue
+
+# 59| [true] ... && ...
+#-----| true -> [assertion success] call to method IsTrue
+
+# 59| [b (line 56): false] ... != ...
+#-----| false -> [false] ... && ...
+#-----| true -> [b (line 56): false] access to parameter b
+
+# 59| [b (line 56): true] ... != ...
+#-----| false -> [false] ... && ...
+#-----| true -> [b (line 56): true] access to parameter b
+
+# 59| [b (line 56): false] access to local variable s
+#-----| -> [b (line 56): false] null
+
+# 59| [b (line 56): true] access to local variable s
+#-----| -> [b (line 56): true] null
+
+# 59| [b (line 56): false] null
+#-----| -> [b (line 56): false] ... != ...
+
+# 59| [b (line 56): true] null
+#-----| -> [b (line 56): true] ... != ...
+
+# 59| [b (line 56): false] access to parameter b
+#-----| false -> [false] ... && ...
+
+# 59| [b (line 56): true] access to parameter b
+#-----| true -> [true] ... && ...
+
+# 60| ...;
+#-----| -> access to local variable s
+
+# 60| call to method WriteLine
+#-----| -> exit M8 (normal)
+
+# 60| access to property Length
+#-----| -> call to method WriteLine
+
+# 60| access to local variable s
+#-----| -> access to property Length
+
+# 63| enter M9
+#-----| -> {...}
+
+# 63| exit M9
+
+# 63| exit M9 (abnormal)
+#-----| -> exit M9
+
+# 63| exit M9 (normal)
+#-----| -> exit M9
+
+# 64| {...}
+#-----| -> ... ...;
+
+# 65| ... ...;
+#-----| -> access to parameter b
+
+# 65| [b (line 63): false] String s = ...
+#-----| -> [b (line 63): false] ...;
+
+# 65| [b (line 63): true] String s = ...
+#-----| -> [b (line 63): true] ...;
+
+# 65| [b (line 63): false] ... ? ... : ...
+#-----| -> [b (line 63): false] String s = ...
+
+# 65| [b (line 63): true] ... ? ... : ...
+#-----| -> [b (line 63): true] String s = ...
+
+# 65| access to parameter b
+#-----| true -> [b (line 63): true] null
+#-----| false -> [b (line 63): false] ""
+
+# 65| [b (line 63): true] null
+#-----| -> [b (line 63): true] ... ? ... : ...
+
+# 65| [b (line 63): false] ""
+#-----| -> [b (line 63): false] ... ? ... : ...
+
+# 66| [b (line 63): false] ...;
+#-----| -> [b (line 63): false] access to local variable s
+
+# 66| [b (line 63): true] ...;
+#-----| -> [b (line 63): true] access to local variable s
+
+# 66| [assertion failure] call to method IsFalse
+#-----| exception(AssertFailedException) -> exit M9 (abnormal)
+
+# 66| [assertion success] call to method IsFalse
+#-----| -> ...;
+
+# 66| [false] ... || ...
+#-----| false -> [assertion success] call to method IsFalse
+
+# 66| [true] ... || ...
+#-----| true -> [assertion failure] call to method IsFalse
+
+# 66| [b (line 63): false] ... == ...
+#-----| true -> [true] ... || ...
+#-----| false -> [b (line 63): false] access to parameter b
+
+# 66| [b (line 63): true] ... == ...
+#-----| true -> [true] ... || ...
+#-----| false -> [b (line 63): true] access to parameter b
+
+# 66| [b (line 63): false] access to local variable s
+#-----| -> [b (line 63): false] null
+
+# 66| [b (line 63): true] access to local variable s
+#-----| -> [b (line 63): true] null
+
+# 66| [b (line 63): false] null
+#-----| -> [b (line 63): false] ... == ...
+
+# 66| [b (line 63): true] null
+#-----| -> [b (line 63): true] ... == ...
+
+# 66| [b (line 63): false] access to parameter b
+#-----| false -> [false] ... || ...
+
+# 66| [b (line 63): true] access to parameter b
+#-----| true -> [true] ... || ...
+
+# 67| ...;
+#-----| -> access to local variable s
+
+# 67| call to method WriteLine
+#-----| -> exit M9 (normal)
+
+# 67| access to property Length
+#-----| -> call to method WriteLine
+
+# 67| access to local variable s
+#-----| -> access to property Length
+
+# 70| enter M10
+#-----| -> {...}
+
+# 70| exit M10
+
+# 70| exit M10 (abnormal)
+#-----| -> exit M10
+
+# 70| exit M10 (normal)
+#-----| -> exit M10
+
+# 71| {...}
+#-----| -> ... ...;
+
+# 72| ... ...;
+#-----| -> access to parameter b
+
+# 72| [b (line 70): false] String s = ...
+#-----| -> [b (line 70): false] ...;
+
+# 72| [b (line 70): true] String s = ...
+#-----| -> [b (line 70): true] ...;
+
+# 72| [b (line 70): false] ... ? ... : ...
+#-----| -> [b (line 70): false] String s = ...
+
+# 72| [b (line 70): true] ... ? ... : ...
+#-----| -> [b (line 70): true] String s = ...
+
+# 72| access to parameter b
+#-----| true -> [b (line 70): true] null
+#-----| false -> [b (line 70): false] ""
+
+# 72| [b (line 70): true] null
+#-----| -> [b (line 70): true] ... ? ... : ...
+
+# 72| [b (line 70): false] ""
+#-----| -> [b (line 70): false] ... ? ... : ...
+
+# 73| [b (line 70): false] ...;
+#-----| -> [b (line 70): false] access to local variable s
+
+# 73| [b (line 70): true] ...;
+#-----| -> [b (line 70): true] access to local variable s
+
+# 73| [assertion failure] call to method IsTrue
+#-----| exception(AssertFailedException) -> exit M10 (abnormal)
+
+# 73| [assertion success] call to method IsTrue
+#-----| -> ...;
+
+# 73| [false] ... && ...
+#-----| false -> [assertion failure] call to method IsTrue
+
+# 73| [true] ... && ...
+#-----| true -> [assertion success] call to method IsTrue
+
+# 73| [b (line 70): false] ... == ...
+#-----| false -> [false] ... && ...
+#-----| true -> [b (line 70): false] access to parameter b
+
+# 73| [b (line 70): true] ... == ...
+#-----| false -> [false] ... && ...
+#-----| true -> [b (line 70): true] access to parameter b
+
+# 73| [b (line 70): false] access to local variable s
+#-----| -> [b (line 70): false] null
+
+# 73| [b (line 70): true] access to local variable s
+#-----| -> [b (line 70): true] null
+
+# 73| [b (line 70): false] null
+#-----| -> [b (line 70): false] ... == ...
+
+# 73| [b (line 70): true] null
+#-----| -> [b (line 70): true] ... == ...
+
+# 73| [b (line 70): false] access to parameter b
+#-----| false -> [false] ... && ...
+
+# 73| [b (line 70): true] access to parameter b
+#-----| true -> [true] ... && ...
+
+# 74| ...;
+#-----| -> access to local variable s
+
+# 74| call to method WriteLine
+#-----| -> exit M10 (normal)
+
+# 74| access to property Length
+#-----| -> call to method WriteLine
+
+# 74| access to local variable s
+#-----| -> access to property Length
+
+# 77| enter M11
+#-----| -> {...}
+
+# 77| exit M11
+
+# 77| exit M11 (abnormal)
+#-----| -> exit M11
+
+# 77| exit M11 (normal)
+#-----| -> exit M11
+
+# 78| {...}
+#-----| -> ... ...;
+
+# 79| ... ...;
+#-----| -> access to parameter b
+
+# 79| [b (line 77): false] String s = ...
+#-----| -> [b (line 77): false] ...;
+
+# 79| [b (line 77): true] String s = ...
+#-----| -> [b (line 77): true] ...;
+
+# 79| [b (line 77): false] ... ? ... : ...
+#-----| -> [b (line 77): false] String s = ...
+
+# 79| [b (line 77): true] ... ? ... : ...
+#-----| -> [b (line 77): true] String s = ...
+
+# 79| access to parameter b
+#-----| true -> [b (line 77): true] null
+#-----| false -> [b (line 77): false] ""
+
+# 79| [b (line 77): true] null
+#-----| -> [b (line 77): true] ... ? ... : ...
+
+# 79| [b (line 77): false] ""
+#-----| -> [b (line 77): false] ... ? ... : ...
+
+# 80| [b (line 77): false] ...;
+#-----| -> [b (line 77): false] access to local variable s
+
+# 80| [b (line 77): true] ...;
+#-----| -> [b (line 77): true] access to local variable s
+
+# 80| [assertion failure] call to method IsFalse
+#-----| exception(AssertFailedException) -> exit M11 (abnormal)
+
+# 80| [assertion success] call to method IsFalse
+#-----| -> ...;
+
+# 80| [false] ... || ...
+#-----| false -> [assertion success] call to method IsFalse
+
+# 80| [true] ... || ...
+#-----| true -> [assertion failure] call to method IsFalse
+
+# 80| [b (line 77): false] ... != ...
+#-----| true -> [true] ... || ...
+#-----| false -> [b (line 77): false] access to parameter b
+
+# 80| [b (line 77): true] ... != ...
+#-----| true -> [true] ... || ...
+#-----| false -> [b (line 77): true] access to parameter b
+
+# 80| [b (line 77): false] access to local variable s
+#-----| -> [b (line 77): false] null
+
+# 80| [b (line 77): true] access to local variable s
+#-----| -> [b (line 77): true] null
+
+# 80| [b (line 77): false] null
+#-----| -> [b (line 77): false] ... != ...
+
+# 80| [b (line 77): true] null
+#-----| -> [b (line 77): true] ... != ...
+
+# 80| [b (line 77): false] access to parameter b
+#-----| false -> [false] ... || ...
+
+# 80| [b (line 77): true] access to parameter b
+#-----| true -> [true] ... || ...
+
+# 81| ...;
+#-----| -> access to local variable s
+
+# 81| call to method WriteLine
+#-----| -> exit M11 (normal)
+
+# 81| access to property Length
+#-----| -> call to method WriteLine
+
+# 81| access to local variable s
+#-----| -> access to property Length
+
+# 84| enter M12
+#-----| -> {...}
+
+# 84| exit M12
+
+# 84| exit M12 (abnormal)
+#-----| -> exit M12
+
+# 84| exit M12 (normal)
+#-----| -> exit M12
+
+# 85| {...}
+#-----| -> ... ...;
+
+# 86| ... ...;
+#-----| -> access to parameter b
+
+# 86| [b (line 84): false] String s = ...
+#-----| -> [b (line 84): false] ...;
+
+# 86| [b (line 84): true] String s = ...
+#-----| -> [b (line 84): true] ...;
+
+# 86| [b (line 84): false] ... ? ... : ...
+#-----| -> [b (line 84): false] String s = ...
+
+# 86| [b (line 84): true] ... ? ... : ...
+#-----| -> [b (line 84): true] String s = ...
+
+# 86| access to parameter b
+#-----| true -> [b (line 84): true] null
+#-----| false -> [b (line 84): false] ""
+
+# 86| [b (line 84): true] null
+#-----| -> [b (line 84): true] ... ? ... : ...
+
+# 86| [b (line 84): false] ""
+#-----| -> [b (line 84): false] ... ? ... : ...
+
+# 87| [b (line 84): false] ...;
+#-----| -> [b (line 84): false] access to local variable s
+
+# 87| [b (line 84): true] ...;
+#-----| -> [b (line 84): true] access to local variable s
+
+# 87| [assertion failure, b (line 84): false] call to method Assert
+#-----| exit -> exit M12 (abnormal)
+
+# 87| [assertion failure, b (line 84): true] call to method Assert
+#-----| exit -> exit M12 (abnormal)
+
+# 87| [assertion success, b (line 84): false] call to method Assert
+#-----| -> [b (line 84): false] ...;
+
+# 87| [assertion success, b (line 84): true] call to method Assert
+#-----| -> [b (line 84): true] ...;
+
+# 87| [b (line 84): false] ... != ...
+#-----| false -> [assertion failure, b (line 84): false] call to method Assert
+#-----| true -> [assertion success, b (line 84): false] call to method Assert
+
+# 87| [b (line 84): true] ... != ...
+#-----| false -> [assertion failure, b (line 84): true] call to method Assert
+#-----| true -> [assertion success, b (line 84): true] call to method Assert
+
+# 87| [b (line 84): false] access to local variable s
+#-----| -> [b (line 84): false] null
+
+# 87| [b (line 84): true] access to local variable s
+#-----| -> [b (line 84): true] null
+
+# 87| [b (line 84): false] null
+#-----| -> [b (line 84): false] ... != ...
+
+# 87| [b (line 84): true] null
+#-----| -> [b (line 84): true] ... != ...
+
+# 88| [b (line 84): false] ...;
+#-----| -> [b (line 84): false] access to local variable s
+
+# 88| [b (line 84): true] ...;
+#-----| -> [b (line 84): true] access to local variable s
+
+# 88| [b (line 84): false] call to method WriteLine
+#-----| -> [b (line 84): false] ...;
+
+# 88| [b (line 84): true] call to method WriteLine
+#-----| -> [b (line 84): true] ...;
+
+# 88| [b (line 84): false] access to property Length
+#-----| -> [b (line 84): false] call to method WriteLine
+
+# 88| [b (line 84): true] access to property Length
+#-----| -> [b (line 84): true] call to method WriteLine
+
+# 88| [b (line 84): false] access to local variable s
+#-----| -> [b (line 84): false] access to property Length
+
+# 88| [b (line 84): true] access to local variable s
+#-----| -> [b (line 84): true] access to property Length
+
+# 90| [b (line 84): false] ...;
+#-----| -> [b (line 84): false] access to parameter b
+
+# 90| [b (line 84): true] ...;
+#-----| -> [b (line 84): true] access to parameter b
+
+# 90| [b (line 84): false] ... = ...
+#-----| -> [b (line 84): false] ...;
+
+# 90| [b (line 84): true] ... = ...
+#-----| -> [b (line 84): true] ...;
+
+# 90| [b (line 84): false] ... ? ... : ...
+#-----| -> [b (line 84): false] ... = ...
+
+# 90| [b (line 84): true] ... ? ... : ...
+#-----| -> [b (line 84): true] ... = ...
+
+# 90| [b (line 84): false] access to parameter b
+#-----| false -> [b (line 84): false] ""
+
+# 90| [b (line 84): true] access to parameter b
+#-----| true -> [b (line 84): true] null
+
+# 90| [b (line 84): true] null
+#-----| -> [b (line 84): true] ... ? ... : ...
+
+# 90| [b (line 84): false] ""
+#-----| -> [b (line 84): false] ... ? ... : ...
+
+# 91| [b (line 84): false] ...;
+#-----| -> [b (line 84): false] access to local variable s
+
+# 91| [b (line 84): true] ...;
+#-----| -> [b (line 84): true] access to local variable s
+
+# 91| [assertion failure, b (line 84): false] call to method IsNull
+#-----| exception(AssertFailedException) -> exit M12 (abnormal)
+
+# 91| [assertion failure, b (line 84): true] call to method IsNull
+#-----| exception(AssertFailedException) -> exit M12 (abnormal)
+
+# 91| [assertion success, b (line 84): false] call to method IsNull
+#-----| -> [b (line 84): false] ...;
+
+# 91| [assertion success, b (line 84): true] call to method IsNull
+#-----| -> [b (line 84): true] ...;
+
+# 91| [b (line 84): false] access to local variable s
+#-----| non-null -> [assertion failure, b (line 84): false] call to method IsNull
+#-----| null -> [assertion success, b (line 84): false] call to method IsNull
+
+# 91| [b (line 84): true] access to local variable s
+#-----| non-null -> [assertion failure, b (line 84): true] call to method IsNull
+#-----| null -> [assertion success, b (line 84): true] call to method IsNull
+
+# 92| [b (line 84): false] ...;
+#-----| -> [b (line 84): false] access to local variable s
+
+# 92| [b (line 84): true] ...;
+#-----| -> [b (line 84): true] access to local variable s
+
+# 92| [b (line 84): false] call to method WriteLine
+#-----| -> [b (line 84): false] ...;
+
+# 92| [b (line 84): true] call to method WriteLine
+#-----| -> [b (line 84): true] ...;
+
+# 92| [b (line 84): false] access to property Length
+#-----| -> [b (line 84): false] call to method WriteLine
+
+# 92| [b (line 84): true] access to property Length
+#-----| -> [b (line 84): true] call to method WriteLine
+
+# 92| [b (line 84): false] access to local variable s
+#-----| -> [b (line 84): false] access to property Length
+
+# 92| [b (line 84): true] access to local variable s
+#-----| -> [b (line 84): true] access to property Length
+
+# 94| [b (line 84): false] ...;
+#-----| -> [b (line 84): false] access to parameter b
+
+# 94| [b (line 84): true] ...;
+#-----| -> [b (line 84): true] access to parameter b
+
+# 94| [b (line 84): false] ... = ...
+#-----| -> [b (line 84): false] ...;
+
+# 94| [b (line 84): true] ... = ...
+#-----| -> [b (line 84): true] ...;
+
+# 94| [b (line 84): false] ... ? ... : ...
+#-----| -> [b (line 84): false] ... = ...
+
+# 94| [b (line 84): true] ... ? ... : ...
+#-----| -> [b (line 84): true] ... = ...
+
+# 94| [b (line 84): false] access to parameter b
+#-----| false -> [b (line 84): false] ""
+
+# 94| [b (line 84): true] access to parameter b
+#-----| true -> [b (line 84): true] null
+
+# 94| [b (line 84): true] null
+#-----| -> [b (line 84): true] ... ? ... : ...
+
+# 94| [b (line 84): false] ""
+#-----| -> [b (line 84): false] ... ? ... : ...
+
+# 95| [b (line 84): false] ...;
+#-----| -> [b (line 84): false] access to local variable s
+
+# 95| [b (line 84): true] ...;
+#-----| -> [b (line 84): true] access to local variable s
+
+# 95| [assertion failure, b (line 84): false] call to method IsNotNull
+#-----| exception(AssertFailedException) -> exit M12 (abnormal)
+
+# 95| [assertion failure, b (line 84): true] call to method IsNotNull
+#-----| exception(AssertFailedException) -> exit M12 (abnormal)
+
+# 95| [assertion success, b (line 84): false] call to method IsNotNull
+#-----| -> [b (line 84): false] ...;
+
+# 95| [assertion success, b (line 84): true] call to method IsNotNull
+#-----| -> [b (line 84): true] ...;
+
+# 95| [b (line 84): false] access to local variable s
+#-----| null -> [assertion failure, b (line 84): false] call to method IsNotNull
+#-----| non-null -> [assertion success, b (line 84): false] call to method IsNotNull
+
+# 95| [b (line 84): true] access to local variable s
+#-----| null -> [assertion failure, b (line 84): true] call to method IsNotNull
+#-----| non-null -> [assertion success, b (line 84): true] call to method IsNotNull
+
+# 96| [b (line 84): false] ...;
+#-----| -> [b (line 84): false] access to local variable s
+
+# 96| [b (line 84): true] ...;
+#-----| -> [b (line 84): true] access to local variable s
+
+# 96| [b (line 84): false] call to method WriteLine
+#-----| -> [b (line 84): false] ...;
+
+# 96| [b (line 84): true] call to method WriteLine
+#-----| -> [b (line 84): true] ...;
+
+# 96| [b (line 84): false] access to property Length
+#-----| -> [b (line 84): false] call to method WriteLine
+
+# 96| [b (line 84): true] access to property Length
+#-----| -> [b (line 84): true] call to method WriteLine
+
+# 96| [b (line 84): false] access to local variable s
+#-----| -> [b (line 84): false] access to property Length
+
+# 96| [b (line 84): true] access to local variable s
+#-----| -> [b (line 84): true] access to property Length
+
+# 98| [b (line 84): false] ...;
+#-----| -> [b (line 84): false] access to parameter b
+
+# 98| [b (line 84): true] ...;
+#-----| -> [b (line 84): true] access to parameter b
+
+# 98| [b (line 84): false] ... = ...
+#-----| -> [b (line 84): false] ...;
+
+# 98| [b (line 84): true] ... = ...
+#-----| -> [b (line 84): true] ...;
+
+# 98| [b (line 84): false] ... ? ... : ...
+#-----| -> [b (line 84): false] ... = ...
+
+# 98| [b (line 84): true] ... ? ... : ...
+#-----| -> [b (line 84): true] ... = ...
+
+# 98| [b (line 84): false] access to parameter b
+#-----| false -> [b (line 84): false] ""
+
+# 98| [b (line 84): true] access to parameter b
+#-----| true -> [b (line 84): true] null
+
+# 98| [b (line 84): true] null
+#-----| -> [b (line 84): true] ... ? ... : ...
+
+# 98| [b (line 84): false] ""
+#-----| -> [b (line 84): false] ... ? ... : ...
+
+# 99| [b (line 84): false] ...;
+#-----| -> [b (line 84): false] access to local variable s
+
+# 99| [b (line 84): true] ...;
+#-----| -> [b (line 84): true] access to local variable s
+
+# 99| [assertion failure, b (line 84): false] call to method IsTrue
+#-----| exception(AssertFailedException) -> exit M12 (abnormal)
+
+# 99| [assertion failure, b (line 84): true] call to method IsTrue
+#-----| exception(AssertFailedException) -> exit M12 (abnormal)
+
+# 99| [assertion success, b (line 84): false] call to method IsTrue
+#-----| -> [b (line 84): false] ...;
+
+# 99| [assertion success, b (line 84): true] call to method IsTrue
+#-----| -> [b (line 84): true] ...;
+
+# 99| [b (line 84): false] ... == ...
+#-----| false -> [assertion failure, b (line 84): false] call to method IsTrue
+#-----| true -> [assertion success, b (line 84): false] call to method IsTrue
+
+# 99| [b (line 84): true] ... == ...
+#-----| false -> [assertion failure, b (line 84): true] call to method IsTrue
+#-----| true -> [assertion success, b (line 84): true] call to method IsTrue
+
+# 99| [b (line 84): false] access to local variable s
+#-----| -> [b (line 84): false] null
+
+# 99| [b (line 84): true] access to local variable s
+#-----| -> [b (line 84): true] null
+
+# 99| [b (line 84): false] null
+#-----| -> [b (line 84): false] ... == ...
+
+# 99| [b (line 84): true] null
+#-----| -> [b (line 84): true] ... == ...
+
+# 100| [b (line 84): false] ...;
+#-----| -> [b (line 84): false] access to local variable s
+
+# 100| [b (line 84): true] ...;
+#-----| -> [b (line 84): true] access to local variable s
+
+# 100| [b (line 84): false] call to method WriteLine
+#-----| -> [b (line 84): false] ...;
+
+# 100| [b (line 84): true] call to method WriteLine
+#-----| -> [b (line 84): true] ...;
+
+# 100| [b (line 84): false] access to property Length
+#-----| -> [b (line 84): false] call to method WriteLine
+
+# 100| [b (line 84): true] access to property Length
+#-----| -> [b (line 84): true] call to method WriteLine
+
+# 100| [b (line 84): false] access to local variable s
+#-----| -> [b (line 84): false] access to property Length
+
+# 100| [b (line 84): true] access to local variable s
+#-----| -> [b (line 84): true] access to property Length
+
+# 102| [b (line 84): false] ...;
+#-----| -> [b (line 84): false] access to parameter b
+
+# 102| [b (line 84): true] ...;
+#-----| -> [b (line 84): true] access to parameter b
+
+# 102| [b (line 84): false] ... = ...
+#-----| -> [b (line 84): false] ...;
+
+# 102| [b (line 84): true] ... = ...
+#-----| -> [b (line 84): true] ...;
+
+# 102| [b (line 84): false] ... ? ... : ...
+#-----| -> [b (line 84): false] ... = ...
+
+# 102| [b (line 84): true] ... ? ... : ...
+#-----| -> [b (line 84): true] ... = ...
+
+# 102| [b (line 84): false] access to parameter b
+#-----| false -> [b (line 84): false] ""
+
+# 102| [b (line 84): true] access to parameter b
+#-----| true -> [b (line 84): true] null
+
+# 102| [b (line 84): true] null
+#-----| -> [b (line 84): true] ... ? ... : ...
+
+# 102| [b (line 84): false] ""
+#-----| -> [b (line 84): false] ... ? ... : ...
+
+# 103| [b (line 84): false] ...;
+#-----| -> [b (line 84): false] access to local variable s
+
+# 103| [b (line 84): true] ...;
+#-----| -> [b (line 84): true] access to local variable s
+
+# 103| [assertion failure, b (line 84): false] call to method IsTrue
+#-----| exception(AssertFailedException) -> exit M12 (abnormal)
+
+# 103| [assertion failure, b (line 84): true] call to method IsTrue
+#-----| exception(AssertFailedException) -> exit M12 (abnormal)
+
+# 103| [assertion success, b (line 84): false] call to method IsTrue
+#-----| -> [b (line 84): false] ...;
+
+# 103| [assertion success, b (line 84): true] call to method IsTrue
+#-----| -> [b (line 84): true] ...;
+
+# 103| [b (line 84): false] ... != ...
+#-----| false -> [assertion failure, b (line 84): false] call to method IsTrue
+#-----| true -> [assertion success, b (line 84): false] call to method IsTrue
+
+# 103| [b (line 84): true] ... != ...
+#-----| false -> [assertion failure, b (line 84): true] call to method IsTrue
+#-----| true -> [assertion success, b (line 84): true] call to method IsTrue
+
+# 103| [b (line 84): false] access to local variable s
+#-----| -> [b (line 84): false] null
+
+# 103| [b (line 84): true] access to local variable s
+#-----| -> [b (line 84): true] null
+
+# 103| [b (line 84): false] null
+#-----| -> [b (line 84): false] ... != ...
+
+# 103| [b (line 84): true] null
+#-----| -> [b (line 84): true] ... != ...
+
+# 104| [b (line 84): false] ...;
+#-----| -> [b (line 84): false] access to local variable s
+
+# 104| [b (line 84): true] ...;
+#-----| -> [b (line 84): true] access to local variable s
+
+# 104| [b (line 84): false] call to method WriteLine
+#-----| -> [b (line 84): false] ...;
+
+# 104| [b (line 84): true] call to method WriteLine
+#-----| -> [b (line 84): true] ...;
+
+# 104| [b (line 84): false] access to property Length
+#-----| -> [b (line 84): false] call to method WriteLine
+
+# 104| [b (line 84): true] access to property Length
+#-----| -> [b (line 84): true] call to method WriteLine
+
+# 104| [b (line 84): false] access to local variable s
+#-----| -> [b (line 84): false] access to property Length
+
+# 104| [b (line 84): true] access to local variable s
+#-----| -> [b (line 84): true] access to property Length
+
+# 106| [b (line 84): false] ...;
+#-----| -> [b (line 84): false] access to parameter b
+
+# 106| [b (line 84): true] ...;
+#-----| -> [b (line 84): true] access to parameter b
+
+# 106| [b (line 84): false] ... = ...
+#-----| -> [b (line 84): false] ...;
+
+# 106| [b (line 84): true] ... = ...
+#-----| -> [b (line 84): true] ...;
+
+# 106| [b (line 84): false] ... ? ... : ...
+#-----| -> [b (line 84): false] ... = ...
+
+# 106| [b (line 84): true] ... ? ... : ...
+#-----| -> [b (line 84): true] ... = ...
+
+# 106| [b (line 84): false] access to parameter b
+#-----| false -> [b (line 84): false] ""
+
+# 106| [b (line 84): true] access to parameter b
+#-----| true -> [b (line 84): true] null
+
+# 106| [b (line 84): true] null
+#-----| -> [b (line 84): true] ... ? ... : ...
+
+# 106| [b (line 84): false] ""
+#-----| -> [b (line 84): false] ... ? ... : ...
+
+# 107| [b (line 84): false] ...;
+#-----| -> [b (line 84): false] access to local variable s
+
+# 107| [b (line 84): true] ...;
+#-----| -> [b (line 84): true] access to local variable s
+
+# 107| [assertion failure, b (line 84): false] call to method IsFalse
+#-----| exception(AssertFailedException) -> exit M12 (abnormal)
+
+# 107| [assertion failure, b (line 84): true] call to method IsFalse
+#-----| exception(AssertFailedException) -> exit M12 (abnormal)
+
+# 107| [assertion success, b (line 84): false] call to method IsFalse
+#-----| -> [b (line 84): false] ...;
+
+# 107| [assertion success, b (line 84): true] call to method IsFalse
+#-----| -> [b (line 84): true] ...;
+
+# 107| [b (line 84): false] ... != ...
+#-----| true -> [assertion failure, b (line 84): false] call to method IsFalse
+#-----| false -> [assertion success, b (line 84): false] call to method IsFalse
+
+# 107| [b (line 84): true] ... != ...
+#-----| true -> [assertion failure, b (line 84): true] call to method IsFalse
+#-----| false -> [assertion success, b (line 84): true] call to method IsFalse
+
+# 107| [b (line 84): false] access to local variable s
+#-----| -> [b (line 84): false] null
+
+# 107| [b (line 84): true] access to local variable s
+#-----| -> [b (line 84): true] null
+
+# 107| [b (line 84): false] null
+#-----| -> [b (line 84): false] ... != ...
+
+# 107| [b (line 84): true] null
+#-----| -> [b (line 84): true] ... != ...
+
+# 108| [b (line 84): false] ...;
+#-----| -> [b (line 84): false] access to local variable s
+
+# 108| [b (line 84): true] ...;
+#-----| -> [b (line 84): true] access to local variable s
+
+# 108| [b (line 84): false] call to method WriteLine
+#-----| -> [b (line 84): false] ...;
+
+# 108| [b (line 84): true] call to method WriteLine
+#-----| -> [b (line 84): true] ...;
+
+# 108| [b (line 84): false] access to property Length
+#-----| -> [b (line 84): false] call to method WriteLine
+
+# 108| [b (line 84): true] access to property Length
+#-----| -> [b (line 84): true] call to method WriteLine
+
+# 108| [b (line 84): false] access to local variable s
+#-----| -> [b (line 84): false] access to property Length
+
+# 108| [b (line 84): true] access to local variable s
+#-----| -> [b (line 84): true] access to property Length
+
+# 110| [b (line 84): false] ...;
+#-----| -> [b (line 84): false] access to parameter b
+
+# 110| [b (line 84): true] ...;
+#-----| -> [b (line 84): true] access to parameter b
+
+# 110| [b (line 84): false] ... = ...
+#-----| -> [b (line 84): false] ...;
+
+# 110| [b (line 84): true] ... = ...
+#-----| -> [b (line 84): true] ...;
+
+# 110| [b (line 84): false] ... ? ... : ...
+#-----| -> [b (line 84): false] ... = ...
+
+# 110| [b (line 84): true] ... ? ... : ...
+#-----| -> [b (line 84): true] ... = ...
+
+# 110| [b (line 84): false] access to parameter b
+#-----| false -> [b (line 84): false] ""
+
+# 110| [b (line 84): true] access to parameter b
+#-----| true -> [b (line 84): true] null
+
+# 110| [b (line 84): true] null
+#-----| -> [b (line 84): true] ... ? ... : ...
+
+# 110| [b (line 84): false] ""
+#-----| -> [b (line 84): false] ... ? ... : ...
+
+# 111| [b (line 84): false] ...;
+#-----| -> [b (line 84): false] access to local variable s
+
+# 111| [b (line 84): true] ...;
+#-----| -> [b (line 84): true] access to local variable s
+
+# 111| [assertion failure, b (line 84): false] call to method IsFalse
+#-----| exception(AssertFailedException) -> exit M12 (abnormal)
+
+# 111| [assertion failure, b (line 84): true] call to method IsFalse
+#-----| exception(AssertFailedException) -> exit M12 (abnormal)
+
+# 111| [assertion success, b (line 84): false] call to method IsFalse
+#-----| -> [b (line 84): false] ...;
+
+# 111| [assertion success, b (line 84): true] call to method IsFalse
+#-----| -> [b (line 84): true] ...;
+
+# 111| [b (line 84): false] ... == ...
+#-----| true -> [assertion failure, b (line 84): false] call to method IsFalse
+#-----| false -> [assertion success, b (line 84): false] call to method IsFalse
+
+# 111| [b (line 84): true] ... == ...
+#-----| true -> [assertion failure, b (line 84): true] call to method IsFalse
+#-----| false -> [assertion success, b (line 84): true] call to method IsFalse
+
+# 111| [b (line 84): false] access to local variable s
+#-----| -> [b (line 84): false] null
+
+# 111| [b (line 84): true] access to local variable s
+#-----| -> [b (line 84): true] null
+
+# 111| [b (line 84): false] null
+#-----| -> [b (line 84): false] ... == ...
+
+# 111| [b (line 84): true] null
+#-----| -> [b (line 84): true] ... == ...
+
+# 112| [b (line 84): false] ...;
+#-----| -> [b (line 84): false] access to local variable s
+
+# 112| [b (line 84): true] ...;
+#-----| -> [b (line 84): true] access to local variable s
+
+# 112| [b (line 84): false] call to method WriteLine
+#-----| -> [b (line 84): false] ...;
+
+# 112| [b (line 84): true] call to method WriteLine
+#-----| -> [b (line 84): true] ...;
+
+# 112| [b (line 84): false] access to property Length
+#-----| -> [b (line 84): false] call to method WriteLine
+
+# 112| [b (line 84): true] access to property Length
+#-----| -> [b (line 84): true] call to method WriteLine
+
+# 112| [b (line 84): false] access to local variable s
+#-----| -> [b (line 84): false] access to property Length
+
+# 112| [b (line 84): true] access to local variable s
+#-----| -> [b (line 84): true] access to property Length
+
+# 114| [b (line 84): false] ...;
+#-----| -> [b (line 84): false] access to parameter b
+
+# 114| [b (line 84): true] ...;
+#-----| -> [b (line 84): true] access to parameter b
+
+# 114| [b (line 84): false] ... = ...
+#-----| -> [b (line 84): false] ...;
+
+# 114| [b (line 84): true] ... = ...
+#-----| -> [b (line 84): true] ...;
+
+# 114| [b (line 84): false] ... ? ... : ...
+#-----| -> [b (line 84): false] ... = ...
+
+# 114| [b (line 84): true] ... ? ... : ...
+#-----| -> [b (line 84): true] ... = ...
+
+# 114| [b (line 84): false] access to parameter b
+#-----| false -> [b (line 84): false] ""
+
+# 114| [b (line 84): true] access to parameter b
+#-----| true -> [b (line 84): true] null
+
+# 114| [b (line 84): true] null
+#-----| -> [b (line 84): true] ... ? ... : ...
+
+# 114| [b (line 84): false] ""
+#-----| -> [b (line 84): false] ... ? ... : ...
+
+# 115| [b (line 84): false] ...;
+#-----| -> [b (line 84): false] access to local variable s
+
+# 115| [b (line 84): true] ...;
+#-----| -> [b (line 84): true] access to local variable s
+
+# 115| [assertion failure, b (line 84): false] call to method IsTrue
+#-----| exception(AssertFailedException) -> exit M12 (abnormal)
+
+# 115| [assertion failure, b (line 84): true] call to method IsTrue
+#-----| exception(AssertFailedException) -> exit M12 (abnormal)
+
+# 115| [assertion success, b (line 84): true] call to method IsTrue
+#-----| -> [b (line 84): true] ...;
+
+# 115| [false, b (line 84): false] ... && ...
+#-----| false -> [assertion failure, b (line 84): false] call to method IsTrue
+
+# 115| [false, b (line 84): true] ... && ...
+#-----| false -> [assertion failure, b (line 84): true] call to method IsTrue
+
+# 115| [true, b (line 84): true] ... && ...
+#-----| true -> [assertion success, b (line 84): true] call to method IsTrue
+
+# 115| [b (line 84): false] ... != ...
+#-----| false -> [false, b (line 84): false] ... && ...
+#-----| true -> [b (line 84): false] access to parameter b
+
+# 115| [b (line 84): true] ... != ...
+#-----| false -> [false, b (line 84): true] ... && ...
+#-----| true -> [b (line 84): true] access to parameter b
+
+# 115| [b (line 84): false] access to local variable s
+#-----| -> [b (line 84): false] null
+
+# 115| [b (line 84): true] access to local variable s
+#-----| -> [b (line 84): true] null
+
+# 115| [b (line 84): false] null
+#-----| -> [b (line 84): false] ... != ...
+
+# 115| [b (line 84): true] null
+#-----| -> [b (line 84): true] ... != ...
+
+# 115| [b (line 84): false] access to parameter b
+#-----| false -> [false, b (line 84): false] ... && ...
+
+# 115| [b (line 84): true] access to parameter b
+#-----| true -> [true, b (line 84): true] ... && ...
+
+# 116| [b (line 84): true] ...;
+#-----| -> [b (line 84): true] access to local variable s
+
+# 116| [b (line 84): true] call to method WriteLine
+#-----| -> [b (line 84): true] ...;
+
+# 116| [b (line 84): true] access to property Length
+#-----| -> [b (line 84): true] call to method WriteLine
+
+# 116| [b (line 84): true] access to local variable s
+#-----| -> [b (line 84): true] access to property Length
+
+# 118| [b (line 84): true] ...;
+#-----| -> [b (line 84): true] access to parameter b
+
+# 118| [b (line 84): true] ... = ...
+#-----| -> [b (line 84): true] ...;
+
+# 118| [b (line 84): true] ... ? ... : ...
+#-----| -> [b (line 84): true] ... = ...
+
+# 118| [b (line 84): true] access to parameter b
+#-----| true -> [b (line 84): true] null
+
+# 118| [b (line 84): true] null
+#-----| -> [b (line 84): true] ... ? ... : ...
+
+# 119| [b (line 84): true] ...;
+#-----| -> [b (line 84): true] access to local variable s
+
+# 119| [assertion failure, b (line 84): true] call to method IsFalse
+#-----| exception(AssertFailedException) -> exit M12 (abnormal)
+
+# 119| [assertion success, b (line 84): true] call to method IsFalse
+#-----| -> [b (line 84): true] ...;
+
+# 119| [false, b (line 84): true] ... || ...
+#-----| false -> [assertion success, b (line 84): true] call to method IsFalse
+
+# 119| [true, b (line 84): true] ... || ...
+#-----| true -> [assertion failure, b (line 84): true] call to method IsFalse
+
+# 119| [b (line 84): true] ... == ...
+#-----| true -> [true, b (line 84): true] ... || ...
+#-----| false -> [b (line 84): true] access to parameter b
+
+# 119| [b (line 84): true] access to local variable s
+#-----| -> [b (line 84): true] null
+
+# 119| [b (line 84): true] null
+#-----| -> [b (line 84): true] ... == ...
+
+# 119| [false, b (line 84): true] !...
+#-----| false -> [false, b (line 84): true] ... || ...
+
+# 119| [b (line 84): true] access to parameter b
+#-----| true -> [false, b (line 84): true] !...
+
+# 120| [b (line 84): true] ...;
+#-----| -> [b (line 84): true] access to local variable s
+
+# 120| [b (line 84): true] call to method WriteLine
+#-----| -> [b (line 84): true] ...;
+
+# 120| [b (line 84): true] access to property Length
+#-----| -> [b (line 84): true] call to method WriteLine
+
+# 120| [b (line 84): true] access to local variable s
+#-----| -> [b (line 84): true] access to property Length
+
+# 122| [b (line 84): true] ...;
+#-----| -> [b (line 84): true] access to parameter b
+
+# 122| [b (line 84): true] ... = ...
+#-----| -> [b (line 84): true] ...;
+
+# 122| [b (line 84): true] ... ? ... : ...
+#-----| -> [b (line 84): true] ... = ...
+
+# 122| [b (line 84): true] access to parameter b
+#-----| true -> [b (line 84): true] null
+
+# 122| [b (line 84): true] null
+#-----| -> [b (line 84): true] ... ? ... : ...
+
+# 123| [b (line 84): true] ...;
+#-----| -> [b (line 84): true] access to local variable s
+
+# 123| [assertion failure, b (line 84): true] call to method IsTrue
+#-----| exception(AssertFailedException) -> exit M12 (abnormal)
+
+# 123| [assertion success, b (line 84): true] call to method IsTrue
+#-----| -> [b (line 84): true] ...;
+
+# 123| [false, b (line 84): true] ... && ...
+#-----| false -> [assertion failure, b (line 84): true] call to method IsTrue
+
+# 123| [true, b (line 84): true] ... && ...
+#-----| true -> [assertion success, b (line 84): true] call to method IsTrue
+
+# 123| [b (line 84): true] ... == ...
+#-----| false -> [false, b (line 84): true] ... && ...
+#-----| true -> [b (line 84): true] access to parameter b
+
+# 123| [b (line 84): true] access to local variable s
+#-----| -> [b (line 84): true] null
+
+# 123| [b (line 84): true] null
+#-----| -> [b (line 84): true] ... == ...
+
+# 123| [b (line 84): true] access to parameter b
+#-----| true -> [true, b (line 84): true] ... && ...
+
+# 124| [b (line 84): true] ...;
+#-----| -> [b (line 84): true] access to local variable s
+
+# 124| [b (line 84): true] call to method WriteLine
+#-----| -> [b (line 84): true] ...;
+
+# 124| [b (line 84): true] access to property Length
+#-----| -> [b (line 84): true] call to method WriteLine
+
+# 124| [b (line 84): true] access to local variable s
+#-----| -> [b (line 84): true] access to property Length
+
+# 126| [b (line 84): true] ...;
+#-----| -> [b (line 84): true] access to parameter b
+
+# 126| [b (line 84): true] ... = ...
+#-----| -> [b (line 84): true] ...;
+
+# 126| [b (line 84): true] ... ? ... : ...
+#-----| -> [b (line 84): true] ... = ...
+
+# 126| [b (line 84): true] access to parameter b
+#-----| true -> [b (line 84): true] null
+
+# 126| [b (line 84): true] null
+#-----| -> [b (line 84): true] ... ? ... : ...
+
+# 127| [b (line 84): true] ...;
+#-----| -> [b (line 84): true] access to local variable s
+
+# 127| [assertion failure] call to method IsFalse
+#-----| exception(AssertFailedException) -> exit M12 (abnormal)
+
+# 127| [assertion success] call to method IsFalse
+#-----| -> ...;
+
+# 127| [false] ... || ...
+#-----| false -> [assertion success] call to method IsFalse
+
+# 127| [true] ... || ...
+#-----| true -> [assertion failure] call to method IsFalse
+
+# 127| [b (line 84): true] ... != ...
+#-----| true -> [true] ... || ...
+#-----| false -> [b (line 84): true] access to parameter b
+
+# 127| [b (line 84): true] access to local variable s
+#-----| -> [b (line 84): true] null
+
+# 127| [b (line 84): true] null
+#-----| -> [b (line 84): true] ... != ...
+
+# 127| [false] !...
+#-----| false -> [false] ... || ...
+
+# 127| [b (line 84): true] access to parameter b
+#-----| true -> [false] !...
+
+# 128| ...;
+#-----| -> access to local variable s
+
+# 128| call to method WriteLine
+#-----| -> exit M12 (normal)
+
+# 128| access to property Length
+#-----| -> call to method WriteLine
+
+# 128| access to local variable s
+#-----| -> access to property Length
+
+# 131| enter AssertTrueFalse
+#-----| -> {...}
+
+# 131| exit AssertTrueFalse
+
+# 131| exit AssertTrueFalse (normal)
+#-----| -> exit AssertTrueFalse
+
+# 135| {...}
+#-----| -> exit AssertTrueFalse (normal)
+
+# 138| enter M13
+#-----| -> {...}
+
+# 138| exit M13
+
+# 138| exit M13 (abnormal)
+#-----| -> exit M13
+
+# 138| exit M13 (normal)
+#-----| -> exit M13
+
+# 139| {...}
+#-----| -> ...;
+
+# 140| ...;
+#-----| -> this access
+
+# 140| [assertion failure] call to method AssertTrueFalse
+#-----| exception(Exception) -> exit M13 (abnormal)
+
+# 140| [assertion failure] call to method AssertTrueFalse
+#-----| exception(Exception) -> exit M13 (abnormal)
+
+# 140| [assertion success] call to method AssertTrueFalse
+#-----| -> return ...;
+
+# 140| this access
+#-----| -> access to parameter b1
+
+# 140| access to parameter b1
+#-----| true -> access to parameter b2
+#-----| false -> [assertion failure] access to parameter b2
+
+# 140| access to parameter b2
+#-----| true -> [assertion failure] access to parameter b3
+#-----| false -> [assertion success] access to parameter b3
+
+# 140| [assertion failure] access to parameter b2
+#-----| true -> [assertion failure] access to parameter b3
+
+# 140| [assertion failure] access to parameter b3
+#-----| -> [assertion failure] call to method AssertTrueFalse
+
+# 140| [assertion failure] access to parameter b3
+#-----| -> [assertion failure] call to method AssertTrueFalse
+
+# 140| [assertion success] access to parameter b3
+#-----| -> [assertion success] call to method AssertTrueFalse
+
+# 141| return ...;
+#-----| return -> exit M13 (normal)
+
+Assignments.cs:
+# 3| enter M
+#-----| -> {...}
+
+# 3| exit M
+
+# 3| exit M (normal)
+#-----| -> exit M
+
+# 4| {...}
+#-----| -> ... ...;
+
+# 5| ... ...;
+#-----| -> 0
+
+# 5| Int32 x = ...
+#-----| -> ...;
+
+# 5| 0
+#-----| -> Int32 x = ...
+
+# 6| ...;
+#-----| -> access to local variable x
+
+# 6| ... = ...
+#-----| -> ... ...;
+
+# 6| ... + ...
+#-----| -> ... = ...
+
+# 6| access to local variable x
+#-----| -> 1
+
+# 6| 1
+#-----| -> ... + ...
+
+# 8| ... ...;
+#-----| -> 0
+
+# 8| dynamic d = ...
+#-----| -> ...;
+
+# 8| (...) ...
+#-----| -> dynamic d = ...
+
+# 8| 0
+#-----| -> (...) ...
+
+# 9| ...;
+#-----| -> access to local variable d
+
+# 9| ... = ...
+#-----| -> ... ...;
+
+# 9| dynamic call to operator -
+#-----| -> ... = ...
+
+# 9| access to local variable d
+#-----| -> 2
+
+# 9| 2
+#-----| -> dynamic call to operator -
+
+# 11| ... ...;
+#-----| -> object creation of type Assignments
+
+# 11| Assignments a = ...
+#-----| -> ...;
+
+# 11| object creation of type Assignments
+#-----| -> Assignments a = ...
+
+# 12| ...;
+#-----| -> access to local variable a
+
+# 12| ... = ...
+#-----| -> ...;
+
+# 12| call to operator +
+#-----| -> ... = ...
+
+# 12| access to local variable a
+#-----| -> this access
+
+# 12| this access
+#-----| -> call to operator +
+
+# 14| ...;
+#-----| -> this access
+
+# 14| ... += ...
+#-----| -> exit M (normal)
+
+# 14| access to event Event
+#-----| -> ... += ...
+
+# 14| this access
+#-----| -> (...) => ...
+
+# 14| enter (...) => ...
+#-----| -> {...}
+
+# 14| (...) => ...
+#-----| -> access to event Event
+
+# 14| exit (...) => ...
+
+# 14| exit (...) => ... (normal)
+#-----| -> exit (...) => ...
+
+# 14| {...}
+#-----| -> exit (...) => ... (normal)
+
+# 17| enter +
+#-----| -> {...}
+
+# 17| exit +
+
+# 17| exit + (normal)
+#-----| -> exit +
+
+# 18| {...}
+#-----| -> access to parameter x
+
+# 19| return ...;
+#-----| return -> exit + (normal)
+
+# 19| access to parameter x
+#-----| -> return ...;
+
+BreakInTry.cs:
+# 3| enter M1
+#-----| -> {...}
+
+# 3| exit M1
+
+# 3| exit M1 (normal)
+#-----| -> exit M1
+
+# 4| {...}
+#-----| -> try {...} ...
+
+# 5| try {...} ...
+#-----| -> {...}
+
+# 6| {...}
+#-----| -> access to parameter args
+
+# 7| foreach (... ... in ...) ...
+#-----| non-empty -> String arg
+#-----| empty -> {...}
+
+# 7| String arg
+#-----| -> {...}
+
+# 7| access to parameter args
+#-----| -> foreach (... ... in ...) ...
+
+# 8| {...}
+#-----| -> if (...) ...
+
+# 9| if (...) ...
+#-----| -> access to local variable arg
+
+# 9| ... == ...
+#-----| false -> foreach (... ... in ...) ...
+#-----| true -> break;
+
+# 9| access to local variable arg
+#-----| -> null
+
+# 9| null
+#-----| -> ... == ...
+
+# 10| break;
+#-----| break -> {...}
+
+# 14| {...}
+#-----| -> if (...) ...
+
+# 15| if (...) ...
+#-----| -> access to parameter args
+
+# 15| ... == ...
+#-----| true -> ;
+#-----| false -> exit M1 (normal)
+
+# 15| access to parameter args
+#-----| -> null
+
+# 15| null
+#-----| -> ... == ...
+
+# 16| ;
+#-----| -> exit M1 (normal)
+
+# 20| enter M2
+#-----| -> {...}
+
+# 20| exit M2
+
+# 20| exit M2 (normal)
+#-----| -> exit M2
+
+# 21| {...}
+#-----| -> access to parameter args
+
+# 22| foreach (... ... in ...) ...
+#-----| non-empty -> String arg
+#-----| empty -> ;
+
+# 22| String arg
+#-----| -> {...}
+
+# 22| access to parameter args
+#-----| -> foreach (... ... in ...) ...
+
+# 23| {...}
+#-----| -> try {...} ...
+
+# 24| try {...} ...
+#-----| -> {...}
+
+# 25| {...}
+#-----| -> if (...) ...
+
+# 26| if (...) ...
+#-----| -> access to local variable arg
+
+# 26| ... == ...
+#-----| true -> break;
+#-----| false -> {...}
+
+# 26| access to local variable arg
+#-----| -> null
+
+# 26| null
+#-----| -> ... == ...
+
+# 27| break;
+#-----| break -> [finally: break] {...}
+
+# 30| {...}
+#-----| -> if (...) ...
+
+# 30| [finally: break] {...}
+#-----| -> [finally: break] if (...) ...
+
+# 31| if (...) ...
+#-----| -> access to parameter args
+
+# 31| [finally: break] if (...) ...
+#-----| -> [finally: break] access to parameter args
+
+# 31| ... == ...
+#-----| false -> foreach (... ... in ...) ...
+#-----| true -> ;
+
+# 31| [finally: break] ... == ...
+#-----| true -> [finally: break] ;
+#-----| false -> ;
+
+# 31| access to parameter args
+#-----| -> null
+
+# 31| [finally: break] access to parameter args
+#-----| -> [finally: break] null
+
+# 31| null
+#-----| -> ... == ...
+
+# 31| [finally: break] null
+#-----| -> [finally: break] ... == ...
+
+# 32| ;
+#-----| -> foreach (... ... in ...) ...
+
+# 32| [finally: break] ;
+#-----| break -> ;
+
+# 35| ;
+#-----| -> exit M2 (normal)
+
+# 38| enter M3
+#-----| -> {...}
+
+# 38| exit M3
+
+# 38| exit M3 (normal)
+#-----| -> exit M3
+
+# 39| {...}
+#-----| -> try {...} ...
+
+# 40| try {...} ...
+#-----| -> {...}
+
+# 41| {...}
+#-----| -> if (...) ...
+
+# 42| if (...) ...
+#-----| -> access to parameter args
+
+# 42| ... == ...
+#-----| true -> return ...;
+#-----| false -> {...}
+
+# 42| access to parameter args
+#-----| -> null
+
+# 42| null
+#-----| -> ... == ...
+
+# 43| return ...;
+#-----| return -> [finally: return] {...}
+
+# 46| {...}
+#-----| -> access to parameter args
+
+# 46| [finally: return] {...}
+#-----| -> [finally: return] access to parameter args
+
+# 47| foreach (... ... in ...) ...
+#-----| non-empty -> String arg
+#-----| empty -> ;
+
+# 47| [finally: return] foreach (... ... in ...) ...
+#-----| non-empty -> [finally: return] String arg
+#-----| return -> exit M3 (normal)
+
+# 47| String arg
+#-----| -> {...}
+
+# 47| [finally: return] String arg
+#-----| -> [finally: return] {...}
+
+# 47| access to parameter args
+#-----| -> foreach (... ... in ...) ...
+
+# 47| [finally: return] access to parameter args
+#-----| -> [finally: return] foreach (... ... in ...) ...
+
+# 48| {...}
+#-----| -> if (...) ...
+
+# 48| [finally: return] {...}
+#-----| -> [finally: return] if (...) ...
+
+# 49| if (...) ...
+#-----| -> access to local variable arg
+
+# 49| [finally: return] if (...) ...
+#-----| -> [finally: return] access to local variable arg
+
+# 49| ... == ...
+#-----| false -> foreach (... ... in ...) ...
+#-----| true -> break;
+
+# 49| [finally: return] ... == ...
+#-----| false -> [finally: return] foreach (... ... in ...) ...
+#-----| true -> [finally: return] break;
+
+# 49| access to local variable arg
+#-----| -> null
+
+# 49| [finally: return] access to local variable arg
+#-----| -> [finally: return] null
+
+# 49| null
+#-----| -> ... == ...
+
+# 49| [finally: return] null
+#-----| -> [finally: return] ... == ...
+
+# 50| break;
+#-----| break -> ;
+
+# 50| [finally: return] break;
+#-----| return -> exit M3 (normal)
+
+# 53| ;
+#-----| -> exit M3 (normal)
+
+# 56| enter M4
+#-----| -> {...}
+
+# 56| exit M4
+
+# 56| exit M4 (normal)
+#-----| -> exit M4
+
+# 57| {...}
+#-----| -> try {...} ...
+
+# 58| try {...} ...
+#-----| -> {...}
+
+# 59| {...}
+#-----| -> if (...) ...
+
+# 60| if (...) ...
+#-----| -> access to parameter args
+
+# 60| ... == ...
+#-----| true -> return ...;
+#-----| false -> {...}
+
+# 60| access to parameter args
+#-----| -> null
+
+# 60| null
+#-----| -> ... == ...
+
+# 61| return ...;
+#-----| return -> [finally: return] {...}
+
+# 64| {...}
+#-----| -> access to parameter args
+
+# 64| [finally: return] {...}
+#-----| -> [finally: return] access to parameter args
+
+# 65| foreach (... ... in ...) ...
+#-----| non-empty -> String arg
+#-----| empty -> exit M4 (normal)
+
+# 65| [finally: return] foreach (... ... in ...) ...
+#-----| non-empty -> [finally: return] String arg
+#-----| return -> exit M4 (normal)
+
+# 65| String arg
+#-----| -> {...}
+
+# 65| [finally: return] String arg
+#-----| -> [finally: return] {...}
+
+# 65| access to parameter args
+#-----| -> foreach (... ... in ...) ...
+
+# 65| [finally: return] access to parameter args
+#-----| -> [finally: return] foreach (... ... in ...) ...
+
+# 66| {...}
+#-----| -> if (...) ...
+
+# 66| [finally: return] {...}
+#-----| -> [finally: return] if (...) ...
+
+# 67| if (...) ...
+#-----| -> access to local variable arg
+
+# 67| [finally: return] if (...) ...
+#-----| -> [finally: return] access to local variable arg
+
+# 67| ... == ...
+#-----| false -> foreach (... ... in ...) ...
+#-----| true -> break;
+
+# 67| [finally: return] ... == ...
+#-----| false -> [finally: return] foreach (... ... in ...) ...
+#-----| true -> [finally: return] break;
+
+# 67| access to local variable arg
+#-----| -> null
+
+# 67| [finally: return] access to local variable arg
+#-----| -> [finally: return] null
+
+# 67| null
+#-----| -> ... == ...
+
+# 67| [finally: return] null
+#-----| -> [finally: return] ... == ...
+
+# 68| break;
+#-----| break -> exit M4 (normal)
+
+# 68| [finally: return] break;
+#-----| return -> exit M4 (normal)
+
+CompileTimeOperators.cs:
+# 5| enter Default
+#-----| -> {...}
+
+# 5| exit Default
+
+# 5| exit Default (normal)
+#-----| -> exit Default
+
+# 6| {...}
+#-----| -> default(...)
+
+# 7| return ...;
+#-----| return -> exit Default (normal)
+
+# 7| default(...)
+#-----| -> return ...;
+
+# 10| enter Sizeof
+#-----| -> {...}
+
+# 10| exit Sizeof
+
+# 10| exit Sizeof (normal)
+#-----| -> exit Sizeof
+
+# 11| {...}
+#-----| -> sizeof(..)
+
+# 12| return ...;
+#-----| return -> exit Sizeof (normal)
+
+# 12| sizeof(..)
+#-----| -> return ...;
+
+# 15| enter Typeof
+#-----| -> {...}
+
+# 15| exit Typeof
+
+# 15| exit Typeof (normal)
+#-----| -> exit Typeof
+
+# 16| {...}
+#-----| -> typeof(...)
+
+# 17| return ...;
+#-----| return -> exit Typeof (normal)
+
+# 17| typeof(...)
+#-----| -> return ...;
+
+# 20| enter Nameof
+#-----| -> {...}
+
+# 20| exit Nameof
+
+# 20| exit Nameof (normal)
+#-----| -> exit Nameof
+
+# 21| {...}
+#-----| -> nameof(...)
+
+# 22| return ...;
+#-----| return -> exit Nameof (normal)
+
+# 22| nameof(...)
+#-----| -> return ...;
+
+# 28| enter M
+#-----| -> {...}
+
+# 28| exit M
+
+# 28| exit M (normal)
+#-----| -> exit M
+
+# 29| {...}
+#-----| -> try {...} ...
+
+# 30| try {...} ...
+#-----| -> {...}
+
+# 31| {...}
+#-----| -> goto ...;
+
+# 32| goto ...;
+#-----| goto(End) -> [finally: goto(End)] {...}
+
+# 36| [finally: goto(End)] {...}
+#-----| -> [finally: goto(End)] ...;
+
+# 37| [finally: goto(End)] ...;
+#-----| -> [finally: goto(End)] "Finally"
+
+# 37| [finally: goto(End)] call to method WriteLine
+#-----| goto(End) -> End:
+
+# 37| [finally: goto(End)] "Finally"
+#-----| -> [finally: goto(End)] call to method WriteLine
+
+# 40| End:
+#-----| -> ...;
+
+# 40| ...;
+#-----| -> "End"
+
+# 40| call to method WriteLine
+#-----| -> exit M (normal)
+
+# 40| "End"
+#-----| -> call to method WriteLine
+
+ConditionalAccess.cs:
+# 3| enter M1
+#-----| -> access to parameter i
+
+# 3| exit M1
+
+# 3| exit M1 (normal)
+#-----| -> exit M1
+
+# 3| access to parameter i
+#-----| non-null -> call to method ToString
+#-----| null -> exit M1 (normal)
+
+# 3| call to method ToString
+#-----| non-null -> call to method ToLower
+#-----| null -> exit M1 (normal)
+
+# 3| call to method ToLower
+#-----| -> exit M1 (normal)
+
+# 5| enter M2
+#-----| -> access to parameter s
+
+# 5| exit M2
+
+# 5| exit M2 (normal)
+#-----| -> exit M2
+
+# 5| access to parameter s
+#-----| non-null -> access to property Length
+#-----| null -> exit M2 (normal)
+
+# 5| access to property Length
+#-----| -> exit M2 (normal)
+
+# 7| enter M3
+#-----| -> access to parameter s1
+
+# 7| exit M3
+
+# 7| exit M3 (normal)
+#-----| -> exit M3
+
+# 7| ... ?? ...
+#-----| non-null -> access to property Length
+#-----| null -> exit M3 (normal)
+
+# 7| [non-null] ... ?? ...
+#-----| non-null -> access to property Length
+
+# 7| [null] ... ?? ...
+#-----| null -> exit M3 (normal)
+
+# 7| access to parameter s1
+#-----| non-null -> ... ?? ...
+#-----| null -> access to parameter s2
+
+# 7| access to parameter s2
+#-----| non-null -> [non-null] ... ?? ...
+#-----| null -> [null] ... ?? ...
+
+# 7| access to property Length
+#-----| -> exit M3 (normal)
+
+# 9| enter M4
+#-----| -> access to parameter s
+
+# 9| exit M4
+
+# 9| exit M4 (normal)
+#-----| -> exit M4
+
+# 9| ... ?? ...
+#-----| -> exit M4 (normal)
+
+# 9| access to parameter s
+#-----| non-null -> access to property Length
+#-----| null -> 0
+
+# 9| access to property Length
+#-----| non-null -> ... ?? ...
+#-----| null -> 0
+
+# 9| 0
+#-----| -> ... ?? ...
+
+# 11| enter M5
+#-----| -> {...}
+
+# 11| exit M5
+
+# 11| exit M5 (normal)
+#-----| -> exit M5
+
+# 12| {...}
+#-----| -> if (...) ...
+
+# 13| if (...) ...
+#-----| -> access to parameter s
+
+# 13| ... > ...
+#-----| true -> 0
+#-----| false -> 1
+
+# 13| access to parameter s
+#-----| non-null -> access to property Length
+#-----| null -> 0
+
+# 13| access to property Length
+#-----| -> 0
+
+# 13| (...) ...
+#-----| -> ... > ...
+
+# 13| 0
+#-----| -> (...) ...
+
+# 14| return ...;
+#-----| return -> exit M5 (normal)
+
+# 14| 0
+#-----| -> return ...;
+
+# 16| return ...;
+#-----| return -> exit M5 (normal)
+
+# 16| 1
+#-----| -> return ...;
+
+# 19| enter M6
+#-----| -> access to parameter s1
+
+# 19| exit M6
+
+# 19| exit M6 (normal)
+#-----| -> exit M6
+
+# 19| access to parameter s1
+#-----| non-null -> access to parameter s2
+#-----| null -> exit M6 (normal)
+
+# 19| call to method CommaJoinWith
+#-----| -> exit M6 (normal)
+
+# 19| access to parameter s2
+#-----| -> call to method CommaJoinWith
+
+# 21| enter M7
+#-----| -> {...}
+
+# 21| exit M7
+
+# 21| exit M7 (normal)
+#-----| -> exit M7
+
+# 22| {...}
+#-----| -> ... ...;
+
+# 23| ... ...;
+#-----| -> null
+
+# 23| Nullable j = ...
+#-----| -> ... ...;
+
+# 23| (...) ...
+#-----| null -> Nullable j = ...
+
+# 23| null
+#-----| -> (...) ...
+
+# 24| ... ...;
+#-----| -> access to parameter i
+
+# 24| String s = ...
+#-----| -> ...;
+
+# 24| (...) ...
+#-----| non-null -> call to method ToString
+
+# 24| access to parameter i
+#-----| -> (...) ...
+
+# 24| call to method ToString
+#-----| -> String s = ...
+
+# 25| ...;
+#-----| -> ""
+
+# 25| ... = ...
+#-----| -> exit M7 (normal)
+
+# 25| ""
+#-----| non-null -> access to local variable s
+
+# 25| call to method CommaJoinWith
+#-----| -> ... = ...
+
+# 25| access to local variable s
+#-----| -> call to method CommaJoinWith
+
+# 30| enter Out
+#-----| -> 0
+
+# 30| exit Out
+
+# 30| exit Out (normal)
+#-----| -> exit Out
+
+# 30| ... = ...
+#-----| -> exit Out (normal)
+
+# 30| 0
+#-----| -> ... = ...
+
+# 32| enter M8
+#-----| -> {...}
+
+# 32| exit M8
+
+# 32| exit M8 (normal)
+#-----| -> exit M8
+
+# 33| {...}
+#-----| -> ...;
+
+# 34| ...;
+#-----| -> 0
+
+# 34| ... = ...
+#-----| -> ...;
+
+# 34| 0
+#-----| -> ... = ...
+
+# 35| ...;
+#-----| -> this access
+
+# 35| access to property Prop
+#-----| non-null -> call to method Out
+#-----| null -> exit M8 (normal)
+
+# 35| this access
+#-----| -> access to property Prop
+
+# 35| call to method Out
+#-----| -> exit M8 (normal)
+
+# 41| enter CommaJoinWith
+#-----| -> access to parameter s1
+
+# 41| exit CommaJoinWith
+
+# 41| exit CommaJoinWith (normal)
+#-----| -> exit CommaJoinWith
+
+# 41| ... + ...
+#-----| -> exit CommaJoinWith (normal)
+
+# 41| ... + ...
+#-----| -> access to parameter s2
+
+# 41| access to parameter s1
+#-----| -> ", "
+
+# 41| ", "
+#-----| -> ... + ...
+
+# 41| access to parameter s2
+#-----| -> ... + ...
+
+Conditions.cs:
+# 3| enter IncrOrDecr
+#-----| -> {...}
+
+# 3| exit IncrOrDecr
+
+# 3| exit IncrOrDecr (normal)
+#-----| -> exit IncrOrDecr
+
+# 4| {...}
+#-----| -> if (...) ...
+
+# 5| if (...) ...
+#-----| -> access to parameter inc
+
+# 5| access to parameter inc
+#-----| true -> [inc (line 3): true] ...;
+#-----| false -> [inc (line 3): false] if (...) ...
+
+# 6| [inc (line 3): true] ...;
+#-----| -> [inc (line 3): true] access to parameter x
+
+# 6| [inc (line 3): true] ...++
+#-----| -> [inc (line 3): true] if (...) ...
+
+# 6| [inc (line 3): true] access to parameter x
+#-----| -> [inc (line 3): true] ...++
+
+# 7| [inc (line 3): false] if (...) ...
+#-----| -> [inc (line 3): false] access to parameter inc
+
+# 7| [inc (line 3): true] if (...) ...
+#-----| -> [inc (line 3): true] access to parameter inc
+
+# 7| [false] !...
+#-----| false -> exit IncrOrDecr (normal)
+
+# 7| [true] !...
+#-----| true -> ...;
+
+# 7| [inc (line 3): false] access to parameter inc
+#-----| false -> [true] !...
+
+# 7| [inc (line 3): true] access to parameter inc
+#-----| true -> [false] !...
+
+# 8| ...;
+#-----| -> access to parameter x
+
+# 8| ...--
+#-----| -> exit IncrOrDecr (normal)
+
+# 8| access to parameter x
+#-----| -> ...--
+
+# 11| enter M1
+#-----| -> {...}
+
+# 11| exit M1
+
+# 11| exit M1 (normal)
+#-----| -> exit M1
+
+# 12| {...}
+#-----| -> ... ...;
+
+# 13| ... ...;
+#-----| -> 0
+
+# 13| Int32 x = ...
+#-----| -> if (...) ...
+
+# 13| 0
+#-----| -> Int32 x = ...
+
+# 14| if (...) ...
+#-----| -> access to parameter b
+
+# 14| access to parameter b
+#-----| true -> [b (line 11): true] ...;
+#-----| false -> [b (line 11): false] if (...) ...
+
+# 15| [b (line 11): true] ...;
+#-----| -> [b (line 11): true] access to local variable x
+
+# 15| [b (line 11): true] ...++
+#-----| -> [b (line 11): true] if (...) ...
+
+# 15| [b (line 11): true] access to local variable x
+#-----| -> [b (line 11): true] ...++
+
+# 16| [b (line 11): false] if (...) ...
+#-----| -> [b (line 11): false] access to local variable x
+
+# 16| [b (line 11): true] if (...) ...
+#-----| -> [b (line 11): true] access to local variable x
+
+# 16| [b (line 11): false] ... > ...
+#-----| true -> [b (line 11): false] if (...) ...
+#-----| false -> access to local variable x
+
+# 16| [b (line 11): true] ... > ...
+#-----| true -> [b (line 11): true] if (...) ...
+#-----| false -> access to local variable x
+
+# 16| [b (line 11): false] access to local variable x
+#-----| -> [b (line 11): false] 0
+
+# 16| [b (line 11): true] access to local variable x
+#-----| -> [b (line 11): true] 0
+
+# 16| [b (line 11): false] 0
+#-----| -> [b (line 11): false] ... > ...
+
+# 16| [b (line 11): true] 0
+#-----| -> [b (line 11): true] ... > ...
+
+# 17| [b (line 11): false] if (...) ...
+#-----| -> [b (line 11): false] access to parameter b
+
+# 17| [b (line 11): true] if (...) ...
+#-----| -> [b (line 11): true] access to parameter b
+
+# 17| [false] !...
+#-----| false -> access to local variable x
+
+# 17| [true] !...
+#-----| true -> ...;
+
+# 17| [b (line 11): false] access to parameter b
+#-----| false -> [true] !...
+
+# 17| [b (line 11): true] access to parameter b
+#-----| true -> [false] !...
+
+# 18| ...;
+#-----| -> access to local variable x
+
+# 18| ...--
+#-----| -> access to local variable x
+
+# 18| access to local variable x
+#-----| -> ...--
+
+# 19| return ...;
+#-----| return -> exit M1 (normal)
+
+# 19| access to local variable x
+#-----| -> return ...;
+
+# 22| enter M2
+#-----| -> {...}
+
+# 22| exit M2
+
+# 22| exit M2 (normal)
+#-----| -> exit M2
+
+# 23| {...}
+#-----| -> ... ...;
+
+# 24| ... ...;
+#-----| -> 0
+
+# 24| Int32 x = ...
+#-----| -> if (...) ...
+
+# 24| 0
+#-----| -> Int32 x = ...
+
+# 25| if (...) ...
+#-----| -> access to parameter b1
+
+# 25| access to parameter b1
+#-----| true -> if (...) ...
+#-----| false -> if (...) ...
+
+# 26| if (...) ...
+#-----| -> access to parameter b2
+
+# 26| access to parameter b2
+#-----| true -> [b2 (line 22): true] ...;
+#-----| false -> [b2 (line 22): false] if (...) ...
+
+# 27| [b2 (line 22): true] ...;
+#-----| -> [b2 (line 22): true] access to local variable x
+
+# 27| [b2 (line 22): true] ...++
+#-----| -> [b2 (line 22): true] if (...) ...
+
+# 27| [b2 (line 22): true] access to local variable x
+#-----| -> [b2 (line 22): true] ...++
+
+# 28| if (...) ...
+#-----| -> access to parameter b2
+
+# 28| [b2 (line 22): false] if (...) ...
+#-----| -> [b2 (line 22): false] access to parameter b2
+
+# 28| [b2 (line 22): true] if (...) ...
+#-----| -> [b2 (line 22): true] access to parameter b2
+
+# 28| access to parameter b2
+#-----| true -> ...;
+#-----| false -> access to local variable x
+
+# 28| [b2 (line 22): false] access to parameter b2
+#-----| false -> access to local variable x
+
+# 28| [b2 (line 22): true] access to parameter b2
+#-----| true -> ...;
+
+# 29| ...;
+#-----| -> access to local variable x
+
+# 29| ...++
+#-----| -> access to local variable x
+
+# 29| access to local variable x
+#-----| -> ...++
+
+# 30| return ...;
+#-----| return -> exit M2 (normal)
+
+# 30| access to local variable x
+#-----| -> return ...;
+
+# 33| enter M3
+#-----| -> {...}
+
+# 33| exit M3
+
+# 33| exit M3 (normal)
+#-----| -> exit M3
+
+# 34| {...}
+#-----| -> ... ...;
+
+# 35| ... ...;
+#-----| -> 0
+
+# 35| Int32 x = ...
+#-----| -> ... ...;
+
+# 35| 0
+#-----| -> Int32 x = ...
+
+# 36| ... ...;
+#-----| -> false
+
+# 36| Boolean b2 = ...
+#-----| -> if (...) ...
+
+# 36| false
+#-----| -> Boolean b2 = ...
+
+# 37| if (...) ...
+#-----| -> access to parameter b1
+
+# 37| access to parameter b1
+#-----| true -> ...;
+#-----| false -> if (...) ...
+
+# 38| ...;
+#-----| -> access to parameter b1
+
+# 38| ... = ...
+#-----| -> if (...) ...
+
+# 38| access to parameter b1
+#-----| -> ... = ...
+
+# 39| if (...) ...
+#-----| -> access to local variable b2
+
+# 39| access to local variable b2
+#-----| true -> [b2 (line 39): true] ...;
+#-----| false -> [b2 (line 39): false] if (...) ...
+
+# 40| [b2 (line 39): true] ...;
+#-----| -> [b2 (line 39): true] access to local variable x
+
+# 40| [b2 (line 39): true] ...++
+#-----| -> [b2 (line 39): true] if (...) ...
+
+# 40| [b2 (line 39): true] access to local variable x
+#-----| -> [b2 (line 39): true] ...++
+
+# 41| [b2 (line 39): false] if (...) ...
+#-----| -> [b2 (line 39): false] access to local variable b2
+
+# 41| [b2 (line 39): true] if (...) ...
+#-----| -> [b2 (line 39): true] access to local variable b2
+
+# 41| [b2 (line 39): false] access to local variable b2
+#-----| false -> access to local variable x
+
+# 41| [b2 (line 39): true] access to local variable b2
+#-----| true -> ...;
+
+# 42| ...;
+#-----| -> access to local variable x
+
+# 42| ...++
+#-----| -> access to local variable x
+
+# 42| access to local variable x
+#-----| -> ...++
+
+# 43| return ...;
+#-----| return -> exit M3 (normal)
+
+# 43| access to local variable x
+#-----| -> return ...;
+
+# 46| enter M4
+#-----| -> {...}
+
+# 46| exit M4
+
+# 46| exit M4 (normal)
+#-----| -> exit M4
+
+# 47| {...}
+#-----| -> ... ...;
+
+# 48| ... ...;
+#-----| -> 0
+
+# 48| Int32 y = ...
+#-----| -> while (...) ...
+
+# 48| 0
+#-----| -> Int32 y = ...
+
+# 49| while (...) ...
+#-----| -> access to parameter x
+
+# 49| ... > ...
+#-----| true -> {...}
+#-----| false -> access to local variable y
+
+# 49| [b (line 46): false] ... > ...
+#-----| true -> [b (line 46): false] {...}
+#-----| false -> access to local variable y
+
+# 49| [b (line 46): true] ... > ...
+#-----| true -> [b (line 46): true] {...}
+#-----| false -> access to local variable y
+
+# 49| ...--
+#-----| -> 0
+
+# 49| [b (line 46): false] ...--
+#-----| -> [b (line 46): false] 0
+
+# 49| [b (line 46): true] ...--
+#-----| -> [b (line 46): true] 0
+
+# 49| access to parameter x
+#-----| -> ...--
+
+# 49| [b (line 46): false] access to parameter x
+#-----| -> [b (line 46): false] ...--
+
+# 49| [b (line 46): true] access to parameter x
+#-----| -> [b (line 46): true] ...--
+
+# 49| 0
+#-----| -> ... > ...
+
+# 49| [b (line 46): false] 0
+#-----| -> [b (line 46): false] ... > ...
+
+# 49| [b (line 46): true] 0
+#-----| -> [b (line 46): true] ... > ...
+
+# 50| {...}
+#-----| -> if (...) ...
+
+# 50| [b (line 46): false] {...}
+#-----| -> [b (line 46): false] if (...) ...
+
+# 50| [b (line 46): true] {...}
+#-----| -> [b (line 46): true] if (...) ...
+
+# 51| if (...) ...
+#-----| -> access to parameter b
+
+# 51| [b (line 46): false] if (...) ...
+#-----| -> [b (line 46): false] access to parameter b
+
+# 51| [b (line 46): true] if (...) ...
+#-----| -> [b (line 46): true] access to parameter b
+
+# 51| access to parameter b
+#-----| true -> [b (line 46): true] ...;
+#-----| false -> [b (line 46): false] access to parameter x
+
+# 51| [b (line 46): false] access to parameter b
+#-----| false -> [b (line 46): false] access to parameter x
+
+# 51| [b (line 46): true] access to parameter b
+#-----| true -> [b (line 46): true] ...;
+
+# 52| [b (line 46): true] ...;
+#-----| -> [b (line 46): true] access to local variable y
+
+# 52| [b (line 46): true] ...++
+#-----| -> [b (line 46): true] access to parameter x
+
+# 52| [b (line 46): true] access to local variable y
+#-----| -> [b (line 46): true] ...++
+
+# 54| return ...;
+#-----| return -> exit M4 (normal)
+
+# 54| access to local variable y
+#-----| -> return ...;
+
+# 57| enter M5
+#-----| -> {...}
+
+# 57| exit M5
+
+# 57| exit M5 (normal)
+#-----| -> exit M5
+
+# 58| {...}
+#-----| -> ... ...;
+
+# 59| ... ...;
+#-----| -> 0
+
+# 59| Int32 y = ...
+#-----| -> while (...) ...
+
+# 59| 0
+#-----| -> Int32 y = ...
+
+# 60| while (...) ...
+#-----| -> access to parameter x
+
+# 60| ... > ...
+#-----| true -> {...}
+#-----| false -> if (...) ...
+
+# 60| [b (line 57): false] ... > ...
+#-----| true -> [b (line 57): false] {...}
+#-----| false -> [b (line 57): false] if (...) ...
+
+# 60| [b (line 57): true] ... > ...
+#-----| true -> [b (line 57): true] {...}
+#-----| false -> [b (line 57): true] if (...) ...
+
+# 60| ...--
+#-----| -> 0
+
+# 60| [b (line 57): false] ...--
+#-----| -> [b (line 57): false] 0
+
+# 60| [b (line 57): true] ...--
+#-----| -> [b (line 57): true] 0
+
+# 60| access to parameter x
+#-----| -> ...--
+
+# 60| [b (line 57): false] access to parameter x
+#-----| -> [b (line 57): false] ...--
+
+# 60| [b (line 57): true] access to parameter x
+#-----| -> [b (line 57): true] ...--
+
+# 60| 0
+#-----| -> ... > ...
+
+# 60| [b (line 57): false] 0
+#-----| -> [b (line 57): false] ... > ...
+
+# 60| [b (line 57): true] 0
+#-----| -> [b (line 57): true] ... > ...
+
+# 61| {...}
+#-----| -> if (...) ...
+
+# 61| [b (line 57): false] {...}
+#-----| -> [b (line 57): false] if (...) ...
+
+# 61| [b (line 57): true] {...}
+#-----| -> [b (line 57): true] if (...) ...
+
+# 62| if (...) ...
+#-----| -> access to parameter b
+
+# 62| [b (line 57): false] if (...) ...
+#-----| -> [b (line 57): false] access to parameter b
+
+# 62| [b (line 57): true] if (...) ...
+#-----| -> [b (line 57): true] access to parameter b
+
+# 62| access to parameter b
+#-----| true -> [b (line 57): true] ...;
+#-----| false -> [b (line 57): false] access to parameter x
+
+# 62| [b (line 57): false] access to parameter b
+#-----| false -> [b (line 57): false] access to parameter x
+
+# 62| [b (line 57): true] access to parameter b
+#-----| true -> [b (line 57): true] ...;
+
+# 63| [b (line 57): true] ...;
+#-----| -> [b (line 57): true] access to local variable y
+
+# 63| [b (line 57): true] ...++
+#-----| -> [b (line 57): true] access to parameter x
+
+# 63| [b (line 57): true] access to local variable y
+#-----| -> [b (line 57): true] ...++
+
+# 65| if (...) ...
+#-----| -> access to parameter b
+
+# 65| [b (line 57): false] if (...) ...
+#-----| -> [b (line 57): false] access to parameter b
+
+# 65| [b (line 57): true] if (...) ...
+#-----| -> [b (line 57): true] access to parameter b
+
+# 65| access to parameter b
+#-----| true -> ...;
+#-----| false -> access to local variable y
+
+# 65| [b (line 57): false] access to parameter b
+#-----| false -> access to local variable y
+
+# 65| [b (line 57): true] access to parameter b
+#-----| true -> ...;
+
+# 66| ...;
+#-----| -> access to local variable y
+
+# 66| ...++
+#-----| -> access to local variable y
+
+# 66| access to local variable y
+#-----| -> ...++
+
+# 67| return ...;
+#-----| return -> exit M5 (normal)
+
+# 67| access to local variable y
+#-----| -> return ...;
+
+# 70| enter M6
+#-----| -> {...}
+
+# 70| exit M6
+
+# 70| exit M6 (normal)
+#-----| -> exit M6
+
+# 71| {...}
+#-----| -> ... ...;
+
+# 72| ... ...;
+#-----| -> access to parameter ss
+
+# 72| Boolean b = ...
+#-----| -> ... ...;
+
+# 72| ... > ...
+#-----| -> Boolean b = ...
+
+# 72| access to property Length
+#-----| -> 0
+
+# 72| access to parameter ss
+#-----| -> access to property Length
+
+# 72| 0
+#-----| -> ... > ...
+
+# 73| ... ...;
+#-----| -> 0
+
+# 73| Int32 x = ...
+#-----| -> access to parameter ss
+
+# 73| 0
+#-----| -> Int32 x = ...
+
+# 74| foreach (... ... in ...) ...
+#-----| non-empty -> String _
+#-----| empty -> if (...) ...
+
+# 74| String _
+#-----| -> {...}
+
+# 74| access to parameter ss
+#-----| -> foreach (... ... in ...) ...
+
+# 75| {...}
+#-----| -> if (...) ...
+
+# 76| if (...) ...
+#-----| -> access to local variable b
+
+# 76| access to local variable b
+#-----| true -> ...;
+#-----| false -> if (...) ...
+
+# 77| ...;
+#-----| -> access to local variable x
+
+# 77| ...++
+#-----| -> if (...) ...
+
+# 77| access to local variable x
+#-----| -> ...++
+
+# 78| if (...) ...
+#-----| -> access to local variable x
+
+# 78| ... > ...
+#-----| false -> foreach (... ... in ...) ...
+#-----| true -> ...;
+
+# 78| access to local variable x
+#-----| -> 0
+
+# 78| 0
+#-----| -> ... > ...
+
+# 79| ...;
+#-----| -> false
+
+# 79| ... = ...
+#-----| -> foreach (... ... in ...) ...
+
+# 79| false
+#-----| -> ... = ...
+
+# 81| if (...) ...
+#-----| -> access to local variable b
+
+# 81| access to local variable b
+#-----| true -> ...;
+#-----| false -> access to local variable x
+
+# 82| ...;
+#-----| -> access to local variable x
+
+# 82| ...++
+#-----| -> access to local variable x
+
+# 82| access to local variable x
+#-----| -> ...++
+
+# 83| return ...;
+#-----| return -> exit M6 (normal)
+
+# 83| access to local variable x
+#-----| -> return ...;
+
+# 86| enter M7
+#-----| -> {...}
+
+# 86| exit M7
+
+# 86| exit M7 (normal)
+#-----| -> exit M7
+
+# 87| {...}
+#-----| -> ... ...;
+
+# 88| ... ...;
+#-----| -> access to parameter ss
+
+# 88| Boolean b = ...
+#-----| -> ... ...;
+
+# 88| ... > ...
+#-----| -> Boolean b = ...
+
+# 88| access to property Length
+#-----| -> 0
+
+# 88| access to parameter ss
+#-----| -> access to property Length
+
+# 88| 0
+#-----| -> ... > ...
+
+# 89| ... ...;
+#-----| -> 0
+
+# 89| Int32 x = ...
+#-----| -> access to parameter ss
+
+# 89| 0
+#-----| -> Int32 x = ...
+
+# 90| foreach (... ... in ...) ...
+#-----| non-empty -> String _
+#-----| empty -> access to local variable x
+
+# 90| String _
+#-----| -> {...}
+
+# 90| access to parameter ss
+#-----| -> foreach (... ... in ...) ...
+
+# 91| {...}
+#-----| -> if (...) ...
+
+# 92| if (...) ...
+#-----| -> access to local variable b
+
+# 92| access to local variable b
+#-----| true -> ...;
+#-----| false -> if (...) ...
+
+# 93| ...;
+#-----| -> access to local variable x
+
+# 93| ...++
+#-----| -> if (...) ...
+
+# 93| access to local variable x
+#-----| -> ...++
+
+# 94| if (...) ...
+#-----| -> access to local variable x
+
+# 94| ... > ...
+#-----| true -> ...;
+#-----| false -> if (...) ...
+
+# 94| access to local variable x
+#-----| -> 0
+
+# 94| 0
+#-----| -> ... > ...
+
+# 95| ...;
+#-----| -> false
+
+# 95| ... = ...
+#-----| -> if (...) ...
+
+# 95| false
+#-----| -> ... = ...
+
+# 96| if (...) ...
+#-----| -> access to local variable b
+
+# 96| access to local variable b
+#-----| false -> foreach (... ... in ...) ...
+#-----| true -> ...;
+
+# 97| ...;
+#-----| -> access to local variable x
+
+# 97| ...++
+#-----| -> foreach (... ... in ...) ...
+
+# 97| access to local variable x
+#-----| -> ...++
+
+# 99| return ...;
+#-----| return -> exit M7 (normal)
+
+# 99| access to local variable x
+#-----| -> return ...;
+
+# 102| enter M8
+#-----| -> {...}
+
+# 102| exit M8
+
+# 102| exit M8 (normal)
+#-----| -> exit M8
+
+# 103| {...}
+#-----| -> ... ...;
+
+# 104| ... ...;
+#-----| -> access to parameter b
+
+# 104| String x = ...
+#-----| -> if (...) ...
+
+# 104| call to method ToString
+#-----| -> String x = ...
+
+# 104| access to parameter b
+#-----| -> call to method ToString
+
+# 105| if (...) ...
+#-----| -> access to parameter b
+
+# 105| access to parameter b
+#-----| true -> [b (line 102): true] ...;
+#-----| false -> [b (line 102): false] if (...) ...
+
+# 106| [b (line 102): true] ...;
+#-----| -> [b (line 102): true] access to local variable x
+
+# 106| [b (line 102): true] ... = ...
+#-----| -> [b (line 102): true] if (...) ...
+
+# 106| [b (line 102): true] ... + ...
+#-----| -> [b (line 102): true] ... = ...
+
+# 106| [b (line 102): true] access to local variable x
+#-----| -> [b (line 102): true] ""
+
+# 106| [b (line 102): true] ""
+#-----| -> [b (line 102): true] ... + ...
+
+# 107| [b (line 102): false] if (...) ...
+#-----| -> [b (line 102): false] access to local variable x
+
+# 107| [b (line 102): true] if (...) ...
+#-----| -> [b (line 102): true] access to local variable x
+
+# 107| [b (line 102): false] ... > ...
+#-----| true -> [b (line 102): false] if (...) ...
+#-----| false -> access to local variable x
+
+# 107| [b (line 102): true] ... > ...
+#-----| true -> [b (line 102): true] if (...) ...
+#-----| false -> access to local variable x
+
+# 107| [b (line 102): false] access to property Length
+#-----| -> [b (line 102): false] 0
+
+# 107| [b (line 102): true] access to property Length
+#-----| -> [b (line 102): true] 0
+
+# 107| [b (line 102): false] access to local variable x
+#-----| -> [b (line 102): false] access to property Length
+
+# 107| [b (line 102): true] access to local variable x
+#-----| -> [b (line 102): true] access to property Length
+
+# 107| [b (line 102): false] 0
+#-----| -> [b (line 102): false] ... > ...
+
+# 107| [b (line 102): true] 0
+#-----| -> [b (line 102): true] ... > ...
+
+# 108| [b (line 102): false] if (...) ...
+#-----| -> [b (line 102): false] access to parameter b
+
+# 108| [b (line 102): true] if (...) ...
+#-----| -> [b (line 102): true] access to parameter b
+
+# 108| [false] !...
+#-----| false -> access to local variable x
+
+# 108| [true] !...
+#-----| true -> ...;
+
+# 108| [b (line 102): false] access to parameter b
+#-----| false -> [true] !...
+
+# 108| [b (line 102): true] access to parameter b
+#-----| true -> [false] !...
+
+# 109| ...;
+#-----| -> access to local variable x
+
+# 109| ... = ...
+#-----| -> access to local variable x
+
+# 109| ... + ...
+#-----| -> ... = ...
+
+# 109| access to local variable x
+#-----| -> ""
+
+# 109| ""
+#-----| -> ... + ...
+
+# 110| return ...;
+#-----| return -> exit M8 (normal)
+
+# 110| access to local variable x
+#-----| -> return ...;
+
+# 113| enter M9
+#-----| -> {...}
+
+# 113| exit M9
+
+# 113| exit M9 (normal)
+#-----| -> exit M9
+
+# 114| {...}
+#-----| -> ... ...;
+
+# 115| ... ...;
+#-----| -> null
+
+# 115| String s = ...
+#-----| -> for (...;...;...) ...
+
+# 115| null
+#-----| -> String s = ...
+
+# 116| for (...;...;...) ...
+#-----| -> 0
+
+# 116| Int32 i = ...
+#-----| -> access to local variable i
+
+# 116| 0
+#-----| -> Int32 i = ...
+
+# 116| ... < ...
+#-----| true -> {...}
+#-----| false -> exit M9 (normal)
+
+# 116| access to local variable i
+#-----| -> access to parameter args
+
+# 116| access to property Length
+#-----| -> ... < ...
+
+# 116| access to parameter args
+#-----| -> access to property Length
+
+# 116| ...++
+#-----| -> access to local variable i
+
+# 116| access to local variable i
+#-----| -> ...++
+
+# 117| {...}
+#-----| -> ... ...;
+
+# 118| ... ...;
+#-----| -> access to local variable i
+
+# 118| Boolean last = ...
+#-----| -> if (...) ...
+
+# 118| ... == ...
+#-----| -> Boolean last = ...
+
+# 118| access to local variable i
+#-----| -> access to parameter args
+
+# 118| ... - ...
+#-----| -> ... == ...
+
+# 118| access to property Length
+#-----| -> 1
+
+# 118| access to parameter args
+#-----| -> access to property Length
+
+# 118| 1
+#-----| -> ... - ...
+
+# 119| if (...) ...
+#-----| -> access to local variable last
+
+# 119| [false, last (line 118): true] !...
+#-----| false -> [last (line 118): true] if (...) ...
+
+# 119| [true, last (line 118): false] !...
+#-----| true -> [last (line 118): false] ...;
+
+# 119| access to local variable last
+#-----| true -> [false, last (line 118): true] !...
+#-----| false -> [true, last (line 118): false] !...
+
+# 120| [last (line 118): false] ...;
+#-----| -> [last (line 118): false] ""
+
+# 120| [last (line 118): false] ... = ...
+#-----| -> [last (line 118): false] if (...) ...
+
+# 120| [last (line 118): false] ""
+#-----| -> [last (line 118): false] ... = ...
+
+# 121| [last (line 118): false] if (...) ...
+#-----| -> [last (line 118): false] access to local variable last
+
+# 121| [last (line 118): true] if (...) ...
+#-----| -> [last (line 118): true] access to local variable last
+
+# 121| [last (line 118): false] access to local variable last
+#-----| false -> access to local variable i
+
+# 121| [last (line 118): true] access to local variable last
+#-----| true -> ...;
+
+# 122| ...;
+#-----| -> null
+
+# 122| ... = ...
+#-----| -> access to local variable i
+
+# 122| null
+#-----| -> ... = ...
+
+# 129| enter M10
+#-----| -> {...}
+
+# 130| {...}
+#-----| -> while (...) ...
+
+# 131| while (...) ...
+#-----| -> true
+
+# 131| true
+#-----| true -> {...}
+
+# 131| [Field1 (line 129): false] true
+#-----| true -> [Field1 (line 129): false] {...}
+
+# 131| [Field1 (line 129): true, Field2 (line 129): false] true
+#-----| true -> [Field1 (line 129): true, Field2 (line 129): false] {...}
+
+# 131| [Field1 (line 129): true, Field2 (line 129): true] true
+#-----| true -> [Field1 (line 129): true, Field2 (line 129): true] {...}
+
+# 132| {...}
+#-----| -> if (...) ...
+
+# 132| [Field1 (line 129): false] {...}
+#-----| -> [Field1 (line 129): false] if (...) ...
+
+# 132| [Field1 (line 129): true, Field2 (line 129): false] {...}
+#-----| -> [Field1 (line 129): true, Field2 (line 129): false] if (...) ...
+
+# 132| [Field1 (line 129): true, Field2 (line 129): true] {...}
+#-----| -> [Field1 (line 129): true, Field2 (line 129): true] if (...) ...
+
+# 133| if (...) ...
+#-----| -> this access
+
+# 133| [Field1 (line 129): false] if (...) ...
+#-----| -> [Field1 (line 129): false] this access
+
+# 133| [Field1 (line 129): true, Field2 (line 129): false] if (...) ...
+#-----| -> [Field1 (line 129): true, Field2 (line 129): false] this access
+
+# 133| [Field1 (line 129): true, Field2 (line 129): true] if (...) ...
+#-----| -> [Field1 (line 129): true, Field2 (line 129): true] this access
+
+# 133| access to field Field1
+#-----| false -> [Field1 (line 129): false] true
+#-----| true -> [Field1 (line 129): true] {...}
+
+# 133| [Field1 (line 129): false] access to field Field1
+#-----| false -> [Field1 (line 129): false] true
+
+# 133| [Field1 (line 129): true, Field2 (line 129): false] access to field Field1
+#-----| true -> [Field1 (line 129): true, Field2 (line 129): false] {...}
+
+# 133| [Field1 (line 129): true, Field2 (line 129): true] access to field Field1
+#-----| true -> [Field1 (line 129): true, Field2 (line 129): true] {...}
+
+# 133| this access
+#-----| -> access to field Field1
+
+# 133| [Field1 (line 129): false] this access
+#-----| -> [Field1 (line 129): false] access to field Field1
+
+# 133| [Field1 (line 129): true, Field2 (line 129): false] this access
+#-----| -> [Field1 (line 129): true, Field2 (line 129): false] access to field Field1
+
+# 133| [Field1 (line 129): true, Field2 (line 129): true] this access
+#-----| -> [Field1 (line 129): true, Field2 (line 129): true] access to field Field1
+
+# 134| [Field1 (line 129): true] {...}
+#-----| -> [Field1 (line 129): true] if (...) ...
+
+# 134| [Field1 (line 129): true, Field2 (line 129): false] {...}
+#-----| -> [Field1 (line 129): true, Field2 (line 129): false] if (...) ...
+
+# 134| [Field1 (line 129): true, Field2 (line 129): true] {...}
+#-----| -> [Field1 (line 129): true, Field2 (line 129): true] if (...) ...
+
+# 135| [Field1 (line 129): true] if (...) ...
+#-----| -> [Field1 (line 129): true] this access
+
+# 135| [Field1 (line 129): true, Field2 (line 129): false] if (...) ...
+#-----| -> [Field1 (line 129): true, Field2 (line 129): false] this access
+
+# 135| [Field1 (line 129): true, Field2 (line 129): true] if (...) ...
+#-----| -> [Field1 (line 129): true, Field2 (line 129): true] this access
+
+# 135| [Field1 (line 129): true] access to field Field2
+#-----| false -> [Field1 (line 129): true, Field2 (line 129): false] true
+#-----| true -> [Field1 (line 129): true, Field2 (line 129): true] {...}
+
+# 135| [Field1 (line 129): true, Field2 (line 129): false] access to field Field2
+#-----| false -> [Field1 (line 129): true, Field2 (line 129): false] true
+
+# 135| [Field1 (line 129): true, Field2 (line 129): true] access to field Field2
+#-----| true -> [Field1 (line 129): true, Field2 (line 129): true] {...}
+
+# 135| [Field1 (line 129): true] this access
+#-----| -> [Field1 (line 129): true] access to field Field2
+
+# 135| [Field1 (line 129): true, Field2 (line 129): false] this access
+#-----| -> [Field1 (line 129): true, Field2 (line 129): false] access to field Field2
+
+# 135| [Field1 (line 129): true, Field2 (line 129): true] this access
+#-----| -> [Field1 (line 129): true, Field2 (line 129): true] access to field Field2
+
+# 136| [Field1 (line 129): true, Field2 (line 129): true] {...}
+#-----| -> [Field1 (line 129): true, Field2 (line 129): true] ...;
+
+# 137| [Field1 (line 129): true, Field2 (line 129): true] ...;
+#-----| -> [Field1 (line 129): true, Field2 (line 129): true] this access
+
+# 137| [Field1 (line 129): true, Field2 (line 129): true] call to method ToString
+#-----| -> [Field1 (line 129): true, Field2 (line 129): true] true
+
+# 137| [Field1 (line 129): true, Field2 (line 129): true] access to field Field1
+#-----| -> [Field1 (line 129): true, Field2 (line 129): true] call to method ToString
+
+# 137| [Field1 (line 129): true, Field2 (line 129): true] this access
+#-----| -> [Field1 (line 129): true, Field2 (line 129): true] access to field Field1
+
+# 143| enter M11
+#-----| -> {...}
+
+# 143| exit M11
+
+# 143| exit M11 (normal)
+#-----| -> exit M11
+
+# 144| {...}
+#-----| -> ... ...;
+
+# 145| ... ...;
+#-----| -> access to parameter b
+
+# 145| [b (line 143): false] String s = ...
+#-----| -> [b (line 143): false] if (...) ...
+
+# 145| [b (line 143): true] String s = ...
+#-----| -> [b (line 143): true] if (...) ...
+
+# 145| [b (line 143): false] ... ? ... : ...
+#-----| -> [b (line 143): false] String s = ...
+
+# 145| [b (line 143): true] ... ? ... : ...
+#-----| -> [b (line 143): true] String s = ...
+
+# 145| access to parameter b
+#-----| true -> [b (line 143): true] "a"
+#-----| false -> [b (line 143): false] "b"
+
+# 145| [b (line 143): true] "a"
+#-----| -> [b (line 143): true] ... ? ... : ...
+
+# 145| [b (line 143): false] "b"
+#-----| -> [b (line 143): false] ... ? ... : ...
+
+# 146| [b (line 143): false] if (...) ...
+#-----| -> [b (line 143): false] access to parameter b
+
+# 146| [b (line 143): true] if (...) ...
+#-----| -> [b (line 143): true] access to parameter b
+
+# 146| [b (line 143): false] access to parameter b
+#-----| false -> ...;
+
+# 146| [b (line 143): true] access to parameter b
+#-----| true -> ...;
+
+# 147| ...;
+#-----| -> "a = "
+
+# 147| call to method WriteLine
+#-----| -> exit M11 (normal)
+
+# 147| $"..."
+#-----| -> call to method WriteLine
+
+# 147| "a = "
+#-----| -> access to local variable s
+
+# 147| access to local variable s
+#-----| -> $"..."
+
+# 149| ...;
+#-----| -> "b = "
+
+# 149| call to method WriteLine
+#-----| -> exit M11 (normal)
+
+# 149| $"..."
+#-----| -> call to method WriteLine
+
+# 149| "b = "
+#-----| -> access to local variable s
+
+# 149| access to local variable s
+#-----| -> $"..."
+
+ExitMethods.cs:
+# 8| enter M1
+#-----| -> {...}
+
+# 8| exit M1
+
+# 8| exit M1 (normal)
+#-----| -> exit M1
+
+# 9| {...}
+#-----| -> ...;
+
+# 10| ...;
+#-----| -> true
+
+# 10| call to method ErrorMaybe
+#-----| -> return ...;
+
+# 10| true
+#-----| -> call to method ErrorMaybe
+
+# 11| return ...;
+#-----| return -> exit M1 (normal)
+
+# 14| enter M2
+#-----| -> {...}
+
+# 14| exit M2
+
+# 14| exit M2 (normal)
+#-----| -> exit M2
+
+# 15| {...}
+#-----| -> ...;
+
+# 16| ...;
+#-----| -> false
+
+# 16| call to method ErrorMaybe
+#-----| -> return ...;
+
+# 16| false
+#-----| -> call to method ErrorMaybe
+
+# 17| return ...;
+#-----| return -> exit M2 (normal)
+
+# 20| enter M3
+#-----| -> {...}
+
+# 20| exit M3
+
+# 20| exit M3 (abnormal)
+#-----| -> exit M3
+
+# 21| {...}
+#-----| -> ...;
+
+# 22| ...;
+#-----| -> true
+
+# 22| call to method ErrorAlways
+#-----| exception(Exception) -> exit M3 (abnormal)
+
+# 22| true
+#-----| -> call to method ErrorAlways
+
+# 26| enter M4
+#-----| -> {...}
+
+# 26| exit M4
+
+# 26| exit M4 (abnormal)
+#-----| -> exit M4
+
+# 27| {...}
+#-----| -> ...;
+
+# 28| ...;
+#-----| -> this access
+
+# 28| call to method Exit
+#-----| exit -> exit M4 (abnormal)
+
+# 28| this access
+#-----| -> call to method Exit
+
+# 32| enter M5
+#-----| -> {...}
+
+# 32| exit M5
+
+# 32| exit M5 (abnormal)
+#-----| -> exit M5
+
+# 33| {...}
+#-----| -> ...;
+
+# 34| ...;
+#-----| -> this access
+
+# 34| call to method ApplicationExit
+#-----| exit -> exit M5 (abnormal)
+
+# 34| this access
+#-----| -> call to method ApplicationExit
+
+# 38| enter M6
+#-----| -> {...}
+
+# 38| exit M6
+
+# 38| exit M6 (normal)
+#-----| -> exit M6
+
+# 39| {...}
+#-----| -> try {...} ...
+
+# 40| try {...} ...
+#-----| -> {...}
+
+# 41| {...}
+#-----| -> ...;
+
+# 42| ...;
+#-----| -> false
+
+# 42| call to method ErrorAlways
+#-----| exception(ArgumentException) -> [exception: ArgumentException] catch (...) {...}
+#-----| exception(Exception) -> [exception: Exception] catch (...) {...}
+
+# 42| false
+#-----| -> call to method ErrorAlways
+
+# 44| [exception: ArgumentException] catch (...) {...}
+#-----| match -> {...}
+
+# 44| [exception: Exception] catch (...) {...}
+#-----| match -> {...}
+#-----| no-match -> [exception: Exception] catch (...) {...}
+
+# 45| {...}
+#-----| -> return ...;
+
+# 46| return ...;
+#-----| return -> exit M6 (normal)
+
+# 48| [exception: Exception] catch (...) {...}
+#-----| match -> {...}
+
+# 49| {...}
+#-----| -> return ...;
+
+# 50| return ...;
+#-----| return -> exit M6 (normal)
+
+# 54| enter M7
+#-----| -> {...}
+
+# 54| exit M7
+
+# 54| exit M7 (abnormal)
+#-----| -> exit M7
+
+# 55| {...}
+#-----| -> ...;
+
+# 56| ...;
+#-----| -> call to method ErrorAlways2
+
+# 56| call to method ErrorAlways2
+#-----| exception(Exception) -> exit M7 (abnormal)
+
+# 60| enter M8
+#-----| -> {...}
+
+# 60| exit M8
+
+# 60| exit M8 (abnormal)
+#-----| -> exit M8
+
+# 61| {...}
+#-----| -> ...;
+
+# 62| ...;
+#-----| -> call to method ErrorAlways3
+
+# 62| call to method ErrorAlways3
+#-----| exception(Exception) -> exit M8 (abnormal)
+
+# 66| enter ErrorMaybe
+#-----| -> {...}
+
+# 66| exit ErrorMaybe
+
+# 66| exit ErrorMaybe (abnormal)
+#-----| -> exit ErrorMaybe
+
+# 66| exit ErrorMaybe (normal)
+#-----| -> exit ErrorMaybe
+
+# 67| {...}
+#-----| -> if (...) ...
+
+# 68| if (...) ...
+#-----| -> access to parameter b
+
+# 68| access to parameter b
+#-----| true -> object creation of type Exception
+#-----| false -> exit ErrorMaybe (normal)
+
+# 69| throw ...;
+#-----| exception(Exception) -> exit ErrorMaybe (abnormal)
+
+# 69| object creation of type Exception
+#-----| -> throw ...;
+
+# 72| enter ErrorAlways
+#-----| -> {...}
+
+# 72| exit ErrorAlways
+
+# 72| exit ErrorAlways (abnormal)
+#-----| -> exit ErrorAlways
+
+# 73| {...}
+#-----| -> if (...) ...
+
+# 74| if (...) ...
+#-----| -> access to parameter b
+
+# 74| access to parameter b
+#-----| true -> object creation of type Exception
+#-----| false -> "b"
+
+# 75| throw ...;
+#-----| exception(Exception) -> exit ErrorAlways (abnormal)
+
+# 75| object creation of type Exception
+#-----| -> throw ...;
+
+# 77| throw ...;
+#-----| exception(ArgumentException) -> exit ErrorAlways (abnormal)
+
+# 77| object creation of type ArgumentException
+#-----| -> throw ...;
+
+# 77| "b"
+#-----| -> object creation of type ArgumentException
+
+# 80| enter ErrorAlways2
+#-----| -> {...}
+
+# 80| exit ErrorAlways2
+
+# 80| exit ErrorAlways2 (abnormal)
+#-----| -> exit ErrorAlways2
+
+# 81| {...}
+#-----| -> object creation of type Exception
+
+# 82| throw ...;
+#-----| exception(Exception) -> exit ErrorAlways2 (abnormal)
+
+# 82| object creation of type Exception
+#-----| -> throw ...;
+
+# 85| enter ErrorAlways3
+#-----| -> object creation of type Exception
+
+# 85| exit ErrorAlways3
+
+# 85| exit ErrorAlways3 (abnormal)
+#-----| -> exit ErrorAlways3
+
+# 85| throw ...
+#-----| exception(Exception) -> exit ErrorAlways3 (abnormal)
+
+# 85| object creation of type Exception
+#-----| -> throw ...
+
+# 87| enter Exit
+#-----| -> {...}
+
+# 87| exit Exit
+
+# 87| exit Exit (abnormal)
+#-----| -> exit Exit
+
+# 88| {...}
+#-----| -> ...;
+
+# 89| ...;
+#-----| -> 0
+
+# 89| call to method Exit
+#-----| exit -> exit Exit (abnormal)
+
+# 89| 0
+#-----| -> call to method Exit
+
+# 92| enter ExitInTry
+#-----| -> {...}
+
+# 92| exit ExitInTry
+
+# 92| exit ExitInTry (abnormal)
+#-----| -> exit ExitInTry
+
+# 93| {...}
+#-----| -> try {...} ...
+
+# 94| try {...} ...
+#-----| -> {...}
+
+# 95| {...}
+#-----| -> ...;
+
+# 96| ...;
+#-----| -> this access
+
+# 96| call to method Exit
+#-----| exit -> exit ExitInTry (abnormal)
+
+# 96| this access
+#-----| -> call to method Exit
+
+# 105| enter ApplicationExit
+#-----| -> {...}
+
+# 105| exit ApplicationExit
+
+# 105| exit ApplicationExit (abnormal)
+#-----| -> exit ApplicationExit
+
+# 106| {...}
+#-----| -> ...;
+
+# 107| ...;
+#-----| -> call to method Exit
+
+# 107| call to method Exit
+#-----| exit -> exit ApplicationExit (abnormal)
+
+# 110| enter ThrowExpr
+#-----| -> {...}
+
+# 110| exit ThrowExpr
+
+# 110| exit ThrowExpr (abnormal)
+#-----| -> exit ThrowExpr
+
+# 110| exit ThrowExpr (normal)
+#-----| -> exit ThrowExpr
+
+# 111| {...}
+#-----| -> access to parameter input
+
+# 112| return ...;
+#-----| return -> exit ThrowExpr (normal)
+
+# 112| ... ? ... : ...
+#-----| -> return ...;
+
+# 112| ... != ...
+#-----| false -> "input"
+#-----| true -> 1
+
+# 112| access to parameter input
+#-----| -> 0
+
+# 112| (...) ...
+#-----| -> ... != ...
+
+# 112| 0
+#-----| -> (...) ...
+
+# 112| ... / ...
+#-----| -> ... ? ... : ...
+
+# 112| (...) ...
+#-----| -> access to parameter input
+
+# 112| 1
+#-----| -> (...) ...
+
+# 112| access to parameter input
+#-----| -> ... / ...
+
+# 112| throw ...
+#-----| exception(ArgumentException) -> exit ThrowExpr (abnormal)
+
+# 112| object creation of type ArgumentException
+#-----| -> throw ...
+
+# 112| "input"
+#-----| -> object creation of type ArgumentException
+
+# 115| enter ExtensionMethodCall
+#-----| -> {...}
+
+# 115| exit ExtensionMethodCall
+
+# 115| exit ExtensionMethodCall (normal)
+#-----| -> exit ExtensionMethodCall
+
+# 116| {...}
+#-----| -> access to parameter s
+
+# 117| return ...;
+#-----| return -> exit ExtensionMethodCall (normal)
+
+# 117| ... ? ... : ...
+#-----| -> return ...;
+
+# 117| call to method Contains
+#-----| true -> 0
+#-----| false -> 1
+
+# 117| access to parameter s
+#-----| -> -
+
+# 117| -
+#-----| -> call to method Contains
+
+# 117| 0
+#-----| -> ... ? ... : ...
+
+# 117| 1
+#-----| -> ... ? ... : ...
+
+# 120| enter FailingAssertion
+#-----| -> {...}
+
+# 120| exit FailingAssertion
+
+# 120| exit FailingAssertion (abnormal)
+#-----| -> exit FailingAssertion
+
+# 121| {...}
+#-----| -> ...;
+
+# 122| ...;
+#-----| -> false
+
+# 122| [assertion failure] call to method IsTrue
+#-----| exception(AssertFailedException) -> exit FailingAssertion (abnormal)
+
+# 122| false
+#-----| false -> [assertion failure] call to method IsTrue
+
+# 126| enter FailingAssertion2
+#-----| -> {...}
+
+# 126| exit FailingAssertion2
+
+# 126| exit FailingAssertion2 (abnormal)
+#-----| -> exit FailingAssertion2
+
+# 127| {...}
+#-----| -> ...;
+
+# 128| ...;
+#-----| -> this access
+
+# 128| call to method FailingAssertion
+#-----| exception(AssertFailedException) -> exit FailingAssertion2 (abnormal)
+
+# 128| this access
+#-----| -> call to method FailingAssertion
+
+# 132| enter AssertFalse
+#-----| -> access to parameter b
+
+# 132| exit AssertFalse
+
+# 132| exit AssertFalse (abnormal)
+#-----| -> exit AssertFalse
+
+# 132| exit AssertFalse (normal)
+#-----| -> exit AssertFalse
+
+# 132| [assertion failure] call to method IsFalse
+#-----| exception(AssertFailedException) -> exit AssertFalse (abnormal)
+
+# 132| [assertion success] call to method IsFalse
+#-----| -> exit AssertFalse (normal)
+
+# 132| access to parameter b
+#-----| true -> [assertion failure] call to method IsFalse
+#-----| false -> [assertion success] call to method IsFalse
+
+# 134| enter FailingAssertion3
+#-----| -> {...}
+
+# 134| exit FailingAssertion3
+
+# 134| exit FailingAssertion3 (abnormal)
+#-----| -> exit FailingAssertion3
+
+# 135| {...}
+#-----| -> ...;
+
+# 136| ...;
+#-----| -> this access
+
+# 136| [assertion failure] call to method AssertFalse
+#-----| exception(AssertFailedException) -> exit FailingAssertion3 (abnormal)
+
+# 136| this access
+#-----| -> true
+
+# 136| true
+#-----| true -> [assertion failure] call to method AssertFalse
+
+# 140| enter ExceptionDispatchInfoThrow
+#-----| -> {...}
+
+# 140| exit ExceptionDispatchInfoThrow
+
+# 140| exit ExceptionDispatchInfoThrow (abnormal)
+#-----| -> exit ExceptionDispatchInfoThrow
+
+# 141| {...}
+#-----| -> if (...) ...
+
+# 142| if (...) ...
+#-----| -> access to parameter b
+
+# 142| access to parameter b
+#-----| true -> ...;
+#-----| false -> ...;
+
+# 143| ...;
+#-----| -> access to parameter e
+
+# 143| call to method Throw
+#-----| exception(ArgumentException) -> exit ExceptionDispatchInfoThrow (abnormal)
+
+# 143| access to parameter e
+#-----| -> call to method Throw
+
+# 145| ...;
+#-----| -> access to parameter e
+
+# 145| call to method Throw
+#-----| exception(Exception) -> exit ExceptionDispatchInfoThrow (abnormal)
+
+# 145| call to method Capture
+#-----| -> call to method Throw
+
+# 145| access to parameter e
+#-----| -> call to method Capture
+
+Extensions.cs:
+# 5| enter ToInt32
+#-----| -> {...}
+
+# 5| exit ToInt32
+
+# 5| exit ToInt32 (normal)
+#-----| -> exit ToInt32
+
+# 6| {...}
+#-----| -> access to parameter s
+
+# 7| return ...;
+#-----| return -> exit ToInt32 (normal)
+
+# 7| call to method Parse
+#-----| -> return ...;
+
+# 7| access to parameter s
+#-----| -> call to method Parse
+
+# 10| enter ToBool
+#-----| -> {...}
+
+# 10| exit ToBool
+
+# 10| exit ToBool (normal)
+#-----| -> exit ToBool
+
+# 11| {...}
+#-----| -> access to parameter f
+
+# 12| return ...;
+#-----| return -> exit ToBool (normal)
+
+# 12| delegate call
+#-----| -> return ...;
+
+# 12| access to parameter f
+#-----| -> access to parameter s
+
+# 12| access to parameter s
+#-----| -> delegate call
+
+# 15| enter CallToInt32
+#-----| -> "0"
+
+# 15| exit CallToInt32
+
+# 15| exit CallToInt32 (normal)
+#-----| -> exit CallToInt32
+
+# 15| call to method ToInt32
+#-----| -> exit CallToInt32 (normal)
+
+# 15| "0"
+#-----| -> call to method ToInt32
+
+# 20| enter Main
+#-----| -> {...}
+
+# 20| exit Main
+
+# 20| exit Main (normal)
+#-----| -> exit Main
+
+# 21| {...}
+#-----| -> ...;
+
+# 22| ...;
+#-----| -> access to parameter s
+
+# 22| call to method ToInt32
+#-----| -> ...;
+
+# 22| access to parameter s
+#-----| -> call to method ToInt32
+
+# 23| ...;
+#-----| -> ""
+
+# 23| call to method ToInt32
+#-----| -> ...;
+
+# 23| ""
+#-----| -> call to method ToInt32
+
+# 24| ...;
+#-----| -> "true"
+
+# 24| call to method ToBool
+#-----| -> ...;
+
+# 24| "true"
+#-----| -> access to method Parse
+
+# 24| delegate creation of type Func
+#-----| -> call to method ToBool
+
+# 24| access to method Parse
+#-----| -> delegate creation of type Func
+
+# 25| ...;
+#-----| -> "true"
+
+# 25| call to method ToBool
+#-----| -> exit Main (normal)
+
+# 25| "true"
+#-----| -> access to method Parse
+
+# 25| delegate creation of type Func
+#-----| -> call to method ToBool
+
+# 25| access to method Parse
+#-----| -> delegate creation of type Func
+
+Finally.cs:
+# 7| enter M1
+#-----| -> {...}
+
+# 7| exit M1
+
+# 7| exit M1 (abnormal)
+#-----| -> exit M1
+
+# 7| exit M1 (normal)
+#-----| -> exit M1
+
+# 8| {...}
+#-----| -> try {...} ...
+
+# 9| try {...} ...
+#-----| -> {...}
+
+# 10| {...}
+#-----| -> ...;
+
+# 11| ...;
+#-----| -> "Try1"
+
+# 11| call to method WriteLine
+#-----| -> {...}
+#-----| exception(Exception) -> [finally: exception(Exception)] {...}
+
+# 11| "Try1"
+#-----| -> call to method WriteLine
+
+# 14| {...}
+#-----| -> ...;
+
+# 14| [finally: exception(Exception)] {...}
+#-----| -> [finally: exception(Exception)] ...;
+
+# 15| ...;
+#-----| -> "Finally"
+
+# 15| [finally: exception(Exception)] ...;
+#-----| -> [finally: exception(Exception)] "Finally"
+
+# 15| call to method WriteLine
+#-----| -> exit M1 (normal)
+
+# 15| [finally: exception(Exception)] call to method WriteLine
+#-----| exception(Exception) -> exit M1 (abnormal)
+
+# 15| "Finally"
+#-----| -> call to method WriteLine
+
+# 15| [finally: exception(Exception)] "Finally"
+#-----| -> [finally: exception(Exception)] call to method WriteLine
+
+# 19| enter M2
+#-----| -> {...}
+
+# 19| exit M2
+
+# 19| exit M2 (abnormal)
+#-----| -> exit M2
+
+# 19| exit M2 (normal)
+#-----| -> exit M2
+
+# 20| {...}
+#-----| -> try {...} ...
+
+# 21| try {...} ...
+#-----| -> {...}
+
+# 22| {...}
+#-----| -> ...;
+
+# 23| ...;
+#-----| -> "Try2"
+
+# 23| call to method WriteLine
+#-----| exception(Exception) -> [exception: Exception] catch (...) {...}
+#-----| -> return ...;
+
+# 23| "Try2"
+#-----| -> call to method WriteLine
+
+# 24| return ...;
+#-----| return -> [finally: return] {...}
+
+# 26| [exception: Exception] catch (...) {...}
+#-----| match -> [exception: Exception] IOException ex
+#-----| no-match -> [exception: Exception] catch (...) {...}
+
+# 26| [exception: Exception] IOException ex
+#-----| -> [exception: Exception] true
+
+# 26| [exception: Exception] true
+#-----| true -> {...}
+
+# 27| {...}
+#-----| -> throw ...;
+
+# 28| throw ...;
+#-----| exception(IOException) -> [finally: exception(IOException)] {...}
+
+# 30| [exception: Exception] catch (...) {...}
+#-----| match -> [exception: Exception] ArgumentException ex
+#-----| no-match -> [exception: Exception] catch (...) {...}
+
+# 30| [exception: Exception] ArgumentException ex
+#-----| -> {...}
+
+# 31| {...}
+#-----| -> try {...} ...
+
+# 32| try {...} ...
+#-----| -> {...}
+
+# 33| {...}
+#-----| -> if (...) ...
+
+# 34| if (...) ...
+#-----| -> true
+
+# 34| true
+#-----| true -> throw ...;
+
+# 34| throw ...;
+#-----| exception(ArgumentException) -> [finally: exception(ArgumentException)] {...}
+
+# 37| [finally: exception(ArgumentException)] {...}
+#-----| -> [finally: exception(ArgumentException)] "Boo!"
+
+# 38| [finally: exception(ArgumentException)] throw ...;
+#-----| exception(Exception) -> [finally: exception(Exception)] {...}
+
+# 38| [finally: exception(ArgumentException)] object creation of type Exception
+#-----| -> [finally: exception(ArgumentException)] throw ...;
+
+# 38| [finally: exception(ArgumentException)] "Boo!"
+#-----| -> [finally: exception(ArgumentException)] object creation of type Exception
+
+# 41| [exception: Exception] catch (...) {...}
+#-----| match -> {...}
+
+# 42| {...}
+#-----| -> {...}
+
+# 49| {...}
+#-----| -> ...;
+
+# 49| [finally: return] {...}
+#-----| -> [finally: return] ...;
+
+# 49| [finally: exception(Exception)] {...}
+#-----| -> [finally: exception(Exception)] ...;
+
+# 49| [finally: exception(IOException)] {...}
+#-----| -> [finally: exception(IOException)] ...;
+
+# 50| ...;
+#-----| -> "Finally"
+
+# 50| [finally: return] ...;
+#-----| -> [finally: return] "Finally"
+
+# 50| [finally: exception(Exception)] ...;
+#-----| -> [finally: exception(Exception)] "Finally"
+
+# 50| [finally: exception(IOException)] ...;
+#-----| -> [finally: exception(IOException)] "Finally"
+
+# 50| call to method WriteLine
+#-----| -> exit M2 (normal)
+
+# 50| [finally: return] call to method WriteLine
+#-----| return -> exit M2 (normal)
+
+# 50| [finally: exception(Exception)] call to method WriteLine
+#-----| exception(Exception) -> exit M2 (abnormal)
+
+# 50| [finally: exception(IOException)] call to method WriteLine
+#-----| exception(IOException) -> exit M2 (abnormal)
+
+# 50| "Finally"
+#-----| -> call to method WriteLine
+
+# 50| [finally: return] "Finally"
+#-----| -> [finally: return] call to method WriteLine
+
+# 50| [finally: exception(Exception)] "Finally"
+#-----| -> [finally: exception(Exception)] call to method WriteLine
+
+# 50| [finally: exception(IOException)] "Finally"
+#-----| -> [finally: exception(IOException)] call to method WriteLine
+
+# 54| enter M3
+#-----| -> {...}
+
+# 54| exit M3
+
+# 54| exit M3 (abnormal)
+#-----| -> exit M3
+
+# 54| exit M3 (normal)
+#-----| -> exit M3
+
+# 55| {...}
+#-----| -> try {...} ...
+
+# 56| try {...} ...
+#-----| -> {...}
+
+# 57| {...}
+#-----| -> ...;
+
+# 58| ...;
+#-----| -> "Try3"
+
+# 58| call to method WriteLine
+#-----| exception(Exception) -> [exception: Exception] catch (...) {...}
+#-----| -> return ...;
+
+# 58| "Try3"
+#-----| -> call to method WriteLine
+
+# 59| return ...;
+#-----| return -> [finally: return] {...}
+
+# 61| [exception: Exception] catch (...) {...}
+#-----| match -> [exception: Exception] IOException ex
+#-----| no-match -> [exception: Exception] catch (...) {...}
+
+# 61| [exception: Exception] IOException ex
+#-----| -> [exception: Exception] true
+
+# 61| [exception: Exception] true
+#-----| true -> {...}
+
+# 62| {...}
+#-----| -> throw ...;
+
+# 63| throw ...;
+#-----| exception(IOException) -> [finally: exception(IOException)] {...}
+
+# 65| [exception: Exception] catch (...) {...}
+#-----| match -> [exception: Exception] Exception e
+
+# 65| [exception: Exception] Exception e
+#-----| -> [exception: Exception] access to local variable e
+
+# 65| [exception: Exception] ... != ...
+#-----| true -> {...}
+#-----| exception(Exception) -> [finally: exception(Exception)] {...}
+
+# 65| [exception: Exception] access to property Message
+#-----| -> [exception: Exception] null
+
+# 65| [exception: Exception] access to local variable e
+#-----| -> [exception: Exception] access to property Message
+
+# 65| [exception: Exception] null
+#-----| -> [exception: Exception] ... != ...
+
+# 66| {...}
+#-----| -> {...}
+
+# 69| {...}
+#-----| -> ...;
+
+# 69| [finally: return] {...}
+#-----| -> [finally: return] ...;
+
+# 69| [finally: exception(Exception)] {...}
+#-----| -> [finally: exception(Exception)] ...;
+
+# 69| [finally: exception(IOException)] {...}
+#-----| -> [finally: exception(IOException)] ...;
+
+# 70| ...;
+#-----| -> "Finally"
+
+# 70| [finally: return] ...;
+#-----| -> [finally: return] "Finally"
+
+# 70| [finally: exception(Exception)] ...;
+#-----| -> [finally: exception(Exception)] "Finally"
+
+# 70| [finally: exception(IOException)] ...;
+#-----| -> [finally: exception(IOException)] "Finally"
+
+# 70| call to method WriteLine
+#-----| -> exit M3 (normal)
+
+# 70| [finally: return] call to method WriteLine
+#-----| return -> exit M3 (normal)
+
+# 70| [finally: exception(Exception)] call to method WriteLine
+#-----| exception(Exception) -> exit M3 (abnormal)
+
+# 70| [finally: exception(IOException)] call to method WriteLine
+#-----| exception(IOException) -> exit M3 (abnormal)
+
+# 70| "Finally"
+#-----| -> call to method WriteLine
+
+# 70| [finally: return] "Finally"
+#-----| -> [finally: return] call to method WriteLine
+
+# 70| [finally: exception(Exception)] "Finally"
+#-----| -> [finally: exception(Exception)] call to method WriteLine
+
+# 70| [finally: exception(IOException)] "Finally"
+#-----| -> [finally: exception(IOException)] call to method WriteLine
+
+# 74| enter M4
+#-----| -> {...}
+
+# 74| exit M4
+
+# 74| exit M4 (abnormal)
+#-----| -> exit M4
+
+# 74| exit M4 (normal)
+#-----| -> exit M4
+
+# 75| {...}
+#-----| -> ... ...;
+
+# 76| ... ...;
+#-----| -> 10
+
+# 76| Int32 i = ...
+#-----| -> while (...) ...
+
+# 76| 10
+#-----| -> Int32 i = ...
+
+# 77| while (...) ...
+#-----| -> access to local variable i
+
+# 77| ... > ...
+#-----| true -> {...}
+#-----| false -> exit M4 (normal)
+
+# 77| access to local variable i
+#-----| -> 0
+
+# 77| 0
+#-----| -> ... > ...
+
+# 78| {...}
+#-----| -> try {...} ...
+
+# 79| try {...} ...
+#-----| -> {...}
+
+# 80| {...}
+#-----| -> if (...) ...
+
+# 81| if (...) ...
+#-----| -> access to local variable i
+
+# 81| ... == ...
+#-----| true -> return ...;
+#-----| false -> if (...) ...
+
+# 81| access to local variable i
+#-----| -> 0
+
+# 81| 0
+#-----| -> ... == ...
+
+# 82| return ...;
+#-----| return -> [finally: return] {...}
+
+# 83| if (...) ...
+#-----| -> access to local variable i
+
+# 83| ... == ...
+#-----| true -> continue;
+#-----| false -> if (...) ...
+
+# 83| access to local variable i
+#-----| -> 1
+
+# 83| 1
+#-----| -> ... == ...
+
+# 84| continue;
+#-----| continue -> [finally: continue] {...}
+
+# 85| if (...) ...
+#-----| -> access to local variable i
+
+# 85| ... == ...
+#-----| true -> break;
+#-----| false -> {...}
+
+# 85| access to local variable i
+#-----| -> 2
+
+# 85| 2
+#-----| -> ... == ...
+
+# 86| break;
+#-----| break -> [finally: break] {...}
+
+# 89| {...}
+#-----| -> try {...} ...
+
+# 89| [finally: return] {...}
+#-----| -> [finally: return] try {...} ...
+
+# 89| [finally: break] {...}
+#-----| -> [finally: break] try {...} ...
+
+# 89| [finally: continue] {...}
+#-----| -> [finally: continue] try {...} ...
+
+# 90| try {...} ...
+#-----| -> {...}
+
+# 90| [finally: return] try {...} ...
+#-----| -> [finally: return] {...}
+
+# 90| [finally: break] try {...} ...
+#-----| -> [finally: break] {...}
+
+# 90| [finally: continue] try {...} ...
+#-----| -> [finally: continue] {...}
+
+# 91| {...}
+#-----| -> if (...) ...
+
+# 91| [finally: return] {...}
+#-----| -> [finally: return] if (...) ...
+
+# 91| [finally: break] {...}
+#-----| -> [finally: break] if (...) ...
+
+# 91| [finally: continue] {...}
+#-----| -> [finally: continue] if (...) ...
+
+# 92| if (...) ...
+#-----| -> access to local variable i
+
+# 92| [finally: return] if (...) ...
+#-----| -> [finally: return] access to local variable i
+
+# 92| [finally: break] if (...) ...
+#-----| -> [finally: break] access to local variable i
+
+# 92| [finally: continue] if (...) ...
+#-----| -> [finally: continue] access to local variable i
+
+# 92| ... == ...
+#-----| true -> object creation of type Exception
+#-----| false -> {...}
+
+# 92| [finally: return] ... == ...
+#-----| true -> [finally: return] object creation of type Exception
+#-----| false -> [finally: return] {...}
+
+# 92| [finally: break] ... == ...
+#-----| true -> [finally: break] object creation of type Exception
+#-----| false -> [finally: break] {...}
+
+# 92| [finally: continue] ... == ...
+#-----| true -> [finally: continue] object creation of type Exception
+#-----| false -> [finally: continue] {...}
+
+# 92| access to local variable i
+#-----| -> 3
+
+# 92| [finally: return] access to local variable i
+#-----| -> [finally: return] 3
+
+# 92| [finally: break] access to local variable i
+#-----| -> [finally: break] 3
+
+# 92| [finally: continue] access to local variable i
+#-----| -> [finally: continue] 3
+
+# 92| 3
+#-----| -> ... == ...
+
+# 92| [finally: return] 3
+#-----| -> [finally: return] ... == ...
+
+# 92| [finally: break] 3
+#-----| -> [finally: break] ... == ...
+
+# 92| [finally: continue] 3
+#-----| -> [finally: continue] ... == ...
+
+# 93| throw ...;
+#-----| exception(Exception) -> [finally(1): exception(Exception)] {...}
+
+# 93| [finally: return] throw ...;
+#-----| exception(Exception) -> [finally: return, finally(1): exception(Exception)] {...}
+
+# 93| [finally: break] throw ...;
+#-----| exception(Exception) -> [finally: break, finally(1): exception(Exception)] {...}
+
+# 93| [finally: continue] throw ...;
+#-----| exception(Exception) -> [finally: continue, finally(1): exception(Exception)] {...}
+
+# 93| object creation of type Exception
+#-----| -> throw ...;
+#-----| exception(Exception) -> [finally(1): exception(Exception)] {...}
+
+# 93| [finally: return] object creation of type Exception
+#-----| -> [finally: return] throw ...;
+#-----| exception(Exception) -> [finally: return, finally(1): exception(Exception)] {...}
+
+# 93| [finally: break] object creation of type Exception
+#-----| -> [finally: break] throw ...;
+#-----| exception(Exception) -> [finally: break, finally(1): exception(Exception)] {...}
+
+# 93| [finally: continue] object creation of type Exception
+#-----| -> [finally: continue] throw ...;
+#-----| exception(Exception) -> [finally: continue, finally(1): exception(Exception)] {...}
+
+# 96| {...}
+#-----| -> ...;
+
+# 96| [finally(1): exception(Exception)] {...}
+#-----| -> [finally(1): exception(Exception)] ...;
+
+# 96| [finally: return] {...}
+#-----| -> [finally: return] ...;
+
+# 96| [finally: return, finally(1): exception(Exception)] {...}
+#-----| -> [finally: return, finally(1): exception(Exception)] ...;
+
+# 96| [finally: break] {...}
+#-----| -> [finally: break] ...;
+
+# 96| [finally: break, finally(1): exception(Exception)] {...}
+#-----| -> [finally: break, finally(1): exception(Exception)] ...;
+
+# 96| [finally: continue] {...}
+#-----| -> [finally: continue] ...;
+
+# 96| [finally: continue, finally(1): exception(Exception)] {...}
+#-----| -> [finally: continue, finally(1): exception(Exception)] ...;
+
+# 97| ...;
+#-----| -> access to local variable i
+
+# 97| [finally(1): exception(Exception)] ...;
+#-----| -> [finally(1): exception(Exception)] access to local variable i
+
+# 97| [finally: return] ...;
+#-----| -> [finally: return] access to local variable i
+
+# 97| [finally: return, finally(1): exception(Exception)] ...;
+#-----| -> [finally: return, finally(1): exception(Exception)] access to local variable i
+
+# 97| [finally: break] ...;
+#-----| -> [finally: break] access to local variable i
+
+# 97| [finally: break, finally(1): exception(Exception)] ...;
+#-----| -> [finally: break, finally(1): exception(Exception)] access to local variable i
+
+# 97| [finally: continue] ...;
+#-----| -> [finally: continue] access to local variable i
+
+# 97| [finally: continue, finally(1): exception(Exception)] ...;
+#-----| -> [finally: continue, finally(1): exception(Exception)] access to local variable i
+
+# 97| ...--
+#-----| -> access to local variable i
+
+# 97| [finally(1): exception(Exception)] ...--
+#-----| exception(Exception) -> exit M4 (abnormal)
+
+# 97| [finally: return] ...--
+#-----| return -> exit M4 (normal)
+
+# 97| [finally: return, finally(1): exception(Exception)] ...--
+#-----| exception(Exception) -> exit M4 (abnormal)
+
+# 97| [finally: break] ...--
+#-----| break -> exit M4 (normal)
+
+# 97| [finally: break, finally(1): exception(Exception)] ...--
+#-----| exception(Exception) -> exit M4 (abnormal)
+
+# 97| [finally: continue] ...--
+#-----| continue -> access to local variable i
+
+# 97| [finally: continue, finally(1): exception(Exception)] ...--
+#-----| exception(Exception) -> exit M4 (abnormal)
+
+# 97| access to local variable i
+#-----| -> ...--
+
+# 97| [finally(1): exception(Exception)] access to local variable i
+#-----| -> [finally(1): exception(Exception)] ...--
+
+# 97| [finally: return] access to local variable i
+#-----| -> [finally: return] ...--
+
+# 97| [finally: return, finally(1): exception(Exception)] access to local variable i
+#-----| -> [finally: return, finally(1): exception(Exception)] ...--
+
+# 97| [finally: break] access to local variable i
+#-----| -> [finally: break] ...--
+
+# 97| [finally: break, finally(1): exception(Exception)] access to local variable i
+#-----| -> [finally: break, finally(1): exception(Exception)] ...--
+
+# 97| [finally: continue] access to local variable i
+#-----| -> [finally: continue] ...--
+
+# 97| [finally: continue, finally(1): exception(Exception)] access to local variable i
+#-----| -> [finally: continue, finally(1): exception(Exception)] ...--
+
+# 103| enter M5
+#-----| -> {...}
+
+# 103| exit M5
+
+# 103| exit M5 (abnormal)
+#-----| -> exit M5
+
+# 103| exit M5 (normal)
+#-----| -> exit M5
+
+# 104| {...}
+#-----| -> try {...} ...
+
+# 105| try {...} ...
+#-----| -> {...}
+
+# 106| {...}
+#-----| -> if (...) ...
+
+# 107| if (...) ...
+#-----| -> this access
+
+# 107| ... == ...
+#-----| true -> return ...;
+#-----| false -> if (...) ...
+
+# 107| access to property Length
+#-----| exception(Exception) -> [finally: exception(Exception)] {...}
+#-----| exception(NullReferenceException) -> [finally: exception(NullReferenceException)] {...}
+#-----| -> 0
+
+# 107| access to field Field
+#-----| exception(NullReferenceException) -> [finally: exception(NullReferenceException)] {...}
+#-----| -> access to property Length
+
+# 107| this access
+#-----| -> access to field Field
+
+# 107| 0
+#-----| -> ... == ...
+
+# 108| return ...;
+#-----| return -> [finally: return] {...}
+
+# 109| if (...) ...
+#-----| -> this access
+
+# 109| ... == ...
+#-----| true -> object creation of type OutOfMemoryException
+#-----| false -> {...}
+
+# 109| access to property Length
+#-----| exception(Exception) -> [finally: exception(Exception)] {...}
+#-----| exception(NullReferenceException) -> [finally: exception(NullReferenceException)] {...}
+#-----| -> 1
+
+# 109| access to field Field
+#-----| exception(NullReferenceException) -> [finally: exception(NullReferenceException)] {...}
+#-----| -> access to property Length
+
+# 109| this access
+#-----| -> access to field Field
+
+# 109| 1
+#-----| -> ... == ...
+
+# 110| throw ...;
+#-----| exception(OutOfMemoryException) -> [finally: exception(OutOfMemoryException)] {...}
+
+# 110| object creation of type OutOfMemoryException
+#-----| -> throw ...;
+#-----| exception(Exception) -> [finally: exception(Exception)] {...}
+
+# 113| {...}
+#-----| -> if (...) ...
+
+# 113| [finally: return] {...}
+#-----| -> [finally: return] if (...) ...
+
+# 113| [finally: exception(Exception)] {...}
+#-----| -> [finally: exception(Exception)] if (...) ...
+
+# 113| [finally: exception(OutOfMemoryException)] {...}
+#-----| -> [finally: exception(OutOfMemoryException)] if (...) ...
+
+# 113| [finally: exception(NullReferenceException)] {...}
+#-----| -> [finally: exception(NullReferenceException)] if (...) ...
+
+# 114| if (...) ...
+#-----| -> this access
+
+# 114| [finally: return] if (...) ...
+#-----| -> [finally: return] this access
+
+# 114| [finally: exception(Exception)] if (...) ...
+#-----| -> [finally: exception(Exception)] this access
+
+# 114| [finally: exception(OutOfMemoryException)] if (...) ...
+#-----| -> [finally: exception(OutOfMemoryException)] this access
+
+# 114| [finally: exception(NullReferenceException)] if (...) ...
+#-----| -> [finally: exception(NullReferenceException)] this access
+
+# 114| [false] !...
+#-----| false -> if (...) ...
+
+# 114| [false, finally: return] !...
+#-----| false -> [finally: return] if (...) ...
+
+# 114| [false, finally: exception(Exception)] !...
+#-----| false -> [finally: exception(Exception)] if (...) ...
+
+# 114| [false, finally: exception(OutOfMemoryException)] !...
+#-----| false -> [finally: exception(OutOfMemoryException)] if (...) ...
+
+# 114| [false, finally: exception(NullReferenceException)] !...
+#-----| false -> [finally: exception(NullReferenceException)] if (...) ...
+
+# 114| [true] !...
+#-----| true -> ...;
+
+# 114| [true, finally: return] !...
+#-----| true -> [finally: return] ...;
+
+# 114| [true, finally: exception(Exception)] !...
+#-----| true -> [finally: exception(Exception)] ...;
+
+# 114| [true, finally: exception(OutOfMemoryException)] !...
+#-----| true -> [finally: exception(OutOfMemoryException)] ...;
+
+# 114| [true, finally: exception(NullReferenceException)] !...
+#-----| true -> [finally: exception(NullReferenceException)] ...;
+
+# 114| ... == ...
+#-----| true -> [false] !...
+#-----| false -> [true] !...
+
+# 114| [finally: return] ... == ...
+#-----| true -> [false, finally: return] !...
+#-----| false -> [true, finally: return] !...
+
+# 114| [finally: exception(Exception)] ... == ...
+#-----| true -> [false, finally: exception(Exception)] !...
+#-----| false -> [true, finally: exception(Exception)] !...
+
+# 114| [finally: exception(OutOfMemoryException)] ... == ...
+#-----| true -> [false, finally: exception(OutOfMemoryException)] !...
+#-----| false -> [true, finally: exception(OutOfMemoryException)] !...
+
+# 114| [finally: exception(NullReferenceException)] ... == ...
+#-----| true -> [false, finally: exception(NullReferenceException)] !...
+#-----| false -> [true, finally: exception(NullReferenceException)] !...
+
+# 114| access to property Length
+#-----| -> 0
+
+# 114| [finally: return] access to property Length
+#-----| -> [finally: return] 0
+
+# 114| [finally: exception(Exception)] access to property Length
+#-----| -> [finally: exception(Exception)] 0
+
+# 114| [finally: exception(OutOfMemoryException)] access to property Length
+#-----| -> [finally: exception(OutOfMemoryException)] 0
+
+# 114| [finally: exception(NullReferenceException)] access to property Length
+#-----| -> [finally: exception(NullReferenceException)] 0
+
+# 114| access to field Field
+#-----| -> access to property Length
+
+# 114| [finally: return] access to field Field
+#-----| -> [finally: return] access to property Length
+
+# 114| [finally: exception(Exception)] access to field Field
+#-----| -> [finally: exception(Exception)] access to property Length
+
+# 114| [finally: exception(OutOfMemoryException)] access to field Field
+#-----| -> [finally: exception(OutOfMemoryException)] access to property Length
+
+# 114| [finally: exception(NullReferenceException)] access to field Field
+#-----| -> [finally: exception(NullReferenceException)] access to property Length
+
+# 114| this access
+#-----| -> access to field Field
+
+# 114| [finally: return] this access
+#-----| -> [finally: return] access to field Field
+
+# 114| [finally: exception(Exception)] this access
+#-----| -> [finally: exception(Exception)] access to field Field
+
+# 114| [finally: exception(OutOfMemoryException)] this access
+#-----| -> [finally: exception(OutOfMemoryException)] access to field Field
+
+# 114| [finally: exception(NullReferenceException)] this access
+#-----| -> [finally: exception(NullReferenceException)] access to field Field
+
+# 114| 0
+#-----| -> ... == ...
+
+# 114| [finally: return] 0
+#-----| -> [finally: return] ... == ...
+
+# 114| [finally: exception(Exception)] 0
+#-----| -> [finally: exception(Exception)] ... == ...
+
+# 114| [finally: exception(OutOfMemoryException)] 0
+#-----| -> [finally: exception(OutOfMemoryException)] ... == ...
+
+# 114| [finally: exception(NullReferenceException)] 0
+#-----| -> [finally: exception(NullReferenceException)] ... == ...
+
+# 115| ...;
+#-----| -> this access
+
+# 115| [finally: return] ...;
+#-----| -> [finally: return] this access
+
+# 115| [finally: exception(Exception)] ...;
+#-----| -> [finally: exception(Exception)] this access
+
+# 115| [finally: exception(OutOfMemoryException)] ...;
+#-----| -> [finally: exception(OutOfMemoryException)] this access
+
+# 115| [finally: exception(NullReferenceException)] ...;
+#-----| -> [finally: exception(NullReferenceException)] this access
+
+# 115| call to method WriteLine
+#-----| -> if (...) ...
+
+# 115| [finally: return] call to method WriteLine
+#-----| -> [finally: return] if (...) ...
+
+# 115| [finally: exception(Exception)] call to method WriteLine
+#-----| -> [finally: exception(Exception)] if (...) ...
+
+# 115| [finally: exception(OutOfMemoryException)] call to method WriteLine
+#-----| -> [finally: exception(OutOfMemoryException)] if (...) ...
+
+# 115| [finally: exception(NullReferenceException)] call to method WriteLine
+#-----| -> [finally: exception(NullReferenceException)] if (...) ...
+
+# 115| access to field Field
+#-----| -> call to method WriteLine
+
+# 115| [finally: return] access to field Field
+#-----| -> [finally: return] call to method WriteLine
+
+# 115| [finally: exception(Exception)] access to field Field
+#-----| -> [finally: exception(Exception)] call to method WriteLine
+
+# 115| [finally: exception(OutOfMemoryException)] access to field Field
+#-----| -> [finally: exception(OutOfMemoryException)] call to method WriteLine
+
+# 115| [finally: exception(NullReferenceException)] access to field Field
+#-----| -> [finally: exception(NullReferenceException)] call to method WriteLine
+
+# 115| this access
+#-----| -> access to field Field
+
+# 115| [finally: return] this access
+#-----| -> [finally: return] access to field Field
+
+# 115| [finally: exception(Exception)] this access
+#-----| -> [finally: exception(Exception)] access to field Field
+
+# 115| [finally: exception(OutOfMemoryException)] this access
+#-----| -> [finally: exception(OutOfMemoryException)] access to field Field
+
+# 115| [finally: exception(NullReferenceException)] this access
+#-----| -> [finally: exception(NullReferenceException)] access to field Field
+
+# 116| if (...) ...
+#-----| -> this access
+
+# 116| [finally: return] if (...) ...
+#-----| -> [finally: return] this access
+
+# 116| [finally: exception(Exception)] if (...) ...
+#-----| -> [finally: exception(Exception)] this access
+
+# 116| [finally: exception(OutOfMemoryException)] if (...) ...
+#-----| -> [finally: exception(OutOfMemoryException)] this access
+
+# 116| [finally: exception(NullReferenceException)] if (...) ...
+#-----| -> [finally: exception(NullReferenceException)] this access
+
+# 116| ... > ...
+#-----| true -> ...;
+#-----| false -> exit M5 (normal)
+
+# 116| [finally: return] ... > ...
+#-----| true -> [finally: return] ...;
+#-----| return -> exit M5 (normal)
+
+# 116| [finally: exception(Exception)] ... > ...
+#-----| true -> [finally: exception(Exception)] ...;
+#-----| exception(Exception) -> exit M5 (abnormal)
+
+# 116| [finally: exception(OutOfMemoryException)] ... > ...
+#-----| true -> [finally: exception(OutOfMemoryException)] ...;
+#-----| exception(OutOfMemoryException) -> exit M5 (abnormal)
+
+# 116| [finally: exception(NullReferenceException)] ... > ...
+#-----| true -> [finally: exception(NullReferenceException)] ...;
+#-----| exception(NullReferenceException) -> exit M5 (abnormal)
+
+# 116| access to property Length
+#-----| -> 0
+
+# 116| [finally: return] access to property Length
+#-----| -> [finally: return] 0
+
+# 116| [finally: exception(Exception)] access to property Length
+#-----| -> [finally: exception(Exception)] 0
+
+# 116| [finally: exception(OutOfMemoryException)] access to property Length
+#-----| -> [finally: exception(OutOfMemoryException)] 0
+
+# 116| [finally: exception(NullReferenceException)] access to property Length
+#-----| -> [finally: exception(NullReferenceException)] 0
+
+# 116| access to field Field
+#-----| -> access to property Length
+
+# 116| [finally: return] access to field Field
+#-----| -> [finally: return] access to property Length
+
+# 116| [finally: exception(Exception)] access to field Field
+#-----| -> [finally: exception(Exception)] access to property Length
+
+# 116| [finally: exception(OutOfMemoryException)] access to field Field
+#-----| -> [finally: exception(OutOfMemoryException)] access to property Length
+
+# 116| [finally: exception(NullReferenceException)] access to field Field
+#-----| -> [finally: exception(NullReferenceException)] access to property Length
+
+# 116| this access
+#-----| -> access to field Field
+
+# 116| [finally: return] this access
+#-----| -> [finally: return] access to field Field
+
+# 116| [finally: exception(Exception)] this access
+#-----| -> [finally: exception(Exception)] access to field Field
+
+# 116| [finally: exception(OutOfMemoryException)] this access
+#-----| -> [finally: exception(OutOfMemoryException)] access to field Field
+
+# 116| [finally: exception(NullReferenceException)] this access
+#-----| -> [finally: exception(NullReferenceException)] access to field Field
+
+# 116| 0
+#-----| -> ... > ...
+
+# 116| [finally: return] 0
+#-----| -> [finally: return] ... > ...
+
+# 116| [finally: exception(Exception)] 0
+#-----| -> [finally: exception(Exception)] ... > ...
+
+# 116| [finally: exception(OutOfMemoryException)] 0
+#-----| -> [finally: exception(OutOfMemoryException)] ... > ...
+
+# 116| [finally: exception(NullReferenceException)] 0
+#-----| -> [finally: exception(NullReferenceException)] ... > ...
+
+# 117| ...;
+#-----| -> 1
+
+# 117| [finally: return] ...;
+#-----| -> [finally: return] 1
+
+# 117| [finally: exception(Exception)] ...;
+#-----| -> [finally: exception(Exception)] 1
+
+# 117| [finally: exception(OutOfMemoryException)] ...;
+#-----| -> [finally: exception(OutOfMemoryException)] 1
+
+# 117| [finally: exception(NullReferenceException)] ...;
+#-----| -> [finally: exception(NullReferenceException)] 1
+
+# 117| call to method WriteLine
+#-----| -> exit M5 (normal)
+
+# 117| [finally: return] call to method WriteLine
+#-----| return -> exit M5 (normal)
+
+# 117| [finally: exception(Exception)] call to method WriteLine
+#-----| exception(Exception) -> exit M5 (abnormal)
+
+# 117| [finally: exception(OutOfMemoryException)] call to method WriteLine
+#-----| exception(OutOfMemoryException) -> exit M5 (abnormal)
+
+# 117| [finally: exception(NullReferenceException)] call to method WriteLine
+#-----| exception(NullReferenceException) -> exit M5 (abnormal)
+
+# 117| 1
+#-----| -> call to method WriteLine
+
+# 117| [finally: return] 1
+#-----| -> [finally: return] call to method WriteLine
+
+# 117| [finally: exception(Exception)] 1
+#-----| -> [finally: exception(Exception)] call to method WriteLine
+
+# 117| [finally: exception(OutOfMemoryException)] 1
+#-----| -> [finally: exception(OutOfMemoryException)] call to method WriteLine
+
+# 117| [finally: exception(NullReferenceException)] 1
+#-----| -> [finally: exception(NullReferenceException)] call to method WriteLine
+
+# 121| enter M6
+#-----| -> {...}
+
+# 121| exit M6
+
+# 121| exit M6 (normal)
+#-----| -> exit M6
+
+# 122| {...}
+#-----| -> try {...} ...
+
+# 123| try {...} ...
+#-----| -> {...}
+
+# 124| {...}
+#-----| -> ... ...;
+
+# 125| ... ...;
+#-----| -> 0
+
+# 125| Double temp = ...
+#-----| -> exit M6 (normal)
+
+# 125| ... / ...
+#-----| -> Double temp = ...
+
+# 125| (...) ...
+#-----| -> access to constant E
+
+# 125| 0
+#-----| -> (...) ...
+
+# 125| access to constant E
+#-----| -> ... / ...
+
+# 133| enter M7
+#-----| -> {...}
+
+# 133| exit M7
+
+# 133| exit M7 (abnormal)
+#-----| -> exit M7
+
+# 134| {...}
+#-----| -> try {...} ...
+
+# 135| try {...} ...
+#-----| -> {...}
+
+# 136| {...}
+#-----| -> ...;
+
+# 137| ...;
+#-----| -> "Try"
+
+# 137| call to method WriteLine
+#-----| -> {...}
+#-----| exception(Exception) -> [finally: exception(Exception)] {...}
+
+# 137| "Try"
+#-----| -> call to method WriteLine
+
+# 140| {...}
+#-----| -> ""
+
+# 140| [finally: exception(Exception)] {...}
+#-----| -> [finally: exception(Exception)] ""
+
+# 141| throw ...;
+#-----| exception(ArgumentException) -> exit M7 (abnormal)
+
+# 141| [finally: exception(Exception)] throw ...;
+#-----| exception(ArgumentException) -> exit M7 (abnormal)
+
+# 141| object creation of type ArgumentException
+#-----| -> throw ...;
+
+# 141| [finally: exception(Exception)] object creation of type ArgumentException
+#-----| -> [finally: exception(Exception)] throw ...;
+
+# 141| ""
+#-----| -> object creation of type ArgumentException
+
+# 141| [finally: exception(Exception)] ""
+#-----| -> [finally: exception(Exception)] object creation of type ArgumentException
+
+# 147| enter M8
+#-----| -> {...}
+
+# 147| exit M8
+
+# 147| exit M8 (abnormal)
+#-----| -> exit M8
+
+# 147| exit M8 (normal)
+#-----| -> exit M8
+
+# 148| {...}
+#-----| -> try {...} ...
+
+# 149| try {...} ...
+#-----| -> {...}
+
+# 150| {...}
+#-----| -> if (...) ...
+
+# 151| if (...) ...
+#-----| -> access to parameter args
+
+# 151| ... == ...
+#-----| true -> object creation of type ArgumentNullException
+#-----| false -> {...}
+
+# 151| access to parameter args
+#-----| -> null
+
+# 151| null
+#-----| -> ... == ...
+
+# 152| throw ...;
+#-----| exception(ArgumentNullException) -> [finally: exception(ArgumentNullException)] {...}
+
+# 152| object creation of type ArgumentNullException
+#-----| -> throw ...;
+#-----| exception(Exception) -> [finally: exception(Exception)] {...}
+
+# 155| {...}
+#-----| -> try {...} ...
+
+# 155| [finally: exception(Exception)] {...}
+#-----| -> [finally: exception(Exception)] try {...} ...
+
+# 155| [finally: exception(ArgumentNullException)] {...}
+#-----| -> [finally: exception(ArgumentNullException)] try {...} ...
+
+# 156| try {...} ...
+#-----| -> {...}
+
+# 156| [finally: exception(Exception)] try {...} ...
+#-----| -> [finally: exception(Exception)] {...}
+
+# 156| [finally: exception(ArgumentNullException)] try {...} ...
+#-----| -> [finally: exception(ArgumentNullException)] {...}
+
+# 157| {...}
+#-----| -> if (...) ...
+
+# 157| [finally: exception(Exception)] {...}
+#-----| -> [finally: exception(Exception)] if (...) ...
+
+# 157| [finally: exception(ArgumentNullException)] {...}
+#-----| -> [finally: exception(ArgumentNullException)] if (...) ...
+
+# 158| if (...) ...
+#-----| -> access to parameter args
+
+# 158| [finally: exception(Exception)] if (...) ...
+#-----| -> [finally: exception(Exception)] access to parameter args
+
+# 158| [finally: exception(ArgumentNullException)] if (...) ...
+#-----| -> [finally: exception(ArgumentNullException)] access to parameter args
+
+# 158| ... == ...
+#-----| true -> "1"
+#-----| false -> exit M8 (normal)
+
+# 158| [finally: exception(Exception)] ... == ...
+#-----| true -> [finally: exception(Exception)] "1"
+#-----| exception(Exception) -> exit M8 (abnormal)
+
+# 158| [finally: exception(ArgumentNullException)] ... == ...
+#-----| true -> [finally: exception(ArgumentNullException)] "1"
+#-----| exception(ArgumentNullException) -> exit M8 (abnormal)
+
+# 158| access to property Length
+#-----| exception(Exception) -> [exception: Exception] catch (...) {...}
+#-----| exception(NullReferenceException) -> [exception: NullReferenceException] catch (...) {...}
+#-----| -> 1
+
+# 158| [finally: exception(Exception)] access to property Length
+#-----| exception(Exception) -> [finally: exception(Exception), exception: Exception] catch (...) {...}
+#-----| exception(NullReferenceException) -> [finally: exception(Exception), exception: NullReferenceException] catch (...) {...}
+#-----| -> [finally: exception(Exception)] 1
+
+# 158| [finally: exception(ArgumentNullException)] access to property Length
+#-----| exception(Exception) -> [finally: exception(ArgumentNullException), exception: Exception] catch (...) {...}
+#-----| exception(NullReferenceException) -> [finally: exception(ArgumentNullException), exception: NullReferenceException] catch (...) {...}
+#-----| -> [finally: exception(ArgumentNullException)] 1
+
+# 158| access to parameter args
+#-----| -> access to property Length
+
+# 158| [finally: exception(Exception)] access to parameter args
+#-----| -> [finally: exception(Exception)] access to property Length
+
+# 158| [finally: exception(ArgumentNullException)] access to parameter args
+#-----| -> [finally: exception(ArgumentNullException)] access to property Length
+
+# 158| 1
+#-----| -> ... == ...
+
+# 158| [finally: exception(Exception)] 1
+#-----| -> [finally: exception(Exception)] ... == ...
+
+# 158| [finally: exception(ArgumentNullException)] 1
+#-----| -> [finally: exception(ArgumentNullException)] ... == ...
+
+# 159| throw ...;
+#-----| exception(Exception) -> [exception: Exception] catch (...) {...}
+
+# 159| [finally: exception(Exception)] throw ...;
+#-----| exception(Exception) -> [finally: exception(Exception), exception: Exception] catch (...) {...}
+
+# 159| [finally: exception(ArgumentNullException)] throw ...;
+#-----| exception(Exception) -> [finally: exception(ArgumentNullException), exception: Exception] catch (...) {...}
+
+# 159| object creation of type Exception
+#-----| exception(Exception) -> [exception: Exception] catch (...) {...}
+#-----| -> throw ...;
+
+# 159| [finally: exception(Exception)] object creation of type Exception
+#-----| exception(Exception) -> [finally: exception(Exception), exception: Exception] catch (...) {...}
+#-----| -> [finally: exception(Exception)] throw ...;
+
+# 159| [finally: exception(ArgumentNullException)] object creation of type Exception
+#-----| exception(Exception) -> [finally: exception(ArgumentNullException), exception: Exception] catch (...) {...}
+#-----| -> [finally: exception(ArgumentNullException)] throw ...;
+
+# 159| "1"
+#-----| -> object creation of type Exception
+
+# 159| [finally: exception(Exception)] "1"
+#-----| -> [finally: exception(Exception)] object creation of type Exception
+
+# 159| [finally: exception(ArgumentNullException)] "1"
+#-----| -> [finally: exception(ArgumentNullException)] object creation of type Exception
+
+# 161| [exception: Exception] catch (...) {...}
+#-----| match -> [exception: Exception] Exception e
+
+# 161| [finally: exception(Exception), exception: Exception] catch (...) {...}
+#-----| match -> [finally: exception(Exception), exception: Exception] Exception e
+
+# 161| [finally: exception(ArgumentNullException), exception: Exception] catch (...) {...}
+#-----| match -> [finally: exception(ArgumentNullException), exception: Exception] Exception e
+
+# 161| [exception: NullReferenceException] catch (...) {...}
+#-----| match -> [exception: NullReferenceException] Exception e
+
+# 161| [finally: exception(Exception), exception: NullReferenceException] catch (...) {...}
+#-----| match -> [finally: exception(Exception), exception: NullReferenceException] Exception e
+
+# 161| [finally: exception(ArgumentNullException), exception: NullReferenceException] catch (...) {...}
+#-----| match -> [finally: exception(ArgumentNullException), exception: NullReferenceException] Exception e
+
+# 161| [exception: Exception] Exception e
+#-----| -> [exception: Exception] access to local variable e
+
+# 161| [finally: exception(Exception), exception: Exception] Exception e
+#-----| -> [finally: exception(Exception), exception: Exception] access to local variable e
+
+# 161| [finally: exception(ArgumentNullException), exception: Exception] Exception e
+#-----| -> [finally: exception(ArgumentNullException), exception: Exception] access to local variable e
+
+# 161| [exception: NullReferenceException] Exception e
+#-----| -> [exception: NullReferenceException] access to local variable e
+
+# 161| [finally: exception(Exception), exception: NullReferenceException] Exception e
+#-----| -> [finally: exception(Exception), exception: NullReferenceException] access to local variable e
+
+# 161| [finally: exception(ArgumentNullException), exception: NullReferenceException] Exception e
+#-----| -> [finally: exception(ArgumentNullException), exception: NullReferenceException] access to local variable e
+
+# 161| [exception: Exception] ... == ...
+#-----| true -> {...}
+#-----| false -> catch {...}
+
+# 161| [finally: exception(Exception), exception: Exception] ... == ...
+#-----| true -> [finally: exception(Exception)] {...}
+#-----| false -> [finally: exception(Exception)] catch {...}
+
+# 161| [finally: exception(ArgumentNullException), exception: Exception] ... == ...
+#-----| true -> [finally: exception(ArgumentNullException)] {...}
+#-----| false -> [finally: exception(ArgumentNullException)] catch {...}
+
+# 161| [exception: NullReferenceException] ... == ...
+#-----| true -> {...}
+#-----| false -> catch {...}
+
+# 161| [finally: exception(Exception), exception: NullReferenceException] ... == ...
+#-----| true -> [finally: exception(Exception)] {...}
+#-----| false -> [finally: exception(Exception)] catch {...}
+
+# 161| [finally: exception(ArgumentNullException), exception: NullReferenceException] ... == ...
+#-----| true -> [finally: exception(ArgumentNullException)] {...}
+#-----| false -> [finally: exception(ArgumentNullException)] catch {...}
+
+# 161| [exception: Exception] access to property Message
+#-----| -> [exception: Exception] "1"
+
+# 161| [finally: exception(Exception), exception: Exception] access to property Message
+#-----| -> [finally: exception(Exception), exception: Exception] "1"
+
+# 161| [finally: exception(ArgumentNullException), exception: Exception] access to property Message
+#-----| -> [finally: exception(ArgumentNullException), exception: Exception] "1"
+
+# 161| [exception: NullReferenceException] access to property Message
+#-----| -> [exception: NullReferenceException] "1"
+
+# 161| [finally: exception(Exception), exception: NullReferenceException] access to property Message
+#-----| -> [finally: exception(Exception), exception: NullReferenceException] "1"
+
+# 161| [finally: exception(ArgumentNullException), exception: NullReferenceException] access to property Message
+#-----| -> [finally: exception(ArgumentNullException), exception: NullReferenceException] "1"
+
+# 161| [exception: Exception] access to local variable e
+#-----| -> [exception: Exception] access to property Message
+
+# 161| [finally: exception(Exception), exception: Exception] access to local variable e
+#-----| -> [finally: exception(Exception), exception: Exception] access to property Message
+
+# 161| [finally: exception(ArgumentNullException), exception: Exception] access to local variable e
+#-----| -> [finally: exception(ArgumentNullException), exception: Exception] access to property Message
+
+# 161| [exception: NullReferenceException] access to local variable e
+#-----| -> [exception: NullReferenceException] access to property Message
+
+# 161| [finally: exception(Exception), exception: NullReferenceException] access to local variable e
+#-----| -> [finally: exception(Exception), exception: NullReferenceException] access to property Message
+
+# 161| [finally: exception(ArgumentNullException), exception: NullReferenceException] access to local variable e
+#-----| -> [finally: exception(ArgumentNullException), exception: NullReferenceException] access to property Message
+
+# 161| [exception: Exception] "1"
+#-----| -> [exception: Exception] ... == ...
+
+# 161| [finally: exception(Exception), exception: Exception] "1"
+#-----| -> [finally: exception(Exception), exception: Exception] ... == ...
+
+# 161| [finally: exception(ArgumentNullException), exception: Exception] "1"
+#-----| -> [finally: exception(ArgumentNullException), exception: Exception] ... == ...
+
+# 161| [exception: NullReferenceException] "1"
+#-----| -> [exception: NullReferenceException] ... == ...
+
+# 161| [finally: exception(Exception), exception: NullReferenceException] "1"
+#-----| -> [finally: exception(Exception), exception: NullReferenceException] ... == ...
+
+# 161| [finally: exception(ArgumentNullException), exception: NullReferenceException] "1"
+#-----| -> [finally: exception(ArgumentNullException), exception: NullReferenceException] ... == ...
+
+# 162| {...}
+#-----| -> ...;
+
+# 162| [finally: exception(Exception)] {...}
+#-----| -> [finally: exception(Exception)] ...;
+
+# 162| [finally: exception(ArgumentNullException)] {...}
+#-----| -> [finally: exception(ArgumentNullException)] ...;
+
+# 163| ...;
+#-----| -> access to parameter args
+
+# 163| [finally: exception(Exception)] ...;
+#-----| -> [finally: exception(Exception)] access to parameter args
+
+# 163| [finally: exception(ArgumentNullException)] ...;
+#-----| -> [finally: exception(ArgumentNullException)] access to parameter args
+
+# 163| call to method WriteLine
+#-----| -> exit M8 (normal)
+
+# 163| [finally: exception(Exception)] call to method WriteLine
+#-----| exception(Exception) -> exit M8 (abnormal)
+
+# 163| [finally: exception(ArgumentNullException)] call to method WriteLine
+#-----| exception(ArgumentNullException) -> exit M8 (abnormal)
+
+# 163| access to array element
+#-----| -> call to method WriteLine
+
+# 163| [finally: exception(Exception)] access to array element
+#-----| -> [finally: exception(Exception)] call to method WriteLine
+
+# 163| [finally: exception(ArgumentNullException)] access to array element
+#-----| -> [finally: exception(ArgumentNullException)] call to method WriteLine
+
+# 163| access to parameter args
+#-----| -> 0
+
+# 163| [finally: exception(Exception)] access to parameter args
+#-----| -> [finally: exception(Exception)] 0
+
+# 163| [finally: exception(ArgumentNullException)] access to parameter args
+#-----| -> [finally: exception(ArgumentNullException)] 0
+
+# 163| 0
+#-----| -> access to array element
+
+# 163| [finally: exception(Exception)] 0
+#-----| -> [finally: exception(Exception)] access to array element
+
+# 163| [finally: exception(ArgumentNullException)] 0
+#-----| -> [finally: exception(ArgumentNullException)] access to array element
+
+# 165| catch {...}
+#-----| -> {...}
+
+# 165| [finally: exception(Exception)] catch {...}
+#-----| -> [finally: exception(Exception)] {...}
+
+# 165| [finally: exception(ArgumentNullException)] catch {...}
+#-----| -> [finally: exception(ArgumentNullException)] {...}
+
+# 166| {...}
+#-----| -> ...;
+
+# 166| [finally: exception(Exception)] {...}
+#-----| -> [finally: exception(Exception)] ...;
+
+# 166| [finally: exception(ArgumentNullException)] {...}
+#-----| -> [finally: exception(ArgumentNullException)] ...;
+
+# 167| ...;
+#-----| -> ""
+
+# 167| [finally: exception(Exception)] ...;
+#-----| -> [finally: exception(Exception)] ""
+
+# 167| [finally: exception(ArgumentNullException)] ...;
+#-----| -> [finally: exception(ArgumentNullException)] ""
+
+# 167| call to method WriteLine
+#-----| -> exit M8 (normal)
+
+# 167| [finally: exception(Exception)] call to method WriteLine
+#-----| exception(Exception) -> exit M8 (abnormal)
+
+# 167| [finally: exception(ArgumentNullException)] call to method WriteLine
+#-----| exception(ArgumentNullException) -> exit M8 (abnormal)
+
+# 167| ""
+#-----| -> call to method WriteLine
+
+# 167| [finally: exception(Exception)] ""
+#-----| -> [finally: exception(Exception)] call to method WriteLine
+
+# 167| [finally: exception(ArgumentNullException)] ""
+#-----| -> [finally: exception(ArgumentNullException)] call to method WriteLine
+
+# 176| enter M9
+#-----| -> {...}
+
+# 176| exit M9
+
+# 176| exit M9 (abnormal)
+#-----| -> exit M9
+
+# 176| exit M9 (normal)
+#-----| -> exit M9
+
+# 177| {...}
+#-----| -> try {...} ...
+
+# 178| try {...} ...
+#-----| -> {...}
+
+# 179| {...}
+#-----| -> if (...) ...
+
+# 180| if (...) ...
+#-----| -> access to parameter b1
+
+# 180| access to parameter b1
+#-----| true -> [b1 (line 176): true] object creation of type ExceptionA
+#-----| false -> [b1 (line 176): false] {...}
+
+# 180| [b1 (line 176): true] throw ...;
+#-----| exception(ExceptionA) -> [finally: exception(ExceptionA), b1 (line 176): true] {...}
+
+# 180| [b1 (line 176): true] object creation of type ExceptionA
+#-----| -> [b1 (line 176): true] throw ...;
+#-----| exception(Exception) -> [finally: exception(Exception), b1 (line 176): true] {...}
+
+# 183| [b1 (line 176): false] {...}
+#-----| -> [b1 (line 176): false] try {...} ...
+
+# 183| [finally: exception(Exception), b1 (line 176): true] {...}
+#-----| -> [finally: exception(Exception), b1 (line 176): true] try {...} ...
+
+# 183| [finally: exception(ExceptionA), b1 (line 176): true] {...}
+#-----| -> [finally: exception(ExceptionA), b1 (line 176): true] try {...} ...
+
+# 184| [b1 (line 176): false] try {...} ...
+#-----| -> [b1 (line 176): false] {...}
+
+# 184| [finally: exception(Exception), b1 (line 176): true] try {...} ...
+#-----| -> [finally: exception(Exception), b1 (line 176): true] {...}
+
+# 184| [finally: exception(ExceptionA), b1 (line 176): true] try {...} ...
+#-----| -> [finally: exception(ExceptionA), b1 (line 176): true] {...}
+
+# 185| [b1 (line 176): false] {...}
+#-----| -> [b1 (line 176): false] if (...) ...
+
+# 185| [finally: exception(Exception), b1 (line 176): true] {...}
+#-----| -> [finally: exception(Exception), b1 (line 176): true] if (...) ...
+
+# 185| [finally: exception(ExceptionA), b1 (line 176): true] {...}
+#-----| -> [finally: exception(ExceptionA), b1 (line 176): true] if (...) ...
+
+# 186| [b1 (line 176): false] if (...) ...
+#-----| -> [b1 (line 176): false] access to parameter b2
+
+# 186| [finally: exception(Exception), b1 (line 176): true] if (...) ...
+#-----| -> [finally: exception(Exception), b1 (line 176): true] access to parameter b2
+
+# 186| [finally: exception(ExceptionA), b1 (line 176): true] if (...) ...
+#-----| -> [finally: exception(ExceptionA), b1 (line 176): true] access to parameter b2
+
+# 186| [b1 (line 176): false] access to parameter b2
+#-----| true -> [b1 (line 176): false, b2 (line 176): true] object creation of type ExceptionB
+#-----| false -> exit M9 (normal)
+
+# 186| [finally: exception(Exception), b1 (line 176): true] access to parameter b2
+#-----| true -> [finally: exception(Exception), b1 (line 176): true, b2 (line 176): true] object creation of type ExceptionB
+#-----| exception(Exception) -> exit M9 (abnormal)
+
+# 186| [finally: exception(ExceptionA), b1 (line 176): true] access to parameter b2
+#-----| true -> [finally: exception(ExceptionA), b1 (line 176): true, b2 (line 176): true] object creation of type ExceptionB
+#-----| exception(ExceptionA) -> exit M9 (abnormal)
+
+# 186| [b1 (line 176): false, b2 (line 176): true] throw ...;
+#-----| exception(ExceptionB) -> [exception: ExceptionB, b1 (line 176): false, b2 (line 176): true] catch (...) {...}
+
+# 186| [finally: exception(Exception), b1 (line 176): true, b2 (line 176): true] throw ...;
+#-----| exception(ExceptionB) -> [finally: exception(Exception), exception: ExceptionB, b1 (line 176): true, b2 (line 176): true] catch (...) {...}
+
+# 186| [finally: exception(ExceptionA), b1 (line 176): true, b2 (line 176): true] throw ...;
+#-----| exception(ExceptionB) -> [finally: exception(ExceptionA), exception: ExceptionB, b1 (line 176): true, b2 (line 176): true] catch (...) {...}
+
+# 186| [b1 (line 176): false, b2 (line 176): true] object creation of type ExceptionB
+#-----| exception(Exception) -> [exception: Exception, b1 (line 176): false, b2 (line 176): true] catch (...) {...}
+#-----| -> [b1 (line 176): false, b2 (line 176): true] throw ...;
+
+# 186| [finally: exception(Exception), b1 (line 176): true, b2 (line 176): true] object creation of type ExceptionB
+#-----| exception(Exception) -> [finally: exception(Exception), exception: Exception, b1 (line 176): true, b2 (line 176): true] catch (...) {...}
+#-----| -> [finally: exception(Exception), b1 (line 176): true, b2 (line 176): true] throw ...;
+
+# 186| [finally: exception(ExceptionA), b1 (line 176): true, b2 (line 176): true] object creation of type ExceptionB
+#-----| exception(Exception) -> [finally: exception(ExceptionA), exception: Exception, b1 (line 176): true, b2 (line 176): true] catch (...) {...}
+#-----| -> [finally: exception(ExceptionA), b1 (line 176): true, b2 (line 176): true] throw ...;
+
+# 188| [exception: Exception, b1 (line 176): false, b2 (line 176): true] catch (...) {...}
+#-----| match -> [exception: Exception, b1 (line 176): false, b2 (line 176): true] access to parameter b2
+#-----| exception(Exception) -> exit M9 (abnormal)
+
+# 188| [exception: ExceptionB, b1 (line 176): false, b2 (line 176): true] catch (...) {...}
+#-----| match -> [exception: ExceptionB, b1 (line 176): false, b2 (line 176): true] access to parameter b2
+
+# 188| [finally: exception(Exception), exception: Exception, b1 (line 176): true, b2 (line 176): true] catch (...) {...}
+#-----| match -> [finally: exception(Exception), exception: Exception, b1 (line 176): true, b2 (line 176): true] access to parameter b2
+#-----| exception(Exception) -> exit M9 (abnormal)
+
+# 188| [finally: exception(Exception), exception: ExceptionB, b1 (line 176): true, b2 (line 176): true] catch (...) {...}
+#-----| match -> [finally: exception(Exception), exception: ExceptionB, b1 (line 176): true, b2 (line 176): true] access to parameter b2
+
+# 188| [finally: exception(ExceptionA), exception: Exception, b1 (line 176): true, b2 (line 176): true] catch (...) {...}
+#-----| match -> [finally: exception(ExceptionA), exception: Exception, b1 (line 176): true, b2 (line 176): true] access to parameter b2
+#-----| exception(Exception) -> exit M9 (abnormal)
+
+# 188| [finally: exception(ExceptionA), exception: ExceptionB, b1 (line 176): true, b2 (line 176): true] catch (...) {...}
+#-----| match -> [finally: exception(ExceptionA), exception: ExceptionB, b1 (line 176): true, b2 (line 176): true] access to parameter b2
+
+# 188| [exception: Exception, b1 (line 176): false, b2 (line 176): true] access to parameter b2
+#-----| true -> [b1 (line 176): false] {...}
+
+# 188| [exception: ExceptionB, b1 (line 176): false, b2 (line 176): true] access to parameter b2
+#-----| true -> [b1 (line 176): false] {...}
+
+# 188| [finally: exception(Exception), exception: Exception, b1 (line 176): true, b2 (line 176): true] access to parameter b2
+#-----| true -> [finally: exception(Exception), b1 (line 176): true] {...}
+
+# 188| [finally: exception(Exception), exception: ExceptionB, b1 (line 176): true, b2 (line 176): true] access to parameter b2
+#-----| true -> [finally: exception(Exception), b1 (line 176): true] {...}
+
+# 188| [finally: exception(ExceptionA), exception: Exception, b1 (line 176): true, b2 (line 176): true] access to parameter b2
+#-----| true -> [finally: exception(ExceptionA), b1 (line 176): true] {...}
+
+# 188| [finally: exception(ExceptionA), exception: ExceptionB, b1 (line 176): true, b2 (line 176): true] access to parameter b2
+#-----| true -> [finally: exception(ExceptionA), b1 (line 176): true] {...}
+
+# 189| [b1 (line 176): false] {...}
+#-----| -> [b1 (line 176): false] if (...) ...
+
+# 189| [finally: exception(Exception), b1 (line 176): true] {...}
+#-----| -> [finally: exception(Exception), b1 (line 176): true] if (...) ...
+
+# 189| [finally: exception(ExceptionA), b1 (line 176): true] {...}
+#-----| -> [finally: exception(ExceptionA), b1 (line 176): true] if (...) ...
+
+# 190| [b1 (line 176): false] if (...) ...
+#-----| -> [b1 (line 176): false] access to parameter b1
+
+# 190| [finally: exception(Exception), b1 (line 176): true] if (...) ...
+#-----| -> [finally: exception(Exception), b1 (line 176): true] access to parameter b1
+
+# 190| [finally: exception(ExceptionA), b1 (line 176): true] if (...) ...
+#-----| -> [finally: exception(ExceptionA), b1 (line 176): true] access to parameter b1
+
+# 190| [b1 (line 176): false] access to parameter b1
+#-----| false -> exit M9 (normal)
+
+# 190| [finally: exception(Exception), b1 (line 176): true] access to parameter b1
+#-----| true -> [finally: exception(Exception)] object creation of type ExceptionC
+
+# 190| [finally: exception(ExceptionA), b1 (line 176): true] access to parameter b1
+#-----| true -> [finally: exception(ExceptionA)] object creation of type ExceptionC
+
+# 190| [finally: exception(Exception)] throw ...;
+#-----| exception(ExceptionC) -> exit M9 (abnormal)
+
+# 190| [finally: exception(ExceptionA)] throw ...;
+#-----| exception(ExceptionC) -> exit M9 (abnormal)
+
+# 190| [finally: exception(Exception)] object creation of type ExceptionC
+#-----| -> [finally: exception(Exception)] throw ...;
+
+# 190| [finally: exception(ExceptionA)] object creation of type ExceptionC
+#-----| -> [finally: exception(ExceptionA)] throw ...;
+
+# 195| enter M10
+#-----| -> {...}
+
+# 195| exit M10
+
+# 195| exit M10 (abnormal)
+#-----| -> exit M10
+
+# 195| exit M10 (normal)
+#-----| -> exit M10
+
+# 196| {...}
+#-----| -> try {...} ...
+
+# 197| try {...} ...
+#-----| -> {...}
+
+# 198| {...}
+#-----| -> if (...) ...
+
+# 199| if (...) ...
+#-----| -> access to parameter b1
+
+# 199| access to parameter b1
+#-----| true -> object creation of type ExceptionA
+#-----| false -> {...}
+
+# 199| throw ...;
+#-----| exception(ExceptionA) -> [finally: exception(ExceptionA)] {...}
+
+# 199| object creation of type ExceptionA
+#-----| -> throw ...;
+#-----| exception(Exception) -> [finally: exception(Exception)] {...}
+
+# 202| {...}
+#-----| -> try {...} ...
+
+# 202| [finally: exception(Exception)] {...}
+#-----| -> [finally: exception(Exception)] try {...} ...
+
+# 202| [finally: exception(ExceptionA)] {...}
+#-----| -> [finally: exception(ExceptionA)] try {...} ...
+
+# 203| try {...} ...
+#-----| -> {...}
+
+# 203| [finally: exception(Exception)] try {...} ...
+#-----| -> [finally: exception(Exception)] {...}
+
+# 203| [finally: exception(ExceptionA)] try {...} ...
+#-----| -> [finally: exception(ExceptionA)] {...}
+
+# 204| {...}
+#-----| -> if (...) ...
+
+# 204| [finally: exception(Exception)] {...}
+#-----| -> [finally: exception(Exception)] if (...) ...
+
+# 204| [finally: exception(ExceptionA)] {...}
+#-----| -> [finally: exception(ExceptionA)] if (...) ...
+
+# 205| if (...) ...
+#-----| -> access to parameter b2
+
+# 205| [finally: exception(Exception)] if (...) ...
+#-----| -> [finally: exception(Exception)] access to parameter b2
+
+# 205| [finally: exception(ExceptionA)] if (...) ...
+#-----| -> [finally: exception(ExceptionA)] access to parameter b2
+
+# 205| access to parameter b2
+#-----| true -> object creation of type ExceptionB
+#-----| false -> {...}
+
+# 205| [finally: exception(Exception)] access to parameter b2
+#-----| true -> [finally: exception(Exception)] object creation of type ExceptionB
+#-----| false -> [finally: exception(Exception)] {...}
+
+# 205| [finally: exception(ExceptionA)] access to parameter b2
+#-----| true -> [finally: exception(ExceptionA)] object creation of type ExceptionB
+#-----| false -> [finally: exception(ExceptionA)] {...}
+
+# 205| throw ...;
+#-----| exception(ExceptionB) -> [finally(1): exception(ExceptionB)] {...}
+
+# 205| [finally: exception(Exception)] throw ...;
+#-----| exception(ExceptionB) -> [finally: exception(Exception), finally(1): exception(ExceptionB)] {...}
+
+# 205| [finally: exception(ExceptionA)] throw ...;
+#-----| exception(ExceptionB) -> [finally: exception(ExceptionA), finally(1): exception(ExceptionB)] {...}
+
+# 205| object creation of type ExceptionB
+#-----| -> throw ...;
+#-----| exception(Exception) -> [finally(1): exception(Exception)] {...}
+
+# 205| [finally: exception(Exception)] object creation of type ExceptionB
+#-----| -> [finally: exception(Exception)] throw ...;
+#-----| exception(Exception) -> [finally: exception(Exception), finally(1): exception(Exception)] {...}
+
+# 205| [finally: exception(ExceptionA)] object creation of type ExceptionB
+#-----| -> [finally: exception(ExceptionA)] throw ...;
+#-----| exception(Exception) -> [finally: exception(ExceptionA), finally(1): exception(Exception)] {...}
+
+# 208| {...}
+#-----| -> if (...) ...
+
+# 208| [finally(1): exception(Exception)] {...}
+#-----| -> [finally(1): exception(Exception)] if (...) ...
+
+# 208| [finally(1): exception(ExceptionB)] {...}
+#-----| -> [finally(1): exception(ExceptionB)] if (...) ...
+
+# 208| [finally: exception(Exception)] {...}
+#-----| -> [finally: exception(Exception)] if (...) ...
+
+# 208| [finally: exception(Exception), finally(1): exception(Exception)] {...}
+#-----| -> [finally: exception(Exception), finally(1): exception(Exception)] if (...) ...
+
+# 208| [finally: exception(Exception), finally(1): exception(ExceptionB)] {...}
+#-----| -> [finally: exception(Exception), finally(1): exception(ExceptionB)] if (...) ...
+
+# 208| [finally: exception(ExceptionA)] {...}
+#-----| -> [finally: exception(ExceptionA)] if (...) ...
+
+# 208| [finally: exception(ExceptionA), finally(1): exception(Exception)] {...}
+#-----| -> [finally: exception(ExceptionA), finally(1): exception(Exception)] if (...) ...
+
+# 208| [finally: exception(ExceptionA), finally(1): exception(ExceptionB)] {...}
+#-----| -> [finally: exception(ExceptionA), finally(1): exception(ExceptionB)] if (...) ...
+
+# 209| if (...) ...
+#-----| -> access to parameter b3
+
+# 209| [finally(1): exception(Exception)] if (...) ...
+#-----| -> [finally(1): exception(Exception)] access to parameter b3
+
+# 209| [finally(1): exception(ExceptionB)] if (...) ...
+#-----| -> [finally(1): exception(ExceptionB)] access to parameter b3
+
+# 209| [finally: exception(Exception)] if (...) ...
+#-----| -> [finally: exception(Exception)] access to parameter b3
+
+# 209| [finally: exception(Exception), finally(1): exception(Exception)] if (...) ...
+#-----| -> [finally: exception(Exception), finally(1): exception(Exception)] access to parameter b3
+
+# 209| [finally: exception(Exception), finally(1): exception(ExceptionB)] if (...) ...
+#-----| -> [finally: exception(Exception), finally(1): exception(ExceptionB)] access to parameter b3
+
+# 209| [finally: exception(ExceptionA)] if (...) ...
+#-----| -> [finally: exception(ExceptionA)] access to parameter b3
+
+# 209| [finally: exception(ExceptionA), finally(1): exception(Exception)] if (...) ...
+#-----| -> [finally: exception(ExceptionA), finally(1): exception(Exception)] access to parameter b3
+
+# 209| [finally: exception(ExceptionA), finally(1): exception(ExceptionB)] if (...) ...
+#-----| -> [finally: exception(ExceptionA), finally(1): exception(ExceptionB)] access to parameter b3
+
+# 209| access to parameter b3
+#-----| true -> object creation of type ExceptionC
+#-----| false -> ...;
+
+# 209| [finally(1): exception(Exception)] access to parameter b3
+#-----| true -> [finally(1): exception(Exception)] object creation of type ExceptionC
+#-----| exception(Exception) -> exit M10 (abnormal)
+
+# 209| [finally(1): exception(ExceptionB)] access to parameter b3
+#-----| true -> [finally(1): exception(ExceptionB)] object creation of type ExceptionC
+#-----| exception(ExceptionB) -> exit M10 (abnormal)
+
+# 209| [finally: exception(Exception)] access to parameter b3
+#-----| true -> [finally: exception(Exception)] object creation of type ExceptionC
+#-----| false -> [finally: exception(Exception)] ...;
+
+# 209| [finally: exception(Exception), finally(1): exception(Exception)] access to parameter b3
+#-----| true -> [finally: exception(Exception), finally(1): exception(Exception)] object creation of type ExceptionC
+#-----| exception(Exception) -> exit M10 (abnormal)
+
+# 209| [finally: exception(Exception), finally(1): exception(ExceptionB)] access to parameter b3
+#-----| true -> [finally: exception(Exception), finally(1): exception(ExceptionB)] object creation of type ExceptionC
+#-----| exception(ExceptionB) -> exit M10 (abnormal)
+
+# 209| [finally: exception(ExceptionA)] access to parameter b3
+#-----| true -> [finally: exception(ExceptionA)] object creation of type ExceptionC
+#-----| false -> [finally: exception(ExceptionA)] ...;
+
+# 209| [finally: exception(ExceptionA), finally(1): exception(Exception)] access to parameter b3
+#-----| true -> [finally: exception(ExceptionA), finally(1): exception(Exception)] object creation of type ExceptionC
+#-----| exception(Exception) -> exit M10 (abnormal)
+
+# 209| [finally: exception(ExceptionA), finally(1): exception(ExceptionB)] access to parameter b3
+#-----| true -> [finally: exception(ExceptionA), finally(1): exception(ExceptionB)] object creation of type ExceptionC
+#-----| exception(ExceptionB) -> exit M10 (abnormal)
+
+# 209| throw ...;
+#-----| exception(ExceptionC) -> exit M10 (abnormal)
+
+# 209| [finally(1): exception(Exception)] throw ...;
+#-----| exception(ExceptionC) -> exit M10 (abnormal)
+
+# 209| [finally(1): exception(ExceptionB)] throw ...;
+#-----| exception(ExceptionC) -> exit M10 (abnormal)
+
+# 209| [finally: exception(Exception)] throw ...;
+#-----| exception(ExceptionC) -> exit M10 (abnormal)
+
+# 209| [finally: exception(Exception), finally(1): exception(Exception)] throw ...;
+#-----| exception(ExceptionC) -> exit M10 (abnormal)
+
+# 209| [finally: exception(Exception), finally(1): exception(ExceptionB)] throw ...;
+#-----| exception(ExceptionC) -> exit M10 (abnormal)
+
+# 209| [finally: exception(ExceptionA)] throw ...;
+#-----| exception(ExceptionC) -> exit M10 (abnormal)
+
+# 209| [finally: exception(ExceptionA), finally(1): exception(Exception)] throw ...;
+#-----| exception(ExceptionC) -> exit M10 (abnormal)
+
+# 209| [finally: exception(ExceptionA), finally(1): exception(ExceptionB)] throw ...;
+#-----| exception(ExceptionC) -> exit M10 (abnormal)
+
+# 209| object creation of type ExceptionC
+#-----| -> throw ...;
+
+# 209| [finally(1): exception(Exception)] object creation of type ExceptionC
+#-----| -> [finally(1): exception(Exception)] throw ...;
+
+# 209| [finally(1): exception(ExceptionB)] object creation of type ExceptionC
+#-----| -> [finally(1): exception(ExceptionB)] throw ...;
+
+# 209| [finally: exception(Exception)] object creation of type ExceptionC
+#-----| -> [finally: exception(Exception)] throw ...;
+
+# 209| [finally: exception(Exception), finally(1): exception(Exception)] object creation of type ExceptionC
+#-----| -> [finally: exception(Exception), finally(1): exception(Exception)] throw ...;
+
+# 209| [finally: exception(Exception), finally(1): exception(ExceptionB)] object creation of type ExceptionC
+#-----| -> [finally: exception(Exception), finally(1): exception(ExceptionB)] throw ...;
+
+# 209| [finally: exception(ExceptionA)] object creation of type ExceptionC
+#-----| -> [finally: exception(ExceptionA)] throw ...;
+
+# 209| [finally: exception(ExceptionA), finally(1): exception(Exception)] object creation of type ExceptionC
+#-----| -> [finally: exception(ExceptionA), finally(1): exception(Exception)] throw ...;
+
+# 209| [finally: exception(ExceptionA), finally(1): exception(ExceptionB)] object creation of type ExceptionC
+#-----| -> [finally: exception(ExceptionA), finally(1): exception(ExceptionB)] throw ...;
+
+# 211| ...;
+#-----| -> this access
+
+# 211| [finally: exception(Exception)] ...;
+#-----| -> [finally: exception(Exception)] this access
+
+# 211| [finally: exception(ExceptionA)] ...;
+#-----| -> [finally: exception(ExceptionA)] this access
+
+# 211| ... = ...
+#-----| -> ...;
+
+# 211| [finally: exception(Exception)] ... = ...
+#-----| exception(Exception) -> exit M10 (abnormal)
+
+# 211| [finally: exception(ExceptionA)] ... = ...
+#-----| exception(ExceptionA) -> exit M10 (abnormal)
+
+# 211| this access
+#-----| -> "0"
+
+# 211| [finally: exception(Exception)] this access
+#-----| -> [finally: exception(Exception)] "0"
+
+# 211| [finally: exception(ExceptionA)] this access
+#-----| -> [finally: exception(ExceptionA)] "0"
+
+# 211| "0"
+#-----| -> ... = ...
+
+# 211| [finally: exception(Exception)] "0"
+#-----| -> [finally: exception(Exception)] ... = ...
+
+# 211| [finally: exception(ExceptionA)] "0"
+#-----| -> [finally: exception(ExceptionA)] ... = ...
+
+# 213| ...;
+#-----| -> this access
+
+# 213| ... = ...
+#-----| -> exit M10 (normal)
+
+# 213| this access
+#-----| -> "1"
+
+# 213| "1"
+#-----| -> ... = ...
+
+# 216| enter M11
+#-----| -> {...}
+
+# 216| exit M11
+
+# 216| exit M11 (normal)
+#-----| -> exit M11
+
+# 217| {...}
+#-----| -> try {...} ...
+
+# 218| try {...} ...
+#-----| -> {...}
+
+# 219| {...}
+#-----| -> ...;
+
+# 220| ...;
+#-----| -> "Try"
+
+# 220| call to method WriteLine
+#-----| exception(Exception) -> catch {...}
+#-----| -> {...}
+
+# 220| "Try"
+#-----| -> call to method WriteLine
+
+# 222| catch {...}
+#-----| -> {...}
+
+# 223| {...}
+#-----| -> ...;
+
+# 224| ...;
+#-----| -> "Catch"
+
+# 224| call to method WriteLine
+#-----| -> {...}
+
+# 224| "Catch"
+#-----| -> call to method WriteLine
+
+# 227| {...}
+#-----| -> ...;
+
+# 228| ...;
+#-----| -> "Finally"
+
+# 228| call to method WriteLine
+#-----| -> ...;
+
+# 228| "Finally"
+#-----| -> call to method WriteLine
+
+# 230| ...;
+#-----| -> "Done"
+
+# 230| call to method WriteLine
+#-----| -> exit M11 (normal)
+
+# 230| "Done"
+#-----| -> call to method WriteLine
+
+# 233| enter M12
+#-----| -> {...}
+
+# 233| exit M12
+
+# 233| exit M12 (abnormal)
+#-----| -> exit M12
+
+# 233| exit M12 (normal)
+#-----| -> exit M12
+
+# 234| {...}
+#-----| -> try {...} ...
+
+# 235| try {...} ...
+#-----| -> {...}
+
+# 236| {...}
+#-----| -> try {...} ...
+
+# 237| try {...} ...
+#-----| -> {...}
+
+# 238| {...}
+#-----| -> if (...) ...
+
+# 239| if (...) ...
+#-----| -> access to parameter b1
+
+# 239| access to parameter b1
+#-----| true -> object creation of type ExceptionA
+#-----| false -> {...}
+
+# 240| throw ...;
+#-----| exception(ExceptionA) -> [finally: exception(ExceptionA)] {...}
+
+# 240| object creation of type ExceptionA
+#-----| -> throw ...;
+#-----| exception(Exception) -> [finally: exception(Exception)] {...}
+
+# 243| {...}
+#-----| -> try {...} ...
+
+# 243| [finally: exception(Exception)] {...}
+#-----| -> [finally: exception(Exception)] try {...} ...
+
+# 243| [finally: exception(ExceptionA)] {...}
+#-----| -> [finally: exception(ExceptionA)] try {...} ...
+
+# 244| try {...} ...
+#-----| -> {...}
+
+# 244| [finally: exception(Exception)] try {...} ...
+#-----| -> [finally: exception(Exception)] {...}
+
+# 244| [finally: exception(ExceptionA)] try {...} ...
+#-----| -> [finally: exception(ExceptionA)] {...}
+
+# 245| {...}
+#-----| -> if (...) ...
+
+# 245| [finally: exception(Exception)] {...}
+#-----| -> [finally: exception(Exception)] if (...) ...
+
+# 245| [finally: exception(ExceptionA)] {...}
+#-----| -> [finally: exception(ExceptionA)] if (...) ...
+
+# 246| if (...) ...
+#-----| -> access to parameter b2
+
+# 246| [finally: exception(Exception)] if (...) ...
+#-----| -> [finally: exception(Exception)] access to parameter b2
+
+# 246| [finally: exception(ExceptionA)] if (...) ...
+#-----| -> [finally: exception(ExceptionA)] access to parameter b2
+
+# 246| access to parameter b2
+#-----| true -> object creation of type ExceptionA
+#-----| false -> {...}
+
+# 246| [finally: exception(Exception)] access to parameter b2
+#-----| true -> [finally: exception(Exception)] object creation of type ExceptionA
+#-----| false -> [finally: exception(Exception)] {...}
+
+# 246| [finally: exception(ExceptionA)] access to parameter b2
+#-----| true -> [finally: exception(ExceptionA)] object creation of type ExceptionA
+#-----| false -> [finally: exception(ExceptionA)] {...}
+
+# 247| throw ...;
+#-----| exception(ExceptionA) -> [finally(1): exception(ExceptionA)] {...}
+
+# 247| [finally: exception(Exception)] throw ...;
+#-----| exception(ExceptionA) -> [finally: exception(Exception), finally(1): exception(ExceptionA)] {...}
+
+# 247| [finally: exception(ExceptionA)] throw ...;
+#-----| exception(ExceptionA) -> [finally: exception(ExceptionA), finally(1): exception(ExceptionA)] {...}
+
+# 247| object creation of type ExceptionA
+#-----| -> throw ...;
+#-----| exception(Exception) -> [finally(1): exception(Exception)] {...}
+
+# 247| [finally: exception(Exception)] object creation of type ExceptionA
+#-----| -> [finally: exception(Exception)] throw ...;
+#-----| exception(Exception) -> [finally: exception(Exception), finally(1): exception(Exception)] {...}
+
+# 247| [finally: exception(ExceptionA)] object creation of type ExceptionA
+#-----| -> [finally: exception(ExceptionA)] throw ...;
+#-----| exception(Exception) -> [finally: exception(ExceptionA), finally(1): exception(Exception)] {...}
+
+# 250| {...}
+#-----| -> ...;
+
+# 250| [finally(1): exception(Exception)] {...}
+#-----| -> [finally(1): exception(Exception)] ...;
+
+# 250| [finally(1): exception(ExceptionA)] {...}
+#-----| -> [finally(1): exception(ExceptionA)] ...;
+
+# 250| [finally: exception(Exception)] {...}
+#-----| -> [finally: exception(Exception)] ...;
+
+# 250| [finally: exception(Exception), finally(1): exception(Exception)] {...}
+#-----| -> [finally: exception(Exception), finally(1): exception(Exception)] ...;
+
+# 250| [finally: exception(Exception), finally(1): exception(ExceptionA)] {...}
+#-----| -> [finally: exception(Exception), finally(1): exception(ExceptionA)] ...;
+
+# 250| [finally: exception(ExceptionA)] {...}
+#-----| -> [finally: exception(ExceptionA)] ...;
+
+# 250| [finally: exception(ExceptionA), finally(1): exception(Exception)] {...}
+#-----| -> [finally: exception(ExceptionA), finally(1): exception(Exception)] ...;
+
+# 250| [finally: exception(ExceptionA), finally(1): exception(ExceptionA)] {...}
+#-----| -> [finally: exception(ExceptionA), finally(1): exception(ExceptionA)] ...;
+
+# 251| ...;
+#-----| -> "Inner finally"
+
+# 251| [finally(1): exception(Exception)] ...;
+#-----| -> [finally(1): exception(Exception)] "Inner finally"
+
+# 251| [finally(1): exception(ExceptionA)] ...;
+#-----| -> [finally(1): exception(ExceptionA)] "Inner finally"
+
+# 251| [finally: exception(Exception)] ...;
+#-----| -> [finally: exception(Exception)] "Inner finally"
+
+# 251| [finally: exception(Exception), finally(1): exception(Exception)] ...;
+#-----| -> [finally: exception(Exception), finally(1): exception(Exception)] "Inner finally"
+
+# 251| [finally: exception(Exception), finally(1): exception(ExceptionA)] ...;
+#-----| -> [finally: exception(Exception), finally(1): exception(ExceptionA)] "Inner finally"
+
+# 251| [finally: exception(ExceptionA)] ...;
+#-----| -> [finally: exception(ExceptionA)] "Inner finally"
+
+# 251| [finally: exception(ExceptionA), finally(1): exception(Exception)] ...;
+#-----| -> [finally: exception(ExceptionA), finally(1): exception(Exception)] "Inner finally"
+
+# 251| [finally: exception(ExceptionA), finally(1): exception(ExceptionA)] ...;
+#-----| -> [finally: exception(ExceptionA), finally(1): exception(ExceptionA)] "Inner finally"
+
+# 251| call to method WriteLine
+#-----| -> ...;
+
+# 251| [finally(1): exception(Exception)] call to method WriteLine
+#-----| exception(Exception) -> [finally: exception(Exception)] {...}
+
+# 251| [finally(1): exception(ExceptionA)] call to method WriteLine
+#-----| exception(ExceptionA) -> [finally: exception(ExceptionA)] {...}
+
+# 251| [finally: exception(Exception)] call to method WriteLine
+#-----| exception(Exception) -> [finally: exception(Exception)] {...}
+
+# 251| [finally: exception(Exception), finally(1): exception(Exception)] call to method WriteLine
+#-----| exception(Exception) -> [finally: exception(Exception)] {...}
+
+# 251| [finally: exception(Exception), finally(1): exception(ExceptionA)] call to method WriteLine
+#-----| exception(ExceptionA) -> [finally: exception(ExceptionA)] {...}
+
+# 251| [finally: exception(ExceptionA)] call to method WriteLine
+#-----| exception(ExceptionA) -> [finally: exception(ExceptionA)] {...}
+
+# 251| [finally: exception(ExceptionA), finally(1): exception(Exception)] call to method WriteLine
+#-----| exception(Exception) -> [finally: exception(Exception)] {...}
+
+# 251| [finally: exception(ExceptionA), finally(1): exception(ExceptionA)] call to method WriteLine
+#-----| exception(ExceptionA) -> [finally: exception(ExceptionA)] {...}
+
+# 251| "Inner finally"
+#-----| -> call to method WriteLine
+
+# 251| [finally(1): exception(Exception)] "Inner finally"
+#-----| -> [finally(1): exception(Exception)] call to method WriteLine
+
+# 251| [finally(1): exception(ExceptionA)] "Inner finally"
+#-----| -> [finally(1): exception(ExceptionA)] call to method WriteLine
+
+# 251| [finally: exception(Exception)] "Inner finally"
+#-----| -> [finally: exception(Exception)] call to method WriteLine
+
+# 251| [finally: exception(Exception), finally(1): exception(Exception)] "Inner finally"
+#-----| -> [finally: exception(Exception), finally(1): exception(Exception)] call to method WriteLine
+
+# 251| [finally: exception(Exception), finally(1): exception(ExceptionA)] "Inner finally"
+#-----| -> [finally: exception(Exception), finally(1): exception(ExceptionA)] call to method WriteLine
+
+# 251| [finally: exception(ExceptionA)] "Inner finally"
+#-----| -> [finally: exception(ExceptionA)] call to method WriteLine
+
+# 251| [finally: exception(ExceptionA), finally(1): exception(Exception)] "Inner finally"
+#-----| -> [finally: exception(ExceptionA), finally(1): exception(Exception)] call to method WriteLine
+
+# 251| [finally: exception(ExceptionA), finally(1): exception(ExceptionA)] "Inner finally"
+#-----| -> [finally: exception(ExceptionA), finally(1): exception(ExceptionA)] call to method WriteLine
+
+# 254| ...;
+#-----| -> "Mid finally"
+
+# 254| call to method WriteLine
+#-----| -> {...}
+#-----| exception(Exception) -> [finally: exception(Exception)] {...}
+
+# 254| "Mid finally"
+#-----| -> call to method WriteLine
+
+# 257| {...}
+#-----| -> ...;
+
+# 257| [finally: exception(Exception)] {...}
+#-----| -> [finally: exception(Exception)] ...;
+
+# 257| [finally: exception(ExceptionA)] {...}
+#-----| -> [finally: exception(ExceptionA)] ...;
+
+# 258| ...;
+#-----| -> "Outer finally"
+
+# 258| [finally: exception(Exception)] ...;
+#-----| -> [finally: exception(Exception)] "Outer finally"
+
+# 258| [finally: exception(ExceptionA)] ...;
+#-----| -> [finally: exception(ExceptionA)] "Outer finally"
+
+# 258| call to method WriteLine
+#-----| -> ...;
+
+# 258| [finally: exception(Exception)] call to method WriteLine
+#-----| exception(Exception) -> exit M12 (abnormal)
+
+# 258| [finally: exception(ExceptionA)] call to method WriteLine
+#-----| exception(ExceptionA) -> exit M12 (abnormal)
+
+# 258| "Outer finally"
+#-----| -> call to method WriteLine
+
+# 258| [finally: exception(Exception)] "Outer finally"
+#-----| -> [finally: exception(Exception)] call to method WriteLine
+
+# 258| [finally: exception(ExceptionA)] "Outer finally"
+#-----| -> [finally: exception(ExceptionA)] call to method WriteLine
+
+# 260| ...;
+#-----| -> "Done"
+
+# 260| call to method WriteLine
+#-----| -> exit M12 (normal)
+
+# 260| "Done"
+#-----| -> call to method WriteLine
+
+# 263| enter M13
+#-----| -> {...}
+
+# 263| exit M13
+
+# 263| exit M13 (abnormal)
+#-----| -> exit M13
+
+# 263| exit M13 (normal)
+#-----| -> exit M13
+
+# 264| {...}
+#-----| -> try {...} ...
+
+# 265| try {...} ...
+#-----| -> {...}
+
+# 266| {...}
+#-----| -> ...;
+
+# 267| ...;
+#-----| -> "1"
+
+# 267| call to method WriteLine
+#-----| -> {...}
+#-----| exception(Exception) -> [finally: exception(Exception)] {...}
+
+# 267| "1"
+#-----| -> call to method WriteLine
+
+# 270| {...}
+#-----| -> ...;
+
+# 270| [finally: exception(Exception)] {...}
+#-----| -> [finally: exception(Exception)] ...;
+
+# 271| ...;
+#-----| -> "3"
+
+# 271| [finally: exception(Exception)] ...;
+#-----| -> [finally: exception(Exception)] "3"
+
+# 271| call to method WriteLine
+#-----| -> ...;
+
+# 271| [finally: exception(Exception)] call to method WriteLine
+#-----| -> [finally: exception(Exception)] ...;
+
+# 271| "3"
+#-----| -> call to method WriteLine
+
+# 271| [finally: exception(Exception)] "3"
+#-----| -> [finally: exception(Exception)] call to method WriteLine
+
+# 272| ...;
+#-----| -> access to parameter i
+
+# 272| [finally: exception(Exception)] ...;
+#-----| -> [finally: exception(Exception)] access to parameter i
+
+# 272| ... = ...
+#-----| -> exit M13 (normal)
+
+# 272| [finally: exception(Exception)] ... = ...
+#-----| exception(Exception) -> exit M13 (abnormal)
+
+# 272| ... + ...
+#-----| -> ... = ...
+
+# 272| [finally: exception(Exception)] ... + ...
+#-----| -> [finally: exception(Exception)] ... = ...
+
+# 272| access to parameter i
+#-----| -> 3
+
+# 272| [finally: exception(Exception)] access to parameter i
+#-----| -> [finally: exception(Exception)] 3
+
+# 272| 3
+#-----| -> ... + ...
+
+# 272| [finally: exception(Exception)] 3
+#-----| -> [finally: exception(Exception)] ... + ...
+
+Foreach.cs:
+# 6| enter M1
+#-----| -> {...}
+
+# 6| exit M1
+
+# 6| exit M1 (normal)
+#-----| -> exit M1
+
+# 7| {...}
+#-----| -> access to parameter args
+
+# 8| foreach (... ... in ...) ...
+#-----| non-empty -> String arg
+#-----| empty -> exit M1 (normal)
+
+# 8| String arg
+#-----| -> ;
+
+# 8| access to parameter args
+#-----| -> foreach (... ... in ...) ...
+
+# 9| ;
+#-----| -> foreach (... ... in ...) ...
+
+# 12| enter M2
+#-----| -> {...}
+
+# 12| exit M2
+
+# 12| exit M2 (normal)
+#-----| -> exit M2
+
+# 13| {...}
+#-----| -> access to parameter args
+
+# 14| foreach (... ... in ...) ...
+#-----| non-empty -> String _
+#-----| empty -> exit M2 (normal)
+
+# 14| String _
+#-----| -> ;
+
+# 14| access to parameter args
+#-----| -> foreach (... ... in ...) ...
+
+# 15| ;
+#-----| -> foreach (... ... in ...) ...
+
+# 18| enter M3
+#-----| -> {...}
+
+# 18| exit M3
+
+# 18| exit M3 (normal)
+#-----| -> exit M3
+
+# 19| {...}
+#-----| -> access to parameter e
+
+# 20| foreach (... ... in ...) ...
+#-----| non-empty -> String x
+#-----| empty -> exit M3 (normal)
+
+# 20| String x
+#-----| -> ;
+
+# 20| ... ?? ...
+#-----| -> foreach (... ... in ...) ...
+
+# 20| access to parameter e
+#-----| non-null -> call to method ToArray
+#-----| null -> call to method Empty
+
+# 20| call to method ToArray
+#-----| non-null -> ... ?? ...
+#-----| null -> call to method Empty
+
+# 20| call to method Empty
+#-----| -> ... ?? ...
+
+# 21| ;
+#-----| -> foreach (... ... in ...) ...
+
+# 24| enter M4
+#-----| -> {...}
+
+# 24| exit M4
+
+# 24| exit M4 (normal)
+#-----| -> exit M4
+
+# 25| {...}
+#-----| -> access to parameter args
+
+# 26| foreach (... ... in ...) ...
+#-----| non-empty -> String x
+#-----| empty -> exit M4 (normal)
+
+# 26| (..., ...)
+#-----| -> ;
+
+# 26| String x
+#-----| -> Int32 y
+
+# 26| Int32 y
+#-----| -> (..., ...)
+
+# 26| access to parameter args
+#-----| -> foreach (... ... in ...) ...
+
+# 27| ;
+#-----| -> foreach (... ... in ...) ...
+
+# 30| enter M5
+#-----| -> {...}
+
+# 30| exit M5
+
+# 30| exit M5 (normal)
+#-----| -> exit M5
+
+# 31| {...}
+#-----| -> access to parameter args
+
+# 32| foreach (... ... in ...) ...
+#-----| non-empty -> String x
+#-----| empty -> exit M5 (normal)
+
+# 32| (..., ...)
+#-----| -> ;
+
+# 32| String x
+#-----| -> Int32 y
+
+# 32| Int32 y
+#-----| -> (..., ...)
+
+# 32| access to parameter args
+#-----| -> foreach (... ... in ...) ...
+
+# 33| ;
+#-----| -> foreach (... ... in ...) ...
+
+# 36| enter M6
+#-----| -> {...}
+
+# 36| exit M6
+
+# 36| exit M6 (normal)
+#-----| -> exit M6
+
+# 37| {...}
+#-----| -> access to parameter args
+
+# 38| foreach (... ... in ...) ...
+#-----| non-empty -> String x
+#-----| empty -> exit M6 (normal)
+
+# 38| (..., ...)
+#-----| -> ;
+
+# 38| String x
+#-----| -> Int32 y
+
+# 38| Int32 y
+#-----| -> (..., ...)
+
+# 38| access to parameter args
+#-----| -> foreach (... ... in ...) ...
+
+# 39| ;
+#-----| -> foreach (... ... in ...) ...
+
+Initializers.cs:
+# 5| ... = ...
+#-----| -> this access
+
+# 5| ... = ...
+#-----| -> this access
+
+# 5| this access
+#-----| -> access to field H
+
+# 5| this access
+#-----| -> access to field H
+
+# 5| ... + ...
+#-----| -> ... = ...
+
+# 5| ... + ...
+#-----| -> ... = ...
+
+# 5| access to field H
+#-----| -> 1
+
+# 5| access to field H
+#-----| -> 1
+
+# 5| 1
+#-----| -> ... + ...
+
+# 5| 1
+#-----| -> ... + ...
+
+# 6| access to property G
+#-----| -> ... = ...
+
+# 6| access to property G
+#-----| -> ... = ...
+
+# 6| this access
+#-----| -> access to field H
+
+# 6| this access
+#-----| -> access to field H
+
+# 6| ... = ...
+#-----| -> {...}
+
+# 6| ... = ...
+#-----| -> {...}
+
+# 6| ... + ...
+#-----| -> access to property G
+
+# 6| ... + ...
+#-----| -> access to property G
+
+# 6| access to field H
+#-----| -> 2
+
+# 6| access to field H
+#-----| -> 2
+
+# 6| 2
+#-----| -> ... + ...
+
+# 6| 2
+#-----| -> ... + ...
+
+# 8| enter Initializers
+#-----| -> call to constructor Object
+
+# 8| call to constructor Object
+#-----| -> this access
+
+# 8| exit Initializers
+
+# 8| exit Initializers (normal)
+#-----| -> exit Initializers
+
+# 8| {...}
+#-----| -> exit Initializers (normal)
+
+# 10| enter Initializers
+#-----| -> call to constructor Object
+
+# 10| call to constructor Object
+#-----| -> this access
+
+# 10| exit Initializers
+
+# 10| exit Initializers (normal)
+#-----| -> exit Initializers
+
+# 10| {...}
+#-----| -> exit Initializers (normal)
+
+# 12| enter M
+#-----| -> {...}
+
+# 12| exit M
+
+# 12| exit M (normal)
+#-----| -> exit M
+
+# 13| {...}
+#-----| -> ... ...;
+
+# 14| ... ...;
+#-----| -> ""
+
+# 14| Initializers i = ...
+#-----| -> ... ...;
+
+# 14| object creation of type Initializers
+#-----| -> 0
+
+# 14| ""
+#-----| -> object creation of type Initializers
+
+# 14| { ..., ... }
+#-----| -> Initializers i = ...
+
+# 14| ... = ...
+#-----| -> 1
+
+# 14| 0
+#-----| -> ... = ...
+
+# 14| ... = ...
+#-----| -> { ..., ... }
+
+# 14| access to property G
+#-----| -> ... = ...
+
+# 14| 1
+#-----| -> access to property G
+
+# 15| ... ...;
+#-----| -> 2
+
+# 15| Initializers[] iz = ...
+#-----| -> exit M (normal)
+
+# 15| array creation of type Initializers[]
+#-----| -> access to local variable i
+
+# 15| 2
+#-----| -> array creation of type Initializers[]
+
+# 15| { ..., ... }
+#-----| -> Initializers[] iz = ...
+
+# 15| access to local variable i
+#-----| -> ""
+
+# 15| object creation of type Initializers
+#-----| -> { ..., ... }
+
+# 15| ""
+#-----| -> object creation of type Initializers
+
+# 18| enter H
+#-----| -> 1
+
+# 18| ... = ...
+
+# 18| 1
+#-----| -> ... = ...
+
+# 20| enter NoConstructor
+#-----| -> this access
+
+# 20| exit NoConstructor
+
+# 20| exit NoConstructor (normal)
+#-----| -> exit NoConstructor
+
+# 22| ... = ...
+#-----| -> this access
+
+# 22| this access
+#-----| -> 0
+
+# 22| 0
+#-----| -> ... = ...
+
+# 23| ... = ...
+#-----| -> exit NoConstructor (normal)
+
+# 23| this access
+#-----| -> 1
+
+# 23| 1
+#-----| -> ... = ...
+
+# 28| ... = ...
+#-----| -> {...}
+
+# 28| ... = ...
+#-----| -> {...}
+
+# 28| this access
+#-----| -> 2
+
+# 28| this access
+#-----| -> 2
+
+# 28| 2
+#-----| -> ... = ...
+
+# 28| 2
+#-----| -> ... = ...
+
+# 31| enter Sub
+#-----| -> call to constructor NoConstructor
+
+# 31| exit Sub
+
+# 31| exit Sub (normal)
+#-----| -> exit Sub
+
+# 31| call to constructor NoConstructor
+#-----| -> this access
+
+# 31| {...}
+#-----| -> ...;
+
+# 31| ...;
+#-----| -> this access
+
+# 31| ... = ...
+#-----| -> exit Sub (normal)
+
+# 31| this access
+#-----| -> 3
+
+# 31| 3
+#-----| -> ... = ...
+
+# 33| enter Sub
+#-----| -> call to constructor Sub
+
+# 33| exit Sub
+
+# 33| exit Sub (normal)
+#-----| -> exit Sub
+
+# 33| call to constructor Sub
+#-----| -> {...}
+
+# 33| {...}
+#-----| -> ...;
+
+# 33| ...;
+#-----| -> this access
+
+# 33| ... = ...
+#-----| -> exit Sub (normal)
+
+# 33| this access
+#-----| -> access to parameter i
+
+# 33| access to parameter i
+#-----| -> ... = ...
+
+# 35| enter Sub
+#-----| -> call to constructor NoConstructor
+
+# 35| call to constructor NoConstructor
+#-----| -> this access
+
+# 35| exit Sub
+
+# 35| exit Sub (normal)
+#-----| -> exit Sub
+
+# 35| {...}
+#-----| -> ...;
+
+# 35| ...;
+#-----| -> this access
+
+# 35| ... = ...
+#-----| -> exit Sub (normal)
+
+# 35| this access
+#-----| -> access to parameter i
+
+# 35| ... + ...
+#-----| -> ... = ...
+
+# 35| access to parameter i
+#-----| -> access to parameter j
+
+# 35| access to parameter j
+#-----| -> ... + ...
+
+# 51| enter Test
+#-----| -> {...}
+
+# 51| exit Test
+
+# 51| exit Test (normal)
+#-----| -> exit Test
+
+# 52| {...}
+#-----| -> ... ...;
+
+# 54| ... ...;
+#-----| -> object creation of type Dictionary
+
+# 54| Dictionary dict = ...
+#-----| -> ... ...;
+
+# 54| object creation of type Dictionary
+#-----| -> 0
+
+# 54| { ..., ... }
+#-----| -> Dictionary dict = ...
+
+# 54| ... = ...
+#-----| -> 1
+
+# 54| access to indexer
+#-----| -> ... = ...
+
+# 54| 0
+#-----| -> "Zero"
+
+# 54| "Zero"
+#-----| -> access to indexer
+
+# 54| ... = ...
+#-----| -> access to parameter i
+
+# 54| access to indexer
+#-----| -> ... = ...
+
+# 54| 1
+#-----| -> "One"
+
+# 54| "One"
+#-----| -> access to indexer
+
+# 54| ... = ...
+#-----| -> { ..., ... }
+
+# 54| access to indexer
+#-----| -> ... = ...
+
+# 54| ... + ...
+#-----| -> "Two"
+
+# 54| access to parameter i
+#-----| -> 2
+
+# 54| 2
+#-----| -> ... + ...
+
+# 54| "Two"
+#-----| -> access to indexer
+
+# 57| ... ...;
+#-----| -> object creation of type Compound
+
+# 57| Compound compound = ...
+#-----| -> exit Test (normal)
+
+# 57| object creation of type Compound
+#-----| -> 0
+
+# 58| { ..., ... }
+#-----| -> Compound compound = ...
+
+# 59| ... = ...
+#-----| -> 3
+
+# 59| { ..., ... }
+#-----| -> ... = ...
+
+# 59| ... = ...
+#-----| -> 1
+
+# 59| access to indexer
+#-----| -> ... = ...
+
+# 59| 0
+#-----| -> "Zero"
+
+# 59| "Zero"
+#-----| -> access to indexer
+
+# 59| ... = ...
+#-----| -> access to parameter i
+
+# 59| access to indexer
+#-----| -> ... = ...
+
+# 59| 1
+#-----| -> "One"
+
+# 59| "One"
+#-----| -> access to indexer
+
+# 59| ... = ...
+#-----| -> { ..., ... }
+
+# 59| access to indexer
+#-----| -> ... = ...
+
+# 59| ... + ...
+#-----| -> "Two"
+
+# 59| access to parameter i
+#-----| -> 2
+
+# 59| 2
+#-----| -> ... + ...
+
+# 59| "Two"
+#-----| -> access to indexer
+
+# 60| ... = ...
+#-----| -> 0
+
+# 60| access to property DictionaryProperty
+#-----| -> ... = ...
+
+# 60| { ..., ... }
+#-----| -> access to property DictionaryProperty
+
+# 60| ... = ...
+#-----| -> 2
+
+# 60| access to indexer
+#-----| -> ... = ...
+
+# 60| 3
+#-----| -> "Three"
+
+# 60| "Three"
+#-----| -> access to indexer
+
+# 60| ... = ...
+#-----| -> access to parameter i
+
+# 60| access to indexer
+#-----| -> ... = ...
+
+# 60| 2
+#-----| -> "Two"
+
+# 60| "Two"
+#-----| -> access to indexer
+
+# 60| ... = ...
+#-----| -> { ..., ... }
+
+# 60| access to indexer
+#-----| -> ... = ...
+
+# 60| ... + ...
+#-----| -> "One"
+
+# 60| access to parameter i
+#-----| -> 1
+
+# 60| 1
+#-----| -> ... + ...
+
+# 60| "One"
+#-----| -> access to indexer
+
+# 61| ... = ...
+#-----| -> 0
+
+# 61| { ..., ... }
+#-----| -> ... = ...
+
+# 61| ... = ...
+#-----| -> access to parameter i
+
+# 61| 0
+#-----| -> "Zero"
+
+# 61| "Zero"
+#-----| -> ... = ...
+
+# 61| ... = ...
+#-----| -> { ..., ... }
+
+# 61| ... + ...
+#-----| -> "One"
+
+# 61| access to parameter i
+#-----| -> 1
+
+# 61| 1
+#-----| -> ... + ...
+
+# 61| "One"
+#-----| -> ... = ...
+
+# 62| ... = ...
+#-----| -> 1
+
+# 62| { ..., ... }
+#-----| -> ... = ...
+
+# 62| ... = ...
+#-----| -> 1
+
+# 62| 0
+#-----| -> 1
+
+# 62| 1
+#-----| -> "i"
+
+# 62| "i"
+#-----| -> ... = ...
+
+# 62| ... = ...
+#-----| -> { ..., ... }
+
+# 62| 1
+#-----| -> access to parameter i
+
+# 62| ... + ...
+#-----| -> "1"
+
+# 62| access to parameter i
+#-----| -> 0
+
+# 62| 0
+#-----| -> ... + ...
+
+# 62| "1"
+#-----| -> ... = ...
+
+# 63| ... = ...
+#-----| -> 0
+
+# 63| access to property ArrayProperty
+#-----| -> ... = ...
+
+# 63| { ..., ... }
+#-----| -> access to property ArrayProperty
+
+# 63| ... = ...
+#-----| -> access to parameter i
+
+# 63| 1
+#-----| -> "One"
+
+# 63| "One"
+#-----| -> ... = ...
+
+# 63| ... = ...
+#-----| -> { ..., ... }
+
+# 63| ... + ...
+#-----| -> "Two"
+
+# 63| access to parameter i
+#-----| -> 2
+
+# 63| 2
+#-----| -> ... + ...
+
+# 63| "Two"
+#-----| -> ... = ...
+
+# 64| ... = ...
+#-----| -> { ..., ... }
+
+# 64| access to property ArrayProperty2
+#-----| -> ... = ...
+
+# 64| { ..., ... }
+#-----| -> access to property ArrayProperty2
+
+# 64| ... = ...
+#-----| -> 1
+
+# 64| 0
+#-----| -> 1
+
+# 64| 1
+#-----| -> "i"
+
+# 64| "i"
+#-----| -> ... = ...
+
+# 64| ... = ...
+#-----| -> { ..., ... }
+
+# 64| 1
+#-----| -> access to parameter i
+
+# 64| ... + ...
+#-----| -> "1"
+
+# 64| access to parameter i
+#-----| -> 0
+
+# 64| 0
+#-----| -> ... + ...
+
+# 64| "1"
+#-----| -> ... = ...
+
+LoopUnrolling.cs:
+# 7| enter M1
+#-----| -> {...}
+
+# 7| exit M1
+
+# 7| exit M1 (normal)
+#-----| -> exit M1
+
+# 8| {...}
+#-----| -> if (...) ...
+
+# 9| if (...) ...
+#-----| -> access to parameter args
+
+# 9| ... == ...
+#-----| true -> return ...;
+#-----| false -> access to parameter args
+
+# 9| access to property Length
+#-----| -> 0
+
+# 9| access to parameter args
+#-----| -> access to property Length
+
+# 9| 0
+#-----| -> ... == ...
+
+# 10| return ...;
+#-----| return -> exit M1 (normal)
+
+# 11| foreach (... ... in ...) ...
+#-----| non-empty -> String arg
+#-----| empty -> exit M1 (normal)
+
+# 11| [unroll (line 11)] foreach (... ... in ...) ...
+#-----| non-empty -> String arg
+
+# 11| String arg
+#-----| -> ...;
+
+# 11| access to parameter args
+#-----| -> [unroll (line 11)] foreach (... ... in ...) ...
+
+# 12| ...;
+#-----| -> access to local variable arg
+
+# 12| call to method WriteLine
+#-----| -> foreach (... ... in ...) ...
+
+# 12| access to local variable arg
+#-----| -> call to method WriteLine
+
+# 15| enter M2
+#-----| -> {...}
+
+# 15| exit M2
+
+# 15| exit M2 (normal)
+#-----| -> exit M2
+
+# 16| {...}
+#-----| -> ... ...;
+
+# 17| ... ...;
+#-----| -> 3
+
+# 17| String[] xs = ...
+#-----| -> access to local variable xs
+
+# 17| array creation of type String[]
+#-----| -> "a"
+
+# 17| 3
+#-----| -> array creation of type String[]
+
+# 17| { ..., ... }
+#-----| -> String[] xs = ...
+
+# 17| "a"
+#-----| -> "b"
+
+# 17| "b"
+#-----| -> "c"
+
+# 17| "c"
+#-----| -> { ..., ... }
+
+# 18| foreach (... ... in ...) ...
+#-----| non-empty -> String x
+#-----| empty -> exit M2 (normal)
+
+# 18| [unroll (line 18)] foreach (... ... in ...) ...
+#-----| non-empty -> String x
+
+# 18| String x
+#-----| -> ...;
+
+# 18| access to local variable xs
+#-----| -> [unroll (line 18)] foreach (... ... in ...) ...
+
+# 19| ...;
+#-----| -> access to local variable x
+
+# 19| call to method WriteLine
+#-----| -> foreach (... ... in ...) ...
+
+# 19| access to local variable x
+#-----| -> call to method WriteLine
+
+# 22| enter M3
+#-----| -> {...}
+
+# 22| exit M3
+
+# 22| exit M3 (normal)
+#-----| -> exit M3
+
+# 23| {...}
+#-----| -> access to parameter args
+
+# 24| foreach (... ... in ...) ...
+#-----| non-empty -> Char arg
+#-----| empty -> exit M3 (normal)
+
+# 24| Char arg
+#-----| -> access to parameter args
+
+# 24| access to parameter args
+#-----| -> foreach (... ... in ...) ...
+
+# 25| foreach (... ... in ...) ...
+#-----| empty -> foreach (... ... in ...) ...
+#-----| non-empty -> Char arg0
+
+# 25| [unroll (line 25)] foreach (... ... in ...) ...
+#-----| non-empty -> Char arg0
+
+# 25| Char arg0
+#-----| -> ...;
+
+# 25| access to parameter args
+#-----| -> [unroll (line 25)] foreach (... ... in ...) ...
+
+# 26| ...;
+#-----| -> access to local variable arg0
+
+# 26| call to method WriteLine
+#-----| -> foreach (... ... in ...) ...
+
+# 26| access to local variable arg0
+#-----| -> call to method WriteLine
+
+# 29| enter M4
+#-----| -> {...}
+
+# 29| exit M4
+
+# 29| exit M4 (normal)
+#-----| -> exit M4
+
+# 30| {...}
+#-----| -> ... ...;
+
+# 31| ... ...;
+#-----| -> 0
+
+# 31| String[] xs = ...
+#-----| -> access to local variable xs
+
+# 31| array creation of type String[]
+#-----| -> String[] xs = ...
+
+# 31| 0
+#-----| -> array creation of type String[]
+
+# 32| [skip (line 32)] foreach (... ... in ...) ...
+#-----| empty -> exit M4 (normal)
+
+# 32| access to local variable xs
+#-----| -> [skip (line 32)] foreach (... ... in ...) ...
+
+# 36| enter M5
+#-----| -> {...}
+
+# 36| exit M5
+
+# 36| exit M5 (normal)
+#-----| -> exit M5
+
+# 37| {...}
+#-----| -> ... ...;
+
+# 38| ... ...;
+#-----| -> 3
+
+# 38| String[] xs = ...
+#-----| -> ... ...;
+
+# 38| array creation of type String[]
+#-----| -> "a"
+
+# 38| 3
+#-----| -> array creation of type String[]
+
+# 38| { ..., ... }
+#-----| -> String[] xs = ...
+
+# 38| "a"
+#-----| -> "b"
+
+# 38| "b"
+#-----| -> "c"
+
+# 38| "c"
+#-----| -> { ..., ... }
+
+# 39| ... ...;
+#-----| -> 3
+
+# 39| String[] ys = ...
+#-----| -> access to local variable xs
+
+# 39| array creation of type String[]
+#-----| -> "0"
+
+# 39| 3
+#-----| -> array creation of type String[]
+
+# 39| { ..., ... }
+#-----| -> String[] ys = ...
+
+# 39| "0"
+#-----| -> "1"
+
+# 39| "1"
+#-----| -> "2"
+
+# 39| "2"
+#-----| -> { ..., ... }
+
+# 40| foreach (... ... in ...) ...
+#-----| non-empty -> String x
+#-----| empty -> exit M5 (normal)
+
+# 40| [unroll (line 40)] foreach (... ... in ...) ...
+#-----| non-empty -> String x
+
+# 40| String x
+#-----| -> access to local variable ys
+
+# 40| access to local variable xs
+#-----| -> [unroll (line 40)] foreach (... ... in ...) ...
+
+# 41| foreach (... ... in ...) ...
+#-----| empty -> foreach (... ... in ...) ...
+#-----| non-empty -> String y
+
+# 41| [unroll (line 41)] foreach (... ... in ...) ...
+#-----| non-empty -> String y
+
+# 41| String y
+#-----| -> ...;
+
+# 41| access to local variable ys
+#-----| -> [unroll (line 41)] foreach (... ... in ...) ...
+
+# 42| ...;
+#-----| -> access to local variable x
+
+# 42| call to method WriteLine
+#-----| -> foreach (... ... in ...) ...
+
+# 42| ... + ...
+#-----| -> call to method WriteLine
+
+# 42| access to local variable x
+#-----| -> access to local variable y
+
+# 42| access to local variable y
+#-----| -> ... + ...
+
+# 45| enter M6
+#-----| -> {...}
+
+# 46| {...}
+#-----| -> ... ...;
+
+# 47| ... ...;
+#-----| -> 3
+
+# 47| String[] xs = ...
+#-----| -> access to local variable xs
+
+# 47| array creation of type String[]
+#-----| -> "a"
+
+# 47| 3
+#-----| -> array creation of type String[]
+
+# 47| { ..., ... }
+#-----| -> String[] xs = ...
+
+# 47| "a"
+#-----| -> "b"
+
+# 47| "b"
+#-----| -> "c"
+
+# 47| "c"
+#-----| -> { ..., ... }
+
+# 48| [unroll (line 48)] foreach (... ... in ...) ...
+#-----| non-empty -> String x
+
+# 48| String x
+#-----| -> {...}
+
+# 48| access to local variable xs
+#-----| -> [unroll (line 48)] foreach (... ... in ...) ...
+
+# 49| {...}
+#-----| -> Label:
+
+# 50| Label:
+#-----| -> ...;
+
+# 50| ...;
+#-----| -> access to local variable x
+
+# 50| call to method WriteLine
+#-----| -> goto ...;
+
+# 50| access to local variable x
+#-----| -> call to method WriteLine
+
+# 51| goto ...;
+#-----| goto(Label) -> Label:
+
+# 55| enter M7
+#-----| -> {...}
+
+# 55| exit M7
+
+# 55| exit M7 (normal)
+#-----| -> exit M7
+
+# 56| {...}
+#-----| -> ... ...;
+
+# 57| ... ...;
+#-----| -> 3
+
+# 57| String[] xs = ...
+#-----| -> access to local variable xs
+
+# 57| array creation of type String[]
+#-----| -> "a"
+
+# 57| 3
+#-----| -> array creation of type String[]
+
+# 57| { ..., ... }
+#-----| -> String[] xs = ...
+
+# 57| "a"
+#-----| -> "b"
+
+# 57| "b"
+#-----| -> "c"
+
+# 57| "c"
+#-----| -> { ..., ... }
+
+# 58| [unroll (line 58)] foreach (... ... in ...) ...
+#-----| non-empty -> String x
+
+# 58| [b (line 55): false] foreach (... ... in ...) ...
+#-----| non-empty -> [b (line 55): false] String x
+#-----| empty -> exit M7 (normal)
+
+# 58| [b (line 55): true] foreach (... ... in ...) ...
+#-----| non-empty -> [b (line 55): true] String x
+#-----| empty -> exit M7 (normal)
+
+# 58| String x
+#-----| -> {...}
+
+# 58| [b (line 55): false] String x
+#-----| -> [b (line 55): false] {...}
+
+# 58| [b (line 55): true] String x
+#-----| -> [b (line 55): true] {...}
+
+# 58| access to local variable xs
+#-----| -> [unroll (line 58)] foreach (... ... in ...) ...
+
+# 59| {...}
+#-----| -> if (...) ...
+
+# 59| [b (line 55): false] {...}
+#-----| -> [b (line 55): false] if (...) ...
+
+# 59| [b (line 55): true] {...}
+#-----| -> [b (line 55): true] if (...) ...
+
+# 60| if (...) ...
+#-----| -> access to parameter b
+
+# 60| [b (line 55): false] if (...) ...
+#-----| -> [b (line 55): false] access to parameter b
+
+# 60| [b (line 55): true] if (...) ...
+#-----| -> [b (line 55): true] access to parameter b
+
+# 60| access to parameter b
+#-----| true -> [b (line 55): true] ...;
+#-----| false -> [b (line 55): false] if (...) ...
+
+# 60| [b (line 55): false] access to parameter b
+#-----| false -> [b (line 55): false] if (...) ...
+
+# 60| [b (line 55): true] access to parameter b
+#-----| true -> [b (line 55): true] ...;
+
+# 61| [b (line 55): true] ...;
+#-----| -> [b (line 55): true] access to local variable x
+
+# 61| [b (line 55): true] call to method WriteLine
+#-----| -> [b (line 55): true] if (...) ...
+
+# 61| [b (line 55): true] access to local variable x
+#-----| -> [b (line 55): true] call to method WriteLine
+
+# 62| [b (line 55): false] if (...) ...
+#-----| -> [b (line 55): false] access to parameter b
+
+# 62| [b (line 55): true] if (...) ...
+#-----| -> [b (line 55): true] access to parameter b
+
+# 62| [b (line 55): false] access to parameter b
+#-----| false -> [b (line 55): false] foreach (... ... in ...) ...
+
+# 62| [b (line 55): true] access to parameter b
+#-----| true -> [b (line 55): true] ...;
+
+# 63| [b (line 55): true] ...;
+#-----| -> [b (line 55): true] access to local variable x
+
+# 63| [b (line 55): true] call to method WriteLine
+#-----| -> [b (line 55): true] foreach (... ... in ...) ...
+
+# 63| [b (line 55): true] access to local variable x
+#-----| -> [b (line 55): true] call to method WriteLine
+
+# 67| enter M8
+#-----| -> {...}
+
+# 67| exit M8
+
+# 67| exit M8 (normal)
+#-----| -> exit M8
+
+# 68| {...}
+#-----| -> if (...) ...
+
+# 69| if (...) ...
+#-----| -> access to parameter args
+
+# 69| [false] !...
+#-----| false -> ...;
+
+# 69| [true] !...
+#-----| true -> return ...;
+
+# 69| call to method Any
+#-----| true -> [false] !...
+#-----| false -> [true] !...
+
+# 69| access to parameter args
+#-----| -> call to method Any
+
+# 70| return ...;
+#-----| return -> exit M8 (normal)
+
+# 71| ...;
+#-----| -> access to parameter args
+
+# 71| call to method Clear
+#-----| -> access to parameter args
+
+# 71| access to parameter args
+#-----| -> call to method Clear
+
+# 72| [skip (line 72)] foreach (... ... in ...) ...
+#-----| empty -> exit M8 (normal)
+
+# 72| access to parameter args
+#-----| -> [skip (line 72)] foreach (... ... in ...) ...
+
+# 76| enter M9
+#-----| -> {...}
+
+# 76| exit M9
+
+# 76| exit M9 (normal)
+#-----| -> exit M9
+
+# 77| {...}
+#-----| -> ... ...;
+
+# 78| ... ...;
+#-----| -> 2
+
+# 78| String[,] xs = ...
+#-----| -> access to local variable xs
+
+# 78| array creation of type String[,]
+#-----| -> String[,] xs = ...
+
+# 78| 2
+#-----| -> 0
+
+# 78| 0
+#-----| -> array creation of type String[,]
+
+# 79| [skip (line 79)] foreach (... ... in ...) ...
+#-----| empty -> exit M9 (normal)
+
+# 79| access to local variable xs
+#-----| -> [skip (line 79)] foreach (... ... in ...) ...
+
+# 85| enter M10
+#-----| -> {...}
+
+# 85| exit M10
+
+# 85| exit M10 (normal)
+#-----| -> exit M10
+
+# 86| {...}
+#-----| -> ... ...;
+
+# 87| ... ...;
+#-----| -> 0
+
+# 87| String[,] xs = ...
+#-----| -> access to local variable xs
+
+# 87| array creation of type String[,]
+#-----| -> String[,] xs = ...
+
+# 87| 0
+#-----| -> 2
+
+# 87| 2
+#-----| -> array creation of type String[,]
+
+# 88| [skip (line 88)] foreach (... ... in ...) ...
+#-----| empty -> exit M10 (normal)
+
+# 88| access to local variable xs
+#-----| -> [skip (line 88)] foreach (... ... in ...) ...
+
+# 94| enter M11
+#-----| -> {...}
+
+# 94| exit M11
+
+# 94| exit M11 (normal)
+#-----| -> exit M11
+
+# 95| {...}
+#-----| -> ... ...;
+
+# 96| ... ...;
+#-----| -> 2
+
+# 96| String[,] xs = ...
+#-----| -> access to local variable xs
+
+# 96| array creation of type String[,]
+#-----| -> String[,] xs = ...
+
+# 96| 2
+#-----| -> 2
+
+# 96| 2
+#-----| -> array creation of type String[,]
+
+# 97| foreach (... ... in ...) ...
+#-----| non-empty -> String x
+#-----| empty -> exit M11 (normal)
+
+# 97| [unroll (line 97)] foreach (... ... in ...) ...
+#-----| non-empty -> String x
+
+# 97| String x
+#-----| -> {...}
+
+# 97| access to local variable xs
+#-----| -> [unroll (line 97)] foreach (... ... in ...) ...
+
+# 98| {...}
+#-----| -> ...;
+
+# 99| ...;
+#-----| -> access to local variable x
+
+# 99| call to method WriteLine
+#-----| -> foreach (... ... in ...) ...
+
+# 99| access to local variable x
+#-----| -> call to method WriteLine
+
+MultiImplementationA.cs:
+# 6| throw ...
+#-----| exception(NullReferenceException) -> exit get_P1 (abnormal)
+#-----| exception(NullReferenceException) -> exit get_P1 (abnormal)
+
+# 6| null
+#-----| -> throw ...
+
+# 7| {...}
+#-----| -> null
+
+# 7| throw ...;
+#-----| exception(NullReferenceException) -> exit get_P2 (abnormal)
+#-----| exception(NullReferenceException) -> exit get_P2 (abnormal)
+
+# 7| null
+#-----| -> throw ...;
+
+# 7| {...}
+#-----| -> null
+
+# 7| throw ...;
+#-----| exception(NullReferenceException) -> exit set_P2 (abnormal)
+#-----| exception(NullReferenceException) -> exit set_P2 (abnormal)
+
+# 7| null
+#-----| -> throw ...;
+
+# 8| throw ...
+#-----| exception(NullReferenceException) -> exit M (abnormal)
+#-----| exception(NullReferenceException) -> exit M (abnormal)
+
+# 8| null
+#-----| -> throw ...
+
+# 13| ... = ...
+#-----| -> this access
+
+# 13| this access
+#-----| -> 0
+
+# 13| 0
+#-----| -> ... = ...
+
+# 14| access to parameter i
+#-----| -> exit get_Item (normal)
+#-----| -> exit get_Item (normal)
+
+# 15| {...}
+#-----| -> access to parameter s
+
+# 15| return ...;
+#-----| return -> exit get_Item (normal)
+#-----| return -> exit get_Item (normal)
+
+# 15| access to parameter s
+#-----| -> return ...;
+
+# 15| {...}
+#-----| -> exit set_Item (normal)
+#-----| -> exit set_Item (normal)
+
+# 17| {...}
+#-----| -> M2(...)
+
+# 18| enter M2
+#-----| -> 0
+
+# 18| M2(...)
+#-----| -> exit M1 (normal)
+#-----| -> exit M1 (normal)
+
+# 18| exit M2
+
+# 18| exit M2 (normal)
+#-----| -> exit M2
+
+# 18| 0
+#-----| -> exit M2 (normal)
+
+# 20| call to constructor Object
+#-----| -> this access
+
+# 20| {...}
+#-----| -> ...;
+
+# 20| ...;
+#-----| -> this access
+
+# 20| ... = ...
+#-----| -> exit C2 (normal)
+#-----| -> exit C2 (normal)
+
+# 20| this access
+#-----| -> access to parameter i
+
+# 20| access to parameter i
+#-----| -> ... = ...
+
+# 21| call to constructor C2
+#-----| -> {...}
+
+# 21| 0
+#-----| -> call to constructor C2
+
+# 21| {...}
+#-----| -> exit C2 (normal)
+#-----| -> exit C2 (normal)
+
+# 22| {...}
+#-----| -> exit ~C2 (normal)
+#-----| -> exit ~C2 (normal)
+
+# 23| null
+#-----| -> exit implicit conversion (normal)
+#-----| -> exit implicit conversion (normal)
+
+# 24| access to property P
+#-----| -> ... = ...
+
+# 24| this access
+#-----| -> 0
+
+# 24| ... = ...
+#-----| -> {...}
+
+# 24| 0
+#-----| -> access to property P
+
+# 30| throw ...
+#-----| exception(NullReferenceException) -> exit get_P3 (abnormal)
+#-----| exception(NullReferenceException) -> exit get_P3 (abnormal)
+
+# 30| null
+#-----| -> throw ...
+
+# 36| {...}
+#-----| -> null
+
+# 36| throw ...;
+#-----| exception(NullReferenceException) -> exit M1 (abnormal)
+#-----| exception(NullReferenceException) -> exit M1 (abnormal)
+
+# 36| null
+#-----| -> throw ...;
+
+# 37| enter M2
+#-----| -> {...}
+
+# 37| exit M2
+
+# 37| exit M2 (abnormal)
+#-----| -> exit M2
+
+# 37| {...}
+#-----| -> null
+
+# 37| throw ...;
+#-----| exception(NullReferenceException) -> exit M2 (abnormal)
+
+# 37| null
+#-----| -> throw ...;
+
+# 6| enter get_P1
+#-----| -> null
+#-----| -> 0
+
+MultiImplementationB.cs:
+# 3| enter get_P1
+#-----| -> null
+#-----| -> 0
+
+# 3| 0
+#-----| -> exit get_P1 (normal)
+#-----| -> exit get_P1 (normal)
+
+MultiImplementationA.cs:
+# 6| exit get_P1
+
+MultiImplementationB.cs:
+# 3| exit get_P1
+
+MultiImplementationA.cs:
+# 6| exit get_P1 (abnormal)
+#-----| -> exit get_P1
+#-----| -> exit get_P1
+
+MultiImplementationB.cs:
+# 3| exit get_P1 (abnormal)
+#-----| -> exit get_P1
+#-----| -> exit get_P1
+
+MultiImplementationA.cs:
+# 6| exit get_P1 (normal)
+#-----| -> exit get_P1
+#-----| -> exit get_P1
+
+MultiImplementationB.cs:
+# 3| exit get_P1 (normal)
+#-----| -> exit get_P1
+#-----| -> exit get_P1
+
+MultiImplementationA.cs:
+# 7| enter get_P2
+#-----| -> {...}
+#-----| -> {...}
+
+MultiImplementationB.cs:
+# 4| enter get_P2
+#-----| -> {...}
+#-----| -> {...}
+
+MultiImplementationA.cs:
+# 7| exit get_P2
+
+MultiImplementationB.cs:
+# 4| exit get_P2
+
+MultiImplementationA.cs:
+# 7| exit get_P2 (abnormal)
+#-----| -> exit get_P2
+#-----| -> exit get_P2
+
+MultiImplementationB.cs:
+# 4| exit get_P2 (abnormal)
+#-----| -> exit get_P2
+#-----| -> exit get_P2
+
+MultiImplementationA.cs:
+# 7| exit get_P2 (normal)
+#-----| -> exit get_P2
+#-----| -> exit get_P2
+
+MultiImplementationB.cs:
+# 4| exit get_P2 (normal)
+#-----| -> exit get_P2
+#-----| -> exit get_P2
+
+# 4| {...}
+#-----| -> 1
+
+# 4| return ...;
+#-----| return -> exit get_P2 (normal)
+#-----| return -> exit get_P2 (normal)
+
+# 4| 1
+#-----| -> return ...;
+
+MultiImplementationA.cs:
+# 7| enter set_P2
+#-----| -> {...}
+#-----| -> {...}
+
+MultiImplementationB.cs:
+# 4| enter set_P2
+#-----| -> {...}
+#-----| -> {...}
+
+MultiImplementationA.cs:
+# 7| exit set_P2
+
+MultiImplementationB.cs:
+# 4| exit set_P2
+
+MultiImplementationA.cs:
+# 7| exit set_P2 (abnormal)
+#-----| -> exit set_P2
+#-----| -> exit set_P2
+
+MultiImplementationB.cs:
+# 4| exit set_P2 (abnormal)
+#-----| -> exit set_P2
+#-----| -> exit set_P2
+
+MultiImplementationA.cs:
+# 7| exit set_P2 (normal)
+#-----| -> exit set_P2
+#-----| -> exit set_P2
+
+MultiImplementationB.cs:
+# 4| exit set_P2 (normal)
+#-----| -> exit set_P2
+#-----| -> exit set_P2
+
+# 4| {...}
+#-----| -> exit set_P2 (normal)
+#-----| -> exit set_P2 (normal)
+
+MultiImplementationA.cs:
+# 8| enter M
+#-----| -> null
+#-----| -> 2
+
+MultiImplementationB.cs:
+# 5| enter M
+#-----| -> null
+#-----| -> 2
+
+MultiImplementationA.cs:
+# 8| exit M
+
+MultiImplementationB.cs:
+# 5| exit M
+
+MultiImplementationA.cs:
+# 8| exit M (abnormal)
+#-----| -> exit M
+#-----| -> exit M
+
+MultiImplementationB.cs:
+# 5| exit M (abnormal)
+#-----| -> exit M
+#-----| -> exit M
+
+MultiImplementationA.cs:
+# 8| exit M (normal)
+#-----| -> exit M
+#-----| -> exit M
+
+MultiImplementationB.cs:
+# 5| exit M (normal)
+#-----| -> exit M
+#-----| -> exit M
+
+# 5| 2
+#-----| -> exit M (normal)
+#-----| -> exit M (normal)
+
+# 11| ... = ...
+#-----| -> this access
+
+# 11| this access
+#-----| -> 1
+
+# 11| 1
+#-----| -> ... = ...
+
+MultiImplementationA.cs:
+# 14| enter get_Item
+#-----| -> access to parameter i
+#-----| -> null
+
+MultiImplementationB.cs:
+# 12| enter get_Item
+#-----| -> access to parameter i
+#-----| -> null
+
+# 12| throw ...
+#-----| exception(NullReferenceException) -> exit get_Item (abnormal)
+#-----| exception(NullReferenceException) -> exit get_Item (abnormal)
+
+MultiImplementationA.cs:
+# 14| exit get_Item
+
+MultiImplementationB.cs:
+# 12| exit get_Item
+
+MultiImplementationA.cs:
+# 14| exit get_Item (abnormal)
+#-----| -> exit get_Item
+#-----| -> exit get_Item
+
+MultiImplementationB.cs:
+# 12| exit get_Item (abnormal)
+#-----| -> exit get_Item
+#-----| -> exit get_Item
+
+MultiImplementationA.cs:
+# 14| exit get_Item (normal)
+#-----| -> exit get_Item
+#-----| -> exit get_Item
+
+MultiImplementationB.cs:
+# 12| exit get_Item (normal)
+#-----| -> exit get_Item
+#-----| -> exit get_Item
+
+# 12| null
+#-----| -> throw ...
+
+MultiImplementationA.cs:
+# 15| enter get_Item
+#-----| -> {...}
+#-----| -> {...}
+
+MultiImplementationB.cs:
+# 13| enter get_Item
+#-----| -> {...}
+#-----| -> {...}
+
+MultiImplementationA.cs:
+# 15| exit get_Item
+
+MultiImplementationB.cs:
+# 13| exit get_Item
+
+MultiImplementationA.cs:
+# 15| exit get_Item (abnormal)
+#-----| -> exit get_Item
+#-----| -> exit get_Item
+
+MultiImplementationB.cs:
+# 13| exit get_Item (abnormal)
+#-----| -> exit get_Item
+#-----| -> exit get_Item
+
+MultiImplementationA.cs:
+# 15| exit get_Item (normal)
+#-----| -> exit get_Item
+#-----| -> exit get_Item
+
+MultiImplementationB.cs:
+# 13| exit get_Item (normal)
+#-----| -> exit get_Item
+#-----| -> exit get_Item
+
+# 13| {...}
+#-----| -> null
+
+# 13| throw ...;
+#-----| exception(NullReferenceException) -> exit get_Item (abnormal)
+#-----| exception(NullReferenceException) -> exit get_Item (abnormal)
+
+# 13| null
+#-----| -> throw ...;
+
+MultiImplementationA.cs:
+# 15| enter set_Item
+#-----| -> {...}
+#-----| -> {...}
+
+MultiImplementationB.cs:
+# 13| enter set_Item
+#-----| -> {...}
+#-----| -> {...}
+
+MultiImplementationA.cs:
+# 15| exit set_Item
+
+MultiImplementationB.cs:
+# 13| exit set_Item
+
+MultiImplementationA.cs:
+# 15| exit set_Item (normal)
+#-----| -> exit set_Item
+#-----| -> exit set_Item
+
+MultiImplementationB.cs:
+# 13| exit set_Item (normal)
+#-----| -> exit set_Item
+#-----| -> exit set_Item
+
+# 13| {...}
+#-----| -> exit set_Item (normal)
+#-----| -> exit set_Item (normal)
+
+MultiImplementationA.cs:
+# 16| enter M1
+#-----| -> {...}
+#-----| -> {...}
+
+MultiImplementationB.cs:
+# 14| enter M1
+#-----| -> {...}
+#-----| -> {...}
+
+MultiImplementationA.cs:
+# 16| exit M1
+
+MultiImplementationB.cs:
+# 14| exit M1
+
+MultiImplementationA.cs:
+# 16| exit M1 (normal)
+#-----| -> exit M1
+#-----| -> exit M1
+
+MultiImplementationB.cs:
+# 14| exit M1 (normal)
+#-----| -> exit M1
+#-----| -> exit M1
+
+# 15| {...}
+#-----| -> M2(...)
+
+# 16| enter M2
+#-----| -> null
+
+# 16| M2(...)
+#-----| -> exit M1 (normal)
+#-----| -> exit M1 (normal)
+
+# 16| exit M2
+
+# 16| exit M2 (abnormal)
+#-----| -> exit M2
+
+# 16| throw ...
+#-----| exception(NullReferenceException) -> exit M2 (abnormal)
+
+# 16| null
+#-----| -> throw ...
+
+MultiImplementationA.cs:
+# 20| enter C2
+#-----| -> call to constructor Object
+#-----| -> call to constructor Object
+
+MultiImplementationB.cs:
+# 18| enter C2
+#-----| -> call to constructor Object
+#-----| -> call to constructor Object
+
+# 18| call to constructor Object
+#-----| -> this access
+
+MultiImplementationA.cs:
+# 20| exit C2
+
+MultiImplementationB.cs:
+# 18| exit C2
+
+MultiImplementationA.cs:
+# 20| exit C2 (abnormal)
+#-----| -> exit C2
+#-----| -> exit C2
+
+MultiImplementationB.cs:
+# 18| exit C2 (abnormal)
+#-----| -> exit C2
+#-----| -> exit C2
+
+MultiImplementationA.cs:
+# 20| exit C2 (normal)
+#-----| -> exit C2
+#-----| -> exit C2
+
+MultiImplementationB.cs:
+# 18| exit C2 (normal)
+#-----| -> exit C2
+#-----| -> exit C2
+
+# 18| {...}
+#-----| -> null
+
+# 18| throw ...;
+#-----| exception(NullReferenceException) -> exit C2 (abnormal)
+#-----| exception(NullReferenceException) -> exit C2 (abnormal)
+
+# 18| null
+#-----| -> throw ...;
+
+MultiImplementationA.cs:
+# 21| enter C2
+#-----| -> 0
+#-----| -> 1
+
+MultiImplementationB.cs:
+# 19| enter C2
+#-----| -> 0
+#-----| -> 1
+
+MultiImplementationA.cs:
+# 21| exit C2
+
+MultiImplementationB.cs:
+# 19| exit C2
+
+MultiImplementationA.cs:
+# 21| exit C2 (normal)
+#-----| -> exit C2
+#-----| -> exit C2
+
+MultiImplementationB.cs:
+# 19| exit C2 (normal)
+#-----| -> exit C2
+#-----| -> exit C2
+
+# 19| call to constructor C2
+#-----| -> {...}
+
+# 19| 1
+#-----| -> call to constructor C2
+
+# 19| {...}
+#-----| -> exit C2 (normal)
+#-----| -> exit C2 (normal)
+
+MultiImplementationA.cs:
+# 22| enter ~C2
+#-----| -> {...}
+#-----| -> {...}
+
+MultiImplementationB.cs:
+# 20| enter ~C2
+#-----| -> {...}
+#-----| -> {...}
+
+MultiImplementationA.cs:
+# 22| exit ~C2
+
+MultiImplementationB.cs:
+# 20| exit ~C2
+
+MultiImplementationA.cs:
+# 22| exit ~C2 (abnormal)
+#-----| -> exit ~C2
+#-----| -> exit ~C2
+
+MultiImplementationB.cs:
+# 20| exit ~C2 (abnormal)
+#-----| -> exit ~C2
+#-----| -> exit ~C2
+
+MultiImplementationA.cs:
+# 22| exit ~C2 (normal)
+#-----| -> exit ~C2
+#-----| -> exit ~C2
+
+MultiImplementationB.cs:
+# 20| exit ~C2 (normal)
+#-----| -> exit ~C2
+#-----| -> exit ~C2
+
+# 20| {...}
+#-----| -> null
+
+# 20| throw ...;
+#-----| exception(NullReferenceException) -> exit ~C2 (abnormal)
+#-----| exception(NullReferenceException) -> exit ~C2 (abnormal)
+
+# 20| null
+#-----| -> throw ...;
+
+MultiImplementationA.cs:
+# 23| enter implicit conversion
+#-----| -> null
+#-----| -> null
+
+MultiImplementationB.cs:
+# 21| enter implicit conversion
+#-----| -> null
+#-----| -> null
+
+MultiImplementationA.cs:
+# 23| exit implicit conversion
+
+MultiImplementationB.cs:
+# 21| exit implicit conversion
+
+MultiImplementationA.cs:
+# 23| exit implicit conversion (abnormal)
+#-----| -> exit implicit conversion
+#-----| -> exit implicit conversion
+
+MultiImplementationB.cs:
+# 21| exit implicit conversion (abnormal)
+#-----| -> exit implicit conversion
+#-----| -> exit implicit conversion
+
+MultiImplementationA.cs:
+# 23| exit implicit conversion (normal)
+#-----| -> exit implicit conversion
+#-----| -> exit implicit conversion
+
+MultiImplementationB.cs:
+# 21| exit implicit conversion (normal)
+#-----| -> exit implicit conversion
+#-----| -> exit implicit conversion
+
+# 21| throw ...
+#-----| exception(NullReferenceException) -> exit implicit conversion (abnormal)
+#-----| exception(NullReferenceException) -> exit implicit conversion (abnormal)
+
+# 21| null
+#-----| -> throw ...
+
+# 22| access to property P
+#-----| -> ... = ...
+
+# 22| this access
+#-----| -> 1
+
+# 22| ... = ...
+#-----| -> {...}
+
+# 22| 1
+#-----| -> access to property P
+
+MultiImplementationA.cs:
+# 30| enter get_P3
+#-----| -> null
+
+MultiImplementationB.cs:
+# 27| enter get_P3
+#-----| -> null
+
+MultiImplementationA.cs:
+# 30| exit get_P3
+
+MultiImplementationB.cs:
+# 27| exit get_P3
+
+MultiImplementationA.cs:
+# 30| exit get_P3 (abnormal)
+#-----| -> exit get_P3
+#-----| -> exit get_P3
+
+MultiImplementationB.cs:
+# 27| exit get_P3 (abnormal)
+#-----| -> exit get_P3
+#-----| -> exit get_P3
+
+MultiImplementationA.cs:
+# 36| enter M1
+#-----| -> {...}
+#-----| -> 0
+
+MultiImplementationB.cs:
+# 32| enter M1
+#-----| -> {...}
+#-----| -> 0
+
+MultiImplementationA.cs:
+# 36| exit M1
+
+MultiImplementationB.cs:
+# 32| exit M1
+
+MultiImplementationA.cs:
+# 36| exit M1 (abnormal)
+#-----| -> exit M1
+#-----| -> exit M1
+
+MultiImplementationB.cs:
+# 32| exit M1 (abnormal)
+#-----| -> exit M1
+#-----| -> exit M1
+
+MultiImplementationA.cs:
+# 36| exit M1 (normal)
+#-----| -> exit M1
+#-----| -> exit M1
+
+MultiImplementationB.cs:
+# 32| exit M1 (normal)
+#-----| -> exit M1
+#-----| -> exit M1
+
+# 32| 0
+#-----| -> exit M1 (normal)
+#-----| -> exit M1 (normal)
+
+NullCoalescing.cs:
+# 3| enter M1
+#-----| -> access to parameter i
+
+# 3| exit M1
+
+# 3| exit M1 (normal)
+#-----| -> exit M1
+
+# 3| ... ?? ...
+#-----| -> exit M1 (normal)
+
+# 3| access to parameter i
+#-----| non-null -> ... ?? ...
+#-----| null -> 0
+
+# 3| 0
+#-----| -> ... ?? ...
+
+# 5| enter M2
+#-----| -> access to parameter b
+
+# 5| exit M2
+
+# 5| exit M2 (normal)
+#-----| -> exit M2
+
+# 5| ... ? ... : ...
+#-----| -> exit M2 (normal)
+
+# 5| [false] ... ?? ...
+#-----| false -> 1
+
+# 5| [true] ... ?? ...
+#-----| true -> 0
+
+# 5| access to parameter b
+#-----| false -> [false] ... ?? ...
+#-----| true -> [true] ... ?? ...
+#-----| null -> false
+
+# 5| false
+#-----| false -> [false] ... ?? ...
+
+# 5| 0
+#-----| -> ... ? ... : ...
+
+# 5| 1
+#-----| -> ... ? ... : ...
+
+# 7| enter M3
+#-----| -> access to parameter s1
+
+# 7| exit M3
+
+# 7| exit M3 (normal)
+#-----| -> exit M3
+
+# 7| ... ?? ...
+#-----| -> exit M3 (normal)
+
+# 7| access to parameter s1
+#-----| non-null -> ... ?? ...
+#-----| null -> access to parameter s2
+
+# 7| ... ?? ...
+#-----| -> ... ?? ...
+
+# 7| access to parameter s2
+#-----| non-null -> ... ?? ...
+#-----| null -> ""
+
+# 7| ""
+#-----| -> ... ?? ...
+
+# 9| enter M4
+#-----| -> access to parameter b
+
+# 9| exit M4
+
+# 9| exit M4 (normal)
+#-----| -> exit M4
+
+# 9| ... ?? ...
+#-----| -> exit M4 (normal)
+
+# 9| [non-null] ... ? ... : ...
+#-----| non-null -> ... ?? ...
+
+# 9| [null] ... ? ... : ...
+#-----| null -> ""
+
+# 9| access to parameter b
+#-----| true -> access to parameter s
+#-----| false -> access to parameter s
+
+# 9| access to parameter s
+#-----| non-null -> [non-null] ... ? ... : ...
+#-----| null -> [null] ... ? ... : ...
+
+# 9| access to parameter s
+#-----| non-null -> [non-null] ... ? ... : ...
+#-----| null -> [null] ... ? ... : ...
+
+# 9| ... ?? ...
+#-----| -> ... ?? ...
+
+# 9| ""
+#-----| non-null -> ... ?? ...
+
+# 11| enter M5
+#-----| -> access to parameter b1
+
+# 11| exit M5
+
+# 11| exit M5 (normal)
+#-----| -> exit M5
+
+# 11| ... ? ... : ...
+#-----| -> exit M5 (normal)
+
+# 11| [false] ... ?? ...
+#-----| false -> 1
+
+# 11| [true] ... ?? ...
+#-----| true -> 0
+
+# 11| access to parameter b1
+#-----| false -> [false] ... ?? ...
+#-----| true -> [true] ... ?? ...
+#-----| null -> access to parameter b2
+
+# 11| [false] ... && ...
+#-----| false -> [false] ... ?? ...
+
+# 11| [true] ... && ...
+#-----| true -> [true] ... ?? ...
+
+# 11| access to parameter b2
+#-----| false -> [false] ... && ...
+#-----| true -> access to parameter b3
+
+# 11| access to parameter b3
+#-----| false -> [false] ... && ...
+#-----| true -> [true] ... && ...
+
+# 11| 0
+#-----| -> ... ? ... : ...
+
+# 11| 1
+#-----| -> ... ? ... : ...
+
+# 13| enter M6
+#-----| -> {...}
+
+# 13| exit M6
+
+# 13| exit M6 (normal)
+#-----| -> exit M6
+
+# 14| {...}
+#-----| -> ... ...;
+
+# 15| ... ...;
+#-----| -> null
+
+# 15| Int32 j = ...
+#-----| -> ... ...;
+
+# 15| ... ?? ...
+#-----| -> Int32 j = ...
+
+# 15| (...) ...
+#-----| null -> 0
+
+# 15| null
+#-----| -> (...) ...
+
+# 15| 0
+#-----| -> ... ?? ...
+
+# 16| ... ...;
+#-----| -> ""
+
+# 16| String s = ...
+#-----| -> ...;
+
+# 16| ... ?? ...
+#-----| -> String s = ...
+
+# 16| ""
+#-----| non-null -> ... ?? ...
+
+# 17| ...;
+#-----| -> access to parameter i
+
+# 17| ... = ...
+#-----| -> exit M6 (normal)
+
+# 17| ... ?? ...
+#-----| -> ... = ...
+
+# 17| (...) ...
+#-----| non-null -> ... ?? ...
+
+# 17| access to parameter i
+#-----| -> (...) ...
+
+PartialImplementationA.cs:
+# 3| enter Partial
+#-----| -> call to constructor Object
+
+# 3| call to constructor Object
+#-----| -> this access
+
+# 3| exit Partial
+
+# 3| exit Partial (normal)
+#-----| -> exit Partial
+
+# 3| {...}
+#-----| -> exit Partial (normal)
+
+PartialImplementationB.cs:
+# 3| ... = ...
+#-----| -> this access
+
+# 3| ... = ...
+#-----| -> this access
+
+# 3| this access
+#-----| -> 0
+
+# 3| this access
+#-----| -> 0
+
+# 3| 0
+#-----| -> ... = ...
+
+# 3| 0
+#-----| -> ... = ...
+
+# 4| enter Partial
+#-----| -> call to constructor Object
+
+# 4| call to constructor Object
+#-----| -> this access
+
+# 4| exit Partial
+
+# 4| exit Partial (normal)
+#-----| -> exit Partial
+
+# 4| {...}
+#-----| -> exit Partial (normal)
+
+# 5| access to property P
+#-----| -> ... = ...
+
+# 5| access to property P
+#-----| -> ... = ...
+
+# 5| this access
+#-----| -> 0
+
+# 5| this access
+#-----| -> 0
+
+# 5| ... = ...
+#-----| -> {...}
+
+# 5| ... = ...
+#-----| -> {...}
+
+# 5| 0
+#-----| -> access to property P
+
+# 5| 0
+#-----| -> access to property P
+
+Patterns.cs:
+# 5| enter M1
+#-----| -> {...}
+
+# 5| exit M1
+
+# 5| exit M1 (normal)
+#-----| -> exit M1
+
+# 6| {...}
+#-----| -> ... ...;
+
+# 7| ... ...;
+#-----| -> null
+
+# 7| Object o = ...
+#-----| -> if (...) ...
+
+# 7| null
+#-----| -> Object o = ...
+
+# 8| if (...) ...
+#-----| -> access to local variable o
+
+# 8| [false] ... is ...
+#-----| false -> if (...) ...
+
+# 8| [true] ... is ...
+#-----| true -> {...}
+
+# 8| access to local variable o
+#-----| -> Int32 i1
+
+# 8| Int32 i1
+#-----| no-match -> [false] ... is ...
+#-----| match -> [true] ... is ...
+
+# 9| {...}
+#-----| -> ...;
+
+# 10| ...;
+#-----| -> "int "
+
+# 10| call to method WriteLine
+#-----| -> switch (...) {...}
+
+# 10| $"..."
+#-----| -> call to method WriteLine
+
+# 10| "int "
+#-----| -> access to local variable i1
+
+# 10| access to local variable i1
+#-----| -> $"..."
+
+# 12| if (...) ...
+#-----| -> access to local variable o
+
+# 12| [false] ... is ...
+#-----| false -> if (...) ...
+
+# 12| [true] ... is ...
+#-----| true -> {...}
+
+# 12| access to local variable o
+#-----| -> String s1
+
+# 12| String s1
+#-----| no-match -> [false] ... is ...
+#-----| match -> [true] ... is ...
+
+# 13| {...}
+#-----| -> ...;
+
+# 14| ...;
+#-----| -> "string "
+
+# 14| call to method WriteLine
+#-----| -> switch (...) {...}
+
+# 14| $"..."
+#-----| -> call to method WriteLine
+
+# 14| "string "
+#-----| -> access to local variable s1
+
+# 14| access to local variable s1
+#-----| -> $"..."
+
+# 16| if (...) ...
+#-----| -> access to local variable o
+
+# 16| [false] ... is ...
+#-----| false -> switch (...) {...}
+
+# 16| [true] ... is ...
+#-----| true -> {...}
+
+# 16| access to local variable o
+#-----| -> Object v1
+
+# 16| Object v1
+#-----| no-match -> [false] ... is ...
+#-----| match -> [true] ... is ...
+
+# 17| {...}
+#-----| -> switch (...) {...}
+
+# 20| switch (...) {...}
+#-----| -> access to local variable o
+
+# 20| access to local variable o
+#-----| -> case ...:
+
+# 22| case ...:
+#-----| -> "xyz"
+
+# 22| "xyz"
+#-----| match -> break;
+#-----| no-match -> case ...:
+
+# 23| break;
+#-----| break -> switch (...) {...}
+
+# 24| case ...:
+#-----| -> Int32 i2
+
+# 24| Int32 i2
+#-----| no-match -> case ...:
+#-----| match -> access to local variable i2
+
+# 24| ... > ...
+#-----| true -> ...;
+#-----| false -> case ...:
+
+# 24| access to local variable i2
+#-----| -> 0
+
+# 24| 0
+#-----| -> ... > ...
+
+# 25| ...;
+#-----| -> "positive "
+
+# 25| call to method WriteLine
+#-----| -> break;
+
+# 25| $"..."
+#-----| -> call to method WriteLine
+
+# 25| "positive "
+#-----| -> access to local variable i2
+
+# 25| access to local variable i2
+#-----| -> $"..."
+
+# 26| break;
+#-----| break -> switch (...) {...}
+
+# 27| case ...:
+#-----| -> Int32 i3
+
+# 27| Int32 i3
+#-----| match -> ...;
+#-----| no-match -> case ...:
+
+# 28| ...;
+#-----| -> "int "
+
+# 28| call to method WriteLine
+#-----| -> break;
+
+# 28| $"..."
+#-----| -> call to method WriteLine
+
+# 28| "int "
+#-----| -> access to local variable i3
+
+# 28| access to local variable i3
+#-----| -> $"..."
+
+# 29| break;
+#-----| break -> switch (...) {...}
+
+# 30| case ...:
+#-----| -> String s2
+
+# 30| String s2
+#-----| match -> ...;
+#-----| no-match -> case ...:
+
+# 31| ...;
+#-----| -> "string "
+
+# 31| call to method WriteLine
+#-----| -> break;
+
+# 31| $"..."
+#-----| -> call to method WriteLine
+
+# 31| "string "
+#-----| -> access to local variable s2
+
+# 31| access to local variable s2
+#-----| -> $"..."
+
+# 32| break;
+#-----| break -> switch (...) {...}
+
+# 33| case ...:
+#-----| -> Object v2
+
+# 33| Object v2
+#-----| match -> break;
+#-----| no-match -> default:
+
+# 34| break;
+#-----| break -> switch (...) {...}
+
+# 35| default:
+#-----| -> ...;
+
+# 36| ...;
+#-----| -> "Something else"
+
+# 36| call to method WriteLine
+#-----| -> break;
+
+# 36| "Something else"
+#-----| -> call to method WriteLine
+
+# 37| break;
+#-----| break -> switch (...) {...}
+
+# 40| switch (...) {...}
+#-----| -> access to local variable o
+
+# 40| access to local variable o
+#-----| -> exit M1 (normal)
+
+# 47| enter M2
+#-----| -> access to parameter c
+
+# 47| exit M2
+
+# 47| exit M2 (normal)
+#-----| -> exit M2
+
+# 48| ... is ...
+#-----| -> exit M2 (normal)
+
+# 48| access to parameter c
+#-----| -> a
+
+# 48| not ...
+#-----| -> ... is ...
+
+# 48| a
+#-----| -> not ...
+
+# 50| enter M3
+#-----| -> access to parameter c
+
+# 50| exit M3
+
+# 50| exit M3 (normal)
+#-----| -> exit M3
+
+# 51| ... ? ... : ...
+#-----| -> exit M3 (normal)
+
+# 51| [false] ... is ...
+#-----| false -> access to parameter c
+
+# 51| [true] ... is ...
+#-----| true -> access to parameter c
+
+# 51| access to parameter c
+#-----| -> null
+
+# 51| [no-match] not ...
+#-----| no-match -> [false] ... is ...
+
+# 51| [match] not ...
+#-----| match -> [true] ... is ...
+
+# 51| null
+#-----| match -> [no-match] not ...
+#-----| no-match -> [match] not ...
+
+# 51| ... is ...
+#-----| -> ... ? ... : ...
+
+# 51| access to parameter c
+#-----| -> 1
+
+# 51| 1
+#-----| -> ... is ...
+
+# 51| ... is ...
+#-----| -> ... ? ... : ...
+
+# 51| access to parameter c
+#-----| -> 2
+
+# 51| 2
+#-----| -> ... is ...
+
+# 53| enter M4
+#-----| -> access to parameter c
+
+# 53| exit M4
+
+# 53| exit M4 (normal)
+#-----| -> exit M4
+
+# 54| ... is ...
+#-----| -> exit M4 (normal)
+
+# 54| access to parameter c
+#-----| -> Patterns u
+
+# 54| not ...
+#-----| -> ... is ...
+
+# 54| { ... }
+#-----| -> not ...
+
+# 54| Patterns u
+#-----| no-match -> { ... }
+#-----| match -> 1
+
+# 54| [no-match] { ... }
+#-----| no-match -> { ... }
+
+# 54| [match] { ... }
+#-----| match -> { ... }
+
+# 54| 1
+#-----| no-match -> [no-match] { ... }
+#-----| match -> [match] { ... }
+
+# 56| enter M5
+#-----| -> {...}
+
+# 56| exit M5
+
+# 56| exit M5 (normal)
+#-----| -> exit M5
+
+# 57| {...}
+#-----| -> access to parameter i
+
+# 58| return ...;
+#-----| return -> exit M5 (normal)
+
+# 58| ... switch { ... }
+#-----| -> return ...;
+
+# 58| access to parameter i
+#-----| -> 1
+
+# 60| ... => ...
+#-----| -> ... switch { ... }
+
+# 60| [no-match] not ...
+#-----| no-match -> _
+
+# 60| [match] not ...
+#-----| match -> "not 1"
+
+# 60| 1
+#-----| match -> [no-match] not ...
+#-----| no-match -> [match] not ...
+
+# 60| "not 1"
+#-----| -> ... => ...
+
+# 61| ... => ...
+#-----| -> ... switch { ... }
+
+# 61| _
+#-----| match -> "other"
+
+# 61| "other"
+#-----| -> ... => ...
+
+# 65| enter M6
+#-----| -> {...}
+
+# 65| exit M6
+
+# 65| exit M6 (normal)
+#-----| -> exit M6
+
+# 66| {...}
+#-----| -> 2
+
+# 67| return ...;
+#-----| return -> exit M6 (normal)
+
+# 67| ... switch { ... }
+#-----| -> return ...;
+
+# 67| 2
+#-----| -> 2
+
+# 69| [no-match] not ...
+#-----| no-match -> 2
+
+# 69| 2
+#-----| match -> [no-match] not ...
+
+# 70| ... => ...
+#-----| -> ... switch { ... }
+
+# 70| 2
+#-----| match -> "possible"
+
+# 70| "possible"
+#-----| -> ... => ...
+
+# 74| enter M7
+#-----| -> {...}
+
+# 74| exit M7
+
+# 74| exit M7 (normal)
+#-----| -> exit M7
+
+# 75| {...}
+#-----| -> access to parameter i
+
+# 76| return ...;
+#-----| return -> exit M7 (normal)
+
+# 76| ... switch { ... }
+#-----| -> return ...;
+
+# 76| access to parameter i
+#-----| -> 1
+
+# 78| ... => ...
+#-----| -> ... switch { ... }
+
+# 78| > ...
+#-----| match -> "> 1"
+#-----| no-match -> 0
+
+# 78| 1
+#-----| -> > ...
+
+# 78| "> 1"
+#-----| -> ... => ...
+
+# 79| ... => ...
+#-----| -> ... switch { ... }
+
+# 79| < ...
+#-----| match -> "< 0"
+#-----| no-match -> 1
+
+# 79| 0
+#-----| -> < ...
+
+# 79| "< 0"
+#-----| -> ... => ...
+
+# 80| ... => ...
+#-----| -> ... switch { ... }
+
+# 80| 1
+#-----| match -> "1"
+#-----| no-match -> _
+
+# 80| "1"
+#-----| -> ... => ...
+
+# 81| ... => ...
+#-----| -> ... switch { ... }
+
+# 81| _
+#-----| match -> "0"
+
+# 81| "0"
+#-----| -> ... => ...
+
+# 85| enter M8
+#-----| -> access to parameter i
+
+# 85| exit M8
+
+# 85| exit M8 (normal)
+#-----| -> exit M8
+
+# 85| ... ? ... : ...
+#-----| -> exit M8 (normal)
+
+# 85| [false] ... is ...
+#-----| false -> "2"
+
+# 85| [true] ... is ...
+#-----| true -> "not 2"
+
+# 85| access to parameter i
+#-----| -> 1
+
+# 85| [no-match] ... or ...
+#-----| no-match -> [false] ... is ...
+
+# 85| [match] ... or ...
+#-----| match -> [true] ... is ...
+
+# 85| 1
+#-----| match -> [match] ... or ...
+#-----| no-match -> 2
+
+# 85| [no-match] not ...
+#-----| no-match -> [no-match] ... or ...
+
+# 85| [match] not ...
+#-----| match -> [match] ... or ...
+
+# 85| 2
+#-----| match -> [no-match] not ...
+#-----| no-match -> [match] not ...
+
+# 85| "not 2"
+#-----| -> ... ? ... : ...
+
+# 85| "2"
+#-----| -> ... ? ... : ...
+
+# 87| enter M9
+#-----| -> access to parameter i
+
+# 87| exit M9
+
+# 87| exit M9 (normal)
+#-----| -> exit M9
+
+# 87| ... ? ... : ...
+#-----| -> exit M9 (normal)
+
+# 87| [false] ... is ...
+#-----| false -> "not 1"
+
+# 87| [true] ... is ...
+#-----| true -> "1"
+
+# 87| access to parameter i
+#-----| -> 1
+
+# 87| [no-match] ... and ...
+#-----| no-match -> [false] ... is ...
+
+# 87| [match] ... and ...
+#-----| match -> [true] ... is ...
+
+# 87| 1
+#-----| no-match -> [no-match] ... and ...
+#-----| match -> 2
+
+# 87| [no-match] not ...
+#-----| no-match -> [no-match] ... and ...
+
+# 87| [match] not ...
+#-----| match -> [match] ... and ...
+
+# 87| 2
+#-----| match -> [no-match] not ...
+#-----| no-match -> [match] not ...
+
+# 87| "1"
+#-----| -> ... ? ... : ...
+
+# 87| "not 1"
+#-----| -> ... ? ... : ...
+
+# 93| enter M10
+#-----| -> {...}
+
+# 93| exit M10
+
+# 93| exit M10 (normal)
+#-----| -> exit M10
+
+# 94| {...}
+#-----| -> if (...) ...
+
+# 95| if (...) ...
+#-----| -> this access
+
+# 95| [false] ... is ...
+#-----| false -> exit M10 (normal)
+
+# 95| [true] ... is ...
+#-----| true -> {...}
+
+# 95| this access
+#-----| -> access to constant A
+
+# 95| [no-match] { ... }
+#-----| no-match -> [false] ... is ...
+
+# 95| [match] { ... }
+#-----| match -> [true] ... is ...
+
+# 95| [no-match] { ... }
+#-----| no-match -> [no-match] { ... }
+
+# 95| [match] { ... }
+#-----| match -> [match] { ... }
+
+# 95| [no-match] ... or ...
+#-----| no-match -> [no-match] { ... }
+
+# 95| [match] ... or ...
+#-----| match -> [match] { ... }
+
+# 95| access to constant A
+#-----| match -> [match] ... or ...
+#-----| no-match -> access to constant B
+
+# 95| access to constant B
+#-----| no-match -> [no-match] ... or ...
+#-----| match -> [match] ... or ...
+
+# 96| {...}
+#-----| -> ...;
+
+# 97| ...;
+#-----| -> "not C"
+
+# 97| call to method WriteLine
+#-----| -> exit M10 (normal)
+
+# 97| "not C"
+#-----| -> call to method WriteLine
+
+PostDominance.cs:
+# 5| enter M1
+#-----| -> {...}
+
+# 5| exit M1
+
+# 5| exit M1 (normal)
+#-----| -> exit M1
+
+# 6| {...}
+#-----| -> ...;
+
+# 7| ...;
+#-----| -> access to parameter s
+
+# 7| call to method WriteLine
+#-----| -> exit M1 (normal)
+
+# 7| access to parameter s
+#-----| -> call to method WriteLine
+
+# 10| enter M2
+#-----| -> {...}
+
+# 10| exit M2
+
+# 10| exit M2 (normal)
+#-----| -> exit M2
+
+# 11| {...}
+#-----| -> if (...) ...
+
+# 12| if (...) ...
+#-----| -> access to parameter s
+
+# 12| [false] ... is ...
+#-----| false -> ...;
+
+# 12| [true] ... is ...
+#-----| true -> return ...;
+
+# 12| access to parameter s
+#-----| -> null
+
+# 12| null
+#-----| no-match -> [false] ... is ...
+#-----| match -> [true] ... is ...
+
+# 13| return ...;
+#-----| return -> exit M2 (normal)
+
+# 14| ...;
+#-----| -> access to parameter s
+
+# 14| call to method WriteLine
+#-----| -> exit M2 (normal)
+
+# 14| access to parameter s
+#-----| -> call to method WriteLine
+
+# 17| enter M3
+#-----| -> {...}
+
+# 17| exit M3
+
+# 17| exit M3 (abnormal)
+#-----| -> exit M3
+
+# 17| exit M3 (normal)
+#-----| -> exit M3
+
+# 18| {...}
+#-----| -> if (...) ...
+
+# 19| if (...) ...
+#-----| -> access to parameter s
+
+# 19| [false] ... is ...
+#-----| false -> ...;
+
+# 19| [true] ... is ...
+#-----| true -> nameof(...)
+
+# 19| access to parameter s
+#-----| -> null
+
+# 19| null
+#-----| no-match -> [false] ... is ...
+#-----| match -> [true] ... is ...
+
+# 20| throw ...;
+#-----| exception(ArgumentNullException) -> exit M3 (abnormal)
+
+# 20| object creation of type ArgumentNullException
+#-----| -> throw ...;
+
+# 20| nameof(...)
+#-----| -> object creation of type ArgumentNullException
+
+# 21| ...;
+#-----| -> access to parameter s
+
+# 21| call to method WriteLine
+#-----| -> exit M3 (normal)
+
+# 21| access to parameter s
+#-----| -> call to method WriteLine
+
+Qualifiers.cs:
+# 7| enter Method
+#-----| -> null
+
+# 7| exit Method
+
+# 7| exit Method (normal)
+#-----| -> exit Method
+
+# 7| null
+#-----| -> exit Method (normal)
+
+# 8| enter StaticMethod
+#-----| -> null
+
+# 8| exit StaticMethod
+
+# 8| exit StaticMethod (normal)
+#-----| -> exit StaticMethod
+
+# 8| null
+#-----| -> exit StaticMethod (normal)
+
+# 10| enter M
+#-----| -> {...}
+
+# 10| exit M
+
+# 10| exit M (normal)
+#-----| -> exit M
+
+# 11| {...}
+#-----| -> ... ...;
+
+# 12| ... ...;
+#-----| -> this access
+
+# 12| Qualifiers q = ...
+#-----| -> ...;
+
+# 12| access to field Field
+#-----| -> Qualifiers q = ...
+
+# 12| this access
+#-----| -> access to field Field
+
+# 13| ...;
+#-----| -> this access
+
+# 13| ... = ...
+#-----| -> ...;
+
+# 13| access to property Property
+#-----| -> ... = ...
+
+# 13| this access
+#-----| -> access to property Property
+
+# 14| ...;
+#-----| -> this access
+
+# 14| ... = ...
+#-----| -> ...;
+
+# 14| call to method Method
+#-----| -> ... = ...
+
+# 14| this access
+#-----| -> call to method Method
+
+# 16| ...;
+#-----| -> this access
+
+# 16| ... = ...
+#-----| -> ...;
+
+# 16| access to field Field
+#-----| -> ... = ...
+
+# 16| this access
+#-----| -> access to field Field
+
+# 17| ...;
+#-----| -> this access
+
+# 17| ... = ...
+#-----| -> ...;
+
+# 17| access to property Property
+#-----| -> ... = ...
+
+# 17| this access
+#-----| -> access to property Property
+
+# 18| ...;
+#-----| -> this access
+
+# 18| ... = ...
+#-----| -> ...;
+
+# 18| call to method Method
+#-----| -> ... = ...
+
+# 18| this access
+#-----| -> call to method Method
+
+# 20| ...;
+#-----| -> access to field StaticField
+
+# 20| ... = ...
+#-----| -> ...;
+
+# 20| access to field StaticField
+#-----| -> ... = ...
+
+# 21| ...;
+#-----| -> access to property StaticProperty
+
+# 21| ... = ...
+#-----| -> ...;
+
+# 21| access to property StaticProperty
+#-----| -> ... = ...
+
+# 22| ...;
+#-----| -> call to method StaticMethod
+
+# 22| ... = ...
+#-----| -> ...;
+
+# 22| call to method StaticMethod
+#-----| -> ... = ...
+
+# 24| ...;
+#-----| -> access to field StaticField
+
+# 24| ... = ...
+#-----| -> ...;
+
+# 24| access to field StaticField
+#-----| -> ... = ...
+
+# 25| ...;
+#-----| -> access to property StaticProperty
+
+# 25| ... = ...
+#-----| -> ...;
+
+# 25| access to property StaticProperty
+#-----| -> ... = ...
+
+# 26| ...;
+#-----| -> call to method StaticMethod
+
+# 26| ... = ...
+#-----| -> ...;
+
+# 26| call to method StaticMethod
+#-----| -> ... = ...
+
+# 28| ...;
+#-----| -> access to field StaticField
+
+# 28| ... = ...
+#-----| -> ...;
+
+# 28| access to field Field
+#-----| -> ... = ...
+
+# 28| access to field StaticField
+#-----| -> access to field Field
+
+# 29| ...;
+#-----| -> access to property StaticProperty
+
+# 29| ... = ...
+#-----| -> ...;
+
+# 29| access to property Property
+#-----| -> ... = ...
+
+# 29| access to property StaticProperty
+#-----| -> access to property Property
+
+# 30| ...;
+#-----| -> call to method StaticMethod
+
+# 30| ... = ...
+#-----| -> exit M (normal)
+
+# 30| call to method Method
+#-----| -> ... = ...
+
+# 30| call to method StaticMethod
+#-----| -> call to method Method
+
+Switch.cs:
+# 5| enter M1
+#-----| -> {...}
+
+# 5| exit M1
+
+# 5| exit M1 (normal)
+#-----| -> exit M1
+
+# 6| {...}
+#-----| -> switch (...) {...}
+
+# 7| switch (...) {...}
+#-----| -> access to parameter o
+
+# 7| access to parameter o
+#-----| -> exit M1 (normal)
+
+# 10| enter M2
+#-----| -> {...}
+
+# 10| exit M2
+
+# 10| exit M2 (abnormal)
+#-----| -> exit M2
+
+# 10| exit M2 (normal)
+#-----| -> exit M2
+
+# 11| {...}
+#-----| -> switch (...) {...}
+
+# 12| switch (...) {...}
+#-----| -> access to parameter o
+
+# 12| access to parameter o
+#-----| -> case ...:
+
+# 14| case ...:
+#-----| -> "a"
+
+# 14| "a"
+#-----| match -> return ...;
+#-----| no-match -> case ...:
+
+# 15| return ...;
+#-----| return -> exit M2 (normal)
+
+# 16| case ...:
+#-----| -> 0
+
+# 16| 0
+#-----| match -> object creation of type Exception
+#-----| no-match -> case ...:
+
+# 17| throw ...;
+#-----| exception(Exception) -> exit M2 (abnormal)
+
+# 17| object creation of type Exception
+#-----| -> throw ...;
+
+# 18| case ...:
+#-----| -> null
+
+# 18| null
+#-----| match -> goto default;
+#-----| no-match -> case ...:
+
+# 19| goto default;
+#-----| goto(default) -> default:
+
+# 20| case ...:
+#-----| -> Int32 i
+
+# 20| Int32 i
+#-----| match -> if (...) ...
+#-----| no-match -> case ...:
+
+# 21| if (...) ...
+#-----| -> access to parameter o
+
+# 21| ... == ...
+#-----| true -> return ...;
+#-----| false -> 0
+
+# 21| access to parameter o
+#-----| -> null
+
+# 21| null
+#-----| -> ... == ...
+
+# 22| return ...;
+#-----| return -> exit M2 (normal)
+
+# 23| goto case ...;
+#-----| goto(0) -> case ...:
+
+# 23| 0
+#-----| -> goto case ...;
+
+# 24| case ...:
+#-----| -> String s
+
+# 24| String s
+#-----| no-match -> case ...:
+#-----| match -> access to local variable s
+
+# 24| [false] ... && ...
+#-----| false -> case ...:
+
+# 24| [true] ... && ...
+#-----| true -> ...;
+
+# 24| ... > ...
+#-----| false -> [false] ... && ...
+#-----| true -> access to local variable s
+
+# 24| access to property Length
+#-----| -> 0
+
+# 24| access to local variable s
+#-----| -> access to property Length
+
+# 24| 0
+#-----| -> ... > ...
+
+# 24| ... != ...
+#-----| false -> [false] ... && ...
+#-----| true -> [true] ... && ...
+
+# 24| access to local variable s
+#-----| -> "a"
+
+# 24| "a"
+#-----| -> ... != ...
+
+# 25| ...;
+#-----| -> access to local variable s
+
+# 25| call to method WriteLine
+#-----| -> return ...;
+
+# 25| access to local variable s
+#-----| -> call to method WriteLine
+
+# 26| return ...;
+#-----| return -> exit M2 (normal)
+
+# 27| case ...:
+#-----| -> Double d
+
+# 27| Double d
+#-----| match -> call to method Throw
+#-----| no-match -> default:
+
+# 27| call to method Throw
+#-----| exception(Exception) -> exit M2 (abnormal)
+
+# 28| Label:
+#-----| -> return ...;
+
+# 29| return ...;
+#-----| return -> exit M2 (normal)
+
+# 30| default:
+#-----| -> goto ...;
+
+# 31| goto ...;
+#-----| goto(Label) -> Label:
+
+# 35| enter M3
+#-----| -> {...}
+
+# 35| exit M3
+
+# 35| exit M3 (abnormal)
+#-----| -> exit M3
+
+# 36| {...}
+#-----| -> switch (...) {...}
+
+# 37| switch (...) {...}
+#-----| -> call to method Throw
+
+# 37| call to method Throw
+#-----| exception(Exception) -> exit M3 (abnormal)
+
+# 44| enter M4
+#-----| -> {...}
+
+# 44| exit M4
+
+# 44| exit M4 (normal)
+#-----| -> exit M4
+
+# 45| {...}
+#-----| -> switch (...) {...}
+
+# 46| switch (...) {...}
+#-----| -> access to parameter o
+
+# 46| access to parameter o
+#-----| -> case ...:
+
+# 48| case ...:
+#-----| -> access to type Int32
+
+# 48| access to type Int32
+#-----| match -> break;
+#-----| no-match -> case ...:
+
+# 49| break;
+#-----| break -> exit M4 (normal)
+
+# 50| case ...:
+#-----| -> access to type Boolean
+
+# 50| access to type Boolean
+#-----| match -> access to parameter o
+#-----| no-match -> exit M4 (normal)
+
+# 50| ... != ...
+#-----| true -> break;
+#-----| false -> exit M4 (normal)
+
+# 50| access to parameter o
+#-----| -> null
+
+# 50| null
+#-----| -> ... != ...
+
+# 51| break;
+#-----| break -> exit M4 (normal)
+
+# 55| enter M5
+#-----| -> {...}
+
+# 55| exit M5
+
+# 55| exit M5 (normal)
+#-----| -> exit M5
+
+# 56| {...}
+#-----| -> switch (...) {...}
+
+# 57| switch (...) {...}
+#-----| -> 1
+
+# 57| ... + ...
+#-----| -> case ...:
+
+# 57| 1
+#-----| -> 2
+
+# 57| 2
+#-----| -> ... + ...
+
+# 59| case ...:
+#-----| -> 2
+
+# 59| 2
+#-----| no-match -> case ...:
+
+# 61| case ...:
+#-----| -> 3
+
+# 61| 3
+#-----| match -> break;
+
+# 62| break;
+#-----| break -> exit M5 (normal)
+
+# 66| enter M6
+#-----| -> {...}
+
+# 66| exit M6
+
+# 66| exit M6 (normal)
+#-----| -> exit M6
+
+# 67| {...}
+#-----| -> switch (...) {...}
+
+# 68| switch (...) {...}
+#-----| -> access to parameter s
+
+# 68| (...) ...
+#-----| -> case ...:
+
+# 68| access to parameter s
+#-----| -> (...) ...
+
+# 70| case ...:
+#-----| -> access to type Int32
+
+# 70| access to type Int32
+#-----| no-match -> case ...:
+
+# 72| case ...:
+#-----| -> ""
+
+# 72| ""
+#-----| match -> break;
+#-----| no-match -> exit M6 (normal)
+
+# 73| break;
+#-----| break -> exit M6 (normal)
+
+# 77| enter M7
+#-----| -> {...}
+
+# 77| exit M7
+
+# 77| exit M7 (normal)
+#-----| -> exit M7
+
+# 78| {...}
+#-----| -> switch (...) {...}
+
+# 79| switch (...) {...}
+#-----| -> access to parameter i
+
+# 79| access to parameter i
+#-----| -> case ...:
+
+# 81| case ...:
+#-----| -> 1
+
+# 81| 1
+#-----| match -> true
+#-----| no-match -> case ...:
+
+# 82| return ...;
+#-----| return -> exit M7 (normal)
+
+# 82| true
+#-----| -> return ...;
+
+# 83| case ...:
+#-----| -> 2
+
+# 83| 2
+#-----| match -> if (...) ...
+#-----| no-match -> false
+
+# 84| if (...) ...
+#-----| -> access to parameter j
+
+# 84| ... > ...
+#-----| true -> break;
+#-----| false -> true
+
+# 84| access to parameter j
+#-----| -> 2
+
+# 84| 2
+#-----| -> ... > ...
+
+# 85| break;
+#-----| break -> false
+
+# 86| return ...;
+#-----| return -> exit M7 (normal)
+
+# 86| true
+#-----| -> return ...;
+
+# 88| return ...;
+#-----| return -> exit M7 (normal)
+
+# 88| false
+#-----| -> return ...;
+
+# 91| enter M8
+#-----| -> {...}
+
+# 91| exit M8
+
+# 91| exit M8 (normal)
+#-----| -> exit M8
+
+# 92| {...}
+#-----| -> switch (...) {...}
+
+# 93| switch (...) {...}
+#-----| -> access to parameter o
+
+# 93| access to parameter o
+#-----| -> case ...:
+
+# 95| case ...:
+#-----| -> access to type Int32
+
+# 95| access to type Int32
+#-----| match -> true
+#-----| no-match -> false
+
+# 96| return ...;
+#-----| return -> exit M8 (normal)
+
+# 96| true
+#-----| -> return ...;
+
+# 98| return ...;
+#-----| return -> exit M8 (normal)
+
+# 98| false
+#-----| -> return ...;
+
+# 101| enter M9
+#-----| -> {...}
+
+# 101| exit M9
+
+# 101| exit M9 (normal)
+#-----| -> exit M9
+
+# 102| {...}
+#-----| -> switch (...) {...}
+
+# 103| switch (...) {...}
+#-----| -> access to parameter s
+
+# 103| access to parameter s
+#-----| non-null -> access to property Length
+#-----| null -> case ...:
+
+# 103| access to property Length
+#-----| -> case ...:
+
+# 105| case ...:
+#-----| -> 0
+
+# 105| 0
+#-----| match -> 0
+#-----| no-match -> case ...:
+
+# 105| return ...;
+#-----| return -> exit M9 (normal)
+
+# 105| 0
+#-----| -> return ...;
+
+# 106| case ...:
+#-----| -> 1
+
+# 106| 1
+#-----| match -> 1
+#-----| no-match -> 1
+
+# 106| return ...;
+#-----| return -> exit M9 (normal)
+
+# 106| 1
+#-----| -> return ...;
+
+# 108| return ...;
+#-----| return -> exit M9 (normal)
+
+# 108| -...
+#-----| -> return ...;
+
+# 108| 1
+#-----| -> -...
+
+# 111| enter Throw
+#-----| -> object creation of type Exception
+
+# 111| exit Throw
+
+# 111| exit Throw (abnormal)
+#-----| -> exit Throw
+
+# 111| throw ...
+#-----| exception(Exception) -> exit Throw (abnormal)
+
+# 111| object creation of type Exception
+#-----| -> throw ...
+
+# 113| enter M10
+#-----| -> {...}
+
+# 113| exit M10
+
+# 113| exit M10 (normal)
+#-----| -> exit M10
+
+# 114| {...}
+#-----| -> switch (...) {...}
+
+# 115| switch (...) {...}
+#-----| -> access to parameter s
+
+# 115| access to property Length
+#-----| -> case ...:
+
+# 115| access to parameter s
+#-----| -> access to property Length
+
+# 117| case ...:
+#-----| -> 3
+
+# 117| 3
+#-----| no-match -> case ...:
+#-----| match -> access to parameter s
+
+# 117| ... == ...
+#-----| true -> 1
+#-----| false -> case ...:
+
+# 117| access to parameter s
+#-----| -> "foo"
+
+# 117| "foo"
+#-----| -> ... == ...
+
+# 117| return ...;
+#-----| return -> exit M10 (normal)
+
+# 117| 1
+#-----| -> return ...;
+
+# 118| case ...:
+#-----| -> 2
+
+# 118| 2
+#-----| no-match -> 1
+#-----| match -> access to parameter s
+
+# 118| ... == ...
+#-----| true -> 2
+#-----| false -> 1
+
+# 118| access to parameter s
+#-----| -> "fu"
+
+# 118| "fu"
+#-----| -> ... == ...
+
+# 118| return ...;
+#-----| return -> exit M10 (normal)
+
+# 118| 2
+#-----| -> return ...;
+
+# 120| return ...;
+#-----| return -> exit M10 (normal)
+
+# 120| -...
+#-----| -> return ...;
+
+# 120| 1
+#-----| -> -...
+
+# 123| enter M11
+#-----| -> {...}
+
+# 123| exit M11
+
+# 123| exit M11 (normal)
+#-----| -> exit M11
+
+# 124| {...}
+#-----| -> if (...) ...
+
+# 125| if (...) ...
+#-----| -> access to parameter o
+
+# 125| [false] ... switch { ... }
+#-----| false -> exit M11 (normal)
+
+# 125| [true] ... switch { ... }
+#-----| true -> return ...;
+
+# 125| access to parameter o
+#-----| -> Boolean b
+
+# 125| [false] ... => ...
+#-----| false -> [false] ... switch { ... }
+
+# 125| [true] ... => ...
+#-----| true -> [true] ... switch { ... }
+
+# 125| Boolean b
+#-----| match -> access to local variable b
+#-----| no-match -> _
+
+# 125| access to local variable b
+#-----| false -> [false] ... => ...
+#-----| true -> [true] ... => ...
+
+# 125| [false] ... => ...
+#-----| false -> [false] ... switch { ... }
+
+# 125| _
+#-----| match -> false
+
+# 125| false
+#-----| false -> [false] ... => ...
+
+# 126| return ...;
+#-----| return -> exit M11 (normal)
+
+# 129| enter M12
+#-----| -> {...}
+
+# 129| exit M12
+
+# 129| exit M12 (normal)
+#-----| -> exit M12
+
+# 130| {...}
+#-----| -> access to parameter o
+
+# 131| return ...;
+#-----| return -> exit M12 (normal)
+
+# 131| [non-null] ... switch { ... }
+#-----| non-null -> call to method ToString
+
+# 131| [null] ... switch { ... }
+#-----| null -> return ...;
+
+# 131| access to parameter o
+#-----| -> String s
+
+# 131| [non-null] ... => ...
+#-----| non-null -> [non-null] ... switch { ... }
+
+# 131| [null] ... => ...
+#-----| null -> [null] ... switch { ... }
+
+# 131| String s
+#-----| match -> access to local variable s
+#-----| no-match -> _
+
+# 131| access to local variable s
+#-----| non-null -> [non-null] ... => ...
+#-----| null -> [null] ... => ...
+
+# 131| [null] ... => ...
+#-----| null -> [null] ... switch { ... }
+
+# 131| _
+#-----| match -> null
+
+# 131| null
+#-----| null -> [null] ... => ...
+
+# 131| call to method ToString
+#-----| -> return ...;
+
+# 134| enter M13
+#-----| -> {...}
+
+# 134| exit M13
+
+# 134| exit M13 (normal)
+#-----| -> exit M13
+
+# 135| {...}
+#-----| -> switch (...) {...}
+
+# 136| switch (...) {...}
+#-----| -> access to parameter i
+
+# 136| access to parameter i
+#-----| -> case ...:
+
+# 138| default:
+#-----| -> 1
+
+# 138| return ...;
+#-----| return -> exit M13 (normal)
+
+# 138| -...
+#-----| -> return ...;
+
+# 138| 1
+#-----| -> -...
+
+# 139| case ...:
+#-----| -> 1
+
+# 139| 1
+#-----| match -> 1
+#-----| no-match -> case ...:
+
+# 139| return ...;
+#-----| return -> exit M13 (normal)
+
+# 139| 1
+#-----| -> return ...;
+
+# 140| case ...:
+#-----| -> 2
+
+# 140| 2
+#-----| no-match -> default:
+#-----| match -> 2
+
+# 140| return ...;
+#-----| return -> exit M13 (normal)
+
+# 140| 2
+#-----| -> return ...;
+
+# 144| enter M14
+#-----| -> {...}
+
+# 144| exit M14
+
+# 144| exit M14 (normal)
+#-----| -> exit M14
+
+# 145| {...}
+#-----| -> switch (...) {...}
+
+# 146| switch (...) {...}
+#-----| -> access to parameter i
+
+# 146| access to parameter i
+#-----| -> case ...:
+
+# 148| case ...:
+#-----| -> 1
+
+# 148| 1
+#-----| match -> 1
+#-----| no-match -> case ...:
+
+# 148| return ...;
+#-----| return -> exit M14 (normal)
+
+# 148| 1
+#-----| -> return ...;
+
+# 149| default:
+#-----| -> 1
+
+# 149| return ...;
+#-----| return -> exit M14 (normal)
+
+# 149| -...
+#-----| -> return ...;
+
+# 149| 1
+#-----| -> -...
+
+# 150| case ...:
+#-----| -> 2
+
+# 150| 2
+#-----| no-match -> default:
+#-----| match -> 2
+
+# 150| return ...;
+#-----| return -> exit M14 (normal)
+
+# 150| 2
+#-----| -> return ...;
+
+# 154| enter M15
+#-----| -> {...}
+
+# 154| exit M15
+
+# 154| exit M15 (abnormal)
+#-----| -> exit M15
+
+# 154| exit M15 (normal)
+#-----| -> exit M15
+
+# 155| {...}
+#-----| -> ... ...;
+
+# 156| ... ...;
+#-----| -> access to parameter b
+
+# 156| String s = ...
+#-----| -> if (...) ...
+
+# 156| ... switch { ... }
+#-----| -> String s = ...
+
+# 156| access to parameter b
+#-----| -> true
+
+# 156| ... => ...
+#-----| -> ... switch { ... }
+
+# 156| true
+#-----| match -> "a"
+#-----| no-match -> false
+
+# 156| "a"
+#-----| -> ... => ...
+
+# 156| ... => ...
+#-----| -> ... switch { ... }
+
+# 156| false
+#-----| match -> "b"
+#-----| exception(InvalidOperationException) -> exit M15 (abnormal)
+
+# 156| "b"
+#-----| -> ... => ...
+
+# 157| if (...) ...
+#-----| -> access to parameter b
+
+# 157| access to parameter b
+#-----| true -> ...;
+#-----| false -> ...;
+
+# 158| ...;
+#-----| -> "a = "
+
+# 158| call to method WriteLine
+#-----| -> exit M15 (normal)
+
+# 158| $"..."
+#-----| -> call to method WriteLine
+
+# 158| "a = "
+#-----| -> access to local variable s
+
+# 158| access to local variable s
+#-----| -> $"..."
+
+# 160| ...;
+#-----| -> "b = "
+
+# 160| call to method WriteLine
+#-----| -> exit M15 (normal)
+
+# 160| $"..."
+#-----| -> call to method WriteLine
+
+# 160| "b = "
+#-----| -> access to local variable s
+
+# 160| access to local variable s
+#-----| -> $"..."
+
+TypeAccesses.cs:
+# 3| enter M
+#-----| -> {...}
+
+# 3| exit M
+
+# 3| exit M (normal)
+#-----| -> exit M
+
+# 4| {...}
+#-----| -> ... ...;
+
+# 5| ... ...;
+#-----| -> access to parameter o
+
+# 5| String s = ...
+#-----| -> ...;
+
+# 5| (...) ...
+#-----| -> String s = ...
+
+# 5| access to parameter o
+#-----| -> (...) ...
+
+# 6| ...;
+#-----| -> access to parameter o
+
+# 6| ... = ...
+#-----| -> if (...) ...
+
+# 6| ... as ...
+#-----| -> ... = ...
+
+# 6| access to parameter o
+#-----| -> ... as ...
+
+# 7| if (...) ...
+#-----| -> access to parameter o
+
+# 7| [false] ... is ...
+#-----| false -> ... ...;
+
+# 7| [true] ... is ...
+#-----| true -> ;
+
+# 7| access to parameter o
+#-----| -> Int32 j
+
+# 7| Int32 j
+#-----| no-match -> [false] ... is ...
+#-----| match -> [true] ... is ...
+
+# 7| ;
+#-----| -> ... ...;
+
+# 8| ... ...;
+#-----| -> typeof(...)
+
+# 8| Type t = ...
+#-----| -> exit M (normal)
+
+# 8| typeof(...)
+#-----| -> Type t = ...
+
+VarDecls.cs:
+# 5| enter M1
+#-----| -> {...}
+
+# 5| exit M1
+
+# 5| exit M1 (normal)
+#-----| -> exit M1
+
+# 6| {...}
+#-----| -> fixed(...) { ... }
+
+# 7| fixed(...) { ... }
+#-----| -> access to parameter strings
+
+# 7| Char* c1 = ...
+#-----| -> access to parameter strings
+
+# 7| (...) ...
+#-----| -> Char* c1 = ...
+
+# 7| access to array element
+#-----| -> (...) ...
+
+# 7| access to parameter strings
+#-----| -> 0
+
+# 7| 0
+#-----| -> access to array element
+
+# 7| Char* c2 = ...
+#-----| -> {...}
+
+# 7| (...) ...
+#-----| -> Char* c2 = ...
+
+# 7| access to array element
+#-----| -> (...) ...
+
+# 7| access to parameter strings
+#-----| -> 1
+
+# 7| 1
+#-----| -> access to array element
+
+# 8| {...}
+#-----| -> access to local variable c1
+
+# 9| return ...;
+#-----| return -> exit M1 (normal)
+
+# 9| (...) ...
+#-----| -> return ...;
+
+# 9| access to local variable c1
+#-----| -> (...) ...
+
+# 13| enter M2
+#-----| -> {...}
+
+# 13| exit M2
+
+# 13| exit M2 (normal)
+#-----| -> exit M2
+
+# 14| {...}
+#-----| -> ... ...;
+
+# 15| ... ...;
+#-----| -> access to parameter s
+
+# 15| String s1 = ...
+#-----| -> access to parameter s
+
+# 15| access to parameter s
+#-----| -> String s1 = ...
+
+# 15| String s2 = ...
+#-----| -> access to local variable s1
+
+# 15| access to parameter s
+#-----| -> String s2 = ...
+
+# 16| return ...;
+#-----| return -> exit M2 (normal)
+
+# 16| ... + ...
+#-----| -> return ...;
+
+# 16| access to local variable s1
+#-----| -> access to local variable s2
+
+# 16| access to local variable s2
+#-----| -> ... + ...
+
+# 19| enter M3
+#-----| -> {...}
+
+# 19| exit M3
+
+# 19| exit M3 (normal)
+#-----| -> exit M3
+
+# 20| {...}
+#-----| -> using (...) {...}
+
+# 21| using (...) {...}
+#-----| -> object creation of type C
+
+# 21| object creation of type C
+#-----| -> ;
+
+# 22| ;
+#-----| -> using (...) {...}
+
+# 24| using (...) {...}
+#-----| -> object creation of type C
+
+# 24| C x = ...
+#-----| -> object creation of type C
+
+# 24| object creation of type C
+#-----| -> C x = ...
+
+# 24| C y = ...
+#-----| -> access to parameter b
+
+# 24| object creation of type C
+#-----| -> C y = ...
+
+# 25| return ...;
+#-----| return -> exit M3 (normal)
+
+# 25| ... ? ... : ...
+#-----| -> return ...;
+
+# 25| access to parameter b
+#-----| true -> access to local variable x
+#-----| false -> access to local variable y
+
+# 25| access to local variable x
+#-----| -> ... ? ... : ...
+
+# 25| access to local variable y
+#-----| -> ... ? ... : ...
+
+# 28| enter Dispose
+#-----| -> {...}
+
+# 28| exit Dispose
+
+# 28| exit Dispose (normal)
+#-----| -> exit Dispose
+
+# 28| {...}
+#-----| -> exit Dispose (normal)
+
+cflow.cs:
+# 5| enter Main
+#-----| -> {...}
+
+# 5| exit Main
+
+# 5| exit Main (normal)
+#-----| -> exit Main
+
+# 6| {...}
+#-----| -> ... ...;
+
+# 7| ... ...;
+#-----| -> access to parameter args
+
+# 7| Int32 a = ...
+#-----| -> ...;
+
+# 7| access to property Length
+#-----| -> Int32 a = ...
+
+# 7| access to parameter args
+#-----| -> access to property Length
+
+# 9| ...;
+#-----| -> object creation of type ControlFlow
+
+# 9| ... = ...
+#-----| -> if (...) ...
+
+# 9| call to method Switch
+#-----| -> ... = ...
+
+# 9| object creation of type ControlFlow
+#-----| -> access to local variable a
+
+# 9| access to local variable a
+#-----| -> call to method Switch
+
+# 11| if (...) ...
+#-----| -> access to local variable a
+
+# 11| ... > ...
+#-----| true -> ...;
+#-----| false -> while (...) ...
+
+# 11| access to local variable a
+#-----| -> 3
+
+# 11| 3
+#-----| -> ... > ...
+
+# 12| ...;
+#-----| -> "more than a few"
+
+# 12| call to method WriteLine
+#-----| -> while (...) ...
+
+# 12| "more than a few"
+#-----| -> call to method WriteLine
+
+# 14| while (...) ...
+#-----| -> access to local variable a
+
+# 14| ... > ...
+#-----| true -> {...}
+#-----| false -> do ... while (...);
+
+# 14| access to local variable a
+#-----| -> 0
+
+# 14| 0
+#-----| -> ... > ...
+
+# 15| {...}
+#-----| -> ...;
+
+# 16| ...;
+#-----| -> access to local variable a
+
+# 16| call to method WriteLine
+#-----| -> access to local variable a
+
+# 16| ... * ...
+#-----| -> call to method WriteLine
+
+# 16| ...--
+#-----| -> 100
+
+# 16| access to local variable a
+#-----| -> ...--
+
+# 16| 100
+#-----| -> ... * ...
+
+# 19| do ... while (...);
+#-----| -> {...}
+
+# 20| {...}
+#-----| -> ...;
+
+# 21| ...;
+#-----| -> access to local variable a
+
+# 21| call to method WriteLine
+#-----| -> access to local variable a
+
+# 21| -...
+#-----| -> call to method WriteLine
+
+# 21| ...++
+#-----| -> -...
+
+# 21| access to local variable a
+#-----| -> ...++
+
+# 22| ... < ...
+#-----| true -> {...}
+#-----| false -> for (...;...;...) ...
+
+# 22| access to local variable a
+#-----| -> 10
+
+# 22| 10
+#-----| -> ... < ...
+
+# 24| for (...;...;...) ...
+#-----| -> 1
+
+# 24| Int32 i = ...
+#-----| -> access to local variable i
+
+# 24| 1
+#-----| -> Int32 i = ...
+
+# 24| ... <= ...
+#-----| true -> {...}
+#-----| false -> exit Main (normal)
+
+# 24| access to local variable i
+#-----| -> 20
+
+# 24| 20
+#-----| -> ... <= ...
+
+# 24| ...++
+#-----| -> access to local variable i
+
+# 24| access to local variable i
+#-----| -> ...++
+
+# 25| {...}
+#-----| -> if (...) ...
+
+# 26| if (...) ...
+#-----| -> access to local variable i
+
+# 26| [false] ... && ...
+#-----| false -> if (...) ...
+
+# 26| [true] ... && ...
+#-----| true -> ...;
+
+# 26| ... == ...
+#-----| false -> [false] ... && ...
+#-----| true -> access to local variable i
+
+# 26| ... % ...
+#-----| -> 0
+
+# 26| access to local variable i
+#-----| -> 3
+
+# 26| 3
+#-----| -> ... % ...
+
+# 26| 0
+#-----| -> ... == ...
+
+# 26| ... == ...
+#-----| false -> [false] ... && ...
+#-----| true -> [true] ... && ...
+
+# 26| ... % ...
+#-----| -> 0
+
+# 26| access to local variable i
+#-----| -> 5
+
+# 26| 5
+#-----| -> ... % ...
+
+# 26| 0
+#-----| -> ... == ...
+
+# 27| ...;
+#-----| -> "FizzBuzz"
+
+# 27| call to method WriteLine
+#-----| -> access to local variable i
+
+# 27| "FizzBuzz"
+#-----| -> call to method WriteLine
+
+# 28| if (...) ...
+#-----| -> access to local variable i
+
+# 28| ... == ...
+#-----| true -> ...;
+#-----| false -> if (...) ...
+
+# 28| ... % ...
+#-----| -> 0
+
+# 28| access to local variable i
+#-----| -> 3
+
+# 28| 3
+#-----| -> ... % ...
+
+# 28| 0
+#-----| -> ... == ...
+
+# 29| ...;
+#-----| -> "Fizz"
+
+# 29| call to method WriteLine
+#-----| -> access to local variable i
+
+# 29| "Fizz"
+#-----| -> call to method WriteLine
+
+# 30| if (...) ...
+#-----| -> access to local variable i
+
+# 30| ... == ...
+#-----| true -> ...;
+#-----| false -> ...;
+
+# 30| ... % ...
+#-----| -> 0
+
+# 30| access to local variable i
+#-----| -> 5
+
+# 30| 5
+#-----| -> ... % ...
+
+# 30| 0
+#-----| -> ... == ...
+
+# 31| ...;
+#-----| -> "Buzz"
+
+# 31| call to method WriteLine
+#-----| -> access to local variable i
+
+# 31| "Buzz"
+#-----| -> call to method WriteLine
+
+# 33| ...;
+#-----| -> access to local variable i
+
+# 33| call to method WriteLine
+#-----| -> access to local variable i
+
+# 33| access to local variable i
+#-----| -> call to method WriteLine
+
+# 37| enter Switch
+#-----| -> {...}
+
+# 37| exit Switch
+
+# 37| exit Switch (abnormal)
+#-----| -> exit Switch
+
+# 37| exit Switch (normal)
+#-----| -> exit Switch
+
+# 38| {...}
+#-----| -> switch (...) {...}
+
+# 39| switch (...) {...}
+#-----| -> access to parameter a
+
+# 39| access to parameter a
+#-----| -> case ...:
+
+# 41| case ...:
+#-----| -> 1
+
+# 41| 1
+#-----| match -> ...;
+#-----| no-match -> case ...:
+
+# 42| ...;
+#-----| -> "1"
+
+# 42| call to method WriteLine
+#-----| -> 2
+
+# 42| "1"
+#-----| -> call to method WriteLine
+
+# 43| goto case ...;
+#-----| goto(2) -> case ...:
+
+# 43| 2
+#-----| -> goto case ...;
+
+# 44| case ...:
+#-----| -> 2
+
+# 44| 2
+#-----| match -> ...;
+#-----| no-match -> case ...:
+
+# 45| ...;
+#-----| -> "2"
+
+# 45| call to method WriteLine
+#-----| -> 1
+
+# 45| "2"
+#-----| -> call to method WriteLine
+
+# 46| goto case ...;
+#-----| goto(1) -> case ...:
+
+# 46| 1
+#-----| -> goto case ...;
+
+# 47| case ...:
+#-----| -> 3
+
+# 47| 3
+#-----| match -> ...;
+#-----| no-match -> switch (...) {...}
+
+# 48| ...;
+#-----| -> "3"
+
+# 48| call to method WriteLine
+#-----| -> break;
+
+# 48| "3"
+#-----| -> call to method WriteLine
+
+# 49| break;
+#-----| break -> switch (...) {...}
+
+# 51| switch (...) {...}
+#-----| -> access to parameter a
+
+# 51| access to parameter a
+#-----| -> case ...:
+
+# 53| case ...:
+#-----| -> 42
+
+# 53| 42
+#-----| match -> ...;
+#-----| no-match -> default:
+
+# 54| ...;
+#-----| -> "The answer"
+
+# 54| call to method WriteLine
+#-----| -> break;
+
+# 54| "The answer"
+#-----| -> call to method WriteLine
+
+# 55| break;
+#-----| break -> switch (...) {...}
+
+# 56| default:
+#-----| -> ...;
+
+# 57| ...;
+#-----| -> "Not the answer"
+
+# 57| call to method WriteLine
+#-----| -> break;
+
+# 57| "Not the answer"
+#-----| -> call to method WriteLine
+
+# 58| break;
+#-----| break -> switch (...) {...}
+
+# 60| switch (...) {...}
+#-----| -> this access
+
+# 60| call to method Parse
+#-----| -> case ...:
+
+# 60| access to field Field
+#-----| -> call to method Parse
+
+# 60| this access
+#-----| -> access to field Field
+
+# 62| case ...:
+#-----| -> 0
+
+# 62| 0
+#-----| match -> if (...) ...
+#-----| no-match -> access to parameter a
+
+# 63| if (...) ...
+#-----| -> this access
+
+# 63| [false] !...
+#-----| false -> break;
+
+# 63| [true] !...
+#-----| true -> object creation of type NullReferenceException
+
+# 63| ... == ...
+#-----| true -> [false] !...
+#-----| false -> [true] !...
+
+# 63| access to field Field
+#-----| -> ""
+
+# 63| this access
+#-----| -> access to field Field
+
+# 63| ""
+#-----| -> ... == ...
+
+# 64| throw ...;
+#-----| exception(NullReferenceException) -> exit Switch (abnormal)
+
+# 64| object creation of type NullReferenceException
+#-----| -> throw ...;
+
+# 65| break;
+#-----| break -> access to parameter a
+
+# 67| return ...;
+#-----| return -> exit Switch (normal)
+
+# 67| access to parameter a
+#-----| -> return ...;
+
+# 70| enter M
+#-----| -> {...}
+
+# 70| exit M
+
+# 70| exit M (normal)
+#-----| -> exit M
+
+# 71| {...}
+#-----| -> if (...) ...
+
+# 72| if (...) ...
+#-----| -> access to parameter s
+
+# 72| ... == ...
+#-----| true -> return ...;
+#-----| false -> if (...) ...
+
+# 72| access to parameter s
+#-----| -> null
+
+# 72| null
+#-----| -> ... == ...
+
+# 73| return ...;
+#-----| return -> exit M (normal)
+
+# 74| if (...) ...
+#-----| -> access to parameter s
+
+# 74| ... > ...
+#-----| true -> {...}
+#-----| false -> {...}
+
+# 74| access to property Length
+#-----| -> 0
+
+# 74| access to parameter s
+#-----| -> access to property Length
+
+# 74| 0
+#-----| -> ... > ...
+
+# 75| {...}
+#-----| -> ...;
+
+# 76| ...;
+#-----| -> access to parameter s
+
+# 76| call to method WriteLine
+#-----| -> exit M (normal)
+
+# 76| access to parameter s
+#-----| -> call to method WriteLine
+
+# 79| {...}
+#-----| -> ...;
+
+# 80| ...;
+#-----| -> ""
+
+# 80| call to method WriteLine
+#-----| -> exit M (normal)
+
+# 80| ""
+#-----| -> call to method WriteLine
+
+# 84| enter M2
+#-----| -> {...}
+
+# 84| exit M2
+
+# 84| exit M2 (normal)
+#-----| -> exit M2
+
+# 85| {...}
+#-----| -> if (...) ...
+
+# 86| if (...) ...
+#-----| -> access to parameter s
+
+# 86| [false] ... && ...
+#-----| false -> exit M2 (normal)
+
+# 86| [true] ... && ...
+#-----| true -> ...;
+
+# 86| ... != ...
+#-----| false -> [false] ... && ...
+#-----| true -> access to parameter s
+
+# 86| access to parameter s
+#-----| -> null
+
+# 86| null
+#-----| -> ... != ...
+
+# 86| ... > ...
+#-----| false -> [false] ... && ...
+#-----| true -> [true] ... && ...
+
+# 86| access to property Length
+#-----| -> 0
+
+# 86| access to parameter s
+#-----| -> access to property Length
+
+# 86| 0
+#-----| -> ... > ...
+
+# 87| ...;
+#-----| -> access to parameter s
+
+# 87| call to method WriteLine
+#-----| -> exit M2 (normal)
+
+# 87| access to parameter s
+#-----| -> call to method WriteLine
+
+# 90| enter M3
+#-----| -> {...}
+
+# 90| exit M3
+
+# 90| exit M3 (abnormal)
+#-----| -> exit M3
+
+# 90| exit M3 (normal)
+#-----| -> exit M3
+
+# 91| {...}
+#-----| -> if (...) ...
+
+# 92| if (...) ...
+#-----| -> access to parameter s
+
+# 92| call to method Equals
+#-----| true -> "s"
+#-----| false -> ...;
+
+# 92| access to parameter s
+#-----| -> null
+
+# 92| null
+#-----| -> call to method Equals
+
+# 93| throw ...;
+#-----| exception(ArgumentNullException) -> exit M3 (abnormal)
+
+# 93| object creation of type ArgumentNullException
+#-----| -> throw ...;
+
+# 93| "s"
+#-----| -> object creation of type ArgumentNullException
+
+# 94| ...;
+#-----| -> access to parameter s
+
+# 94| call to method WriteLine
+#-----| -> if (...) ...
+
+# 94| access to parameter s
+#-----| -> call to method WriteLine
+
+# 96| if (...) ...
+#-----| -> this access
+
+# 96| ... != ...
+#-----| true -> ...;
+#-----| false -> if (...) ...
+
+# 96| access to field Field
+#-----| -> null
+
+# 96| this access
+#-----| -> access to field Field
+
+# 96| null
+#-----| -> ... != ...
+
+# 97| ...;
+#-----| -> object creation of type ControlFlow
+
+# 97| call to method WriteLine
+#-----| -> if (...) ...
+
+# 97| access to field Field
+#-----| -> call to method WriteLine
+
+# 97| object creation of type ControlFlow
+#-----| -> access to field Field
+
+# 99| if (...) ...
+#-----| -> this access
+
+# 99| ... != ...
+#-----| true -> ...;
+#-----| false -> if (...) ...
+
+# 99| access to field Field
+#-----| -> null
+
+# 99| this access
+#-----| -> access to field Field
+
+# 99| null
+#-----| -> ... != ...
+
+# 100| ...;
+#-----| -> this access
+
+# 100| call to method WriteLine
+#-----| -> if (...) ...
+
+# 100| access to field Field
+#-----| -> call to method WriteLine
+
+# 100| this access
+#-----| -> access to field Field
+
+# 102| if (...) ...
+#-----| -> this access
+
+# 102| ... != ...
+#-----| true -> ...;
+#-----| false -> exit M3 (normal)
+
+# 102| access to property Prop
+#-----| -> null
+
+# 102| this access
+#-----| -> access to property Prop
+
+# 102| null
+#-----| -> ... != ...
+
+# 103| ...;
+#-----| -> this access
+
+# 103| call to method WriteLine
+#-----| -> exit M3 (normal)
+
+# 103| access to property Prop
+#-----| -> call to method WriteLine
+
+# 103| this access
+#-----| -> access to property Prop
+
+# 106| enter M4
+#-----| -> {...}
+
+# 106| exit M4
+
+# 106| exit M4 (normal)
+#-----| -> exit M4
+
+# 107| {...}
+#-----| -> if (...) ...
+
+# 108| if (...) ...
+#-----| -> access to parameter s
+
+# 108| ... != ...
+#-----| true -> {...}
+#-----| false -> ...;
+
+# 108| access to parameter s
+#-----| -> null
+
+# 108| null
+#-----| -> ... != ...
+
+# 109| {...}
+#-----| -> while (...) ...
+
+# 110| while (...) ...
+#-----| -> true
+
+# 110| true
+#-----| true -> {...}
+
+# 111| {...}
+#-----| -> ...;
+
+# 112| ...;
+#-----| -> access to parameter s
+
+# 112| call to method WriteLine
+#-----| -> true
+
+# 112| access to parameter s
+#-----| -> call to method WriteLine
+
+# 116| ...;
+#-----| -> access to parameter s
+
+# 116| call to method WriteLine
+#-----| -> exit M4 (normal)
+
+# 116| access to parameter s
+#-----| -> call to method WriteLine
+
+# 119| enter M5
+#-----| -> {...}
+
+# 119| exit M5
+
+# 119| exit M5 (normal)
+#-----| -> exit M5
+
+# 120| {...}
+#-----| -> ... ...;
+
+# 121| ... ...;
+#-----| -> access to parameter s
+
+# 121| String x = ...
+#-----| -> ...;
+
+# 121| access to parameter s
+#-----| -> String x = ...
+
+# 122| ...;
+#-----| -> access to local variable x
+
+# 122| ... = ...
+#-----| -> access to local variable x
+
+# 122| ... + ...
+#-----| -> ... = ...
+
+# 122| access to local variable x
+#-----| -> " "
+
+# 122| " "
+#-----| -> ... + ...
+
+# 123| return ...;
+#-----| return -> exit M5 (normal)
+
+# 123| access to local variable x
+#-----| -> return ...;
+
+# 127| enter get_Prop
+#-----| -> {...}
+
+# 127| exit get_Prop
+
+# 127| exit get_Prop (normal)
+#-----| -> exit get_Prop
+
+# 127| {...}
+#-----| -> this access
+
+# 127| return ...;
+#-----| return -> exit get_Prop (normal)
+
+# 127| ... ? ... : ...
+#-----| -> return ...;
+
+# 127| ... == ...
+#-----| true -> ""
+#-----| false -> this access
+
+# 127| access to field Field
+#-----| -> null
+
+# 127| this access
+#-----| -> access to field Field
+
+# 127| null
+#-----| -> ... == ...
+
+# 127| ""
+#-----| -> ... ? ... : ...
+
+# 127| access to field Field
+#-----| -> ... ? ... : ...
+
+# 127| this access
+#-----| -> access to field Field
+
+# 127| enter set_Prop
+#-----| -> {...}
+
+# 127| exit set_Prop
+
+# 127| exit set_Prop (normal)
+#-----| -> exit set_Prop
+
+# 127| {...}
+#-----| -> ...;
+
+# 127| ...;
+#-----| -> this access
+
+# 127| ... = ...
+#-----| -> exit set_Prop (normal)
+
+# 127| this access
+#-----| -> access to parameter value
+
+# 127| access to parameter value
+#-----| -> ... = ...
+
+# 129| enter ControlFlow
+#-----| -> call to constructor Object
+
+# 129| call to constructor Object
+#-----| -> {...}
+
+# 129| exit ControlFlow
+
+# 129| exit ControlFlow (normal)
+#-----| -> exit ControlFlow
+
+# 130| {...}
+#-----| -> ...;
+
+# 131| ...;
+#-----| -> this access
+
+# 131| ... = ...
+#-----| -> exit ControlFlow (normal)
+
+# 131| this access
+#-----| -> access to parameter s
+
+# 131| access to parameter s
+#-----| -> ... = ...
+
+# 134| enter ControlFlow
+#-----| -> access to parameter i
+
+# 134| exit ControlFlow
+
+# 134| exit ControlFlow (normal)
+#-----| -> exit ControlFlow
+
+# 134| call to constructor ControlFlow
+#-----| -> {...}
+
+# 134| ... + ...
+#-----| -> call to constructor ControlFlow
+
+# 134| (...) ...
+#-----| -> ""
+
+# 134| access to parameter i
+#-----| -> (...) ...
+
+# 134| ""
+#-----| -> ... + ...
+
+# 134| {...}
+#-----| -> exit ControlFlow (normal)
+
+# 136| enter ControlFlow
+#-----| -> 0
+
+# 136| exit ControlFlow
+
+# 136| exit ControlFlow (normal)
+#-----| -> exit ControlFlow
+
+# 136| call to constructor ControlFlow
+#-----| -> {...}
+
+# 136| ... + ...
+#-----| -> call to constructor ControlFlow
+
+# 136| 0
+#-----| -> 1
+
+# 136| 1
+#-----| -> ... + ...
+
+# 136| {...}
+#-----| -> exit ControlFlow (normal)
+
+# 138| enter +
+#-----| -> {...}
+
+# 138| exit +
+
+# 138| exit + (normal)
+#-----| -> exit +
+
+# 139| {...}
+#-----| -> ...;
+
+# 140| ...;
+#-----| -> access to parameter x
+
+# 140| call to method WriteLine
+#-----| -> access to parameter y
+
+# 140| access to parameter x
+#-----| -> call to method WriteLine
+
+# 141| return ...;
+#-----| return -> exit + (normal)
+
+# 141| access to parameter y
+#-----| -> return ...;
+
+# 144| enter get_Item
+#-----| -> {...}
+
+# 144| exit get_Item
+
+# 144| exit get_Item (normal)
+#-----| -> exit get_Item
+
+# 144| {...}
+#-----| -> access to parameter i
+
+# 144| return ...;
+#-----| return -> exit get_Item (normal)
+
+# 144| ... + ...
+#-----| -> return ...;
+
+# 144| (...) ...
+#-----| -> ""
+
+# 144| access to parameter i
+#-----| -> (...) ...
+
+# 144| ""
+#-----| -> ... + ...
+
+# 144| enter set_Item
+#-----| -> {...}
+
+# 144| exit set_Item
+
+# 144| exit set_Item (normal)
+#-----| -> exit set_Item
+
+# 144| {...}
+#-----| -> exit set_Item (normal)
+
+# 146| enter For
+#-----| -> {...}
+
+# 146| exit For
+
+# 146| exit For (normal)
+#-----| -> exit For
+
+# 147| {...}
+#-----| -> ... ...;
+
+# 148| ... ...;
+#-----| -> 0
+
+# 148| Int32 x = ...
+#-----| -> for (...;...;...) ...
+
+# 148| 0
+#-----| -> Int32 x = ...
+
+# 149| for (...;...;...) ...
+#-----| -> access to local variable x
+
+# 149| ... < ...
+#-----| true -> ...;
+#-----| false -> for (...;...;...) ...
+
+# 149| access to local variable x
+#-----| -> 10
+
+# 149| 10
+#-----| -> ... < ...
+
+# 149| ++...
+#-----| -> access to local variable x
+
+# 149| access to local variable x
+#-----| -> ++...
+
+# 150| ...;
+#-----| -> access to local variable x
+
+# 150| call to method WriteLine
+#-----| -> access to local variable x
+
+# 150| access to local variable x
+#-----| -> call to method WriteLine
+
+# 152| for (...;...;...) ...
+#-----| -> {...}
+
+# 152| ...++
+#-----| -> {...}
+
+# 152| access to local variable x
+#-----| -> ...++
+
+# 153| {...}
+#-----| -> ...;
+
+# 154| ...;
+#-----| -> access to local variable x
+
+# 154| call to method WriteLine
+#-----| -> if (...) ...
+
+# 154| access to local variable x
+#-----| -> call to method WriteLine
+
+# 155| if (...) ...
+#-----| -> access to local variable x
+
+# 155| ... > ...
+#-----| false -> access to local variable x
+#-----| true -> break;
+
+# 155| access to local variable x
+#-----| -> 20
+
+# 155| 20
+#-----| -> ... > ...
+
+# 156| break;
+#-----| break -> for (...;...;...) ...
+
+# 159| for (...;...;...) ...
+#-----| -> {...}
+
+# 160| {...}
+#-----| -> ...;
+
+# 161| ...;
+#-----| -> access to local variable x
+
+# 161| call to method WriteLine
+#-----| -> ...;
+
+# 161| access to local variable x
+#-----| -> call to method WriteLine
+
+# 162| ...;
+#-----| -> access to local variable x
+
+# 162| ...++
+#-----| -> if (...) ...
+
+# 162| access to local variable x
+#-----| -> ...++
+
+# 163| if (...) ...
+#-----| -> access to local variable x
+
+# 163| ... > ...
+#-----| false -> {...}
+#-----| true -> break;
+
+# 163| access to local variable x
+#-----| -> 30
+
+# 163| 30
+#-----| -> ... > ...
+
+# 164| break;
+#-----| break -> for (...;...;...) ...
+
+# 167| for (...;...;...) ...
+#-----| -> access to local variable x
+
+# 167| ... < ...
+#-----| true -> {...}
+#-----| false -> for (...;...;...) ...
+
+# 167| access to local variable x
+#-----| -> 40
+
+# 167| 40
+#-----| -> ... < ...
+
+# 168| {...}
+#-----| -> ...;
+
+# 169| ...;
+#-----| -> access to local variable x
+
+# 169| call to method WriteLine
+#-----| -> ...;
+
+# 169| access to local variable x
+#-----| -> call to method WriteLine
+
+# 170| ...;
+#-----| -> access to local variable x
+
+# 170| ...++
+#-----| -> access to local variable x
+
+# 170| access to local variable x
+#-----| -> ...++
+
+# 173| for (...;...;...) ...
+#-----| -> 0
+
+# 173| Int32 i = ...
+#-----| -> 0
+
+# 173| 0
+#-----| -> Int32 i = ...
+
+# 173| Int32 j = ...
+#-----| -> access to local variable i
+
+# 173| 0
+#-----| -> Int32 j = ...
+
+# 173| ... < ...
+#-----| true -> {...}
+#-----| false -> exit For (normal)
+
+# 173| ... + ...
+#-----| -> 10
+
+# 173| access to local variable i
+#-----| -> access to local variable j
+
+# 173| access to local variable j
+#-----| -> ... + ...
+
+# 173| 10
+#-----| -> ... < ...
+
+# 173| ...++
+#-----| -> access to local variable j
+
+# 173| access to local variable i
+#-----| -> ...++
+
+# 173| ...++
+#-----| -> access to local variable i
+
+# 173| access to local variable j
+#-----| -> ...++
+
+# 174| {...}
+#-----| -> ...;
+
+# 175| ...;
+#-----| -> access to local variable i
+
+# 175| call to method WriteLine
+#-----| -> access to local variable i
+
+# 175| ... + ...
+#-----| -> call to method WriteLine
+
+# 175| access to local variable i
+#-----| -> access to local variable j
+
+# 175| access to local variable j
+#-----| -> ... + ...
+
+# 179| enter Lambdas
+#-----| -> {...}
+
+# 179| exit Lambdas
+
+# 179| exit Lambdas (normal)
+#-----| -> exit Lambdas
+
+# 180| {...}
+#-----| -> ... ...;
+
+# 181| ... ...;
+#-----| -> (...) => ...
+
+# 181| Func y = ...
+#-----| -> ... ...;
+
+# 181| enter (...) => ...
+#-----| -> access to parameter x
+
+# 181| (...) => ...
+#-----| -> Func y = ...
+
+# 181| exit (...) => ...
+
+# 181| exit (...) => ... (normal)
+#-----| -> exit (...) => ...
+
+# 181| ... + ...
+#-----| -> exit (...) => ... (normal)
+
+# 181| access to parameter x
+#-----| -> 1
+
+# 181| 1
+#-----| -> ... + ...
+
+# 182| ... ...;
+#-----| -> delegate(...) { ... }
+
+# 182| Func z = ...
+#-----| -> exit Lambdas (normal)
+
+# 182| enter delegate(...) { ... }
+#-----| -> {...}
+
+# 182| delegate(...) { ... }
+#-----| -> Func z = ...
+
+# 182| exit delegate(...) { ... }
+
+# 182| exit delegate(...) { ... } (normal)
+#-----| -> exit delegate(...) { ... }
+
+# 182| {...}
+#-----| -> access to parameter x
+
+# 182| return ...;
+#-----| return -> exit delegate(...) { ... } (normal)
+
+# 182| ... + ...
+#-----| -> return ...;
+
+# 182| access to parameter x
+#-----| -> 1
+
+# 182| 1
+#-----| -> ... + ...
+
+# 185| enter LogicalOr
+#-----| -> {...}
+
+# 185| exit LogicalOr
+
+# 185| exit LogicalOr (normal)
+#-----| -> exit LogicalOr
+
+# 186| {...}
+#-----| -> if (...) ...
+
+# 187| if (...) ...
+#-----| -> 1
+
+# 187| [false] ... || ...
+#-----| false -> ...;
+
+# 187| [false] ... || ...
+#-----| false -> 1
+
+# 187| ... == ...
+#-----| false -> 2
+
+# 187| 1
+#-----| -> 2
+
+# 187| 2
+#-----| -> ... == ...
+
+# 187| ... == ...
+#-----| false -> [false] ... || ...
+
+# 187| 2
+#-----| -> 3
+
+# 187| 3
+#-----| -> ... == ...
+
+# 187| [false] ... && ...
+#-----| false -> [false] ... || ...
+
+# 187| ... == ...
+#-----| false -> [false] ... && ...
+
+# 187| 1
+#-----| -> 3
+
+# 187| 3
+#-----| -> ... == ...
+
+# 190| ...;
+#-----| -> "This should happen"
+
+# 190| call to method WriteLine
+#-----| -> exit LogicalOr (normal)
+
+# 190| "This should happen"
+#-----| -> call to method WriteLine
+
+# 193| enter Booleans
+#-----| -> {...}
+
+# 193| exit Booleans
+
+# 193| exit Booleans (abnormal)
+#-----| -> exit Booleans
+
+# 193| exit Booleans (normal)
+#-----| -> exit Booleans
+
+# 194| {...}
+#-----| -> ... ...;
+
+# 195| ... ...;
+#-----| -> this access
+
+# 195| Boolean b = ...
+#-----| -> if (...) ...
+
+# 195| ... && ...
+#-----| -> Boolean b = ...
+
+# 195| ... > ...
+#-----| false -> ... && ...
+#-----| true -> this access
+
+# 195| access to property Length
+#-----| -> 0
+
+# 195| access to field Field
+#-----| -> access to property Length
+
+# 195| this access
+#-----| -> access to field Field
+
+# 195| 0
+#-----| -> ... > ...
+
+# 195| !...
+#-----| -> ... && ...
+
+# 195| ... == ...
+#-----| -> !...
+
+# 195| access to property Length
+#-----| -> 1
+
+# 195| access to field Field
+#-----| -> access to property Length
+
+# 195| this access
+#-----| -> access to field Field
+
+# 195| 1
+#-----| -> ... == ...
+
+# 197| if (...) ...
+#-----| -> this access
+
+# 197| [false] !...
+#-----| false -> if (...) ...
+
+# 197| [true] !...
+#-----| true -> ...;
+
+# 197| [false] ... ? ... : ...
+#-----| false -> [true] !...
+
+# 197| [true] ... ? ... : ...
+#-----| true -> [false] !...
+
+# 197| ... == ...
+#-----| true -> false
+#-----| false -> true
+
+# 197| access to property Length
+#-----| -> 0
+
+# 197| access to field Field
+#-----| -> access to property Length
+
+# 197| this access
+#-----| -> access to field Field
+
+# 197| 0
+#-----| -> ... == ...
+
+# 197| false
+#-----| false -> [false] ... ? ... : ...
+
+# 197| true
+#-----| true -> [true] ... ? ... : ...
+
+# 198| ...;
+#-----| -> this access
+
+# 198| ... = ...
+#-----| -> if (...) ...
+
+# 198| ... ? ... : ...
+#-----| -> ... = ...
+
+# 198| ... == ...
+#-----| true -> false
+#-----| false -> true
+
+# 198| access to property Length
+#-----| -> 0
+
+# 198| access to field Field
+#-----| -> access to property Length
+
+# 198| this access
+#-----| -> access to field Field
+
+# 198| 0
+#-----| -> ... == ...
+
+# 198| false
+#-----| -> ... ? ... : ...
+
+# 198| true
+#-----| -> ... ? ... : ...
+
+# 200| if (...) ...
+#-----| -> this access
+
+# 200| [false] ... || ...
+#-----| false -> exit Booleans (normal)
+
+# 200| [true] ... || ...
+#-----| true -> {...}
+
+# 200| [false] !...
+#-----| false -> this access
+
+# 200| [true] !...
+#-----| true -> [true] ... || ...
+
+# 200| ... == ...
+#-----| true -> [false] !...
+#-----| false -> [true] !...
+
+# 200| access to property Length
+#-----| -> 0
+
+# 200| access to field Field
+#-----| -> access to property Length
+
+# 200| this access
+#-----| -> access to field Field
+
+# 200| 0
+#-----| -> ... == ...
+
+# 200| [false] !...
+#-----| false -> [false] ... || ...
+
+# 200| [true] !...
+#-----| true -> [true] ... || ...
+
+# 200| [false] !...
+#-----| false -> [true] !...
+
+# 200| [true] !...
+#-----| true -> [false] !...
+
+# 200| [false] ... && ...
+#-----| false -> [true] !...
+
+# 200| [true] ... && ...
+#-----| true -> [false] !...
+
+# 200| ... == ...
+#-----| false -> [false] ... && ...
+#-----| true -> access to local variable b
+
+# 200| access to property Length
+#-----| -> 1
+
+# 200| access to field Field
+#-----| -> access to property Length
+
+# 200| this access
+#-----| -> access to field Field
+
+# 200| 1
+#-----| -> ... == ...
+
+# 200| access to local variable b
+#-----| false -> [false] ... && ...
+#-----| true -> [true] ... && ...
+
+# 201| {...}
+#-----| -> {...}
+
+# 202| {...}
+#-----| -> object creation of type Exception
+
+# 203| throw ...;
+#-----| exception(Exception) -> exit Booleans (abnormal)
+
+# 203| object creation of type Exception
+#-----| -> throw ...;
+
+# 208| enter Do
+#-----| -> {...}
+
+# 208| exit Do
+
+# 208| exit Do (normal)
+#-----| -> exit Do
+
+# 209| {...}
+#-----| -> do ... while (...);
+
+# 210| do ... while (...);
+#-----| -> {...}
+
+# 211| {...}
+#-----| -> ...;
+
+# 212| ...;
+#-----| -> this access
+
+# 212| ... = ...
+#-----| -> if (...) ...
+
+# 212| this access
+#-----| -> this access
+
+# 212| ... + ...
+#-----| -> ... = ...
+
+# 212| access to field Field
+#-----| -> "a"
+
+# 212| this access
+#-----| -> access to field Field
+
+# 212| "a"
+#-----| -> ... + ...
+
+# 213| if (...) ...
+#-----| -> this access
+
+# 213| ... > ...
+#-----| true -> {...}
+#-----| false -> if (...) ...
+
+# 213| access to property Length
+#-----| -> 0
+
+# 213| access to field Field
+#-----| -> access to property Length
+
+# 213| this access
+#-----| -> access to field Field
+
+# 213| 0
+#-----| -> ... > ...
+
+# 214| {...}
+#-----| -> continue;
+
+# 215| continue;
+#-----| continue -> this access
+
+# 217| if (...) ...
+#-----| -> this access
+
+# 217| ... < ...
+#-----| true -> {...}
+#-----| false -> this access
+
+# 217| access to property Length
+#-----| -> 0
+
+# 217| access to field Field
+#-----| -> access to property Length
+
+# 217| this access
+#-----| -> access to field Field
+
+# 217| 0
+#-----| -> ... < ...
+
+# 218| {...}
+#-----| -> break;
+
+# 219| break;
+#-----| break -> exit Do (normal)
+
+# 221| ... < ...
+#-----| true -> {...}
+#-----| false -> exit Do (normal)
+
+# 221| access to property Length
+#-----| -> 10
+
+# 221| access to field Field
+#-----| -> access to property Length
+
+# 221| this access
+#-----| -> access to field Field
+
+# 221| 10
+#-----| -> ... < ...
+
+# 224| enter Foreach
+#-----| -> {...}
+
+# 224| exit Foreach
+
+# 224| exit Foreach (normal)
+#-----| -> exit Foreach
+
+# 225| {...}
+#-----| -> "a"
+
+# 226| foreach (... ... in ...) ...
+#-----| non-empty -> String x
+#-----| empty -> exit Foreach (normal)
+
+# 226| String x
+#-----| -> {...}
+
+# 226| call to method Repeat
+#-----| -> foreach (... ... in ...) ...
+
+# 226| "a"
+#-----| -> 10
+
+# 226| 10
+#-----| -> call to method Repeat
+
+# 227| {...}
+#-----| -> ...;
+
+# 228| ...;
+#-----| -> this access
+
+# 228| ... = ...
+#-----| -> if (...) ...
+
+# 228| this access
+#-----| -> this access
+
+# 228| ... + ...
+#-----| -> ... = ...
+
+# 228| access to field Field
+#-----| -> access to local variable x
+
+# 228| this access
+#-----| -> access to field Field
+
+# 228| access to local variable x
+#-----| -> ... + ...
+
+# 229| if (...) ...
+#-----| -> this access
+
+# 229| ... > ...
+#-----| true -> {...}
+#-----| false -> if (...) ...
+
+# 229| access to property Length
+#-----| -> 0
+
+# 229| access to field Field
+#-----| -> access to property Length
+
+# 229| this access
+#-----| -> access to field Field
+
+# 229| 0
+#-----| -> ... > ...
+
+# 230| {...}
+#-----| -> continue;
+
+# 231| continue;
+#-----| continue -> foreach (... ... in ...) ...
+
+# 233| if (...) ...
+#-----| -> this access
+
+# 233| ... < ...
+#-----| false -> foreach (... ... in ...) ...
+#-----| true -> {...}
+
+# 233| access to property Length
+#-----| -> 0
+
+# 233| access to field Field
+#-----| -> access to property Length
+
+# 233| this access
+#-----| -> access to field Field
+
+# 233| 0
+#-----| -> ... < ...
+
+# 234| {...}
+#-----| -> break;
+
+# 235| break;
+#-----| break -> exit Foreach (normal)
+
+# 240| enter Goto
+#-----| -> {...}
+
+# 240| exit Goto
+
+# 240| exit Goto (normal)
+#-----| -> exit Goto
+
+# 241| {...}
+#-----| -> Label:
+
+# 242| Label:
+#-----| -> if (...) ...
+
+# 242| if (...) ...
+#-----| -> this access
+
+# 242| [false] !...
+#-----| false -> if (...) ...
+
+# 242| [true] !...
+#-----| true -> {...}
+
+# 242| [false] !...
+#-----| false -> [true] !...
+
+# 242| [true] !...
+#-----| true -> [false] !...
+
+# 242| ... == ...
+#-----| true -> [false] !...
+#-----| false -> [true] !...
+
+# 242| access to property Length
+#-----| -> 0
+
+# 242| access to field Field
+#-----| -> access to property Length
+
+# 242| this access
+#-----| -> access to field Field
+
+# 242| 0
+#-----| -> ... == ...
+
+# 242| {...}
+#-----| -> if (...) ...
+
+# 244| if (...) ...
+#-----| -> this access
+
+# 244| ... > ...
+#-----| true -> goto ...;
+#-----| false -> switch (...) {...}
+
+# 244| access to property Length
+#-----| -> 0
+
+# 244| access to field Field
+#-----| -> access to property Length
+
+# 244| this access
+#-----| -> access to field Field
+
+# 244| 0
+#-----| -> ... > ...
+
+# 244| goto ...;
+#-----| goto(Label) -> Label:
+
+# 246| switch (...) {...}
+#-----| -> this access
+
+# 246| ... + ...
+#-----| -> case ...:
+
+# 246| access to property Length
+#-----| -> 3
+
+# 246| access to field Field
+#-----| -> access to property Length
+
+# 246| this access
+#-----| -> access to field Field
+
+# 246| 3
+#-----| -> ... + ...
+
+# 248| case ...:
+#-----| -> 0
+
+# 248| 0
+#-----| match -> goto default;
+#-----| no-match -> case ...:
+
+# 249| goto default;
+#-----| goto(default) -> default:
+
+# 250| case ...:
+#-----| -> 1
+
+# 250| 1
+#-----| match -> ...;
+#-----| no-match -> case ...:
+
+# 251| ...;
+#-----| -> 1
+
+# 251| call to method WriteLine
+#-----| -> break;
+
+# 251| 1
+#-----| -> call to method WriteLine
+
+# 252| break;
+#-----| break -> exit Goto (normal)
+
+# 253| case ...:
+#-----| -> 2
+
+# 253| 2
+#-----| match -> goto ...;
+#-----| no-match -> default:
+
+# 254| goto ...;
+#-----| goto(Label) -> Label:
+
+# 255| default:
+#-----| -> ...;
+
+# 256| ...;
+#-----| -> 0
+
+# 256| call to method WriteLine
+#-----| -> break;
+
+# 256| 0
+#-----| -> call to method WriteLine
+
+# 257| break;
+#-----| break -> exit Goto (normal)
+
+# 261| enter Yield
+#-----| -> {...}
+
+# 261| exit Yield
+
+# 261| exit Yield (normal)
+#-----| -> exit Yield
+
+# 262| {...}
+#-----| -> 0
+
+# 263| yield return ...;
+#-----| -> for (...;...;...) ...
+
+# 263| 0
+#-----| -> yield return ...;
+
+# 264| for (...;...;...) ...
+#-----| -> 1
+
+# 264| Int32 i = ...
+#-----| -> access to local variable i
+
+# 264| 1
+#-----| -> Int32 i = ...
+
+# 264| ... < ...
+#-----| true -> {...}
+#-----| false -> try {...} ...
+
+# 264| access to local variable i
+#-----| -> 10
+
+# 264| 10
+#-----| -> ... < ...
+
+# 264| ...++
+#-----| -> access to local variable i
+
+# 264| access to local variable i
+#-----| -> ...++
+
+# 265| {...}
+#-----| -> access to local variable i
+
+# 266| yield return ...;
+#-----| -> access to local variable i
+
+# 266| access to local variable i
+#-----| -> yield return ...;
+
+# 268| try {...} ...
+#-----| -> {...}
+
+# 269| {...}
+#-----| -> yield break;
+
+# 270| yield break;
+#-----| return -> [finally: return] {...}
+
+# 274| [finally: return] {...}
+#-----| -> [finally: return] ...;
+
+# 275| [finally: return] ...;
+#-----| -> [finally: return] "not dead"
+
+# 275| [finally: return] call to method WriteLine
+#-----| return -> exit Yield (normal)
+
+# 275| [finally: return] "not dead"
+#-----| -> [finally: return] call to method WriteLine
+
+# 282| enter ControlFlowSub
+#-----| -> call to constructor ControlFlow
+
+# 282| exit ControlFlowSub
+
+# 282| exit ControlFlowSub (normal)
+#-----| -> exit ControlFlowSub
+
+# 282| call to constructor ControlFlow
+#-----| -> {...}
+
+# 282| {...}
+#-----| -> exit ControlFlowSub (normal)
+
+# 284| enter ControlFlowSub
+#-----| -> call to constructor ControlFlowSub
+
+# 284| exit ControlFlowSub
+
+# 284| exit ControlFlowSub (normal)
+#-----| -> exit ControlFlowSub
+
+# 284| call to constructor ControlFlowSub
+#-----| -> {...}
+
+# 284| {...}
+#-----| -> exit ControlFlowSub (normal)
+
+# 286| enter ControlFlowSub
+#-----| -> access to parameter i
+
+# 286| exit ControlFlowSub
+
+# 286| exit ControlFlowSub (normal)
+#-----| -> exit ControlFlowSub
+
+# 286| call to constructor ControlFlowSub
+#-----| -> {...}
+
+# 286| call to method ToString
+#-----| -> call to constructor ControlFlowSub
+
+# 286| access to parameter i
+#-----| -> call to method ToString
+
+# 286| {...}
+#-----| -> exit ControlFlowSub (normal)
+
+# 291| enter M
+#-----| -> access to parameter f
+
+# 291| exit M
+
+# 291| exit M (normal)
+#-----| -> exit M
+
+# 291| delegate call
+#-----| -> exit M (normal)
+
+# 291| access to parameter f
+#-----| -> 0
+
+# 291| 0
+#-----| -> delegate call
+
+# 296| enter NegationInConstructor
+#-----| -> call to constructor Object
+
+# 296| call to constructor Object
+#-----| -> {...}
+
+# 296| exit NegationInConstructor
+
+# 296| exit NegationInConstructor (normal)
+#-----| -> exit NegationInConstructor
+
+# 296| {...}
+#-----| -> exit NegationInConstructor (normal)
+
+# 298| enter M
+#-----| -> {...}
+
+# 298| exit M
+
+# 298| exit M (normal)
+#-----| -> exit M
+
+# 299| {...}
+#-----| -> ...;
+
+# 300| ...;
+#-----| -> 0
+
+# 300| object creation of type NegationInConstructor
+#-----| -> exit M (normal)
+
+# 300| 0
+#-----| -> access to parameter i
+
+# 300| ... && ...
+#-----| -> ""
+
+# 300| [false] !...
+#-----| false -> ... && ...
+
+# 300| [true] !...
+#-----| true -> access to parameter s
+
+# 300| ... > ...
+#-----| true -> [false] !...
+#-----| false -> [true] !...
+
+# 300| access to parameter i
+#-----| -> 0
+
+# 300| 0
+#-----| -> ... > ...
+
+# 300| ... != ...
+#-----| -> ... && ...
+
+# 300| access to parameter s
+#-----| -> null
+
+# 300| null
+#-----| -> ... != ...
+
+# 300| ""
+#-----| -> object creation of type NegationInConstructor
diff --git a/csharp/ql/test/library-tests/controlflow/graph/NodeGraph.ql b/csharp/ql/test/library-tests/controlflow/graph/NodeGraph.ql
index 4a1cf5b5880..cf1ba3f9598 100644
--- a/csharp/ql/test/library-tests/controlflow/graph/NodeGraph.ql
+++ b/csharp/ql/test/library-tests/controlflow/graph/NodeGraph.ql
@@ -1,11 +1,9 @@
+/**
+ * @kind graph
+ */
+
import csharp
import Common
+import semmle.code.csharp.controlflow.internal.ControlFlowGraphImplShared::TestOutput
-query predicate edges(
- SourceControlFlowNode node, SourceControlFlowNode successor, string attr, string val
-) {
- exists(ControlFlow::SuccessorType t | successor = node.getASuccessorByType(t) |
- attr = "semmle.label" and
- val = t.toString()
- )
-}
+private class MyRelevantNode extends RelevantNode, SourceControlFlowNode { }
diff --git a/csharp/ql/test/library-tests/dataflow/call-sensitivity/CallSensitivityFlow.cs b/csharp/ql/test/library-tests/dataflow/call-sensitivity/CallSensitivityFlow.cs
index a4ee5b7d6da..9470b4536dc 100644
--- a/csharp/ql/test/library-tests/dataflow/call-sensitivity/CallSensitivityFlow.cs
+++ b/csharp/ql/test/library-tests/dataflow/call-sensitivity/CallSensitivityFlow.cs
@@ -169,6 +169,10 @@ public class A2
a2.M(o);
}
+ public virtual object MOut() => new object();
+
+ public static object CallMOut(A2 a2) => a2.MOut();
+
public void Callsite(InterfaceB intF)
{
B b = new B();
@@ -179,6 +183,11 @@ public class A2
CallM(b, new object()); // no flow to `Sink()`
CallM(this, new object()); // flow to `Sink()`
+
+ var o = CallMOut(this);
+ Sink(o); // flow
+ o = CallMOut(b);
+ Sink(o); // no flow
}
public class B : A2
@@ -187,11 +196,12 @@ public class A2
{
}
+
+ public override object MOut() => throw null;
}
public class IntA : InterfaceB
{
-
public void Foo(A2 obj, object o, bool cond)
{
obj.M(o);
@@ -210,7 +220,6 @@ public class A2
}
}
}
-
}
public interface InterfaceA
diff --git a/csharp/ql/test/library-tests/dataflow/call-sensitivity/CallSensitivityFlow.expected b/csharp/ql/test/library-tests/dataflow/call-sensitivity/CallSensitivityFlow.expected
index 6afa5f20756..7d87f84d155 100644
--- a/csharp/ql/test/library-tests/dataflow/call-sensitivity/CallSensitivityFlow.expected
+++ b/csharp/ql/test/library-tests/dataflow/call-sensitivity/CallSensitivityFlow.expected
@@ -31,9 +31,12 @@ edges
| CallSensitivityFlow.cs:162:34:162:34 | o : Object | CallSensitivityFlow.cs:164:14:164:14 | access to parameter o |
| CallSensitivityFlow.cs:167:44:167:44 | o : Object | CallSensitivityFlow.cs:169:14:169:14 | access to parameter o : Object |
| CallSensitivityFlow.cs:169:14:169:14 | access to parameter o : Object | CallSensitivityFlow.cs:162:34:162:34 | o : Object |
-| CallSensitivityFlow.cs:178:21:178:32 | object creation of type Object : Object | CallSensitivityFlow.cs:195:40:195:40 | o : Object |
-| CallSensitivityFlow.cs:181:21:181:32 | object creation of type Object : Object | CallSensitivityFlow.cs:167:44:167:44 | o : Object |
-| CallSensitivityFlow.cs:195:40:195:40 | o : Object | CallSensitivityFlow.cs:198:18:198:18 | access to parameter o |
+| CallSensitivityFlow.cs:172:37:172:48 | object creation of type Object : Object | CallSensitivityFlow.cs:174:45:174:53 | call to method MOut : Object |
+| CallSensitivityFlow.cs:174:45:174:53 | call to method MOut : Object | CallSensitivityFlow.cs:187:17:187:30 | call to method CallMOut : Object |
+| CallSensitivityFlow.cs:182:21:182:32 | object creation of type Object : Object | CallSensitivityFlow.cs:205:40:205:40 | o : Object |
+| CallSensitivityFlow.cs:185:21:185:32 | object creation of type Object : Object | CallSensitivityFlow.cs:167:44:167:44 | o : Object |
+| CallSensitivityFlow.cs:187:17:187:30 | call to method CallMOut : Object | CallSensitivityFlow.cs:188:14:188:14 | access to local variable o |
+| CallSensitivityFlow.cs:205:40:205:40 | o : Object | CallSensitivityFlow.cs:208:18:208:18 | access to parameter o |
nodes
| CallSensitivityFlow.cs:19:39:19:39 | o : Object | semmle.label | o : Object |
| CallSensitivityFlow.cs:23:18:23:18 | access to parameter o | semmle.label | access to parameter o |
@@ -78,10 +81,14 @@ nodes
| CallSensitivityFlow.cs:164:14:164:14 | access to parameter o | semmle.label | access to parameter o |
| CallSensitivityFlow.cs:167:44:167:44 | o : Object | semmle.label | o : Object |
| CallSensitivityFlow.cs:169:14:169:14 | access to parameter o : Object | semmle.label | access to parameter o : Object |
-| CallSensitivityFlow.cs:178:21:178:32 | object creation of type Object : Object | semmle.label | object creation of type Object : Object |
-| CallSensitivityFlow.cs:181:21:181:32 | object creation of type Object : Object | semmle.label | object creation of type Object : Object |
-| CallSensitivityFlow.cs:195:40:195:40 | o : Object | semmle.label | o : Object |
-| CallSensitivityFlow.cs:198:18:198:18 | access to parameter o | semmle.label | access to parameter o |
+| CallSensitivityFlow.cs:172:37:172:48 | object creation of type Object : Object | semmle.label | object creation of type Object : Object |
+| CallSensitivityFlow.cs:174:45:174:53 | call to method MOut : Object | semmle.label | call to method MOut : Object |
+| CallSensitivityFlow.cs:182:21:182:32 | object creation of type Object : Object | semmle.label | object creation of type Object : Object |
+| CallSensitivityFlow.cs:185:21:185:32 | object creation of type Object : Object | semmle.label | object creation of type Object : Object |
+| CallSensitivityFlow.cs:187:17:187:30 | call to method CallMOut : Object | semmle.label | call to method CallMOut : Object |
+| CallSensitivityFlow.cs:188:14:188:14 | access to local variable o | semmle.label | access to local variable o |
+| CallSensitivityFlow.cs:205:40:205:40 | o : Object | semmle.label | o : Object |
+| CallSensitivityFlow.cs:208:18:208:18 | access to parameter o | semmle.label | access to parameter o |
#select
| CallSensitivityFlow.cs:78:24:78:35 | object creation of type Object : Object | CallSensitivityFlow.cs:78:24:78:35 | object creation of type Object : Object | CallSensitivityFlow.cs:23:18:23:18 | access to parameter o | $@ | CallSensitivityFlow.cs:23:18:23:18 | access to parameter o | access to parameter o |
| CallSensitivityFlow.cs:79:25:79:36 | object creation of type Object : Object | CallSensitivityFlow.cs:79:25:79:36 | object creation of type Object : Object | CallSensitivityFlow.cs:31:18:31:18 | access to parameter o | $@ | CallSensitivityFlow.cs:31:18:31:18 | access to parameter o | access to parameter o |
@@ -100,5 +107,6 @@ nodes
| CallSensitivityFlow.cs:117:26:117:37 | object creation of type Object : Object | CallSensitivityFlow.cs:117:26:117:37 | object creation of type Object : Object | CallSensitivityFlow.cs:128:22:128:22 | access to parameter o | $@ | CallSensitivityFlow.cs:128:22:128:22 | access to parameter o | access to parameter o |
| CallSensitivityFlow.cs:118:27:118:38 | object creation of type Object : Object | CallSensitivityFlow.cs:118:27:118:38 | object creation of type Object : Object | CallSensitivityFlow.cs:136:22:136:22 | access to parameter o | $@ | CallSensitivityFlow.cs:136:22:136:22 | access to parameter o | access to parameter o |
| CallSensitivityFlow.cs:119:32:119:43 | object creation of type Object : Object | CallSensitivityFlow.cs:119:32:119:43 | object creation of type Object : Object | CallSensitivityFlow.cs:150:18:150:19 | access to local variable o3 | $@ | CallSensitivityFlow.cs:150:18:150:19 | access to local variable o3 | access to local variable o3 |
-| CallSensitivityFlow.cs:178:21:178:32 | object creation of type Object : Object | CallSensitivityFlow.cs:178:21:178:32 | object creation of type Object : Object | CallSensitivityFlow.cs:198:18:198:18 | access to parameter o | $@ | CallSensitivityFlow.cs:198:18:198:18 | access to parameter o | access to parameter o |
-| CallSensitivityFlow.cs:181:21:181:32 | object creation of type Object : Object | CallSensitivityFlow.cs:181:21:181:32 | object creation of type Object : Object | CallSensitivityFlow.cs:164:14:164:14 | access to parameter o | $@ | CallSensitivityFlow.cs:164:14:164:14 | access to parameter o | access to parameter o |
+| CallSensitivityFlow.cs:172:37:172:48 | object creation of type Object : Object | CallSensitivityFlow.cs:172:37:172:48 | object creation of type Object : Object | CallSensitivityFlow.cs:188:14:188:14 | access to local variable o | $@ | CallSensitivityFlow.cs:188:14:188:14 | access to local variable o | access to local variable o |
+| CallSensitivityFlow.cs:182:21:182:32 | object creation of type Object : Object | CallSensitivityFlow.cs:182:21:182:32 | object creation of type Object : Object | CallSensitivityFlow.cs:208:18:208:18 | access to parameter o | $@ | CallSensitivityFlow.cs:208:18:208:18 | access to parameter o | access to parameter o |
+| CallSensitivityFlow.cs:185:21:185:32 | object creation of type Object : Object | CallSensitivityFlow.cs:185:21:185:32 | object creation of type Object : Object | CallSensitivityFlow.cs:164:14:164:14 | access to parameter o | $@ | CallSensitivityFlow.cs:164:14:164:14 | access to parameter o | access to parameter o |
diff --git a/csharp/ql/test/library-tests/generics/ConsistencyChecks.ql b/csharp/ql/test/library-tests/generics/ConsistencyChecks.ql
index def07f2c435..7052c6f697a 100644
--- a/csharp/ql/test/library-tests/generics/ConsistencyChecks.ql
+++ b/csharp/ql/test/library-tests/generics/ConsistencyChecks.ql
@@ -6,4 +6,4 @@ import semmle.code.csharp.commons.ConsistencyChecks
from Element e, string m
where consistencyFailure(e, m)
-select e, "Element class " + e.getAPrimaryQlClass() + " has consistency check failed: " + m
+select e, "Element class " + e.getPrimaryQlClasses() + " has consistency check failed: " + m
diff --git a/csharp/ql/test/qlpack.yml b/csharp/ql/test/qlpack.yml
index 9882ae18d14..4d1507c0c1a 100644
--- a/csharp/ql/test/qlpack.yml
+++ b/csharp/ql/test/qlpack.yml
@@ -1,5 +1,7 @@
name: codeql-csharp-tests
version: 0.0.0
-libraryPathDependencies: codeql-csharp
+dependencies:
+ codeql/csharp-all: ^0.0.2
+ codeql/csharp-queries: ^0.0.2
extractor: csharp
tests: .
diff --git a/csharp/ql/test/query-tests/Security Features/CWE-327/InsecureSQLConnection/InsecureSQLConnection.cs b/csharp/ql/test/query-tests/Security Features/CWE-327/InsecureSQLConnection/InsecureSQLConnection.cs
index c57499a14ce..826c88fff73 100644
--- a/csharp/ql/test/query-tests/Security Features/CWE-327/InsecureSQLConnection/InsecureSQLConnection.cs
+++ b/csharp/ql/test/query-tests/Security Features/CWE-327/InsecureSQLConnection/InsecureSQLConnection.cs
@@ -34,7 +34,7 @@ namespace InsecureSQLConnection
public void TriggerThis()
{
- // BAD, Encrypt not specified [NOT DETECTED]
+ // BAD, Encrypt not specified
SqlConnection conn = new SqlConnection("Server=myServerName\\myInstanceName;Database=myDataBase;User Id=myUsername;");
}
@@ -42,7 +42,7 @@ namespace InsecureSQLConnection
{
string connectString =
"Server=1.2.3.4;Database=Anything;UID=ab;Pwd=cd";
- // BAD, Encrypt not specified [NOT DETECTED]
+ // BAD, Encrypt not specified
SqlConnectionStringBuilder builder = new SqlConnectionStringBuilder(connectString);
var conn = new SqlConnection(builder.ConnectionString);
}
@@ -51,7 +51,7 @@ namespace InsecureSQLConnection
{
string connectString =
"Server=1.2.3.4;Database=Anything;UID=ab;Pwd=cd;Encrypt=false";
- // BAD, Encrypt set to false [NOT DETECTED]
+ // BAD, Encrypt set to false
SqlConnectionStringBuilder builder = new SqlConnectionStringBuilder(connectString);
var conn = new SqlConnection(builder.ConnectionString);
}
diff --git a/csharp/ql/test/query-tests/Security Features/CWE-327/InsecureSQLConnection/InsecureSQLConnection.expected b/csharp/ql/test/query-tests/Security Features/CWE-327/InsecureSQLConnection/InsecureSQLConnection.expected
index e69de29bb2d..819cebbd064 100644
--- a/csharp/ql/test/query-tests/Security Features/CWE-327/InsecureSQLConnection/InsecureSQLConnection.expected
+++ b/csharp/ql/test/query-tests/Security Features/CWE-327/InsecureSQLConnection/InsecureSQLConnection.expected
@@ -0,0 +1,13 @@
+edges
+| InsecureSQLConnection.cs:44:17:44:64 | "Server=1.2.3.4;Database=Anything;UID=ab;Pwd=cd" : String | InsecureSQLConnection.cs:46:81:46:93 | access to local variable connectString |
+| InsecureSQLConnection.cs:53:17:53:78 | "Server=1.2.3.4;Database=Anything;UID=ab;Pwd=cd;Encrypt=false" : String | InsecureSQLConnection.cs:55:81:55:93 | access to local variable connectString |
+nodes
+| InsecureSQLConnection.cs:38:52:38:128 | "Server=myServerName\\myInstanceName;Database=myDataBase;User Id=myUsername;" | semmle.label | "Server=myServerName\\myInstanceName;Database=myDataBase;User Id=myUsername;" |
+| InsecureSQLConnection.cs:44:17:44:64 | "Server=1.2.3.4;Database=Anything;UID=ab;Pwd=cd" : String | semmle.label | "Server=1.2.3.4;Database=Anything;UID=ab;Pwd=cd" : String |
+| InsecureSQLConnection.cs:46:81:46:93 | access to local variable connectString | semmle.label | access to local variable connectString |
+| InsecureSQLConnection.cs:53:17:53:78 | "Server=1.2.3.4;Database=Anything;UID=ab;Pwd=cd;Encrypt=false" : String | semmle.label | "Server=1.2.3.4;Database=Anything;UID=ab;Pwd=cd;Encrypt=false" : String |
+| InsecureSQLConnection.cs:55:81:55:93 | access to local variable connectString | semmle.label | access to local variable connectString |
+#select
+| InsecureSQLConnection.cs:38:52:38:128 | "Server=myServerName\\myInstanceName;Database=myDataBase;User Id=myUsername;" | InsecureSQLConnection.cs:38:52:38:128 | "Server=myServerName\\myInstanceName;Database=myDataBase;User Id=myUsername;" | InsecureSQLConnection.cs:38:52:38:128 | "Server=myServerName\\myInstanceName;Database=myDataBase;User Id=myUsername;" | $@ flows to here and does not specify `Encrypt=True`. | InsecureSQLConnection.cs:38:52:38:128 | "Server=myServerName\\myInstanceName;Database=myDataBase;User Id=myUsername;" | Connection string |
+| InsecureSQLConnection.cs:46:81:46:93 | access to local variable connectString | InsecureSQLConnection.cs:44:17:44:64 | "Server=1.2.3.4;Database=Anything;UID=ab;Pwd=cd" : String | InsecureSQLConnection.cs:46:81:46:93 | access to local variable connectString | $@ flows to here and does not specify `Encrypt=True`. | InsecureSQLConnection.cs:44:17:44:64 | "Server=1.2.3.4;Database=Anything;UID=ab;Pwd=cd" | Connection string |
+| InsecureSQLConnection.cs:55:81:55:93 | access to local variable connectString | InsecureSQLConnection.cs:53:17:53:78 | "Server=1.2.3.4;Database=Anything;UID=ab;Pwd=cd;Encrypt=false" : String | InsecureSQLConnection.cs:55:81:55:93 | access to local variable connectString | $@ flows to here and does not specify `Encrypt=True`. | InsecureSQLConnection.cs:53:17:53:78 | "Server=1.2.3.4;Database=Anything;UID=ab;Pwd=cd;Encrypt=false" | Connection string |
diff --git a/csharp/ql/test/query-tests/Security Features/CWE-327/InsecureSQLConnection/InsecureSQLConnection.qlref b/csharp/ql/test/query-tests/Security Features/CWE-327/InsecureSQLConnection/InsecureSQLConnection.qlref
index e3b1776a3fb..9809e87e73c 100644
--- a/csharp/ql/test/query-tests/Security Features/CWE-327/InsecureSQLConnection/InsecureSQLConnection.qlref
+++ b/csharp/ql/test/query-tests/Security Features/CWE-327/InsecureSQLConnection/InsecureSQLConnection.qlref
@@ -1 +1 @@
-Security Features/CWE-091/XMLInjection.ql
\ No newline at end of file
+Security Features/CWE-327/InsecureSQLConnection.ql
\ No newline at end of file
diff --git a/csharp/ql/test/query-tests/Security Features/CWE-338/InsecureRandomness.cs b/csharp/ql/test/query-tests/Security Features/CWE-338/InsecureRandomness.cs
index 90718478986..58241499c66 100644
--- a/csharp/ql/test/query-tests/Security Features/CWE-338/InsecureRandomness.cs
+++ b/csharp/ql/test/query-tests/Security Features/CWE-338/InsecureRandomness.cs
@@ -73,4 +73,24 @@ public class InsecureRandomness
}
return result;
}
+
+ public static string BiasPasswordGeneration()
+ {
+ // BAD: Membership.GeneratePassword generates a password with a bias
+ string password = System.Web.Security.Membership.GeneratePassword(12, 3);
+ return password;
+ }
+
+}
+
+namespace System.Web.Security
+{
+ public static class Membership
+ {
+ public static string GeneratePassword(int length, int numberOfNonAlphanumericCharacters)
+ {
+ return "stub";
+ }
+
+ }
}
diff --git a/csharp/ql/test/query-tests/Security Features/CWE-338/InsecureRandomness.expected b/csharp/ql/test/query-tests/Security Features/CWE-338/InsecureRandomness.expected
index 6b2615a85ce..3bfbf2530eb 100644
--- a/csharp/ql/test/query-tests/Security Features/CWE-338/InsecureRandomness.expected
+++ b/csharp/ql/test/query-tests/Security Features/CWE-338/InsecureRandomness.expected
@@ -29,7 +29,9 @@ nodes
| InsecureRandomness.cs:62:16:62:32 | call to method ToString : String | semmle.label | call to method ToString : String |
| InsecureRandomness.cs:72:31:72:39 | call to method Next : Int32 | semmle.label | call to method Next : Int32 |
| InsecureRandomness.cs:74:16:74:21 | access to local variable result : String | semmle.label | access to local variable result : String |
+| InsecureRandomness.cs:80:28:80:81 | call to method GeneratePassword | semmle.label | call to method GeneratePassword |
#select
| InsecureRandomness.cs:12:27:12:50 | call to method InsecureRandomString | InsecureRandomness.cs:28:29:28:43 | call to method Next : Int32 | InsecureRandomness.cs:12:27:12:50 | call to method InsecureRandomString | Cryptographically insecure random number is generated at $@ and used here in a security context. | InsecureRandomness.cs:28:29:28:43 | call to method Next | call to method Next |
| InsecureRandomness.cs:13:20:13:56 | call to method InsecureRandomStringFromSelection | InsecureRandomness.cs:60:31:60:39 | call to method Next : Int32 | InsecureRandomness.cs:13:20:13:56 | call to method InsecureRandomStringFromSelection | Cryptographically insecure random number is generated at $@ and used here in a security context. | InsecureRandomness.cs:60:31:60:39 | call to method Next | call to method Next |
| InsecureRandomness.cs:14:20:14:54 | call to method InsecureRandomStringFromIndexer | InsecureRandomness.cs:72:31:72:39 | call to method Next : Int32 | InsecureRandomness.cs:14:20:14:54 | call to method InsecureRandomStringFromIndexer | Cryptographically insecure random number is generated at $@ and used here in a security context. | InsecureRandomness.cs:72:31:72:39 | call to method Next | call to method Next |
+| InsecureRandomness.cs:80:28:80:81 | call to method GeneratePassword | InsecureRandomness.cs:80:28:80:81 | call to method GeneratePassword | InsecureRandomness.cs:80:28:80:81 | call to method GeneratePassword | Cryptographically insecure random number is generated at $@ and used here in a security context. | InsecureRandomness.cs:80:28:80:81 | call to method GeneratePassword | call to method GeneratePassword |
diff --git a/csharp/ql/test/query-tests/Security Features/CWE-502/UnsafeDeserialization/BinaryFormatterBad.cs b/csharp/ql/test/query-tests/Security Features/CWE-502/UnsafeDeserialization/BinaryFormatterBad.cs
new file mode 100644
index 00000000000..1170a37ad3b
--- /dev/null
+++ b/csharp/ql/test/query-tests/Security Features/CWE-502/UnsafeDeserialization/BinaryFormatterBad.cs
@@ -0,0 +1,12 @@
+using System.Runtime.Serialization.Formatters.Binary;
+using System.IO;
+
+class BadBinaryFormatter
+{
+ public static object Deserialize(Stream s)
+ {
+ var ds = new BinaryFormatter();
+ // BAD
+ return ds.Deserialize(s);
+ }
+}
diff --git a/csharp/ql/test/query-tests/Security Features/CWE-502/UnsafeDeserialization/DataContractJsonSerializerBad.cs b/csharp/ql/test/query-tests/Security Features/CWE-502/UnsafeDeserialization/DataContractJsonSerializerBad.cs
new file mode 100644
index 00000000000..1256428176c
--- /dev/null
+++ b/csharp/ql/test/query-tests/Security Features/CWE-502/UnsafeDeserialization/DataContractJsonSerializerBad.cs
@@ -0,0 +1,13 @@
+using System.Runtime.Serialization.Json;
+using System.IO;
+using System;
+
+class BadDataContractJsonSerializer
+{
+ public static object Deserialize(Type type, Stream s)
+ {
+ var ds = new DataContractJsonSerializer(type);
+ // BAD
+ return ds.ReadObject(s);
+ }
+}
diff --git a/csharp/ql/test/query-tests/Security Features/CWE-502/UnsafeDeserialization/DataContractJsonSerializerGood.cs b/csharp/ql/test/query-tests/Security Features/CWE-502/UnsafeDeserialization/DataContractJsonSerializerGood.cs
new file mode 100644
index 00000000000..92adf51cfb6
--- /dev/null
+++ b/csharp/ql/test/query-tests/Security Features/CWE-502/UnsafeDeserialization/DataContractJsonSerializerGood.cs
@@ -0,0 +1,13 @@
+using System.Runtime.Serialization.Json;
+using System.IO;
+using System;
+
+class GoodDataContractJsonSerializer
+{
+ public static object Deserialize(Stream s)
+ {
+ // Good: type is hardcoded
+ var ds = new DataContractJsonSerializer(typeof(GoodDataContractJsonSerializer));
+ return ds.ReadObject(s);
+ }
+}
diff --git a/csharp/ql/test/query-tests/Security Features/CWE-502/UnsafeDeserialization/DataContractSerializerBad.cs b/csharp/ql/test/query-tests/Security Features/CWE-502/UnsafeDeserialization/DataContractSerializerBad.cs
new file mode 100644
index 00000000000..35cff0b45f1
--- /dev/null
+++ b/csharp/ql/test/query-tests/Security Features/CWE-502/UnsafeDeserialization/DataContractSerializerBad.cs
@@ -0,0 +1,13 @@
+using System.Runtime.Serialization;
+using System.IO;
+using System;
+
+class BadDataContractSerializer
+{
+ public static object Deserialize(Type type, Stream s)
+ {
+ var ds = new DataContractSerializer(type);
+ // BAD
+ return ds.ReadObject(s);
+ }
+}
diff --git a/csharp/ql/test/query-tests/Security Features/CWE-502/UnsafeDeserialization/DataContractSerializerGood.cs b/csharp/ql/test/query-tests/Security Features/CWE-502/UnsafeDeserialization/DataContractSerializerGood.cs
new file mode 100644
index 00000000000..0e2a6f10f12
--- /dev/null
+++ b/csharp/ql/test/query-tests/Security Features/CWE-502/UnsafeDeserialization/DataContractSerializerGood.cs
@@ -0,0 +1,13 @@
+using System.Runtime.Serialization;
+using System.IO;
+using System;
+
+class GoodDataContractSerializer
+{
+ public static object Deserialize(Stream s)
+ {
+ // Good: type is hardcoded
+ var ds = new DataContractSerializer(typeof(GoodDataContractSerializer));
+ return ds.ReadObject(s);
+ }
+}
diff --git a/csharp/ql/test/query-tests/Security Features/CWE-502/UnsafeDeserialization/ResourceReaderBad.cs b/csharp/ql/test/query-tests/Security Features/CWE-502/UnsafeDeserialization/ResourceReaderBad.cs
new file mode 100644
index 00000000000..2da5dc1aa6a
--- /dev/null
+++ b/csharp/ql/test/query-tests/Security Features/CWE-502/UnsafeDeserialization/ResourceReaderBad.cs
@@ -0,0 +1,17 @@
+using System.Resources;
+using System.IO;
+using System;
+
+class BadResourceReader
+{
+ public static void Deserialize(Stream s)
+ {
+ var ds = new ResourceReader(s);
+ // BAD
+ var dict = ds.GetEnumerator();
+ while (dict.MoveNext())
+ Console.WriteLine(" {0}: '{1}' (Type {2})",
+ dict.Key, dict.Value, dict.Value.GetType().Name);
+ ds.Close();
+ }
+}
diff --git a/csharp/ql/test/query-tests/Security Features/CWE-502/UnsafeDeserialization/UnsafeDeserialization.expected b/csharp/ql/test/query-tests/Security Features/CWE-502/UnsafeDeserialization/UnsafeDeserialization.expected
index 6edb1f62902..9a26799dc07 100644
--- a/csharp/ql/test/query-tests/Security Features/CWE-502/UnsafeDeserialization/UnsafeDeserialization.expected
+++ b/csharp/ql/test/query-tests/Security Features/CWE-502/UnsafeDeserialization/UnsafeDeserialization.expected
@@ -1 +1,7 @@
+| BinaryFormatterBad.cs:10:16:10:32 | call to method Deserialize | Unsafe deserializer is used. Make sure the value being deserialized comes from a trusted source. |
+| DataContractJsonSerializerBad.cs:11:16:11:31 | call to method ReadObject | Unsafe deserializer is used. Make sure the value being deserialized comes from a trusted source. |
+| DataContractSerializerBad.cs:11:16:11:31 | call to method ReadObject | Unsafe deserializer is used. Make sure the value being deserialized comes from a trusted source. |
+| ResourceReaderBad.cs:9:18:9:38 | object creation of type ResourceReader | Unsafe deserializer is used. Make sure the value being deserialized comes from a trusted source. |
| UnsafeDeserializationBad.cs:9:16:9:38 | call to method DeserializeObject | Unsafe deserializer is used. Make sure the value being deserialized comes from a trusted source. |
+| XmlObjectSerializerBad.cs:11:16:11:31 | call to method ReadObject | Unsafe deserializer is used. Make sure the value being deserialized comes from a trusted source. |
+| XmlSerializerBad.cs:11:16:11:32 | call to method Deserialize | Unsafe deserializer is used. Make sure the value being deserialized comes from a trusted source. |
diff --git a/csharp/ql/test/query-tests/Security Features/CWE-502/UnsafeDeserialization/XmlObjectSerializerBad.cs b/csharp/ql/test/query-tests/Security Features/CWE-502/UnsafeDeserialization/XmlObjectSerializerBad.cs
new file mode 100644
index 00000000000..4096934da0b
--- /dev/null
+++ b/csharp/ql/test/query-tests/Security Features/CWE-502/UnsafeDeserialization/XmlObjectSerializerBad.cs
@@ -0,0 +1,13 @@
+using System.Runtime.Serialization;
+using System.IO;
+using System;
+
+class BadXmlObjectSerializer
+{
+ public static object Deserialize(Type type, Stream s)
+ {
+ XmlObjectSerializer ds = new DataContractSerializer(type);
+ // BAD
+ return ds.ReadObject(s);
+ }
+}
diff --git a/csharp/ql/test/query-tests/Security Features/CWE-502/UnsafeDeserialization/XmlObjectSerializerGood.cs b/csharp/ql/test/query-tests/Security Features/CWE-502/UnsafeDeserialization/XmlObjectSerializerGood.cs
new file mode 100644
index 00000000000..bde02294f1d
--- /dev/null
+++ b/csharp/ql/test/query-tests/Security Features/CWE-502/UnsafeDeserialization/XmlObjectSerializerGood.cs
@@ -0,0 +1,13 @@
+using System.Runtime.Serialization;
+using System.IO;
+using System;
+
+class GoodXmlObjectSerializer
+{
+ public static object Deserialize(Stream s)
+ {
+ // Good: type is hardcoded
+ XmlObjectSerializer ds = new DataContractSerializer(typeof(GoodXmlObjectSerializer));
+ return ds.ReadObject(s);
+ }
+}
diff --git a/csharp/ql/test/query-tests/Security Features/CWE-502/UnsafeDeserialization/XmlSerializerBad.cs b/csharp/ql/test/query-tests/Security Features/CWE-502/UnsafeDeserialization/XmlSerializerBad.cs
new file mode 100644
index 00000000000..4d32bae9c08
--- /dev/null
+++ b/csharp/ql/test/query-tests/Security Features/CWE-502/UnsafeDeserialization/XmlSerializerBad.cs
@@ -0,0 +1,13 @@
+using System.Xml.Serialization;
+using System.IO;
+using System;
+
+class BadXmlSerializer
+{
+ public static object Deserialize(Type type, Stream s)
+ {
+ var ds = new XmlSerializer(type);
+ // BAD
+ return ds.Deserialize(s);
+ }
+}
diff --git a/csharp/ql/test/query-tests/Security Features/CWE-502/UnsafeDeserialization/XmlSerializerGood.cs b/csharp/ql/test/query-tests/Security Features/CWE-502/UnsafeDeserialization/XmlSerializerGood.cs
new file mode 100644
index 00000000000..f947729cdd2
--- /dev/null
+++ b/csharp/ql/test/query-tests/Security Features/CWE-502/UnsafeDeserialization/XmlSerializerGood.cs
@@ -0,0 +1,13 @@
+using System.Xml.Serialization;
+using System.IO;
+using System;
+
+class GoodXmlSerializer
+{
+ public static object Deserialize(Stream s)
+ {
+ // Good: type is hardcoded
+ var ds = new XmlSerializer(typeof(GoodXmlSerializer));
+ return ds.Deserialize(s);
+ }
+}
diff --git a/csharp/ql/test/query-tests/Security Features/CWE-502/UnsafeDeserialization/options b/csharp/ql/test/query-tests/Security Features/CWE-502/UnsafeDeserialization/options
index f9a007613b4..182f92f8d84 100644
--- a/csharp/ql/test/query-tests/Security Features/CWE-502/UnsafeDeserialization/options
+++ b/csharp/ql/test/query-tests/Security Features/CWE-502/UnsafeDeserialization/options
@@ -1 +1 @@
-semmle-extractor-options: /r:System.Runtime.Extensions.dll /r:System.IO.FileSystem.dll /r:System.Collections.Specialized.dll ${testdir}/../../../../resources/stubs/System.Web.cs
+semmle-extractor-options: /r:System.Private.Xml.dll /r:System.Xml.ReaderWriter.dll /r:System.Private.DataContractSerialization.dll /r:System.Runtime.Serialization.Formatters.dll /r:System.Runtime.Extensions.dll /r:System.IO.FileSystem.dll /r:System.Collections.Specialized.dll ${testdir}/../../../../resources/stubs/System.Web.cs
diff --git a/csharp/ql/test/query-tests/Security Features/CWE-502/UnsafeDeserializationUntrustedInput/BinaryFormatterUntrustedInputBad.cs b/csharp/ql/test/query-tests/Security Features/CWE-502/UnsafeDeserializationUntrustedInput/BinaryFormatterUntrustedInputBad.cs
new file mode 100644
index 00000000000..73c6c35413b
--- /dev/null
+++ b/csharp/ql/test/query-tests/Security Features/CWE-502/UnsafeDeserializationUntrustedInput/BinaryFormatterUntrustedInputBad.cs
@@ -0,0 +1,14 @@
+using System.Web.UI.WebControls;
+using System.Runtime.Serialization.Formatters.Binary;
+using System.IO;
+using System.Text;
+
+class BadBinaryFormatter
+{
+ public static object Deserialize(TextBox textBox)
+ {
+ var ds = new BinaryFormatter();
+ // BAD
+ return ds.Deserialize(new MemoryStream(Encoding.UTF8.GetBytes(textBox.Text)));
+ }
+}
diff --git a/csharp/ql/test/query-tests/Security Features/CWE-502/UnsafeDeserializationUntrustedInput/BinaryFormatterUntrustedInputGood.cs b/csharp/ql/test/query-tests/Security Features/CWE-502/UnsafeDeserializationUntrustedInput/BinaryFormatterUntrustedInputGood.cs
new file mode 100644
index 00000000000..f0cf286ad9b
--- /dev/null
+++ b/csharp/ql/test/query-tests/Security Features/CWE-502/UnsafeDeserializationUntrustedInput/BinaryFormatterUntrustedInputGood.cs
@@ -0,0 +1,13 @@
+using System.Runtime.Serialization.Formatters.Binary;
+using System.IO;
+using System.Text;
+
+class GoodBinaryFormatter
+{
+ public static object Deserialize()
+ {
+ var ds = new BinaryFormatter();
+ // GOOD
+ return ds.Deserialize(new MemoryStream(Encoding.UTF8.GetBytes("hardcoded")));
+ }
+}
diff --git a/csharp/ql/test/query-tests/Security Features/CWE-502/UnsafeDeserializationUntrustedInput/DataContractJsonSerializerUntrustedInputBad.cs b/csharp/ql/test/query-tests/Security Features/CWE-502/UnsafeDeserializationUntrustedInput/DataContractJsonSerializerUntrustedInputBad.cs
new file mode 100644
index 00000000000..2d3efe3ae26
--- /dev/null
+++ b/csharp/ql/test/query-tests/Security Features/CWE-502/UnsafeDeserializationUntrustedInput/DataContractJsonSerializerUntrustedInputBad.cs
@@ -0,0 +1,15 @@
+using System.Web.UI.WebControls;
+using System.Runtime.Serialization.Json;
+using System.IO;
+using System.Text;
+using System;
+
+class BadDataContractJsonSerializer
+{
+ public static object Deserialize(TextBox type, TextBox data)
+ {
+ var ds = new DataContractJsonSerializer(Type.GetType(type.Text));
+ // BAD
+ return ds.ReadObject(new MemoryStream(Encoding.UTF8.GetBytes(data.Text)));
+ }
+}
diff --git a/csharp/ql/test/query-tests/Security Features/CWE-502/UnsafeDeserializationUntrustedInput/DataContractJsonSerializerUntrustedInputGood.cs b/csharp/ql/test/query-tests/Security Features/CWE-502/UnsafeDeserializationUntrustedInput/DataContractJsonSerializerUntrustedInputGood.cs
new file mode 100644
index 00000000000..c80a6c66825
--- /dev/null
+++ b/csharp/ql/test/query-tests/Security Features/CWE-502/UnsafeDeserializationUntrustedInput/DataContractJsonSerializerUntrustedInputGood.cs
@@ -0,0 +1,22 @@
+using System.Web.UI.WebControls;
+using System.Runtime.Serialization.Json;
+using System.IO;
+using System.Text;
+using System;
+
+class GoodDataContractJsonSerializer
+{
+ public static object Deserialize1(TextBox data)
+ {
+ // GOOD
+ var ds = new DataContractJsonSerializer(typeof(GoodDataContractJsonSerializer));
+ return ds.ReadObject(new MemoryStream(Encoding.UTF8.GetBytes(data.Text)));
+ }
+
+ public static object Deserialize2(TextBox type)
+ {
+ var ds = new DataContractJsonSerializer(Type.GetType(type.Text));
+ // GOOD
+ return ds.ReadObject(new MemoryStream(Encoding.UTF8.GetBytes("hardcoded")));
+ }
+}
diff --git a/csharp/ql/test/query-tests/Security Features/CWE-502/UnsafeDeserializationUntrustedInput/DataContractSerializerUntrustedInputBad.cs b/csharp/ql/test/query-tests/Security Features/CWE-502/UnsafeDeserializationUntrustedInput/DataContractSerializerUntrustedInputBad.cs
new file mode 100644
index 00000000000..f4f266ed3e0
--- /dev/null
+++ b/csharp/ql/test/query-tests/Security Features/CWE-502/UnsafeDeserializationUntrustedInput/DataContractSerializerUntrustedInputBad.cs
@@ -0,0 +1,15 @@
+using System.Web.UI.WebControls;
+using System.Runtime.Serialization;
+using System.IO;
+using System.Text;
+using System;
+
+class BadDataContractSerializer
+{
+ public static object Deserialize(TextBox type, TextBox data)
+ {
+ var ds = new DataContractSerializer(Type.GetType(type.Text));
+ // BAD
+ return ds.ReadObject(new MemoryStream(Encoding.UTF8.GetBytes(data.Text)));
+ }
+}
diff --git a/csharp/ql/test/query-tests/Security Features/CWE-502/UnsafeDeserializationUntrustedInput/DataContractSerializerUntrustedInputGood.cs b/csharp/ql/test/query-tests/Security Features/CWE-502/UnsafeDeserializationUntrustedInput/DataContractSerializerUntrustedInputGood.cs
new file mode 100644
index 00000000000..e27ee726f21
--- /dev/null
+++ b/csharp/ql/test/query-tests/Security Features/CWE-502/UnsafeDeserializationUntrustedInput/DataContractSerializerUntrustedInputGood.cs
@@ -0,0 +1,22 @@
+using System.Web.UI.WebControls;
+using System.Runtime.Serialization;
+using System.IO;
+using System.Text;
+using System;
+
+class GoodDataContractSerializer
+{
+ public static object Deserialize1(TextBox data)
+ {
+ // GOOD
+ var ds = new DataContractSerializer(typeof(GoodDataContractSerializer));
+ return ds.ReadObject(new MemoryStream(Encoding.UTF8.GetBytes(data.Text)));
+ }
+
+ public static object Deserialize2(TextBox type)
+ {
+ var ds = new DataContractSerializer(Type.GetType(type.Text));
+ // GOOD
+ return ds.ReadObject(new MemoryStream(Encoding.UTF8.GetBytes("hardcoded")));
+ }
+}
diff --git a/csharp/ql/test/query-tests/Security Features/CWE-502/UnsafeDeserializationUntrustedInput/ResourceReaderUntrustedInputBad.cs b/csharp/ql/test/query-tests/Security Features/CWE-502/UnsafeDeserializationUntrustedInput/ResourceReaderUntrustedInputBad.cs
new file mode 100644
index 00000000000..cd5468afc2d
--- /dev/null
+++ b/csharp/ql/test/query-tests/Security Features/CWE-502/UnsafeDeserializationUntrustedInput/ResourceReaderUntrustedInputBad.cs
@@ -0,0 +1,19 @@
+using System.Web.UI.WebControls;
+using System.Resources;
+using System.IO;
+using System.Text;
+using System;
+
+class BadResourceReader
+{
+ public static void Deserialize(TextBox data)
+ {
+ var ds = new ResourceReader(new MemoryStream(Encoding.UTF8.GetBytes(data.Text)));
+ // BAD
+ var dict = ds.GetEnumerator();
+ while (dict.MoveNext())
+ Console.WriteLine(" {0}: '{1}' (Type {2})",
+ dict.Key, dict.Value, dict.Value.GetType().Name);
+ ds.Close();
+ }
+}
diff --git a/csharp/ql/test/query-tests/Security Features/CWE-502/UnsafeDeserializationUntrustedInput/ResourceReaderUntrustedInputGood.cs b/csharp/ql/test/query-tests/Security Features/CWE-502/UnsafeDeserializationUntrustedInput/ResourceReaderUntrustedInputGood.cs
new file mode 100644
index 00000000000..4120613e007
--- /dev/null
+++ b/csharp/ql/test/query-tests/Security Features/CWE-502/UnsafeDeserializationUntrustedInput/ResourceReaderUntrustedInputGood.cs
@@ -0,0 +1,19 @@
+using System.Web.UI.WebControls;
+using System.Resources;
+using System.IO;
+using System.Text;
+using System;
+
+class GoodResourceReader
+{
+ public static void Deserialize(TextBox data)
+ {
+ // GOOD
+ var ds = new ResourceReader(new MemoryStream(Encoding.UTF8.GetBytes("hardcoded")));
+ var dict = ds.GetEnumerator();
+ while (dict.MoveNext())
+ Console.WriteLine(" {0}: '{1}' (Type {2})",
+ dict.Key, dict.Value, dict.Value.GetType().Name);
+ ds.Close();
+ }
+}
diff --git a/csharp/ql/test/query-tests/Security Features/CWE-502/UnsafeDeserializationUntrustedInput/UnsafeDeserializationUntrustedInput.expected b/csharp/ql/test/query-tests/Security Features/CWE-502/UnsafeDeserializationUntrustedInput/UnsafeDeserializationUntrustedInput.expected
index ee356f9f1d0..7d36370b2e3 100644
--- a/csharp/ql/test/query-tests/Security Features/CWE-502/UnsafeDeserializationUntrustedInput/UnsafeDeserializationUntrustedInput.expected
+++ b/csharp/ql/test/query-tests/Security Features/CWE-502/UnsafeDeserializationUntrustedInput/UnsafeDeserializationUntrustedInput.expected
@@ -1,7 +1,55 @@
edges
+| BinaryFormatterUntrustedInputBad.cs:12:48:12:83 | call to method GetBytes : Byte[] | BinaryFormatterUntrustedInputBad.cs:12:31:12:84 | object creation of type MemoryStream |
+| BinaryFormatterUntrustedInputBad.cs:12:71:12:77 | access to parameter textBox : TextBox | BinaryFormatterUntrustedInputBad.cs:12:71:12:82 | access to property Text : String |
+| BinaryFormatterUntrustedInputBad.cs:12:71:12:82 | access to property Text : String | BinaryFormatterUntrustedInputBad.cs:12:48:12:83 | call to method GetBytes : Byte[] |
+| DataContractJsonSerializerUntrustedInputBad.cs:13:47:13:79 | call to method GetBytes : Byte[] | DataContractJsonSerializerUntrustedInputBad.cs:13:30:13:80 | object creation of type MemoryStream |
+| DataContractJsonSerializerUntrustedInputBad.cs:13:70:13:73 | access to parameter data : TextBox | DataContractJsonSerializerUntrustedInputBad.cs:13:70:13:78 | access to property Text : String |
+| DataContractJsonSerializerUntrustedInputBad.cs:13:70:13:78 | access to property Text : String | DataContractJsonSerializerUntrustedInputBad.cs:13:47:13:79 | call to method GetBytes : Byte[] |
+| DataContractSerializerUntrustedInputBad.cs:13:47:13:79 | call to method GetBytes : Byte[] | DataContractSerializerUntrustedInputBad.cs:13:30:13:80 | object creation of type MemoryStream |
+| DataContractSerializerUntrustedInputBad.cs:13:70:13:73 | access to parameter data : TextBox | DataContractSerializerUntrustedInputBad.cs:13:70:13:78 | access to property Text : String |
+| DataContractSerializerUntrustedInputBad.cs:13:70:13:78 | access to property Text : String | DataContractSerializerUntrustedInputBad.cs:13:47:13:79 | call to method GetBytes : Byte[] |
+| ResourceReaderUntrustedInputBad.cs:11:54:11:86 | call to method GetBytes : Byte[] | ResourceReaderUntrustedInputBad.cs:11:37:11:87 | object creation of type MemoryStream |
+| ResourceReaderUntrustedInputBad.cs:11:77:11:80 | access to parameter data : TextBox | ResourceReaderUntrustedInputBad.cs:11:77:11:85 | access to property Text : String |
+| ResourceReaderUntrustedInputBad.cs:11:77:11:85 | access to property Text : String | ResourceReaderUntrustedInputBad.cs:11:54:11:86 | call to method GetBytes : Byte[] |
| UnsafeDeserializationUntrustedInputBad.cs:10:37:10:43 | access to parameter textBox : TextBox | UnsafeDeserializationUntrustedInputBad.cs:10:37:10:48 | access to property Text |
+| XmlObjectSerializerUntrustedInputBad.cs:13:47:13:79 | call to method GetBytes : Byte[] | XmlObjectSerializerUntrustedInputBad.cs:13:30:13:80 | object creation of type MemoryStream |
+| XmlObjectSerializerUntrustedInputBad.cs:13:70:13:73 | access to parameter data : TextBox | XmlObjectSerializerUntrustedInputBad.cs:13:70:13:78 | access to property Text : String |
+| XmlObjectSerializerUntrustedInputBad.cs:13:70:13:78 | access to property Text : String | XmlObjectSerializerUntrustedInputBad.cs:13:47:13:79 | call to method GetBytes : Byte[] |
+| XmlSerializerUntrustedInputBad.cs:13:48:13:80 | call to method GetBytes : Byte[] | XmlSerializerUntrustedInputBad.cs:13:31:13:81 | object creation of type MemoryStream |
+| XmlSerializerUntrustedInputBad.cs:13:71:13:74 | access to parameter data : TextBox | XmlSerializerUntrustedInputBad.cs:13:71:13:79 | access to property Text : String |
+| XmlSerializerUntrustedInputBad.cs:13:71:13:79 | access to property Text : String | XmlSerializerUntrustedInputBad.cs:13:48:13:80 | call to method GetBytes : Byte[] |
nodes
+| BinaryFormatterUntrustedInputBad.cs:12:31:12:84 | object creation of type MemoryStream | semmle.label | object creation of type MemoryStream |
+| BinaryFormatterUntrustedInputBad.cs:12:48:12:83 | call to method GetBytes : Byte[] | semmle.label | call to method GetBytes : Byte[] |
+| BinaryFormatterUntrustedInputBad.cs:12:71:12:77 | access to parameter textBox : TextBox | semmle.label | access to parameter textBox : TextBox |
+| BinaryFormatterUntrustedInputBad.cs:12:71:12:82 | access to property Text : String | semmle.label | access to property Text : String |
+| DataContractJsonSerializerUntrustedInputBad.cs:13:30:13:80 | object creation of type MemoryStream | semmle.label | object creation of type MemoryStream |
+| DataContractJsonSerializerUntrustedInputBad.cs:13:47:13:79 | call to method GetBytes : Byte[] | semmle.label | call to method GetBytes : Byte[] |
+| DataContractJsonSerializerUntrustedInputBad.cs:13:70:13:73 | access to parameter data : TextBox | semmle.label | access to parameter data : TextBox |
+| DataContractJsonSerializerUntrustedInputBad.cs:13:70:13:78 | access to property Text : String | semmle.label | access to property Text : String |
+| DataContractSerializerUntrustedInputBad.cs:13:30:13:80 | object creation of type MemoryStream | semmle.label | object creation of type MemoryStream |
+| DataContractSerializerUntrustedInputBad.cs:13:47:13:79 | call to method GetBytes : Byte[] | semmle.label | call to method GetBytes : Byte[] |
+| DataContractSerializerUntrustedInputBad.cs:13:70:13:73 | access to parameter data : TextBox | semmle.label | access to parameter data : TextBox |
+| DataContractSerializerUntrustedInputBad.cs:13:70:13:78 | access to property Text : String | semmle.label | access to property Text : String |
+| ResourceReaderUntrustedInputBad.cs:11:37:11:87 | object creation of type MemoryStream | semmle.label | object creation of type MemoryStream |
+| ResourceReaderUntrustedInputBad.cs:11:54:11:86 | call to method GetBytes : Byte[] | semmle.label | call to method GetBytes : Byte[] |
+| ResourceReaderUntrustedInputBad.cs:11:77:11:80 | access to parameter data : TextBox | semmle.label | access to parameter data : TextBox |
+| ResourceReaderUntrustedInputBad.cs:11:77:11:85 | access to property Text : String | semmle.label | access to property Text : String |
| UnsafeDeserializationUntrustedInputBad.cs:10:37:10:43 | access to parameter textBox : TextBox | semmle.label | access to parameter textBox : TextBox |
| UnsafeDeserializationUntrustedInputBad.cs:10:37:10:48 | access to property Text | semmle.label | access to property Text |
+| XmlObjectSerializerUntrustedInputBad.cs:13:30:13:80 | object creation of type MemoryStream | semmle.label | object creation of type MemoryStream |
+| XmlObjectSerializerUntrustedInputBad.cs:13:47:13:79 | call to method GetBytes : Byte[] | semmle.label | call to method GetBytes : Byte[] |
+| XmlObjectSerializerUntrustedInputBad.cs:13:70:13:73 | access to parameter data : TextBox | semmle.label | access to parameter data : TextBox |
+| XmlObjectSerializerUntrustedInputBad.cs:13:70:13:78 | access to property Text : String | semmle.label | access to property Text : String |
+| XmlSerializerUntrustedInputBad.cs:13:31:13:81 | object creation of type MemoryStream | semmle.label | object creation of type MemoryStream |
+| XmlSerializerUntrustedInputBad.cs:13:48:13:80 | call to method GetBytes : Byte[] | semmle.label | call to method GetBytes : Byte[] |
+| XmlSerializerUntrustedInputBad.cs:13:71:13:74 | access to parameter data : TextBox | semmle.label | access to parameter data : TextBox |
+| XmlSerializerUntrustedInputBad.cs:13:71:13:79 | access to property Text : String | semmle.label | access to property Text : String |
#select
-| UnsafeDeserializationUntrustedInputBad.cs:10:37:10:48 | access to property Text | UnsafeDeserializationUntrustedInputBad.cs:10:37:10:43 | access to parameter textBox : TextBox | UnsafeDeserializationUntrustedInputBad.cs:10:37:10:48 | access to property Text | $@ flows to unsafe deserializer. | UnsafeDeserializationUntrustedInputBad.cs:10:37:10:43 | access to parameter textBox | User-provided data |
+| BinaryFormatterUntrustedInputBad.cs:12:31:12:84 | object creation of type MemoryStream | BinaryFormatterUntrustedInputBad.cs:12:71:12:77 | access to parameter textBox : TextBox | BinaryFormatterUntrustedInputBad.cs:12:31:12:84 | object creation of type MemoryStream | $@ flows to unsafe deserializer. | BinaryFormatterUntrustedInputBad.cs:12:71:12:77 | access to parameter textBox : TextBox | User-provided data |
+| DataContractJsonSerializerUntrustedInputBad.cs:13:30:13:80 | object creation of type MemoryStream | DataContractJsonSerializerUntrustedInputBad.cs:13:70:13:73 | access to parameter data : TextBox | DataContractJsonSerializerUntrustedInputBad.cs:13:30:13:80 | object creation of type MemoryStream | $@ flows to unsafe deserializer. | DataContractJsonSerializerUntrustedInputBad.cs:13:70:13:73 | access to parameter data : TextBox | User-provided data |
+| DataContractSerializerUntrustedInputBad.cs:13:30:13:80 | object creation of type MemoryStream | DataContractSerializerUntrustedInputBad.cs:13:70:13:73 | access to parameter data : TextBox | DataContractSerializerUntrustedInputBad.cs:13:30:13:80 | object creation of type MemoryStream | $@ flows to unsafe deserializer. | DataContractSerializerUntrustedInputBad.cs:13:70:13:73 | access to parameter data : TextBox | User-provided data |
+| ResourceReaderUntrustedInputBad.cs:11:37:11:87 | object creation of type MemoryStream | ResourceReaderUntrustedInputBad.cs:11:77:11:80 | access to parameter data : TextBox | ResourceReaderUntrustedInputBad.cs:11:37:11:87 | object creation of type MemoryStream | $@ flows to unsafe deserializer. | ResourceReaderUntrustedInputBad.cs:11:77:11:80 | access to parameter data : TextBox | User-provided data |
+| UnsafeDeserializationUntrustedInputBad.cs:10:37:10:48 | access to property Text | UnsafeDeserializationUntrustedInputBad.cs:10:37:10:43 | access to parameter textBox : TextBox | UnsafeDeserializationUntrustedInputBad.cs:10:37:10:48 | access to property Text | $@ flows to unsafe deserializer. | UnsafeDeserializationUntrustedInputBad.cs:10:37:10:43 | access to parameter textBox : TextBox | User-provided data |
+| XmlObjectSerializerUntrustedInputBad.cs:13:30:13:80 | object creation of type MemoryStream | XmlObjectSerializerUntrustedInputBad.cs:13:70:13:73 | access to parameter data : TextBox | XmlObjectSerializerUntrustedInputBad.cs:13:30:13:80 | object creation of type MemoryStream | $@ flows to unsafe deserializer. | XmlObjectSerializerUntrustedInputBad.cs:13:70:13:73 | access to parameter data : TextBox | User-provided data |
+| XmlSerializerUntrustedInputBad.cs:13:31:13:81 | object creation of type MemoryStream | XmlSerializerUntrustedInputBad.cs:13:71:13:74 | access to parameter data : TextBox | XmlSerializerUntrustedInputBad.cs:13:31:13:81 | object creation of type MemoryStream | $@ flows to unsafe deserializer. | XmlSerializerUntrustedInputBad.cs:13:71:13:74 | access to parameter data : TextBox | User-provided data |
diff --git a/csharp/ql/test/query-tests/Security Features/CWE-502/UnsafeDeserializationUntrustedInput/UnsafeDeserializationUntrustedInputGood.cs b/csharp/ql/test/query-tests/Security Features/CWE-502/UnsafeDeserializationUntrustedInput/UnsafeDeserializationUntrustedInputGood.cs
index d1e2935b218..d6b5b09841b 100644
--- a/csharp/ql/test/query-tests/Security Features/CWE-502/UnsafeDeserializationUntrustedInput/UnsafeDeserializationUntrustedInputGood.cs
+++ b/csharp/ql/test/query-tests/Security Features/CWE-502/UnsafeDeserializationUntrustedInput/UnsafeDeserializationUntrustedInputGood.cs
@@ -6,7 +6,7 @@ class Good
public static object Deserialize(TextBox textBox)
{
JavaScriptSerializer sr = new JavaScriptSerializer();
- // GOOD
+ // GOOD: no unsafe type resolver
return sr.DeserializeObject(textBox.Text);
}
}
diff --git a/csharp/ql/test/query-tests/Security Features/CWE-502/UnsafeDeserializationUntrustedInput/XmlObjectSerializerUntrustedInputBad.cs b/csharp/ql/test/query-tests/Security Features/CWE-502/UnsafeDeserializationUntrustedInput/XmlObjectSerializerUntrustedInputBad.cs
new file mode 100644
index 00000000000..b525dd28692
--- /dev/null
+++ b/csharp/ql/test/query-tests/Security Features/CWE-502/UnsafeDeserializationUntrustedInput/XmlObjectSerializerUntrustedInputBad.cs
@@ -0,0 +1,15 @@
+using System.Web.UI.WebControls;
+using System.Runtime.Serialization;
+using System.IO;
+using System.Text;
+using System;
+
+class BadXmlObjectSerializer
+{
+ public static object Deserialize(TextBox type, TextBox data)
+ {
+ XmlObjectSerializer ds = new DataContractSerializer(Type.GetType(type.Text));
+ // BAD
+ return ds.ReadObject(new MemoryStream(Encoding.UTF8.GetBytes(data.Text)));
+ }
+}
diff --git a/csharp/ql/test/query-tests/Security Features/CWE-502/UnsafeDeserializationUntrustedInput/XmlObjectSerializerUntrustedInputGood.cs b/csharp/ql/test/query-tests/Security Features/CWE-502/UnsafeDeserializationUntrustedInput/XmlObjectSerializerUntrustedInputGood.cs
new file mode 100644
index 00000000000..1943f022316
--- /dev/null
+++ b/csharp/ql/test/query-tests/Security Features/CWE-502/UnsafeDeserializationUntrustedInput/XmlObjectSerializerUntrustedInputGood.cs
@@ -0,0 +1,22 @@
+using System.Web.UI.WebControls;
+using System.Runtime.Serialization;
+using System.IO;
+using System.Text;
+using System;
+
+class GoodXmlObjectSerializer
+{
+ public static object Deserialize1(TextBox data)
+ {
+ // GOOD
+ XmlObjectSerializer ds = new DataContractSerializer(typeof(GoodXmlObjectSerializer));
+ return ds.ReadObject(new MemoryStream(Encoding.UTF8.GetBytes(data.Text)));
+ }
+
+ public static object Deserialize2(TextBox type)
+ {
+ XmlObjectSerializer ds = new DataContractSerializer(Type.GetType(type.Text));
+ // GOOD
+ return ds.ReadObject(new MemoryStream(Encoding.UTF8.GetBytes("hardcoded")));
+ }
+}
\ No newline at end of file
diff --git a/csharp/ql/test/query-tests/Security Features/CWE-502/UnsafeDeserializationUntrustedInput/XmlSerializerUntrustedInputBad.cs b/csharp/ql/test/query-tests/Security Features/CWE-502/UnsafeDeserializationUntrustedInput/XmlSerializerUntrustedInputBad.cs
new file mode 100644
index 00000000000..f658f2a9e1a
--- /dev/null
+++ b/csharp/ql/test/query-tests/Security Features/CWE-502/UnsafeDeserializationUntrustedInput/XmlSerializerUntrustedInputBad.cs
@@ -0,0 +1,15 @@
+using System.Web.UI.WebControls;
+using System.Xml.Serialization;
+using System.IO;
+using System.Text;
+using System;
+
+class BadXmlSerializer
+{
+ public static object Deserialize(TextBox type, TextBox data)
+ {
+ var ds = new XmlSerializer(Type.GetType(type.Text));
+ // BAD
+ return ds.Deserialize(new MemoryStream(Encoding.UTF8.GetBytes(data.Text)));
+ }
+}
diff --git a/csharp/ql/test/query-tests/Security Features/CWE-502/UnsafeDeserializationUntrustedInput/XmlSerializerUntrustedInputGood.cs b/csharp/ql/test/query-tests/Security Features/CWE-502/UnsafeDeserializationUntrustedInput/XmlSerializerUntrustedInputGood.cs
new file mode 100644
index 00000000000..7ac7bc5def7
--- /dev/null
+++ b/csharp/ql/test/query-tests/Security Features/CWE-502/UnsafeDeserializationUntrustedInput/XmlSerializerUntrustedInputGood.cs
@@ -0,0 +1,22 @@
+using System.Web.UI.WebControls;
+using System.Xml.Serialization;
+using System.IO;
+using System.Text;
+using System;
+
+class GoodXmlSerializer
+{
+ public static object Deserialize1(TextBox data)
+ {
+ // GOOD
+ var ds = new XmlSerializer(typeof(GoodXmlSerializer));
+ return ds.Deserialize(new MemoryStream(Encoding.UTF8.GetBytes(data.Text)));
+ }
+
+ public static object Deserialize2(TextBox type)
+ {
+ var ds = new XmlSerializer(Type.GetType(type.Text));
+ // GOOD
+ return ds.Deserialize(new MemoryStream(Encoding.UTF8.GetBytes("hardcoded")));
+ }
+}
diff --git a/csharp/ql/test/query-tests/Security Features/CWE-502/UnsafeDeserializationUntrustedInput/options b/csharp/ql/test/query-tests/Security Features/CWE-502/UnsafeDeserializationUntrustedInput/options
index f9a007613b4..182f92f8d84 100644
--- a/csharp/ql/test/query-tests/Security Features/CWE-502/UnsafeDeserializationUntrustedInput/options
+++ b/csharp/ql/test/query-tests/Security Features/CWE-502/UnsafeDeserializationUntrustedInput/options
@@ -1 +1 @@
-semmle-extractor-options: /r:System.Runtime.Extensions.dll /r:System.IO.FileSystem.dll /r:System.Collections.Specialized.dll ${testdir}/../../../../resources/stubs/System.Web.cs
+semmle-extractor-options: /r:System.Private.Xml.dll /r:System.Xml.ReaderWriter.dll /r:System.Private.DataContractSerialization.dll /r:System.Runtime.Serialization.Formatters.dll /r:System.Runtime.Extensions.dll /r:System.IO.FileSystem.dll /r:System.Collections.Specialized.dll ${testdir}/../../../../resources/stubs/System.Web.cs
diff --git a/csharp/ql/test/query-tests/Stubs/All/AllStubs.expected b/csharp/ql/test/query-tests/Stubs/All/AllStubs.expected
index 05b68090748..94d3a4fe826 100644
--- a/csharp/ql/test/query-tests/Stubs/All/AllStubs.expected
+++ b/csharp/ql/test/query-tests/Stubs/All/AllStubs.expected
@@ -1 +1 @@
-| // This file contains auto-generated code.\n\nnamespace A1\n{\n// Generated from `A1.C1` in `Test.cs:146:18:146:19; Test, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null`\npublic class C1\n{\n}\n\n}\nnamespace A2\n{\nnamespace B2\n{\n// Generated from `A2.B2.C2` in `Test.cs:153:22:153:23; Test, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null`\npublic class C2\n{\n}\n\n}\n}\nnamespace A3\n{\n// Generated from `A3.C3` in `Test.cs:159:18:159:19; Test, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null`\npublic class C3\n{\n}\n\n}\nnamespace A4\n{\n// Generated from `A4.C4` in `Test.cs:169:18:169:19; Test, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null`\npublic class C4\n{\n}\n\nnamespace B4\n{\n// Generated from `A4.B4.D4` in `Test.cs:166:22:166:23; Test, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null`\npublic class D4\n{\n}\n\n}\n}\nnamespace Test\n{\n// Generated from `Test.Class1` in `Test.cs:5:18:5:23; Test, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null`\npublic class Class1\n{\n// Generated from `Test.Class1+Class11` in `Test.cs:34:22:34:28; Test, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null`\npublic class Class11 : Test.Class1.Interface2, Test.Class1.Interface1\n{\n int Test.Class1.Interface2.this[int i] { get => throw null; }\n public void Method1() => throw null;\n void Test.Class1.Interface2.Method2() => throw null;\n}\n\n\n// Generated from `Test.Class1+Class12` in `Test.cs:51:22:51:28; Test, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null`\npublic class Class12 : Test.Class1.Class11\n{\n}\n\n\n// Generated from `Test.Class1+Class13` in `Test.cs:63:31:63:37; Test, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null`\npublic abstract class Class13\n{\n protected internal virtual void M() => throw null;\n public virtual void M1() where T: Test.Class1.Class13 => throw null;\n public abstract void M2();\n}\n\n\n// Generated from `Test.Class1+Class14` in `Test.cs:70:31:70:37; Test, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null`\npublic abstract class Class14 : Test.Class1.Class13\n{\n protected internal override void M() => throw null;\n public override void M1() => throw null;\n public abstract override void M2();\n}\n\n\n// Generated from `Test.Class1+Delegate1<>` in `Test.cs:47:30:47:41; Test, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null`\npublic delegate void Delegate1(T i, int j);\n\n\n public event Test.Class1.Delegate1 Event1;\n// Generated from `Test.Class1+GenericType<>` in `Test.cs:56:22:56:35; Test, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null`\npublic class GenericType\n{\n// Generated from `Test.Class1+GenericType<>+X` in `Test.cs:58:26:58:26; Test, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null`\npublic class X\n{\n}\n\n\n}\n\n\n// Generated from `Test.Class1+Interface1` in `Test.cs:18:26:18:35; Test, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null`\npublic interface Interface1\n{\n void Method1();\n}\n\n\n// Generated from `Test.Class1+Interface2` in `Test.cs:23:38:23:47; Test, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null`\nprotected internal interface Interface2\n{\n int this[int i] { get; }\n void Method2();\n}\n\n\n public Test.Class1.GenericType.X Prop { get => throw null; }\n// Generated from `Test.Class1+Struct1` in `Test.cs:7:23:7:29; Test, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null`\npublic struct Struct1\n{\n public void Method(Test.Class1.Struct1 s = default(Test.Class1.Struct1)) => throw null;\n public int i;\n public static int j = default;\n public System.ValueTuple t1;\n public (int,int) t2;\n}\n\n\n}\n\n// Generated from `Test.Class3` in `Test.cs:84:18:84:23; Test, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null`\npublic class Class3\n{\n public object Item { get => throw null; set => throw null; }\n [System.Runtime.CompilerServices.IndexerName("MyItem")]\n public object this[string index] { get => throw null; set => throw null; }\n}\n\n// Generated from `Test.Class4` in `Test.cs:91:18:91:23; Test, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null`\npublic class Class4\n{\n unsafe public void M(int* p) => throw null;\n}\n\n// Generated from `Test.Class5` in `Test.cs:102:18:102:23; Test, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null`\npublic class Class5 : Test.IInterface1\n{\n public void M2() => throw null;\n}\n\n// Generated from `Test.Class6<>` in `Test.cs:107:18:107:26; Test, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null`\npublic class Class6 where T: class, Test.IInterface1\n{\n public virtual void M1() where T: class, Test.IInterface1, new() => throw null;\n}\n\n// Generated from `Test.Class7` in `Test.cs:114:18:114:23; Test, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null`\npublic class Class7 : Test.Class6\n{\n public override void M1() where T: class => throw null;\n}\n\n// Generated from `Test.Class8` in `Test.cs:121:18:121:23; Test, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null`\npublic class Class8\n{\n public static int @this = default;\n}\n\n// Generated from `Test.Class9` in `Test.cs:126:18:126:23; Test, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null`\npublic class Class9\n{\n// Generated from `Test.Class9+Nested` in `Test.cs:130:22:130:27; Test, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null`\npublic class Nested : Test.Class9\n{\n}\n\n\n public Test.Class9.Nested NestedInstance { get => throw null; }\n}\n\n// Generated from `Test.IInterface1` in `Test.cs:96:22:96:32; Test, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null`\npublic interface IInterface1\n{\n void M1() => throw null;\n void M2();\n}\n\n}\n\n\n |
+| // This file contains auto-generated code.\n\nnamespace A1\n{\n// Generated from `A1.C1` in `Test.cs:146:18:146:19; Test, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null`\npublic class C1\n{\n}\n\n}\nnamespace A2\n{\nnamespace B2\n{\n// Generated from `A2.B2.C2` in `Test.cs:153:22:153:23; Test, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null`\npublic class C2\n{\n}\n\n}\n}\nnamespace A3\n{\n// Generated from `A3.C3` in `Test.cs:159:18:159:19; Test, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null`\npublic class C3\n{\n}\n\n}\nnamespace A4\n{\n// Generated from `A4.C4` in `Test.cs:169:18:169:19; Test, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null`\npublic class C4\n{\n}\n\nnamespace B4\n{\n// Generated from `A4.B4.D4` in `Test.cs:166:22:166:23; Test, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null`\npublic class D4\n{\n}\n\n}\n}\nnamespace Test\n{\n// Generated from `Test.Class1` in `Test.cs:5:18:5:23; Test, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null`\npublic class Class1\n{\n// Generated from `Test.Class1+Class11` in `Test.cs:34:22:34:28; Test, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null`\npublic class Class11 : Test.Class1.Interface1, Test.Class1.Interface2\n{\n int Test.Class1.Interface2.this[int i] { get => throw null; }\n public void Method1() => throw null;\n void Test.Class1.Interface2.Method2() => throw null;\n}\n\n\n// Generated from `Test.Class1+Class12` in `Test.cs:51:22:51:28; Test, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null`\npublic class Class12 : Test.Class1.Class11\n{\n}\n\n\n// Generated from `Test.Class1+Class13` in `Test.cs:63:31:63:37; Test, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null`\npublic abstract class Class13\n{\n protected internal virtual void M() => throw null;\n public virtual void M1() where T: Test.Class1.Class13 => throw null;\n public abstract void M2();\n}\n\n\n// Generated from `Test.Class1+Class14` in `Test.cs:70:31:70:37; Test, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null`\npublic abstract class Class14 : Test.Class1.Class13\n{\n protected internal override void M() => throw null;\n public override void M1() => throw null;\n public abstract override void M2();\n}\n\n\n// Generated from `Test.Class1+Delegate1<>` in `Test.cs:47:30:47:41; Test, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null`\npublic delegate void Delegate1(T i, int j);\n\n\n// Generated from `Test.Class1+GenericType<>` in `Test.cs:56:22:56:35; Test, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null`\npublic class GenericType\n{\n// Generated from `Test.Class1+GenericType<>+X` in `Test.cs:58:26:58:26; Test, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null`\npublic class X\n{\n}\n\n\n}\n\n\n// Generated from `Test.Class1+Interface1` in `Test.cs:18:26:18:35; Test, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null`\npublic interface Interface1\n{\n void Method1();\n}\n\n\n// Generated from `Test.Class1+Interface2` in `Test.cs:23:38:23:47; Test, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null`\nprotected internal interface Interface2\n{\n int this[int i] { get; }\n void Method2();\n}\n\n\n// Generated from `Test.Class1+Struct1` in `Test.cs:7:23:7:29; Test, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null`\npublic struct Struct1\n{\n public void Method(Test.Class1.Struct1 s = default(Test.Class1.Struct1)) => throw null;\n public int i;\n public static int j = default;\n public System.ValueTuple t1;\n public (int,int) t2;\n}\n\n\n public event Test.Class1.Delegate1 Event1;\n public Test.Class1.GenericType.X Prop { get => throw null; }\n}\n\n// Generated from `Test.Class3` in `Test.cs:84:18:84:23; Test, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null`\npublic class Class3\n{\n public object Item { get => throw null; set => throw null; }\n [System.Runtime.CompilerServices.IndexerName("MyItem")]\n public object this[string index] { get => throw null; set => throw null; }\n}\n\n// Generated from `Test.Class4` in `Test.cs:91:18:91:23; Test, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null`\npublic class Class4\n{\n unsafe public void M(int* p) => throw null;\n}\n\n// Generated from `Test.Class5` in `Test.cs:102:18:102:23; Test, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null`\npublic class Class5 : Test.IInterface1\n{\n public void M2() => throw null;\n}\n\n// Generated from `Test.Class6<>` in `Test.cs:107:18:107:26; Test, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null`\npublic class Class6 where T: class, Test.IInterface1\n{\n public virtual void M1() where T: class, Test.IInterface1, new() => throw null;\n}\n\n// Generated from `Test.Class7` in `Test.cs:114:18:114:23; Test, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null`\npublic class Class7 : Test.Class6\n{\n public override void M1() where T: class => throw null;\n}\n\n// Generated from `Test.Class8` in `Test.cs:121:18:121:23; Test, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null`\npublic class Class8\n{\n public static int @this = default;\n}\n\n// Generated from `Test.Class9` in `Test.cs:126:18:126:23; Test, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null`\npublic class Class9\n{\n// Generated from `Test.Class9+Nested` in `Test.cs:130:22:130:27; Test, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null`\npublic class Nested : Test.Class9\n{\n}\n\n\n public Test.Class9.Nested NestedInstance { get => throw null; }\n}\n\n// Generated from `Test.IInterface1` in `Test.cs:96:22:96:32; Test, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null`\npublic interface IInterface1\n{\n void M1() => throw null;\n void M2();\n}\n\n}\n\n\n |
diff --git a/csharp/ql/test/query-tests/Stubs/Minimal/MinimalStubsFromSource.expected b/csharp/ql/test/query-tests/Stubs/Minimal/MinimalStubsFromSource.expected
index 29b1d1de1f7..8d627dfd8e6 100644
--- a/csharp/ql/test/query-tests/Stubs/Minimal/MinimalStubsFromSource.expected
+++ b/csharp/ql/test/query-tests/Stubs/Minimal/MinimalStubsFromSource.expected
@@ -1 +1 @@
-| // This file contains auto-generated code.\n\nnamespace System\n{\n// Generated from `System.Uri` in `System.Private.Uri, Version=5.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a`\npublic class Uri : System.Runtime.Serialization.ISerializable\n{\n public override bool Equals(object comparand) => throw null;\n public override int GetHashCode() => throw null;\n void System.Runtime.Serialization.ISerializable.GetObjectData(System.Runtime.Serialization.SerializationInfo serializationInfo, System.Runtime.Serialization.StreamingContext streamingContext) => throw null;\n public override string ToString() => throw null;\n}\n\n}\n\n\n// This file contains auto-generated code.\n\nnamespace System\n{\nnamespace Collections\n{\n// Generated from `System.Collections.SortedList` in `System.Collections.NonGeneric, Version=5.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a`\npublic class SortedList : System.ICloneable, System.Collections.IEnumerable, System.Collections.IDictionary, System.Collections.ICollection\n{\n public virtual void Add(object key, object value) => throw null;\n public virtual void Clear() => throw null;\n public virtual object Clone() => throw null;\n public virtual bool Contains(object key) => throw null;\n public virtual void CopyTo(System.Array array, int arrayIndex) => throw null;\n public virtual int Count { get => throw null; }\n public virtual object GetByIndex(int index) => throw null;\n public virtual System.Collections.IDictionaryEnumerator GetEnumerator() => throw null;\n System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator() => throw null;\n public virtual bool IsFixedSize { get => throw null; }\n public virtual bool IsReadOnly { get => throw null; }\n public virtual bool IsSynchronized { get => throw null; }\n public virtual object this[object key] { get => throw null; set => throw null; }\n public virtual System.Collections.ICollection Keys { get => throw null; }\n public virtual void Remove(object key) => throw null;\n public virtual object SyncRoot { get => throw null; }\n public virtual System.Collections.ICollection Values { get => throw null; }\n}\n\n}\n}\n\n\n// This file contains auto-generated code.\n\nnamespace System\n{\nnamespace Collections\n{\nnamespace Generic\n{\n// Generated from `System.Collections.Generic.Stack<>` in `System.Collections, Version=5.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a`\npublic class Stack : System.Collections.IEnumerable, System.Collections.ICollection, System.Collections.Generic.IReadOnlyCollection, System.Collections.Generic.IEnumerable\n{\n void System.Collections.ICollection.CopyTo(System.Array array, int arrayIndex) => throw null;\n public int Count { get => throw null; }\n System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator() => throw null;\n System.Collections.Generic.IEnumerator System.Collections.Generic.IEnumerable.GetEnumerator() => throw null;\n bool System.Collections.ICollection.IsSynchronized { get => throw null; }\n public T Peek() => throw null;\n object System.Collections.ICollection.SyncRoot { get => throw null; }\n}\n\n}\n}\n}\n\n\n// This file contains auto-generated code.\n\nnamespace System\n{\nnamespace Collections\n{\nnamespace Specialized\n{\n// Generated from `System.Collections.Specialized.NameObjectCollectionBase` in `System.Collections.Specialized, Version=5.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a`\npublic abstract class NameObjectCollectionBase : System.Runtime.Serialization.ISerializable, System.Runtime.Serialization.IDeserializationCallback, System.Collections.IEnumerable, System.Collections.ICollection\n{\n void System.Collections.ICollection.CopyTo(System.Array array, int index) => throw null;\n public virtual int Count { get => throw null; }\n public virtual System.Collections.IEnumerator GetEnumerator() => throw null;\n public virtual void GetObjectData(System.Runtime.Serialization.SerializationInfo info, System.Runtime.Serialization.StreamingContext context) => throw null;\n bool System.Collections.ICollection.IsSynchronized { get => throw null; }\n public virtual void OnDeserialization(object sender) => throw null;\n object System.Collections.ICollection.SyncRoot { get => throw null; }\n}\n\n// Generated from `System.Collections.Specialized.NameValueCollection` in `System.Collections.Specialized, Version=5.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a`\npublic class NameValueCollection : System.Collections.Specialized.NameObjectCollectionBase\n{\n public string this[string name] { get => throw null; set => throw null; }\n}\n\n}\n}\n}\n\n\n// This file contains auto-generated code.\n\nnamespace System\n{\nnamespace ComponentModel\n{\n// Generated from `System.ComponentModel.ComponentConverter` in `System.ComponentModel.TypeConverter, Version=5.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a`\npublic class ComponentConverter : System.ComponentModel.ReferenceConverter\n{\n}\n\n// Generated from `System.ComponentModel.DefaultEventAttribute` in `System.ComponentModel.TypeConverter, Version=5.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a`\npublic class DefaultEventAttribute : System.Attribute\n{\n public DefaultEventAttribute(string name) => throw null;\n public override bool Equals(object obj) => throw null;\n public override int GetHashCode() => throw null;\n}\n\n// Generated from `System.ComponentModel.DefaultPropertyAttribute` in `System.ComponentModel.TypeConverter, Version=5.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a`\npublic class DefaultPropertyAttribute : System.Attribute\n{\n public DefaultPropertyAttribute(string name) => throw null;\n public override bool Equals(object obj) => throw null;\n public override int GetHashCode() => throw null;\n}\n\n// Generated from `System.ComponentModel.ReferenceConverter` in `System.ComponentModel.TypeConverter, Version=5.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a`\npublic class ReferenceConverter : System.ComponentModel.TypeConverter\n{\n}\n\n// Generated from `System.ComponentModel.TypeConverter` in `System.ComponentModel.TypeConverter, Version=5.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a`\npublic class TypeConverter\n{\n}\n\n}\nnamespace Timers\n{\n// Generated from `System.Timers.TimersDescriptionAttribute` in `System.ComponentModel.TypeConverter, Version=5.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a`\npublic class TimersDescriptionAttribute\n{\n public TimersDescriptionAttribute(string description) => throw null;\n internal TimersDescriptionAttribute(string description, string defaultValue) => throw null;\n}\n\n}\n}\n\n\n// This file contains auto-generated code.\n\nnamespace System\n{\nnamespace ComponentModel\n{\n// Generated from `System.ComponentModel.TypeConverterAttribute` in `System.ObjectModel, Version=5.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a`\npublic class TypeConverterAttribute : System.Attribute\n{\n public override bool Equals(object obj) => throw null;\n public override int GetHashCode() => throw null;\n public TypeConverterAttribute(string typeName) => throw null;\n public TypeConverterAttribute(System.Type type) => throw null;\n public TypeConverterAttribute() => throw null;\n}\n\n// Generated from `System.ComponentModel.TypeDescriptionProviderAttribute` in `System.ObjectModel, Version=5.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a`\npublic class TypeDescriptionProviderAttribute : System.Attribute\n{\n public TypeDescriptionProviderAttribute(string typeName) => throw null;\n public TypeDescriptionProviderAttribute(System.Type type) => throw null;\n}\n\n}\nnamespace Windows\n{\nnamespace Markup\n{\n// Generated from `System.Windows.Markup.ValueSerializerAttribute` in `System.ObjectModel, Version=5.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a`\npublic class ValueSerializerAttribute : System.Attribute\n{\n public ValueSerializerAttribute(string valueSerializerTypeName) => throw null;\n public ValueSerializerAttribute(System.Type valueSerializerType) => throw null;\n}\n\n}\n}\n}\n\n\n// This file contains auto-generated code.\n\nnamespace System\n{\nnamespace Linq\n{\n// Generated from `System.Linq.Enumerable` in `System.Linq, Version=5.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a`\npublic static class Enumerable\n{\n public static System.Collections.Generic.IEnumerable Select(this System.Collections.Generic.IEnumerable source, System.Func selector) => throw null;\n}\n\n}\n}\n\n\n// This file contains auto-generated code.\n\nnamespace System\n{\nnamespace Linq\n{\n// Generated from `System.Linq.IQueryable` in `System.Linq.Expressions, Version=5.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a`\npublic interface IQueryable : System.Collections.IEnumerable\n{\n}\n\n}\n}\n\n\n// This file contains auto-generated code.\n\nnamespace System\n{\nnamespace Linq\n{\n// Generated from `System.Linq.ParallelEnumerable` in `System.Linq.Parallel, Version=5.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a`\npublic static class ParallelEnumerable\n{\n public static System.Linq.ParallelQuery AsParallel(this System.Collections.IEnumerable source) => throw null;\n}\n\n// Generated from `System.Linq.ParallelQuery` in `System.Linq.Parallel, Version=5.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a`\npublic class ParallelQuery : System.Collections.IEnumerable\n{\n System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator() => throw null;\n internal ParallelQuery(System.Linq.Parallel.QuerySettings specifiedSettings) => throw null;\n}\n\nnamespace Parallel\n{\n// Generated from `System.Linq.Parallel.QuerySettings` in `System.Linq.Parallel, Version=5.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a`\ninternal struct QuerySettings\n{\n}\n\n}\n}\n}\n\n\n// This file contains auto-generated code.\n\nnamespace System\n{\nnamespace Linq\n{\n// Generated from `System.Linq.Queryable` in `System.Linq.Queryable, Version=5.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a`\npublic static class Queryable\n{\n public static System.Linq.IQueryable AsQueryable(this System.Collections.IEnumerable source) => throw null;\n}\n\n}\n}\n\n\n// This file contains auto-generated code.\n\nnamespace System\n{\nnamespace Runtime\n{\nnamespace Serialization\n{\n// Generated from `System.Runtime.Serialization.DataContractAttribute` in `System.Runtime.Serialization.Primitives, Version=5.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a`\npublic class DataContractAttribute : System.Attribute\n{\n public DataContractAttribute() => throw null;\n}\n\n// Generated from `System.Runtime.Serialization.DataMemberAttribute` in `System.Runtime.Serialization.Primitives, Version=5.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a`\npublic class DataMemberAttribute : System.Attribute\n{\n public DataMemberAttribute() => throw null;\n}\n\n}\n}\n}\n\n\n// This file contains auto-generated code.\n\nnamespace System\n{\nnamespace Text\n{\nnamespace RegularExpressions\n{\n// Generated from `System.Text.RegularExpressions.Capture` in `System.Text.RegularExpressions, Version=5.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a`\npublic class Capture\n{\n internal Capture(string text, int index, int length) => throw null;\n public override string ToString() => throw null;\n}\n\n// Generated from `System.Text.RegularExpressions.Group` in `System.Text.RegularExpressions, Version=5.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a`\npublic class Group : System.Text.RegularExpressions.Capture\n{\n internal Group(string text, int[] caps, int capcount, string name) : base(default(string), default(int), default(int)) => throw null;\n}\n\n// Generated from `System.Text.RegularExpressions.Match` in `System.Text.RegularExpressions, Version=5.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a`\npublic class Match : System.Text.RegularExpressions.Group\n{\n internal Match(System.Text.RegularExpressions.Regex regex, int capcount, string text, int begpos, int len, int startpos) : base(default(string), default(int[]), default(int), default(string)) => throw null;\n}\n\n// Generated from `System.Text.RegularExpressions.Regex` in `System.Text.RegularExpressions, Version=5.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a`\npublic class Regex : System.Runtime.Serialization.ISerializable\n{\n void System.Runtime.Serialization.ISerializable.GetObjectData(System.Runtime.Serialization.SerializationInfo si, System.Runtime.Serialization.StreamingContext context) => throw null;\n public static System.Text.RegularExpressions.Match Match(string input, string pattern, System.Text.RegularExpressions.RegexOptions options, System.TimeSpan matchTimeout) => throw null;\n public static System.Text.RegularExpressions.Match Match(string input, string pattern) => throw null;\n public System.Text.RegularExpressions.Match Match(string input) => throw null;\n public Regex(string pattern, System.Text.RegularExpressions.RegexOptions options, System.TimeSpan matchTimeout) => throw null;\n public Regex(string pattern) => throw null;\n public string Replace(string input, string replacement) => throw null;\n public override string ToString() => throw null;\n}\n\n// Generated from `System.Text.RegularExpressions.RegexOptions` in `System.Text.RegularExpressions, Version=5.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a`\n[System.Flags]\npublic enum RegexOptions\n{\n IgnoreCase,\n}\n\n}\n}\n}\n\n\n |
+| // This file contains auto-generated code.\n\nnamespace System\n{\n// Generated from `System.Uri` in `System.Private.Uri, Version=5.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a`\npublic class Uri : System.Runtime.Serialization.ISerializable\n{\n public override bool Equals(object comparand) => throw null;\n public override int GetHashCode() => throw null;\n void System.Runtime.Serialization.ISerializable.GetObjectData(System.Runtime.Serialization.SerializationInfo serializationInfo, System.Runtime.Serialization.StreamingContext streamingContext) => throw null;\n public override string ToString() => throw null;\n}\n\n}\n\n\n// This file contains auto-generated code.\n\nnamespace System\n{\nnamespace Collections\n{\n// Generated from `System.Collections.SortedList` in `System.Collections.NonGeneric, Version=5.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a`\npublic class SortedList : System.Collections.ICollection, System.Collections.IDictionary, System.Collections.IEnumerable, System.ICloneable\n{\n public virtual void Add(object key, object value) => throw null;\n public virtual void Clear() => throw null;\n public virtual object Clone() => throw null;\n public virtual bool Contains(object key) => throw null;\n public virtual void CopyTo(System.Array array, int arrayIndex) => throw null;\n public virtual int Count { get => throw null; }\n public virtual object GetByIndex(int index) => throw null;\n System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator() => throw null;\n public virtual System.Collections.IDictionaryEnumerator GetEnumerator() => throw null;\n public virtual bool IsFixedSize { get => throw null; }\n public virtual bool IsReadOnly { get => throw null; }\n public virtual bool IsSynchronized { get => throw null; }\n public virtual object this[object key] { get => throw null; set => throw null; }\n public virtual System.Collections.ICollection Keys { get => throw null; }\n public virtual void Remove(object key) => throw null;\n public virtual object SyncRoot { get => throw null; }\n public virtual System.Collections.ICollection Values { get => throw null; }\n}\n\n}\n}\n\n\n// This file contains auto-generated code.\n\nnamespace System\n{\nnamespace Collections\n{\nnamespace Generic\n{\n// Generated from `System.Collections.Generic.Stack<>` in `System.Collections, Version=5.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a`\npublic class Stack : System.Collections.Generic.IEnumerable, System.Collections.Generic.IReadOnlyCollection, System.Collections.ICollection, System.Collections.IEnumerable\n{\n void System.Collections.ICollection.CopyTo(System.Array array, int arrayIndex) => throw null;\n public int Count { get => throw null; }\n System.Collections.Generic.IEnumerator System.Collections.Generic.IEnumerable.GetEnumerator() => throw null;\n System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator() => throw null;\n bool System.Collections.ICollection.IsSynchronized { get => throw null; }\n public T Peek() => throw null;\n object System.Collections.ICollection.SyncRoot { get => throw null; }\n}\n\n}\n}\n}\n\n\n// This file contains auto-generated code.\n\nnamespace System\n{\nnamespace Collections\n{\nnamespace Specialized\n{\n// Generated from `System.Collections.Specialized.NameObjectCollectionBase` in `System.Collections.Specialized, Version=5.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a`\npublic abstract class NameObjectCollectionBase : System.Collections.ICollection, System.Collections.IEnumerable, System.Runtime.Serialization.IDeserializationCallback, System.Runtime.Serialization.ISerializable\n{\n void System.Collections.ICollection.CopyTo(System.Array array, int index) => throw null;\n public virtual int Count { get => throw null; }\n public virtual System.Collections.IEnumerator GetEnumerator() => throw null;\n public virtual void GetObjectData(System.Runtime.Serialization.SerializationInfo info, System.Runtime.Serialization.StreamingContext context) => throw null;\n bool System.Collections.ICollection.IsSynchronized { get => throw null; }\n public virtual void OnDeserialization(object sender) => throw null;\n object System.Collections.ICollection.SyncRoot { get => throw null; }\n}\n\n// Generated from `System.Collections.Specialized.NameValueCollection` in `System.Collections.Specialized, Version=5.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a`\npublic class NameValueCollection : System.Collections.Specialized.NameObjectCollectionBase\n{\n public string this[string name] { get => throw null; set => throw null; }\n}\n\n}\n}\n}\n\n\n// This file contains auto-generated code.\n\nnamespace System\n{\nnamespace ComponentModel\n{\n// Generated from `System.ComponentModel.ComponentConverter` in `System.ComponentModel.TypeConverter, Version=5.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a`\npublic class ComponentConverter : System.ComponentModel.ReferenceConverter\n{\n}\n\n// Generated from `System.ComponentModel.DefaultEventAttribute` in `System.ComponentModel.TypeConverter, Version=5.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a`\npublic class DefaultEventAttribute : System.Attribute\n{\n public DefaultEventAttribute(string name) => throw null;\n public override bool Equals(object obj) => throw null;\n public override int GetHashCode() => throw null;\n}\n\n// Generated from `System.ComponentModel.DefaultPropertyAttribute` in `System.ComponentModel.TypeConverter, Version=5.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a`\npublic class DefaultPropertyAttribute : System.Attribute\n{\n public DefaultPropertyAttribute(string name) => throw null;\n public override bool Equals(object obj) => throw null;\n public override int GetHashCode() => throw null;\n}\n\n// Generated from `System.ComponentModel.ReferenceConverter` in `System.ComponentModel.TypeConverter, Version=5.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a`\npublic class ReferenceConverter : System.ComponentModel.TypeConverter\n{\n}\n\n// Generated from `System.ComponentModel.TypeConverter` in `System.ComponentModel.TypeConverter, Version=5.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a`\npublic class TypeConverter\n{\n}\n\n}\nnamespace Timers\n{\n// Generated from `System.Timers.TimersDescriptionAttribute` in `System.ComponentModel.TypeConverter, Version=5.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a`\npublic class TimersDescriptionAttribute\n{\n public TimersDescriptionAttribute(string description) => throw null;\n internal TimersDescriptionAttribute(string description, string defaultValue) => throw null;\n}\n\n}\n}\n\n\n// This file contains auto-generated code.\n\nnamespace System\n{\nnamespace ComponentModel\n{\n// Generated from `System.ComponentModel.TypeConverterAttribute` in `System.ObjectModel, Version=5.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a`\npublic class TypeConverterAttribute : System.Attribute\n{\n public override bool Equals(object obj) => throw null;\n public override int GetHashCode() => throw null;\n public TypeConverterAttribute() => throw null;\n public TypeConverterAttribute(System.Type type) => throw null;\n public TypeConverterAttribute(string typeName) => throw null;\n}\n\n// Generated from `System.ComponentModel.TypeDescriptionProviderAttribute` in `System.ObjectModel, Version=5.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a`\npublic class TypeDescriptionProviderAttribute : System.Attribute\n{\n public TypeDescriptionProviderAttribute(System.Type type) => throw null;\n public TypeDescriptionProviderAttribute(string typeName) => throw null;\n}\n\n}\nnamespace Windows\n{\nnamespace Markup\n{\n// Generated from `System.Windows.Markup.ValueSerializerAttribute` in `System.ObjectModel, Version=5.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a`\npublic class ValueSerializerAttribute : System.Attribute\n{\n public ValueSerializerAttribute(System.Type valueSerializerType) => throw null;\n public ValueSerializerAttribute(string valueSerializerTypeName) => throw null;\n}\n\n}\n}\n}\n\n\n// This file contains auto-generated code.\n\nnamespace System\n{\nnamespace Linq\n{\n// Generated from `System.Linq.Enumerable` in `System.Linq, Version=5.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a`\npublic static class Enumerable\n{\n public static System.Collections.Generic.IEnumerable Select(this System.Collections.Generic.IEnumerable source, System.Func selector) => throw null;\n}\n\n}\n}\n\n\n// This file contains auto-generated code.\n\nnamespace System\n{\nnamespace Linq\n{\n// Generated from `System.Linq.IQueryable` in `System.Linq.Expressions, Version=5.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a`\npublic interface IQueryable : System.Collections.IEnumerable\n{\n}\n\n}\n}\n\n\n// This file contains auto-generated code.\n\nnamespace System\n{\nnamespace Linq\n{\n// Generated from `System.Linq.ParallelEnumerable` in `System.Linq.Parallel, Version=5.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a`\npublic static class ParallelEnumerable\n{\n public static System.Linq.ParallelQuery AsParallel(this System.Collections.IEnumerable source) => throw null;\n}\n\n// Generated from `System.Linq.ParallelQuery` in `System.Linq.Parallel, Version=5.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a`\npublic class ParallelQuery : System.Collections.IEnumerable\n{\n System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator() => throw null;\n internal ParallelQuery(System.Linq.Parallel.QuerySettings specifiedSettings) => throw null;\n}\n\nnamespace Parallel\n{\n// Generated from `System.Linq.Parallel.QuerySettings` in `System.Linq.Parallel, Version=5.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a`\ninternal struct QuerySettings\n{\n}\n\n}\n}\n}\n\n\n// This file contains auto-generated code.\n\nnamespace System\n{\nnamespace Linq\n{\n// Generated from `System.Linq.Queryable` in `System.Linq.Queryable, Version=5.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a`\npublic static class Queryable\n{\n public static System.Linq.IQueryable AsQueryable(this System.Collections.IEnumerable source) => throw null;\n}\n\n}\n}\n\n\n// This file contains auto-generated code.\n\nnamespace System\n{\nnamespace Runtime\n{\nnamespace Serialization\n{\n// Generated from `System.Runtime.Serialization.DataContractAttribute` in `System.Runtime.Serialization.Primitives, Version=5.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a`\npublic class DataContractAttribute : System.Attribute\n{\n public DataContractAttribute() => throw null;\n}\n\n// Generated from `System.Runtime.Serialization.DataMemberAttribute` in `System.Runtime.Serialization.Primitives, Version=5.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a`\npublic class DataMemberAttribute : System.Attribute\n{\n public DataMemberAttribute() => throw null;\n}\n\n}\n}\n}\n\n\n// This file contains auto-generated code.\n\nnamespace System\n{\nnamespace Text\n{\nnamespace RegularExpressions\n{\n// Generated from `System.Text.RegularExpressions.Capture` in `System.Text.RegularExpressions, Version=5.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a`\npublic class Capture\n{\n internal Capture(string text, int index, int length) => throw null;\n public override string ToString() => throw null;\n}\n\n// Generated from `System.Text.RegularExpressions.Group` in `System.Text.RegularExpressions, Version=5.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a`\npublic class Group : System.Text.RegularExpressions.Capture\n{\n internal Group(string text, int[] caps, int capcount, string name) : base(default(string), default(int), default(int)) => throw null;\n}\n\n// Generated from `System.Text.RegularExpressions.Match` in `System.Text.RegularExpressions, Version=5.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a`\npublic class Match : System.Text.RegularExpressions.Group\n{\n internal Match(System.Text.RegularExpressions.Regex regex, int capcount, string text, int begpos, int len, int startpos) : base(default(string), default(int[]), default(int), default(string)) => throw null;\n}\n\n// Generated from `System.Text.RegularExpressions.Regex` in `System.Text.RegularExpressions, Version=5.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a`\npublic class Regex : System.Runtime.Serialization.ISerializable\n{\n void System.Runtime.Serialization.ISerializable.GetObjectData(System.Runtime.Serialization.SerializationInfo si, System.Runtime.Serialization.StreamingContext context) => throw null;\n public System.Text.RegularExpressions.Match Match(string input) => throw null;\n public static System.Text.RegularExpressions.Match Match(string input, string pattern) => throw null;\n public static System.Text.RegularExpressions.Match Match(string input, string pattern, System.Text.RegularExpressions.RegexOptions options, System.TimeSpan matchTimeout) => throw null;\n public Regex(string pattern) => throw null;\n public Regex(string pattern, System.Text.RegularExpressions.RegexOptions options, System.TimeSpan matchTimeout) => throw null;\n public string Replace(string input, string replacement) => throw null;\n public override string ToString() => throw null;\n}\n\n// Generated from `System.Text.RegularExpressions.RegexOptions` in `System.Text.RegularExpressions, Version=5.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a`\n[System.Flags]\npublic enum RegexOptions\n{\n IgnoreCase,\n}\n\n}\n}\n}\n\n\n |
diff --git a/csharp/ql/src/semmlecode.csharp.dbscheme b/csharp/upgrades/770f844243d5a2282861b33fd201d0a02e3528d9/old.dbscheme
similarity index 100%
rename from csharp/ql/src/semmlecode.csharp.dbscheme
rename to csharp/upgrades/770f844243d5a2282861b33fd201d0a02e3528d9/old.dbscheme
diff --git a/csharp/upgrades/770f844243d5a2282861b33fd201d0a02e3528d9/semmlecode.csharp.dbscheme b/csharp/upgrades/770f844243d5a2282861b33fd201d0a02e3528d9/semmlecode.csharp.dbscheme
new file mode 100644
index 00000000000..0f562410898
--- /dev/null
+++ b/csharp/upgrades/770f844243d5a2282861b33fd201d0a02e3528d9/semmlecode.csharp.dbscheme
@@ -0,0 +1,2093 @@
+/* This is a dummy line to alter the dbscheme, so we can make a database upgrade
+ * without actually changing any of the dbscheme predicates. It contains a date
+ * to allow for such updates in the future as well.
+ *
+ * 2021-07-14
+ *
+ * DO NOT remove this comment carelessly, since it can revert the dbscheme back to a
+ * previously seen state (matching a previously seen SHA), which would make the upgrade
+ * mechanism not work properly.
+ */
+
+/**
+ * An invocation of the compiler. Note that more than one file may be
+ * compiled per invocation. For example, this command compiles three
+ * source files:
+ *
+ * csc f1.cs f2.cs f3.cs
+ *
+ * The `id` simply identifies the invocation, while `cwd` is the working
+ * directory from which the compiler was invoked.
+ */
+compilations(
+ unique int id : @compilation,
+ string cwd : string ref
+);
+
+/**
+ * The arguments that were passed to the extractor for a compiler
+ * invocation. If `id` is for the compiler invocation
+ *
+ * csc f1.cs f2.cs f3.cs
+ *
+ * then typically there will be rows for
+ *
+ * num | arg
+ * --- | ---
+ * 0 | --compiler
+ * 1 | *path to compiler*
+ * 2 | --cil
+ * 3 | f1.cs
+ * 4 | f2.cs
+ * 5 | f3.cs
+ */
+#keyset[id, num]
+compilation_args(
+ int id : @compilation ref,
+ int num : int ref,
+ string arg : string ref
+);
+
+/**
+ * The source files that are compiled by a compiler invocation.
+ * If `id` is for the compiler invocation
+ *
+ * csc f1.cs f2.cs f3.cs
+ *
+ * then there will be rows for
+ *
+ * num | arg
+ * --- | ---
+ * 0 | f1.cs
+ * 1 | f2.cs
+ * 2 | f3.cs
+ */
+#keyset[id, num]
+compilation_compiling_files(
+ int id : @compilation ref,
+ int num : int ref,
+ int file : @file ref
+);
+
+/**
+ * The references used by a compiler invocation.
+ * If `id` is for the compiler invocation
+ *
+ * csc f1.cs f2.cs f3.cs /r:ref1.dll /r:ref2.dll /r:ref3.dll
+ *
+ * then there will be rows for
+ *
+ * num | arg
+ * --- | ---
+ * 0 | ref1.dll
+ * 1 | ref2.dll
+ * 2 | ref3.dll
+ */
+#keyset[id, num]
+compilation_referencing_files(
+ int id : @compilation ref,
+ int num : int ref,
+ int file : @file ref
+);
+
+/**
+ * The time taken by the extractor for a compiler invocation.
+ *
+ * For each file `num`, there will be rows for
+ *
+ * kind | seconds
+ * ---- | ---
+ * 1 | CPU seconds used by the extractor frontend
+ * 2 | Elapsed seconds during the extractor frontend
+ * 3 | CPU seconds used by the extractor backend
+ * 4 | Elapsed seconds during the extractor backend
+ */
+#keyset[id, num, kind]
+compilation_time(
+ int id : @compilation ref,
+ int num : int ref,
+ /* kind:
+ 1 = frontend_cpu_seconds
+ 2 = frontend_elapsed_seconds
+ 3 = extractor_cpu_seconds
+ 4 = extractor_elapsed_seconds
+ */
+ int kind : int ref,
+ float seconds : float ref
+);
+
+/**
+ * An error or warning generated by the extractor.
+ * The diagnostic message `diagnostic` was generated during compiler
+ * invocation `compilation`, and is the `file_number_diagnostic_number`th
+ * message generated while extracting the `file_number`th file of that
+ * invocation.
+ */
+#keyset[compilation, file_number, file_number_diagnostic_number]
+diagnostic_for(
+ unique int diagnostic : @diagnostic ref,
+ int compilation : @compilation ref,
+ int file_number : int ref,
+ int file_number_diagnostic_number : int ref
+);
+
+diagnostics(
+ unique int id: @diagnostic,
+ int severity: int ref,
+ string error_tag: string ref,
+ string error_message: string ref,
+ string full_error_message: string ref,
+ int location: @location_default ref
+);
+
+extractor_messages(
+ unique int id: @extractor_message,
+ int severity: int ref,
+ string origin : string ref,
+ string text : string ref,
+ string entity : string ref,
+ int location: @location_default ref,
+ string stack_trace : string ref
+);
+
+/**
+ * If extraction was successful, then `cpu_seconds` and
+ * `elapsed_seconds` are the CPU time and elapsed time (respectively)
+ * that extraction took for compiler invocation `id`.
+ */
+compilation_finished(
+ unique int id : @compilation ref,
+ float cpu_seconds : float ref,
+ float elapsed_seconds : float ref
+);
+
+compilation_assembly(
+ unique int id : @compilation ref,
+ int assembly: @assembly ref
+)
+
+/*
+ * External artifacts
+ */
+
+externalDefects(
+ unique int id: @externalDefect,
+ string queryPath: string ref,
+ int location: @location ref,
+ string message: string ref,
+ float severity: float ref);
+
+externalMetrics(
+ unique int id: @externalMetric,
+ string queryPath: string ref,
+ int location: @location ref,
+ float value: float ref);
+
+externalData(
+ int id: @externalDataElement,
+ string path: string ref,
+ int column: int ref,
+ string value: string ref);
+
+snapshotDate(
+ unique date snapshotDate: date ref);
+
+sourceLocationPrefix(
+ string prefix: string ref);
+
+/*
+ * Duplicate code
+ */
+
+duplicateCode(
+ unique int id: @duplication,
+ string relativePath: string ref,
+ int equivClass: int ref);
+
+similarCode(
+ unique int id: @similarity,
+ string relativePath: string ref,
+ int equivClass: int ref);
+
+@duplication_or_similarity = @duplication | @similarity
+
+tokens(
+ int id: @duplication_or_similarity ref,
+ int offset: int ref,
+ int beginLine: int ref,
+ int beginColumn: int ref,
+ int endLine: int ref,
+ int endColumn: int ref);
+
+/*
+ * C# dbscheme
+ */
+
+/** ELEMENTS **/
+
+@element = @declaration | @stmt | @expr | @modifier | @attribute | @namespace_declaration
+ | @using_directive | @type_parameter_constraints | @external_element
+ | @xmllocatable | @asp_element | @namespace | @preprocessor_directive;
+
+@declaration = @callable | @generic | @assignable | @namespace;
+
+@named_element = @namespace | @declaration;
+
+@declaration_with_accessors = @property | @indexer | @event;
+
+@assignable = @variable | @assignable_with_accessors | @event;
+
+@assignable_with_accessors = @property | @indexer;
+
+@external_element = @externalMetric | @externalDefect | @externalDataElement;
+
+@attributable = @assembly | @field | @parameter | @operator | @method | @constructor
+ | @destructor | @callable_accessor | @value_or_ref_type | @declaration_with_accessors
+ | @local_function;
+
+/** LOCATIONS, ASEMMBLIES, MODULES, FILES and FOLDERS **/
+
+@location = @location_default | @assembly;
+
+locations_default(
+ unique int id: @location_default,
+ int file: @file ref,
+ int beginLine: int ref,
+ int beginColumn: int ref,
+ int endLine: int ref,
+ int endColumn: int ref);
+
+locations_mapped(
+ unique int id: @location_default ref,
+ int mapped_to: @location_default ref);
+
+@sourceline = @file | @callable | @xmllocatable;
+
+numlines(
+ int element_id: @sourceline ref,
+ int num_lines: int ref,
+ int num_code: int ref,
+ int num_comment: int ref);
+
+assemblies(
+ unique int id: @assembly,
+ int file: @file ref,
+ string fullname: string ref,
+ string name: string ref,
+ string version: string ref);
+
+/*
+ fromSource(0) = unknown,
+ fromSource(1) = from source,
+ fromSource(2) = from library
+*/
+files(
+ unique int id: @file,
+ string name: string ref,
+ string simple: string ref,
+ string ext: string ref,
+ int fromSource: int ref);
+
+folders(
+ unique int id: @folder,
+ string name: string ref,
+ string simple: string ref);
+
+@container = @folder | @file ;
+
+containerparent(
+ int parent: @container ref,
+ unique int child: @container ref);
+
+file_extraction_mode(
+ unique int file: @file ref,
+ int mode: int ref
+ /* 0 = normal, 1 = standalone extractor */
+ );
+
+/** NAMESPACES **/
+
+@type_container = @namespace | @type;
+
+namespaces(
+ unique int id: @namespace,
+ string name: string ref);
+
+namespace_declarations(
+ unique int id: @namespace_declaration,
+ int namespace_id: @namespace ref);
+
+namespace_declaration_location(
+ unique int id: @namespace_declaration ref,
+ int loc: @location ref);
+
+parent_namespace(
+ unique int child_id: @type_container ref,
+ int namespace_id: @namespace ref);
+
+@declaration_or_directive = @namespace_declaration | @type | @using_directive;
+
+parent_namespace_declaration(
+ int child_id: @declaration_or_directive ref, // cannot be unique because of partial classes
+ int namespace_id: @namespace_declaration ref);
+
+@using_directive = @using_namespace_directive | @using_static_directive;
+
+using_namespace_directives(
+ unique int id: @using_namespace_directive,
+ int namespace_id: @namespace ref);
+
+using_static_directives(
+ unique int id: @using_static_directive,
+ int type_id: @type_or_ref ref);
+
+using_directive_location(
+ unique int id: @using_directive ref,
+ int loc: @location ref);
+
+@preprocessor_directive = @pragma_warning | @pragma_checksum | @directive_define | @directive_undefine | @directive_warning
+ | @directive_error | @directive_nullable | @directive_line | @directive_region | @directive_endregion | @directive_if
+ | @directive_elif | @directive_else | @directive_endif;
+
+@conditional_directive = @directive_if | @directive_elif;
+@branch_directive = @directive_if | @directive_elif | @directive_else;
+
+directive_ifs(
+ unique int id: @directive_if,
+ int branchTaken: int ref, /* 0: false, 1: true */
+ int conditionValue: int ref); /* 0: false, 1: true */
+
+directive_elifs(
+ unique int id: @directive_elif,
+ int branchTaken: int ref, /* 0: false, 1: true */
+ int conditionValue: int ref, /* 0: false, 1: true */
+ int parent: @directive_if ref,
+ int index: int ref);
+
+directive_elses(
+ unique int id: @directive_else,
+ int branchTaken: int ref, /* 0: false, 1: true */
+ int parent: @directive_if ref,
+ int index: int ref);
+
+#keyset[id, start]
+directive_endifs(
+ unique int id: @directive_endif,
+ unique int start: @directive_if ref);
+
+directive_define_symbols(
+ unique int id: @define_symbol_expr ref,
+ string name: string ref);
+
+directive_regions(
+ unique int id: @directive_region,
+ string name: string ref);
+
+#keyset[id, start]
+directive_endregions(
+ unique int id: @directive_endregion,
+ unique int start: @directive_region ref);
+
+directive_lines(
+ unique int id: @directive_line,
+ int kind: int ref); /* 0: default, 1: hidden, 2: numeric */
+
+directive_line_value(
+ unique int id: @directive_line ref,
+ int line: int ref);
+
+directive_line_file(
+ unique int id: @directive_line ref,
+ int file: @file ref
+)
+
+directive_nullables(
+ unique int id: @directive_nullable,
+ int setting: int ref, /* 0: disable, 1: enable, 2: restore */
+ int target: int ref); /* 0: none, 1: annotations, 2: warnings */
+
+directive_warnings(
+ unique int id: @directive_warning,
+ string message: string ref);
+
+directive_errors(
+ unique int id: @directive_error,
+ string message: string ref);
+
+directive_undefines(
+ unique int id: @directive_undefine,
+ string name: string ref);
+
+directive_defines(
+ unique int id: @directive_define,
+ string name: string ref);
+
+pragma_checksums(
+ unique int id: @pragma_checksum,
+ int file: @file ref,
+ string guid: string ref,
+ string bytes: string ref);
+
+pragma_warnings(
+ unique int id: @pragma_warning,
+ int kind: int ref /* 0 = disable, 1 = restore */);
+
+#keyset[id, index]
+pragma_warning_error_codes(
+ int id: @pragma_warning ref,
+ string errorCode: string ref,
+ int index: int ref);
+
+preprocessor_directive_location(
+ unique int id: @preprocessor_directive ref,
+ int loc: @location ref);
+
+preprocessor_directive_compilation(
+ unique int id: @preprocessor_directive ref,
+ int compilation: @compilation ref);
+
+preprocessor_directive_active(
+ unique int id: @preprocessor_directive ref,
+ int active: int ref); /* 0: false, 1: true */
+
+/** TYPES **/
+
+types(
+ unique int id: @type,
+ int kind: int ref,
+ string name: string ref);
+
+case @type.kind of
+ 1 = @bool_type
+| 2 = @char_type
+| 3 = @decimal_type
+| 4 = @sbyte_type
+| 5 = @short_type
+| 6 = @int_type
+| 7 = @long_type
+| 8 = @byte_type
+| 9 = @ushort_type
+| 10 = @uint_type
+| 11 = @ulong_type
+| 12 = @float_type
+| 13 = @double_type
+| 14 = @enum_type
+| 15 = @struct_type
+| 17 = @class_type
+| 19 = @interface_type
+| 20 = @delegate_type
+| 21 = @null_type
+| 22 = @type_parameter
+| 23 = @pointer_type
+| 24 = @nullable_type
+| 25 = @array_type
+| 26 = @void_type
+| 27 = @int_ptr_type
+| 28 = @uint_ptr_type
+| 29 = @dynamic_type
+| 30 = @arglist_type
+| 31 = @unknown_type
+| 32 = @tuple_type
+| 33 = @function_pointer_type
+ ;
+
+@simple_type = @bool_type | @char_type | @integral_type | @floating_point_type | @decimal_type;
+@integral_type = @signed_integral_type | @unsigned_integral_type;
+@signed_integral_type = @sbyte_type | @short_type | @int_type | @long_type;
+@unsigned_integral_type = @byte_type | @ushort_type | @uint_type | @ulong_type;
+@floating_point_type = @float_type | @double_type;
+@value_type = @simple_type | @enum_type | @struct_type | @nullable_type | @int_ptr_type
+ | @uint_ptr_type | @tuple_type;
+@ref_type = @class_type | @interface_type | @array_type | @delegate_type | @null_type
+ | @dynamic_type;
+@value_or_ref_type = @value_type | @ref_type;
+
+typerefs(
+ unique int id: @typeref,
+ string name: string ref);
+
+typeref_type(
+ int id: @typeref ref,
+ unique int typeId: @type ref);
+
+@type_or_ref = @type | @typeref;
+
+array_element_type(
+ unique int array: @array_type ref,
+ int dimension: int ref,
+ int rank: int ref,
+ int element: @type_or_ref ref);
+
+nullable_underlying_type(
+ unique int nullable: @nullable_type ref,
+ int underlying: @type_or_ref ref);
+
+pointer_referent_type(
+ unique int pointer: @pointer_type ref,
+ int referent: @type_or_ref ref);
+
+enum_underlying_type(
+ unique int enum_id: @enum_type ref,
+ int underlying_type_id: @type_or_ref ref);
+
+delegate_return_type(
+ unique int delegate_id: @delegate_type ref,
+ int return_type_id: @type_or_ref ref);
+
+function_pointer_return_type(
+ unique int function_pointer_id: @function_pointer_type ref,
+ int return_type_id: @type_or_ref ref);
+
+extend(
+ int sub: @type ref,
+ int super: @type_or_ref ref);
+
+anonymous_types(
+ unique int id: @type ref);
+
+@interface_or_ref = @interface_type | @typeref;
+
+implement(
+ int sub: @type ref,
+ int super: @type_or_ref ref);
+
+type_location(
+ int id: @type ref,
+ int loc: @location ref);
+
+tuple_underlying_type(
+ unique int tuple: @tuple_type ref,
+ int struct: @type_or_ref ref);
+
+#keyset[tuple, index]
+tuple_element(
+ int tuple: @tuple_type ref,
+ int index: int ref,
+ unique int field: @field ref);
+
+attributes(
+ unique int id: @attribute,
+ int type_id: @type_or_ref ref,
+ int target: @attributable ref);
+
+attribute_location(
+ int id: @attribute ref,
+ int loc: @location ref);
+
+@type_mention_parent = @element | @type_mention;
+
+type_mention(
+ unique int id: @type_mention,
+ int type_id: @type_or_ref ref,
+ int parent: @type_mention_parent ref);
+
+type_mention_location(
+ unique int id: @type_mention ref,
+ int loc: @location ref);
+
+@has_type_annotation = @assignable | @type_parameter | @callable | @expr | @delegate_type | @generic | @function_pointer_type;
+
+/**
+ * A direct annotation on an entity, for example `string? x;`.
+ *
+ * Annotations:
+ * 2 = reftype is not annotated "!"
+ * 3 = reftype is annotated "?"
+ * 4 = readonly ref type / in parameter
+ * 5 = ref type parameter, return or local variable
+ * 6 = out parameter
+ *
+ * Note that the annotation depends on the element it annotates.
+ * @assignable: The annotation is on the type of the assignable, for example the variable type.
+ * @type_parameter: The annotation is on the reftype constraint
+ * @callable: The annotation is on the return type
+ * @array_type: The annotation is on the element type
+ */
+type_annotation(int id: @has_type_annotation ref, int annotation: int ref);
+
+nullability(unique int nullability: @nullability, int kind: int ref);
+
+case @nullability.kind of
+ 0 = @oblivious
+| 1 = @not_annotated
+| 2 = @annotated
+;
+
+#keyset[parent, index]
+nullability_parent(int nullability: @nullability ref, int index: int ref, int parent: @nullability ref)
+
+type_nullability(int id: @has_type_annotation ref, int nullability: @nullability ref);
+
+/**
+ * The nullable flow state of an expression, as determined by Roslyn.
+ * 0 = none (default, not populated)
+ * 1 = not null
+ * 2 = maybe null
+ */
+expr_flowstate(unique int id: @expr ref, int state: int ref);
+
+/** GENERICS **/
+
+@generic = @type | @method | @local_function;
+
+type_parameters(
+ unique int id: @type_parameter ref,
+ int index: int ref,
+ int generic_id: @generic ref,
+ int variance: int ref /* none = 0, out = 1, in = 2 */);
+
+#keyset[constructed_id, index]
+type_arguments(
+ int id: @type_or_ref ref,
+ int index: int ref,
+ int constructed_id: @generic_or_ref ref);
+
+@generic_or_ref = @generic | @typeref;
+
+constructed_generic(
+ unique int constructed: @generic ref,
+ int generic: @generic_or_ref ref);
+
+type_parameter_constraints(
+ unique int id: @type_parameter_constraints,
+ int param_id: @type_parameter ref);
+
+type_parameter_constraints_location(
+ int id: @type_parameter_constraints ref,
+ int loc: @location ref);
+
+general_type_parameter_constraints(
+ int id: @type_parameter_constraints ref,
+ int kind: int ref /* class = 1, struct = 2, new = 3 */);
+
+specific_type_parameter_constraints(
+ int id: @type_parameter_constraints ref,
+ int base_id: @type_or_ref ref);
+
+specific_type_parameter_nullability(
+ int id: @type_parameter_constraints ref,
+ int base_id: @type_or_ref ref,
+ int nullability: @nullability ref);
+
+/** FUNCTION POINTERS */
+
+function_pointer_calling_conventions(
+ int id: @function_pointer_type ref,
+ int kind: int ref);
+
+#keyset[id, index]
+has_unmanaged_calling_conventions(
+ int id: @function_pointer_type ref,
+ int index: int ref,
+ int conv_id: @type_or_ref ref);
+
+/** MODIFIERS */
+
+@modifiable = @modifiable_direct | @event_accessor;
+
+@modifiable_direct = @member | @accessor | @local_function | @anonymous_function_expr;
+
+modifiers(
+ unique int id: @modifier,
+ string name: string ref);
+
+has_modifiers(
+ int id: @modifiable_direct ref,
+ int mod_id: @modifier ref);
+
+compiler_generated(unique int id: @modifiable_direct ref);
+
+/** MEMBERS **/
+
+@member = @method | @constructor | @destructor | @field | @property | @event | @operator | @indexer | @type;
+
+@named_exprorstmt = @goto_stmt | @labeled_stmt | @expr;
+
+@virtualizable = @method | @property | @indexer | @event;
+
+exprorstmt_name(
+ unique int parent_id: @named_exprorstmt ref,
+ string name: string ref);
+
+nested_types(
+ unique int id: @type ref,
+ int declaring_type_id: @type ref,
+ int unbound_id: @type ref);
+
+properties(
+ unique int id: @property,
+ string name: string ref,
+ int declaring_type_id: @type ref,
+ int type_id: @type_or_ref ref,
+ int unbound_id: @property ref);
+
+property_location(
+ int id: @property ref,
+ int loc: @location ref);
+
+indexers(
+ unique int id: @indexer,
+ string name: string ref,
+ int declaring_type_id: @type ref,
+ int type_id: @type_or_ref ref,
+ int unbound_id: @indexer ref);
+
+indexer_location(
+ int id: @indexer ref,
+ int loc: @location ref);
+
+accessors(
+ unique int id: @accessor,
+ int kind: int ref,
+ string name: string ref,
+ int declaring_member_id: @member ref,
+ int unbound_id: @accessor ref);
+
+case @accessor.kind of
+ 1 = @getter
+| 2 = @setter
+ ;
+
+init_only_accessors(
+ unique int id: @accessor ref);
+
+accessor_location(
+ int id: @accessor ref,
+ int loc: @location ref);
+
+events(
+ unique int id: @event,
+ string name: string ref,
+ int declaring_type_id: @type ref,
+ int type_id: @type_or_ref ref,
+ int unbound_id: @event ref);
+
+event_location(
+ int id: @event ref,
+ int loc: @location ref);
+
+event_accessors(
+ unique int id: @event_accessor,
+ int kind: int ref,
+ string name: string ref,
+ int declaring_event_id: @event ref,
+ int unbound_id: @event_accessor ref);
+
+case @event_accessor.kind of
+ 1 = @add_event_accessor
+| 2 = @remove_event_accessor
+ ;
+
+event_accessor_location(
+ int id: @event_accessor ref,
+ int loc: @location ref);
+
+operators(
+ unique int id: @operator,
+ string name: string ref,
+ string symbol: string ref,
+ int declaring_type_id: @type ref,
+ int type_id: @type_or_ref ref,
+ int unbound_id: @operator ref);
+
+operator_location(
+ int id: @operator ref,
+ int loc: @location ref);
+
+constant_value(
+ int id: @variable ref,
+ string value: string ref);
+
+/** CALLABLES **/
+
+@callable = @method | @constructor | @destructor | @operator | @callable_accessor | @anonymous_function_expr | @local_function;
+
+@callable_accessor = @accessor | @event_accessor;
+
+methods(
+ unique int id: @method,
+ string name: string ref,
+ int declaring_type_id: @type ref,
+ int type_id: @type_or_ref ref,
+ int unbound_id: @method ref);
+
+method_location(
+ int id: @method ref,
+ int loc: @location ref);
+
+constructors(
+ unique int id: @constructor,
+ string name: string ref,
+ int declaring_type_id: @type ref,
+ int unbound_id: @constructor ref);
+
+constructor_location(
+ int id: @constructor ref,
+ int loc: @location ref);
+
+destructors(
+ unique int id: @destructor,
+ string name: string ref,
+ int declaring_type_id: @type ref,
+ int unbound_id: @destructor ref);
+
+destructor_location(
+ int id: @destructor ref,
+ int loc: @location ref);
+
+overrides(
+ int id: @callable ref,
+ int base_id: @callable ref);
+
+explicitly_implements(
+ int id: @member ref,
+ int interface_id: @interface_or_ref ref);
+
+local_functions(
+ unique int id: @local_function,
+ string name: string ref,
+ int return_type: @type ref,
+ int unbound_id: @local_function ref);
+
+local_function_stmts(
+ unique int fn: @local_function_stmt ref,
+ int stmt: @local_function ref);
+
+/** VARIABLES **/
+
+@variable = @local_scope_variable | @field;
+
+@local_scope_variable = @local_variable | @parameter;
+
+fields(
+ unique int id: @field,
+ int kind: int ref,
+ string name: string ref,
+ int declaring_type_id: @type ref,
+ int type_id: @type_or_ref ref,
+ int unbound_id: @field ref);
+
+case @field.kind of
+ 1 = @addressable_field
+| 2 = @constant
+ ;
+
+field_location(
+ int id: @field ref,
+ int loc: @location ref);
+
+localvars(
+ unique int id: @local_variable,
+ int kind: int ref,
+ string name: string ref,
+ int implicitly_typed: int ref /* 0 = no, 1 = yes */,
+ int type_id: @type_or_ref ref,
+ int parent_id: @local_var_decl_expr ref);
+
+case @local_variable.kind of
+ 1 = @addressable_local_variable
+| 2 = @local_constant
+| 3 = @local_variable_ref
+ ;
+
+localvar_location(
+ unique int id: @local_variable ref,
+ int loc: @location ref);
+
+@parameterizable = @callable | @delegate_type | @indexer | @function_pointer_type;
+
+#keyset[name, parent_id]
+#keyset[index, parent_id]
+params(
+ unique int id: @parameter,
+ string name: string ref,
+ int type_id: @type_or_ref ref,
+ int index: int ref,
+ int mode: int ref, /* value = 0, ref = 1, out = 2, array = 3, this = 4 */
+ int parent_id: @parameterizable ref,
+ int unbound_id: @parameter ref);
+
+param_location(
+ int id: @parameter ref,
+ int loc: @location ref);
+
+/** STATEMENTS **/
+
+@exprorstmt_parent = @control_flow_element | @top_level_exprorstmt_parent;
+
+statements(
+ unique int id: @stmt,
+ int kind: int ref);
+
+#keyset[index, parent]
+stmt_parent(
+ unique int stmt: @stmt ref,
+ int index: int ref,
+ int parent: @control_flow_element ref);
+
+@top_level_stmt_parent = @callable;
+
+// [index, parent] is not a keyset because the same parent may be compiled multiple times
+stmt_parent_top_level(
+ unique int stmt: @stmt ref,
+ int index: int ref,
+ int parent: @top_level_stmt_parent ref);
+
+case @stmt.kind of
+ 1 = @block_stmt
+| 2 = @expr_stmt
+| 3 = @if_stmt
+| 4 = @switch_stmt
+| 5 = @while_stmt
+| 6 = @do_stmt
+| 7 = @for_stmt
+| 8 = @foreach_stmt
+| 9 = @break_stmt
+| 10 = @continue_stmt
+| 11 = @goto_stmt
+| 12 = @goto_case_stmt
+| 13 = @goto_default_stmt
+| 14 = @throw_stmt
+| 15 = @return_stmt
+| 16 = @yield_stmt
+| 17 = @try_stmt
+| 18 = @checked_stmt
+| 19 = @unchecked_stmt
+| 20 = @lock_stmt
+| 21 = @using_block_stmt
+| 22 = @var_decl_stmt
+| 23 = @const_decl_stmt
+| 24 = @empty_stmt
+| 25 = @unsafe_stmt
+| 26 = @fixed_stmt
+| 27 = @label_stmt
+| 28 = @catch
+| 29 = @case_stmt
+| 30 = @local_function_stmt
+| 31 = @using_decl_stmt
+ ;
+
+@using_stmt = @using_block_stmt | @using_decl_stmt;
+
+@labeled_stmt = @label_stmt | @case;
+
+@decl_stmt = @var_decl_stmt | @const_decl_stmt | @using_decl_stmt;
+
+@cond_stmt = @if_stmt | @switch_stmt;
+
+@loop_stmt = @while_stmt | @do_stmt | @for_stmt | @foreach_stmt;
+
+@jump_stmt = @break_stmt | @goto_any_stmt | @continue_stmt | @throw_stmt | @return_stmt
+ | @yield_stmt;
+
+@goto_any_stmt = @goto_default_stmt | @goto_case_stmt | @goto_stmt;
+
+
+stmt_location(
+ unique int id: @stmt ref,
+ int loc: @location ref);
+
+catch_type(
+ unique int catch_id: @catch ref,
+ int type_id: @type_or_ref ref,
+ int kind: int ref /* explicit = 1, implicit = 2 */);
+
+foreach_stmt_info(
+ unique int id: @foreach_stmt ref,
+ int kind: int ref /* non-async = 1, async = 2 */);
+
+@foreach_symbol = @method | @property | @type_or_ref;
+
+#keyset[id, kind]
+foreach_stmt_desugar(
+ int id: @foreach_stmt ref,
+ int symbol: @foreach_symbol ref,
+ int kind: int ref /* GetEnumeratorMethod = 1, CurrentProperty = 2, MoveNextMethod = 3, DisposeMethod = 4, ElementType = 5 */);
+
+/** EXPRESSIONS **/
+
+expressions(
+ unique int id: @expr,
+ int kind: int ref,
+ int type_id: @type_or_ref ref);
+
+#keyset[index, parent]
+expr_parent(
+ unique int expr: @expr ref,
+ int index: int ref,
+ int parent: @control_flow_element ref);
+
+@top_level_expr_parent = @attribute | @field | @property | @indexer | @parameter | @directive_if | @directive_elif;
+
+@top_level_exprorstmt_parent = @top_level_expr_parent | @top_level_stmt_parent;
+
+// [index, parent] is not a keyset because the same parent may be compiled multiple times
+expr_parent_top_level(
+ unique int expr: @expr ref,
+ int index: int ref,
+ int parent: @top_level_exprorstmt_parent ref);
+
+case @expr.kind of
+/* literal */
+ 1 = @bool_literal_expr
+| 2 = @char_literal_expr
+| 3 = @decimal_literal_expr
+| 4 = @int_literal_expr
+| 5 = @long_literal_expr
+| 6 = @uint_literal_expr
+| 7 = @ulong_literal_expr
+| 8 = @float_literal_expr
+| 9 = @double_literal_expr
+| 10 = @string_literal_expr
+| 11 = @null_literal_expr
+/* primary & unary */
+| 12 = @this_access_expr
+| 13 = @base_access_expr
+| 14 = @local_variable_access_expr
+| 15 = @parameter_access_expr
+| 16 = @field_access_expr
+| 17 = @property_access_expr
+| 18 = @method_access_expr
+| 19 = @event_access_expr
+| 20 = @indexer_access_expr
+| 21 = @array_access_expr
+| 22 = @type_access_expr
+| 23 = @typeof_expr
+| 24 = @method_invocation_expr
+| 25 = @delegate_invocation_expr
+| 26 = @operator_invocation_expr
+| 27 = @cast_expr
+| 28 = @object_creation_expr
+| 29 = @explicit_delegate_creation_expr
+| 30 = @implicit_delegate_creation_expr
+| 31 = @array_creation_expr
+| 32 = @default_expr
+| 33 = @plus_expr
+| 34 = @minus_expr
+| 35 = @bit_not_expr
+| 36 = @log_not_expr
+| 37 = @post_incr_expr
+| 38 = @post_decr_expr
+| 39 = @pre_incr_expr
+| 40 = @pre_decr_expr
+/* multiplicative */
+| 41 = @mul_expr
+| 42 = @div_expr
+| 43 = @rem_expr
+/* additive */
+| 44 = @add_expr
+| 45 = @sub_expr
+/* shift */
+| 46 = @lshift_expr
+| 47 = @rshift_expr
+/* relational */
+| 48 = @lt_expr
+| 49 = @gt_expr
+| 50 = @le_expr
+| 51 = @ge_expr
+/* equality */
+| 52 = @eq_expr
+| 53 = @ne_expr
+/* logical */
+| 54 = @bit_and_expr
+| 55 = @bit_xor_expr
+| 56 = @bit_or_expr
+| 57 = @log_and_expr
+| 58 = @log_or_expr
+/* type testing */
+| 59 = @is_expr
+| 60 = @as_expr
+/* null coalescing */
+| 61 = @null_coalescing_expr
+/* conditional */
+| 62 = @conditional_expr
+/* assignment */
+| 63 = @simple_assign_expr
+| 64 = @assign_add_expr
+| 65 = @assign_sub_expr
+| 66 = @assign_mul_expr
+| 67 = @assign_div_expr
+| 68 = @assign_rem_expr
+| 69 = @assign_and_expr
+| 70 = @assign_xor_expr
+| 71 = @assign_or_expr
+| 72 = @assign_lshift_expr
+| 73 = @assign_rshift_expr
+/* more */
+| 74 = @object_init_expr
+| 75 = @collection_init_expr
+| 76 = @array_init_expr
+| 77 = @checked_expr
+| 78 = @unchecked_expr
+| 79 = @constructor_init_expr
+| 80 = @add_event_expr
+| 81 = @remove_event_expr
+| 82 = @par_expr
+| 83 = @local_var_decl_expr
+| 84 = @lambda_expr
+| 85 = @anonymous_method_expr
+| 86 = @namespace_expr
+/* dynamic */
+| 92 = @dynamic_element_access_expr
+| 93 = @dynamic_member_access_expr
+/* unsafe */
+| 100 = @pointer_indirection_expr
+| 101 = @address_of_expr
+| 102 = @sizeof_expr
+/* async */
+| 103 = @await_expr
+/* C# 6.0 */
+| 104 = @nameof_expr
+| 105 = @interpolated_string_expr
+| 106 = @unknown_expr
+/* C# 7.0 */
+| 107 = @throw_expr
+| 108 = @tuple_expr
+| 109 = @local_function_invocation_expr
+| 110 = @ref_expr
+| 111 = @discard_expr
+/* C# 8.0 */
+| 112 = @range_expr
+| 113 = @index_expr
+| 114 = @switch_expr
+| 115 = @recursive_pattern_expr
+| 116 = @property_pattern_expr
+| 117 = @positional_pattern_expr
+| 118 = @switch_case_expr
+| 119 = @assign_coalesce_expr
+| 120 = @suppress_nullable_warning_expr
+| 121 = @namespace_access_expr
+/* C# 9.0 */
+| 122 = @lt_pattern_expr
+| 123 = @gt_pattern_expr
+| 124 = @le_pattern_expr
+| 125 = @ge_pattern_expr
+| 126 = @not_pattern_expr
+| 127 = @and_pattern_expr
+| 128 = @or_pattern_expr
+| 129 = @function_pointer_invocation_expr
+| 130 = @with_expr
+/* Preprocessor */
+| 999 = @define_symbol_expr
+;
+
+@switch = @switch_stmt | @switch_expr;
+@case = @case_stmt | @switch_case_expr;
+@pattern_match = @case | @is_expr;
+@unary_pattern_expr = @not_pattern_expr;
+@relational_pattern_expr = @gt_pattern_expr | @lt_pattern_expr | @ge_pattern_expr | @le_pattern_expr;
+@binary_pattern_expr = @and_pattern_expr | @or_pattern_expr;
+
+@integer_literal_expr = @int_literal_expr | @long_literal_expr | @uint_literal_expr | @ulong_literal_expr;
+@real_literal_expr = @float_literal_expr | @double_literal_expr | @decimal_literal_expr;
+@literal_expr = @bool_literal_expr | @char_literal_expr | @integer_literal_expr | @real_literal_expr
+ | @string_literal_expr | @null_literal_expr;
+
+@assign_expr = @simple_assign_expr | @assign_op_expr | @local_var_decl_expr;
+@assign_op_expr = @assign_arith_expr | @assign_bitwise_expr | @assign_event_expr | @assign_coalesce_expr;
+@assign_event_expr = @add_event_expr | @remove_event_expr;
+
+@assign_arith_expr = @assign_add_expr | @assign_sub_expr | @assign_mul_expr | @assign_div_expr
+ | @assign_rem_expr
+@assign_bitwise_expr = @assign_and_expr | @assign_or_expr | @assign_xor_expr
+ | @assign_lshift_expr | @assign_rshift_expr;
+
+@member_access_expr = @field_access_expr | @property_access_expr | @indexer_access_expr | @event_access_expr
+ | @method_access_expr | @type_access_expr | @dynamic_member_access_expr;
+@access_expr = @member_access_expr | @this_access_expr | @base_access_expr | @assignable_access_expr | @namespace_access_expr;
+@element_access_expr = @indexer_access_expr | @array_access_expr | @dynamic_element_access_expr;
+
+@local_variable_access = @local_variable_access_expr | @local_var_decl_expr;
+@local_scope_variable_access_expr = @parameter_access_expr | @local_variable_access;
+@variable_access_expr = @local_scope_variable_access_expr | @field_access_expr;
+
+@assignable_access_expr = @variable_access_expr | @property_access_expr | @element_access_expr
+ | @event_access_expr | @dynamic_member_access_expr;
+
+@objectorcollection_init_expr = @object_init_expr | @collection_init_expr;
+
+@delegate_creation_expr = @explicit_delegate_creation_expr | @implicit_delegate_creation_expr;
+
+@bin_arith_op_expr = @mul_expr | @div_expr | @rem_expr | @add_expr | @sub_expr;
+@incr_op_expr = @pre_incr_expr | @post_incr_expr;
+@decr_op_expr = @pre_decr_expr | @post_decr_expr;
+@mut_op_expr = @incr_op_expr | @decr_op_expr;
+@un_arith_op_expr = @plus_expr | @minus_expr | @mut_op_expr;
+@arith_op_expr = @bin_arith_op_expr | @un_arith_op_expr;
+
+@ternary_log_op_expr = @conditional_expr;
+@bin_log_op_expr = @log_and_expr | @log_or_expr | @null_coalescing_expr;
+@un_log_op_expr = @log_not_expr;
+@log_expr = @un_log_op_expr | @bin_log_op_expr | @ternary_log_op_expr;
+
+@bin_bit_op_expr = @bit_and_expr | @bit_or_expr | @bit_xor_expr | @lshift_expr
+ | @rshift_expr;
+@un_bit_op_expr = @bit_not_expr;
+@bit_expr = @un_bit_op_expr | @bin_bit_op_expr;
+
+@equality_op_expr = @eq_expr | @ne_expr;
+@rel_op_expr = @gt_expr | @lt_expr| @ge_expr | @le_expr;
+@comp_expr = @equality_op_expr | @rel_op_expr;
+
+@op_expr = @assign_expr | @un_op | @bin_op | @ternary_op;
+
+@ternary_op = @ternary_log_op_expr;
+@bin_op = @bin_arith_op_expr | @bin_log_op_expr | @bin_bit_op_expr | @comp_expr;
+@un_op = @un_arith_op_expr | @un_log_op_expr | @un_bit_op_expr | @sizeof_expr
+ | @pointer_indirection_expr | @address_of_expr;
+
+@anonymous_function_expr = @lambda_expr | @anonymous_method_expr;
+
+@call = @method_invocation_expr | @constructor_init_expr | @operator_invocation_expr
+ | @delegate_invocation_expr | @object_creation_expr | @call_access_expr
+ | @local_function_invocation_expr | @function_pointer_invocation_expr;
+
+@call_access_expr = @property_access_expr | @event_access_expr | @indexer_access_expr;
+
+@late_bindable_expr = @dynamic_element_access_expr | @dynamic_member_access_expr
+ | @object_creation_expr | @method_invocation_expr | @operator_invocation_expr;
+
+@throw_element = @throw_expr | @throw_stmt;
+
+@implicitly_typeable_object_creation_expr = @object_creation_expr | @explicit_delegate_creation_expr;
+
+implicitly_typed_array_creation(
+ unique int id: @array_creation_expr ref);
+
+explicitly_sized_array_creation(
+ unique int id: @array_creation_expr ref);
+
+stackalloc_array_creation(
+ unique int id: @array_creation_expr ref);
+
+implicitly_typed_object_creation(
+ unique int id: @implicitly_typeable_object_creation_expr ref);
+
+mutator_invocation_mode(
+ unique int id: @operator_invocation_expr ref,
+ int mode: int ref /* prefix = 1, postfix = 2*/);
+
+expr_compiler_generated(
+ unique int id: @expr ref);
+
+expr_value(
+ unique int id: @expr ref,
+ string value: string ref);
+
+expr_call(
+ unique int caller_id: @expr ref,
+ int target_id: @callable ref);
+
+expr_access(
+ unique int accesser_id: @access_expr ref,
+ int target_id: @accessible ref);
+
+@accessible = @method | @assignable | @local_function | @namespace;
+
+expr_location(
+ unique int id: @expr ref,
+ int loc: @location ref);
+
+dynamic_member_name(
+ unique int id: @late_bindable_expr ref,
+ string name: string ref);
+
+@qualifiable_expr = @member_access_expr
+ | @method_invocation_expr
+ | @element_access_expr;
+
+conditional_access(
+ unique int id: @qualifiable_expr ref);
+
+expr_argument(
+ unique int id: @expr ref,
+ int mode: int ref);
+ /* mode is the same as params: value = 0, ref = 1, out = 2 */
+
+expr_argument_name(
+ unique int id: @expr ref,
+ string name: string ref);
+
+/** CONTROL/DATA FLOW **/
+
+@control_flow_element = @stmt | @expr;
+
+/* XML Files */
+
+xmlEncoding (
+ unique int id: @file ref,
+ string encoding: string ref);
+
+xmlDTDs(
+ unique int id: @xmldtd,
+ string root: string ref,
+ string publicId: string ref,
+ string systemId: string ref,
+ int fileid: @file ref);
+
+xmlElements(
+ unique int id: @xmlelement,
+ string name: string ref,
+ int parentid: @xmlparent ref,
+ int idx: int ref,
+ int fileid: @file ref);
+
+xmlAttrs(
+ unique int id: @xmlattribute,
+ int elementid: @xmlelement ref,
+ string name: string ref,
+ string value: string ref,
+ int idx: int ref,
+ int fileid: @file ref);
+
+xmlNs(
+ int id: @xmlnamespace,
+ string prefixName: string ref,
+ string URI: string ref,
+ int fileid: @file ref);
+
+xmlHasNs(
+ int elementId: @xmlnamespaceable ref,
+ int nsId: @xmlnamespace ref,
+ int fileid: @file ref);
+
+xmlComments(
+ unique int id: @xmlcomment,
+ string text: string ref,
+ int parentid: @xmlparent ref,
+ int fileid: @file ref);
+
+xmlChars(
+ unique int id: @xmlcharacters,
+ string text: string ref,
+ int parentid: @xmlparent ref,
+ int idx: int ref,
+ int isCDATA: int ref,
+ int fileid: @file ref);
+
+@xmlparent = @file | @xmlelement;
+@xmlnamespaceable = @xmlelement | @xmlattribute;
+
+xmllocations(
+ int xmlElement: @xmllocatable ref,
+ int location: @location_default ref);
+
+@xmllocatable = @xmlcharacters | @xmlelement | @xmlcomment | @xmlattribute | @xmldtd | @file | @xmlnamespace;
+
+/* Comments */
+
+commentline(
+ unique int id: @commentline,
+ int kind: int ref,
+ string text: string ref,
+ string rawtext: string ref);
+
+case @commentline.kind of
+ 0 = @singlelinecomment
+| 1 = @xmldoccomment
+| 2 = @multilinecomment;
+
+commentline_location(
+ unique int id: @commentline ref,
+ int loc: @location ref);
+
+commentblock(
+ unique int id : @commentblock);
+
+commentblock_location(
+ unique int id: @commentblock ref,
+ int loc: @location ref);
+
+commentblock_binding(
+ int id: @commentblock ref,
+ int entity: @element ref,
+ int bindtype: int ref); /* 0: Parent, 1: Best, 2: Before, 3: After */
+
+commentblock_child(
+ int id: @commentblock ref,
+ int commentline: @commentline ref,
+ int index: int ref);
+
+/* ASP.NET */
+
+case @asp_element.kind of
+ 0=@asp_close_tag
+| 1=@asp_code
+| 2=@asp_comment
+| 3=@asp_data_binding
+| 4=@asp_directive
+| 5=@asp_open_tag
+| 6=@asp_quoted_string
+| 7=@asp_text
+| 8=@asp_xml_directive;
+
+@asp_attribute = @asp_code | @asp_data_binding | @asp_quoted_string;
+
+asp_elements(
+ unique int id: @asp_element,
+ int kind: int ref,
+ int loc: @location ref);
+
+asp_comment_server(unique int comment: @asp_comment ref);
+asp_code_inline(unique int code: @asp_code ref);
+asp_directive_attribute(
+ int directive: @asp_directive ref,
+ int index: int ref,
+ string name: string ref,
+ int value: @asp_quoted_string ref);
+asp_directive_name(
+ unique int directive: @asp_directive ref,
+ string name: string ref);
+asp_element_body(
+ unique int element: @asp_element ref,
+ string body: string ref);
+asp_tag_attribute(
+ int tag: @asp_open_tag ref,
+ int index: int ref,
+ string name: string ref,
+ int attribute: @asp_attribute ref);
+asp_tag_name(
+ unique int tag: @asp_open_tag ref,
+ string name: string ref);
+asp_tag_isempty(int tag: @asp_open_tag ref);
+
+/* Common Intermediate Language - CIL */
+
+case @cil_instruction.opcode of
+ 0 = @cil_nop
+| 1 = @cil_break
+| 2 = @cil_ldarg_0
+| 3 = @cil_ldarg_1
+| 4 = @cil_ldarg_2
+| 5 = @cil_ldarg_3
+| 6 = @cil_ldloc_0
+| 7 = @cil_ldloc_1
+| 8 = @cil_ldloc_2
+| 9 = @cil_ldloc_3
+| 10 = @cil_stloc_0
+| 11 = @cil_stloc_1
+| 12 = @cil_stloc_2
+| 13 = @cil_stloc_3
+| 14 = @cil_ldarg_s
+| 15 = @cil_ldarga_s
+| 16 = @cil_starg_s
+| 17 = @cil_ldloc_s
+| 18 = @cil_ldloca_s
+| 19 = @cil_stloc_s
+| 20 = @cil_ldnull
+| 21 = @cil_ldc_i4_m1
+| 22 = @cil_ldc_i4_0
+| 23 = @cil_ldc_i4_1
+| 24 = @cil_ldc_i4_2
+| 25 = @cil_ldc_i4_3
+| 26 = @cil_ldc_i4_4
+| 27 = @cil_ldc_i4_5
+| 28 = @cil_ldc_i4_6
+| 29 = @cil_ldc_i4_7
+| 30 = @cil_ldc_i4_8
+| 31 = @cil_ldc_i4_s
+| 32 = @cil_ldc_i4
+| 33 = @cil_ldc_i8
+| 34 = @cil_ldc_r4
+| 35 = @cil_ldc_r8
+| 37 = @cil_dup
+| 38 = @cil_pop
+| 39 = @cil_jmp
+| 40 = @cil_call
+| 41 = @cil_calli
+| 42 = @cil_ret
+| 43 = @cil_br_s
+| 44 = @cil_brfalse_s
+| 45 = @cil_brtrue_s
+| 46 = @cil_beq_s
+| 47 = @cil_bge_s
+| 48 = @cil_bgt_s
+| 49 = @cil_ble_s
+| 50 = @cil_blt_s
+| 51 = @cil_bne_un_s
+| 52 = @cil_bge_un_s
+| 53 = @cil_bgt_un_s
+| 54 = @cil_ble_un_s
+| 55 = @cil_blt_un_s
+| 56 = @cil_br
+| 57 = @cil_brfalse
+| 58 = @cil_brtrue
+| 59 = @cil_beq
+| 60 = @cil_bge
+| 61 = @cil_bgt
+| 62 = @cil_ble
+| 63 = @cil_blt
+| 64 = @cil_bne_un
+| 65 = @cil_bge_un
+| 66 = @cil_bgt_un
+| 67 = @cil_ble_un
+| 68 = @cil_blt_un
+| 69 = @cil_switch
+| 70 = @cil_ldind_i1
+| 71 = @cil_ldind_u1
+| 72 = @cil_ldind_i2
+| 73 = @cil_ldind_u2
+| 74 = @cil_ldind_i4
+| 75 = @cil_ldind_u4
+| 76 = @cil_ldind_i8
+| 77 = @cil_ldind_i
+| 78 = @cil_ldind_r4
+| 79 = @cil_ldind_r8
+| 80 = @cil_ldind_ref
+| 81 = @cil_stind_ref
+| 82 = @cil_stind_i1
+| 83 = @cil_stind_i2
+| 84 = @cil_stind_i4
+| 85 = @cil_stind_i8
+| 86 = @cil_stind_r4
+| 87 = @cil_stind_r8
+| 88 = @cil_add
+| 89 = @cil_sub
+| 90 = @cil_mul
+| 91 = @cil_div
+| 92 = @cil_div_un
+| 93 = @cil_rem
+| 94 = @cil_rem_un
+| 95 = @cil_and
+| 96 = @cil_or
+| 97 = @cil_xor
+| 98 = @cil_shl
+| 99 = @cil_shr
+| 100 = @cil_shr_un
+| 101 = @cil_neg
+| 102 = @cil_not
+| 103 = @cil_conv_i1
+| 104 = @cil_conv_i2
+| 105 = @cil_conv_i4
+| 106 = @cil_conv_i8
+| 107 = @cil_conv_r4
+| 108 = @cil_conv_r8
+| 109 = @cil_conv_u4
+| 110 = @cil_conv_u8
+| 111 = @cil_callvirt
+| 112 = @cil_cpobj
+| 113 = @cil_ldobj
+| 114 = @cil_ldstr
+| 115 = @cil_newobj
+| 116 = @cil_castclass
+| 117 = @cil_isinst
+| 118 = @cil_conv_r_un
+| 121 = @cil_unbox
+| 122 = @cil_throw
+| 123 = @cil_ldfld
+| 124 = @cil_ldflda
+| 125 = @cil_stfld
+| 126 = @cil_ldsfld
+| 127 = @cil_ldsflda
+| 128 = @cil_stsfld
+| 129 = @cil_stobj
+| 130 = @cil_conv_ovf_i1_un
+| 131 = @cil_conv_ovf_i2_un
+| 132 = @cil_conv_ovf_i4_un
+| 133 = @cil_conv_ovf_i8_un
+| 134 = @cil_conv_ovf_u1_un
+| 135 = @cil_conv_ovf_u2_un
+| 136 = @cil_conv_ovf_u4_un
+| 137 = @cil_conv_ovf_u8_un
+| 138 = @cil_conv_ovf_i_un
+| 139 = @cil_conv_ovf_u_un
+| 140 = @cil_box
+| 141 = @cil_newarr
+| 142 = @cil_ldlen
+| 143 = @cil_ldelema
+| 144 = @cil_ldelem_i1
+| 145 = @cil_ldelem_u1
+| 146 = @cil_ldelem_i2
+| 147 = @cil_ldelem_u2
+| 148 = @cil_ldelem_i4
+| 149 = @cil_ldelem_u4
+| 150 = @cil_ldelem_i8
+| 151 = @cil_ldelem_i
+| 152 = @cil_ldelem_r4
+| 153 = @cil_ldelem_r8
+| 154 = @cil_ldelem_ref
+| 155 = @cil_stelem_i
+| 156 = @cil_stelem_i1
+| 157 = @cil_stelem_i2
+| 158 = @cil_stelem_i4
+| 159 = @cil_stelem_i8
+| 160 = @cil_stelem_r4
+| 161 = @cil_stelem_r8
+| 162 = @cil_stelem_ref
+| 163 = @cil_ldelem
+| 164 = @cil_stelem
+| 165 = @cil_unbox_any
+| 179 = @cil_conv_ovf_i1
+| 180 = @cil_conv_ovf_u1
+| 181 = @cil_conv_ovf_i2
+| 182 = @cil_conv_ovf_u2
+| 183 = @cil_conv_ovf_i4
+| 184 = @cil_conv_ovf_u4
+| 185 = @cil_conv_ovf_i8
+| 186 = @cil_conv_ovf_u8
+| 194 = @cil_refanyval
+| 195 = @cil_ckinfinite
+| 198 = @cil_mkrefany
+| 208 = @cil_ldtoken
+| 209 = @cil_conv_u2
+| 210 = @cil_conv_u1
+| 211 = @cil_conv_i
+| 212 = @cil_conv_ovf_i
+| 213 = @cil_conv_ovf_u
+| 214 = @cil_add_ovf
+| 215 = @cil_add_ovf_un
+| 216 = @cil_mul_ovf
+| 217 = @cil_mul_ovf_un
+| 218 = @cil_sub_ovf
+| 219 = @cil_sub_ovf_un
+| 220 = @cil_endfinally
+| 221 = @cil_leave
+| 222 = @cil_leave_s
+| 223 = @cil_stind_i
+| 224 = @cil_conv_u
+| 65024 = @cil_arglist
+| 65025 = @cil_ceq
+| 65026 = @cil_cgt
+| 65027 = @cil_cgt_un
+| 65028 = @cil_clt
+| 65029 = @cil_clt_un
+| 65030 = @cil_ldftn
+| 65031 = @cil_ldvirtftn
+| 65033 = @cil_ldarg
+| 65034 = @cil_ldarga
+| 65035 = @cil_starg
+| 65036 = @cil_ldloc
+| 65037 = @cil_ldloca
+| 65038 = @cil_stloc
+| 65039 = @cil_localloc
+| 65041 = @cil_endfilter
+| 65042 = @cil_unaligned
+| 65043 = @cil_volatile
+| 65044 = @cil_tail
+| 65045 = @cil_initobj
+| 65046 = @cil_constrained
+| 65047 = @cil_cpblk
+| 65048 = @cil_initblk
+| 65050 = @cil_rethrow
+| 65052 = @cil_sizeof
+| 65053 = @cil_refanytype
+| 65054 = @cil_readonly
+;
+
+// CIL ignored instructions
+
+@cil_ignore = @cil_nop | @cil_break | @cil_volatile | @cil_unaligned;
+
+// CIL local/parameter/field access
+
+@cil_ldarg_any = @cil_ldarg_0 | @cil_ldarg_1 | @cil_ldarg_2 | @cil_ldarg_3 | @cil_ldarg_s | @cil_ldarga_s | @cil_ldarg | @cil_ldarga;
+@cil_starg_any = @cil_starg | @cil_starg_s;
+
+@cil_ldloc_any = @cil_ldloc_0 | @cil_ldloc_1 | @cil_ldloc_2 | @cil_ldloc_3 | @cil_ldloc_s | @cil_ldloca_s | @cil_ldloc | @cil_ldloca;
+@cil_stloc_any = @cil_stloc_0 | @cil_stloc_1 | @cil_stloc_2 | @cil_stloc_3 | @cil_stloc_s | @cil_stloc;
+
+@cil_ldfld_any = @cil_ldfld | @cil_ldsfld | @cil_ldsflda | @cil_ldflda;
+@cil_stfld_any = @cil_stfld | @cil_stsfld;
+
+@cil_local_access = @cil_stloc_any | @cil_ldloc_any;
+@cil_arg_access = @cil_starg_any | @cil_ldarg_any;
+@cil_read_access = @cil_ldloc_any | @cil_ldarg_any | @cil_ldfld_any;
+@cil_write_access = @cil_stloc_any | @cil_starg_any | @cil_stfld_any;
+
+@cil_stack_access = @cil_local_access | @cil_arg_access;
+@cil_field_access = @cil_ldfld_any | @cil_stfld_any;
+
+@cil_access = @cil_read_access | @cil_write_access;
+
+// CIL constant/literal instructions
+
+@cil_ldc_i = @cil_ldc_i4_any | @cil_ldc_i8;
+
+@cil_ldc_i4_any = @cil_ldc_i4_m1 | @cil_ldc_i4_0 | @cil_ldc_i4_1 | @cil_ldc_i4_2 | @cil_ldc_i4_3 |
+ @cil_ldc_i4_4 | @cil_ldc_i4_5 | @cil_ldc_i4_6 | @cil_ldc_i4_7 | @cil_ldc_i4_8 | @cil_ldc_i4_s | @cil_ldc_i4;
+
+@cil_ldc_r = @cil_ldc_r4 | @cil_ldc_r8;
+
+@cil_literal = @cil_ldnull | @cil_ldc_i | @cil_ldc_r | @cil_ldstr;
+
+// Control flow
+
+@cil_conditional_jump = @cil_binary_jump | @cil_unary_jump;
+@cil_binary_jump = @cil_beq_s | @cil_bge_s | @cil_bgt_s | @cil_ble_s | @cil_blt_s |
+ @cil_bne_un_s | @cil_bge_un_s | @cil_bgt_un_s | @cil_ble_un_s | @cil_blt_un_s |
+ @cil_beq | @cil_bge | @cil_bgt | @cil_ble | @cil_blt |
+ @cil_bne_un | @cil_bge_un | @cil_bgt_un | @cil_ble_un | @cil_blt_un;
+@cil_unary_jump = @cil_brfalse_s | @cil_brtrue_s | @cil_brfalse | @cil_brtrue | @cil_switch;
+@cil_unconditional_jump = @cil_br | @cil_br_s | @cil_leave_any;
+@cil_leave_any = @cil_leave | @cil_leave_s;
+@cil_jump = @cil_unconditional_jump | @cil_conditional_jump;
+
+// CIL call instructions
+
+@cil_call_any = @cil_jmp | @cil_call | @cil_calli | @cil_tail | @cil_callvirt | @cil_newobj;
+
+// CIL expression instructions
+
+@cil_expr = @cil_literal | @cil_binary_expr | @cil_unary_expr | @cil_call_any | @cil_read_access |
+ @cil_newarr | @cil_ldtoken | @cil_sizeof |
+ @cil_ldftn | @cil_ldvirtftn | @cil_localloc | @cil_mkrefany | @cil_refanytype | @cil_arglist | @cil_dup;
+
+@cil_unary_expr =
+ @cil_conversion_operation | @cil_unary_arithmetic_operation | @cil_unary_bitwise_operation|
+ @cil_ldlen | @cil_isinst | @cil_box | @cil_ldobj | @cil_castclass | @cil_unbox_any |
+ @cil_ldind | @cil_unbox;
+
+@cil_conversion_operation =
+ @cil_conv_i1 | @cil_conv_i2 | @cil_conv_i4 | @cil_conv_i8 |
+ @cil_conv_u1 | @cil_conv_u2 | @cil_conv_u4 | @cil_conv_u8 |
+ @cil_conv_ovf_i | @cil_conv_ovf_i_un | @cil_conv_ovf_i1 | @cil_conv_ovf_i1_un |
+ @cil_conv_ovf_i2 | @cil_conv_ovf_i2_un | @cil_conv_ovf_i4 | @cil_conv_ovf_i4_un |
+ @cil_conv_ovf_i8 | @cil_conv_ovf_i8_un | @cil_conv_ovf_u | @cil_conv_ovf_u_un |
+ @cil_conv_ovf_u1 | @cil_conv_ovf_u1_un | @cil_conv_ovf_u2 | @cil_conv_ovf_u2_un |
+ @cil_conv_ovf_u4 | @cil_conv_ovf_u4_un | @cil_conv_ovf_u8 | @cil_conv_ovf_u8_un |
+ @cil_conv_r4 | @cil_conv_r8 | @cil_conv_ovf_u2 | @cil_conv_ovf_u2_un |
+ @cil_conv_i | @cil_conv_u | @cil_conv_r_un;
+
+@cil_ldind = @cil_ldind_i | @cil_ldind_i1 | @cil_ldind_i2 | @cil_ldind_i4 | @cil_ldind_i8 |
+ @cil_ldind_r4 | @cil_ldind_r8 | @cil_ldind_ref | @cil_ldind_u1 | @cil_ldind_u2 | @cil_ldind_u4;
+
+@cil_stind = @cil_stind_i | @cil_stind_i1 | @cil_stind_i2 | @cil_stind_i4 | @cil_stind_i8 |
+ @cil_stind_r4 | @cil_stind_r8 | @cil_stind_ref;
+
+@cil_bitwise_operation = @cil_binary_bitwise_operation | @cil_unary_bitwise_operation;
+
+@cil_binary_bitwise_operation = @cil_and | @cil_or | @cil_xor | @cil_shr | @cil_shr | @cil_shr_un | @cil_shl;
+
+@cil_binary_arithmetic_operation = @cil_add | @cil_sub | @cil_mul | @cil_div | @cil_div_un |
+ @cil_rem | @cil_rem_un | @cil_add_ovf | @cil_add_ovf_un | @cil_mul_ovf | @cil_mul_ovf_un |
+ @cil_sub_ovf | @cil_sub_ovf_un;
+
+@cil_unary_bitwise_operation = @cil_not;
+
+@cil_binary_expr = @cil_binary_arithmetic_operation | @cil_binary_bitwise_operation | @cil_read_array | @cil_comparison_operation;
+
+@cil_unary_arithmetic_operation = @cil_neg;
+
+@cil_comparison_operation = @cil_cgt_un | @cil_ceq | @cil_cgt | @cil_clt | @cil_clt_un;
+
+// Elements that retrieve an address of something
+@cil_read_ref = @cil_ldloca_s | @cil_ldarga_s | @cil_ldflda | @cil_ldsflda | @cil_ldelema;
+
+// CIL array instructions
+
+@cil_read_array =
+ @cil_ldelem | @cil_ldelema | @cil_ldelem_i1 | @cil_ldelem_ref | @cil_ldelem_i |
+ @cil_ldelem_i1 | @cil_ldelem_i2 | @cil_ldelem_i4 | @cil_ldelem_i8 | @cil_ldelem_r4 |
+ @cil_ldelem_r8 | @cil_ldelem_u1 | @cil_ldelem_u2 | @cil_ldelem_u4;
+
+@cil_write_array = @cil_stelem | @cil_stelem_ref |
+ @cil_stelem_i | @cil_stelem_i1 | @cil_stelem_i2 | @cil_stelem_i4 | @cil_stelem_i8 |
+ @cil_stelem_r4 | @cil_stelem_r8;
+
+@cil_throw_any = @cil_throw | @cil_rethrow;
+
+#keyset[impl, index]
+cil_instruction(
+ unique int id: @cil_instruction,
+ int opcode: int ref,
+ int index: int ref,
+ int impl: @cil_method_implementation ref);
+
+cil_jump(
+ unique int instruction: @cil_jump ref,
+ int target: @cil_instruction ref);
+
+cil_access(
+ unique int instruction: @cil_instruction ref,
+ int target: @cil_accessible ref);
+
+cil_value(
+ unique int instruction: @cil_literal ref,
+ string value: string ref);
+
+#keyset[instruction, index]
+cil_switch(
+ int instruction: @cil_switch ref,
+ int index: int ref,
+ int target: @cil_instruction ref);
+
+cil_instruction_location(
+ unique int id: @cil_instruction ref,
+ int loc: @location ref);
+
+cil_type_location(
+ int id: @cil_type ref,
+ int loc: @location ref);
+
+cil_method_location(
+ int id: @cil_method ref,
+ int loc: @location ref);
+
+@cil_namespace = @namespace;
+
+@cil_type_container = @cil_type | @cil_namespace | @cil_method;
+
+case @cil_type.kind of
+ 0 = @cil_valueorreftype
+| 1 = @cil_typeparameter
+| 2 = @cil_array_type
+| 3 = @cil_pointer_type
+| 4 = @cil_function_pointer_type
+;
+
+cil_type(
+ unique int id: @cil_type,
+ string name: string ref,
+ int kind: int ref,
+ int parent: @cil_type_container ref,
+ int sourceDecl: @cil_type ref);
+
+cil_pointer_type(
+ unique int id: @cil_pointer_type ref,
+ int pointee: @cil_type ref);
+
+cil_array_type(
+ unique int id: @cil_array_type ref,
+ int element_type: @cil_type ref,
+ int rank: int ref);
+
+cil_function_pointer_return_type(
+ unique int id: @cil_function_pointer_type ref,
+ int return_type: @cil_type ref);
+
+cil_method(
+ unique int id: @cil_method,
+ string name: string ref,
+ int parent: @cil_type ref,
+ int return_type: @cil_type ref);
+
+cil_method_source_declaration(
+ unique int method: @cil_method ref,
+ int source: @cil_method ref);
+
+cil_method_implementation(
+ unique int id: @cil_method_implementation,
+ int method: @cil_method ref,
+ int location: @assembly ref);
+
+cil_implements(
+ int id: @cil_method ref,
+ int decl: @cil_method ref);
+
+#keyset[parent, name]
+cil_field(
+ unique int id: @cil_field,
+ int parent: @cil_type ref,
+ string name: string ref,
+ int field_type: @cil_type ref);
+
+@cil_element = @cil_instruction | @cil_declaration | @cil_handler | @cil_attribute | @cil_namespace;
+@cil_named_element = @cil_declaration | @cil_namespace;
+@cil_declaration = @cil_variable | @cil_method | @cil_type | @cil_member;
+@cil_accessible = @cil_declaration;
+@cil_variable = @cil_field | @cil_stack_variable;
+@cil_stack_variable = @cil_local_variable | @cil_parameter;
+@cil_member = @cil_method | @cil_type | @cil_field | @cil_property | @cil_event;
+@cil_custom_modifier_receiver = @cil_method | @cil_property | @cil_parameter | @cil_field | @cil_function_pointer_type;
+@cil_parameterizable = @cil_method | @cil_function_pointer_type;
+@cil_has_type_annotation = @cil_stack_variable | @cil_property | @cil_method | @cil_function_pointer_type;
+
+#keyset[parameterizable, index]
+cil_parameter(
+ unique int id: @cil_parameter,
+ int parameterizable: @cil_parameterizable ref,
+ int index: int ref,
+ int param_type: @cil_type ref);
+
+cil_parameter_in(unique int id: @cil_parameter ref);
+cil_parameter_out(unique int id: @cil_parameter ref);
+
+cil_setter(unique int prop: @cil_property ref,
+ int method: @cil_method ref);
+
+#keyset[id, modifier]
+cil_custom_modifiers(
+ int id: @cil_custom_modifier_receiver ref,
+ int modifier: @cil_type ref,
+ int kind: int ref); // modreq: 1, modopt: 0
+
+cil_type_annotation(
+ int id: @cil_has_type_annotation ref,
+ int annotation: int ref);
+
+cil_getter(unique int prop: @cil_property ref,
+ int method: @cil_method ref);
+
+cil_adder(unique int event: @cil_event ref,
+ int method: @cil_method ref);
+
+cil_remover(unique int event: @cil_event ref, int method: @cil_method ref);
+
+cil_raiser(unique int event: @cil_event ref, int method: @cil_method ref);
+
+cil_property(
+ unique int id: @cil_property,
+ int parent: @cil_type ref,
+ string name: string ref,
+ int property_type: @cil_type ref);
+
+#keyset[parent, name]
+cil_event(unique int id: @cil_event,
+ int parent: @cil_type ref,
+ string name: string ref,
+ int event_type: @cil_type ref);
+
+#keyset[impl, index]
+cil_local_variable(
+ unique int id: @cil_local_variable,
+ int impl: @cil_method_implementation ref,
+ int index: int ref,
+ int var_type: @cil_type ref);
+
+cil_function_pointer_calling_conventions(
+ int id: @cil_function_pointer_type ref,
+ int kind: int ref);
+
+// CIL handlers (exception handlers etc).
+
+case @cil_handler.kind of
+ 0 = @cil_catch_handler
+| 1 = @cil_filter_handler
+| 2 = @cil_finally_handler
+| 4 = @cil_fault_handler
+;
+
+#keyset[impl, index]
+cil_handler(
+ unique int id: @cil_handler,
+ int impl: @cil_method_implementation ref,
+ int index: int ref,
+ int kind: int ref,
+ int try_start: @cil_instruction ref,
+ int try_end: @cil_instruction ref,
+ int handler_start: @cil_instruction ref);
+
+cil_handler_filter(
+ unique int id: @cil_handler ref,
+ int filter_start: @cil_instruction ref);
+
+cil_handler_type(
+ unique int id: @cil_handler ref,
+ int catch_type: @cil_type ref);
+
+@cil_controlflow_node = @cil_entry_point | @cil_instruction;
+
+@cil_entry_point = @cil_method_implementation | @cil_handler;
+
+@cil_dataflow_node = @cil_instruction | @cil_variable | @cil_method;
+
+cil_method_stack_size(
+ unique int method: @cil_method_implementation ref,
+ int size: int ref);
+
+// CIL modifiers
+
+cil_public(int id: @cil_member ref);
+cil_private(int id: @cil_member ref);
+cil_protected(int id: @cil_member ref);
+cil_internal(int id: @cil_member ref);
+cil_static(int id: @cil_member ref);
+cil_sealed(int id: @cil_member ref);
+cil_virtual(int id: @cil_method ref);
+cil_abstract(int id: @cil_member ref);
+cil_class(int id: @cil_type ref);
+cil_interface(int id: @cil_type ref);
+cil_security(int id: @cil_member ref);
+cil_requiresecobject(int id: @cil_method ref);
+cil_specialname(int id: @cil_method ref);
+cil_newslot(int id: @cil_method ref);
+
+cil_base_class(unique int id: @cil_type ref, int base: @cil_type ref);
+cil_base_interface(int id: @cil_type ref, int base: @cil_type ref);
+cil_enum_underlying_type(unique int id: @cil_type ref, int underlying: @cil_type ref);
+
+#keyset[unbound, index]
+cil_type_parameter(
+ int unbound: @cil_member ref,
+ int index: int ref,
+ int param: @cil_typeparameter ref);
+
+#keyset[bound, index]
+cil_type_argument(
+ int bound: @cil_member ref,
+ int index: int ref,
+ int t: @cil_type ref);
+
+// CIL type parameter constraints
+
+cil_typeparam_covariant(int tp: @cil_typeparameter ref);
+cil_typeparam_contravariant(int tp: @cil_typeparameter ref);
+cil_typeparam_class(int tp: @cil_typeparameter ref);
+cil_typeparam_struct(int tp: @cil_typeparameter ref);
+cil_typeparam_new(int tp: @cil_typeparameter ref);
+cil_typeparam_constraint(int tp: @cil_typeparameter ref, int supertype: @cil_type ref);
+
+// CIL attributes
+
+cil_attribute(
+ unique int attributeid: @cil_attribute,
+ int element: @cil_declaration ref,
+ int constructor: @cil_method ref);
+
+#keyset[attribute_id, param]
+cil_attribute_named_argument(
+ int attribute_id: @cil_attribute ref,
+ string param: string ref,
+ string value: string ref);
+
+#keyset[attribute_id, index]
+cil_attribute_positional_argument(
+ int attribute_id: @cil_attribute ref,
+ int index: int ref,
+ string value: string ref);
+
+
+// Common .Net data model covering both C# and CIL
+
+// Common elements
+@dotnet_element = @element | @cil_element;
+@dotnet_named_element = @named_element | @cil_named_element;
+@dotnet_callable = @callable | @cil_method;
+@dotnet_variable = @variable | @cil_variable;
+@dotnet_field = @field | @cil_field;
+@dotnet_parameter = @parameter | @cil_parameter;
+@dotnet_declaration = @declaration | @cil_declaration;
+@dotnet_member = @member | @cil_member;
+@dotnet_event = @event | @cil_event;
+@dotnet_property = @property | @cil_property | @indexer;
+@dotnet_parameterizable = @parameterizable | @cil_parameterizable;
+
+// Common types
+@dotnet_type = @type | @cil_type;
+@dotnet_call = @call | @cil_call_any;
+@dotnet_throw = @throw_element | @cil_throw_any;
+@dotnet_valueorreftype = @cil_valueorreftype | @value_or_ref_type | @cil_array_type | @void_type;
+@dotnet_typeparameter = @type_parameter | @cil_typeparameter;
+@dotnet_array_type = @array_type | @cil_array_type;
+@dotnet_pointer_type = @pointer_type | @cil_pointer_type;
+@dotnet_type_parameter = @type_parameter | @cil_typeparameter;
+@dotnet_generic = @dotnet_valueorreftype | @dotnet_callable;
+
+// Attributes
+@dotnet_attribute = @attribute | @cil_attribute;
+
+// Expressions
+@dotnet_expr = @expr | @cil_expr;
+
+// Literals
+@dotnet_literal = @literal_expr | @cil_literal;
+@dotnet_string_literal = @string_literal_expr | @cil_ldstr;
+@dotnet_int_literal = @integer_literal_expr | @cil_ldc_i;
+@dotnet_float_literal = @float_literal_expr | @cil_ldc_r;
+@dotnet_null_literal = @null_literal_expr | @cil_ldnull;
+
+@metadata_entity = @cil_method | @cil_type | @cil_field | @cil_property | @field | @property |
+ @callable | @value_or_ref_type | @void_type;
+
+#keyset[entity, location]
+metadata_handle(int entity : @metadata_entity ref, int location: @assembly ref, int handle: int ref)
diff --git a/csharp/upgrades/770f844243d5a2282861b33fd201d0a02e3528d9/types.ql b/csharp/upgrades/770f844243d5a2282861b33fd201d0a02e3528d9/types.ql
new file mode 100644
index 00000000000..151a7ad5907
--- /dev/null
+++ b/csharp/upgrades/770f844243d5a2282861b33fd201d0a02e3528d9/types.ql
@@ -0,0 +1,27 @@
+class Type extends @type {
+ string toString() { none() }
+
+ string getNewName() {
+ not this instanceof Generic and
+ types(this, _, result)
+ or
+ result = this.(Generic).getUndecoratedName()
+ }
+}
+
+class Generic extends Type {
+ Generic() {
+ type_parameters(_, _, this, _) or
+ type_arguments(_, _, this)
+ }
+
+ string getUndecoratedName() {
+ exists(string oldName |
+ types(this, _, oldName) and result = oldName.prefix(min(int i | i = oldName.indexOf("<")))
+ )
+ }
+}
+
+from Type type, int kind
+where types(type, kind, _)
+select type, kind, type.getNewName()
diff --git a/csharp/upgrades/770f844243d5a2282861b33fd201d0a02e3528d9/upgrade.properties b/csharp/upgrades/770f844243d5a2282861b33fd201d0a02e3528d9/upgrade.properties
new file mode 100644
index 00000000000..051608334fa
--- /dev/null
+++ b/csharp/upgrades/770f844243d5a2282861b33fd201d0a02e3528d9/upgrade.properties
@@ -0,0 +1,4 @@
+description: Extractor changed to not include angle brackets in generic type names.
+compatibility: backwards
+
+types.rel: run types.qlo
\ No newline at end of file
diff --git a/docs/codeql/_templates/layout.html b/docs/codeql/_templates/layout.html
index e5c6a5d67e6..df9c9a51f26 100644
--- a/docs/codeql/_templates/layout.html
+++ b/docs/codeql/_templates/layout.html
@@ -165,7 +165,8 @@
diff --git a/docs/codeql/codeql-cli/about-ql-packs.rst b/docs/codeql/codeql-cli/about-ql-packs.rst
index 35fdd3c1c60..2cffc9942c0 100644
--- a/docs/codeql/codeql-cli/about-ql-packs.rst
+++ b/docs/codeql/codeql-cli/about-ql-packs.rst
@@ -4,7 +4,7 @@ About QL packs
==============
QL packs are used to organize the files used in CodeQL analysis. They
-contain queries, library files, query suites, and important metadata.
+contain queries, library files, query suites, and important metadata.
The `CodeQL repository `__ contains QL packs for
C/C++, C#, Java, JavaScript, and Python. The `CodeQL for Go
@@ -15,15 +15,15 @@ libraries.
QL pack structure
-----------------
-A QL pack must contain a file called ``qlpack.yml`` in its root directory. The other
-files and directories within the pack should be logically organized. For example, typically:
+A QL pack must contain a file called ``qlpack.yml`` in its root directory. The other
+files and directories within the pack should be logically organized. For example, typically:
- Queries are organized into directories for specific categories.
-- Queries for specific products, libraries, and frameworks are organized into
+- Queries for specific products, libraries, and frameworks are organized into
their own top-level directories.
-- There is a top-level directory named ``/`` for query library
- (``.qll``) files. Within this directory, ``.qll`` files should be organized into
- subdirectories for specific categories.
+- There is a top-level directory named ``/`` for query library
+ (``.qll``) files. Within this directory, ``.qll`` files should be organized into
+ subdirectories for specific categories.
About ``qlpack.yml`` files
--------------------------
@@ -31,18 +31,18 @@ About ``qlpack.yml`` files
When executing commands, CodeQL scans siblings of the installation directory (and
their subdirectories) for ``qlpack.yml`` files. The metadata in the file tells
CodeQL how to compile queries, what libraries the pack depends on, and where to
-find query suite definitions.
+find query suite definitions.
-The content of the QL pack (queries and libraries used in CodeQL analysis) is
+The content of the QL pack (queries and libraries used in CodeQL analysis) is
included in the same directory as ``qlpack.yml``, or its subdirectories.
-The location of ``qlpack.yml`` defines the library path for the content
-of the QL pack. That is, for all ``.ql`` and ``.qll`` files in the QL pack,
-CodeQL will resolve all import statements relative to the ``qlpack.yml`` at the
+The location of ``qlpack.yml`` defines the library path for the content
+of the QL pack. That is, for all ``.ql`` and ``.qll`` files in the QL pack,
+CodeQL will resolve all import statements relative to the ``qlpack.yml`` at the
pack's root.
For example, in a QL pack with the following contents, you can import ``CustomSinks.qll``
-from any location in the pack by declaring ``import mycompany.java.CustomSinks``.
+from any location in the pack by declaring ``import mycompany.java.CustomSinks``.
.. code-block:: none
@@ -54,7 +54,7 @@ from any location in the pack by declaring ``import mycompany.java.CustomSinks``
Security/
CustomQuery.ql
-For more information, see ":ref:`Importing modules `"
+For more information, see ":ref:`Importing modules `"
in the QL language reference.
.. _qlpack-yml-properties:
@@ -113,9 +113,9 @@ Examples of custom QL packs
When you write custom queries or tests, you should save them in
custom QL packs. For simplicity, try to organize each pack logically. For more
-information, see `QL pack structure <#ql-pack-structure>`__. Save files for queries
-and tests in separate packs and, where possible, organize custom packs into specific
-folders for each target language.
+information, see `QL pack structure <#ql-pack-structure>`__. Save files for queries
+and tests in separate packs and, where possible, organize custom packs into specific
+folders for each target language.
QL packs for custom queries
~~~~~~~~~~~~~~~~~~~~~~~~~~~
@@ -123,8 +123,8 @@ QL packs for custom queries
A custom QL pack for queries must include a ``qlpack.yml`` file at
the pack root, containing ``name``, ``version``,
and ``libraryPathDependencies`` properties. If the pack contains query suites, you can
-use the ``suites`` property to define their location. Query suites defined
-here are called "well-known" suites, and can be used on the command line by referring to
+use the ``suites`` property to define their location. Query suites defined
+here are called "well-known" suites, and can be used on the command line by referring to
their name only, rather than their full path.
For more information about query suites, see ":doc:`Creating CodeQL query suites `."
@@ -135,11 +135,11 @@ and libraries may contain:
name: my-custom-queries
version: 0.0.0
- libraryPathDependencies: codeql-cpp
+ libraryPathDependencies: codeql/cpp-all
suites: my-custom-suites
where ``codeql-cpp`` is the name of the QL pack for C/C++ analysis included in
-the CodeQL repository.
+the CodeQL repository.
.. pull-quote::
@@ -207,13 +207,13 @@ contains:
name: codeql-cpp-tests
version: 0.0.0
- libraryPathDependencies: codeql-cpp
+ libraryPathDependencies: codeql/cpp-all
Notice that, unlike the example QL pack for custom tests, this file does not define
an ``extractor`` or ``tests`` property. These properties have been added to
-the QL pack file since the release of CodeQL CLI 2.0.1.
+the QL pack file since the release of CodeQL CLI 2.0.1.
They haven't been added yet to ensure compatibility for LGTM Enterprise users.
-After the next release of LGTM Enterprise, these files can be updated.
+After the next release of LGTM Enterprise, these files can be updated.
.. _upgrade-ql-packs:
diff --git a/docs/codeql/codeql-cli/creating-codeql-query-suites.rst b/docs/codeql/codeql-cli/creating-codeql-query-suites.rst
index ba164a40da0..ceaa104f4d0 100644
--- a/docs/codeql/codeql-cli/creating-codeql-query-suites.rst
+++ b/docs/codeql/codeql-cli/creating-codeql-query-suites.rst
@@ -4,8 +4,8 @@ Creating CodeQL query suites
============================
CodeQL query suites provide a way of selecting queries, based on their
-filename, location on disk or in a QL pack, or metadata properties.
-Create query suites for the queries that you want to frequently use in
+filename, location on disk or in a QL pack, or metadata properties.
+Create query suites for the queries that you want to frequently use in
your CodeQL analyses.
Query suites allow you to pass multiple queries to
@@ -19,7 +19,7 @@ suite definition have been executed, the result is a set of selected queries.
.. pull-quote:: Note
Any custom queries that you want to add to a query suite must be in a :doc:`QL
- pack ` and contain the correct query metadata.
+ pack ` and contain the correct query metadata.
For more information, see
":doc:`Using custom queries with the CodeQL CLI `."
@@ -50,10 +50,15 @@ queries using:
- queries:
from:
-- A ``qlpack`` instruction---tells CodeQL to look for queries in a named QL pack::
+- A ``qlpack`` instruction---tells CodeQL to resolve queries in the default suite of the
+ named QL pack::
- qlpack:
+ The default suite of a query pack includes a recommended set of queries
+ inside of that query pack. Not all query packs have a default suite. If the given query pack does not
+ define a default suite, the `qlpack` instruction will resolve to all of the queries within the pack.
+
.. pull-quote:: Note
When pathnames appear in query suite definitions, they must always
@@ -73,7 +78,7 @@ Filtering the queries in a query suite
After you have defined the initial set of queries to add to your suite by
specifying ``query``, ``queries``, or ``qlpack`` instructions, you can add
``include`` and ``exclude`` instructions. These instructions define selection
-criteria based on specific properties:
+criteria based on specific properties:
- When you execute an ``include`` instruction on a set of queries, any
queries that match your conditions are retained in the selection, and queries
@@ -99,12 +104,12 @@ For both instructions, the argument is a constraint block---that is, a YAML map
representing the constraints. Each constraint is a map entry, where the key is
typically a query metadata property. The value can be:
-- A single string.
+- A single string.
- A ``/``\ -enclosed `regular expression `__.
- A list containing strings, regular expressions, or both.
To match a constraint, a metadata value must match one of the strings or
-regular expressions. When there is more than one metadata key, each key must be matched.
+regular expressions. When there is more than one metadata key, each key must be matched.
For more information about query metadata properties, see ":ref:`Metadata for CodeQL queries
`."
@@ -112,7 +117,7 @@ In addition to metadata tags, the keys in the constraint block can also be:
- ``query filename``---matches on the last path component of the query file name.
- ``query path``---matches on the path to the query file relative to its
- enclosing QL pack.
+ enclosing QL pack.
- ``tags contain``---one of the given match strings must match
one of the space-separated components of the value of the ``@tags`` metadata property.
- ``tags contain all``---each of the given match strings must match one of the
@@ -121,6 +126,14 @@ In addition to metadata tags, the keys in the constraint block can also be:
Examples
~~~~~~~~
+To define a suite that selects all queries in the default suite of the
+``codeql/cpp-queries`` QL pack, and then refines them to only include
+security queries, use::
+
+ - qlpack: codeql/cpp-queries
+ - include:
+ tags contain: security
+
To define a suite that selects all queries with ``@kind problem``
and ``@precision high`` from the ``my-custom-queries`` directory, use::
@@ -136,34 +149,35 @@ recommendation``, use::
- queries: my-custom-queries
- include:
kind: problem
- - exclude:
+ - exclude:
problem.severity: recommendation
To create a suite that selects all queries with ``@tag security`` and
-``@problem.severity high`` or ``very-high`` from the ``codeql-cpp`` QL pack,
+``@problem.severity high`` or ``very-high`` from the ``codeql/cpp-queries`` QL pack,
use::
- - qlpack: codeql-cpp
- - include:
+ - queries: .
+ from: codeql/cpp-queries
+ - include:
tags contain: security
- problem.severity:
+ problem.severity:
- high
- very-high
Reusing existing query suite definitions
-----------------------------------------
-Existing query suite definitions can be reused by specifying:
+Existing query suite definitions can be reused by specifying:
- An ``import`` instruction---adds the queries selected by a
previously defined ``.qls`` file to the current suite::
-
+
- import:
The path to the imported suite must be relative to the QL pack containing the
current suite definition. If the imported query suite is in a different QL
pack you can use::
-
+
- import:
from:
@@ -175,12 +189,12 @@ Existing query suite definitions can be reused by specifying:
applied ``.qls`` file are executed as if they appear in place of ``apply``.
Any ``include`` and ``exclude`` instructions from the applied suite also act on
queries added by any earlier instructions::
-
+
- apply:
The ``apply`` instruction can also be used to apply a set of reusable
conditions, saved in a ``.yml`` file, to multiple query definitions. For more
- information, see the `example <#example>`__ below.
+ information, see the `example <#example>`__ below.
- An ``eval`` instruction---performs the same function as an ``import``
instruction, but takes a full suite definition as the argument, rather than the
@@ -236,7 +250,7 @@ instruction::
This value is displayed when you run `codeql resolve queries
<../manual/resolve-queries>`__, if the suite is added to a "well-known"
directory. For more information, see "`Specifying well-known query suites
-<#specifying-well-known-query-suites>`__."
+<#specifying-well-known-query-suites>`__."
Saving a query suite
--------------------
@@ -248,8 +262,8 @@ Specifying well-known query suites
----------------------------------
You can use QL packs to declare directories that contain "well-known" query
-suites. You can use "well-known" query suites on the command line by referring
-to their file name,
+suites. You can use "well-known" query suites on the command line by referring
+to their file name,
without providing their full path. This gives you a simple way of specifying a
set of queries, without needing to search inside QL packs and distributions.
To declare a directory that contains "well-known" query suites, add the directory
@@ -263,7 +277,7 @@ You can specify query suites on the command line for any command that accepts
``.qls`` files. For example, you can compile the queries selected by a suite
definition using ``query compile``, or use the queries in an analysis using
``database analyze``. For more information about analyzing CodeQL databases, see
-":doc:`Analyzing databases with the CodeQL CLI `."
+":doc:`Analyzing databases with the CodeQL CLI `."
Viewing the query suites used on LGTM.com
-----------------------------------------
diff --git a/docs/codeql/codeql-for-visual-studio-code/analyzing-your-projects.rst b/docs/codeql/codeql-for-visual-studio-code/analyzing-your-projects.rst
index b9a275cfb41..05b01a4c051 100644
--- a/docs/codeql/codeql-for-visual-studio-code/analyzing-your-projects.rst
+++ b/docs/codeql/codeql-for-visual-studio-code/analyzing-your-projects.rst
@@ -97,6 +97,15 @@ For example, in the following snippet, you could select the predicate name ``foo
predicate foo(string s) { s = "bar" }
+Running a query on multiple databases
+--------------------------------------
+
+This is helpful if you want to test your query on multiple codebases, or find a vulnerability in multiple projects.
+
+#. Open a query (``.ql``) file.
+#. Right-click and select **CodeQL: Run Query on Multiple Databases**.
+#. From the dropdown menu, select the databases that you want to run the query on.
+
Viewing previous queries
--------------------------
@@ -120,12 +129,14 @@ To remove queries from the Query History view, select all the queries you want t
Viewing query results
-----------------------
-#. Click a query in the Query History view to display its results in the Results view. Alternatively, right-click the result to select a different view:
+#. Click a query in the Query History view to display its results in the Results view.
- - To view the results in :ref:`SARIF format `, right-click and select **View SARIF**.
- - To view the results in :ref:`DIL format `, right-click and select **View DIL**.
+ .. pull-quote:: Note
-#. Use the dropdown menu in the Results view to choose which results to display, and in what form to display them, such as a formatted alert message or a table of raw results. The available output forms are specified by the format of the query and the metadata. For more information, see ":ref:`CodeQL queries `."
+ Depending on the query, you can also choose different views such as CSV, :ref:`SARIF `, or :ref:`DIL format `. For example, to view the DIL format, right-click a result and select **View DIL**.
+ The available output views are determined by the format and the metadata of the query. For more information, see ":ref:`CodeQL queries `."
+
+#. Use the dropdown menu in the Results view to choose which results to display, and in what form to display them, such as a formatted alert message or a table of raw results.
#. To sort the results by the entries in a particular column, click the column header.
diff --git a/docs/codeql/codeql-for-visual-studio-code/customizing-settings.rst b/docs/codeql/codeql-for-visual-studio-code/customizing-settings.rst
index b48e2cd7f07..940a8a0c50c 100644
--- a/docs/codeql/codeql-for-visual-studio-code/customizing-settings.rst
+++ b/docs/codeql/codeql-for-visual-studio-code/customizing-settings.rst
@@ -37,12 +37,13 @@ Changing the labels of query history items
The query history **Format** setting controls how the extension lists queries in the query history. By default, each item has a label with the following format::
- [%t] %q on %d - %s
-
-- ``%t`` is the time the query was run
+ %q on %d - %s, %r result count [%t]
+
- ``%q`` is the query name
- ``%d`` is the database name
- ``%s`` is a status string
+- ``%r`` is the number of results
+- ``%t`` is the time the query was run
To override the default label, you can specify a different format for the query history items.
diff --git a/docs/codeql/codeql-for-visual-studio-code/setting-up-codeql-in-visual-studio-code.rst b/docs/codeql/codeql-for-visual-studio-code/setting-up-codeql-in-visual-studio-code.rst
index 93b070dba18..0075826d421 100644
--- a/docs/codeql/codeql-for-visual-studio-code/setting-up-codeql-in-visual-studio-code.rst
+++ b/docs/codeql/codeql-for-visual-studio-code/setting-up-codeql-in-visual-studio-code.rst
@@ -54,7 +54,7 @@ There are two ways to do this:
* More advanced, add the CodeQL libraries and queries to an existing workspace. For more information, see ":ref:`Updating an existing workspace for CodeQL `" below.
.. pull-quote:: Note
-
+
For CLI users there is a third option: If you have followed the instructions in ":ref:`Getting started with the CodeQL CLI `" to create a CodeQL directory (for example ``codeql-home``) containing the CodeQL libraries, you can open this directory in VS Code. This also gives the extension access to the CodeQL libraries.
.. container:: toggle
@@ -65,11 +65,11 @@ There are two ways to do this:
Your local version of the CodeQL queries and libraries should match your version of LGTM Enterprise. For example, if you
use LGTM Enterprise 1.27, then you should clone the ``1.27.0`` branch of the `starter workspace `__ (or the appropriate ``1.27.x`` branch, corresponding to each maintenance release).
-
+
This ensures that the queries and libraries you write in VS Code also work in the query console on LGTM Enterprise.
If you prefer to add the CodeQL queries and libraries to an :ref:`existing workspace ` instead of the starter workspace, then you should
- clone the appropriate branch of the `general CodeQL repository `__ and the
+ clone the appropriate branch of the `general CodeQL repository `__ and the
`CodeQL repository for Go `__ and add them to your workspace.
.. _starter-workspace:
@@ -94,7 +94,7 @@ To use the starter workspace:
Updating an existing workspace for CodeQL
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-You can add the CodeQL libraries to an existing workspace by making a local clone of the CodeQL repository directly: https://github.com/github/codeql.
+You can add the CodeQL libraries to an existing workspace by making a local clone of the CodeQL repository directly: https://github.com/github/codeql.
To make the standard libraries available in your workspace:
@@ -110,7 +110,7 @@ For example, to make a custom CodeQL folder called ``my-custom-cpp-pack`` depend
name: my-custom-cpp-pack
version: 0.0.0
- libraryPathDependencies: codeql-cpp
+ libraryPathDependencies: codeql/cpp-all
For more information about why you need to add a ``qlpack.yml`` file, see ":ref:`About QL packs `."
diff --git a/docs/codeql/codeql-language-guides/codeql-library-for-javascript.rst b/docs/codeql/codeql-language-guides/codeql-library-for-javascript.rst
index d88b8b10d57..756740790bd 100644
--- a/docs/codeql/codeql-language-guides/codeql-library-for-javascript.rst
+++ b/docs/codeql/codeql-language-guides/codeql-library-for-javascript.rst
@@ -694,7 +694,7 @@ Furthermore, there are three member predicates that indicate the quality of the
- ``DataFlow::InvokeNode.isImprecise()``: holds for invocations where the call graph builder might infer spurious call targets.
- ``DataFlow::InvokeNode.isIncomplete()``: holds for invocations where the call graph builder might fail to infer possible call targets.
-- ``DataFlow::InvokeNode.isUncertain()``: holds if either ``isImprecise()`` or ``isUncertain()`` holds.
+- ``DataFlow::InvokeNode.isUncertain()``: holds if either ``isImprecise()`` or ``isIncomplete()`` holds.
As an example of a call-graph-based query, here is a query to find invocations for which the call graph builder could not find any callees, despite the analysis being complete for this invocation:
diff --git a/docs/codeql/index.html b/docs/codeql/index.html
index 1173d5a68c4..d69c275afe4 100644
--- a/docs/codeql/index.html
+++ b/docs/codeql/index.html
@@ -349,11 +349,12 @@
diff --git a/docs/codeql/ql-language-reference/expressions.rst b/docs/codeql/ql-language-reference/expressions.rst
index 08a925b50b8..1bf39dda6ba 100644
--- a/docs/codeql/ql-language-reference/expressions.rst
+++ b/docs/codeql/ql-language-reference/expressions.rst
@@ -201,9 +201,10 @@ based on the `Unicode value `` with the keywords ``order by``, then
-the expression that specifies the order, and optionally the keyword ``asc`` or ``desc``
+one or more comma-separated expressions that specify the order, and optionally the keyword ``asc`` or ``desc`` after each expression
(to determine whether to order the expression in ascending or descending order). If you don't
-specify an ordering, it defaults to ``asc``.
+specify an ordering, it defaults to ``asc``. For example, ``order by o.getName() asc, o.getSize() desc``
+might be used to order some object by name, breaking ties by descending size.
The following aggregates are available in QL:
@@ -229,11 +230,11 @@ The following aggregates are available in QL:
In this case, ```` must be of numeric type or of type ``string``.
For example, the following aggregation returns the name of the ``.js`` file (or files) with the
- largest number of lines:
+ largest number of lines, using the number of lines of code to break ties:
.. code-block:: ql
- max(File f | f.getExtension() = "js" | f.getBaseName() order by f.getTotalNumberOfLines())
+ max(File f | f.getExtension() = "js" | f.getBaseName() order by f.getTotalNumberOfLines(), f.getNumberOfLinesOfCode())
The following aggregation returns the minimum string ``s`` out of the three strings mentioned
below, that is, the string that comes first in the lexicographic ordering of all the possible
diff --git a/docs/codeql/support/reusables/frameworks.rst b/docs/codeql/support/reusables/frameworks.rst
index 01d6c2cb312..59899b8c58b 100644
--- a/docs/codeql/support/reusables/frameworks.rst
+++ b/docs/codeql/support/reusables/frameworks.rst
@@ -176,6 +176,7 @@ Python built-in support
mysqlclient, Database
psycopg2, Database
sqlite3, Database
+ peewee, Database ORM
cryptography, Cryptography library
pycryptodome, Cryptography library
pycryptodomex, Cryptography library
diff --git a/java/change-notes/2021-06-22-more-steps-for-bytebuffer-inputstream.md b/java/change-notes/2021-06-22-more-steps-for-bytebuffer-inputstream.md
index 8ffaf6926ea..a3528dfd6f1 100644
--- a/java/change-notes/2021-06-22-more-steps-for-bytebuffer-inputstream.md
+++ b/java/change-notes/2021-06-22-more-steps-for-bytebuffer-inputstream.md
@@ -1,2 +1,2 @@
lgtm,codescanning
-* Added more taint propagation steps for `InputStream` and `ByteBuffer`.
+* Added more taint propagation models of some `java.io.InputStream` and `java.nio.ByteBuffer` methods. This may lead to extra results from queries concerning data-flow whenever a relevant path involves an instance of one of those types.
diff --git a/java/change-notes/2021-07-01-spring-webutil.md b/java/change-notes/2021-07-01-spring-webutil.md
new file mode 100644
index 00000000000..279fd801e01
--- /dev/null
+++ b/java/change-notes/2021-07-01-spring-webutil.md
@@ -0,0 +1,4 @@
+lgtm,codescanning
+* Additional flow steps in the `org.springframework.web.util` package of the Spring framework have
+ been modelled. This may result in additional results for security queries on projects using this
+ framework.
diff --git a/java/change-notes/2021-07-27-apache-collections-base-package.md b/java/change-notes/2021-07-27-apache-collections-base-package.md
new file mode 100644
index 00000000000..63438d861aa
--- /dev/null
+++ b/java/change-notes/2021-07-27-apache-collections-base-package.md
@@ -0,0 +1,2 @@
+lgtm,codescanning
+* Added models for the base package of Apache Commons Collections. This may lead to more results from any query using data-flow analysis where a relevant path uses one of these container types.
diff --git a/java/change-notes/2021-07-28-guava-cache.md b/java/change-notes/2021-07-28-guava-cache.md
new file mode 100644
index 00000000000..21128d7a60a
--- /dev/null
+++ b/java/change-notes/2021-07-28-guava-cache.md
@@ -0,0 +1,2 @@
+lgtm,codescanning
+* Added additional taint steps modeling methods in the Guava cache package (`com.google.common.cache`)
\ No newline at end of file
diff --git a/java/change-notes/2021-08-05-jodd-unsafe-deserialization.md b/java/change-notes/2021-08-05-jodd-unsafe-deserialization.md
new file mode 100644
index 00000000000..cbdde90a065
--- /dev/null
+++ b/java/change-notes/2021-08-05-jodd-unsafe-deserialization.md
@@ -0,0 +1,2 @@
+lgtm,codescanning
+* The "Deserialization of user-controlled data" (`java/unsafe-deserialization`) query now recognizes deserialization using the `Jodd JSON` library.
diff --git a/java/change-notes/2021-08-23-getPrimaryQlClasses.md b/java/change-notes/2021-08-23-getPrimaryQlClasses.md
new file mode 100644
index 00000000000..513cf51bcb0
--- /dev/null
+++ b/java/change-notes/2021-08-23-getPrimaryQlClasses.md
@@ -0,0 +1,2 @@
+lgtm,codescanning
+* Added `Top.getPrimaryQlClasses()` predicate, which gets a comma-separated list of the names of the primary CodeQL classes to which this element belongs.
diff --git a/java/change-notes/2021-08-23-local-interfaces-enums.md b/java/change-notes/2021-08-23-local-interfaces-enums.md
new file mode 100644
index 00000000000..055bd678056
--- /dev/null
+++ b/java/change-notes/2021-08-23-local-interfaces-enums.md
@@ -0,0 +1,2 @@
+lgtm,codescanning
+* `Class.isLocal` has been replaced with `ClassOrInterface.isLocal`. This is because as of Java 16, interfaces can be declared method-local. Accordingly, `LocalClassDeclStmt.getLocalClass` is renamed `LocalTypeDeclStmt.getLocalType` and now returns a `ClassOrInterface`. `BusinessInterface`, declared in `EJB.qll`, has had its `isRemote` and `isLocal` methods renamed `isDeclaredLocal` and `isDeclaredRemote` to avoid a name clash.
diff --git a/java/change-notes/2021-08-24-downgrade-sql-unescaped.md b/java/change-notes/2021-08-24-downgrade-sql-unescaped.md
new file mode 100644
index 00000000000..afba63e3f54
--- /dev/null
+++ b/java/change-notes/2021-08-24-downgrade-sql-unescaped.md
@@ -0,0 +1,2 @@
+lgtm,codescanning
+* Query `java/concatenated-sql-query` has been downgraded to medium precision in view of its heuristic nature, which is inherently prone to false positives. This means its alerts will not be visible by default on lgtm.com. Code Scanning will also no longer run the query by default.
diff --git a/java/documentation/library-coverage/coverage.csv b/java/documentation/library-coverage/coverage.csv
index 507c2fe60d5..b8de8cf3c3f 100644
--- a/java/documentation/library-coverage/coverage.csv
+++ b/java/documentation/library-coverage/coverage.csv
@@ -8,6 +8,7 @@ com.esotericsoftware.kryo5.io,,,1,,,,,,,,,,,,,,,,,,,1,
com.fasterxml.jackson.core,,,1,,,,,,,,,,,,,,,,,,,1,
com.fasterxml.jackson.databind,,,5,,,,,,,,,,,,,,,,,,,5,
com.google.common.base,,,85,,,,,,,,,,,,,,,,,,,62,23
+com.google.common.cache,,,17,,,,,,,,,,,,,,,,,,,,17
com.google.common.io,6,,73,,,,,,,,,,,,,,6,,,,,72,1
com.opensymphony.xwork2.ognl,3,,,,,,,,,,,,3,,,,,,,,,,
com.unboundid.ldap.sdk,17,,,,,,,,,,17,,,,,,,,,,,,
@@ -22,7 +23,7 @@ java.lang,,,3,,,,,,,,,,,,,,,,,,,1,2
java.net,10,3,7,,,,,,,,,,,10,,,,,,,3,7,
java.nio,10,,4,,10,,,,,,,,,,,,,,,,,4,
java.sql,7,,,,,,,,,,,,,,,7,,,,,,,
-java.util,,,332,,,,,,,,,,,,,,,,,,,15,317
+java.util,,,336,,,,,,,,,,,,,,,,,,,15,321
javax.json,,,123,,,,,,,,,,,,,,,,,,,100,23
javax.management.remote,2,,,,,,,,,2,,,,,,,,,,,,,
javax.naming,7,,,,,,,,,6,1,,,,,,,,,,,,
@@ -35,10 +36,11 @@ javax.ws.rs.core,3,,143,,,,1,,,,,,,,,,,2,,,,88,55
javax.xml.transform.sax,,,4,,,,,,,,,,,,,,,,,,,4,
javax.xml.transform.stream,,,2,,,,,,,,,,,,,,,,,,,2,
javax.xml.xpath,3,,,,,,,,,,,,,,,,,,3,,,,
+jodd.json,,,10,,,,,,,,,,,,,,,,,,,,10
ognl,6,,,,,,,,,,,,6,,,,,,,,,,
org.apache.commons.codec,,,6,,,,,,,,,,,,,,,,,,,6,
-org.apache.commons.collections,,,99,,,,,,,,,,,,,,,,,,,4,95
-org.apache.commons.collections4,,,99,,,,,,,,,,,,,,,,,,,4,95
+org.apache.commons.collections,,,394,,,,,,,,,,,,,,,,,,,9,385
+org.apache.commons.collections4,,,394,,,,,,,,,,,,,,,,,,,9,385
org.apache.commons.io,,,22,,,,,,,,,,,,,,,,,,,22,
org.apache.commons.jexl2,15,,,,,,,,15,,,,,,,,,,,,,,
org.apache.commons.jexl3,15,,,,,,,,15,,,,,,,,,,,,,,
@@ -74,6 +76,7 @@ org.springframework.web.client,13,3,,,,,,,,,,,,13,,,,,,,3,,
org.springframework.web.context.request,,8,,,,,,,,,,,,,,,,,,,8,,
org.springframework.web.multipart,,12,13,,,,,,,,,,,,,,,,,,12,13,
org.springframework.web.reactive.function.client,2,,,,,,,,,,,,,2,,,,,,,,,
+org.springframework.web.util,,,163,,,,,,,,,,,,,,,,,,,138,25
org.xml.sax,,,1,,,,,,,,,,,,,,,,,,,1,
org.xmlpull.v1,,3,,,,,,,,,,,,,,,,,,,3,,
play.mvc,,4,,,,,,,,,,,,,,,,,,,4,,
diff --git a/java/documentation/library-coverage/coverage.rst b/java/documentation/library-coverage/coverage.rst
index 658386024ba..a89ded5c50c 100644
--- a/java/documentation/library-coverage/coverage.rst
+++ b/java/documentation/library-coverage/coverage.rst
@@ -8,15 +8,16 @@ Java framework & library support
Framework / library,Package,Flow sources,Taint & value steps,Sinks (total),`CWE‑022` :sub:`Path injection`,`CWE‑036` :sub:`Path traversal`,`CWE‑079` :sub:`Cross-site scripting`,`CWE‑089` :sub:`SQL injection`,`CWE‑090` :sub:`LDAP injection`,`CWE‑094` :sub:`Code injection`,`CWE‑319` :sub:`Cleartext transmission`
Android,``android.*``,18,34,70,,,3,67,,,
- `Apache Commons Collections `_,"``org.apache.commons.collections``, ``org.apache.commons.collections4``",,198,,,,,,,,
+ `Apache Commons Collections `_,"``org.apache.commons.collections``, ``org.apache.commons.collections4``",,788,,,,,,,,
`Apache Commons IO `_,``org.apache.commons.io``,,22,,,,,,,,
`Apache Commons Lang `_,``org.apache.commons.lang3``,,423,,,,,,,,
`Apache Commons Text `_,``org.apache.commons.text``,,272,,,,,,,,
`Apache HttpComponents `_,"``org.apache.hc.core5.*``, ``org.apache.http``",5,136,28,,,3,,,,25
- `Google Guava `_,``com.google.common.*``,,158,6,,6,,,,,
- Java Standard Library,``java.*``,3,371,30,13,,,7,,,10
+ `Google Guava `_,``com.google.common.*``,,175,6,,6,,,,,
+ `JSON-java `_,``org.json``,,236,,,,,,,,
+ Java Standard Library,``java.*``,3,375,30,13,,,7,,,10
Java extensions,"``javax.*``, ``jakarta.*``",22,540,27,,,,,1,1,2
- `Spring `_,``org.springframework.*``,29,306,91,,,,19,14,,29
- Others,"``com.esotericsoftware.kryo.io``, ``com.esotericsoftware.kryo5.io``, ``com.fasterxml.jackson.core``, ``com.fasterxml.jackson.databind``, ``com.opensymphony.xwork2.ognl``, ``com.unboundid.ldap.sdk``, ``groovy.lang``, ``groovy.util``, ``ognl``, ``org.apache.commons.codec``, ``org.apache.commons.jexl2``, ``org.apache.commons.jexl3``, ``org.apache.commons.ognl``, ``org.apache.directory.ldap.client.api``, ``org.apache.ibatis.jdbc``, ``org.apache.shiro.jndi``, ``org.codehaus.groovy.control``, ``org.dom4j``, ``org.hibernate``, ``org.jooq``, ``org.json``, ``org.mvel2``, ``org.xml.sax``, ``org.xmlpull.v1``, ``play.mvc``",7,251,146,,,,14,18,,
- Totals,,84,2711,398,13,6,6,107,33,1,66
+ `Spring `_,``org.springframework.*``,29,469,91,,,,19,14,,29
+ Others,"``com.esotericsoftware.kryo.io``, ``com.esotericsoftware.kryo5.io``, ``com.fasterxml.jackson.core``, ``com.fasterxml.jackson.databind``, ``com.opensymphony.xwork2.ognl``, ``com.unboundid.ldap.sdk``, ``groovy.lang``, ``groovy.util``, ``jodd.json``, ``ognl``, ``org.apache.commons.codec``, ``org.apache.commons.jexl2``, ``org.apache.commons.jexl3``, ``org.apache.commons.ognl``, ``org.apache.directory.ldap.client.api``, ``org.apache.ibatis.jdbc``, ``org.apache.shiro.jndi``, ``org.codehaus.groovy.control``, ``org.dom4j``, ``org.hibernate``, ``org.jooq``, ``org.mvel2``, ``org.xml.sax``, ``org.xmlpull.v1``, ``play.mvc``",7,25,146,,,,14,18,,
+ Totals,,84,3495,398,13,6,6,107,33,1,66
diff --git a/java/documentation/library-coverage/frameworks.csv b/java/documentation/library-coverage/frameworks.csv
index bd5feddb8ed..28493067fa7 100644
--- a/java/documentation/library-coverage/frameworks.csv
+++ b/java/documentation/library-coverage/frameworks.csv
@@ -1,11 +1,12 @@
Framework name,URL,Package prefixes
Java Standard Library,,java.*
Java extensions,,javax.* jakarta.*
-Google Guava,https://guava.dev/,com.google.common.*
Apache Commons Collections,https://commons.apache.org/proper/commons-collections/,org.apache.commons.collections org.apache.commons.collections4
Apache Commons IO,https://commons.apache.org/proper/commons-io/,org.apache.commons.io
Apache Commons Lang,https://commons.apache.org/proper/commons-lang/,org.apache.commons.lang3
Apache Commons Text,https://commons.apache.org/proper/commons-text/,org.apache.commons.text
Apache HttpComponents,https://hc.apache.org/,org.apache.hc.core5.* org.apache.http
Android,,android.*
+Google Guava,https://guava.dev/,com.google.common.*
+JSON-java,https://github.com/stleary/JSON-java,org.json
Spring,https://spring.io/,org.springframework.*
diff --git a/java/ql/examples/qlpack.yml b/java/ql/examples/qlpack.yml
index 5f87efb4c27..98265c98bc1 100644
--- a/java/ql/examples/qlpack.yml
+++ b/java/ql/examples/qlpack.yml
@@ -1,3 +1,3 @@
name: codeql-java-examples
version: 0.0.0
-libraryPathDependencies: codeql-java
+libraryPathDependencies: codeql/java-all
diff --git a/java/ql/src/Customizations.qll b/java/ql/lib/Customizations.qll
similarity index 100%
rename from java/ql/src/Customizations.qll
rename to java/ql/lib/Customizations.qll
diff --git a/java/ql/lib/config/semmlecode.dbscheme b/java/ql/lib/config/semmlecode.dbscheme
new file mode 100755
index 00000000000..8ab354e68e8
--- /dev/null
+++ b/java/ql/lib/config/semmlecode.dbscheme
@@ -0,0 +1,987 @@
+/**
+ * An invocation of the compiler. Note that more than one file may be
+ * compiled per invocation. For example, this command compiles three
+ * source files:
+ *
+ * javac A.java B.java C.java
+ *
+ * The `id` simply identifies the invocation, while `cwd` is the working
+ * directory from which the compiler was invoked.
+ */
+compilations(
+ /**
+ * An invocation of the compiler. Note that more than one file may
+ * be compiled per invocation. For example, this command compiles
+ * three source files:
+ *
+ * javac A.java B.java C.java
+ */
+ unique int id : @compilation,
+ string cwd : string ref
+);
+
+/**
+ * The arguments that were passed to the extractor for a compiler
+ * invocation. If `id` is for the compiler invocation
+ *
+ * javac A.java B.java C.java
+ *
+ * then typically there will be rows for
+ *
+ * num | arg
+ * --- | ---
+ * 0 | *path to extractor*
+ * 1 | `--javac-args`
+ * 2 | A.java
+ * 3 | B.java
+ * 4 | C.java
+ */
+#keyset[id, num]
+compilation_args(
+ int id : @compilation ref,
+ int num : int ref,
+ string arg : string ref
+);
+
+/**
+ * The source files that are compiled by a compiler invocation.
+ * If `id` is for the compiler invocation
+ *
+ * javac A.java B.java C.java
+ *
+ * then there will be rows for
+ *
+ * num | arg
+ * --- | ---
+ * 0 | A.java
+ * 1 | B.java
+ * 2 | C.java
+ */
+#keyset[id, num]
+compilation_compiling_files(
+ int id : @compilation ref,
+ int num : int ref,
+ int file : @file ref
+);
+
+/**
+ * The time taken by the extractor for a compiler invocation.
+ *
+ * For each file `num`, there will be rows for
+ *
+ * kind | seconds
+ * ---- | ---
+ * 1 | CPU seconds used by the extractor frontend
+ * 2 | Elapsed seconds during the extractor frontend
+ * 3 | CPU seconds used by the extractor backend
+ * 4 | Elapsed seconds during the extractor backend
+ */
+#keyset[id, num, kind]
+compilation_time(
+ int id : @compilation ref,
+ int num : int ref,
+ /* kind:
+ 1 = frontend_cpu_seconds
+ 2 = frontend_elapsed_seconds
+ 3 = extractor_cpu_seconds
+ 4 = extractor_elapsed_seconds
+ */
+ int kind : int ref,
+ float seconds : float ref
+);
+
+/**
+ * An error or warning generated by the extractor.
+ * The diagnostic message `diagnostic` was generated during compiler
+ * invocation `compilation`, and is the `file_number_diagnostic_number`th
+ * message generated while extracting the `file_number`th file of that
+ * invocation.
+ */
+#keyset[compilation, file_number, file_number_diagnostic_number]
+diagnostic_for(
+ unique int diagnostic : @diagnostic ref,
+ int compilation : @compilation ref,
+ int file_number : int ref,
+ int file_number_diagnostic_number : int ref
+);
+
+/**
+ * If extraction was successful, then `cpu_seconds` and
+ * `elapsed_seconds` are the CPU time and elapsed time (respectively)
+ * that extraction took for compiler invocation `id`.
+ */
+compilation_finished(
+ unique int id : @compilation ref,
+ float cpu_seconds : float ref,
+ float elapsed_seconds : float ref
+);
+
+diagnostics(
+ unique int id: @diagnostic,
+ int severity: int ref,
+ string error_tag: string ref,
+ string error_message: string ref,
+ string full_error_message: string ref,
+ int location: @location_default ref
+);
+
+/*
+ * External artifacts
+ */
+
+externalData(
+ int id : @externalDataElement,
+ string path : string ref,
+ int column: int ref,
+ string value : string ref
+);
+
+snapshotDate(
+ unique date snapshotDate : date ref
+);
+
+sourceLocationPrefix(
+ string prefix : string ref
+);
+
+/*
+ * Duplicate code
+ */
+
+duplicateCode(
+ unique int id : @duplication,
+ string relativePath : string ref,
+ int equivClass : int ref
+);
+
+similarCode(
+ unique int id : @similarity,
+ string relativePath : string ref,
+ int equivClass : int ref
+);
+
+@duplication_or_similarity = @duplication | @similarity
+
+tokens(
+ int id : @duplication_or_similarity ref,
+ int offset : int ref,
+ int beginLine : int ref,
+ int beginColumn : int ref,
+ int endLine : int ref,
+ int endColumn : int ref
+);
+
+/*
+ * SMAP
+ */
+
+smap_header(
+ int outputFileId: @file ref,
+ string outputFilename: string ref,
+ string defaultStratum: string ref
+);
+
+smap_files(
+ int outputFileId: @file ref,
+ string stratum: string ref,
+ int inputFileNum: int ref,
+ string inputFileName: string ref,
+ int inputFileId: @file ref
+);
+
+smap_lines(
+ int outputFileId: @file ref,
+ string stratum: string ref,
+ int inputFileNum: int ref,
+ int inputStartLine: int ref,
+ int inputLineCount: int ref,
+ int outputStartLine: int ref,
+ int outputLineIncrement: int ref
+);
+
+/*
+ * Locations and files
+ */
+
+@location = @location_default ;
+
+locations_default(
+ unique int id: @location_default,
+ int file: @file ref,
+ int beginLine: int ref,
+ int beginColumn: int ref,
+ int endLine: int ref,
+ int endColumn: int ref
+);
+
+hasLocation(
+ int locatableid: @locatable ref,
+ int id: @location ref
+);
+
+@sourceline = @locatable ;
+
+#keyset[element_id]
+numlines(
+ int element_id: @sourceline ref,
+ int num_lines: int ref,
+ int num_code: int ref,
+ int num_comment: int ref
+);
+
+files(
+ unique int id: @file,
+ string name: string ref,
+ string simple: string ref,
+ string ext: string ref,
+ int fromSource: int ref // deprecated
+);
+
+folders(
+ unique int id: @folder,
+ string name: string ref,
+ string simple: string ref
+);
+
+@container = @folder | @file
+
+containerparent(
+ int parent: @container ref,
+ unique int child: @container ref
+);
+
+/*
+ * Java
+ */
+
+cupackage(
+ unique int id: @file ref,
+ int packageid: @package ref
+);
+
+#keyset[fileid,keyName]
+jarManifestMain(
+ int fileid: @file ref,
+ string keyName: string ref,
+ string value: string ref
+);
+
+#keyset[fileid,entryName,keyName]
+jarManifestEntries(
+ int fileid: @file ref,
+ string entryName: string ref,
+ string keyName: string ref,
+ string value: string ref
+);
+
+packages(
+ unique int id: @package,
+ string nodeName: string ref
+);
+
+primitives(
+ unique int id: @primitive,
+ string nodeName: string ref
+);
+
+modifiers(
+ unique int id: @modifier,
+ string nodeName: string ref
+);
+
+classes(
+ unique int id: @class,
+ string nodeName: string ref,
+ int parentid: @package ref,
+ int sourceid: @class ref
+);
+
+isRecord(
+ unique int id: @class ref
+);
+
+interfaces(
+ unique int id: @interface,
+ string nodeName: string ref,
+ int parentid: @package ref,
+ int sourceid: @interface ref
+);
+
+fielddecls(
+ unique int id: @fielddecl,
+ int parentid: @reftype ref
+);
+
+#keyset[fieldId] #keyset[fieldDeclId,pos]
+fieldDeclaredIn(
+ int fieldId: @field ref,
+ int fieldDeclId: @fielddecl ref,
+ int pos: int ref
+);
+
+fields(
+ unique int id: @field,
+ string nodeName: string ref,
+ int typeid: @type ref,
+ int parentid: @reftype ref,
+ int sourceid: @field ref
+);
+
+constrs(
+ unique int id: @constructor,
+ string nodeName: string ref,
+ string signature: string ref,
+ int typeid: @type ref,
+ int parentid: @reftype ref,
+ int sourceid: @constructor ref
+);
+
+methods(
+ unique int id: @method,
+ string nodeName: string ref,
+ string signature: string ref,
+ int typeid: @type ref,
+ int parentid: @reftype ref,
+ int sourceid: @method ref
+);
+
+#keyset[parentid,pos]
+params(
+ unique int id: @param,
+ int typeid: @type ref,
+ int pos: int ref,
+ int parentid: @callable ref,
+ int sourceid: @param ref
+);
+
+paramName(
+ unique int id: @param ref,
+ string nodeName: string ref
+);
+
+isVarargsParam(
+ int param: @param ref
+);
+
+exceptions(
+ unique int id: @exception,
+ int typeid: @type ref,
+ int parentid: @callable ref
+);
+
+isAnnotType(
+ int interfaceid: @interface ref
+);
+
+isAnnotElem(
+ int methodid: @method ref
+);
+
+annotValue(
+ int parentid: @annotation ref,
+ int id2: @method ref,
+ unique int value: @expr ref
+);
+
+isEnumType(
+ int classid: @class ref
+);
+
+isEnumConst(
+ int fieldid: @field ref
+);
+
+#keyset[parentid,pos]
+typeVars(
+ unique int id: @typevariable,
+ string nodeName: string ref,
+ int pos: int ref,
+ int kind: int ref, // deprecated
+ int parentid: @typeorcallable ref
+);
+
+wildcards(
+ unique int id: @wildcard,
+ string nodeName: string ref,
+ int kind: int ref
+);
+
+#keyset[parentid,pos]
+typeBounds(
+ unique int id: @typebound,
+ int typeid: @reftype ref,
+ int pos: int ref,
+ int parentid: @boundedtype ref
+);
+
+#keyset[parentid,pos]
+typeArgs(
+ int argumentid: @reftype ref,
+ int pos: int ref,
+ int parentid: @typeorcallable ref
+);
+
+isParameterized(
+ int memberid: @member ref
+);
+
+isRaw(
+ int memberid: @member ref
+);
+
+erasure(
+ unique int memberid: @member ref,
+ int erasureid: @member ref
+);
+
+#keyset[classid] #keyset[parent]
+isAnonymClass(
+ int classid: @class ref,
+ int parent: @classinstancexpr ref
+);
+
+#keyset[typeid] #keyset[parent]
+isLocalClassOrInterface(
+ int typeid: @classorinterface ref,
+ int parent: @localtypedeclstmt ref
+);
+
+isDefConstr(
+ int constructorid: @constructor ref
+);
+
+#keyset[exprId]
+lambdaKind(
+ int exprId: @lambdaexpr ref,
+ int bodyKind: int ref
+);
+
+arrays(
+ unique int id: @array,
+ string nodeName: string ref,
+ int elementtypeid: @type ref,
+ int dimension: int ref,
+ int componenttypeid: @type ref
+);
+
+enclInReftype(
+ unique int child: @reftype ref,
+ int parent: @reftype ref
+);
+
+extendsReftype(
+ int id1: @reftype ref,
+ int id2: @classorinterface ref
+);
+
+implInterface(
+ int id1: @classorarray ref,
+ int id2: @interface ref
+);
+
+permits(
+ int id1: @classorinterface ref,
+ int id2: @classorinterface ref
+);
+
+hasModifier(
+ int id1: @modifiable ref,
+ int id2: @modifier ref
+);
+
+imports(
+ unique int id: @import,
+ int holder: @typeorpackage ref,
+ string name: string ref,
+ int kind: int ref
+);
+
+#keyset[parent,idx]
+stmts(
+ unique int id: @stmt,
+ int kind: int ref,
+ int parent: @stmtparent ref,
+ int idx: int ref,
+ int bodydecl: @callable ref
+);
+
+@stmtparent = @callable | @stmt | @switchexpr;
+
+case @stmt.kind of
+ 0 = @block
+| 1 = @ifstmt
+| 2 = @forstmt
+| 3 = @enhancedforstmt
+| 4 = @whilestmt
+| 5 = @dostmt
+| 6 = @trystmt
+| 7 = @switchstmt
+| 8 = @synchronizedstmt
+| 9 = @returnstmt
+| 10 = @throwstmt
+| 11 = @breakstmt
+| 12 = @continuestmt
+| 13 = @emptystmt
+| 14 = @exprstmt
+| 15 = @labeledstmt
+| 16 = @assertstmt
+| 17 = @localvariabledeclstmt
+| 18 = @localtypedeclstmt
+| 19 = @constructorinvocationstmt
+| 20 = @superconstructorinvocationstmt
+| 21 = @case
+| 22 = @catchclause
+| 23 = @yieldstmt
+;
+
+#keyset[parent,idx]
+exprs(
+ unique int id: @expr,
+ int kind: int ref,
+ int typeid: @type ref,
+ int parent: @exprparent ref,
+ int idx: int ref
+);
+
+callableEnclosingExpr(
+ unique int id: @expr ref,
+ int callable_id: @callable ref
+);
+
+statementEnclosingExpr(
+ unique int id: @expr ref,
+ int statement_id: @stmt ref
+);
+
+isParenthesized(
+ unique int id: @expr ref,
+ int parentheses: int ref
+);
+
+case @expr.kind of
+ 1 = @arrayaccess
+| 2 = @arraycreationexpr
+| 3 = @arrayinit
+| 4 = @assignexpr
+| 5 = @assignaddexpr
+| 6 = @assignsubexpr
+| 7 = @assignmulexpr
+| 8 = @assigndivexpr
+| 9 = @assignremexpr
+| 10 = @assignandexpr
+| 11 = @assignorexpr
+| 12 = @assignxorexpr
+| 13 = @assignlshiftexpr
+| 14 = @assignrshiftexpr
+| 15 = @assignurshiftexpr
+| 16 = @booleanliteral
+| 17 = @integerliteral
+| 18 = @longliteral
+| 19 = @floatingpointliteral
+| 20 = @doubleliteral
+| 21 = @characterliteral
+| 22 = @stringliteral
+| 23 = @nullliteral
+| 24 = @mulexpr
+| 25 = @divexpr
+| 26 = @remexpr
+| 27 = @addexpr
+| 28 = @subexpr
+| 29 = @lshiftexpr
+| 30 = @rshiftexpr
+| 31 = @urshiftexpr
+| 32 = @andbitexpr
+| 33 = @orbitexpr
+| 34 = @xorbitexpr
+| 35 = @andlogicalexpr
+| 36 = @orlogicalexpr
+| 37 = @ltexpr
+| 38 = @gtexpr
+| 39 = @leexpr
+| 40 = @geexpr
+| 41 = @eqexpr
+| 42 = @neexpr
+| 43 = @postincexpr
+| 44 = @postdecexpr
+| 45 = @preincexpr
+| 46 = @predecexpr
+| 47 = @minusexpr
+| 48 = @plusexpr
+| 49 = @bitnotexpr
+| 50 = @lognotexpr
+| 51 = @castexpr
+| 52 = @newexpr
+| 53 = @conditionalexpr
+| 54 = @parexpr // deprecated
+| 55 = @instanceofexpr
+| 56 = @localvariabledeclexpr
+| 57 = @typeliteral
+| 58 = @thisaccess
+| 59 = @superaccess
+| 60 = @varaccess
+| 61 = @methodaccess
+| 62 = @unannotatedtypeaccess
+| 63 = @arraytypeaccess
+| 64 = @packageaccess
+| 65 = @wildcardtypeaccess
+| 66 = @declannotation
+| 67 = @uniontypeaccess
+| 68 = @lambdaexpr
+| 69 = @memberref
+| 70 = @annotatedtypeaccess
+| 71 = @typeannotation
+| 72 = @intersectiontypeaccess
+| 73 = @switchexpr
+;
+
+@classinstancexpr = @newexpr | @lambdaexpr | @memberref
+
+@annotation = @declannotation | @typeannotation
+@typeaccess = @unannotatedtypeaccess | @annotatedtypeaccess
+
+@assignment = @assignexpr
+ | @assignop;
+
+@unaryassignment = @postincexpr
+ | @postdecexpr
+ | @preincexpr
+ | @predecexpr;
+
+@assignop = @assignaddexpr
+ | @assignsubexpr
+ | @assignmulexpr
+ | @assigndivexpr
+ | @assignremexpr
+ | @assignandexpr
+ | @assignorexpr
+ | @assignxorexpr
+ | @assignlshiftexpr
+ | @assignrshiftexpr
+ | @assignurshiftexpr;
+
+@literal = @booleanliteral
+ | @integerliteral
+ | @longliteral
+ | @floatingpointliteral
+ | @doubleliteral
+ | @characterliteral
+ | @stringliteral
+ | @nullliteral;
+
+@binaryexpr = @mulexpr
+ | @divexpr
+ | @remexpr
+ | @addexpr
+ | @subexpr
+ | @lshiftexpr
+ | @rshiftexpr
+ | @urshiftexpr
+ | @andbitexpr
+ | @orbitexpr
+ | @xorbitexpr
+ | @andlogicalexpr
+ | @orlogicalexpr
+ | @ltexpr
+ | @gtexpr
+ | @leexpr
+ | @geexpr
+ | @eqexpr
+ | @neexpr;
+
+@unaryexpr = @postincexpr
+ | @postdecexpr
+ | @preincexpr
+ | @predecexpr
+ | @minusexpr
+ | @plusexpr
+ | @bitnotexpr
+ | @lognotexpr;
+
+@caller = @classinstancexpr
+ | @methodaccess
+ | @constructorinvocationstmt
+ | @superconstructorinvocationstmt;
+
+callableBinding(
+ unique int callerid: @caller ref,
+ int callee: @callable ref
+);
+
+memberRefBinding(
+ unique int id: @expr ref,
+ int callable: @callable ref
+);
+
+@exprparent = @stmt | @expr | @callable | @field | @fielddecl | @class | @interface | @param | @localvar | @typevariable;
+
+variableBinding(
+ unique int expr: @varaccess ref,
+ int variable: @variable ref
+);
+
+@variable = @localscopevariable | @field;
+
+@localscopevariable = @localvar | @param;
+
+localvars(
+ unique int id: @localvar,
+ string nodeName: string ref,
+ int typeid: @type ref,
+ int parentid: @localvariabledeclexpr ref
+);
+
+@namedexprorstmt = @breakstmt
+ | @continuestmt
+ | @labeledstmt
+ | @literal;
+
+namestrings(
+ string name: string ref,
+ string value: string ref,
+ unique int parent: @namedexprorstmt ref
+);
+
+/*
+ * Modules
+ */
+
+#keyset[name]
+modules(
+ unique int id: @module,
+ string name: string ref
+);
+
+isOpen(
+ int id: @module ref
+);
+
+#keyset[fileId]
+cumodule(
+ int fileId: @file ref,
+ int moduleId: @module ref
+);
+
+@directive = @requires
+ | @exports
+ | @opens
+ | @uses
+ | @provides
+
+#keyset[directive]
+directives(
+ int id: @module ref,
+ int directive: @directive ref
+);
+
+requires(
+ unique int id: @requires,
+ int target: @module ref
+);
+
+isTransitive(
+ int id: @requires ref
+);
+
+isStatic(
+ int id: @requires ref
+);
+
+exports(
+ unique int id: @exports,
+ int target: @package ref
+);
+
+exportsTo(
+ int id: @exports ref,
+ int target: @module ref
+);
+
+opens(
+ unique int id: @opens,
+ int target: @package ref
+);
+
+opensTo(
+ int id: @opens ref,
+ int target: @module ref
+);
+
+uses(
+ unique int id: @uses,
+ string serviceInterface: string ref
+);
+
+provides(
+ unique int id: @provides,
+ string serviceInterface: string ref
+);
+
+providesWith(
+ int id: @provides ref,
+ string serviceImpl: string ref
+);
+
+/*
+ * Javadoc
+ */
+
+javadoc(
+ unique int id: @javadoc
+);
+
+isNormalComment(
+ int commentid : @javadoc ref
+);
+
+isEolComment(
+ int commentid : @javadoc ref
+);
+
+hasJavadoc(
+ int documentableid: @member ref,
+ int javadocid: @javadoc ref
+);
+
+#keyset[parentid,idx]
+javadocTag(
+ unique int id: @javadocTag,
+ string name: string ref,
+ int parentid: @javadocParent ref,
+ int idx: int ref
+);
+
+#keyset[parentid,idx]
+javadocText(
+ unique int id: @javadocText,
+ string text: string ref,
+ int parentid: @javadocParent ref,
+ int idx: int ref
+);
+
+@javadocParent = @javadoc | @javadocTag;
+@javadocElement = @javadocTag | @javadocText;
+
+@typeorpackage = @type | @package;
+
+@typeorcallable = @type | @callable;
+@classorinterface = @interface | @class;
+@boundedtype = @typevariable | @wildcard;
+@reftype = @classorinterface | @array | @boundedtype;
+@classorarray = @class | @array;
+@type = @primitive | @reftype;
+@callable = @method | @constructor;
+@element = @file | @package | @primitive | @class | @interface | @method | @constructor | @modifier | @param | @exception | @field |
+ @annotation | @boundedtype | @array | @localvar | @expr | @stmt | @import | @fielddecl;
+
+@modifiable = @member_modifiable| @param | @localvar ;
+
+@member_modifiable = @class | @interface | @method | @constructor | @field ;
+
+@member = @method | @constructor | @field | @reftype ;
+
+@locatable = @file | @class | @interface | @fielddecl | @field | @constructor | @method | @param | @exception
+ | @boundedtype | @typebound | @array | @primitive
+ | @import | @stmt | @expr | @localvar | @javadoc | @javadocTag | @javadocText
+ | @xmllocatable;
+
+@top = @element | @locatable | @folder;
+
+/*
+ * XML Files
+ */
+
+xmlEncoding(
+ unique int id: @file ref,
+ string encoding: string ref
+);
+
+xmlDTDs(
+ unique int id: @xmldtd,
+ string root: string ref,
+ string publicId: string ref,
+ string systemId: string ref,
+ int fileid: @file ref
+);
+
+xmlElements(
+ unique int id: @xmlelement,
+ string name: string ref,
+ int parentid: @xmlparent ref,
+ int idx: int ref,
+ int fileid: @file ref
+);
+
+xmlAttrs(
+ unique int id: @xmlattribute,
+ int elementid: @xmlelement ref,
+ string name: string ref,
+ string value: string ref,
+ int idx: int ref,
+ int fileid: @file ref
+);
+
+xmlNs(
+ int id: @xmlnamespace,
+ string prefixName: string ref,
+ string URI: string ref,
+ int fileid: @file ref
+);
+
+xmlHasNs(
+ int elementId: @xmlnamespaceable ref,
+ int nsId: @xmlnamespace ref,
+ int fileid: @file ref
+);
+
+xmlComments(
+ unique int id: @xmlcomment,
+ string text: string ref,
+ int parentid: @xmlparent ref,
+ int fileid: @file ref
+);
+
+xmlChars(
+ unique int id: @xmlcharacters,
+ string text: string ref,
+ int parentid: @xmlparent ref,
+ int idx: int ref,
+ int isCDATA: int ref,
+ int fileid: @file ref
+);
+
+@xmlparent = @file | @xmlelement;
+@xmlnamespaceable = @xmlelement | @xmlattribute;
+
+xmllocations(
+ int xmlElement: @xmllocatable ref,
+ int location: @location_default ref
+);
+
+@xmllocatable = @xmlcharacters | @xmlelement | @xmlcomment | @xmlattribute | @xmldtd | @file | @xmlnamespace;
+
+/*
+ * configuration files with key value pairs
+ */
+
+configs(
+ unique int id: @config
+);
+
+configNames(
+ unique int id: @configName,
+ int config: @config ref,
+ string name: string ref
+);
+
+configValues(
+ unique int id: @configValue,
+ int config: @config ref,
+ string value: string ref
+);
+
+configLocations(
+ int locatable: @configLocatable ref,
+ int location: @location_default ref
+);
+
+@configLocatable = @config | @configName | @configValue;
diff --git a/java/ql/src/config/semmlecode.dbscheme.stats b/java/ql/lib/config/semmlecode.dbscheme.stats
similarity index 99%
rename from java/ql/src/config/semmlecode.dbscheme.stats
rename to java/ql/lib/config/semmlecode.dbscheme.stats
index cccd0da8b75..ec8f878f38f 100644
--- a/java/ql/src/config/semmlecode.dbscheme.stats
+++ b/java/ql/lib/config/semmlecode.dbscheme.stats
@@ -169,7 +169,7 @@
223232
-@localclassdeclstmt
+@localtypedeclstmt349
@@ -16910,11 +16910,11 @@
-isLocalClass
+isLocalClassOrInterface349
-classid
+typeid349
@@ -16924,7 +16924,7 @@
-classid
+typeidparent
@@ -16941,7 +16941,7 @@
parent
-classid
+typeid12
diff --git a/java/ql/src/default.qll b/java/ql/lib/default.qll
similarity index 100%
rename from java/ql/src/default.qll
rename to java/ql/lib/default.qll
diff --git a/java/ql/src/external/ExternalArtifact.qll b/java/ql/lib/external/ExternalArtifact.qll
similarity index 100%
rename from java/ql/src/external/ExternalArtifact.qll
rename to java/ql/lib/external/ExternalArtifact.qll
diff --git a/java/ql/src/java.qll b/java/ql/lib/java.qll
similarity index 100%
rename from java/ql/src/java.qll
rename to java/ql/lib/java.qll
diff --git a/java/ql/lib/qlpack.lock.yml b/java/ql/lib/qlpack.lock.yml
new file mode 100644
index 00000000000..06dd07fc7dc
--- /dev/null
+++ b/java/ql/lib/qlpack.lock.yml
@@ -0,0 +1,4 @@
+---
+dependencies: {}
+compiled: false
+lockVersion: 1.0.0
diff --git a/java/ql/lib/qlpack.yml b/java/ql/lib/qlpack.yml
new file mode 100644
index 00000000000..eb189236c2a
--- /dev/null
+++ b/java/ql/lib/qlpack.yml
@@ -0,0 +1,7 @@
+name: codeql/java-all
+version: 0.0.2
+dbscheme: config/semmlecode.dbscheme
+extractor: java
+library: true
+dependencies:
+ codeql/java-upgrades: 0.0.2
diff --git a/java/ql/src/semmle/code/FileSystem.qll b/java/ql/lib/semmle/code/FileSystem.qll
similarity index 100%
rename from java/ql/src/semmle/code/FileSystem.qll
rename to java/ql/lib/semmle/code/FileSystem.qll
diff --git a/java/ql/src/semmle/code/Location.qll b/java/ql/lib/semmle/code/Location.qll
similarity index 97%
rename from java/ql/src/semmle/code/Location.qll
rename to java/ql/lib/semmle/code/Location.qll
index e9b808f6bba..9b3b0dbc2e0 100755
--- a/java/ql/src/semmle/code/Location.qll
+++ b/java/ql/lib/semmle/code/Location.qll
@@ -100,6 +100,11 @@ class Top extends @top {
cached
string toString() { hasName(this, result) }
+ /**
+ * Gets a comma-separated list of the names of the primary CodeQL classes to which this element belongs.
+ */
+ final string getPrimaryQlClasses() { result = concat(getAPrimaryQlClass(), ",") }
+
/**
* Gets the name of a primary CodeQL class to which this element belongs.
*
diff --git a/java/ql/src/semmle/code/SMAP.qll b/java/ql/lib/semmle/code/SMAP.qll
similarity index 100%
rename from java/ql/src/semmle/code/SMAP.qll
rename to java/ql/lib/semmle/code/SMAP.qll
diff --git a/java/ql/src/semmle/code/Unit.qll b/java/ql/lib/semmle/code/Unit.qll
similarity index 100%
rename from java/ql/src/semmle/code/Unit.qll
rename to java/ql/lib/semmle/code/Unit.qll
diff --git a/java/ql/src/semmle/code/configfiles/ConfigFiles.qll b/java/ql/lib/semmle/code/configfiles/ConfigFiles.qll
similarity index 100%
rename from java/ql/src/semmle/code/configfiles/ConfigFiles.qll
rename to java/ql/lib/semmle/code/configfiles/ConfigFiles.qll
diff --git a/java/ql/src/semmle/code/java/Annotation.qll b/java/ql/lib/semmle/code/java/Annotation.qll
similarity index 100%
rename from java/ql/src/semmle/code/java/Annotation.qll
rename to java/ql/lib/semmle/code/java/Annotation.qll
diff --git a/java/ql/src/semmle/code/java/Collections.qll b/java/ql/lib/semmle/code/java/Collections.qll
similarity index 100%
rename from java/ql/src/semmle/code/java/Collections.qll
rename to java/ql/lib/semmle/code/java/Collections.qll
diff --git a/java/ql/src/semmle/code/java/CompilationUnit.qll b/java/ql/lib/semmle/code/java/CompilationUnit.qll
similarity index 100%
rename from java/ql/src/semmle/code/java/CompilationUnit.qll
rename to java/ql/lib/semmle/code/java/CompilationUnit.qll
diff --git a/java/ql/src/semmle/code/java/Completion.qll b/java/ql/lib/semmle/code/java/Completion.qll
similarity index 100%
rename from java/ql/src/semmle/code/java/Completion.qll
rename to java/ql/lib/semmle/code/java/Completion.qll
diff --git a/java/ql/src/semmle/code/java/Concurrency.qll b/java/ql/lib/semmle/code/java/Concurrency.qll
similarity index 100%
rename from java/ql/src/semmle/code/java/Concurrency.qll
rename to java/ql/lib/semmle/code/java/Concurrency.qll
diff --git a/java/ql/src/semmle/code/java/ControlFlowGraph.qll b/java/ql/lib/semmle/code/java/ControlFlowGraph.qll
similarity index 99%
rename from java/ql/src/semmle/code/java/ControlFlowGraph.qll
rename to java/ql/lib/semmle/code/java/ControlFlowGraph.qll
index dc38ffb1a8f..ff60abb4e73 100644
--- a/java/ql/src/semmle/code/java/ControlFlowGraph.qll
+++ b/java/ql/lib/semmle/code/java/ControlFlowGraph.qll
@@ -456,7 +456,7 @@ private module ControlFlowGraphImpl {
or
this instanceof EmptyStmt
or
- this instanceof LocalClassDeclStmt
+ this instanceof LocalTypeDeclStmt
or
this instanceof AssertStmt
}
diff --git a/java/ql/src/semmle/code/java/Conversions.qll b/java/ql/lib/semmle/code/java/Conversions.qll
similarity index 100%
rename from java/ql/src/semmle/code/java/Conversions.qll
rename to java/ql/lib/semmle/code/java/Conversions.qll
diff --git a/java/ql/src/semmle/code/java/Dependency.qll b/java/ql/lib/semmle/code/java/Dependency.qll
similarity index 100%
rename from java/ql/src/semmle/code/java/Dependency.qll
rename to java/ql/lib/semmle/code/java/Dependency.qll
diff --git a/java/ql/src/semmle/code/java/DependencyCounts.qll b/java/ql/lib/semmle/code/java/DependencyCounts.qll
similarity index 100%
rename from java/ql/src/semmle/code/java/DependencyCounts.qll
rename to java/ql/lib/semmle/code/java/DependencyCounts.qll
diff --git a/java/ql/src/semmle/code/java/Element.qll b/java/ql/lib/semmle/code/java/Element.qll
similarity index 100%
rename from java/ql/src/semmle/code/java/Element.qll
rename to java/ql/lib/semmle/code/java/Element.qll
diff --git a/java/ql/src/semmle/code/java/Exception.qll b/java/ql/lib/semmle/code/java/Exception.qll
similarity index 100%
rename from java/ql/src/semmle/code/java/Exception.qll
rename to java/ql/lib/semmle/code/java/Exception.qll
diff --git a/java/ql/src/semmle/code/java/Expr.qll b/java/ql/lib/semmle/code/java/Expr.qll
similarity index 100%
rename from java/ql/src/semmle/code/java/Expr.qll
rename to java/ql/lib/semmle/code/java/Expr.qll
diff --git a/java/ql/src/semmle/code/java/GeneratedFiles.qll b/java/ql/lib/semmle/code/java/GeneratedFiles.qll
similarity index 100%
rename from java/ql/src/semmle/code/java/GeneratedFiles.qll
rename to java/ql/lib/semmle/code/java/GeneratedFiles.qll
diff --git a/java/ql/src/semmle/code/java/Generics.qll b/java/ql/lib/semmle/code/java/Generics.qll
similarity index 100%
rename from java/ql/src/semmle/code/java/Generics.qll
rename to java/ql/lib/semmle/code/java/Generics.qll
diff --git a/java/ql/src/semmle/code/java/Import.qll b/java/ql/lib/semmle/code/java/Import.qll
similarity index 100%
rename from java/ql/src/semmle/code/java/Import.qll
rename to java/ql/lib/semmle/code/java/Import.qll
diff --git a/java/ql/src/semmle/code/java/J2EE.qll b/java/ql/lib/semmle/code/java/J2EE.qll
similarity index 100%
rename from java/ql/src/semmle/code/java/J2EE.qll
rename to java/ql/lib/semmle/code/java/J2EE.qll
diff --git a/java/ql/src/semmle/code/java/JDK.qll b/java/ql/lib/semmle/code/java/JDK.qll
similarity index 100%
rename from java/ql/src/semmle/code/java/JDK.qll
rename to java/ql/lib/semmle/code/java/JDK.qll
diff --git a/java/ql/src/semmle/code/java/JDKAnnotations.qll b/java/ql/lib/semmle/code/java/JDKAnnotations.qll
similarity index 100%
rename from java/ql/src/semmle/code/java/JDKAnnotations.qll
rename to java/ql/lib/semmle/code/java/JDKAnnotations.qll
diff --git a/java/ql/src/semmle/code/java/JMX.qll b/java/ql/lib/semmle/code/java/JMX.qll
similarity index 100%
rename from java/ql/src/semmle/code/java/JMX.qll
rename to java/ql/lib/semmle/code/java/JMX.qll
diff --git a/java/ql/src/semmle/code/java/Javadoc.qll b/java/ql/lib/semmle/code/java/Javadoc.qll
similarity index 100%
rename from java/ql/src/semmle/code/java/Javadoc.qll
rename to java/ql/lib/semmle/code/java/Javadoc.qll
diff --git a/java/ql/src/semmle/code/java/Maps.qll b/java/ql/lib/semmle/code/java/Maps.qll
similarity index 100%
rename from java/ql/src/semmle/code/java/Maps.qll
rename to java/ql/lib/semmle/code/java/Maps.qll
diff --git a/java/ql/src/semmle/code/java/Member.qll b/java/ql/lib/semmle/code/java/Member.qll
similarity index 91%
rename from java/ql/src/semmle/code/java/Member.qll
rename to java/ql/lib/semmle/code/java/Member.qll
index de8a6e2a11f..da136c577f8 100755
--- a/java/ql/src/semmle/code/java/Member.qll
+++ b/java/ql/lib/semmle/code/java/Member.qll
@@ -40,12 +40,12 @@ class Member extends Element, Annotatable, Modifiable, @member {
/**
* Gets the immediately enclosing callable, if this member is declared in
- * an anonymous or local class.
+ * an anonymous or local class or interface.
*/
Callable getEnclosingCallable() {
- exists(NestedClass nc | this.getDeclaringType() = nc |
- nc.(AnonymousClass).getClassInstanceExpr().getEnclosingCallable() = result or
- nc.(LocalClass).getLocalClassDeclStmt().getEnclosingCallable() = result
+ exists(NestedType nt | this.getDeclaringType() = nt |
+ nt.(AnonymousClass).getClassInstanceExpr().getEnclosingCallable() = result or
+ nt.(LocalClassOrInterface).getLocalTypeDeclStmt().getEnclosingCallable() = result
)
}
}
@@ -183,14 +183,26 @@ class Callable extends StmtParent, Member, @callable {
Type getParameterType(int n) { params(_, result, n, this, _) }
/**
- * Gets the signature of this callable, including its name and the types of all its parameters,
- * identified by their simple (unqualified) names.
+ * Gets the signature of this callable, including its name and the types of all
+ * its parameters, identified by their simple (unqualified) names.
+ *
+ * The format of the string is ``, where `` is the result of
+ * the predicate `getName()` and `` is the result of `paramsString()`.
+ * For example, the method `void printf(java.lang.String, java.lang.Object...)`
+ * has the string signature `printf(String, Object[])`.
*
* Use `getSignature` to obtain a signature including fully qualified type names.
*/
string getStringSignature() { result = this.getName() + this.paramsString() }
- /** Gets a parenthesized string containing all parameter types of this callable, separated by a comma. */
+ /**
+ * Gets a parenthesized string containing all parameter types of this callable,
+ * separated by a comma and space. For the parameter types the unqualified string
+ * representation is used. If this callable has no parameters, the result is `()`.
+ *
+ * For example, the method `void printf(java.lang.String, java.lang.Object...)`
+ * has the params string `(String, Object[])`.
+ */
pragma[nomagic]
string paramsString() {
exists(int n | n = getNumberOfParameters() |
@@ -210,7 +222,12 @@ class Callable extends StmtParent, Member, @callable {
n > 0 and result = paramUpTo(n - 1) + ", " + getParameterType(n)
}
- /** Holds if this callable has the specified string signature. */
+ /**
+ * Holds if this callable has the specified string signature.
+ *
+ * This predicate simply tests if `sig` is equal to the result of the
+ * `getStringSignature()` predicate.
+ */
predicate hasStringSignature(string sig) { sig = this.getStringSignature() }
/** Gets an exception that occurs in the `throws` clause of this callable. */
@@ -250,8 +267,10 @@ class Callable extends StmtParent, Member, @callable {
/**
* Gets the signature of this callable, where all types in the signature have a fully-qualified name.
+ * The parameter types are only separated by a comma (without space). If this callable has
+ * no parameters, the callable name is followed by `()`.
*
- * For example, method `void m(String s)` has the signature `m(java.lang.String)`.
+ * For example, method `void m(String s, int i)` has the signature `m(java.lang.String,int)`.
*/
string getSignature() {
constrs(this, _, result, _, _, _) or
@@ -581,12 +600,13 @@ class Field extends Member, ExprParent, @field, Variable {
/** Gets the initializer expression of this field, if any. */
override Expr getInitializer() {
- exists(AssignExpr e, InitializerMethod im |
+ exists(AssignExpr e, InitializerMethod im, ExprStmt exprStmt |
e.getDest() = this.getAnAccess() and
e.getSource() = result and
- pragma[only_bind_out](result).getEnclosingCallable() = im and
- // This rules out updates in explicit initializer blocks as they are nested inside the compiler generated initializer blocks.
- pragma[only_bind_out](e.getEnclosingStmt().getParent()) = pragma[only_bind_out](im.getBody())
+ exprStmt.getExpr() = e and
+ // This check also rules out assignments in explicit initializer blocks
+ // (CodeQL models explicit initializer blocks as BlockStmt in initializer methods)
+ exprStmt.getParent() = im.getBody()
)
}
diff --git a/java/ql/src/semmle/code/java/Modifier.qll b/java/ql/lib/semmle/code/java/Modifier.qll
similarity index 100%
rename from java/ql/src/semmle/code/java/Modifier.qll
rename to java/ql/lib/semmle/code/java/Modifier.qll
diff --git a/java/ql/src/semmle/code/java/Modules.qll b/java/ql/lib/semmle/code/java/Modules.qll
similarity index 100%
rename from java/ql/src/semmle/code/java/Modules.qll
rename to java/ql/lib/semmle/code/java/Modules.qll
diff --git a/java/ql/src/semmle/code/java/NumberFormatException.qll b/java/ql/lib/semmle/code/java/NumberFormatException.qll
similarity index 100%
rename from java/ql/src/semmle/code/java/NumberFormatException.qll
rename to java/ql/lib/semmle/code/java/NumberFormatException.qll
diff --git a/java/ql/src/semmle/code/java/Package.qll b/java/ql/lib/semmle/code/java/Package.qll
similarity index 100%
rename from java/ql/src/semmle/code/java/Package.qll
rename to java/ql/lib/semmle/code/java/Package.qll
diff --git a/java/ql/src/semmle/code/java/PrettyPrintAst.qll b/java/ql/lib/semmle/code/java/PrettyPrintAst.qll
similarity index 99%
rename from java/ql/src/semmle/code/java/PrettyPrintAst.qll
rename to java/ql/lib/semmle/code/java/PrettyPrintAst.qll
index 770cac13ec1..45e683a2466 100644
--- a/java/ql/src/semmle/code/java/PrettyPrintAst.qll
+++ b/java/ql/lib/semmle/code/java/PrettyPrintAst.qll
@@ -877,8 +877,8 @@ private class PpLocalVariableDeclStmt extends PpAst, LocalVariableDeclStmt {
}
}
-private class PpLocalClassDeclStmt extends PpAst, LocalClassDeclStmt {
- override PpAst getChild(int i) { i = 0 and result = this.getLocalClass() }
+private class PpLocalTypeDeclStmt extends PpAst, LocalTypeDeclStmt {
+ override PpAst getChild(int i) { i = 0 and result = this.getLocalType() }
}
/*
diff --git a/java/ql/src/semmle/code/java/PrintAst.ql b/java/ql/lib/semmle/code/java/PrintAst.ql
similarity index 100%
rename from java/ql/src/semmle/code/java/PrintAst.ql
rename to java/ql/lib/semmle/code/java/PrintAst.ql
diff --git a/java/ql/src/semmle/code/java/PrintAst.qll b/java/ql/lib/semmle/code/java/PrintAst.qll
similarity index 97%
rename from java/ql/src/semmle/code/java/PrintAst.qll
rename to java/ql/lib/semmle/code/java/PrintAst.qll
index 6a74c15316c..d22065177bc 100644
--- a/java/ql/src/semmle/code/java/PrintAst.qll
+++ b/java/ql/lib/semmle/code/java/PrintAst.qll
@@ -89,7 +89,7 @@ private predicate duplicateMetadata(Field f) {
* Retrieves the canonical QL class(es) for entity `el`
*/
private string getQlClass(Top el) {
- result = "[" + concat(el.getAPrimaryQlClass(), ",") + "] "
+ result = "[" + el.getPrimaryQlClasses() + "] "
// Alternative implementation -- do not delete. It is useful for QL class discovery.
// result = "[" + concat(el.getAQlClass(), ",") + "] "
}
@@ -303,19 +303,25 @@ final class ClassInstanceExprNode extends ExprStmtNode {
}
/**
- * A node representing a `LocalClassDeclStmt`.
+ * A node representing a `LocalTypeDeclStmt`.
*/
-final class LocalClassDeclStmtNode extends ExprStmtNode {
- LocalClassDeclStmtNode() { element instanceof LocalClassDeclStmt }
+final class LocalTypeDeclStmtNode extends ExprStmtNode {
+ LocalTypeDeclStmtNode() { element instanceof LocalTypeDeclStmt }
override ElementNode getChild(int childIndex) {
result = super.getChild(childIndex)
or
childIndex = 0 and
- result.getElement() = element.(LocalClassDeclStmt).getLocalClass()
+ result.getElement() = element.(LocalTypeDeclStmt).getLocalType()
}
}
+/**
+ * DEPRECATED: Renamed `LocalTypeDeclStmtNode` to reflect the fact that
+ * as of Java 16 interfaces can also be declared locally, not just classes.
+ */
+deprecated class LocalClassDeclStmtNode = LocalTypeDeclStmtNode;
+
/**
* A node representing a `ForStmt`.
*/
diff --git a/java/ql/src/semmle/code/java/Reflection.qll b/java/ql/lib/semmle/code/java/Reflection.qll
similarity index 100%
rename from java/ql/src/semmle/code/java/Reflection.qll
rename to java/ql/lib/semmle/code/java/Reflection.qll
diff --git a/java/ql/src/semmle/code/java/Serializability.qll b/java/ql/lib/semmle/code/java/Serializability.qll
similarity index 100%
rename from java/ql/src/semmle/code/java/Serializability.qll
rename to java/ql/lib/semmle/code/java/Serializability.qll
diff --git a/java/ql/src/semmle/code/java/Statement.qll b/java/ql/lib/semmle/code/java/Statement.qll
similarity index 96%
rename from java/ql/src/semmle/code/java/Statement.qll
rename to java/ql/lib/semmle/code/java/Statement.qll
index ddae251a443..a5f9eb81080 100755
--- a/java/ql/src/semmle/code/java/Statement.qll
+++ b/java/ql/lib/semmle/code/java/Statement.qll
@@ -786,20 +786,38 @@ class LocalVariableDeclStmt extends Stmt, @localvariabledeclstmt {
override string getAPrimaryQlClass() { result = "LocalVariableDeclStmt" }
}
-/** A statement that declares a local class. */
-class LocalClassDeclStmt extends Stmt, @localclassdeclstmt {
- /** Gets the local class declared by this statement. */
- LocalClass getLocalClass() { isLocalClass(result, this) }
+/** A statement that declares a local class or interface. */
+class LocalTypeDeclStmt extends Stmt, @localtypedeclstmt {
+ /** Gets the local type declared by this statement. */
+ LocalClassOrInterface getLocalType() { isLocalClassOrInterface(result, this) }
- override string pp() { result = "class " + this.getLocalClass().toString() }
+ /**
+ * DEPRECATED: Renamed `getLocalType` to reflect the fact that
+ * as of Java 16 interfaces can also be declared locally, not just classes.
+ */
+ deprecated LocalClassOrInterface getLocalClass() { result = this.getLocalType() }
- override string toString() { result = "class ..." }
+ private string getDeclKeyword() {
+ result = "class" and this.getLocalType() instanceof Class
+ or
+ result = "interface" and this.getLocalType() instanceof Interface
+ }
- override string getHalsteadID() { result = "LocalClassDeclStmt" }
+ override string pp() { result = this.getDeclKeyword() + " " + this.getLocalType().toString() }
- override string getAPrimaryQlClass() { result = "LocalClassDeclStmt" }
+ override string toString() { result = this.getDeclKeyword() + " ..." }
+
+ override string getHalsteadID() { result = "LocalTypeDeclStmt" }
+
+ override string getAPrimaryQlClass() { result = "LocalTypeDeclStmt" }
}
+/**
+ * DEPRECATED: Renamed `LocalTypeDeclStmt` to reflect the fact that
+ * as of Java 16 interfaces can also be declared locally, not just classes.
+ */
+deprecated class LocalClassDeclStmt = LocalTypeDeclStmt;
+
/** An explicit `this(...)` constructor invocation. */
class ThisConstructorInvocationStmt extends Stmt, ConstructorCall, @constructorinvocationstmt {
/** Gets an argument of this constructor invocation. */
diff --git a/java/ql/src/semmle/code/java/StringFormat.qll b/java/ql/lib/semmle/code/java/StringFormat.qll
similarity index 100%
rename from java/ql/src/semmle/code/java/StringFormat.qll
rename to java/ql/lib/semmle/code/java/StringFormat.qll
diff --git a/java/ql/src/semmle/code/java/Type.qll b/java/ql/lib/semmle/code/java/Type.qll
similarity index 95%
rename from java/ql/src/semmle/code/java/Type.qll
rename to java/ql/lib/semmle/code/java/Type.qll
index 5eaa52ee548..3b05665d055 100755
--- a/java/ql/src/semmle/code/java/Type.qll
+++ b/java/ql/lib/semmle/code/java/Type.qll
@@ -6,8 +6,8 @@
* (`Interface`).
*
* Reference types can be at the top level (`TopLevelType`) or nested (`NestedType`).
- * Classes can also be local (`LocalClass`) or anonymous (`AnonymousClass`).
- * Enumerated types (`EnumType`) are a special kind of class.
+ * Classes and interfaces can also be local (`LocalClassOrInterface`, `LocalClass`) or anonymous (`AnonymousClass`).
+ * Enumerated types (`EnumType`) and records (`Record`) are special kinds of classes.
*/
import Member
@@ -269,7 +269,7 @@ predicate declaresMember(Type t, @member m) {
// Since the type `@member` in the dbscheme includes all `@reftype`s,
// anonymous and local classes need to be excluded here.
not m instanceof AnonymousClass and
- not m instanceof LocalClass
+ not m instanceof LocalClassOrInterface
}
/**
@@ -608,20 +608,10 @@ class SrcRefType extends RefType {
}
/** A class declaration. */
-class Class extends RefType, @class {
+class Class extends ClassOrInterface, @class {
/** Holds if this class is an anonymous class. */
predicate isAnonymous() { isAnonymClass(this, _) }
- /** Holds if this class is a local class. */
- predicate isLocal() { isLocalClass(this, _) }
-
- /** Holds if this class is package protected, that is, neither public nor private nor protected. */
- predicate isPackageProtected() {
- not isPrivate() and
- not isProtected() and
- not isPublic()
- }
-
override RefType getSourceDeclaration() { classes(this, _, _, result) }
/**
@@ -630,11 +620,13 @@ class Class extends RefType, @class {
* Note that a class may inherit annotations from super-classes.
*/
override Annotation getAnAnnotation() {
- result = RefType.super.getAnAnnotation()
+ result = ClassOrInterface.super.getAnAnnotation()
or
exists(AnnotationType tp | tp = result.getType() |
tp.isInherited() and
- not exists(Annotation ann | ann = RefType.super.getAnAnnotation() | ann.getType() = tp) and
+ not exists(Annotation ann | ann = ClassOrInterface.super.getAnAnnotation() |
+ ann.getType() = tp
+ ) and
result = this.getASupertype().(Class).getAnAnnotation()
)
}
@@ -643,8 +635,6 @@ class Class extends RefType, @class {
}
/**
- * PREVIEW FEATURE in Java 14. Subject to removal in a future release.
- *
* A record declaration.
*/
class Record extends Class {
@@ -727,12 +717,25 @@ class AnonymousClass extends NestedClass {
override string getAPrimaryQlClass() { result = "AnonymousClass" }
}
-/** A local class. */
-class LocalClass extends NestedClass {
- LocalClass() { this.isLocal() }
+/** A local class or interface. */
+class LocalClassOrInterface extends NestedType, ClassOrInterface {
+ LocalClassOrInterface() { this.isLocal() }
/** Gets the statement that declares this local class. */
- LocalClassDeclStmt getLocalClassDeclStmt() { isLocalClass(this, result) }
+ LocalTypeDeclStmt getLocalTypeDeclStmt() { isLocalClassOrInterface(this, result) }
+
+ /**
+ * DEPRECATED: renamed `getLocalTypeDeclStmt` to reflect the fact that
+ * as of Java 16 interfaces can also be declared locally.
+ */
+ deprecated LocalTypeDeclStmt getLocalClassDeclStmt() { result = this.getLocalTypeDeclStmt() }
+
+ override string getAPrimaryQlClass() { result = "LocalClassOrInterface" }
+}
+
+/** A local class. */
+class LocalClass extends LocalClassOrInterface, NestedClass {
+ LocalClass() { this.isLocal() }
override string getAPrimaryQlClass() { result = "LocalClass" }
}
@@ -842,12 +845,12 @@ class InnerClass extends NestedClass {
predicate hasEnclosingInstance() {
// JLS 15.9.2. Determining Enclosing Instances
not this.(AnonymousClass).getClassInstanceExpr().isInStaticContext() and
- not this.(LocalClass).getLocalClassDeclStmt().getEnclosingCallable().isStatic()
+ not this.(LocalClass).getLocalTypeDeclStmt().getEnclosingCallable().isStatic()
}
}
/** An interface. */
-class Interface extends RefType, @interface {
+class Interface extends ClassOrInterface, @interface {
override RefType getSourceDeclaration() { interfaces(this, _, _, result) }
override predicate isAbstract() {
@@ -855,21 +858,19 @@ class Interface extends RefType, @interface {
any()
}
- /** Holds if this interface is package protected, that is, neither public nor private nor protected. */
- predicate isPackageProtected() {
- not isPrivate() and
- not isProtected() and
- not isPublic()
- }
-
override string getAPrimaryQlClass() { result = "Interface" }
}
/** A class or interface. */
-class ClassOrInterface extends RefType {
- ClassOrInterface() {
- this instanceof Class or
- this instanceof Interface
+class ClassOrInterface extends RefType, @classorinterface {
+ /** Holds if this class or interface is local. */
+ predicate isLocal() { isLocalClassOrInterface(this, _) }
+
+ /** Holds if this class or interface is package protected, that is, neither public nor private nor protected. */
+ predicate isPackageProtected() {
+ not isPrivate() and
+ not isProtected() and
+ not isPublic()
}
}
diff --git a/java/ql/src/semmle/code/java/UnitTests.qll b/java/ql/lib/semmle/code/java/UnitTests.qll
similarity index 100%
rename from java/ql/src/semmle/code/java/UnitTests.qll
rename to java/ql/lib/semmle/code/java/UnitTests.qll
diff --git a/java/ql/src/semmle/code/java/Variable.qll b/java/ql/lib/semmle/code/java/Variable.qll
similarity index 100%
rename from java/ql/src/semmle/code/java/Variable.qll
rename to java/ql/lib/semmle/code/java/Variable.qll
diff --git a/java/ql/src/semmle/code/java/arithmetic/Overflow.qll b/java/ql/lib/semmle/code/java/arithmetic/Overflow.qll
similarity index 100%
rename from java/ql/src/semmle/code/java/arithmetic/Overflow.qll
rename to java/ql/lib/semmle/code/java/arithmetic/Overflow.qll
diff --git a/java/ql/src/semmle/code/java/comparison/Comparison.qll b/java/ql/lib/semmle/code/java/comparison/Comparison.qll
similarity index 100%
rename from java/ql/src/semmle/code/java/comparison/Comparison.qll
rename to java/ql/lib/semmle/code/java/comparison/Comparison.qll
diff --git a/java/ql/src/semmle/code/java/controlflow/BasicBlocks.qll b/java/ql/lib/semmle/code/java/controlflow/BasicBlocks.qll
similarity index 100%
rename from java/ql/src/semmle/code/java/controlflow/BasicBlocks.qll
rename to java/ql/lib/semmle/code/java/controlflow/BasicBlocks.qll
diff --git a/java/ql/src/semmle/code/java/controlflow/Dominance.qll b/java/ql/lib/semmle/code/java/controlflow/Dominance.qll
similarity index 100%
rename from java/ql/src/semmle/code/java/controlflow/Dominance.qll
rename to java/ql/lib/semmle/code/java/controlflow/Dominance.qll
diff --git a/java/ql/src/semmle/code/java/controlflow/Guards.qll b/java/ql/lib/semmle/code/java/controlflow/Guards.qll
similarity index 100%
rename from java/ql/src/semmle/code/java/controlflow/Guards.qll
rename to java/ql/lib/semmle/code/java/controlflow/Guards.qll
diff --git a/java/ql/src/semmle/code/java/controlflow/Paths.qll b/java/ql/lib/semmle/code/java/controlflow/Paths.qll
similarity index 100%
rename from java/ql/src/semmle/code/java/controlflow/Paths.qll
rename to java/ql/lib/semmle/code/java/controlflow/Paths.qll
diff --git a/java/ql/src/semmle/code/java/controlflow/UnreachableBlocks.qll b/java/ql/lib/semmle/code/java/controlflow/UnreachableBlocks.qll
similarity index 100%
rename from java/ql/src/semmle/code/java/controlflow/UnreachableBlocks.qll
rename to java/ql/lib/semmle/code/java/controlflow/UnreachableBlocks.qll
diff --git a/java/ql/src/semmle/code/java/controlflow/internal/GuardsLogic.qll b/java/ql/lib/semmle/code/java/controlflow/internal/GuardsLogic.qll
similarity index 100%
rename from java/ql/src/semmle/code/java/controlflow/internal/GuardsLogic.qll
rename to java/ql/lib/semmle/code/java/controlflow/internal/GuardsLogic.qll
diff --git a/java/ql/src/semmle/code/java/controlflow/internal/Preconditions.qll b/java/ql/lib/semmle/code/java/controlflow/internal/Preconditions.qll
similarity index 100%
rename from java/ql/src/semmle/code/java/controlflow/internal/Preconditions.qll
rename to java/ql/lib/semmle/code/java/controlflow/internal/Preconditions.qll
diff --git a/java/ql/src/semmle/code/java/controlflow/unreachableblocks/ExcludeDebuggingProfilingLogging.qll b/java/ql/lib/semmle/code/java/controlflow/unreachableblocks/ExcludeDebuggingProfilingLogging.qll
similarity index 100%
rename from java/ql/src/semmle/code/java/controlflow/unreachableblocks/ExcludeDebuggingProfilingLogging.qll
rename to java/ql/lib/semmle/code/java/controlflow/unreachableblocks/ExcludeDebuggingProfilingLogging.qll
diff --git a/java/ql/src/semmle/code/java/dataflow/Bound.qll b/java/ql/lib/semmle/code/java/dataflow/Bound.qll
similarity index 100%
rename from java/ql/src/semmle/code/java/dataflow/Bound.qll
rename to java/ql/lib/semmle/code/java/dataflow/Bound.qll
diff --git a/java/ql/src/semmle/code/java/dataflow/DataFlow.qll b/java/ql/lib/semmle/code/java/dataflow/DataFlow.qll
similarity index 100%
rename from java/ql/src/semmle/code/java/dataflow/DataFlow.qll
rename to java/ql/lib/semmle/code/java/dataflow/DataFlow.qll
diff --git a/java/ql/src/semmle/code/java/dataflow/DataFlow2.qll b/java/ql/lib/semmle/code/java/dataflow/DataFlow2.qll
similarity index 100%
rename from java/ql/src/semmle/code/java/dataflow/DataFlow2.qll
rename to java/ql/lib/semmle/code/java/dataflow/DataFlow2.qll
diff --git a/java/ql/src/semmle/code/java/dataflow/DataFlow3.qll b/java/ql/lib/semmle/code/java/dataflow/DataFlow3.qll
similarity index 100%
rename from java/ql/src/semmle/code/java/dataflow/DataFlow3.qll
rename to java/ql/lib/semmle/code/java/dataflow/DataFlow3.qll
diff --git a/java/ql/src/semmle/code/java/dataflow/DataFlow4.qll b/java/ql/lib/semmle/code/java/dataflow/DataFlow4.qll
similarity index 100%
rename from java/ql/src/semmle/code/java/dataflow/DataFlow4.qll
rename to java/ql/lib/semmle/code/java/dataflow/DataFlow4.qll
diff --git a/java/ql/src/semmle/code/java/dataflow/DataFlow5.qll b/java/ql/lib/semmle/code/java/dataflow/DataFlow5.qll
similarity index 100%
rename from java/ql/src/semmle/code/java/dataflow/DataFlow5.qll
rename to java/ql/lib/semmle/code/java/dataflow/DataFlow5.qll
diff --git a/java/ql/src/semmle/code/java/dataflow/DataFlow6.qll b/java/ql/lib/semmle/code/java/dataflow/DataFlow6.qll
similarity index 100%
rename from java/ql/src/semmle/code/java/dataflow/DataFlow6.qll
rename to java/ql/lib/semmle/code/java/dataflow/DataFlow6.qll
diff --git a/java/ql/src/semmle/code/java/dataflow/DefUse.qll b/java/ql/lib/semmle/code/java/dataflow/DefUse.qll
similarity index 100%
rename from java/ql/src/semmle/code/java/dataflow/DefUse.qll
rename to java/ql/lib/semmle/code/java/dataflow/DefUse.qll
diff --git a/java/ql/src/semmle/code/java/dataflow/ExternalFlow.qll b/java/ql/lib/semmle/code/java/dataflow/ExternalFlow.qll
similarity index 99%
rename from java/ql/src/semmle/code/java/dataflow/ExternalFlow.qll
rename to java/ql/lib/semmle/code/java/dataflow/ExternalFlow.qll
index aae71ce6d9a..de6143154f4 100644
--- a/java/ql/src/semmle/code/java/dataflow/ExternalFlow.qll
+++ b/java/ql/lib/semmle/code/java/dataflow/ExternalFlow.qll
@@ -85,7 +85,9 @@ private module Frameworks {
private import semmle.code.java.frameworks.jackson.JacksonSerializability
private import semmle.code.java.frameworks.JavaxJson
private import semmle.code.java.frameworks.JaxWS
+ private import semmle.code.java.frameworks.JoddJson
private import semmle.code.java.frameworks.JsonJava
+ private import semmle.code.java.frameworks.Objects
private import semmle.code.java.frameworks.Optional
private import semmle.code.java.frameworks.spring.SpringCache
private import semmle.code.java.frameworks.spring.SpringHttp
@@ -95,6 +97,7 @@ private module Frameworks {
private import semmle.code.java.frameworks.spring.SpringWebClient
private import semmle.code.java.frameworks.spring.SpringBeans
private import semmle.code.java.frameworks.spring.SpringWebMultipart
+ private import semmle.code.java.frameworks.spring.SpringWebUtil
private import semmle.code.java.security.ResponseSplitting
private import semmle.code.java.security.InformationLeak
private import semmle.code.java.security.GroovyInjection
diff --git a/java/ql/src/semmle/code/java/dataflow/FlowSources.qll b/java/ql/lib/semmle/code/java/dataflow/FlowSources.qll
similarity index 100%
rename from java/ql/src/semmle/code/java/dataflow/FlowSources.qll
rename to java/ql/lib/semmle/code/java/dataflow/FlowSources.qll
diff --git a/java/ql/src/semmle/code/java/dataflow/FlowSteps.qll b/java/ql/lib/semmle/code/java/dataflow/FlowSteps.qll
similarity index 89%
rename from java/ql/src/semmle/code/java/dataflow/FlowSteps.qll
rename to java/ql/lib/semmle/code/java/dataflow/FlowSteps.qll
index 77bf4625207..5c58658cffd 100644
--- a/java/ql/src/semmle/code/java/dataflow/FlowSteps.qll
+++ b/java/ql/lib/semmle/code/java/dataflow/FlowSteps.qll
@@ -50,27 +50,6 @@ abstract class FluentMethod extends ValuePreservingMethod {
override predicate returnsValue(int arg) { arg = -1 }
}
-private class StandardLibraryValuePreservingMethod extends ValuePreservingMethod {
- int returnsArgNo;
-
- StandardLibraryValuePreservingMethod() {
- this.getDeclaringType().hasQualifiedName("java.util", "Objects") and
- (
- this.hasName(["requireNonNull", "requireNonNullElseGet"]) and returnsArgNo = 0
- or
- this.hasName("requireNonNullElse") and returnsArgNo = [0 .. this.getNumberOfParameters() - 1]
- or
- this.hasName("toString") and returnsArgNo = 1
- )
- or
- this.getDeclaringType().getASourceSupertype*().hasQualifiedName("java.util", "Stack") and
- this.hasName("push") and
- returnsArgNo = 0
- }
-
- override predicate returnsValue(int argNo) { argNo = returnsArgNo }
-}
-
/**
* A unit class for adding additional taint steps.
*
diff --git a/java/ql/src/semmle/code/java/dataflow/FlowSummary.qll b/java/ql/lib/semmle/code/java/dataflow/FlowSummary.qll
similarity index 100%
rename from java/ql/src/semmle/code/java/dataflow/FlowSummary.qll
rename to java/ql/lib/semmle/code/java/dataflow/FlowSummary.qll
diff --git a/java/ql/src/semmle/code/java/dataflow/InstanceAccess.qll b/java/ql/lib/semmle/code/java/dataflow/InstanceAccess.qll
similarity index 100%
rename from java/ql/src/semmle/code/java/dataflow/InstanceAccess.qll
rename to java/ql/lib/semmle/code/java/dataflow/InstanceAccess.qll
diff --git a/java/ql/src/semmle/code/java/dataflow/IntegerGuards.qll b/java/ql/lib/semmle/code/java/dataflow/IntegerGuards.qll
similarity index 100%
rename from java/ql/src/semmle/code/java/dataflow/IntegerGuards.qll
rename to java/ql/lib/semmle/code/java/dataflow/IntegerGuards.qll
diff --git a/java/ql/src/semmle/code/java/dataflow/ModulusAnalysis.qll b/java/ql/lib/semmle/code/java/dataflow/ModulusAnalysis.qll
similarity index 100%
rename from java/ql/src/semmle/code/java/dataflow/ModulusAnalysis.qll
rename to java/ql/lib/semmle/code/java/dataflow/ModulusAnalysis.qll
diff --git a/java/ql/src/semmle/code/java/dataflow/NullGuards.qll b/java/ql/lib/semmle/code/java/dataflow/NullGuards.qll
similarity index 100%
rename from java/ql/src/semmle/code/java/dataflow/NullGuards.qll
rename to java/ql/lib/semmle/code/java/dataflow/NullGuards.qll
diff --git a/java/ql/src/semmle/code/java/dataflow/Nullness.qll b/java/ql/lib/semmle/code/java/dataflow/Nullness.qll
similarity index 100%
rename from java/ql/src/semmle/code/java/dataflow/Nullness.qll
rename to java/ql/lib/semmle/code/java/dataflow/Nullness.qll
diff --git a/java/ql/src/semmle/code/java/dataflow/RangeAnalysis.qll b/java/ql/lib/semmle/code/java/dataflow/RangeAnalysis.qll
similarity index 100%
rename from java/ql/src/semmle/code/java/dataflow/RangeAnalysis.qll
rename to java/ql/lib/semmle/code/java/dataflow/RangeAnalysis.qll
diff --git a/java/ql/src/semmle/code/java/dataflow/RangeUtils.qll b/java/ql/lib/semmle/code/java/dataflow/RangeUtils.qll
similarity index 100%
rename from java/ql/src/semmle/code/java/dataflow/RangeUtils.qll
rename to java/ql/lib/semmle/code/java/dataflow/RangeUtils.qll
diff --git a/java/ql/src/semmle/code/java/dataflow/SSA.qll b/java/ql/lib/semmle/code/java/dataflow/SSA.qll
similarity index 99%
rename from java/ql/src/semmle/code/java/dataflow/SSA.qll
rename to java/ql/lib/semmle/code/java/dataflow/SSA.qll
index 81f4a23effb..9a2a1df0915 100644
--- a/java/ql/src/semmle/code/java/dataflow/SSA.qll
+++ b/java/ql/lib/semmle/code/java/dataflow/SSA.qll
@@ -238,7 +238,7 @@ private module SsaImpl {
/** Gets the definition point of a nested class in the parent scope. */
private ControlFlowNode parentDef(NestedClass nc) {
nc.(AnonymousClass).getClassInstanceExpr() = result or
- nc.(LocalClass).getLocalClassDeclStmt() = result
+ nc.(LocalClass).getLocalTypeDeclStmt() = result
}
/**
diff --git a/java/ql/src/semmle/code/java/dataflow/SignAnalysis.qll b/java/ql/lib/semmle/code/java/dataflow/SignAnalysis.qll
similarity index 100%
rename from java/ql/src/semmle/code/java/dataflow/SignAnalysis.qll
rename to java/ql/lib/semmle/code/java/dataflow/SignAnalysis.qll
diff --git a/java/ql/src/semmle/code/java/dataflow/TaintTracking.qll b/java/ql/lib/semmle/code/java/dataflow/TaintTracking.qll
similarity index 100%
rename from java/ql/src/semmle/code/java/dataflow/TaintTracking.qll
rename to java/ql/lib/semmle/code/java/dataflow/TaintTracking.qll
diff --git a/java/ql/src/semmle/code/java/dataflow/TaintTracking2.qll b/java/ql/lib/semmle/code/java/dataflow/TaintTracking2.qll
similarity index 100%
rename from java/ql/src/semmle/code/java/dataflow/TaintTracking2.qll
rename to java/ql/lib/semmle/code/java/dataflow/TaintTracking2.qll
diff --git a/java/ql/src/semmle/code/java/dataflow/TypeFlow.qll b/java/ql/lib/semmle/code/java/dataflow/TypeFlow.qll
similarity index 100%
rename from java/ql/src/semmle/code/java/dataflow/TypeFlow.qll
rename to java/ql/lib/semmle/code/java/dataflow/TypeFlow.qll
diff --git a/java/ql/src/semmle/code/java/dataflow/internal/BaseSSA.qll b/java/ql/lib/semmle/code/java/dataflow/internal/BaseSSA.qll
similarity index 99%
rename from java/ql/src/semmle/code/java/dataflow/internal/BaseSSA.qll
rename to java/ql/lib/semmle/code/java/dataflow/internal/BaseSSA.qll
index d6532823b44..8193a33bcb3 100644
--- a/java/ql/src/semmle/code/java/dataflow/internal/BaseSSA.qll
+++ b/java/ql/lib/semmle/code/java/dataflow/internal/BaseSSA.qll
@@ -79,7 +79,7 @@ private module SsaImpl {
/** Gets the definition point of a nested class in the parent scope. */
private ControlFlowNode parentDef(NestedClass nc) {
nc.(AnonymousClass).getClassInstanceExpr() = result or
- nc.(LocalClass).getLocalClassDeclStmt() = result
+ nc.(LocalClass).getLocalTypeDeclStmt() = result
}
/**
diff --git a/java/ql/src/semmle/code/java/dataflow/internal/ContainerFlow.qll b/java/ql/lib/semmle/code/java/dataflow/internal/ContainerFlow.qll
similarity index 100%
rename from java/ql/src/semmle/code/java/dataflow/internal/ContainerFlow.qll
rename to java/ql/lib/semmle/code/java/dataflow/internal/ContainerFlow.qll
diff --git a/java/ql/src/semmle/code/java/dataflow/internal/DataFlowDispatch.qll b/java/ql/lib/semmle/code/java/dataflow/internal/DataFlowDispatch.qll
similarity index 100%
rename from java/ql/src/semmle/code/java/dataflow/internal/DataFlowDispatch.qll
rename to java/ql/lib/semmle/code/java/dataflow/internal/DataFlowDispatch.qll
diff --git a/java/ql/src/semmle/code/java/dataflow/internal/DataFlowForSerializability.qll b/java/ql/lib/semmle/code/java/dataflow/internal/DataFlowForSerializability.qll
similarity index 100%
rename from java/ql/src/semmle/code/java/dataflow/internal/DataFlowForSerializability.qll
rename to java/ql/lib/semmle/code/java/dataflow/internal/DataFlowForSerializability.qll
diff --git a/java/ql/src/semmle/code/java/dataflow/internal/DataFlowImpl.qll b/java/ql/lib/semmle/code/java/dataflow/internal/DataFlowImpl.qll
similarity index 100%
rename from java/ql/src/semmle/code/java/dataflow/internal/DataFlowImpl.qll
rename to java/ql/lib/semmle/code/java/dataflow/internal/DataFlowImpl.qll
diff --git a/java/ql/src/semmle/code/java/dataflow/internal/DataFlowImpl2.qll b/java/ql/lib/semmle/code/java/dataflow/internal/DataFlowImpl2.qll
similarity index 100%
rename from java/ql/src/semmle/code/java/dataflow/internal/DataFlowImpl2.qll
rename to java/ql/lib/semmle/code/java/dataflow/internal/DataFlowImpl2.qll
diff --git a/java/ql/src/semmle/code/java/dataflow/internal/DataFlowImpl3.qll b/java/ql/lib/semmle/code/java/dataflow/internal/DataFlowImpl3.qll
similarity index 100%
rename from java/ql/src/semmle/code/java/dataflow/internal/DataFlowImpl3.qll
rename to java/ql/lib/semmle/code/java/dataflow/internal/DataFlowImpl3.qll
diff --git a/java/ql/src/semmle/code/java/dataflow/internal/DataFlowImpl4.qll b/java/ql/lib/semmle/code/java/dataflow/internal/DataFlowImpl4.qll
similarity index 100%
rename from java/ql/src/semmle/code/java/dataflow/internal/DataFlowImpl4.qll
rename to java/ql/lib/semmle/code/java/dataflow/internal/DataFlowImpl4.qll
diff --git a/java/ql/src/semmle/code/java/dataflow/internal/DataFlowImpl5.qll b/java/ql/lib/semmle/code/java/dataflow/internal/DataFlowImpl5.qll
similarity index 100%
rename from java/ql/src/semmle/code/java/dataflow/internal/DataFlowImpl5.qll
rename to java/ql/lib/semmle/code/java/dataflow/internal/DataFlowImpl5.qll
diff --git a/java/ql/src/semmle/code/java/dataflow/internal/DataFlowImpl6.qll b/java/ql/lib/semmle/code/java/dataflow/internal/DataFlowImpl6.qll
similarity index 100%
rename from java/ql/src/semmle/code/java/dataflow/internal/DataFlowImpl6.qll
rename to java/ql/lib/semmle/code/java/dataflow/internal/DataFlowImpl6.qll
diff --git a/java/ql/src/semmle/code/java/dataflow/internal/DataFlowImplCommon.qll b/java/ql/lib/semmle/code/java/dataflow/internal/DataFlowImplCommon.qll
similarity index 100%
rename from java/ql/src/semmle/code/java/dataflow/internal/DataFlowImplCommon.qll
rename to java/ql/lib/semmle/code/java/dataflow/internal/DataFlowImplCommon.qll
diff --git a/java/ql/src/semmle/code/java/dataflow/internal/DataFlowImplConsistency.qll b/java/ql/lib/semmle/code/java/dataflow/internal/DataFlowImplConsistency.qll
similarity index 100%
rename from java/ql/src/semmle/code/java/dataflow/internal/DataFlowImplConsistency.qll
rename to java/ql/lib/semmle/code/java/dataflow/internal/DataFlowImplConsistency.qll
diff --git a/java/ql/src/semmle/code/java/dataflow/internal/DataFlowImplForSerializability.qll b/java/ql/lib/semmle/code/java/dataflow/internal/DataFlowImplForSerializability.qll
similarity index 100%
rename from java/ql/src/semmle/code/java/dataflow/internal/DataFlowImplForSerializability.qll
rename to java/ql/lib/semmle/code/java/dataflow/internal/DataFlowImplForSerializability.qll
diff --git a/java/ql/src/semmle/code/java/dataflow/internal/DataFlowImplSpecific.qll b/java/ql/lib/semmle/code/java/dataflow/internal/DataFlowImplSpecific.qll
similarity index 100%
rename from java/ql/src/semmle/code/java/dataflow/internal/DataFlowImplSpecific.qll
rename to java/ql/lib/semmle/code/java/dataflow/internal/DataFlowImplSpecific.qll
diff --git a/java/ql/src/semmle/code/java/dataflow/internal/DataFlowNodes.qll b/java/ql/lib/semmle/code/java/dataflow/internal/DataFlowNodes.qll
similarity index 100%
rename from java/ql/src/semmle/code/java/dataflow/internal/DataFlowNodes.qll
rename to java/ql/lib/semmle/code/java/dataflow/internal/DataFlowNodes.qll
diff --git a/java/ql/src/semmle/code/java/dataflow/internal/DataFlowPrivate.qll b/java/ql/lib/semmle/code/java/dataflow/internal/DataFlowPrivate.qll
similarity index 100%
rename from java/ql/src/semmle/code/java/dataflow/internal/DataFlowPrivate.qll
rename to java/ql/lib/semmle/code/java/dataflow/internal/DataFlowPrivate.qll
diff --git a/java/ql/src/semmle/code/java/dataflow/internal/DataFlowUtil.qll b/java/ql/lib/semmle/code/java/dataflow/internal/DataFlowUtil.qll
similarity index 100%
rename from java/ql/src/semmle/code/java/dataflow/internal/DataFlowUtil.qll
rename to java/ql/lib/semmle/code/java/dataflow/internal/DataFlowUtil.qll
diff --git a/java/ql/src/semmle/code/java/dataflow/internal/FlowSummaryImpl.qll b/java/ql/lib/semmle/code/java/dataflow/internal/FlowSummaryImpl.qll
similarity index 100%
rename from java/ql/src/semmle/code/java/dataflow/internal/FlowSummaryImpl.qll
rename to java/ql/lib/semmle/code/java/dataflow/internal/FlowSummaryImpl.qll
diff --git a/java/ql/src/semmle/code/java/dataflow/internal/FlowSummaryImplSpecific.qll b/java/ql/lib/semmle/code/java/dataflow/internal/FlowSummaryImplSpecific.qll
similarity index 100%
rename from java/ql/src/semmle/code/java/dataflow/internal/FlowSummaryImplSpecific.qll
rename to java/ql/lib/semmle/code/java/dataflow/internal/FlowSummaryImplSpecific.qll
diff --git a/java/ql/src/semmle/code/java/dataflow/internal/TaintTrackingUtil.qll b/java/ql/lib/semmle/code/java/dataflow/internal/TaintTrackingUtil.qll
similarity index 100%
rename from java/ql/src/semmle/code/java/dataflow/internal/TaintTrackingUtil.qll
rename to java/ql/lib/semmle/code/java/dataflow/internal/TaintTrackingUtil.qll
diff --git a/java/ql/src/semmle/code/java/dataflow/internal/rangeanalysis/BoundSpecific.qll b/java/ql/lib/semmle/code/java/dataflow/internal/rangeanalysis/BoundSpecific.qll
similarity index 100%
rename from java/ql/src/semmle/code/java/dataflow/internal/rangeanalysis/BoundSpecific.qll
rename to java/ql/lib/semmle/code/java/dataflow/internal/rangeanalysis/BoundSpecific.qll
diff --git a/java/ql/src/semmle/code/java/dataflow/internal/rangeanalysis/ModulusAnalysisSpecific.qll b/java/ql/lib/semmle/code/java/dataflow/internal/rangeanalysis/ModulusAnalysisSpecific.qll
similarity index 100%
rename from java/ql/src/semmle/code/java/dataflow/internal/rangeanalysis/ModulusAnalysisSpecific.qll
rename to java/ql/lib/semmle/code/java/dataflow/internal/rangeanalysis/ModulusAnalysisSpecific.qll
diff --git a/java/ql/src/semmle/code/java/dataflow/internal/rangeanalysis/Sign.qll b/java/ql/lib/semmle/code/java/dataflow/internal/rangeanalysis/Sign.qll
similarity index 100%
rename from java/ql/src/semmle/code/java/dataflow/internal/rangeanalysis/Sign.qll
rename to java/ql/lib/semmle/code/java/dataflow/internal/rangeanalysis/Sign.qll
diff --git a/java/ql/src/semmle/code/java/dataflow/internal/rangeanalysis/SignAnalysisCommon.qll b/java/ql/lib/semmle/code/java/dataflow/internal/rangeanalysis/SignAnalysisCommon.qll
similarity index 100%
rename from java/ql/src/semmle/code/java/dataflow/internal/rangeanalysis/SignAnalysisCommon.qll
rename to java/ql/lib/semmle/code/java/dataflow/internal/rangeanalysis/SignAnalysisCommon.qll
diff --git a/java/ql/src/semmle/code/java/dataflow/internal/rangeanalysis/SignAnalysisSpecific.qll b/java/ql/lib/semmle/code/java/dataflow/internal/rangeanalysis/SignAnalysisSpecific.qll
similarity index 100%
rename from java/ql/src/semmle/code/java/dataflow/internal/rangeanalysis/SignAnalysisSpecific.qll
rename to java/ql/lib/semmle/code/java/dataflow/internal/rangeanalysis/SignAnalysisSpecific.qll
diff --git a/java/ql/src/semmle/code/java/dataflow/internal/rangeanalysis/SsaReadPositionCommon.qll b/java/ql/lib/semmle/code/java/dataflow/internal/rangeanalysis/SsaReadPositionCommon.qll
similarity index 100%
rename from java/ql/src/semmle/code/java/dataflow/internal/rangeanalysis/SsaReadPositionCommon.qll
rename to java/ql/lib/semmle/code/java/dataflow/internal/rangeanalysis/SsaReadPositionCommon.qll
diff --git a/java/ql/src/semmle/code/java/dataflow/internal/rangeanalysis/SsaReadPositionSpecific.qll b/java/ql/lib/semmle/code/java/dataflow/internal/rangeanalysis/SsaReadPositionSpecific.qll
similarity index 100%
rename from java/ql/src/semmle/code/java/dataflow/internal/rangeanalysis/SsaReadPositionSpecific.qll
rename to java/ql/lib/semmle/code/java/dataflow/internal/rangeanalysis/SsaReadPositionSpecific.qll
diff --git a/java/ql/src/semmle/code/java/dataflow/internal/tainttracking1/TaintTrackingImpl.qll b/java/ql/lib/semmle/code/java/dataflow/internal/tainttracking1/TaintTrackingImpl.qll
similarity index 100%
rename from java/ql/src/semmle/code/java/dataflow/internal/tainttracking1/TaintTrackingImpl.qll
rename to java/ql/lib/semmle/code/java/dataflow/internal/tainttracking1/TaintTrackingImpl.qll
diff --git a/java/ql/src/semmle/code/java/dataflow/internal/tainttracking1/TaintTrackingParameter.qll b/java/ql/lib/semmle/code/java/dataflow/internal/tainttracking1/TaintTrackingParameter.qll
similarity index 100%
rename from java/ql/src/semmle/code/java/dataflow/internal/tainttracking1/TaintTrackingParameter.qll
rename to java/ql/lib/semmle/code/java/dataflow/internal/tainttracking1/TaintTrackingParameter.qll
diff --git a/java/ql/src/semmle/code/java/dataflow/internal/tainttracking2/TaintTrackingImpl.qll b/java/ql/lib/semmle/code/java/dataflow/internal/tainttracking2/TaintTrackingImpl.qll
similarity index 100%
rename from java/ql/src/semmle/code/java/dataflow/internal/tainttracking2/TaintTrackingImpl.qll
rename to java/ql/lib/semmle/code/java/dataflow/internal/tainttracking2/TaintTrackingImpl.qll
diff --git a/java/ql/src/semmle/code/java/dataflow/internal/tainttracking2/TaintTrackingParameter.qll b/java/ql/lib/semmle/code/java/dataflow/internal/tainttracking2/TaintTrackingParameter.qll
similarity index 100%
rename from java/ql/src/semmle/code/java/dataflow/internal/tainttracking2/TaintTrackingParameter.qll
rename to java/ql/lib/semmle/code/java/dataflow/internal/tainttracking2/TaintTrackingParameter.qll
diff --git a/java/ql/src/semmle/code/java/deadcode/DeadCode.qll b/java/ql/lib/semmle/code/java/deadcode/DeadCode.qll
similarity index 100%
rename from java/ql/src/semmle/code/java/deadcode/DeadCode.qll
rename to java/ql/lib/semmle/code/java/deadcode/DeadCode.qll
diff --git a/java/ql/src/semmle/code/java/deadcode/DeadCodeCustomizations.qll b/java/ql/lib/semmle/code/java/deadcode/DeadCodeCustomizations.qll
similarity index 100%
rename from java/ql/src/semmle/code/java/deadcode/DeadCodeCustomizations.qll
rename to java/ql/lib/semmle/code/java/deadcode/DeadCodeCustomizations.qll
diff --git a/java/ql/src/semmle/code/java/deadcode/DeadEnumConstant.qll b/java/ql/lib/semmle/code/java/deadcode/DeadEnumConstant.qll
similarity index 100%
rename from java/ql/src/semmle/code/java/deadcode/DeadEnumConstant.qll
rename to java/ql/lib/semmle/code/java/deadcode/DeadEnumConstant.qll
diff --git a/java/ql/src/semmle/code/java/deadcode/DeadField.qll b/java/ql/lib/semmle/code/java/deadcode/DeadField.qll
similarity index 100%
rename from java/ql/src/semmle/code/java/deadcode/DeadField.qll
rename to java/ql/lib/semmle/code/java/deadcode/DeadField.qll
diff --git a/java/ql/src/semmle/code/java/deadcode/EntryPoints.qll b/java/ql/lib/semmle/code/java/deadcode/EntryPoints.qll
similarity index 100%
rename from java/ql/src/semmle/code/java/deadcode/EntryPoints.qll
rename to java/ql/lib/semmle/code/java/deadcode/EntryPoints.qll
diff --git a/java/ql/src/semmle/code/java/deadcode/SpringEntryPoints.qll b/java/ql/lib/semmle/code/java/deadcode/SpringEntryPoints.qll
similarity index 100%
rename from java/ql/src/semmle/code/java/deadcode/SpringEntryPoints.qll
rename to java/ql/lib/semmle/code/java/deadcode/SpringEntryPoints.qll
diff --git a/java/ql/src/semmle/code/java/deadcode/StrutsEntryPoints.qll b/java/ql/lib/semmle/code/java/deadcode/StrutsEntryPoints.qll
similarity index 100%
rename from java/ql/src/semmle/code/java/deadcode/StrutsEntryPoints.qll
rename to java/ql/lib/semmle/code/java/deadcode/StrutsEntryPoints.qll
diff --git a/java/ql/src/semmle/code/java/deadcode/TestEntryPoints.qll b/java/ql/lib/semmle/code/java/deadcode/TestEntryPoints.qll
similarity index 100%
rename from java/ql/src/semmle/code/java/deadcode/TestEntryPoints.qll
rename to java/ql/lib/semmle/code/java/deadcode/TestEntryPoints.qll
diff --git a/java/ql/src/semmle/code/java/deadcode/WebEntryPoints.qll b/java/ql/lib/semmle/code/java/deadcode/WebEntryPoints.qll
similarity index 100%
rename from java/ql/src/semmle/code/java/deadcode/WebEntryPoints.qll
rename to java/ql/lib/semmle/code/java/deadcode/WebEntryPoints.qll
diff --git a/java/ql/src/semmle/code/java/deadcode/frameworks/CamelEntryPoints.qll b/java/ql/lib/semmle/code/java/deadcode/frameworks/CamelEntryPoints.qll
similarity index 100%
rename from java/ql/src/semmle/code/java/deadcode/frameworks/CamelEntryPoints.qll
rename to java/ql/lib/semmle/code/java/deadcode/frameworks/CamelEntryPoints.qll
diff --git a/java/ql/src/semmle/code/java/deadcode/frameworks/FitNesseEntryPoints.qll b/java/ql/lib/semmle/code/java/deadcode/frameworks/FitNesseEntryPoints.qll
similarity index 100%
rename from java/ql/src/semmle/code/java/deadcode/frameworks/FitNesseEntryPoints.qll
rename to java/ql/lib/semmle/code/java/deadcode/frameworks/FitNesseEntryPoints.qll
diff --git a/java/ql/src/semmle/code/java/deadcode/frameworks/GigaSpacesXAPEntryPoints.qll b/java/ql/lib/semmle/code/java/deadcode/frameworks/GigaSpacesXAPEntryPoints.qll
similarity index 100%
rename from java/ql/src/semmle/code/java/deadcode/frameworks/GigaSpacesXAPEntryPoints.qll
rename to java/ql/lib/semmle/code/java/deadcode/frameworks/GigaSpacesXAPEntryPoints.qll
diff --git a/java/ql/src/semmle/code/java/dispatch/DispatchFlow.qll b/java/ql/lib/semmle/code/java/dispatch/DispatchFlow.qll
similarity index 100%
rename from java/ql/src/semmle/code/java/dispatch/DispatchFlow.qll
rename to java/ql/lib/semmle/code/java/dispatch/DispatchFlow.qll
diff --git a/java/ql/src/semmle/code/java/dispatch/ObjFlow.qll b/java/ql/lib/semmle/code/java/dispatch/ObjFlow.qll
similarity index 100%
rename from java/ql/src/semmle/code/java/dispatch/ObjFlow.qll
rename to java/ql/lib/semmle/code/java/dispatch/ObjFlow.qll
diff --git a/java/ql/src/semmle/code/java/dispatch/VirtualDispatch.qll b/java/ql/lib/semmle/code/java/dispatch/VirtualDispatch.qll
similarity index 100%
rename from java/ql/src/semmle/code/java/dispatch/VirtualDispatch.qll
rename to java/ql/lib/semmle/code/java/dispatch/VirtualDispatch.qll
diff --git a/java/ql/src/semmle/code/java/dispatch/WrappedInvocation.qll b/java/ql/lib/semmle/code/java/dispatch/WrappedInvocation.qll
similarity index 100%
rename from java/ql/src/semmle/code/java/dispatch/WrappedInvocation.qll
rename to java/ql/lib/semmle/code/java/dispatch/WrappedInvocation.qll
diff --git a/java/ql/src/semmle/code/java/frameworks/ApacheHttp.qll b/java/ql/lib/semmle/code/java/frameworks/ApacheHttp.qll
similarity index 100%
rename from java/ql/src/semmle/code/java/frameworks/ApacheHttp.qll
rename to java/ql/lib/semmle/code/java/frameworks/ApacheHttp.qll
diff --git a/java/ql/src/semmle/code/java/frameworks/ApacheLdap.qll b/java/ql/lib/semmle/code/java/frameworks/ApacheLdap.qll
similarity index 100%
rename from java/ql/src/semmle/code/java/frameworks/ApacheLdap.qll
rename to java/ql/lib/semmle/code/java/frameworks/ApacheLdap.qll
diff --git a/java/ql/src/semmle/code/java/frameworks/Assertions.qll b/java/ql/lib/semmle/code/java/frameworks/Assertions.qll
similarity index 100%
rename from java/ql/src/semmle/code/java/frameworks/Assertions.qll
rename to java/ql/lib/semmle/code/java/frameworks/Assertions.qll
diff --git a/java/ql/src/semmle/code/java/frameworks/Camel.qll b/java/ql/lib/semmle/code/java/frameworks/Camel.qll
similarity index 100%
rename from java/ql/src/semmle/code/java/frameworks/Camel.qll
rename to java/ql/lib/semmle/code/java/frameworks/Camel.qll
diff --git a/java/ql/src/semmle/code/java/frameworks/Castor.qll b/java/ql/lib/semmle/code/java/frameworks/Castor.qll
similarity index 100%
rename from java/ql/src/semmle/code/java/frameworks/Castor.qll
rename to java/ql/lib/semmle/code/java/frameworks/Castor.qll
diff --git a/java/ql/src/semmle/code/java/frameworks/Cucumber.qll b/java/ql/lib/semmle/code/java/frameworks/Cucumber.qll
similarity index 100%
rename from java/ql/src/semmle/code/java/frameworks/Cucumber.qll
rename to java/ql/lib/semmle/code/java/frameworks/Cucumber.qll
diff --git a/java/ql/src/semmle/code/java/frameworks/FastJson.qll b/java/ql/lib/semmle/code/java/frameworks/FastJson.qll
similarity index 100%
rename from java/ql/src/semmle/code/java/frameworks/FastJson.qll
rename to java/ql/lib/semmle/code/java/frameworks/FastJson.qll
diff --git a/java/ql/src/semmle/code/java/frameworks/Guice.qll b/java/ql/lib/semmle/code/java/frameworks/Guice.qll
similarity index 100%
rename from java/ql/src/semmle/code/java/frameworks/Guice.qll
rename to java/ql/lib/semmle/code/java/frameworks/Guice.qll
diff --git a/java/ql/src/semmle/code/java/frameworks/HessianBurlap.qll b/java/ql/lib/semmle/code/java/frameworks/HessianBurlap.qll
similarity index 100%
rename from java/ql/src/semmle/code/java/frameworks/HessianBurlap.qll
rename to java/ql/lib/semmle/code/java/frameworks/HessianBurlap.qll
diff --git a/java/ql/src/semmle/code/java/frameworks/Hibernate.qll b/java/ql/lib/semmle/code/java/frameworks/Hibernate.qll
similarity index 100%
rename from java/ql/src/semmle/code/java/frameworks/Hibernate.qll
rename to java/ql/lib/semmle/code/java/frameworks/Hibernate.qll
diff --git a/java/ql/src/semmle/code/java/frameworks/JAXB.qll b/java/ql/lib/semmle/code/java/frameworks/JAXB.qll
similarity index 100%
rename from java/ql/src/semmle/code/java/frameworks/JAXB.qll
rename to java/ql/lib/semmle/code/java/frameworks/JAXB.qll
diff --git a/java/ql/src/semmle/code/java/frameworks/JUnitAnnotations.qll b/java/ql/lib/semmle/code/java/frameworks/JUnitAnnotations.qll
similarity index 100%
rename from java/ql/src/semmle/code/java/frameworks/JUnitAnnotations.qll
rename to java/ql/lib/semmle/code/java/frameworks/JUnitAnnotations.qll
diff --git a/java/ql/src/semmle/code/java/frameworks/JYaml.qll b/java/ql/lib/semmle/code/java/frameworks/JYaml.qll
similarity index 100%
rename from java/ql/src/semmle/code/java/frameworks/JYaml.qll
rename to java/ql/lib/semmle/code/java/frameworks/JYaml.qll
diff --git a/java/ql/src/semmle/code/java/frameworks/Jabsorb.qll b/java/ql/lib/semmle/code/java/frameworks/Jabsorb.qll
similarity index 100%
rename from java/ql/src/semmle/code/java/frameworks/Jabsorb.qll
rename to java/ql/lib/semmle/code/java/frameworks/Jabsorb.qll
diff --git a/java/ql/src/semmle/code/java/frameworks/Jackson.qll b/java/ql/lib/semmle/code/java/frameworks/Jackson.qll
similarity index 100%
rename from java/ql/src/semmle/code/java/frameworks/Jackson.qll
rename to java/ql/lib/semmle/code/java/frameworks/Jackson.qll
diff --git a/java/ql/src/semmle/code/java/frameworks/JavaxAnnotations.qll b/java/ql/lib/semmle/code/java/frameworks/JavaxAnnotations.qll
similarity index 100%
rename from java/ql/src/semmle/code/java/frameworks/JavaxAnnotations.qll
rename to java/ql/lib/semmle/code/java/frameworks/JavaxAnnotations.qll
diff --git a/java/ql/src/semmle/code/java/frameworks/JavaxJson.qll b/java/ql/lib/semmle/code/java/frameworks/JavaxJson.qll
similarity index 100%
rename from java/ql/src/semmle/code/java/frameworks/JavaxJson.qll
rename to java/ql/lib/semmle/code/java/frameworks/JavaxJson.qll
diff --git a/java/ql/src/semmle/code/java/frameworks/JaxWS.qll b/java/ql/lib/semmle/code/java/frameworks/JaxWS.qll
similarity index 100%
rename from java/ql/src/semmle/code/java/frameworks/JaxWS.qll
rename to java/ql/lib/semmle/code/java/frameworks/JaxWS.qll
diff --git a/java/ql/src/semmle/code/java/frameworks/Jdbc.qll b/java/ql/lib/semmle/code/java/frameworks/Jdbc.qll
similarity index 100%
rename from java/ql/src/semmle/code/java/frameworks/Jdbc.qll
rename to java/ql/lib/semmle/code/java/frameworks/Jdbc.qll
diff --git a/java/ql/src/semmle/code/java/frameworks/Jndi.qll b/java/ql/lib/semmle/code/java/frameworks/Jndi.qll
similarity index 100%
rename from java/ql/src/semmle/code/java/frameworks/Jndi.qll
rename to java/ql/lib/semmle/code/java/frameworks/Jndi.qll
diff --git a/java/ql/lib/semmle/code/java/frameworks/JoddJson.qll b/java/ql/lib/semmle/code/java/frameworks/JoddJson.qll
new file mode 100644
index 00000000000..594a353f67b
--- /dev/null
+++ b/java/ql/lib/semmle/code/java/frameworks/JoddJson.qll
@@ -0,0 +1,68 @@
+/**
+ * Provides classes and predicates for working with the Jodd JSON framework.
+ */
+
+import java
+private import semmle.code.java.dataflow.ExternalFlow
+
+/** The class `jodd.json.Parser`. */
+class JoddJsonParser extends RefType {
+ JoddJsonParser() { this.hasQualifiedName("jodd.json", "JsonParser") }
+}
+
+/** A `JsonParser.parse*` deserialization method. */
+class JoddJsonParseMethod extends Method {
+ JoddJsonParseMethod() {
+ this.getDeclaringType() instanceof JoddJsonParser and
+ this.getName().matches("parse%")
+ }
+}
+
+/** The `JsonParser.setClassMetadataName` method. */
+class SetClassMetadataNameMethod extends Method {
+ SetClassMetadataNameMethod() {
+ this.getDeclaringType() instanceof JoddJsonParser and
+ this.hasName("setClassMetadataName")
+ }
+}
+
+/** The `JsonParser.withClassMetadata` method. */
+class WithClassMetadataMethod extends Method {
+ WithClassMetadataMethod() {
+ this.getDeclaringType() instanceof JoddJsonParser and
+ this.hasName("withClassMetadata")
+ }
+}
+
+/** The `JsonParser.allowClass` method. */
+class AllowClassMethod extends Method {
+ AllowClassMethod() {
+ this.getDeclaringType() instanceof JoddJsonParser and
+ this.hasName("allowClass")
+ }
+}
+
+/**
+ * A partial model of jodd.json.JsonParser noting fluent methods.
+ *
+ * This means that DataFlow::localFlow and similar methods are aware
+ * that the result of (e.g.) JsonParser.allowClass is an alias of the
+ * qualifier.
+ */
+private class JsonParserFluentMethods extends SummaryModelCsv {
+ override predicate row(string s) {
+ s =
+ [
+ "jodd.json;JsonParser;false;allowAllClasses;;;Argument[-1];ReturnValue;value",
+ "jodd.json;JsonParser;false;allowClass;;;Argument[-1];ReturnValue;value",
+ "jodd.json;JsonParser;false;lazy;;;Argument[-1];ReturnValue;value",
+ "jodd.json;JsonParser;false;looseMode;;;Argument[-1];ReturnValue;value",
+ "jodd.json;JsonParser;false;map;;;Argument[-1];ReturnValue;value",
+ "jodd.json;JsonParser;false;setClassMetadataName;;;Argument[-1];ReturnValue;value",
+ "jodd.json;JsonParser;false;strictTypes;;;Argument[-1];ReturnValue;value",
+ "jodd.json;JsonParser;false;useAltPaths;;;Argument[-1];ReturnValue;value",
+ "jodd.json;JsonParser;false;withClassMetadata;;;Argument[-1];ReturnValue;value",
+ "jodd.json;JsonParser;false;withValueConverter;;;Argument[-1];ReturnValue;value"
+ ]
+ }
+}
diff --git a/java/ql/src/semmle/code/java/frameworks/JsonIo.qll b/java/ql/lib/semmle/code/java/frameworks/JsonIo.qll
similarity index 100%
rename from java/ql/src/semmle/code/java/frameworks/JsonIo.qll
rename to java/ql/lib/semmle/code/java/frameworks/JsonIo.qll
diff --git a/java/ql/src/semmle/code/java/frameworks/JsonJava.qll b/java/ql/lib/semmle/code/java/frameworks/JsonJava.qll
similarity index 100%
rename from java/ql/src/semmle/code/java/frameworks/JsonJava.qll
rename to java/ql/lib/semmle/code/java/frameworks/JsonJava.qll
diff --git a/java/ql/src/semmle/code/java/frameworks/Kryo.qll b/java/ql/lib/semmle/code/java/frameworks/Kryo.qll
similarity index 100%
rename from java/ql/src/semmle/code/java/frameworks/Kryo.qll
rename to java/ql/lib/semmle/code/java/frameworks/Kryo.qll
diff --git a/java/ql/src/semmle/code/java/frameworks/Lombok.qll b/java/ql/lib/semmle/code/java/frameworks/Lombok.qll
similarity index 100%
rename from java/ql/src/semmle/code/java/frameworks/Lombok.qll
rename to java/ql/lib/semmle/code/java/frameworks/Lombok.qll
diff --git a/java/ql/src/semmle/code/java/frameworks/Mockito.qll b/java/ql/lib/semmle/code/java/frameworks/Mockito.qll
similarity index 100%
rename from java/ql/src/semmle/code/java/frameworks/Mockito.qll
rename to java/ql/lib/semmle/code/java/frameworks/Mockito.qll
diff --git a/java/ql/src/semmle/code/java/frameworks/MyBatis.qll b/java/ql/lib/semmle/code/java/frameworks/MyBatis.qll
similarity index 100%
rename from java/ql/src/semmle/code/java/frameworks/MyBatis.qll
rename to java/ql/lib/semmle/code/java/frameworks/MyBatis.qll
diff --git a/java/ql/src/semmle/code/java/frameworks/Networking.qll b/java/ql/lib/semmle/code/java/frameworks/Networking.qll
similarity index 100%
rename from java/ql/src/semmle/code/java/frameworks/Networking.qll
rename to java/ql/lib/semmle/code/java/frameworks/Networking.qll
diff --git a/java/ql/lib/semmle/code/java/frameworks/Objects.qll b/java/ql/lib/semmle/code/java/frameworks/Objects.qll
new file mode 100644
index 00000000000..acb0aa6e1cf
--- /dev/null
+++ b/java/ql/lib/semmle/code/java/frameworks/Objects.qll
@@ -0,0 +1,17 @@
+/** Definitions of taint steps in Objects class of the JDK */
+
+import java
+private import semmle.code.java.dataflow.ExternalFlow
+
+private class ObjectsSummaryCsv extends SummaryModelCsv {
+ override predicate row(string row) {
+ row =
+ [
+ //`namespace; type; subtypes; name; signature; ext; input; output; kind`
+ "java.util;Objects;false;requireNonNull;;;Argument[0];ReturnValue;value",
+ "java.util;Objects;false;requireNonNullElse;;;Argument[0..1];ReturnValue;value",
+ "java.util;Objects;false;requireNonNullElseGet;;;Argument[0];ReturnValue;value",
+ "java.util;Objects;false;toString;;;Argument[1];ReturnValue;value"
+ ]
+ }
+}
diff --git a/java/ql/src/semmle/code/java/frameworks/Optional.qll b/java/ql/lib/semmle/code/java/frameworks/Optional.qll
similarity index 100%
rename from java/ql/src/semmle/code/java/frameworks/Optional.qll
rename to java/ql/lib/semmle/code/java/frameworks/Optional.qll
diff --git a/java/ql/src/semmle/code/java/frameworks/Properties.qll b/java/ql/lib/semmle/code/java/frameworks/Properties.qll
similarity index 100%
rename from java/ql/src/semmle/code/java/frameworks/Properties.qll
rename to java/ql/lib/semmle/code/java/frameworks/Properties.qll
diff --git a/java/ql/src/semmle/code/java/frameworks/Protobuf.qll b/java/ql/lib/semmle/code/java/frameworks/Protobuf.qll
similarity index 100%
rename from java/ql/src/semmle/code/java/frameworks/Protobuf.qll
rename to java/ql/lib/semmle/code/java/frameworks/Protobuf.qll
diff --git a/java/ql/src/semmle/code/java/frameworks/Rmi.qll b/java/ql/lib/semmle/code/java/frameworks/Rmi.qll
similarity index 100%
rename from java/ql/src/semmle/code/java/frameworks/Rmi.qll
rename to java/ql/lib/semmle/code/java/frameworks/Rmi.qll
diff --git a/java/ql/src/semmle/code/java/frameworks/Selenium.qll b/java/ql/lib/semmle/code/java/frameworks/Selenium.qll
similarity index 100%
rename from java/ql/src/semmle/code/java/frameworks/Selenium.qll
rename to java/ql/lib/semmle/code/java/frameworks/Selenium.qll
diff --git a/java/ql/src/semmle/code/java/frameworks/Servlets.qll b/java/ql/lib/semmle/code/java/frameworks/Servlets.qll
similarity index 100%
rename from java/ql/src/semmle/code/java/frameworks/Servlets.qll
rename to java/ql/lib/semmle/code/java/frameworks/Servlets.qll
diff --git a/java/ql/src/semmle/code/java/frameworks/SnakeYaml.qll b/java/ql/lib/semmle/code/java/frameworks/SnakeYaml.qll
similarity index 100%
rename from java/ql/src/semmle/code/java/frameworks/SnakeYaml.qll
rename to java/ql/lib/semmle/code/java/frameworks/SnakeYaml.qll
diff --git a/java/ql/src/semmle/code/java/frameworks/SpringJdbc.qll b/java/ql/lib/semmle/code/java/frameworks/SpringJdbc.qll
similarity index 100%
rename from java/ql/src/semmle/code/java/frameworks/SpringJdbc.qll
rename to java/ql/lib/semmle/code/java/frameworks/SpringJdbc.qll
diff --git a/java/ql/src/semmle/code/java/frameworks/SpringLdap.qll b/java/ql/lib/semmle/code/java/frameworks/SpringLdap.qll
similarity index 100%
rename from java/ql/src/semmle/code/java/frameworks/SpringLdap.qll
rename to java/ql/lib/semmle/code/java/frameworks/SpringLdap.qll
diff --git a/java/ql/src/semmle/code/java/frameworks/SpringWeb.qll b/java/ql/lib/semmle/code/java/frameworks/SpringWeb.qll
similarity index 100%
rename from java/ql/src/semmle/code/java/frameworks/SpringWeb.qll
rename to java/ql/lib/semmle/code/java/frameworks/SpringWeb.qll
diff --git a/java/ql/src/semmle/code/java/frameworks/Thrift.qll b/java/ql/lib/semmle/code/java/frameworks/Thrift.qll
similarity index 100%
rename from java/ql/src/semmle/code/java/frameworks/Thrift.qll
rename to java/ql/lib/semmle/code/java/frameworks/Thrift.qll
diff --git a/java/ql/src/semmle/code/java/frameworks/UnboundId.qll b/java/ql/lib/semmle/code/java/frameworks/UnboundId.qll
similarity index 100%
rename from java/ql/src/semmle/code/java/frameworks/UnboundId.qll
rename to java/ql/lib/semmle/code/java/frameworks/UnboundId.qll
diff --git a/java/ql/src/semmle/code/java/frameworks/XStream.qll b/java/ql/lib/semmle/code/java/frameworks/XStream.qll
similarity index 100%
rename from java/ql/src/semmle/code/java/frameworks/XStream.qll
rename to java/ql/lib/semmle/code/java/frameworks/XStream.qll
diff --git a/java/ql/src/semmle/code/java/frameworks/YamlBeans.qll b/java/ql/lib/semmle/code/java/frameworks/YamlBeans.qll
similarity index 100%
rename from java/ql/src/semmle/code/java/frameworks/YamlBeans.qll
rename to java/ql/lib/semmle/code/java/frameworks/YamlBeans.qll
diff --git a/java/ql/src/semmle/code/java/frameworks/android/Android.qll b/java/ql/lib/semmle/code/java/frameworks/android/Android.qll
similarity index 100%
rename from java/ql/src/semmle/code/java/frameworks/android/Android.qll
rename to java/ql/lib/semmle/code/java/frameworks/android/Android.qll
diff --git a/java/ql/src/semmle/code/java/frameworks/android/Intent.qll b/java/ql/lib/semmle/code/java/frameworks/android/Intent.qll
similarity index 100%
rename from java/ql/src/semmle/code/java/frameworks/android/Intent.qll
rename to java/ql/lib/semmle/code/java/frameworks/android/Intent.qll
diff --git a/java/ql/src/semmle/code/java/frameworks/android/SQLite.qll b/java/ql/lib/semmle/code/java/frameworks/android/SQLite.qll
similarity index 100%
rename from java/ql/src/semmle/code/java/frameworks/android/SQLite.qll
rename to java/ql/lib/semmle/code/java/frameworks/android/SQLite.qll
diff --git a/java/ql/src/semmle/code/java/frameworks/android/SharedPreferences.qll b/java/ql/lib/semmle/code/java/frameworks/android/SharedPreferences.qll
similarity index 100%
rename from java/ql/src/semmle/code/java/frameworks/android/SharedPreferences.qll
rename to java/ql/lib/semmle/code/java/frameworks/android/SharedPreferences.qll
diff --git a/java/ql/src/semmle/code/java/frameworks/android/WebView.qll b/java/ql/lib/semmle/code/java/frameworks/android/WebView.qll
similarity index 100%
rename from java/ql/src/semmle/code/java/frameworks/android/WebView.qll
rename to java/ql/lib/semmle/code/java/frameworks/android/WebView.qll
diff --git a/java/ql/src/semmle/code/java/frameworks/android/XmlParsing.qll b/java/ql/lib/semmle/code/java/frameworks/android/XmlParsing.qll
similarity index 100%
rename from java/ql/src/semmle/code/java/frameworks/android/XmlParsing.qll
rename to java/ql/lib/semmle/code/java/frameworks/android/XmlParsing.qll
diff --git a/java/ql/src/semmle/code/java/frameworks/android/XssSinks.qll b/java/ql/lib/semmle/code/java/frameworks/android/XssSinks.qll
similarity index 100%
rename from java/ql/src/semmle/code/java/frameworks/android/XssSinks.qll
rename to java/ql/lib/semmle/code/java/frameworks/android/XssSinks.qll
diff --git a/java/ql/lib/semmle/code/java/frameworks/apache/Collections.qll b/java/ql/lib/semmle/code/java/frameworks/apache/Collections.qll
new file mode 100644
index 00000000000..bbda599b911
--- /dev/null
+++ b/java/ql/lib/semmle/code/java/frameworks/apache/Collections.qll
@@ -0,0 +1,616 @@
+/** Definitions related to the Apache Commons Collections library. */
+
+import java
+private import semmle.code.java.dataflow.FlowSteps
+private import semmle.code.java.dataflow.ExternalFlow
+
+/**
+ * The method `isEmpty` in either `org.apache.commons.collections.CollectionUtils`
+ * or `org.apache.commons.collections4.CollectionUtils`.
+ */
+class MethodApacheCollectionsIsEmpty extends Method {
+ MethodApacheCollectionsIsEmpty() {
+ this.getDeclaringType()
+ .hasQualifiedName(["org.apache.commons.collections", "org.apache.commons.collections4"],
+ "CollectionUtils") and
+ this.hasName("isEmpty")
+ }
+}
+
+/**
+ * The method `isNotEmpty` in either `org.apache.commons.collections.CollectionUtils`
+ * or `org.apache.commons.collections4.CollectionUtils`.
+ */
+class MethodApacheCollectionsIsNotEmpty extends Method {
+ MethodApacheCollectionsIsNotEmpty() {
+ this.getDeclaringType()
+ .hasQualifiedName(["org.apache.commons.collections", "org.apache.commons.collections4"],
+ "CollectionUtils") and
+ this.hasName("isNotEmpty")
+ }
+}
+
+/**
+ * Value-propagating models for classes in the package `org.apache.commons.collections4`.
+ */
+private class ApacheCollectionsModel extends SummaryModelCsv {
+ override predicate row(string row) {
+ row =
+ ["org.apache.commons.collections4", "org.apache.commons.collections"] +
+ [
+ // Note that when lambdas are supported we should model things relating to Closure, Factory, Transformer, FluentIterable.forEach, FluentIterable.transform
+ ";ArrayStack;true;peek;;;Element of Argument[-1];ReturnValue;value",
+ ";ArrayStack;true;pop;;;Element of Argument[-1];ReturnValue;value",
+ ";ArrayStack;true;push;;;Argument[0];Element of Argument[-1];value",
+ ";ArrayStack;true;push;;;Argument[0];ReturnValue;value",
+ ";Bag;true;add;;;Argument[0];Element of Argument[-1];value",
+ ";Bag;true;uniqueSet;;;Element of Argument[-1];Element of ReturnValue;value",
+ ";BidiMap;true;getKey;;;MapKey of Argument[-1];ReturnValue;value",
+ ";BidiMap;true;removeValue;;;MapKey of Argument[-1];ReturnValue;value",
+ ";BidiMap;true;inverseBidiMap;;;MapKey of Argument[-1];MapValue of ReturnValue;value",
+ ";BidiMap;true;inverseBidiMap;;;MapValue of Argument[-1];MapKey of ReturnValue;value",
+ ";FluentIterable;true;append;(Object[]);;Element of Argument[-1];Element of ReturnValue;value",
+ ";FluentIterable;true;append;(Object[]);;ArrayElement of Argument[0];Element of ReturnValue;value",
+ ";FluentIterable;true;append;(Iterable);;Element of Argument[-1];Element of ReturnValue;value",
+ ";FluentIterable;true;append;(Iterable);;Element of Argument[0];Element of ReturnValue;value",
+ ";FluentIterable;true;asEnumeration;;;Element of Argument[-1];Element of ReturnValue;value",
+ ";FluentIterable;true;collate;;;Element of Argument[-1];Element of ReturnValue;value",
+ ";FluentIterable;true;collate;;;Element of Argument[0];Element of ReturnValue;value",
+ ";FluentIterable;true;copyInto;;;Element of Argument[-1];Element of Argument[0];value",
+ ";FluentIterable;true;eval;;;Element of Argument[-1];Element of ReturnValue;value",
+ ";FluentIterable;true;filter;;;Element of Argument[-1];Element of ReturnValue;value",
+ ";FluentIterable;true;get;;;Element of Argument[-1];ReturnValue;value",
+ ";FluentIterable;true;limit;;;Element of Argument[-1];Element of ReturnValue;value",
+ ";FluentIterable;true;loop;;;Element of Argument[-1];Element of ReturnValue;value",
+ ";FluentIterable;true;of;(Iterable);;Element of Argument[0];Element of ReturnValue;value",
+ ";FluentIterable;true;of;(Object[]);;ArrayElement of Argument[0];Element of ReturnValue;value",
+ ";FluentIterable;true;of;(Object);;Argument[0];Element of ReturnValue;value",
+ ";FluentIterable;true;reverse;;;Element of Argument[-1];Element of ReturnValue;value",
+ ";FluentIterable;true;skip;;;Element of Argument[-1];Element of ReturnValue;value",
+ ";FluentIterable;true;toArray;;;Element of Argument[-1];ArrayElement of ReturnValue;value",
+ ";FluentIterable;true;toList;;;Element of Argument[-1];Element of ReturnValue;value",
+ ";FluentIterable;true;unique;;;Element of Argument[-1];Element of ReturnValue;value",
+ ";FluentIterable;true;unmodifiable;;;Element of Argument[-1];Element of ReturnValue;value",
+ ";FluentIterable;true;zip;(Iterable);;Element of Argument[-1];Element of ReturnValue;value",
+ ";FluentIterable;true;zip;(Iterable);;Element of Argument[0];Element of ReturnValue;value",
+ ";FluentIterable;true;zip;(Iterable[]);;Element of Argument[-1];Element of ReturnValue;value",
+ ";FluentIterable;true;zip;(Iterable[]);;Element of ArrayElement of Argument[0];Element of ReturnValue;value",
+ ";Get;true;entrySet;;;MapKey of Argument[-1];MapKey of Element of ReturnValue;value",
+ ";Get;true;entrySet;;;MapValue of Argument[-1];MapValue of Element of ReturnValue;value",
+ ";Get;true;get;;;MapValue of Argument[-1];ReturnValue;value",
+ ";Get;true;keySet;();;MapKey of Argument[-1];Element of ReturnValue;value",
+ ";Get;true;values;();;MapValue of Argument[-1];Element of ReturnValue;value",
+ ";Get;true;remove;(Object);;MapValue of Argument[-1];ReturnValue;value",
+ ";IterableGet;true;mapIterator;;;MapKey of Argument[-1];Element of ReturnValue;value",
+ ";IterableGet;true;mapIterator;;;MapValue of Argument[-1];MapValue of ReturnValue;value",
+ ";KeyValue;true;getKey;;;MapKey of Argument[-1];ReturnValue;value",
+ ";KeyValue;true;getValue;;;MapValue of Argument[-1];ReturnValue;value",
+ // Note that MapIterator implements Iterator, so it iterates over the keys of the map.
+ // In order for the models of Iterator to work we have to use Element instead of MapKey for key data.
+ ";MapIterator;true;getKey;;;Element of Argument[-1];ReturnValue;value",
+ ";MapIterator;true;getValue;;;MapValue of Argument[-1];ReturnValue;value",
+ ";MapIterator;true;setValue;;;MapValue of Argument[-1];ReturnValue;value",
+ ";MapIterator;true;setValue;;;Argument[0];MapValue of Argument[-1];value",
+ ";MultiMap;true;get;;;Element of MapValue of Argument[-1];Element of ReturnValue;value",
+ ";MultiMap;true;put;;;Argument[0];MapKey of Argument[-1];value",
+ ";MultiMap;true;put;;;Argument[1];Element of MapValue of Argument[-1];value",
+ ";MultiMap;true;values;;;Element of MapValue of Argument[-1];Element of ReturnValue;value",
+ ";MultiSet$Entry;true;getElement;;;Element of Argument[-1];ReturnValue;value",
+ ";MultiSet;true;add;;;Argument[0];Element of Argument[-1];value",
+ ";MultiSet;true;uniqueSet;;;Element of Argument[-1];Element of ReturnValue;value",
+ ";MultiSet;true;entrySet;;;Element of Argument[-1];Element of Element of ReturnValue;value",
+ ";MultiValuedMap;true;asMap;;;MapKey of Argument[-1];MapKey of ReturnValue;value",
+ ";MultiValuedMap;true;asMap;;;Element of MapValue of Argument[-1];Element of MapValue of ReturnValue;value",
+ ";MultiValuedMap;true;entries;;;MapKey of Argument[-1];MapKey of Element of ReturnValue;value",
+ ";MultiValuedMap;true;entries;;;Element of MapValue of Argument[-1];MapValue of Element of ReturnValue;value",
+ ";MultiValuedMap;true;get;;;Element of MapValue of Argument[-1];Element of ReturnValue;value",
+ ";MultiValuedMap;true;keys;;;MapKey of Argument[-1];Element of ReturnValue;value",
+ ";MultiValuedMap;true;keySet;;;MapKey of Argument[-1];Element of ReturnValue;value",
+ ";MultiValuedMap;true;mapIterator;;;MapKey of Argument[-1];Element of ReturnValue;value",
+ ";MultiValuedMap;true;mapIterator;;;Element of MapValue of Argument[-1];MapValue of ReturnValue;value",
+ ";MultiValuedMap;true;put;;;Argument[0];MapKey of Argument[-1];value",
+ ";MultiValuedMap;true;put;;;Argument[1];Element of MapValue of Argument[-1];value",
+ ";MultiValuedMap;true;putAll;(Object,Iterable);;Argument[0];MapKey of Argument[-1];value",
+ ";MultiValuedMap;true;putAll;(Object,Iterable);;Element of Argument[1];Element of MapValue of Argument[-1];value",
+ ";MultiValuedMap;true;putAll;(Map);;MapKey of Argument[0];MapKey of Argument[-1];value",
+ ";MultiValuedMap;true;putAll;(Map);;MapValue of Argument[0];Element of MapValue of Argument[-1];value",
+ ";MultiValuedMap;true;putAll;(MultiValuedMap);;MapKey of Argument[0];MapKey of Argument[-1];value",
+ ";MultiValuedMap;true;putAll;(MultiValuedMap);;Element of MapValue of Argument[0];Element of MapValue of Argument[-1];value",
+ ";MultiValuedMap;true;remove;;;Element of MapValue of Argument[-1];Element of ReturnValue;value",
+ ";MultiValuedMap;true;values;;;Element of MapValue of Argument[-1];Element of ReturnValue;value",
+ ";OrderedIterator;true;previous;;;Element of Argument[-1];ReturnValue;value",
+ ";OrderedMap;true;firstKey;;;MapKey of Argument[-1];ReturnValue;value",
+ ";OrderedMap;true;lastKey;;;MapKey of Argument[-1];ReturnValue;value",
+ ";OrderedMap;true;nextKey;;;MapKey of Argument[-1];ReturnValue;value",
+ ";OrderedMap;true;previousKey;;;MapKey of Argument[-1];ReturnValue;value",
+ ";Put;true;put;;;MapValue of Argument[-1];ReturnValue;value",
+ ";Put;true;put;;;Argument[0];MapKey of Argument[-1];value",
+ ";Put;true;put;;;Argument[1];MapValue of Argument[-1];value",
+ ";Put;true;putAll;(Map);;MapKey of Argument[0];MapKey of Argument[-1];value",
+ ";Put;true;putAll;(Map);;MapValue of Argument[0];MapValue of Argument[-1];value",
+ ";SortedBag;true;first;;;Element of Argument[-1];ReturnValue;value",
+ ";SortedBag;true;last;;;Element of Argument[-1];ReturnValue;value",
+ ";Trie;true;prefixMap;;;MapKey of Argument[-1];MapKey of ReturnValue;value",
+ ";Trie;true;prefixMap;;;MapValue of Argument[-1];MapValue of ReturnValue;value"
+ ]
+ }
+}
+
+/**
+ * Value-propagating models for classes in the package `org.apache.commons.collections4.keyvalue`.
+ */
+private class ApacheKeyValueModel extends SummaryModelCsv {
+ override predicate row(string row) {
+ row =
+ ["org.apache.commons.collections4", "org.apache.commons.collections"] +
+ [
+ ".keyvalue;AbstractKeyValue;true;AbstractKeyValue;;;Argument[0];MapKey of Argument[-1];value",
+ ".keyvalue;AbstractKeyValue;true;AbstractKeyValue;;;Argument[1];MapValue of Argument[-1];value",
+ ".keyvalue;AbstractKeyValue;true;setKey;;;MapKey of Argument[-1];ReturnValue;value",
+ ".keyvalue;AbstractKeyValue;true;setKey;;;Argument[0];MapKey of Argument[-1];value",
+ ".keyvalue;AbstractKeyValue;true;setValue;;;MapValue of Argument[-1];ReturnValue;value",
+ ".keyvalue;AbstractKeyValue;true;setValue;;;Argument[0];MapValue of Argument[-1];value",
+ ".keyvalue;AbstractMapEntry;true;AbstractMapEntry;;;Argument[0];MapKey of Argument[-1];value",
+ ".keyvalue;AbstractMapEntry;true;AbstractMapEntry;;;Argument[1];MapValue of Argument[-1];value",
+ ".keyvalue;AbstractMapEntryDecorator;true;AbstractMapEntryDecorator;;;MapKey of Argument[0];MapKey of Argument[-1];value",
+ ".keyvalue;AbstractMapEntryDecorator;true;AbstractMapEntryDecorator;;;MapValue of Argument[0];MapValue of Argument[-1];value",
+ ".keyvalue;AbstractMapEntryDecorator;true;getMapEntry;;;MapKey of Argument[-1];MapKey of ReturnValue;value",
+ ".keyvalue;AbstractMapEntryDecorator;true;getMapEntry;;;MapValue of Argument[-1];MapValue of ReturnValue;value",
+ ".keyvalue;DefaultKeyValue;true;DefaultKeyValue;(Object,Object);;Argument[0];MapKey of Argument[-1];value",
+ ".keyvalue;DefaultKeyValue;true;DefaultKeyValue;(Object,Object);;Argument[1];MapValue of Argument[-1];value",
+ ".keyvalue;DefaultKeyValue;true;DefaultKeyValue;(KeyValue);;MapKey of Argument[0];MapKey of Argument[-1];value",
+ ".keyvalue;DefaultKeyValue;true;DefaultKeyValue;(KeyValue);;MapValue of Argument[0];MapValue of Argument[-1];value",
+ ".keyvalue;DefaultKeyValue;true;DefaultKeyValue;(Entry);;MapKey of Argument[0];MapKey of Argument[-1];value",
+ ".keyvalue;DefaultKeyValue;true;DefaultKeyValue;(Entry);;MapValue of Argument[0];MapValue of Argument[-1];value",
+ ".keyvalue;DefaultKeyValue;true;toMapEntry;;;MapKey of Argument[-1];MapKey of ReturnValue;value",
+ ".keyvalue;DefaultKeyValue;true;toMapEntry;;;MapValue of Argument[-1];MapValue of ReturnValue;value",
+ ".keyvalue;DefaultMapEntry;true;DefaultMapEntry;(Object,Object);;Argument[0];MapKey of Argument[-1];value",
+ ".keyvalue;DefaultMapEntry;true;DefaultMapEntry;(Object,Object);;Argument[1];MapValue of Argument[-1];value",
+ ".keyvalue;DefaultMapEntry;true;DefaultMapEntry;(KeyValue);;MapKey of Argument[0];MapKey of Argument[-1];value",
+ ".keyvalue;DefaultMapEntry;true;DefaultMapEntry;(KeyValue);;MapValue of Argument[0];MapValue of Argument[-1];value",
+ ".keyvalue;DefaultMapEntry;true;DefaultMapEntry;(Entry);;MapKey of Argument[0];MapKey of Argument[-1];value",
+ ".keyvalue;DefaultMapEntry;true;DefaultMapEntry;(Entry);;MapValue of Argument[0];MapValue of Argument[-1];value",
+ ".keyvalue;TiedMapEntry;true;TiedMapEntry;;;MapValue of Argument[0];MapValue of Argument[-1];value",
+ ".keyvalue;TiedMapEntry;true;TiedMapEntry;;;Argument[1];MapKey of Argument[-1];value",
+ ".keyvalue;UnmodifiableMapEntry;true;UnmodifiableMapEntry;(Object,Object);;Argument[0];MapKey of Argument[-1];value",
+ ".keyvalue;UnmodifiableMapEntry;true;UnmodifiableMapEntry;(Object,Object);;Argument[1];MapValue of Argument[-1];value",
+ ".keyvalue;UnmodifiableMapEntry;true;UnmodifiableMapEntry;(KeyValue);;MapKey of Argument[0];MapKey of Argument[-1];value",
+ ".keyvalue;UnmodifiableMapEntry;true;UnmodifiableMapEntry;(KeyValue);;MapValue of Argument[0];MapValue of Argument[-1];value",
+ ".keyvalue;UnmodifiableMapEntry;true;UnmodifiableMapEntry;(Entry);;MapKey of Argument[0];MapKey of Argument[-1];value",
+ ".keyvalue;UnmodifiableMapEntry;true;UnmodifiableMapEntry;(Entry);;MapValue of Argument[0];MapValue of Argument[-1];value"
+ ]
+ }
+}
+
+/**
+ * Value-propagating models for the class `org.apache.commons.collections4.MapUtils`.
+ */
+private class ApacheMapUtilsModel extends SummaryModelCsv {
+ override predicate row(string row) {
+ row =
+ ["org.apache.commons.collections4", "org.apache.commons.collections"] +
+ [
+ // Note that when lambdas are supported we should have more models for populateMap
+ ";MapUtils;true;emptyIfNull;;;Argument[0];ReturnValue;value",
+ ";MapUtils;true;fixedSizeMap;;;MapKey of Argument[0];MapKey of ReturnValue;value",
+ ";MapUtils;true;fixedSizeMap;;;MapValue of Argument[0];MapValue of ReturnValue;value",
+ ";MapUtils;true;fixedSizeSortedMap;;;MapKey of Argument[0];MapKey of ReturnValue;value",
+ ";MapUtils;true;fixedSizeSortedMap;;;MapValue of Argument[0];MapValue of ReturnValue;value",
+ ";MapUtils;true;getMap;;;MapValue of Argument[0];ReturnValue;value",
+ ";MapUtils;true;getMap;;;Argument[2];ReturnValue;value",
+ ";MapUtils;true;getObject;;;MapValue of Argument[0];ReturnValue;value",
+ ";MapUtils;true;getObject;;;Argument[2];ReturnValue;value",
+ ";MapUtils;true;getString;;;MapValue of Argument[0];ReturnValue;value",
+ ";MapUtils;true;getString;;;Argument[2];ReturnValue;value",
+ ";MapUtils;true;invertMap;;;MapKey of Argument[0];MapValue of ReturnValue;value",
+ ";MapUtils;true;invertMap;;;MapValue of Argument[0];MapKey of ReturnValue;value",
+ ";MapUtils;true;iterableMap;;;MapKey of Argument[0];MapKey of ReturnValue;value",
+ ";MapUtils;true;iterableMap;;;MapValue of Argument[0];MapValue of ReturnValue;value",
+ ";MapUtils;true;iterableSortedMap;;;MapKey of Argument[0];MapKey of ReturnValue;value",
+ ";MapUtils;true;iterableSortedMap;;;MapValue of Argument[0];MapValue of ReturnValue;value",
+ ";MapUtils;true;lazyMap;;;MapKey of Argument[0];MapKey of ReturnValue;value",
+ ";MapUtils;true;lazyMap;;;MapValue of Argument[0];MapValue of ReturnValue;value",
+ ";MapUtils;true;lazySortedMap;;;MapKey of Argument[0];MapKey of ReturnValue;value",
+ ";MapUtils;true;lazySortedMap;;;MapValue of Argument[0];MapValue of ReturnValue;value",
+ ";MapUtils;true;multiValueMap;;;MapKey of Argument[0];MapKey of ReturnValue;value",
+ ";MapUtils;true;multiValueMap;;;MapValue of Argument[0];MapValue of ReturnValue;value",
+ ";MapUtils;true;orderedMap;;;MapKey of Argument[0];MapKey of ReturnValue;value",
+ ";MapUtils;true;orderedMap;;;MapValue of Argument[0];MapValue of ReturnValue;value",
+ ";MapUtils;true;populateMap;(Map,Iterable,Transformer);;Element of Argument[1];MapValue of Argument[0];value",
+ ";MapUtils;true;populateMap;(MultiMap,Iterable,Transformer);;Element of Argument[1];MapValue of Argument[0];value",
+ ";MapUtils;true;predicatedMap;;;MapKey of Argument[0];MapKey of ReturnValue;value",
+ ";MapUtils;true;predicatedMap;;;MapValue of Argument[0];MapValue of ReturnValue;value",
+ ";MapUtils;true;predicatedSortedMap;;;MapKey of Argument[0];MapKey of ReturnValue;value",
+ ";MapUtils;true;predicatedSortedMap;;;MapValue of Argument[0];MapValue of ReturnValue;value",
+ ";MapUtils;true;putAll;;;ArrayElement of Argument[1];MapKey of Argument[0];value",
+ ";MapUtils;true;putAll;;;ArrayElement of Argument[1];MapKey of ReturnValue;value",
+ ";MapUtils;true;putAll;;;ArrayElement of Argument[1];MapValue of Argument[0];value",
+ ";MapUtils;true;putAll;;;ArrayElement of Argument[1];MapValue of ReturnValue;value",
+ ";MapUtils;true;putAll;;;ArrayElement of ArrayElement of Argument[1];MapKey of Argument[0];value",
+ ";MapUtils;true;putAll;;;ArrayElement of ArrayElement of Argument[1];MapKey of ReturnValue;value",
+ ";MapUtils;true;putAll;;;ArrayElement of ArrayElement of Argument[1];MapValue of Argument[0];value",
+ ";MapUtils;true;putAll;;;ArrayElement of ArrayElement of Argument[1];MapValue of ReturnValue;value",
+ ";MapUtils;true;putAll;;;MapKey of ArrayElement of Argument[1];MapKey of Argument[0];value",
+ ";MapUtils;true;putAll;;;MapKey of ArrayElement of Argument[1];MapKey of ReturnValue;value",
+ ";MapUtils;true;putAll;;;MapValue of ArrayElement of Argument[1];MapValue of Argument[0];value",
+ ";MapUtils;true;putAll;;;MapValue of ArrayElement of Argument[1];MapValue of ReturnValue;value",
+ ";MapUtils;true;safeAddToMap;;;Argument[1];MapKey of Argument[0];value",
+ ";MapUtils;true;safeAddToMap;;;Argument[2];MapValue of Argument[0];value",
+ ";MapUtils;true;synchronizedMap;;;MapKey of Argument[0];MapKey of ReturnValue;value",
+ ";MapUtils;true;synchronizedMap;;;MapValue of Argument[0];MapValue of ReturnValue;value",
+ ";MapUtils;true;synchronizedSortedMap;;;MapKey of Argument[0];MapKey of ReturnValue;value",
+ ";MapUtils;true;synchronizedSortedMap;;;MapValue of Argument[0];MapValue of ReturnValue;value",
+ ";MapUtils;true;toMap;;;MapKey of Argument[0];MapKey of ReturnValue;value",
+ ";MapUtils;true;toMap;;;MapValue of Argument[0];MapValue of ReturnValue;value",
+ ";MapUtils;true;transformedMap;;;MapKey of Argument[0];MapKey of ReturnValue;value",
+ ";MapUtils;true;transformedMap;;;MapValue of Argument[0];MapValue of ReturnValue;value",
+ ";MapUtils;true;transformedSortedMap;;;MapKey of Argument[0];MapKey of ReturnValue;value",
+ ";MapUtils;true;transformedSortedMap;;;MapValue of Argument[0];MapValue of ReturnValue;value",
+ ";MapUtils;true;unmodifiableMap;;;MapKey of Argument[0];MapKey of ReturnValue;value",
+ ";MapUtils;true;unmodifiableMap;;;MapValue of Argument[0];MapValue of ReturnValue;value",
+ ";MapUtils;true;unmodifiableSortedMap;;;MapKey of Argument[0];MapKey of ReturnValue;value",
+ ";MapUtils;true;unmodifiableSortedMap;;;MapValue of Argument[0];MapValue of ReturnValue;value"
+ ]
+ }
+}
+
+/**
+ * Value-propagating models for the class `org.apache.commons.collections4.CollectionUtils`.
+ */
+private class ApacheCollectionUtilsModel extends SummaryModelCsv {
+ override predicate row(string row) {
+ row =
+ ["org.apache.commons.collections4", "org.apache.commons.collections"] +
+ [
+ // Note that when lambdas are supported we should have a model for collect, forAllButLastDo, forAllDo, transform
+ ";CollectionUtils;true;addAll;(Collection,Object[]);;ArrayElement of Argument[1];Element of Argument[0];value",
+ ";CollectionUtils;true;addAll;(Collection,Enumeration);;Element of Argument[1];Element of Argument[0];value",
+ ";CollectionUtils;true;addAll;(Collection,Iterable);;Element of Argument[1];Element of Argument[0];value",
+ ";CollectionUtils;true;addAll;(Collection,Iterator);;Element of Argument[1];Element of Argument[0];value",
+ ";CollectionUtils;true;addIgnoreNull;;;Argument[1];Element of Argument[0];value",
+ ";CollectionUtils;true;collate;;;Element of Argument[0];Element of ReturnValue;value",
+ ";CollectionUtils;true;collate;;;Element of Argument[1];Element of ReturnValue;value",
+ ";CollectionUtils;true;disjunction;;;Element of Argument[0];Element of ReturnValue;value",
+ ";CollectionUtils;true;disjunction;;;Element of Argument[1];Element of ReturnValue;value",
+ ";CollectionUtils;true;emptyIfNull;;;Argument[0];ReturnValue;value",
+ ";CollectionUtils;true;extractSingleton;;;Element of Argument[0];ReturnValue;value",
+ ";CollectionUtils;true;find;;;Element of Argument[0];ReturnValue;value",
+ ";CollectionUtils;true;get;(Iterator,int);;Element of Argument[0];ReturnValue;value",
+ ";CollectionUtils;true;get;(Iterable,int);;Element of Argument[0];ReturnValue;value",
+ ";CollectionUtils;true;get;(Map,int);;MapKey of Argument[0];MapKey of ReturnValue;value",
+ ";CollectionUtils;true;get;(Map,int);;MapValue of Argument[0];MapValue of ReturnValue;value",
+ ";CollectionUtils;true;get;(Object,int);;ArrayElement of Argument[0];ReturnValue;value",
+ ";CollectionUtils;true;get;(Object,int);;Element of Argument[0];ReturnValue;value",
+ ";CollectionUtils;true;get;(Object,int);;MapKey of Argument[0];MapKey of ReturnValue;value",
+ ";CollectionUtils;true;get;(Object,int);;MapValue of Argument[0];MapValue of ReturnValue;value",
+ ";CollectionUtils;true;getCardinalityMap;;;Element of Argument[0];MapKey of ReturnValue;value",
+ ";CollectionUtils;true;intersection;;;Element of Argument[0];Element of ReturnValue;value",
+ ";CollectionUtils;true;intersection;;;Element of Argument[1];Element of ReturnValue;value",
+ ";CollectionUtils;true;permutations;;;Element of Argument[0];Element of Element of ReturnValue;value",
+ ";CollectionUtils;true;predicatedCollection;;;Element of Argument[0];Element of ReturnValue;value",
+ ";CollectionUtils;true;removeAll;;;Element of Argument[0];Element of ReturnValue;value",
+ ";CollectionUtils;true;retainAll;;;Element of Argument[0];Element of ReturnValue;value",
+ ";CollectionUtils;true;select;(Iterable,Predicate);;Element of Argument[0];Element of ReturnValue;value",
+ ";CollectionUtils;true;select;(Iterable,Predicate,Collection);;Element of Argument[0];Element of Argument[2];value",
+ ";CollectionUtils;true;select;(Iterable,Predicate,Collection);;Argument[2];ReturnValue;value",
+ ";CollectionUtils;true;select;(Iterable,Predicate,Collection,Collection);;Element of Argument[0];Element of Argument[2];value",
+ ";CollectionUtils;true;select;(Iterable,Predicate,Collection,Collection);;Element of Argument[0];Element of Argument[3];value",
+ ";CollectionUtils;true;select;(Iterable,Predicate,Collection,Collection);;Argument[2];ReturnValue;value",
+ ";CollectionUtils;true;selectRejected;(Iterable,Predicate);;Element of Argument[0];Element of ReturnValue;value",
+ ";CollectionUtils;true;selectRejected;(Iterable,Predicate,Collection);;Element of Argument[0];Element of Argument[2];value",
+ ";CollectionUtils;true;selectRejected;(Iterable,Predicate,Collection);;Argument[2];ReturnValue;value",
+ ";CollectionUtils;true;subtract;;;Element of Argument[0];Element of ReturnValue;value",
+ ";CollectionUtils;true;synchronizedCollection;;;Element of Argument[0];Element of ReturnValue;value",
+ // Note that `CollectionUtils.transformingCollection` does not transform existing list elements
+ ";CollectionUtils;true;transformingCollection;;;Element of Argument[0];Element of ReturnValue;value",
+ ";CollectionUtils;true;union;;;Element of Argument[0];Element of ReturnValue;value",
+ ";CollectionUtils;true;union;;;Element of Argument[1];Element of ReturnValue;value",
+ ";CollectionUtils;true;unmodifiableCollection;;;Element of Argument[0];Element of ReturnValue;value"
+ ]
+ }
+}
+
+/**
+ * Value-propagating models for the class `org.apache.commons.collections4.ListUtils`.
+ */
+private class ApacheListUtilsModel extends SummaryModelCsv {
+ override predicate row(string row) {
+ row =
+ ["org.apache.commons.collections4", "org.apache.commons.collections"] +
+ [
+ ";ListUtils;true;defaultIfNull;;;Argument[0];ReturnValue;value",
+ ";ListUtils;true;defaultIfNull;;;Argument[1];ReturnValue;value",
+ ";ListUtils;true;emptyIfNull;;;Argument[0];ReturnValue;value",
+ ";ListUtils;true;fixedSizeList;;;Element of Argument[0];Element of ReturnValue;value",
+ ";ListUtils;true;intersection;;;Element of Argument[0];Element of ReturnValue;value",
+ ";ListUtils;true;intersection;;;Element of Argument[1];Element of ReturnValue;value",
+ // Note that `ListUtils.lazyList` does not transform existing list elements
+ ";ListUtils;true;lazyList;;;Element of Argument[0];Element of ReturnValue;value",
+ ";ListUtils;true;longestCommonSubsequence;(CharSequence,CharSequence);;Argument[0];ReturnValue;taint",
+ ";ListUtils;true;longestCommonSubsequence;(CharSequence,CharSequence);;Argument[1];ReturnValue;taint",
+ ";ListUtils;true;longestCommonSubsequence;(List,List);;Element of Argument[0];Element of ReturnValue;value",
+ ";ListUtils;true;longestCommonSubsequence;(List,List);;Element of Argument[1];Element of ReturnValue;value",
+ ";ListUtils;true;longestCommonSubsequence;(List,List,Equator);;Element of Argument[0];Element of ReturnValue;value",
+ ";ListUtils;true;longestCommonSubsequence;(List,List,Equator);;Element of Argument[1];Element of ReturnValue;value",
+ ";ListUtils;true;partition;;;Element of Argument[0];Element of Element of ReturnValue;value",
+ ";ListUtils;true;predicatedList;;;Element of Argument[0];Element of ReturnValue;value",
+ ";ListUtils;true;removeAll;;;Element of Argument[0];Element of ReturnValue;value",
+ ";ListUtils;true;retainAll;;;Element of Argument[0];Element of ReturnValue;value",
+ ";ListUtils;true;select;;;Element of Argument[0];Element of ReturnValue;value",
+ ";ListUtils;true;selectRejected;;;Element of Argument[0];Element of ReturnValue;value",
+ ";ListUtils;true;subtract;;;Element of Argument[0];Element of ReturnValue;value",
+ ";ListUtils;true;sum;;;Element of Argument[0];Element of ReturnValue;value",
+ ";ListUtils;true;sum;;;Element of Argument[1];Element of ReturnValue;value",
+ ";ListUtils;true;synchronizedList;;;Element of Argument[0];Element of ReturnValue;value",
+ // Note that `ListUtils.transformedList` does not transform existing list elements
+ ";ListUtils;true;transformedList;;;Element of Argument[0];Element of ReturnValue;value",
+ ";ListUtils;true;union;;;Element of Argument[0];Element of ReturnValue;value",
+ ";ListUtils;true;union;;;Element of Argument[1];Element of ReturnValue;value",
+ ";ListUtils;true;unmodifiableList;;;Element of Argument[0];Element of ReturnValue;value"
+ ]
+ }
+}
+
+/**
+ * Value-propagating models for the class `org.apache.commons.collections4.IteratorUtils`.
+ */
+private class ApacheIteratorUtilsModel extends SummaryModelCsv {
+ override predicate row(string row) {
+ row =
+ ["org.apache.commons.collections4", "org.apache.commons.collections"] +
+ [
+ // Note that when lambdas are supported we should have a model for forEach, forEachButLast, transformedIterator
+ ";IteratorUtils;true;arrayIterator;;;ArrayElement of Argument[0];Element of ReturnValue;value",
+ ";IteratorUtils;true;arrayListIterator;;;ArrayElement of Argument[0];Element of ReturnValue;value",
+ ";IteratorUtils;true;asEnumeration;;;Element of Argument[0];Element of ReturnValue;value",
+ ";IteratorUtils;true;asIterable;;;Element of Argument[0];Element of ReturnValue;value",
+ ";IteratorUtils;true;asIterator;;;Element of Argument[0];Element of ReturnValue;value",
+ ";IteratorUtils;true;asMultipleUseIterable;;;Element of Argument[0];Element of ReturnValue;value",
+ ";IteratorUtils;true;boundedIterator;;;Element of Argument[0];Element of ReturnValue;value",
+ ";IteratorUtils;true;chainedIterator;(Collection);;Element of Element of Argument[0];Element of ReturnValue;value",
+ ";IteratorUtils;true;chainedIterator;(Iterator[]);;Element of ArrayElement of Argument[0];Element of ReturnValue;value",
+ ";IteratorUtils;true;chainedIterator;(Iterator,Iterator);;Element of Argument[0];Element of ReturnValue;value",
+ ";IteratorUtils;true;chainedIterator;(Iterator,Iterator);;Element of Argument[1];Element of ReturnValue;value",
+ ";IteratorUtils;true;collatedIterator;(Comparator,Collection);;Element of Element of Argument[1];Element of ReturnValue;value",
+ ";IteratorUtils;true;collatedIterator;(Comparator,Iterator[]);;Element of ArrayElement of Argument[1];Element of ReturnValue;value",
+ ";IteratorUtils;true;collatedIterator;(Comparator,Iterator,Iterator);;Element of Argument[1];Element of ReturnValue;value",
+ ";IteratorUtils;true;collatedIterator;(Comparator,Iterator,Iterator);;Element of Argument[2];Element of ReturnValue;value",
+ ";IteratorUtils;true;filteredIterator;;;Element of Argument[0];Element of ReturnValue;value",
+ ";IteratorUtils;true;filteredListIterator;;;Element of Argument[0];Element of ReturnValue;value",
+ ";IteratorUtils;true;find;;;Element of Argument[0];ReturnValue;value",
+ ";IteratorUtils;true;first;;;Element of Argument[0];ReturnValue;value",
+ ";IteratorUtils;true;forEachButLast;;;Element of Argument[0];ReturnValue;value",
+ ";IteratorUtils;true;get;;;Element of Argument[0];ReturnValue;value",
+ ";IteratorUtils;true;getIterator;;;Element of Argument[0];Element of ReturnValue;value",
+ ";IteratorUtils;true;getIterator;;;ArrayElement of Argument[0];Element of ReturnValue;value",
+ ";IteratorUtils;true;getIterator;;;Argument[0];Element of ReturnValue;value",
+ ";IteratorUtils;true;getIterator;;;MapValue of Argument[0];Element of ReturnValue;value",
+ ";IteratorUtils;true;loopingIterator;;;Element of Argument[0];Element of ReturnValue;value",
+ ";IteratorUtils;true;loopingListIterator;;;Element of Argument[0];Element of ReturnValue;value",
+ ";IteratorUtils;true;peekingIterator;;;Element of Argument[0];Element of ReturnValue;value",
+ ";IteratorUtils;true;pushbackIterator;;;Element of Argument[0];Element of ReturnValue;value",
+ ";IteratorUtils;true;singletonIterator;;;Argument[0];Element of ReturnValue;value",
+ ";IteratorUtils;true;singletonListIterator;;;Argument[0];Element of ReturnValue;value",
+ ";IteratorUtils;true;skippingIterator;;;Element of Argument[0];Element of ReturnValue;value",
+ ";IteratorUtils;true;toArray;;;Element of Argument[0];ArrayElement of ReturnValue;value",
+ ";IteratorUtils;true;toList;;;Element of Argument[0];Element of ReturnValue;value",
+ ";IteratorUtils;true;toListIterator;;;Element of Argument[0];Element of ReturnValue;value",
+ ";IteratorUtils;true;toString;;;Argument[2];ReturnValue;taint",
+ ";IteratorUtils;true;toString;;;Argument[3];ReturnValue;taint",
+ ";IteratorUtils;true;toString;;;Argument[4];ReturnValue;taint",
+ ";IteratorUtils;true;unmodifiableIterator;;;Element of Argument[0];Element of ReturnValue;value",
+ ";IteratorUtils;true;unmodifiableListIterator;;;Element of Argument[0];Element of ReturnValue;value",
+ ";IteratorUtils;true;unmodifiableMapIterator;;;Element of Argument[0];Element of ReturnValue;value",
+ ";IteratorUtils;true;unmodifiableMapIterator;;;MapValue of Argument[0];MapValue of ReturnValue;value",
+ ";IteratorUtils;true;zippingIterator;(Iterator[]);;Element of ArrayElement of Argument[0];Element of ReturnValue;value",
+ ";IteratorUtils;true;zippingIterator;(Iterator,Iterator);;Element of Argument[0];Element of ReturnValue;value",
+ ";IteratorUtils;true;zippingIterator;(Iterator,Iterator);;Element of Argument[1];Element of ReturnValue;value",
+ ";IteratorUtils;true;zippingIterator;(Iterator,Iterator,Iterator);;Element of Argument[0];Element of ReturnValue;value",
+ ";IteratorUtils;true;zippingIterator;(Iterator,Iterator,Iterator);;Element of Argument[1];Element of ReturnValue;value",
+ ";IteratorUtils;true;zippingIterator;(Iterator,Iterator,Iterator);;Element of Argument[2];Element of ReturnValue;value"
+ ]
+ }
+}
+
+/**
+ * Value-propagating models for the class `org.apache.commons.collections4.IterableUtils`.
+ */
+private class ApacheIterableUtilsModel extends SummaryModelCsv {
+ override predicate row(string row) {
+ // Note that when lambdas are supported we should have a model for forEach, forEachButLast, transformedIterable
+ row =
+ ["org.apache.commons.collections4", "org.apache.commons.collections"] +
+ [
+ ";IterableUtils;true;boundedIterable;;;Element of Argument[0];Element of ReturnValue;value",
+ ";IterableUtils;true;chainedIterable;(Iterable[]);;Element of ArrayElement of Argument[0];Element of ReturnValue;value",
+ ";IterableUtils;true;chainedIterable;(Iterable,Iterable);;Element of Argument[0];Element of ReturnValue;value",
+ ";IterableUtils;true;chainedIterable;(Iterable,Iterable);;Element of Argument[1];Element of ReturnValue;value",
+ ";IterableUtils;true;chainedIterable;(Iterable,Iterable,Iterable);;Element of Argument[0];Element of ReturnValue;value",
+ ";IterableUtils;true;chainedIterable;(Iterable,Iterable,Iterable);;Element of Argument[1];Element of ReturnValue;value",
+ ";IterableUtils;true;chainedIterable;(Iterable,Iterable,Iterable);;Element of Argument[2];Element of ReturnValue;value",
+ ";IterableUtils;true;chainedIterable;(Iterable,Iterable,Iterable,Iterable);;Element of Argument[0];Element of ReturnValue;value",
+ ";IterableUtils;true;chainedIterable;(Iterable,Iterable,Iterable,Iterable);;Element of Argument[1];Element of ReturnValue;value",
+ ";IterableUtils;true;chainedIterable;(Iterable,Iterable,Iterable,Iterable);;Element of Argument[2];Element of ReturnValue;value",
+ ";IterableUtils;true;chainedIterable;(Iterable,Iterable,Iterable,Iterable);;Element of Argument[3];Element of ReturnValue;value",
+ ";IterableUtils;true;collatedIterable;(Comparator,Iterable,Iterable);;Element of Argument[1];Element of ReturnValue;value",
+ ";IterableUtils;true;collatedIterable;(Comparator,Iterable,Iterable);;Element of Argument[2];Element of ReturnValue;value",
+ ";IterableUtils;true;collatedIterable;(Iterable,Iterable);;Element of Argument[0];Element of ReturnValue;value",
+ ";IterableUtils;true;collatedIterable;(Iterable,Iterable);;Element of Argument[1];Element of ReturnValue;value",
+ ";IterableUtils;true;emptyIfNull;;;Argument[0];ReturnValue;value",
+ ";IterableUtils;true;filteredIterable;;;Element of Argument[0];Element of ReturnValue;value",
+ ";IterableUtils;true;find;;;Element of Argument[0];ReturnValue;value",
+ ";IterableUtils;true;first;;;Element of Argument[0];ReturnValue;value",
+ ";IterableUtils;true;forEachButLast;;;Element of Argument[0];ReturnValue;value",
+ ";IterableUtils;true;get;;;Element of Argument[0];ReturnValue;value",
+ ";IterableUtils;true;loopingIterable;;;Element of Argument[0];Element of ReturnValue;value",
+ ";IterableUtils;true;partition;;;Element of Argument[0];Element of Element of ReturnValue;value",
+ ";IterableUtils;true;reversedIterable;;;Element of Argument[0];Element of ReturnValue;value",
+ ";IterableUtils;true;skippingIterable;;;Element of Argument[0];Element of ReturnValue;value",
+ ";IterableUtils;true;toList;;;Element of Argument[0];Element of ReturnValue;value",
+ ";IterableUtils;true;toString;;;Argument[2];ReturnValue;taint",
+ ";IterableUtils;true;toString;;;Argument[3];ReturnValue;taint",
+ ";IterableUtils;true;toString;;;Argument[4];ReturnValue;taint",
+ ";IterableUtils;true;uniqueIterable;;;Element of Argument[0];Element of ReturnValue;value",
+ ";IterableUtils;true;unmodifiableIterable;;;Element of Argument[0];Element of ReturnValue;value",
+ ";IterableUtils;true;zippingIterable;;;Element of Argument[0];Element of ReturnValue;value",
+ ";IterableUtils;true;zippingIterable;(Iterable,Iterable[]);;Element of ArrayElement of Argument[1];Element of ReturnValue;value",
+ ";IterableUtils;true;zippingIterable;(Iterable,Iterable);;Element of Argument[1];Element of ReturnValue;value"
+ ]
+ }
+}
+
+/**
+ * Value-propagating models for the class `org.apache.commons.collections4.EnumerationUtils`.
+ */
+private class ApacheEnumerationUtilsModel extends SummaryModelCsv {
+ override predicate row(string row) {
+ row =
+ ["org.apache.commons.collections4", "org.apache.commons.collections"] +
+ [
+ ";EnumerationUtils;true;get;;;Element of Argument[0];ReturnValue;value",
+ ";EnumerationUtils;true;toList;(Enumeration);;Element of Argument[0];Element of ReturnValue;value",
+ ";EnumerationUtils;true;toList;(StringTokenizer);;Argument[0];Element of ReturnValue;taint"
+ ]
+ }
+}
+
+/**
+ * Value-propagating models for the class `org.apache.commons.collections4.MultiMapUtils`.
+ */
+private class ApacheMultiMapUtilsModel extends SummaryModelCsv {
+ override predicate row(string row) {
+ row =
+ ["org.apache.commons.collections4", "org.apache.commons.collections"] +
+ [
+ ";MultiMapUtils;true;emptyIfNull;;;Argument[0];ReturnValue;value",
+ ";MultiMapUtils;true;getCollection;;;MapValue of Argument[0];ReturnValue;value",
+ ";MultiMapUtils;true;getValuesAsBag;;;Element of MapValue of Argument[0];Element of ReturnValue;value",
+ ";MultiMapUtils;true;getValuesAsList;;;Element of MapValue of Argument[0];Element of ReturnValue;value",
+ ";MultiMapUtils;true;getValuesAsSet;;;Element of MapValue of Argument[0];Element of ReturnValue;value",
+ ";MultiMapUtils;true;transformedMultiValuedMap;;;MapKey of Argument[0];MapKey of ReturnValue;value",
+ ";MultiMapUtils;true;transformedMultiValuedMap;;;MapValue of Argument[0];MapValue of ReturnValue;value",
+ ";MultiMapUtils;true;unmodifiableMultiValuedMap;;;MapKey of Argument[0];MapKey of ReturnValue;value",
+ ";MultiMapUtils;true;unmodifiableMultiValuedMap;;;MapValue of Argument[0];MapValue of ReturnValue;value"
+ ]
+ }
+}
+
+/**
+ * Value-propagating models for the class `org.apache.commons.collections4.MultiSetUtils`.
+ */
+private class ApacheMultiSetUtilsModel extends SummaryModelCsv {
+ override predicate row(string row) {
+ row =
+ ["org.apache.commons.collections4", "org.apache.commons.collections"] +
+ [
+ ";MultiSetUtils;true;predicatedMultiSet;;;Element of Argument[0];Element of ReturnValue;value",
+ ";MultiSetUtils;true;synchronizedMultiSet;;;Element of Argument[0];Element of ReturnValue;value",
+ ";MultiSetUtils;true;unmodifiableMultiSet;;;Element of Argument[0];Element of ReturnValue;value"
+ ]
+ }
+}
+
+/**
+ * Value-propagating models for the class `org.apache.commons.collections4.QueueUtils`.
+ */
+private class ApacheQueueUtilsModel extends SummaryModelCsv {
+ override predicate row(string row) {
+ row =
+ ["org.apache.commons.collections4", "org.apache.commons.collections"] +
+ [
+ ";QueueUtils;true;predicatedQueue;;;Element of Argument[0];Element of ReturnValue;value",
+ ";QueueUtils;true;synchronizedQueue;;;Element of Argument[0];Element of ReturnValue;value",
+ ";QueueUtils;true;transformingQueue;;;Element of Argument[0];Element of ReturnValue;value",
+ ";QueueUtils;true;unmodifiableQueue;;;Element of Argument[0];Element of ReturnValue;value"
+ ]
+ }
+}
+
+/**
+ * Value-propagating models for the classes `org.apache.commons.collections4.SetUtils`
+ * and `org.apache.commons.collections4.SetUtils$SetView`.
+ */
+private class ApacheSetUtilsModel extends SummaryModelCsv {
+ override predicate row(string row) {
+ row =
+ ["org.apache.commons.collections4", "org.apache.commons.collections"] +
+ [
+ ";SetUtils$SetView;true;copyInto;;;Element of Argument[-1];Element of Argument[0];value",
+ ";SetUtils$SetView;true;createIterator;;;Element of Argument[-1];Element of ReturnValue;value",
+ ";SetUtils$SetView;true;toSet;;;Element of Argument[-1];Element of ReturnValue;value",
+ ";SetUtils;true;difference;;;Element of Argument[0];Element of ReturnValue;value",
+ ";SetUtils;true;disjunction;;;Element of Argument[0];Element of ReturnValue;value",
+ ";SetUtils;true;disjunction;;;Element of Argument[1];Element of ReturnValue;value",
+ ";SetUtils;true;emptyIfNull;;;Argument[0];ReturnValue;value",
+ ";SetUtils;true;hashSet;;;ArrayElement of Argument[0];Element of ReturnValue;value",
+ ";SetUtils;true;intersection;;;Element of Argument[0];Element of ReturnValue;value",
+ ";SetUtils;true;intersection;;;Element of Argument[1];Element of ReturnValue;value",
+ ";SetUtils;true;orderedSet;;;Element of Argument[0];Element of ReturnValue;value",
+ ";SetUtils;true;predicatedNavigableSet;;;Element of Argument[0];Element of ReturnValue;value",
+ ";SetUtils;true;predicatedSet;;;Element of Argument[0];Element of ReturnValue;value",
+ ";SetUtils;true;predicatedSortedSet;;;Element of Argument[0];Element of ReturnValue;value",
+ ";SetUtils;true;synchronizedSet;;;Element of Argument[0];Element of ReturnValue;value",
+ ";SetUtils;true;synchronizedSortedSet;;;Element of Argument[0];Element of ReturnValue;value",
+ ";SetUtils;true;transformedNavigableSet;;;Element of Argument[0];Element of ReturnValue;value",
+ ";SetUtils;true;transformedSet;;;Element of Argument[0];Element of ReturnValue;value",
+ ";SetUtils;true;transformedSortedSet;;;Element of Argument[0];Element of ReturnValue;value",
+ ";SetUtils;true;union;;;Element of Argument[0];Element of ReturnValue;value",
+ ";SetUtils;true;union;;;Element of Argument[1];Element of ReturnValue;value",
+ ";SetUtils;true;unmodifiableNavigableSet;;;Element of Argument[0];Element of ReturnValue;value",
+ ";SetUtils;true;unmodifiableSet;(Object[]);;ArrayElement of Argument[0];Element of ReturnValue;value",
+ ";SetUtils;true;unmodifiableSet;(Set);;Element of Argument[0];Element of ReturnValue;value",
+ ";SetUtils;true;unmodifiableSortedSet;;;Element of Argument[0];Element of ReturnValue;value"
+ ]
+ }
+}
+
+/**
+ * Value-propagating models for the class `org.apache.commons.collections4.SplitMapUtils`.
+ */
+private class ApacheSplitMapUtilsModel extends SummaryModelCsv {
+ override predicate row(string row) {
+ row =
+ ["org.apache.commons.collections4", "org.apache.commons.collections"] +
+ [
+ ";SplitMapUtils;true;readableMap;;;MapKey of Argument[0];MapKey of ReturnValue;value",
+ ";SplitMapUtils;true;readableMap;;;MapValue of Argument[0];MapValue of ReturnValue;value",
+ ";SplitMapUtils;true;writableMap;;;MapKey of Argument[0];MapKey of ReturnValue;value",
+ ";SplitMapUtils;true;writableMap;;;MapValue of Argument[0];MapValue of ReturnValue;value"
+ ]
+ }
+}
+
+/**
+ * Value-propagating models for the class `org.apache.commons.collections4.TrieUtils`.
+ */
+private class ApacheTrieUtilsModel extends SummaryModelCsv {
+ override predicate row(string row) {
+ row =
+ ["org.apache.commons.collections4", "org.apache.commons.collections"] +
+ [
+ ";TrieUtils;true;unmodifiableTrie;;;MapKey of Argument[0];MapKey of ReturnValue;value",
+ ";TrieUtils;true;unmodifiableTrie;;;MapValue of Argument[0];MapValue of ReturnValue;value"
+ ]
+ }
+}
+
+/**
+ * Value-propagating models for the class `org.apache.commons.collections4.BagUtils`.
+ */
+private class ApacheBagUtilsModel extends SummaryModelCsv {
+ override predicate row(string row) {
+ row =
+ ["org.apache.commons.collections4", "org.apache.commons.collections"] +
+ [
+ ";BagUtils;true;collectionBag;;;Element of Argument[0];Element of ReturnValue;value",
+ ";BagUtils;true;predicatedBag;;;Element of Argument[0];Element of ReturnValue;value",
+ ";BagUtils;true;predicatedSortedBag;;;Element of Argument[0];Element of ReturnValue;value",
+ ";BagUtils;true;synchronizedBag;;;Element of Argument[0];Element of ReturnValue;value",
+ ";BagUtils;true;synchronizedSortedBag;;;Element of Argument[0];Element of ReturnValue;value",
+ ";BagUtils;true;transformingBag;;;Element of Argument[0];Element of ReturnValue;value",
+ ";BagUtils;true;transformingSortedBag;;;Element of Argument[0];Element of ReturnValue;value",
+ ";BagUtils;true;unmodifiableBag;;;Element of Argument[0];Element of ReturnValue;value",
+ ";BagUtils;true;unmodifiableSortedBag;;;Element of Argument[0];Element of ReturnValue;value"
+ ]
+ }
+}
diff --git a/java/ql/src/semmle/code/java/frameworks/apache/Exec.qll b/java/ql/lib/semmle/code/java/frameworks/apache/Exec.qll
similarity index 100%
rename from java/ql/src/semmle/code/java/frameworks/apache/Exec.qll
rename to java/ql/lib/semmle/code/java/frameworks/apache/Exec.qll
diff --git a/java/ql/src/semmle/code/java/frameworks/apache/Lang.qll b/java/ql/lib/semmle/code/java/frameworks/apache/Lang.qll
similarity index 100%
rename from java/ql/src/semmle/code/java/frameworks/apache/Lang.qll
rename to java/ql/lib/semmle/code/java/frameworks/apache/Lang.qll
diff --git a/java/ql/src/semmle/code/java/frameworks/camel/CamelJavaAnnotations.qll b/java/ql/lib/semmle/code/java/frameworks/camel/CamelJavaAnnotations.qll
similarity index 100%
rename from java/ql/src/semmle/code/java/frameworks/camel/CamelJavaAnnotations.qll
rename to java/ql/lib/semmle/code/java/frameworks/camel/CamelJavaAnnotations.qll
diff --git a/java/ql/src/semmle/code/java/frameworks/camel/CamelJavaDSL.qll b/java/ql/lib/semmle/code/java/frameworks/camel/CamelJavaDSL.qll
similarity index 100%
rename from java/ql/src/semmle/code/java/frameworks/camel/CamelJavaDSL.qll
rename to java/ql/lib/semmle/code/java/frameworks/camel/CamelJavaDSL.qll
diff --git a/java/ql/src/semmle/code/java/frameworks/gigaspaces/GigaSpaces.qll b/java/ql/lib/semmle/code/java/frameworks/gigaspaces/GigaSpaces.qll
similarity index 100%
rename from java/ql/src/semmle/code/java/frameworks/gigaspaces/GigaSpaces.qll
rename to java/ql/lib/semmle/code/java/frameworks/gigaspaces/GigaSpaces.qll
diff --git a/java/ql/src/semmle/code/java/frameworks/google/GoogleHttpClientApi.qll b/java/ql/lib/semmle/code/java/frameworks/google/GoogleHttpClientApi.qll
similarity index 100%
rename from java/ql/src/semmle/code/java/frameworks/google/GoogleHttpClientApi.qll
rename to java/ql/lib/semmle/code/java/frameworks/google/GoogleHttpClientApi.qll
diff --git a/java/ql/src/semmle/code/java/frameworks/guava/Base.qll b/java/ql/lib/semmle/code/java/frameworks/guava/Base.qll
similarity index 99%
rename from java/ql/src/semmle/code/java/frameworks/guava/Base.qll
rename to java/ql/lib/semmle/code/java/frameworks/guava/Base.qll
index 2e5e37a9bfb..c35da02815e 100644
--- a/java/ql/src/semmle/code/java/frameworks/guava/Base.qll
+++ b/java/ql/lib/semmle/code/java/frameworks/guava/Base.qll
@@ -62,7 +62,7 @@ private class GuavaBaseCsv extends SummaryModelCsv {
"com.google.common.base;Converter;true;apply;(Object);;Argument[0];ReturnValue;taint",
"com.google.common.base;Converter;true;convert;(Object);;Argument[0];ReturnValue;taint",
"com.google.common.base;Converter;true;convertAll;(Iterable);;Element of Argument[0];Element of ReturnValue;taint",
- "com.google.common.base;Supplier;true;get;();;Argument[0];ReturnValue;taint",
+ "com.google.common.base;Supplier;true;get;();;Argument[-1];ReturnValue;taint",
"com.google.common.base;Suppliers;false;ofInstance;(Object);;Argument[0];ReturnValue;taint",
"com.google.common.base;Suppliers;false;memoize;(Supplier);;Argument[0];ReturnValue;taint",
"com.google.common.base;Suppliers;false;memoizeWithExpiration;(Supplier,long,TimeUnit);;Argument[0];ReturnValue;taint",
diff --git a/java/ql/lib/semmle/code/java/frameworks/guava/Cache.qll b/java/ql/lib/semmle/code/java/frameworks/guava/Cache.qll
new file mode 100644
index 00000000000..f82e59b902f
--- /dev/null
+++ b/java/ql/lib/semmle/code/java/frameworks/guava/Cache.qll
@@ -0,0 +1,32 @@
+/** Flow steps through methods of `com.google.common.cache` */
+
+import java
+private import semmle.code.java.dataflow.ExternalFlow
+
+private class GuavaBaseCsv extends SummaryModelCsv {
+ override predicate row(string row) {
+ row =
+ [
+ //`namespace; type; subtypes; name; signature; ext; input; output; kind`
+ "com.google.common.cache;Cache;true;asMap;();;MapKey of Argument[-1];MapKey of ReturnValue;value",
+ "com.google.common.cache;Cache;true;asMap;();;MapValue of Argument[-1];MapValue of ReturnValue;value",
+ // lambda flow from Argument[1] not implemented
+ "com.google.common.cache;Cache;true;get;(Object,Callable);;MapValue of Argument[-1];ReturnValue;value",
+ "com.google.common.cache;Cache;true;getIfPresent;(Object);;MapValue of Argument[-1];ReturnValue;value",
+ // the true flow to MapKey of ReturnValue for getAllPresent is the intersection of the these inputs, but intersections cannot be modelled fully accurately.
+ "com.google.common.cache;Cache;true;getAllPresent;(Iterable);;MapKey of Argument[-1];MapKey of ReturnValue;value",
+ "com.google.common.cache;Cache;true;getAllPresent;(Iterable);;Element of Argument[0];MapKey of ReturnValue;value",
+ "com.google.common.cache;Cache;true;getAllPresent;(Iterable);;MapValue of Argument[-1];MapValue of ReturnValue;value",
+ "com.google.common.cache;Cache;true;put;(Object,Object);;Argument[0];MapKey of Argument[-1];value",
+ "com.google.common.cache;Cache;true;put;(Object,Object);;Argument[1];MapValue of Argument[-1];value",
+ "com.google.common.cache;Cache;true;putAll;(Map);;MapKey of Argument[0];MapKey of Argument[-1];value",
+ "com.google.common.cache;Cache;true;putAll;(Map);;MapValue of Argument[0];MapValue of Argument[-1];value",
+ "com.google.common.cache;LoadingCache;true;get;(Object);;MapValue of Argument[-1];ReturnValue;value",
+ "com.google.common.cache;LoadingCache;true;getUnchecked;(Object);;MapValue of Argument[-1];ReturnValue;value",
+ "com.google.common.cache;LoadingCache;true;apply;(Object);;MapValue of Argument[-1];ReturnValue;value",
+ "com.google.common.cache;LoadingCache;true;getAll;(Iterable);;Element of Argument[0];MapKey of ReturnValue;value",
+ "com.google.common.cache;LoadingCache;true;getAll;(Iterable);;Element of Argument[0];MapKey of Argument[-1];value",
+ "com.google.common.cache;LoadingCache;true;getAll;(Iterable);;MapValue of Argument[-1];MapValue of ReturnValue;value"
+ ]
+ }
+}
diff --git a/java/ql/src/semmle/code/java/frameworks/guava/Collections.qll b/java/ql/lib/semmle/code/java/frameworks/guava/Collections.qll
similarity index 100%
rename from java/ql/src/semmle/code/java/frameworks/guava/Collections.qll
rename to java/ql/lib/semmle/code/java/frameworks/guava/Collections.qll
diff --git a/java/ql/src/semmle/code/java/frameworks/guava/Guava.qll b/java/ql/lib/semmle/code/java/frameworks/guava/Guava.qll
similarity index 90%
rename from java/ql/src/semmle/code/java/frameworks/guava/Guava.qll
rename to java/ql/lib/semmle/code/java/frameworks/guava/Guava.qll
index 629ac74b426..d7a4ab959df 100644
--- a/java/ql/src/semmle/code/java/frameworks/guava/Guava.qll
+++ b/java/ql/lib/semmle/code/java/frameworks/guava/Guava.qll
@@ -6,3 +6,4 @@ import java
import Base
import Collections
import IO
+import Cache
diff --git a/java/ql/src/semmle/code/java/frameworks/guava/IO.qll b/java/ql/lib/semmle/code/java/frameworks/guava/IO.qll
similarity index 99%
rename from java/ql/src/semmle/code/java/frameworks/guava/IO.qll
rename to java/ql/lib/semmle/code/java/frameworks/guava/IO.qll
index 60720a941ca..b87d93b19c1 100644
--- a/java/ql/src/semmle/code/java/frameworks/guava/IO.qll
+++ b/java/ql/lib/semmle/code/java/frameworks/guava/IO.qll
@@ -34,7 +34,7 @@ private class GuavaIoCsv extends SummaryModelCsv {
"com.google.common.io;ByteSource;true;slice;(long,long);;Argument[-1];ReturnValue;taint",
"com.google.common.io;ByteSource;true;wrap;(byte[]);;Argument[0];ReturnValue;taint",
"com.google.common.io;ByteStreams;false;copy;(InputStream,OutputStream);;Argument[0];Argument[1];taint",
- "com.google.common.io;ByteStreams;false;copy;(ReadablyByteChannel,WritableByteChannel);;Argument[0];Argument[1];taint",
+ "com.google.common.io;ByteStreams;false;copy;(ReadableByteChannel,WritableByteChannel);;Argument[0];Argument[1];taint",
"com.google.common.io;ByteStreams;false;limit;(InputStream,long);;Argument[0];ReturnValue;taint",
"com.google.common.io;ByteStreams;false;newDataInput;(byte[]);;Argument[0];ReturnValue;taint",
"com.google.common.io;ByteStreams;false;newDataInput;(byte[],int);;Argument[0];ReturnValue;taint",
diff --git a/java/ql/src/semmle/code/java/frameworks/gwt/GWT.qll b/java/ql/lib/semmle/code/java/frameworks/gwt/GWT.qll
similarity index 100%
rename from java/ql/src/semmle/code/java/frameworks/gwt/GWT.qll
rename to java/ql/lib/semmle/code/java/frameworks/gwt/GWT.qll
diff --git a/java/ql/src/semmle/code/java/frameworks/gwt/GwtUiBinder.qll b/java/ql/lib/semmle/code/java/frameworks/gwt/GwtUiBinder.qll
similarity index 100%
rename from java/ql/src/semmle/code/java/frameworks/gwt/GwtUiBinder.qll
rename to java/ql/lib/semmle/code/java/frameworks/gwt/GwtUiBinder.qll
diff --git a/java/ql/src/semmle/code/java/frameworks/gwt/GwtUiBinderXml.qll b/java/ql/lib/semmle/code/java/frameworks/gwt/GwtUiBinderXml.qll
similarity index 100%
rename from java/ql/src/semmle/code/java/frameworks/gwt/GwtUiBinderXml.qll
rename to java/ql/lib/semmle/code/java/frameworks/gwt/GwtUiBinderXml.qll
diff --git a/java/ql/src/semmle/code/java/frameworks/gwt/GwtXml.qll b/java/ql/lib/semmle/code/java/frameworks/gwt/GwtXml.qll
similarity index 100%
rename from java/ql/src/semmle/code/java/frameworks/gwt/GwtXml.qll
rename to java/ql/lib/semmle/code/java/frameworks/gwt/GwtXml.qll
diff --git a/java/ql/src/semmle/code/java/frameworks/j2objc/J2ObjC.qll b/java/ql/lib/semmle/code/java/frameworks/j2objc/J2ObjC.qll
similarity index 100%
rename from java/ql/src/semmle/code/java/frameworks/j2objc/J2ObjC.qll
rename to java/ql/lib/semmle/code/java/frameworks/j2objc/J2ObjC.qll
diff --git a/java/ql/src/semmle/code/java/frameworks/jOOQ.qll b/java/ql/lib/semmle/code/java/frameworks/jOOQ.qll
similarity index 100%
rename from java/ql/src/semmle/code/java/frameworks/jOOQ.qll
rename to java/ql/lib/semmle/code/java/frameworks/jOOQ.qll
diff --git a/java/ql/src/semmle/code/java/frameworks/jackson/JacksonSerializability.qll b/java/ql/lib/semmle/code/java/frameworks/jackson/JacksonSerializability.qll
similarity index 100%
rename from java/ql/src/semmle/code/java/frameworks/jackson/JacksonSerializability.qll
rename to java/ql/lib/semmle/code/java/frameworks/jackson/JacksonSerializability.qll
diff --git a/java/ql/src/semmle/code/java/frameworks/javaee/JavaServerFaces.qll b/java/ql/lib/semmle/code/java/frameworks/javaee/JavaServerFaces.qll
similarity index 100%
rename from java/ql/src/semmle/code/java/frameworks/javaee/JavaServerFaces.qll
rename to java/ql/lib/semmle/code/java/frameworks/javaee/JavaServerFaces.qll
diff --git a/java/ql/src/semmle/code/java/frameworks/javaee/Persistence.qll b/java/ql/lib/semmle/code/java/frameworks/javaee/Persistence.qll
similarity index 100%
rename from java/ql/src/semmle/code/java/frameworks/javaee/Persistence.qll
rename to java/ql/lib/semmle/code/java/frameworks/javaee/Persistence.qll
diff --git a/java/ql/src/semmle/code/java/frameworks/javaee/PersistenceXML.qll b/java/ql/lib/semmle/code/java/frameworks/javaee/PersistenceXML.qll
similarity index 100%
rename from java/ql/src/semmle/code/java/frameworks/javaee/PersistenceXML.qll
rename to java/ql/lib/semmle/code/java/frameworks/javaee/PersistenceXML.qll
diff --git a/java/ql/src/semmle/code/java/frameworks/javaee/ejb/EJB.qll b/java/ql/lib/semmle/code/java/frameworks/javaee/ejb/EJB.qll
similarity index 98%
rename from java/ql/src/semmle/code/java/frameworks/javaee/ejb/EJB.qll
rename to java/ql/lib/semmle/code/java/frameworks/javaee/ejb/EJB.qll
index 54434d895f2..9f180dcd587 100644
--- a/java/ql/src/semmle/code/java/frameworks/javaee/ejb/EJB.qll
+++ b/java/ql/lib/semmle/code/java/frameworks/javaee/ejb/EJB.qll
@@ -234,10 +234,10 @@ abstract class BusinessInterface extends Interface {
abstract SessionEJB getAnEJB();
/** Holds if this business interface is declared local. */
- abstract predicate isLocal();
+ abstract predicate isDeclaredLocal();
/** Holds if this business interface is declared remote. */
- abstract predicate isRemote();
+ abstract predicate isDeclaredRemote();
}
/**
@@ -259,14 +259,14 @@ class XmlSpecifiedBusinessInterface extends BusinessInterface {
)
}
- override predicate isLocal() {
+ override predicate isDeclaredLocal() {
exists(EjbJarXMLFile f |
this.getQualifiedName() =
f.getASessionElement().getABusinessLocalElement().getACharactersSet().getCharacters()
)
}
- override predicate isRemote() {
+ override predicate isDeclaredRemote() {
exists(EjbJarXMLFile f |
this.getQualifiedName() =
f.getASessionElement().getABusinessRemoteElement().getACharactersSet().getCharacters()
@@ -295,9 +295,9 @@ class AnnotatedBusinessInterface extends BusinessInterface {
result.getAnAnnotation().(BusinessInterfaceAnnotation).getANamedType() = this
}
- override predicate isLocal() { this instanceof LocalAnnotatedBusinessInterface }
+ override predicate isDeclaredLocal() { this instanceof LocalAnnotatedBusinessInterface }
- override predicate isRemote() { this instanceof RemoteAnnotatedBusinessInterface }
+ override predicate isDeclaredRemote() { this instanceof RemoteAnnotatedBusinessInterface }
}
/**
@@ -540,7 +540,7 @@ class XmlSpecifiedLocalHomeInterface extends LegacyEjbLocalHomeInterface {
class RemoteInterface extends Interface {
RemoteInterface() {
this instanceof RemoteAnnotatedBusinessInterface or
- this.(XmlSpecifiedBusinessInterface).isRemote() or
+ this.(XmlSpecifiedBusinessInterface).isDeclaredRemote() or
exists(SessionEJB ejb | this = ejb.getARemoteInterface())
}
diff --git a/java/ql/src/semmle/code/java/frameworks/javaee/ejb/EJBJarXML.qll b/java/ql/lib/semmle/code/java/frameworks/javaee/ejb/EJBJarXML.qll
similarity index 100%
rename from java/ql/src/semmle/code/java/frameworks/javaee/ejb/EJBJarXML.qll
rename to java/ql/lib/semmle/code/java/frameworks/javaee/ejb/EJBJarXML.qll
diff --git a/java/ql/src/semmle/code/java/frameworks/javaee/ejb/EJBRestrictions.qll b/java/ql/lib/semmle/code/java/frameworks/javaee/ejb/EJBRestrictions.qll
similarity index 100%
rename from java/ql/src/semmle/code/java/frameworks/javaee/ejb/EJBRestrictions.qll
rename to java/ql/lib/semmle/code/java/frameworks/javaee/ejb/EJBRestrictions.qll
diff --git a/java/ql/src/semmle/code/java/frameworks/javaee/jsf/JSFAnnotations.qll b/java/ql/lib/semmle/code/java/frameworks/javaee/jsf/JSFAnnotations.qll
similarity index 100%
rename from java/ql/src/semmle/code/java/frameworks/javaee/jsf/JSFAnnotations.qll
rename to java/ql/lib/semmle/code/java/frameworks/javaee/jsf/JSFAnnotations.qll
diff --git a/java/ql/src/semmle/code/java/frameworks/javaee/jsf/JSFFacesContextXML.qll b/java/ql/lib/semmle/code/java/frameworks/javaee/jsf/JSFFacesContextXML.qll
similarity index 100%
rename from java/ql/src/semmle/code/java/frameworks/javaee/jsf/JSFFacesContextXML.qll
rename to java/ql/lib/semmle/code/java/frameworks/javaee/jsf/JSFFacesContextXML.qll
diff --git a/java/ql/src/semmle/code/java/frameworks/javase/Http.qll b/java/ql/lib/semmle/code/java/frameworks/javase/Http.qll
similarity index 100%
rename from java/ql/src/semmle/code/java/frameworks/javase/Http.qll
rename to java/ql/lib/semmle/code/java/frameworks/javase/Http.qll
diff --git a/java/ql/src/semmle/code/java/frameworks/javase/WebSocket.qll b/java/ql/lib/semmle/code/java/frameworks/javase/WebSocket.qll
similarity index 100%
rename from java/ql/src/semmle/code/java/frameworks/javase/WebSocket.qll
rename to java/ql/lib/semmle/code/java/frameworks/javase/WebSocket.qll
diff --git a/java/ql/src/semmle/code/java/frameworks/play/Play.qll b/java/ql/lib/semmle/code/java/frameworks/play/Play.qll
similarity index 100%
rename from java/ql/src/semmle/code/java/frameworks/play/Play.qll
rename to java/ql/lib/semmle/code/java/frameworks/play/Play.qll
diff --git a/java/ql/src/semmle/code/java/frameworks/spring/Spring.qll b/java/ql/lib/semmle/code/java/frameworks/spring/Spring.qll
similarity index 97%
rename from java/ql/src/semmle/code/java/frameworks/spring/Spring.qll
rename to java/ql/lib/semmle/code/java/frameworks/spring/Spring.qll
index 21794a9d92c..10bf4e677f8 100644
--- a/java/ql/src/semmle/code/java/frameworks/spring/Spring.qll
+++ b/java/ql/lib/semmle/code/java/frameworks/spring/Spring.qll
@@ -39,6 +39,7 @@ import semmle.code.java.frameworks.spring.SpringUtil
import semmle.code.java.frameworks.spring.SpringValidation
import semmle.code.java.frameworks.spring.SpringValue
import semmle.code.java.frameworks.spring.SpringWebMultipart
+import semmle.code.java.frameworks.spring.SpringWebUtil
import semmle.code.java.frameworks.spring.SpringXMLElement
import semmle.code.java.frameworks.spring.metrics.MetricSpringBean
import semmle.code.java.frameworks.spring.metrics.MetricSpringBeanFile
diff --git a/java/ql/src/semmle/code/java/frameworks/spring/SpringAbstractRef.qll b/java/ql/lib/semmle/code/java/frameworks/spring/SpringAbstractRef.qll
similarity index 100%
rename from java/ql/src/semmle/code/java/frameworks/spring/SpringAbstractRef.qll
rename to java/ql/lib/semmle/code/java/frameworks/spring/SpringAbstractRef.qll
diff --git a/java/ql/src/semmle/code/java/frameworks/spring/SpringAlias.qll b/java/ql/lib/semmle/code/java/frameworks/spring/SpringAlias.qll
similarity index 100%
rename from java/ql/src/semmle/code/java/frameworks/spring/SpringAlias.qll
rename to java/ql/lib/semmle/code/java/frameworks/spring/SpringAlias.qll
diff --git a/java/ql/src/semmle/code/java/frameworks/spring/SpringArgType.qll b/java/ql/lib/semmle/code/java/frameworks/spring/SpringArgType.qll
similarity index 100%
rename from java/ql/src/semmle/code/java/frameworks/spring/SpringArgType.qll
rename to java/ql/lib/semmle/code/java/frameworks/spring/SpringArgType.qll
diff --git a/java/ql/src/semmle/code/java/frameworks/spring/SpringAttribute.qll b/java/ql/lib/semmle/code/java/frameworks/spring/SpringAttribute.qll
similarity index 100%
rename from java/ql/src/semmle/code/java/frameworks/spring/SpringAttribute.qll
rename to java/ql/lib/semmle/code/java/frameworks/spring/SpringAttribute.qll
diff --git a/java/ql/src/semmle/code/java/frameworks/spring/SpringAutowire.qll b/java/ql/lib/semmle/code/java/frameworks/spring/SpringAutowire.qll
similarity index 100%
rename from java/ql/src/semmle/code/java/frameworks/spring/SpringAutowire.qll
rename to java/ql/lib/semmle/code/java/frameworks/spring/SpringAutowire.qll
diff --git a/java/ql/src/semmle/code/java/frameworks/spring/SpringBean.qll b/java/ql/lib/semmle/code/java/frameworks/spring/SpringBean.qll
similarity index 100%
rename from java/ql/src/semmle/code/java/frameworks/spring/SpringBean.qll
rename to java/ql/lib/semmle/code/java/frameworks/spring/SpringBean.qll
diff --git a/java/ql/src/semmle/code/java/frameworks/spring/SpringBeanFile.qll b/java/ql/lib/semmle/code/java/frameworks/spring/SpringBeanFile.qll
similarity index 100%
rename from java/ql/src/semmle/code/java/frameworks/spring/SpringBeanFile.qll
rename to java/ql/lib/semmle/code/java/frameworks/spring/SpringBeanFile.qll
diff --git a/java/ql/src/semmle/code/java/frameworks/spring/SpringBeanRefType.qll b/java/ql/lib/semmle/code/java/frameworks/spring/SpringBeanRefType.qll
similarity index 100%
rename from java/ql/src/semmle/code/java/frameworks/spring/SpringBeanRefType.qll
rename to java/ql/lib/semmle/code/java/frameworks/spring/SpringBeanRefType.qll
diff --git a/java/ql/src/semmle/code/java/frameworks/spring/SpringBeans.qll b/java/ql/lib/semmle/code/java/frameworks/spring/SpringBeans.qll
similarity index 100%
rename from java/ql/src/semmle/code/java/frameworks/spring/SpringBeans.qll
rename to java/ql/lib/semmle/code/java/frameworks/spring/SpringBeans.qll
diff --git a/java/ql/src/semmle/code/java/frameworks/spring/SpringCache.qll b/java/ql/lib/semmle/code/java/frameworks/spring/SpringCache.qll
similarity index 100%
rename from java/ql/src/semmle/code/java/frameworks/spring/SpringCache.qll
rename to java/ql/lib/semmle/code/java/frameworks/spring/SpringCache.qll
diff --git a/java/ql/src/semmle/code/java/frameworks/spring/SpringCamel.qll b/java/ql/lib/semmle/code/java/frameworks/spring/SpringCamel.qll
similarity index 100%
rename from java/ql/src/semmle/code/java/frameworks/spring/SpringCamel.qll
rename to java/ql/lib/semmle/code/java/frameworks/spring/SpringCamel.qll
diff --git a/java/ql/src/semmle/code/java/frameworks/spring/SpringComponentScan.qll b/java/ql/lib/semmle/code/java/frameworks/spring/SpringComponentScan.qll
similarity index 100%
rename from java/ql/src/semmle/code/java/frameworks/spring/SpringComponentScan.qll
rename to java/ql/lib/semmle/code/java/frameworks/spring/SpringComponentScan.qll
diff --git a/java/ql/src/semmle/code/java/frameworks/spring/SpringConstructorArg.qll b/java/ql/lib/semmle/code/java/frameworks/spring/SpringConstructorArg.qll
similarity index 100%
rename from java/ql/src/semmle/code/java/frameworks/spring/SpringConstructorArg.qll
rename to java/ql/lib/semmle/code/java/frameworks/spring/SpringConstructorArg.qll
diff --git a/java/ql/src/semmle/code/java/frameworks/spring/SpringController.qll b/java/ql/lib/semmle/code/java/frameworks/spring/SpringController.qll
similarity index 100%
rename from java/ql/src/semmle/code/java/frameworks/spring/SpringController.qll
rename to java/ql/lib/semmle/code/java/frameworks/spring/SpringController.qll
diff --git a/java/ql/src/semmle/code/java/frameworks/spring/SpringDescription.qll b/java/ql/lib/semmle/code/java/frameworks/spring/SpringDescription.qll
similarity index 100%
rename from java/ql/src/semmle/code/java/frameworks/spring/SpringDescription.qll
rename to java/ql/lib/semmle/code/java/frameworks/spring/SpringDescription.qll
diff --git a/java/ql/src/semmle/code/java/frameworks/spring/SpringEntry.qll b/java/ql/lib/semmle/code/java/frameworks/spring/SpringEntry.qll
similarity index 100%
rename from java/ql/src/semmle/code/java/frameworks/spring/SpringEntry.qll
rename to java/ql/lib/semmle/code/java/frameworks/spring/SpringEntry.qll
diff --git a/java/ql/src/semmle/code/java/frameworks/spring/SpringFlex.qll b/java/ql/lib/semmle/code/java/frameworks/spring/SpringFlex.qll
similarity index 100%
rename from java/ql/src/semmle/code/java/frameworks/spring/SpringFlex.qll
rename to java/ql/lib/semmle/code/java/frameworks/spring/SpringFlex.qll
diff --git a/java/ql/src/semmle/code/java/frameworks/spring/SpringHttp.qll b/java/ql/lib/semmle/code/java/frameworks/spring/SpringHttp.qll
similarity index 100%
rename from java/ql/src/semmle/code/java/frameworks/spring/SpringHttp.qll
rename to java/ql/lib/semmle/code/java/frameworks/spring/SpringHttp.qll
diff --git a/java/ql/src/semmle/code/java/frameworks/spring/SpringIdRef.qll b/java/ql/lib/semmle/code/java/frameworks/spring/SpringIdRef.qll
similarity index 100%
rename from java/ql/src/semmle/code/java/frameworks/spring/SpringIdRef.qll
rename to java/ql/lib/semmle/code/java/frameworks/spring/SpringIdRef.qll
diff --git a/java/ql/src/semmle/code/java/frameworks/spring/SpringImport.qll b/java/ql/lib/semmle/code/java/frameworks/spring/SpringImport.qll
similarity index 100%
rename from java/ql/src/semmle/code/java/frameworks/spring/SpringImport.qll
rename to java/ql/lib/semmle/code/java/frameworks/spring/SpringImport.qll
diff --git a/java/ql/src/semmle/code/java/frameworks/spring/SpringInitializingBean.qll b/java/ql/lib/semmle/code/java/frameworks/spring/SpringInitializingBean.qll
similarity index 100%
rename from java/ql/src/semmle/code/java/frameworks/spring/SpringInitializingBean.qll
rename to java/ql/lib/semmle/code/java/frameworks/spring/SpringInitializingBean.qll
diff --git a/java/ql/src/semmle/code/java/frameworks/spring/SpringKey.qll b/java/ql/lib/semmle/code/java/frameworks/spring/SpringKey.qll
similarity index 100%
rename from java/ql/src/semmle/code/java/frameworks/spring/SpringKey.qll
rename to java/ql/lib/semmle/code/java/frameworks/spring/SpringKey.qll
diff --git a/java/ql/src/semmle/code/java/frameworks/spring/SpringList.qll b/java/ql/lib/semmle/code/java/frameworks/spring/SpringList.qll
similarity index 100%
rename from java/ql/src/semmle/code/java/frameworks/spring/SpringList.qll
rename to java/ql/lib/semmle/code/java/frameworks/spring/SpringList.qll
diff --git a/java/ql/src/semmle/code/java/frameworks/spring/SpringListOrSet.qll b/java/ql/lib/semmle/code/java/frameworks/spring/SpringListOrSet.qll
similarity index 100%
rename from java/ql/src/semmle/code/java/frameworks/spring/SpringListOrSet.qll
rename to java/ql/lib/semmle/code/java/frameworks/spring/SpringListOrSet.qll
diff --git a/java/ql/src/semmle/code/java/frameworks/spring/SpringLookupMethod.qll b/java/ql/lib/semmle/code/java/frameworks/spring/SpringLookupMethod.qll
similarity index 100%
rename from java/ql/src/semmle/code/java/frameworks/spring/SpringLookupMethod.qll
rename to java/ql/lib/semmle/code/java/frameworks/spring/SpringLookupMethod.qll
diff --git a/java/ql/src/semmle/code/java/frameworks/spring/SpringMap.qll b/java/ql/lib/semmle/code/java/frameworks/spring/SpringMap.qll
similarity index 100%
rename from java/ql/src/semmle/code/java/frameworks/spring/SpringMap.qll
rename to java/ql/lib/semmle/code/java/frameworks/spring/SpringMap.qll
diff --git a/java/ql/src/semmle/code/java/frameworks/spring/SpringMergable.qll b/java/ql/lib/semmle/code/java/frameworks/spring/SpringMergable.qll
similarity index 100%
rename from java/ql/src/semmle/code/java/frameworks/spring/SpringMergable.qll
rename to java/ql/lib/semmle/code/java/frameworks/spring/SpringMergable.qll
diff --git a/java/ql/src/semmle/code/java/frameworks/spring/SpringMeta.qll b/java/ql/lib/semmle/code/java/frameworks/spring/SpringMeta.qll
similarity index 100%
rename from java/ql/src/semmle/code/java/frameworks/spring/SpringMeta.qll
rename to java/ql/lib/semmle/code/java/frameworks/spring/SpringMeta.qll
diff --git a/java/ql/src/semmle/code/java/frameworks/spring/SpringNull.qll b/java/ql/lib/semmle/code/java/frameworks/spring/SpringNull.qll
similarity index 100%
rename from java/ql/src/semmle/code/java/frameworks/spring/SpringNull.qll
rename to java/ql/lib/semmle/code/java/frameworks/spring/SpringNull.qll
diff --git a/java/ql/src/semmle/code/java/frameworks/spring/SpringProfile.qll b/java/ql/lib/semmle/code/java/frameworks/spring/SpringProfile.qll
similarity index 100%
rename from java/ql/src/semmle/code/java/frameworks/spring/SpringProfile.qll
rename to java/ql/lib/semmle/code/java/frameworks/spring/SpringProfile.qll
diff --git a/java/ql/src/semmle/code/java/frameworks/spring/SpringProp.qll b/java/ql/lib/semmle/code/java/frameworks/spring/SpringProp.qll
similarity index 100%
rename from java/ql/src/semmle/code/java/frameworks/spring/SpringProp.qll
rename to java/ql/lib/semmle/code/java/frameworks/spring/SpringProp.qll
diff --git a/java/ql/src/semmle/code/java/frameworks/spring/SpringProperty.qll b/java/ql/lib/semmle/code/java/frameworks/spring/SpringProperty.qll
similarity index 100%
rename from java/ql/src/semmle/code/java/frameworks/spring/SpringProperty.qll
rename to java/ql/lib/semmle/code/java/frameworks/spring/SpringProperty.qll
diff --git a/java/ql/src/semmle/code/java/frameworks/spring/SpringProps.qll b/java/ql/lib/semmle/code/java/frameworks/spring/SpringProps.qll
similarity index 100%
rename from java/ql/src/semmle/code/java/frameworks/spring/SpringProps.qll
rename to java/ql/lib/semmle/code/java/frameworks/spring/SpringProps.qll
diff --git a/java/ql/src/semmle/code/java/frameworks/spring/SpringQualifier.qll b/java/ql/lib/semmle/code/java/frameworks/spring/SpringQualifier.qll
similarity index 100%
rename from java/ql/src/semmle/code/java/frameworks/spring/SpringQualifier.qll
rename to java/ql/lib/semmle/code/java/frameworks/spring/SpringQualifier.qll
diff --git a/java/ql/src/semmle/code/java/frameworks/spring/SpringRef.qll b/java/ql/lib/semmle/code/java/frameworks/spring/SpringRef.qll
similarity index 100%
rename from java/ql/src/semmle/code/java/frameworks/spring/SpringRef.qll
rename to java/ql/lib/semmle/code/java/frameworks/spring/SpringRef.qll
diff --git a/java/ql/src/semmle/code/java/frameworks/spring/SpringReplacedMethod.qll b/java/ql/lib/semmle/code/java/frameworks/spring/SpringReplacedMethod.qll
similarity index 100%
rename from java/ql/src/semmle/code/java/frameworks/spring/SpringReplacedMethod.qll
rename to java/ql/lib/semmle/code/java/frameworks/spring/SpringReplacedMethod.qll
diff --git a/java/ql/src/semmle/code/java/frameworks/spring/SpringSet.qll b/java/ql/lib/semmle/code/java/frameworks/spring/SpringSet.qll
similarity index 100%
rename from java/ql/src/semmle/code/java/frameworks/spring/SpringSet.qll
rename to java/ql/lib/semmle/code/java/frameworks/spring/SpringSet.qll
diff --git a/java/ql/src/semmle/code/java/frameworks/spring/SpringUi.qll b/java/ql/lib/semmle/code/java/frameworks/spring/SpringUi.qll
similarity index 100%
rename from java/ql/src/semmle/code/java/frameworks/spring/SpringUi.qll
rename to java/ql/lib/semmle/code/java/frameworks/spring/SpringUi.qll
diff --git a/java/ql/src/semmle/code/java/frameworks/spring/SpringUtil.qll b/java/ql/lib/semmle/code/java/frameworks/spring/SpringUtil.qll
similarity index 100%
rename from java/ql/src/semmle/code/java/frameworks/spring/SpringUtil.qll
rename to java/ql/lib/semmle/code/java/frameworks/spring/SpringUtil.qll
diff --git a/java/ql/src/semmle/code/java/frameworks/spring/SpringValidation.qll b/java/ql/lib/semmle/code/java/frameworks/spring/SpringValidation.qll
similarity index 100%
rename from java/ql/src/semmle/code/java/frameworks/spring/SpringValidation.qll
rename to java/ql/lib/semmle/code/java/frameworks/spring/SpringValidation.qll
diff --git a/java/ql/src/semmle/code/java/frameworks/spring/SpringValue.qll b/java/ql/lib/semmle/code/java/frameworks/spring/SpringValue.qll
similarity index 100%
rename from java/ql/src/semmle/code/java/frameworks/spring/SpringValue.qll
rename to java/ql/lib/semmle/code/java/frameworks/spring/SpringValue.qll
diff --git a/java/ql/src/semmle/code/java/frameworks/spring/SpringWeb.qll b/java/ql/lib/semmle/code/java/frameworks/spring/SpringWeb.qll
similarity index 100%
rename from java/ql/src/semmle/code/java/frameworks/spring/SpringWeb.qll
rename to java/ql/lib/semmle/code/java/frameworks/spring/SpringWeb.qll
diff --git a/java/ql/src/semmle/code/java/frameworks/spring/SpringWebClient.qll b/java/ql/lib/semmle/code/java/frameworks/spring/SpringWebClient.qll
similarity index 100%
rename from java/ql/src/semmle/code/java/frameworks/spring/SpringWebClient.qll
rename to java/ql/lib/semmle/code/java/frameworks/spring/SpringWebClient.qll
diff --git a/java/ql/src/semmle/code/java/frameworks/spring/SpringWebMultipart.qll b/java/ql/lib/semmle/code/java/frameworks/spring/SpringWebMultipart.qll
similarity index 100%
rename from java/ql/src/semmle/code/java/frameworks/spring/SpringWebMultipart.qll
rename to java/ql/lib/semmle/code/java/frameworks/spring/SpringWebMultipart.qll
diff --git a/java/ql/lib/semmle/code/java/frameworks/spring/SpringWebUtil.qll b/java/ql/lib/semmle/code/java/frameworks/spring/SpringWebUtil.qll
new file mode 100644
index 00000000000..78f6bfb281c
--- /dev/null
+++ b/java/ql/lib/semmle/code/java/frameworks/spring/SpringWebUtil.qll
@@ -0,0 +1,176 @@
+/** Provides models of taint flow in `org.springframework.web.util` */
+
+import java
+private import semmle.code.java.dataflow.ExternalFlow
+
+private class FlowSummaries extends SummaryModelCsv {
+ override predicate row(string row) {
+ row =
+ [
+ "org.springframework.web.util;UriBuilder;true;build;;;Argument[-1];ReturnValue;taint",
+ "org.springframework.web.util;UriBuilder;true;build;(Map);;MapValue of Argument[0];Argument[-1];taint",
+ "org.springframework.web.util;UriBuilder;true;fragment;;;Argument[-1];ReturnValue;value",
+ "org.springframework.web.util;UriBuilder;true;fragment;;;Argument[0];Argument[-1];taint",
+ "org.springframework.web.util;UriBuilder;true;host;;;Argument[-1];ReturnValue;value",
+ "org.springframework.web.util;UriBuilder;true;host;;;Argument[0];Argument[-1];taint",
+ "org.springframework.web.util;UriBuilder;true;path;;;Argument[-1];ReturnValue;value",
+ "org.springframework.web.util;UriBuilder;true;path;;;Argument[0];Argument[-1];taint",
+ "org.springframework.web.util;UriBuilder;true;pathSegment;;;Argument[-1];ReturnValue;value",
+ "org.springframework.web.util;UriBuilder;true;pathSegment;;;ArrayElement of Argument[0];Argument[-1];taint",
+ "org.springframework.web.util;UriBuilder;true;port;;;Argument[-1];ReturnValue;value",
+ "org.springframework.web.util;UriBuilder;true;port;(java.lang.String);;Argument[0];Argument[-1];taint",
+ "org.springframework.web.util;UriBuilder;true;query;;;Argument[-1];ReturnValue;value",
+ "org.springframework.web.util;UriBuilder;true;query;;;Argument[0];Argument[-1];taint",
+ "org.springframework.web.util;UriBuilder;true;queryParam;;;Argument[-1];ReturnValue;value",
+ "org.springframework.web.util;UriBuilder;true;queryParam;;;Argument[0];Argument[-1];taint",
+ "org.springframework.web.util;UriBuilder;true;queryParam;(String,Collection);;Element of Argument[1];Argument[-1];taint",
+ "org.springframework.web.util;UriBuilder;true;queryParam;(String,Object[]);;ArrayElement of Argument[1];Argument[-1];taint",
+ "org.springframework.web.util;UriBuilder;true;queryParamIfPresent;;;Argument[-1];ReturnValue;value",
+ "org.springframework.web.util;UriBuilder;true;queryParamIfPresent;;;Argument[0];Argument[-1];taint",
+ "org.springframework.web.util;UriBuilder;true;queryParamIfPresent;;;Element of Argument[1];Argument[-1];taint",
+ "org.springframework.web.util;UriBuilder;true;queryParams;;;Argument[-1];ReturnValue;value",
+ "org.springframework.web.util;UriBuilder;true;queryParams;;;MapKey of Argument[0];Argument[-1];taint",
+ "org.springframework.web.util;UriBuilder;true;queryParams;;;Element of MapValue of Argument[0];Argument[-1];taint",
+ "org.springframework.web.util;UriBuilder;true;replacePath;;;Argument[-1];ReturnValue;value",
+ "org.springframework.web.util;UriBuilder;true;replacePath;;;Argument[0];Argument[-1];taint",
+ "org.springframework.web.util;UriBuilder;true;replaceQuery;;;Argument[-1];ReturnValue;value",
+ "org.springframework.web.util;UriBuilder;true;replaceQuery;;;Argument[0];Argument[-1];taint",
+ "org.springframework.web.util;UriBuilder;true;replaceQueryParam;;;Argument[-1];ReturnValue;value",
+ "org.springframework.web.util;UriBuilder;true;replaceQueryParam;;;Argument[0];Argument[-1];taint",
+ "org.springframework.web.util;UriBuilder;true;replaceQueryParam;(String,Collection);;Element of Argument[1];Argument[-1];taint",
+ "org.springframework.web.util;UriBuilder;true;replaceQueryParam;(String,Object[]);;ArrayElement of Argument[1];Argument[-1];taint",
+ "org.springframework.web.util;UriBuilder;true;replaceQueryParams;;;Argument[-1];ReturnValue;value",
+ "org.springframework.web.util;UriBuilder;true;replaceQueryParams;;;MapKey of Argument[0];Argument[-1];taint",
+ "org.springframework.web.util;UriBuilder;true;replaceQueryParams;;;Element of MapValue of Argument[0];Argument[-1];taint",
+ "org.springframework.web.util;UriBuilder;true;scheme;;;Argument[-1];ReturnValue;value",
+ "org.springframework.web.util;UriBuilder;true;scheme;;;Argument[0];Argument[-1];taint",
+ "org.springframework.web.util;UriBuilder;true;userInfo;;;Argument[-1];ReturnValue;value",
+ "org.springframework.web.util;UriBuilder;true;userInfo;;;Argument[0];Argument[-1];taint",
+ "org.springframework.web.util;UriBuilderFactory;true;builder;;;Argument[-1];ReturnValue;taint",
+ "org.springframework.web.util;UriBuilderFactory;true;uriString;;;Argument[-1..0];ReturnValue;taint",
+ "org.springframework.web.util;UriComponents$UriTemplateVariables;true;getValue;;;MapValue of Argument[-1];ReturnValue;value",
+ "org.springframework.web.util;UriTemplateHandler;true;expand;;;Argument[-1..0];ReturnValue;taint",
+ "org.springframework.web.util;UriTemplateHandler;true;expand;(String,Map);;MapValue of Argument[1];ReturnValue;taint",
+ "org.springframework.web.util;UriTemplateHandler;true;expand;(String,Object[]);;ArrayElement of Argument[1];ReturnValue;taint",
+ "org.springframework.web.util;AbstractUriTemplateHandler;true;getBaseUrl;;;Argument[-1];ReturnValue;taint",
+ "org.springframework.web.util;AbstractUriTemplateHandler;true;setBaseUrl;;;Argument[0];Argument[-1];taint",
+ "org.springframework.web.util;AbstractUriTemplateHandler;true;setDefaultUriVariables;;;Argument[0];Argument[-1];taint",
+ // writing to a `Request` or `Response` currently doesn't propagate taint to the object itself.
+ "org.springframework.web.util;ContentCachingRequestWrapper;false;ContentCachingRequestWrapper;;;Argument[0];Argument[-1];taint",
+ "org.springframework.web.util;ContentCachingRequestWrapper;false;getContentAsByteArray;;;Argument[-1];ReturnValue;taint",
+ "org.springframework.web.util;ContentCachingResponseWrapper;false;ContentCachingResponseWrapper;;;Argument[0];Argument[-1];taint",
+ "org.springframework.web.util;ContentCachingResponseWrapper;false;getContentAsByteArray;;;Argument[-1];ReturnValue;taint",
+ "org.springframework.web.util;ContentCachingResponseWrapper;false;getContentInputStream;;;Argument[-1];ReturnValue;taint",
+ "org.springframework.web.util;DefaultUriBuilderFactory;false;DefaultUriBuilderFactory;;;Argument[0];Argument[-1];taint",
+ "org.springframework.web.util;DefaultUriBuilderFactory;false;builder;;;Argument[-1];ReturnValue;taint",
+ "org.springframework.web.util;DefaultUriBuilderFactory;false;getDefaultUriVariables;;;Argument[-1];MapValue of ReturnValue;taint",
+ "org.springframework.web.util;DefaultUriBuilderFactory;false;setDefaultUriVariables;;;MapValue of Argument[0];Argument[-1];taint",
+ "org.springframework.web.util;DefaultUriBuilderFactory;false;uriString;;;Argument[-1];ReturnValue;taint",
+ "org.springframework.web.util;HtmlUtils;false;htmlEscape;;;Argument[0];ReturnValue;taint",
+ "org.springframework.web.util;HtmlUtils;false;htmlEscapeDecimal;;;Argument[0];ReturnValue;taint",
+ "org.springframework.web.util;HtmlUtils;false;htmlEscapeHex;;;Argument[0];ReturnValue;taint",
+ "org.springframework.web.util;HtmlUtils;false;htmlUnescape;;;Argument[0];ReturnValue;taint",
+ "org.springframework.web.util;ServletContextPropertyUtils;false;resolvePlaceholders;;;Argument[0..1];ReturnValue;taint",
+ "org.springframework.web.util;ServletRequestPathUtils;false;getCachedPath;;;Argument[0];ReturnValue;taint",
+ "org.springframework.web.util;ServletRequestPathUtils;false;getCachedPathValue;;;Argument[0];ReturnValue;taint",
+ "org.springframework.web.util;ServletRequestPathUtils;false;getParsedRequestPath;;;Argument[0];ReturnValue;taint",
+ "org.springframework.web.util;ServletRequestPathUtils;false;parseAndCache;;;Argument[0];ReturnValue;taint",
+ "org.springframework.web.util;ServletRequestPathUtils;false;setParsedRequestPath;;;Argument[0];Argument[1];taint",
+ "org.springframework.web.util;UriComponents;false;UriComponents;;;Argument[0..1];Argument[-1];taint",
+ "org.springframework.web.util;UriComponents;false;copyToUriComponentsBuilder;;;Argument[-1];Argument[0];taint",
+ "org.springframework.web.util;UriComponents;false;encode;;;Argument[-1];ReturnValue;taint",
+ "org.springframework.web.util;UriComponents;false;expand;(Map);;MapValue of Argument[0];ReturnValue;taint",
+ "org.springframework.web.util;UriComponents;false;expand;(Object[]);;ArrayElement of Argument[0];ReturnValue;taint",
+ "org.springframework.web.util;UriComponents;false;expand;(UriTemplateVariables);;MapValue of Argument[0];ReturnValue;taint",
+ "org.springframework.web.util;UriComponents;false;getFragment;;;Argument[-1];ReturnValue;taint",
+ "org.springframework.web.util;UriComponents;false;getHost;;;Argument[-1];ReturnValue;taint",
+ "org.springframework.web.util;UriComponents;false;getPath;;;Argument[-1];ReturnValue;taint",
+ "org.springframework.web.util;UriComponents;false;getPathSegments;;;Argument[-1];ReturnValue;taint",
+ "org.springframework.web.util;UriComponents;false;getQuery;;;Argument[-1];ReturnValue;taint",
+ "org.springframework.web.util;UriComponents;false;getQueryParams;;;Argument[-1];MapKey of ReturnValue;taint",
+ "org.springframework.web.util;UriComponents;false;getQueryParams;;;Argument[-1];Element of MapValue of ReturnValue;taint",
+ "org.springframework.web.util;UriComponents;false;getScheme;;;Argument[-1];ReturnValue;taint",
+ "org.springframework.web.util;UriComponents;false;getSchemeSpecificPart;;;Argument[-1];ReturnValue;taint",
+ "org.springframework.web.util;UriComponents;false;getUserInfo;;;Argument[-1];ReturnValue;taint",
+ "org.springframework.web.util;UriComponents;false;toUri;;;Argument[-1];ReturnValue;taint",
+ "org.springframework.web.util;UriComponents;false;toUriString;;;Argument[-1];ReturnValue;taint",
+ "org.springframework.web.util;UriComponents;false;toString;;;Argument[-1];ReturnValue;taint",
+ "org.springframework.web.util;UriComponents;false;normalize;;;Argument[-1];ReturnValue;taint",
+ "org.springframework.web.util;UriComponentsBuilder;false;build;;;Argument[-1];ReturnValue;taint",
+ "org.springframework.web.util;UriComponentsBuilder;false;build;(Map);;MapValue of Argument[0];ReturnValue;taint",
+ "org.springframework.web.util;UriComponentsBuilder;false;build;(Object[]);;ArrayElement of Argument[0];ReturnValue;taint",
+ "org.springframework.web.util;UriComponentsBuilder;false;buildAndExpand;(Map);;MapValue of Argument[0];ReturnValue;taint",
+ "org.springframework.web.util;UriComponentsBuilder;false;buildAndExpand;(Object[]);;ArrayElement of Argument[0];ReturnValue;taint",
+ "org.springframework.web.util;UriComponentsBuilder;false;cloneBuilder;;;Argument[-1];ReturnValue;value",
+ "org.springframework.web.util;UriComponentsBuilder;false;encode;;;Argument[-1];ReturnValue;value",
+ "org.springframework.web.util;UriComponentsBuilder;false;fromHttpRequest;;;Argument[0];ReturnValue;taint",
+ "org.springframework.web.util;UriComponentsBuilder;false;fromHttpUrl;;;Argument[0];ReturnValue;taint",
+ "org.springframework.web.util;UriComponentsBuilder;false;fromOriginHeader;;;Argument[0];ReturnValue;taint",
+ "org.springframework.web.util;UriComponentsBuilder;false;fromPath;;;Argument[0];ReturnValue;taint",
+ "org.springframework.web.util;UriComponentsBuilder;false;fromUri;;;Argument[0];ReturnValue;taint",
+ "org.springframework.web.util;UriComponentsBuilder;false;fromUriString;;;Argument[0];ReturnValue;taint",
+ "org.springframework.web.util;UriComponentsBuilder;false;parseForwardedFor;;;Argument[0..1];ReturnValue;taint",
+ "org.springframework.web.util;UriComponentsBuilder;false;schemeSpecificPart;;;Argument[-1];ReturnValue;value",
+ "org.springframework.web.util;UriComponentsBuilder;false;schemeSpecificPart;;;Argument[0];Argument[-1];taint",
+ "org.springframework.web.util;UriComponentsBuilder;false;toUriString;;;Argument[-1];ReturnValue;taint",
+ "org.springframework.web.util;UriComponentsBuilder;false;uri;;;Argument[-1];ReturnValue;value",
+ "org.springframework.web.util;UriComponentsBuilder;false;uri;;;Argument[0];Argument[-1];taint",
+ "org.springframework.web.util;UriComponentsBuilder;false;uriComponents;;;Argument[-1];ReturnValue;value",
+ "org.springframework.web.util;UriComponentsBuilder;false;uriComponents;;;Argument[0];Argument[-1];taint",
+ "org.springframework.web.util;UriComponentsBuilder;false;uriVariables;;;Argument[-1];ReturnValue;value",
+ "org.springframework.web.util;UriComponentsBuilder;false;uriVariables;;;MapValue of Argument[0];Argument[-1];taint",
+ "org.springframework.web.util;UriTemplate;false;expand;(Map);;MapValue of Argument[0];ReturnValue;taint",
+ "org.springframework.web.util;UriTemplate;false;expand;(Object[]);;ArrayElement of Argument[0];ReturnValue;taint",
+ "org.springframework.web.util;UriTemplate;false;getVariableNames;;;Argument[-1];Element of ReturnValue;taint",
+ "org.springframework.web.util;UriTemplate;false;match;;;Argument[0];MapValue of ReturnValue;taint",
+ "org.springframework.web.util;UriTemplate;false;toString;;;Argument[-1];ReturnValue;taint",
+ "org.springframework.web.util;UriUtils;false;decode;;;Argument[0];ReturnValue;taint",
+ "org.springframework.web.util;UriUtils;false;encode;;;Argument[0];ReturnValue;taint",
+ "org.springframework.web.util;UriUtils;false;encodeAuthority;;;Argument[0];ReturnValue;taint",
+ "org.springframework.web.util;UriUtils;false;encodeFragment;;;Argument[0];ReturnValue;taint",
+ "org.springframework.web.util;UriUtils;false;encodeHost;;;Argument[0];ReturnValue;taint",
+ "org.springframework.web.util;UriUtils;false;encodePath;;;Argument[0];ReturnValue;taint",
+ "org.springframework.web.util;UriUtils;false;encodePathSegment;;;Argument[0];ReturnValue;taint",
+ "org.springframework.web.util;UriUtils;false;encodePort;;;Argument[0];ReturnValue;taint",
+ "org.springframework.web.util;UriUtils;false;encodeQuery;;;Argument[0];ReturnValue;taint",
+ "org.springframework.web.util;UriUtils;false;encodeQueryParam;;;Argument[0];ReturnValue;taint",
+ "org.springframework.web.util;UriUtils;false;encodeQueryParams;;;MapKey of Argument[0];MapKey of ReturnValue;taint",
+ "org.springframework.web.util;UriUtils;false;encodeQueryParams;;;MapValue of Argument[0];MapValue of ReturnValue;taint",
+ "org.springframework.web.util;UriUtils;false;encodeScheme;;;Argument[0];ReturnValue;taint",
+ "org.springframework.web.util;UriUtils;false;encodeUriVariables;(Map);;MapValue of Argument[0];MapValue of ReturnValue;taint",
+ "org.springframework.web.util;UriUtils;false;encodeUriVariables;(Map);;MapKey of Argument[0];MapKey of ReturnValue;taint",
+ "org.springframework.web.util;UriUtils;false;encodeUriVariables;(Object[]);;ArrayElement of Argument[0];ArrayElement of ReturnValue;taint",
+ "org.springframework.web.util;UriUtils;false;encodeUserInfo;;;Argument[0];ReturnValue;taint",
+ "org.springframework.web.util;UriUtils;false;extractFileExtension;;;Argument[0];ReturnValue;taint",
+ "org.springframework.web.util;UrlPathHelper;false;decodeMatrixVariables;;;MapKey of Argument[1];MapKey of ReturnValue;value",
+ "org.springframework.web.util;UrlPathHelper;false;decodeMatrixVariables;;;MapValue of Argument[1];MapValue of ReturnValue;taint",
+ "org.springframework.web.util;UrlPathHelper;false;decodePathVariables;;;MapKey of Argument[1];MapKey of ReturnValue;value",
+ "org.springframework.web.util;UrlPathHelper;false;decodePathVariables;;;MapValue of Argument[1];MapValue of ReturnValue;taint",
+ "org.springframework.web.util;UrlPathHelper;false;decodeRequestString;;;Argument[1];ReturnValue;taint",
+ "org.springframework.web.util;UrlPathHelper;false;getContextPath;;;Argument[0];ReturnValue;taint",
+ "org.springframework.web.util;UrlPathHelper;false;getOriginatingContextPath;;;Argument[0];ReturnValue;taint",
+ "org.springframework.web.util;UrlPathHelper;false;getOriginatingQueryString;;;Argument[0];ReturnValue;taint",
+ "org.springframework.web.util;UrlPathHelper;false;getOriginatingRequestUri;;;Argument[0];ReturnValue;taint",
+ "org.springframework.web.util;UrlPathHelper;false;getPathWithinApplication;;;Argument[0];ReturnValue;taint",
+ "org.springframework.web.util;UrlPathHelper;false;getPathWithinServletMapping;;;Argument[0];ReturnValue;taint",
+ "org.springframework.web.util;UrlPathHelper;false;getRequestUri;;;Argument[0];ReturnValue;taint",
+ "org.springframework.web.util;UrlPathHelper;false;getResolvedLookupPath;;;Argument[0];ReturnValue;taint",
+ "org.springframework.web.util;UrlPathHelper;false;getServletPath;;;Argument[0];ReturnValue;taint",
+ "org.springframework.web.util;UrlPathHelper;false;removeSemicolonContent;;;Argument[0];ReturnValue;taint",
+ "org.springframework.web.util;UrlPathHelper;false;resolveAndCacheLookupPath;;;Argument[0];ReturnValue;taint",
+ "org.springframework.web.util;WebUtils;false;findParameterValue;(Map,String);;MapValue of Argument[0];ReturnValue;value",
+ "org.springframework.web.util;WebUtils;false;findParameterValue;(ServletRequest,String);;Argument[0];ReturnValue;taint",
+ "org.springframework.web.util;WebUtils;false;getCookie;;;Argument[0];ReturnValue;taint",
+ "org.springframework.web.util;WebUtils;false;getNativeRequest;;;Argument[0];ReturnValue;taint",
+ "org.springframework.web.util;WebUtils;false;getNativeResponse;;;Argument[0];ReturnValue;taint",
+ "org.springframework.web.util;WebUtils;false;getParametersStartingWith;;;Argument[0];MapKey of ReturnValue;taint",
+ "org.springframework.web.util;WebUtils;false;getParametersStartingWith;;;Argument[0];MapValue of ReturnValue;taint",
+ "org.springframework.web.util;WebUtils;false;getRealPath;;;Argument[0..1];ReturnValue;taint",
+ "org.springframework.web.util;WebUtils;false;getRequiredSessionAttribute;;;Argument[0];ReturnValue;taint",
+ "org.springframework.web.util;WebUtils;false;getSessionAttribute;;;Argument[0];ReturnValue;taint",
+ "org.springframework.web.util;WebUtils;false;parseMatrixVariables;;;Argument[0];MapKey of ReturnValue;taint",
+ "org.springframework.web.util;WebUtils;false;parseMatrixVariables;;;Argument[0];MapValue of ReturnValue;taint",
+ "org.springframework.web.util;WebUtils;false;setSessionAttribute;;;Argument[2];Argument[0];taint"
+ ]
+ }
+}
diff --git a/java/ql/src/semmle/code/java/frameworks/spring/SpringXMLElement.qll b/java/ql/lib/semmle/code/java/frameworks/spring/SpringXMLElement.qll
similarity index 100%
rename from java/ql/src/semmle/code/java/frameworks/spring/SpringXMLElement.qll
rename to java/ql/lib/semmle/code/java/frameworks/spring/SpringXMLElement.qll
diff --git a/java/ql/src/semmle/code/java/frameworks/spring/metrics/MetricSpringBean.qll b/java/ql/lib/semmle/code/java/frameworks/spring/metrics/MetricSpringBean.qll
similarity index 100%
rename from java/ql/src/semmle/code/java/frameworks/spring/metrics/MetricSpringBean.qll
rename to java/ql/lib/semmle/code/java/frameworks/spring/metrics/MetricSpringBean.qll
diff --git a/java/ql/src/semmle/code/java/frameworks/spring/metrics/MetricSpringBeanFile.qll b/java/ql/lib/semmle/code/java/frameworks/spring/metrics/MetricSpringBeanFile.qll
similarity index 100%
rename from java/ql/src/semmle/code/java/frameworks/spring/metrics/MetricSpringBeanFile.qll
rename to java/ql/lib/semmle/code/java/frameworks/spring/metrics/MetricSpringBeanFile.qll
diff --git a/java/ql/src/semmle/code/java/frameworks/struts/StrutsActions.qll b/java/ql/lib/semmle/code/java/frameworks/struts/StrutsActions.qll
similarity index 100%
rename from java/ql/src/semmle/code/java/frameworks/struts/StrutsActions.qll
rename to java/ql/lib/semmle/code/java/frameworks/struts/StrutsActions.qll
diff --git a/java/ql/src/semmle/code/java/frameworks/struts/StrutsAnnotations.qll b/java/ql/lib/semmle/code/java/frameworks/struts/StrutsAnnotations.qll
similarity index 100%
rename from java/ql/src/semmle/code/java/frameworks/struts/StrutsAnnotations.qll
rename to java/ql/lib/semmle/code/java/frameworks/struts/StrutsAnnotations.qll
diff --git a/java/ql/src/semmle/code/java/frameworks/struts/StrutsConventions.qll b/java/ql/lib/semmle/code/java/frameworks/struts/StrutsConventions.qll
similarity index 100%
rename from java/ql/src/semmle/code/java/frameworks/struts/StrutsConventions.qll
rename to java/ql/lib/semmle/code/java/frameworks/struts/StrutsConventions.qll
diff --git a/java/ql/src/semmle/code/java/frameworks/struts/StrutsXML.qll b/java/ql/lib/semmle/code/java/frameworks/struts/StrutsXML.qll
similarity index 100%
rename from java/ql/src/semmle/code/java/frameworks/struts/StrutsXML.qll
rename to java/ql/lib/semmle/code/java/frameworks/struts/StrutsXML.qll
diff --git a/java/ql/src/semmle/code/java/metrics/MetricCallable.qll b/java/ql/lib/semmle/code/java/metrics/MetricCallable.qll
similarity index 100%
rename from java/ql/src/semmle/code/java/metrics/MetricCallable.qll
rename to java/ql/lib/semmle/code/java/metrics/MetricCallable.qll
diff --git a/java/ql/src/semmle/code/java/metrics/MetricElement.qll b/java/ql/lib/semmle/code/java/metrics/MetricElement.qll
similarity index 100%
rename from java/ql/src/semmle/code/java/metrics/MetricElement.qll
rename to java/ql/lib/semmle/code/java/metrics/MetricElement.qll
diff --git a/java/ql/src/semmle/code/java/metrics/MetricField.qll b/java/ql/lib/semmle/code/java/metrics/MetricField.qll
similarity index 100%
rename from java/ql/src/semmle/code/java/metrics/MetricField.qll
rename to java/ql/lib/semmle/code/java/metrics/MetricField.qll
diff --git a/java/ql/src/semmle/code/java/metrics/MetricPackage.qll b/java/ql/lib/semmle/code/java/metrics/MetricPackage.qll
similarity index 100%
rename from java/ql/src/semmle/code/java/metrics/MetricPackage.qll
rename to java/ql/lib/semmle/code/java/metrics/MetricPackage.qll
diff --git a/java/ql/src/semmle/code/java/metrics/MetricRefType.qll b/java/ql/lib/semmle/code/java/metrics/MetricRefType.qll
similarity index 100%
rename from java/ql/src/semmle/code/java/metrics/MetricRefType.qll
rename to java/ql/lib/semmle/code/java/metrics/MetricRefType.qll
diff --git a/java/ql/src/semmle/code/java/metrics/MetricStmt.qll b/java/ql/lib/semmle/code/java/metrics/MetricStmt.qll
similarity index 100%
rename from java/ql/src/semmle/code/java/metrics/MetricStmt.qll
rename to java/ql/lib/semmle/code/java/metrics/MetricStmt.qll
diff --git a/java/ql/src/semmle/code/java/security/CommandArguments.qll b/java/ql/lib/semmle/code/java/security/CommandArguments.qll
similarity index 100%
rename from java/ql/src/semmle/code/java/security/CommandArguments.qll
rename to java/ql/lib/semmle/code/java/security/CommandArguments.qll
diff --git a/java/ql/src/semmle/code/java/security/CommandLineQuery.qll b/java/ql/lib/semmle/code/java/security/CommandLineQuery.qll
similarity index 100%
rename from java/ql/src/semmle/code/java/security/CommandLineQuery.qll
rename to java/ql/lib/semmle/code/java/security/CommandLineQuery.qll
diff --git a/java/ql/src/semmle/code/java/security/ControlledString.qll b/java/ql/lib/semmle/code/java/security/ControlledString.qll
similarity index 100%
rename from java/ql/src/semmle/code/java/security/ControlledString.qll
rename to java/ql/lib/semmle/code/java/security/ControlledString.qll
diff --git a/java/ql/src/semmle/code/java/security/Encryption.qll b/java/ql/lib/semmle/code/java/security/Encryption.qll
similarity index 100%
rename from java/ql/src/semmle/code/java/security/Encryption.qll
rename to java/ql/lib/semmle/code/java/security/Encryption.qll
diff --git a/java/ql/src/semmle/code/java/security/ExternalAPIs.qll b/java/ql/lib/semmle/code/java/security/ExternalAPIs.qll
similarity index 100%
rename from java/ql/src/semmle/code/java/security/ExternalAPIs.qll
rename to java/ql/lib/semmle/code/java/security/ExternalAPIs.qll
diff --git a/java/ql/src/semmle/code/java/security/ExternalProcess.qll b/java/ql/lib/semmle/code/java/security/ExternalProcess.qll
similarity index 100%
rename from java/ql/src/semmle/code/java/security/ExternalProcess.qll
rename to java/ql/lib/semmle/code/java/security/ExternalProcess.qll
diff --git a/java/ql/src/semmle/code/java/security/FileReadWrite.qll b/java/ql/lib/semmle/code/java/security/FileReadWrite.qll
similarity index 100%
rename from java/ql/src/semmle/code/java/security/FileReadWrite.qll
rename to java/ql/lib/semmle/code/java/security/FileReadWrite.qll
diff --git a/java/ql/src/semmle/code/java/security/FileWritable.qll b/java/ql/lib/semmle/code/java/security/FileWritable.qll
similarity index 100%
rename from java/ql/src/semmle/code/java/security/FileWritable.qll
rename to java/ql/lib/semmle/code/java/security/FileWritable.qll
diff --git a/java/ql/src/semmle/code/java/security/GroovyInjection.qll b/java/ql/lib/semmle/code/java/security/GroovyInjection.qll
similarity index 100%
rename from java/ql/src/semmle/code/java/security/GroovyInjection.qll
rename to java/ql/lib/semmle/code/java/security/GroovyInjection.qll
diff --git a/java/ql/src/semmle/code/java/security/GroovyInjectionQuery.qll b/java/ql/lib/semmle/code/java/security/GroovyInjectionQuery.qll
similarity index 100%
rename from java/ql/src/semmle/code/java/security/GroovyInjectionQuery.qll
rename to java/ql/lib/semmle/code/java/security/GroovyInjectionQuery.qll
diff --git a/java/ql/src/semmle/code/java/security/InformationLeak.qll b/java/ql/lib/semmle/code/java/security/InformationLeak.qll
similarity index 100%
rename from java/ql/src/semmle/code/java/security/InformationLeak.qll
rename to java/ql/lib/semmle/code/java/security/InformationLeak.qll
diff --git a/java/ql/src/semmle/code/java/security/JWT.qll b/java/ql/lib/semmle/code/java/security/JWT.qll
similarity index 100%
rename from java/ql/src/semmle/code/java/security/JWT.qll
rename to java/ql/lib/semmle/code/java/security/JWT.qll
diff --git a/java/ql/src/semmle/code/java/security/JexlInjectionQuery.qll b/java/ql/lib/semmle/code/java/security/JexlInjectionQuery.qll
similarity index 100%
rename from java/ql/src/semmle/code/java/security/JexlInjectionQuery.qll
rename to java/ql/lib/semmle/code/java/security/JexlInjectionQuery.qll
diff --git a/java/ql/src/semmle/code/java/security/JexlInjectionSinkModels.qll b/java/ql/lib/semmle/code/java/security/JexlInjectionSinkModels.qll
similarity index 100%
rename from java/ql/src/semmle/code/java/security/JexlInjectionSinkModels.qll
rename to java/ql/lib/semmle/code/java/security/JexlInjectionSinkModels.qll
diff --git a/java/ql/src/semmle/code/java/security/JndiInjection.qll b/java/ql/lib/semmle/code/java/security/JndiInjection.qll
similarity index 100%
rename from java/ql/src/semmle/code/java/security/JndiInjection.qll
rename to java/ql/lib/semmle/code/java/security/JndiInjection.qll
diff --git a/java/ql/src/semmle/code/java/security/JndiInjectionQuery.qll b/java/ql/lib/semmle/code/java/security/JndiInjectionQuery.qll
similarity index 100%
rename from java/ql/src/semmle/code/java/security/JndiInjectionQuery.qll
rename to java/ql/lib/semmle/code/java/security/JndiInjectionQuery.qll
diff --git a/java/ql/src/semmle/code/java/security/LdapInjection.qll b/java/ql/lib/semmle/code/java/security/LdapInjection.qll
similarity index 100%
rename from java/ql/src/semmle/code/java/security/LdapInjection.qll
rename to java/ql/lib/semmle/code/java/security/LdapInjection.qll
diff --git a/java/ql/src/semmle/code/java/security/MissingJWTSignatureCheckQuery.qll b/java/ql/lib/semmle/code/java/security/MissingJWTSignatureCheckQuery.qll
similarity index 100%
rename from java/ql/src/semmle/code/java/security/MissingJWTSignatureCheckQuery.qll
rename to java/ql/lib/semmle/code/java/security/MissingJWTSignatureCheckQuery.qll
diff --git a/java/ql/src/semmle/code/java/security/MvelInjection.qll b/java/ql/lib/semmle/code/java/security/MvelInjection.qll
similarity index 100%
rename from java/ql/src/semmle/code/java/security/MvelInjection.qll
rename to java/ql/lib/semmle/code/java/security/MvelInjection.qll
diff --git a/java/ql/src/semmle/code/java/security/MvelInjectionQuery.qll b/java/ql/lib/semmle/code/java/security/MvelInjectionQuery.qll
similarity index 100%
rename from java/ql/src/semmle/code/java/security/MvelInjectionQuery.qll
rename to java/ql/lib/semmle/code/java/security/MvelInjectionQuery.qll
diff --git a/java/ql/src/semmle/code/java/security/OgnlInjection.qll b/java/ql/lib/semmle/code/java/security/OgnlInjection.qll
similarity index 100%
rename from java/ql/src/semmle/code/java/security/OgnlInjection.qll
rename to java/ql/lib/semmle/code/java/security/OgnlInjection.qll
diff --git a/java/ql/src/semmle/code/java/security/OgnlInjectionQuery.qll b/java/ql/lib/semmle/code/java/security/OgnlInjectionQuery.qll
similarity index 100%
rename from java/ql/src/semmle/code/java/security/OgnlInjectionQuery.qll
rename to java/ql/lib/semmle/code/java/security/OgnlInjectionQuery.qll
diff --git a/java/ql/src/semmle/code/java/security/PathCreation.qll b/java/ql/lib/semmle/code/java/security/PathCreation.qll
similarity index 100%
rename from java/ql/src/semmle/code/java/security/PathCreation.qll
rename to java/ql/lib/semmle/code/java/security/PathCreation.qll
diff --git a/java/ql/src/semmle/code/java/security/QueryInjection.qll b/java/ql/lib/semmle/code/java/security/QueryInjection.qll
similarity index 100%
rename from java/ql/src/semmle/code/java/security/QueryInjection.qll
rename to java/ql/lib/semmle/code/java/security/QueryInjection.qll
diff --git a/java/ql/src/semmle/code/java/security/RandomDataSource.qll b/java/ql/lib/semmle/code/java/security/RandomDataSource.qll
similarity index 100%
rename from java/ql/src/semmle/code/java/security/RandomDataSource.qll
rename to java/ql/lib/semmle/code/java/security/RandomDataSource.qll
diff --git a/java/ql/src/semmle/code/java/security/RandomQuery.qll b/java/ql/lib/semmle/code/java/security/RandomQuery.qll
similarity index 100%
rename from java/ql/src/semmle/code/java/security/RandomQuery.qll
rename to java/ql/lib/semmle/code/java/security/RandomQuery.qll
diff --git a/java/ql/src/semmle/code/java/security/RelativePaths.qll b/java/ql/lib/semmle/code/java/security/RelativePaths.qll
similarity index 100%
rename from java/ql/src/semmle/code/java/security/RelativePaths.qll
rename to java/ql/lib/semmle/code/java/security/RelativePaths.qll
diff --git a/java/ql/src/semmle/code/java/security/RequestForgery.qll b/java/ql/lib/semmle/code/java/security/RequestForgery.qll
similarity index 100%
rename from java/ql/src/semmle/code/java/security/RequestForgery.qll
rename to java/ql/lib/semmle/code/java/security/RequestForgery.qll
diff --git a/java/ql/src/semmle/code/java/security/RequestForgeryConfig.qll b/java/ql/lib/semmle/code/java/security/RequestForgeryConfig.qll
similarity index 100%
rename from java/ql/src/semmle/code/java/security/RequestForgeryConfig.qll
rename to java/ql/lib/semmle/code/java/security/RequestForgeryConfig.qll
diff --git a/java/ql/src/semmle/code/java/security/ResponseSplitting.qll b/java/ql/lib/semmle/code/java/security/ResponseSplitting.qll
similarity index 100%
rename from java/ql/src/semmle/code/java/security/ResponseSplitting.qll
rename to java/ql/lib/semmle/code/java/security/ResponseSplitting.qll
diff --git a/java/ql/src/semmle/code/java/security/SecurityFlag.qll b/java/ql/lib/semmle/code/java/security/SecurityFlag.qll
similarity index 100%
rename from java/ql/src/semmle/code/java/security/SecurityFlag.qll
rename to java/ql/lib/semmle/code/java/security/SecurityFlag.qll
diff --git a/java/ql/src/semmle/code/java/security/SecurityTests.qll b/java/ql/lib/semmle/code/java/security/SecurityTests.qll
similarity index 100%
rename from java/ql/src/semmle/code/java/security/SecurityTests.qll
rename to java/ql/lib/semmle/code/java/security/SecurityTests.qll
diff --git a/java/ql/src/semmle/code/java/security/SensitiveActions.qll b/java/ql/lib/semmle/code/java/security/SensitiveActions.qll
similarity index 100%
rename from java/ql/src/semmle/code/java/security/SensitiveActions.qll
rename to java/ql/lib/semmle/code/java/security/SensitiveActions.qll
diff --git a/java/ql/src/semmle/code/java/security/SqlUnescapedLib.qll b/java/ql/lib/semmle/code/java/security/SqlUnescapedLib.qll
similarity index 100%
rename from java/ql/src/semmle/code/java/security/SqlUnescapedLib.qll
rename to java/ql/lib/semmle/code/java/security/SqlUnescapedLib.qll
diff --git a/java/ql/src/semmle/code/java/security/UnsafeAndroidAccess.qll b/java/ql/lib/semmle/code/java/security/UnsafeAndroidAccess.qll
similarity index 100%
rename from java/ql/src/semmle/code/java/security/UnsafeAndroidAccess.qll
rename to java/ql/lib/semmle/code/java/security/UnsafeAndroidAccess.qll
diff --git a/java/ql/src/semmle/code/java/security/UnsafeAndroidAccessQuery.qll b/java/ql/lib/semmle/code/java/security/UnsafeAndroidAccessQuery.qll
similarity index 100%
rename from java/ql/src/semmle/code/java/security/UnsafeAndroidAccessQuery.qll
rename to java/ql/lib/semmle/code/java/security/UnsafeAndroidAccessQuery.qll
diff --git a/java/ql/src/semmle/code/java/security/UnsafeDeserializationQuery.qll b/java/ql/lib/semmle/code/java/security/UnsafeDeserializationQuery.qll
similarity index 76%
rename from java/ql/src/semmle/code/java/security/UnsafeDeserializationQuery.qll
rename to java/ql/lib/semmle/code/java/security/UnsafeDeserializationQuery.qll
index fe58166965c..a45c4e8aa5d 100644
--- a/java/ql/src/semmle/code/java/security/UnsafeDeserializationQuery.qll
+++ b/java/ql/lib/semmle/code/java/security/UnsafeDeserializationQuery.qll
@@ -15,6 +15,7 @@ private import semmle.code.java.frameworks.HessianBurlap
private import semmle.code.java.frameworks.Castor
private import semmle.code.java.frameworks.Jackson
private import semmle.code.java.frameworks.Jabsorb
+private import semmle.code.java.frameworks.JoddJson
private import semmle.code.java.frameworks.apache.Lang
private import semmle.code.java.Reflection
@@ -192,6 +193,16 @@ predicate unsafeDeserialization(MethodAccess ma, Expr sink) {
or
m instanceof JabsorbFromJsonMethod and
sink = ma.getArgument(0)
+ or
+ m instanceof JoddJsonParseMethod and
+ sink = ma.getArgument(0) and
+ (
+ // User controls the target type for deserialization
+ any(UnsafeTypeConfig c).hasFlowToExpr(ma.getArgument(1))
+ or
+ // jodd.json.JsonParser may be configured for unrestricted deserialization to user-specified types
+ joddJsonParserConfiguredUnsafely(ma.getQualifier())
+ )
)
}
@@ -248,6 +259,17 @@ class UnsafeDeserializationConfig extends TaintTracking::Configuration {
ma.getArgument(0) = node.asExpr() and
exists(SafeJsonIoConfig sji | sji.hasFlowToExpr(ma.getArgument(1)))
)
+ or
+ exists(MethodAccess ma |
+ // Sanitize the input to jodd.json.JsonParser.parse et al whenever it appears
+ // to be called with an explicit class argument limiting those types that can
+ // be instantiated during deserialization.
+ ma.getMethod() instanceof JoddJsonParseMethod and
+ ma.getArgument(1).getType() instanceof TypeClass and
+ not ma.getArgument(1) instanceof NullLiteral and
+ not ma.getArgument(1).getType().getName() = ["Class
diff --git a/java/ql/src/codeql-suites/java-code-scanning.qls b/java/ql/src/codeql-suites/java-code-scanning.qls
index 7dc29ab8049..9074f8e7bf9 100644
--- a/java/ql/src/codeql-suites/java-code-scanning.qls
+++ b/java/ql/src/codeql-suites/java-code-scanning.qls
@@ -1,4 +1,4 @@
- description: Standard Code Scanning queries for Java
-- qlpack: codeql-java
+- queries: .
- apply: code-scanning-selectors.yml
- from: codeql-suite-helpers
+ from: codeql/suite-helpers
diff --git a/java/ql/src/codeql-suites/java-lgtm-full.qls b/java/ql/src/codeql-suites/java-lgtm-full.qls
index 542174d9101..90b25aa4d05 100644
--- a/java/ql/src/codeql-suites/java-lgtm-full.qls
+++ b/java/ql/src/codeql-suites/java-lgtm-full.qls
@@ -1,7 +1,7 @@
- description: Standard LGTM queries for Java, including ones not displayed by default
-- qlpack: codeql-java
+- queries: .
- apply: lgtm-selectors.yml
- from: codeql-suite-helpers
+ from: codeql/suite-helpers
# These are only for IDE use.
- exclude:
tags contain:
diff --git a/java/ql/src/codeql-suites/java-lgtm.qls b/java/ql/src/codeql-suites/java-lgtm.qls
index d0733ee7408..8b8f8d973c7 100644
--- a/java/ql/src/codeql-suites/java-lgtm.qls
+++ b/java/ql/src/codeql-suites/java-lgtm.qls
@@ -1,4 +1,4 @@
- description: Standard LGTM queries for Java
- apply: codeql-suites/java-lgtm-full.qls
- apply: lgtm-displayed-only.yml
- from: codeql-suite-helpers
+ from: codeql/suite-helpers
diff --git a/java/ql/src/codeql-suites/java-security-and-quality.qls b/java/ql/src/codeql-suites/java-security-and-quality.qls
index 1709789eb75..2b9ca6c132f 100644
--- a/java/ql/src/codeql-suites/java-security-and-quality.qls
+++ b/java/ql/src/codeql-suites/java-security-and-quality.qls
@@ -1,4 +1,4 @@
- description: Security-and-quality queries for Java
-- qlpack: codeql-java
+- queries: .
- apply: security-and-quality-selectors.yml
- from: codeql-suite-helpers
+ from: codeql/suite-helpers
diff --git a/java/ql/src/codeql-suites/java-security-extended.qls b/java/ql/src/codeql-suites/java-security-extended.qls
index df10997bb38..4429c105456 100644
--- a/java/ql/src/codeql-suites/java-security-extended.qls
+++ b/java/ql/src/codeql-suites/java-security-extended.qls
@@ -1,4 +1,4 @@
- description: Security-extended queries for Java
-- qlpack: codeql-java
+- queries: .
- apply: security-extended-selectors.yml
- from: codeql-suite-helpers
+ from: codeql/suite-helpers
diff --git a/java/ql/src/experimental/Security/CWE/CWE-1204/BadStaticInitializationVector.java b/java/ql/src/experimental/Security/CWE/CWE-1204/BadStaticInitializationVector.java
new file mode 100644
index 00000000000..85e8be6d8ce
--- /dev/null
+++ b/java/ql/src/experimental/Security/CWE/CWE-1204/BadStaticInitializationVector.java
@@ -0,0 +1,4 @@
+byte[] iv = new byte[16]; // all zeroes
+GCMParameterSpec params = new GCMParameterSpec(128, iv);
+Cipher cipher = Cipher.getInstance("AES/GCM/PKCS5PADDING");
+cipher.init(Cipher.ENCRYPT_MODE, key, params);
\ No newline at end of file
diff --git a/java/ql/src/experimental/Security/CWE/CWE-1204/GoodRandomInitializationVector.java b/java/ql/src/experimental/Security/CWE/CWE-1204/GoodRandomInitializationVector.java
new file mode 100644
index 00000000000..faceb119d64
--- /dev/null
+++ b/java/ql/src/experimental/Security/CWE/CWE-1204/GoodRandomInitializationVector.java
@@ -0,0 +1,6 @@
+byte[] iv = new byte[16];
+SecureRandom random = SecureRandom.getInstanceStrong();
+random.nextBytes(iv);
+GCMParameterSpec params = new GCMParameterSpec(128, iv);
+Cipher cipher = Cipher.getInstance("AES/GCM/PKCS5PADDING");
+cipher.init(Cipher.ENCRYPT_MODE, key, params);
\ No newline at end of file
diff --git a/java/ql/src/experimental/Security/CWE/CWE-1204/StaticInitializationVector.qhelp b/java/ql/src/experimental/Security/CWE/CWE-1204/StaticInitializationVector.qhelp
new file mode 100644
index 00000000000..d631dff22af
--- /dev/null
+++ b/java/ql/src/experimental/Security/CWE/CWE-1204/StaticInitializationVector.qhelp
@@ -0,0 +1,46 @@
+
+
+
+
+
+A cipher needs an initialization vector (IV) when it is used in certain modes
+such as CBC or GCM. Under the same secret key, IVs should be unique and ideally unpredictable.
+Given a secret key, if the same IV is used for encryption, the same plaintexts result in the same ciphertexts.
+This lets an attacker learn if the same data pieces are transferred or stored,
+or this can help the attacker run a dictionary attack.
+
+
+
+
+
+Use a random IV generated by SecureRandom.
+
+
+
+
+
+The following example initializes a cipher with a static IV which is unsafe:
+
+
+
+
+The next example initializes a cipher with a random IV:
+